& :( (0  P  n"*,( ZA " ? ,L 9A ?   &   :.  P  nv*( ZA " ?*L 9A ?   & *p9A l?  X?*  L?   * ^  }* ? A`\r *d N%H>L F$*$?D : 42W!d\R*H ;TOG-11 V.03 ;TC11 DECTAPE FORMATTER ;ROBERT J. COLLINS ;JUNE 27, 1970 ;MODIFIED MAY 12,1971 ;RE-MODIFIED JULY 4, 1972 BY M. KLEIN ;FORMAT DECTAPES ON UNIT 0 IN STANDARD FORMAT OF ;578(10) BLOCKS WITH 256(10) 18 BIT WORDS PER BLOCK. R0=%0 ;REGISTER DEFINITIONS R1=%1 R2=%2 R3=%3 R4=%4 R5=%5 R6=%6 R7=%7 SP=R6 PC=R7 XX=HALT SR=177570 ;SWITCH REGISTER PS=177776 ;PROCESSOR STATUS NOP=240 P0=0 ; UPDATE: 12-JUL-72 CRDOS.S2B ;DATE: 11-OCT-71 ;DATE: 7-OCT-71 ;VERSION NUMBER: V002A ;THIS VERSION OF DEC'S CARD READER DRIVER IS MODIFIED TO READ ;UNIVAC "FIELDATA" CARD CODE WHEN ASSEMBLED WITH "DEFALT" DEFINED. ;IN ADDITION, CHANGES TO OPERATION OF TRAILING BLANK SUPPRESSION ;AND OF SEQUENCE NUMBER (COLS. 73-80) SUPPRESSION ARE MADE ;AND ARE DESCRIBED BELOW. ;CARD READER DRIVER (CR) ; ; A) FOR ASCII INPUT. AT EACH TRANSFER REQUEST ; ONE CARD WILL BE READ. UP TO 80 CHARAC ,p9A l?  X?,  L?   , ^  }, ? A`\rM \$r,d N%H>L F7,$?D : 42W!d\Rwd"\&R^,H ?  _,l? p?  Z ?  L*l? p?  Z* j? 7  <- *? *  ? |n@*mffZ R J%BD* @ 'A0."  $*D -)? *h ? /? $0)> J? "*  * ;PI PRIORITY LEVELS P1=40 P2=100 P3=140 P4=200 P5=240 P6=300 P7=340 B0=1 ;BIT POSITION CONSTANTS B1=2 B2=4 B3=10 B4=20 B5=40 B6=100 B7=200 B8=400 B9=1000 B10=2000 B11=4000 B12=10000 B13=20000 B14=40000 B15=100000 POP=5726 ;POP STACK ONCE,=TST(6)+ POPPOP=22626 ;POP STACK TWICH,=CMP (6)+,(6)+ CR=15 ;CARRIAGE RETURN LF=12 ;LINE FEED TERS, ; FOLLOWED BY CR-LF, WILL BE PASSED TO THE ; CALLING ROUTINE AS SPECIFIED BY THE WORD ; COUNT GIVEN. (IF THIS IS > 41, REMAINING ; BYTES WILL BE CLEARED. ; ALL ERRORS (INCLUDING 'HOPPER EMPTY' UPON ; AN 'OPEN' CALL) WILL BE TREATED AS 'DEVICE ; NOT READY'. USER CAN RESUME OPERATION BY ; RECTIFICATION OF ERROR OR REFILL OF HOPPER ; AND ENTRY OF 'CO' COMMAND AT KEYBOARD. ; THE END OF A FILE WILL BE DETERMINED BY ; RECOGNITION OF A TERMINAL CONTROL CARD:- ; 12-11-8- , j? 7  <-,? ,  ? |nS,mffZ R J%BD, @ 'A0.    & ,D -)? ,h ? /? 72)> J?  5> 4? * , w:5xP*j5^ XeAr5*"B :   E   E*F  mw *mw "mw c*jw w e?e рC C C *x_vߋt DECTAPE FOR?*MATTER V03A SWITCH #15 UP TO SUPPRE*SS TTY MESSAGES  NEXT TAP*E: BOTH SWITCHES "UP" T&M GOOD: *"WRTM" DOWN FORMATTKS=177560 ;KEYBOARD STATUS TKB=177562 ;KEYBOARD BUFFER TPS=177564 ;TELEPRINTER STATUS TPB=177566 ;TELEPRINTER BUFFER TKV=60 ;KEYBOARD VECTOR TPV=64 ;TELEPRINTER VECTOR .PAGE START: RESET ;CLEAR THE WORLD MOV #START,SP ;INITIALIZE THE STACK POINTER MOV #P7,PS ;LOCKOUT PI BY RAISING CPU PRIORITY 9 PUNCHED IN C.C.1 ; ;  XXXXXXXXXXXXXXXXXXXXXXXXX ;  X   X ;  X  NOTES  X ;  X   X ;  XXXXXXXXXXXXXXXXXXXXXXXXX ; .PAGE ;************************************************************************ ; 0) IN THE FOLLOWING, ALL REFERENCES TO '026' CODE NOW SHOULD ; BE INTERPRETED AS UNIVAC 'FIELDATA' CODE. ;************************************************************************ ; 1) THIS DRIVER CAN BE ASSEMBLED FOR USE ; IN CONNECTION WITH EITHER '026' * m,  *  4?  &, , w:5x{  ,,j5^ XeAr` &rR,"B :   E   E,F  mw *mw "mw c,jw w e?e рC C C %,x_vߋt DECTAPE FORR,MATTER V03A SWITCH #15 UP TO SUPPRE, COMPLETEAH*B*f*****Z*>6*b* ; FIRST, LOAD ALL INTERRUPT VECTORS WITH STOPS: CLR R0 CLR R1 INIT1: TST (R1)+ ;BUMP POINTER TO PS WORD OF VECTOR MOV R1,(R0)+ ;LOAD PC WORD WITH ADDR OF PS WORD CLR (R1)+ ;PUT "HALT" IN PS WORD TO FORCE A STOP TST (R0)+ ;BUMP POINTER TO NEXT PC WORD TSTB R0 ;LOWER BYTE WILL CLEAR AT LOC'N 400(8) BNE INIT1 ;BACK FOR MORE ; ALL DONE: OR '029' ; PUNCHES OR BOTH AS INDICATED BY PARAMETER ; SPECIFICATION AT START OF SOURCE INPUT ; AS FOLLOWS:- ; ; A) "ONLY26=0" - READ ONLY '026' CODES. ; B) "ONLY29=0" - READ ONLY '029' CODES ; C) "DEFALT=0" - READ BOTH TYPES OF CODE ;    WITH '026' AS DEFAULT ; D) NIL - READ BOTH TYPES OF CODE ;    WITH '029' AS DEFAULT ; ; IN CASES (C) & (D), DRIVER WILL USE DEFAULT ; UNLESS DIRECTED OTHERWISE BY ENTRY OF A ; CONTROL CARD PUNCHED IN C.C. 1:- ; ; SS TTY MESSAGES  NEXT TAP ,E: BOTH SWITCHES "UP" T&M GOOD: ,"WRTM" DOWN FORMAT COMPLETEAH,B,f",,,,,****]*: AAAa^NOW ENTER PROGRAM PROPER MOV #MSGA,R0 ;UNCONDITIONAL IDENTIFIER MESSAGE JSR PC,PRINT1 START1: MOV #START,SP ;RE-INIT STACK POINTER RESET ;IN CASE COME HERE AFTER ERROR MOV #MSG1,R0 JSR PC,PRINT ;MESSAGE ON TTY MOV #-1,R0 ;GOOD DATA LIGHT DISPLAY FOR DONE... HALT ;...AND CLEAR TO START. MOV #101101,R0 ;REVERSE END ZONE=55 MO 12-11-8 = '029' CODES FOLLOW ; 12-11-9 = '026' CODES FOLLOW ; ; 2) IF PARAMETER "BLANKS" IS DEFINED, ; ALL TRAILING SPACES WILL BE SUPPRESSED, ; WITH 'CR-LF' FOLLOWING LAST VALID DATA. ; IF THE CARD FILE IS PRECEDED BY CTL CARD WITH ; 12-11-0 ; PUNCHED IN C.C.1, THE TRAILING SPACES WILL NOT BE SUPPRESSED. ; IF A CONTROL CARD IS READ WITH C.C.1 CONTAINING: ; 12-11-0-8 ; AND SPACE COMPRESSION HAS NOT BEEN ; m,>I,b%,,,,,p,: AAAt^ .(h.,`> `5pDDC,$p5@p ve&,H Ap&p ,lb;ftȋW`WpWpWV #-4096.,R4 ;COUNTER FOR REZ MOV #13,@TCCM ;GO LP1: JSR PC,FLAG ;WAIT FOR READY OR ERROR MOV R0,@TCDT ;LOAD MARK TRACK INC R4 ;DONE ALL? BNE LP1 ;LOOP IF NOT FINISHED MOV #-199.,R4 ;COUNTER FOR IBS MOV #10101,R0 ;INTERBLOCK SYNC=25 LP2: JSR PC,FLAG ;WAIT FOR FLAG MOV R0,@TCDT ;LOAD MARK CODE INC R4  SUSPENDED (ABOVE), CC. 73-80 WILL BE IGNORED AND ; SPACE COMPRESSION WILL BEGIN AT CC. 72 AND MOVE DOWNWARD. ; 3) *********************** F I R S T C A R D **************** ; AN "OPEN" CAUSES ONE CARD TO BE READ AND IGNORED. THIS IS TO ; COMBAT THE PROBLEM OF THE FIRST CARD READ BY A COLD READER ; GENERATING ONE TOO MANY INTERRUPTS AND CAUSING AN "A002" ERROR. ; THUS EVERY DECK MUST BEGIN WITH AN IGNORABLE CARD. ; B) IF TH    ,gW``!? v,ef mRae7 x,;7tpȋ&5$^ q,JB( , ! @  x p 8 G,DqH 7pD7 7,h7356:'7,"90SUVYݬ_?Z-KMNPѠ!$\,ҦABDGH.<(+ɠ356':90, ;DONE ALL? BNE LP2 ;IF NOT, KEEP LOADING MOV #-578.,R3 ;COUNTER FOR NUMBER OF BLOCKS LP3: JSR PC,FRMBLK ;WRITE CODES FOR ONE BLOCK INC R3 ;DONE ALL? BNE LP3 ;IF NOT, WRITE ANOTHER BLOCK MOV #-199.,R4 ;COUNTER FOR IBS MOV #10101,R0 ;INTERBLOCK SYNC=25 LP4: JSR PC,FLAG ;WAIT FOR FLAG MOV R0,@TCDT ;LOAD MARK CODE E PARAMETER "BINARY" IS DEFINED AT ASSEMBLY, ; XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX ; ; THIS VERSION WILL ALSO ALLOW READING OF CARDS ; IN BINARY FORMAT. AS EACH CARD IS READ, 12 BITS FROM ; ALL 80 COLS WILL BE ACCESSED & STORED IN AN INTERNAL ; BUFFER IN A PACKED FORM, I.E. 4 COLS = 3 WORDS AS ; FOLLOWS:- ;  C.C.1 > WORD 1, BITS 15-4 ;  C.C.2 > WORD 1, BITS 3-0; WORD 2, BITS 15-8 ;  C.C.3 > WORD 2, BITS 7-0; WORD 3, BITS 15-12 ;  C.C.4 > WORD 3, BITS 11-0 ; ; THE !-*`> `5pDDH*$p5@p ve&*H Ap&p *lb;ftȋW`WpWpW*gW``!? {*ef mRae7 x*;7tpȋ&5$^ v*JB( * ! @  x p 8 L*DqH 7SUVY_(\"Z-KMNPѠ$ݻ+ABDGH.<2# INC R4 ;DONE ALL? BNE LP4 ;IF NOT, KEEP WRITING IBS MOV #-4096.,R4 ;COUNTER FOR FEZ MOV #10010,R0 ;FORWARD END ZONE=22 LP5: JSR PC,FLAG ;WAIT FOR FLAG MOV R0,@TCDT ;LOAD MARK CODE INC R4 ;DONE ALL? BNE LP5 ;IF NOT KEEP WRITING FEZ JSR PC,FLAG ;WAIT FOR LAST FLAG CLR @TCCM ;STOP TAPE. MAR$PACKED FORM WILL BE TRANSFERRED TO THE USER ; BUFFER UNTIL THIS IS FILLED, ANY DATA THEN REMAINING ; IN THE INTERNAL BUFFER BEING RETAINED UNTIL THE ; NEXT READ REQUEST. ; ; TREATMENT OF ASCII READING WILL STILL FOLLOW PATTERN ; DESCRIBED IN THE PREVIOUS PARAGRAPH WITHOUT EXCEPTION. ; ; THE ONLY CONTROL CARD WHICH WILL HAVE ANY EFFECT ; IN BINARY READING WILL BE THAT INDICATING E.O.F. (IN ; THIS CASE 12-11-0-1 PUNCHING MUST APPEAR IN AT LEAST ; C.C. 1 THRU 8). ; ; N.B. WHEN ASSEMBLEpD7 7*h7356:'<*"90SUVYݬ_?Z-KMNPѠ!$\ *ҦABDGH.<(+ɠ356':90*SUVY_(\"Z-KMNPѠ$ݻ+ABDGH.<7&; UPDATE: 12-JUL-72 LPDOS.S3D ; DATE: 14-OCT-71 ; VERSION: V003D ; LINE PRINTER DRIVER FOR DOS ("LP") ; DRIVES THE "DATA PRINTER V-132", WITH CONTROLLER BY "PER DATA" ; PROGRAMMER: 52 ; MODIFICATIONS MADE TO: 1) RE-PRINT CURRENT LINE IF PRINTER ; TAKEN OFF-LINE; AND 2) RE-SET THE CONTROLLER WITH COMMAND ; BIT #6 ON OPEN. ; THIS VERSION CONTAINS OPTION FOR DOUBLE SPACING, CONTROLLED FROM ; THE COMPUTER CONSOLE. IF THE SWITCH REGIS'K & TIMING TRACKS ARE... MOV #BELS2,R0 ;UNCONDITIONAL TWO BELLS JSR PC,PRINT1 MOV #MSG2,R0 JSR PC,PRINT ;MESSAGE ON TTY MOV #125252,R0 ;PATTERN FOR GOOD FIRST PASS HLT1: XX ;...WRITTEN. RESET WRTM SWITCH AND ;SET "WRITE ALL" SWITCH, THEN CONTINUE... .PAGE WRTBNO: JSR PC,COBLKG ;GENERATE TABLE OF CMPOBV BLK NUMBERS MOV #-3,R0 ;THREE BLOCK(D FOR USAGE IN BOTH MODES, AN 'OPEN' ; CALL WILL NOT CAUSE READING OF A CARD TO ALLOW THIS ; TO BE TRANSLATED AS REQUIRED BY THE READ MODE ; SPECIFIED BY THE USER. ; ; C) DRIVER CAN ALSO BE USED FOR 80-COLUMN MARK ; SENSE READER. FOR 40 -COLUMN READER, ECONOMIES ; IN BUFFER SIZE CAN BE OBTAINED BY DEFINITION ; AT ASSEMLBY OF PARAMETER "MARKS". THIS WILL ; ALSO PREVENT AUTOMATIC REMOVAL OF COLS 33-40 ; IN 'BLANKS-SUPPRESS' MODE OF USAGE. ;  XXXXXXXXXXXXXXXXXX).M(Mh,|:M @5@5,$7 2  x 7(  K,He$wew  8,lt @ 5@$^ 5*TER READS [000002], ; ALL PRINTER OUTPUT WILL BE DOUBLE-SPACED. ANY OTHER BIT PATTERN ; WILL CAUSE REVERSION TO SINGLE SPACING. ; V003C MODIFICATIONS: ; RE-PRINT FIXED TO CLEAR [R.AD] BEFORE RE-PRINT TO AVOID ; GARBLED LINES. ; ALSO, ADDITION MADE TO SHIFT THE TABS TO ACCOMMODATE ; THE OUTPUT FROM PAL11R-V004B, WHICH HAS LINES SET UP 2 BEFORE ; THE STANDARD "EVERY-8" TABS. THIS OPTION IS INVOKED BY SETTING ; THE UPPER BYTE OF THE CONSOLE SWITCHES TO [001]. ; V003D MODIFICATI+S MOV #4002,@TCCM ;SEARCH REVERSE WLP1: INCB @TCCM ;GO JSR PC,FLAG ;WAIT FOR BLOCK NUMBER INC R0 ;FOUND THREE? BNE WLP1 ;IF NOT KEEP SEARCHING MOV #76677,R0 ;COMPLEMENT OBVERSE OF 1011 (LAST BLOCK#) MOV #17,@TCCM ;WRITEALL FORWARD JSR PC,FLAG ;WAIT TO SYNC UP FOR WRITING WLP2: BISB #3,@TCST ;SET XDA BITS FOR 0 REVERSE ,XXXXXXX ;  X   X ;  X  NOTE  X ;  X   X ;  XXXXXXXXXXXXXXXXXXXXXXXXX ; ; PARAMETER DEFINITIONS CAN BE MADE DURING PASS 1 ; OF THE ASSEMBLY ONLY IF REQD AS DESCRIBED IN ; PAL-11R MANUAL, SECTION 9-2, E.G. ; ;  #CR,LP:,/PA:2 ; ;  XXXXXXXXXXXXXXXXXXXXXXXX ; .TITLE CR .GLOBL CR ; STANDARD PARAMETER DEFINITIONS: BLANKS = 0 ;ENABLE -],5  @@ 5,  J :,&^ xty uE,W! W! 3W! W! RW!`,  SA9 ,݃˕w$"7,D 2 W! ( קx,h ӕ קy,W!5㨣 h , 7 קx ,.ONS: ; CORRECTION MADE TO WAIT UNTIL PRINTER READY WHEN CHANGING ; MODE BETWEEN AUTOLINEFEED AND FIRST-CHARACTER. .TITLE LP .GLOBL LP R0=%0 R1=%1 R2=%2 R3=%3 R4=%4 R5=%5 SP=%6 PC=%7 PS=177776 SWR=177570 ; DEFINITIONS OF LINE PRINTER CONTROLLER ADDRESSES R.AD = 165010 ;MEMORY ADDRESS REGISTER R.LF = 165012 ;LINE-FEED CONTROL REGISTER R.WC = 165014 ;WORD COUNT REGISTER R.CM = 16501/ MOV R0,@TCDT ;WRITE LAST BLOCK # FROM HERE TO END ZONE JSR PC,FLAG1 ;SKIP NEXT INSTRUCTION IF END ZONE IS SENSED BR WLP2 ;KEEP WRITING 1011 MOV #1101,FBLK ;INITIALIZE PARAMETERS FOR LAST BLOCK, MOV #BYST,R5 ;XDA BIT TABLE AND MOV #RBN,R3 ;TABLE OF REVERSE BLOCK NUMBERS MOV #4017,@TCCM ;WRITEALL REVERSE WALUP: DEC FBLK ;DECREMENT BLOCK NUMBER CM0BLANK SUPPRESSION DEFALT = 0 ;READ "FIELDATA" CODE BY DEFAULT R0=%0 R1=%1 R2=%2 R3=%3 R4=%4 R5=%5 SP=%6 PC=%7 ;INTERFACE TABLE: CR: .WORD 0   ;CURRENT DDB OR 0 IF IDLE .IFNDF BINARY .BYTE 224,0  ;FACILITIES: ASCII INPUT,OPEN INC. .ENDC .IFDF BINARY .BYTE 234,0  ;ALLOW BINARY IF REQD. .ENDC .BYTE 3  ;STD BUFFER SIZE = 96 BYTES .BYTE CR.INT-CR,300 ;INT'RUPT SVCE AT PRL 6 .BYTE CR.OPN-CR ;OFFSET TO OPEN .BYTE CR.TFR-CR ;OFF7 zwH7{fw_,ro 7d,J 7D5  e,l,@ 5d 26 ;COMMAND REGISTER (ON DATO) R.ST = 165016 ;STATUS REGISTER (ON DATI) $RSAVE = 44 ;MONITOR SAVE-REGISTER ROUTINE $RSTOR = 46 ;MONITOR RESTORE-REGISTERS ROUTINE .PAGE ; PREAMBLE: FIXED FORMAT LP: .WORD 0 ; CURRENT DDB OR 0 .BYTE 222 ;FACILITIES INDICATOR .BYTE 0 .BYTE 5 ;STANDARD BUFFER/16 .BYTE LP.INT-LP ;OFFSET TO I3P #-2,FBLK ;LAST BLOCK WRITTEN? BEQ CHECK ;YES. CHECK DATA AND BLOCK NUMBERS MOV #-1,R4 ;-1 REVERSE =0 FWD MOV #-260.,TOG1 ;NUMBER OF WORDS WLP3: JSR PC,FLAG ;WAIT FOR SYNC FLAG TO WRITE BISB #3,@TCST ;1 KBV=0 FWD MOV R4,@TCDT ;LOAD DATA WORD INC TOG1 ;WRITE IT 260 TIMES BNE WLP3 ;KEEP WRITING UNTIL FINISHED JSR PC,F4SET TO TRANSFER .BYTE 0,0,0  ;(NO CLOSE OR SPEC. FUNC.) CR.NAM: .RAD50 'CR' ;OPEN PROCESSOR: CR.ONR: JSR PC,CR.NRY CR.OPN: BIT #400,@#CR.CSR ;CARDS IN HOPPER? BNE CR.ONR  ;IF NOT TELL USER TO READY .IFNDF ONLY26&ONLY29 .IFNDF DEFALT  ;FOR DUAL-PUNCH DRIVER ... CLR (PC)+  ;... SET CONV. TABLE OFFSET CR.TOS: .WORD 0 ;TABLE OFFSET IF NOT DEFALT .ENDC DEFALT  ;... FOR DEFAULT PUNCH .IFDF DEFALT  ;... AS APPROPRIATE 5M*|:M @5@5*$7 2  x 7(  P*He$wew  =*lt @ 5@$^ 5b*5  @@ 5*  J ?*&^ xty uE*W! W! 3W! W! RW!`*  SA9 ,݃˕w$"<*D 2 6NTERRUPT RTNE .BYTE 200 ;INTERRUPT PRIORITY:4 .BYTE LP.OPN-LP ;OPEN ENTRY .BYTE LP.TFR-LP ;TRANSFER (OUT) .BYTE 0  ;NO CLOSE .BYTE 0  ;NO SPECIAL .BYTE 0 ;SPARE LP.NAM: .RAD50 'LP' ;********************************************************************* ;********************************************************************* LPER01 = . ;UNIT NO7LAG ;WAIT FOR FLAG BEFORE WRITING FWD BLK# MOVB (R5)+,@TCST ;FETCH RELEVANT XDA BITS MOV (R3)+,@TCDT ;NEXT RELEVANT COMP. OBVERSE BLOCK # CMP R5,#BYST+10 ;SEE IF XDA BIT TABLE IS EXHAUSTED BNE .+6 ;IF NOT, PROCEED MOV #BYST,R5 ;IF SO, REINITIALIZE POINTER MOV #WALBF,R4 ;SETUP POINTER FOR LAST FIVE WORDS MOV #-2,TOG1 ;COUNTER OF TWO WLP4: JSR PC,FLAG FMOV #104,(PC)+ CR.TOS: .WORD 104 ;OFFSET FOR 'DEFALT'. INITIALIZED IN ; ;CASE OF NO OPEN. .ENDC DEFALT .ENDC ONLY26&ONLY29 .IFDF BLANKS  ;IF BLANK-SUPPRESS VERSION ... MOVB #1,CR.ZSW ;FORCE SPACE-SUPPRESSION ON MOVB #2,CR.ESW ;...BUT DON'T SUPPRESS CC. 73-80 .ENDC .IFNDF BINARY MOV #3,@#CR.CSR ;FORCE READ AND IGNORE OF FIRST CARD BIT #40000,@#CR.CSR ;WAIT 'TIW! ( קx*h ӕ קy*W!5㨣 h* 7 קx *7 zwH7{fwd*ro 7d*J 7D5  e,q*@ 5dGT READY ON OPEN JSR PC,ERMES ;PRINT A002 LP.OPN = . ;OPEN ROUTINE MOV #100,@#R.CM ;HIT CONTROLLER RESET MOV @#R.ST,R0 ;CHECK STATUS... BIT #40031,R0 ;...FOR ERRORS OR BUSY BNE LPER01 ;AT LEAST ONE SET BIT #2,R0  ;TEST "ON-LINE" BEQ LPER01  ;NOT SET: PRINT ERROR MESSAGE CLR CURBUF ;SHOW BEGIN OF NEW LINE JSR PC,NEWPGE ;GO TO TOP-OF-FORE;WAIT FOR REQUEST FLAG BISB #3,@TCST ;SET XDA 17 & 16 MOV (R4)+,@TCDT ;FETCH DATA WORD INC TOG1 ;ADVANCE COUNT BNE WLP4 ;KEEP WRITING UNTIL FINISHED JSR PC,FLAG ;WAIT BICB #3,@TCST ;CLEAR XDA 17 AND 16 FOR REVERSE BLK# MOV (R4)+,@TCDT ;REVERSE BLOCK NUMBER MOV #-2,TOG1 ;COUNT OF TWO WLP5: JSR PC,FLAG ;WAIT FOR FLAG BISB"""DD """"""""""""""""""""""@DDDDDDDDDDDDDD@D DDD ""ADDB C'|Q^'|QK'|Q4d;`{+`b`P!M`{"M`^%-M`K15`{2 H,`^2 `K2 SjL_0 `5 5 5 Q5 5  gMD N5 ,5 $Da ͋,L w:B8 ` 5 &  E >w   f5eU@  [*   & * G &( 8L'4e Q$ BBB"   U@ U e  "U%Gef. U U Bb 0 * B.&0 M &0 & I #3,@TCST ;SET XDA 17 AND16 MOV (R4)+,@TCDT ;FETCH DATA WORD INC TOG1 ;ADVANCE COUNT BNE WLP5 ;KEEP WRITING UNTIL FINISHED BR WALUP ;FINISHED - DO NEXT BLOCK .PAGE CHECK: JSR PC,FLAG ;TAPE IS FORMATTED, CHECK DATA MOVB #3,@TCCM ;REWIND INTO END ZONE CHKL1: JSR PC,FLAG1 ;SKIP NEXT INSTRUCTION IF EZ BR CHECK+4 ;KEEP REWINDING JL DONE BEQ .-6 TST (SP)+  ;IGNORE INTERIM RETURN BR CR.DXT  ;... & TAKE COMPLETION .ENDC .IFDF BINARY  ;FOR BINARY VERSION ... CLRB CR.TFR  ;... FORCE NO OPEN READ BR CR.ODN CR.OXT: INCB CR.TFR  ;... BY MAKING COME HERE BR CR.ODN  ;... BEFORE EXIT .ENDC ;SUBSIDIARY ROUTINES: ; A) RESTART AFTER ERROR: CR.AGN: .IFDF BINARY  ;IN BINARY VERSION ... TSTB CR.ISW  ;... CHECK IF BINARY READ BEQ CR.TFR  ;IF NOT CAN JUST START OVER KM ON OPEN LP.EXT: TST (SP)+ ;POP RTN ADDR OFF STACK MOV LP,R0 JMP @14(R0) ;TAKE COMPLETION RETURN ;********************************************************************* ;********************************************************************* LP.TFR:    ;TRANSFER ROUTINE MOV (SP)+,SAVRTN ;POP STACK NOW IN CASE OF NO RETURN... ;FROM THE PRINT SUBROUTINE ; DO BUFFER CALCUL;UPDATE: 19-DEC-72 CRDOS.S2D ;12-19-72 ;UPDATE: 17-DEC-72 CRDOS.S2C ;12-17-72 ; UPDATE: 12-JUL-72 CRDOS.S2B ;DATE: 11-OCT-71 ;DATE: 7-OCT-71 ;VERSION NUMBER: V002A ;THIS VERSION OF DEC'S CARD READER DRIVER IS MODIFIED TO READ ;UNIVAC "FIELDATA" CARD CODE WHEN ASSEMBLED WITH "DEFALT" DEFINED. ;IN ADDITION, CHANGES TO OPERATION OF TRAILING BLANK SUPPRESSION ;AND OF SEQUENCE NUMBER (COLS. 73-80) SUPPRM CLR @TCCM ;STOP TAPE CLR TOG2 ;START WITH BLOCK#0 CHKL2: MOVB #3,@TCCM ;SEARCH FWD JSR PC,FLAG ;WAIT FOR FLAG CMP TOG2,@TCDT ;IS FWD BLOCK NUMBER CORRECT? BEQ DATCHK ;YES - CHECK DATA CLR @TCCM ;STOP TAPE AND MOV #2,R0 ;ERROR #2 HALT ;...HALT WITH ERROR # IN LIGHTS MOV @TCDT,R0 NBR CR.ERD  ;ELSE LEAVE USER BUFFER ALONE ; B) INITIALISE INTERNAL BUFFER POINTERS: CR.ISP: MOV PC,-(SP) ;GET BUFFER START ADD #CR.BUF-.,@SP MOV @SP,(PC)+ CR.IBS: .WORD 0 ADD #CR.BSZ,@SP ;NOW GET END MOV @SP,(PC)+ ;STORE AS CONTROL CR.IBE: .WORD 0 MOV (SP)+,(PC)+ ;... & AS INIT. PTR CR.IBP: .WORD 0 .PAGE INCB @PC  ;MUSTN'T COME HERE AGAIN! .ENDC ;TRANSFER SET-UP PROCESSOR: CR.TFR: .IFDF BINARY  ;FOR BINARYOLATION HERE IN CASE OF NO OPEN CLRB FORMFD ;FLAG TO EJECT AFTER A LINE TST BUFBGN  ;SEE IF BUFFER CALC'N NEEDED BNE LP.TF1  ;NOT NEEDED MOV PC,R1 ADD #LP.BUF-.,R1 ;CALC LOCAL BUFFER BEGIN MOV R1,BUFBGN ;SAVE FOR REF BELOW ADD #133.,R1 MOV R1,BUFEND ;SAME FOR END OF BUFFER LP.TF1: MOV LP,R0 ;DDB MOV 10(R0),R1 ;(NEG) WORD COUNT ASL R1  ;(NEG) CHAR COUNT DEC R1  ;DPESSION ARE MADE ;AND ARE DESCRIBED BELOW. ;CARD READER DRIVER (CR) ; ; A) FOR ASCII INPUT. AT EACH TRANSFER REQUEST ; ONE CARD WILL BE READ. UP TO 80 CHARACTERS, ; FOLLOWED BY CR-LF, WILL BE PASSED TO THE ; CALLING ROUTINE AS SPECIFIED BY THE WORD ; COUNT GIVEN. (IF THIS IS > 41, REMAINING ; BYTES WILL BE CLEARED. ; ALL ERRORS (INCLUDING 'HOPPER EMPTY' UPON ; AN 'OPEN' CALL) WILL BE TREATED AS 'DEVICE ; NOT READY'. USER CAN RESUME OPERATION BY ; RECTIFICATION OF ERROR OR REFILL OF Q ;NO - PUT INCORRECT BLK# IN R0 FOR DISPLAY HALT MOV TOG2,R0 ;TO FIND CORRECT BLOCK# EHLT3: XX ;HALT WITH CORRECT FWD BLK# IN LIGHTS MOV #4003,@TCCM ;TRY AGAIN DATCHK: MOV #-257.,TOG1 ;CHECK REV, CHKSUM AND DATA MOVB #7,@TCCM ;READ ALL DCHKL1: JSR PC,FLAG ;WAIT FOR WORD TST @TCDT ;IT SHOULD=0 BEQ DATOK ;IF SO PROCEED CLR @TCCM R VERSION ... BR .+4  ;... SWITCH TABLE FORCES ... BR CR.OXT  ;... CORRECT INIT. BR CR.ISP .ENDC MOV CR,R0  ;GET DDB ADDRESS ADD #6,R0  ;... & MOVE TO BUFFER STORE MOV (R0)+,-(SP) ;GET BUFFER POINTER MOV @SP,-(SP) ;... & BUILD BUFF END SUB @R0,@SP SUB (R0)+,@SP MOV (SP)+,(PC)+ ;SAVE RESULT ... CR.UBE: .WORD 0 .IFDF BINARY  ;IN BINARY VERSION ... MOVB @R0,R0  ;... CHECK MODE BICB #376,R0 MOVB R0,CR.ISW ;IF ASCII CLEAR SWITCH BESUE TO FIRST "INC R1" @LPXF02 MOV 6(R0),R2 ;MONITOR BUFFER START JSR PC,LPTR00 ;GO XFR MON BUF TO LOCAL & PRINT MOV SAVRTN,PC ;RETURN TO MONITOR CALLER ;********************************************************************* ;********************************************************************* LPER02: JSR PC,ERMES ;ERROR MOV #100,@#R.CM ;ISSUE RESET BEFORE RE-TEST LP.INT:    ;INTERRUPT ENTRY POINT CLR @#R.CM ;DISABLE INTERTHOPPER ; AND ENTRY OF 'CO' COMMAND AT KEYBOARD. ; THE END OF A FILE WILL BE DETERMINED BY ; RECOGNITION OF A TERMINAL CONTROL CARD:- ; 12-11-8-9 PUNCHED IN C.C.1 ; ;  XXXXXXXXXXXXXXXXXXXXXXXXX ;  X   X ;  X  NOTES  X ;  X   X ;  XXXXXXXXXXXXXXXXXXXXXXXXX ; .PAGE ;************************************************************************ ; 0) IN THE FOLLOWING, ALL REFERENCES TO '026' CODE NOW SHOULD ; BE INTERPRETED AS UNIVAC 'FIELDATA' U ;IF NOT STOP TAPE, MOV #3,R0 ;ERROR #3 HALT MOV TOG2,R0 ;FETCH BLK# AND EHLT4: XX ;HALT WITH BLK# IN LIGHTS, CONTINUE MOV #257.,R0 ;TO FIND DATA WORD POSITION. ADD TOG1,R0 ;DETERMINE WHICH WORD IS WRONG EHLT5: XX ;HALT WITH #OF WORD IN LIGHTS. 0=REV. CHKSUM MOV @TCDT,R0 ;CONTINUE TO FETCH BAD WORD EHLT6: XX ;HALT WITHVQ CR.RDC  ;IF BINARY WANTED ... MOV (SP)+,R0 ;... SET PTRS & SWITCH MOV CR.IBP,R1 CLR R2  ;SET INTERRUPT FLAG CR.BIN: CMP R1,CR.IBE ;INTERNAL BUFF EMPTY? BNE CR.BLP CR.ERD: MOV CR.IBS,CR.IBP ;IF SO RESET INTERNAL PTR MOV R0,-(SP) ;SAVE USER BUFF PTR ... CR.RDC: .ENDC MOV @SP,(PC)+ CR.UBP: .WORD 0 CLR @(SP)+  ;ZERO UNDERWAY FLAG MOV #101,@#CR.CSR ;ENABLE INT & GO FOR CD READ RTS PC  ;RETURN USER FOR NOW .IFDF BINARY WRUPTS BIT #40001,@#R.ST ;BUSY OR PAPER LO? BNE LPER02 ;YES MOV @#$RSAVE,-(SP) JSR R5,@(SP)+ ;SAVE REGISTERS ON STACK BIT #30,@#R.ST ;ANY PARITY ERRORS? BNE LPIN06 LPIN05: BIT #2,@#R.ST ;HOW ABOUT "ON-LINE"? BNE LPIN04  ;IT'S SET, SO O.K. TO PREPARE NEXT LINE LPIN06: CLR @#PS  ;DROP CPU LEVEL TO ALLOW OTHER INTS CLR @#R.AD  ;CLEAR ADDR REG IN PREP FOR RE-TRY LPIN03: MOV #100,@#R.CM ;ISSUE RESET TO CLEAR CXCODE. ;************************************************************************ ; 1) THIS DRIVER CAN BE ASSEMBLED FOR USE ; IN CONNECTION WITH EITHER '026' OR '029' ; PUNCHES OR BOTH AS INDICATED BY PARAMETER ; SPECIFICATION AT START OF SOURCE INPUT ; AS FOLLOWS:- ; ; A) "ONLY26=0" - READ ONLY '026' CODES. ; B) "ONLY29=0" - READ ONLY '029' CODES ; C) "DEFALT=0" - READ BOTH TYPES OF CODE ;    WITH '026' AS DEFAULT ; D) NIL - READ BOTH TYPES OF CODE ;    WITY BAD DATA IN LIGHTS. CONTINUE MOV #4003,@TCCM ;TO TRY AGAIN BR CHKL1 ;RESTART CHECK DATOK: INC TOG1 ;CHECK ALL DATA IN BLOCK BNE DCHKL1 ;KEEP CHECKING UNTIL DONE INC TOG2 ;SETUP FOR NEXT BLOCK CMP #1102,TOG2 ;HAVE ALL BLOCKS BEEN CHECKED? BNE CHKL2 ;IF NOT KEEP CHECKING RCHK: MOVB #3,@TCCM ;YES - FIND FWD EZ JSR PC,FLAG1 ;SKIZ ;WITH BINARY DATA ... CR.BLP: SWAB @R1  ;... COMPLETE CONVERSION MOV (R1)+,(R0)+ ;... & GIVE TO USER CMP R0,CR.UBE ;USER BUFFER FULL? BNE CR.BIN  ;IF NOT GET NEXT WORD MOV R1,CR.IBP ;OTHERWISE SAVE INT PTR TST R2  ;COME HERE ON INTERRUPT? BNE CR.ODN  ;IF SO MODE SW. SET MOV @SP,-(SP) ;ELSE MUST SIMULATE ... MOV -(R2),2(SP) ;... STORE PC & PS SUB #16,SP  ;... & DUMMY SAVE REGS. CR.ODN: TST (SP)+  ;IGNORE RETURN PC BR CR.DXT  ;... & TAKE CO[ONDITION MOV @#R.ST,R0 ;GET STATUS COM R0  ;INVERT FOR TEST BIT #6,R0  ;OF [READY] AND [ON-LINE] BNE LPIN03  ;ONE OF THEM IS STILL OUT MOV WCSAVE,R4 ;GET PREVIOUS WORD COUNT... BEQ LPIN02  ;DON'T PRINT IF BLANK LINE JSR PC,LPPR01 ;...AND GO PRINT LINE AGAIN BR LPIN02  ;...AND EXIT LPIN04: TSTB FORMFD ;DID A FORM FEED END LAST LINE? BEQ LPIN01 ;NO JSR PC,NEWPGE ;YES; EJECT NOW LPIN01: MOV MONCNT,R1 \H '029' AS DEFAULT ; ; IN CASES (C) & (D), DRIVER WILL USE DEFAULT ; UNLESS DIRECTED OTHERWISE BY ENTRY OF A ; CONTROL CARD PUNCHED IN C.C. 1:- ; ; 12-11-8 = '029' CODES FOLLOW ; 12-11-9 = '026' CODES FOLLOW ; ; 2) IF PARAMETER "BLANKS" IS DEFINED, ; ALL TRAILING SPACES WILL BE SUPPRESSED, ; WITH 'CR-LF' FOLLOWING LAST VALID DATA. ; IF THE CARD FILE IS PRECEDED BY CTL CARD WITH ; 12-11-0 ; PUNCHED IN C.C.1, THE TRAILING SP]P ON EZ BR EHLT7 MOV #1101,TOG2 ;FIRST REVERSE BLK=1101 RERCV: MOV #4000,@TCCM ;SET TAPE TO REVERSE MOV #DATBUF,R0 ;INITIALIZE DATA BUFFER POINTER ZLUP: CLR (R0)+ ;CLEAR NEXT DATA WORD CMP R0,#DATBUF+512. ;IS BUFFER FILLED? BLO ZLUP ;IF NOT KEEP CLEARING CHKL3: MOVB #3,@TCCM ;SEARCH REVERSE AND JSR PC,FLAG ;WAIT FOR FLAG CMP TOG2,@TCDT ^MPLETION EXIT .ENDC ;INTERRUPT SERVICE ROUTINES: ; A) CHECK FOR ERROR & COLLECT INPUT: CR.INT: MOV R0,-(SP) ;SAVE USER R0 MOV CR.UBP,R0 ;GET USER BUFF PTR ... MOV @#CR.CSR,-(SP) ;... & READER STATUS ASL (SP)+  ;CHECK FOR SPECIAL CASES BCS CR.ERR  ;GO RETRY IF ERROR BMI CR.DUN  ;CLEAN UP IF DONE MOV R1,-(SP) ;NOW SAVE USER R1 .IFDF BINARY  ;IN BINARY VERSION ... CR.ISW: BR .+4  ;... USE APPROPRIATE CONVERSION BR CR.ASC ; _ ;RESTORE CHAR COUNTER MOV MONBUF,R2 ;CURRENT MONITOR BUFFER POINTER JSR PC,LPTR00 ;GO GET ANOTHER LINE AND PRINT IT LPIN02: MOV @#$RSTOR,-(SP) JSR R5,@(SP)+ ;GO RESTORE REGISTERS SAVED ABOVE RTI ;RETURN TO INTERRUPTED PROGRAM LPTR00 = . ;SUBROUTINE TO PRINT ONE LINE FROM MON BUFFER MOV CURBUF,R3 ;LOCAL POINTER FROMLAST TIME BNE LPXF02 `ACES WILL NOT BE SUPPRESSED. ; IF A CONTROL CARD IS READ WITH C.C.1 CONTAINING: ; 12-11-0-8 ; AND SPACE COMPRESSION HAS NOT BEEN ; SUSPENDED (ABOVE), CC. 73-80 WILL BE IGNORED AND ; SPACE COMPRESSION WILL BEGIN AT CC. 72 AND MOVE DOWNWARD. ; 3) IF THE NUMBER OF COLUMNS READ AT CARD DONE IS ODD, ;12-17-72 ; THE CARD IS NOT PROCESSED AND THE "NOT READY" MSG IS OUTPUT. ;12-17-72 ; THIS FORMS A TRAP FOR THE OCCASIONAL EXTRA INTERRa;IS REVERSE BLOCK# CORRECT? BEQ WRTDTA ;YES - WRITE DATA .PAGE CLR @TCCM ;STOP TAPE AND MOV #5,R0 ;HALT WITH ERROR #5 HALT MOV @TCDT,R0 ;NO - PUT INCORRECT BLK# IN R0 FOR DISPLAY EHLT10: XX ;HALT WITH BAD REV. BLK# IN LIGHTS. CONTINUE MOV TOG2,R0 ;TO FIND CORRECT BLK# EHLT11: XX ;HALT WITH CORRECT REV. BLK# IN LIGHTS. CONTINUE b B) BINARY CONVERT & STORE: MOV CR.IBP,R1 ;GET INT BUFF PTR MOV @#CR.DB1,-(SP) ;... & INPUT MOV @SP,-(SP) ;... 2 COPIES FOR LATER COMB 1(R0)  ;ODD COLUMN? BPL CR.BST ASL @SP  ;IF SO SHIFT INPUT TO HIGH ASL @SP ASL @SP ASL @SP CLRB (R1)+  ;MAKE NXT INSTR = MOVB CR.BST: BISB 1(SP),-1(R1) ;SET HIGH BYTE AS REQD. MOVB (SP)+,(R1)+ ;THEN LOW BYTE MOV R1,CR.IBP ;SAVE PTR CMP (SP)+,#7400 ;NOW LOOK FOR EOF CARD BNE CR.BXT DECB @R0  ;...c ;STILL IN MIDDLE OF LINE LPTR01: MOV BUFBGN,R3 ;LINE WAS PRINTED: BEGIN NEW ONE LPXF01: MOVB #8.,TABPTR ;TAB POSITION COUNTER LPXF02: INC R1 ;COUNT DOWN MON-BUF CHARACTERS BEQ LPEMTY ;EMPTY: LEAVE BUF AS IS & RTN TO MON MOVB (R2)+,R5 ;FETCH NEXT CHAR BIC #177600,R5 ;CLEAR POSSIBLE PARITY BIT CMP R5,#40 ;<40? BGE LPXF03 ;NO CMP R5,#11 ;HORIZ TABdUPT. ;12-17-72 ; B) IF THE PARAMETER "BINARY" IS DEFINED AT ASSEMBLY, ; XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX ; ; THIS VERSION WILL ALSO ALLOW READING OF CARDS ; IN BINARY FORMAT. AS EACH CARD IS READ, 12 BITS FROM ; ALL 80 COLS WILL BE ACCESSED & STORED IN AN INTERNAL ; BUFFER IN A PACKED FORM, I.E. 4 COLS = 3 WORDS AS ; FOLLOWS:- ;  C.C.1 > WORD 1, BITS 15-4 ;  C.C.2 > WORD 1, BITS 3-0; WORD 2, BITS 15-8 ;  C.C.3 > WORD 2, BITS 7-0; e MOVB #3,@TCCM ;TO TRY PASS AGAIN JSR PC,FLAG1 ;FIND FWD EZ AND BR EHLT11+2 ;RESTART REVERSE BR RERCV ;CHECK PASS EHLT7: CLR @TCCM ;STOP TAPE MOV #4,R0 ;ERROR #4 HALT BR STRTJP ;RESTART EHLT12: CLR @TCCM ;STOP TAPE MOV #6,R0 ;ERROR #6 HALT BR STRTJP ;RESTART FRMBLK: MOV #-26f PUNCHED 12-11-0-1 BPL CR.BXT  ;... IN CC 1 THRU 8 ASLB @R0 BPL CR.EOF  ;IF FND IGNORE REST OF CARD BR CR.CXT  ;OTHERWISE TRY NEXT TIME .ENDC ; C) ASCII CONVERT & STORE: CR.ASC: MOVB @#CR.DB2,R1 ;GET COMPACTD INPUT TSTB @R0  ;IF FIRST C.C. ... BNE CR.CVT CMPB R1,#330 ;... LOOK FOR E-O-F BEQ CR.EOF .IFDF BLANKS  ;FOR BLANK SUPPRESS ... CMPB R1,#340 ;... LOOK FOR SUPPRESS OFF BEQ CR.ZONg? BEQ LP.TAB ;YES CMP R5,#12 ;LINE FEED? BEQ LPPRNT ;YES: END OF THIS LINE CMP R5,#14 ;FORM FEED? BNE LPXF02 ;NO: ILLEGAL, SO IGNORE INCB FORMFD ;YES: FLAG FOR HOME AFTER PRINT BR LPPRNT ;GO PRINT LINE LPXF03: CMP R5,#140 ;CHAR > 137? BGE LPXF02 ;YES: IGNORE JSR PC,PARITY ;LEGAL: GO SET EVEN PARIhWORD 3, BITS 15-12 ;  C.C.4 > WORD 3, BITS 11-0 ; ; THE PACKED FORM WILL BE TRANSFERRED TO THE USER ; BUFFER UNTIL THIS IS FILLED, ANY DATA THEN REMAINING ; IN THE INTERNAL BUFFER BEING RETAINED UNTIL THE ; NEXT READ REQUEST. ; ; TREATMENT OF ASCII READING WILL STILL FOLLOW PATTERN ; DESCRIBED IN THE PREVIOUS PARAGRAPH WITHOUT EXCEPTION. ; ; THE ONLY CONTROL CARD WHICH WILL HAVE ANY EFFECT ; IN BINARY READING WILL BE THAT INDICATING E.O.F. (IN ; THIS CASE 12-11-0-1 PUNCHING MUST APi6.,R4 ;COUNTER FOR 1 BLOCK'S WORTH OF MKTRACK MOV #BLKMRK,R0 ;POINTER TO MARK CODE TABLE LP6: JSR PC,FLAG ;WAIT FOR FLAG MOV (R0)+,@TCDT ;FETCH NEXT MARK CODE INC R4 ;DONE ALL? BNE LP6 ;IF NOT FETCH ANOTHER CODE RTS PC ;IF SO, EXIT .PAGE WRTDTA: MOV #-400,@TCWC ;WC FOR 1 BLOCK OF DATA MOV #DATBUF,@TCBA ;CA INITIALIZATION MOVBj CMPB R1,#350 ;OPTION TO SUPPRESS CC. 73-80? BEQ CR.EON ;YES:GO SET SWITCH .ENDC .IFNDF ONLY26&ONLY29 ;FOR DUAL PUNCH DRIVER ... CMPB R1,#310 ;... CHECK IF 029 CONTROL BEQ CR.029 CMPB R1,#320 ;... OR 026 CONTROL BEQ CR.026 .ENDC CR.CVT: CMPB #140,R1 ;IS CHAR [!]? BNE CR.CV1 ;NO MOVB #41,-(SP) ;YES:LOAD ASCII CODE... BR CR.CV2 ;.kTY MOVB R5,(R3)+ ;PUT INTO LOCAL BUFFER DECB TABPTR ;...AND KEEP TRACK OF POSITION BNE .+10 MOVB #8.,TABPTR ;RESET POINTER CMP R3,BUFEND ;END OF LOCAL BUFFER? BLOS LPXF02 ;NO: GET ANOTHER LPPRNT: MOVB #240,(R3) ;SPACE IN POSSIBLE ODD BYTE MOV R1,MONCNT ;SAVE CHAR COUNTER MOV R2,MONBUF ;SAVE MON BUF POINTER MOV BUFBGN,R4 ;LOCAL BlPEAR IN AT LEAST ; C.C. 1 THRU 8). ; ; N.B. WHEN ASSEMBLED FOR USAGE IN BOTH MODES, AN 'OPEN' ; CALL WILL NOT CAUSE READING OF A CARD TO ALLOW THIS ; TO BE TRANSLATED AS REQUIRED BY THE READ MODE ; SPECIFIED BY THE USER. ; ; C) DRIVER CAN ALSO BE USED FOR 80-COLUMN MARK ; SENSE READER. FOR 40 -COLUMN READER, ECONOMIES ; IN BUFFER SIZE CAN BE OBTAINED BY DEFINITION ; AT ASSEMLBY OF PARAMETER "MARKS". THIS WILL ; ALSO PREVENT AUTOMATIC REMOVAL OF COLS 33-40 ; IN 'BLANKS-SUPPRESS' MOm #15,@TCCM ;WRITE DATA TO MAKE PARITY OK JSR PC,FLAG ;WAIT FOR COMPLETION OR ERROR DEC TOG2 ;DECREMENT BLOCK# BPL CHKL3 ;IF BELOW 0 FINISH VP, OTHERWISE KEEP CHECKING FINIS: MOVB #3,@TCCM ;FIND REVERSE EZ JSR PC,FLAG1 ;SKIP ON EZ BR EHLT12 ;LAST REVERSE BLOCK # WAS NOT 0. CLR @TCCM ;STOP TAPE: MOV #BELS4,R0 ;UNCONDITIONAL FOUR BEn..FOR BUFFER BELOW CR.CV1: CMPB #240,R1 ;IS CHAR [?]? BNE CR.CV3 ;NO MOVB #77,-(SP) ;YES: LOAD AS ABOVE... CR.CV2: MOVB (SP)+,(R0)+ ;...AND POP FROM STACK TO KEEP IT HONEST BR CR.ST1 ;THEN SKIP TO END OF CONVERT LOOP CR.CV3: ;I COULDN'T THINK OF A BETTER WAY TST R1 BPL .+6  ;CONVERT CODES >200 ... ADD #340,R1  ;... TO RANGE >140 MOV R1,-(SP)  ;STACK CODE FOR INDEXING CR.CV4: SoUFFER SUB R3,R4 ;GET (NEG) CHAR COUNT ASR R4 ;(NEG) WORD COUNT BNE LPPR01 ;SOMETHING THERE: GO PRINT IT CLR R3 ;PRINT BUFFER EMPTY: RESET POINTER CMP R5,#12 ;WAS LAST MON BUF CHAR LINE FEED? BNE LPPR02 ;NO MOVB #201,ONECHR ;YES - SET UP TO SINGLE-SPACE CMPB @#SWR,#2 ;IS DOUBLE-SPACE SELECTED? BNE LPPR04  ;NO INCB ONECHR pDE OF USAGE. ;  XXXXXXXXXXXXXXXXXXXXXXXXX ;  X   X ;  X  NOTE  X ;  X   X ;  XXXXXXXXXXXXXXXXXXXXXXXXX ; ; PARAMETER DEFINITIONS CAN BE MADE DURING PASS 1 ; OF THE ASSEMBLY ONLY IF REQD AS DESCRIBED IN ; PAL-11R MANUAL, SECTION 9-2, E.G. ; ;  #CR,LP:,/PA:2 ; ;  XXXXXXXXXXXXXXXXXXXXXXXX ; .TITLE CR .GLOBL CR ; STANDARD PARqLLS JSR PC,PRINT1 MOV #MSG3,R0 ;FORMATTING HAS BEEN COMPLETED CORRECTLY JSR PC,PRINT ;MESSAGE ON TTY STRTJP: JMP START1 ;GO BACK FOR NEXT TAPE FLAG: BIT #B15+B7,@TCCM ;TEST ERROR AND READY BITS BEQ FLAG ;KEEP CHECKING IF BOTH DOWN BMI .+4 ;SKIP TO ERROR IF B15=1 RTS PC ;EXIT ON READY FLAG ERR1: MOV #1,R0 ;ERROR #1 HALT rUB #40,R1  ;FOR EACH 40 IN CODE ... BMI CR.STO  ;... ADD 21 & STRIP 40 SUB #17,@SP  ;... TO GET TABLE INDEX BR CR.CV4 ;...AND KEEP LOOKING CR.STO: .IFNDF ONLY26&ONLY29 ADD CR.TOS,@SP ;PICK APPROP. TABLE .ENDC ADD PC,@SP  ;COMPUTE ADDR OF BYTE REQD ADD #CR.TBL-.,@SP MOVB @(SP)+,(R0)+ ;... & STORE IN BUFFER CR.ST1: CMP R0,CR.UBE ;BUFFER FULL? .PAGE BEQ CR.EXT CR.BXT: BISB @PC,@R0  ;IF NOT SET UNDERWAY FLAG CR.CXT: MOVs ;SET UP TO DOUBLE-SPACE LPPR04: JSR PC,PRTONE ;GO UPSPACE ONE OR TWO BR LPTR01  ;...AND GO BACK FOR MORE LP.TAB: MOVB #240,(R3)+ ;ALWAYS TAB AT LEAST ONE SPACE CMP R3,BUFEND ;CHECK FOR BUFFER END BHI LPPRNT ;YES: PRINT NOW DECB TABPTR ;MORE TO SPACE? BNE LP.TAB ;YES CMPB @#SWR+1,#1 ;SEE IF "PAL" SPACING SELECTED BNE LPXF01  ;NO MOV R3,R5  ;CURRENT BUFFER tAMETER DEFINITIONS: BLANKS = 0 ;ENABLE BLANK SUPPRESSION DEFALT = 0 ;READ "FIELDATA" CODE BY DEFAULT R0=%0 R1=%1 R2=%2 R3=%3 R4=%4 R5=%5 SP=%6 PC=%7 ;INTERFACE TABLE: CR: .WORD 0   ;CURRENT DDB OR 0 IF IDLE .IFNDF BINARY .BYTE 224,0  ;FACILITIES: ASCII INPUT,OPEN INC. .ENDC .IFDF BINARY .BYTE 234,0  ;ALLOW BINARY IF REQD. .ENDC .BYTE 3  ;STD BUFFER SIZE = 96 BYTES .BYTE CR.INT-CR,300 ;INT'RUPT SVCE AT PRL 6 u MOV @TCST,R0 ;MOVE STATUS TO R0 FOR DISPLAY EHLT1: XX ;STATUS ERROR HALT. STATUS IN DATA ... BR STRTJP ;...LIGHTS. FIX PROBLEM & RESTART PRGRM FLAG1: BIT #B15+B7,@TCCM ;TEST ERROR AND READY BITS BEQ FLAG1 ;WAIT FOR EITHER FLAG BPL FL1RTN ;READY IS UP: EXIT TST @TCST ;IS ERROR END ZONE? BPL ERR1 ;NO - GO TO REGULAR STATUS ERROR v R0,CR.UBP ;SAVE NEW POINTER MOV (SP)+,R1 ;RESTORE USER REGS. CR.IXT: MOV (SP)+,R0 RTI   ;... & EXIT ; D) CARD COMPLETED: CR.DUN: CLRB @#CR.CSR ;STOP INTERRUPTS TSTB @R0  ;IF NO PROCESSING YET ... BEQ CR.RPT  ;... CONTINUE BIT #1,R0  ;SEE IF ADDRESS IS EVEN (SHOULD BE FOR CC.81) BNE CR.ERR  ;SOMETIMES MISSED INT ON FIRST CARD MOV (SP)+,R0 ;OTHERWISE RESTORE USER R0 MOV @#CR.RSV,-(SP) ;... & NOW SAVE ALL JSR R5,@(SP)+ CRwPOINTER SUB BUFBGN,R5 ;LINE POSITION CMP R5,#24.  ;@ BEGIN OF OP-CODE FIELD? BLT LPXF01  ;NOT THERE YET BGT LP.TA1  ;PAST IT: MAY NEED FURTHER WORK MOVB #6,TABPTR ;SET TO SPACE OVER SIX MORE TO LINE UP BR LP.TAB  ;AND GO INSERT THE SPACES .PAGE LP.TA1: BIT #7,R5  ;ARE WE AT AN EVEN-8 TAB BOUNDARY? BNE LPXF01  ;NO: DON'T SWEAT IT CMPB -(R3),-(R3) ;YES: BACK IT UP BY TWO BR LPXF01  ;AND GO BACK FOR MORE LPPR02: TSTB FORMFD ;x .BYTE CR.OPN-CR ;OFFSET TO OPEN .BYTE CR.TFR-CR ;OFFSET TO TRANSFER .BYTE 0,0,0  ;(NO CLOSE OR SPEC. FUNC.) CR.NAM: .RAD50 'CR' ;OPEN PROCESSOR: CR.ONR: JSR PC,CR.NRY CR.OPN: ;12-19-72 CLR @#CR.CSR ;GET ACTUAL STATUS, MINUS TRANSITION BITS ;12-19-72 BIT #400,@#CR.CSR ;IS READER READY? ;12-19-72 BNE CR.ONR  ;IF NOT TELL USER TO READY .yADD #2,(SP) ;INCRENT EXIT POINTER TO SKIP ON RETURN FL1RTN: RTS PC ;EXIT ON READY OR END ZONE .PAGE COBLKG: MOV #1101,R0 ;COMPLEMENT OBVERSE BLOCKS 1101-0 MOV #RBN,R1 ;BUFFER POINTER INITIALIZATION CBKL1: MOV R0,R2 ;FETCH WORD TO BE PROCESSED COM R2 ;COMPLEMENT IT MOV #-3,TOG1 ;COUNT OF 3 MOV R2,R3 ;MOV WORD INTO WORK AREA ROR z.CDN: BR .+12  ;SWITCH CLEARED UPON E-O-F MOVB #4,CR.CDN ;AND IMMEDIATELY RESET BR CR.DXT  ;BYPASSES USUAL END-CARD PROCESSING MOV CR.UBP,R0 ;SET USER BUFF PTR .IFDF BINARY  ;FOR BINARY VERSION ... TSTB CR.ISW  ;... CHECK IF BINARY READ BNE CR.BDN  ;IF SO ACTION ACCRODINGLY .ENDC MOV CR.UBE,R1 ;FOR ASCII, SET END PTR .IFDF BLANKS  ;... & PERHAPS CHECK SUPPRESS CR.ZSW: BR .+4  ;SWITCH ON? BR CR.ADN  ;IF NOT NO SUPPRESSION CR.ESW: BR .+6 {WAS LAST MON BUF CHAR FORM FEED? BEQ LPEMTY ;NO: EXIT WITH NO ACTION JSR PC,NEWPGE ;YES: EJECT TO TOP BR LPTR01  ;...AND GO BACK FOR MORE LPPR01: MOV BUFBGN,@#R.AD ;LOAD MEMORY ADDRESS REGISTER MOV R4,@#R.WC ;OUTPUT WORD COUNT MOV R4,WCSAVE ;SAVE WORD-COUNT FOR POSSIBLE RE-PRINT MOV #1,@#R.LF ;SET FOR AUTOLINEFEED CMPB @#SWR,#2 ;HAS CONSOLE SELECTED DOUBLE-SPACING? BNE LPPR03  ;NO: LEAVE IN SINGLE-SPACE|IFNDF ONLY26&ONLY29 .IFNDF DEFALT  ;FOR DUAL-PUNCH DRIVER ... CLR (PC)+  ;... SET CONV. TABLE OFFSET CR.TOS: .WORD 0 ;TABLE OFFSET IF NOT DEFALT .ENDC ;12-17-72 .IFDF DEFALT  ;... AS APPROPRIATE MOV #104,(PC)+ CR.TOS: .WORD 104 ;OFFSET FOR 'DEFALT'. INITIALIZED IN ; ;CASE OF NO OPEN. .ENDC ;} R2 ;SHIFT NEXT 3 BITS INTO POSITION ROR R2 ;FOR MANIPULATION ROR R2 ;ON NEXT PASS ;AND 1,R3 BIC #-1-1,R3 ;MASK 1 APPLIED TO R3 MOV R3,-(SP) ;STACK IT CBKL2: MOV R2,R3 ;MOVE BYTE(3) INTO WORK AREA ROR R2 ;SHIFT ROR R2 ;NEXT 3 BITS ROR R2 ;INTO POSITION ;AND 7,R3 BI~ ;SWITCH INITED TO ALLOW CC. 73-80 SUB #8.,R0  ;OTHERWISE LOSE CC 73-80 CMP -(R0),(PC)+ ;TRAILING SPACES NOW SUPPRESSED .BYTE 240,240 BEQ .-4 TST (R0)+  ;ADJUST PTR WHEN DONE CR.ADN: .ENDC CLR -(R1)  ;CLEAR REST OF BUFFER CMP R1,R0 BHI .-4 MOV (PC)+,@R1 ;FINALLY MOVE IN CR-LF .BYTE 215,12 CR.DXT: MOV CR,R0  ;GET DDB ADDRESS JMP @14(R0)  ;TAKE COMPLETION EXIT .IFDF BINARY CR.BDN: MOV CR.IBS,R1 ;FOR BINARY, INIT INT PTR MOVB  MODE MOV #3,@#R.LF ;SET FOR AUTO-DOUBLESPACE LPPR03: MOV #144000,@#R.CM ; /////PRINT ///// CLR CURBUF ;FORCE NEW LINE NEXT TIME RTS PC LPEMTY = . ;MONITOR BUFFER IS EMPTY MOV R3,CURBUF ;SAVE CURRENT LOCAL BUFFER POINTER JMP LP.EXT ;AND TAKE COMPLETION EXIT ;(BUFFER POINTER IS REMEMBERED UNTIL NEXT BUFFER TRANSFER, SO THAT ; CURRENT LINE CAN BE CONTINUED TO A LINE TERMINATOR. THE ABOVE EX12-17-72 .ENDC ;12-17-72 .IFDF BLANKS  ;IF BLANK-SUPPRESS VERSION ... MOVB #1,CR.ZSW ;FORCE SPACE-SUPPRESSION ON MOVB #2,CR.ESW ;...BUT DON'T SUPPRESS CC. 73-80 .ENDC .IFNDF BINARY TST (SP)+  ;IGNORE INTERIM RETURN BR CR.DXT  ;... & TAKE COMPLETION .ENDC .IFDF BINARY  ;FOR BINARY VERSION ... CLRB CR.TFR  ;... FORCE NO OPEN READ BR CR.ODN CR.OXT: INCB CR.TFR C #-7-1,R3 ;MASK 7 APPLIED TO R3 MOV R3,-(SP) ;STACK BYTE INC TOG1 ;DONE ALL? BNE CBKL2 ;NO CLR R3 ;YES - CLEAR WORK AREA ADD 6(SP),R3 ;ADD AND JSR R5,RTHL ;SHIFT BYTES IN REVERSE ORDER ADD 4(SP),R3 ;NEXT BYTE JSR R5,RTHL ;SHIFT ADD 2(SP),R3 ;NEXT BYTE JSR R5,RTHL ;SHIFT@R0,R2  ;EXIT IF EOF SEEN BMI CR.DXT  ;ALSO SETS INTERRUPT FLAG JSR PC,CR.BIN ;ELSE GO MOVE DATA TO USER MOV @#CR.SXT,R5 ;IF COME BACK, MORE READ REQD. JMP 4(R5)  ;SO TAKE SYSTEM EXIT .ENDC ;SPECIAL CASE PROCESSING: ; A) ERROR ROUTINE: CR.ERR: CLRB @#CR.CSR ;STOP INTERRUPTS JSR PC,CR.NRY ;INFORM OPERATOR CR.RPT: JSR PC,CR.AGN ;IF RETURN TRY AGAIN BR CR.IXT  ;... & EXIT FOR NOW ; B) END OF FILE CARD SEEN: CR.EOF: MOV CR,R1  IT ; PROVIDES A STACK-POP, WHICH IN THIS CASE REMOVES THE CALL TO THIS ; SUBROUTINE.) PARITY = . ;SUBROUTINE TO SET EVEN PARITY IN BIT7 CLRB PRTYCT ;ACCUMULATE SET BITS MOVB #7,SHFTCT ;TEST LOW SEVEN BITS ONLY MOV R5,-(SP) ;DO WORK ON STACK PARIT1: RORB (SP) ;SHIFT OFF LOW BIT ADCB PRTYCT ;ACCUM COUNT OF SET BITS DECB SHFTCT ;MORE TO TE ;... BY MAKING COME HERE BR CR.ODN  ;... BEFORE EXIT .ENDC ;SUBSIDIARY ROUTINES: ; A) RESTART AFTER ERROR: CR.AGN: .IFDF BINARY  ;IN BINARY VERSION ... TSTB CR.ISW  ;... CHECK IF BINARY READ BEQ CR.TFR  ;IF NOT CAN JUST START OVER BR CR.ERD  ;ELSE LEAVE USER BUFFER ALONE ; B) INITIALISE INTERNAL BUFFER POINTERS: CR.ISP: MOV PC,-(SP) ;GET BUFFER START ADD #CR.BUF-.,@SP MOV @SP,(PC)+ CR.IBS: .WORD 0 ADD #CR.BSZ,@SP ;NOW GET END MOV @SP,(PC)+ ADD (SP),R3 ;LAST BYTE FROM STACK JSR R5,RTHL ;SHIFT JSR R5,RTHL ;SHIFT ADD #77,R3 ;=00 FWD MOV R3,(R1)+ ;STORE COMPL. OBVERSE BLOCK # IN TABLE ADD #10,SP ;ADVANCE STACK DEC R0 ;DECREMENT BLK# BPL CBKL1 ;LOOP UNTIL IT PASSES 0 RTS PC ;THEN EXIT .PAGE RTHL: CLC ;THREE BIT;GET DDB ADDRESS .IFNDF BINARY  ;FOR SIMPLE VERSION ... MOV 10(R1),16(R1) ;... NO DATA READ ON EOF .ENDC .IFDF BINARY  ;MAYBE SOME IF BINARY ... ADD #16,R1  ;SO MOVE TO UNUSED COUNT STORE MOV R0,@R1  ;... & COMPUTE VALUE REQD SUB CR.UBE,@R1 ASR @R1  ;... AS WORDS! .ENDC COM @R0  ;SET UNDERWAY FLAG TO PREVENT READING MORE CARDS CLRB CR.CDN  ;BYPASS END-CARD PROCESSING FOR E-O-F CR.EXT: BISB #2,@#CR.CSR ;ALLOW REST OF CARD THRU BR CR.CXT ; CST? BNE PARIT1 ;YES TST (SP)+ ;NO: POP WORKING WORD ASL R5 ;POSITION CHAR RORB PRTYCT ;IF ODD # OF BITS SET, WILL SET C RORB R5 ;SHIFT C INTO BIT #7 OF CHAR RTS PC ERMES: MOV LP.NAM,-(SP) ;PRINT A002 MESSAGE MOV #402,-(SP) IOT RTS PC ;RETURN WHEN OPERATOR TYPES CO NEWPGE: MOVB #300,ONECHR ;CODE FOR V;STORE AS CONTROL CR.IBE: .WORD 0 MOV (SP)+,(PC)+ ;... & AS INIT. PTR CR.IBP: .WORD 0 .PAGE INCB @PC  ;MUSTN'T COME HERE AGAIN! .ENDC ;TRANSFER SET-UP PROCESSOR: CR.TFR: .IFDF BINARY  ;FOR BINARY VERSION ... BR .+4  ;... SWITCH TABLE FORCES ... BR CR.OXT  ;... CORRECT INIT. BR CR.ISP .ENDC MOV CR,R0  ;GET DDB ADDRESS ADD #6,R0  ;... & MOVE TO BUFFER STORE MOV (R0)+,-(SP) ;GET BUFFER POINTER MOV @SP, LEFT SHIFT, CLEAR CARRY ROL R3 ;SHIFT 1 ROL R3 ; 2 ROL R3 ; 3 RTS R5 ;THEN EXIT PRINT: TST @#SR ;IS PRINT-SUPPRESS SWITCH ON? BMI PRTN PRINT1: MOVB (R0)+,R1 BNE .+4 PRTN: RTS PC MOVB R1,@#TPB TSTB @#TPS ;DONE? BPL .-4 ;NOT YET BR PRINT1 MSGA: .BYTE CR,LF,) CONTROL CARD SEEN: .IFNDF ONLY26&ONLY29 ;FOR DUAL PUNCH DRIVER ... CR.026: MOV #104,CR.TOS ;... SET TABLE OFFSET ... BR CR.EXT  ;... & IGNORE REST OF CTL CARD CR.029: CLR CR.TOS BR CR.EXT .ENDC .IFDF BLANKS  ;IN SUPPRESS VERSION CR.ZON: CLRB CR.ZSW ;...SET TO OVERRIDE BLANK SUPPRESSION BR CR.EXT  ;AGAIN IGNORE REST OF CARD CR.EON: CLRB CR.ESW ;SET SWITCH TO IGNORE CC.73-80 BR CR.EXT .ENDC ;READER NFU CHANNEL #1 JSR PC,PRTONE ;GO OUTPUT IT CLRB FORMFD  ;RESET FLAG AFTER EJECT RTS PC .PAGE PRTONE = . ;SUBRTNE TO PUT OUT ONE CHARACTER BIT #4,@#R.ST ;TEST "PRINTER READY" BEQ .-6 ;WAIT TILL THRU SO WON'T CLOBBER MODE CLR @#R.LF ;MODETO FIRST-CHAR MOV #-1,@#R.WC ;ONE WORD MOV PC,-(SP) ;BUILD ADDRESS... ADD #ONECHR-.-(SP) ;... & BUILD BUFF END SUB @R0,@SP SUB (R0)+,@SP MOV (SP)+,(PC)+ ;SAVE RESULT ... CR.UBE: .WORD 0 .IFDF BINARY  ;IN BINARY VERSION ... MOVB @R0,R0  ;... CHECK MODE BICB #376,R0 MOVB R0,CR.ISW ;IF ASCII CLEAR SWITCH BEQ CR.RDC  ;IF BINARY WANTED ... MOV (SP)+,R0 ;... SET PTRS & SWITCH MOV CR.IBP,R1 CLR R2  ;SET INTERRUPT FLAG CR.BIN: CMP R1,CR.IBE ;INTERNAL BUFF EMPTY? BNE CR.BLP CR.ERD: MOV CR.IBS,CR.IBP ;IF SO RESET INTERNAL PTR LF .ASCII *DECTAPE FORMATTER V03A* .BYTE CR,LF .ASCII *SWITCH #15 UP TO SUPPRESS TTY MESSAGES* .BYTE CR,LF,0 BELS4: .BYTE 7,7 BELS2: .BYTE 7,7,0 MSG1: .BYTE CR,LF,LF,LF,LF .ASCII *NEXT TAPE: BOTH SWITCHES "UP"* .BYTE CR,LF,0 MSG2: .BYTE CR,LF .ASCII *T&M GOOD: "WRTM" DOWN* .BYTE CR,LF,0 MSG3: .BYTE CR,LF .ASCII *FORMAT COMPLETE* .BYTE 0 .EVEN .PAGE OT READY SUBROUTINE: CR.NRY: MOV CR.NAM,-(SP) ;IDENTIFY DEVICE MOV #402,-(SP) ;GIVE ONT READY CODE IOT   ;... & CALL EDP RTS PC  ;TRY AGAIN IF COME BACK ; ;MISCELLANEOUS DEFINITIONS: CR.CSR=177160 CR.DB1=177162 CR.DB2=177164 CR.SXT=42 CR.RSV=44 CR.TBL: ;PARITY ASCII CONVERSION TABLE FOR 029 PUNCH .IFNDF ONLY26 .BYTE 240  ;SPACE .BYTE 261  ;1 .BYTE 262  ;;2 .BYTE 63  ;3 .BYTE 264  ;4 .BYTE 65  ;5 .BYTE 66  ;6 .,(SP) ;...FOR THE ONE/CHARACTER WORD MOV (SP)+,@#R.AD ;LOAD MEMORY ADDRESS REG MOV #4000,@#R.CM ; START : NO INTERRUPT TST @#R.ST ;WAIT FOR DONE BPL .-4 BIT #4,@#R.ST ;TEST "PRINTER READY" BEQ .-6 ;SAME AS ABOVE,IN CASE BACK TO AUTO MODE RTS PC WCSAVE: .WORD 0 SAVRTN: .WORD 0 CURBUF: .WORD 0 BUFBGN: .WORD 0 BUFEND: .WORD 0 MONCNT: .WORD MOV R0,-(SP) ;SAVE USER BUFF PTR ... CR.RDC: .ENDC MOV @SP,(PC)+ CR.UBP: .WORD 0 CLR @(SP)+  ;ZERO UNDERWAY FLAG MOV #101,@#CR.CSR ;ENABLE INT & GO FOR CD READ RTS PC  ;RETURN USER FOR NOW .IFDF BINARY  ;WITH BINARY DATA ... CR.BLP: SWAB @R1  ;... COMPLETE CONVERSION MOV (R1)+,(R0)+ ;... & GIVE TO USER CMP R0,CR.UBE ;USER BUFFER FULL? BNE CR.BIN  ;IF NOT GET NEXT WORD MOV R1,CR.IBP ;OTHERWISE SAVE INT PTR TST R2  BLKMRK: .WORD 010101 ;INTERBLOCK SYNC=25 .WORD 010110 ;FORWARD BLOCK MARK=26 .WORD 011010 ;REVERSE GUARD=32 .WORD 001000 ;LOCK=10 .WORD 001000 ;REVERSE PARITY=10 .WORD 001000 ;REVERSE FINAL=10 .WORD 001000 ;REVERSE PRE-FINAL=10 .WORD 111000 ;MARK DATA=70 .WORD 111000 ;MARK DATA=70 .WORD 111000 ;MARK DATA=7BYTE 267  ;7 .BYTE 270  ;8 .BYTE 240  ;EMPTY .BYTE 72  ;: .BYTE 243  ;# .BYTE 300  ;@ .BYTE 47  ;' .BYTE 275  ;= .BYTE 42  ;" .BYTE 71  ;9 ; .BYTE 60  ;0 .BYTE 257  ;/ .BYTE 123  ;S .BYTE 324  ;T .BYTE 125  ;U .BYTE 126  ;V .BYTE 327  ;W .BYTE 330  ;X .BYTE 131  ;Y .BYTE 240  ;EMPTY .BYTE 335  ;] .BYTE 254  ;, .BYTE 245  ;% .BYTE 137  ;_ .BYTE 276  ;> .BYTE 77  ;? .BYTE 132 0 MONBUF: .WORD 0 ONECHR: .BYTE 0 .BYTE 0 FORMFD: .BYTE 0 TABPTR: .BYTE 0 PRTYCT: .BYTE 0 SHFTCT: .BYTE 0 .EVEN LP.BUF = . ;LOCAL BUFFER .=.+160. ;RESERVE SPACE FOR BUFFER .END ;COME HERE ON INTERRUPT? BNE CR.ODN  ;IF SO MODE SW. SET MOV @SP,-(SP) ;ELSE MUST SIMULATE ... MOV -(R2),2(SP) ;... STORE PC & PS SUB #16,SP  ;... & DUMMY SAVE REGS. CR.ODN: TST (SP)+  ;IGNORE RETURN PC BR CR.DXT  ;... & TAKE COMPLETION EXIT .ENDC ;INTERRUPT SERVICE ROUTINES: ; A) CHECK FOR ERROR & COLLECT INPUT: CR.INT: MOV R0,-(SP) ;SAVE USER R0 MOV CR.UBP,R0 ;GET USER BUFF PTR ... MOV @#CR.CSR,-(SP) ;... & READER STATUS 0 .WORD 111000 ;MARK DATA=70 .WORD 111000 ;MARK DATA=70 .WORD 111000 ;MARK DATA=70 .WORD 111000 ;MARK DATA=70 .WORD 111000 ;MARK DATA=70 .WORD 111000 ;MARK DATA=70 .WORD 111000 ;MARK DATA=70 .WORD 111000 ;MARK DATA=70 .WORD 111000 ;MARK DATA=70 .WORD 111000 ;MARK DATA=70 .WORD 111000 ;Z ; .BYTE 55  ;- .BYTE 312  ;J .BYTE 113  ;K .BYTE 314  ;L .BYTE 115  ;M .BYTE 116  ;N .BYTE 317  ;O .BYTE 120  ;P .BYTE 321  ;Q .BYTE 240  ;EMPTY .BYTE 41  ;! .BYTE 44  ;$ .BYTE 252  ;* .BYTE 251  ;) .BYTE 273  ;; .BYTE 134  ;\ .BYTE 322  ;R ; .BYTE 246  ;& .BYTE 101  ;A .BYTE 102  ;B .BYTE 303  ;C .BYTE 104  ;D .BYTE 305  ;E .BYTE 306  ;F .BYTE 107  ;.(h,.V4 V p5pDD.& ve&.L Ap&p b;ftȋW.r`WpWpWgW``!.? ef b.m`ae7 x;7tpȋ&.5$^ JB. ( ! @  ASL (SP)+  ;CHECK FOR SPECIAL CASES BCS CR.ERR  ;GO RETRY IF ERROR BMI CR.DUN  ;CLEAN UP IF DONE MOV R1,-(SP) ;NOW SAVE USER R1 .IFDF BINARY  ;IN BINARY VERSION ... CR.ISW: BR .+4  ;... USE APPROPRIATE CONVERSION BR CR.ASC ; B) BINARY CONVERT & STORE: MOV CR.IBP,R1 ;GET INT BUFF PTR MOV @#CR.DB1,-(SP) ;... & INPUT MOV @SP,-(SP) ;... 2 COPIES FOR LATER COMB 1(R0)  ;ODD COLUMN? BPL CR.BST ASL @SP  ;IF SO SHIFT INPUT TO HIGH ASL @SP ;MARK DATA=70 .WORD 111000 ;MARK DATA=70 .WORD 111000 ;MARK DATA=70 .WORD 111000 ;MARK DATA=70 .WORD 111000 ;MARK DATA=70 .WORD 111000 ;MARK DATA=70 .WORD 111000 ;MARK DATA=70 .WORD 111000 ;MARK DATA=70 .WORD 111000 ;MARK DATA=70 .WORD 111000 ;MARK DATA=70 .WORD 111000 ;MARK DATA=70 G .BYTE 110  ;H .BYTE 240  ;EMPTY .BYTE 333  ;[ .BYTE 56  ;. .BYTE 74  ;< .BYTE 50  ;( .BYTE 53  ;+ .BYTE 336  ;^ .BYTE 311  ;I .ENDC ;PARITY ASCII CONVERSION TABLE FOR "FIELDATA" PUNCH: ; COMPRESSED CARD CODE: ; BYTE BIT POSITIONS: 7 6 5 4 3 2-1-0 ; CARD ROWS PUNCHED: ^ 12 11 ^ 0 9 8 ^ 1,2,3,4,5,6,OR 7 .IFNDF ONLY29 ; COMPRESSED FIELDATx p 8.0 qH 7pD.V7 775p.|356:'"90SUVYݬ_?ZN.-KMNPѠ!$\ҦABDGH.<(+ɠ3.56':90SUVY_(\"Z-KMNP"Ѡ$ݻ+ABDGH.<[ASL @SP ASL @SP CLRB (R1)+  ;MAKE NXT INSTR = MOVB CR.BST: BISB 1(SP),-1(R1) ;SET HIGH BYTE AS REQD. MOVB (SP)+,(R1)+ ;THEN LOW BYTE MOV R1,CR.IBP ;SAVE PTR CMP (SP)+,#7400 ;NOW LOOK FOR EOF CARD BNE CR.BXT DECB @R0  ;... PUNCHED 12-11-0-1 BPL CR.BXT  ;... IN CC 1 THRU 8 ASLB @R0 BPL CR.EOF  ;IF FND IGNORE REST OF CARD BR CR.CXT  ;OTHERWISE TRY NEXT TIME .ENDC ; C) ASCII CONVERT & STORE: CR.ASC: MOVB @#CR.DB.WORD 111000 ;MARK DATA=70 .WORD 111000 ;MARK DATA=70 .WORD 111000 ;MARK DATA=70 .WORD 111000 ;MARK DATA=70 .WORD 111000 ;MARK DATA=70 .WORD 111000 ;MARK DATA=70 .WORD 111000 ;MARK DATA=70 .WORD 111000 ;MARK DATA=70 .WORD 111000 ;MARK DATA=70 .WORD 111000 ;MARK DATA=70 .WORD 111000 ;MARK A ; ASCII PRINTED CARD CODE PUNCH ; CODE CHARACTER (OCTAL) CODE .BYTE 240 ; SPACE 0 BLANK .BYTE 261 ; 1 1 1 .BYTE 262 ; 2 2 2 .BYTE 063 ; 3 3 3 .BYTE 264 ; 4 4 4 .BYTE 065 ; 5 5 5 .BYTE 066 ; 6 6 6 .BYTE 267 ; 7 7 7 .BYTE 270 +,V4 V p5pDD,& ve&,L Ap&p b;ftȋW,r`WpWpWgW``!,? ef g,m`ae7 x;7tpȋ&,5$^ JB, ( ! @  x p 8,0 qH 7pD2,R1 ;GET COMPACTED INPUT TSTB @R0  ;IF FIRST C.C. ... BNE CR.CVT CMPB R1,#330 ;... LOOK FOR E-O-F BEQ CR.EOF .IFDF BLANKS  ;FOR BLANK SUPPRESS ... CMPB R1,#340 ;... LOOK FOR SUPPRESS OFF BEQ CR.ZON CMPB R1,#350 ;OPTION TO SUPPRESS CC. 73-80? BEQ CR.EON ;YES:GO SET SWITCH .ENDC .IFNDF ONLY26&ONLY29 ;FOR DUAL PUNCH DRIVER ... CMPB R1,#310 ;... CHECK IF 029 CONTROL BDATA=70 .WORD 111000 ;MARK DATA=70 .WORD 111000 ;MARK DATA=70 .WORD 111000 ;MARK DATA=70 .WORD 111000 ;MARK DATA=70 .WORD 111000 ;MARK DATA=70 .WORD 111000 ;MARK DATA=70 .WORD 111000 ;MARK DATA=70 .WORD 111000 ;MARK DATA=70 .WORD 111000 ;MARK DATA=70 .WORD 111000 ;MARK DATA=70 .WORD 1110 ; 8 10 8 .BYTE 240 ; EMPTY 11 8-1 .BYTE 246 ; & 12 8-2 .BYTE 275 ; = 13 8-3 .BYTE 047 ; ' 14 8-4 .BYTE 072 ; : 15 8-5 .BYTE 276 ; > 16 8-6 .BYTE 300 ; @ 17 8-7 .BYTE 071 ; 9 20 9 .BYTE 060 ; 0 40 0 .BYTE 257 ; / 41 ,V7 775p,|356:'"90SUVYݬ_?ZS,-KMNPѠ!$\ҦABDGH.<(+ɠ3,56':90SUVY_(\"Z-KMNP Ѡ$ݻ+ABDGH.<`EQ CR.029 CMPB R1,#320 ;... OR 026 CONTROL BEQ CR.026 .ENDC CR.CVT: CMPB #140,R1 ;IS CHAR [!]? BNE CR.CV1 ;NO MOVB #41,-(SP) ;YES:LOAD ASCII CODE... BR CR.CV2 ;...FOR BUFFER BELOW CR.CV1: CMPB #240,R1 ;IS CHAR [?]? BNE CR.CV3 ;NO MOVB #77,-(SP) ;YES: LOAD AS ABOVE... CR.CV2: MOVB (SP)+,(R0)+ ;...AND POP FROM STACK TO KEEP IT HONEST BR00 ;MARK DATA=70 .WORD 111000 ;MARK DATA=70 .WORD 111000 ;MARK DATA=70 .WORD 111000 ;MARK DATA=70 .WORD 111000 ;MARK DATA=70 .WORD 111000 ;MARK DATA=70 .WORD 111000 ;MARK DATA=70 .WORD 111000 ;MARK DATA=70 .WORD 111000 ;MARK DATA=70 .WORD 111000 ;MARK DATA=70 .WORD 111000 ;MARK DATA=70 0-1 .BYTE 123 ; S 42 0-2 .BYTE 324 ; T 43 0-3 .BYTE 125 ; U 44 0-4 .BYTE 126 ; V 45 0-5 .BYTE 327 ; W 46 0-6 .BYTE 330 ; X 47 0-7 .BYTE 131 ; Y 50 0-8 .BYTE 240 ; EMPTY 51 0-8-1 .BYTE 137 ; _ 52 0-8-2 .BYTE 254 ; , 53 0-8-3 rX\( &@p' ,B*w ?0 6 "d8T T BLV`~p~ndZ*E0f8f*<M `T< CR.ST1 ;THEN SKIP TO END OF CONVERT LOOP CR.CV3: ;I COULDN'T THINK OF A BETTER WAY TST R1 BPL .+6  ;CONVERT CODES >200 ... ADD #340,R1  ;... TO RANGE >140 MOV R1,-(SP)  ;STACK CODE FOR INDEXING CR.CV4: SUB #40,R1  ;FOR EACH 40 IN CODE ... BMI CR.STO  ;... ADD 21 & STRIP 40 SUB #17,@SP  ;... TO GET TABLE INDEX BR CR.CV4 ;...AND KEEP LOOKING CR.STO: .IFNDF ONLY26&ONLY29 ADD CR.TOS,@SP ;PICK APPROP. .WORD 111000 ;MARK DATA=70 .WORD 111000 ;MARK DATA=70 .WORD 111000 ;MARK DATA=70 .WORD 111000 ;MARK DATA=70 .WORD 111000 ;MARK DATA=70 .WORD 111000 ;MARK DATA=70 .WORD 111000 ;MARK DATA=70 .WORD 111000 ;MARK DATA=70 .WORD 111000 ;MARK DATA=70 .WORD 111000 ;MARK DATA=70 .WORD 111000 .BYTE 050 ; ( 54 0-8-4 .BYTE 245 ; % 55 0-8-5 .BYTE 134 ; \ 56 0-8-6 .BYTE 042 ; " 57 0-8-7 .BYTE 132 ; Z 60 0-9 .BYTE 055 ; - 100 11 .BYTE 312 ; J 101 11-1 .BYTE 113 ; K 102 11-2 .BYTE 314 ; L 103 11-3 .BYTE 115 ; M 104x,w , e BfE͓͋7.  @ D$ e6*D B  @*hǁP%Haw eN1"* $#  ̋ N*C ̋&͕ E m* E?  & *   w 6"P*&&f&! /8G *J TABLE .ENDC ADD PC,@SP  ;COMPUTE ADDR OF BYTE REQD ADD #CR.TBL-.,@SP MOVB @(SP)+,(R0)+ ;... & STORE IN BUFFER CR.ST1: CMP R0,CR.UBE ;BUFFER FULL? .PAGE BEQ CR.EXT CR.BXT: BISB @PC,@R0  ;IF NOT SET UNDERWAY FLAG CR.CXT: MOV R0,CR.UBP ;SAVE NEW POINTER MOV (SP)+,R1 ;RESTORE USER REGS. CR.IXT: MOV (SP)+,R0 RTI   ;... & EXIT ; D) CARD COMPLETED: CR.DUN: CLRB @#CR.CSR ;STOP INTERRUPTS TSTB @R0  ;IF NO PROCESSIN;MARK DATA=70 .WORD 111000 ;MARK DATA=70 .WORD 111000 ;MARK DATA=70 .WORD 111000 ;MARK DATA=70 .WORD 111000 ;MARK DATA=70 .WORD 111000 ;MARK DATA=70 .WORD 111000 ;MARK DATA=70 .WORD 111000 ;MARK DATA=70 .WORD 111000 ;MARK DATA=70 .WORD 111000 ;MARK DATA=70 .WORD 111000 ;MARK DATA=70 .WORD 11-4 .BYTE 116 ; N 105 11-5 .BYTE 317 ; O 106 11-6 .BYTE 120 ; P 107 11-7 .BYTE 321 ; Q 110 11-8 .BYTE 240 ; EMPTY 111 11-8-1 .BYTE 240 ; EMPTY 112 11-8-2 .BYTE 044 ; $ 113 11-8-3 .BYTE 252 ; * 114 11-8-4 .BYTE 335 ; ] 115 11-8-5 .BYTE 273 ; ; 116/V e@8f*n f" `DaJY*e " a* E  w *J ` >C“`# 0 *C B 7!$   #`*"+ KP   w w l*F@a/ Ba+Aa B`A.j D@mE D x*@B   w 0 , Xw G YET ... BEQ CR.RPT  ;... CONTINUE BIT #1,R0  ;SEE IF ADDRESS IS EVEN (SHOULD BE FOR CC.81) BNE CR.ERR  ;SOMETIMES MISSED INT ON FIRST CARD MOV (SP)+,R0 ;OTHERWISE RESTORE USER R0 MOV @#CR.RSV,-(SP) ;... & NOW SAVE ALL JSR R5,@(SP)+ CR.CDN: BR .+12  ;SWITCH CLEARED UPON E-O-F MOVB #4,CR.CDN ;AND IMMEDIATELY RESET BR CR.DXT  ;BYPASSES USUAL END-CARD PROCESSING MOV CR.UBP,R0 ;SET USER BUFF PTR .IFDF BINARY  ;FOR BINARY VERSION ... TSTB CR.ISW  111000 ;MARK DATA=70 .WORD 111000 ;MARK DATA=70 .WORD 111000 ;MARK DATA=70 .WORD 111000 ;MARK DATA=70 .WORD 111000 ;MARK DATA=70 .WORD 111000 ;MARK DATA=70 .WORD 111000 ;MARK DATA=70 .WORD 111000 ;MARK DATA=70 .WORD 111000 ;MARK DATA=70 .WORD 111000 ;MARK DATA=70 .WORD 111000 ;MARK DATA=7 11-8-6 .BYTE 336 ; ^ 117 11-8-7 .BYTE 322 ; R 120 11-9 ; NOTE: SINCE THE [11-0] SERIES IS OMITTED, THE DRIVER STRIPS ; AN OCTAL 40 FROM THE FOLLOWING COMPRESSED CODES BEFORE INDEXING. ; THUS, THE LETTER 'C' IS INTERPRETED AS OCTAL 143, EVEN THOUGH ; THE CARD READER COMPRESSED CODE IS OCTAL 203. .BYTE 053 ; + 200 12 .BYTE 101 ; A 201 12-1 .BYTE 102 ; B d*P7w \PABCfDՋ. ŀ* 7<W j*ewW~W͊ *,NN`$ e^    $PtQ "*BHߓ1$:*Ó C"""E8bw ,w*0B 5  wU7$   7 ~f>  7 ;... CHECK IF BINARY READ BNE CR.BDN  ;IF SO ACTION ACCRODINGLY .ENDC MOV CR.UBE,R1 ;FOR ASCII, SET END PTR .IFDF BLANKS  ;... & PERHAPS CHECK SUPPRESS CR.ZSW: BR .+4  ;SWITCH ON? BR CR.ADN  ;IF NOT NO SUPPRESSION CR.ESW: BR .+6 ;SWITCH INITED TO ALLOW CC. 73-80 SUB #8.,R0  ;OTHERWISE LOSE CC 73-80 CMP -(R0),(PC)+ ;TRAILING SPACES NOW SUPPRESSED .BYTE 240,240 BEQ .-4 TST (R0)+  ;ADJUST PTR WHEN DONE CR.ADN: .ENDC CLR -(R1) 0 .WORD 111000 ;MARK DATA=70 .WORD 111000 ;MARK DATA=70 .WORD 111000 ;MARK DATA=70 .WORD 111000 ;MARK DATA=70 .WORD 111000 ;MARK DATA=70 .WORD 111000 ;MARK DATA=70 .WORD 111000 ;MARK DATA=70 .WORD 111000 ;MARK DATA=70 .WORD 111000 ;MARK DATA=70 .WORD 111000 ;MARK DATA=70 .WORD 111000 202 12-2 .BYTE 303 ; C 203 12-3 .BYTE 104 ; D 204 12-4 .BYTE 305 ; E 205 12-5 .BYTE 306 ; F 206 12-6 .BYTE 107 ; G 207 12-7 .BYTE 110 ; H 210 12-8 .BYTE 240 ; EMPTY 211 12-8-1 .BYTE 240 ; EMPTY 212 12-8-2 .BYTE 056 ; . 213 12-8-3 .BYTE 251 ; ) f*R aC$&pcF %$*v C%@`Գ Aa ,Ӌ(q%* (  EUHQ̳ (& *  Β ,^ 6S* $%5bec* Na  搎NŀW @** W  װΌeΌ%H *N p MECP  "ϰU*r  ` ( U (0 w w &* * $$$E e) ;CLEAR REST OF BUFFER CMP R1,R0 BHI .-4 MOV (PC)+,@R1 ;FINALLY MOVE IN CR-LF .BYTE 215,12 CR.DXT: MOV CR,R0  ;GET DDB ADDRESS JMP @14(R0)  ;TAKE COMPLETION EXIT .IFDF BINARY CR.BDN: MOV CR.IBS,R1 ;FOR BINARY, INIT INT PTR MOVB @R0,R2  ;EXIT IF EOF SEEN BMI CR.DXT  ;ALSO SETS INTERRUPT FLAG JSR PC,CR.BIN ;ELSE GO MOVE DATA TO USER MOV @#CR.SXT,R5 ;IF COME BACK, MORE READ REQD. JMP 4(R5)  ;SO TAKE SYSTEM EXIT .ENDC ;MARK DATA=70 .WORD 111000 ;MARK DATA=70 .WORD 111000 ;MARK DATA=70 .WORD 111000 ;MARK DATA=70 .WORD 111000 ;MARK DATA=70 .WORD 111000 ;MARK DATA=70 .WORD 111000 ;MARK DATA=70 .WORD 111000 ;MARK DATA=70 .WORD 111000 ;MARK DATA=70 .WORD 111000 ;MARK DATA=70 .WORD 111000 ;MARK DATA=70 214 12-8-4 .BYTE 333 ; [ 215 12-8-5 .BYTE 074 ; < 216 12-8-6 .BYTE 243 ; # 217 12-8-7 .BYTE 311 ; I 220 12-9 ; ALSO NOTE: THE CHARACTERS [?] AND [!] HAVE COMPRESSED CODES OF ; OCTAL [240] AND [140], RESPECTIVELY, MAKING THEM UNIQUE ; CHARACTERS OUTSIDE THE EVALUATION RANGE OF THE DRIVER. THUS ; SPECIAL CODE HAS BEEN INSERTED IN THE DRIVER TO DETECT THESE ; TWO CH* U@    J*  U@w  "Ő * ea*Y p ŐŊ*& & " E T (P $bH*J c H  U  "b*n UE T0 0 ŋU *  pU2"װ* w  <@E%I* A! װ5KE֊EeE* U%p!Ed Qbep "װ;SPECIAL CASE PROCESSING: ; A) ERROR ROUTINE: CR.ERR: CLRB @#CR.CSR ;STOP INTERRUPTS JSR PC,CR.NRY ;INFORM OPERATOR CR.RPT: JSR PC,CR.AGN ;IF RETURN TRY AGAIN BR CR.IXT  ;... & EXIT FOR NOW ; B) END OF FILE CARD SEEN: CR.EOF: MOV CR,R1  ;GET DDB ADDRESS .IFNDF BINARY  ;FOR SIMPLE VERSION ... MOV 10(R1),16(R1) ;... NO DATA READ ON EOF .ENDC .IFDF BINARY  ;MAYBE SOME IF BINARY ... ADD #16,R1  ;SO MOVE TO UNUSED COUNT STORE MOV R0,@R1  ;... & C.WORD 111000 ;MARK DATA=70 .WORD 111000 ;MARK DATA=70 .WORD 111000 ;MARK DATA=70 .WORD 111000 ;MARK DATA=70 .WORD 111000 ;MARK DATA=70 .WORD 111000 ;MARK DATA=70 .WORD 111000 ;MARK DATA=70 .WORD 111000 ;MARK DATA=70 .WORD 111000 ;MARK DATA=70 .WORD 111000 ;MARK DATA=70 .WORD 111000 ;MARK ARACTERS. .ENDC ;INTERNAL BUFFER FOR BINARY STORAGE: .IFDF BINARY CR.BUF: .IFNDF MARKS CR.BSZ=120. .ENDC .IFDF MARKS CR.BSZ=60. .ENDC .=.+CR.BSZ .ENDC .END *" ,ŀ Q 5lH!*F Oc Jp  ŌW *j IװAa Q  * `E(f ah*  c   KаOe* $d d cĊ * l "    E*  f ы   D*B "ᆃ עJ` فרJ f  b @( &^ * OMPUTE VALUE REQD SUB CR.UBE,@R1 ASR @R1  ;... AS WORDS! .ENDC COM @R0  ;SET UNDERWAY FLAG TO PREVENT READING MORE CARDS CLRB CR.CDN  ;BYPASS END-CARD PROCESSING FOR E-O-F CR.EXT: BISB #2,@#CR.CSR ;ALLOW REST OF CARD THRU BR CR.CXT ; C) CONTROL CARD SEEN: .IFNDF ONLY26&ONLY29 ;FOR DUAL PUNCH DRIVER ... CR.026: MOV #104,CR.TOS ;... SET TABLE OFFSET ... BR CR.EXT  ;... & IGNORE REST OF CTL CARD CR.029: CLR CR.TOS BR CR.EXT .ENDC .IFDF BLANKS DATA=70 .WORD 111000 ;MARK DATA=70 .WORD 111000 ;MARK DATA=70 .WORD 111000 ;MARK DATA=70 .WORD 111000 ;MARK DATA=70 .WORD 111000 ;MARK DATA=70 .WORD 111000 ;MARK DATA=70 .WORD 111000 ;MARK DATA=70 .WORD 111000 ;MARK DATA=70 .WORD 111000 ;MARK DATA=70 .WORD 111000 ;MARK DATA=70 .WORD 1110;ORIGIN: CARDS 12-21-72 DSCMAG.S01 ;********** D I S C T O M A G T A P E ********** .TITLE DSCMAG ;*********************************************************************** ;THIS PROGRAM TRANSFERS THE CONTENTS OF THE SELECTED DISC TO ;MAG TAPE. EITHER THE RF-11 DISC OR THE DDC DISC CURRENTLY ;CONNECTED MAY BE SELECTED. THE PROGRAM SENSES [NED] FOR THE ;PURPOSE OF DETERMINING WHEN THE OPERATION IS COMPLETE. ;DATA IS TRA)  @*  *@ e @ e 7  ec*4 8 JPPP0$*X3R  er,|e eQ$e* Z ` *e "E 7R *  DD` D0 !,:  !w > F ;IN SUPPRESS VERSION CR.ZON: CLRB CR.ZSW ;...SET TO OVERRIDE BLANK SUPPRESSION BR CR.EXT  ;AGAIN IGNORE REST OF CARD CR.EON: CLRB CR.ESW ;SET SWITCH TO IGNORE CC.73-80 BR CR.EXT .ENDC ;READER NOT READY SUBROUTINE: CR.NRY: MOV CR.NAM,-(SP) ;IDENTIFY DEVICE MOV (PC)+,-(SP) ;12-17-72 .BYTE 002,4 ;MSG S002 ;12-17-72 IOT  00 ;MARK DATA=70 .WORD 111000 ;MARK DATA=70 .WORD 111000 ;MARK DATA=70 .WORD 111000 ;MARK DATA=70 .WORD 111000 ;MARK DATA=70 .WORD 111000 ;MARK DATA=70 .WORD 111000 ;MARK DATA=70 .WORD 111000 ;MARK DATA=70 .WORD 111000 ;MARK DATA=70 .WORD 111000 ;MARK DATA=70 .WORD 111000 ;MARK DATA=70 NSFERRED FROM DISC IN 16K-WORD BLOCKS. ;IT IS WRITTEN TO MAG TAPE IN 2K-WORD RECORDS. ;THE "DONE" MSG [I100] DISPLAYS THE # OF BLOCKS TRANSFERRED. ;A WRITE CHECK IS PERFORMED AT THE OPTION OF THE OPERATOR. ;OPTION-SELECTION IS DIRECTED THROUGH THE CONSOLE SWITCHES: ; BIT # I F C L E A R / I F S E T ; 0-2 DO NOT SKIP ANY FILES SKIP 1 TO 7 FILE MARKS ; 3 DISABLE TAPE INTERRUPT ENABLE TAPE INTERRUPT ; ,4 @_f 0"*Zw  MONITOR V004A ߋ;*~t͋_v0&t*t&t*t:sroCyyZ*z/N`Vq+fEE-*/D' &&SNQK-*|KKoT*   ,2   7 7 hw f*X@e@  K"e *| E\  K"M  ;... & CALL EDP CLRB @#177776 ;DROP CPU LEVEL TO LET IN KB: INTERRUPT;12-19-72 BIT #2000,@#CR.CSR ;WAIT FOR TRANSITION TO "ON-LINE" ;12-17-72 BEQ .-6 ;12-17-72 RTS PC  ;TRY AGAIN IF COME BACK ; ;MISCELLANEOUS DEFINITIONS: CR.CSR=177160 CR.DB1=177162 CR.DB2=177164 CR.SXT=42 CR.RSV=44 CR.TBL: ;PARITY ASCII CONVERSION TABLE FOR 029 PUNCH .IFNDF ONLY26 .BYTE 2 .WORD 111000 ;MARK DATA=70 .WORD 111000 ;MARK DATA=70 .WORD 111000 ;MARK DATA=70 .WORD 111000 ;MARK DATA=70 .WORD 111000 ;MARK DATA=70 .WORD 111000 ;MARK DATA=70 .WORD 111000 ;MARK DATA=70 .WORD 111000 ;MARK DATA=70 .WORD 111000 ;MARK DATA=70 .WORD 111000 ;MARK DATA=70 .WORD 111000 4 DISABLE DISC INTERRUPT ENABLE DISC INTERRUPT ; 5 DO NOT PERFORM WRITE CHECK / PERFORM WRITE CHECK ; 6-7 SELECT TAPE UNIT 0 TO 3 ; 8-14 SELECT DDC DISC SELECT RF-11 DISC ; 15 REPORT ALL ERRORS IGNORE ALL ERRORS ;ERROR MESSAGES PRINTED BY THIS PROGRAM: ; I100 PROGRAM COMPLETE: DISPLAY # OF 16K-WORD BLOCKS XFERRED ; A100 UPPER BYTE OF CONSOLE SWITCHES NOT SET PROPERLY ; A101 SELECTED TAP0 W e   * w R < w$ eJ,w LB   w  \^*< w ew |X*8 56 e? 0 @!.\#E?UU6 3 w(*  6 w* < wL e"z W 40  ;SPACE .BYTE 261  ;1 .BYTE 262  ;;2 .BYTE 63  ;3 .BYTE 264  ;4 .BYTE 65  ;5 .BYTE 66  ;6 .BYTE 267  ;7 .BYTE 270  ;8 .BYTE 240  ;EMPTY .BYTE 72  ;: .BYTE 243  ;# .BYTE 300  ;@ .BYTE 47  ;' .BYTE 275  ;= .BYTE 42  ;" .BYTE 71  ;9 ; .BYTE 60  ;0 .BYTE 257  ;/ .BYTE 123  ;S .BYTE 324  ;T .BYTE 125  ;U .BYTE 126  ;V .BYTE 327  ;W .BYTE 330  ;X .BYTE 131  ;Y .BYTE 240  ;EMPT;MARK DATA=70 .WORD 111000 ;MARK DATA=70 .WORD 111000 ;MARK DATA=70 .WORD 111000 ;MARK DATA=70 .WORD 111000 ;MARK DATA=70 .WORD 111000 ;MARK DATA=70 .WORD 111000 ;MARK DATA=70 .WORD 111000 ;MARK DATA=70 .WORD 111000 ;MARK DATA=70 .WORD 111000 ;MARK DATA=70 .WORD 111000 ;MARK DATA=70 .WORD E UNIT NOT READY AND/OR WRITE-ENABLED ; F200 TAPE ERROR. DISPLAY: STATUS + TAPE RECORD NUMBER(0-377) ; F201 DISC ERROR. DISPLAY: STATUS ;*********************************************************************** .PAGE R0=%0 R1=%1 R2=%2 R3=%3 R4=%4 R5=%5 SP=%6 PC=%7 SWR=177570 ;MAG TAPE REGISTERS: TWC = 167540 ;WC TST = 167542 ;STATUS TCD = 167544 ;COMMAND TMA = 167546 ;CMA TIV=104 BFSTRT = 20000 ;START OF 16-K WORD BUFFER DS*pe4K#@$2  2*1  3 *0 '@fDe"@"*  H P  @`$ *   eee J- )3*:  e d%   ee-*^ 2 ((e   (** & $ $ e * ( (#(Q$f  N e *&e&0f 6eeY .BYTE 335  ;] .BYTE 254  ;, .BYTE 245  ;% .BYTE 137  ;_ .BYTE 276  ;> .BYTE 77  ;? .BYTE 132  ;Z ; .BYTE 55  ;- .BYTE 312  ;J .BYTE 113  ;K .BYTE 314  ;L .BYTE 115  ;M .BYTE 116  ;N .BYTE 317  ;O .BYTE 120  ;P .BYTE 321  ;Q .BYTE 240  ;EMPTY .BYTE 41  ;! .BYTE 44  ;$ .BYTE 252  ;* .BYTE 251  ;) .BYTE 273  ;; .BYTE 134  ;\ .BYTE 322  ;R ; .BYTE 246  ;& 111000 ;MARK DATA=70 .WORD 111000 ;MARK DATA=70 .WORD 111000 ;MARK DATA=70 .WORD 111000 ;MARK DATA=70 .WORD 111000 ;MARK DATA=70 .WORD 111000 ;MARK DATA=70 .WORD 111000 ;MARK DATA=70 .WORD 111000 ;MARK DATA=70 .WORD 111000 ;MARK DATA=70 .WORD 111000 ;MARK DATA=70 .WORD 111000 ;MARK DATA=7CTAB: ;TABLE OF DISC REGISTER ADDRESSES ; FOR THE DDC DISCS: 165300 ;DCS 165302 ;WC 165304 ;CMA 165306 ;DAR 165310 ;DAE 130 ;I.V. 132 ; FOR THE RF-11 DISC: 177460 ;DCS 177462 ;WC 177464 ;CMA 177466 ;DAR *&e&*ߓpefeU%A|*6AaW e&&pfW*Z;A! AMq R#? ?*~$&& &  *`̵@$^ r*&ŀe 2& NN`# *^GEFILOOTRUffA!N ,*l&, e / f#Z*2)"#W! J % .BYTE 101  ;A .BYTE 102  ;B .BYTE 303  ;C .BYTE 104  ;D .BYTE 305  ;E .BYTE 306  ;F .BYTE 107  ;G .BYTE 110  ;H .BYTE 240  ;EMPTY .BYTE 333  ;[ .BYTE 56  ;. .BYTE 74  ;< .BYTE 50  ;( .BYTE 53  ;+ .BYTE 336  ;^ .BYTE 311  ;I .ENDC ;PARITY ASCII CONVERSION TABLE FOR "FIELDATA" PUNCH: ; COMPRESSED CARD CODE: ; BYTE BIT POSITIONS: 7 6 5 4 3 2-1-0 ; CARD ROW0 .WORD 111000 ;MARK DATA=70 .WORD 111000 ;MARK DATA=70 .WORD 111000 ;MARK DATA=70 .WORD 111000 ;MARK DATA=70 .WORD 111000 ;MARK DATA=70 .WORD 111000 ;MARK DATA=70 .WORD 111000 ;MARK DATA=70 .WORD 111000 ;MARK DATA=70 .WORD 111000 ;MARK DATA=70 .WORD 111000 ;MARK DATA=70 .WORD 111000 177470 ;DAE 204 ;I.V. 206 DINTFG: .WORD 0 TINTFG: .WORD 0 TAPCMD: .WORD 0 DSCBLK: .WORD 0 TMPW01: .WORD 0 TAPADR: .WORD 0 .PAGE DSCMAG: ;ENTRY AND RE-ENTRY POINT CLRB DSWICH ;RESET RF-11 LOGIC SHUNT MOV @#SWR,R0 ;OPTION SELECT PATTERN BIC #100000,R0 ;IGNORE ERROR SUPPRESS BIT MOV #DSCTAB,R5 ;INIT FOR DDC DISC *Ve&Aѕ & e|*zeD w   $D Vi*eP&& e 4*w 2(x*AL%ɋ   A* 0p 3*.K H r  c1 w*R ^N̋me &*vRRRReRe L  , 4*L e$Q$ ,^ S PUNCHED: ^ 12 11 ^ 0 9 8 ^ 1,2,3,4,5,6,OR 7 .IFNDF ONLY29 ; COMPRESSED FIELDATA ; ASCII PRINTED CARD CODE PUNCH ; CODE CHARACTER (OCTAL) CODE .BYTE 240 ; SPACE 0 BLANK .BYTE 261 ; 1 1 1 .BYTE 262 ; 2 2 2 .BYTE 063 ; 3 3 3 .BYTE 264 ; 4 4 4 .BYTE 065 ; 5 ;MARK DATA=70 .WORD 111000 ;MARK DATA=70 .WORD 111000 ;MARK DATA=70 .WORD 111000 ;MARK DATA=70 .WORD 111000 ;MARK DATA=70 .WORD 111000 ;MARK DATA=70 .WORD 111000 ;MARK DATA=70 .WORD 111000 ;MARK DATA=70 .WORD 111000 ;MARK DATA=70 .WORD 111000 ;MARK DATA=70 .WORD 111000 ;MARK DATA=70 SWAB R0 ;WHICH DISC? BEQ DSCM10 ;DDC ADD #16,R5 ;BUMP TABLE POINTER INCB DSWICH ;OPEN SHUNT AROUND RF-11 DAR LOGIC CMPB R0,#177 ;IS RF-11 SELECTED, OR DID HE BLOW IT? BEQ DSCM10 JMP SELERR ;SELECT ERROR DSCM10: SWAB R0 ;BACK TO ORIG MOV R0,R1 ASH #6,R1 BIC #-031000-1,R1 ;ISOLATE TAPE UNIT SELECT & INT ENABLE*L w&t 19* VB,B*Wf& p**0e04 wJw W ͕*N,RA!ʕ . ee4*r/  %  Q$U$U%*  AB I#  T* f& f a( ֵ *W&&  % * ,^ b)̌ $ 5 5 .BYTE 066 ; 6 6 6 .BYTE 267 ; 7 7 7 .BYTE 270 ; 8 10 8 .BYTE 240 ; EMPTY 11 8-1 .BYTE 246 ; & 12 8-2 .BYTE 275 ; = 13 8-3 .BYTE 047 ; ' 14 8-4 .BYTE 072 ; : 15 8-5 .BYTE 276 ; > 16 8-6 .BYTE 300 ; @ 17 8-7 .WORD 111000 ;MARK DATA=70 .WORD 111000 ;MARK DATA=70 .WORD 111000 ;MARK DATA=70 .WORD 111000 ;MARK DATA=70 .WORD 111000 ;MARK DATA=70 .WORD 111000 ;MARK DATA=70 .WORD 111000 ;MARK DATA=70 .WORD 111000 ;MARK DATA=70 .WORD 111000 ;MARK DATA=70 .WORD 111000 ;MARK DATA=70 .WORD 111000 ;MARK MOV R1,TAPCMD ;SAVE IT BIT #1000,R1 ;WAS INT ENABLED? BEQ DSCM12 ;NO MOV #TAPINT,@#TIV ;SET UP TAPE I.V. MOV #5*40,@#TIV+2 DSCM12: BIT #20,R0 ;IS DISC INT ENABLED? BEQ DSCM14 ;NO MOV #DSCINT,@12(R5) ;SET UP DISC I.V. MOV #6*40,@14(R5) DSCM14: MOV #400,@(R5) ;RESET DISC MOV #40000,@#TCD ;RESET TAPE MOV R0,R2 *&$ &$b$"  h)*J"  ⁁Wx &e *n!+ffe5@'&&f} * CE Df ͝U@e* U W Ɂ* w  W Mw *l W W ! f cU 8Y*"We U N U e Uv*F U  F!-*j F e F!- .BYTE 071 ; 9 20 9 .BYTE 060 ; 0 40 0 .BYTE 257 ; / 41 0-1 .BYTE 123 ; S 42 0-2 .BYTE 324 ; T 43 0-3 .BYTE 125 ; U 44 0-4 .BYTE 126 ; V 45 0-5 .BYTE 327 ; W 46 0-6 .BYTE 330 ; X 47 0-7 .BYTE 131 ; Y 50 0-8 .BYTE 240 ; EMPTYDATA=70 .WORD 111000 ;MARK DATA=70 .WORD 111000 ;MARK DATA=70 .WORD 111000 ;MARK DATA=70 .WORD 111000 ;MARK DATA=70 .WORD 111000 ;MARK DATA=70 .WORD 111000 ;MARK DATA=70 .WORD 111000 ;MARK DATA=70 .WORD 111000 ;MARK DATA=70 .WORD 111000 ;MARK DATA=70 .WORD 111000 ;MARK DATA=70 .WORD 1110 BIC #-7-1,R2 ;GET # FILES TO SKIP BEQ DSCM20 ;NONE DSCM16: MOV #20,-(SP) JSR PC,TAPEGO ;SPACE PAST [N=(R2)] FILE MARKS .PAGE ;THE MAG TAPE IS NOW POSITIONED IN THE GAP PRECEDING THE FIRST RECORD. ;FIRST READ 16K-WORDS OFF DISC. ;THEN WRITE 8 RECORDS OF 2K-WORDS EACH TO TAPE. ;IF WRITE CHECK SELECTED, BACK UP TAPE, RE-READ THE 8 RECORDS, ;AND WRITE-CHECK TO THE DISC. THEN ADVANCE TO NEXT DISC BLOCK. ;CONTINUE UNTIL *f  B E*pS $`1 $ *^C . DATE:- TIME*:- *EE*aC$&pcF %$@*C%@`Գ Aa ,Ӌ(q%$*(  EUHQ̳ (& *> Β ,^ 6S@*b 51 0-8-1 .BYTE 137 ; _ 52 0-8-2 .BYTE 254 ; , 53 0-8-3 .BYTE 050 ; ( 54 0-8-4 .BYTE 245 ; % 55 0-8-5 .BYTE 134 ; \ 56 0-8-6 .BYTE 042 ; " 57 0-8-7 .BYTE 132 ; Z 60 0-9 .BYTE 055 ; - 100 11 .BYTE 312 ; J 00 ;MARK DATA=70 .WORD 111000 ;MARK DATA=70 .WORD 111000 ;MARK DATA=70 .WORD 111000 ;MARK DATA=70 .WORD 111000 ;MARK DATA=70 .WORD 111000 ;MARK DATA=70 .WORD 111000 ;MARK DATA=70 .WORD 111000 ;MARK DATA=70 .WORD 111000 ;MARK DATA=70 .WORD 111000 ;MARK DATA=70 .WORD 111000 ;MARK DATA=70 A DISC READ REQUEST RESULTS IN A [NED]. CLR R4 ;INIT LOCAL MEMORY OF DAR CLR DSCBLK ;INIT COUNT OF 16K-WORD BLOCKS READ DSCM20: MOV #5,-(SP) JSR PC,DISCGO ;READ NEXT 16-K WORDS FROM DISC MOV #8.,R2 ;INIT TAPE LOOP COUNT MOV #2,-(SP) ;WRITE COMMAND JSR PC,TAPEGO ;GO WRITE THE 8 RECORDS BIT #40,R0 ;WRITE CHECK SELECTED? BEQ $%5be*Na  搎NŀW *W  װΌeΌ%H *p MECP  "ϰUD* ` ( U (0 w w &** $$$E e)A*:U@    JL*^ U@w  "Ő K*ea*Y p ŐŊD*& " E T (P $b*c H  101 11-1 .BYTE 113 ; K 102 11-2 .BYTE 314 ; L 103 11-3 .BYTE 115 ; M 104 11-4 .BYTE 116 ; N 105 11-5 .BYTE 317 ; O 106 11-6 .BYTE 120 ; P 107 11-7 .BYTE 321 ; Q 110 11-8 .BYTE 240 ; EMPTY 111 11-8-1 .BYTE 240 ; EMPTY 112 11-8-2 .BYTE 044 ; $ 113 .WORD 111000 ;MARK DATA=70 .WORD 111000 ;MARK DATA=70 .WORD 111000 ;MARK DATA=70 .WORD 111000 ;MARK DATA=70 .WORD 111000 ;MARK DATA=70 .WORD 111000 ;MARK DATA=70 .WORD 111000 ;MARK DATA=70 .WORD 111000 ;MARK DATA=70 .WORD 111000 ;MARK DATA=70 .WORD 111000 ;MARK DATA=70 .WORD 111000 DSCM30 ;NO MOV #8.,R2 ;RE-INIT LOOP COUNT MOV #200,-(SP) ;BACK SPACE COMMAND JSR PC,TAPEGO MOV #8.,R2 MOV #1,-(SP) JSR PC,TAPEGO ;RE-READ THE STUFF WE JUST WROTE MOV #7,-(SP) JSR PC,DISCGO ;WRITE CHECK THE DISC DSCM30: ADD #400,R4 ;BUMP THE DAR MEMORY INC DSCBLK ;BUMP BLOCK COUNT BR DSCM20 ;BACK FOR U  "bu* UE T0 0 ŋU *  pU2"װ*6w  <@E%*ZA! װ5KE֊EeEr*~U%p!Ed Qbep "װ\*,ŀ Q 5lH!j*Oc Jp  ŌW * IװAa Q  8*`E(f a*2 c   Kа 11-8-3 .BYTE 252 ; * 114 11-8-4 .BYTE 335 ; ] 115 11-8-5 .BYTE 273 ; ; 116 11-8-6 .BYTE 336 ; ^ 117 11-8-7 .BYTE 322 ; R 120 11-9 ; NOTE: SINCE THE [11-0] SERIES IS OMITTED, THE DRIVER STRIPS ; AN OCTAL 40 FROM THE FOLLOWING COMPRESSED CODES BEFORE INDEXING. ; THUS, THE LETTER 'C' IS INTERPRETED AS OCTAL 143, EVEN THOUGH ; THE CARD READER COMPR;MARK DATA=70 .WORD 111000 ;MARK DATA=70 .WORD 111000 ;MARK DATA=70 .WORD 111000 ;MARK DATA=70 .WORD 111000 ;MARK DATA=70 .WORD 111000 ;MARK DATA=70 .WORD 111000 ;MARK DATA=70 .WORD 111000 ;MARK DATA=70 .WORD 111000 ;MARK DATA=70 .WORD 111000 ;MARK DATA=70 .WORD 111000 ;MARK DATA=70 .WORD MORE .PAGE TAPEGO: ;THIS IS THE MAG TAPE "GO" ROUTINE MOV 2(SP),R1 ;GET COMMAND MOV (SP)+,(SP) ;POP RTN ADDR UP ONE MOV R1,TMPW01 ;SAVE IT FOR CHECK BELOW BIS TAPCMD,R1 ;INSERT THE UNIT # AND INTERRUPT BITS MOV #BFSTRT,TAPADR ;INIT LOCAL MEMORY OF TAPE CMA TAPE10: MOV TAPCMD,@#TCD ;SELECT THE UNIT MOV #4000,R3 SOB R3,. ;LOOP TO ALLOW LOGIC TO SETTLE OeM*V$d d cĊ 1*z l "    Ev* f ы   D*"ᆃ עJ` فרJ  b @( &^ a:?*DqF   e 3/*$ . fe& E*H NaeEM MJ f*l& NJ  f ,^ _ESSED CODE IS OCTAL 203. .BYTE 053 ; + 200 12 .BYTE 101 ; A 201 12-1 .BYTE 102 ; B 202 12-2 .BYTE 303 ; C 203 12-3 .BYTE 104 ; D 204 12-4 .BYTE 305 ; E 205 12-5 .BYTE 306 ; F 206 12-6 .BYTE 107 ; G 207 12-7 .BYTE 110 ; H 210 12-8 .BYTE 240 ; EMPTY 111000 ;MARK DATA=70 .WORD 111000 ;MARK DATA=70 .WORD 111000 ;MARK DATA=70 .WORD 111000 ;MARK DATA=70 .WORD 111000 ;MARK DATA=70 .WORD 111011 ;PRE-FINAL=73 .WORD 111011 ;FINAL=73 .WORD 111011 ;PARITY=73 .WORD 111011 ;REVERSE LOCK=73 .WORD 101001 ;GUARD=51 .WORD 100101 ;REVERSE BLOCK MAR MOVB @#TST,R3 ;GET LOWER STATUS BYTE BMI TAPE14 ;READY TAPE12: JMP TAPNRD ;NOT READY TAPE14: ASR R3 ;CHECK FILE PROTECT BIT BCS TAPE12 ;NO WRITE RING TAPE20: CLR TINTFG MOV TAPADR,@#TMA ;SET UP MEMORY ADDRESS MOV #4000,@#TWC ;& WC MOV R1,@#TCD ;PERFORM COMMAND BIT #10,R0 ;IS TAPE INT ENB? BNE TAPE50 ;YES *e   A̋$)n*&E eAaW$  *p  EW" gE(* ևJ!  W=J(}* @U%EE *D,^ $)6; "*h&f( f@*0 R,E KSa Kc*W" ge B Q$p  ֝,zU%g"M0 211 12-8-1 .BYTE 240 ; EMPTY 212 12-8-2 .BYTE 056 ; . 213 12-8-3 .BYTE 251 ; ) 214 12-8-4 .BYTE 333 ; [ 215 12-8-5 .BYTE 074 ; < 216 12-8-6 .BYTE 243 ; # 217 12-8-7 .BYTE 311 ; I 220 12-9 ; ALSO NOTE: THE CHARACTERS [?] AND [!] HAVE COMPRESSED CODES OF ; OCTAL [240] AND [140], RESPECTIVELY, MAKING THEM UK=45 .WORD 010101 ;INTERBLOCK SYNC=25 .PAGE WALBF: .WORD -1 ;-1 REVERSE =0 FORWARD .WORD -1 FBLK: .WORD 1101 ;BLOCK NUMBER GOES HERE .WORD -1 .WORD -1 BYST: .BYTE 3 ;TABLE OF XDA 17 & 16 FOR CMP,OBV,BLK# .BYTE 3 .BYTE 0 .BYTE 0 .BYTE 1 .BYTE 1 .BYTE 2 .BYTE 2 TOG2: XX TOG1: XX TCCM: 177342 TSTB @#TST BMI .-4 ;FIRST WAIT 'TILL READY GOES FALSE ASLB @#TST ;THEN WAIT 'TILL BUSY GOES FALSE BMI .-4 ;(WAITING FOR A "READY" GIVES RANDOM ERRORS.) TAPE30: TSTB @#TST+1 ;ANY ERRORS? BNE TAPERR ;STATUS ERROR BYTE NOT ZERO TAPE40: ADD #10000,TAPADR ;BUMP LOCAL CMA MEMORY FOR NEXT TIME SOB R2,TAPE10 ;LOOP FOR SPECIFIE+ COUNT RTS PC ;ALL DONE TAPE50sr*BbF $D`);D`*$ &*   y54- &*H&( $&& 2*l.^  (  t  *e!&#Ee  * U E3!( &W E*$ &  .^ 8  e* C@! &.^ :  U%g"G<*NIQUE ; CHARACTERS OUTSIDE THE EVALUATION RANGE OF THE DRIVER. THUS ; SPECIAL CODE HAS BEEN INSERTED IN THE DRIVER TO DETECT THESE ; TWO CHARACTERS. .ENDC ;INTERNAL BUFFER FOR BINARY STORAGE: .IFDF BINARY CR.BUF: .IFNDF MARKS CR.BSZ=120. .ENDC .IFDF MARKS CR.BSZ=60. .ENDC .=.+CR.BSZ .ENDC .END TCST: 177340 TCDT: 177350 TCBA: 177346 TCWC: 177344 RBN: .=.+2204 DATBUF: .=.+1000 .END START : WAIT TST TINTFG ;DID INT COME YET? BEQ TAPE50 BR TAPE30 TAPERR: ;A TAPE ERROR HAS BEEN DETECTED BIT #77400,@#TST ;CHECK STATUS BITS OTHER THAN FILE MARK BNE TAPER1 ;SOMETHING ELSE IS THERE BIT #24,TMPW01 ;WAS IT A FILE-MARK REQUEST? BNE TAPE40 ;WE WERE EXPECTING A F/M INDICATION TAPER1: TST @#SWR ;ERR IGNORE BIT ON? BMI TAPE40 ;YES $B$bF %? v*$EL05AaAa5EEd e :*H(  &* e L*lU  U@ 0  tU% g"G&EU 6oe*C cF %44j*$  t#   *Hg"G<L    F*l W,#;L,8 *1 -Bl 000(oQW,XZ02468,&7pxE eXwF,LWtEw5*DF5,r$  @dEA, J 7 ~ 8 5 ,   e ,<w2]* * d~×;, bw7  f`_d5ߋb,0ߌbߋc e~ 5;ORIGIN:DECTAPE 12-21-72 MAGDSC.S01 ;********* M A G T A P E T O D I S C ********** .TITLE MAGDSC ;*********************************************************************** ;THIS PROGRAM TRANSFERS THE CONTENTS OF ONE FILE ON MAG TAPE ;TO THE SELECTED DISC. EITHER THE RF-11 DISC OR THE DDC DISC ;WHICH IS CURRENTLY CONNECTED MAY BE SELECTED. THE PROGRAM ;LOOKS FOR THE TAPE FILE MARK TO DETERMINE WHEN THE TRANSFER ;IS COMP MOV DSCBLK,R3 ;CURRENT DISC BLOCK ASH #3,R3 ADD #9.,R3 SUB R2,R3 ;# OF TAPE RECORD IN ERROR MOV @#TST,R1 CLRB R1 BISB R3,R1 ;REPORT ERRORS IN UPPER BYTE; RECORD # IN LOWER MOV R1,-(SP) MOV #3*400+200,-(SP) ;F200: TAPE ERROR IOT EMT 60 ;EXIT .PAGE DISCGO: ;MAKE THE DISC GO MOV #-40000,@2(R5) ;WC 0 *E 0 e 0( \&&*  E?LQ\Cy*$C$cF % C` *$!( & e(  &*H   U%g"G-<y1*)SE    $0  U%g"GAN`*ac)$BbF ,Vb5 L xte ,|bf0  ,v5U@7 ZÌ},  >BE , x0@0& @"w& Aw  (LETE. DATA IS READ FROM TAPE IN 2K-WORD RECORDS. ;IT IS WRITTEN TO DISC IN 16K-WORD BLOCKS. ;THE "DONE" MSG [I100] DISPLAYS THE # OF BLOCKS TRANSFERRED. ;A WRITE CHECK IS PERFORMED AT THE OPTION OF THE OPERATOR. ;OPTION-SELECTION IS DIRECTED THROUGH THE CONSOLE SWITCHES: ; BIT # I F C L E A R / I F S E T ; 0-2 DO NOT SKIP ANY FILES SKIP 1 TO 7 FILE MARKS ; 3 DISABLE TAPE INTERRUPT ENABLE TAPE INTERRUPTFOR 16K WORDS MOV #BFSTRT,@4(R5) ;CMA MOV R4,R3 ;CURRENT DAR DSWICH: BR .+2 ;SHUNT SWITCH AROUND RF-11 LOGIC BR DISC10 CLR R2 ;RF-11 LOGIC: READY FOR EXTENSION BITS ASHC #6,R2 ;SHIFT THE SECTOR ADDRESS TO WORD ADDR MOV R2,@10(R5) ;LOAD UP THE TRACK EXTENSION BITS DISC10: MOV R3,@6(R5) ;DAR (EITHER SECTOR OR WORD ADDRESS) MOV 2(SP),R3 ;GET%"g*$ aE[$[*H  c ,J *lOc! K C` L5 s V&** C`$U5$B s* $5$U@(  *c*g"G܀ (   * %0 C` R*  J D`$ !$$a!! *D  (( #)#" ͋h͊Q$B S($3H&oQ(:((.XZ02468.&7nxE eVw} .LWtEw54DF5 4.r.  @dEj  .. J 7 ~  05 .   e .<w2]* * d ; 4 DISABLE DISC INTERRUPT ENABLE DISC INTERRUPT ; 5 DO NOT PERFORM WRITE CHECK / PERFORM WRITE CHECK ; 6-7 SELECT TAPE UNIT 0 TO 3 ; 8-14 SELECT DDC DISC SELECT RF-11 DISC ; 15 REPORT ALL ERRORS IGNORE ALL ERRORS ;ERROR MESSAGES PRINTED BY THIS PROGRAM: ; I100 PROGRAM COMPLETE: DISPLAY # OF 16K-WORD BLOCKS XFERRED ; A100 UPPER BYTE OF CONSOLE SWITCHES NOT SET PROPERLY ; A101 SELE COMMAND MOV (SP)+,(SP) ;POP RTN ADDR UP ONE BIT #20,R0 ;IS DISC INT ENB SELECTED? BEQ DISC22 ;NO BIS #100,R3 DISC22: CLR DINTFG MOV R3,@0(R5) ;COMMAND! ASLB R3 ;CHECK INT ENB BMI DISC40 ;ENABLED: WAIT FOR INT TSTB @0(R5) ;WAIT HERE FOR READY BPL .-4 DISC30: ;HERE WHEN READY GOES TRUE OR INT COMES IN TST %*qF $$D` R&*$*  D`̋E B ȋ9 (=*H$) & & .^   U%R*lg"G$5"ۆ 5`*  :  E  *U (  e: ("$ `%͋͊GE*hhE6 w7 lS*$ Õ~×R. bw 7 f`_d5.0ߋbߌbߋc e~ .V5b5 xte .|bf0  v.5U@7 \Ì.  @BE  9.x0 @h.0& @w& Aw   CTED TAPE UNIT NOT READY AND/OR WRITE-ENABLED ; F200 TAPE ERROR. DISPLAY: STATUS + TAPE RECORD NUMBER(0-377) ; F201 DISC ERROR. DISPLAY: STATUS ;*********************************************************************** .PAGE R0=%0 R1=%1 R2=%2 R3=%3 R4=%4 R5=%5 SP=%6 PC=%7 SWR=177570 ;MAG TAPE REGISTERS: TWC = 167540 ;WC TST = 167542 ;STATUS TCD = 167544 ;COMMAND TMA = 167546 ;CMA TIV=104 BFSTRT = 20000 ;START OF 16-K WORD BUFFER  @0(R5) ;ERROR? BMI DSCERR ;YES RTS PC ;EVERYTING'S OK DISC40: WAIT ;WAIT FOR INTERRUPT TST DINTFG ;WAS IT THE DISC INT? BEQ DISC40 ;NO BR DISC30 DSCERR: ; ADISC ERROR OR [NED] HAS OCCURRED MOV @0(R5),R2 MOV R2,R3 BIC #104377,R3 ;CLEAR ERR AND NED BITS (ALSO LOWER BYTE BEQ DONE ;[NED] HAS G 7 p  7 H*Hwr wb7 **lCW Հ |7 *7  B߳tՀs*ߕ@t97 D672G7 *FՀ  %& n &*(   7 Nߓp* 2|߳t&^  +*D#ʔ `Zw*h 7 & 7 2 ~  * j ꀣw e &oQ(0((.XZ02468.&7pxE eXwy .LWtEw5*DF5 *.r$  @dEt  $. J 7 ~ 8 5 .   e .<w2]* * d  DSCTAB: ;TABLE OF DISC REGISTER ADDRESSES ; FOR THE DDC DISCS: 165300 ;DCS 165302 ;WC 165304 ;CMA 165306 ;DAR 165310 ;DAE 130 ;I.V. 132 ; FOR THE RF-11 DISC: 177460 ;DCS 177462 ;WC 177464 ;CMA 177466 ONE TRUE WITH NO OTHER ERRORS TST @#SWR ;ERROR IGNORE ON? BPL .+4 ;NO: CONTINUE RTS PC ;YES: NOTHING ELSE TO DO BUT RETURN MOV R2,-(SP) ;ERROR: PUT STATUS IN MESSAGE MOV (PC)+,-(SP) .BYTE 201,3 ;F201: DISC ERROR IOT EMT 60 .PAGE DONE: ;ALL DONE: WRITE A FILE MARK AND EXIT MOV #1,R2 MOV #4,-(SP) JSR @@ .*tA @ w pe* 2̓@ p @ _*d e6B @%w"*CY7XeD*@  ߓp*d4 w|  * e ! xeH* w!Dw!FeXL@ * \e:W* ׋' j%' +~×R. bw7  f`_d5ߋb.0ߌbߋc e~ 5.Vb5 L xte .|bf0  +.v5U@7 ZÌ.  >BE . x0@0& @$w& Aw   ;DAR 177470 ;DAE 204 ;I.V. 206 DINTFG: .WORD 0 TINTFG: .WORD 0 TAPCMD: .WORD 0 DSCBLK: .WORD 0 TMPW01: .WORD 0 TAPADR: .WORD 0 .PAGE DSCMAG: ;ENTRY AND RE-ENTRY POINT CLRB DSWICH ;RESET RF-11 LOGIC SHUNT MOV @#SWR,R0 ;OPTION SELECT PATTERN BIC #100000,R0 ;IGNORE ERROR SUPPRESS BIT MOV #DSCTAB,R5 ;INIT FOR DDC DISC PC,TAPEGO ;WRITE ONE FILE MARK MOV DSCBLK,-(SP) ;DISPLAY THE NUMBER OF DISC BLOCKS MOV (PC)+,-(SP) .BYTE 100,0 ;I100: ALL DONE IOT EMT 60 SELERR: ;CONSOLE SWITCH SELECT ERROR CLR -(SP) MOV (PC)+,-(SP) .BYTE 100,1 ;A100: UPPER BYTE OF SWITCHES NOT SET IOT ;PRINT MSG & WAIT FOR PROPER SELECTION JMP DSCMAG ;TRY AGAIN TAZ*@W 7wz  7\*<\wl^$ U H j*`  ށÔ "-~n*t N͕eBC 5*  & ͓ N *N"7 0 V7 Gbq *w &O 7e:%* e ABCX#eX8}  | !* @;********** L O O K ********** 12-22-72 ;THIS "LOOK" FILE CONTAINS EXPLANATIONS OF THE OTHER FILES CONTAINED ON ;THIS TAPE. ; F O R M A T ;THIS IS DIGITAL'S DECTAPE FORMATTER TOG-11 V.02 (DEC-11-YPTB:5-12-71), ;MODIFIED AT DDS TO V.03 TO INCLUDE TELETYPE MESSAGES TO THE OPERATOR. ;IN HAVING THE LOAD MODULE ON DECTAPE RATHER THAN ON PAPER TAPE, ;THE PROCESS OF FORMATTING DECTAPES BECOMES ROUTINE AND QUICK. ;NOTE THAT THIS IS NOT THE NEW VERSION OF THE FORMATTER RELE SWAB R0 ;WHICH DISC? BEQ DSCM10 ;DDC ADD #16,R5 ;BUMP TABLE POINTER INCB DSWICH ;OPEN SHUNT AROUND RF-11 DAR LOGIC CMPB R0,#177 ;IS RF-11 SELECTED, OR DID HE BLOW IT? BEQ DSCM10 JMP SELERR ;SELECT ERROR DSCM10: SWAB R0 ;BACK TO ORIG MOV R0,R1 ASH #6,R1 BIC #-031000-1,R1 ;ISOLATE TAPE UNIT SELECT & INPNRD: ;TAPE NOT READY OR NO WRITE RING CLR -(SP) MOV (PC)+,-(SP) .BYTE 101,1 ;A101: TAPE NOT READY IOT ;PRINT MSG & WAIT FOR OPERATOR TO READY UNIT JMP TAPE10 ;BACK & CHECK AGAIN DSCINT: INC DINTFG ;SHOW INT CAME IN RTI TAPINT: INC TINTFG ;SHOW TAPE INT CAME IN RTI .END DSCMAG $s*$ $7 !7vv@q*H@&EPe dΓ 3 *l ;'8 O*76  ewA*%ߕ $^ *$ )ɐ ǁ *$^ f5ɕ*  &M 585e*D U ѐB`Ѱ `YhL7 & gASED IN LATE ;1972, WHICH ALLEDGEDLY INCLUDES AN ADDITIONAL VERIFICATION PASS. ;AN ATTEMPT SHOULD BE MADE TO OBTAIN A LISTING OF THE SOURCE FOR THAT ;VERSION, SO THAT WE MAY INCLUDE IT IN OUR DECTAPE LIBRARY. ;DETAILED INSTRUCTIONS FOR THE USE OF THE FORMATTER, AND AN EXPLANATION ;OF ITS ERROR MESSAGES CAN BE FOUND WITH THE LISTING. ; C R D O S ;THIS IS DIGITAL'S CARD READER DRIVER [NIZA] V001C, MODIFIED TO V002A ;AT DDS TO ALLOW READING OF UNIVAC "FIELDATA" CODE, AND TO USE OUR OWN ;CONT ENABLE MOV R1,TAPCMD ;SAVE IT BIT #1000,R1 ;WAS INT ENABLED? BEQ DSCM12 ;NO MOV #TAPINT,@#TIV ;SET UP TAPE I.V. MOV #5*40,@#TIV+2 DSCM12: BIT #20,R0 ;IS DISC INT ENABLED? BEQ DSCM14 ;NO MOV #DSCINT,@12(R5) ;SET UP DISC I.V. MOV #6*40,@14(R5) DSCM14: MOV #400,@(R5) ;RESET DISC MOV #40000,@#TCD ;RESET TAPE MOV :(oQM,XZ02468,&7nxE eVwJ,LWtEw54DF5,r.  @dE7, J 7 ~  05 ,   e ,<w2]* * d~×;, bw 7 f`_d5,0ߋbߌbߋc e~ fX*<f7 .*$7> l R*H ߟn U@l$_ ,*l lx f7e~Tvf*.xf 77}*$UAh h j UA*Hh$^ h px6 l  h |TROL CARDS. NOTE THAT THIS IS NOT V005A, WHICH VERSION IS CONCERNED ;PRIMARILY WITH CHANGES TO THE READING OF BINARY CARDS. THE CURRENT ;UPDATE FOR V002A (UPDATE S2D) INCLUDES PROVISION FOR DETECTING AN ODD ;NUMBER OF INTERRUPTS UPON CARD DONE, AND UPON THIS PRINTING THE ;"NOT READY" MESSAGE TO THE OPERATOR. ADDITIONALLY, THIS MESSAGE HAS ;BEEN CHANGED FROM "A002" TO "S002" IN ORDER TO ELIMINATE THE NEED FOR ;"TRANSITION-TO-ON-LINE" BIT #10. THUS THE OPERATOR HAS ONLY TO RE-START ;THE READER, R0,R2 BIC #-7-1,R2 ;GET # FILES TO SKIP BEQ DSCM20 ;NONE DSCM16: MOV #20,-(SP) JSR PC,TAPEGO ;SPACE PAST [N=(R2)] FILE MARKS .PAGE ;THE MAG TAPE IS NOW POSITIONED IN THE GAP PRECEDING THE FIRST RECORD. ;FIRST READ 8 RECORDS OF 2K-WORDS EACH FROM THE TAPE. ;THEN WRITE THE 16K-WORDS TO DISC AS ONE BLOCK. ;IF WRITE CHECK SELECTED, BACK UP TAPE, RE-READ THE 8 RECORDS, ;AND WRITE-CHECK TO THE DISC. THEN READ THE NEXT 8 ,V5b5 xte q,|bf0  v,5U@7 \Ì,  @BE  ",x0 @Q,0& @w& Aw  (:M*H.M w *$e w 7  7T*HE@L LNf<ߋL- *lS ʋ_ \Y  * Qt nIN d f*^ ߋL wLJU@Lu*$_  Lx  *& ߕ N    "  AND THE PROGRAM CONTINUES. THIS MEANS, OF COURSE, THAT ;ALL OTHER PROGRAMS MUST WAIT WHILE THE DRIVER IS LOOPING. A FUTURE ;VERSION MIGHT INCORPORATE A FLAG AND CONVERT TO INTERRUPT MODE WHILE ;WAITING FOR THE TRANSITION. ; L P D O S ;THIS IS THE DOS DRIVER FOR OUR LINE PRINTER BY "PER DATA". ;IT OPERATES IN INTERRUPT MODE, EXCEPT DURING PAGE EJECTS, SINCE AT THE ;TIME (ORIGINAL DEVELOPMENT WAS DONE WITH DOS V002) INTERIM RETURNS ;FROM AN "OPEN" WERE NOT WORKING. THE DRIVER SENE ;FROM AN!TAPE RECORDS. ;WHEN A FILE MARK IS DETECTED ON ANY READ, THE PROGRAM ASSUMES IT HAS ;REACHED THE END OF THE TRANSFER. IF THERE ARE NO OTHER ERRORS, ;THE "DONE" SEQUENCE IS ENTERED. THE PRINTOUT OF THE NUMBER OF 16K-WD ;BLOCKS TRANSFERRED PROVIDES A CHECK ON THE SUCCESS OF THE OPERATION. CLR R4 ;INIT LOCAL MEMORY OF DAR CLR DSCBLK ;INIT COUNT OF 16K-WORD BLOCKS WRITTEN DSCM20: MOV #8.,R2 ;INIT TAPE LOOP COUNT #Ew*&^ %eeA m&*$If@ OWҕ^J@A*H Օ E  Iҕ\͋͊*lW  @ @Q Rʋ %6Rz*bIɕ;fIAeV! פ ̕:* .A!˕$Q$ ~-0*  @ ߓp ̔ @ )*&^ % w8ILL CMDINV CMDz*$SYN ERRILL DEVNO FILEILL ADRNO C$ "OPEN" WERE NOT WORKING. THE DRIVER SENSES THE CONSOLE SWITCHES ;TO PROVIDE DOUBLE-SPACE CAPABILITY (LOWER BYTE = 2) AND TAB-ADJUSTMENT ;SPACING FOR MODIFIED PALUUR LS ;SPACING FOR MODIFIED PAL11R LISTING OUTPUT (UPPER BYTE = 1). ;THE DRIVER ALLOWS OPERATOR STOP OF THE PRINTER, WITH RESUMPTION OF ;PRINTING WITHOUT LOSS OF INFORMATION. ; D D C M A G AND M A G D D C ;THESE COMPLEMENTARY PROGRAMS RUN UNDER DOS TO PERFORM TRANSFERS TO AND ;FROM MAG TAPE FROM AND TO THE DDC DISC. THE SI%MOV #1,-(SP) ;READ THE NEXT 8 RECORDS... JSR PC,TAPEGO ;...AND GO TO "DONE" UPON END-OF-FILE. MOV #3,-(SP) JSR PC,DISCGO ;WRITE THE 16K-WORD BUFFER TO DISC BIT #40,R0 ;WRITE CHECK SELECTED? BEQ DSCM30 ;NO MOV #8.,R2 ;RE-INIT LOOP COUNT MOV #200,-(SP) ;BACK SPACE COMMAND JSR PC,TAPEGO MOV #8.,R2 MOV #1,-(SP) JS'*HOREc %8eLe  *חtw w  ae *$Cw    BC *H  w W!w w *lj7 _t&^ p*w P 6 3*=X30e $؋ h*w w e0ߐvߋt '#(ZE OF THE DISC IS ;AUTOMATICALLY ALLOWED FOR BY SENSING "NED". THESE PROGRAMS OPERATE ;STRICTLY IN NON-INTERRUPT MODE, WITH THE MAG TAPE LOOP WAITING FOR ;"READY" TO GO TRUE. SINCE THIS HAS BECOME A SUSPECT METHOD IN READING, ;AND SINCE MORE FEATURES WERE DESIRED, "DSCMAG" AND "MAGDSC" WERE ;DEVELOPED, MAKING "DDCMAG" AND "MAGDDC" OBSOLETE. SEE BELOW FOR ;THE DESCRIPTIONS OF "DSCMAG" AND "MAGDSC." ; D S C M A G AND M A G D S C ;THESE ARE THE NEW AND CURRENT PROGRAMS FOR TRANSFERRING)R PC,TAPEGO ;RE-READ THE STUFF WE JUST READ MOV #7,-(SP) JSR PC,DISCGO ;WRITE CHECK THE DISC DSCM30: ADD #400,R4 ;BUMP THE DAR MEMORY INC DSCBLK ;BUMP BLOCK COUNT BR DSCM20 ;BACK FOR MORE .PAGE TAPEGO: ;THIS IS THE MAG TAPE "GO" ROUTINE MOV 2(SP),R1 ;GET COMMAND MOV (SP)+,(SP) ;POP RTN ADDR UP ONE MOV R1,TMPW01 ;SAVE IT FOR C+-*U@ ACBc%DUey*$ ``E  l*H@PHU% && ,*l- /$^ ( +*&^ & *"u > U@m* &^  v/*@  ##`F , THE IMAGE OF ;THE DDC OR DEC'S RF-11 DISC TO MAG TAPE. THEY HAVE SWITCH OPTIONS ;WHICH ALLOW SELECI ;WHICH ALLOW SELECTION OF TRANSFER MODES, TAPE FILE, OBJECT DISC, ETC. ;PLEASE SEE THE DESCRIPTION SHEET ;PLEASE REFER TO THE OPERATOR INSTRUCTION SHEET FOR DETAILS. ; M O N L I B . O L D ;THIS IS THE COPY OF MONLIB WHICH INCLUDES "LPDOS.S3D" AND "CRDOS.S2B". ;THAT VERSION (CRDOS.S2B) CONTAINED PROVISION TO EJECT THE FIRST CARD ;UPON AN "OPEN", THUS SUPPOSEDLY ELIMINATING THE PROBLEM OF -HECK BELOW BIS TAPCMD,R1 ;INSERT THE UNIT # AND INTERRUPT BITS MOV #BFSTRT,TAPADR ;INIT LOCAL MEMORY OF TAPE CMA TAPE10: MOV TAPCMD,@#TCD ;SELECT THE UNIT MOV #4000,R3 SOB R3,. ;LOOP TO ALLOW LOGIC TO SETTLE MOVB @#TST,R3 ;GET LOWER STATUS BYTE BMI TAPE20 ;READY JMP TAPNRD TAPE20: CLR TINTFG MOV TAPADR,@#TMA ;SET UP MEMORY ADDRESS MOV #4000,/*$U%M 5>C *H( aØ` (E` lfS@ MD*EECDe0 fi*$ `$Ugzw>   *H  e ծ*l f  E * `#' W'͋ W*UWe ee e TZ*  W#TOO MANY ;INTERRUPTS ON THE FIRST CARD. THIS METHOD, HOWEVER, DID NOT APPEAR TO ;WORK 100% OF THE TIME, SO VS2D WAS RELEASED AND APPENDED TO "MONLIB.OLD" ;TO FORM THE NEW MONITOR. SOME DAY IT IS HOPED THAT A CLEAN VERSION OF ;THE LATEST DEC MONITOR WILL BE UPDATED TO INCLUDE OUR LATEST DRIVERS ;AND INCLUDED IN OUR STANDARD DISC OPERATING SYSTEM. ;M W KLEIN 12-22-72 1@#TWC ;& WC MOV R1,@#TCD ;PERFORM COMMAND BIT #10,R0 ;IS TAPE INT ENB? BNE TAPE50 ;YES TSTB @#TST BMI .-4 ;FIRST WAIT 'TILL READY GOES FALSE ASLB @#TST ;THEN WAIT 'TILL BUSY GOES FALSE BMI .-4 ;(WAITING FOR A "READY" GIVES RANDOM ERRORS.) TAPE30: TSTB @#TST+1 ;ANY ERRORS? BNE TAPERR ;STATUS ERROR BYTE NOT ZERO TAPE40: ADD #13e}*1$ 'd d0 * 4@c  W3 e % *DE0 @c ` V%  *h$g"H @ U$eF ed|-* v&*  JEl&1*$&  E`"D  /*H  (  U7*l   (Hh` B$$50000,TAPADR ;BUMP LOCAL CMA MEMORY FOR NEXT TIME SOB R2,TAPE10 ;LOOP FOR SPECIFIE+ COUNT RTS PC ;ALL DONE TAPE50: WAIT TST TINTFG ;DID INT COME YET? BEQ TAPE50 BR TAPE30 TAPERR: ;A TAPE ERROR HAS BEEN DETECTED BIT #77400,@#TST ;CHECK STATUS BITS OTHER THAN FILE MARK BNE TAPER1 ;SOMETHING ELSE IS THERE BIT #24,TMPW01 ;WAS IT A FILE-MARK REQUES7K*-,^ eBj*$ UJ &^ %7*Hewe|w~xU% *le) & E Ee@wHO*> 4.f  E* !w ~ԋp!w *lԋj!w ` Ձ!w R Aa*Ba !w >`!w 2 Aa@a* O!QAaP !w &N`֋.9T? BNE TAPE40 ;WE WERE EXPECTING A F/M INDICATION CMP R2,#8. ;BE SURE THAT # OF TAPE RECORDS IS CORRECT BEQ DONE ;SAW FILE MARK ON "READ": ASSUME DONE TAPER1: TST @#SWR ;ERR IGNORE BIT ON? BMI TAPE40 ;YES MOV DSCBLK,R3 ;CURRENT DISC BLOCK ASH #3,R3 ADD #9.,R3 SUB R2,R3 ;# OF TAPE RECORD IN ERROR MOV @#TST,R1 CLRB R1 BISB;*D:5@0ĝ ) E4*ht a b`Z \ Xu*T a a 0݀U w*& & 2w x (K*&^ % , .e *$@e("ep & *He2*E? cc8$)N*l  E S e$^ ]*( = R3,R1 ;REPORT ERRORS IN UPPER BYTE; RECORD # IN LOWER MOV R1,-(SP) MOV #3*400+200,-(SP) ;F200: TAPE ERROR IOT EMT 60 ;EXIT .PAGE DISCGO: ;MAKE THE DISC GO MOV #-40000,@2(R5) ;WC FOR 16K WORDS MOV #BFSTRT,@4(R5) ;CMA MOV R4,R3 ;CURRENT DAR DSWICH: BR .+2 ;SHUNT SWITCH AROUND RF-11 LOGIC BR DISC10 CLR R2 ?&^   TeT* 8 d0B`e & R*$AAIe ߋtߕ$v& g*  U%g"G_ *C  e e(   e*$&  L̥ ̥ ̥̥̋8*H ̥ I  w P ˥**lj .g  6 ˥, X a*T˥* ˥]K I G H m*C A ;RF-11 LOGIC: READY FOR EXTENSION BITS ASHC #6,R2 ;SHIFT THE SECTOR ADDRESS TO WORD ADDR MOV R2,@10(R5) ;LOAD UP THE TRACK EXTENSION BITS DISC10: MOV R3,@6(R5) ;DAR (EITHER SECTOR OR WORD ADDRESS) MOV 2(SP),R3 ;GET COMMAND MOV (SP)+,(SP) ;POP RTN ADDR UP ONE BIT #20,R0 ;IS DISC INT ENB SELECTED? BEQ DISC22 ;NO BIS #100,R3 DISC22: CLR DINTFG CB&      * ˥:0C ˥,U% "˥**  ˥. ˥[ ˥/. * ˥< ˥  ˥ ˥  a*DeAbEɋA% "U%s*hG!   4 .˥: * "˥.˥$    *& ˥0 ˥Z˥9˥A *   *E MOV R3,@0(R5) ;COMMAND! ASLB R3 ;CHECK INT ENB BMI DISC40 ;ENABLED: WAIT FOR INT TSTB @0(R5) ;WAIT HERE FOR READY BPL .-4 DISC30: ;HERE WHEN READY GOES TRUE OR INT COMES IN TST @0(R5) ;ERROR? BMI DSCERR ;YES RTS PC ;EVERYTING'S OK DISC40: WAIT ;WAIT FOR INTERRUPT TST DINTFG ;WAS IT THG& & ACB$2  Ae F*$! ! ! ! ! `0 . t1 *H D Ѥ 1ӥ, ˥,˥*l<˥  ˥.˥[ f˥**8D`%  %* %2"6U%G * 1 K Ӌc* j2 & Β | r* ˥: ˥.˥$D U n*D   F` 0˥:*h ӥ*IE DISC INT? BEQ DISC40 ;NO BR DISC30 DSCERR: ; ADISC ERROR OR [NED] HAS OCCURRED MOV @0(R5),R2 MOV R2,R3 BIC #104377,R3 ;CLEAR ERR AND NED BITS (ALSO LOWER BYTE BEQ DONE ;[NED] HAS GONE TRUE WITH NO OTHER ERRORS TST @#SWR ;ERROR IGNORE ON? BPL .+4 ;NO: CONTINUE RTS PC ;YES: NOTHING ELSE TO DO BUT RETURN MOV R2,-(SK@ & Β0 *e& ˥0 ˥Z˥9˥A * &f˥* *Ŕ@Ŕ@a   @a @E*&^ %&B A!"W D *$, COK STE WAC*H&^ e%OI`*l ZZa 達 *g" )em`& ($^ ` Hh*MP) ;ERROR: PUT STATUS IN MESSAGE MOV (PC)+,-(SP) .BYTE 201,3 ;F201: DISC ERROR IOT EMT 60 .PAGE DONE: ;;ALL DONE: EXIT WITH TAPE JUST PAST THE FILE MARK MOV DSCBLK,-(SP) ;DISPLAY THE NUMBER OF DISC BLOCKS MOV (PC)+,-(SP) .BYTE 100,0 ;I100: ALL DONE IOT EMT 60 SELERR: ;CONSOLE SWITCH SELECT ERROR CLR -(SP) MOV O((&(  eeu* 6##  _*DASA ECODBERE KITIEN$MOPR AS DU ZZj*&^ %0 e@@e*m &   c `@@ @?*)#&%7 2JANFEBMARAPRMAY*JUNJULAUGSEPOCTNOVDECL e* `  %@ 44`*4W-& 5"< de&X#NQ (PC)+,-(SP) .BYTE 100,1 ;A100: UPPER BYTE OF SWITCHES NOT SET IOT ;PRINT MSG & WAIT FOR PROPER SELECTION JMP DSCMAG ;TRY AGAIN TAPNRD: ;TAPE NOT READY CLR -(SP) MOV (PC)+,-(SP) .BYTE 101,1 ;A101: TAPE NOT READY IOT ;PRINT MSG & WAIT FOR OPERATOR TO READY UNIT JMP TAPE10 ;BACK & CHECK AGAIN DSCINT: INC DINTFG ;SHOW INS#e % *&^ % 6DECNOVOCTSEP*AUGJULJUNMAYAPRMARFEBJANXXX .*E 5 @`e"* /: W: "` *@0- Lt *&^ %eE ɕ * hɊ4$ JRR X*A!⊎ &. P f*%f/ @e h"RA8"T CAME IN RTI TAPINT: INC TINTFG ;SHOW TAPE INT CAME IN RTI .END DSCMAG W*2 Ɍ",$*Ɋ,^ "*4$ $RR"*X&( @ %   |A*vv@K * `Be (/*e E T%T%T%TTTpT **$ (a%eF*e e  e %& H*4&eJ###  p&*Xf&e"f&[AAcD#|D 7FILE ERROR *!  & L  0* 8&& 3e0 *7`$ "U%0 Yb.$)&]*&&cA!D 5@ 7**7 DEV. FULL ߕ ߋtf*NvȊ& N&"W0rW ѕ *&^ % P  I ^*W W,CAנ> ` * ` g_ E A(*eE eE ΊE`e* EN W= EC@@@j4PN !x*&^ %  a  Wf*R  WK c%@eJ-*!!! ̋ee&^ ߓpDJ*&^ %2 ɊA!@ .*, 0"3  BE*B WS Ɍ  3{*U%## A >ߋct'@* fA! wV%eJ   O*4 e4   $)3U%0e @*X  ( &^ h | p* &^ %eAu  H D! ! f8* h eeɋaE ^ *   e&C 3 e c* fE e d- D 1&"* 0)d ddEEd 8*4 5   U%֌ ߁ *X LɌa M g&&&A | K* &^ % e0e K" A  * W$@ $` @ *  F e 8  @ P$0)* e Œ A% W)E( ((f      'd* &^ % @ ̋'@ߓf*   D @e   *    % % E4$  *  %@eJ!!! E0v8 p 2k* &^ %ea@W0=&& & * K<<< B: e  * ` `  d L b $ $"* < A!  a* 2 " KX *4 <LI/: `*X A d   | l* &^ sɌ3 o m7R* A!B0Z0W9* W   B o*  •/  :  A,* ߋp͗rŀ^UWI{*4•\ ͋Ba͊QB *X  BN DIA%  |&*&^ % & !amB: 2*( #W[6e \*c p s! bRK 1*l c  A! ,  J* W. ScA!W]*4W0W9@WAsͥZf*XW,W VA!N   |mA*&^ %ew H R *  fa e* W%!  D O*b aB !  p & W* . 'Ȋ% W, 6 -*4e !  e 5 *X0   f%e |v*&^ %  @e e Mw*e  ʕ ʊ $͋#*C( . '$ Ĝ* %`(  ( ͋*,^ +  !*4v e   ͋Xe K)  =r *&^  )$A!@ *, e @`*e 2 0 F D * I ;" 0 350{* `5)N 끃 " *4 $w M C #*X%C me%A  | *&^ %7 Ll֋N i* *fE E  @ k*E N  Q% E4*E \5 E `` *E N @`C`  5? *45ŗrEW$   @Z*X  :  F*  | &^ % u>* wF&M e v *$a( I D | j *H  X E eaE *l& & EfIDDm &! *& e#  E*   eDbe*A LA   ! 0* e e *  | .M $M *D"U%G$CEu*h   em A  l*  e*$^ &&e E]e*( &^ & ݁ "  uz*a ͋,L w~B *$` 5 5 6   f*Hw w* w4  *lDUUEU Q*S & fNUVUe* #<f& * 1U *U@DEU!>U*f& * 5 U * UCB E e vW*D * "U%*hGef.  Em&eEv &&W*&^ &ep*$ T E eE`E& & n*HEfpCCm  ~*l &  *  8 *    * % 6*0 tE   *  EemLAN   n*D2  (.M $*hM "U%G$^ &'*&e E]e( j&&^ & ݁ "us*a ͋,L Dn*$B ` % Z$7?*H* &#LU%&& & @*l* A<,M && *= ,+   e*  *euF!%"U%H*$Gef. D!*d6&U%fN8W)C$w*  N! eeH! *D   Z%D RC,e*h <e c$B  *D .M T*$^ &&e E]*e( &^ & ݁ "uSNn* EeRRRRR *$%  22 2  n*H  F&USw=*l&  p 4,0*E  2% e *0 00 0 & *0"U%G* E   * #ccD  fNUVU00*D%%% p b*h $^ &&G*e E]e( &X ^ & ݁ "uO* 9:-  -5@%*$! E*H 6 &M  $*l^ "U%Gwf& * p ,M 'pm* pT e T*TTTTL&M *0   E Cae-* e D!K& E>*D ae f.M &0 $h& N.L &0 L  *&M  WE& <*$  e&p P*H E eE`E& & 0pw*lf$EA B` ~0$*   n& &D & *  ` ic J1  *6!(   6!6 V*  ",T <*  BaBa6A c JQ  *D 0  !*h $ *" lc e* V&"BU%G 0 * 6    B e P*&M &&  *$&  R*Hmm$S # $**lm # *f0 Ze $M "*JU%G-B8< y*v! eeH! 6*$^ &&e E]* e( &^ & D݁ "u@fT*a ͋,L wB *$` 5 5 @* H*H  &#,fE+U'*le t * &M *$^ "U%bGe\f.*   Ee EL* v &$^ &A*&e E]e( & &^ & ݁ "uTQK*$AcfNlN*$ & E CD  aCU%*HW# e  p p*l 0 P e*"bU%M%& N.0*^ 0 E e E `ek*D#E &. 0 &&*$^ &&e E* ]e( &^ &D ݁ "uVq|*a ͋,L wB*$ ` 5 5 i* pG*H 6&#Q- P5?*lO & fNUVUJ#,;!9*- 8 BBUBU8 h*  * 0 &M * $^ "U%Ge *f.    E[* Ee v &p*D$^ &&e E]:*he( &^ & ݁I "u*a ͋,L wB s*$` 5 5 w**H g,M `$ [ &2*l#c bg & ** X   #,4  O* Q$TTT e* #i f   U p* 8 E -e ES* e v& *D  E **h.M &^  $^ "r*U%nGehf.*$^ &&e E]e*( &^ & ݁ , "un &*a ͋,L JB y*$` 5 &TT!*H #  H #(B*l!' (  8e E* eef$C# 0 *C*.&0 L &0 & *L 0 e  1&fK (* ǁ'C!E?M*   * F0 **DU "U% GefZ*h.C& %*$^ &&e E]e*( &^ & ݁ "D u&*&M %  GiU 0 *$  pE  E N*HCaee _ppl *l&pK!K  *.M  le*D<EE?E !> QA*   0 .M & '*& NM 0 "U%GDF* & p rHeAe*D 8,BU% 2! e*heH  p *$l*eU   w *$^ &&e E]e*( &^ & ݁ "  u-*e& $ *$EKcKm ; 8 *H E le$5@^*lK J ,^ e&*T&T 0d%aT $Q$K *"@U%G$^ &E*&e E]e( (&^ & ݁ "u'*a ͋,L w:B 9*$` 5 &  E*H >w   f5*leU@  [* R*  & * G &*( 8L'4e Q$* BBB"   s*U@ U e  "U%G* ef. U U BP*Db 0 * B.&4*h0 M &0 & M 0 *&$^ &*&e E]e( <(&^ & ݁ "u/*a ͋,L TB 4*$` % $w*<*H &TTB$W!"W!7*l Z K + * 4 J : E1*e Ev ;&*C!EU _*    be`e`* S)B v * *DeuF!%"U%GeU*hf.$^ && *e E]e( &X*^ & ݁ "u(' &(   * 7 8*$ E    $ &E*H`B   E*l`` L$$E0d$^ p *ABDU%E 5x W* h"U%MU *ˋ5EMK55  x*8xB$"  *$e "E8b$^ $C*H Bx   "u L lU  f*H& 5p 7 f*$^e& Ap*H&p J*fteȋ W c*lEWSW MW Ff mg*ae7 27pȋF*$^ |t ( #*! @  x p . 0*qH pD 7 * 356:'"90SUVz*DYݬ_?Z-KMNPѠ!$\ҦABDGH*h.<(+ɠ356_'\90SUVY*("Z-KMNPѠ:$۾+ABDGH?. B+X * ߕR*M  Hɕ5"PwW*"wɕ .5P*f*E   qɕ *@ɕ 5"P 7 *d(T3 BAPP52U~*5U5"U5@UEy*Ps  ~1 6 2 . w*$^ &RRE@P552*& 7w|5:*93 55(#+*<51 ɥɥ5 Uw5*`• TwB5 @ TBw0772*N 5p 7R7a*$(F"C &ePex*He&š*l7X  w & *ApP7 w * q&p xGfxr*p wV%(Ȋ*&Ȍa$teȋ W VWgW * aW Zf maeL*D7 F7<pȋ0$^ *h"\ ȋ Ћ*!@ ѕѕ bx  q*"up 6 l8e  *H pD87 2*356:'"90SUVY*_?Z-KMNPѠ!$\ҦABDGH.<*@(+ɠ356_'\90SUVY("*dZ-KMNPѠ:$۾+ABDGH?. l R*H ߟn U@l$_ ,*l lx f7e=~Tvv:M*H.M w *$e w 7  7l*HE@L LNf<ߋL- *lS ʋ_ \Y  * Qt nIN d f*^ ߋL wLJU@Lu*$_  Lx  *& ߕ N    "r*PVeĜ`*$XZߓQ$```BE*HUA$^ B 5W*l  &^ U 7 rf8 K -*`> `5pDDH*$p5@p ve&*H Ap&p *lb;ftȋW`WpWpW*gW``!? {*ef mRae7 x*;7tpȋ&5$^ v*JB( * ! @  x p 8 L*DqH 7pD7 7*h7356:'<*"90SUVYݬ_?Z-KMNPѠ!$\ *ҦABDGH.<(+ɠ356':90*SUVY_(\"Z-KMNPѠ$ݻ+ABDGH.<7M*|:M @5@5*$7 2  x 7(  P*He$wew  =*lt @ 5@$^ 5b*5  @@ 5*  J ?*&^ xty uE*W! W! 3W! W! RW!`*  SA9 ,݃˕w$"<*D 2 W! ( קx*h ӕ קy*W!5㨣 h* 7 קx *7 zwH7{fwd*ro 7d*J 7D5  e,q*@ 5dr,PVeĜ`^,&XZߓQ$```BEUA,L$^ B 5 9*r &^ U 7 rf