mirror of
https://github.com/SEPPDROID/Digital-Research-Source-Code.git
synced 2025-10-26 09:54:20 +00:00
612 lines
9.4 KiB
Plaintext
612 lines
9.4 KiB
Plaintext
; CP/NET GENERATOR FOR CP/NET VER.1.0 NOS
|
||
;
|
||
; 1982 8.27. VER.1.0
|
||
;
|
||
TITLE CP/NET GENERATOR FOR NOS 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
|
||
;
|
||
MINSIZ EQU 50H ;MINIMUM TARGET SYSTEM SIZE IS 20K
|
||
;
|
||
; EQUATIONS OF BDOS FUNCTION
|
||
;
|
||
CCONIN EQU 1 ;CONSOLE INPUT
|
||
CCONOT EQU 2 ;CONSOLE OUT
|
||
CBUFPR EQU 9 ;BUFFERED STRING PRINT
|
||
CGETVR EQU 12 ;GET VERSION NUMBER
|
||
COPEN EQU 15 ;OPEN FILE
|
||
CCLOSE EQU 16 ;CLOSE FILE
|
||
CDELET EQU 19 ;DELETE FILE
|
||
CREAD EQU 20 ;READ FILE
|
||
CWRITE EQU 21 ;WRITE FILE
|
||
CMAKE EQU 22 ;MAKE FILE
|
||
CSTDMA EQU 26 ;SET DMA ADDRESS
|
||
;
|
||
;
|
||
; START OF MAIN
|
||
;
|
||
START:
|
||
LXI SP,STACK
|
||
LXI H,CSTUP
|
||
CALL BUFPRN ;START UP COMMENT
|
||
LXI B,RESFCB+1
|
||
LDAX B
|
||
DCX B
|
||
CPI ' '
|
||
JNZ $+6 ;EXIST SOME OUTPUT FILE NAME
|
||
LXI B,CCPNET ;DEFAULT NAME
|
||
LXI H,OUTFCB
|
||
CALL CPYFCB ;COPY FCB FOR OUTPUT FILE
|
||
LOOPR: ;RETRY LOOP
|
||
LXI SP,STACK
|
||
LXI H,CGTBTM
|
||
CALL BUFPRN
|
||
LXI H,-1 ;DEFAULT VALUE OF BOTTOM IS 0FFH
|
||
CALL GETHEX ;GET BOTTOM PAGE
|
||
MOV A,L
|
||
INR A
|
||
LXI H,CSIZTS
|
||
CPI MINSIZ
|
||
JC WHYPR ;TARGET SYSTEM SIZE TOO SMALL
|
||
MOV H,A
|
||
MVI L,0 ;GET RELOCATION BIAS
|
||
XCHG
|
||
LXI H,BFRLBS ;BIAS DATA BUFFER
|
||
PUSH H
|
||
LHLD BDOS+1
|
||
MVI L,0 ;GET LOADING BIAS
|
||
LXI B,IXFLNM ;LOADING FILE NAME INDEX
|
||
LOOP: ;ONE FILE LOADHNG LOOP
|
||
XTHL
|
||
MOV M,E
|
||
INX H
|
||
MOV M,D ;SET POINTER
|
||
XTHL
|
||
PUSH H
|
||
LXI H,INFCB
|
||
CALL CPYFCB ;SET FILE NAME TO FCB
|
||
POP H
|
||
PUSH B
|
||
LXI B,INFCB
|
||
CALL PRNFLN ;PRINT FILE NAME
|
||
LXI B,INFCB
|
||
CALL LOAD ;LOAD ONE FILE
|
||
POP B
|
||
XTHL
|
||
PUSH D
|
||
CALL LOCPR ;PRINT TOP ADDRESS
|
||
DCX H
|
||
MOV A,M
|
||
SUB E
|
||
MOV E,A
|
||
INX H
|
||
MOV A,M
|
||
SBB D
|
||
MOV D,A ;GET LENGTH
|
||
INX H
|
||
CALL LOCPR ;PRINT LENGTH
|
||
POP D
|
||
XTHL
|
||
LDAX B
|
||
INR A
|
||
JNZ LOOP ;TO NEXT FILE
|
||
XTHL
|
||
MOV M,E
|
||
INX H
|
||
MOV M,D ;SAVE TOP POINT
|
||
INX H
|
||
POP D
|
||
MOV M,E
|
||
INX H
|
||
MOV M,D ;SAVE DATA BUFFER TOP
|
||
CALL CRLF
|
||
LXI B,OUTFCB
|
||
CALL PRNFLN ;PRINT OUTPUT FILE NAME
|
||
LXI H,CCHECK
|
||
CALL BUFPRN ;CHECK OK
|
||
CALL CONIN
|
||
CPI 'Y'
|
||
JNZ LOOPR ;RETRY
|
||
CALL OUTFIL ;OUT SYSTEM FILE
|
||
JMP TOP
|
||
;
|
||
; LOAD ONE FILE
|
||
; INPUT
|
||
; HL:BOTTOM OF FREE AREA
|
||
; DE:LAST RELOCATION BIAS
|
||
; BC:FCB
|
||
; OUTPUT
|
||
; HL:TOP OF LOADING BIAS
|
||
; BC:TOP OF RELOCATION BIAS
|
||
;
|
||
LOAD:
|
||
SHLD LDBOTM ;SAVE BOTTOM
|
||
XCHG
|
||
SHLD RLBOTM ;SAVE RELOCATION BIAS
|
||
MOV H,B
|
||
MOV L,C
|
||
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
|
||
LXI H,CNTFND
|
||
INR A
|
||
JZ WHYPR ;FILE 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
|
||
XRA A
|
||
SUB E
|
||
MOV E,A
|
||
MVI A,0
|
||
SBB D
|
||
MOV D,A
|
||
LHLD RLBOTM ;GET LAST RELOCATION BIAS
|
||
DAD D
|
||
MVI L,0
|
||
SHLD RLTOP ;SAVE RELOCATION DATA OF THIS FILE
|
||
LHLD LDBOTM ;GET LOADING BOTTOM
|
||
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
|
||
LXI D,BOTTOM
|
||
CALL CPHLDE
|
||
LXI H,CSYSTS
|
||
JC WHYPR ;SYSTEM TOO SMALL
|
||
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
|
||
LDA RLTOP+1
|
||
MOV H,A ;SET RELOCATION BIAS
|
||
LOADRL: ;RELOCATION LOOP
|
||
MOV A,B
|
||
ORA C
|
||
JZ LOADRE ;LOADING END
|
||
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
|
||
;
|
||
LOADRE: ;END OF LOADING
|
||
POP H
|
||
LHLD RLTOP
|
||
XCHG
|
||
LHLD LDTOP ;GET PARAMETER
|
||
RET
|
||
;
|
||
; 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
|
||
LXI H,CNODAT
|
||
JMP WHYPR ;NO DATA ERROR
|
||
;
|
||
; OUTPUT SYSTEM FILE
|
||
; SYSTEM PAGE
|
||
; 2B:NDOS TOP
|
||
; 2B:SNIOS TOP
|
||
; 2B:BDOS TOP
|
||
; 2B:BIOS TOP
|
||
; 2B:LENGTH
|
||
;
|
||
OUTFIL:
|
||
LXI D,OUTFCB
|
||
MVI C,CDELET
|
||
CALL BDOS ;DELETE FILE
|
||
LXI B,OUTFCB
|
||
LXI H,OUTFCB
|
||
CALL CPYFCB ;CLEAR FCB
|
||
LXI D,OUTFCB
|
||
MVI C,CMAKE
|
||
CALL BDOS ;MAKE OUTPUT FILE
|
||
LXI H,CNODIR
|
||
INR A
|
||
JZ WHYPR ;NO DIRECTORY SPACE
|
||
LXI H,DMABUF
|
||
XRA A
|
||
MVI B,SCTLNG
|
||
MOV M,A ;CLEAR DMA BUFFER
|
||
INX H
|
||
DCR B
|
||
JNZ $-3
|
||
LHLD BFRLBS+10 ;GET BOTTOM
|
||
LDA BDOS+2
|
||
SUB H
|
||
MOV H,A ;GET LENGTH
|
||
SHLD BFRLBS ;SET LENGTH
|
||
LXI H,BFRLBS+10
|
||
LXI D,DMABUF
|
||
MVI B,5
|
||
DCX H
|
||
MOV C,M
|
||
DCX H
|
||
MOV A,M ;GET BIAS DATA
|
||
STAX D
|
||
INX D
|
||
MOV A,C
|
||
STAX D ;SET DATA
|
||
INX D
|
||
DCR B
|
||
JNZ $-10
|
||
LXI D,DMABUF
|
||
CALL WRITE ;WRITE SYSTEM PAGE
|
||
LDA BFRLBS+1 ;GET LENGTH
|
||
ADD A ;GET SECTOR COUNT
|
||
LHLD BFRLBS+10 ;TOP OF DATA
|
||
OUTFLL:
|
||
XCHG
|
||
LXI H,SCTLNG
|
||
DAD D ;GET NEXT DMA ADDRESS
|
||
PUSH H
|
||
PUSH PSW ;SAVE COUNT
|
||
CALL WRITE ;WRITE ONE SECTOR
|
||
POP PSW
|
||
POP H
|
||
DCR A
|
||
JNZ OUTFLL ;TO NEXT SECTOR
|
||
LXI D,OUTFCB
|
||
MVI C,CCLOSE
|
||
CALL BDOS ;CLOSE FILE
|
||
LXI H,CCLSER
|
||
INR A
|
||
JZ WHYPR ;CLOSE ERROR
|
||
RET
|
||
;
|
||
; WRITE ONE SECTOR
|
||
; INPUT
|
||
; DE:DMA ADDRESS
|
||
;
|
||
WRITE:
|
||
MVI C,CSTDMA
|
||
CALL BDOS ;SET DMA ADDRESS
|
||
LXI D,OUTFCB
|
||
MVI C,CWRITE
|
||
CALL BDOS ;WRITE ONE SECTOR
|
||
LXI H,CWTERR
|
||
ORA A
|
||
JNZ WHYPR ;ERROR
|
||
RET
|
||
;
|
||
; GET HEXADECIMAL VALUE
|
||
; INPUT
|
||
; HL:DEFAULT VALUE
|
||
; OUTPUT
|
||
; HL:OUTPUT VALUE
|
||
;
|
||
GETHEX:
|
||
CALL CONIN ;GET FIRST CHARACTER
|
||
CPI CR
|
||
RZ ;DEFAULT MODE
|
||
LXI H,0
|
||
GETHXL: ;ONE CHARACTER LOOP
|
||
SUI '0'
|
||
JC LOOPR ;TOO SMALL
|
||
CPI 10
|
||
JC GETHXG ;0 TO 9
|
||
SUI 'A'-'9'-1
|
||
CPI 10
|
||
JC LOOPR ;ERROR
|
||
CPI 16
|
||
JNC LOOPR ;TOO LARGE
|
||
GETHXG: ;GET CODE
|
||
DAD H
|
||
DAD H
|
||
DAD H
|
||
DAD H ;*16
|
||
ADD L
|
||
MOV L,A ;ADD CURRENT DATA
|
||
CALL CONIN
|
||
CPI CR
|
||
JNZ GETHXL ;TO NEXT
|
||
RET ;END
|
||
;
|
||
; PRINT FILE NAME
|
||
; INPUT
|
||
; BC:FCB TOP
|
||
;
|
||
PRNFLN:
|
||
CALL CRLF
|
||
PUSH D
|
||
MVI D,12
|
||
INX B
|
||
LDAX B
|
||
CALL CONOT
|
||
DCR D
|
||
JNZ $-6
|
||
POP D
|
||
RET
|
||
;
|
||
; ERROR COMMENT OUT & ABORT
|
||
; INPUT
|
||
; HL:COMMENT POINTER
|
||
;
|
||
WHYPR:
|
||
CALL BUFPRN
|
||
JMP TOP
|
||
;
|
||
; COMPARE DOUBLE BYTES
|
||
; FLAGS:SET BY HL-DE
|
||
;
|
||
CPHLDE:
|
||
MOV A,H
|
||
SUB D
|
||
RNZ
|
||
MOV A,L
|
||
SUB E
|
||
RET
|
||
;
|
||
; COPY FCB
|
||
; INPUT
|
||
; BC:SOURCE DATA POINTER
|
||
; HL:DESTINATION FCB
|
||
;
|
||
CPYFCB:
|
||
PUSH D
|
||
MVI D,12
|
||
LDAX B
|
||
MOV M,A ;COPY FILE NAME PART
|
||
INX B
|
||
INX H
|
||
DCR D
|
||
JNZ $-5
|
||
MVI D,21
|
||
XRA A
|
||
MOV M,A
|
||
INX H
|
||
DCR D
|
||
JNZ $-3 ;CLEAR LEFT PART
|
||
POP D
|
||
RET
|
||
;
|
||
; CONSOLE INPUT
|
||
; OUTPUT
|
||
; A:DATA
|
||
;
|
||
CONIN:
|
||
PUSH H
|
||
PUSH D
|
||
PUSH B
|
||
MVI C,CCONIN
|
||
CALL BDOS
|
||
POP B
|
||
POP D
|
||
POP H
|
||
CPI 3
|
||
JZ TOP ;ABORTED
|
||
CPI 'Z'+1
|
||
RC
|
||
ANI 5FH ;LOWER CASE TO UPER CASE
|
||
RET
|
||
;
|
||
; CONSOLE OUT
|
||
; INPUT
|
||
; A:DATA
|
||
;
|
||
CONOT:
|
||
PUSH H
|
||
PUSH D
|
||
PUSH B
|
||
MVI C,CCONOT
|
||
MOV E,A
|
||
CALL BDOS
|
||
POP B
|
||
POP D
|
||
POP H
|
||
RET
|
||
;
|
||
; BUFFER PRINT
|
||
; INPUT
|
||
; HL:STRING POINT
|
||
;
|
||
BUFPRN:
|
||
MOV A,M
|
||
INX H
|
||
ORA A
|
||
RZ
|
||
CALL CONOT
|
||
JMP BUFPRN
|
||
;
|
||
; CARRIAGE RETURN & LINE FEED
|
||
;
|
||
CRLF:
|
||
MVI A,CR
|
||
CALL CONOT
|
||
MVI A,LF
|
||
JMP CONOT
|
||
;
|
||
; PRINT BYTE DATA BY HEXADECIMAL
|
||
; INPUT
|
||
; A:DATA
|
||
;
|
||
HXPRN:
|
||
PUSH PSW
|
||
RRC
|
||
RRC
|
||
RRC
|
||
RRC
|
||
CALL NIBBLE ;UPER HALF
|
||
POP PSW
|
||
NIBBLE: ;NIBBLE OUT
|
||
ANI 0FH
|
||
ADI '0'
|
||
CPI '9'+1
|
||
JC CONOT ;0 TO 9
|
||
ADI 'A'-'9'-1
|
||
JMP CONOT ;A TO F
|
||
;
|
||
; PRINT WORD DATA
|
||
; INPUT
|
||
; DE:DATA
|
||
;
|
||
LOCPR:
|
||
MVI A,' '
|
||
CALL CONOT
|
||
MVI A,' '
|
||
CALL CONOT ;PRINT SPACE
|
||
MOV A,D
|
||
CALL HXPRN ;HIGHER BYTE
|
||
MOV A,E
|
||
CALL HXPRN ;LOWER BYTE
|
||
MVI A,'H'
|
||
JMP CONOT
|
||
;
|
||
; INDEX OF LOADING FILE NAME
|
||
;
|
||
IXFLNM:
|
||
DB 0,'NBIOS SPR'
|
||
DB 0,'NBDOS SPR'
|
||
DB 0,'NNIOS SPR'
|
||
DB 0,'NDOS SPR'
|
||
DB -1
|
||
;
|
||
CCPNET: DB 0,'CPNET SYS' ;DEFAULT OUTPUT FILE NAME
|
||
;
|
||
; COMMENTS
|
||
;
|
||
CSTUP: DB CR,LF,LF,'CP/NET 1.0 GENERATOR'
|
||
DB CR,LF,'====================',CR,LF,0
|
||
;
|
||
;
|
||
CGTBTM: DB CR,LF,'BOTTOM PAGE ? (FF) ',0
|
||
CSIZTS: DB CR,LF,'SYSTEM SIZE TOO SMALL',0
|
||
CCHECK: DB ' IS SYSTEM FILE NAME, OK ? (Y/N) ',0
|
||
CNODIR: DB CR,LF,'NO DIRECTORY SPACE',0
|
||
CCLSER: DB CR,LF,'CAN''T CLOSE OUTPUT FILE',0
|
||
CWTERR: DB CR,LF,'NO DATA SPACE',0
|
||
CNTFND: DB ' NOT FOUND',0
|
||
CNODAT: DB ' FILE TOO SHORT',0
|
||
CSYSTS: DB CR,LF,'HOST SYSTEM TOO SMALL',0
|
||
;
|
||
; WORKINGS
|
||
;
|
||
; FILE CONTROL BLOCKS
|
||
;
|
||
INFCB: DS 33 ;FOR INPUT FILE
|
||
OUTFCB: DS 33 ;FOR OUTPUT FILE
|
||
;
|
||
BFRLBS: DS 2*6 ;RELOCATION BIAS BUFFER
|
||
;
|
||
DMABUF: DS 128 ;ONE SECTOR BUFFER
|
||
;
|
||
; 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
|
||
RLBOTM: DS 2 ;RELOCATION BOTTOM
|
||
RLTOP: DS 2 ;RELOCATION BIAS
|
||
LDCNT: DS 1 ;LOAD SECTOR COUNT
|
||
LDPNT: DS 2 ;LOADING POINTER
|
||
;
|
||
;
|
||
DS 64
|
||
STACK:
|
||
;
|
||
;
|
||
BOTTOM: ;BOTTOM OF PROGRAM
|
||
;
|
||
;
|
||
END
|
||
|