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


File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,436 @@
; CP/NET-86 LOADER
;
; 1983.8.31. VER.1.00
;
; EQUATIONS OF DATA
;
LF EQU 0AH ;LINE FEED
CR EQU 0DH ;CARRIAGE RETURN
;
BDOS EQU 224 ;BODS INTERRUPT NUMBER
SCTLNG EQU 128 ;SECTOR LENGTH
;
VBDOS EQU BDOS*4 ;VECTOR OF BDOS INTERRUPT
BSBIOS EQU 250H ;BIAS TO BIOS
MINSIZ EQU 800H ;MINIMUM REQUIRED SPACE
MAXCPM EQU 0C00H ;MAXIMUM CP/M SIZE
;
; 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 OFFSET
CDBIOS EQU 50 ;DIRECT BIOS CALL
CSTDMS EQU 51 ;SET DMA SEGMENT
CGTMXM EQU 53 ;GET MAXIMUM MEMORY
;
;
ORG 100H
;
JMP START
;
;
DB 'COPYRIGHT (C) 1983,'
DB ' XYZ (DIGITAL RESEARCH)'
;
;
START:
MOV AX,CS
MOV SS,AX
MOV SP,OFFSET STACK ;SET STACK
XOR DX,DX
MOV CL,CGETVR
INT BDOS ;GET VERSION NUMBER
MOV CX,OFFSET CARLOD
AND AX,200H
JNZ ERROR ;ALREADY LOADED
CALL GETMRG ;GET LOADING MEMORY REGION
MOV CX,OFFSET CSTUP
CALL BUFPRN ;OUT TABLE TOP
XOR DX,DX
MOV CX,OFFSET CCCP
CALL DSPLIN ;OUT CCP LOCATION
XOR DX,DX
MOV ES,DX
MOV DX,ES:WORD PTR .VBDOS ;GET OFFSET OF BDOS
MOV CL,4
SHR DX,CL ;GET BDOS BIAS
MOV CX,OFFSET CBDOS
CALL DSPLIN ;OUT BDOS LOCATION
MOV DX,BSBIOS ;BIOS TOP
MOV CX,OFFSET CBIOS
CALL DSPLIN ;OUT BIOS LOCATION
MOV DX,LODOFF
MOV CX,OFFSET CCCPN
CALL LOAD ;LOAD CCPN
MOV NDOSOF,DX ;SAVE NDOS TOP
MOV CX,OFFSET CNDOS
CALL LOAD ;LOAD NDOS
MOV CX,OFFSET CSNIOS
CALL LOAD ;LOAD SNIOS
MOV CX,OFFSET CTPA
CALL DSPLIN ;TPA LOCATION
MOV CX,OFFSET CLEND
CALL BUFPRN ;OUT LOADING END COMMENT
MOV AX,NDOSOF
MOV CL,4
SHL AX,CL
ADD AX,3
MOV NDOSEN,AX ;SET NDOS COLD START ENTRY OFFSET
JMPF DWORD PTR NDOSEN ;TO NDOS
;
; ERROR END
; INPUT
; CX:COMMENT POINT
;
ERROR: ;ERROR END
CALL BUFPRN ;OUT ERROR COMMENT
MOV CL,CRESET
INT BDOS ;RETURN TO SYSTEM
;
; GET MEMORY REGION FOR CP/NET SYSTEM
;
GETMRG:
MOV DX,OFFSET WKMCB
MOV CL,CGTMXM
INT BDOS ;GET MAXIMUM MEMORY
MOV CX,OFFSET CNOAVL
OR AL,AL
JNZ ERROR ;NO AVAILABLE MEMORY
MOV CL,CDBIOS
MOV DX,OFFSET WKBIOS
INT BDOS ;GET MEMORY REGION TABLE
INC BX
MOV DX,ES:[BX] ;GET TOP REGION
MOV CX,OFFSET CNOAVL
CMP DX,WKMCB
JNZ ERROR ;NOT TOP NEED TOP REGION FOR CP/NET
MOV AX,WKMCB+2
CMP AX,MINSIZ
JC ERROR ;TOO SMALL
XOR AX,AX
MOV ES,AX ;INTERRUPT VECTOR PAGE
MOV DX,ES:WORD PTR .VBDOS+2 ;GET DOS SEGMENT
MOV DOSSGM,DX ;SAVE SEGMENT
MOV AX,WKMCB ;GET AVAILABLE TOP
SUB AX,DX
ADD AX,15
AND AX,0FFF0H ;TO PAGE BOUNDARY
CMP AX,MAXCPM
JNC ERROR ;CP/M BASIC LENGTH TOO LONG
MOV LODOFF,AX ;SAVE OFFSET
RET
;
; ERROR OF LOADING
;
ERLOAD:
MOV CX,OFFSET CLERR
JMP ERROR
;
; LOAD ONE PROGRAM
; INPUT
; DX:LOADING TOP PARAGRAPH
; CX:FILE NAME POINTER
; OUTPUT
; DX:NEXT PARAGRAPH
;
LOAD:
PUSH DX
PUSH CX
CALL CRLF
POP CX
PUSH CX
CALL BUFPRN ;OUT FILE NAME
MOV AX,DS
MOV ES,AX
POP SI
MOV DI,OFFSET WKFCB
CLD
XOR AX,AX
STOSB ;CLEAR ENTRY TYPE
MOV CX,11
REP MOVSB ;SET FILE NAME TO FCB
MOV CL,21
REP STOSB ;CLEAR LEFT AREA
MOV DX,OFFSET WKFCB
MOV CL,COPEN
INT BDOS ;OPEN FILE
INC AL
JZ ERLOAD ;FILE NOT FOUND
MOV DX,CS
MOV CL,CSTDMS
INT BDOS ;SET DMA SEGMENT
MOV DX,OFFSET RDWORK
MOV CL,CSTDMA
INT BDOS ;SET DMA OFFSET TO READ WORK
CALL READ ;READ ONE SECTOR
MOV BX,OFFSET RDWORK+1
MOV DX,[BX] ;GET CODE LENGTH
MOV AX,3[BX] ;GET DATA LENGTH
ADD AX,DX ;GET TOTAL LENGTH
MOV CODLNG,DX ;SAVE CODE LENGTH
MOV CL,4
ADD AX,15
SHR AX,CL ;GET BY PARAHRAPH
POP BX ;GET CURRENT TOP
MOV TOPPGH,BX ;SAVE TOP
ADD AX,BX
ADD AX,15
AND AX,0FFF0H ;GET NEXT PAGE TOP
MOV NXTPGH,AX ;SAVE NEXT PARAGRAPH
MOV CL,4
SHL BX,CL
MOV LODTOP,BX
ADD DX,127
MOV CL,7
SHR DX,CL ;GET SECTOR COUNT
MOV DI,BX ;SET DESTINATION POINTER
PUSH DX
PUSH DI
CALL READ ;DUMMY PASS READ
POP DI
POP DX
LOADLP: ;ONE SECTOR LOAD LOOP
PUSH DX
PUSH DI
CALL READ ;REDA ONE SECTOR
POP DI
MOV SI,OFFSET RDWORK
MOV ES,DOSSGM ;DESTINATION SEGMENT
MOV CX,SCTLNG
CLD
REP MOVSB ;TO DESTINATION AREA
POP DX
DEC DX
JNZ LOADLP ;TO NEXT SECTOR
MOV DX,CODLNG ;GET CODE LENGTH
MOV AX,DX
AND AX,7FH ;GET OFFSET IN SECTOR
MOV SI,OFFSET RDWORK
ADD SI,AX ;GET DATA POINT
MOV BX,LODTOP ;LOADED DATA TOP
MOV CL,3
SHL AX,CL
MOV CX,AX ;GET RELOCATION COUNT
MOV AH,BH ;GET RELOCATION BIAS
LOADRL: ;RELOCATION LOOP
TEST CL,7
JNZ LOADRB ;NOT BYTE BOUNDARY
TEST CX,3FFH
JNZ LOADRS ;NOT SECTOR BOUNDARY
PUSH AX ;TO NEXT SECTOR
PUSH BX
PUSH DX
PUSH ES
CALL READ ;READ TO WORK
POP ES
POP DX
POP BX
POP AX
XOR CX,CX ;CLEAR COUNT
MOV SI,OFFSET RDWORK ;WORK TOP
CLD
LOADRS:
LODSB ;GET ONE BYTE RELOCATION DATA
LOADRB:
INC CX
ROL AL,1
JNC LOADRA ;ABSOLUTE
ADD ES:[BX],AH ;RELOCATE
LOADRA:
INC BX ;POINTER TO NEXT
DEC DX ;DOWN LENGTH COUNT
JNZ LOADRL ;TO NEXT DATA
MOV AX,TOPPGH
PUSH AX
MOV CL,4
SHL AX,CL ;GET OFFSET
MOV CX,AX
CALL LOCPRS ;OUT OFFSET
POP CX
ADD CX,DOSSGM
CALL LOCPR ;OUT TOP
MOV DX,NXTPGH ;GET NEXT PARAGRAPH
LOADEN:
RET
;
; READ ONE SECTOR
;
READ:
MOV DX,OFFSET WKFCB
MOV CL,CREAD
INT BDOS ;READ ONE SECTOR
OR AL,AL
JZ LOADEN ;OK
JMP ERLOAD ;NO DATA OR SO
;
; DISPLAY LINE
; INPUT
; DX:PARAGRAPH OFFSET OF TOP
; CX:NAME COMMENT POINTER
;
DSPLIN:
PUSH DX
PUSH CX
CALL CRLF
POP CX
CALL BUFPRN ;OUT NAME
POP AX
PUSH AX
MOV CL,4
SHL AX,CL
MOV CX,AX
CALL LOCPRS ;OUT OFFSET
POP CX
ADD CX,DOSSGM
JMPS LOCPR ;OUT LOCATION
;
; OUT LOCATION
; INPUT
; CX:OFFSET
;
LOCPRS:
CALL LOCPRD ;OUT NUMBER PART
MOV CL,'H'
JMP CONOUT
;
; OUT LOCATION
; INPUT
; CX:PARAGRAPH DATA
;
LOCPR:
CALL LOCPRD ;OUT NUMBER PART
MOV CL,'0'
CALL CONOUT
MOV CL,'H'
JMP CONOUT
;
; OUT HEXADECIMAL WORD DATA
; INPUT
; CX:DATA
;
LOCPRD:
PUSH CX
MOV CL,' '
CALL CONOUT
MOV CL,' '
CALL CONOUT
POP CX
PUSH CX
MOV CL,CH
CALL HXPRN ;PRINT HIGHER
POP CX ;TO PRINT LOSER
;
; PRINT BY HEXADECIMAL
; INPUT
; CL:DATA
;
HXPRN:
PUSH CX
SHR CL,1
SHR CL,1
SHR CL,1
SHR CL,1
CALL HXPRH ;PRINT HIGHER NIBBLE
POP CX
HXPRH:
AND CL,0FH
ADD CL,'0'
CMP CL,'9'+1
JC CONOUT ;0 TO 9
ADD CL,7
JMPS CONOUT ;A TO F
;
; CONSOLE OUT
; INPUT
; CL:CODE
;
CONOUT:
PUSH AX
MOV DL,CL
MOV CL,CCONOT
INT BDOS
POP AX
RET
;
; PRINT BUFFERED STRING
; INPUT
; CX:STRING POINTER
;
BUFPRN:
MOV DX,CX
MOV CL,CBUFPR
INT BDOS
RET
;
; CARRIAGE RETURN & LINE FEED
;
CRLF:
MOV CL,CR
CALL CONOUT
MOV CL,LF
JMPS CONOUT
;
DAREA EQU $
;
DSEG
ORG OFFSET DAREA
;
; COMENTS
;
CARLOD DB CR,LF,'CP/NET-86 IS ALREADY LOADED.$'
CSTUP DB CR,LF,LF,'CP/NET-86 VER.1.00 LOADER'
DB CR,LF,'==========================$'
CNOAVL DB CR,LF,'NO AVAILABLE MEMORY FOR CP/NET-86$'
CLERR DB ' LOADING ERROR OF THIS FILE$'
CLEND DB CR,LF,'CP/NET-86 LOADING COMPLETE.',CR,LF,'$'
;
CCCP DB 'CCP $'
CBDOS DB 'BDOS $'
CBIOS DB 'BIOS $'
CCCPN DB 'CCPN SYS$'
CNDOS DB 'NDOS SYS$'
CSNIOS DB 'SNIOS SYS$'
CTPA DB 'TPA $'
;
; WORK AREA
;
; MEMORY CONTROL BLOCK
;
WKMCB DW 0 ;BASE
DW 0FFF0H ;LENGTH
DB 0 ;EXTENT
;
; DIRECT BIOS CALL WORK
;
WKBIOS DB 18 ;GET MEMORY REGION TABLE
DW 0 ;INPUT PARAMETER NOT USED
DW 0
;
LODOFF RW 1 ;LOAD OFFSET BY PARAGRAPH
NDOSOF RW 1 ;NDOS OFFSET BY PARAGRAPH
;
NDOSEN RW 1 ;NDOS ENTRY
DOSSGM RW 1 ;DOS SEGMENT
;
; LOADER WORK
;
WKFCB RB 33 ;FCB
RDWORK RB 128 ;WORKING FOR ONE SECTOR READ
CODLNG RW 1 ;CODE AREA LENGTH
TOPPGH RW 1 ;TOP PARAGRAPH
NXTPGH RW 1 ;NEXT PARAGRAPH
LODTOP RW 1 ;LOADING TOP
;
;
RS 64
STACK:
DB 0
;
;
END


View File

@@ -0,0 +1,450 @@
; C P N E T S T S - FOR CP/NET-86
;--------------------------------------------
; CP/NET NETWORK STATUS DISPLAY PROGRAM
;
TITLE 'NETWORK STATUS DISPLAY FOR CP/NET-86'
;
; AUG-31-1983 BASE
;
; EQUATION OF FIXED ADDRESS
;
BDOS EQU 224 ;BDOS ENTRY POINT
;
; EQUATION OF BDOS FUNCTION CODE
;
FGETV EQU 12 ;GET VERSION NUMBER
FGETNS EQU 68 ;GET NETWORK STATUS
FGETCT EQU 69 ;GET CONFIGURATION TABLE ADDRESS
;
; EQUATION OF OTHER DATA
;
M EQU BYTE PTR 0[BX]
LF EQU 0AH ;LINE FEED CODE
CR EQU 0DH ;CARRIAGE RETURN CODE
ETX EQU '$' ;TERMINATION CHARACTER
;
; PROGRAM START
;
ORG 100H
;
JMP START
L_1 EQU $
DSEG
ORG OFFSET L_1
;
; DISPLAY MESSAGE AREA
;
MSG1 RS 0
DB CR,LF,'CP/NET-86 1.0 Status'
DB CR,LF,'===================='
DB CR,LF,ETX
MSG2 RS 0
DB 'Requester ID = '
DB ETX
MSG3 RS 0
DB CR,LF,'Network Status Byte = '
DB ETX
MSG4 RS 0
DB CR,LF,'Disk device status:'
DB CR,LF,ETX
MSG5 RS 0
DB ' Drive '
DB ETX
MSG6 RS 0
DB ' = Drive '
DB ETX
MSG7 RS 0
DB ' on Network Server ID = '
DB ETX
MSG8 RS 0
DB ' = LOCAL'
DB ETX
MSG9 RS 0
DB 'Console Device = '
DB ETX
MSG10 RS 0
DB 'Console #'
DB ETX
MSG11 RS 0
DB ' on Network Server ID = '
DB ETX
MSG12 RS 0
DB 'LOCAL'
DB ETX
MSG13 RS 0
DB 'List Device = '
DB ETX
MSG14 RS 0
DB 'List #'
DB ETX
MSG15 RS 0
DB ' on Network Server ID = '
DB ETX
MSG16 RS 0
DB 'LOCAL'
DB ETX
MSG17 RS 0
DB CR,LF,'CP/NET-86 has not been loaded.'
DB ETX
L_2 EQU $
CSEG
ORG OFFSET L_2
;
; START OF PROGRAM
;
START:
MOV BX,0
LAHF
ADD BX,SP
RCR SI,1
SAHF
RCL SI,1
MOV Word Ptr OLDSP,BX ;SAVE SYSTEM STACK
MOV SP,(OFFSET NEWSP)
CALL GETVER ;GET CP/M VERSION NUBMER
MOV DX,0200H
CALL ANDHD
MOV AL,0
CALL SUBHD
OR AL,BL ;CHECK CP/NET LOADED
JNZ L_3
JMP NOTNET ;CP/NET UNLOADED
L_3:
MOV CX,(OFFSET MSG1) ;TITLE DISPLAY
CALL MSGOUT
CALL GETCTA ;GET CONFIGURATION TABLE ADDRESS
MOV WORD PTR CTBADR,BX ;SAVE TABLE ADDRESS
MOV CX,(OFFSET MSG2) ;'REQUESTER ID = '
CALL MSGOUT
MOV BX,WORD PTR CTBADR ;GET CONFIG TABLE ADDRESS
LAHF
INC BX
SAHF
MOV CL,ES:M ;GET REQUESTER ID CODE
CALL DSPBCD ;DISPLAY ID NUMBER
MOV CX,(OFFSET MSG3) ;'NETWORK STATUS BYTE = '
CALL MSGOUT
CALL GETNST ;GET NETWORK STATUS
MOV CL,AL
CALL DSPBCD ;DISPLAY NETWORK STATUS BYTE
MOV CX,(OFFSET MSG4) ;'DISK DEVICE STATUS: '
CALL MSGOUT
MOV BX,(OFFSET DEVCNT)
MOV M,0
;
DRVDSP:
MOV AL,15
MOV BX,(OFFSET DEVCNT) ;SET DEVICE COUNT
CMP AL,M
JNB L_4
JMP CONDSP ;CONSOLE DEVICE DISPLAY
L_4:
MOV CX,(OFFSET MSG5) ;'DRIVE '
CALL MSGOUT
MOV AL,BYTE PTR DEVCNT ;GET DEVICE COUNT
ADD AL,'A' ;ADJUST TO A-P
MOV CL,AL
CALL CONOUT ;DISPLAY DRIVE NUMBER
MOV CL,':'
CALL CONOUT ;DISPLAY ':'
MOV BX,WORD PTR DEVCNT
MOV BH,0
MOV CX,2
SHL BX,1
ADD BX,CX
XCHG BX,DX
MOV BX,WORD PTR CTBADR ;GET CONFIG TABLE ADDRESS
ADD BX,DX
MOV BL,ES:M
MOV AL,BL
MOV BYTE PTR WCDFLG,AL
AND AL,80H
CMP AL,0
JZ DLOCAL ;DISPLAY 'LOCAL'
MOV CX,(OFFSET MSG6) ;' = DRIVE '
CALL MSGOUT
MOV AL,BYTE PTR WCDFLG
AND AL,0FH
ADD AL,'A'
MOV CL,AL
CALL CONOUT ;DISPLAY DRIVE NUMBER
MOV CL,':'
CALL CONOUT ;DISPLAY ':'
MOV CX,(OFFSET MSG7) ;' ON NETWORK SERVER ID = '
CALL MSGOUT
MOV BX,WORD PTR DEVCNT
MOV BH,0
MOV CX,2
SHL BX,1
LAHF
ADD BX,CX
SAHF
XCHG BX,DX
MOV BX,WORD PTR CTBADR ;GET CONFIG TABLE ADDRESS
LAHF
ADD BX,DX
RCR SI,1
SAHF
RCL SI,1
LAHF
INC BX
SAHF
MOV AL,ES:M
MOV CL,AL
CALL DSPBCD
JMPS DSKEND
;
; DISPLAY 'LOCAL' FOR DISK DRIVE
;
DLOCAL:
MOV CX,(OFFSET MSG8) ;' = LOCAL'
CALL MSGOUT
DSKEND:
CALL CRLF ;CR,LF
MOV BX,(OFFSET DEVCNT)
INC M
JZ L_5
JMP DRVDSP
L_5:
;
CONDSP:
MOV CX,(OFFSET MSG9) ;'CONSOLE DEVICE = '
CALL MSGOUT
MOV CX,34
MOV BX,WORD PTR CTBADR ;GET CONFIG TABLE ADDRESS
ADD BX,CX
MOV BL,ES:M ;GET CONSOLE DEVICE CONDITION FLAG
MOV AL,BL
MOV BYTE PTR WCDFLG,AL ;STORE CONDITION BYTE
AND AL,80H ;MSB CHECK
CMP AL,0
JZ CLOCAL ;DISPLAY 'LOCAL'
MOV CX,(OFFSET MSG10) ;'CONSOLE #'
CALL MSGOUT
MOV AL,BYTE PTR WCDFLG ;GET CONDITION BYTE
AND AL,0FH ;CLEAR UPPER NIBBLE
MOV CL,AL
CALL HEXDSP
MOV CX,(OFFSET MSG11) ;'ON NETWORK SERVER ID = '
CALL MSGOUT
MOV CX,34
MOV BX,WORD PTR CTBADR ;GET COFING TABLE ADDRESS
LAHF
ADD BX,CX
RCR SI,1
SAHF
RCL SI,1
LAHF
INC BX
SAHF
MOV AL,ES:M ;GET CONSOLE DEVICE (SERVER ID)
MOV CL,AL
CALL DSPBCD
JMPS LSTDSP ;LIST DEVICE DISPLAY
;
CLOCAL:
MOV CX,(OFFSET MSG12) ;'LOCAL'
CALL MSGOUT
;
LSTDSP:
CALL CRLF
MOV CX,(OFFSET MSG13) ;'LIST DEVICE = '
CALL MSGOUT
MOV CX,36
MOV BX,WORD PTR CTBADR ;GET COFIG TABLE ADDRESS
ADD BX,CX
MOV BL,ES:M ;GET LIST DEVICE CONDITION FLAG
MOV AL,BL
MOV BYTE PTR WCDFLG,AL
AND AL,80H ;MSB CHECK
CMP AL,0
JZ LLOCAL ;DISPLAY 'LOCAL'
MOV CX,(OFFSET MSG14) ;'LIST # '
CALL MSGOUT
MOV AL,BYTE PTR WCDFLG
AND AL,0FH
MOV CL,AL
CALL HEXDSP
MOV CX,(OFFSET MSG15) ;' ON NETWORK SERVER ID = '
CALL MSGOUT
MOV CX,36
MOV BX,WORD PTR CTBADR ;GET CONFIG TABLE ADDRESS
LAHF
ADD BX,CX
RCR SI,1
SAHF
RCL SI,1
LAHF
INC BX
SAHF
MOV AL,ES:M ;GET LIST DEVICE
MOV CL,AL
CALL DSPBCD ;DISPLAY LIST DEVICE NUMBER (SERVER ID)
JMPS ENDSTS
;
LLOCAL:
MOV CX,(OFFSET MSG16) ;'LOCAL'
CALL MSGOUT
JMPS ENDSTS
;
; PROGRAM ABORT FOR CP/NET UNLOADED
;
NOTNET:
MOV CX,(OFFSET MSG17) ;'CP/NET 1.2 HAS NOT BEEN LOADED.'
CALL MSGOUT
;
; RETURN TO SYSTEM
;
ENDSTS: ;END OF CPNETSTS
CALL RETSYS ;RETURN TO SYSTEM
STI
HLT ;ERROR STOP
;
; SET SYSTEM STACK
;
RETSYS:
MOV BX,WORD PTR OLDSP ;GET SYSTEM STACK
MOV SP,BX
IRET ;RETURN TO SYSTEM
;
; CONSOLE OUT
;
CONOUT:
MOV DL,CL
MOV CL,2
INT BDOS
RET
;
; MESSAGE STRING OUT
; INPUT
; BC:TEXT ADDRESS
;
MSGOUT:
MOV DH,CH ;SET MESSAGE TEXT ADDRESS
MOV DL,CL
MOV CL,9
INT BDOS
RET
;
; GET CP/M VERSION NUMBER
; OUTPUT
; H:CP/M OR MP/M
; L:VERSION NUMBER
;
GETVER:
MOV DX,0
MOV CL,FGETV
INT BDOS
RET
;
; GET NETWORK STATUS
; OUTPUT
; A:NET WORK STATUS BYTE
;
GETNST:
MOV DX,0
MOV CL,FGETNS
INT BDOS
RET
;
; GET REQUESTER CONFIGURATION TABLE ADDRESS
; OUTPUT
; HL:TABLE ADDRESS
;
GETCTA:
MOV DX,0
MOV CL,FGETCT
INT BDOS
RET
;
; PUT CR,LF TO CONSOLE
;
CRLF:
MOV CL,CR ;SET CR CODE
CALL CONOUT
MOV CL,LF ;SET LF CODE
CALL CONOUT
RET
;
; DISPLAY HEXA DECIMAL
;
HEXDSP:
MOV BX,(OFFSET WHEXVA)
MOV M,CL
MOV AL,9
MOV BX,(OFFSET WHEXVA)
CMP AL,M
JNB HEXOVR
MOV AL,BYTE PTR WHEXVA
ADD AL,'A' ;ADJUST TO ASCII CODE
SUB AL,10
MOV CL,AL
CALL CONOUT
RET
;
HEXOVR:
MOV AL,BYTE PTR WHEXVA
ADD AL,'0' ;ADJUST TO ASCII CODE
MOV CL,AL
CALL CONOUT
RET
;
; DISPLAY BCD VALUE
;
DSPBCD:
MOV BX,(OFFSET WACONV)
MOV M,CL
MOV AL,BYTE PTR WACONV
AND AL,0F8H
RCR AL,1
RCR AL,1
RCR AL,1
RCR AL,1
MOV CL,AL
CALL HEXDSP
MOV AL,BYTE PTR WACONV
AND AL,00FH
MOV CL,AL
CALL HEXDSP
MOV CL,48H
CALL CONOUT
RET
;
ANDHD:
MOV AL,DL
AND AL,BL
MOV BL,AL
MOV AL,DH
AND AL,BH
MOV BH,AL
RET
;
SUBHD:
MOV DL,AL
MOV DH,0
MOV AL,DL
SUB AL,BL
MOV BL,AL
MOV AL,DH
SBB AL,BH
MOV BH,AL
RET
L_6 EQU $
DSEG
ORG OFFSET L_6
;
; WORKING STRAGE AREA
;
RS 40 ;LOCAL STACK AREA
NEWSP RS 0 ;LOCAL STACK POINT
OLDSP RS 2 ;SYSTEM STACK SAVE
OUTCHR RS 1 ;OUTPUT CHARACTER
WHEXVA RS 1 ;WORK FOR HEX CONVERT
WACONV RS 1 ;FOR ASCII CONVERT
DEVCNT RS 1 ;DEVICE COUNTER
WCDFLG RS 1 ;CONDITION BYTE SAVE AREA
CTBADR RS 2 ;COFIGURATION TABLE ADDRESS SAVE AREA
;
END


View File

@@ -0,0 +1,179 @@
TITLE 'LOGIN TRANSIENT PROGRAM FOR CP/NET-86'
;***************************************************************
;***************************************************************
;** **
;** L O G I N T R A N S I E N T P R O G R A M **
;** F O R C P / N E T - 8 6 **
;** **
;***************************************************************
;***************************************************************
;
; EQUATION OF FIXED DATA
;
M EQU BYTE PTR 0[BX]
;
BDOS EQU 224 ;BDOS ENTRY POINT
BUFF EQU 0080H
;
; EQUATION OF BDOS FUNCTION CODE
;
PRINT EQU 9
VERSION EQU 12
LOGIN EQU 64
CFGTBL EQU 69
ACTIVE EQU 00010000B
;
;
CSEG
ORG 100H
;
START:
MOV BX,0
ADD BX,SP
MOV SP,(OFFSET CCPSTACK)+2
PUSH BX ; SAVE CCP STACK POINTER
MOV CL,VERSION
INT BDOS ; GET VERSION NUMBER
MOV AL,BH
AND AL,00000010B
JNZ L_1
JMP VERSIONERR ; JUMP IF CP/NET NOT LOADED
L_1:
MOV DX,(OFFSET PASSWORDMSG)
MOV BX,BUFF
MOV AL,M ; GET # CHARS IN THE COMMAND TAIL
OR AL,AL
JNZ L_2
JMP DOLOGIN ; DEFAULT LOGIN IF EMPTY COMMAND TAIL
L_2:
PUSH DX ; SAVE LOGIN MSG ADDRESS
MOV CL,AL ; A = # CHARS IN COMMAND TAIL
XOR AL,AL
MOV CH,AL ; B WILL ACCUMULATE MASTER ID
SCANBLNKS:
INC BX
MOV AL,M
CMP AL,' '
JNZ PASTBLNKS ; SKIP PAST LEADING BLANKS
DEC CL
JNZ SCANBLNKS
JMPS PRELOGIN ; JUMP IF COMMAND TAIL EXHAUSTED
;
PASTBLNKS:
CMP AL,'['
JZ SCANMSTRID
POP DX ; DISCARD OLD LOGIN MSG ADR
MOV DX,(OFFSET BLANKMSG)
PUSH DX ; PUSH NEW LOGIN MSG ADR
SCANLFTBRKT:
MOV AL,M
CMP AL,'['
JZ SCANMSTRID
LAHF
INC DX
SAHF
MOV SI,DX ;UPDATE THE PASSWORD
MOV [SI],AL
LAHF
INC BX
SAHF
DEC CL
JNZ SCANLFTBRKT
JMPS PRELOGIN
;
SCANMSTRID:
LAHF
INC BX
SAHF
DEC CL
JZ LOGINERR
MOV AL,M
CMP AL,']'
JZ PRELOGIN
SUB AL,'0'
CMP AL,10
JB UPDATEID
ADD AL,('0'-'A'+10) AND 0FFH
CMP AL,16
JNB LOGINERR
UPDATEID:
LAHF
XCHG AL,AH
PUSH AX
MOV AL,CH
ADD AL,AL
ADD AL,AL
ADD AL,AL
ADD AL,AL
MOV CH,AL ; ACCUM * 16
POP AX
XCHG AL,AH
ADD AL,CH
MOV CH,AL
JMPS SCANMSTRID
PRELOGIN:
MOV AL,CH
POP DX
MOV SI,DX
MOV [SI],AL
DOLOGIN:
MOV CL,LOGIN
INT BDOS
INC AL
JNZ LOGINOK
MOV DX,(OFFSET LOGINFAILEDMSG)
JMPS PRINTMSG
;
VERSIONERR:
MOV DX,(OFFSET VERSIONERRMSG)
JMPS PRINTMSG
;
LOGINERR:
MOV DX,(OFFSET LOGINERRMSG)
PRINTMSG:
MOV CL,PRINT
INT BDOS
JMPS EXIT
;
LOGINOK:
MOV CL,CFGTBL
INT BDOS ; GET CONFIGURATION TABLE ADDRESS
MOV AL,ES:M
OR AL,ACTIVE ; SET ACTIVE BIT TRUE
MOV ES:M,AL
EXIT:
POP BX
MOV SP,BX ; RESTORE CCP STACK POINTER
IRET
;
;
;
L_3 EQU $
DSEG
ORG OFFSET L_3
;
; LOCAL DATA SEGMENT
;
PASSWORDMSG RS 0
DB 00H ; MASTER ID #
DB 'PASSWORD' ; PASSWORD
VERSIONERRMSG RS 0
DB 'CP/NET-86 is not loaded.'
DB '$'
LOGINERRMSG RS 0
DB 'Illegal LOGIN Command.'
DB '$'
LOGINFAILEDMSG RS 0
DB 'LOGIN Failed.'
DB '$'
LCLSTACK RS 0
DW 0C7C7H,0C7C7H,0C7C7H,0C7C7H,0C7C7H
DW 0C7C7H,0C7C7H,0C7C7H,0C7C7H,0C7C7H
CCPSTACK RS 0
DW (OFFSET $)-(OFFSET $)
BLANKMSG RS 0
DB 00H ; MASTER ID #
DB ' ' ; PASSWORD
END


View File

@@ -0,0 +1,131 @@
TITLE 'LOGOFF TRANSIENT PROGRAM FOR CP/NET-86'
;***************************************************************
;***************************************************************
;** **
;** L O G O F F T R A N S I E N T P R O G R A M **
;** F O R C P / N E T - 8 6
;** **
;***************************************************************
;***************************************************************
;
; EQUATES
;
M EQU BYTE PTR 0[BX]
;
BDOS EQU 224
BUFF EQU 0080H
PRINT EQU 9
VERSION EQU 12
LOGOFF EQU 65
CFGTBL EQU 69
NOACTV EQU 11101111B
;
START:
MOV BX,0
ADD BX,SP
MOV SP,(Offset CCPSTACK)+2
PUSH BX ; SAVE CCP STACK POINTER
MOV CL,VERSION
INT BDOS ; GET VERSION NUMBER
MOV AL,BH
AND AL,00000010B
JNZ L_1
JMP VERSIONERR ; CP/NET MUST BE LOADED
L_1:
MOV DL,0 ; DEFAULT MSTR ID = 00H
MOV BX,BUFF
MOV AL,M ; GET # CHARS IN THE COMMAND TAIL
OR AL,AL
JZ DOLOGOFF ; DEFAULT LOGOFF IF EMPTY COMMAND TAIL
MOV CL,AL ; A = # CHARS IN COMMAND TAIL
XOR AL,AL
SCANBLNKS:
INC BX
MOV AL,M
CMP AL,' '
JNZ PASTBLNKS ; SKIP LEADING BLANKS
DEC CL
JNZ SCANBLNKS
JMPS DOLOGOFF
PASTBLNKS:
CMP AL,'['
JNZ LOGOFFERR
SCANMSTRID:
LAHF
INC BX
SAHF
DEC CL
JZ LOGOFFERR
MOV AL,M
CMP AL,']'
JZ DOLOGOFF
SUB AL,'0'
CMP AL,10
JB UPDATEID
ADD AL,('0'-'A'+10) AND 0FFH
CMP AL,16
JNB LOGOFFERR
UPDATEID:
LAHF
XCHG AL,AH
PUSH AX
MOV AL,DL
ADD AL,AL
ADD AL,AL
ADD AL,AL
ADD AL,AL
MOV DL,AL ; ACCUM * 16
POP AX
XCHG AL,AH
ADD AL,DL
MOV DL,AL
JMPS SCANMSTRID
DOLOGOFF:
MOV CL,LOGOFF
INT BDOS
INC AL
JNZ LOGOFFOK
MOV DX,(Offset LOGOFFAILEDMSG)
JMPS PRINTMSG
VERSIONERR:
MOV DX,(Offset VERSIONERRMSG)
JMPS PRINTMSG
LOGOFFERR:
MOV DX,(Offset LOGOFFERRMSG)
PRINTMSG:
MOV CL,PRINT
INT BDOS
JMPS EXIT
LOGOFFOK:
MOV CL,CFGTBL
INT BDOS ; GET CONFIG TABLE ADDRESS
MOV AL,ES:M
AND AL,NOACTV ; TURN OFF ACTIVE BIT
MOV ES:M,AL
EXIT:
POP BX
MOV SP,BX ; RESTORE CCP STACK POINTER
RET
L_2 EQU $
DSEG
ORG Offset L_2
;
; LOCAL DATA SEGMENT
;
VERSIONERRMSG RS 0
DB 'CP/NET-86 is not loaded.'
DB '$'
LOGOFFERRMSG RS 0
DB 'Illegal LOGOFF Command.'
DB '$'
LOGOFFAILEDMSG RS 0
DB 'LOGOFF Failed.'
DB '$'
LCLSTACK RS 0
DW 0C7C7H,0C7C7H,0C7C7H,0C7C7H,0C7C7H
DW 0C7C7H,0C7C7H,0C7C7H,0C7C7H,0C7C7H
CCPSTACK RS 0
DW (Offset $)-(Offset $)
;
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 @@
Here is the source for CP/NET-86. This is a disassembly, but is well commented.

View File

@@ -0,0 +1,598 @@
; SLAVE NETWORK INPUT OUTPUT SYSTEM FOR CP/NET-86
;
; 1983.9.4. VER.1.00
;
BASE EQU 0 ;FOR RELOCATION
;
;
TITLE 'SLAVE NETWORK INPUT OUTPUT SYSTEM FOR CP/NET-86'
;
; 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 224 ;BDOS INTTERUPT
;
COMPRT EQU 0D0H ;COMMUNICATION PORT
STATI EQU COMPRT ;INPUT STATUS
DPRTI EQU COMPRT+2 ;DATA PORT
MSKI EQU 01H ;INPUT READY BIT
;
STATO EQU COMPRT ;OUTPUT STATUS
DPRTO EQU COMPRT+2 ;DATA PORT
MSKO EQU 80H ;OUTPUT READY BIT
;
;
CSEG
ORG BASE
;
; 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
JMP NTWKEN ;RETURN END ADDRESS
;
;
PTABLE EQU $
DSEG
ORG OFFSET PTABLE
;
; 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 85H,0 ;J: F: OF MASTER 0
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
;
CNFTBS DB 0 ;FMT MESSAGE BUFFER FOR LISTER
DB 0 ;DID
DB 0 ;SID
DB 5 ;FNC LIST OUT
DB 0 ;SIZ
RS 1 ;MESSAGE 0 LISTER NUMBER
RS 35 ;MESSAGE 1 - 128 OUTPUT DATA
;
; COMMENT DESTROYED BY LIST OUT TO NETWORK
;
CSTUP DB 'SNIOS OF CP/NET-86 VER.1.00 SLAVE ID = '
CSTIDN DB '00',CR,LF,'$'
;
;
MAINP EQU $
CSEG
ORG OFFSET MAINP
;
; SET SLAVE ID NUMBER
;
SETIDN:
MOV BX,OFFSET CSTIDN
MOV AL,CNFTBL+1 ;GET SLAVE ID
MOV CL,AL
ROR AL,1
ROR AL,1
ROR AL,1
ROR AL,1
CALL SETIDS ;SET UPER NIBBLE
MOV AL,CL
SETIDS:
AND AL,0FH
ADD AL,'0'
CMP AL,'0'+10
JC $+4 ;0 TO 9
ADD AL,7 ;A TO F
MOV [BX],AL
INC BX
RET
;
; INITIAL COMMENT OUT ROUTINE
;
INITCM:
CALL SETIDN ;SET ID NUMBER
MOV DX,OFFSET CSTUP
MOV CL,CBUFPR
INT BDOS ;OUT COMMENT
XOR AL,AL
MOV FINIT,AL
RET ;ZERO IS SUCCESS END
;
; INITIALIZE NETWROK
; OUTPUT
; AL:0 OK
;
NTWKIN:
MOV AL,CNFTBL+1 ;GET SLAVE PROCESSOR ID
MOV CNFTBS+2,AL ;SAVE SID FOR LISTER
CALL NTRSET ;RESET COMMUNICATION INTERFACE
MOV AL,FINIT
OR AL,AL
JNZ INITCM ;OUT INITIAL COMMENT
RET ;INITIALIZED
;
; OUTPUT STATUS OF NETWORK
; OUTPUT
; AL:STATUS
;
NTWKST:
MOV AL,CNFTBL ;GET NETWORK STATUS
MOV AH,AL
AND AH,NOT (RCVERR+SNDERR)
MOV CNFTBL,AH ;OFF ERROR BITS
RET
;
; RETURN CONFIGRATION TABLE ADDRESS
; OUTPUT
; BX:CONFIGRATION TABLE POINT
;
CNTBAD:
MOV BX,OFFSET CNFTBL
RET
;
; SEND MESSAGE ON NETWORK
; INPUT
; CX:MESSAGE ADDRESS DS:SEGMENT
;
SNDMSG:
MOV AX,DS
MOV BP,CS
MOV DS,BP ;SET DSEG TO NORMAL
MOV MSGSEG,AX ;SAVCE SEGMENT
MOV MSGADR,CX ;SAVE MESSAGE ADDRESS
SNDMSR: ;RETRY LOOP
MOV AL,MAXRTY
MOV RTYCNT,AL ;INITIALIE RETRY COUNT
SEND:
CALL NTRSET ;RESET BUFFER
SENDS:
MOV ES,MSGSEG
MOV DI,MSGADR ;GET MESSAGE TOP
MOV DH,TMORTY ;TIME OUT RETRY COUNT
SENDWT: ;ENQUIRE RESPONSE WAIT LOOP
MOV DL,ENQ
CALL CHROUT ;SEND ENQUIRE TO MASTER
CALL CHARIN ;WAIT RESPONSE
JNC SENDGT ;GET RESPONSE
DEC DH ;TIME OVER
JNZ SENDWT ;SEND ENQUIRE ONCE MORE
JMP CHINTO ;TIME OVER FOR LINK
;
SENDGT: ;GET RESPONSE
CMP AL,ENQ ;CHECK SEND - SEND MODE
JZ SNDRCV ;CRASH SEND SO TO PASS RECEIVE MODE
CALL GETAK0 ;GET RESPONSE OF ENQ
MOV DL,SOH
MOV CX,5 ;HEADER LENGTH COUNT
CALL MSGOUT ;SEND SOH,FMT,DID,SID,FNC,SIZ
XOR AL,AL
SUB AL,DH
MOV DL,AL
CALL NETOUT ;SEND HCS (HEADER CHECK SUM)
CALL CHARIW ;GET RESPONSE
JC SENDOV ;TIME OVER
CMP AL,ACK
JNZ SENDGA ;NORMAL MODE
CALL CHARIW ;MAYBE BUFFER LEFT ACK, SO IGNORE
JC SENDOV ;TIME OVER
SENDGA:
SUB AL,ACKS
JNZ SENDOV ;MISS MATCH OF RESPONSE
DEC DI
MOV CL,ES:[DI] ;GET LENGTH
INC DI
MOV CH,0
INC CX
MOV DL,STX
CALL MSGOUT ;SEND STX,DB0,DB1,....
MOV DL,ETX
CALL NETOUT ;SEND ETX
XOR AL,AL
SUB AL,DH
MOV DL,AL
CALL NETOUT ;SEND DATA CHECK SUM
MOV DL,EOT
CALL CHROUT ;SEND END OF TRNASMISSION
CALL GETAKS ;** NEED CALL ******* FOR ERROR RETRY
RET
;
SENDOV: ;TIME OVER OR SO
JMP GETATS
;
; PASS RECEIVE FOR SEND & SEND MODE
;
SNDRCV:
CALL NTRSET ;CLEAR CURRENT BUFFER
MOV DH,TMORTY
SNDRCW: ;WAIT FOR ANOTHER ENQ
CALL CHARIN
JNB SNDRCG ;GET DATA
DEC DH ;TIME OVER
JNZ SNDRCW ;WAIT
SNDRCS:
JMP SEND ;MAYBE MISS LINK, SO TO SEND
;
SNDRCG: ;GET DATA
CMP AL,ENQ
JNZ SNDRCS ;MAYBE MISS LINK
CALL SNDACK ;SEND ACKNOWLEDGE
CALL CHARIW
JC SNDRCV ;NO RESPONSE, SO RETRY
CMP AL,SOH
JNZ SNDRCV
MOV DI,OFFSET DHEADR ;DUMMY HEADER BUFFER
MOV DH,AL
MOV AX,DS
MOV ES,AX
MOV CX,5
CALL MSGIN ;GET HEADER
JC SNDRCV ;TIME OUT
CALL NETIN ;GET CHECK SUM
JC SNDRCV ;TIME OUT RETRY
JNZ SNDRCN ;CHECK SUM ERROR
CALL SNDAKS ;SEND RESPONSE
CALL CHARIW
JC SNDRCV ;TIME OVER
CMP AL,STX ;CHECK START OF TEXT
JNZ SNDRCV ;MISS RETRY
MOV DH,AL ;INITIALIZE CHECK SUM
MOV CL,-1[DI]
MOV CH,0
INC CX
INC CX ;GET COUNT FOR READ
SNDRCL: ;DATA PASS RECEIVE LOOP
CALL NETIN ;GET ONE DATA
JC SNDRCV ;TIME OUT RETRY
LOOP SNDRCL ;TO NEXT DATA
CMP AL,ETX
JNZ SNDRCV ;MISS MATCH OF END CODE
CALL NETIN ;GET CHECK SUM
JC SNDRCV ;CHECK SUM ERROR
CALL CHARIN
JC SNDRCV ;TIME OVER
CMP AL,EOT ;END OF TRANSMISSION
JNZ SNDRCV ;END CODE ERROR
OR DH,DH
JNZ SNDRCN ;CHECK SUM ERROR
CALL SNDAKS
JMP SENDS ;RETURN TO SEND
;
SNDRCN: ;ERROR RESPONSE
CALL SNDNAK
JMP SNDRCV
;
; GET ACKNOWLEDGE
; OVERRIDING RETURN WHEN ERROR
;
GETAK0: ;CHECK ACKNOWLEDGE
SUB AL,ACK
JNZ SNDRTY
RET ;OK END
;
CHINTO: ;CHARACTER IN TIME OUT
MOV AL,SNDERR
CALL ERETRN
JMP SNDMSR
;
GETAKS: ;GET SECOND ACKNOWLEDGE
CALL CHARIW
JC SNDRTY ;TIME OUT
SUB AL,ACKS
JNZ SNDRTY
RET ;OK
;
SNDRTY:
POP BX ;DISCARD RETURN ADDRESS
GETATS: ;TIME OVER RETRY
DEC RTYCNT
JZ CHINTO
JMP SEND ;SEND AGAIN
;
; RECEIVE MESSAGE FROM NETWORK
; INPUT
; CX:MESSAGE ADDRESS DS:SEGMENT
;
RCVMSG:
MOV AX,DS
MOV BP,CS
MOV DS,BP
MOV MSGSEG,AX ;SAVE MESSAGE SEGMENT
MOV MSGADR,CX ;SAVE MESSAGE ADDRESS
RCVMSR:
MOV AL,MAXRTY
MOV RTYCNT,AL ;INITIALIZE RETRY COUNT
RECALL:
CALL RECEIV
DEC RTYCNT ;DOWN RETRY COUNT
JNZ RECALL ;RETRY
RCVTOT: ;TIME OUT
MOV AL,RCVERR
CALL ERETRN
JMPS RCVMSR
;
; RECEIVE BODDY
; RETURN OVERRIDING WHEN OK
; SIMPLE RETURN IS ERROR
;
RECEIV:
MOV ES,MSGSEG
MOV DI,MSGADR ;GET MESSAGE ADDRESS
MOV DH,TMORTY ;TIME OUT RETRY
CALL NTRSET ;RESET INPUT BUFFER
RCVFST: ;RECEIVE FIRST CHARACTER LOOP
CALL CHARIN
JNC RCVGFS ;GET FIRST CHARACTER
DEC DH ;TIME OVER
JNZ RCVFST ;RETRY
POP BX
JMPS RCVTOT ;SET TIME OVER ERROR FLAG & RETRY
;
RCVGFS: ;GET FIRST CHARACTER
CMP AL,ENQ
JNZ RECEIV ;NOT ENQUIRE SO RETRY
CALL SNDACK ;RESPONSE TO MASTER
CALL CHARIW
JC RECEIE ;RETURN TO RECEIVE RETRY
CMP AL,SOH
JNZ RECEIE ;NOT START OF HEADER
MOV DH,AL ;START OF HEADER
MOV CX,5 ;LENGTH OF HEADER
CALL MSGIN ;GET HEADER BLOCK
JC RECEIE ;TIME OVER
CALL NETIN ;GET HCS (HEADER CHECK SUM)
JC RECEIE ;TIME OVER RETRY
JNZ SNDNAK ;CHECK SUM ERROR
CALL SNDAKS ;SEND RESPONSE
CALL CHARIW ;WAIT DATA TOP
JC RECEIE ;TIME OVER
CMP AL,STX
JNZ RECEIE ;NOT START OF TEXT
MOV DH,AL ;START OF TEXT
DEC DI
MOV CL,ES:[DI] ;GET SIZE
INC DI
MOV CH,0
INC CX ;MAKE READ COUNT FOR DATA BLOCK
CALL MSGIN ;RECEIVE DATA
JC RECEIE ;TIME OVER
CALL CHARIN ;GET END CODE OF DATA BLOCK
JC RECEIE
CMP AL,ETX
JNZ RECEIE ;NOT END OF TEXT SO RETRY
ADD DH,AL
CALL NETIN ;GET CHECK SUM
JC RECEIE
CALL CHARIN ;GET LAST CODE
JC RECEIE
CMP AL,EOT
JNZ RECEIE ;NOT END OF TRANSMIT SO ERROR
OR DH,DH
JNZ SNDNAK ;CHECK SUM ERROR
POP BX ;OK ALL PACKETTE IS RECEIVED
MOV DI,MSGADR
INC DI
MOV AL,CNFTBL+1 ;GET SLAVE ID
SUB AL,ES:[DI] ;CHECK SID
JZ $+4
MOV AL,-1 ;SID ERROR
PUSH AX
CALL SNDAKS ;SEND ACKNOWLEDGE
POP AX
RECEIE:
RET
;
; ROUTINES TO SEND RESPONSE CODES
;
SNDACK: ;SEND ACKNOWLEDGE
MOV DL,ACK
JMPS CHROUT
;
SNDAKS: ;SEND SECOND ACKNOWLEDGE
MOV DL,ACKS
JMPS CHROUT
;
SNDNAK: ;SEND NEGATIVE ACKNOWLEDGE
MOV DL,NAK
JMPS CHROUT
;
; ERROR RETURN
; INPUT
; AL:ERROR BIT
; OUTPUT
; AL:-1
;
ERETRN:
MOV BX,OFFSET CNFTBL
OR [BX],AL ;ON ERROR BIT
CALL NTRSET ;RESET COMMUNICATION INTERFACE
MOV AL,-1 ;ERROR RETUNR CODE
RET
;
; NETWORK ERROR RECOVER ROUTINE RESET COMMUNICATION INTERFACE
;
NTRSET:
MOV AL,080H
OUT STATO,AL ;RESET
RET
;
; BOOTING UP ROUTINE
;
NTWKWB:
JMPS NTRSET ;RESET INTERFACE
;
; RETURN END ADDRESS
;
NTWKEN:
MOV BX,OFFSET BOTTOM
RET
;
; NETWORK OUTPUT DATA
; INPUT
; DL:OUTPUT DATA
; DH:CHECK SUM
;
NETOUT:
ADD DH,DL ;MAKE CHECK SUM
CHROUT:
IN AL,STATO
AND AL,MSKO ;GET OUTPUT READY MODE
JNZ CHROUT ;NOT READY
MOV AL,DL
OUT DPRTO,AL ;OUT DATA
RET
;
; INPUT FROM NETWORK
; OUTPUT
; AL:DATA
; CF:ON TIME OVER OFF GET DATA
;
CHARIW: ;LONG WAIT
MOV BH,0
JMPS CHARIM
;
CHARIN:
STI
MOV BH,10 ;10 MS = 192 CH / 192K BAUD
CHARIM: ;WAIT LOOP
MOV BL,125 ;1 MS WAIT VALUE BY 5MHZ
CHARIL: ;1 MS WAIT LOOP
IN AL,STATI
AND AL,MSKI
JZ CHARIG ;READY
DEC BL
JNZ CHARIL ;WAIT OF 1 MS
DEC BH
JNZ CHARIM ;WAIT
STC ;TIME OVER RETURN
RET
;
CHARIG:
IN AL,DPRTI ;GET DATA
RET
;
; MESSAGE INPUT
; INPUT
; DI:DESTINATION ADDRESS ES:SEGMENT
; CX:INPUT COUNT
;
MSGIN:
CLI
CLD
MSGINL:
IN AL,STATI
AND AL,MSKI
JZ MSGINS ;READY
CALL CHARIN ;NOT READY SO WAIT
JC MSGINE ;TIME OUT
CLI
JMPS MSGINS+2 ;GET DATA
;
MSGINS: ;READY
IN AL,DPRTI ;GET DATA
STOSB ;SAVE DATA
ADD DH,AL ;MAKE HASH
LOOP MSGINL ;TO NEXT BYTE
OR AL,AL ;OFF CF
MSGINE:
STI
RET
;
; NETWORK INPUT
; INPUT
; DH:CHECK SUM
; OUTPUT
; AL:DATA
; CF:ON TIME OVER
; ZF:ON HASH TOTAL IS ZERO
;
NETIN:
CALL CHARIN ;RECEIVE BYTE IN BINARY MODE
JC NETINE
ADD DH,AL ;MAKE CHECK SUM
OR DH,DH ;OFF CARRY FLAG
NETINE:
RET
;
; MESSAGE OUT
; INPUT
; DI:SOURCE ADDRESS
; CX:COUNT OF OUTPUT DATA
; DL:PREAMBLE CODE
;
MSGOUT:
MOV DH,0 ;CLEAR CHECK SUM
CALL NETOUT ;OUT PREAMBLE CODE
MSGOTL: ;OUT LOOP
MOV DL,ES:[DI] ;GET CODE
INC DI
CALL NETOUT ;OUT DATA
LOOP MSGOTL ;TO NEXT DATA
RET
;
;
DTAREA EQU $
DSEG
ORG OFFSET DTAREA
;
; DATA AREA
;
FINIT DB -1 ;INITIAL MODE -1 INITIAL
MSGADR DW 0 ;MESSAGE ADDRESS BUFFER
MSGSEG DW 0 ;MESSAGE SEGMENT
DHEADR RB 5 ;DUMMY HEADER BUFFER
RTYCNT DB 0 ;RETRY COUNT
;
;
BOTTOM: ;BOTTOM OF SNIOS
;
;
END


View File

@@ -0,0 +1,598 @@
; SLAVE NETWORK INPUT OUTPUT SYSTEM FOR CP/NET-86
;
; 1983.9.4. VER.1.00
;
BASE EQU 100H ;FOR RELOCATION
;
;
TITLE 'SLAVE NETWORK INPUT OUTPUT SYSTEM FOR CP/NET-86'
;
; 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 224 ;BDOS INTTERUPT
;
COMPRT EQU 0D0H ;COMMUNICATION PORT
STATI EQU COMPRT ;INPUT STATUS
DPRTI EQU COMPRT+2 ;DATA PORT
MSKI EQU 01H ;INPUT READY BIT
;
STATO EQU COMPRT ;OUTPUT STATUS
DPRTO EQU COMPRT+2 ;DATA PORT
MSKO EQU 80H ;OUTPUT READY BIT
;
;
CSEG
ORG BASE
;
; 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
JMP NTWKEN ;RETURN END ADDRESS
;
;
PTABLE EQU $
DSEG
ORG OFFSET PTABLE
;
; 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 85H,0 ;J: F: OF MASTER 0
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
;
CNFTBS DB 0 ;FMT MESSAGE BUFFER FOR LISTER
DB 0 ;DID
DB 0 ;SID
DB 5 ;FNC LIST OUT
DB 0 ;SIZ
RS 1 ;MESSAGE 0 LISTER NUMBER
RS 35 ;MESSAGE 1 - 128 OUTPUT DATA
;
; COMMENT DESTROYED BY LIST OUT TO NETWORK
;
CSTUP DB 'SNIOS OF CP/NET-86 XYZ VER.1.00 SLAVE ID = '
CSTIDN DB '00',CR,LF,'$'
;
;
MAINP EQU $
CSEG
ORG OFFSET MAINP
;
; SET SLAVE ID NUMBER
;
SETIDN:
MOV BX,OFFSET CSTIDN
MOV AL,CNFTBL+1 ;GET SLAVE ID
MOV CL,AL
ROR AL,1
ROR AL,1
ROR AL,1
ROR AL,1
CALL SETIDS ;SET UPER NIBBLE
MOV AL,CL
SETIDS:
AND AL,0FH
ADD AL,'0'
CMP AL,'0'+10
JC $+4 ;0 TO 9
ADD AL,7 ;A TO F
MOV [BX],AL
INC BX
RET
;
; INITIAL COMMENT OUT ROUTINE
;
INITCM:
CALL SETIDN ;SET ID NUMBER
MOV DX,OFFSET CSTUP
MOV CL,CBUFPR
INT BDOS ;OUT COMMENT
XOR AL,AL
MOV FINIT,AL
RET ;ZERO IS SUCCESS END
;
; INITIALIZE NETWROK
; OUTPUT
; AL:0 OK
;
NTWKIN:
MOV AL,CNFTBL+1 ;GET SLAVE PROCESSOR ID
MOV CNFTBS+2,AL ;SAVE SID FOR LISTER
CALL NTRSET ;RESET COMMUNICATION INTERFACE
MOV AL,FINIT
OR AL,AL
JNZ INITCM ;OUT INITIAL COMMENT
RET ;INITIALIZED
;
; OUTPUT STATUS OF NETWORK
; OUTPUT
; AL:STATUS
;
NTWKST:
MOV AL,CNFTBL ;GET NETWORK STATUS
MOV AH,AL
AND AH,NOT (RCVERR+SNDERR)
MOV CNFTBL,AH ;OFF ERROR BITS
RET
;
; RETURN CONFIGRATION TABLE ADDRESS
; OUTPUT
; BX:CONFIGRATION TABLE POINT
;
CNTBAD:
MOV BX,OFFSET CNFTBL
RET
;
; SEND MESSAGE ON NETWORK
; INPUT
; CX:MESSAGE ADDRESS DS:SEGMENT
;
SNDMSG:
MOV AX,DS
MOV BP,CS
MOV DS,BP ;SET DSEG TO NORMAL
MOV MSGSEG,AX ;SAVCE SEGMENT
MOV MSGADR,CX ;SAVE MESSAGE ADDRESS
SNDMSR: ;RETRY LOOP
MOV AL,MAXRTY
MOV RTYCNT,AL ;INITIALIE RETRY COUNT
SEND:
CALL NTRSET ;RESET BUFFER
SENDS:
MOV ES,MSGSEG
MOV DI,MSGADR ;GET MESSAGE TOP
MOV DH,TMORTY ;TIME OUT RETRY COUNT
SENDWT: ;ENQUIRE RESPONSE WAIT LOOP
MOV DL,ENQ
CALL CHROUT ;SEND ENQUIRE TO MASTER
CALL CHARIN ;WAIT RESPONSE
JNC SENDGT ;GET RESPONSE
DEC DH ;TIME OVER
JNZ SENDWT ;SEND ENQUIRE ONCE MORE
JMP CHINTO ;TIME OVER FOR LINK
;
SENDGT: ;GET RESPONSE
CMP AL,ENQ ;CHECK SEND - SEND MODE
JZ SNDRCV ;CRASH SEND SO TO PASS RECEIVE MODE
CALL GETAK0 ;GET RESPONSE OF ENQ
MOV DL,SOH
MOV CX,5 ;HEADER LENGTH COUNT
CALL MSGOUT ;SEND SOH,FMT,DID,SID,FNC,SIZ
XOR AL,AL
SUB AL,DH
MOV DL,AL
CALL NETOUT ;SEND HCS (HEADER CHECK SUM)
CALL CHARIW ;GET RESPONSE
JC SENDOV ;TIME OVER
CMP AL,ACK
JNZ SENDGA ;NORMAL MODE
CALL CHARIW ;MAYBE BUFFER LEFT ACK, SO IGNORE
JC SENDOV ;TIME OVER
SENDGA:
SUB AL,ACKS
JNZ SENDOV ;MISS MATCH OF RESPONSE
DEC DI
MOV CL,ES:[DI] ;GET LENGTH
INC DI
MOV CH,0
INC CX
MOV DL,STX
CALL MSGOUT ;SEND STX,DB0,DB1,....
MOV DL,ETX
CALL NETOUT ;SEND ETX
XOR AL,AL
SUB AL,DH
MOV DL,AL
CALL NETOUT ;SEND DATA CHECK SUM
MOV DL,EOT
CALL CHROUT ;SEND END OF TRNASMISSION
CALL GETAKS ;** NEED CALL ******* FOR ERROR RETRY
RET
;
SENDOV: ;TIME OVER OR SO
JMP GETATS
;
; PASS RECEIVE FOR SEND & SEND MODE
;
SNDRCV:
CALL NTRSET ;CLEAR CURRENT BUFFER
MOV DH,TMORTY
SNDRCW: ;WAIT FOR ANOTHER ENQ
CALL CHARIN
JNB SNDRCG ;GET DATA
DEC DH ;TIME OVER
JNZ SNDRCW ;WAIT
SNDRCS:
JMP SEND ;MAYBE MISS LINK, SO TO SEND
;
SNDRCG: ;GET DATA
CMP AL,ENQ
JNZ SNDRCS ;MAYBE MISS LINK
CALL SNDACK ;SEND ACKNOWLEDGE
CALL CHARIW
JC SNDRCV ;NO RESPONSE, SO RETRY
CMP AL,SOH
JNZ SNDRCV
MOV DI,OFFSET DHEADR ;DUMMY HEADER BUFFER
MOV DH,AL
MOV AX,DS
MOV ES,AX
MOV CX,5
CALL MSGIN ;GET HEADER
JC SNDRCV ;TIME OUT
CALL NETIN ;GET CHECK SUM
JC SNDRCV ;TIME OUT RETRY
JNZ SNDRCN ;CHECK SUM ERROR
CALL SNDAKS ;SEND RESPONSE
CALL CHARIW
JC SNDRCV ;TIME OVER
CMP AL,STX ;CHECK START OF TEXT
JNZ SNDRCV ;MISS RETRY
MOV DH,AL ;INITIALIZE CHECK SUM
MOV CL,-1[DI]
MOV CH,0
INC CX
INC CX ;GET COUNT FOR READ
SNDRCL: ;DATA PASS RECEIVE LOOP
CALL NETIN ;GET ONE DATA
JC SNDRCV ;TIME OUT RETRY
LOOP SNDRCL ;TO NEXT DATA
CMP AL,ETX
JNZ SNDRCV ;MISS MATCH OF END CODE
CALL NETIN ;GET CHECK SUM
JC SNDRCV ;CHECK SUM ERROR
CALL CHARIN
JC SNDRCV ;TIME OVER
CMP AL,EOT ;END OF TRANSMISSION
JNZ SNDRCV ;END CODE ERROR
OR DH,DH
JNZ SNDRCN ;CHECK SUM ERROR
CALL SNDAKS
JMP SENDS ;RETURN TO SEND
;
SNDRCN: ;ERROR RESPONSE
CALL SNDNAK
JMP SNDRCV
;
; GET ACKNOWLEDGE
; OVERRIDING RETURN WHEN ERROR
;
GETAK0: ;CHECK ACKNOWLEDGE
SUB AL,ACK
JNZ SNDRTY
RET ;OK END
;
CHINTO: ;CHARACTER IN TIME OUT
MOV AL,SNDERR
CALL ERETRN
JMP SNDMSR
;
GETAKS: ;GET SECOND ACKNOWLEDGE
CALL CHARIW
JC SNDRTY ;TIME OUT
SUB AL,ACKS
JNZ SNDRTY
RET ;OK
;
SNDRTY:
POP BX ;DISCARD RETURN ADDRESS
GETATS: ;TIME OVER RETRY
DEC RTYCNT
JZ CHINTO
JMP SEND ;SEND AGAIN
;
; RECEIVE MESSAGE FROM NETWORK
; INPUT
; CX:MESSAGE ADDRESS DS:SEGMENT
;
RCVMSG:
MOV AX,DS
MOV BP,CS
MOV DS,BP
MOV MSGSEG,AX ;SAVE MESSAGE SEGMENT
MOV MSGADR,CX ;SAVE MESSAGE ADDRESS
RCVMSR:
MOV AL,MAXRTY
MOV RTYCNT,AL ;INITIALIZE RETRY COUNT
RECALL:
CALL RECEIV
DEC RTYCNT ;DOWN RETRY COUNT
JNZ RECALL ;RETRY
RCVTOT: ;TIME OUT
MOV AL,RCVERR
CALL ERETRN
JMPS RCVMSR
;
; RECEIVE BODDY
; RETURN OVERRIDING WHEN OK
; SIMPLE RETURN IS ERROR
;
RECEIV:
MOV ES,MSGSEG
MOV DI,MSGADR ;GET MESSAGE ADDRESS
MOV DH,TMORTY ;TIME OUT RETRY
CALL NTRSET ;RESET INPUT BUFFER
RCVFST: ;RECEIVE FIRST CHARACTER LOOP
CALL CHARIN
JNC RCVGFS ;GET FIRST CHARACTER
DEC DH ;TIME OVER
JNZ RCVFST ;RETRY
POP BX
JMPS RCVTOT ;SET TIME OVER ERROR FLAG & RETRY
;
RCVGFS: ;GET FIRST CHARACTER
CMP AL,ENQ
JNZ RECEIV ;NOT ENQUIRE SO RETRY
CALL SNDACK ;RESPONSE TO MASTER
CALL CHARIW
JC RECEIE ;RETURN TO RECEIVE RETRY
CMP AL,SOH
JNZ RECEIE ;NOT START OF HEADER
MOV DH,AL ;START OF HEADER
MOV CX,5 ;LENGTH OF HEADER
CALL MSGIN ;GET HEADER BLOCK
JC RECEIE ;TIME OVER
CALL NETIN ;GET HCS (HEADER CHECK SUM)
JC RECEIE ;TIME OVER RETRY
JNZ SNDNAK ;CHECK SUM ERROR
CALL SNDAKS ;SEND RESPONSE
CALL CHARIW ;WAIT DATA TOP
JC RECEIE ;TIME OVER
CMP AL,STX
JNZ RECEIE ;NOT START OF TEXT
MOV DH,AL ;START OF TEXT
DEC DI
MOV CL,ES:[DI] ;GET SIZE
INC DI
MOV CH,0
INC CX ;MAKE READ COUNT FOR DATA BLOCK
CALL MSGIN ;RECEIVE DATA
JC RECEIE ;TIME OVER
CALL CHARIN ;GET END CODE OF DATA BLOCK
JC RECEIE
CMP AL,ETX
JNZ RECEIE ;NOT END OF TEXT SO RETRY
ADD DH,AL
CALL NETIN ;GET CHECK SUM
JC RECEIE
CALL CHARIN ;GET LAST CODE
JC RECEIE
CMP AL,EOT
JNZ RECEIE ;NOT END OF TRANSMIT SO ERROR
OR DH,DH
JNZ SNDNAK ;CHECK SUM ERROR
POP BX ;OK ALL PACKETTE IS RECEIVED
MOV DI,MSGADR
INC DI
MOV AL,CNFTBL+1 ;GET SLAVE ID
SUB AL,ES:[DI] ;CHECK SID
JZ $+4
MOV AL,-1 ;SID ERROR
PUSH AX
CALL SNDAKS ;SEND ACKNOWLEDGE
POP AX
RECEIE:
RET
;
; ROUTINES TO SEND RESPONSE CODES
;
SNDACK: ;SEND ACKNOWLEDGE
MOV DL,ACK
JMPS CHROUT
;
SNDAKS: ;SEND SECOND ACKNOWLEDGE
MOV DL,ACKS
JMPS CHROUT
;
SNDNAK: ;SEND NEGATIVE ACKNOWLEDGE
MOV DL,NAK
JMPS CHROUT
;
; ERROR RETURN
; INPUT
; AL:ERROR BIT
; OUTPUT
; AL:-1
;
ERETRN:
MOV BX,OFFSET CNFTBL
OR [BX],AL ;ON ERROR BIT
CALL NTRSET ;RESET COMMUNICATION INTERFACE
MOV AL,-1 ;ERROR RETUNR CODE
RET
;
; NETWORK ERROR RECOVER ROUTINE RESET COMMUNICATION INTERFACE
;
NTRSET:
MOV AL,080H
OUT STATO,AL ;RESET
RET
;
; BOOTING UP ROUTINE
;
NTWKWB:
JMPS NTRSET ;RESET INTERFACE
;
; RETURN END ADDRESS
;
NTWKEN:
MOV BX,OFFSET BOTTOM
RET
;
; NETWORK OUTPUT DATA
; INPUT
; DL:OUTPUT DATA
; DH:CHECK SUM
;
NETOUT:
ADD DH,DL ;MAKE CHECK SUM
CHROUT:
IN AL,STATO
AND AL,MSKO ;GET OUTPUT READY MODE
JNZ CHROUT ;NOT READY
MOV AL,DL
OUT DPRTO,AL ;OUT DATA
RET
;
; INPUT FROM NETWORK
; OUTPUT
; AL:DATA
; CF:ON TIME OVER OFF GET DATA
;
CHARIW: ;LONG WAIT
MOV BH,0
JMPS CHARIM
;
CHARIN:
STI
MOV BH,10 ;10 MS = 192 CH / 192K BAUD
CHARIM: ;WAIT LOOP
MOV BL,125 ;1 MS WAIT VALUE BY 5MHZ
CHARIL: ;1 MS WAIT LOOP
IN AL,STATI
AND AL,MSKI
JZ CHARIG ;READY
DEC BL
JNZ CHARIL ;WAIT OF 1 MS
DEC BH
JNZ CHARIM ;WAIT
STC ;TIME OVER RETURN
RET
;
CHARIG:
IN AL,DPRTI ;GET DATA
RET
;
; MESSAGE INPUT
; INPUT
; DI:DESTINATION ADDRESS ES:SEGMENT
; CX:INPUT COUNT
;
MSGIN:
CLI
CLD
MSGINL:
IN AL,STATI
AND AL,MSKI
JZ MSGINS ;READY
CALL CHARIN ;NOT READY SO WAIT
JC MSGINE ;TIME OUT
CLI
JMPS MSGINS+2 ;GET DATA
;
MSGINS: ;READY
IN AL,DPRTI ;GET DATA
STOSB ;SAVE DATA
ADD DH,AL ;MAKE HASH
LOOP MSGINL ;TO NEXT BYTE
OR AL,AL ;OFF CF
MSGINE:
STI
RET
;
; NETWORK INPUT
; INPUT
; DH:CHECK SUM
; OUTPUT
; AL:DATA
; CF:ON TIME OVER
; ZF:ON HASH TOTAL IS ZERO
;
NETIN:
CALL CHARIN ;RECEIVE BYTE IN BINARY MODE
JC NETINE
ADD DH,AL ;MAKE CHECK SUM
OR DH,DH ;OFF CARRY FLAG
NETINE:
RET
;
; MESSAGE OUT
; INPUT
; DI:SOURCE ADDRESS
; CX:COUNT OF OUTPUT DATA
; DL:PREAMBLE CODE
;
MSGOUT:
MOV DH,0 ;CLEAR CHECK SUM
CALL NETOUT ;OUT PREAMBLE CODE
MSGOTL: ;OUT LOOP
MOV DL,ES:[DI] ;GET CODE
INC DI
CALL NETOUT ;OUT DATA
LOOP MSGOTL ;TO NEXT DATA
RET
;
;
DTAREA EQU $
DSEG
ORG OFFSET DTAREA
;
; DATA AREA
;
FINIT DB -1 ;INITIAL MODE -1 INITIAL
MSGADR DW 0 ;MESSAGE ADDRESS BUFFER
MSGSEG DW 0 ;MESSAGE SEGMENT
DHEADR RB 5 ;DUMMY HEADER BUFFER
RTYCNT DB 0 ;RETRY COUNT
;
;
BOTTOM: ;BOTTOM OF SNIOS
;
;
END


1
CP-NET/Readme.markdown Normal file
View File

@@ -0,0 +1 @@
# Networking software for CP/M and MP/M computers.