mirror of
https://github.com/SEPPDROID/Digital-Research-Source-Code.git
synced 2025-10-25 09:24:19 +00:00
Upload
Digital Research
This commit is contained in:
808
CP-NET/CPNET-80 SOURCE/CPNETLDR.MAC
Normal file
808
CP-NET/CPNET-80 SOURCE/CPNETLDR.MAC
Normal file
@@ -0,0 +1,808 @@
|
||||
; CP/NET LOADER FOR CP/NET VER. 1.0
|
||||
;
|
||||
; 1982.8.6. BASE
|
||||
;
|
||||
TITLE CP/NET LOADER VER.1.0
|
||||
;
|
||||
; EQUATIONS OF DATA
|
||||
;
|
||||
LF EQU 0AH ;LINE FEED
|
||||
CR EQU 0DH ;CARRIAGE RETURN
|
||||
;
|
||||
TOP EQU 0 ;MEMORY TOP
|
||||
BDOS EQU 5 ;BDOS ENTRY
|
||||
RESFCB EQU 5CH ;RESIDENT FCB
|
||||
SCTLNG EQU 128 ;SECTOR LENGTH
|
||||
;
|
||||
; EQUATIONS OF BDOS FUNCTION
|
||||
;
|
||||
CRESET EQU 0 ;SYSTEM RESET
|
||||
CCONOT EQU 2 ;CONSOLE OUT
|
||||
CBUFPR EQU 9 ;BUFFERED STRING PRINT
|
||||
CGETVR EQU 12 ;GET VERSION NUMBER
|
||||
COPEN EQU 15 ;OPEN FILE
|
||||
CREAD EQU 20 ;READ FILE
|
||||
CSTDMA EQU 26 ;SET DMA ADDRESS
|
||||
;
|
||||
; START
|
||||
;
|
||||
JMP START
|
||||
;
|
||||
; BREAK POINT RESTART NUMBER FOR DEBUG
|
||||
;
|
||||
BPNUM: DB 7
|
||||
;
|
||||
; COMMENTS
|
||||
;
|
||||
DB 'COPYRIGHT (C) 1980,'
|
||||
;
|
||||
PUSRID: DB ' DIGITAL RESEARCH ' ;USER ID IS SEARCHED BY THIS STRING
|
||||
;
|
||||
; USER ID CODE
|
||||
;
|
||||
DB 0,0,0,0,0,0
|
||||
;
|
||||
CDSKER: DB 'Disk read error$'
|
||||
;
|
||||
PDEBBP: DW DEBBP ;POINTER OF DEBUGGER BREAK POINT ROUTINE
|
||||
;
|
||||
CSYNC: DB 'Synchronization$'
|
||||
CARLOD: DB CR,LF,'CP/Net is already loaded.$'
|
||||
CSTUP: DB CR,LF,LF,'CP/NET 1.0 Loader'
|
||||
DB CR,LF,'=================',CR,LF,LF,'$'
|
||||
;
|
||||
CBIOS: DB 'BIOS $'
|
||||
CBDOS: DB 'BDOS $'
|
||||
CSNIOS: DB 'SNIOS SPR$'
|
||||
CNDOS: DB 'NDOS SPR$'
|
||||
CTPA: DB 'TPA $'
|
||||
;
|
||||
CLEND: DB 'CP/NET 1.0 loading complete.$'
|
||||
CLERR: DB CR,LF,'CP/NET Loader error: $'
|
||||
;
|
||||
; START OF MAIN
|
||||
;
|
||||
LXI SP,PFLNAM
|
||||
START:
|
||||
LXI H,STACK
|
||||
SPHL ;SET STACK POINTER
|
||||
LXI D,0
|
||||
MVI C,CGETVR ;GET VERSION NUMBER
|
||||
CALL BDOS
|
||||
LXI D,200H
|
||||
CALL ANHLDE ;GET CP/NET MODE
|
||||
MVI A,0
|
||||
CALL SUBYHL ;CHECK ZERO
|
||||
ORA L
|
||||
JZ STARTS ;CP/NET IS NOT LOADED OK
|
||||
LXI B,CARLOD ;CP/NET ALREADY LOADED
|
||||
CALL BUFPRN
|
||||
LXI D,0
|
||||
MVI C,CRESET
|
||||
CALL BDOS ;RETURN TO SYSTEM
|
||||
;
|
||||
STARTS:
|
||||
LHLD BDOSPT ;GET POINT OF BDOS POINTER
|
||||
LXI D,0FF00H
|
||||
CALL ANHMDE ;OFF LOWER BYTE
|
||||
SHLD FREBOT ;SAVE AVAILABLE AREA TOP
|
||||
LDA RESFCB+1 ;GET DEBUG MODE
|
||||
STA FDEBUG
|
||||
LXI B,CSTUP
|
||||
CALL BUFPRN ;START UP COMMENT
|
||||
;
|
||||
LXI B,CBIOS ;BIOS
|
||||
CALL BUFPRN
|
||||
LXI H,TOP+1
|
||||
SHLD BDOSPT ;SET POINTER OF BIOS ROUTINE POINTER
|
||||
LHLD BDOSPT
|
||||
MOV C,M
|
||||
INX H
|
||||
MOV B,M ;GET BIOS POINT
|
||||
DCX B
|
||||
DCX B
|
||||
DCX B
|
||||
CALL LOCPR ;PRINT BIOS TOP
|
||||
LHLD BDOSPT
|
||||
LXI D,-1
|
||||
CALL SUDEHM ;GET COMPLEMET OF BIOS POINT VALUE
|
||||
LXI D,4 ;GET BIAS
|
||||
DAD D
|
||||
MOV B,H
|
||||
MOV C,L
|
||||
CALL LOCPR ;PRINT BIOS LENGTH
|
||||
CALL CRLF
|
||||
;
|
||||
LXI B,CBDOS ;BDOS
|
||||
CALL BUFPRN
|
||||
LHLD FREBOT ;GET BDOS TOP
|
||||
MOV B,H
|
||||
MOV C,L
|
||||
CALL LOCPR ;PRINT BDOS TOP
|
||||
LHLD BDOSPT
|
||||
MOV C,M
|
||||
INX H
|
||||
MOV B,M
|
||||
DCX B
|
||||
DCX B
|
||||
DCX B ;BIOS TOP
|
||||
MOV D,B
|
||||
MOV E,C
|
||||
LHLD FREBOT
|
||||
CALL SUDEHL ;GET BDOS LENGTH
|
||||
MOV B,H
|
||||
MOV C,L
|
||||
CALL LOCPR ;PRINT BDOS LENGTH
|
||||
CALL CRLF
|
||||
;
|
||||
LXI H,CSNIOS ;SNIOS.SPR
|
||||
SHLD PFLNAM ;SET FILE NAME POINT FOR ERROR ROUTINE
|
||||
MOV B,H
|
||||
MOV C,L
|
||||
CALL BUFPRN
|
||||
LHLD FREBOT ;GET LOADING POINT
|
||||
MOV B,H
|
||||
MOV C,L
|
||||
LXI D,FSNIOS ;FCB POINT OF SNIOS.SPR
|
||||
CALL LOAD ;LOAD SNIOS.SPR
|
||||
SHLD TOPPNT ;SAVE SNIOS TOP
|
||||
LXI D,-1
|
||||
CALL SUDEHL ;CHECK ERROR
|
||||
ORA L
|
||||
JNZ $+6 ;NOT ERROR
|
||||
JMP ERROR ;SNIOS.SPR LOAD ERROR
|
||||
;
|
||||
LHLD TOPPNT
|
||||
MOV B,H
|
||||
MOV C,L
|
||||
CALL LOCPR ;PRINT SNIOS TOP
|
||||
LXI B,TOPPNT
|
||||
LXI D,FREBOT
|
||||
CALL SUDMBM ;GET SNIOS LENGTH
|
||||
MOV B,H
|
||||
MOV C,L
|
||||
CALL LOCPR ;PRINT SNIOS LENGTH
|
||||
CALL CRLF
|
||||
LHLD TOPPNT ;SET SNIOS TOP AS THE BOTTOM OF NDOS
|
||||
SHLD FREBOT
|
||||
;
|
||||
LXI H,CNDOS ;NDOS.SPR
|
||||
SHLD PFLNAM
|
||||
MOV B,H
|
||||
MOV C,L
|
||||
CALL BUFPRN
|
||||
LHLD FREBOT ;GET LOADING POINT
|
||||
MOV B,H
|
||||
MOV C,L
|
||||
LXI D,FNDOS ;GET FCB POINT
|
||||
CALL LOAD ;LOAD NDOS.SPR
|
||||
SHLD TOPPNT
|
||||
LXI D,-1
|
||||
CALL SUDEHL ;CHECK LOAD ERROR
|
||||
ORA L
|
||||
JNZ $+6 ;NOT ERROR
|
||||
JMP ERROR ;NDOS.SPR LOADING ERROR
|
||||
;
|
||||
LHLD TOPPNT
|
||||
MOV B,H
|
||||
MOV C,L
|
||||
CALL LOCPR ;PRINT NDOS TOP
|
||||
LXI B,TOPPNT
|
||||
LXI D,FREBOT
|
||||
CALL SUDMBM ;GET LENGTH
|
||||
MOV B,H
|
||||
MOV C,L
|
||||
CALL LOCPR ;PRINT LENGTH
|
||||
CALL CRLF
|
||||
LHLD TOPPNT
|
||||
INX H
|
||||
INX H
|
||||
INX H
|
||||
SHLD PNDOSC ;SAVE NDOS COLD START ROUTINE POINTER
|
||||
;
|
||||
LXI B,CTPA ;TPA
|
||||
CALL BUFPRN
|
||||
LXI B,TOP
|
||||
CALL LOCPR ;TOP OF TPA
|
||||
LHLD TOPPNT
|
||||
MOV B,H
|
||||
MOV C,L
|
||||
CALL LOCPR ;LENGTH IS NDOS TOP
|
||||
CALL CRLF
|
||||
LHLD PNDOSC
|
||||
INX H
|
||||
INX H
|
||||
INX H
|
||||
XCHG
|
||||
LXI B,PUSRID
|
||||
CALL CHKUSC ;CHECK USER ID CODE
|
||||
CALL CRLF
|
||||
LXI B,CLEND
|
||||
CALL BUFPRN ;PRINT LOADING END COMMENT
|
||||
CALL CRLF
|
||||
CALL GOTDOS ;TO NDOS OR BREAK
|
||||
;
|
||||
; ERROR ROUTINE
|
||||
;
|
||||
ERROR:
|
||||
LXI SP,PFLNAM
|
||||
LXI B,CLERR
|
||||
CALL BUFPRN ;LOADER ERROR
|
||||
LHLD PFLNAM ;GET ERROR DATA COMMENT POINT
|
||||
MOV B,H
|
||||
MOV C,L
|
||||
CALL BUFPRN ;PRINT ERROR DATA
|
||||
ERSTOP:
|
||||
MVI A,-1
|
||||
RAR
|
||||
JNC ERSTOS
|
||||
LXI H,TOP
|
||||
SPHL
|
||||
DI
|
||||
EI
|
||||
HLT
|
||||
JMP ERSTOP
|
||||
;
|
||||
ERSTOS:
|
||||
EI
|
||||
HLT
|
||||
;
|
||||
; CONSOLE OUT
|
||||
; INPUT
|
||||
; C:DATA
|
||||
;
|
||||
CONOT:
|
||||
LXI H,WCONOT
|
||||
MOV M,C
|
||||
LHLD WCONOT
|
||||
MVI H,0
|
||||
XCHG
|
||||
MVI C,002H
|
||||
CALL BDOS
|
||||
RET
|
||||
;
|
||||
; BUFFER PRINT
|
||||
; INPUT
|
||||
; BC:STRING POINT
|
||||
;
|
||||
BUFPRN:
|
||||
LXI H,WBUFPR+1
|
||||
MOV M,B
|
||||
DCX H
|
||||
MOV M,C ;SAVE PARAMETER
|
||||
LHLD WBUFPR
|
||||
XCHG
|
||||
MVI C,CBUFPR
|
||||
CALL BDOS
|
||||
RET
|
||||
;
|
||||
; OPEN FILE NOT USED
|
||||
; INPUT
|
||||
; BC:FCB POINT
|
||||
;
|
||||
LXI H,WOPEN+1
|
||||
MOV M,B
|
||||
DCX H
|
||||
MOV M,C
|
||||
LHLD WOPEN
|
||||
XCHG
|
||||
MVI C,COPEN
|
||||
CALL BDOS
|
||||
RET
|
||||
;
|
||||
; READ SEQUENTIAL NOT USED
|
||||
; INPUT
|
||||
; BC:FCB POINT
|
||||
;
|
||||
LXI H,WREAD+1
|
||||
MOV M,B
|
||||
DCX H
|
||||
MOV M,C
|
||||
LHLD WREAD
|
||||
XCHG
|
||||
MVI C,CREAD
|
||||
CALL BDOS
|
||||
RET
|
||||
;
|
||||
; SET DMA ADDRESS NOT USED
|
||||
; INPUT
|
||||
; BC:DMA ADDRESS
|
||||
;
|
||||
LXI H,WSRDMA+1
|
||||
MOV M,B
|
||||
DCX H
|
||||
MOV M,C
|
||||
LHLD WSRDMA
|
||||
XCHG
|
||||
MVI C,CSTDMA
|
||||
CALL BDOS
|
||||
RET
|
||||
;
|
||||
; CARRIAGE RETURN & LINE FEED
|
||||
;
|
||||
CRLF:
|
||||
MVI C,CR
|
||||
CALL CONOT
|
||||
MVI C,LF
|
||||
CALL CONOT
|
||||
RET
|
||||
;
|
||||
; PRINT NIBBLE BY HEXADECIMAL
|
||||
; INPUT
|
||||
; C:DATA
|
||||
;
|
||||
NIBBLE:
|
||||
LXI H,WNIBLE
|
||||
MOV M,C
|
||||
MVI A,9
|
||||
LXI H,WNIBLE
|
||||
CMP M
|
||||
JNC NIBBLS ;0 TO 9
|
||||
LDA WNIBLE ;A TO F
|
||||
ADI 'A'
|
||||
SUI 10
|
||||
MOV C,A
|
||||
CALL CONOT
|
||||
JMP NIBBEN
|
||||
;
|
||||
NIBBLS: ;0 TO 9
|
||||
LDA WNIBLE
|
||||
ADI '0'
|
||||
MOV C,A
|
||||
CALL CONOT
|
||||
NIBBEN:
|
||||
RET
|
||||
;
|
||||
; PRINT BYTE DATA BY HEXADECIMAL
|
||||
; INPUT
|
||||
; C:DATA
|
||||
;
|
||||
HXPRN:
|
||||
LXI H,WHXPRN
|
||||
MOV M,C
|
||||
LDA WHXPRN
|
||||
ANI 0F8H
|
||||
RAR
|
||||
RAR
|
||||
RAR
|
||||
RAR
|
||||
MOV C,A
|
||||
CALL NIBBLE ;PRINT HIGHER NIBBLE
|
||||
LDA WHXPRN
|
||||
ANI 00FH
|
||||
MOV C,A
|
||||
CALL NIBBLE ;PRINT LOWER NIBBLE
|
||||
RET
|
||||
;
|
||||
; PRINT WORD DATA
|
||||
; INPUT
|
||||
; BC:DATA
|
||||
;
|
||||
LOCPR:
|
||||
LXI H,WLOCPR+1
|
||||
MOV M,B
|
||||
DCX H
|
||||
MOV M,C ;SAVE DATA
|
||||
MVI C,' '
|
||||
CALL CONOT
|
||||
MVI C,' '
|
||||
CALL CONOT ;PRINT SPACE
|
||||
LHLD WLOCPR
|
||||
MOV A,H
|
||||
MOV C,A
|
||||
CALL HXPRN ;HIGHER BYTE
|
||||
LHLD WLOCPR
|
||||
MOV A,L
|
||||
MOV C,A
|
||||
CALL HXPRN ;LOWER BYTE
|
||||
MVI C,'H'
|
||||
CALL CONOT
|
||||
RET
|
||||
;
|
||||
; CHECK USER ID CODE
|
||||
; INPUT
|
||||
; DE:NDOS ENTRY
|
||||
; BC:ID CODE AREA
|
||||
;
|
||||
CHKUSC:
|
||||
LXI H,PNDOS+1
|
||||
MOV M,D
|
||||
DCX H
|
||||
MOV M,E ;SAVE NDOS ENTRY POINT
|
||||
DCX H
|
||||
MOV M,B
|
||||
DCX H
|
||||
MOV M,C ;SAVE ID CODE AREA
|
||||
CHKUSN: ;ONE DATA POINT LOOP
|
||||
MVI A,-1
|
||||
RAR
|
||||
JNC CHKUSE ;END (NOT USED)
|
||||
LXI H,CNTLDR
|
||||
MVI M,-1
|
||||
INX H
|
||||
MVI M,-1 ;INITIALIZE SEARCH COUNT
|
||||
CHKUSL: ;CHARACTER CHECK LOOP
|
||||
LDA CNTLDR
|
||||
INR A
|
||||
STA CNTLDR ;LOADER POINTER COUNT UP
|
||||
MOV C,A
|
||||
MVI B,0
|
||||
LHLD PIDCOD ;GET ID CODE AREA
|
||||
DAD B ;GET DATA POINT
|
||||
LDA CNTNDS
|
||||
INR A
|
||||
STA CNTNDS ;NDOS POINTER COUNT UP
|
||||
MOV C,A
|
||||
MVI B,0
|
||||
PUSH H
|
||||
LHLD PNDOS
|
||||
DAD B ;GET NDOS DATA POINT
|
||||
POP B
|
||||
LDAX B
|
||||
CMP M ;COMPARE CODE
|
||||
JNZ $+6 ;NOT MATCH
|
||||
JMP CHKUSL ;TO NEXT CHARACTER
|
||||
;
|
||||
MVI A,23 ;CHECK LENGTH NAME & USER ID TOTAL LENGTH
|
||||
LXI H,CNTLDR
|
||||
CMP M
|
||||
JNC $+4 ;NOT OK
|
||||
RET ;OK MATCH CODE
|
||||
;
|
||||
MVI A,0 ;CHECK END OF COMPARE
|
||||
LXI D,PNDOS
|
||||
CALL SUDMBY
|
||||
ORA L
|
||||
SUI 001H
|
||||
SBB A ;CHECK END OF MEMORY
|
||||
XCHG
|
||||
PUSH PSW
|
||||
MVI A,17 ;NAME LENGTH -1
|
||||
INX H
|
||||
SUB M
|
||||
SBB A ;CHECK NAME MATCH
|
||||
POP B
|
||||
MOV C,B
|
||||
ORA C
|
||||
RAR
|
||||
JNC CHKNXT ;NOT END TO NEXT
|
||||
LXI H,CSYNC ;COMPARE FAIL
|
||||
SHLD PFLNAM ;SYNCHRONIZATION ERROR
|
||||
JMP ERROR
|
||||
;
|
||||
CHKNXT: ;CHECK NEXT ADDRESS
|
||||
LHLD PNDOS
|
||||
INX H ;UP START ADDRESS
|
||||
SHLD PNDOS
|
||||
JMP CHKUSN ;CHECK AGAIN
|
||||
;
|
||||
CHKUSE: ;END DUMMY
|
||||
RET
|
||||
;
|
||||
; BREAK POINT FOR DEBUGGER
|
||||
;
|
||||
DEBBP:
|
||||
DI ;RESTART INSTRUCTION IS SET HERE
|
||||
RET
|
||||
;
|
||||
; GOTO COLD BOOT OF NDOS
|
||||
;
|
||||
GOTDOS:
|
||||
LXI H,PNDOSC
|
||||
SPHL ;SET STACK TO ENTRY POINT SAVE AREA
|
||||
DCX H
|
||||
MOV A,M
|
||||
CPI 'B'
|
||||
JNZ GOTDOE ;NOT BREAK
|
||||
LDA BPNUM ;BREAK, SO GET RESTART NUMBER
|
||||
ADD A
|
||||
ADD A
|
||||
ADD A
|
||||
ORI 0C7H ;MAKE RESTART CODE
|
||||
LHLD PDEBBP
|
||||
MOV M,A ;SAVE RESTART CODE
|
||||
CALL DEBBP ;TO BREAK ROUTINE
|
||||
GOTDOE: ;TO NDOS COLD START ROUTINE
|
||||
RET
|
||||
;
|
||||
; LOAD ONE FILE
|
||||
; INPUT
|
||||
; BC:BOTTOM OF FREE AREA
|
||||
; DE:FCB
|
||||
; OUTPUT
|
||||
; HL:TOP OF PROGRAM -1 ERROR
|
||||
;
|
||||
LOAD:
|
||||
MOV H,B
|
||||
MOV L,C
|
||||
SHLD LDBOTM ;SAVE BOTTOM
|
||||
XCHG
|
||||
SHLD LDFCB ;SAVE FCB POINT
|
||||
MVI C,CSTDMA
|
||||
LXI H,-SCTLNG ;SUBTRUCT ONE SECTOR LENGTH
|
||||
DAD D
|
||||
SHLD LDDMA ;SAVE DMA POINT FOR PARAMETER READ
|
||||
XCHG
|
||||
CALL BDOS ;SET DMA ADDRESS TO SCRATCH AREA
|
||||
LHLD LDFCB
|
||||
XCHG
|
||||
MVI C,COPEN
|
||||
CALL BDOS ;OPEN FILE
|
||||
CPI -1
|
||||
MOV H,A
|
||||
MOV L,A
|
||||
RZ ;OPEN ERROR (NOT FOUND)
|
||||
CALL OSREAD ;GET PARAMETER SECTOR
|
||||
LHLD LDDMA
|
||||
INX H
|
||||
MOV E,M
|
||||
INX H
|
||||
MOV D,M ;GET CODE AREA LENGTH
|
||||
INX H
|
||||
INX H
|
||||
MOV C,M
|
||||
INX H
|
||||
MOV B,M ;GET DATA AREA LENGTH
|
||||
XCHG
|
||||
SHLD LDLNGT ;SAVE CODE AREA LENGTH
|
||||
DAD B ;GET TOTAL LENGTH
|
||||
XCHG
|
||||
LHLD LDBOTM ;GET BOTTOM
|
||||
XCHG
|
||||
XRA A
|
||||
SUB L
|
||||
MOV L,A
|
||||
MVI A,0
|
||||
SBB H
|
||||
MOV H,A
|
||||
DAD D ;SUBTRUCT LENGTH FROM BOTTOM POINT
|
||||
MVI L,0 ;GET LOADING TOP
|
||||
SHLD LDTOP ;SAVE LOADING TOP (PROGRAM TOP)
|
||||
XCHG
|
||||
LXI H,-SCTLNG
|
||||
DAD D ;SUBTRUCT ONE SECTOR LENGTH
|
||||
SHLD LDDMA ;SET RELOCATION DATA BUFFER TOP
|
||||
CALL OSREAD ;GET DATA & IGNORE
|
||||
LHLD LDLNGT
|
||||
LXI D,SCTLNG-1
|
||||
DAD D ;ADJUST BOUNDARY
|
||||
MOV A,L
|
||||
RAL
|
||||
MOV A,H
|
||||
RAL ;GET SECTOR COUNT OF CODE AREA
|
||||
LHLD LDTOP ;GET LOADING TOP
|
||||
LOADLP: ;ONE SECTOR LOADING LOOP
|
||||
STA LDCNT ;SAVE COUNT
|
||||
SHLD LDPNT ;SAVE LOADING POINT
|
||||
XCHG
|
||||
MVI C,CSTDMA
|
||||
CALL BDOS ;SET DMA ADDRESS
|
||||
CALL OSREAD ;READ ONE SECTOR DATA
|
||||
LHLD LDPNT
|
||||
LXI D,SCTLNG ;ONE SECTOR LENGTH
|
||||
DAD D ;GET NEXT DMA ADDRESS
|
||||
LDA LDCNT
|
||||
DCR A ;SECTOR COUNT DOWN
|
||||
JNZ LOADLP ;TO NEXT SECTOR
|
||||
LHLD LDDMA ;GET BUFFER POINT FOR RELOCATION DATA
|
||||
XCHG
|
||||
MVI C,CSTDMA
|
||||
CALL BDOS ;SET TO RELOCATION BUFFER POINT
|
||||
LHLD LDLNGT ;GET LENGTH TO GET RELOCATION DATA TOP
|
||||
MOV B,H
|
||||
MOV C,L
|
||||
XCHG
|
||||
LHLD LDTOP ;CODE TOP
|
||||
XCHG
|
||||
DAD D ;GET TOP OF RELOCATION DATA
|
||||
PUSH H ;SAVE RELOCATION DATA POINT
|
||||
MOV H,D ;SET RELOCATION BIAS
|
||||
LOADRL: ;RELOCATION LOOP
|
||||
MOV A,B
|
||||
ORA C
|
||||
JNZ $+8 ;NOT TO END
|
||||
POP H ;END OF RELOCATION
|
||||
LHLD LDTOP ;TOP OF PROGRAM
|
||||
RET ;END OF LOADING
|
||||
;
|
||||
DCX B
|
||||
MOV A,E
|
||||
ANI 07H
|
||||
JNZ LOADRB ;NOT BYTE BOUNDARY
|
||||
XTHL ;BYTE BOUNDARY, GET DATA POINT
|
||||
MOV A,L
|
||||
ANI 07FH
|
||||
JNZ LOADRS ;NOT SECTOR BOUNDARY
|
||||
PUSH B
|
||||
PUSH D
|
||||
PUSH H
|
||||
LHLD LDFCB ;GET FCB POINT
|
||||
XCHG
|
||||
MVI C,CREAD
|
||||
CALL BDOS ;GET ONE SECTOR DATA
|
||||
POP H
|
||||
POP D
|
||||
POP B
|
||||
LHLD LDDMA ;GET DATA TOP POINT
|
||||
ORA A
|
||||
JNZ OSRDER ;NO DATA, SO ERROR
|
||||
LOADRS:
|
||||
MOV A,M ;GET NEXT RELOCATION DATA
|
||||
INX H
|
||||
XTHL
|
||||
MOV L,A
|
||||
LOADRB:
|
||||
MOV A,L
|
||||
RAL ;GET ONE BIT DATA
|
||||
MOV L,A
|
||||
JNC $+6 ;NOT RELOCATE
|
||||
LDAX D ;RELOCATE
|
||||
ADD H
|
||||
STAX D
|
||||
INX D
|
||||
JMP LOADRL ;TO NEXT DATA
|
||||
;
|
||||
; READ ONE SECTOR DATA
|
||||
;
|
||||
OSREAD:
|
||||
LHLD LDFCB ;GET FCB
|
||||
XCHG
|
||||
MVI C,CREAD
|
||||
CALL BDOS ;READ ONE SECTOR
|
||||
ORA A
|
||||
RZ ;NOT ERROR
|
||||
OSRDER: ;NO DATA, SO ERROR
|
||||
POP H ;OVERRIDING RETURN
|
||||
LXI H,-1
|
||||
RET
|
||||
;
|
||||
; LOADING ROUTINE WORKING
|
||||
;
|
||||
LDDMA: DS 2 ;DMA ADDRESS
|
||||
LDLNGT: DS 2 ;CODE AREA LENGTH
|
||||
LDFCB: DS 2 ;FCB POINTER
|
||||
LDBOTM: DS 2 ;BOTTOM POINT OF FREE AREA
|
||||
LDTOP: DS 2 ;TOP POINT OF PROGRAM
|
||||
LDCNT: DS 1 ;LOAD SECTOR COUNT
|
||||
LDPNT: DS 2 ;LOADING POINTER
|
||||
;
|
||||
; AND ROUTINES
|
||||
; HL=HL AND A
|
||||
; HL=HL AND DE
|
||||
;
|
||||
MOV E,A
|
||||
MVI D,0
|
||||
ANHLDE:
|
||||
MOV A,E
|
||||
ANA L
|
||||
MOV L,A
|
||||
MOV A,D
|
||||
ANA H
|
||||
MOV H,A
|
||||
RET
|
||||
;
|
||||
; HL=(DE) AND A
|
||||
; HL=(HL) AND DE
|
||||
;
|
||||
XCHG
|
||||
MOV E,A
|
||||
MVI D,0
|
||||
ANHMDE:
|
||||
XCHG
|
||||
LDAX D
|
||||
ANA L
|
||||
MOV L,A
|
||||
INX D
|
||||
LDAX D
|
||||
ANA H
|
||||
MOV H,A
|
||||
RET
|
||||
;
|
||||
; SUBTRUCT ROUTINES
|
||||
; HL=A - HL
|
||||
; HL=DE - HL
|
||||
;
|
||||
SUBYHL:
|
||||
MOV E,A
|
||||
MVI D,0
|
||||
SUDEHL:
|
||||
MOV A,E
|
||||
SUB L
|
||||
MOV L,A
|
||||
MOV A,D
|
||||
SBB H
|
||||
MOV H,A
|
||||
RET
|
||||
;
|
||||
; HL=(DE) - (BC)
|
||||
;
|
||||
SUDMBM:
|
||||
MOV L,C
|
||||
MOV H,B
|
||||
MOV C,M
|
||||
INX H
|
||||
MOV B,M
|
||||
LDAX D
|
||||
SUB C
|
||||
MOV L,A
|
||||
INX D
|
||||
LDAX D
|
||||
SBB B
|
||||
MOV H,A
|
||||
RET
|
||||
;
|
||||
; HL=(DE) - A
|
||||
;
|
||||
SUDMBY:
|
||||
MOV L,A
|
||||
MVI H,000H
|
||||
LDAX D
|
||||
SUB L
|
||||
MOV L,A
|
||||
INX D
|
||||
LDAX D
|
||||
SBB H
|
||||
MOV H,A
|
||||
RET
|
||||
;
|
||||
; HL=A - (HL)
|
||||
; HL=DE - (HL)
|
||||
;
|
||||
MOV E,A
|
||||
MVI D,000H
|
||||
SUDEHM:
|
||||
MOV A,E
|
||||
SUB M
|
||||
MOV E,A
|
||||
MOV A,D
|
||||
INX H
|
||||
SBB M
|
||||
MOV D,A
|
||||
XCHG
|
||||
RET
|
||||
;
|
||||
; WORKING
|
||||
;
|
||||
PFLNAM: DW CDSKER ;LOAD ERROR COMMENT POINTER
|
||||
WCONOT: DB 0 ;WORK FOR CONSOLE OUT
|
||||
WBUFPR: DW 0 ;WORK FOR BUFFER PRINT
|
||||
WOPEN: DW 0 ;WORK FOR OPEN FILE
|
||||
WREAD: DW 0 ;WORK FOR READ SEQUENTIAL
|
||||
WSRDMA: DW 0 ;WORK FOR SET DMA
|
||||
WNIBLE: DB 0 ;NIBBLE OUT WORKING
|
||||
WHXPRN: DB 0 ;HEXA PRINT WORKING
|
||||
WLOCPR: DW 0 ;WORK FOR WORD PRINT
|
||||
;
|
||||
; FOR ID CODE CHECK
|
||||
;
|
||||
PIDCOD: DW 0
|
||||
PNDOS: DW 0
|
||||
CNTLDR: DB 0
|
||||
CNTNDS: DB 0
|
||||
;
|
||||
;
|
||||
DS 60 ;STACK AREA
|
||||
STACK:
|
||||
;
|
||||
BDOSPT: DW BDOS+1 ;POINTER DATA FOR DOS
|
||||
DW 0
|
||||
FREBOT: DW 0
|
||||
TOPPNT: DW 0
|
||||
;
|
||||
DS 9
|
||||
;
|
||||
; LOADING FILE FCB
|
||||
;
|
||||
FNDOS: ;FOR NDOS.SPR
|
||||
DB 0,'NDOS SPR'
|
||||
DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
|
||||
FSNIOS: ;FOR SNIOS.SPR
|
||||
DB 0,'SNIOS SPR'
|
||||
DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
|
||||
;
|
||||
FDEBUG: DS 1
|
||||
PNDOSC: DS 2
|
||||
;
|
||||
;
|
||||
END
|
||||
|
||||
Reference in New Issue
Block a user