mirror of
https://github.com/SEPPDROID/Digital-Research-Source-Code.git
synced 2025-10-25 01:14:21 +00:00
489 lines
8.9 KiB
Plaintext
489 lines
8.9 KiB
Plaintext
; 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
|
||
|