Files
Sepp J Morris 31738079c4 Upload
Digital Research
2020-11-06 18:50:37 +01:00

598 lines
11 KiB
Plaintext
Raw Permalink Blame History

This file contains invisible Unicode characters

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

; 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