Digital Research
This commit is contained in:
2020-11-06 18:50:37 +01:00
parent 621ed8ccaf
commit 31738079c4
8481 changed files with 1888323 additions and 0 deletions

View 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


View File

@@ -0,0 +1,612 @@
; 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


View File

@@ -0,0 +1,653 @@
; DISK OPERATING SYSTEM
; OF CP/NET NOS NO DISK OPERATION
;
; 1982.8.30. FOR NOS
;
TITLE BASIC OPERATING SYSTEM FOR NOS CP/NET SYSTEM
;
; EQUATIONS OF SYSTEM POINTER IN LOWER ADDRESS
;
RBOOT EQU 0 ;SYSTEM REBOOT ENTRY
IOSTS EQU 3 ;I/O STATUS
CDISK EQU 4 ;CURRENT DISK & USER CODE
ENBDS EQU 5 ;BDOS ENTRY
SYSDM EQU 80H ;SYSTEM DMA ADDRESS
;
; BDOS USER CODE AREA
;
BDOS:
DB 0,0,0,0,0,0
;
BDOSS: ;ENTRY OF BDOS FROM +6
JMP BDOST
;
; ERROR PROCESS ROUTINE TABLE
;
AFLRW: DW EFLRW ;DISK READ WRITE ERROR
ADRIV: DW EDRIV ;DISK SELECT ERROR
ADKCG: DW EDKCG ;R/O DISK ERROR
ADKCH: DW EDKCH ;R/O FILE ERROR
;
; MAIN ROUTINE OF BDOS
; INPUT
; C:NUMBER OF BDOS FUNCTION
; DE:PARAMETER OF INPUT
; OUTPUT
; A:PARAMETER OF OUTPUT WHEN ONE BYTE OR LOWER DATA
; B:PARAMETER OF OUTPUT HIGHER DATA WHEN DOUBLE BYTES
; HL:PARAMETER OF DOUBLE BYTES
;
BDOST:
XCHG
SHLD INPAR ;SAVE INPUT PARAMETER
XCHG
LXI H,0
SHLD OTPAR ;CLEAR OUTPUT PARAMETERS
DAD SP
SHLD INSTK ;SAVE STACK POINTER
LXI SP,STACK ;SET BDOS STACK
LXI H,BDOSE ;END OF ROUTINE
PUSH H ;SAVE RETURN ADDRESS
MOV A,C
CPI 41
RNC ;CALL NUMBER OVER
MOV C,E ;SAVE ONE BYTE DATA
LXI H,MINDX ;MAIN INDEX OF FUNCTION
MOV E,A
MVI D,0
DAD D
DAD D
MOV E,M
INX H
MOV D,M ;GET ROUTINE ADDRESS
LHLD INPAR ;GET INPUT PARAMETER
XCHG
PCHL ;TO EACH ROUTINE
;
; MAIN INDEX OF BODS FUNCTIONS
;
MINDX:
DW WBOOT ;BOOT 0
DW MCNIN ;CONSOLE INPUT
DW MCNOT ;CONSOLE OUTPUT
DW MREAD ;READER INPUT
DW PUNCH ;PUNCHER OUTPUT
DW LIST ;LIST OUTPUT 5
DW MDCIO ;DIRECT CONSOLE I/O
DW MGIOB ;GET I/O BYTE
DW MSIOB ;SET I/O BYTE
DW MBFPR ;PRINT STRING
DW MBFRD ;READ CONSOLE BUFFER 10
DW MSNCN ;GET CONSOLE STATUS
DW MVSNM ;GET VERSION NUMBER
DW MSNCR ;INITIALIZE
DW MDVSL ;SELECT DRIVE
DW MDKDUM ;OPEN FILE 15
DW MDKDUM ;CLOSE FILE
DW MDKDUM ;SEARCH FILE
DW MDKDUM ;SEARCH FOR NEXT
DW MDKDUM ;DELETE FILE
DW MDKDUM ;READ SEQUENTIAL 20
DW MDKDUM ;WRITE SEQUENTIAL
DW MDKDUM ;MAKE FILE
DW MDKDUM ;RENAME FILE
DW MSNCR ;GET LOG-IN VECTOR
DW MSNCR ;GET CURRENT DRIVE 25
DW MSNCR ;SET DMA ADDRESS
DW MDKDUM ;GET ALLOCATION MAP POINT
DW MDKDUM ;SET WRITE PROTECT FLAG
DW MDKDUM ;GET WRITE PROTECT FLAG ADDRESS
DW MDKDUM ;SET FILE ATTRIBUTES 30
DW MDKDUM ;GET DISK PARAMETER ADDRESS
DW MUSER ;SET OR GET USER CODE
DW MDKDUM ;READ RANDOM
DW MDKDUM ;WRITE RANDOM
DW MDKDUM ;COMPUTE FILE SIZE 35
DW MDKDUM ;GET RANDOM RECODE
DW MDKDUM ;RESET DRIVE
DW MSNCR ;NOT USE
DW MSNCR ;NOT USE
DW MDKDUM ;WRITE RANDOM WITH FILL ZERO 40
;
; ERROR COMMENT OUT ROUTINES
;
; DISK READ WRITE ERROR
;
EFLRW:
LXI H,CFLRW
CALL ERPRN ;"BDOS ERR ON "X": BAD SECTOR"
CPI 03H ;CONTROL-C "REBOOT CODE"
JZ RBOOT ;TO REBOOT
RET
;
; DISK SELECT ERROR
;
EDRIV:
LXI H,CDRIV ;"SELECT"
JMP EDKCH+3
;
; READ ONLY ERROR
;
EDKCG:
LXI H,CDKCG ;"R/O"
JMP EDKCH+3
EDKCH:
LXI H,CDKCH ;"FILE R/O"
CALL ERPRN ;"BDOS ERR ON "X": ..."
LXI H,CDISK
MOV A,M
ANI 0F0H
MOV M,A ;TO DISK A:
JMP RBOOT ;TO REBOOT
;
; ERROR COMMENT CODES
;
CERPN: DB 'Bdos Err On : $'
CFLRW: DB 'Bad Sector$'
CDRIV: DB 'Select$'
CDKCH: DB 'File '
CDKCG: DB 'R/O$'
;
; ERROR COMMENT OUT & KEY RESPONSE WAIT
; INPUT
; HL:ADDRESS OF COMMENT
;
ERPRN:
PUSH H ;SAVE COMMENT INDEX
CALL CRLF ;CARRIAGE RETURN & LINE FEED
LDA NDRIV ;DRIVE NUMBER
ADI 'A'
STA CERPN+12 ;SET CODE TO COMMENT
LXI B,CERPN
CALL BFPRN ;"BDOS ERR ON "X": "
POP B
CALL BFPRN ;PRINT EACH COMMENT
;
; CONSOLE I/O ROUTINES
;
; CONSOLE INPUT WITH CONSOLE INTERRUPT CODE CHECK
; OUTPUT
; A:CODE OF INPUT
;
CONSI:
LXI H,INCON ;CONSOLE INTERRUPT CODE
MOV A,M ;GET CODE
MVI M,0 ;CLEAR CODE
ORA A
RNZ ;NOW CODE HAS BEEN SET
JMP CONIN ;TO NORMAL CONSOLE INPUT
;
; CONSOLE INPUT WITH CONTROL CODE TREATMENT
;
CONCI:
CALL CONSI ;CONSOLE INPUT
CALL CONCK ;CONTROL CODE CHECK
RC ;CONTROL CODE
PUSH PSW ;NORMAL CODE
MOV C,A
CALL PRINS ;PRINT WITH TAB TREATMENT
POP PSW
RET
;
; CONTROL CODE CHECK EXCEPT CR,LF,HTAB,BACK SPACE
; INPUT
; A:CODE
; OUTPUT
; CF:ON CONTROL CODE
;
CONCK:
CPI 0DH ;CARRIAGE RETURN
RZ
CPI 0AH ;LINE FEED
RZ
CPI 09H ;HORIZONTAL TAB
RZ
CPI 08H ;BACK SPACE
RZ
CPI 20H ;SPACE
RET
;
; CONSOLE INTERRUPT CHECK ROUTINE
; OUTPUT
; A:0=NO INTERRUPT, 1=INTERRUPTED & CODE IS IN "INCON"
;
CONIT:
LDA INCON ;CONSOLE INTERRUPT CODE
ORA A
JNZ CONIG+3 ;NOW INTERRUPTED
CALL CONST ;GET STATUS
ANI 1 ;CHECK READY
RZ ;NO INPUT
CALL CONIN ;GET INPUT
CPI 13H ;CONTROL-S "FREEZE"
JNZ CONIG
CALL CONIN ;FREEZE THE SYSTEM TO NEXT INPUT
CPI 03H ;CONTROL-C "REBOOT"
JZ RBOOT ;NOW REBOOT
XRA A ;NOW CODE IS IGNORED
RET
CONIG: ;GET CODE
STA INCON ;SET CODE
MVI A,1 ;SET FLAG OF GETTING
RET
;
; PRINT TO CONSOLE WITH CONSOLE INTERRUPT CHECK
; INPUT
; C:PRINT CODE
;
PRINT:
LDA ECHKL ;GET ECHO KILL MODE
ORA A
JNZ PRINK ;NOW ECHO KILL
PUSH B
CALL CONIT ;CHECK CONSOLE INTERRUPT
POP B ;GET PRINT CODE
PUSH B
CALL CONOT ;CONSOLE OUT THE CHARACTER
POP B ;GET PRINT CODE
PUSH B
LDA OTLST ;GET LIST OUT MODE
ORA A
CNZ LIST ;LIST OUT
POP B
PRINK:
MOV A,C
LXI H,PCARI ;CARRIAGE POSITION
CPI 7FH
RZ ;DELETE CODE
INR M ;UP THE CARRIAGE POSITION
CPI 20H
RNC ;NOW PRINTING CHARACTER
DCR M ;CONTROL CODE
MOV A,M
ORA A
RZ
MOV A,C
CPI 08H ;BACK SPACE
JNZ $+5
DCR M
RET
CPI 0AH ;LINE FEED
RNZ ;NOT LINE FEED
MVI M,0 ;RESET THE COUNTER
RET
;
; PRINT WITH CONTROL CODE VISIBLE
; INPUT
; C:CODE
;
PRINC:
MOV A,C
CALL CONCK ;CONTROL CODE CHECK
JNC PRINS ;NORMAL CODE
PUSH PSW ;CONTROL CODE
MVI C,5EH ;UPER ARROW IS CONTROL CODE MARK
CALL PRINT
POP PSW
ORI 40H ;MAKE TO VISIBLE CODE
MOV C,A
;
; 2:CONSOLE OUTPUT
;
MCNOT:
PRINS:
MOV A,C
CPI 09H ;HORIZONTAL TAB
JNZ PRINT ;OTHER CODE
MVI C,20H
CALL PRINT ;SPACE PRINT
LDA PCARI
ANI 07H ;CHECK CARRIAGE POSITION
JNZ $-10 ;TO TAB LOOP
RET
;
; BACK SPACE WITH ERASE ON CRT
;
BACKS:
CALL BACK
MVI C,20H
CALL CONOT ;ERASE
BACK:
MVI C,08H
JMP CONOT
;
; PRINT "#" & CRLF
;
NCRLF:
MVI C,23H ;"#"
CALL PRINT
CALL CRLF
NCRLL:
LDA PCARI ;GET CARIAGE POSITION
LXI H,PPROM
CMP M
RNC
MVI C,20H
CALL PRINT
JMP NCRLL
;
; CARIAGE RETURN & LINE FEED
;
CRLF:
MVI C,0DH ;CARRIAGE RETURN
CALL PRINT
MVI C,0AH ;LINE FEED
JMP PRINT
;
; BUFFERED CHARACTER PRINT END BY "$"
; INPUT
; BC:BUFFER TOP ADDRESS
;
BFPRN:
LDAX B ;GET CODE
CPI 24H ;"$"
RZ ;END CODE
INX B
PUSH B
MOV C,A
CALL PRINS ;PRINT WITH TAB TREATMENT
POP B
JMP BFPRN ;TO NEXT CODE
;
; 10:READ CONSOLE BUFFER
;
MBFRD:
LDA PCARI
STA PPROM ;SET PROMPT POSITION
LHLD INPAR ;GET CHARACTER BUFFER
MOV C,M ;GET MAXIMUM BUFFER LENGTH
INX H
PUSH H ;SAVE POINTER OF CURRENT LENGTH COUNTER
MVI B,0 ;RESET COUNTER
STREL: ;ONE CHARACTER LOOP
PUSH B
PUSH H
CALL CONSI
POP H
POP B
CPI 0DH ;CARIAGE RETURN
JZ STREE ;GET END CODE
CPI 0AH ;LINE FEED
JZ STREE ;GET END CODE
CPI 08H ;BACK SPACE
JNZ STREK
MOV A,B
ORA A
JZ STREL ;COUNT IS ZERO
DCR B
LDA PCARI
STA ECHKL ;SET ECHO KILL COUNT
JMP STREI
STREK:
CPI 7FH ;RUBOUT IS LAST CHARACTER DELETE
JNZ STREA
MOV A,B
ORA A ;COUNTER CHECK
JZ STREL ;THERE IS NO CHARACTER
MOV A,M ;GET LAST CODE
DCR B ;DOWN OF POINTER & COUNTER
DCX H
JMP STRES ;TO PRINT
STREA:
CPI 05H ;CONTROL-E "ONLY LINE CHANGE"
JNZ STREB
PUSH B
PUSH H
CALL CRLF ;LINE CHANGE
XRA A
STA PPROM ;PROMPT POSITION TOP
JMP STREL+2 ;TO NEXT READ
STREB:
CPI 10H ;CONTROL-P "LIST MODE CHANGE"
JNZ STREC
PUSH H
LXI H,OTLST ;LIST OUT MODE
MVI A,01H
SUB M ;CHANGE LIST OUT MODE
MOV M,A
POP H
JMP STREL ;TO NEXT
STREC:
CPI 18H ;CONTROL-X CANCEL OF NOW SET
JNZ STREY
POP H
STREX: ;CANSEL BY ERASE
LDA PPROM ;PROMPT POSITION
LXI H,PCARI
CMP M
JNC MBFRD ;NOW TO TOP
DCR M
CALL BACKS ;ERASE BACK
JMP STREX ;ERASE LOOP
STREY:
CPI 15H ;CONTROL-U "CANCEL OF NOW SET"
JNZ STREF
CALL NCRLF ;"#" & CR,LF
POP H
JMP MBFRD ;TO START POINT
STREF:
CPI 12H ;CONTROL-R "CHANGE LINE & PRINT LEFT CODES"
JNZ STREN ;NORMAL CODE
STREI:
PUSH B
CALL NCRLF ;"#" & CR,LF
POP B
POP H ;GET POINTERS
PUSH H
PUSH B
STREG: ;PRINT LEFT CODES
MOV A,B ;COUNT OF LEFT CODE
ORA A
JZ STREH ;END OF PRINT
INX H
MOV C,M ;GET CODE
DCR B
PUSH B
PUSH H
CALL PRINC ;PRINT WITH CONTROL CODE VISIBLE
POP H
POP B
JMP STREG ;TO NEXT CHARACTER PRINT
STREH:
PUSH H
LDA ECHKL
ORA A
JZ STREL+2 ;NORMAL MODE
LXI H,PCARI
SUB M
STA ECHKL
CALL BACKS ;BACK TO LAST POSITION
LXI H,ECHKL
DCR M
JNZ $-7
JMP STREL+2
STREN: ;NORMAL CODES
INX H
MOV M,A ;SET CODE & POINTER UP
INR B ;COUNTER UP
STRES: ;ECHO PRINT
PUSH B
PUSH H
MOV C,A
CALL PRINC ;PRINT WITH CONTROL CODE VISIBLE
POP H
POP B
MOV A,M
CPI 03H ;CONTROL-C "REBOOT"
MOV A,B
JNZ $+8
CPI 01H ;THE FIRST CODE
JZ RBOOT ;TO REBOOT
CMP C
JC STREL ;TO NEXT READ
STREE:
POP H ;BUFFER FULL OR CR END
MOV M,B
MVI C,0DH
JMP PRINT ;PRINT CARRIAGE RETURN & END
;
; 1:CONSOLE INPUT
;
MCNIN:
CALL CONCI ;CONSOLE INPUT
JMP MOPST
;
; 3:READER INPUT
;
MREAD:
CALL READR ;READ ONE BYTE
JMP MOPST
;
; 6:DIRECT CONSOLE I/O
; INPUT
; C:-1 INPUT -2 GET STATUS OTHER OUTPUT
;
MDCIO:
MOV A,C
INR A
JZ MDCIS ;INPUT MODE
INR A
JZ CONST ;STATUS READ
JMP CONOT ;DIRECT OUT
MDCIS:
CALL CONST
ORA A
JZ BDOSE ;NOT READY
CALL CONIN ;CONSOLE INPUT
JMP MOPST
;
; 7:GET I/O BYTE
;
MGIOB:
LDA IOSTS ;GET DATA
JMP MOPST
;
; 8:SET I/O BYTE
;
MSIOB:
LXI H,IOSTS
MOV M,C ;SET DATA
RET
;
; 9:PRINT STRING TERMINATED BY "$"
;
MBFPR:
XCHG
MOV C,L
MOV B,H ;GET INDEX POINT
JMP BFPRN ;PRINT
;
; 11:GET CONSOLE STATUS
;
MSNCN:
CALL CONIT
MOPST:
STA OTPAR ;SET OUTPUT PARAMETER
MSNCR:
RET
;
; SET ERROR FLAG TO OUTPUT PARAMETER AREA
;
STOTP:
MVI A,1
JMP MOPST
;
; 12:GET VERSION NUMBER
;
MVSNM:
MVI A,22H ;VERSION 2.2
JMP MOPST
;
; 32:SET OR GET USER NUMBER
;
MUSER:
LDA INPAR
CPI -1
JNZ MUSES ;SET MODE
LDA MDUSR ;GET MODE
JMP MOPST
;
MUSES: ;SET MODE
ANI 1FH
STA MDUSR
RET
;
; DATA AREA FOR BASIC I/O
;
ECHKL: DB 0 ;ECHO KILL COUNT
PPROM: DB 0 ;PROMPT POSITION
PCARI: DB 0 ;CONSOLE CARRIAGE POSITION COUNTER
OTLST: DB 0 ;LIST OUTPUT MODE 0 NOT OUT
INCON: DB 0 ;CONSOLE INTERRUPT CODE
INSTK: DS 2 ;USER STACK POINTER SAVE BUFFER
DS 48
STACK: ;SYSTEM STACK
MDUSR: DB 0 ;USER MODE
NDRIV: DB 0 ;DRIVE NUMBER
INPAR: DW 0000H ;INPUT PARAMETER BUFFER
OTPAR: DW 0000H ;OUTPUT PARAMETER BUFFER
;
; DISK OPERATION ROUTINES
;
; 14:SELECT DISK
;
MDVSL:
LDA INPAR ;GET DISK NUMBER
STA NDRIV ;SET AS CURRENT DISK
;
; ERROR ROUTINES
;
DNERR: ;DRIVE NUMBER ERROR
LXI H,ADRIV
ERROR: ;JUMP TO EACH ROUTINE
MOV E,M
INX H
MOV D,M
XCHG
PCHL
;
; DUMMY FOR DISK OPERATION
;
MDKDUM:
LXI H,-1
SHLD OTPAR ;SET ERROR FLAG TO OUTPUT DATA
RET
;
; BDOS END PROCESS
;
BDOSE:
LHLD INSTK
SPHL ;SET STACK POINTER
LHLD OTPAR
MOV A,L
MOV B,H ;SET RETURN PARAMETER
RET
;
;
ORG (($-BDOS+256) AND 0FF00H)-1
DB 0
;
;
; POINTERS TO BASIC I/O SYSTEM
;
BOOT EQU $ ;COLD START BOOTING
WBOOT EQU $+3 ;WARM BOOTING
CONST EQU $+6 ;CONSOLE STATUS
CONIN EQU $+9 ;CONSOLE INPUT
CONOT EQU $+12 ;CONSOLE OUTPUT
LIST EQU $+15 ;LIST OUTPUT
PUNCH EQU $+18 ;PUNCH OUTPUT
READR EQU $+21 ;READER INPUT
HOME EQU $+24 ;MOVE DISK TO TRACK ZERO
SELDK EQU $+27 ;SELECT DISK DRIVE
SETRK EQU $+30 ;SET TRACK NUMBER
SETSC EQU $+33 ;SET SECTOR NUMBER
SETDM EQU $+36 ;SET DMA ADDRESS
READ EQU $+39 ;READ ONE SECTOR
WRITE EQU $+42 ;WRITE ONE SECTOR
LISTS EQU $+45 ;LIST STATUS
SCTRN EQU $+48 ;SECTOR TRANSLATE
;
;
END


View File

@@ -0,0 +1,738 @@
; CP/NET BOOTING LOADER
;
; 1982.8.27. VER.1.0
;
; EQUATIONS OF DATA
;
TOP EQU 0 ;MEMORY TOP
;
; EQUATIONS OF CP/NET FUNCTION
;
COPEN EQU 15 ;OPEN FILE
CREAD EQU 20 ;READ ONE SECTOR
CSTUSC EQU 32 ;SET USER CODE
CLOGIN EQU 64 ;LOG IN
;
; EQUATIONS OF CODE & DATA
;
SOH EQU 01H ;START OF HEADER
STX EQU 02H ;START OF DATA
ETX EQU 03H ;END OF DATA
EOT EQU 04H ;END OF TRANSMISSION
ENQ EQU 05H ;ENQUIRE
ACK EQU 06H ;ACKNOWLEDGE
ACKS EQU 07H ;SECOND ACKNOWLEDGE
LF EQU 0AH ;LINE FEED
CR EQU 0DH ;CARRIAGRE RETURN
NAK EQU 15H ;NEGATIVE ACKNOWLEDGE
;
TMORTY EQU 100 ;TIME OUT RETRY COUNT
MAXRTY EQU 10 ;SEND MESSAGE RETRY COUNT
;
; EQUATIONS OF INPUT OUTPUT PORT & ADDRESS
;
COMPRT EQU 0C4H ;COMMUNICATION PORT
STATI EQU COMPRT ;INPUT STATUS
DPRTI EQU COMPRT+1 ;DATA PORT
MSKI EQU 01H ;INPUT READY BIT
;
STATO EQU COMPRT ;OUTPUT STATUS
DPRTO EQU COMPRT+1 ;DATA PORT
MSKO EQU 80H ;OUTPUT READY BIT
;
;
CRTBF EQU 0F800H ;VRAM AREA
CPORT EQU 40H ;PORT FOR BELL ON
;
;
SUBTTL BOOTER PART
;
; SYSTEM PAGE
; 2B:NDOS TOP
; 2B:SNIOS TOP
; 2B:BDOS TOP
; 2B:BIOS TOP
; 2B:LENGTH
;
;
; ENTRY POINT & PARAMETERS
;
NBOOT:
JMP START
;
; ID CODE FOR PATCH
;
MSTID: DB 0 ;MASTER ID CODE
SLVID: DB 20H ;SLAVE ID CODE
;
; FCB FOR SYSTEM LOAD
;
FCB: DB 2 ;MASTER DISK NUMBER +1
DB 'CPNETPC SYS' ;SYSTEM FILE NAME
DB 0,0 ;EXTENT & CURRENT RECODE
;
; PASS WORD
;
PASSWD: DB 'PASSWORD' ;DEFAULT PASS WORD
;
;
START:
LXI SP,STACK
CALL LOGIN ;LOG IN
CALL SETUSR ;SET USER CODE TO ZERO
CALL OPEN ;OPEN SYSTEM FILE
LXI H,PARAMT
SHLD DMAADD ;SET DMA ADDRESS TO WORK
CALL READ ;READ PARAMETER PAGE
LHLD PARAMT
SHLD DMAADD ;GET LOADING TOP
LXI D,3
DAD D
SHLD NDOSPT ;SAVE NDOS COLD START ENTRY
LHLD PARAMT+2
DAD D
DAD D
SHLD SNIOSP ;GET SNIOS ENTRY FOR CONFIGRATION TABLE
LHLD PARAMT+4
DAD D
DAD D
SHLD BDOSPT ;GET BDOS ENTRY
LHLD PARAMT+6
SHLD BIOSPT ;BIOS COLD START POINT
LHLD PARAMT+8 ;GET SYSTEM LENGTH
DAD H
MOV A,H ;GET COUNT
LOOP: ;SECTOR READ LOOP
PUSH PSW ;SAVE COUNT
CALL READ ;READ ONE SECTOR
LHLD DMAADD
LXI D,128
DAD D
SHLD DMAADD ;TO NEXT DMA ADDRESS
POP PSW
DCR A
JNZ LOOP ;TO NEXT SECTOR
MVI A,0C3H
STA TOP
STA TOP+5 ;SET JUMP INSTRUCTIONS
LHLD BDOSPT
SHLD TOP+6 ;SET BDOS ENTRY
LHLD BIOSPT
INX H
INX H
INX H
SHLD TOP+1 ;SET WARM BOOT VECTOR
LXI H,LOOPEN
PUSH H
LHLD SNIOSP ;GET ROUTINE POINT FOR CONFIGRATION TABLE
PUSH H
LHLD NDOSPT
MOV B,H
MOV C,L ;GET NDOS TOP
LHLD BIOSPT
PCHL ;TO BIOS INITIALIZE ROUTINE
;
LOOPEN:
INX H
LDA SLVID
MOV M,A ;SET SLAVE ID
LXI D,40
DAD D
MOV M,A ;SLAVE ID FOR LIST OUT
LHLD NDOSPT
PCHL ;TO NDOS COLD START POINT
;
; OPEN FILE
;
OPEN:
XRA A
STA FCB+12 ;CLEAR EXTENT
STA FCB+13 ;CLEAR CURRENT RECODE
CALL STFCBP ;SET FCB POINT
LXI H,FCB
MVI B,13
CALL MCPYTO ;SET FCB DATA
MVI C,COPEN
CALL LINK ;LINK WITH MATSER
CALL GTRPA ;GET RETURN PARAMETER
INR A
MVI A,'O'
JZ LOADER ;OPEN ERROR
RET
;
; READ ONE SECTNR
;
READ:
CALL STFCBP
CALL STEXCR ;SET EXTENT & CURRENT RECODE
MVI C,CREAD
CALL LINK
CALL RSEXCR ;RESTORE EXTENT & CURRENT RECODE
LHLD DMAADD ;DMA POINT
MVI B,128
CALL MCPYFR ;GET DAMA
CALL GTRPA ;GET RETURN PARAMETER
ORA A
MVI A,'D'
JNZ LOADER ;READ DATA ERROR
RET
;
; LINK WITH MASTER
; INPUT
; C:FUNCTION
;
LINK:
LXI H,MSGTOP
MVI M,0 ;TO SEND
INX H
LDA MSTID
MOV M,A
INX H
LDA SLVID
MOV M,A ;SET SLAVE ID
INX H
MOV M,C ;SET FCUNTION
INX H
XCHG
LHLD MCRPNT ;DATA POINT
XRA A
SUB E
MOV C,A
MVI A,0
SBB D
MOV B,A
DAD B ;GET LENGTH
DCX H
DCX H
XCHG
MOV M,E ;SET SIZE
LXI B,MSGTOP
CALL SNDMSG
INR A
MVI A,'S'
JZ LOADER ;SEND ERROR
LXI B,MSGTOP
CALL RCVMSG
INR A
MVI A,'R'
JZ LOADER ;RECEIVE ERROR
LXI H,MSGDAT
SHLD MCRPNT ;INITIALIZE POINTER
RET
;
; RESTORE EXTENT & CURRENT RECORD
;
RSEXCR:
LHLD MCRPNT
MOV A,M
STA FCB+12 ;SET EXTENT
INX H
MOV A,M
STA FCB+13 ;SET CURRENT RECODE
INX H
SHLD MCRPNT
RET
;
; GET RETURN PARAMETER
; OUTPUT
; A:ONE BYTE PARAMETER SAME WITH L
;
GTRPA:
LHLD MCRPNT
MOV A,M ;GET PARAMETER
RET
;
; SET EXTENT & CURRENT RECODE
;
STEXCR:
LHLD MCRPNT
LDA FCB+12 ;GET EXTENT
MOV M,A
INX H
LDA FCB+13 ;GET CURRENT RECODE
MOV M,A
INX H
SHLD MCRPNT
RET
;
; SET FCB POINT
;
STFCBP:
LXI H,MSGDAT
LXI D,FCB
MOV M,E
INX H
MOV M,D ;SET FCB POINT
INX H
SHLD MCRPNT ;SET POINTER
RET
;
; MESSAGE COPY FROM MESSAGE BUFFER
; INPUT
; B:COUNT
; HL:DESTINATION
;
MCPYFR:
XCHG
LHLD MCRPNT ;GET MESSAGE BUFFER POINT
MOV A,M ;COPY DATA
STAX D
INX D
INX H
DCR B
JNZ $-5 ;TO NEXT BYTE
SHLD MCRPNT ;SAVE NEXT POINT
RET
;
; MESSAGE COPY TO MESSAGE BUFFER
; INPUT
; B:COUNT
; HL:SOURCE POINT
;
MCPYTO:
XCHG
LHLD MCRPNT ;GET MESSAGE POINT
LDAX D ;COPY DATA
MOV M,A
INX D
INX H
DCR B
JNZ $-5
SHLD MCRPNT ;SAVE NEXT POINT
RET
;
; LOGIN
;
LOGIN:
LXI H,MSGDAT
SHLD MCRPNT ;SET POINTER TO TOP
LXI H,PASSWD
MVI B,8
CALL MCPYTO ;SET PASSWORD
MVI C,CLOGIN
CALL LINK
CALL GTRPA ;GET RESULT
ORA A
MVI A,'L'
JNZ LOADER ;LOGIN ERROR
RET
;
; SET USER CODE TO ZERO
;
SETUSR:
LXI H,MSGDAT
MVI M,0 ;SET USER CODE ZERO
INX H
SHLD MCRPNT ;SET DATA POINTER
MVI C,CSTUSC
JMP LINK
;
; LOAD ERROR
; INPUT
; A:ERROR CODE
;
LOADER:
LXI D,CBOTER ;ERROR COMMENT POINT
JMP FTEROR
;
;
SUBTTL COMMUNICATION PART
;
; FATAL ERROR END STOP
; INPUT
; DE:ERROR STRING POINTER
; A:ERROR CODE
;
FTEROR:
DI
MOV C,A
LXI H,CRTBF+50
INX H
INX D
LDAX D
MOV M,A
ORA A
JNZ $-5 ;TO NEXT CODE
MOV M,C ;SET ERROR CODE
MVI A,20H
OUT CPORT ;BELL ON
JMP $
;
; SEND MESSAGE ON NETWORK
; INPUT
; BC:MESSAGE ADDRESS
;
SNDMSG:
MOV H,B
MOV L,C
SHLD MSGADR ;SAVE MESSAGE ADDRESS
SNDMSR: ;RETRY LOOP
MVI A,MAXRTY
STA RTYCNT ;INITIALIE RETRY COUNT
SEND:
CALL NTRSET ;RESET BUFFER
SENDS:
LHLD MSGADR ;GET MESSAGE TOP
MVI D,TMORTY ;TIME OUT RETRY COUNT
SENDWT: ;ENQUIRE RESPONSE WAIT LOOP
MVI C,ENQ
CALL CHROUT ;SEND ENQUIRE TO MASTER
CALL CHARIN ;WAIT RESPONSE
JNC SENDGT ;GET RESPONSE
DCR D ;TIME OVER
JNZ SENDWT ;SEND ENQUIRE ONCE MORE
JMP CHINTO ;TIME OVER FOR LINK
;
SENDGT: ;GET RESPONSE
CPI ENQ ;CHECK SEND - SEND MODE
JZ SNDRCV ;CRASH SEND SO TO PASS RECEIVE MODE
CALL GETAK0 ;GET RESPONSE OF ENQ
MVI C,SOH
MVI E,5 ;HEADER LENGTH COUNT
CALL MSGOUT ;SEND SOH,FMT,DID,SID,FNC,SIZ
XRA A
SUB D
MOV C,A
CALL NETOUT ;SEND HCS (HEADER CHECK SUM)
CALL CHARIW ;GET RESPONSE
JC GETATS ;TIME OVER
CPI ACK
JNZ $+9 ;NORMAL MODE
CALL CHARIW ;MAYBE BUFFER LEFT ACK, SO IGNORE
JC GETATS ;TIME OVER
SUI ACKS
JNZ GETATS ;MISS MATCH OF RESPONSE
DCX H
MOV E,M
INX H
INR E
MVI C,STX
CALL MSGOUT ;SEND STX,DB0,DB1,....
MVI C,ETX
CALL NETOUT ;SEND ETX
XRA A
SUB D
MOV C,A
CALL NETOUT ;SEND DATA CHECK SUM
MVI C,EOT
CALL CHROUT ;SEND END OF TRNASMISSION
CALL GETAKS ;********NEED CALL ******* FOR ERROR RETRY
RET
;
; PASS RECEIVE FOR SEND & SEND MODE
;
SNDRCV:
CALL NTRSET ;CLEAR CURRENT BUFFER
MVI D,TMORTY
SNDRCW: ;WAIT FOR ANOTHER ENQ
CALL CHARIN
JNC SNDRCG ;GET DATA
DCR D ;TIME OVER
JNZ SNDRCW ;WAIT
JMP SEND ;MAYBE MISS LINK, SO TO SEND
;
SNDRCG: ;GET DATA
CPI ENQ
JNZ SEND ;MAYBE MISS LINK
LXI H,SNDRCV
PUSH H ;SAVE RETRY LOOP
CALL SNDACK ;SEND ACKNOWLEDGE
CALL CHARIW
RC ;NO RESPONSE, SO RETRY
CPI SOH
RNZ
LXI H,DHEADR ;DUMMY HEADER BUFFER
MOV D,A
MVI E,5
CALL MSGIN ;GET HEADER
CNC NETIN ;GET CHECK SUM
RC ;TIME OUT RETRY
JNZ SNDNAK ;CHECK SUM ERROR
CALL SNDAKS ;SEND RESPONSE
CALL CHARIW
RC
CPI STX ;CHECK START OF TEXT
RNZ ;RETRY
MOV D,A ;INITIALIZE CHECK SUM
DCX H
MOV E,M
INR E
INR E ;GET COUNT FOR READ
SNDRCL: ;DATA PASS RECEIVE LOOP
CALL NETIN ;GET ONE DATA
RC ;TIME OUT RETRY
DCR E
JNZ SNDRCL ;TO NEXT DATA
CPI ETX
RNZ ;MISS MATCH OF END CODE
CALL NETIN ;GET CHECK SUM
RC
CALL CHARIN
RC
CPI EOT ;END OF TRANSMISSION
RNZ
MOV A,D
ORA A
JNZ SNDNAK ;CHECK SUM ERROR
CALL SNDAKS
POP H
JMP SENDS
;
; GET ACKNOWLEDGE
; OVERRIDING RETURN WHEN ERROR
;
GETAK0: ;CHECK ACKNOWLEDGE
SUI ACK
RZ
SNDRTY:
POP H ;DISCARD RETURN ADDRESS
GETATS: ;TIME OVER RETRY
LXI H,RTYCNT
DCR M
JNZ SEND ;SEND AGAIN
CHINTO: ;CHARACTER IN TIME OUT
MVI A,-1
RET
;
GETAKS: ;GET SECOND ACKNOWLEDGE
CALL CHARIW
JC SNDRTY ;TIME OUT
SUI ACKS
RZ ;OK
JMP SNDRTY ;RETRY
;
; RECEIVE MESSAGE FROM NETWORK
; INPUT
; BC:MESSAGE ADDRESS
;
RCVMSG:
MOV H,B
MOV L,C
SHLD MSGADR ;SAVE MESSAGE ADDRESS
RCVMSR:
MVI A,MAXRTY
STA RTYCNT ;INITIALIZE RETRY COUNT
RECALL:
CALL RECEIV
LXI H,RTYCNT ;RETURN FROM RECEIV IS ERROR
DCR M
JNZ RECALL ;RETRY
RCVTOT: ;TIME OUT
MVI A,-1
RET
;
; RECEIVE BODDY
; RETURN OVERRIDING WHEN OK
; SIMPLE RETURN IS ERROR
;
RECEIV:
LHLD MSGADR ;GET MESSAGE ADDRESS
MVI D,TMORTY
CALL NTRSET ;RESET INPUT BUFFER
RCVFST: ;RECEIVE FIRST CHARACTER LOOP
CALL CHARIN
JNC RCVGFS ;GET FIRST CHARACTER
DCR D ;TIME OVER
JNZ RCVFST ;RETRY
POP H
JMP RCVTOT ;SET TIME OVER ERROR FLAG & RETRY
;
RCVGFS: ;GET FIRST CHARACTER
CPI ENQ
JNZ RECEIV ;NOT ENQUIRE SO RETRY
CALL SNDACK ;RESPONSE TO MASTER
CALL CHARIW
RC ;RETURN TO RECEIVE RETRY
CPI SOH
RNZ ;NOT START OF HEADER
MOV D,A ;START OF HEADER
MVI E,5 ;LENGTH OF HEADER
CALL MSGIN ;GET HEADER BLOCK
CNC NETIN ;GET HCS (HEADER CHECK SUM)
RC ;TIME OVER RETRY
JNZ SNDNAK ;CHECK SUM ERROR
CALL SNDAKS ;SEND RESPONSE
CALL CHARIW ;WAIT DATA TOP
RC
CPI STX
RNZ ;NOT START OF TEXT
MOV D,A ;START OF TEXT
DCX H
MOV E,M ;GET SIZE
INX H
INR E ;MAKE READ COUNT FOR DATA BLOCK
CALL MSGIN ;RECEIVE DATA
RC
CALL CHARIN ;GET END CODE OF DATA BLOCK
RC
CPI ETX
RNZ ;NOT END OF TEXT SO RETRY
ADD D
MOV D,A
CALL NETIN ;GET HEADER CHECK SUM
RC
CALL CHARIN ;GET LAST CODE
RC
CPI EOT
RNZ ;NOT END OF TRANSMIT SO ERROR
MOV A,D
ORA A
JNZ SNDNAK ;CHECK SUM ERROR
POP H ;OK ALL PACKETTE IS RECEIVED
LHLD MSGADR
INX H
LDA SLVID ;GET SLAVE ID
SUB M ;CHECK SID
JZ $+5
MVI A,-1 ;SID ERROR
PUSH PSW
CALL SNDAKS ;SEND ACKNOWLEDGE
POP PSW
RET
;
; ROUTINES TO SEND RESPONSE CODES
;
SNDACK: ;SEND ACKNOWLEDGE
MVI C,ACK
JMP CHROUT
;
SNDAKS: ;SEND SECOND ACKNOWLEDGE
MVI C,ACKS
JMP CHROUT
;
SNDNAK: ;SEND NEGATIVE ACKNOWLEDGE
MVI C,NAK
JMP CHROUT
;
; NETWORK ERROR RECOVER ROUTINE RESET COMMUNICATION INTERFACE
;
NTRSET:
MVI A,080H
OUT STATO ;RESET
RET
;
; NETWORK OUTPUT DATA
; INPUT
; C:OUTPUT DATA
; D:CHECK SUM
;
NETOUT:
MOV A,D
ADD C
MOV D,A ;MAKE CHECK SUM
CHROUT:
IN STATO
ANI MSKO ;GET OUTPUT READY MODE
JNZ CHROUT ;NOT READY
MOV A,C
OUT DPRTO ;OUT DATA
RET
;
; INPUT FROM NETWORK
; OUTPUT
; A:DATA
; CF:ON TIME OVER OFF GET DATA
;
CHARIW: ;LONG WAIT
MVI B,0
JMP CHARIM
;
CHARIN:
MVI B,10 ;10 MS = 192 CH / 192K BAUD
CHARIM: ;WAIT LOOP
MVI C,5AH ;1 MS WAIT VALUE
CHARIL: ;1 MS WAIT LOOP
IN STATI
ANI MSKI
JZ CHARIG ;READY
DCR C
JNZ CHARIL ;WAIT OF 1 MS
DCR B
JNZ CHARIM ;WAIT
STC ;TIME OVER RETURN
RET
;
CHARIG:
IN DPRTI ;GET DATA
RET
;
; MESSAGE INPUT
; INPUT
; HL:DESTINATION ADDRESS
; E:INPUT COUNT
;
MSGIN:
CALL NETIN
RC ;TIME OUT
MOV M,A ;GET DATA
INX H
DCR E
JNZ MSGIN ;TO NEXT BYTE
RET
;
; NETWORK INPUT
; INPUT
; D:CHECK SUM
; OUTPUT
; A:DATA
;
NETIN:
CALL CHARIN ;RECEIVE BYTE IN BINARY MODE
RC
MOV B,A
ADD D ;MAKE CHECK SUM
MOV D,A
ORA A ;OFF CARRY FLAG
MOV A,B
RET
;
; MESSAGE OUT
; INPUT
; HL:SOURCE ADDRESS
; E:COUNT OF OUTPUT DATA
; C:PREAMBLE CODE
;
MSGOUT:
MVI D,0 ;CLEAR CHECK SUM
CALL NETOUT ;OUT PREAMBLE CODE
MSGOTL: ;OUT LOOP
MOV C,M ;GET CODE
INX H
CALL NETOUT ;OUT DATA
DCR E
JNZ MSGOTL ;TO NEXT DATA
RET
;
;
CBOTER: DB ' LOAD ERROR ',0
;
; WORKING AREA
; FOR BOOT
;
DMAADD: DS 2 ;DMA ADDRESS
NDOSPT: DS 2 ;NDOS COLD START POINT
SNIOSP: DS 2 ;SNIOS ENTRY FOR CONFIGRATION TABLE
BDOSPT: DS 2 ;BDOS ENTRY POINT
BIOSPT: DS 2 ;BIOS COLD START POINT
;
MCRPNT: DS 2 ;MESSAGE POINTER
;
; MESSAGE AREA
;
MSGTOP: DS 5 ;HEADER
MSGDAT: DS 2 ;DATA
PARAMT: DS 128 ;DATA OF ONE SECTOR
DS 1
;
DS 64
STACK:
;
; DATA AREA FOR SEND & RECEIVE
;
MSGADR: DS 2 ;MESSSAGE ADDRESS BUFFER
DHEADR: DS 5 ;DUMMY HEADER BUFFER
RTYCNT: DB 0 ;RETRY COUNT
;
;
END


File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,490 @@
; SLAVE NETWORK INPUT OUTPUT SYSTEM
; FOR NOS MODE
;
TITLE SLAVE NETWORK INPUT OUTPUT SYSTEM FOR NOS
;
; EQUATIONS OF SLAVE PROCESSOR ID CODE
;
SLVID EQU 20H
;
; EQUATIONS OF NETWORK STATUS BYTE
;
ACTIVE EQU 10H ;SLAVE LOGGED IN ON NETWORK
RCVERR EQU 2H ;ERROR IN RECEIVED MESSAGE
SNDERR EQU 1H ;UNABLE TO SEND MESSAGE
;
; EQUATIONS OF CODE & DATA
;
SOH EQU 01H ;START OF HEADER
STX EQU 02H ;START OF DATA
ETX EQU 03H ;END OF DATA
EOT EQU 04H ;END OF TRANSMISSION
ENQ EQU 05H ;ENQUIRE
ACK EQU 06H ;ACKNOWLEDGE
ACKS EQU 07H ;SECOND ACKNOWLEDGE
LF EQU 0AH ;LINE FEED
CR EQU 0DH ;CARRIAGRE RETURN
NAK EQU 15H ;NEGATIVE ACKNOWLEDGE
;
CBUFPR EQU 9 ;PRINT BUFFER BDOS FUNCTION
LOGIN EQU 64 ;LOGIN NDOS FUNCTION NUMBER
;
TMORTY EQU 100 ;TIME OUT RETRY COUNT
MAXRTY EQU 10 ;SEND MESSAGE RETRY COUNT
;
; EQUATIONS OF INPUT OUTPUT PORT & ADDRESS
;
BDOS EQU 5 ;BDOS ENTRY ADDRESS
;
COMPRT EQU 0C4H ;COMMUNICATION PORT
STATI EQU COMPRT ;INPUT STATUS
DPRTI EQU COMPRT+1 ;DATA PORT
MSKI EQU 01H ;INPUT READY BIT
;
STATO EQU COMPRT ;OUTPUT STATUS
DPRTO EQU COMPRT+1 ;DATA PORT
MSKO EQU 80H ;OUTPUT READY BIT
;
; JUMP VECTOR FOR SNIOS ENTRY POINTS
;
JMP NTWKIN ;NETWORK INITIALIZE
JMP NTWKST ;NETWORK STATUS
JMP CNTBAD ;RETURN CONFIGRATION TABLE ADDRESS
JMP SNDMSG ;SEND MESSAGE
JMP RCVMSG ;RECEIVE MESSAGE
JMP NTRSET ;NETWORK ERROR RESET
JMP NTWKWB ;NETWORK WARM BOOT
;
; SLAVE CONFIGRATION TABLE
;
CNFTBL:
DB 0 ;NETWORK STATUS BYTE
DB SLVID ;SLAVE PROCESSOR ID
DB 81H,0 ;A: HOME DISK IS B: OF MASTER 0
DB 80H,0 ;B: A: OF MASTER 0
DB 82H,0 ;C: C: OF MASTER 0
DB 83H,0 ;D: D: OF MASTER 0
DB 84H,0 ;E: E: OF MASTER 0
DB 0,0 ;F: NO DEVICE
DB 0,0 ;G: NO DEVICE
DB 0,0 ;H: NO DEVICE
DB 0,0 ;I: NO DEVICE
DB 0,0 ;J: NO DEVICE
DB 0,0 ;K: NO DEVICE
DB 0,0 ;L: NO DEVICE
DB 0,0 ;M: NO DEVICE
DB 0,0 ;N: NO DEVICE
DB 0,0 ;O: NO DEVICE
DB 0,0 ;P: NO DEVICE
;
DB 0,0 ;CONSOLE DEVICE
;
DB 0,0 ;LIST DEVICE
DB 0 ;BUFFER INDEX
;
DB 0 ;FMT MESSAGE BUFFER FOR LISTER
DB 0 ;DID
DB SLVID ;SID
DB 5 ;FNC LIST OUT
DB 0 ;SIZ
DS 1 ;MESSAGE 0 LISTER NUMBER
DS 128 ;MESSAGE 1 - 128 OUTPUT DATA
;
; INITIALIZE NETWROK
;
NTWKIN:
CALL NTRSET ;RESET COMMUNICATION INTERFACE
XRA A ;RETURN CODE 0 IS SUCCESS END
RET
;
; OUTPUT STATUS OF NETWORK
;
NTWKST:
LDA CNFTBL ;GET NETWORK STATUS
MOV B,A
ANI NOT (RCVERR+SNDERR)
STA CNFTBL ;OFF ERROR BITS
MOV A,B
RET
;
; RETURN CONFIGRATION TABLE ADDRESS
;
CNTBAD:
LXI H,CNFTBL
RET
;
; SEND MESSAGE ON NETWORK
; INPUT
; BC:MESSAGE ADDRESS
;
SNDMSG:
MOV H,B
MOV L,C
SHLD MSGADR ;SAVE MESSAGE ADDRESS
SNDMSR: ;RETRY LOOP
MVI A,MAXRTY
STA RTYCNT ;INITIALIE RETRY COUNT
SEND:
CALL NTRSET ;RESET BUFFER
SENDS:
LHLD MSGADR ;GET MESSAGE TOP
MVI D,TMORTY ;TIME OUT RETRY COUNT
SENDWT: ;ENQUIRE RESPONSE WAIT LOOP
MVI C,ENQ
CALL CHROUT ;SEND ENQUIRE TO MASTER
CALL CHARIN ;WAIT RESPONSE
JNC SENDGT ;GET RESPONSE
DCR D ;TIME OVER
JNZ SENDWT ;SEND ENQUIRE ONCE MORE
JMP CHINTO ;TIME OVER FOR LINK
;
SENDGT: ;GET RESPONSE
CPI ENQ ;CHECK SEND - SEND MODE
JZ SNDRCV ;CRASH SEND SO TO PASS RECEIVE MODE
CALL GETAK0 ;GET RESPONSE OF ENQ
MVI C,SOH
MVI E,5 ;HEADER LENGTH COUNT
CALL MSGOUT ;SEND SOH,FMT,DID,SID,FNC,SIZ
XRA A
SUB D
MOV C,A
CALL NETOUT ;SEND HCS (HEADER CHECK SUM)
CALL CHARIW ;GET RESPONSE
JC GETATS ;TIME OVER
CPI ACK
JNZ $+9 ;NORMAL MODE
CALL CHARIW ;MAYBE BUFFER LEFT ACK, SO IGNORE
JC GETATS ;TIME OVER
SUI ACKS
JNZ GETATS ;MISS MATCH OF RESPONSE
DCX H
MOV E,M
INX H
INR E
MVI C,STX
CALL MSGOUT ;SEND STX,DB0,DB1,....
MVI C,ETX
CALL NETOUT ;SEND ETX
XRA A
SUB D
MOV C,A
CALL NETOUT ;SEND DATA CHECK SUM
MVI C,EOT
CALL CHROUT ;SEND END OF TRNASMISSION
CALL GETAKS ;********NEED CALL ******* FOR ERROR RETRY
RET
;
; PASS RECEIVE FOR SEND & SEND MODE
;
SNDRCV:
CALL NTRSET ;CLEAR CURRENT BUFFER
MVI D,TMORTY
SNDRCW: ;WAIT FOR ANOTHER ENQ
CALL CHARIN
JNC SNDRCG ;GET DATA
DCR D ;TIME OVER
JNZ SNDRCW ;WAIT
JMP SEND ;MAYBE MISS LINK, SO TO SEND
;
SNDRCG: ;GET DATA
CPI ENQ
JNZ SEND ;MAYBE MISS LINK
LXI H,SNDRCV
PUSH H ;SAVE RETRY LOOP
CALL SNDACK ;SEND ACKNOWLEDGE
CALL CHARIW
RC ;NO RESPONSE, SO RETRY
CPI SOH
RNZ
LXI H,DHEADR ;DUMMY HEADER BUFFER
MOV D,A
MVI E,5
CALL MSGIN ;GET HEADER
CNC NETIN ;GET CHECK SUM
RC ;TIME OUT RETRY
JNZ SNDNAK ;CHECK SUM ERROR
CALL SNDAKS ;SEND RESPONSE
CALL CHARIW
RC
CPI STX ;CHECK START OF TEXT
RNZ ;RETRY
MOV D,A ;INITIALIZE CHECK SUM
DCX H
MOV E,M
INR E
INR E ;GET COUNT FOR READ
SNDRCL: ;DATA PASS RECEIVE LOOP
CALL NETIN ;GET ONE DATA
RC ;TIME OUT RETRY
DCR E
JNZ SNDRCL ;TO NEXT DATA
CPI ETX
RNZ ;MISS MATCH OF END CODE
CALL NETIN ;GET CHECK SUM
RC
CALL CHARIN
RC
CPI EOT ;END OF TRANSMISSION
RNZ
MOV A,D
ORA A
JNZ SNDNAK ;CHECK SUM ERROR
CALL SNDAKS
POP H
JMP SENDS
;
; GET ACKNOWLEDGE
; OVERRIDING RETURN WHEN ERROR
;
GETAK0: ;CHECK ACKNOWLEDGE
SUI ACK
RZ
SNDRTY:
POP H ;DISCARD RETURN ADDRESS
GETATS: ;TIME OVER RETRY
LXI H,RTYCNT
DCR M
JNZ SEND ;SEND AGAIN
CHINTO: ;CHARACTER IN TIME OUT
MVI A,SNDERR
CALL ERETRN
JMP SNDMSR
;
GETAKS: ;GET SECOND ACKNOWLEDGE
CALL CHARIW
JC SNDRTY ;TIME OUT
SUI ACKS
RZ ;OK
JMP SNDRTY ;RETRY
;
; RECEIVE MESSAGE FROM NETWORK
; INPUT
; BC:MESSAGE ADDRESS
;
RCVMSG:
MOV H,B
MOV L,C
SHLD MSGADR ;SAVE MESSAGE ADDRESS
RCVMSR:
MVI A,MAXRTY
STA RTYCNT ;INITIALIZE RETRY COUNT
RECALL:
CALL RECEIV
LXI H,RTYCNT ;RETURN FROM RECEIV IS ERROR
DCR M
JNZ RECALL ;RETRY
RCVTOT: ;TIME OUT
MVI A,RCVERR
CALL ERETRN
JMP RCVMSR
;
; RECEIVE BODDY
; RETURN OVERRIDING WHEN OK
; SIMPLE RETURN IS ERROR
;
RECEIV:
LHLD MSGADR ;GET MESSAGE ADDRESS
MVI D,TMORTY
CALL NTRSET ;RESET INPUT BUFFER
RCVFST: ;RECEIVE FIRST CHARACTER LOOP
CALL CHARIN
JNC RCVGFS ;GET FIRST CHARACTER
DCR D ;TIME OVER
JNZ RCVFST ;RETRY
POP H
JMP RCVTOT ;SET TIME OVER ERROR FLAG & RETRY
;
RCVGFS: ;GET FIRST CHARACTER
CPI ENQ
JNZ RECEIV ;NOT ENQUIRE SO RETRY
CALL SNDACK ;RESPONSE TO MASTER
CALL CHARIW
RC ;RETURN TO RECEIVE RETRY
CPI SOH
RNZ ;NOT START OF HEADER
MOV D,A ;START OF HEADER
MVI E,5 ;LENGTH OF HEADER
CALL MSGIN ;GET HEADER BLOCK
CNC NETIN ;GET HCS (HEADER CHECK SUM)
RC ;TIME OVER RETRY
JNZ SNDNAK ;CHECK SUM ERROR
CALL SNDAKS ;SEND RESPONSE
CALL CHARIW ;WAIT DATA TOP
RC
CPI STX
RNZ ;NOT START OF TEXT
MOV D,A ;START OF TEXT
DCX H
MOV E,M ;GET SIZE
INX H
INR E ;MAKE READ COUNT FOR DATA BLOCK
CALL MSGIN ;RECEIVE DATA
RC
CALL CHARIN ;GET END CODE OF DATA BLOCK
RC
CPI ETX
RNZ ;NOT END OF TEXT SO RETRY
ADD D
MOV D,A
CALL NETIN ;GET HEADER CHECK SUM
RC
CALL CHARIN ;GET LAST CODE
RC
CPI EOT
RNZ ;NOT END OF TRANSMIT SO ERROR
MOV A,D
ORA A
JNZ SNDNAK ;CHECK SUM ERROR
POP H ;OK ALL PACKETTE IS RECEIVED
LHLD MSGADR
INX H
LDA CNFTBL+1 ;GET SLAVE ID
SUB M ;CHECK SID
JZ $+5
MVI A,-1 ;SID ERROR
PUSH PSW
CALL SNDAKS ;SEND ACKNOWLEDGE
POP PSW
RET
;
; ROUTINES TO SEND RESPONSE CODES
;
SNDACK: ;SEND ACKNOWLEDGE
MVI C,ACK
JMP CHROUT
;
SNDAKS: ;SEND SECOND ACKNOWLEDGE
MVI C,ACKS
JMP CHROUT
;
SNDNAK: ;SEND NEGATIVE ACKNOWLEDGE
MVI C,NAK
JMP CHROUT
;
; ERROR RETURN
; INPUT
; A:ERROR BIT
; OUTPUT
; A:-1
;
ERETRN:
LXI H,CNFTBL
ORA M ;ON ERROR BIT
MOV M,A
CALL NTRSET ;RESET COMMUNICATION INTERFACE
MVI A,-1 ;ERROR RETUNR CODE
RET
;
; NETWORK ERROR RECOVER ROUTINE RESET COMMUNICATION INTERFACE
;
NTRSET:
MVI A,080H
OUT STATO ;RESET
RET
;
; BOOTING UP ROUTINE
;
NTWKWB:
JMP NTRSET ;RESET INTERFACE
;
; NETWORK OUTPUT DATA
; INPUT
; C:OUTPUT DATA
; D:CHECK SUM
;
NETOUT:
MOV A,D
ADD C
MOV D,A ;MAKE CHECK SUM
CHROUT:
IN STATO
ANI MSKO ;GET OUTPUT READY MODE
JNZ CHROUT ;NOT READY
MOV A,C
OUT DPRTO ;OUT DATA
RET
;
; INPUT FROM NETWORK
; OUTPUT
; A:DATA
; CF:ON TIME OVER OFF GET DATA
;
CHARIW: ;LONG WAIT
MVI B,0
JMP CHARIM
;
CHARIN:
MVI B,10 ;10 MS = 192 CH / 192K BAUD
CHARIM: ;WAIT LOOP
MVI C,5AH ;1 MS WAIT VALUE
CHARIL: ;1 MS WAIT LOOP
IN STATI
ANI MSKI
JZ CHARIG ;READY
DCR C
JNZ CHARIL ;WAIT OF 1 MS
DCR B
JNZ CHARIM ;WAIT
STC ;TIME OVER RETURN
RET
;
CHARIG:
IN DPRTI ;GET DATA
RET
;
; MESSAGE INPUT
; INPUT
; HL:DESTINATION ADDRESS
; E:INPUT COUNT
;
MSGIN:
CALL NETIN
RC ;TIME OUT
MOV M,A ;GET DATA
INX H
DCR E
JNZ MSGIN ;TO NEXT BYTE
RET
;
; NETWORK INPUT
; INPUT
; D:CHECK SUM
; OUTPUT
; A:DATA
;
NETIN:
CALL CHARIN ;RECEIVE BYTE IN BINARY MODE
RC
MOV B,A
ADD D ;MAKE CHECK SUM
MOV D,A
ORA A ;OFF CARRY FLAG
MOV A,B
RET
;
; MESSAGE OUT
; INPUT
; HL:SOURCE ADDRESS
; E:COUNT OF OUTPUT DATA
; C:PREAMBLE CODE
;
MSGOUT:
MVI D,0 ;CLEAR CHECK SUM
CALL NETOUT ;OUT PREAMBLE CODE
MSGOTL: ;OUT LOOP
MOV C,M ;GET CODE
INX H
CALL NETOUT ;OUT DATA
DCR E
JNZ MSGOTL ;TO NEXT DATA
RET
;
; DATA AREA
;
MSGADR: DS 2 ;MESSSAGE ADDRESS BUFFER
DHEADR: DS 5 ;DUMMY HEADER BUFFER
RTYCNT: DB 0 ;RETRY COUNT
;
;
END


View File

@@ -0,0 +1 @@
Here is the source for CP/NET for the 8080/Z80. This is a disassembly, but looks well commented.

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,489 @@
; SLAVE NETWORK INPUT OUTPUT SYSTEM
;
TITLE 'SLAVE NETWORK INPUT OUTPUT SYSTEM'
;
; EQUATIONS OF SLAVE PROCESSOR ID CODE
;
SLVID EQU 10H
;
; EQUATIONS OF NETWORK STATUS BYTE
;
ACTIVE EQU 10H ;SLAVE LOGGED IN ON NETWORK
RCVERR EQU 2H ;ERROR IN RECEIVED MESSAGE
SNDERR EQU 1H ;UNABLE TO SEND MESSAGE
;
; EQUATIONS OF CODE & DATA
;
SOH EQU 01H ;START OF HEADER
STX EQU 02H ;START OF DATA
ETX EQU 03H ;END OF DATA
EOT EQU 04H ;END OF TRANSMISSION
ENQ EQU 05H ;ENQUIRE
ACK EQU 06H ;ACKNOWLEDGE
ACKS EQU 07H ;SECOND ACKNOWLEDGE
LF EQU 0AH ;LINE FEED
CR EQU 0DH ;CARRIAGRE RETURN
NAK EQU 15H ;NEGATIVE ACKNOWLEDGE
;
CBUFPR EQU 9 ;PRINT BUFFER BDOS FUNCTION
LOGIN EQU 64 ;LOGIN NDOS FUNCTION NUMBER
;
TMORTY EQU 100 ;TIME OUT RETRY COUNT
MAXRTY EQU 10 ;SEND MESSAGE RETRY COUNT
;
; EQUATIONS OF INPUT OUTPUT PORT & ADDRESS
;
BDOS EQU 5 ;BDOS ENTRY ADDRESS
;
COMPRT EQU 0C4H ;COMMUNICATION PORT
STATI EQU COMPRT ;INPUT STATUS
DPRTI EQU COMPRT+1 ;DATA PORT
MSKI EQU 01H ;INPUT READY BIT
;
STATO EQU COMPRT ;OUTPUT STATUS
DPRTO EQU COMPRT+1 ;DATA PORT
MSKO EQU 80H ;OUTPUT READY BIT
;
; JUMP VECTOR FOR SNIOS ENTRY POINTS
;
JMP NTWKIN ;NETWORK INITIALIZE
JMP NTWKST ;NETWORK STATUS
JMP CNTBAD ;RETURN CONFIGRATION TABLE ADDRESS
JMP SNDMSG ;SEND MESSAGE
JMP RCVMSG ;RECEIVE MESSAGE
JMP NTRSET ;NETWORK ERROR RESET
JMP NTWKWB ;NETWORK WARM BOOT
;
; SLAVE CONFIGRATION TABLE
;
CNFTBL:
DB 0 ;NETWORK STATUS BYTE
DB SLVID ;SLAVE PROCESSOR ID
DB 0,0 ;A: DISK DEVICE
DB 0,0 ;B: DISK DEVICE
DB 0,0 ;C: DISK DEVICE
DB 0,0 ;D: DISK DEVICE
DB 80H,0 ;E: A: OF MASTER 0
DB 81H,0 ;F: B: OF MASTER 0
DB 82H,0 ;G: C: OF MASTER 0
DB 83H,0 ;H: D: OF MASTER 0
DB 84H,0 ;I: E: OF MASTER 0
DB 0,0 ;J: DISK DEVICE
DB 0,0 ;K: DISK DEVICE
DB 0,0 ;L: DISK DEVICE
DB 0,0 ;M: DISK DEVICE
DB 0,0 ;N: DISK DEVICE
DB 0,0 ;O: DISK DEVICE
DB 0,0 ;P: DISK DEVICE
;
DB 0,0 ;CONSOLE DEVICE
;
DB 0,0 ;LIST DEVICE
DB 0 ;BUFFER INDEX
;
DB 0 ;FMT MESSAGE BUFFER FOR LISTER
DB 0 ;DID
DB SLVID ;SID
DB 5 ;FNC LIST OUT
DB 0 ;SIZ
DS 1 ;MESSAGE 0 LISTER NUMBER
DS 128 ;MESSAGE 1 - 128 OUTPUT DATA
;
; INITIALIZE NETWROK
;
NTWKIN:
CALL NTRSET ;RESET COMMUNICATION INTERFACE
XRA A ;RETURN CODE 0 IS SUCCESS END
RET
;
; OUTPUT STATUS OF NETWORK
;
NTWKST:
LDA CNFTBL ;GET NETWORK STATUS
MOV B,A
ANI NOT (RCVERR+SNDERR)
STA CNFTBL ;OFF ERROR BITS
MOV A,B
RET
;
; RETURN CONFIGRATION TABLE ADDRESS
;
CNTBAD:
LXI H,CNFTBL
RET
;
; SEND MESSAGE ON NETWORK
; INPUT
; BC:MESSAGE ADDRESS
;
SNDMSG:
MOV H,B
MOV L,C
SHLD MSGADR ;SAVE MESSAGE ADDRESS
SNDMSR: ;RETRY LOOP
MVI A,MAXRTY
STA RTYCNT ;INITIALIE RETRY COUNT
SEND:
CALL NTRSET ;RESET BUFFER
SENDS:
LHLD MSGADR ;GET MESSAGE TOP
MVI D,TMORTY ;TIME OUT RETRY COUNT
SENDWT: ;ENQUIRE RESPONSE WAIT LOOP
MVI C,ENQ
CALL CHROUT ;SEND ENQUIRE TO MASTER
CALL CHARIN ;WAIT RESPONSE
JNC SENDGT ;GET RESPONSE
DCR D ;TIME OVER
JNZ SENDWT ;SEND ENQUIRE ONCE MORE
JMP CHINTO ;TIME OVER FOR LINK
;
SENDGT: ;GET RESPONSE
CPI ENQ ;CHECK SEND - SEND MODE
JZ SNDRCV ;CRASH SEND SO TO PASS RECEIVE MODE
CALL GETAK0 ;GET RESPONSE OF ENQ
MVI C,SOH
MVI E,5 ;HEADER LENGTH COUNT
CALL MSGOUT ;SEND SOH,FMT,DID,SID,FNC,SIZ
XRA A
SUB D
MOV C,A
CALL NETOUT ;SEND HCS (HEADER CHECK SUM)
CALL CHARIW ;GET RESPONSE
JC GETATS ;TIME OVER
CPI ACK
JNZ $+9 ;NORMAL MODE
CALL CHARIW ;MAYBE BUFFER LEFT ACK, SO IGNORE
JC GETATS ;TIME OVER
SUI ACKS
JNZ GETATS ;MISS MATCH OF RESPONSE
DCX H
MOV E,M
INX H
INR E
MVI C,STX
CALL MSGOUT ;SEND STX,DB0,DB1,....
MVI C,ETX
CALL NETOUT ;SEND ETX
XRA A
SUB D
MOV C,A
CALL NETOUT ;SEND DATA CHECK SUM
MVI C,EOT
CALL CHROUT ;SEND END OF TRNASMISSION
CALL GETAKS ;********NEED CALL ******* FOR ERROR RETRY
RET
;
; PASS RECEIVE FOR SEND & SEND MODE
;
SNDRCV:
CALL NTRSET ;CLEAR CURRENT BUFFER
MVI D,TMORTY
SNDRCW: ;WAIT FOR ANOTHER ENQ
CALL CHARIN
JNC SNDRCG ;GET DATA
DCR D ;TIME OVER
JNZ SNDRCW ;WAIT
JMP SEND ;MAYBE MISS LINK, SO TO SEND
;
SNDRCG: ;GET DATA
CPI ENQ
JNZ SEND ;MAYBE MISS LINK
LXI H,SNDRCV
PUSH H ;SAVE RETRY LOOP
CALL SNDACK ;SEND ACKNOWLEDGE
CALL CHARIW
RC ;NO RESPONSE, SO RETRY
CPI SOH
RNZ
LXI H,DHEADR ;DUMMY HEADER BUFFER
MOV D,A
MVI E,5
CALL MSGIN ;GET HEADER
CNC NETIN ;GET CHECK SUM
RC ;TIME OUT RETRY
JNZ SNDNAK ;CHECK SUM ERROR
CALL SNDAKS ;SEND RESPONSE
CALL CHARIW
RC
CPI STX ;CHECK START OF TEXT
RNZ ;RETRY
MOV D,A ;INITIALIZE CHECK SUM
DCX H
MOV E,M
INR E
INR E ;GET COUNT FOR READ
SNDRCL: ;DATA PASS RECEIVE LOOP
CALL NETIN ;GET ONE DATA
RC ;TIME OUT RETRY
DCR E
JNZ SNDRCL ;TO NEXT DATA
CPI ETX
RNZ ;MISS MATCH OF END CODE
CALL NETIN ;GET CHECK SUM
RC
CALL CHARIN
RC
CPI EOT ;END OF TRANSMISSION
RNZ
MOV A,D
ORA A
JNZ SNDNAK ;CHECK SUM ERROR
CALL SNDAKS
POP H
JMP SENDS
;
; GET ACKNOWLEDGE
; OVERRIDING RETURN WHEN ERROR
;
GETAK0: ;CHECK ACKNOWLEDGE
SUI ACK
RZ
SNDRTY:
POP H ;DISCARD RETURN ADDRESS
GETATS: ;TIME OVER RETRY
LXI H,RTYCNT
DCR M
JNZ SEND ;SEND AGAIN
CHINTO: ;CHARACTER IN TIME OUT
MVI A,SNDERR
CALL ERETRN
JMP SNDMSR
;
GETAKS: ;GET SECOND ACKNOWLEDGE
CALL CHARIW
JC SNDRTY ;TIME OUT
SUI ACKS
RZ ;OK
JMP SNDRTY ;RETRY
;
; RECEIVE MESSAGE FROM NETWORK
; INPUT
; BC:MESSAGE ADDRESS
;
RCVMSG:
MOV H,B
MOV L,C
SHLD MSGADR ;SAVE MESSAGE ADDRESS
RCVMSR:
MVI A,MAXRTY
STA RTYCNT ;INITIALIZE RETRY COUNT
RECALL:
CALL RECEIV
LXI H,RTYCNT ;RETURN FROM RECEIV IS ERROR
DCR M
JNZ RECALL ;RETRY
RCVTOT: ;TIME OUT
MVI A,RCVERR
CALL ERETRN
JMP RCVMSR
;
; RECEIVE BODDY
; RETURN OVERRIDING WHEN OK
; SIMPLE RETURN IS ERROR
;
RECEIV:
LHLD MSGADR ;GET MESSAGE ADDRESS
MVI D,TMORTY
CALL NTRSET ;RESET INPUT BUFFER
RCVFST: ;RECEIVE FIRST CHARACTER LOOP
CALL CHARIN
JNC RCVGFS ;GET FIRST CHARACTER
DCR D ;TIME OVER
JNZ RCVFST ;RETRY
POP H
JMP RCVTOT ;SET TIME OVER ERROR FLAG & RETRY
;
RCVGFS: ;GET FIRST CHARACTER
CPI ENQ
JNZ RECEIV ;NOT ENQUIRE SO RETRY
CALL SNDACK ;RESPONSE TO MASTER
CALL CHARIW
RC ;RETURN TO RECEIVE RETRY
CPI SOH
RNZ ;NOT START OF HEADER
MOV D,A ;START OF HEADER
MVI E,5 ;LENGTH OF HEADER
CALL MSGIN ;GET HEADER BLOCK
CNC NETIN ;GET HCS (HEADER CHECK SUM)
RC ;TIME OVER RETRY
JNZ SNDNAK ;CHECK SUM ERROR
CALL SNDAKS ;SEND RESPONSE
CALL CHARIW ;WAIT DATA TOP
RC
CPI STX
RNZ ;NOT START OF TEXT
MOV D,A ;START OF TEXT
DCX H
MOV E,M ;GET SIZE
INX H
INR E ;MAKE READ COUNT FOR DATA BLOCK
CALL MSGIN ;RECEIVE DATA
RC
CALL CHARIN ;GET END CODE OF DATA BLOCK
RC
CPI ETX
RNZ ;NOT END OF TEXT SO RETRY
ADD D
MOV D,A
CALL NETIN ;GET HEADER CHECK SUM
RC
CALL CHARIN ;GET LAST CODE
RC
CPI EOT
RNZ ;NOT END OF TRANSMIT SO ERROR
MOV A,D
ORA A
JNZ SNDNAK ;CHECK SUM ERROR
POP H ;OK ALL PACKETTE IS RECEIVED
LHLD MSGADR
INX H
LDA CNFTBL+1 ;GET SLAVE ID
SUB M ;CHECK SID
JZ $+5
MVI A,-1 ;SID ERROR
PUSH PSW
CALL SNDAKS ;SEND ACKNOWLEDGE
POP PSW
RET
;
; ROUTINES TO SEND RESPONSE CODES
;
SNDACK: ;SEND ACKNOWLEDGE
MVI C,ACK
JMP CHROUT
;
SNDAKS: ;SEND SECOND ACKNOWLEDGE
MVI C,ACKS
JMP CHROUT
;
SNDNAK: ;SEND NEGATIVE ACKNOWLEDGE
MVI C,NAK
JMP CHROUT
;
; ERROR RETURN
; INPUT
; A:ERROR BIT
; OUTPUT
; A:-1
;
ERETRN:
LXI H,CNFTBL
ORA M ;ON ERROR BIT
MOV M,A
CALL NTRSET ;RESET COMMUNICATION INTERFACE
MVI A,-1 ;ERROR RETUNR CODE
RET
;
; NETWORK ERROR RECOVER ROUTINE RESET COMMUNICATION INTERFACE
;
NTRSET:
MVI A,080H
OUT STATO ;RESET
RET
;
; BOOTING UP ROUTINE
;
NTWKWB:
JMP NTRSET ;RESET INTERFACE
;
; NETWORK OUTPUT DATA
; INPUT
; C:OUTPUT DATA
; D:CHECK SUM
;
NETOUT:
MOV A,D
ADD C
MOV D,A ;MAKE CHECK SUM
CHROUT:
IN STATO
ANI MSKO ;GET OUTPUT READY MODE
JNZ CHROUT ;NOT READY
MOV A,C
OUT DPRTO ;OUT DATA
RET
;
; INPUT FROM NETWORK
; OUTPUT
; A:DATA
; CF:ON TIME OVER OFF GET DATA
;
CHARIW: ;LONG WAIT
MVI B,0
JMP CHARIM
;
CHARIN:
MVI B,10 ;10 MS = 192 CH / 192K BAUD
CHARIM: ;WAIT LOOP
MVI C,5AH ;1 MS WAIT VALUE
CHARIL: ;1 MS WAIT LOOP
IN STATI
ANI MSKI
JZ CHARIG ;READY
DCR C
JNZ CHARIL ;WAIT OF 1 MS
DCR B
JNZ CHARIM ;WAIT
STC ;TIME OVER RETURN
RET
;
CHARIG:
IN DPRTI ;GET DATA
RET
;
; MESSAGE INPUT
; INPUT
; HL:DESTINATION ADDRESS
; E:INPUT COUNT
;
MSGIN:
CALL NETIN
RC ;TIME OUT
MOV M,A ;GET DATA
INX H
DCR E
JNZ MSGIN ;TO NEXT BYTE
RET
;
; NETWORK INPUT
; INPUT
; D:CHECK SUM
; OUTPUT
; A:DATA
;
NETIN:
CALL CHARIN ;RECEIVE BYTE IN BINARY MODE
RC
MOV B,A
ADD D ;MAKE CHECK SUM
MOV D,A
ORA A ;OFF CARRY FLAG
MOV A,B
RET
;
; MESSAGE OUT
; INPUT
; HL:SOURCE ADDRESS
; E:COUNT OF OUTPUT DATA
; C:PREAMBLE CODE
;
MSGOUT:
MVI D,0 ;CLEAR CHECK SUM
CALL NETOUT ;OUT PREAMBLE CODE
MSGOTL: ;OUT LOOP
MOV C,M ;GET CODE
INX H
CALL NETOUT ;OUT DATA
DCR E
JNZ MSGOTL ;TO NEXT DATA
RET
;
; DATA AREA
;
MSGADR: DS 2 ;MESSSAGE ADDRESS BUFFER
DHEADR: DS 5 ;DUMMY HEADER BUFFER
RTYCNT: DB 0 ;RETRY COUNT
;
;
END