LDB BUFLG LOAD B WITH BUFFER LENGTH JSB .CRCC,I GO COMPUTE BUFFER CRCC STA CRCO1 SAVE CRCC CLA,CLE LDB CRCO2 OUTPUT CRCC MESSAGE JSB FMTR2,I CCA LDB CRCO1 OUTPUT CRCC WORD JSB FMTR2,I JMP CRCO0,I EXIT * CRCO1 NOP CRCO2 DEF *+1 ASC 12,CRCC = # OUTPUT BUFFER/ * * * CRCC ROUTINE *CALL: COMPUTES CYCLIC REDUNDANCY CHECK CHARACTER * LDA * LDB * JSB .CRCC,I * * * SEE 7970B MAGNETIC TAPE UNIT MAINTENANCE * TRAINING MANUAL PAGE C5 FOR EXPLAINATION * CRCC NOP STA TMP1 SAVE BUFFER ADDRESS CMB,INB MAKE B NEGATIVE STB COUNT SAVE BUFFER LENGTH CRCC1 EQU * LDB TMP1 LDA B,I LOAD DATA ALF,ALF SHIFT UPPER BYTE TO LOWER AND MK377 ISOLATE UPPER BYTE JSB PARIT GO ADD PARITY BIT JSB CRCR INPUT TO CRC REGISER LDB TMP1 LDA B,I LOAD DATA AGAIN AND MK377 ISOLATE LOWER BYTE JSB PARIT GO ADD PARITY BIT JSB CRCR INPUT TO CRC REGISTER ISZ TMP1 INCREMENT ADDRESS TO NEXT DATA ISZ COUNT IS IT THE LAST DATA? JMP CRCC1 NO-DO IT AGAIN CLA YES- COMPLETE CRC JSB CRCR INPUT TO CRC REGISTER XOR MSK24 COMPLEMENT ALL EXCEPT IBM 2&4 STA CRCC2 SAVE NON-INVERTED CRCC * * INVERT CRCC IN A REGISTER AND STORE IN B WITHOUT PARITY CLB,CLE CLEAR B AND E REG CRCC3 EQU * ALF,ALF MOVE TO UPPER BYTE ELA,CLE DROP OUT PARITY RAR,ERA SAVE BIT 0 ALF,ALF MOVE TO LOWER BYTE RAL,ELA INSERT BIT 0 ALF,ALF SHIFT TO UPPER BYTE JMP CRCC,I EXIT * CRCC2 NOP NON-INVERTED CRCC MSK24 OCT 753 COMPLEMENT CONSTANT (IBM 2&4) * * * * ADD PARITY BIT TO BYTE ROUTINE * *CALL: * JSB PARIT * LDA * * * * PARIT NOP CCE PRESET-E-TO"1" LDB .M8 LOAD B WITH MINUS 8 PARI1 EQU * SLA,RAR COMPLEMENT-E-FOR CME EVERY"1" IN INPUT DATA. AT ISZ B END,-E- CONTAINS PARITY BIT. JMP PARI1 RAR INSERT PARITY BIT INTO BYTE ELA ALF,ALF MOVE TO LOWER BYTE JMP PARIT,I EXIT * .M8 DEC -8 * * * SIMULATE CRCR- CRC REGISTER *CALL: * LDA * JSB CRCR * * * * * CRCR NOP STA CRCR3 SAVE A LDA CRCR1 LOAD OLD CRCC AND MK400 SZA IS IT ZERO? JMP CRCR4 NO-JUMP JMP CRCR5 CRCR4 EQU * LDA CRCR3 LOAD NEW BYTE XOR MSK74 OR WITH MASK 74B XOR CRCR1 OR WITH OLD CRCC JMP CRCR6 CRCR5 EQU * LDA CRCR3 LOAD NEW BYTE XOR CRCR1 OR WITH OLD CRCC CRCR6 EQU * CLE * REMOVE PARITY BIT FROM CRCC AND * SHIFT BACK ONE BIT ERA MOVE BIT 0 TO E ALF,ALF SHIFT TO UPPER BYTE ERA,RAL INSERT BIT 7 IN PARITY ALF,ALF SHIFT TO LOWER BYTE STA CRCR1 LDB CRCR3 CHECK A REG INPUT SZB IS IT ZERO? JMP CRCR,I NO-EXIT STB CRCR1 YES-CLEAR OLD CRCC JMP CRCR,I EXIT- CRCC IS IN A REG. * MSK74 OCT 74 COMPLEMENTS ITS 2-5 MK400 OCT 400 MASK FOR BIT 7 CRCR1 NOP OLD CRCC CRCR3 NOP TEMPORARY CRCR * * * COMPUTE CRCC FROM INPUT BUFFER * CRCI0 NOP JSB .CKIN,I CHECK FOR INPUT BUFFER LDA INBUF LOAD BUFFER ADDRESS LDB INBFL GET INPUT BUFFER LENGTH JSB .CRCC,I GO COMPUTE BUFFER CRCC STA CRCI1 SAVE CRCC CLA,CLE LDB CRCI2 OUTPUT CRCC MESSAGE JSB FMTR2,I CCA LDB CRCI1 OUTPUT CRCC WORD JSB FMTR2,I JMP CRCI0,I EXIT * CRCI1 NOP CRCI2 DEF *+1 ASC 11,CRCC = # INPUT BUFFER/ * * * * * COUNTER-INCREMENTS AND PRINTS A * NUMBER EACH TIME IT IS EXECUTED * CNT0 NOP STA AREG SAVE PERSET COUNT LDB AREG LDA CNT01 LOAD COUNTER SZA IS COUNTER ZERO? JMP CNT03 NO-CONTINUE SZB,RSS YES-IS THERE A PRESET VALUE? JMP CNT03 NO-EXIT ADB .M1 YES- SUBTRACT 1 STB CNT01 SAVE IT CNT03 EQU * ISZ CNT01 NO-INCREMENT COUNTER NOP CLA,CLE LDB CNT02 OUTPUT CURRENT COUNT JSB FMTR2,I CLA,INA LDB CNT01 OUTPUT # JSB FMTR2,I JMP CNT0,I EXIT * CNT02 DEF *+1 ASC 1,#/ * * FILLS OUTPUT BUFFER WITH A SPECIAL * WORD * WORD0 NOP STA AREG SAVE SPECIAL WORD STB BREG SAVE # OF TIMES TO BE REPEATED SZB,RSS IS THERE A BUFFER LENGTH? LDB BFMAX NO-GET MAX BUFFER STB WORD1 SETUP BUFFER LENGTH STA WORD2 SETUP DATA WORD LDA .1 LDB WORD3 JSB FILL,I GO FILL UP BUFFER DEF WORD4 RETURN WORD1 NOP BUFFER LENGTH DEF IRQ ERROR RETURN WORD4 EQU * JMP WORD0,I EXIT * WORD3 DEF *+1 POINTER TO DATA WORD2 NOP DATA WORD * * * COMPUTE LRCC FOR INPUT BUFFER * LRCI0 NOP JSB .CKIN,I CHECK FOR INPUT BUFFER LDA INBUF LOAD BUFFER ADDRESS LDB INBFL LOAD BUFFER LENGTH JSB .LRCC,I GO COMPUTE LRCC STA LRCI1 SAVE LRCC CLA,CLE LDB LRCI2 OUTPUT LRCC JSB FMTR2,I CCA LDB LRCI1 JSB FMTR2,I JMP LRCI0,I EXIT * LRCI1 NOP LRCC LRCI2 DEF *+1 ASC 11,LRCC = # INPUT BUFFER/ * * * COMPUTE LRCC FOR OUTPUT BUFFER * LRCO0 NOP JSB .CKOT,I CHECK FOR OUTPUT BUFFER LDA FWAM LOAD BUFFER ADDRESS LDB BUFLG LOAD BUFFER LENGTH JSB .LRCC,I GO COMPUTE LRCC STA LRCO1 SAVE LRCC CLA,CLE LDB LRCO2 OUTPUT LRCC JSB FMTR2,I CCA LDB LRCO1 JSB FMTR2,I JMP LRCO0,I EXIT * LRCO1 NOP LRCC LRCO2 DEF *+1 ASC 12,LRCC = # OUTPUT BUFFER/ * * * * COMPUTE LRCC *CALL * LDA * LDB * JSB LRCC * * * LRCC NOP STA LRCC1 SAVE ADDRESS STB LRCC2 SAVE LENGTH JSB .CRCC,I GO COMPUTE CRCC ALF,ALF SHIFT CRCC TO LOWER BYTE JSB .PRIT,I ADD PARITY STA LRCC3 SAVE CRCC CLA STA MASK SETUP MASK LDA LRCC1 GET ADDRESS STA TMP1 SETUP ADDRESS LDB LRCC2 CMB,INB STB COUNT SETUP COUNTER LRCC4 EQU * LDB TMP1 LDA B,I GET DATA ALF,ALF AND MK377 ISOLATE UPPER BYTE JSB .PRIT,I ADD PARITY XOR MASK INPUT TO LRCC REGISTER STA MASK LDB TMP1 LDA B,I GET DATA AND MK377 ISOLATE LOWER BYTE JSB .PRIT,I ADD PARITY XOR MASK COMPUTE LRC STA MASK ISZ TMP1 SETUP NEXT DATA ISZ COUNT FINISHED? JMP LRCC4 NO-LOOP LDA LRCC3 YES-GET CRCC XOR MASK COMPUTE LRC STA LRCC5 SAVE LRCC JMP LRCC,I EXIT-WITH CRCC IN A REG. * LRCC1 NOP BUFFER ADDRESS LRCC2 NOP BUFFER LENGTH LRCC3 NOP CRCC LRCC5 NOP FINAL LRCC * * TRAP0 NOP SETUP TRAP CELLS FOR INTERRUPTS STA AREG SAVE CHANNEL SELECT CODE ADA .N100 SUBTRACT 100 FROM SELECT CODE SSA,RSS IS THE SELECT CODE < 100 JMP TRAP4 NO-GO USE COMMAND CHANNEL LDA AREG RELOAD INPUT SELECT CODE ADA .M6 SUBTRACT 6 FROM SELECT CODE SSA,RSS IS THE SELECT CODE > 6? JMP TRAP5 YES-CONTINUE TRAP4 EQU * NO-USE COMMAND CHANNEL LDA CMD GET COMMAND CHANNEL SELECT CODE STA AREG SAVE IT FOR USE LATER TRAP5 EQU * STB TRAP2 SAVE LINE # FOR JMP SZB,RSS IS THE LINE # MISSING? JMP .OPLN,I YES-GO REPORT IT LDA AREG NO-SETUP TRAP CELL JSB INTJP,I FOR INTERRUPT DEF JMPIL BASE PAGE LINK DEF TRAP1 POINTER TO INTERRUPT ROUTINE JMP TRAP0,I EXIT * * TRAP1 EQU * LDA TRAP0 GET RETURN ADDRESS INA ADJUST RETURN STA TRAP3 SETUP RETURN FOR NEW LINE # LDA TRAP2 GET NEW LINE # JMP *+1,I GOTO NEW LINE NUMBER TRAP3 NOP RETURN ADDRESS TRAP2 NOP NEW LINE NUMBER * * SKP ORG PAG16 * SKIP TO NEXT PAGE OF MEMORY ******************************** * * COMPARE INPUT AND OUTPUT BUFFER ROUTINE * COMP0 NOP JSB .CKIN,I CHECK FOR INPUT BUFFER JSB .CKOT,I CHECK FOR OUTPUT BUFFER CLA CLEAR READ AND WRITE ER FLAGS STA RDERR STA WRERR JSB COMPR GO COMPARE BUFFERS JMP COMP0,I EXIT * * STC0 NOP SET CONTROL ROUTINE AND .77 GET SELECT CODE ADA STC01 ADD INSTRUCTION STA *+1 SAVE FOR EXECUTION NOP EXECUTE INSTRUCTION JMP STC0,I EXIT STC01 STC 0 * * CLC0 NOP CLEAR CONTROL ROUTINE AND .77 GET SELECT CODE ADA CLC01 ADD INSTRUCTION STA *+1 SAVE FOR EXECUTION NOP EXECUTE INSTRUCTION JMP CLC0,I EXIT CLC01 CLC 0 * * STF0 NOP SET FLAG ROUTINE AND .77 GET SELECT CODE ADA STF01 ADD INSTRUCTION STA *+1 SAVE FOR EXECUTION NOP EXECUTE INSTRUCTION JMP STF0,I EXIT STF01 STF 0 * * CLF0 NOP CLEAR FLAG ROUTINE AND .77 GET SELECT CODE ADA CLF01 ADD INSTRUCTION STA *+1 SAVE FOR EXECUTION NOP EXECUTE INSTRUCTION JMP CLF0,I EXIT CLF01 CLF 0 * * * * CKIN- CHECKS FOR INPUT BUFFER * IF IT DOES NOT EXIST-THEN EXITS * TO IRQ. * CKIN NOP STA AREG SAVE A AND B REGISTER STB BREG LDA INBFL CHECK INPUT BUFFER LENGTH SZA IS IT ZERO? JMP CKIN1 NO-CONTINUE JMP CKIN2 YES-ERROR EXIT CKIN1 EQU * LDA AREG RESTORE A AND B REGISTER LDB BREG JMP CKIN,I EXIT CKIN2 EQU * CLA,CLE LDB CKIN3 JSB FMTR2,I OUTPUT ERROR MESSAGE CLA,INA LDB CULN GET CURRENT LINE # JSB FMTR2,I OUTPUT IT JMP .IRQ,I ERROR EXIT * CKIN3 DEF *+1 ASC 13,NO INPUT BUFFER (LINE #)/ * * * CKOUT-CHECKS FOR OUTPUT BUFFER * IF IT DOES NOT EXIST-THEN EXITS * TO IRQ. * CKOUT NOP STA AREG SAVE A AND B REGISTER STB BREG LDA BUFLG CHECK OUTPUT BUFFER LENGTH SZA,RSS IS IT ZERO? JMP CKOT2 YES-ERROR EXIT LDA AREG RESTORE A AND B REGISTER LDB BREG JMP CKOUT,I EXIT CKOT2 EQU * CLA,CLE YES-ERROR LDB CKOT1 JSB FMTR2,I OUTPUT ERROR MESSAGE CLA,INA LDB CULN GET CURRENT LINE # JSB FMTR2,I OUTPUT IT JMP .IRQ,I ERROR EXIT * CKOT1 DEF *+1 ASC 13,NO OUTPUT BUFFER (LINE #)/ * * * * PCMND-EXTENDS NUMBER OF PROGRAM COMMANDS IN * OPERATOR DESIGN * .PCMD NOP CPA AIL IS IT AN INPUT BUFFER LENGTH JMP PBL0 YES-GO DO IT JMP .PCMD,I ERROR RETURN PBL0 EQU * CLA,CLE BEGIN FORMAT LDB BFCT1 JSB FMTR2,I OUTPUT MESSAGE CLA,INA SETUP INTEGER OUTPUT LDB INBFL GET BUFFER LENGTH JSB FMTR2,I OUTPUT NUMBER ISZ .PCMD ADJUST RETURN JMP .PCMD,I NORMAL EXIT * * AIL ASC 01,IL BUFFER LENGTH REQUEST * * BFCT1 DEF *+1 ASC 04,BF CT #/ * * HED 7970 (13181-13183) TAPE DIAGNOSTIC * * .STAR EQU * CLC INTP,C TURN I/O SYSTEM OFF LIA SW GET SELECT CODE AND OPTIONS STA USSC SAVE IT AND .77 ELIMINATE OPTIONS STA ORGSC SAVE SELECT CODE (DATA CHANNEL) LDB A CMB,INB CHECK THAT SC>7 ADB .7 SSB ? JMP *+3 OK GO ON HLT 73B NO JMP .STAR TRY AGAIN STA SC SETUP CURRENT SELECT CODE LDB IOIP2 SETUP DATA CHANNEL I/O JSB SCIN,I INSTRUCTIONS LDA ORGSC INA GET COMMAND CHANNEL SC STA SC SETUP CURRENT SELECT CODE LDB IOIP LOAD POINTER TO IO TABLE JSB SCIN,I GO SETUP I/O INSTRUCTIONS JSB DMACK CHECKS FOR DMA OPTIONS JSB ..TIM,I GO SETUP TIMING CONSTANTS JMP .STAR ERROR RETURN * HLT 74B ALLOW CHANGE IN SWITCH REGISTER LDA MEMO GET COMPUTER SIZE AND MK77K ISOLATE COMPUTER SIZE BITS CPA SW12 IS IT AN 8K COMPUTER? RSS YES-GO SETUP FOR 8K JMP .STR1 NO-SKIP OVER LDA .STR2 GET FIRST WORD OF RELEASABLE CORE STA FWAM SAVE IT AS FWAM LDA .STR3 GET HALT 102070 STA .STAR SAVE IT FOR HALT ON ENTRY LDA .STR1 GET JUMP TO 2000K INSTRUCTION STA .STAR+1 SAVE IT - TO PREVENT REENTRY .STR1 JMP BEGIN,I GO TO START OF DIAGNOSTIC * * .STR2 DEF .STAR+2 .STR3 OCT 102070 * * HED 7970 TIMING SUBROUTINES AND TABLES * * * .TIME-SETUP FOR TIMING TABLES ON BASE PAGE *CALL: * JSB ..TIM,I * * * .TIME NOP LDA USSC LOAD OPTIONS ALF,ALF MOVE 13181/183 OPTIONS TO LOW BYTE AND .17 MASK OFF 13183/181 BITS CPA .10 IS IT 13183 WITH DMA? JMP .TI11 YES-GO SET IT UP CPA .4 IS IT 13181? JMP .TI12 YES-GO SET IT UP CPA .12 IS IT 13183 WITHOUT DMA? JMP .TI13 YES-GO SET IT UP JMP .TI14 NONE OF THE ABOVE-ERROR EXIT * .12 OCT 12 MASK CONSTANT * .TI11 EQU * LDA .TI18 SETUP 13183 HEADER MESSAGE STA HDMP LDA DMAFG IS THERE ANY DMA? SZA JMP .TI15 YES-CONTINUE HLT 71B NO-HALT JMP .TIME,I ERROR EXIT .TI15 EQU * CCA SETUP TAPE TYPE FLAG-13183 STA FG183 LDA MSKIO LOAD IO MASK ADA MSKST ADD IN SINGLE TRACK ERROR BIT STA MSKIO SAVE MASK LDA .2 STA FGDMA SETUP CHANNEL 2 DMA LDB .TIM2 LOAD 13183 TIME TABLE POINTER JMP .TI16 GO CHECK SPEED * .TI12 EQU * LDA .TI17 LOAD 13181 HEADER MESSAGE STA HDMP CLA STA FGDMA CLEAR DMA FLAG STA FG183 SETUP TAPE TYPE FLAG-13181 LDA MKIO GET IO MASK STA MSKIO SAVE MASK LDB .TIM1 JMP .TI16 SETUP 13181 TIME TABLE POINTER MKIO OCT 4022 * .TI13 EQU * LDA .TI18 SETUP 13183 HEADER MESSAGE STA HDMP CLA STA FGDMA SETUP NO DMA FLAG LDA .1 STA FG183 SETUP TAPE TYPE FLAG-13183 LDB .TIM2 SETUP 13183 TIME TABLE POINTER JMP .TI16 GO CHECK SPEED * .TI17 DEF HDMS1 POINTER TO 13181 HEADER MESSAGE .TI18 DEF HDMS2 POINTER TO 13183 HEADER MESSAGE * .TI16 EQU * BEGIN SPEED CHECK ROUTINE LDA USSC GET OPTIONS ALF MOVE TAPE SPEEDS TO LOWER BITS AND .17 ISOLATE TAPE SPEED BITS CPA .10 IS IT 45 IPS? JMP .TIM3 YES-GO LOAD TABLE CPA .4 IS IT 37.5 IPS? JMP .TIM4 YES-GO LOAD TABLE CPA .2 IS IT 25 IPS? JMP .TIM5 YES-GO LOAD TABLE CPA .1 IS IT 12.5 IPS? JMP .TIM6 YES - GO LOAD TABLE * .TI14 EQU * NO-NONE OF THE ABOVE-ERROR EXIT HLT 72B ERROR HALT JMP .TIME,I ERROR EXIT * .TIM6 EQU * 12.5 IPS TABLE ADB .7 ADJUST POINTER ADDRESS .TIM5 EQU * 25 IPS TABLE ADB .7 ADJUST POINTER ADDRESS .TIM4 EQU * 37.5 IPS TABLE ADB .7 ADJUST POINTER ADDRESS .TIM3 EQU * 45 IPS TABLE * LOAD UP TIMING TABLE TO BASE PAGE LDA TIME STA .TIM8 SETUP POINTER TO BASE PAGE LDA .M7 STA .TIM9 SETUP LOOP COUNTER .TI10 EQU * LDA B,I LOAD TIMING CONSTANT STA .TIM8,I TRANSFER TO BASE PAGE INB INCREMENT TABLE POINTER ISZ .TIM8 INCREMENT BASE PAGE POINTER ISZ .TIM9 IS THIS THE 7TH TRANSFER? JMP .TI10 NO-GO DO IT AGAIN ISZ .TIME YES-ADJUST POINTER FOR RETURN JMP .TIME,I EXIT ROUTINE * .M7 DEC -7 LOOP CONSTANT .TIM8 NOP BASE PAGE POINTER .TIM9 NOP LOOP COUNTER * * * * * * MANY OF THE TIME CONSTANTS WERE EMPIRICALLY DETERMINED * * TIME DELAY TABLES * * UNIT TYPE SPEED * .TIM1 DEF *+1 DEC 1 13181 REW 45 IPS DEC 8 " WRITE " DEC 10 " CLEAR " DEC 104 " GAP " DEC 14 " IRG " DEC 15 " MIN BYTE " DEC 19 " MAX BYTE " * DEC 1 " REW 37.5 IPS DEC 10 " WRITE " DEC 12 " CLEAR " DEC 125 " GAP " DEC 16 " IRG " DEC 18 " MIN BYTE " DEC 23 " MAX BYTE " * DEC 2 " REW 25.0 IPS DEC 14 " WRITE " DEC 18 " CLEAR " DEC 187 " GAP " DEC 24 " IRG " DEC 27 " MIN BYTE " DEC 35 " MAX BYTE " * DEC 3 " REW 12.5 IPS DEC 29 " WRITE " DEC 35 " CLEAR " DEC 374 " GAP " DEC 48 " IRG " DEC 54 " MIN BYTE " DEC 69 " MAX BYTE " * * .TIM2 DEF *+1 DEC 1 13183 REW 45.0 IPS DEC 11 " WRITE " DEC 10 " CLEAR " DEC 60 " GAP " DEC 15 " IRG " DEC 11 " MIN BYTE " DEC 15 " MAX BYTE " * DEC 1 " REW 37.5 IPS DEC 13 " WRITE " DEC 12 " CLEAR " DEC 72 " GAP " DEC 17 " IRG " DEC 13 " MIN BYTE " DEC 18 " MAX BYTE " * DEC 2 " REW 25.0 IPS DEC 20 " WRITE " DEC 18 " CLEAR " DEC 108 " GAP " DEC 26 " IRG " DEC 20 " MIN BYTE " DEC 27 " MAX BYTE " * DEC 3 " REW 12.5 IPS DEC 40 " WRITE " DEC 35 " CLEAR " DEC 216 " GAP " DEC 52 " IRG " DEC 39 " MIN BYTE " DEC 54 " MAX BYTE " * * FWAA EQU * FIRST WORD OF AVAILABLE MEMORY END