* SUBROUTINE TO COMPARE RECEIVED DATA WITH MEMORY BLOCK * TESTS 8, 9, 12, 13 * COMPA NOP ENTRY POINT LDA LPCNT SET UP COUNTER STA CNTR JSB RESET RESET POINTERS * COMPB LDA SCNT,I COMPARE WORDS CPA DCNT,I JMP *+4 GOOD COMPARISON ISZ COMPA * LDA .1 SET ERROR CODE JMP COMPA,I ERROR EXIT * ISZ SCNT INCREMENT POINTERS ISZ DCNT ISZ CNTR ARE WE DONE? JMP COMPB NO, DO AGAIN JMP COMPA,I EXIT SPC 4 * SUBROUTINE TO WAIT FOR INTERRUPT * AFTER DATA TRANSFER * TEST 9 * TIMER NOP ENTRY POINT LDA .ME3 SET UP COUNTER STA ECNT LDA INFLG CHECK INTERRUPT FLAG SZA,RSS NOT CLEAR YET? JMP TIMER,I IS CLEAR, EXIT ISZ ECNT JMP *-4 CONTINUE * ERTIM LDA .7 ERROR CODE = 7 ISZ TIMER JMP TIMER,I ERROR EXIT SPC 4 * SUBROUTINE TO WAIT N MS - NON-ERROR * TESTS 10, 12, 13 * WAIT NOP ENTRY POINT LDA TIME GET WAIT TIME JSB TMR,I GO AND WAIT JMP WAIT,I EXIT * TIME NOP SKP * SUBROUTINE TO CHECK WATCHDOG TIMEOUT * TEST 10 * WDO NOP ENTRY POINT LDB .1 SET ERROR CODE WSC1 SFS TSC DID WDO SET FLAG? JMP WDOER INB BE WSC2 CLC TSC WSC3 LIA TSC,C GET STATUS WORD AND .10 AND FOR WDO BIT SZA,RSS SKIP IF THERE JMP WDOER NOT THERE, IS ERROR JMP WDO,I GOOD EXIT * WDOER LDA B GET ERROR CODE ISZ WDO JMP WDO,I SPC 4 * SUBROUTINE TO SET TSC INTERRUPT CELL FOR RECEIVE MODE * AND ENABLE INTERRUPTS * TEST 9 * ENINR NOP ENTRY POINT LDA ISR GET INSTRUCTION FOR INTERRUPT STA SC,I PUT IN APPROPRIATE CELL STF 0 ENABLE INTERRUPT SYSTEM ESC1 STC TSC ENABLE HWSIC ESC7 LIA TSC,C DUMMY LOAD ESC14 CLF TSC CLEAR JUST IN CASE JMP ENINR,I EXIT * ISR JSB *+1,I DEF SERVR RECEIVE INTP SERVICE ADDRESS SKP * RECEIVE INTERRUPT SERVICE * TEST 9 * SERVR NOP ENTRY POINT CLC 0,C DISABLE INTERRUPTS STA SAVEA SAVE A REG STB SAVEB SAVE B REG ESC2 LIA TSC,C GET WORD STA DCNT,I STORE IN RCVR BUFFER ISZ DCNT INCREMENT POINT CLA STA INFLG CLEAR INTP FLAG FOR TIMER LDA SAVEA RESTORE A REG LDB SAVEB RESTORE B REG JMP SERVR,I EXIT * INFLG NOP SAVEA NOP SAVEB NOP SPC 4 * TRANSMIT FOR 1 CPU CONFIGURATION * TESTS 8 THRU 13 * FXMIT NOP ENTRY POINT LDA SCNT,I GET WORD TO SEND ISZ SCNT INCREMENT POINTER STA INFLG SET INTP FLAG FOR TIMER FXSC1 OTA TSC,C SEND WORD FXSC2 CLF TSC CLEAR TRANSMIT FLAG JMP FXMIT,I EXIT SPC 4 * CHECK CLEAR CRC (NO ERROR IN STATUS WORD) * TESTS 11, 12 * CCRC NOP ENTRY POINT LDA ERROR AND .2 MASK TO ERROR BIT SZA SKIP IF NOT THERE - GOOD ISZ CCRC IS ERROR JMP CCRC,I EXIT SKP * SUBROUTINE TO CLEAR LISTEN-REPEAT MODE * TEST 14 * LRCLR NOP ENTRY POINT LDA .10 SET BIT3 FOR (MASTER CLEAR) STA WORD CONTROL WORD JSB CWORD OUTPUT WORD JMP LRCLR,I EXIT SPC 4 * SUBROUTINE TO SEND A BLOCK (100 WORDS) TO RCVR WITH * INTERRUPT ENABLED. WILL SEND A WORD EVERY MS. * TEST 9 * XMTI NOP ENTRY POINT LDA LPCNT SET UP COUNTER STA CNTR FOR 100 WORDS XMT1 LDA SCNT,I GET WORD FROM MEMORY * ESC5 OTA TSC,C SEND IT TO OTHER CPU ISZ SCNT INCREMENT POINTER ISZ CNTR DONE YET? RSS NO, NOT YET JMP XMTI,I YES, EXIT * LDA .1 DO A 1 MS TIMER JSB TMR,I JMP XMT1 CONTINUE SKP * SUBROUTINE FOR RCVR CPU TO RECEIVE WORDS * WITH INTERRUPT ENABLED * TEST 9 * RCVI NOP ENTRY POINT LDA LPCNT STA CNTR SET WORD COUNT = 100 LDA ISR2 STA SC,I SET INTERRUPT CELL * STF 0 ENABLE INTERRUPTS ESC4 STC TSC ENABLE HWSIC ESC6 LIA TSC DUMMY LOAD * ESC3 LIA TSC,C GET RECEIVED WORD STA DCNT,I SAVE IN BUFFER ISZ DCNT INCREMENT BUFFER POINTER ISZ CNTR DONE YET? JMP *+3 NO, NOT YET CLC 0,C DISABLE INTERRUPTS JMP RCVI,I YES, EXIT * LDA .17 DO A 15 MS TIMEOUT JSB TMR,I CLC 0,C DISABLE INTERRUPTS LDA .7 OOPS, TIMED OUT ISZ RCVI JMP RCVI,I ERROR EXIT * ISR2 JMP *+1,I DEF ESC3 SPC 2 * SUBROUTINE TO XMIT AND SET UP HANDSHAKE MODE * TEST 13 * HXMIT NOP ENTRY POINT LDB SCNT,I GET 1ST WORD TO SEND ISZ SCNT INCREMENT POINTER LDA WORD GET CONTROL BIT IOR TYPE CRC KIND IOR BIT12 DISABLE CONSTANT ONES * HXSC1 OTB TSC,C SEND 1ST WORD HXSC3 CLC TSC HXSC4 OTA TSC,C OUTPUT CONTROL WORD LDB SCNT,I HXSC5 OTB TSC,C LOAD SECOND WORD * ISZ SCNT INCREMENT POINTER ISZ CNTR INCREMENT LOOP COUNT ISZ DEFL SKIP XMIT FIRST TIME JMP HXMIT,I EXIT SKP * SUBROUTINE TO CHECK IF FLAG WAS SET BY STATUS WORD * TESTS 8, 10 THRU 15 * CHFLG NOP ENTRY POINT CLA RESET ERROR STA ERROR FOR THIS CHECK CHSC1 CLC TSC CHSC2 LIA TSC,C GET STATUS WORD SZA,RSS IS ANYTHING SET? JMP CHFLG,I NO, IS OK * STA ERROR SAVE FOR ERROR MESSAGE AND BITS MASK OUT BITS 0,1,3 SZA,RSS IS ANYTHING SET? JMP CHFLG,I NO, IS OK LDA .10 10 = ERROR CODE ISZ CHFLG JMP CHFLG,I ERROR EXIT * ERROR NOP SPC 3 * DUMMY SUBROUTINE TO FILL DEF LIST * TEST 9 * DUMMY NOP ENTRY POINT JMP DUMMY,I EXIT SPC 3 * SUBROUTINE TO OUTPUT COMPLETION MESSAGE * TESTS 8 THRU 15 * GOOD NOP ENTRY POINT JSB MS,I OUTPUT MESSAGE DEF TSTX,I RETURN POINT DEF *+1 MESSAGE ADDRESS ASC 5,COMPLETED/ SPC 3 * MESSAGE TO WRONG CONFIGURATION * TESTS 13 THRU 15 * NONO NOP ENTRY POINT JSB ER,I REPORT ERROR DEF TSTX,I RETURN POINT DEF *+3 MESSAGE ADDRESS NOP CONTENTS FOR A REG OCT -1 B REG ASC 17,THIS CONFIGURATION CANNOT RUN THIS ASC 3, TEST/ SKP * SUBROUTINE TO RESET SOURCE AND DESTINATION * TESTS 12, 13 * RESET NOP ENTRY POINT LDA SOURC IT IS STA SCNT SELF LDA DEST EXPLANATORY STA DCNT JMP RESET,I EXIT SPC 2 * SUBROUTINE TO SET A SPECIAL CONTROL WORD * TESTS 10 THRU 15 * CWORD NOP ENTRY POINT LDB TST# CHECK FOR SPECIAL CASES CPB T13 IS IT HANDSHAKE? JSB INIT2 IF YES INITIALIZE LDA WORD GET BITS THAT HAVE BEEN SET CPB BIT23 CRC TRANSMIT (TEST 12) RSS SKIP IF YES IOR TYPE GET CRC KIND IOR BIT12 DISABLE CONSTANT ONES CWSC1 CLC TSC CWSC2 OTA TSC,C SEND IT JMP CWORD,I EXIT * WORD NOP SPC 2 * SUBROUTINE TO CHECK IF CRC TO CRC EQUALS ZERO * TEST 12 * ZERO NOP ENTRY POINT LDA DEST,I GET THE WORD SZA,RSS JMP ZERO,I OK, IT EQUALS ZERO STA CRC SAVE IT FOR MESSAGE LDA .17 SET ERROR CODE ISZ ZERO JMP ZERO,I ERROR EXIT * CRC NOP SPC 2 * SET CRC KIND TO RCVR * TEST 12 (1 CPU CONFIGURATION) * FCRC NOP ENTRY POINT LDA BIT10 RESET TYPE FOR CRC STA TYPE IOR BIT12 DISABLE CONSTANT ONES ISC5 CLC TSC ISC6 OTA TSC,C SET CONTROL WORD JMP FCRC,I SKP * ROUTINE TO TRANSMIT AND ACCUMULATE CRC * TEST 12 * CXMIT NOP ENTRY POINT LDB SCNT,I GET WORD TO SEND ISZ SCNT INCREMENT POINTER CXSC1 OTB TSC,C SEND WORD CXSC2 CLF TSC CLEAR TRANSMIT FLAG * JSB CACRC CALCULATE CRC JMP CXMIT,I EXIT SPC 2 CACRC NOP ENTRY POINT LDA .M16 SET UP LOOP COUNTER STA CONTR LDA REM1 GET OLD CRC XOR B NEW WORD CLE,SLA,ERA XOR POLY1 POLYNOMIAL ISZ CONTR DONE? JMP *-3 NO STA REM1 YES, SAVE CRC JMP CACRC,I EXIT SPC 3 * COMPARE RECEIVED CRC WITH CALCULATED CRC * TEST 12 * COMPS NOP LDA DEST,I GET RECEIVED WORD CPA REM1 COMPARE WITH CALC. CRC JMP COMPS,I OK, EXIT LDA .6 ERROR CODE = 6 ISZ COMPS JMP COMPS,I ERROR EXIT * CONTR NOP REM1 NOP POLY1 OCT 120001 SPC 3 * ROUTINE TO RECEIVE AND ACCUMULATE CRC * TEST 12 * CRCVR NOP ENTRY POINT CRSC1 LIB TSC,C GET RECEIVED WORD STB DCNT,I STORE IN MEMORY ISZ DCNT INCREMENT POINTER JSB CACRC CALCULATE CRC JMP CRCVR,I EXIT SKP * SUBROUTINE TO TRANSMIT SPECIAL WORD * TESTS 13, 15 * SXMIT NOP ENTRY POINT LDA SWORD GET SPECIAL HANDSHAKE WORD SSC1 OTA TSC,C LOAD IT SSC3 CLF TSC CLEAR TRANSMIT FLAG JMP SXMIT,I EXIT * SWORD OCT 123456 NOP SPC 4 * SUBROUTINE TO RECEIVE SPECIAL WORD * TESTS 13, 15 * SRCVR NOP ENTRY POINT SSC2 LIA TSC,C RECEIVE HANDSHAKE WORD STA SWORD+1 SAVE IT JMP SRCVR,I EXIT SPC 4 * SUBROUTINE TO COMPARE SPECIAL WORDS * TESTS 13, 15 * COMP1 NOP ENTRY POINT LDA SWORD GET TRANSMITTED WORD LDB SWORD+1 GET RECEIVED WORD CPA B COMPARE THEM JMP COMP1,I GOOD - EXIT LDA .17 ERROR CODE = 17 ISZ COMP1 JMP COMP1,I ERROR RETURN SPC 4 * SUBROUTINE TO CLEAR CONTROL WORD * TEST 13 * CLEAR NOP ENTRY POINT LDA WORD SAVE CONTROL BIT STA TMP FOR LATER USE CLA STA WORD JSB CWORD OUTPUT WORD LDA TMP RESTORE CONTROL BIT STA WORD JMP CLEAR,I EXIT SKP * ENABLE INTERRUPT & SET TRAP CELL OF INTFACE WITH JMP,I * TESTS 14, 15 * ENINT NOP ENTRY POINT LDA ESR STA SC,I SET INTERRUPT CELL STF 0 ENABLE INTERRUPT ESC8 STC TSC ENABLE HWSIC ESC9 LIA TSC,C DUMMY LOAD JMP ENINT,I EXIT * ESR JMP *+1,I DEF SEINT SPC 4 * INTERRUPT SERVICE ROUTINE * TESTS 14, 15 * SEINT CLC 0,C DISABLE INTERRUPT SYSTEM STF 6 ABORT A POSSIBLE DMA TRANSFER CLC 6,C & BRING DMA INTO RESET CONDITION ESC10 CLC TSC ESC11 LIA TSC,C GET STATUS WORD STA ERROR SAVE FOR TAG? ESC12 LIA TSC,C GET COMPARE WORD STA SWORD+1 SAVE FOR COMP1 JMP SLOOP,I RETURN TO NORMAL FLOW SPC 4 * SUBROUTINE TO WAIT FOR INTERRUPT * TESTS 14, 15 * SLOOP NOP ENTRY POINT CLA SET UP COUNTS STA TMP FOR ABORT WAIT LOOP LDB .M100 STB ECNT * SLOO2 LDB .4 CHECK IF ABORT JSB SWR,I JMP SLOO1 ABORT * ISZ TMP LITTLE COUNTER JMP SLOO2 CHECK IF ABORT ISZ ECNT BIG COUNTER JMP SLOO2 CHECK IF ABORT * SLOO1 JSB .WAIT WAIT FOR BIT OFF ISZ SLOOP ABORT EXIT LDA .2 ERROR CODE = 2 JMP SLOOP,I EXIT SKP * SUBROUTINE TO CHECK FOR TAG BIT * TEST 15 * * TAG1 NOP ENTRY POINT LDA ERROR GET STATUS WORD AND .1 MASK TO TAG BIT SZA IS IT THERE? JMP TAG1,I YEP, EXIT LDA .7 ERROR CODE = 7 ISZ TAG1 JMP TAG1,I ERROR EXIT SPC 4 * SUBROUTINE TO SET TAG BIT IN CONTROL WORD * TESTS 14, 15 * STAG NOP ENTRY POINT LDA .100 GET TAG BIT STA WORD JSB CWORD OUTPUT WORD JMP STAG,I EXIT SPC 4 * SUBROUTINE TO SET LISTEN-REPEAT IN CONTROL WORD * TEST 14 * LRCWD NOP ENTRY POINT LDA BIT14 GET LISTEN-REPEAT BIT STA WORD JSB CWORD OUTPUT WORD JMP LRCWD,I EXIT SKP * SUBROUTINE TO OUTPUT ADDRESS IN LISTEN-REPEAT * TEST 14 * LRS NOP ENTRY POINT LDA ADDR GET CURRENT ADDRESS T13C5 OTA TSC,C OUTPUT IT T13C6 CLF TSC CLEAR OUTPUT FLAG JMP LRS,I EXIT SPC 4 * SUBROUTINE TO RECEIVE REPEATED WORD * TEST 14 * LRG NOP ENTRY POINT T13C8 CLC TSC LOAD STATUS WORD TO CLEAR T13C9 LIA TSC,C TAG BIT T13C7 LIA TSC,C GET REPEATED WORD CPA ADDR DOES IT COMPARE? JMP LRG,I YES, EXIT STA WADDR SAVE FOR MESSAGE LDA .3 ERROR CODE = 3 ISZ LRG JMP LRG,I ERROR EXIT SPC 4 * SUBROUTINE TO INCREMENT ADDRESS AND LOOP THRU DEF LIST * TEST 14 * LRLOP NOP ENTRY POINT LDA ADDR GET LAST ADDRESS CPA MAXNM IS IT MAXIMUM? JMP LRLOP,I YES, EXIT ADA .2 INCREMENT IT STA ADDR LDA DEFL DECREMENT DEF LIST ADA .M7 STA DEFL JMP LRLOP,I EXIT SKP * SUBROUTINE TO WAIT FOR RECOGNITION WORD AND CHECK IT * TEST 14 * SHPAS NOP ENTRY POINT LDA BIT8 WAIT FOR RECOGNITION WORD CMA,INA FOR ABOUT 1 MS STA CNTR (IF IT COMES) ISZ CNTR JMP *-1 * T13C1 SFS TSC DID FLAG GET SET? JMP SHPAS,I NOPE, EXIT T13C2 CLC TSC T13C3 LIA TSC,C GET STATUS WORD T13C4 LIB TSC,C GET ADDRESS WORD STB WADDR SAVE FOR MESSAGE AND .1 CHECK TAG NOT THERE SZA GOOD - NO TAG JMP SHPA2 ERROR CODE = 4 * CPB ADDR GOOD RECOGNITION? JMP SHPA3 YES, DO CLEAN UP LDA .5 ERROR CODE = 5 ISZ SHPAS JMP SHPAS,I ERROR EXIT SHPA2 LDA .4 JMP *-3 SKP SHPA3 LDA PNTR GET POINTER TO WORDS WITH BITS STA PNTRS TO INDICATE RECOGNIZED ADDRESS LDA .M3 STA CNTR LDA .16 IN FIRST WORD? BRS DIVIDE ADDRESS BY 2 CMB,INB MAKE NEGATIVE ADA B SSA,RSS TOO BIG? JMP OUT IS FIRST WORD * SHPA4 ISZ PNTRS INCREMENT POINTER ADA .16 IN NEXT WORD? SSA,RSS TOO BIG? JMP OUT IS SECOND WORD ISZ CNTR JMP SHPA4 * LDA .6 IMPOSSIBLE ADDRESS! ISZ SHPAS ERROR CODE = 6 JMP SHPAS,I ERROR EXIT * OUT STB CNTR STRIP BIT FROM WORD CLB,INB SET LSB RSS RBL ISZ CNTR FOUND IT? JMP *-2 NO, KEEP ROTATING BIT * LDA PNTRS,I GET CORRECT BIT WORD XOR B DELETE BIT STA PNTRS,I REPLACE WORD * LDA ADDR HAVE WE FINISHED? CPA MAXNM MAXNM = 176 JMP SHPAS,I YES, EXIT CLA RESET ADDRESS TO RUN THRU AGAIN STA ADDR JMP SHPAS,I EXIT AT LAST SKP * SUBROUTINE TO CHECK IF ANY ADDRESS NOT RECOGNIZED * AND OUTPUT MESSAGES IF SO * TEST 14 * NOREC NOP ENTRY POINT CLA CLEAR ERROR INDICATOR STA NOR1 STA WADDR CLEAR ADDRESS ACCUMULATOR LDA .M4 SET UP COUNTER FOR 4 WORDS STA CNTR TO CHECK LDA PNTR SET UP POINTER TO WORDS STA PNTRS * NOR2 LDA PNTRS,I GET BIT INDICATOR WORD SZA SKIP IF ALL CLEAR JSB NOR1 FIND BIT(S) SET * LDB WADDR INCREMENT ADDRESS ACCUMULATOR ADB .16 STB WADDR ISZ PNTRS INCREMENT POINTER TO WORDS ISZ CNTR DONE YET? JMP NOR2 NO, CONTINUE * LDA NOR1 WAS THERE AN ERROR? SZA SKIP IF NOT ISZ NOREC LDA .7 ERROR CODE = 7 JMP NOREC,I * NOR1 NOP ENTRY POINT CLB SET FOR INITIAL BIT INB CLE,ERA ROTATE LSB OUT SEZ SKIP IF BIT NOT SET * JSB NOROT OUTPUT MESSAGE SZA,RSS IS THAT ALL IN WORD? JMP NOR1,I YES EXIT JMP NOR1+2 NO CONTINUE SKP * NOROT NOP ENTRY POINT STA SAVEA SAVE THE REGISTERS STB SAVEB ADB WADDR ADD ADDRESS ACCUMULATOR BLS *2 STB NOR3 SAVE FOR MESSAGE * JSB ER,I REPORT ERROR DEF NOR4 RETURN POINT DEF ADREC MESSAGE ADDRESS NOR3 NOP A REG NOP B REG * NOR4 LDA SAVEA RESTORE THE REGISTERS LDB SAVEB JMP NOROT,I EXIT SKP