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

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