/ P?S/8 LINCTAPE BLOCK-ODT XLIST OFF IFNDEF OFF IFNDEF ON XLIST ON / LAST EDIT: 17-APR-1986 10:00:00 CJL / MUST BE ASSEMBLED WITH '/J' SWITCH SET. / DEFINITIONS. BLKSIZE=0400 /256 WORDS/BLOCK COM= 0017 /COMPLEMENT ACCUMULATOR IACS= 6163 /LOAD LINC "S" REGISTER INCON= 0031 /EQUATED FROM CONSOLE! JMSC= JMS . /CURRENT PAGE JMS INSTRUCTION LDA= 1000 /LOAD ACCUMULATOR LINC= 6141 /GOTO LINC MODE NL0001= CLA IAC /LOAD AC WITH 0001 NL0002= CLA CLL CML RTL /LOAD AC WITH 0002 NL4000= CLA CLL CML RAR /LOAD AC WITH 4000 NL7775= CLA CLL CMA RTL /LOAD AC WITH 7775 NL7776= CLA CLL CMA RAL /LOAD AC WITH 7776 NL7777= CLA CMA /LOAD AC WITH 7777 OUTCON= 0033 /EQUATED FROM CONSOLE! PDP= 0002 /GOTO PDP-8 MODE SBOOT= 7600 /SYSTEM BOOTSTRAP ADDRESS SBTFUN= 7602 /SYSTEM BOOTSTRAP FUNCTION SCR= 0340 /SCALE RIGHT SCRSIZE=7611 /SYSTEM CORE SIZE WORD SYSIO= 7640 /SYSTEM I/O ENTRY TTY= 0003 /CONSOLE TTY: DEVICE CODE XLIST OFF IFNDEF WMOVE XLIST ON WMOVE= JMS I [WRDMOV]/WORD MOVE ROUTINE WRITE= 4000 /SYSIO WRITE BIT / DEPENDENT DEFINITIONS. JMSSYSI=SYSIO&177+JMSC /CALL TO SYSIO FROM ITS PAGE KEYCODE=TTY^10+6000 /SKELETON KEYBOARD CODE PRTCODE=TTY+1^10+6000 /SKELETON TELEPRINTER CODE KCCIOT= KEYCODE+2 /CLEAR KEYBOARD FLAG, AC, SET READER RUN KRBIOT= KEYCODE+6 /CLEAR KEYBOARD FLAG, LOAD CHARACTER INTO AC, /SET READER RUN KRSIOT= KEYCODE+4 /OR CHARACTER INTO AC, DON'T CLEAR KEYBOARD FLAG KSFIOT= KEYCODE+1 /SKIP ON KEYBOARD FLAG TLSIOT= PRTCODE+6 /LOAD OUTPUT BUFFER, CLEAR FLAG TSFIOT= PRTCODE+1 /SKIP ON OUTPUT FLAG PAGE 0 /START AT THE BEGINNING ADDRESS,.-. /ADDRESS TEMPORARY CASE, .-. /CURRENT CASE MODE CNT, .-. /TEMPORARY IOERCT, .-. /I/O ERROR RETRY COUNTER P7TEMP, .-. /TEMPORARY RESW, -1 /BUFFER RESIDENT SWITCH SHUT, .-. /OPEN/CLOSED LOCATION INDICATOR STORFLG,0 /DIRTY BUFFER SWITCH *10 /DEFINE AUTO-INDEX AREA XR1, .-. /AUTO-INDEX NUMBER 1 XR2, .-. /AUTO-INDEX NUMBER 2 XR3, .-. /AUTO-INDEX NUMBER 3 CONTEMP,.-. /TEMPORARY FOR CONTROL PRINT ECHOSW, 0 /ECHO SWITCH INCHAR, .-. /INPUT BUFFER INTSW, 0 /INTERNAL MEMORY SWITCH OCHAR, 0 /OCTAL PRINTOUT SPECIAL *20 /GET PAST AUTO-INDEX AREA CHKUNT, .-. /SEARCH UNIT CHKBLK, 0 /SEARCH BLOCK CHKADR, 0 /SEARCH ADDRESS CURUNT, .-. /CURRENT UNIT CURBLK, 0 /CURRENT BLOCK CURADR, 0 /CURRENT ADDRESS DMPUNT, .-. /"\" UNIT DMPBLK, .-. /"\" BLOCK DMPADR, .-. /"\" ADDRESS NUMB, .-. /NUMERICAL ARGUMENT PRVUNT, .-. /PREVIOUS UNIT PRVBLK, .-. /PREVIOUS BLOCK PRVADR, .-. /PREVIOUS ADDRESS SCRPTR, .-. /SCRIBE'S MESSAGE POINTER TEMP, .-. /TEMPORARY TEMP2, .-. /TEMPORARY TOTAL, .-. /DIGIT COUNTER WORD, .-. /SEARCH WORD WTSW, .-. /WORD SEARCH TEST SWITCH /------------------- THE FOLLOWING MUST BE IN ORDER. --------------------- / ! MASK, 7777 /WORD SEARCH MASK ! HOME, 0000 /HOME POSITION OF SEARCH (LOWER LIMIT) ! UPPER, 0000 /UPPER LIMIT OF SEARCH ! OTCONTR,1 /MEMORY SEARCH, DUMP OUTPUT CONTROL WORD ! VIEWCON,20 /MEMORY DUMP VIEW CONTROL WORD ! UNIT, .-. /UNIT FOR SEARCH ! / ! /------------------------------------------------------------------------- P7CH, .-. /SEVEN-BIT OUTPUT ROUTINE DCA P7TEMP /SAVE PASSED VALUE P7AGN, JMS I [CHKUP] /CHECK FOR <^C>, ETC. TAD ECHOSW /GET ECHO SWITCH SPA CLA /SKIP IF ECHO ON JMP P7OFF /JUMP IF NOT TAD P7TEMP /GET THE CHARACTER JMS P7OUT /TRY TO OUTPUT IT JMP P7AGN /CHECK INPUT WHILE WAITING P7OFF, JMS I [CHKUP] /CHECK FOR <^C>, ETC. JMP I P7CH /RETURN P7OUT, .-. /SEVEN BIT I/O ROUTINE P7TSF, TSFIOT /**** CONSOLE **** CIF MCS+10 P7JMP, JMP I P7OUT /**** CONSOLE **** JMS OUTCON P7TLS, TLSIOT /**** CONSOLE **** JMP I P7OUT L7600, CLA!400 /CLEAN UP ISZ P7OUT /BUMP RETURN ADDRESS JMP I P7OUT /RETURN P6CH, .-. /SIX-BIT PRINT ROUTINE TAD [" &77] /INVERT IT AND [77] /JUST SIX-BIT TAD [" &77] /NOW HAVE ASCII JMS P7CH /GO PRINT IT JMP I P6CH /RETURN CONTPRT,.-. /CONTROL CHARACTER PRINT ROUTINE DCA CONTEMP /SAVE PASSED VALUE TAD ["^&177] /GET AN "^" JMS P7OUT /PRINT IT JMP .-1 /WAIT FOR IT TAD CONTEMP /GET PASSED CHARACTER JMS P7OUT /PRINT IT JMP .-1 /WAIT FOR IT JMP I CONTPRT /RETURN CTLCTST,.-. /CHECK FOR <^C>, ETC. CLA /CLEAN UP CHKKSF, KSFIOT /**** CONSOLE **** CIF MCS+10 CHKJMP, JMP I CTLCTST /**** CONSOLE **** JMS INCON CHKKRS, KRSIOT/OR KRBIOT /**** CONSOLE **** JMP I CTLCTST AND [177] /JUST SEVEN BITS DCA INCHAR /SAVE IT NL7775 /-3 TAD INCHAR /COMPARE TO LATEST SNA /SKIP IF NOT <^C> ISZ I [SCRSIZE] /ELSE SET SOFT INDICATOR SPA SNA CLA /SKIP IF <^D> OR HIGHER JMP I [SAVE] /ELSE GO SAVE LAST BUFFER AND LEAVE CHKKCC, KCCIOT/OR 0000 /**** CONSOLE **** 0000 TAD INCHAR /GET THE CHARACTER JMP I CTLCTST /RETURN PAGE BEGIN, JMS I [CRLF] /START ON A NEW LINE NL7777 /CLOSE THE DCA SHUT /LOCATION BAGAIN, DCA NUMB /CLEAR OUT THE ARGUMENT TAD (-4-1) /RESET THE DCA TOTAL /DIGIT COUNT BEGNIN, JMS I [CHKUP] /CHECK FOR <^P>, ETC. TAD INCHAR /GET LATEST CHARACTER SNA /ANYTHING THERE? JMP BEGNIN /NO, GO WAIT AGAIN TRYAGAN,DCA P7CH /YES, SAVE IT TAD (TABL1-1) /SETUP THE DCA XR1 /SEARCH POINTER CMDLUP, TAD I XR1 /GET A CHARACTER SPA /END OF LIST? JMP NUMRAL /YES, TRY TO MATCH A DIGIT STL CIA /NO, INVERT FOR TEST TAD P7CH /IS IT THIS ONE? SZA CLA /SKIP IF SO JMP CMDLUP /JUMP IF NOT TAD XR1 /GET CURRENT POINTER TAD (TABL2-TABL1) /ADJUST TO OTHER TABLE DCA COMMON /STASH THE ADDRESS TAD XR1 /GET THE POINTER AGAIN TAD (-INTLIMIT) /COMPARE TO LIMIT SMA CLA /SKIP IF LESS THAN INTERNAL LIMIT DCA INTSW /ELSE CLEAR INTERNAL SWITCH TAD I COMMON /GET THE ROUTINE ADDRESS DCA COMMON /STASH IT TAD P7CH /GET THE CHARACTER JMS P7CH /PRINT IT JMP I COMMON /GO DO THE COMMAND EXAMIN, JMS I [CHKDIG] /ANY ARGUMENT? JMP EXCURR /NO, USE CURRENT ADDRESS TAD NUMB /GET THE ARGUMENT AND [-BLKSIZE] /TEST FOR BAD BITS SZA CLA /SKIP IF LEGAL ARGUMENT JMP I (NO9) /BARF OTHERWISE TAD NUMB /GET THE ARGUMENT DCA CURADR /SAVE AS LATEST CURRENT ADDRESS DCA INTSW /CLEAR INTERNAL MODE NL7775 /INDICATE THREE WORD MOVE WMOVE; CURUNT; PRVUNT /SAVE LATEST VALUE FOR POSSIBLE RESTORATION EXCURR, JMS I [LOAD] /GET THE LATEST CURUNT /LOCATION'S CONTENTS JMS I [PRTOCT] /GO PRINT IT JMP BAGAIN-1 /GO BACK FOR MORE NUMRAL, TAD P7CH /AC NOW CONTAINS CHARACTER-70 CLL /CLEAR LINK FOR TEST TAD ["8-"0] /ADD ON RANGE SNL /SKIP IF OCTAL JMP TRYLOWR /JUMP IF NOT DCA COMMON /SAVE AS LATEST STRIPPED DIGIT TAD P7CH /GET THE DIGIT JMS P7CH /PRINT IT TAD NUMB /GET RUNNING VALUE CLL RAL;RTL /MOVE OVER THREE BITS TAD COMMON /ADD ON LATEST DCA NUMB /SAVE IT BACK ISZ TOTAL /TOO MANY DIGITS? JMP BEGNIN /NO, KEEP GOING NOCOM, DCA COMMON /SAVE PASSED VALUE TAD ["?&77] /GET A "?" JMS P6CH /PRINT IT TAD COMMON /GET PASSED VALUE TAD ["0&77] /MAKE IT ASCII JMS P6CH /PRINT IT JMP BEGIN /RESTART RETURN, JMS COMMON /DO COMMON STUFF JMP BEGIN /RESTART SEMICOL,JMS COMMON /DO COMMON STUFF JMS I [BMPADR] /BUMP CURBLK /TO NEXT JMP BAGAIN /KEEP GOING PREV, NL7775 /INDICATE THREE WORD MOVE WMOVE; PRVUNT; CURUNT /RESTORE PREVIOUS VALUES JMS I [CRLF] /DO A , JMP UPARW3 /CONTINUE THERE COMMON, .-. /COMMON STORE ROUTINE TAD SHUT /IS LOCATION OPEN? SNA CLA /SKIP IF NOT JMS I [CHKDIG] /ANY DIGITS? JMP I COMMON /NO, JUST RETURN TAD NUMB /GET THE ARGUMENT JMS I (STORE) /STORE IT CURUNT /THROUGH HERE JMP I COMMON /RETURN LNFEED, TAD [15] /GET A JMS P7CH /PRINT IT JMS COMMON /DO COMMON STORE JMS I [BMPADR] /BUMP CURBLK /TO NEXT JMS P7CH /PRINT A AFTER UPARW3, JMS I [PRTOUT] /PRINT THE COMPLETE CURUNT /ADDRESS VALUE TAD ["/&77] /GET A "/" JMS P6CH /GO PRINT IT JMP EXCURR /CONTINUE THERE POINT, JMS I [CHKDIG] /ANY ARGUMENT? JMP I (NO3) /NONE, BARF TAD NUMB /GET THE NEW BLOCK COLIN, DCA CURBLK /SAVE AS NEW CURRENT BLOCK DCA CURADR /CLEAR RELATIVE ADDRESS AS WELL JMP BEGIN+1 /KEEP GOING TRYLOWR,TAD (-117) /AC NOW CONTAINS CHARACTER-177 CLL /CLEAR LINK FOR TEST TAD (36) /ADD ON RANGE SNL /SKIP IF VALID LOWER-CASE JMP I (NOQ) /BARF OTHERWISE TAD ("A&177) /MAKE IT UPPER-CASE JMP TRYAGAN /TRY IT AGAIN PAGE COLON, JMS I [CHKDIG] /ANY ARGUMENT? JMP I (NO8) /NONE, BARF TAD NUMB /GET THE ARGUMENT AND [7770] /JUST BAD BITS SZA CLA /SKIP IF OK JMP I (NO7) /BARF OTHERWISE TAD NUMB /GET THE NEW UNIT DCA CURUNT /SAVE AS LATEST UNIT JMP I (COLIN) /FINISH THERE CRLF, .-. /, ROUTINE CLA /CLEAN UP FOR DIRTY CALLERS TAD [15] /GET A JMS P7CH /GO PRINT IT TAD (12) /GET A JMS P7CH /GO PRINT IT JMP I CRLF /RETURN CHKUP, .-. /CHECK FOR <^P>, <^C>, ETC. JMS CTLCTST /TEST FOR <^C>, ETC. SZA /SKIP IF NOTHING THERE TAD (-"Q!300) /ELSE COMPARE TO <^Q> SNA /SKIP IF SOMETHING ELSE JMP CHKCLR /IGNORE <^Q> IAC /TAD (-"P+"Q)/IS IT <^P>? SNA /SKIP IF NOT JMP PHIT /JUMP IF SO IAC /TAD (-"O+"P)/IS IT <^O>? SNA /SKIP IF NOT JMP DOUO /JUMP IF SO TAD [-"S+"O] /IS IT <^S>? SZA CLA /SKIP IF SO JMP I CHKUP /RETURN IF NOT JMS CTLCTST /WAIT FOR <^Q> TAD (-"Q!300) /IS IT <^Q>? PSYSIO, SZA CLA /SKIP IF SO JMP .-3 /GO BACK IF NOT CHKCLR, DCA INCHAR /CLEAR INPUT BUFFER JMP I CHKUP /RETURN DOUO, TAD ("O&177) /GET AN "O" JMS CONTPRT /PRINT "^O" NL4000 /GET INVERSION BIT TAD ECHOSW /INVERT ECHO STATUS DCA ECHOSW /STORE IT BACK JMP CHKCLR /CONTINUE THERE PHIT, DCA ECHOSW /FORCE ECHO ON DCA OCHAR /CLEAR PRTOCT LOCATION TAD ("P&177) /GET "P" JMS CONTPRT /PRINT "^P" JMP I [BEGIN] /RESTART SAVE, JMS DUMP /DUMP THE LAST BUFFER JMP I L7600/[SBOOT] /BYE, BYE! DUMP, .-. /BUFFER DUMP ROUTINE TAD STORFLG /GET DIRTY INDICATOR SNA CLA /SKIP IF DUMPING NEEDED JMP I DUMP /RETURN NOW IF NOT NL7775 /SETUP THE DCA IOERCT /RETRY COUNTER VM2AGN, JMS I [LINCTAPE] /CALL I/O ROUTINES VMPRM2 /WITH THIS PARAMETER JMP VM2ERROR /BARF! DCA STORFLG /NOT DIRTY ANYMORE JMP I DUMP /RETURN VM2ERR, ISZ IOERCT /TOO MANY ERRRORS? JMP VM2AGN /NO, TRY AGAIN JMS I [SCRIBE] /YES, TELL THEM IOERMSG /OF PROBLEM VMCLR, KCCIOT /**** CONSOLE **** 0000 JMP I [BEGIN] /START OVER SCRIBE, .-. /MESSAGE PRINTING ROUTINE JMS I [CRLF] /DO A , FIRST TAD I SCRIBE /GET MESSAGE POINTER DCA SCRPTR /STASH IT ISZ SCRIBE /BUMP PAST SCRLUP, TAD I SCRPTR /GET A PAIR RTR;RTR;RTR /MOVE OVER JMS SCTRIM /TRIM AND PRINT IT TAD I SCRPTR /GET IT AGAIN JMS SCTRIM /TRIM AND PRINT IT ISZ SCRPTR /BUMP TO NEXT PAIR JMP SCRLUP /GO DO IT AGAIN SCTRIM, .-. /TRIM AND PRINT ROUTINE AND [77] /JUST SIX-BIT SNA /END OF MESSAGE? JMP I SCRIBE /YES, RETURN TO SCRIBE'S CALLER JMS P6CH /NO, GO PRINT IT JMP I SCTRIM /RETURN TO ONLY BE CALLED AGAIN! SYSDEV, .-. /SYSTEM DEVICE HANDLER CLA /CLEAN UP TAD I SYSDEV /GET PARAMETER DCA SYSBLK /STASH IT ISZ SYSDEV /BUMP PAST PARAMETER TAD I SYSBLK /GET CORE ADDRESS DCA SYSCORE /STASH IT ISZ SYSBLK /BUMP TO NEXT TAD I SYSBLK /GET FUNCTION WORD DCA SYSFUN /STASH IT ISZ SYSBLK /BUMP TO NEXT TAD I SYSBLK /GET BLOCK NUMBER DCA SYSBLK /STASH IT JMS I PSYSIO /CALL I/O ROUTINES SYSCORE,.-. /CORE ARGUMENT SYSFUN, .-. /FUNCTION WORD SYSBLK, .-. /BLOCK NUMBER ISZ SYSDEV /BUMP PAST ERROR RETURN JMP I SYSDEV /RETURN TO CALLER RESMSG, "R;"E;"S;"E;"R;"V;"E;"D /"RESERVED" MESSAGE SAVAREA,ZBLOCK 3 /ADDRESS SAVE AREA PAGE GETADR, .-. /GET ADDRESS ROUTINE DCA ADDRESS /SAVE PASSED ARGUMENT TAD I ADDRESS /GET THE UNIT TAD (BLKSIZE%2) /MAKE INTO A READ DCA VMFUN1 /SET IT UP ISZ ADDRESS /BUMP TO NEXT TAD I ADDRESS /GET THE BLOCK NUMBER DCA VMBLK1 /STASH IT ISZ ADDRESS /BUMP TO ADDRESS TAD I ADDRESS /GET THE ADDRESS DCA ADDRESS /STASH IT TAD INTSW /GET INTERNAL MEMORY SWITCH SNA CLA /SKIP IF SET JMP BLKADDR /JUMP IF NORMAL ACCESS TAD ADDRESS /GET THE ADDRESS TAD (-UNIT-1) /ADD ON LIMIT CLL /CLEAR LINK FOR TEST TAD (UNIT+1-MASK) /ADD ON RANGE SNL CLA /SKIP IF VALID JMP SPBARF /ELSE COMPLAIN ISZ GETADR /TAKE SKIP RETURN JMP I GETADR /WITH ADDRESS OK SPBARF, CLA /CLEAN UP DCA INTSW /CANCEL INTERNAL MODE JMP I (NO1) /COMPLAIN THERE BLKADDR,ISZ RESW /DO WE HAVE A BUFFER? SKP /SKIP IF SO JMP READITIN /JUMP IF NOT TAD VMBLK2 /GET CURRENT BLOCK CIA /INVERT FOR TEST TAD VMBLK1 /COMPARE TO LATEST SZA CLA /SKIP IF THEY MATCH JMP CHNGED /JUMP IF NOT TAD VMFUN1 /GET THE READ FUNCTION CIA /INVERT FOR TEST TAD VMFUN2 /COMPARE TO WRITE FUNCTION AND [7] /JUST UNIT BITS SNA CLA /SKIP IF DIFFERENT JMP SAMBUF /JUMP IF THEY MATCH CHNGED, JMS I (DUMP) /DUMP THE OLD BUFFER READITI,TAD VMBLK1 /GET BLOCK NUMBER IACS /DISPLAY IN LINC "S" REGISTER CLA /CLEAN UP LINC /GOTO LMODE OR STOP DRIVES IF LINC-8 LDA /TRY TO LOAD AC VMBLK1 /WITH BLOCK NUMBER SCR 14 /MOVE INTO MQ PDP /BACK TO PDP-8 MODE CLA /CLEAN UP TAD VMBLK1 /GET THE BLOCK AGAIN MQL /DISPLAY IN MQ NL7775 /SETUP THE ERROR DCA IOERCT /RETRY COUNTER VM1AGN, JMS I [LINCTAPE] /CALL I/O ROUTINES VMBUFP /WITH THIS PARAMETER JMP VM1ERROR /BARF! TAD VMBLK1 /GET LATEST BLOCK DCA VMBLK2 /SAVE FOR DUMPING NL4000 /GET A WRITE BIT TAD VMFUN1 /ADD ON READ FUNCTION DCA VMFUN2 /SAVE AS WRITE FUNCTION FOR DUMPING SAMBUF, TAD ADDRESS /GET THE ADDRESS TAD VMBUFP /ADD ON THE BUFFER BASE DCA ADDRESS /SAVE AS EFFECTIVE ADDRESS DCA RESW /INDICATE RESIDENT BUFFER JMP I GETADR /RETURN VM1ERR, ISZ IOERCT /TOO MANY ERRORS? JMP VM1AGN /NO, TRY AGAIN JMS I [SCRIBE] /TELL THEM OF IOERMSG /I/O PROBLEM JMP I [BEGIN] /RESTART BMPADR, .-. /BUMP CURRENT ADDRESS ROUTINE TAD I BMPADR /GET ARGUMENT ADDRESS DCA TEMP /STASH IT ISZ BMPADR /BUMP PAST IT NL0001 /+1 TAD TEMP /ADD ON BLOCK ADDRESS DCA TEMP2 /SAVE AS ADDRESS POINTER ISZ I TEMP2 /BUMP TO NEXT TAD I TEMP2 /GET NEW VALUE AND [BLKSIZE] /JUST OVERFLOW BIT SZA /SKIP IF NO OVERFLOW THIS TIME ISZ I TEMP /BUMP TO NEXT BLOCK NOP /JUST IN CASE DCA WTSW /SAVE SWITCH FOR WORD SEARCH TAD I TEMP2 /\ AND [BLKSIZE-1] / >REDUCE MODULO BLOCK SIZE DCA I TEMP2 // JMP I BMPADR /RETURN P10BLKS,.-. /PRINT TEN CHARACTERS ROUTINE TAD (-12) /SETUP THE DCA LOAD /PRINT COUNTER TAD [" &77] /GET A JMS P6CH /PRINT IT ISZ LOAD /DONE YET? JMP .-3 /NO, KEEP GOING JMP I P10BLKS /YES, RETURN LOAD, .-. /LOAD A WORD ROUTINE TAD I LOAD /GET THE ARGUMENT JMS GETADR /SETUP THE ADDRESS NOP /DON'T CARE TAD I ADDRESS /GET THE VALUE ISZ LOAD /BUMP PAST ARGUMENT JMP I LOAD /RETURN STORE, .-. /STORE A WORD ROUTINE DCA LOAD /SAVE THE VALUE TAD I STORE /GET THE ARGUMENT JMS GETADR /SETUP THE ADDRESS ISZ STORFLG /BUFFER IS NOW DIRTY TAD LOAD /GET THE VALUE AGAIN DCA I ADDRESS /STORE IT ISZ STORE /BUMP PAST ARGUMENT JMP I STORE /RETURN VMBUFP, BUFFER /CORE ARGUMENT VMFUN1, BLKSIZE%2+.-. /UNIT WILL BE SET AS NECESSARY VMBLK1, .-. /BLOCK WILL BE FILLED IN AS NECESSARY VMPRM2, BUFFER /CORE ARGUMENT VMFUN2, BLKSIZE%2+WRITE+.-. /UNIT WILL BE SET AS NECESSARY VMBLK2, .-. /BLOCK WILL BE FILLED IN AS NECESSARY PAGE PRTOCT, .-. /OCTAL PRINT ROUTINE DCA TEMP2 /SAVE THE VALUE TAD [-4] /SETUP THE DCA TEMP /DIGIT COUNT PLOOP, TAD TEMP2 /GET THE NUMBER RTL;RAL /SHIFT IT THREE BITS DCA TEMP2 /SAVE IT BACK TAD TEMP2 /GET IT AGAIN RAL /ADJUST IT AND [7] /JUST ONE DIGIT TAD ["0&77] /MAKE IT ASCII JMS P6CH /PRINT IT ISZ TEMP /DONE FOUR YET? JMP PLOOP /NO, GO BACK TAD OCHAR /GET DELIMITER CHARACTER SNA /SKIP IF SPECIAL VALUE TAD [" &77] /USE A OTHERWISE JMS P6CH /GO PRINT IT DCA OCHAR /CLEAR SPECIAL CHARACTER JMP I PRTOCT /YES, RETURN NX, IAC /TAD (UNIT-VIEWCON) /SET UNIT OFFSET VX, IAC /TAD (VIEWCON-OTCONT)/SET VIEWCONTROL OFFSET OX, IAC /TAD (OTCONTRO-UPPER)/SET OTCONTROL OFFSET UX, IAC /TAD (UPPER-HOME) /SET UPPER OFFSET HX, IAC /TAD (HOME-MASK) /SET HOME OFFSET MX, TAD (MASK) /SET MASK ADDRESS DCA CURADR /STORE DESIRED ADDRESS JMS I (P10BLKS) /PRINT CHARACTERS TO PAD NL7777 /SETUP THE DCA INTSW /INTERNAL MODE TAD ["/&77] /GET A "/" JMS P6CH /PRINT IT JMP I (EXCURR) /CONTINUE THERE ADDIT, NL7777 /INDICATE "+" SBTRCT, DCA TEMP2 /SAVE "+" OR "-" INDICATOR JMS I [CHKDIG] /ANY DIGITS? ISZ NUMB /NO, ASSUME ONE TAD NUMB /GET ARGUMENT AND [-BLKSIZE] /JUST BLOCK BITS XLIST OFF IFZERO BLKSIZE-200 < XLIST ON CLL RTL;RTL;RTL /TURN INTO RELATIVE BLOCK COUNT XLIST OFF > IFZERO BLKSIZE-400 < XLIST ON CLL RTL;RTL;RAL /TURN INTO RELATIVE BLOCK COUNT XLIST OFF > XLIST ON ISZ TEMP2 /SHOULD WE INVERT IT? CIA /YES, DOING "-" TAD CURBLK /MODIFY THE DCA CURBLK /LATEST BLOCK TAD TEMP2 /GET INDICATOR CLL RAR /LOAD INTO LINK TAD NUMB /GET ARGUMENT AND [BLKSIZE-1] /JUST BLOCK BITS SZL /SHOULD WE INVERT? CIA /YES, DOING "-" DCA TEMP /SAVE IT TAD TEMP /GET IT BACK TAD CURADR /ADD ON LATEST ADDRESS SPA /SKIP IF "+" OR SMALL "-" JMP DONEG /JUMP IF LARGE "-" AND [BLKSIZE] /CHECK FOR OVERFLOW SZA CLA /SKIP IF NONE NL0001 /ELSE INCREMENT SKP /DON'T DECREMENT! DONEG, NL7777 /BACKUP TAD CURBLK /ADD ON CURRENT BLOCK DCA CURBLK /STORE IT BACK TAD TEMP /GET LOW-ORDER AGAIN TAD CURADR /ADD ON LATEST ADDRESS AND [BLKSIZE-1] /REMOVE OVERFLOW DCA CURADR /STASH IT JMS I [CRLF] /DO A , JMP I (UPARW3) /FINISH IT THERE CHKDIG, .-. /CHECK FOR ANY DIGITS TYPED ROUTINE TAD TOTAL /GET TOTAL DIGITS TYPED TAD (4+1) /COMPARE TO LIMIT SZA CLA /SKIP IF NO DIGITS ISZ CHKDIG /BUMP RETURN IF ANY JMP I CHKDIG /RETURN AS NECESSARY PRTOUT, .-. /OUTPUT THE COMPLETE ADDRESS TAD I PRTOUT /GET ARGUMENT ADDRESS DCA TOTAL /STASH IT ISZ PRTOUT /BUMP PAST THE ARGUMENT TAD INTSW /GET INTERNAL MODE SWITCH SNA CLA /SKIP IF SET JMP PRONORMAL /JUMP IF NOT TAD CURADR /GET THE ADDRESS TAD (-UNIT-1) /ADD ON LIMIT CLL /CLEAR LINK FOR TEST TAD (UNIT+1-MASK) /ADD ON RANGE SNL /SKIP IF OK JMP I (SPBARF) /JUMP IF NOT TAD (SPTABL) /ADJUST TO CHARACTER TABLE DCA TEMP2 /STASH THE POINTER TAD I TEMP2 /GET THE CHARACTER JMS P7CH /PRINT IT JMS I (P10BLKS) /PAD IT OUT JMP I PRTOUT /RETURN PRONORM,TAD I TOTAL /GET THE UNIT ISZ TOTAL /BUMP TO NEXT TAD ["0&77] /MAKE IT ASCII JMS P6CH /PRINT IT TAD (":&77) /GET A ":" JMS P6CH /PRINT IT TAD (".&77) /GET A "." DCA OCHAR /SET IT UP TAD I TOTAL /GET THE BLOCK ISZ TOTAL /BUMP TO NEXT JMS I [PRTOCT] /PRINT THE BLOCK NUMBER TAD I TOTAL /GET THE ADDRESS RAL;RTL /MOVE UP THREE BITS DCA TEMP2 /SAVE IN PRTOCT'S TEMPORARY TAD PRTOUT /GET OUR RETURN ADDRESS DCA PRTOCT /SAVE IN PRTOCT'S HEADER NL7775 /SETUP FOR THREE DIGITS JMP PLOOP-1 /GO PRINT THE DIGITS PAGE BKSLSH, TAD VIEWCONTROL /GET VIEW CONTROL WORD CIA /INVERT IT DCA CNT /SAVE AS LINE COUNT TAD NUMB /GET THE ARGUMENT AND [-BLKSIZE] /CHECK FOR BAD VALUE SZA CLA /SKIP IF OK JMP I (NO4) /JUMP IF NOT TAD NUMB /GET THE ADDRESS AND [7770] /JUST LINE BITS DCA DMPADR /SETUP OUR ARGUMENT WMOVE; CURUNT; DMPUNT /SETUP LATEST UNIT, BLOCK DCA CASE /SET NORMAL CASE BKLUP1, JMS I [CRLF] /DO A , NOW JMS I [PRTOUT] /PRINT THE DMPUNT /LEADING ADDRESS WMOVE; DMPBLK; SAVAREA /SAVE CURRENT BLOCK, ADDRESS TAD [7770] /SETUP THE DCA TOTAL /ON LINE COUNT BKLUP2, JMS I [LOAD] /GET A WORD DMPUNT /FROM LATEST ADDRESS JMS I [PRTOCT] /PRINT IT JMS I [BMPADR] /BUMP DMPBLK /TO NEXT ISZ TOTAL /DONE A LINE YET? JMP BKLUP2 /NO, GO DO ANOTHER ONE TAD OTCONTROL /GET CHARACTER MODE AND [7] /JUST GOOD BITS SZA CLA /SKIP IF NULL DISPLAY MODE JMP OUTOK /JUMP IF IN RANGE BUMPIT, ISZ CNT /DONE ALL YET? JMP BKLUP1 /NO, GO DO ANOTHER LINE JMP I [BEGIN] /YES, RESTART OUTOK, TAD ("*&77) /GET A "*" JMS P6CH /PRINT IT TAD [7770] /SETUP THE DCA TOTAL /WORD COUNT WMOVE; SAVAREA;DMPBLK /RESTORE PREVIOUS BLOCK, ADDRESS BKLUP3, JMS I [LOAD] /GET THE LATEST WORD DMPUNT /FROM OUR ADDRESS DCA TEMP /STASH IT TAD OTCONTROL /GET MODE AND [7] /JUST GOOD BITS TAD (MODTBL-1) /ADD ON TABLE ADDRESS DCA TEMP2 /STASH IT TAD I TEMP2 /GET THE PARTICULAR ADDRESS DCA TEMP2 /SET IT UP JMP I TEMP2 /GO THERE SXBIT, TAD [" &77] /GET INVERSION BIT TRIMD, DCA TEMP2 /CLEAR THE BIT TAD TEMP /GET THE CHARACTER PAIR RTR;RTR;RTR /MOVE OVER TAD TEMP2 /ADD ON INVERSION BIT JMS P6CH /PRINT IT TAD TEMP /GET THE CHARACTER PAIR AGAIN TAD TEMP2 /ADD ON INVERSION BIT JMS P6CH /PRINT IT COMPRT, JMS I [BMPADR] /BUMP DMPBLK /TO NEXT COMPR2, ISZ TOTAL /DONE ALL YET? JMP BKLUP3 /NO, GO FOR ANOTHER PAIR TAD ("*&77) /YES, GET A "*" JMS P6CH /PRINT IT JMP BUMPIT /CONTINUE THERE SVNBIT, JMS DO7 /DO A SINGLE SEVEN BIT OUTPUT JMP COMPRT /KEEP GOING T3FOR2, NL0001 /GET EVEN/ODD MASK AND DMPADR /GET EVEN/ODD BIT M140, SZA CLA /SKIP IF EVEN JMP DOODD /JUMP IF ODD TAD TEMP /GET THE WORD RTR /MOVE DOWN 2 BITS AND (700) /JUST HIGH 3 BITS CLL RTR /MOVE DOWN 4 BITS DCA T3TEMP /SAVE IT JMS DO7 /DO FIRST CHARACTER JMP COMPRT /DONE FOR NOW DOODD, JMS DO7 /DO THE SECOND CHARACTER TAD TEMP /GET THE LATEST AGAIN RTL;RTL;RAL /MOVE DOWN EIGHT TO THE RIGHT AND [17] /JUST 4 BITS TAD T3TEMP /ADD ON FIRST WORD BITS DCA TEMP /STASH IT JMS DO7 /DO THIRD CHARACTER JMP COMPRT /CONTINUE THERE DO7, .-. /DO ONE SEVEN BIT CHARACTER TAD TEMP /GET THE CHARACTER AND (140) /JUST QUADRANT BITS SNA /SKIP IF NOT <^> TYPE JMP DOCNTRL /JUMP IF IT IS TAD M140/(-140) /COMPARE TO LOWER CASE SNA CLA /SKIP IF NORMAL JMP DOLOWR /JUMP IF LOWER CASE CNTRLIN,TAD [" &77] /GET NORMAL JMS P6CH /PRINT IT LOWRIN, TAD TEMP /GET THE CHARACTER ITSELF JMS P6CH /PRINT IT AS TRIMMED ASCII JMP I DO7 /RETURN DOCNTRL,NL7776/TAD ("^-" -100)/"^"-" " JMP CNTRLIN /CONTINUE THERE DOLOWR, TAD ["'&77] /GET A "'" JMS P6CH /PRINT IT TAD [" &77] /GET INVERSION BIT JMP LOWRIN /CONTINUE THERE T3TEMP, .-. /TEMPORARY PAGE CASCODE,TAD TEMP /GET THE LATEST WORD DCA CASTEMP /SAVE IT TAD CASTEMP /GET IT BACK RTR;RTR;RTR /MOVE OVER HIGH-ORDER JMS DOCASE /PRINT LATEST HIGH-ORDER CHARACTER /(PERHAPS (WITH OR WITHOUT CASE AND) /INVERTED) OR JUST SET CASE FLAG TAD CASTEMP /GET THE WORD AGAIN JMS DOCASE /PRINT LATEST LOW-ORDER CHARACTER OR /JUST SET CASE FLAG TAD CASE /GET CURRENT CASE SZA CLA /SKIP IF NORMAL CASE TAD TOTAL /GET WORD COUNT IAC /CHECK IF ABOUT TO OVERFLOW SZA CLA /SKIP IF INVERTED CASE AND LAST CHARACTER ON LINE JMP I (COMPRT) /GO BACK FOR MORE TAD CNT /GET LINE COUNT IAC /CHECK IF ON LAST LINE SNA CLA /SKIP IF NOT LAST LINE JMP CASBLNK /JUMP IF IT IS THE FINAL CHARACTER JMS I [BMPADR] /BUMP DMPBLK /TO NEXT NL4000 /SET CASE FOR PRINTING THE CHARACTER ONLY DCA CASE /ON THE NEXT LINE (FIRST TIME THROUGH) JMS I [LOAD] /GET NEXT WORD DMPUNT /FROM THIS ADDRESS SMA CLA /SKIP IF LOWER-CASE CHARACTER TAD ("^-"'+7700) /MAKE IT "^" TAD ["'&77] /GET "'" JMS P6CH /PRINT CASE AS LAST CHARACTER ON LINE JMP I (COMPR2) /CONTINUE WITH ADDRESS ALREADY BUMPED CASBLNK,TAD [" &77] /GET A JMS P6CH /PRINT AS FINAL CHARACTER JMP I (COMPRT) /FINISH IT THERE RESRVD, TAD TOTAL /GET THE LINE COUNT TAD (RESMSG+10) /ADJUST TO MESSAGE CHARACTER ADDRESS DCA TEMP /STASH IT TAD I TEMP /GET THE CHARACTER JMS P7CH /PRINT IT JMP I (COMPRT) /KEEP GOING DOCASE, .-. /CASE CODE OUTPUT ROUTINE AND [77] /JUST SIX-BIT DCA TEMP /SAVE IT TAD CASE /GET CURRENT CASE SZA /SKIP IF REGULAR MODE JMP TSTCASE /JUMP IF NOT TAD TEMP /GET THE CHARACTER TAD (-77) /COMPARE TO CASE CHARACTER SNA /SKIP IF OTHERWISE JMP SETINV /JUMP IF IT IS TAD [-37+77] /IS IT THE "?"? SNA /SKIP IF NOT TAD [40] /ADJUST TO "?" TAD (37) /RESTORE TO SIX-BIT CASOUT, JMS P6CH /PRINT IT CASDONE,DCA CASE /ENSURE NORMAL MODE JMP I DOCASE /RETURN SETINV, ISZ CASE /SET INVERTED MODE JMP I DOCASE /RETURN TSTCASE,SPA CLA /SKIP IF INVERTED MODE JMP PRTCASE /JUMP IF SPECIAL CASE TAD TEMP /GET THE CHARACTER AND [" &77] /JUST QUADRANT BIT CLL RAL /MAKE NEW LOWER-CASE BIT TAD TEMP /ADD ON ORIGINAL DCA TEMP /SETUP FOR SEVEN-BIT PRINT JMS I (DO7) /PRINT IN TWO-CHARACTER FORM JMP CASDONE /FINISH IT THERE PRTCASE,TAD TEMP /GET THE CHARACTER AND (37) /JUST WANT ALPHA AFTER PRIOR "^" OR "'" JMP CASOUT /FINISH IT THERE BCDOUT, TAD TEMP /GET THE WORD RTL;RTL;RAL /MOVE DOWN FIRST BCD DIGIT JMS PBCD /PRINT IT TAD TEMP /GET IT AGAIN RTR;RTR /MOVE DOWN THE SECOND BCD DIGIT JMS PBCD /PRINT IT TAD TEMP /GET THE THIRD BCD DIGIT JMS PBCD /PRINT IT JMP I (COMPRT) /FINISH IT THERE PBCD, .-. /HEXADECIMAL BCD PRINT ROUTINE AND [17] /JUST 4 BITS TAD (-11) /COMPARE TO NINE SPA SNA /SKIP IF GREATER THAN NINE TAD ("0&77+11) /ADJUST TO ASCII JMS P6CH /PRINT IT JMP I PBCD /RETURN MODTBL, TRIMD /1=USE TRIMMED ASCII SXBIT /2=USE INVERTED SIX-BIT ASCII CASCODE /3=USE CASE-CODE SIX-BIT ASCII SVNBIT /4=USE SEVEN-BIT ASCII T3FOR2 /5=USE 3 FOR 2 PACKED SEVEN BIT ASCII BCDOUT /6=USE 3 BCD DIGITS PER WORD RESRVD /7=USE RESERVED MESSAGE WRDMOVE,.-. /WORD MOVING ROUTINE SNA /PASSED ARGUMENT? NL7776 /NO, USE DEFAULT VALUE DCA PBCD /SAVE ARGUMENT NL7777 /BACKUP TAD I WRDMOVE /GET "FROM" ARGUMENT DCA XR2 /SET IT UP ISZ WRDMOVE /BUMP TO NEXT NL7777 /BACKUP TAD I WRDMOVE /GET "TO" ARGUMENT DCA XR3 /SET IT UP ISZ WRDMOVE /BUMP PAST ARGUMENTS WRDMVLP,TAD I XR2 /GET A WORD DCA I XR3 /PUT A WORD ISZ PBCD /DONE ALL YET? JMP WRDMVLP /NO, GO BACK JMP I WRDMOVE /YES, RETURN CASTEMP,.-. /TEMPORARY IOERMSG,TEXT "I/O ERROR" /I/O ERROR MESSAGE PAGE TABL1, " &177 /BLANK 12&177 /LINE FEED 15&177 /CARRIAGE RETURN "/&177 // ";&177 /; "+&177 /+ "-&177 /- INTLIMI,".&177 /. ":&177 /: "\&177 /\ "S&177 /S "E&177 /E "W&177 /W "X&177 /X "<&177 /< "P&177 /P SPTABL, "M&177 /M "H&177 /H "U&177 /U "O&177 /O "V&177 /V "N&177 /N -70 /END OF LIST USED FOR NUMERIC CHECK TABL2, BEGNIN /BLANKS ARE IGNORED LNFEED /CLOSE PREVIOUS, OPEN + DISPLAY NEXT RETURN /CLOSE PREVIOUS EXAMIN /DISPLAY CURRENT SEMICOLON /SAME AS LINEFEED BUT NO DISPLAY ADDIT /OPEN .+ARG LOCATION SBTRCT /OPEN .-ARG LOCATION POINT /CHANGE BLOCK COLON /CHANGE UNIT BKSLSH /DUMP MEMORY SAVE /SAVE BUFFER AND BOOTSTRAP SBOOT /UNCONDITIONALLY (HASTILY) EXIT WRDSRCH /SEARCH CORE AGAINST MASK ECKS /SEARCH CORE AGAINST MASK (COMPLEMENTED) PREV /RESTORE PREVIOUS ADDRESS SRCPRC /PROCEED TO NEXT WORD SEARCH MX /SET SEARCH MASK HX /SET LOWER LIMIT UX /SET UPPER LIMIT OX /DISPLAY MODE VX /VIEW CONTROL WORD NX /SEARCH UNIT ECKS, TAD [SNA-SZA] /INDICATE "X" WRDSRCH,TAD LSZACLA /INDICATE "W" DCA WINST /SETUP TEST INSTRUCTION TAD HOME /GET LOWER LIMIT DCA CHKBLK /SET IT UP TAD UNIT /GET DESIGNATED UNIT AND [7] /JUST UNIT BITS DCA CHKUNT /SET IT UP DCA CHKADR /CLEAR STARTING RELATIVE ADDRESS TAD NUMB /GET THE ARGUMENT DCA WORD /SAVE FOR SEARCHING JMS I [CRLF] /DO A , WLOOP1, JMS CHKLIMITS /ENSURE PROPER LIMITS JMS I [CHKUP] /CHECK FOR <^C>, ETC. JMS I [LOAD] /GET A CHKUNT /TEST VALUE AND MASK /JUST DESIRED BITS CIA /INVERT FOR TEST TAD WORD /COMPARE TO TEST ARGUMENT WINST, SZA CLA /OR SNA CLA JMP WLOOP2 /JUMP IF TEST FAILED JMS I [PRTOUT] /PRINT OUT CHKUNT /THE ADDRESS INFORMATION TAD OTCONTROL /GET SEARCH MODE INDICATOR SPA CLA /SKIP IF REGULAR MODE JMP WPAUSE /JUMP IF PAUSE MODE TAD ["/&77] /GET A "/" JMS P6CH /PRINT IT TAD I ADDRESS /GET THE VALUE AGAIN JMS I [PRTOCT] /GO PRINT IT JMS I [CRLF] /DO A , WLOOP2, JMS CHKLIMITS /ENSURE PROPER LIMITS JMS I [BMPADR] /BUMP TO CHKBLK /NEXT ADDRESS TAD WTSW /GET OUR SWITCH SNA CLA /SKIP IF ALLOWED TO TEST JMP WLOOP1 /ELSE JUST KEEP GOING TAD CHKBLK /GET CURRENT BLOCK CIA /INVERT FOR TEST TAD UPPER /COMPARE TO UPPER LIMIT IAC /ONE MORE IS THE ONE WE'RE LOOKING FOR LSZACLA,SZA CLA /SKIP IF AT THE LIMIT JMP WLOOP1 /JUMP IF NOT AT LIMIT YET JMS CHKLIMITS /ESTABLISH CHECKPOINT JMP I [BEGIN] /RESTART WPAUSE, NL7775 /INDICATE THREE WORD MOVE WMOVE; CHKUNT; CURUNT /MOVE OUR VALUES TO CURRENT VALUES TAD (WLOOP2) /RESET THE DCA CHKLIMITS /NEXT RESTART JMP I (EXCURR) /FINISH UP IN EXAMINE ROUTINE SRCPRC, JMS I [CRLF] /DO A , JMP I CHKLIMITS /RESTART THERE CHKLIMI,BEGIN /CHECK LIMITS ROUTINE;INITIALIZED FOR FALSE RESTART TAD HOME /GET LOWER LIMIT CLL CIA /INVERT FOR TEST TAD UPPER /COMPARE TO UPPER LIMIT SNL CLA /SKIP IF OK TO PROCEED JMP I [BEGIN] /JUMP IF NOT JMP I CHKLIMITS /RETURN IF OK NOQ, CLA /CLEAN UP TAD ("?-"0-11) /??=BAD INPUT CHARACTER NO9, IAC /?9=BAD ARGUMENT TO "/" NO8, IAC /?8=NO ARGUMENT TO ":" NO7, IAC /?7=BAD ARGUMENT TO ":" NO6, IAC /?6=NO ARGUMENT TO "G" OR "R" **** NO5, IAC /?5=DUPLICATE BREAKPOINT ATTEMPTED **** NO4, IAC /?4=BAD ARGUMENTS TO "\" NO3, IAC /?3=BREAKPOINT LOOKUP FAILURE IN "#" **** NO2, IAC /?2=NO ARGUMENT TO "#" **** NO1, IAC /?1=ILLEGAL ADDRESS OR VALUE NO0, JMP I (NOCOM) /?0=TOO MANY DIGITS PAGE / P?S/8 PDP-12 NON-SYSTEM HANDLER / P?S/8 LINCTAPE NON-SYSTEM HANDLER FOR THE PDP-12. / LAST EDIT: 17-APR-1986 10:00:00 CJL / MAY BE ASSEMBLED WITH '/J' SWITCH SET. / FEATURES: / 1) SUPPORT OF EIGHT UNITS (0-7). / 2) PARITY ERROR DETECTION AND RETRY (WITH COUNTER). / 3) NOT READY OR WRITE LOCK DETECTION AND RETRY (WITH COUNTER). / 4) WAITS IN PDP-8 MODE, THUS ALLOWING INTERRUPTS. XLIST OFF IFNDEF OFF IFNDEF ON IFNDEF BLKSIZE XLIST OFF IFZERO BLKSIZE-400 < XLIST ON; IFZERO 1 < / 5) SUPPORTS 256 OR 257 WORDS/BLOCK LINCTAPES AS A NON-STANDARD / FEATURE OF THIS PROGRAM. > XLIST OFF > IFZERO BLKSIZE-200 < XLIST ON; IFZERO 1 < / 5) SUPPORTS 128 OR 129 WORDS/BLOCK LINCTAPES. > XLIST OFF > XLIST ON PAGE /START ON A GOOD BOUNDARY HERE= . /WHERE WE ARE / DEFINITIONS. AXO= 0001 /LOAD EXTENDED OPERATIONS BUFFER XLIST OFF IFZERO BLKSIZE-200 < XLIST ON BLKSIZE=0200 /128 WORDS/BLOCK (ALSO ALLOWS 129) XLIST OFF > IFZERO BLKSIZE-400 < XLIST ON BLKSIZE=0400 /256 WORDS/BLOCK (ALSO ALLOWS 257) XLIST OFF > XLIST ON LDA= 1000 /LOAD ACCUMULATOR LINC= 6141 /GOTO LINC MODE XLIST OFF IFNDEF LINCTAPE XLIST ON LMR= 6151 /LOAD MAINTENANCE REGISTER LTLENGT=4000 /LINCTAPE BLOCK COUNT NL0002= CLA CLL CML RTL /LOAD AC WITH 0002 NL4000= CLA CLL CML RAR /LOAD AC WITH 4000 NL7775= CLA CLL CMA RTL /LOAD AC WITH 7775 PDP= 0002 /GOTO PDP-8 MODE RDE= 0702 /READ A TAPE BLOCK REVISIO="B&77 /REVISION OF HANDLER TAC= 0003 /TAPE ACCUMULATOR TO ACCUMULATOR TMA= 0023 /LOAD TAPE MEMORY ADDRESS REGISTER TRC= 6152 /TAPE REGISTER CLOCK XFR= 6154 /TRANSFER SELECTED REGISTER TO ACCUMULATOR / DEVICE HANDLER HEADER BLOCK. XLIST OFF IFZERO BLKSIZE-200 < XLIST ON *"L&177;*"T&177;*"A&177 /GROUP NAME *-1 /GROUP COUNT *"L&177;*"T&177;*"A&177 /DEVICE NAME XLIST OFF > IFZERO BLKSIZE-400 < XLIST ON *"L&177;*"T&177;*"D&177 /GROUP NAME *-1 /GROUP COUNT *"L&177;*"T&177;*"D&177 /DEVICE NAME XLIST OFF > XLIST ON *LINCTAPE&177 /ENTRY POINT *LTLENGTH-1 /LENGTH EXPRESSED AS HIGHEST BLOCK *REVISION /REVISION OF HANDLER *HERE /RESET ORIGIN LINCTAP,.-. /ENTRY POINT NL0002 /SET INSTRUCTION FIELD BIT RDF /NOW HAVE CALLING FIELD TAD (CDF) /MAKE RETURN CIF CDF INSTRUCTION DCA LTEXIT /STORE IN-LINE FOR EXIT LATER TAD I LINCTAPE /GET PARAMETER POINTER DCA LTBLOCK /STASH IT ISZ LINCTAPE /BUMP TO ERROR RETURN TAD I LTBLOCK /GET TRANSFER ADDRESS DCA LTCORE /STASH IT ISZ LTBLOCK /BUMP TO NEXT TAD I LTBLOCK /GET FUNCTION WORD AND (70) /JUST TRANSFER FIELD TAD (CDF) /MAKE INTO CDF TRANSFER FIELD INSTRUCTION DCA LTSVFLD /STORE IN-LINE FOR LATER TAD I LTBLOCK /GET FUNCTION WORD AGAIN RAR /LOW-ORDER UNIT BIT TO LINK AND LT3/(3) /ISOLATE HIGH-ORDER UNIT BITS DCA LTEMP /SAVE FOR LATER TAD I LTBLOCK /U2 RW P0 P1 P2 P3 P4 F0 F1 F2 U0 U1 U2 RTL /P0 P1 P2 P3 P4 F0 F1 F2 U0 U1 U2 U2 RW AND LT3/(3) /P0 0 0 0 0 0 0 0 0 0 0 U2 RW CLL RTL /0 0 0 0 0 0 0 0 0 U2 RW 0 0 TAD (RDE) /0 0 0 0 1 1 1 0 0 U2 RW 1 0 DCA LTAPINST /SAVE "RDE" OR "WRI" OR "RDE U" OR "WRI U" IN-LINE TAD LTAPINST /GET TAPE INSTRUCTION BACK DCA LTAPTST /SAVE IN-LINE FOR TESTING ALSO TAD I LTBLOCK /GET FUNCTION WORD AGAIN RAL /MOVE UP AND XLIST OFF IFZERO BLKSIZE-400 < XLIST ON AND (7400) /ISOLATE PAGE BITS XLIST OFF > IFZERO BLKSIZE-200 < XLIST ON AND LT7600/(7600) /ISOLATE PAGE BITS XLIST OFF > XLIST ON DCA LTPAGCT /SAVE FOR COUNTING TAD LTSVFLD /RW 1 1 0 0 1 0 F0 F1 F2 0 0 1 AND (70) /RW 0 0 0 0 0 0 F0 F1 F2 0 0 0 CLL RTL /0 0 0 0 0 F0 F1 F2 0 0 0 0 0 STL IAC RTL /0 0 0 F0 F1 F2 0 0 0 0 1 1 0 RTL /0 F0 F1 F2 0 0 0 0 1 1 0 0 0 TAD LTEMP /0 F0 F1 F2 0 0 0 0 1 1 0 U0 U1 DCA LTAXO /STORE FIELD, NOPAUSE, EXTENDED ADDRESSING, /HIGH-ORDER UNIT BITS IN-LINE FOR LATER ISZ LTBLOCK /BUMP TO BLOCK NUMBER TAD I LTBLOCK /GET THE BLOCK NUMBER DCA LTBLOCK /STASH IT FOR LATER RIF /GET OUR FIELD TAD (CIF) /MAKE INTO CIF OUR FIELD INSTRUCTION DCA LTINHBT /STORE IN-LINE TO TEMPORARILY PREVENT /INTERRUPTS AS THE CODE GOES INTO LINC MODE TAD LTINHBT /GET CIF OUR FIELD INSTRUCTION BACK DCA LTINH2 /STORE IN-LINE AS BEFORE NL7775 /SETUP THE DCA LTRYCNT /ERROR RETRY COUNTER LTNEXT, TAD LTCORE /GET TRANSFER ADDRESS LTINH2, .-. /WILL BE CIF OUR FIELD TO INHIBIT INTERRUPTS LINC /GOTO LINC MODE TMA /LOAD TAPE MEMORY ADDRESS SETUP REGISTER LDA!20 /LOAD ACCUMULATOR WITH LTAXO, .-. /EXTENDED ADDRESSING, NOPAUSE, FIELD /AND HIGH-ORDER UNIT BITS AXO /LOAD EXTENDED OPERATIONS BUFFER LTAPTST,.-. /WILL BE "RDE" OR "WRI" OR "RDE U" OR "WRI U" 0 /MUST USE BLOCK ZERO! LDA!20; 5000 /GET REGISTER SETTING BITS PDP /BACK TO PDP-8 MODE LMR /LOAD MAINTENANCE REGISTER XFR /GET DRIVE STATUS BACK RTR /DRIVE OK TO LINK SNL CLA /SKIP IF DRIVE OK JMP LTERR /JUMP IF NOT LINC /GOTO LINC MODE LTAPINS,.-. /WILL BE "RDE" OR "WRI" OR "RDE U" OR "WRI U" LTBLOCK,.-. /WILL BE DESIRED BLOCK NUMBER PDP /BACK TO PDP-8 MODE TAD LTCORE /GET TRANSFER ADDRESS TAD (BLKSIZE) /NOW HAVE ENDANGERED WORD'S ADDRESS DCA LTEMP /SAVE IT LTSVFLD,.-. /WILL BE CDF TRANSFER FIELD TAD I LTEMP /GET ENDANGERED WORD DCA LTSAVIT /SAVE IT TAD (100) /GET TEST BIT LMR /LOAD MAINTENANCE REGISTER JMP .-1 /WILL SKIP WHEN TAPE IS DONE LT7600, CLA!400 /CLEAN UP TAD LTSAVIT /GET ENDANGERED WORD DCA I LTEMP /RESTORE IT LTINHBT,.-. /WILL BE CIF OUR FIELD INSTRUCTION LINC /GOTO LINC MODE LT3, TAC /GET TAPE ACCUMULATOR PDP /BACK TO PDP-8 MODE CLL IAC /LINK IS SET IF NO PARITY ERRORS IF /READING, GARBAGE VALUE IF WRITING CLA IAC RTL /FORM (WRI&4)+(RDE&2&(NO PARITY ERROR)) AND LTAPINS /AC=4 (IF WRITING) OR AC=2 (IF READING /AND NO PARITY ERROR) SNA CLA /SKIP IF WRITING OR NO PARITY ERROR WHILE READING JMP LTERR /JUMP ON READ PARITY ERROR TAD LTEMP /GET PROTECTED ADDRESS DCA LTCORE /USE NEXT TIME FOR TRANSFER ADDRESS ISZ LTBLOCK /BUMP TO NEXT BLOCK TAD LTPAGCT /GET THE PAGE COUNT XLIST OFF IFZERO BLKSIZE-400 < XLIST ON TAD (-BLKSIZE) /ACCOUNT FOR LATEST TRANSFER XLIST OFF > IFZERO BLKSIZE-200 < XLIST ON TAD LT7600/(-200) /ACCOUNT FOR LATEST TRANSFER XLIST OFF > XLIST ON SNA /ANY LEFT TO DO? JMP LTDONE /NO, RETURN TO CALLER DCA LTPAGCT /YES, SAVE FOR NEXT TIME JMP LTNEXT /GO DO NEXT BLOCK LTERR, ISZ LTRYCNT /TOO MANY ERRORS? JMP LTNEXT /NO, GO READ IT AGAIN NL4000 /GET PRESET BIT TRC /RESET THE TAPE CONTROLLER SKP /FORGET IT LTDONE, ISZ LINCTAPE /BUMP TO SUCCESSFUL RETURN LTEXIT, .-. /WILL BE CIF CDF RETURN FIELD JMP I LINCTAPE /RETURN TO CALLER LTCORE, .-. /TRANSFER ADDRESS LTEMP, .-. /TEMPORARY LTPAGCT,.-. /PAGE COUNTER LTRYCNT,.-. /RETRY COUNTER LTSAVIT,.-. /TEMPORARY PAGE BUFFER= . /I/O BUFFER HERE / REGULAR LINC-8 LINCTAPE HANDLER XLIST OFF IFNDEF OFF IFNDEF ON XLIST ON / P?S/8 NON-SYSTEM LINCTAPE HANDLER FOR THE REGULAR (UN-MODIFIED) LINC-8. / LAST EDIT: 17-APR-1986 10:00:00 CJL / MAY BE ASSEMBLED WITH '/J' SWITCH SET. / FEATURES: / 1) SUPPORT OF EIGHT UNITS (0-7). / 2) STORAGE OF LATEST BLOCK SEARCHED. / 3) CUSTOM OVERSHOOT FACTOR. / 4) CORRECT INITIAL SEARCH DIRECTION BY COMPARING THE DESIRED / BLOCK TO THE LATEST BLOCK SEARCHED, OFFSET BY THE CUSTOM / OVERSHOOT FACTOR. / 5) PARITY ERROR DETECTION. XLIST OFF IFNDEF BLKSIZE IFZERO BLKSIZE-200 < XLIST ON / 6) SUPPORTS 128 WORDS/BLOCK LINCTAPES. XLIST OFF > IFZERO BLKSIZE-400 < XLIST ON / 6) SUPPORTS 256 WORDS/BLOCK LINCTAPES AS A NON-STANDARD FEATURE / OF THIS HANDLER. XLIST OFF > XLIST ON / RESTRICTIONS: / 1) NO RETRIES ON ERROR. / 2) LATEST BLOCK SEARCHED IS IGNORANT OF CHANGE OF LOGICAL UNIT. PAGE /START ON A GOOD BOUNDARY HERE= . /WHERE WE ARE / DEFINITIONS. XLIST OFF IFZERO BLKSIZE-200 < XLIST ON BLKSIZE=0200 /128 WORDS/BLOCK XLIST OFF > IFZERO BLKSIZE-400 < XLIST ON BLKSIZE=0400 /256 WORDS/BLOCK XLIST OFF > XLIST ON IAAC= 6171 /READ LINC "A" REGISTER IACA= 6167 /LOAD LINC "A" REGISTER IACF= 6175 /LOAD LINC INDICATOR FLIP-FLOPS ICON= 6141 /LOAD INTERFACE CONTROL INTS= 6147 /READ INTERFACE STATUS IZSA= 6173 /LOAD LINC "Z" REGISTER INTO LINC "A" REGISTER LTLENGT=4000 /LINCTAPE BLOCK COUNT XLIST OFF IFNDEF L8TAPE XLIST ON NL0002= CLA CLL CML RTL /LOAD AC WITH 0002 NL7777= CLA CMA /LOAD AC WITH 7777 REVISIO="A&77 /REVISION OF HANDLER / DEVICE HANDLER HEADER BLOCK. XLIST OFF IFZERO BLKSIZE-200 < XLIST ON *"L&177;*"I&177;*"N&177 /GROUP NAME *-1 /GROUP COUNT *"L&177;*"I&177;*"N&177 /DEVICE NAME XLIST OFF > IFZERO BLKSIZE-400 < XLIST ON *"L&177;*"I&177;*"D&177 /GROUP NAME *-1 /GROUP COUNT *"L&177;*"I&177;*"D&177 /DEVICE NAME XLIST OFF > XLIST ON *L8TAPE&177 /ENTRY POINT *LTLENGTH-1 /LENGTH EXPRESSED AS HIGHEST BLOCK *REVISION /REVISION OF HANDLER *HERE /RESET ORIGIN L8TAPE, .-. /ENTRY POINT NL0002 /SET INSTRUCTION FIELD BIT RDF /GET CALLING FIELD TAD (CDF) /NOW HAVE CIF CDF RETURN FIELD INSTRUCTION DCA L8OUT /STORE IN-LINE TAD I L8TAPE /GET PARAMETER POINTER DCA L8WAIT /STASH IT TAD I L8WAIT /GET TRANSFER ADDRESS DCA L8BUFF /SAVE IT ISZ L8WAIT /BUMP TO NEXT TAD I L8WAIT /GET FUNCTION WORD RAL /MOVE UP XLIST OFF IFZERO BLKSIZE-400 < XLIST ON AND (-BLKSIZE) /JUST PAGE BITS XLIST OFF > IFZERO BLKSIZE-200 < XLIST ON AND L87600/(-BLKSIZE) /JUST PAGE BITS XLIST OFF > XLIST ON DCA L8PCNT /SAVE AS PAGE COUNT RAR /RECOVER READ/WRITE BIT TAD L83/(3) /ADD ON BLOCK MODE BITS DCA L8FUNCT /SAVE AS TAPE FUNCTION TAD I L8WAIT /GET FUNCTION WORD AGAIN AND L870/(70) /JUST FIELD BITS TAD (CDF) /TURN INTO TRANSFER CDF DCA L8TRFLD /SAVE IN-LINE TAD I L8WAIT /L RW P P P P P F F F U U U RAR /U L RW P P P P P F F F U U AND L83/(3) /U 0 0 0 0 0 0 0 0 0 0 U U IACF /LOAD UNIT FLIP-FLOPS ONLY! NL7777 CML RAR /1 UC 1 1 1 1 1 1 1 1 1 1 1 TAD L83/(3) /L U 0 0 0 0 0 0 0 0 0 1 0 DCA L8UNIT /SAVE UNIT AND SEARCH BITS ISZ L8WAIT /BUMP TO BLOCK ARGUMENT TAD L8BLOCK /GET CURRENT BLOCK CIA /INVERT TAD I L8WAIT /FORM DIFFERENCE WITH DESIRED TAD L8OVSHT /ADD ON OVERSHOOT FACTOR DCA L8DIR /SAVE AS INITIAL DIRECTION TAD I L8WAIT /GET BLOCK ARGUMENT DCA L8BLOCK /SET IT UP ISZ L8TAPE /BUMP TO ERROR RETURN L84002, IOF /PREVENT PROBLEMS! L8NEXT, ISZ L8BLOCK /BUMP UP FOR ONE'S COMPLEMENT L83, 3 /BLOCK 7777 WOULD SKIP! XLIST OFF IFZERO BLKSIZE-400 < XLIST ON TAD (-BLKSIZE) /SETUP XLIST OFF > IFZERO BLKSIZE-200 < XLIST ON TAD L87600/(-BLKSIZE) /SETUP XLIST OFF > XLIST ON DCA L8COUNT /PAGE WORD COUNT DCA L8CHKSM /CLEAR CHECKSUM TAD L8DIR /GET INITIAL DIRECTION RAL /INTO LINK L87600, CLA!400 /CLEAN UP DCA L8DIR /ALL OTHERS FORWARD TAD L8UNIT /D U 0 0 0 0 0 0 0 0 0 1 0 ICON /LOAD UNIT AND SEARCH CML RAR /0 DC U 0 0 0 0 0 0 0 0 0 1 L8SER1, ICON /LOAD NEW DIRECTION L8SER2, JMS L8WAIT /WAIT FOR A BLOCK MARK SMA /NEGATIVE BLOCK NUMBERS? CML /YES, REVERSE OUR INTENT TAD L8BLOCK /COMPARE TO DESIRED BLOCK SNA /SKIP IF NOT FOUND JMP L8COULD /JUMP IF POSSIBLE SZL /RIGHT DIRECTION ANYWAY? JMP L8SER2 /YES, JUST KEEP GOING SMA CLA /REVERSE? STL RAR /NO, FORWARD ICON /STOP THE TAPE IAC /NOW SET TO CHANGE DIRECTION JMP L8SER1 /TURN AROUND THERE L8COULD,SNL CLA /GOING FORWARD? JMP L8SER2 /NO, UNDERSHOOT AND TRY AGAIN TAD L8FUNCT /GET A 3 ICON /GOTO BLOCK MODE SPA /WRITING? TAD L84002/(4002) /YES ICON /REDUNDANT OR TURN WRITERS ON SZL CLA /READING? JMS L8WAIT /YES, WAIT FOR GUARD WORD L8TRFLD,.-. /WILL BE CDF TRANSFER FIELD L8TRLUP,TAD I L8BUFF /GET A WORD JMS L8WAIT /WAIT FOR IT DCA I L8BUFF /PUT A WORD TAD I L8BUFF /RETRIEVE WORD TAD L8CHKSM /UPDATE CHECKSUM DCA L8CHKSM /STORE IT BACK ISZ L8BUFF /BUMP TO NEXT WORD L870, 70 /JUST IN CASE ISZ L8COUNT /DONE WITH THIS BLOCK? JMP L8TRLUP /NO, KEEP GOING TAD L8CHKSM /GET CHECKSUM IN CASE WRITING CIA /INVERT IT JMS L8WAIT /WRITE IT OR READ IN NEW ONE TAD L8CHKSM /WRITE ERROR IMPOSSIBLE SZA CLA /SKIP IF NO READ PARITY ERROR JMP L8ERROR /BARF JMS L8WAIT /WAIT FOR LAST TO BE WRITTEN STL CLA /CLEAN UP TAD L8PCNT /GET PAGE COUNT XLIST OFF IFZERO BLKSIZE-400 < XLIST ON TAD (-BLKSIZE) /DECREMENT IT XLIST OFF > IFZERO BLKSIZE-200 < XLIST ON TAD L87600/(-BLKSIZE) /DECREMENT IT XLIST OFF > XLIST ON SNA /DONE? JMP L8DONE /YES, FINISH UP THERE DCA L8PCNT /NO, SAVE FOR NEXT TIME JMP L8NEXT /GO DO ANOTHER BLOCK L8DONE, ISZ L8TAPE /BUMP TO GOOD RETURN L8ERROR,ICON /STOP THE TAPE L8OUT, .-. /WILL BE CIF CDF RETURN FIELD JMP I L8TAPE /RETURN L8WAIT, .-. /WAIT ROUTINE IACA /LOAD A IN CASE WRITING CLA /CLEAN UP TAD L87/(7) /GET CLEAR BITS ICON /CLEAR TAPE FLAG CLA /CLEAN UP L87, INTS /GET STATUS SMA /SKIP IF TAPE FLAG UP JMP L87 /JUMP IF NOT STL RAR /SAVE DIRECTION, FORM FUNCTION MASK AND L8FUNCT /NOW HAVE READ/WRITE FUNCTION SPA CLA /READING? IZSA /NO, RESTORE A IAAC /GET A EITHER WAY JMP I L8WAIT /RETURN L8BLOCK,.-. /BLOCK TEMPORARY L8BUFF, .-. /BUFFER POINTER L8CHKSM,.-. /CHECKSUM TEMPORARY L8COUNT,.-. /PAGE WORD COUNT L8DIR, .-. /CURRENT DIRECTION L8FUNCT,.-. /FUNCTION TEMPORARY L8OVSHT,7771 /OVERSHOOT FACTOR L8PCNT, .-. /PAGE COUNT L8UNIT, .-. /UNIT AND SEARCH TEMPORARY PAGE IFNZRO .&177 LTBODT= . /START OF LTBODT SYSTEM L70, 70 /HERE IN CASE WE'RE CHAINED TO TAD I L7600/[SBOOT] /GET BOOTSTRAP INSTRUCTION TAD (-JMSSYSIO) /COMPARE TO POSSIBLE VALUE SNA CLA /SKIP IF DIFFERENT JMP CHKCOVRLAY /JUMP IF IT MATCHES ISZ CHKKRS /TURN "KRSIOT" ISZ CHKKRS /INTO "KRBIOT" DCA CHKKCC /DESTROY "KCCIOT" CHKCOVR,NL0002 /SET "C" BIT MASK AND I [SCRSIZE] /GET THE BIT SNA CLA /SKIP IF "C" BIT SET JMP STARTIT /JUMP IF NOT TAD I [SCRSIZE] /GET THE CORE SIZE WORD RTR;RAR /MOVE OVER AND AND L70/(70) /ISOLATE MCS BITS TAD (CIF 10) /TURN INTO "CIF MCS+10" DCA P7TSF /STORE OVER "TSFIOT" TAD P7JMP /GET "JMP I P7OUT" DCA P7TLS /STORE OVER "TLSIOT" TAD (JMS OUTCON) /GET OUTPUT CALL DCA P7JMP /STORE OVER "JMP I P7OUT" TAD P7TSF /GET "CIF MCS+10" DCA CHKKSF /STORE OVER "KSFIOT" TAD CHKJMP /GET "JMP I CTLCTST" DCA CHKKRS /STORE OVER "KRSIOT" (OR "KRBIOT" TAD (JMS INCON) /GET INPUT CALL DCA CHKJMP /STORE OVER "JMP I CTLCTST" DCA CHKKCC /DESTROY "KCCIOT" DCA I (VMCLR) /DESTROY "KCCIOT" STARTIT,TAD I (SBTFUN) /GET BOOTSTRAP FUNCTION RAR;CML RAL /INVERT LOW-ORDER BIT AND [7] /JUST UNIT BITS DCA CHKUNT /SAVE AS CURRENT WORD SEARCH UNIT TAD CHKUNT /GET IT BACK DCA CURUNT /SAVE AS CURRENT UNIT TAD CURUNT /GET IT BACK DCA PRVUNT /SAVE AS PREVIOUS UNIT TAD PRVUNT /GET IT BACK DCA DMPUNT /SAVE AS "\" UNIT TAD DMPUNT /GET IT BACK DCA UNIT /SAVE AS SEARCH UNIT DCA PRVBLK /CLEAR PREVIOUS BLOCK DCA PRVADR /CLEAR PREVIOUS ADDRESS LINC /GOTO L...MODE COM /TRY TO COMPLEMENT THE AC PDP /BACK TO GOODY MODE IAC /DID WE COMPLEMENT? SNA CLA /SKIP IF NOT JMP I [BEGIN] /GO START IT UP, WE'RE A PDP-12 NL7777 /SET SOME BITS IACA /LOAD "A" REGISTER LINCNT, CLA!400 /CLEAN UP IAAC /READ THEM BACK IAC /INCREMENT SZA CLA /SKIP IF WE'RE A LINC-8 JMP NOHARDWARE /ELSE BARF L8MOVE, TAD I L8PTR /GET A WORD DCA I L12PTR /PUT A WORD ISZ L8PTR /BUMP TO NEXT ISZ L12PTR /LIKEWISE ISZ LINCNT /DONE YET? JMP L8MOVE /NO, GO BACK JMP I [BEGIN] /GO START IT UP NOHARDW,JMS I [SCRIBE] /TELL THEM NOLMSG /THEY LOSE JMP I L7600/[SBOOT] /GOODBYE! L8PTR, L8TAPE&7600 /WHERE LINC-8 LINCTAPE ROUTINE IS L12PTR, LINCTAPE&7600 /WHERE PDP-12 LINCTAPE ROUTINE IS IFNZRO LINCTAPE-L8TAPE&177 NOLMSG, TEXT "NO LINCTAPE HARDWARE!" PAGE $ /HERE COME THE LITERALS!