DataMuseum.dkPresents historical artifacts from the history of: CR80 Hard and Floppy Disks |
This is an automatic "excavation" of a thematic subset of
See our Wiki for more about CR80 Hard and Floppy Disks Excavated with: AutoArchaeologist - Free & Open Source Software. |
top - download
Length: 8722 (0x2212) Types: TextFile Names: »RXDRIVER.S«
└─⟦a3edd706e⟧ Bits:30005202 8" Zilog MCZ/1 Floppy CR80FD_0028 ( TC 500 SEC. PROTOCOL BACK UP ! (V1) BB A1 820907 NCJ ) └─ ⟦this⟧ »RXDRIVER.S«
;****************************************************************************** ;* ;* RECEIVER MODULE ;* ;****************************************************************************** *INCLUDE CONSTANT.S EXTERNAL SUBDEQ,SUBENQ EXTERNAL SIOREADWRITE GLOBAL RECROU GLOBAL REC_START GLOBAL NO_SYNCHRONIZATION GLOBAL CONTENTION GLOBAL CHARACTER_RECEIVER GLOBAL CONTINUE_RECEIVER GLOBAL CHECKSUM_CHECK GLOBAL HUNT GLOBAL RXSTOP RECROU LD HL,RECTAB LD C,(IY+1FH) LD B,0 ADD HL,BC LD E,(HL) INC HL LD D,(HL) EX DE,HL JP (HL) RECTAB DEFW NO_SYNCHRONIZATION DEFW REC_START DEFW CONTENTION DEFW CHARACTER_RECEIVER DEFW CONTINUE_RECEIVER DEFW CHECKSUM_CHECK ;ECHO \f REC_START LD BC,1010001100100000B CALL SIOREADWRITE ; SIOCON 3,W,R,020H LD C,(IY+1CH) ;GET SIO ADDRESS IN A,(C) ;READ RECEIVED CHARACTER AND 7FH ;MASK PARITY BIT CP SYN ;IF RECEIVED CHARATER = SYNC RET Z ;THEN SKIP CP EOT ;IF RECEIVED CHARACTER <> EOT JR Z,RS2 ;AND CP NACK ;IF RECEIVED CHARATER <> NACK JR Z,RS2 ;AND CP ACK ;IF RECEIVED CHARACTER <>ACK RET NZ ; RS2 PUSH AF LD (IY+0EH),02H ;SET RXFLAG LD L,(IY+08H) ;IF BUFFER AVAILABLE FROM EMPTY BUFFER LD H,(IY+09H) ; CALL SUBDEQ ; JR NC,NO1BUF ;THEN DO LD HL,RECOFF+BUFFHEAD ;CALCULATE RECEIVING START ADD HL,DE ; ADDRESS 11 PUSH HL ; LD C,L ; LD B,H ; LD (IY+2AH),E ; SAVE BUFFER ELEMENT ADDRESS LD (IY+2BH),D ; LD HL,TSAOFF ; TRANSFER RECEIV.STARTADDRESS ADD HL,DE ; DRES STO REFLECTING START POINT LD (HL),C ; INC HL ; LD (HL),B ; LD HL,STWOFF ; CALCULATE STATUS WORD ADDRESS ADD HL,DE ; LD (HL),00H ; RESET STATUS WORD INC HL ; LD (HL),00H ; POP HL ; POP AF ; LD (HL),A ; INC HL ; LD (IY+2EH),L ; TEMPORARY SAVING OF START LD (IY+2FH),H ; ADDRESS LD BC,01H ; LOAD CURRENT BYTE COUNT LD (IY+2CH),C ; WITH 01H LD (IY+2DH),B ; CP EOT ; IF RECEIVED CHARACTER < > EOT JR Z,DLCEOT ; (=ACK OR =NACK ) LD E,(IY+2AH) ; GET BUFFER ELEMENT ADDRESS LD D,(IY+2BH) ; LD HL,BCOFF ; CALCULATE BYTECOUNT ADD HL,DE ; ADDRESS LD (HL),C ; SAVE BYTE COUNT INC HL ; LD (HL),B ; LD L,(IY+28H) ; GET QUEUEHEAD ADDRESS LD H,(IY+29H) ; CALL SUBENQ ; TRANSFER RECEIVED ; BUFFER CALL HUNT ; SET SIO IN HUNT MODE LD (IY+2AH),00H ; RESET BUFFER ELEMENT ADDRESS LD (IY+2BH),00H ; RET ; RETURN FROM PROCESS ; FI DLCEOT LD (IY+1FH),04H ;NEXT INT.ROUTINE = CONXTEN RET ;RETURN FROM PROCESS NO1BUF POP AF ;ELSE DO LD (IY+1FH),02H ; NEXT INT.ROUTINE = STAXREC RET ; ; END ;ECHO\f ;****************************************************************************** NO_SYNCHRONIZATION LD (IY+0EH),00H ;RESET RXFLAG LD C,(IY+1CH) ;GET SIO ADDRESS IN A,(C) ;READ RECEIVED CHARACTER RET ;RETURN FROM PROCESS ;****************************************************************************** CONTENTION LD (IY+0EH),03H ;SET RXFLAG LD C,(IY+1CH) ;GET SIO ADDRESS 19 IN A,(C) ;READ RECEIVED CHARACTER 12 AND 07FH ;MASK PARITY BIT 07 LD E,A ;TEMPORARY SAVING OF RECEIVED CHARACTER CP SYN ;IF RECEIVED CHARARTER = SYNC LD C,(IY+2CH) ; GET CURRENT BYTE COUNT LD B,(IY+2DH) ; JR NZ,NOSYNC ; THEN DO LD A,C ; CP 01 ;IF BYTE COUNT = 01 THEN DO RET NZ ; BUFTORQ LD E,(IY+2AH) ; GET BUFFER ELEMENT ADDRESS 19 LD D,(IY+2BH) ; 19 LD HL,BCOFF ; CALCULATE BYTECOUNT ADDRESS ADD HL,DE ; 11 LD (HL),C ; SAVE FINAL BYTE COUNT 07 INC HL ; 06 LD (HL),B ; 07 LD L,(IY+28H) ; GET POINTER TO RECEIVER QUEUE LD H,(IY+29H) ; 19 CALL SUBENQ ; TRANSFER RECEIVED BUFFER 157 CALL HUNT ; SET SIO IN HUNT MODE LD (IY+2AH),00H ; RESET BUFFER ELEMENT ADDRESS LD (IY+2BH),00H ; RET ;RETURN FROM PROCESS NOSYNC LD L,(IY+2EH) ; LD H,(IY+2FH) ; LD (HL),E ;SAVE CHARACTER IN BUFFER INC HL ;INCREMENT BUFFER POINTER LD (IY+2EH),L ;SAVE NEW BUFFER POINTER LD (IY+2FH),H ; INC (IY+2CH) ;INCREMENT BYTECOUNT JR NZ,NO1 ; INC (IY+2DH) ; NO1 INC BC ; LD A,C ; CP 04H ;IF BYTE COUNT < 04 RET C ; JR Z,ISBC04 ; CP 05H ; JR Z,ISBC05 ; JR RXERR ; ; ISBC04 ;IF BYTE COUNT = 04 LD A,E ; GET RECEIVED CHARACTER CP FSL ;IF RECEIVED CHARACTER = FSL RET Z ; THEN RETURN FI CP POL ;IF RECEIVED CHARACTER = POL RET Z ; THEN RETURN FI CP CON ;IF RECEIVED CHARACTER = CON JR NZ,RXERR ; JP BUFTORQ ; TRANSFER BUFFER TO RECEIVER QUEUE ISBC05 ;IF BYTE COUNT = 05 LD A,E ; GET RECEIVED CHARACTER CP ENQ ;IF CHARACTER = ENQ JP Z,BUFTORQ ; THEN STOP ISCHSOH CP SOH ;IF RECEIVED CHARACTER = SOH JR NZ,RXERR ; LD (IY+1FH),06H ; NEXT INT.ROUTINE = CHAXREC RET ;RETURN FROM PROCESS ; RXERR LD L,(IY+2AH) ;GET BUFFER ELEMENT ADDRESS LD H,(IY+2BH) ; LD DE,STWOFF ;CALCULATE STATUS WORD ADD HL,DE ; SET 1,(HL) ;SET RXERROR BIT JP BUFTORQ ;TRANSFER BUFFER TO RECEIVER QUEUE ;ECHO \f ;***************************************************************************** CHARACTER_RECEIVE LD (IY+0EH),04H ;SET RXFLAG LD (IY+1FH),08H ;NEXT INT.ROUTINE = CONXREC LD (IY+17H),00H ;RESET CHECKSUM BYTE 19 ;****************************************************************************** CONTINUE_RECEIVER LD (IY+0EH),05H ;SET RXFLAG LD C,(IY+1CH) ;GET SIO ADDRESS 19 IN A,(C) ;READ RECEIVED CHARACTER 12 AND 07FH ;MASK PARITY BIT 07 CP SYN ;IF SYNC RECEIVED 19 RET Z ; RETURN 10 ; END LOOP1RE LD C,A ;STORE CONTENS OF A REG. XOR (IY+17H) ;XOR RECEIVED CHARACTER TO CHECKSUM 19 LD (IY+17H),A ;SAVE NEW CHECKSUM 07 LD A,C ;GET CONTENS OF A REG. CP ETX ;IF ETX RECEIVED 19 JR NZ,NORMCHA ;THEN DO 10 CONCHA LD L,(IY+2EH) ; SAVE RECEIVED CHARACTER 19 LD H,(IY+2FH) ; 19 LD (HL),A ; 07 LD E,(IY+2AH) ; GET ELEMENT ADDRESS 19 LD D,(IY+2BH) ; 19 LD HL,BCOFF ; CALCULATE BYTECOUNT ADDRESS ADD HL,DE ; 11 LD C,(IY+2CH) ; GET CURRENT BYTE COUNT 19 LD B,(IY+2DH) ; 19 INC BC ; INCREMENT CURRENT BYTE COUNT 06 LD (HL),C ; SAVE BYTE COUNT IN BUFFER 07 INC HL ; ELEMENT 06 LD (HL),B ; 07 LD (IY+1FH),0AH ; NEXT INT.ROUTINE = PADXCRC RET ; RETURN 10 ; END ;IF NORMALE CHARACTER RECEIVED ;THEN DO NORMCHA LD C,(IY+2CH) ; GET CURRENT BYTE COUNT 19 LD B,(IY+2DH) ; 19 INC BC ; INCREMENT CURRENT BYTE COUNT 06 AND A ; 04 LD HL,MAXSIZE ; GET MAX BYTECOUNT SBC HL,BC ; IF CURRENT BYTE COUNT>MAXSIZE 15 JR NZ,CHANORM ; THEN DO 10 LD L,(IY+2AH) ; GET ELEMENT ADDRESS 19 LD H,(IY+2BH) ; 19 LD DE,STWOFF ; CALCULATE STATUS WORD ADD HL,DE ; ADDRESS 11 SET 0,(HL) ; SET OVER FLOW BIT 15 RET ; RETURN 10 ; END CHANORM LD (IY+2CH),C ; SAVE CURRENT BYTE COUNT 19 LD (IY+2DH),B ; 19 LD L,(IY+2EH) ; GET BUFFER ADDRESS 19 LD H,(IY+2FH) ; 19 LD (HL),A ; SAVE RECEIVED CHARACTER 07 INC HL ; INCREMENT BUFFER ADDRESS 06 LD (IY+2EH),L ; SAVE BUFFER ADDRESS POINTER 19 LD (IY+2FH),H ; 19 RET ; RETURN 10 ; END ;ECHO \f ;***************************************************************************** CHECKSUM_CHECK LD (IY+0EH),06H ;SET RXFLAG LD C,(IY+1CH) ;GET ADDRESS OF CALCULATED CHECKSUM 19 IN A,(C) ;GET RECEIVED CHECKSUM 12 AND 07FH ; 07 CP (IY+17H) ;IF RECEIVED CHECKSUM <> CALCULATED 19 LD E,(IY+2AH) ; GET BUFFER ELEMENT ADDRESS 19 LD D,(IY+2BH) ; 19 JR Z,NO1ERR ;THEN DO LD HL,STWOFF ; CALCULATE STATUS WORD ADD HL,DE ; WORD 11 SET 6,(HL) ; SET CHECKSUM ERROR BIT 15 ; NO1ERR LD L,(IY+28H) ; GET POINTER TO RECEIVE QUEUE LD H,(IY+29H) ; 19 CALL SUBENQ ; TRANSFER RECEIVED BUFFER 157 ; ELEMENT CALL HUNT ; SET SIO IN HUNT MODE LD (IY+2AH),00H ; RESET BUFFER ELEMENT LD (IY+2BH),00H ; ADDRESS 19 RET ; RETURN FROM GENERAL PROCESS 10 ; END ;ECHO \f ;************************************************** ;* ;* SUBROUTINE USED TO SET SIO IN HUNT MODE ;* ;************************************************** HUNT DI ;DISABLE INTERRUPT LD (IY+26H),00H ;RESET SYNCHRONIZATION STATUS LD BC,1110001100110010B CALL SIOREADWRITE ;SIOCON 3,W,S,032H LD L,(IY+24H) ;RESET ENTER HUNT MODE BIT LD H,(IY+25H) ; LD DE,03H ; ADD HL,DE ; RES 4,(HL) ;AND SYNC CHARACTER LOAD INHIBIT RES 1,(HL) ;BIT IN SIO 1 CHANNEL TABLE CALL RXSTOP ;GET INTERRUPT VECTOR NOXSYNC RET ; ;********************************************************** ;* ;* SUBRUTINE USED TO GET INTERRUPT VECTOR NOXSYNC ;* ;********************************************************** RXSTOP DI ;DISABLE INTERRUPT LD (IY+0EH),00H ;RESET RXFLAG LD (IY+1FH),00H ;NEXT INT.ROUTINE = NOXSYNC RET ;RETURN FROM PROCESS ;ECHO \f