X;SAVE #D2:DUPSIO.M65AREV A SIO PATCHA4X; **** SIO INTERRUPT SERVICE ROUTINES ****X;X;9X; EQUATES FOR INTERRUPT ROUTINES MOVED FROM SIO$X;.X; ZERO PAGE8X;B1BUFRLO2;;POINTER TO BYTE TO SEND OR RECEIVEL BUFRHI3V2BFENLO4;;POINTER TO BYTE AFTER END OF BUFFER` BFENHI5j/CHKSUM1;;LOC TO STORE DATA FRAME CHECKSUMt+CHKSNT;;;CHECKSUM SENT FLAG- =FF SENT~8NOCKSM<;;FLAG NO CHECK SUM TO BE RECEIVED-NOT ZERO/STATUS0;;HOLD FOR STATUS TO BE PUT IN DCB0BUFRFL8;;FLAG-IF FF RECEIVE BUFFER IS FULL7RECVDN9;;FLAG RECEIVE NOT DONE. USED BY WAIT LOOP4POKMSK;;POKEY INTERRUPT MASK SHADOW FOR IRQENX;=X; HARDWARE REGISTERS USED IN SIO INTERRUPT ROUTINESX;0SKRES ;;SERIAL PORT STATUS RESET ON POKEY&SEROUT ;;SERIAL OUTPUT REGISTER1SERINSEROUT;;SERIAL PORT INPUT REG ON POKEY,IRQEN;;IRQ INTERRUPT ENABLE ON POKEY/SKSTAT;;SERIAL PORT STATUS REG ON POKEYX; 'X; ERROR CODES RETURNED BY SIOX;%FRMERR;;FRAMING ERROR ON INPUT(3OVRRUN;;DATA FRAME OVER RUN-BIT D5 IN SKSTAT2(CHKERR;;DATA FRAME CHECKSUM ERROR<FHX; **** INTERRUPT SERVICE ROUTINE TO OUTPUT DATA NEEDED ****PX;ZX;dX;n@X; IT UPDATES THE BYTE TO PUT ON SERIAL I/O BUS POINTERxGX; UNTIL END OF BUFFER. AFTER EACH UPDATE OF THE PTR ADDS THEIX; VALUE OF THE BYTE TO THE CHECKSUM. OUTPUTS THE CHECKSUM WHENKX; PTR EQUALS THE END OF BUFFER PTR (POINTS TO BYTE AFTER BUFFER).JX; RETURNS TO THIS ROUTINE AFTER CHECKSUM PASSED AND RESETS POKEYIX; INTERRUPT REG TO HAVE THE TRANSMIT DONE ROUTINE CALLED TO END(X; WAIT LOOP (SEE SIO LISTING).X;X; K.B. 6/10/80X; ISRODNC;;SAVE Y REG ON STACK5X; #BUFRLO'HNOWRP0;;INCREMENT PTR TO NEXT BYTE#BUFRHI;;TO SENDX;,X; PATCH TO ROUTINE - CHANGED CHECK"X;,1NOWRP0QBUFRLO;;CHECK IF PTR IS WITHIN BUFFER6+RBFENLO;;DO A DOUBLE PRECISION SUBTRACT@ QBUFRHIJ SBFENHIT3DNOTEND;;BRANCH IF (BUFR) < (BFEN)-MORE TO SEND^X;h*QCHKSNT;;TEST IF CHECKSUM ALREADY SENTr#HRELONE;;BRANCH IF ALREADY SENT|X;&X; SEND CHECKSUM AND SET FLAGX; QCHKSUM+PSEROUT;;PUT CHECKSUM IN SERIAL OUT REG"CHKSNT;;SET FLAG TO FF HEXHCHKDON;;RETURNX;JX; AFTER CHECKSUM SENT AND CAUSE NEXT INTERRUPT THEN CHANGE POKEYKX; MASK TO ENABLE TRANSMIT DONE INTERRUPT AND TERMINATE WAIT LOOP.X;"RELONEQPOKMSK;;GET POKEY MASKL>;;OR IN ENABLE PPOKMSK!PIRQEN;;ENABLE THE INTERRUPTSX;#X; RESTORE REGS AND RETURN&X;0 CHKDON7:?;;RESTORE Y REGD57;;RESTORE A REG SAVED IN OS IRQ INTERRUPT HANDLERN9XX;b=X; MORE TO SEND. SEND NEXT BYTE POINTED AT BY BUFR.lX;vNOTEND%>Q@BUFRLO7;;GET NEXT BYTE"PSEROUT;;PUT IN SERIAL OUT REGX;,!OCHKSUM;;ADD BYTE TO CHECKSUMO> PCHKSUMX;-!CHKDON;;GO RETURN AND WAIT FOR NEXT BYTEX;9X; ******** END OF OUT SERVICE ROUTINE ********DX; **** SERIAL INPUT READY INTERRUPT SERVICE ROUTINE ****X; X;X; FX; AFTER SERIAL RECEIVE IS ENABLED ROUTINE IS USED TO COLLECT*CX; BYTES FROM THE SERIAL INPUT REG AND PUT THEM IN BUFFER.4EX; WILL STOP WHEN BUFFER IS FULL. IF A CHECKSUM IS EXPECTED>EX; ROUTINE WILL MARK BUFFER FULL AND CONTINUE. WHEN CHECKSUMHBX; RECEIVED IT WILL CHECK IF = TO CHECKSUM IT WAS MAKING.R7X; WILL STORE ERRORS FOUND IN STATUS LOCATION.\X;fLX; THE IRQ INTERRUPT HANDLER IN THE OS PUSHES THE USER'S A REGISTERp7X; ONTO THE STACK BEFORE CALLING THIS ROUTINE.zX;X; K.B. 6/11/80X; ISRSIRC;;SAVE Y REG ON STACK5X;0X; GET STATUS FROM POKEY THEN RESET IT.X; QSKSTAT'PSKRES;;IGNORES VALUE- JUST STROBEDX;X; CHECK FOR ERRORSX;*GNTFRAM;;BIT 8 SET IF NO FRAMING ERROR %>FRMERR #'STATUS;;SET FRAME ERROR STATUS X;$ 2NTFRAMM> ;;IF BIT 5 CLEAR THEN FRAME OVER RUN. "HNTOVRN;;BRANCH IF NO OVER RUN8 %>OVRRUNB *'STATUS;;ELSE SET OVERRUN ERROR STATUSL X;V HX; CHECK IF BUFFER FULL AND THIS IS A CHECKSUM. IF IT IS, THEN` )X; CHECK IF DATA SENT WAS VALID.j X;t 3NTOVRNQBUFRFL;;TEST FOR BUFFER FULL (NOT ZERO)~ 0FNOTYET;;IF ZERO THEN NOT YET, THIS IS DATA. !QSERIN;;ELSE THIS IS CHECKSUM RCHKSUM;;ARE THEY EQUAL? FSRETRN;;YES,THEN RETURN -%>CHKERR;;ELSE SET CHECK SUM ERROR STATUS 'STATUS X; -X; SET RECEIVE DONE TO END WAIT LOOP X; SRETRNQ>;;DONE VALUE PRECVDN X; #X; RESTORE REGS AND RETURN X; SUSUAL7 ?;;RESTORE Y REG 7;;RESTORE A REG( 92 X;< LX; IF BYTE IS DATA, THEN GET HERE. PUT BYTE IN BUFFER AND CHECK IFF X; AT END OF BUFFER.P X;Z NOTYETQSERIN;;GET DATA BYTEd %>n %P@BUFRLO7;;STORE IT IN THE BUFFERx X; , &OCHKSUM;;ADD DATA BYTE TO CHECKSUM O> PCHKSUM X; *#BUFRLO;;INCREMENT POINTER TO LOCATION HNTWRP1;;FOR NEXT BYTE INPUT #BUFRHI X; 9X; THE PATCH CHANGED THE TEST FOR END OF BUFFER X; 0NTWRP1QBUFRLO;;DO DOUBLE PRECISION SUBTRACT RBFENLO QBUFRHI "SBFENHI;;CARRY CLEAR IF BORROW :DSUSUAL;;BRANCH IF (BUFR) < (BFEN)-WITHIN BUFFER LIMIT" X;, 7X; DONE WITH DATA. SEE IF CHECKSUM TO BE SENT6 X;@ &QNOCKSM;;IF = ZERO THEN A CHECKSUMJ FGOON;;WILL FOLLOW THE DATAT X;^ #Q>;;ELSE NO CHECKSUM TO FOLLOWh #PNOCKSM;;CLEAR NO CHECKSUM FLAGr /FSRETRN;;RETURN AFTER SET RECEIVE DONE FLAG| X; 4X; SET BUFFER FULL AND THEN GO GET CHECKSUM X; ,GOON"BUFRFL;;SET BUFFER FULL FLAG TO FF HSUSUAL;;GO RETURN X; KX; ******** END OF RECEIVE SERIAL INPUT INTERRUPT ROUTINE ******** MDEND   / MDEND;;SET END ADDR IN FMS PAST RES DUP SO >X; ;BUFFERS DON'T CLOBBER IT. STAK