Files
Digital-Research-Source-Code/CP-NET/CPNET-80 SOURCE/GENNET.MAC
Sepp J Morris 31738079c4 Upload
Digital Research
2020-11-06 18:50:37 +01:00

612 lines
9.4 KiB
Plaintext
Raw Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

; 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