/ DUMPLT PDP-12 LINCTAPE DUMP PROGRAM I.E. CAPTURE A LINCTAPE / 13 JUL 2017 WRS / / 4K, NO INTERRUPTS, PRESERVES 7600-7777 FOR OS/8 / / THIS PROGRAM READS A LINCTAPE AND SENDS IT OUT THE SERIAL PORT. / / NOTE: REQUIRES OPERATOR TO DETECT 'SHOE SHINING' WHEN TRYING TO / READ PAST END OF TAPE AND TOGGLE SR0. / / THE PC PROGRAM THAT RECEIVES THE DATA SHOULD BY STARTED BEFORE THE PROGRAM. / / TO RUN: / START PROGRAM ON PC TO RECEIVE THE DATA. / MOUNT A LINCTAPE: / UNIT 0 / DOES NOT NEED WRITE ENABLE. / REMOTE. / SET SWITCH REGISTER TO 0000. / PDP8 MODE (NOT LINC). / I/O PRESET. / START 20 (OR START 200). / IF IT IMMEDIATELY HALTS AT 233, SWITCH REGISTER is NOT 0000. / / MQ DISPLAYS THE BLOCK BEING READ. / / WHEN THE PROGRAM TRIES TO READ PAST THE END OF THE TAPE, / IT WILL 'SHOESHINE': / / OPERATOR MUST TOGGLE SR0 ON, THEN OFF TO FINISH THE DUMP/CAPTURE. / / NORMAL HALT/EXIT IS 0177, AC DISPLAYS NUMBER OF BAD READS (RETRIES). / PRESSING CONT WILL RESTART THE PROGRAM. / / THE PC PROGRAM WILL PRINT OUT THE BAD BLOCK NUMBER IF RETRIES WERE UNSUCESSFUL. / / THE PROGRAM TRIES EACH BLOCK READ UP TO 4 TIMES IF READ ERROR OCCURS. / / / / FORMAT OF DATA SENT OUT SERIAL PORT: / / / IT USES 3 DIFFENT FORMATS FOR SENDING DATA OUT THE SERIAL PORT: / / 1. BYTES SENT AS ONE BYTE/CHARACTER / / 2. 12-BIT WORD SENT AS TWO BYTES: / / BYTE 1: LOWER 8 BITS (4-11) OF THE WORD / BYTE 2: LO NYBBLE IS THE UPPER 4 BITS (0-3) / HI NYBBLE IS 0. / / I.E. TO SEND A WORD A(0..11) AS 2 BYTES: / HI NYBBLE LO NYBBLE / BYTE 1: (MSB) A4 A5 A6 A7 A8 A9 A10 A11 (LSB) / BYTE 2: (MSB) 0 0 0 0 A0 A1 A2 A3 (LSB) / / 3. TWO 12-BIT WORDS SENT AS THREE BYTES: / / BYTE 1: LOWER 8 BITS (4-11) OF THE FIRST WORD. / BYTE 2: LO NYBBLE IS THE UPPER 4 BITS (0-3) / OF THE FIRST WORD. / HI NYBBLE IS THE LOWER 4 BITS (8-11) / OF THE SECOND WORD. / BYTE 3: UPPER 8 BITS (0-7) OF THE SECOND WORD. / / I.E. TO SEND A WORDS A(0..11) and B(0..11) AS 3 BYTES: / HI NYBBLE LO NYBBLE / BYTE 1: (MSB) A4 A5 A6 A7 A8 A9 A10 A11 (LSB) / BYTE 2: (MSB) B8 B9 B10 B11 A0 A1 A2 A3 (LSB) / BYTE 3: (MSB) B0 B1 B2 B3 B4 B5 B6 B7 (LSB) / / NOTE: PACKS THEM LSBS FIRST. / / THE FORMAT OF THE LINCTAPE DATA SENT IS: / FOR EACH LINCTAPE BLOCK (IN SQUENTIAL ORDER, STARTING WITH 0) / STATUS BYTE SENT AS 1 BYTE. / 0XFF (0377) IF NO READ ERROR. / 0XFD (0375) IF ERROR READING BLOCK. / BLOCK NUMBER (12-BIT) SENT AS 2 BYTES. / BLOCK SIZE (12-BIT) SENT AS 2 BYTES. / BLOCK DATA (12-BIT) EACH 2 WORDS SENT AS 3 BYTES. / If BLOCK SIZE is ODD (129), THE LAST WORD IS SENT AS 2 BYTES. / AFTER THE LAST BLOCK: / STATUS BYTE/END OF DATA SENT AS 1 BYTES. / 0xFE (0376) END OF DATA, CHECKSUM FOLLOWS. / CHECKSUM (12-BIT) SUM OF ALL BLOCK DATA SENT, SENT AS 2 BYTES. / /INAD=030 / DEVCODE * 10 OF SERIAL INPUT, 30 IS DEV 03 CONSOLE. INAD=400 / DEVCODE * 10 OF SERIAL INPUT, 400 FOR DEV 40 KL8E. KSF2=6001 INAD KRB2=6006 INAD /OUTAD=040 / DEVCODE * 10 OF SERIAL OUTPUT, 40 FOR DEV 04 CONSOLE. OUTAD=410 / DEVCODE * 10 OF SERIAL OUTPUT, 410 FOR DEV 41 KL8E. TSF2=6001 OUTAD TLS2=6006 OUTAD / PDP-12 OPCODES NEEDED LINC= 6141 /PDP-8: SWITCH TO LINC MODE PDP= 0002 /LINC: SWITCH TO PDP-8 MODE AXO= 0001 /LINC: AC -> EXTENDED TAPE OPERATIONS BUFFER TMA= 0023 /LINC: AC -> TAPE MEMORY ADDRESS SETUP REGISTER TAC= 0003 /LINC: TAPE ACCUMULATOR BUFFER -> AC STD= 0416 /LINC: SKIP IF TAPE DONE COM= 0017 /LINC: COMPLEMENT AC ESF= 0004 /LINC: AC(2-6) -> SPECIAL FUNCTION REGISTER / BIT 2: 1=INSTRUCTION TRAP / BIT 3: 1=TAPE TRAP / BIT 4: DISPLAY CHARACTER SIZE- 0=HALF, 1=FULL / BIT 5: FAST SAMPLE A/D CHANNELS / BIT 6: DISABLE TELETYPE INTERRUPT / BIT 7: I/O PRESET PULSE TMIR= 6151 /PDP-8: LOAD TAPE MAINTENANCE INSTRUCTION REG / BITS 0-3: 0100 TMA SETUP -> AC / 0101 TBN -> AC / 0110 TB -> AC / 1110 TMA -> AC / BIT 4: 1=CLEAR TAPE DONE FLAG / BIT 5: 1= SKIP IF TAPE DONE FLAG IS SET. / BITS 6-11: SIMULATE TAPE SIGNALS (FOR TESTING) TMTR= 6154 /PDP-8: TRANSFER TAPE MAINTENANCE REGISTER TO/FROM AC *0000 0 /PDP8 INTERRUPT RETURN ADDRESS HLT /INTERRUPTS NOT ENABLED JMP .-1 /HANG IT UP *10 /AUTO INCREMENT LOCATIONS *20 JMP I .+1 / SO START 20 WORKS. START /PAGE ZERO CONSTANTS K0017, 0017 /LOW 4 BITS K0020, 0020 K0100, 0100 K0360, 0360 K0376, 0376 /FE FOR CHECKSUM K0377, 0377 /FF FOR GOOD BLOCK K7000, 7000 /PAGE ZERO VARIABLES BUFADR, BUFFER /ADDRESS OF BUFFER START BUFOVF, -BUFEND /MINUS OF BUFFER END FOR OVERFLOW TEST RETRY, -4 /TRY UP TO 4 TIME TRIES, 0 /ISZ COUNTER, TRIES REMAINING BADCNT, 0 /NUMBER OF RETRIES I.E.BAD READS ERRCNT, 0 /NUMBER BAD BLOCKS (FAILED ALL TRIES) /LINC TAPE ROUTINE VARIABLES BLKPTR, 0 /POINTER TO BUFFER FOR THE BLOCK READ (3 HEADER + DATA) BLOCK, 0 /CURRENT TAPE BLOCK BEING READ QUIT, 0 /NONZERO: READ WAS ABORTED BY OPERATOR (OFF END AND SHOE SHINING) /IF QUIT IS 0, CHECK AND BLKLEN ARE VALID CHECK, 0 /READ CHECK VALUE, 7777 IF GOOD. BLKLEN, 0 /BLOCK LENGTH THAT WAS READ CHKSUM, 0 /SUM OF ALL DATA WORDS SENT TEMP, 0 /TEMPORARY BLKCNT, 0 /BLOCKS IN BUFFER COUNTER OUTCTR, 0 /ISZ COUNTER FOR SEND LOOP BLKNXT, 0 /BUFFER ADDRESS FOR NEXT BLOCK HDRLEN, 3 /BUFFER WORDS USED FOR BLOCK HEADER / STATUS (FF OR FD) / BLOCK NUMBER / BLOCK LENGTH /ADDRESSES FOR JMS INDIRECT LTREAD=JMS I . /LINCTAPE READ A BLOCK (LTREAI) LTREAI /LINCTAPE READ A BLOCK (LTREAI) OUTBLK=JMS I . /SEND A BLOCK OUT SERIAL PORT OUTBLI /PAGE 0 ROUTINES SEND, 0 /SEND BYTE OUT THE SERIAL PORT (AC IS UNMODIFIED) TLS2 /SEND IT TSF2 /DONE? JMP .-1 /WAIT TIL DONE JMP I SEND SEND2, 0 /SEND WORD AS 2 BYTES OUT THE SERIAL PORT, RETURNS AC=0 /AC IS THE WORD TO SEND JMS SEND /SEND THE BYTE (AC UNMODIFIED) RTR /BITS 0-3 ARE NOW IN 2-5 RTR /BITS 0-3 ARE NOW IN 4-7 RTR /BITS 0-3 ARE NOW IN 6-9 RTR /BITS 0-3 ARE NOW IN 8-11 AND K0017 /CLEAR UPPER, KEEP 8-11 JMS SEND /SEND THE BYTE (AC UNMODIFIED) CLA /LEAVE AC WITH ZERO JMP I SEND2 GETNB, 0 /SUBROUTINE TO GET NEXT BLOCK BUFFER ADDRESS /SETS LINK IF NO ROOM, STORES INTO BLKNXT CLA CLL /CLEAR AC AND LINK TAD BLKPTR /GET START OF CURRENT BLOCK TAD HDRLEN /SKIP HEADER WORDS TAD BLKLEN /SKIP BLOCK DATA (COULD SET LINK IF BIG BLOCK) SZL /SKIP IF OKAY JMP GETNB1 /OVERFLOWED, NO ROOM (LINK IS SET) /(LINK IS CLEARED) DCA BLKNXT /STORE ADDRESS OF NEXT BLOCK /CHECK IF PAST END OF BUFFER TAD BLKNXT TAD BUFOVF /SETS LINK IF OVERFLOWED (NO ROOM) GETNB1, JMP I GETNB /EXIT *177 FINISH, HLT /NORMAL HALT *200 /STARTING ADDRESS START, LAS /CHECK SWITCH REGISTER IS 0000 SNA JMP START2 HLT /SWITCH REGISTER MUST BE 0000 JMP START START2, CLA DCA BLOCK /START AT BLOCK 0 DCA CHKSUM /INITIAL CHECK SUM DCA BADCNT /NUMBER OF BAD BLOCKS DCA ERRCNT /NUMBER OF BAD READS RDBUF, /READ BLOCKS INTO THE BUFFER CLA TAD BUFADR /GET START OF BUFFER DCA BLKPTR /BUFFER ADDRESS FOR THIS BLOCK DCA BLKCNT /CLEAR BLOCKS IN BUFFER COUNTER READLP, /READ ONE BLOCK INTO BUFFER CLA TAD RETRY /ISZ COUNTER DCA TRIES /TRIES REMAINING /DISPLAY BLOCK NUMBER IN MQ TAD BLOCK MQL /LOAD MQ FROM AC, CLEAR AC TRYONE, /TRY READING A BLOCK (ONE TRY) LTREAD /JMS TO LINCTAPE READ A BLOCK (LTREAI) / BLKPTR IS BUFFER ADDRESS TO STORE DATA / BLOCK IS THE BLOCK TO READ /RETURNS (STORES): / QUIT = 0 READ COMPLETED, CHECK AND BLKLEN VALID / = NOT ZERO, OPERATOR ABORTED / CHECK = CHECK WORD, =7777 IF OKAY / BLKLEN = BLOCK LENGTH READ / LINK SET IF ABORTED BY OPERATOR, / LINK NOT SET IF READ COMPLETED SZL /SKIP IF BLOCK FOUND JMP OUTBUF /ABORTED BY OPERATOR, SEND THE BUFFER (IF ANY) /BLOCK WAS FOUND. LOOK AT CHECK WORD (7777 IF GOOD) CLA TAD CHECK /=7777 IF GOOD READ CMA /COMPLEMENT AC (=0000 IF GOOD) SNA /SKIP IF BAD JMP GOOD /AC IS ZERO (GOOD) /BAD READ, TRY IT AGAIN /BUMP BAD READ COUNT, BUT NOT PAST 7777. CLA TAD BADCNT IAC SZA /DON'T STORE IF OVERFLOW (I.E. SATURATE AT 7777) DCA BADCNT ISZ TRIES /ANY TRIES REMAINING? JMP TRYONE /OUT OF TRIES, SET STATUS AS BAD BLOCK /BUMP BAD BLOCK COUNT, BUT NOT PAST 7777. CLA TAD ERRCNT IAC SZA /DON'T STORE IF OVERFLOW (I.E. SATURATE AT 7777) DCA ERRCNT CLA IAC /AC = 0001 CMA /AC = 7776 (-2) IF BAD /JMP GOOD GOOD, /AC = 0000 IF GOOD, =-2 IF BAD TAD K0377 /AC = 0377( FF) IF GOOD, AC = 375 (FD) IF BAD DCA I BLKPTR /SAVE READ STATUS IN BUFFER TAD BLKPTR IAC DCA TEMP TAD BLOCK DCA I TEMP /SAVE BLOCK NUMBER IN BUFFER ISZ TEMP NOP /SAFETY NET (IF POINTER WRAPS, WE'RE DEAD) TAD BLKLEN DCA I TEMP /SAVE BLOCK LENGTH IN BUFFER /DONE WITH BLOCK, READ ANOTHER IF ROOM IN BUFFER ISZ BLKCNT /BUMP NUMBER OF BLOCKS IN BUFFER ISZ BLOCK /GET NEXT BLOCK NUMBER /SETUP POINTER FOR NEXT BLOCK JMS GETNB /GET BUFFER ADDRESS OF NEXT BLOCK (SETS LINK IF OVERFLOW) SZL CLA /SKIP IF OKAY JMP OUTBUF /CAN'T HAPPEN IF BLOCKS ARE ALL THE SAME SIZE /I.E. THERE WAS ROOM, BUT NOW THE BUFFER IS FULL ??!! / SO SEND THE BUFFER. TAD BLKNXT DCA BLKPTR /POINT TO NEXT BLOCK JMS GETNB /SEE IF ROOM FOR THE NEW BLOCK (ASSUME CURRENT BLOCK LENGTH) SNL /SKIP IF NO ROOM FOR NEXT BLOCK) JMP READLP /WE HAVE ROOM, READ ANOTHER /JMP OUTBUF /SEND THE BUFFER OUTBUF, CLA TAD BUFADR /POINT TO START OF BUFFER DCA BLKPTR TAD BLKCNT /SEE IF ANY BLOCKS SNA /SKIP IF BLOCKS JMP DONE /DONE IF NO BLOCKS CIA DCA BLKCNT /SAVE AS ISZ COUNTER OUTONE, /SEND ONE BLOCK /SEND DATA BLOCK OUTBLK /JMS TO SEND A BLOCK OUT SERIAL PORT ISZ BLKCNT JMP OUTONE /SEND ANOTHER BLOCK CLA TAD QUIT /STILL READING? SNA JMP RDBUF /READ ANOTHER BUFFER FULL DONE, CLA /SEND FE AND -CHECKSUM OF ALL WORDS TAD K0376 /FE JMS SEND /SEND THE BYTE (AC UNMODIFIED) CLA CLL TAD CHKSUM /SEND MINUS OF CHECKSUM IN 2 BYTES CIA JMS SEND2 /SEND AC AS 2 BYTES, RETURNS AC=0 /REWIND TAPE BY READING BLOCK 0 CLA DCA BLOCK TAD BUFADR DCA BLKPTR LTREAD /JMS TO LINCTAPE READ A BLOCK (LTREAI) / BLKPTR IS BUFFER ADDRESS TO STORE DATA / BLOCK IS THE BLOCK TO READ /RETURNS (STORES): / QUIT = 0 READ COMPLETED, CHECK AND BLKLEN VALID / = NOT ZERO, OPERATOR ABORTED / CHECK = CHECK WORD, =7777 IF OKAY / BLKLEN = BLOCK LENGTH READ / LINK SET IF ABORTED BY OPERATOR, / LINK NOT SET IF READ COMPLETED CLA TAD BADCNT /AC = NUMBER OF BAD READS JMP FINISH PAGE OUTBLI, 0 /SEND A BLOCK OUT THE SERIAL PORT /SEND STATUS CLA TAD I BLKPTR JMS SEND /SEND THE BYTE (AC UNMODIFIED) ISZ BLKPTR NOP /SAFETY NET (IF POINTER WRAPS, WE'RE DEAD) /SEND BLOCK NUMBER CLA TAD I BLKPTR JMS SEND2 /SEND AC AS 2 BYTES, RETURNS AC=0 ISZ BLKPTR NOP /SAFETY NET (IF POINTER WRAPS, WE'RE DEAD) /SEND BLOCK LENGTH CLA TAD I BLKPTR JMS SEND2 /SEND AC AS 2 BYTES, RETURNS AC=0 CLA TAD I BLKPTR /GET BLOCK LENGTH CIA DCA OUTCTR /SAVE SEND ISZ COUNTER ISZ BLKPTR NOP /SAFETY NET (IF POINTER WRAPS, WE'RE DEAD) OUTLP, ISZ OUTCTR /DECREMENT WORDS LEFT JMP OUT2WD /MORE THAN 1 LEFT, SEND 2 WORDS AS 3 BYTES /ODD WORD IS ALL THATS LEFT CLA CLL TAD I BLKPTR /GET FIRST WORD FROM BUFFER TAD CHKSUM /KEEP SUM OF ALL WORDS SENT DCA CHKSUM /SAVE UPDATED SUM TAD I BLKPTR /GET FIRST WORD FROM BUFFER, AGAIN JMS SEND2 /SEND AC AS 2 BYTES, RETURNS AC=0 ISZ BLKPTR NOP /SAFETY NET (IF POINTER WRAPS, WE'RE DEAD) JMP OUTDN /DONE SENDING BLOCK (BLOCK SIZE IS ODD) OUT2WD, /SEND 2 WORDS AS 3 BYTES CLA CLL TAD I BLKPTR /GET FIRST WORD FROM BUFFER TAD CHKSUM /KEEP SUM OF ALL WORDS SENT DCA CHKSUM /SAVE UPDATED SUM TAD I BLKPTR /GET FIRST WORD FROM BUFFER, AGAIN /SEND A4 A5 A6 A7 A8 A9 A10 A11 JMS SEND /SEND THE BYTE (AC UNMODIFIED) /GET UPPER BITS IN LOWER 4. RTR RTR RTR RTR AND K0017 DCA TEMP /SAVE UPPER BITS, = 0 0 0 0 0 0 0 0 A0 A1 A2 A3 ISZ BLKPTR /POINT TO 2ND WORD NOP /SAFETY NET (IF POINTER WRAPS, WE'RE DEAD) CLA CLL TAD I BLKPTR /GET SECOND WORD FROM BUFFER TAD CHKSUM /KEEP SUM OF ALL WORDS SENT DCA CHKSUM /SAVE UPDATED SUM TAD I BLKPTR /GET SECOND WORD FROM BUFFER, AGAIN RTL RTL AND K0360 /AC IS 0 0 0 0 B8 B9 B10 B11 0 0 0 0 TAD TEMP /AC IS 0 0 0 0 B8 B9 B10 B11 A0 A1 A2 A3 / /SEND B8 B9 B10 B11 A0 A1 A2 A3 JMS SEND /SEND THE BYTE (AC UNMODIFIED) CLA TAD I BLKPTR /GET SECOND WORD FROJM BUFFER, A THIRD TIME RTR /AC IS B11 L B0 B1 B2 B3 B4 B5 B6 RTR /SEND B0 B1 B2 B3 B4 B5 B6 B7 JMS SEND /SEND THE BYTE (AC UNMODIFIED) ISZ BLKPTR /POINT TO NEXT WORD ISZ OUTCTR /DONE WITH BLOCK? JMP OUTLP /NOT DONE OUTDN, /DONE SENDING THE BLOCK JMP I OUTBLI / LINC TAPE READ ROUTINE FOR DUMP PROGRAMS / USED BY: DUMPLT, CRCLT / VERSION A 2017/07/06 WRS PAGE LTREAI, 0 /SUBROUTINE TO READ A LINCTAPE BLOCK (LTREAD) / BLKPTR IS BUFFER ADDRESS TO STORE DATA / BLOCK IS THE BLOCK TO READ /RETURNS (STORES): / QUIT = 0 READ COMPLETED, CHECK AND BLKLEN VALID / = NOT ZERO, OPERATOR ABORTED / CHECK = CHECK WORD, =7777 IF OKAY / BLKLEN = BLOCK LENGTH READ / LINK SET IF ABORTED BY OPERATOR, / LINK NOT SET IF READ COMPLETED CLA CMA /AC = 7777 DCA QUIT /ASSUME OPERATOR ABORT (NOT 0000) DCA CHECK /ASSUME BAD CHECK WORD (NOT 7777) DCA BLKLEN /ASSUME BAD BLOCK LENGTH /SETUP FOR TAPE BLOCK READ TAD LTXOW /GET EXTENDED OPERATION WORD (EXTENDED ADDRESS, NO PAUSE, FIELD 0) LINC AXO /SEND DATA TO CONTROLLER PDP CLA TAD BLKPTR /GET BUFFER ADDRESS FOR THIS BLOCK TAD HDRLEN /SKIP HEADER WORDS DCA TEMP /SAVE TAPE BUFFER ADDRESS TAD TEMP LINC TMA /AC -> TAPE MEMORY ADDRESS SETUP REGISTER PDP CLA TAD BLOCK DCA LTWRD2 /STORE AS WORD 2 OF TAPE INSTRUCTION /READ THE TAPE BLOCK LINC 0702 /LINCTAPE INSTRUCTION /BITS 0-5 = 07 OPCODE /BIT 6 = 0 OPCODE /BIT 7 = 0 STOP MOTION /BIT 8 = 0 0=UNIT 0 /BITS 9-11 = 2 OPERATION (2 = READ W/O CHECK) LTWRD2, 0 /WORD 2 (BLOCK NUMBER) PDP /WAIT FOR DONE OR OPERATOR ABORT LTWAIT, /WAIT FOR TAPE DONE LAS /READ SWITCH REGISTER SPA CLA /SKIP IF SR0 IS OFF JMP LTQUIT /OPERATOR SET SR0, RESET AND EXIT TAD K0100 /SET BIT 5 TO SKIP IF TAPE DONE TMIR /SKIP IF TAPE DONE JMP LTWAIT /KEEP WAITING /TAPE DONE IS SET /CALCULATE BLOCK LENGTH CLA TAD TEMP /START OF TAPE BUFFER CIA /TWO'S COMPLEMENT DCA TEMP /TEMPORARY IS MINUS START OF BLOCK /GET TAPE MEMORY ADDRESS (WHERE NEXT WORD WOULD STORE) /USING TAPE MAINTENANCE REGISTERS CLA TAD K7000 /SELECT TMA -> AC TMIR /SET TAPE MAINTENANCE INSTRUCTION REGISTER CLA TMTR /READ TMA (TAPE MEMORY ADDRESS) /AC IS (LAST WORD + 1) POINTER TAD TEMP /MINUS START OF BUFFER DCA BLKLEN /SAVE BLOCK LENGTH /GET CHECK WORD LINC /GET THE CHECK FROM THE TAPE ACCUMULATOR (TAC) TAC /AC IS THE CHECK WORD (SHOULD BE 7777) PDP DCA CHECK /SAVE CHECK WORD (SHOULD BE 7777) CLA CLL /CLEAR LINK (READ COMPLETED) DCA QUIT /CLEAR QUIT FLAG JMP LTEXIT /DONE LTQUIT, /OPERATOR ABORTED. /ABORT LINC TAPE INSTRUCTION CLA /FORCE I/O PRESET TAD K0020 /BIT 7 1=I/O PRESET PULSE LINC ESF /AC -> SPECIAL FUNCTION REG PDP LTWT2, LAS /WAIT FOR SR0 OFF SPA /SKIP IF SR0 IS OFF JMP LTWT2 /WAITING FOR SR0 TO BE OFF CLL CML /SET LINK (BAD READ) /JMP LTEXIT LTEXIT, JMP I LTREAI LTXOW, 0030 /TC12 EXTENDED OPERATION WORD /BITS 0-2 000 EXTENDED MEMORY ADDRESS (PDP8 FIELD) /BIT 3 0 NOT USED /BIT 4 0 MARK CONDITION, 0=OFF /BIT 5 0 TAPE INTERRUPT, 0=DISABLE /BIT 6 0 MAINTENANCE MODE, 0=OFF /BIT 7 1 EXTENDED ADDRESS MODE, 1=ON /BIT 8 1 NO PAUSE DURING EXECUTION, 1=ON /BIT 9 0 HOLD UNIT MOTION, 0=NO /BITS 10-11 0 EXTENDED UNITS, 00=UNITS 0/1 PAGE BUFFER=. /BUFFER /EACH BLOCK IS STORED AS 'BLOCK LENGTH + 3' WORDS: / STATUS BYTE: 0377 (0xFF) IF GOOD, 0375 (0xFD) IF BAD / BLOCK NUMBER: / BLOCK LENGTH: / BLOCK DATA ('BLOCK LENGTH' WORDS) BUFEND=7500 /PRESERVE 7600-7777 FOR OS/8 $