>7$J_>: `Q$ȋ @ B C  ` YSjLxeKETSvK%}K=.vLDK^jLpK)8}4d24dKYEx4dBa(8}4dv8}K{;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 CHARACTERS, ; FOLLOWED BY CR-LF, WILL BE PASSED <*R0 R5pDDr*$ ve&*H Ap&p b;ftȋ*lW`WpWpWgW``H*!? ef *m`ae7 x;7t*pȋ&5$^ Jq*B( ! @  l* x p 8 qH 7U*DpD&;THIS IS THE LINE PRINTER DIAGNOSTIC ROUTINE ;SEE THE WRITEUP OF THE ROUTINE FOR OPERATING INSTRUCTIONS R0 = %0 R1 = %1 R2 = %2 R3 = %3 R4 = %4 R5 = %5 SP = %6 PC = %7 PS = 177776 SWR = 177570 ;CONSOLE SWITCH REGISTER SCOPE = EMT ;USED AS CALL TO ERROR ROUTINE ;THE FOLLOWING ARE REGISTER ADDRESSES FOR THE LINE PRINTER CONTROLLER R.AD = 165010 ;;COPYRIGHT 1971, DIGITAL EQUIPMENT COPR., MAYNARD, MASS. ;VERSION NUMBER: V002C ;DATE: 5-OCT-71 ;CHANGE INSERTED TO ALWAYS CLEAR "CR-LF" AT END OF FULL 80-CHAR BUFFER ;MODIFIED BY GULF TO ACCEPT UNIVAC 1108 "FIELDATA" CODE ;CARD READER DRIVER (CR) ;**************** N O T I C E ********************************** ; ; THE STANDARD DEFAULT CARD CODE IS THE UNIVAC "FIELDATA" CODE. ; IF EITHER OF THE OTHER TWO CODES IS DESIRED AS THE DEFAULT CODE, ; THE "DEFALT" STATEMENT AT THE END OF THIS PROGRAM 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-0-1 PUNCHED IN C.C. 1 ; ;  XXXXXXXXXXXXXXXXXXXXXXXXX ;27-JAN-72 ;TIMDGN.S04 ; ************* T I M D G N . P A L ************************** ; 26-JAN-72 ; 20-JAN-72 ; TIMER MODULE DIAGNOSTIC ROUTINE - TEST #1 OF 4 ; THIS ROUTINE SETS UP THE INTERRUPT VECTORS, ; CLEARS CORE UP TO THE LOADERS, SETS CPU LEVEL TO 7, ; ENABLES THE MODULE INTERRUPTS, AND DELAYS FOR ; FIVE SECONDS. THEN IT DROPS THE CPU PRIORITY BY ONE ; LEVEL, AND COUNTS THE INTERRUPTS AND THE ORDER ; IN WHICH THEY COME IN. IF THE INTERRUPTS FAIL TO ; C7 77*h356:'"90SUVYm*_?Z-KMNPѠ!$\ҦABDGH. WORD 1, BITS 15-4 ;  C.C.2 > WORD 1, BITS 3-0; WORD 2, BITS 15-8 ;  C.C.3 > WORDR5 MOV #5,R4 TIMC11: ASR R2 ADC R5 DEC R4 BNE TIMC11 MOV R5,R2 BIC #-340-1,R1 MOV R1,LEVEL BIT #20000,SWR BNE TIMC12 MOV R1,PS MOV R0,(R3) BR TIMC13 TIMC12: MOV R0,(R3) MOV R1,PS TIMC13: CLR R4 MOV #2,BITFLG CLR INTFLG CLR INTCNT MOV MSECS,R5 ;DELAY FOR "MSECSTERS ROUTINE ; 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 INTERRUPT 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  2, BITS 7-0; WORD 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 PUS" MILLISECONDS JSR PC,DELAY ;///////////////////////////////////////////////////////////////////// SUB #40,@#PS  ;DROP CPU STATUS TO LET ;     INTERRUPTS COME IN. ;///////////////////////////////////////////////////////////////////// BR .+2 BR .+2 BR .+2 CMP INTCNT,R2 BEQ TIMC20   ;YES MOV INTFLG,R0 BR SCOPE   ;TOO FEW OR TOO MANY TIMC20: RESET MOV #7,177566 MOV #100.,R5 JSR PC,DELAY  .BYTE 0 ;SPARE LP.NAM: .RAD50 'LP' ;********************************************************************* ;********************************************************************* LPER01 = . ;UNIT NOT READY ON OPEN JSR PC,ERMES ;PRINT A002 LP.OPN = . ;OPEN ROUTINE MOV #100,@#R.CM ;HIT CONTROLLER RESET MOV @#R.ST,R ;RETURN TO USER ;INTERRUPT ROUTINE CR.INT: TST @#CR.CSR ;CHECK FOR ERROR BMI CR.ER1 BIT #040000,@#CR.CSR ;TEST FOR CARD DONE BNE CR.E9 ;YES,GET NEW ONE CMP CR.STO,CR.ST1 ;FIRST COLUMN? BNE CR.CHR ;NO MOV @#CR.BUF,#0 ;YES, SAVE IN 12 BIT FORM CR.CHR: MOVB @#CR.BU1,@CR.STO ;STORE CHAR IN INTERNAL BUFFER INC CR.STO ;UP STORAGE ADDRESS RTI !NCHING MUST APPEAR 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 'BLANK" TST @#SWR BMI TIMC10   ;DO IT AGAIN MOV #177777,R0 HALT    ;SUCCESSFUL FINISH BR TIMC10   ;AFTER "CONTINUE" SWITCH ;--------------------------------------------------------------------- INTA: INC CONTA1 BIS #4,R4 BR INTSVC INTB: INC CONTB1 BIS #10,R4 BR INTSVC INTC: INC COUNTC BIS #20,R4 INTSVC: BIT #10000,SWR BEQ INTSV1 BIC#0 ;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-FORM ON OPEN LP.EXT: TST (SP)+ ;POP RTN ADDR OFF STACK MOV LP,R0 JMP @14(R0) ;TAKE COMPLETION RETURN $ ;RETURN CR.E2: JSR PC,CR.TFR RTI ;BINARY STORAGE ROUTINE ;COMPLETION RETURN CR.E9: TST CR.DFL ;CHECK TO SEE CARD PROCESSED BEQ CR.CNO CLR CR.DFL .IFDF BLANKS TST CR.BS BNE CR.NBS MOV R0,-(SP) MOV CR.STO,R0 CLRB (R0)   ;CLEAR POSSIBLE "CR" CLRB 1(R0) ;...AND "LF" CR.BS1: TSTB -(R0) BNE CR.BS2 CMPB R0,CR.%S-SUPPRESS' MODE 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 ; ;  XXXXXXXXXXXXXXXXXXXXXXP R4,ENBPAT MOV ENBPAT,(R3) INTSV1: CMP SP,#TIMA00-4 ;CHECK FOR PROPER PUSH BEQ INTS10   ;O.K. MOV #400,R0 BR SCOPE   ;STACK INCORRECT INTS10: TST DLYCTR BEQ INTS20   ;DELAY HAS COMPLETED MOV #1000,R0 BR SCOPE INTS20: MOV 2(SP),R0 ;CHECK LEVEL OF CPU @ TIME OF INT ADD #40,R0 BIC #177437,R0 CMP R0,LEVEL BEQ INTS30 MOV #1400,R0 BR SCOPE INTS30: INC IN';********************************************************************* ;********************************************************************* LP.TFR:    ;TRANSFER ROUTINE MOV (SP)+,SAVRTN ;POP STACK NOW IN CASE OF NO RETURN... ;FROM THE PRINT SUBROUTINE ; DO BUFFER CALCULATION HERE IN CASE OF NO OPEN CLRB FORMFD ;FLAG TO EJECT AFTER A LINE TST BUFBGN  ;SEE IF BUFFER CALC'N NEEDED BNE L(ST1 BNE CR.BS1 CR.BS2: INC R0 MOV R0,CR.STO MOV (SP)+,R0 CR.NBS: .ENDC CLR @#CR.CSR ;DISABLE INTERRUPT ;PARITY ASCII CONVERSION AND STORE ROUTINE MOV R0,-(SP) ;SAVE USER@S R0 ON STACK MOV CR.CHR-2,R0 ;GET 12 BIT COL 1 VALUE CMP #7400,R0 ;EOF? BEQ CR.CS ;YES .IFNDF ONLY26&ONLY29 CMP #4242,R0 ;DEC026 CONTROL CARD? BNE)XX ; .TITLE CR .GLOBL CR ; 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 .IFNDF MARKS .BYTE 3  ;STD BUFFER SIZE = 96 BYTES .ENDC .IFDF MARKS .BYTE 2  ;(64 IF 40-COL MARK SENSE) .ENDC .BYTE CR.INT-CR,300 ;INT'RUPT SVCE AT PRL 6 .BYTE CR.OPN-CR *MEMORY ADDRESS R.LF = 165012 ;LINE-FEED CONTROL R.WC = 165014 ;WORD COUNT (2'S COMPLEMENT) R.CM = 165016 ;COMMAND (OUTPUT ONLY) R.ST = 165016 ;STATUS (INPUT ONLY) ; FIRST PUT HALTS IN ALL INTERRUPT LOCATIONS LP.DGN: MOV #.,SP ;INIT STACK CLR R0 ;POINTER TO VECTOR CLR R1 ;POINTER TO VECTOR+2 LPDA10: TST (R1)+ ;BUMP TO VECTOR+2 MOV +P.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  ;DUE TO FIRST "INC R1" @LPXF02 MOV 6(R0),R2 ;MONITOR BUFFER START JSR PC,LPTR00 ;GO XFR MON BUF TO LOCAL & PRINT MOV SAVRT, CR.029 ;NO MOV DEC026,CR.TBL ;SET UP CURRENT OFFSET FOR DEC026 CR.026: JSR PC,CR.TFR MOV (SP)+,R0 ;RESTORE R0 RTI CR.029: CMP #5252,R0 ;DEC029 CONTROL CARD? BNE CR.108 ;NO: GO LOOK FOR 1108 CONTROL CARD MOV DEC029,CR.TBL BR CR.026 CR.108: CMP #2525,R0 ;IS IT A UNIVAC 1108 FIELDATA CARD? BNE CR.CR1 ;NO MOV UNIVAC,CR.TBL ;SET UP PROPER OFFSET -;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: 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 . R1,(R0)+ ;PUT #VECTOR+2 IN VECTROR CLR (R1)+ ;PUT A HALT IN VECTOR+2 TST (R0)+ ;KEEP UP WITH R1 TSTB R0 ;AT 400 YET? BNE LPDA10 ;LO BYTE CLEARS FIRST AT 400 ;------------------------------- MOV #LPDI10,200 ;INIT INTERRUPT TO ERROR LOC'N MOV #340,202 ;INTERRUPT STATUS MOV #SCOPEI,30 ;INIT EMT VECTOR ; SET UP TO READ IN THE FIVE OPTIONS /N,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 INTERRUPTS BIT #40001,@#R.ST ;BUSY OR PAPER LO? BNE LPER02 ;YES MOV @#$RSAVE,-(SP) JSR R5,0 BR CR.026 CR.CR1: .ENDC .IFDF BLANKS CMP #7777,R0 BNE CR.CR2 INC CR.BS JSR PC,CR.TFR MOV (SP)+,R0 RTI CR.CR2: .ENDC MOV (SP)+,R0 ;RESTORE R0 MOV @#44,-(SP) ;SAVE REGISTERS ON STACK JSR R5,@(SP)+ MOVB #215,@CR.STO ;APPEND TERMINATORS INC CR.STO MOVB #12,@CR.STO DEC CR.STO MOV CR.STO,R0 ;GET U1.ENDC DEFALT  ;... FOR DEFAULT PUNCH .IFDF DEFALT  ;... AS APPROPRIATE MOV #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 TST (SP)+  ;IGNORE INTE2 MOV #BYTLST,R0 ;TOP OF BYTE LIST MOV #5,R1 ;FIVE OPTIONS STOP00: HALT ;STOP HERE FOR FIRST PARAMETER LPDA15: BITB #177,@#SWR+1 ;IS BYPASS OPTION ELECTED? BNE LPDB10 ;YES: SKIPP ALL INPUTTING TST @#SWR ;IS BIT #15 SET+0 BMI LPDA20 ;SWITCH SET TO BYPASS THIS ONE ONLY MOVB @#SWR,(R0) ;LOAD PARAMETER (LOW BYTE) LPDA20: TSTB (R0)+ ;BUMP HERE IN CASE O3@(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 CONDITION MOV @#R.ST,R0 ;GET STATUS COM R0  ;INVERT FOR TEST BIT #6,R0  ;OF [READY] AND [ON-LINE] BNE LPIN03  ;ONE OF THEM IS4SER BUFFER ADDRESS ;DONE ON STACK RATTHER THAN REGISTER BECAUSE OF SIGN PROPOGATION CLR -(SP) ;CLEAR TEMP STOAGE CR.ASC: MOVB -(R0),(SP) ;GET CHAR TO BE CONVERTED MOV PC,R4 ;SET UP BASE CR.BAS: .IFNDF ONLY26&ONLY29 ADD CR.TBL,R4 ;ADD OFFSET TO CURRENT TABLE .ENDC BIT (SP),#340 ;CARD CODE <40? BNE CR.CK4 ;NO ADD (SP),R4 ;MOV INDEX INTO R4 MOVB CR.00-CR.BAS(R4)5RIM 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 BR CR.ERD  ;ELSE LEAVE USER BUFFER ALONE ; B) INITIA6F BYPASS STOP01: HALT ;WAIT FOR OPERATOR TO SET UP SWITCHES DEC R1 ;ANY MORE? BGT LPDA15 ;YES LPDB10: JSR PC,LPD.ST ;CHECK STATUS ERR010: SCOPE ;ERROR RETURN:BAD STATUS BIT #4,@#R.ST ;IS READY SET? BNE .+4 ;YES ERR020: SCOPE ;READY NOT SET MOVB #40,SCHAR ;INIT SYNTHETIC CHAR MOVB #64,WDCNT ;INIT PAGING PARAMETER7 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 ;RESTORE CHAR COUNTER MOV MONBUF,R2 ;CURRENT MONITOR BUFFER POINTER JSR PC,LPTR00 ;GO GET ANOTHER LINE ANF,(R0) ;STORE CHAR IN USER BUFFER BR CR.CNO ;GET OUT CR.CK4: BIT (SP),#300 ;CODE<100? BNE CR.CK1 ;NO SUB #40,(SP) ;GET TABLE INDEX ADD (SP),R4 ;MOV INDEX INTO REG 4 MOVB CR.40-CR.BAS(R4),(R0) ;STORE CHAR IN USER BUFFER BR CR.CNO ;GET OUT CR.CK1: BIT (SP),#200 ;CARD CODE<200? BNE CR.CK2 ;NO CMP #140,(SP) ;IS CHAR [!]? ELISE 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 INCB @PC  ;MUSTN'T COME HERE AGAIN! .ENDC ;TRANSFER SET-UP PROCESSOR: CR.TFR: .IFDF BINARY  ;FOR BINARY VERSION ... BR .+4  ;... SWITCH TABLEHS MOVB PAGE,LINENO BNE LPDB15 ;INIT PAGE SIZE IF SPECIFIED... MOVB #66,LINENO ;...ELSE SET FOR FULL PAGE LPDB15: BR LPDB20 ;SAVE SOME SPARE SPACE FOR MORE INITS . = .+20 LPDB20: JSR PC,LPDC ;BUILD FIRST BUFFER JMP LPDD ;GO PRINT IT ; LPDE90: MOVB HOMECH,R2 ;USE VFU TO SKIP TO TOP-OF-FORM BISB #100,R2 ;COMBINE CHANNEL # AND VFU COMD BIT BR LPDE1GD 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 ;STILL IN MIDDLE OF LINE LPTR01: MOV BUFBGN,R3 ;LINE WAS PRINTED: BEGIN NEW ONE LPX""""""" """""""""BDD@DD@DDDDDDDDD@DDDDDDDDDDDDDDDDDDDDDD ""  ""  " """""""""""""""""" """""""""""@DD@@ADD*B B *B *B C`4d +`K M-4d%_#u~&{ tM4d  dTo8{0_-B8}4d8}4dMK 4dAu~y>D:8}K8}KMo8^CtH#Y`^F#Mo84dC%Mo8KC#Y`KF'/dTo8{[33dTo8K[FZM;; [LdM;;K[^bu~&{x k4du~&Kcfjk^ $D""""a ͋,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 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 BEQ CR.RDC  ;IF BINARY WANTED ... MOV (J BNE CR.CK3 ;NO MOVB #41,(R0) ;PUT IT IN BUFFER BR CR.CNO ;GET OUT CR.CK3: SUB #100,(SP) ;GET TABLE INDEX ADD (SP),R4 ;MOVE INDEX INTO REG MOVB CR.100-CR.BAS(R4),(R0) ;STORE CHAR IN USER@S BUFFER BR CR.CNO ;GET OUT CR.CK2: CMP #240,(SP) ;IS CHAR [?]? BNE CR.CK5 ;NO MOVB #77,(R0) ;PUT IT IN BUFFER BR CR.CNO KF01: 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 TAB? BEQ LP.TAB ;YES CMP R5,#12 ;LINE FEED? BEL0 ;GO PUT IT OUT ; ; NOW WE ARE READY TO COMMAND PRINT OF THE LINE ; ; THIS IS ENTRY POINT TO PRINT ANOTHER LINE ; ; NOW COMPUTE WORD- AND LINE-COUNTS LPDD: MOV CURBUF,R0 ;BUFFER START: NO P/F CHARACTER MOVB COUNT,R1 ;LINE WIDTH: NO P/F CHAR BNE LPDD20 ;WILL USE 'COUNT' SPECIFIED DECB WDCNT ;USE AUTOMATIC LINE WIDTH BNE LPDD10 ;STILL SHRINKING MOVB #64.,WDCNT MSP)+,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  ;N ;GET OUT CR.CK5: SUB #200,(SP) ;GET TABLE INDEX ADD (SP),R4 ;MOVE INDEX INTO REG MOVB CR.200-CR.BAS(R4),(R0) ;STORE CHAR IN USERS BUFFER CR.CNO: CMP R0,CR.ST1 ;BACK TO BEGINNING OF BUFFER? BGE CR.ASC ;CONVERT ANOTHER IF NOT CR.IGN: CLR (SP)+ ;CLEAR OFF TEMP MOV CR,R0 ;GET CURRENT DDB CLR 16(R0) ;FORCES AN ENTIRE CARD LENGTH + CR.FRT: JMP @14(R0) ;COMPLETION RETUOQ 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 PARITY MOVB R5,(R3)+ ;PUT INTO LOCAL BUFFER DECB TABPTR ;...P;FULL LINE AGAIN LPDD10: MOVB WDCNT,R1 ;TMP'Y HOLD LPDD20: BIT #1,@#SWR ;AUTO MODE? BNE LPDD30 ;YES: NO P/F CHAR INC R1 ;IN P/F MODE: ONE EXTRA WORD TST -(R0) ;AND ONE WORD SOONER IN BUFFER MOVB PFCHAR,(R0) ;LOAD FIRST BUFF WORD W/P/F CHAR BR LPDE20 ;GO SET UP PRINTER REGISTER... ;BYPASS AUTO PAGE COUNT LPDD30: BIT #2,@#SWR ;DOUBLQWITH 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 COMPRRN ;ERROR ROUTINE CR.ERR: BIC #100,@#CR.CSR ;DISABLE INTERRUPT MOV CR.DNM,-(SP) ;NAME OF DRIVER MOV #402,-(SP) IOT ;NOTIFY OPERATOR OF CONDITION JMP CR.E2 ;TRY TO READ CARD AGAIN CR.CS: MOV (SP)+,R0 ;RESTORE R0 MOV @#44,-(SP) ;SAVE REGISTERS JSR R5,@(SP)+ MOV CR,R0 MOV 10(R0),16(R0) ;FORCING NO CHARACTERS SAND 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 BUFFER SUB R3,R4 ;GET (NEG) CHAR COUNT ASR R4 ;(TE SPACE? BEQ LPDD40 ;NO DECB LINENO ;YES:COUNT TWO LINES LPDD40: DECB LINENO BGE LPDE20 ;NOT END OF PAGE YET MOVB PAGE,LINENO ;REACHED END: RESET BICB #340,HOMECH ;IS VFU OPTION SELECTED? BNE LPDE90 ;YES ;NO: WILL TRY TO SKIP 'N' LINES TSTB PFCHAR ;ALLOWED TO DO A P/F COMMAND? BEQ LPDE20 ;NO: FILL ENTIRE PAGE ULETION 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 AV ;PASSING # CHANGES IF PREAMBLE ;CHANGES SEC ;SET EOF FLAG JMP @14(R0) ;COMPL RETURN CR.HEM: MOV CR.DNM,-(SP) ;ERROR!!!!!OPEN MOV #402,-(SP) IOT BR CR.HEC CR.OPN: .IFNDF ONLY26&ONLY29 MOV DEFALT,CR.TBL .ENDC .IFDF BLANKS CLR CR.BS .ENDC MOV CR,R0 ;CLEAR OUT BUFFER WITH NULLS WNEG) 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 #202,ONECHR ;YES: SET UP TO UPSPACE CMP @#SWR,#2 ;IS DOUBLE-SPACE SELECTED? BNE LPPR04  ;NO INCB ONECHR  ;SET UP TO DOUBLE-SPACE LPPR04: JSR PC,PRTONE ;GO UPSPACE ONE OR TWO BR LPTR01  ;...AND GO BACK FOR MORE X MOV #66.,R2 ;YES: CALC # OF LINES TO SKIP MOVB PAGE,R3 ;NO SUCH THING AS A BYTE SUBTRACT SUB R3,R2 LPDE10: MOV R2,-(SP) JSR PC,GETPTY ;GET EVEN PARITY(IF ALLOWED) MOVB (SP)+,PFWORD ;NOW HAVE EITHER SKIP-LINE... ;...OR SKIP-TO-CHANNEL COMMAND ; ; NOW OUTPUT THIS ONE-WORD P/F COMMAND AND WAIT FOR FINISH CLR @#R.LF ;SET MODE TO P/F MODE MOV #YPPROPRIATE 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 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 CZMOV 10(R0),R1 ;PICK UP BUFFER LENGTH MOV 6(R0),R0 ;GET STSRT OF BUFFER CR.ACK: CLR (R0)+ INC R1 ;FINISHED CLEARING BNE CR.ACK ;NO CR.HEC: BIT #400,@#CR.CSR ;HOPPER EMPTY? BNE CR.HEM ;YES TST (SP)+ MOV CR,R0 BR CR.FRT ;;;;;;;;;;; ;;;;;;;;;;; CR.BP=224 CR.BUF=177162 CR.BU1=177164 CR.CSR=177160 CR.SAV=600 ; T[ 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 POINTER SUB BUFBGN,R5 ;LINE POSITION CMP R5,#\PFWORD,@#R.AD ;ADDRESS OF LINE/CHANNEL COMMAND WORD MOV #-1,@#R.WC ;ONLY ONE WORD MOV #4000,@#R.CM ;!!!!!COMMAND PRINT!!!!!! TST @#R.ST ;WAIT FOR DONE BEQ .-4 LPDE20: MOV R0,@#R.AD ;BUFFER START ADDRESS NEG R1 ;WORD COUNT IS NEGATIVE MOV R1,@#R.WC ;OUTPUT WORD COUNT MOV @#SWR,R0 ;GET SWITCH OPTIONS MOV R0,@#R.LF ;SET UP AUTO OR P/F MODE ]ARD 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.DB2,R1 ;GET COMPACTD INPUT TSTB @R0  ;IF FIRST C.C. ... BNE CR.CVT CMPB R1,#341  ;... LOOK FOR E.O.F. BEQ CR.EOF .IFDF BLANKS  ;FOR BLANK SUPPRESS ... CMPB^HE TABLES BELOW ARE ORDERED BY THE VALUE OF THE 8-BIT ; COMPRESSED CODE READ FROM THE HOLLERITH CARD COLUMN ;PARITY ASCII CONVERSION TABLE FOR IBM 029 KEYPUNCH .IFNDF ONLY26 CR.00: .BYTE 240 ;SPACE .BYTE 261 ;1 .BYTE 262 ;2 .BYTE 63 ;3 .BYTE 264 ;4 .BYTE 65 ;5 .BYTE 66 ;6 .BYTE 267 ;7 .BYTE 270 w24.  ;@ 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 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 ;WAS LAST MON BUF CHAR FORM FEED? BEQ LPEMTY ;NO:` SWAB R0 BIC #37777,R0 ;GET INTERRUPT ENABLE BITS BIS #4000,R0 ;SET 'START' BIT ;////////////////////////////////////////////////////////// MOV R0,@#R.CM ;!!!!!!!P R I N T!!!!!!!! ;////////////////////////////////////////////////////////// ; MOV #LPDI20,200 ;SET INTERRUPT VECTOR TO THE ROUTINE JSR PC,LPDC ;USE THIS TIME TO CREATE NEXT BUFFER ; ;------------------------------- ; ; NOW WE WAIT Ha R1,#377  ;... LOOK FOR SUPPRESS OFF BEQ CR.ZON CMPB R1,#376 ;OPTION TO SUPPRESS CC. 73-80? BEQ CR.EON ;YES:GO SET SWITCH .ENDC .IFNDF ONLY26&ONLY29 ;FOR DUAL PUNCH DRIVER ... CMPB R1,#267  ;... CHECK IF 029 CTL BEQ CR.029 CMPB R1,#330  ;... OR 026 CTL BEQ CR.026 .ENDC CR.CVT: CMPB #140,R1 ;IS CHAR [!]? BNE CR.CV1 ;NO MOVB #41,-(SP) ;YES:LOAD ASCII CODE... BR b ;8 .BYTE 240 ;EMPTY .BYTE 72 ;: .BYTE 243 ;# .BYTE 300 ;@ .BYTE 47 ;@ .BYTE 275 ;= .BYTE 42 ; .BYTE 71 ;9 CR.40: .BYTE 60 ;0 .BYTE 257 ;/ .BYTE 123 ;S .BYTE 324 ;T .BYTE 125 ;U .BYTE 126 c;24-NOV-71 ; MAG TAPE DIAGNOSTIC EXERCISER R0 = %0 ;REGISTER DEFS R1 = %1 R2 = %2 R3 = %3 R4 = %4 R5 = %5 SP = %6 ;STACK POINTER PC = %7 ;PROGRAM COUNTER PS = 177776 ;CPU STATUS SWR = 177570 ;CONSOLE SWITCHES TKS = 177560 ;TTY KB STATUS TKB = 177562 ;TTY KB BUFFER TKI = 60 ;TTY KB VECTOR TPS = 177564 ;TTY STATUS TPB = dERE UNTIL EITHER THE INTERRUPT COMES (IF ENABLED) ; ..OR UNTIL 'DONE' COMES UP (IF INTERRUPT NOT ENABLED). ; ERROR STOPS ARE PROVIDED FOR STATUS ERRORS, UNEXPECTED INTERRUPTS, ; OR NO RESPONSE AFTER A MAXIMUM ALLOWED TIME INTERVAL. LPDF10: MOV TIMOUT,TIMER ;SET MAXIMUM TIMER MOV @#R.ST,R1 ;FETCH STATUS BMI LPDF20 ;'DONE' IS UP!! COM R1 ;INVERT ALL BITS THAT SHOULD BE SET BIT #40002,R1 ;TEST BUSY e 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 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 If ;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 ;Z CR.100: .BYTE 55 ;- .BYTE 312 ;J .BYTE 113 g 177566 ;TTY BUFFER MTN = 167540 ;MAG TAPE WORD COUNT MTS = 167542 ;MAG TAPE STATUS MTC = 167544 ;MAG TAPE COMMAND MTA = 167546 ;MAG TAPE ADDRESS MTI = 200 ;MAG TAPE VECTOR BELL = 7 CR = 15 SPCE = 40 WRITBF = 1000 ;WRITE BUFFER BUFLTH = 5000 ;BYTE LENGTH OF EACH BUFFER READBF = WRITBF+BUFLTH ;READ BUFFER .ASECT .PAGE .=14000 hAND ON-LINE FOR SET BEQ LPDF70 ;BOTH ARE CLEAR ERR030: SCOPE ;ERROR: ONE OF THEM WAS NOT SET LPDF70: COM R1 ;BACK TO NORMAL BIT #34,R1 ;TEST FOR ERRORS OR READY BEQ LPDF80 ;GOOD: NONE IS SET ERR040: SCOPE ;ERROR:AT LEAST ONE OF ABOVE IS SET LPDF80: DEC TIMER ;WAIT FOR 'DONE' OR INTERRUPT BNE LPDF10 ;KEEP LOOPING CLR @#R.CM ;DISiNDEXING 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. 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? BEQ CR.EXT CR.BXT: BISB @PC,@R0  ;IF NOT SET UNDERWAY FLAG CR.CXT: MOj ;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 kMTEXER: ;BEGIN OF EXERCISER MOV #.,SP ;SET STACK POINTER CLR R0 ;PREPARE FOR SETTING VECTORS CLR R1 INITV: TST (R1)+ ;BUMP TO POINT TO STATUS WORD MOV R1,(R0)+ ;ALL VECTORS POINT TO .+2 CLR (R1)+ ;PUT HALT IN VECTOR+2 TST (R0)+ ;KEEP UP WITH R1 TSTB R0 ;LOW BYTE WILL CLEAR AT 400 BNE INITV MOV #MINT,@#MTI ;INIT MAG TAPE INTERRUPT lABLE INTERRUPT: TIMER IS ZERO ERR050: SCOPE ;ERROR: TIME'S UP: NO FINISH ; LPDF20: CLR @#R.CM ;DISABLE INTERRUPT BIT #40031,R1 ;TEST BUSY,PARITIES, AND LOW PAPER BEQ LPDF40 ;NONE UP: O.K. ERR060: SCOPE ;STATUS ERROR WITH 'DONE' LPDF40: TSTB @#SWR ;WAS THE 'DONE' INTERRUPT ENABLED? BPL LPDG00 ;NO: THIS IS THE CORRECT SEQUENCE MOV DONDLY,R3 ;ENABLED: WAIT FOR ImV 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) n ;R CR.200: .BYTE 246 ;& .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 ;o MOV #300,@#MTI+2;INIT VECTOR STATUS:LVL #6 MOV #TTYINT,@#TKI ;INIT TTY KBD INTERRUPT MOV #200,@#TKI+2;TTY LEVEL #4 .PAGE HALT: RESET ;FORCES STOP OF TAPE ON DEMAND ; ; DIALOG = . ;BEGIN OF DIALOGUE WITH OPERATOR MOV #100,@#TKS;ENABLE TTY KBD INTERRUPT MOV #MTEXER,SP;RESET STACK POINTER MOV #140,@#PS ;RELEASE LOCKOUT JSR PC,CRLF ;BEGIN OF DIALOG W/OPR CLRB CHRFG CLRB MINTFG pNTERRUPT... DEC R3 ;...FOR ADDITIONAL DELAY... BNE .-2 ;...BETWEEN 'DONE' AND INTERRUPT ERR070: SCOPE ;SHUCKS, INTERRUPT NEVER CAME ; ; ENTER HERE AFTER A SUCCESSFUL 'DONE' WITHOUT INTERRUPT ENABLED ; LPDG00: JSR PC,LPD.ST ;GO MAKE A COMPLETE STATUS CHECK FIRST ERR080: SCOPE ;STATUS ERROR RETURN BIT #4,@#SWR ;IS STALL SELECTED OUT FRONT? BEQ LPDG50 ;NOT TODq;... & 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  ;... 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 Nr( .BYTE 53 ;+ .BYTE 336 ; .BYTE 311 ;I CR.400: .ENDC ;PARITY ASCII CONVERSION TABLE FOR IBM 026 KEYPUNCH .IFNDF ONLY29 .IFDF ONLY26 CR.00: .ENDC .BYTE 240 ;SPACE .BYTE 261 ;1 .BYTE 262 ;2 .BYTE 63 ;3 .BYTE 264 ;4 .BYTE 65 ;5 .BYTE 66 ;6 s ;INIT TAPE INTERRUPT FLAG CLRB PPOS ;INIT FORMAT FLAG MOV #BELL,R4 INAGN1:CLRB MCODE ;INIT MNEMONIC SAVE LOC JSR PC,OCH MOV #'*,R4 JSR PC,OCH ;PRINT "*":REQUEST INPUT INAGN2:JSR PC,ICH ;GET MNEMONIC CHAR CMPB #CR,R4 ;RETURN? BEQ DOACT ;YES:GO DO FUNCTION MOVB R4,MCODE ;SAVE CHAR BR INAGN2 DOACT: MOV #LSIZE,R1 ;INIT SIZE OF MNE TABLE TSTB MCODE ;WAS CR FIRStAY ; STALL FOR A RANDOM # OF M-SECS BETWEEN 8 AND 1023. MOV SEED,R0 ;SEED (=RNUM(N-1)) ROL R0 ROL R0 ; X4 ADD DAMP,R0 MOV R0,-(SP) ;RNUM(N)=4*RNUM(N-1)+DAMP(N-1) ROL R0 ROL R0 ADD DAMP,R0 ROL R0 ROL R0 MOV R0,DAMP ;DAMP(N)=64*RNUM(N-1)+20*DAMP(N-1) ; RANDOM NUMBER NOW GENERATED AND ROUTINE READIED FOR NEXT TIME uOT 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)  ;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.IBv .BYTE 267 ;7 .BYTE 270 ;8 .BYTE 240 ;EMPTY .BYTE 137 ; .BYTE 275 ;= .BYTE 300 ;@ .BYTE 336 ; .BYTE 47 ;@ .BYTE 134 ;\ .BYTE 71 ;9 .IFDF ONLY26 CR.40: .ENDC .BYTE 60 ;0 .BYTE 257 ;/ .BYTE 123 ;S T CHAR? BNE DCMP ;NO ILEGAL:MOV #'?,R4 ;ILLEGAL CHAR BR INAGN1 ;GO BACK AND TRY AGAIN DCMP: CMPB MCODE,MNETAB(R1);IS THIS CHAR IN TABLE? BEQ FOUND ;YES: GO TO RTNE DEC R1 ;MORE? BGE DCMP ;KEEP LOOKING BR ILEGAL ;CHAR NOT IN TABLE FOUND: ASL R1 ;*2 TO INDEX WORDS MOV RTNETB(R1),PC;GO TO PROPER ROUTINE MNETAB:.ASCII 'LRFNCDAMSPE' ;LIST OF MNEMONICS ENDTAB:.EVEN LSIZE = x BIC #177007,(SP)+ ;MASK 10 .BYTE 246 ;& .BYTE 322 ;R .IFDF ONLY26 CR.200: .ENDC .BYTE 53 ;+ .BYTE 101 ;A .BYTE 102 ;B .BYTE 303 ;C .BYTE 104 ;D .BYTE 305 ;E .BYTE 306 ;F .BYTE 107 ;G .BYTE 110 ;H .BYIS ; 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 TEST? BNE PARIT1 OWN CMP SP,#LP.DGN-4 ;CHECK FOR PROPERLY-PUSHED STACK PNTR BEQ .+4 ;IT'S OK ERR100: SCOPE ;STACK ERROR CLR @#R.CM ;DISABLE THE DANG THING CMP (SP)+,(SP)+ ;POP STACK BACK TO NORMAL MOV @#SWR,R1 ;GET CONSOLE OPTIONS MOV @#R.ST,R2 ;FETCH STATUS BITB #300,R1 ;TEST FOR EITHER INTERRUPT ENABLED BNE LPDI30 ;ONE OR BOTH WERE ENABLED ERNORE CC.73-80 BR CR.EXT .ENDC ;READER NOT 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 PTE 240 ;EMPTY .BYTE 77 ;? .BYTE 56 ;. .BYTE 251 ;) .BYTE 355 ;] .BYTE 74 ;< .BYTE 41 ;! .BYTE 311 ;I .ENDC ;PARITY ASCII CONVERSION TABLE FOR 1108 FIELDATA KEYPUNCH CR.UNI: .BYTE 240 ;SPACE .BYTE 261 ;1 .BYTE 262 ;2 .BYTE 63 ;3 ;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 VFU CHANNEL #1 JSR R110: SCOPE ;VERY BAD: INTERRUPTED WHILE DISABLED LPDI30: BMI LPDI50 ;'DONE' WAS ENABLED ERR120: SCOPE ;ONLY INT ON ERROR, AND IT CAME IN LPDI50: BIT #40031,R2 ;TEST BUSY AND ERRORS BEQ LPDG00 ;TEST PASSED: NOW FOR FINAL PROCESSING ERR130: SCOPE ;AT LEAST ONE OF ABOVE IS SET ; ;------------------------------- ; ; THE FOLLOWING ARE SUBROUTINES USED IN DIAGNOSTIC ; ; SUBROUTINE: SELECTUNCH .IFNDF ONLY26 .BYTE 240  ;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 .BYTE 264 ;4 .BYTE 65 ;5 .BYTE 66 ;6 .BYTE 267 ;7 .BYTE 270 ;8 .BYTE 240 ;EMPTY .BYTE 246 ;& .BYTE 275 ;= .BYTE 047 ;@ .BYTE 072 ;: .BYTE 276 ;> .BYTE 300 ;@ .BYTE 71 ;9 .BYTE 60 ;0 PC,PRTONE ;GO OUTPUT IT CLRB FORMFD  ;RESET FLAG AFTER EJECT RTS PC PRTONE = . ;SUBRTNE TO PUT OUT ONE CHARACTER CLR @#R.LF ;MODETO FIRST-CHAR MOV #-1,@#R.WC ;ONE WORD MOV PC,-(SP) ;BUILD ADDRESS... ADD #ONECHR-.,(SP) ;...FOR THE ONE/CHARACTER WORD MOV (SP)+,@#R.AD ;LOAD MEMORY ADDRESS REG MOV #4000,@#R.CM ; START : NO INTERRUPT TST @#R.SS PROPER FIRST CHARACTER FOR NEXT LINE... ; ...AND FILLS BUFFER ACCORDING TO MODE SELECTED LPDC01: MOV BOUNDL,CURBND ;RESET BUFFER TO BOUNDARY LPDC: ADD #133.,CURBND ;CALC END OF NEW BUFFER CMP CURBND,BOUNDH ;HAVE WE GONE BEYOND LIMIT? BHI LPDC01 ;YES: GO RESET MOV CURBND,CURBUF ;NOW CALCULATE... SUB #133.,CURBUF ;...ADDRESS OF BUFFER BEGIN MOV CURBUF,R1 ;AND SET IT UP FOR ROUTINE MOVB 131  ;Y .BYTE 240  ;EMPTY .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  ;* .BYT .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 137 ;UNDERLINE (TTY LEFT ARROW) .BYTE 254 ;, .BYTE 050 ;( .BYTE 245 ;% .BYTE T ;WAIT FOR DONE BPL .-4 RTS PC WCSAVE: .WORD 0 SAVRTN: .WORD 0 CURBUF: .WORD 0 BUFBGN: .WORD 0 BUFEND: .WORD 0 MONCNT: .WORD 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 @#SWR+1,R0 ;CHARACTER IS IN UPPER SWITCH BYTE BIC #177600,R0 ;ONLY LOW 7 BITS (PARITY LATER) BNE LPDC10 ;IF NOT ZERO, USE CHARACTER THERE... MOVB SCHAR,R0 ;...ELSE USE SYNTHETIC CHARACTER... INCB SCHAR ;...AND KEEP BUMPING IT CMPB SCHAR,#140 ;KEEP BETWEEN 37 AND 140 BLT LPDC10 MOVB #40,SCHAR ; ; NOW FILL LINE BUFFER AND SET (OPTIONAL) PARITY BIT ; LPDC10: MOVB #16.E 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  ;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 "FIEL134 ;\ .BYTE 042  ;" .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 240 ;EMPTY - NOT DEFINED IN FIELDAT ,CNTR16 ;PREPARE FOR OPTIMUM SET (MAYBE) LPDC20: MOV R0,-(SP) ;LOAD FOR CALL TO PARITY JSR PC,GETPTY ;GO GET PARITY CALC'D (IF OPTION IS ON MOV (SP)+,R0 ;DONE: CHARACTER RETURNED ON STACK MOVB R0,(R1)+ ;PUT CHARACTER INTO BUFFER BICB #200,R0 ;CLEAR PARITY FOR NEXT TIME BIT #40,@#SWR ;IS OPTIMUM SET SELECTED? BNE LPDC80 ;YES BIT #20,@#SWR ;REPEAT SAME CHADATA" 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 FIELDATA ; ASCII PRINTED CARD CODE PUNCH ; CODE CHARACTER (OCTAL) CODE .BYTE 240 ; SPACE 0 BLANK .BYTE 261 ; 1 1 1 .BYTE 262 ; 2 2 A. .BYTE 44 ;$ .BYTE 252 ;* .BYTE 335 ;] .BYTE 273 ;; .BYTE 336 ;CIRCUMFLEX (TTY UP ARROW) .BYTE 322 ;R .BYTE 053 ;+ .BYTE 101 ;A .BYTE 102 ;B .BYTE 303 ;C .BYTE 104 ;D .BYTE 305 ;E .BYTE 306 ;F .BYTE M *|:M @5@5*$7 "  x 7  *Hewew  o*lt @ 5@$^ 5r*5  @@ 5*  J *&^ hdi uE1*W! W! 3W! W! BW!`*  S1) ݃˕w*D 2 RACTER DOWN LINE? BEQ LPDC70 ;YES LPDC30: INC R0 ;NO: GENERATE ENTIRE 64 CHAR SET CMPB R0,#140 ;HIT LAST CHAR IN SET? BLT LPDC70 ;NO MOV #40,R0 ;YES:RESET LPDC70: CMP R1,CURBND ;REACHED END OF THIS BUFFER? BLE LPDC20 ;NOT YET RTS PC ;ALL DONE: LETS GO HOME ; COME HERE WHEN BUILDING SPECIAL SET OF 16 OPTIMUM SET LPDC80: DECB CNTR16 ;COPYRIGHT 1971, DIGITAL EQUIPMENT COPR., MAYNARD, MASS. ;VERSION NUMBER: V001C ; ;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 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 ; 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 ; 107 ;G .BYTE 110 ;H .BYTE 240 ;EMPTY .BYTE 240 ;EMPTY - NOT DEFINED IN FIELDATA. .BYTE 56 ;. .BYTE 251 ;) .BYTE 333 ;[ .BYTE 074 ;< .BYTE 243 ;# .BYTE 311 ;I DEFALT=UNIVAC .END ;IS THIS SET OF 16 DONE? BNE LPDC30 ;NOT YET MOVB #16.,CNTR16 ;YES: RESET COUNT ADD #17.,R0 ;SKIP NEXT 16 CHRS CMP R0,#140 ;GONE PAST LAST CHAR? BLT LPDC70 ;NO SUB #100,R0 ;YES:RESET MODULO<40-140> BR LPDC70 ;GO SEE IF BUF IS FULL ; ;------------------------------- ; THIS IS THE ERROR STATUS CHECK MADE @ BEGIN AND AFTER EACH LINE LPD.ST: MOV @# 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-0-1 PUNCHED IN C.C. 1 ; ;  XXXXXXXXXXXXXXXXXXXXXXXXX ;  X   X ;  X  NOTES  X ;  X   X ;  XXXXXXXXXXXXXXXXXXXXXXXXX ; ; 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 SOURC: 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 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 0R.ST,-(SP) ;PUSH STATUS ONTO STACK BIT #140031,(SP) ;ARE ANY ERROR BITS SET? BNE LPDS50 ;YESSIR: GO FOR ERROR RETURN BIT #2,(SP) ;TEST ON-LINE BEQ LPDS50 ;ON-LINE NOT SET ADD #2,2(SP) ;BUMP RETURN ADDRESS FOR GOOD EXIT LPDS50: TST (SP)+ ;POP STATUS OFF STACK RTS PC ;TAKE EITHER ERROR OR GOOD RETURN ; ; THIS IS THE 'GET PARITY' SUBROUTINE. IT SETS/CLEARW! ('x*h ӕ קyD*W!5㨣 h1* 7 קx 8*7 pjwH7pkfw*b_ 7T*: 74  e$$@ -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 .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  .TITLE WHODER ;PROGRAM TO LIST ALL FILES OF ALL UICS ON DISK AND TO ;DISPLAY BIT MAPS ; VERSION OF MAY 23,1971  R0=%0  R1=%1  R2=%2  R3=%3  R4=%4  R5=%5  SP=%6  PC=%7  .GLOBL JULMOV  .CSECT ; ;INIT LINKS, FIND OUT WHAT DAY THIS IS, AND PRINT DIRECTORY MESSAGE INIT: MOV #DFLINK,-(SP) EMT 6 MOV #LPLINK,-(SP) EMT 6 MOV #103,-(SP) ;GET DATE AND LEAVE ON STACK EMT 41 MOV #TODAY,-(SP) ;BUFFS THE PARITY ; BIT IN THE 7-BIT CHARACTER WHICH IS ON TOP OF THE STACK ON ENTRY, ; BUT ONLY IF BIT SWITCH #15 ON THE CONSOLE IS SET. OTHERWISE ALL ; PARITY BITS WILL BE CLEAR, WHICH IS CORRECT FOR ABOUT HALF OF THEM GETPTY: TST @#SWR ;IS BIT SWITCH #15 SET? BPL GETPEX ;OPTION NOT SELECTED MOVB #7,PTYCNT ;WILL TEST SEVEN BITS CLRB PARITY ;WILL ACCUMULATE BIT COUNT HERE MOVB 2(SP),-(SP) ;CREATE WORKING CHA .TITLE DAYTIM ;GLOBAL SUBROUTINE TO DECODE MONITOR FORMAT DATE AND TIME INTO ;AN ASCII STRING ; VERSION OF MAY 23,1971 ;TO GET DAY CALL BY: ; MOV JULDAT,-(SP) ; JSR PC,JULDEC ;WHERE JULDAT IS MONITOR FORMAT JULIAN DATE. THE DATE WILL BE ;DECODED INTO A 9 CHARACTER ASCII STRING BEGINNING AT GLOBAL ;TAG DAY. ;FOR EITHER ENTRY,IF YOU WANT DAYTIME TO MOVE THE OUTPUT INTO ;YOUR OWN BUFFER FOR YOU, PUSH THE ADDREES OF YOUR BUFFER ONTO ;THE STACK AFTER THE TIME OR DATE .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 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 11ER ADDRESS JSR PC,JULMOV MOV #161,LPHEAD+4 MOV #DSKDIR,LPHEAD+6 JSR PC,LPRINT ;CONTROL LOOP FOR READING OF MFD JSR PC,DFTRAN ;GET FIRST MFD BLOCK MOV MFDBUF+4,MAPLNK ;LINK TO FIRST BIT MAP NEWMFD: MOV MFDBUF,TRAN ;PICK UP NEXT LINK BNE .+6 JMP ALLOUT  ;JUMP OUT IF NO MORE JSR PC,DFTRAN ;READ NEW MFD MOV #MFDBUF+2,R0 ;ADDRESS FIRST UIC MOV #-17,R5  ;15 UIC'S PER MFD BLOCK NEWUIC: MOV (R0)+,CURUIC RACTER GETP10: RORB (SP) ;SHIFT OFF LOW BIT ADCB PARITY ;ACCUMULATE DECB PTYCNT ;MORE BITS? BNE GETP10 ;MORE! TST (SP)+ ;;POP WORKING CHAR OFF STACK ASLB 2(SP) ;;POSITION CHAR TO ACCEPT PARITY BIT RORB PARITY ;LOAD 'C' WITH PARITY BIT RORB (SP) ;SHIFT PARITY BIT INTO CHARACTER GETPEX: RTS PC ;BACK WITH CHARACTER ON TOP OF & :((x9P @ @ S,EE,:  -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 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;UIC BNE UICLST  ;IF NOT ZERO WE HAVE ONE TST (R0)+  ;BYPASS POINTER MORUIC: CMP (R0)+,(R0)+ ;ADVANCE INC R5  ;PICK UP NEXT UIC IF BMI NEWUIC  ;THERE IS ONE BR NEWMFD ;CONTROL LOOP FOR EACH UIC UICLST: CLR UICTOT  ;RESET UIC BLOCK COUNTER MOV #UFDBUF,TRAN+2 ;UFD HAS OWN BUFFER CLR -(SP) ; CLEAR TOP OF STACK FOR BYTE. ***** EPL MOVB CURUIC,(SP) ; PUT CURRENT UIC ON STACK TO DECODE ***** EPL STACK ; ; ; THE FOLLOWING SUBROUTINE IS A BASIC 1-MILLISECOND DELAY. ; IT LOOPS FOR 'N' MILLISECONDS, WHERE 'N' IS THE NUMBER ON TOP ; OF THE STACK ON ENTRY. THE STACK IS CLEARED BEFORE EXIT. ; DELAY: MOV 2(SP),-(SP) ;PUT 'N' FORWARD MOV 2(SP),4(SP) ;PUT RETURN ADDRESS BACK ONE WORD DELAY1: MOV #132.,2(SP) ;BASIC DELAY FOR 1 M-SEC DELAY2: DEC 2(SP) ;COUNT IT, MAN BNE DELAY2 ;KEEP GOING... DEC (SP)  &,^@ @ 06 @ &0,"@ 0"" @" &0F.0 7X 0X"( .̀00 v7k 7iփ0 0(փ, 007 ~Y  00,~ ~0HR7 &7 ,7 ENDTAB-MNETAB-1 ;SIZE OF MNEMONIC TABLE RTNETB:.WORD LOC,RECNT,FILECT,WORDCT,COMMND,DATAIN .WORD AUTO,MANUAL,STATUS,PARAMS,ERRSET .PAGE AUTO: MOV @#SWR,R1 ;AUTOMATIC WRITE AND READ CHECK BIC #146777,R1;GET UNIT # & INT. ABLE BITS MOV R1,UNITNO ;SAVE IT CLRB WRTCTR ;INIT COUNTER REWIND:MOV UNITNO,EXCOM INCB EXCOM+1 ;FORM REWIND COMMAND JSR PC,EXEC ;DO IT MOV UNITNO,EXCOM INC EXCOM ;FORM 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 202 12-2 .BYTE 303 ; C 203 12-3 .BYTE 104 ; D 204 12-4 .BYTE 305 ; E 205 12-5 .BYTE 306 ; F 2 ;THIS IS THE # OF M-SECS TO DELAY BNE DELAY1 ;OUTER LOOP STILL HOT CMP (SP)+,(SP)+ ;POP 'N' AND LOCAL COUNTER OFF STACK RTS PC ;GO BACK ; ; ; THIS IS THE SCOPE ROUTINE. IF BIT SWITCH #3 IS NOT SET, ANY ; ERROR WILL CAUSE STOP HERE, WITH STATUS DISPLAYED IN "DATA" LIGHTS. ; IF THE SWITCH IS SET, ALL ERRORS WILL FALL THROUGH HERE, AND ; THE DIAGNOSTIC WILL CONTINUE IN SPITE OF THEM ; SCOPEI: CMP (SP)+,(SP)+ MOV #UICU-3,-(SP) MOV #5,-(SP) EMT 42 CLR -(SP) ; CLEAR TOP OF STACK FOR BYTE. ***** EPL MOVB CURUIC+1,(SP) ; PUT GROUP # ON SATCK TO DECODE ***** EPL MOV #UICG-3,-(SP) MOV #5,-(SP) EMT 42 MOVB #54,UICU-1 MOVB #12,UICG-1 MOVB #12,UICG-2 MOV #11,LPHEAD+4 MOV #UICG-2,LPHEAD+6 JSR PC,LPRINT MOV (R0)+,TRAN ;SET TRAN FOR FIRST UFD BEQ ENDUIC NEWUFD: JSR PC,DFTRAN ;READ IN UFD BLOCK MOV #UFDBUF+2,R1  READ COMMAND TST @#SWR ;IS READ-ONLY BIT SET? BPL EXECAL ;YES DECB WRTCTR ;NO BITB #1,WRTCTR ;IS THIS A WRITE CYCLE BEQ EXECAL ;NO INC EXCOM ;SET TO WRITE EXECAL:JSR PC,EXEC ;GO READ OR WRITE BR REWIND ;NOW REWIND .PAGE MANUAL:MOV @#SWR,R1 ;DO ONE COMMAND SEQUENCE BIC #146777,R1;GET UNIT # & INT. ABLE BITS MOV COMAND,R2 ;GET COMMAND BITS BIC #175000,R2;MASK06 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 ; ) 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 ;IT IS ENTERED BY EMT: POP STACK BIT #10,@#SWR ;IS BIT SWITCH # O SET? BEQ SCOPE1 ;NO: THEN HALT SCOPE2: JMP LPDD ;IS SET: THEN CONTINUE SCOPE1: MOV @#R.ST,R0 ;DISPLAY STATUS IN LIGHTS STOP03: HALT ;FIRST HALT TO DISPLAY STATUS MOV -4(SP),R0 ;NOW SHOW THE ADDRESS OF THE ERROR STOP04: HALT ;...DURING THE SECOND HALT BR SCOPE2 ;GO AGAIN AFTER 'CONTINUE' ; ;ADDRESS OF FIRST FILENAME MOV #-7,R4  ;7 FILES PER BLOCK NEWFIL: TST (R1)  ;ANYBODY IN THAT SLOT BNE FILLST  ;IF SO LIST HIM ADD #22,R1  ;IF NOT ADVANCE TO NEXT SLOT MORFIL: INC R4 BMI NEWFIL MOV UFDBUF,TRAN ;IF NO MORE SLOTS GET LINK TO BNE NEWUFD  ;NEXT UFD BLOCK AND IF NO MORE MOV #10,LPHEAD+4 MOV #UICG-1,LPHEAD+6 JSR PC,LPRINT ENDUIC: MOV UICTOT,-(SP) ;DECIMAL COUNT FOR THIS UIC MOV #COUNT,-(SP) MOV #3,-(SP) EMT 42 MOV #32,LPHEA OUT UNIT & INT ABLE BITS BIS R1,R2 ;PUT IN UNIT # MOV R2,EXCOM ;LOAD EXEC COMMAND WORD JSR PC,EXEC ;EXECUTE COMMAND JSR R5,ONCH ;GOOD EXIT: PRINT "DONE" ;NO RETURN IF ERROR .WORD DONE .WORD 6 DMPSTA:BIT #1,@#SWR ;TEST STATUS DUMP OPTION BEQ DIALOG ;NOT SELECTED JMP STATUS ;GO DUMP STATUS FIRST ; DONE: .ASCII / DONE / .PAGE EXEC = . ;THIS IS THE EXECUT 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 CHARACTERS. .ENDC ;INTERNAL BUFFER FOR BINARY STORAGE: .IFDF BINARY CR.BUF: .IFNDF MARKS CR.BSZ=120. .ENDC .IFDF MARK ; BYTLST = . ;LIST OF PARAMETER BYTES... ; ...LOADED AT BEGIN OF RUN PFCHAR: .BYTE 0 ;HOLDS PAPER-FEED CHARACTER, IF ANY COUNT: .BYTE 0 ;HOLDS WORD COUNT FOR LINE WIDTH PAGE: .BYTE 0 ;HOLDS NUMBER OF LINES PER PAGE HOMECH: .BYTE 0 ;HOLDS CHANNEL # FOR TOP-OF-FORM, SPEED: .BYTE 0 ;HOLDS MINIMUM DELAY AFTER PRINT CNTR16: .BYTE 0 ;COUNTER FOR OPTIMUM SD+4 MOV #TOTOUT,LPHEAD+6 JSR PC,LPRINT BR MORUIC  ;GO BACK FOR NEXT UIC ;ROUTINE TO PRINT OUT ALL INFORMATION FOR A GIVEN FILE FILLST: MOV (R1)+,-(SP) ;UNPACK FILENAME MOV #FIL,-(SP) MOV #1,-(SP) EMT 42 MOV (R1)+,-(SP) MOV #NAM,-(SP) MOV #1,-(SP) EMT 42 MOV (R1)+,-(SP) MOV #EXT,-(SP) MOV #1,-(SP) EMT 42 MOVB #114,TYPE ;SET TYPE TST (R1) BPL .+10 MOVB #103,TYPE MOV (R1)+,-(SP) ;DECODE DATIVE SUBROUTINE MOVB NFILES,XFILES ;INIT FILE CTR MOV #WRITAD,XADDR;SET FOR WRITE BUFFER BIT #1,EXCOM ;READ? BEQ NEWFILE ;NO: WRITE MOV #READAD,XADDR;NOW POINT TO READ NEWFIL:MOV NRECS,XRECS ;INIT RECORDS CTR CALDRV:JSR R5,MDRIVE ;CALL DRIVER BR EXEC02 .WORD EXCOM ;COMMAND SET UP PRIOR XADDR: .WORD 0 ;WRITE OR READ BUFR .WORD XCOUNT ;HOLDS #WDS/RECORD EXEC02:BIT #1,EXCOM 0HR`,:2@  $w(~0 ,^el`~l"`0ZHH7 n~w :Z ZHH*ZG,RR N~w  <~w7 <~ R R5,΁j"~-v?zE j.~dHH7 ~w t}ndET LINENO: .BYTE 0 ;CURRENT LINE NUMBER PARITY: .BYTE 0 ;USED TO CALC CHARACTER PARITY PTYCNT: .BYTE 0 ;...ALSO SCHAR: .BYTE 0 ;SYNTHETIC FIRST CHARACTER WDCNT: .BYTE 0 ;WORD COUNT (LINE WIDTH) .EVEN PFWORD: .WORD 0 ;HOLDS P/F CHAR FOR T-O-F IN AUTO MODE BOUNDL: .WORD 400 ;LOWER BUFFER BOUNDARY BOUNDH: .WORD LP.DGN-37 ;UPPER BUFFER BOUNDARY CURBUF: .WORD 0 S CR.BSZ=60. .ENDC .=.+CR.BSZ .ENDC .END ;WAS IT READ? BEQ MORECS ;NO: NO TEST MOV WRITAD,R1 ;YES: COMPARE BUFFERS MOV READAD,R2 MOV XCOUNT,R5 ;# OF WORDS IN RECORD TO COMPAR .PAGE XLOOP1:DEC R5 ;REACHED END? BMI MORECS ;YES CMP (R1)+,(R2)+ ;COMPARE LIST ENTRY BEQ XLOOP1 ;AGREE JSR PC,CRLF ;BEGIN NEW LINE FOR PRINTOUT MOV R1,R4 ;CURRENT ADDRESS + 2 SUB WRITAD,R4 ;GET OFFSET + 2 E BIC #170000,(SP) ;CLEAR CHARACTER BITS MOV #DATE,-(SP) JSR PC,JULMOV MOV (R1)+,-(SP) ;OCTAL MODE WORD MOV #MODE,-(SP) MOV #5,-(SP) EMT 42 MOV (R1)+,-(SP) ;OCTAL STARTING BLOCK MOV #START,-(SP) MOV #5,-(SP) EMT 42 MOVB #40,START ADD (R1),UICTOT ;UPDATE TOTAL UIC COUNT ADD (R1),ALLTOT ;AND TOTAL DISK COUNT MOV (R1)+,-(SP) ;DECIMAL BLOCK COUNT MOV #LENGTH,-(SP) MOV (SP),R3 MOV #3,-(SP) EMT 42 CMPB (R3),#60 BNE .+10 ;BEGINNING OF CURRENT BUFFER CURBND: .WORD 400+133. ;END OF CURRENT BUFFER TIMOUT: .WORD 3200. ;# OF 31-MICROSEC WAIT-LOOPS FOR INT TIMER: .WORD 0 ;USED TO TIME IT OUT DONDLY: .WORD 202. ;WAIT AFTER 'DONE' FOR INT: 1 MILLISEC DAMP: .WORD 1233 ;FIRST TERM FOR RANDOM # GENERATOR SEED: .WORD 7622 ;FIRST SEED FOR ABOVE .END AND JSR TO TICMOV OR ;JULMOV. R0=%0 R1=%1 R2=%2 R3=%3 R4=%4 R5=%5 SP=%6 PC=%7 .GLOBL JULDEC,JULMOV .GLOBL DAY .CSECT ;SET UP RETURN ADDRESS, TRANSFER PARAMETERS, AND ARGUMENTS FOR ;THE VARIOUS ENTRIES AND SAVE REGISTERS USED JULMOV: MOV (SP)+,EXDEC+2 MOV (SP)+,YORBUF ;SET UP TRANSFER PARAMETERS MOV #DAY,MYBUF MOV #-12,NOCHAR BR JULDEC+4 JULDEC: MOV ( TST -(R4) ;GET CURRENT OFFSET JSR PC,PRINT MOV -2(R1),R4 ;GET CONTENTS OF WRITE BUFFER JSR PC,PRINT MOV -2(R2),R4 ;GET CONTENTS OF READ BUFFER JSR PC,PRINT BR XLOOP1 ; PRINT: JSR PC,PRTNUM JSR PC,FORMAT RTS PC .PAGE MORECS = . ;HERE AFTER COMPLETION OF COMMAND BIT #4,EXCOM ;CHECK FOR FILE MARK COMMAND BNE FILMRK ;YES: ALREADY DID IT .TITLE TAPDSK ; ; PROGRAM TO RESTORE RF11 DISK FROM DECTAPES ; THE ENTIRE 256K PLATTER WILL BE WRITTEN IN ABSOLUTE BINARY ; FORMAT FROM TWO DECTAPES ; EACH ADDITIONAL AVAILABLE PLATTER WILL BE WRITTEN ON ; SUCCESSIVE PAIRS OF DECTAPES ; ; RUNNING SEQUENCE: ; ; 1. MOUNT FIRST TWO SAVED DECTAPES ON DRIVES 0 AND 1 ; 2. RUN TAPDSK PROGRAM ; 3. AFTER THE FIRST PLATTER IS WRITTEN A HALT WILL ; 4. FOR EACH ADDITIONAL PLATTER MOUNT NEXT TWO DECTAPE ; ON DRIVES 0 AND 1 AND MOVB #40,(R3)+ BR .-12 MOV (R1)+,-(SP) ;OCTAL LAST BLOCK MOV #LAST,-(SP) MOV #5,-(SP) EMT 42 MOVB #40,LAST MOV (R1)+,-(SP) ;OCTAL PROTECT CODE MOV #PRO-3,-(SP) MOV #5,-(SP) EMT 42 MOVB #40,PRO-1 MOVB #40,PRO-2 MOVB #40,PRO-3 MOV #110,LPHEAD+4 ;SPIT IT ALL OUT MOV #TYPE-4,LPHEAD+6 JSR PC,LPRINT BR MORFIL ;PRINT TOTAL BLOCK COUNT FOR ALL UICS ALLOUT: MOV #11,LPHEAD+4 MOV #ALLUIC,LPHEAD+6 JSR PC,L BIT #313,EXCOM;CHECK FOR PER-RECORD COMMAND BEQ MOREFILES;NOT A PER-RECORD COMMAND DEC XRECS ;ANY MORE RECORDS? BNE CALDRV ;YES: GO DO THEM BIT #12,EXCOM ;WAS LAST COMMAND WRITE? BEQ MOREFILES ;NO:DON'T WRITE E-O-F BIT #40000,@#SWR;IS E-O-F OPTION SELECTED ? BEQ MOREFILES ;NO:NO WRITE E-O-F MOV EXCOM,R0 ;CURRENT COMMAND BIC #146777,R0 ;LEAVE INTRT ABLE & UNIT SELECT B PRESS CONTINUE ; R0=%0 R1=%1 R2=%2 R3=%3 R4=%4 R5=%5 SP=%6 PC=%7 ; ; INIT DISK AND CLEAR COUNTERS ; START: MOV #DLK,-(SP) ;INIT DISK EMT 6 CLR R0 ;R0 IS DISK BLOCK INDEX CLR R1 ;R1 IS TAPE DRIVE SWITCH ; ; COPY ONE-HALF PLATTER FROM DECTAPE ; COPY: CLRB TLK+5 ;PRESET DRIVE 0 BIT #1,R1 ;IS IT REALLY DRIVE 0? BEQ .+6 ;YUP INCB TLK+5 .TITLE DSKTAP ; ; PROGRAM TO SAVE RF11 DISK ON DECTAPES ; THE ENTIRE 256K PLATTER WILL BE WRITTEN IN ABSOLUTE BINARY ; FORMAT ON TWO DECTAPES ; EACH ADDITIONAL AVAILABLE PLATTER WILL BE WRITTEN ON ; SUCCESSIVE PAIRS OF DECTAPES ; ; RUNNING SEQUENCE: ; ; 1. MOUNT TWO FORMATTED DECTAPES ON DRIVES 0 AND 1 ; 2. RUN DSKTAP PROGRAM ; 3. AFTER THE FIRST PLATTER IS WRITTEN A HALT WILL ; 4. FOR EACH ADDITIONAL PLATTER MOUNT TWO MORE DECTAPE ; ON DRIVES 0 AND 1 AND PRESS COPRINT MOV ALLTOT,-(SP) MOV #COUNT,-(SP) MOV #3,-(SP) EMT 42 MOV #32,LPHEAD+4 MOV #TOTOUT,LPHEAD+6 JSR PC,LPRINT ; PRINT BIT MAPS CLR R5  ;BLOCK COUNT MOV #103,-(SP) EMT 41  ;GET DATE AGAIN MOV #MAPDAT,-(SP) JSR PC,JULMOV MAPOUT: MOV MAPLNK,TRAN ;LINK TO NEXT MAP BEQ EXIT  ;EXIT WHEN DONE JSR PC,DFTRAN MOV TRAN+2,R0 ;BUFFER ADDRESS MOV (R0)+,MAPLNK ;NEXT LINK TST (R0)+  ;MAP NUMBER MOV (R0)+IS #4,R0 ;SET WRITE FILE MARK MOV R0,EOFCOM ;CREATE CORRECT E-O-F COMMAND WRTEOF:JSR R5,MDRIVE ;WRITE FILE MARK BR MOREFILES .WORD EOFCOM ; MOREFI = . ;CHECK FOR MORE NON-SPACE ;RECORD OR FILE COMMANDS BIT #73,EXCOM BEQ EXRTN ;NOT RECORD OR FILE COMMAND FILMRK: ;DONE WRITING FILE MARK DECB XFILES ;MORE FILES? BNE NEWFILE ;YES EXRTN: RTS ;RESET FOR DRIVE 1 MOV #TLK,-(SP) ;THE BIGGE INIT EMT 6 CLR R2 ;R2 IS TAPE BLOCK INDEX CLP: MOV R2,TRN ;SET TAPE BLOCK MOV #TRN,-(SP) ; AND READ MOV #TLK,-(SP) EMT 10 MOV #TLK,-(SP) ;WAIT EMT 1 MOV R0,DRN ;SET DISK BLOCK MOV #DRN,-(SP) ; AND WRITE MOV #DLK,-(SP) EMT 10 MOV #DLK,NTINUE ; R0=%0 R1=%1 R2=%2 R3=%3 R4=%4 R5=%5 SP=%6 PC=%7 ; ; INIT DISK AND CLEAR COUNTERS ; START: MOV #DLK,-(SP) ;INIT DISK EMT 6 CLR R0 ;R0 IS DISK BLOCK INDEX CLR R1 ;R1 IS TAPE DRIVE SWITCH ; ; COPY ONE-HALF PLATTER ONTO DECTAPE ; COPY: CLRB TLK+5 ;PRESET DRIVE 0 BIT #1,R1 ;IS IT REALLY DRIVE 0? BEQ .+6 ;YUP INCB TLK+5 ;RESET F,R4 ;MAP SIZE MAPWRD: TST (R0)+  ;ADVANCE TO NEXT MAPWORD MOV #-100,R3 ;64 BITS PER LINE MOV #BITMAP,R1 ;FORMATTED LINE BUFFER FORMAP: MOVB #60,(R1) ;SET ZERO ROR (R0)  ;DROP MAP BIT IN CARRY BCC .+10  ;LEAVE 0 AND FREEB IF OPEN INCB (R1) DEC FREEB INC R1 INC R3 BPL MAPPRT  ;PRINT AFTER 64 BITS BIT #7,R3  ;SPACE AFTER EVERY 8 BNE FORMAP MOVB #40,(R1)+ BIT #17,R3  ;NEW MAP WORD EVERY 16 BITS BNE FORMAP TST (R0)+ BR FORMA PC ;EXIT EXEC ROUTINE .PAGE ; MAG TAPE DRIVER ; ; CALLING SEQUENCE ; JSR R5,MDRIVE ; BR NEXT ; .WORD A(COMMAND) ; .WORD A(MEM ADDR) ; .WORD A(COUNT) ; ;THIS IS THE MAG TAPE DRIVER ROUTINE MDRIVE:CLR R3 ;RESET ERROR NUMBER MOV @2(R5),R1 ;COMMAND BIC #147777,R1 ;UNIT # CMP R1,CURUNT ;SAME AS PREVIOUS? BNE MDRV02 ;NO MDRV01:CLRB EXSWCH ;NORM EXIT SWITCH -(SP) ;WAIT EMT 1 ADD #128.,R0 ;BUMP DISK BLOCK INDEX ADD #32.,R2 ;BUMP TAPE BLOCK INDEX BIT #3777,R0 ;END OF HALF-PLATTER BNE CLP ; IF MODULO 2048 BLOCKS ; ; END OF HALF-PLATTER ; BUMP DRIVE SWITCH AND CHECK FOR END OF PLATTER ; INC R1 ;BUMP TAPE DRIVE SWITCH BIT #1,R1 ;CHECK FOR DRIVE 0 AGAIN BNE COPY ;BACK TO WRITE DRIVE 1 OR DRIVE 1 MOV #TLK,-(SP) ;THE BIGGE INIT EMT 6 CLR R2 ;R2 IS TAPE BLOCK INDEX CLP: MOV R0,DRN ;SET DISK BLOCK MOV #DRN,-(SP) ; AND READ MOV #DLK,-(SP) EMT 10 MOV #DLK,-(SP) ;WAIT EMT 1 MOV R2,TRN ;SET TAPE BLOCK MOV #TRN,-(SP) ; AND WRITE MOV #TLK,-(SP) EMT 10 MOV #TLK,-(SP) E 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:- ; ;  12-0-7-9 = '029' CODES FOLLOW ;  12-11-8-9 = '026' CODES FOLLOW ; ; 2) IF PARAMETER MOV CURUNT,@#MTC;SELECT UNIT IN CASE RESET JSR PC,DELAY ;MUST WAIT BEFORE STATUS CHECK BIT #100,@#MTS ;CTRLR BUSY? BNE ERR2 ;YES BIT #200,@#MTS ;READY? BEQ ERR3 ;NO BIT #16,@2(R5) ;WRITE REQUEST? BEQ MDRV06 ;NO: NO FPT CHECK BIT #1,@#MTS ;WRITE PROTECT? BNE ERR4 ;YES .PAGE MDRV06: RESET ;CLEAR ALL REGISTER BITS BIT #13,@2(R5 ; ; END OF PLATTER - HALT FOR MAYBE ANOTHER PLATTER ; HALT BR COPY ; ; THE GOOD-TIME MAN IS HERE ; .WORD 0 TLK: .WORD 0 .RAD50 /TAP/ .WORD 1 .RAD50 /DT/ .WORD 0 DLK: .WORD 0 .RAD50 /DSK/ .WORD 1 .RAD50 /DF/ TRN: .WORD 0 .WORD BUFF .WORD 8192. .WORD 4 .WORD 0 DRN: .WORD 0 .WORD BUFF .WORD 8192. .WO ;WAIT EMT 1 ADD #128.,R0 ;BUMP DISK BLOCK INDEX ADD #32.,R2 ;BUMP TAPE BLOCK INDEX BIT #3777,R0 ;END OF HALF-PLATTER BNE CLP ; IF MODULO 2048 BLOCKS ; ; END OF HALF-PLATTER ; BUMP DRIVE SWITCH AND CHECK FOR END OF PLATTER ; INC R1 ;BUMP TAPE DRIVE SWITCH BIT #1,R1 ;CHECK FOR DRIVE 0 AGAIN BNE COPY ;BACK TO WRITE DRIVE 1 ; ; END"BLANKS" IS DEFINED, C.C. 73-80 ; & TRAILING SPACES BEFORE THESE WILL BE DISCARDED, ; WITH 'CR-LF' FOLLOWING LAST VALID DATA, PROVIDED ; THAT CARD FILE IS PRECEDED BY CTL CARD WITH ; 12-11-0-7-8-9 PUNCHED IN C.C. 1. IN THIS CASE ; HOWEVER, IF THE USER BUFFER IS 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 PACKED FORM WILL BE TRANSFERRED TO THE USER ; BUFFER UNTIL THIS IS FILLED, ANY DATA THEN REMAINING ; IN THE INTERNAL BUFFER BEING D COUNTER REG MDRV03:MOV @2(R5),R0 ;FETCH COMMAND WORD FROM LIST MDRV3A:MOV R0,R2 ;TEMPORARY SWAB R2 BIC #177775,R2;GET INT ABLE BIT MOVB R2,MINTFG ;SAVE (EITHER 10 OR 0) CLR @#MTS ;STATUS REG RESET ;****************************************************** MOV R0,@#MTC ;LOAD COMMAND REGISTER: ;INITIATES TAPE OPERATION ;****************************************************** JSR PC,DELAY ;MUST WAIT BEFP MAPPRT: BIT #3777,R5 ;NEW PAGE EVERY 32 LINES BNE .+22 MOV #35,LPHEAD+4 MOV #MAPMES,LPHEAD+6 JSR PC,LPRINT MOV R5,-(SP) ;OCTAL BLOCK NUMBER MOV #BLKNO,-(SP) MOV #5,-(SP) EMT 42 MOV #122,LPHEAD+4 MOV #MAPLIN,LPHEAD+6 JSR PC,LPRINT MORMAP: ADD #100,R5 BIT #17777,R5 ;IS THIS THE END OF THE LINE? BEQ FINMAP SUB #4,R4  ;USE 4 WORDS PER LINE BGT MAPWRD BR MAPOUT FINMAP: MOV FREEB,-(SP) ;NOW COMPUTE REAL FREE COUNT MOV #FCOUNT,- .WORD 0 BUFF: .WORD 0 .=.+16384. .END START >>@>8}.>?  7[5Q? R? *>??7H$???e*>e 5 58} ]"?.? .? A>ORE CHECKING STATUS .PAGE MDRV05: BIT #1000,@2(R5) ;INTRPT ABLED? BEQ BUSYCK ;NO: CHECK BUSY LOADCK: ;LOAD-POINT CHECK BIT #2,@#MTS ;AT LOAD POINT? BNE BUSYCK ;YES: WAIT FOR BUSY TO CLEAR TSTB MINTFG ;INTRPT ABLED: WATCH FLAG BNE LOADCK ;NO INTRPT YET: CHECK LOAD POINT AGAIN EXIT: TSTB EXSWCH ;EXIT OR RETURN? BNE MDRV01 ;BA(SP) MOV #3,-(SP) EMT 42 MOVB #40,FCOUNT MOV #20000,-(SP) SUB FREEB,(SP) MOV #UCOUNT,-(SP) MOV #3,-(SP) EMT 42 MOVB #40,UCOUNT MOVB #40,UCOUNT-1 MOVB #40,UCOUNT-2 MOVB #40,MAPMES+2 MOVB #40,MAPMES+3 MOVB #12,MAPMES ;NO PAGE EJECT MOV #103,LPHEAD+4 MOV #MAPMES-2,LPHEAD+6 JSR PC,LPRINT EXIT: EMT 60 DFTRAN: MOV #TRAN,-(SP) MOV #DFLINK,-(SP) EMT 10 MOV #DFLINK,-(SP) EMT 1 RTS PC LPRINT: >>@>8}.>?  7[5Q? 7\$?y*>??>???e*>e 5 58} ]"?.? .? A>& :(`.  P "="&"(,&>ߵy  xȗxЋ J >,J l5 BcCK AFTER NEW UNIT SELECT MOV @#MTS,STAT;SAVE STATUS BIT ERRPAT,STAT;SEE IF ANY ACTIVE ERRORS BNE ERR5 ;YES:OPERATOR MUST DUMP STATUS RTS R5 ;EXIT DRIVER ; BUSYCK:BIT #100,@#MTS;CHECK "BUSY" BIT BNE BUSYCK ;STILL BUSY BR EXIT ;BUSY BIT IS CLEARED ; DELAY: MOV #20,R0 ;MUST WAIT SHORT TIME BEFORE DEC R0 ;MAKING FIRST CHECK ON STATUS BNE .-2 RTS PC ; MDRV02:BITMOV #LPHEAD,-(SP) MOV #LPLINK,-(SP) EMT 2 MOV #LPLINK,-(SP) EMT 1 RTS PC .WORD 0 TOLINK: .WORD 0 .RAD50 /TTO/ .WORD 1 .RAD50 /KB/ .WORD 0 TILINK: .WORD 0 .RAD50 /TTI/ .WORD 1 .RAD50 /KB/ .WORD 0 DFLINK: .WORD 0 .RAD50 /DFG/ .WORD 1 .RAD50 /DF/ .WORD 0 LPLINK: .WORD 0 .RAD50 /LPO/ .WORD 1 .RAD50 /LP/ TRAN: .WORD 1 .WORD MFDBUF .WORD 100 .WORD 4 .WORD 0 LPHEAD: .WORD 200 .WORD 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 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 R,n6 xB,5  ȝ2@5,$vxof,BÝ^E X J. "J,   _ B r,"E?U A \,F5@A 5  5@,j   65,@ @ m& #100,@#MTS;TEST CTRLR STATUS "BUSY" FLAG BNE ERR1 ;OLD UNIT STILL BUSY INCB EXSWCH ;SET SWITCH TO RE-ENTER ROUTINE MOV @2(R5),R0 ;AFTER NEW SELECT BIC #146777,R0 ;GET NEW UNIT # & INT ABLE MOV R0,R1 BIC #147777,R1 MOV R1,CURUNT ;SAVE NEW UNIT # BR MDRV3A ;NOW SELECT UNIT .WORD ,,,,,,,,,, ;PATCH SPACE ; ; ERR5: INC R3 ;MASKED ERROR(S) FOUND AT COMPLETIOM ERR4: INC R3 6 .WORD 0 .WORD 0 ; BUFFERS MFDBUF: .=.+200  ;MFD BUFFER UFDBUF: .=.+200  ;UFD BUFFER CURUIC: .WORD 0  ;CURRENT UIC MAPLNK: .WORD 0  ;LINK TO NEX MAP UICTOT: .WORD 0  ;BLOCKS FOR THIS UIC ALLTOT: .WORD 0  ;TOTAL DISK BLOCKS FREEB: .WORD 20000 ;FREE BLOCK COUNT ; FORMATS DSKDIR: .BYTE 14,11,11,11,40,40,40 .ASCII /DISK DIRECTORY / TODAY: .=.+11 .BYTE 12,12 .ASCII / UIC T FILNEAD 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. ;  XXXXXXXXXXXXXXXXXXXXXXXXX ;  X   X ;  X  NOTE  X ;  X   X ;  XXXXXXXXXXXXXXXXXXXXXXXXX ; ; PARAMETER DEFINITIONS CAN BE MADE DU@ @ m@ @ 7E, L w wzvE 0w ,wf %! "/,`5@26,e*-& ,BE ׭` j,f& hŀ5 5 `, w 胦6 e , `@5@5e !, ;FILE PROTECT VIOLATION ERR3: INC R3 ;CONTOLLER NOT READY ERR2: INC R3 ;CONTROLLER BUSY ERR1: INC R3 ;OLD UNIT BUSY ON NEW SELECT ADD #60,R3 ;FORM ERROR NUMBER IN ASCII JSR PC,PRTERR ;GO PRINT ERROR MESSAGE JMP DMPSTA ;SEE IF STATUS DUMP BEFORE EXIT ; ; PRTERR:JSR PC,CRLF ;PRINT ERROR MESSAGE JSR R5,ONCH .WORD ERRBUF .WORD 4 MOV R3,R4 JSR PC,OCH ; GO PRINT ERROR NUMBAM.EXT DATE MODE / .ASCII / START DLONG LAST PRO/ .=.+3 UICG: .=.+3 .BYTE 54 UICU: .=.+3 .BYTE 15,11,40,40 TYPE: .BYTE 0 .BYTE 40,40,40 FIL: .=.+3 NAM: .=.+3 .BYTE 56 EXT: .=.+3 .BYTE 40,40,40 DATE: .=.+11 .BYTE 40,40,40 MODE: .=.+6 .BYTE 40,40,40 START: .=.+6 .BYTE 40,40,40 LENGTH: .=.+5 .BYTE 40,40,40 LAST: .=.+6 .BYTE 40,40,40 PRO: .=.+3 .BYTE 12 TOTOUT: .ASCII / TOTAL BLOCKS/ .BYTE 11,11,11,11,11,40 COUNT: .=.RING 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 ; 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 BINAR f7awWT T,7G6 , %%54wH\> JJ  ER RTS PC ERRBUF:.ASCII /ERR / .EVEN ; ; OUTIN: JSR PC,PRTNUM ;PRINT CURRENT VALUE OF PARAME JSR R5,ONCH .WORD REQBUF .WORD 4 JSR R5,INN ;REQUEST A NEW VALUE IFLAG: .BYTE 0 ;ERROR FLAG IDIGS: .BYTE 0 ;# DIGITS TSTB IDIGS ;ANY DATA? BNE RTN ;YES JMP DIALOG ;NO: HE WAS JUST LOOKING RTN: RTS PC ;NEW DATA IN R4 REQBUF:.ASCII / ?:/ ERRSET:MOV ERRPAT,R4+5 ALLUIC: .BYTE 12,12 .ASCII /*******/ .BYTE 12,12 MAPMES: .BYTE 14,11,11,11 .ASCII / DISK MAP / MAPDAT: .=.+11 .BYTE 12,12 UCOUNT: .=.+5 .ASCII / BLOCKS USED / FCOUNT: .=.+5 .ASCII / BLOCKS FREE/ MAPLIN: .BYTE 15,12 BLKNO: .=.+6 .BYTE 40,40,40 BITMAP: .=.+107 .END INIT Y .BYTE 234,0  ;ALLOW BINARY IF REQD. .ENDC .IFNDF MARKS .BYTE 3  ;STD BUFFER SIZE = 96 BYTES .ENDC .IFDF MARKS .BYTE 2  ;(64 IF 40-COL MARK SENSE) .ENDC .BYTE CR.INT-CR,300 ;INT'RUPT SVCE AT PRL 6 .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: BIT #400,@#CR.CSR ;CARDS IN HOPPER? BNE C ;CURRENT MASK FOR STATUS WORD JSR PC,OUTIN ;PRINT AND ASK MOV R4,ERRPAT ;STORE NEW ONE BR ERRSET ;VERIFY LOC: MOV OFFSET,R4 ;MEMORY BUFFER LOCATION JSR PC,OUTIN ;PRINT & ASK MOV R4,OFFSET ;STORE NEW VALUE MOV R4,R3 ;OFFSET ADD #WRITBF,R3 ;CALC ACTUAL MEMORY LOC'N MOV R3,WRITAD ;LOAD IT ADD #READBF,R4 ;CALC BEGIN OF READ BUFFER MOV R4,READAD BR LOC ;PRINT AG HOURLY VOLUME AND PROFIT STATION NO. 1144 (TAUBER) 11-11-71 XX--------NONOX--------XX YY------GOOD GULF------YY ZZ--------GULFTANE-----ZZ AA--AVG--AA CC--COMBINED--CC HR QTY POST TCA INDEX GROSS QTY POST TCA INDEX GROSS QTY POST TCA INDEX GROSS TCA INDEX QTY GROSS 10 100 37.9 2.1 -1.30 7.68 120 33.9 2.1 -1.80 6.01 80 32.9 2.1 -0.15 4.38 2.1 -1.08 300 18.07 11 100 37.9 2.8 -0.85 6.98 12R.ONR  ;IF NOT TELL USER TO READY .IFNDF ONLY26&ONLY29 .IFNDF DEFALT  ;FOR DUAL-PUNCH DRIVER ... CLR (PC)+  ;... SET CONV. TABLE OFFSET .ENDC   ;... FOR DEFAULT PUNCH .IFDF DEFALT  ;... AS APPROPRIATE MOV #104,(PC)+ .ENDC CR.TOS: .WORD 0 .ENDC .IFDF BLANKS  ;IF BLANK-SUPPRESS VERSION ... CLRB CR.ZSW  ;... FORCE SUPPRESS OFF .ENDC .IFNDF BINARY TST (SP)+  ;IGNORE INTERIM RETURN BR CR.DXT  ;... & TAKE COMPLETION .ENDC .IFDF BIN; ;VERSION 001 ; REVISION 004 ; DATE: 24-APR-72 ;THIS IS THE LINE PRINTER DIAGNOSTIC ROUTINE ;SEE THE WRITEUP OF THE ROUTINE FOR OPERATING INSTRUCTIONS R0 = %0 R1 = %1 R2 = %2 R3 = %3 R4 = %4 R5 = %5 SP = %6 PC = %7 PS = 177776 SWR = 177570 ;CONSOLE SWITCH REGISTER SCOPE = EMT  ;USED AS CALL TO ERROR ROUTINE ;THE FOLLOWING ARE REGISTER ADDRESSAIN FOR CHECK ; RECNT: MOV NRECS,R4 ;# OF RECORDS PER FILE JSR PC,OUTIN MOV R4,NRECS BR RECNT FILECT:MOVB NFILES,R4 ;# OF FILES PER TEST JSR PC,OUTIN MOVB R4,NFILES BR FILECT ; WORDCT:MOV XCOUNT,R4 ;#WORDS/RECORD JSR PC,OUTIN MOV R4,XCOUNT BR WORDCT ; ; MINT = . ;THIS IS THE MAG TAPE INTERRUPT RTNE TSTB MINTFG ;IS MAG TAPE INTERRUPT EXPECTED? BNE .+10 SP)+,EXDEC+2 ;RETURN ADDRESS MOV (SP)+,JULDAT ;JU;IAN DATE MOV R5,-(SP) ;SAVE REGISTERS MOV R4,-(SP) MOV R3,-(SP) ; DECODE THE DATE MOV JULDAT,-(SP) ;BIN2D THE JULIAN DATE MOV #YEAR,-(SP) ;INTO YEAR FORMAT WHERE ONLY MOV #3,-(SP) ;FIRST 2 BYTES WILL BE TRANSFERRED EMT 42 ADD #7,YEAR ;DON'T FORGET OFFSET MOV #YEAR+2,-(SP) ;D2BIN ONLY THE LAST 3 DIGITS OF MOV #2,-(SP) ;THE JULIAN DATE ARY  ;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 BR CR.ERD  ;ELSE LEAVE USER BUFFER ALONE ; B) INITIALISE INTERNAL BUFFER POINTERS: CR.ISP: MOV PC,-(SP) ;GET BUFFER START ES FOR THE LINE PRINTER CONTROLLER R.AD = 165010 ;MEMORY ADDRESS R.LF = 165012 ;LINE-FEED CONTROL R.WC = 165014 ;WORD COUNT (2'S COMPLEMENT) R.CM = 165016 ;COMMAND (OUTPUT ONLY) R.ST = 165016 ;STATUS (INPUT ONLY) ; FIRST PUT HALTS IN ALL INTERRUPT LOCATIONS LP.DGN: MOV #.,SP ;INIT STACK CLR R0 ;POINTER TO VECTOR CLR R1 ;POINTER TO VE ;YES HALT ;;NO: ERROR JMP DIALOG ;MAY "CONTINUE" AFTER HALT CLRB MINTFG ;SHOW THAT INTERRUPT HAS COME I RTI ; COMMND:MOV COMAND,R4 ;COMMAND FORMAT (MANUAL) JSR PC,OUTIN MOV R4,COMAND BR COMMND ; PARAMS:MOV #PLIST,R2 ;LIST INPUT PARAMETERS BR STAT1 ;USE PRINT STATUS ROUTINE ; STATUS:MOV #SLIST ,R2 ;PRINT STATUS WORDS STAT1: MOV (R2)+,R4 ;GET NEXT REGISTER ADDRESS BEQ D EMT 42 MOV (SP)+,R5 ;BINARY DAY COUNT TST (SP)+ ;CLEAR STACK MOV #CALNDR,R4 ;POINT TO CALANDER MONSEL: MOV (R4)+,-(SP) ;UNPACK NAME OF MONTH MOV #MONTH,-(SP) MOV #1,-(SP) EMT 42 MOV R5,-(SP) ;BIN2D DAY COUNT MOV #DAY-3,-(SP) ;LAST 2 DIGITS IN DAY MOV #3,-(SP) EMT 42 SUB (R4)+,R5 ;BUT DO WE HAVE THE RIGHT MONTH? BGT MONSEL ;IF NOT TRY NEXT MONTH ;PERFORM TRANSFER IF REQUESTED 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 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 #CTOR+2 LPDA10: TST (R1)+ ;BUMP TO VECTOR+2 MOV R1,(R0)+ ;PUT #VECTOR+2 IN VECTROR CLR (R1)+ ;PUT A HALT IN VECTOR+2 TST (R0)+ ;KEEP UP WITH R1 TSTB R0 ;AT 400 YET? BNE LPDA10 ;LO BYTE CLEARS FIRST AT 400 ;------------------------------- MOV #LPDI10,200 ;INIT INTERRUPT TO ERROR LOC'N MOV #340,202 ;INTERRUPT STATUS MOV #SCOPEI,30 LGRTN ;LAST ENTRY IS ZERO MOV (R4),R4 ;GET CURRENT REGISTER CONTENTS JSR PC,PRTNUM JSR PC,FORMAT BR STAT1 ; SLIST: .WORD MTC,MTS,MTN,MTA,STAT,0 ; PLIST: .WORD COMAND,OFFSET,XCOUNT,NRECS,NFILES .WORD ERRPAT,0 ; ; DATAIN = . ;THIS IS THE ALL-PURPOSE DATA RTNE MOVB #SPCE,R4 JSR PC,OCH MOV #'=,R4 JSR PC,OCH ;REQUEST 'B' OR "W" JSR PC,ICH ;FIRST CHR MOV #100000,R1 ; AND EXIT MOV MYBUF,R4 ;SOURCE BUFFER MOV YORBUF,R5 ;DESTINATION BUFFER MOCHAR: INC NOCHAR ;REMAINING CHARACTERS TO MOVE BPL REGRES ;EXIT IF NONE MOVB (R4)+,(R5)+ BR MOCHAR REGRES: MOV (SP)+,R3 MOV (SP)+,R4 MOV (SP)+,R5 EXDEC: MOV #0,PC ; STORAGE JULDAT: .WORD 0 MYBUF: .WORD 0 YORBUF: .WORD 0 NOCHAR: .WORD 0 CALNDR: .RAD50 /JAN/ .WORD 37 .RAD50 /FEB/ .WORD 34 .RAD50 /MA6,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 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 ;INT ;INIT EMT VECTOR ; SET UP TO READ IN THE FIVE OPTIONS MOV #BYTLST,R0 ;TOP OF BYTE LIST MOV #5,R1 ;FIVE OPTIONS STOP00: HALT ;STOP HERE FOR FIRST PARAMETER LPDA15: BITB #177,@#SWR+1 ;IS BYPASS OPTION ELECTED? BNE LPDB10 ;YES: SKIP ALL INPUTTING TST @#SWR ;IS BIT #15 SET? BMI LPDA20 ;SWITCH SET TO BYPASS THIS ONE ONLY MOVB @#SWR,(R0) ;LOAD PARAMREADY FOR BYTE SET/CLEAR CMP #'W,R4 ;"W"? BEQ DWORD ;YES:FORM LIST BY WORDS CMP #'B,R4 ;"B"? BEQ BWORD ;YES:FORM BY BYTES BR DATAIN ;TRY AGAIN DWORD: BIC R1,MOVINS ;SET FOR WORD REFERENCES BIC R1,DMOVE BIC R1,PRTDAT BR GETCHR BWORD: BIS R1,MOVINS ;SET FOR BYTE REFERENCES BIS R1,DMOVE BIS R1,PRTDAT GETCHR:CLRB $COLON CLR R3 ;WORD IN LIST COUNTR/ .WORD 37 .RAD50 /APR/ .WORD 36 .RAD50 /MAY/ .WORD 37 .RAD50 /JUN/ .WORD 36 .RAD50 /JUL/ .WORD 37 .RAD50 /AUG/ .WORD 37 .RAD50 /SEP/ .WORD 36 .RAD50 /OCT/ .WORD 37 .RAD50 /NOV/ .WORD 36 .RAD50 /DEC/ .WORD 37 .RAD50 /WHO/ .WORD 1440 ; FORMATS .EVEN .=.+3 DAY: .=.+2 .BYTE 40 MONTH: .=.+3 .BYTE 40 YEAR: .=.+5 .BYTE 15 .END ERNAL 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  ;WITH BINARY DATA ... CR.BLP: SWAB @R1  ;... COMPLETE CONVERSION MOV (R1)+,(R0)+ ;... & GIVE TO USER CMP R0,CR.UBE ;USER BUFFER FULL? BNE ETER (LOW BYTE) LPDA20: TSTB (R0)+ ;BUMP HERE IN CASE OF BYPASS STOP01: HALT ;WAIT FOR OPERATOR TO SET UP SWITCHES DEC R1 ;ANY MORE? BGT LPDA15 ;YES LPDB10: JSR PC,LPD.ST ;CHECK STATUS ERR010: SCOPE ;ERROR RETURN:BAD STATUS BIT #4,@#R.ST ;IS READY SET? BNE .+4 ;YES ERR020: SCOPE ;READY NOT SET MOVB #40,SCHAR ;INIT SER JSR PC,ICH ;2ND CHR:SPACE,COLON,OR RETURN CMPB #':,R4 BEQ COLON ;COLON-REQUEST A NEW LIST CMPB #SPCE,R4 BEQ GETNUM ;PRINT REQUEST W/SPEC'D ADDR CMPB #CR,R4 BEQ DODATA ;RETURN: GO EXECUTE BR DATAIN ;NONE OF ABOVE: TRY AGAIN GETNUM:JSR R5,INN ;INPUT A NUMBER DFLG: .BYTE 0 DDIG: .BYTE 0 TSTB DDIG ;ANY DATA ENTERED BEQ DODATA ;NO:GO EXECUTE MOV RCR.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 COMPLETION EXIT .ENDC ;INTERRUPT SERVICE ROUTINES: ; A) CHECK FOR ERROR & COLLECT INPUT: CR.INT: MOV R0,-(SP) ;SAVE USER R0 YNTHETIC CHAR MOVB #66.,WDCNT ;INIT PAGING PARAMETERS MOVB PAGE,LINENO BNE LPDB15 ;INIT PAGE SIZE IF SPECIFIED... MOVB #66,LINENO ;...ELSE SET FOR FULL PAGE LPDB15: JSR PC,LPDC  ;BUILD FIRST BUFFER ; ; NOW WE ARE READY TO COMMAND PRINT OF THE LINE ; ; THIS IS ENTRY POINT TO PRINT ANOTHER LINE ; ; NOW COMPUTE WORD- AND LINE-COUNTS LPDD: MOV @#SWR,CONSOL MOV CURBUF,R0 ;BUFFER S 4,-(SP) ;PUT DATUM IN STACK TST (R3)+ ;COUNT WORDS OF DATA BR GETNUM COLON: INCB $COLON ;SHOW THAT THIS IS A LOAD BR GETCHR+4 DODATA:TSTB $COLON ;EXECUTE DATA LIAT LOAD BEQ DDUMP ;NO COLON,SO DUMP MOV #WRITBF,R4 ;INIT BUFFER POINTER TST R3 ;ANY DATA ENTERED? BNE DLIST ;YES: GO LOAD IT ;FILL LIST WITH INTEGER SEQUENCE: 1,2,3....N MOVINS:MOV R3,(R4)+ ;LOAD WORD (OR BYTE) INC 5 32.9 2.8 -1.30 5.39 90 31.9 2.8 +0.60 4.30 2.8 -0.52 315 16.67 12 110 36.9 2.8 -0.55 7.68 130 32.9 2.8 -1.05 5.60 100 31.9 2.8 +0.90 4.78 2.8 -0.23 340 18.06 40.9 ! XXX 39.9 ! XX 38.9 ! XXXXXX 37.9 ! XXXX PRICE 36.9 ! X 35.9 ! 34.9 ! XXXX 33.9 ! XXX  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 ; 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) TART: NO P/F CHARACTER MOVB COUNT,R1 ;LINE WIDTH: NO P/F CHAR BNE LPDD20 ;WILL USE 'COUNT' SPECIFIED DECB WDCNT ;USE AUTOMATIC LINE WIDTH BNE LPDD10 ;STILL SHRINKING MOVB #66.,WDCNT ;FULL LINE AGAIN LPDD10: MOVB WDCNT,R1 ;TMP'Y HOLD LPDD20: BIT #1,CONSOL ;AUTO MODE? BNE LPDD30 ;YES: NO P/F CHAR INC R1 ;IN P/F MODE: ONE EXTRA WORD R3 ;EACH ONE INCREMENTING CMP R4,#WRITBF+BUFLTH ;REACHED END? BLO MOVINS ;NOT YET DLGRTN:JMP DIALOG ;COMMON EXIT TO BEGIN DIALOGUE DDUMP: TST R3 ;ANY ADDRESS? BNE ADRSPC ;YES MOV #WRITBF,R1 ;NO:USE WRITE BUFFER MOV #WRITBF+BUFLTH-2,R5 ;SET BUFFER END POINTER PRTDAT:MOV (R1)+,R4 ;FETCH WORD (BYTE) JSR PC,PRTNUM ;PRINT IT JSR PC,FORMAT ;,CAN BE STOPPED BY "HALT"  32.9 ! XXXXX 31.9 !X XX ______________________________________ 1 5 10 15 20 25 30 3600 ! 3400 !X 3200 ! X X XX XX VOLUME 3000 ! X X XXX XX X X XXX 2800 ! X X XXXX X XXXX 2600 ! X 2400 !  HH"t(n,RR }w @$HR R @,<w  } }e e -,`Bwe@-B }-?.w7 dH$d(H0dRRHR!"d RRHR$*,҂w &} "}e0}}x &x.w| | TST -(R0) ;AND ONE WORD SOONER IN BUFFER MOVB PFCHAR,(R0) ;LOAD FIRST BUFF WORD W/P/F CHAR BR LPDE20 ;GO SET UP PRINTER REGISTER... ;BYPASS AUTO PAGE COUNT LPDE90: MOVB HOMECH,R2 ;USE VFU TO SKIP TO TOP-OF-FORM BISB #100,R2 ;COMBINE CHANNEL # AND VFU COMD BIT BR LPDE10 ;GO PUT IT OUT LPDD30: BIT #2,CONSOL ;DOUBLE SPACE? BEQ LPDD40  CMP R1,R5 ;REACHED END OF BUFFE? BLOS PRTDAT ;KEEP GOING BR DLGRTN ;YES ADRSPC:MOV (SP)+,R1 ;SET LOW ADDR (IF ONLY ONE LIMIT MOV R1,R5 ;SET HIGH ADDR LIMIT SETHI: TST -(R3) TST R3 ;ONLY ONE DATUM? BEQ PRTDAT ;YES MOV (SP)+,R1 ;SET LOW LIMIT BR SETHI ;GO CHECK FOR EMPTY STACK DLIST: MOV SP,DNDEX ;INIT INDEX TO POINT AT STACK DLIST1:MOV R3,R5 ;INIT STACK I 2200 ! -------------------------------------- 1 5 10 15 20 25 30   ;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  ;... 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  ;NO DECB LINENO ;YES:COUNT TWO LINES LPDD40: DECB LINENO BGE LPDE20 ;NOT END OF PAGE YET MOVB PAGE,LINENO ;REACHED END: RESET BICB #340,HOMECH ;IS VFU OPTION SELECTED? BNE LPDE90 ;YES ;NO: WILL TRY TO SKIP 'N' LINES TSTB PFCHAR ;ALLOWED TO DO A P/F COMMAND? BEQ LPDE20 ;NO: FILL ENTIRE PAGE MOV #66.,R2 ;YES: NDEXER TST -(R5) ;LESS ONE SINCE 1ST WD INDEX=0 TST R5 BLT DLIST1 ;LIST DEPLETED:BEGIN AGAIN DMOVE: MOV 0(R5),(R4)+;TRANSFER WORD (OR BYTE) TO BUFF DNDEX = .-2;LABEL FOR INDEX IN "DMOVE":REF'D @ DLIST CMP R4,#WRITBF+BUFLTH BHIS DLGRTN ;BUFFER FULL: EXIT BR DLIST1+2 ;CONTINUE FILLING BUFFER ; ; PRTNUM = . ;PRINT NUMBER SUBROUTINE MOV R0,-(SP) ;SAVE USED REGISTERS MOV R3,-(SP) ` :,  P fb"*&>ߵy  xȗxЋ *J l5 BN*n6 xB*5  ȝ2@5*$vxof*BÝ^E X J*   _ B ]*"E?UL A *F5@A .ENDC ; C) ASCII CONVERT & STORE: CR.ASC: MOVB @#CR.DB2,R1 ;GET COMPACTD INPUT BPL .+6  ;CONVERT CODES >200 ... ADD #340,R1  ;... TO RANGE >140 TSTB @R0  ;IF FIRST C.C. ... BNE CR.CVT CMP R1,#301  ;... LOOK FOR E.O.F. BEQ CR.EOF .IFDF BLANKS  ;FOR BLANK SUPPRESS ... CMPB R1,#337  ;... LOOK FOR SUPPRESS OFF BEQ CR.ZON .ENDC .IFNDF ONLY26&ONLY29 ;FOR DUAL PUNCH DRIVER ... CMP R1,#227  ;... CHECK IF 029 CTL BEQCALC # OF LINES TO SKIP MOVB PAGE,R3 ;NO SUCH THING AS A BYTE SUBTRACT SUB R3,R2 BIC #-77-1,R2 ;INSURE SKIP-LINE COMMAND LPDE10: MOV R2,-(SP) JSR PC,GETPTY ;GET EVEN PARITY(IF ALLOWED) MOVB (SP)+,PFWORD ;NOW HAVE EITHER SKIP-LINE... ;...OR SKIP-TO-CHANNEL COMMAND ; ; NOW OUTPUT THIS ONE-WORD P/F COMMAND AND WAIT FOR FINISH CLR @#R.LF ;SET MODE TO P/F MOMOV #6,R0 ;DIGIT COUNT FOR "PRINT A NUMBER" MOV R4,R3 ;# TO PRINT CLR R4 ;1ST DIG ASL R3 ROL R4 BR PRT020 PRT010:CLR R4 ;NEXT 5 DIGS ASL R3 ROL R4 ASL R3 ROL R4 ASL R3 ROL R4 PRT020:ADD #60,R4 ;MAKE TTY CHR JSR PC,OCH ;PRINT CHAR DEC R0 ;DONE? BGT PRT010 ;NO MOV (SP)+,R3 ;RESTORE REGIST5  5@*j   65*@ @ m&@ @ m@ @ 7E* L w wzvE 0w*wf %!*`5@26*e*-& *BE ׭` U*f& hŀ5 5 `u* w 胦6 e* `@5@ CR.029 CMP R1,#270  ;... OR 026 CTL BEQ CR.026 .ENDC CR.CVT: MOV R1,-(SP) ;CONVERT CARD CODE ... SUB #40,R1  ;FOR EACH 40 IN CODE ... BMI CR.STO  ;... ADD 21 & STRIP 40 SUB #17,@SP  ;... TO GET TABLE INDEX BR CR.CVT+2 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 CMP R0,CR.UBE ;BUFFER FULL? BEQ CR.EXT CR.BXT: DE MOV #PFWORD,@#R.AD ;ADDRESS OF LINE/CHANNEL COMMAND WORD MOV #-1,@#R.WC ;ONLY ONE WORD MOV #4000,@#R.CM ;!!!!!COMMAND PRINT!!!!!! TST @#R.ST ;WAIT FOR DONE BEQ .-4 LPDE20: MOV R0,@#R.AD ;BUFFER START ADDRESS NEG R1 ;WORD COUNT IS NEGATIVE MOV R1,@#R.WC ;OUTPUT WORD COUNT MOV CONSOL,R0 ;GET SWITCH OPTIONS MOV R0,@#R.LF ;SET UP AERS MOV (SP)+,R0 RTS PC ;RETURN ; ; FORMAT:INCB PPOS ;POSITION POINTER CMPB PPOS,#10 ;8 POS PRINTED? BGE FOR020 ;YES:NEW LINE MOV #40,R4 ;NO:OUTPUT 2 SPACES JSR PC,OCH JSR PC,OCH RTS PC FOR020:JSR PC,CRLF ;DO RETURN &LF RTS PC ; ; ; OUTPUT A CHARACTER ; OCH: TSTB @#TPS ;TTY READY? BPL OCH ;NO MOVB R4,@#TPB ;YES:OUTPUT CHAR 5e * f7awWT ?*7G6 * %%54wHG>J  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 PROCESSING YET ... BEQ CR.RPT  ;... CONTINUE MOV (SP)+,R0 ;OTHERWISE RESTORE USER R0 MOV @#CR.RSV,-(SP) ;... & NOW SAVE ALL JSR R5,@(SP)+ MOV CR.UBP,R0 ;SET USER BUFF PTR .IFDF BINARY  ;FOR !UTO OR P/F MODE SWAB R0 BIC #37777,R0 ;GET INTERRUPT ENABLE BITS BIS #4000,R0 ;SET 'START' BIT ;////////////////////////////////////////////////////////// MOV R0,@#R.CM ;!!!!!!!P R I N T!!!!!!!! ;////////////////////////////////////////////////////////// ; MOV #LPDI20,200 ;SET INTERRUPT VECTOR TO THE ROUTINE JSR PC,LPDC ;USE THIS TIME TO CREATE NEXT BUFFER ; ;------------------------------- ; " RTS PC ; ; TTYINT:MOVB @#TKB,TTYTMP ;TTY KB INTERRUPT BICB #600,TTYTMP;CLEAR CHANNEL EIGHT CMPB #'H,TTYTMP ;IS CHAR HALT CHAR "H"? BNE FLGTST ;NO BIT #2,@#SWR ;CHECK FOR "RESET" OPTION BEQ DLGRTN ;NOT SELECTED: NO RESET JMP HALT ;YES:GO STOP UNITS FIRST FLGTST:TSTB REQFLG ;REQUEST PENDING? BEQ TYEXIT ;NO CLRB REQFLG INCB CHRFG ;INDICATE CHAR READY TYEXIT:RTI ; ; #wf$(K,wv DECTAPE COPY V01B ,@ORIGINAL ON UNIT COPY T,dO UNIT ????  *** I/O B,ERROR, UNIT  *** UNRECOVERABLE COPY ERROR  ! COPY COMPLETED Y փ%փVERIFY COPY (Y OR N)?  r$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 .IFNDF MARKS CMP R0,R1  ;IF BUFFER FULL OMIT NEXT BEQ .+6 SUB #8.,R0  ;OTHERWISE LOSE CC 73-80 .ENDC CMP -(R0),(PC)+ ;THEN TRAILING SPACES .BYTE 240,240 BEQ .-4 TST (R0)+  ;ADJUST PTR W% ; NOW WE WAIT HERE UNTIL EITHER THE INTERRUPT COMES (IF ENABLED) ; ..OR UNTIL 'DONE' COMES UP (IF INTERRUPT NOT ENABLED). ; ERROR STOPS ARE PROVIDED FOR STATUS ERRORS, UNEXPECTED INTERRUPTS, ; OR NO RESPONSE AFTER A MAXIMUM ALLOWED TIME INTERVAL. LPDF10: MOV TIMOUT,TIMER ;SET MAXIMUM TIMER LPDF12: MOV @#R.ST,R1 ;FETCH STATUS BMI LPDF20 ;'DONE' IS UP!! COM R1 ;INVERT ALL BITS THAT SHOULD BE SET BIT #4000&ICH: INCB REQFLG ;INPUT A CHARACTER & ECHO IT TSTCH: TSTB CHRFG ;IS ONE AVAILABLE BEQ TSTCH ;NO CLRB CHRFG ;CLEAR READY FOR NEXT TIME MOVB TTYTMP,R4 ;YES CMP R4,#CR ;IS THIS A CARRIAGE RETURN? BNE ECHO ;NO: GO ECHO IT JSR PC,CRLF ;YES: OUTPUT LF, TOO RTS PC ; ECHO: JSR PC,OCH ;ECHO ON TTY RTS PC ;CHAR IS IN R4 ; ; CRLF: MOV R4,-(SP) ;SAVE MOV #(HEN 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 @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 SYSTE)2,R1 ;TEST BUSY AND ON-LINE FOR SET BEQ LPDF70 ;ALL ARE SET ERR030: SCOPE ;ERROR: ONE OF THEM WAS NOT SET LPDF70: COM R1 ;BACK TO NORMAL BIT #31,R1 ;TEST FOR ERRORS BEQ LPDF80 ;GOOD: NONE IS SET ERR040: SCOPE ;ERROR:AT LEAST ONE OF ABOVE IS SET LPDF80: DEC TIMER ;WAIT FOR 'DONE' OR INTERRUPT BNE LPDF12 ;KEEP LOOPING CLR @#R.CM *5015,R4 ;CR & LF JSR PC,OCH ;PRINT LOW BYTE SWAB R4 JSR PC,OCH CLRB PPOS ;RESET FOR POSSIBLE FORMAT MOV (SP)+,R4 ;RESTORE RTS PC ; ; ; OUTPUT N CHARS ; CALLING SEQUENCE: ; JSR R5,ONCH ; .WORD BUFADR ADDRESS OF FIRST (LOW) CHARACTER ; .WORD NCHAR # OF CHARS ; ONCH: MOV (R5)+,R0 ;BUF ADR MOV R1,-(SP) ;SAVE IT MOV (R5)+,R1 ;# CHARS ONC010:MOVB (R0)+,R4 +<<􃴛 :<PJP[L*REE:*v  N*@N P[ Tl*^T|TTHl',l 7TTH,ll v7k 7i)*.TTHll7 ~Y *R~ ~l7 &7 ,7 L*v2@,M 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  ;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- ;DISABLE INTERRUPT: TIMER IS ZERO ERR050: SCOPE ;ERROR: TIME'S UP: NO FINISH ; LPDF20: BIT #40031,R1 ;TEST BUSY AND ERRORS BEQ LPDF40 ;NONE UP: O.K. ERR060: SCOPE ;STATUS ERROR WITH 'DONE' LPDF40: TSTB CONSOL ;WAS THE "DONE" INTERRUPT ENABLED? BPL LPDG00 ;NO: THIS IS THE CORRECT SEQUENCE MOV DONDLY,R3 ;ENABLED: WAIT FOR INTERRUPT... DEC R3 ;...FOR A. ;OUTPUT CHAR JSR PC,OCH DEC R1 ;DONE? BGT ONC010 ;NO MOV (SP)+,R1 ;RESTORE RTS R5 ; INPUT CHARS FROM TTY UNTIL CR ; CALLING SEQUENCE -- ; JSR R5,INCH ; .WORD BUFADR LOW BUF ADR ; .BYTE MAXCH MAX # CHARS ; .BYTE # CHARS READ INCH: MOV (R5)+,R0 ;GET BUF ADR MOV R1,-(SP) ;SAVE IT MOVB (R5)+,R1 ;GET MAX CHAR CNT CLRB (R5) ;INIT COUNT INC010/  $w(~0 *eTT~.7 n~w :Z* N~w  <~w7 <~ * "~-v?z,.~7 ~w }*T }w NP[$*xw  } }e e -*Bwe@-B }-?J,wT7  .0 COUNT STORE MOV R0,@R1  ;... & COMPUTE VALUE REQD SUB CR.UBE,@R1 ASR @R1  ;... AS WORDS! .ENDC COM @R0  ;SET FLAG 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  ;IN SUPPRESS VERSION CR.ZON: INCB CR.ZSW  ;... SET1DDITIONAL DELAY... BNE .-2 ;...BETWEEN 'DONE' AND INTERRUPT CLR @#R.CM ;DISABLE INTERRUPT ERR070: SCOPE ;SHUCKS, INTERRUPT NEVER CAME ; ; ENTER HERE AFTER A SUCCESSFUL 'DONE' WITHOUT INTERRUPT ENABLED ; LPDG00: JSR PC,LPD.ST ;GO MAKE A COMPLETE STATUS CHECK FIRST ERR080: SCOPE ;STATUS ERROR RETURN BIT #4,CONSOL ;IS "STALL" SELECTED OUT FRONT? BEQ LPDG50 ;NOT TO2:JSR PC,ICH ;GET A CHAR CMPB R4,#215 ;CR? BEQ INC020 ;YES INCB (R5) ;CHR CNT CMPB (R5),R1 ;TOO MANY? BGT INC010 ;YES: IGNORE UNTIL CR MOVB R4,(R0)+ ;PUT IN BUF BR INC010 ;NEXT INC020:INC R5 ;BUMP TO RETURN MOV (SP)+,R1 ;RESTORE RTS R5 ;EXIT ; INPUT A POSITIVE OR NEGATIVE OCTAL NUMBER FROM TTY; ; A CR IS EXPECTED AS A DELIMITER AFTER THE LAST DIGIT ; ; TTn*w &} "}e0}}",2Tw| |wfҞT2*Xwv DECTAPE COPY V01B *|ORIGINAL ON UNIT COPY TO*O UNIT ????  *** I/O *ĞERROR, UNIT  *** UNRECOVERAdBLE COPY ERROR  COPY COMPLETED #VERIFY COPY (Y OR N)? 4 SUPPRESS NOW BR CR.EXT  ;AGAIN IGNORE REST OF CARD .ENDC ;READER NOT 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 5DAY ; STALL FOR A RANDOM # OF M-SECS BETWEEN 8 AND 1023. MOV SEED,R0 ;SEED (=RNUM(N-1)) ROL R0 ROL R0 ; X4 ADD DAMP,R0 MOV R0,-(SP) ;RNUM(N)=4*RNUM(N-1)+DAMP(N-1) ROL R0 ROL R0 ADD DAMP,R0 ROL R0 ROL R0 MOV R0,DAMP ;DAMP(N)=64*RNUM(N-1)+20*DAMP(N-1) ; RANDOM NUMBER NOW GENERATED AND ROUTINE READIED FOR NEXT TIME 6 CALLING SEQUENCE -- ; ; JSR R5,INN ; .BYTE 0 -1,0,1 ON RETURN IF NEG, ERROR, POS ; .BYTE 0 NO OF DIGITS READ ; NUMBER RETURNED IN R4, 2'S COMP IF NEG ; INN: CLR (R5)+ MOV R3,-(SP) CLR R3 INN010: JSR PC,ICH ;GET A CHAR TO R4 CMPB R4,#' ;IGNORE BLANKS BEQ INN010 CMPB R4,#'- ;IS IT A MINUS SIGN '(*) BEQ INN020 7;18-MAY-72 ;24-NOV-71 ; MAG TAPE DIAGNOSTIC EXERCISER R0 = %0 ;REGISTER DEFS R1 = %1 R2 = %2 R3 = %3 R4 = %4 R5 = %5 SP = %6 ;STACK POINTER PC = %7 ;PROGRAM COUNTER PS = 177776 ;CPU STATUS SWR = 177570 ;CONSOLE SWITCHES TKS = 177560 ;TTY KB STATUS TKB = 177562 ;TTY KB BUFFER TKI = 60 ;TTY KB VECTOR TPS = 177564 ;TTY STATU8 ;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  ;EMPTY .BYTE 335  ;] .BY9 BIC #177007,(SP)+ ;MASK 10 .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  ;& .BYTE 101  ;A .BYTE 1=D BY ALL ONES? BEQ LPDG70 ;YEAH--WANTS A HALT...AND RIGHT NOW! COMB SPEED ;BACK TO NORMAL MOVB SPEED,-(SP) ;DELAY WANTS IT ON STACK BIC #177400,(SP) ;NEVER SPEED DELAY OVER 256 MSECS JSR PC,DELAY ;DELAY FOR 'SPEED' MILLISECONDS ; NOW REMEMBER, THIS IS TIME BETWEEN FINISH AND NEXT PRINT LPDG60: JMP LPDD ;GO PRINT NEXT LINE (ALREADY SET UP) ; LPDG70: COMB SPEED ;PUT BACK IN S> BICB #370,R4 ADD R4,R3 INCB -1(R5) ;INCREMENT DIGIT CNT BR INN010 ;GET NEXT DIGIT INN020: MOVB #-1,-2(R5) ;SET FLAG TO NEG NUMBER BR INN010 ;GET NEXT DIGIT INN030: CMPB -1(R5),#6 ;EXCEED 6 DIGITS? BGT INN060 ;YES, ERROR MOV R3,R4 ;NO TSTB -2(R5) ;IS NUMBER NEG. BEQ INN050 ;NOT NEG NEG R4 ;YES, TWO'S COMP NUMBER INN040: MOV (SP? .=14000 MTEXER: ;BEGIN OF EXERCISER MOV #.,SP ;SET STACK POINTER CLR R0 ;PREPARE FOR SETTING VECTORS CLR R1 INITV: TST (R1)+ ;BUMP TO POINT TO STATUS WORD MOV R1,(R0)+ ;ALL VECTORS POINT TO .+2 CLR (R1)+ ;PUT HALT IN VECTOR+2 TST (R0)+ ;KEEP UP WITH R1 TSTB R0 ;LOW BYTE WILL CLEAR AT 400 BNE INITV MOV #MINT,@#MTI ;INIT MA@02  ;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 026 PUNCH: .IFNDF ONLY29 .BYTE 240  ;SPACE .BYTE 261  ;1 .BYTE 262  ;2 .BYTE 63  ;3 .BYTE 264  ;4 .BYTE 65  ;5 .BYTE 66  ;6 AHAPE MOV #177777,R0 ;DISPLAY ALL ONES FOR GOOD HALT STOP02: HALT ;THIS IS THE GOOD STOP AFTER A 1-SHOT BR LPDG60 ;CAN CONTINUE AFTER THE HALT ; ;------------------------------- ; ; THIS IS INTERRUPT SERVICING: DON'T COME HERE UNLESS YOU ARE ONE LPDI10 = .  ;ERROR ENTRY FOR UNEXPECTED INTERRUPT ERR090: SCOPE LPDI20: MOV #LPDI10,200 ;RESTORE VECTOR TO POINT AT ERROR LOC' CLR @#PS ;BRING LEVEL BACK B)+,R3 ;RESTORE R3 RTS R5 ;EXIT W/RESULT IN R4 INN050: MOVB #1,-2(R5) ;SET FLAG TO POS NUMBER BR INN040 INN060: CLRB -2(R5) ;SET FLAG TO ERROR BR INN040 ; ; COMAND:.WORD 0 CURUNT:.WORD 0 EOFCOM:.WORD 4 ;END-OF-FILE BIT ERRPAT:.WORD 0 EXCOM: .WORD 0 NFILES:.WORD 0 NRECS: .WORD 0 OFFSET:.WORD 0 READAD: .WORD READBF ;CURRENT READ BUFFER BEGIN ADDR STAT: .WORD 0 UNITNO:.WORD 0 WRITAD: .WORD WRITBFCG TAPE INTERRUPT MOV #300,@#MTI+2;INIT VECTOR STATUS:LVL #6 MOV #TTYINT,@#TKI ;INIT TTY KBD INTERRUPT MOV #200,@#TKI+2;TTY LEVEL #4 .PAGE HALT: RESET ;FORCES STOP OF TAPE ON DEMAND ; ; DIALOG = . ;BEGIN OF DIALOGUE WITH OPERATOR MOV #100,@#TKS;ENABLE TTY KBD INTERRUPT MOV #MTEXER,SP;RESET STACK POINTER MOV #140,@#PS ;RELEASE LOCKOUT JSR PC,CRLF ;BEGIN OF DIALOG W/OPR CLRB CHRFG D.BYTE 267  ;7 .BYTE 270  ;8 .BYTE 240  ;EMPTY .BYTE 137  ;_ .BYTE 275  ;= .BYTE 300  ;@ .BYTE 336  ;^ .BYTE 47  ;' .BYTE 134  ;\ .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 273  ;; .BYTE 254  ;, .BYTE 50  ;( .BYTE 42  ;" .BYTE 243  ;# .BYTE 245  ;% .BYTE 132EDOWN CMP (SP)+,(SP)+ ;POP STACK BACK TO NORMAL CMP SP,#LP.DGN ;CHECK FOR PROPERLY-PUSHED STACK PNTR BEQ .+4 ;IT'S OK ERR100: SCOPE ;STACK ERROR MOV CONSOL,R1 ;OPTION BITS MOV @#R.ST,R2 ;FETCH STATUS BITB #300,R1 ;TEST FOR EITHER INTERRUPT ENABLED BNE LPDI30 ;ONE OR BOTH WERE ENABLED ERR110: SCOPE ;VERY BAD: INTERRUPTED WHILE DISAB ;CURRENT WRITE BUFFER BEGIN XCOUNT:.WORD 0 XRECS: .WORD 0 CHRFG: .BYTE 0 EXSWCH:.BYTE 0 MCODE: .BYTE 0 MINTFG:.BYTE 0 PPOS: .BYTE 0 REQFLG:.BYTE 0 TTYTMP:.BYTE 0 WRTCTR:.BYTE 0 XFILES:.BYTE 0 $COLON:.BYTE 0 .END G CLRB MINTFG ;INIT TAPE INTERRUPT FLAG CLRB PPOS ;INIT FORMAT FLAG MOV #BELL,R4 INAGN1:CLRB MCODE ;INIT MNEMONIC SAVE LOC JSR PC,OCH MOV #'*,R4 JSR PC,OCH ;PRINT "*":REQUEST INPUT INAGN2:JSR PC,ICH ;GET MNEMONIC CHAR CMPB #CR,R4 ;RETURN? BEQ DOACT ;YES:GO DO FUNCTION MOVB R4,MCODE ;SAVE CHAR BR INAGN2 DOACT: MOV #LSIZE-1,R1 ;INIT INDEX TSTB MCODE H  ;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 72  ;: .BYTE 44  ;$ .BYTE 252  ;* .BYTE 333  ;[ .BYTE 276  ;> .BYTE 246  ;& .BYTE 322  ;R ; .BYTE 53  ;+ .BYTE 101  ;A .BYTE 102  ;B .BYTE 303  ;C .BYTE 104  ;D .BYTE 305  ;E .BYTE 306  ;F .BYTE 107  ILED LPDI30: BMI LPDI50 ;'DONE' WAS ENABLED ERR120: SCOPE ;ONLY INT ON ERROR, AND IT CAME IN LPDI50: BIT #40031,R2 ;TEST BUSY AND ERRORS BEQ LPDG00 ;TEST PASSED: NOW FOR FINAL PROCESSING ERR130: SCOPE ;AT LEAST ONE OF ABOVE IS SET ; ;------------------------------- ; ; THE FOLLOWING ARE SUBROUTINES USED IN DIAGNOSTIC ; ; SUBROUTINE: SELECTS PROPER FIRST CHARACTER FOR NEXT LINE... ; ...AND FILLS J0 :*  P DF(*$02@p` :77F*H77 *  ĥ *l7 ? =* GLRFNCDAMSPEXXx*J:xEwB7M:,) Z*,  x+%  6!*xEE2BP w x, * 5xw DONE  5*DK ;WAS CR FIRST CHAR? BNE DCMP ;NO ILEGAL:MOV #'?,R4 ;ILLEGAL CHAR BR INAGN1 ;GO BACK AND TRY AGAIN DCMP: CMPB MCODE,MNETAB(R1);IS THIS CHAR IN TABLE? BEQ FOUND ;YES: GO TO RTNE DEC R1 ;MORE? BGE DCMP ;KEEP LOOKING BR ILEGAL ;CHAR NOT IN TABLE FOUND: ASL R1 ;*2 TO INDEX WORDS MOV RTNETB(R1),PC;GO TO PROPER ROUTINE MNETAB: .ASCII "LRFNCDAMSPEX" ;LIST OF MNEMONICS;G .BYTE 110  ;H .BYTE 240  ;EMPTY .BYTE 77  ;? .BYTE 56  ;. .BYTE 251  ;) .BYTE 335  ;] .BYTE 74  ;< .BYTE 41  ;! .BYTE 311  ;I .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 MBUFFER ACCORDING TO MODE SELECTED LPDC01: MOV BOUNDL,CURBND ;RESET BUFFER TO BOUNDARY LPDC: MOV #340,@#PS ;RAISE CPU LEVEL TO INHIBIT INTRPT ADD #134.,CURBND ;CALC END OF NEW BUFFER CMP CURBND,BOUNDH ;HAVE WE GONE BEYOND LIMIT? BHI LPDC01 ;YES: GO RESET MOV CURBND,CURBUF ;NOW CALCULATE... SUB #131.,CURBUF ;...ADDRESS OF BUFFER BEGIN MOV CURBUF,R1 ;AND SET IT UP FOR ROUTINE MOVB CONSOL+1,R0 Nw  5$57*hx  R$ D~* D   " P5*H5@ L5 25@x *$EU7w 5;  * AEw \7d 5*@bo5bj55ba@p*@5 5  _f_"*d`@E bd 65~*5b{sb`=PZO*&5@b O ENDTAB:.EVEN LSIZE = ENDTAB-MNETAB ;SIZE OF MNEMONIC TABLE RTNETB:.WORD LOC,RECNT,FILECT,WORDCT,COMMND,DATAIN .WORD AUTO,MANUAL,STATUS,PARAMS,ERRSET .WORD CRCPRT .PAGE AUTO: MOV @#SWR,R1 ;AUTOMATIC WRITE AND READ CHECK BIC #146777,R1;GET UNIT # & INT. ABLE BITS MOV R1,UNITNO ;SAVE IT CLRB WRTCTR ;INIT COUNTER REWIND:MOV UNITNO,EXCOM INCB EXCOM+1 ;FORM REWIND COMMAND JSR PC,EXEC ;DO IT TR0 = %0 R1 = %1 R2 = %2 R3 = %3 R4 = %4 R5 = %5 SP = %6 PC = %7 SWR = 177570 PS = 177776 DSCCSR = 165300 DSCWC = 165302 DSCMA = 165304 DSCADR = 165306 LPMA = 165010 LPLF = 165012 LPWC = 165014 LPCMD = 165016 LPCSR = 165016 START: MOV #340,@#PS MOV #START,SP CLR COUNTAQ ;CHARACTER IS IN UPPER SWITCH BYTE BIC #177600,R0 ;ONLY LOW 7 BITS (PARITY LATER) BNE LPDC10 ;IF NOT ZERO, USE CHARACTER THERE... MOVB SCHAR,R0 ;...ELSE USE SYNTHETIC CHARACTER... INCB SCHAR ;...AND KEEP BUMPING IT CMPB SCHAR,#140 ;KEEP BETWEEN 37 AND 140 BLT LPDC10 MOVB #40,SCHAR ; ; NOW FILL LINE BUFFER AND SET (OPTIONAL) PARITY BIT ; LPDC10: MOVB #16.,CNTR16 ;PRER5@bAP*@EEwp* e0 w hw |*$ ERR w dFw *<w ?: 7 D*`7ee 7 7|*ĝt 7lt 7lm*w7a< l74I*Z "db`f *ĕ =  N%W*%Bw@Zw@w@lwPLwPS MOV UNITNO,EXCOM INC EXCOM ;FORM READ COMMAND TST @#SWR ;IS READ-ONLY BIT SET? BPL EXECAL ;YES DECB WRTCTR ;NO BITB #1,WRTCTR ;IS THIS A WRITE CYCLE BEQ EXECAL ;NO INC EXCOM ;SET TO WRITE EXECAL:JSR PC,EXEC ;GO READ OR WRITE BR REWIND ;NOW REWIND .PAGE MANUAL:MOV @#SWR,R1 ;DO ONE COMMAND SEQUENCE BIC #146777,R1;GET UNIT # & INT. ABLE BITS MOV COMANDhTCNT ASL BITFLG BIS BITFLG,INTFLG CMP R4,INTFLG BEQ INTS40 MOV #2000,R0 BR SCOPE INTS40: RTI  ;RETURN AND IMMEDIATELY PROCESS ANOTHER INT ;   ...UNLESS THIS IS LAST ONE, IN WHICH CASE ;   ...MAIN PROGRAM WILL MAKE FINAL CHECKS. ;---------------------------------------------------------------- SCOPE: CLR (R3) ;DISABLE ALL INTS BIT #40000,@#SWR BNE C05JMP HALT MOV R4,R0 UPARE FOR OPTIMUM SET (MAYBE) LPDC20: MOV R0,-(SP) ;LOAD FOR CALL TO PARITY JSR PC,GETPTY ;GO GET PARITY CALC'D (IF OPTION IS ON MOV (SP)+,R0 ;DONE: CHARACTER RETURNED ON STACK MOVB R0,(R1)+ ;PUT CHARACTER INTO BUFFER BICB #200,R0 ;CLEAR PARITY FOR NEXT TIME BIT #40,CONSOL ;IS OPTIMUM SET SELECTED? BNE LPDC80 ;YES BIT #20,CONSOL ;REPEAT SAME CHARACTER DOWN LINVwP^7*8 ĥ:ĥ ĥ w rg*\&    !* w  D 0 ^E D*E   T! ކe*& D  D D D e*0 * ׭ *  bߋtvrŀ"*4H5xw7`*X7ĝ!   *|& 7@fA |W,R2 ;GET COMMAND BITS BIC #31000,R2 ;MASK OUT UNIT & INT ENABLE BITS BIS R1,R2 ;PUT IN UNIT # MOV R2,EXCOM ;LOAD EXEC COMMAND WORD JSR PC,EXEC ;EXECUTE COMMAND JSR R5,ONCH ;GOOD EXIT: PRINT "DONE" ;NO RETURN IF ERROR .WORD DONE .WORD 6 DMPSTA:BIT #1,@#SWR ;TEST STATUS DUMP OPTION BEQ DIALOG ;NOT SELECTED JMP STATUS ;GO DUMP STATUS FIRST ; DONE: .ASCII / X CLR COUNTB CLR ERRCNT MOV #DSCINT,@#530 MOV #300,@#532 MOV #LPINT,@#200 MOV #200,@#202 MOV #LPBUF,R2 A04: MOVB (R2),R4 JSR PC,PARITY MOVB R4,(R2)+ CMP R2,#LPBUF+132. BLO A04 .PAGE BIT #4000,@#SWR BEQ A05 MOVB #'*,-(R2) A05: MOV #400,@#DSCCSR MOV @#PS,-(SP) JSR PC,LPIY? BEQ LPDC70 ;YES LPDC30: INC R0 ;NO: GENERATE ENTIRE 64 CHAR SET CMPB R0,#140 ;HIT LAST CHAR IN SET? BLT LPDC70 ;NO MOV #40,R0 ;YES:RESET LPDC70: CMP R1,CURBND  ;REACHED END OF THIS BUFFER? BLOS LPDC20 ;NOT YET MOV (SP),-(SP) ;PUSH RETURN ADDR FOR USEBELOW CLR 2(SP)  ;..AND CLEAR CPU STATUS WHEN WE... RTI   ;...RETURN VIA RTI ; COME HERE WHEN BUILDIZ* @fA Ax*    - 8*/0!7  a* W  ?*05 >   w+*T   E  6*x C X BD < B*a  . ԕ0 _*dd w @@BQ *CRCC =  +[DONE / .PAGE EXEC = . ;THIS IS THE EXECUTIVE SUBROUTINE MOVB NFILES,XFILES ;INIT FILE CTR MOV #WRITAD,XADDR;SET FOR WRITE BUFFER BIT #1,EXCOM ;READ? BEQ NEWFILE ;NO: WRITE MOV #READAD,XADDR;NOW POINT TO READ NEWFIL:MOV NRECS,XRECS ;INIT RECORDS CTR CALDRV:JSR R5,MDRIVE ;CALL DRIVER BR EXEC02 .WORD EXCOM ;COMMAND SET UP PRIOR XADDR: .WORD 0 ;WRITE OR READ BUFR .\NT A10: CLR -(SP) JSR PC,DSCINT TST @#SWR BPL A20 HALT BR A05 A20: BIT #20000,@#SWR BNE A30 BIT #100010,@#LPCSR ;DONE OR ERROR? BEQ A30 CLR -(SP) JSR PC,LPINT A30: BIT #100,@#SWR BNE A20 BIT #100200,@#DSCCSR ;DISC READY OR ERROR? BNE A10 BR A20 .PAGE LPINT: MOV #4000,]NG SPECIAL SET OF 16 OPTIMUM SET LPDC80: DECB CNTR16 ;IS THIS SET OF 16 DONE? BNE LPDC30 ;NOT YET MOVB #16.,CNTR16 ;YES: RESET COUNT ADD #17.,R0 ;SKIP NEXT 16 CHRS CMP R0,#140 ;GONE PAST LAST CHAR? BLT LPDC70 ;NO SUB #100,R0 ;YES:RESET MODULO<40-140> BR LPDC70 ;GO SEE IF BUF IS FULL ; ;------------------------------- ; THIS IS THE ERROR STATUS _WORD XCOUNT ;HOLDS #WDS/RECORD EXEC02:BIT #1,EXCOM ;WAS IT READ? BEQ MORECS ;NO: NO TEST BIT #4,@#SWR ;BYPASS PRINTOUT? BNE MORECS ;YES MOV WRITAD,R1 ;YES: COMPARE BUFFERS MOV READAD,R2 MOV XCOUNT,R5 ;# OF WORDS IN RECORD TO COMPAR .PAGE XLOOP1:DEC R5 ;REACHED END? BMI MORECS ;YES CMP (R1)+,(R2)+ ;COMPARE LIST ENTRY BEQ XLOOP1 ;A`R1 MOV #40,@#LPCMD ;RESET BIT #10000,@#SWR BNE LPRTI BIT #20000,@#SWR BEQ LP100 MOV #144000,R1 LP100: MOV #1,@#LPLF MOV #LPBUF,@#LPMA MOV #-66.,@#LPWC MOV R1,@#LPCMD LPRTI: RTI .PAGE DSCINT: MOV @#DSCCSR,R0 BPL DSCA10 BIT #40000,@#SWR BEQ DSCA05 HALT DSCA05: MOV #400,@#DSCCSR INC aCHECK MADE @ BEGIN AND AFTER EACH LINE LPD.ST: MOV @#R.ST,-(SP) ;PUSH STATUS ONTO STACK BIT #40031,(SP) ;ANY ERROR BITS SET? BNE LPDS50 ;YESSIR: GO FOR ERROR RETURN BIT #2,(SP) ;TEST ON-LINE BEQ LPDS50 ;ON-LINE NOT SET ADD #2,2(SP) ;BUMP RETURN ADDRESS FOR GOOD EXIT LPDS50: TST (SP)+ ;POP STATUS OFF STACK RTS PC ;TAKE EITHER ERROR OR GOOD RETURN ; b :.7 "7 7 ȀXZ*(>  5x*U*L 8& h x5 x *p5& 5@x5. 5x5 x >* _ 5@x O*R J FߋxD:6*ėx$   @ {*(  TEST LINE FOR cGREE JSR PC,CRLF ;BEGIN NEW LINE FOR PRINTOUT MOV R1,R4 ;CURRENT ADDRESS + 2 SUB WRITAD,R4 ;GET OFFSET + 2 TST -(R4) ;GET CURRENT OFFSET JSR PC,PRINT MOV -2(R1),R4 ;GET CONTENTS OF WRITE BUFFER JSR PC,PRINT MOV -2(R2),R4 ;GET CONTENTS OF READ BUFFER JSR PC,PRINT BR XLOOP1 ; PRINT: JSR PC,PRTNUM JSR PC,FORMAT RTS PC .PAGE MORECS = dERRCNT DSCA10: INC COUNTA BNE DSCA20 INC COUNTB DSCA20: TSTB @#SWR BPL DSCA30 HALT DSCA30: MOV DSCBUF,@#DSCMA MOV DSCWDS,@#DSCWC MOV TRACK,@#DSCADR MOVB @#SWR,R4 MOV R4,@#DSCCSR MOV DELAY,R5 DEC R5 BNE .-2 RTI .PAGE PARITY: CLR R0 MOV #7,R1 MOV R4,R5 PAR100: ASR R5 ADC R0e .PAGE ; THIS IS THE 'GET PARITY' SUBROUTINE. IT SETS/CLEARS THE PARITY ; BIT IN THE 7-BIT CHARACTER WHICH IS ON TOP OF THE STACK ON ENTRY, ; BUT ONLY IF BIT SWITCH #15 ON THE CONSOLE IS SET. OTHERWISE ALL ; PARITY BITS WILL BE CLEAR, WHICH IS CORRECT FOR ABOUT HALF OF THEM GETPTY: TST CONSOL ;IS PARITY OPTION SELECTED? BPL GETPEX ;OPTION NOT SELECTED MOVB #7,PTYCNT ;WILL TEST SEVEN BITS CLRB PARITY ;WILL *LCOMBINED DMA PRINTER AND DISC EXERCI{*pSERABCDEFGHIJKLMNOPQRSTUVWXYZ1234567*890'(*)=,$.ABCDEFGHIJKLMNOPQRSTUVWXY=Z1234567890'(*)=,$.g . ;HERE AFTER COMPLETION OF COMMAND BIT #4,EXCOM ;CHECK FOR FILE MARK COMMAND BNE FILMRK ;YES: ALREADY DID IT BIT #313,EXCOM;CHECK FOR PER-RECORD COMMAND BEQ MOREFILES;NOT A PER-RECORD COMMAND DEC XRECS ;ANY MORE RECORDS? BNE CALDRV ;YES: GO DO THEM BIT #12,EXCOM ;WAS LAST COMMAND WRITE? BEQ MOREFILES ;NO:DON'T WRITE E-O-F BIT #40000,@#SWR;IS E-O-F OPTION SELECTED ? BEQ MOR DEC R1 BNE PAR100 ASL R4 ASR R0 RORB R4 RTS PC COUNTA: 0 COUNTB: 0 ERRCNT: 0 DELAY: 1 DSCWDS: -400 TRACK: 1000 DSCBUF: 20000 LPBUF: .ASCII "TEST LINE FOR COMBINED DMA PRINTER AND DISC EXERCISER" .ASCII "ABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890'(*)=,$." .ASCII "ABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890'(*)=,$." LPBFND = .-1 .END iACCUMULATE BIT COUNT HERE MOVB 2(SP),-(SP) ;CREATE WORKING CHARACTER GETP10: RORB (SP) ;SHIFT OFF LOW BIT ADCB PARITY ;ACCUMULATE DECB PTYCNT ;MORE BITS? BNE GETP10 ;MORE! TST (SP)+ ;;POP WORKING CHAR OFF STACK ASLB 2(SP) ;;POSITION CHAR TO ACCEPT PARITY BIT RORB PARITY ;LOAD 'C' WITH PARITY BIT RORB 2(SP) ;SHIFT PARITY BIT Ij0 :*  P t*$P < e %*H  b:5wn7 X7 *lV7 XE7  E *BEw5 wX  wN a*7 7  -*Kd x* U  U U5X* 7Atp!  X*De E7 kEFILES ;NO:NO WRITE E-O-F MOV EXCOM,R0 ;CURRENT COMMAND BIC #146777,R0 ;LEAVE INTRT ABLE & UNIT SELECT BIS #4,R0 ;SET WRITE FILE MARK MOV R0,EOFCOM ;CREATE CORRECT E-O-F COMMAND WRTEOF:JSR R5,MDRIVE ;WRITE FILE MARK BR MOREFILES .WORD EOFCOM ; MOREFI = . ;CHECK FOR MORE NON-SPACE ;RECORD OR FILE COMMANDS BIT #73,EXCOM BEQ EXRTN ;NOT RECORD OR FIl HALT C05JMP: JMP TIMC05 LEVEL: 0 VECTOR: 320 ENBAD: 167002 MSECS: 10.*1000.+1 DLYCTR: 0 INTCNT: 0 BITFLG: 0 INTFLG: .WORD 0 ENBPAT: 0 INTADS: .WORD 0,INTC,INTB,INTA ;ADDRESSES OF INT RTNES ; DELAY: MOV R5,DLYCTR DLOOP1: MOV #202.,R5  ;1 MSEC LOOP DEC R5 BNE .-2 DEC DLYCTR BNE DLOOP1 RTS PC INTRAD: INTRC,INTRB,INTRA MINSET: 1 MINS: 0 CONTA1: 0 CONTA2: 0 CONTB1: 0 CONTB2: 0 COUNTC: 0 COUNTD: 0 CALIBRATE: MOV mNTO CHARACTER GETPEX: RTS PC ;BACK WITH CHARACTER ON TOP OF STACK ; ; ; THE FOLLOWING SUBROUTINE IS A BASIC 1-MILLISECOND DELAY. ; IT LOOPS FOR 'N' MILLISECONDS, WHERE 'N' IS THE NUMBER ON TOP ; OF THE STACK ON ENTRY. THE STACK IS CLEARED BEFORE EXIT. ; DELAY: MOV 2(SP),-(SP) ;PUT 'N' FORWARD MOV 2(SP),4(SP) ;PUT RETURN ADDRESS BACK ONE WORD DELAY1: MOV #132.,2(SP) ;BASIC DELAY FOR 1 M-SEC DELAY2: DEC 2(SP) ;COUNT I8 6 4]00*h7!, 5@xw*'w * :."V*P @XwVa*7 7 7 7 7 hE7@]*H     (@  p7 -oLE COMMAND FILMRK: ;DONE WRITING FILE MARK DECB XFILES ;MORE FILES? BNE NEWFILE ;YES EXRTN: RTS PC ;EXIT EXEC ROUTINE .PAGE ; MAG TAPE DRIVER ; ; CALLING SEQUENCE ; JSR R5,MDRIVE ; BR NEXT ; .WORD A(COMMAND) ; .WORD A(MEM ADDR) ; .WORD A(COUNT) ; ;THIS IS THE MAG TAPE DRIVER ROUTINE MDRIVE:CLR R3 ;RESET ERROR NUMBER MOV @2(R5),R1 ;COMMAND BIp VECTOR,R0 MOV #4,R2 CALB00: MOV INTRAD(R2),(R0)+ MOV R1,(R0)+ DEC R2 DEC R2 BGE CALB00 MOV #WALL,100 MOV R1,102 LOOP: MOV #60.*60.,COUNTD ;INIT MINUTE TIMER MOV MINSET,MINS CLR CONTA1 CLR CONTA2 CLR CONTB1 CLR CONTB2 CLR COUNTC MOV SWR,R0 BIC #-34-1,R0 MOV R0,167002 qT, MAN BNE DELAY2 ;KEEP GOING... DEC (SP) ;THIS IS THE # OF M-SECS TO DELAY BNE DELAY1 ;OUTER LOOP STILL HOT CMP (SP)+,(SP)+ ;POP 'N' AND LOCAL COUNTER OFF STACK RTS PC ;GO BACK ; ; ; THIS IS THE SCOPE ROUTINE. IF BIT SWITCH #3 IS NOT SET, ANY ; ERROR WILL CAUSE STOP HERE, WITH STATUS DISPLAYED IN "DATA" LIGHTS. ; IF THE SWITCH IS SET, ALL ERRORS WILL FALL THROUGH HERE, AND ; TrTST (R1)+ ;BUMP TO VECTOR+2 MOV R1,(R0)+ ;PUT #VECTOR+2 IN VECTROR CLR (R1)+ ;PUT A HALT IN VECTOR+2 TST (R0)+ ;KEEP UP WITH R1 TSTB R0 ;AT 400 YET? BNE LPDA10 ;LO BYTE CLEARS FIRST AT 400 ;------------------------------- MOV #LPDI10,200 ;INIT INTERRUPT TO ERROR LOC'N MOV #340,202 ;INTERRUPT STATUS MOV #SCOPEI,30 ;INIT EMT VEsC #147777,R1 ;UNIT # CMP R1,CURUNT ;SAME AS PREVIOUS? BNE MDRV02 ;NO MDRV01:CLRB EXSWCH ;NORM EXIT SWITCH MOV CURUNT,@#MTC;SELECT UNIT IN CASE RESET JSR PC,DELAY ;MUST WAIT BEFORE STATUS CHECK BIT #100,@#MTS ;CTRLR BUSY? BNE ERR2 ;YES BIT #200,@#MTS ;READY? BEQ ERR3 ;NO BIT #16,@2(R5) ;WRITE REQUEST? BEQ MDRV06 ;NO: NO FPT CHECK BIT #1,@#MTS ;WRIt MOV #100,177546 WAIT BR .-2 INTRA: INC CONTA1 BNE AEXIT INC CONTA2 AEXIT: RTI INTRB: INC CONTB1 BNE BEXIT INC CONTB2 BEXIT: RTI INTRC: INC COUNTC RTI WALL: DEC COUNTD BNE WEXIT CLR 167002 MOV #7,177566 HALT BR LOOP WEXIT: RTI PGMEND = . .END uHE DIAGNOSTIC WILL CONTINUE IN SPITE OF THEM ; SCOPEI: CMP (SP)+,(SP)+ ;IT IS ENTERED BY EMT: POP STACK BIT #10,CONSOL ;IS "SCOPE" BIT SET? BEQ SCOPE1 ;NO: THEN HALT SCOPE2: JMP LPDD ;IS SET: THEN CONTINUE SCOPE1: MOV @#R.ST,R0 ;DISPLAY STATUS IN LIGHTS STOP03: HALT ;FIRST HALT TO DISPLAY STATUS MOV -4(SP),R0 ;NOW SHOW THE ADDRESS OF THE ERROR STOP04: HALT ;...DURING THE vCTOR ; SET UP TO READ IN THE FIVE OPTIONS MOV #BYTLST,R0 ;TOP OF BYTE LIST MOV #5,R1 ;FIVE OPTIONS STOP00: HALT ;STOP HERE FOR FIRST PARAMETER LPDA15: BITB #177,@#SWR+1 ;IS BYPASS OPTION ELECTED? BNE LPDB10 ;YES: SKIP ALL INPUTTING TST @#SWR ;IS BIT #15 SET? BMI LPDA20 ;SWITCH SET TO BYPASS THIS ONE ONLY MOVB @#SWR,(R0) ;LOAD PARAMETER (LOW BYTE) wTE PROTECT? BNE ERR4 ;YES .PAGE MDRV06: MOV #100,@#TKS ;RESET CONTROLLER (CLEAR STAT & COMMAND) BIT #13,@2(R5) ;IS IT EITHER READ OR WRITE? BEQ MDRV03 ;NO: NOT BUFFER COMMAND BIT #1,@2(R5) ;IS IT READ? BEQ MDRV07 ;NO: SKIP BUFFER CLEAR MOV READAD,R0 ;CURRENT READ BUFFER BEGIN MDRV08: CLR (R0)+ ;CLEAR READ BUFFER CMP R0,#READBF+BUFLTH-2 ;REACySECOND HALT BR SCOPE2 ;GO AGAIN AFTER 'CONTINUE' ; ; BYTLST = . ;LIST OF PARAMETER BYTES... ; ...LOADED AT BEGIN OF RUN PFCHAR: .BYTE 0 ;HOLDS PAPER-FEED CHARACTER, IF ANY COUNT: .BYTE 0 ;HOLDS WORD COUNT FOR LINE WIDTH PAGE: .BYTE 0 ;HOLDS NUMBER OF LINES PER PAGE HOMECH: .BYTE 0 ;HOLDS CHANNEL # FOR TOP-OF-FORM, SPEED: .BYTE 0 ;HOLDS MINIMUz LPDA20: TSTB (R0)+ ;BUMP HERE IN CASE OF BYPASS STOP01: HALT ;WAIT FOR OPERATOR TO SET UP SWITCHES DEC R1 ;ANY MORE? BGT LPDA15 ;YES LPDB10: JSR PC,LPD.ST ;CHECK STATUS ERR010: SCOPE ;ERROR RETURN:BAD STATUS BIT #4,@#R.ST ;IS READY SET? BNE .+4 ;YES ERR020: SCOPE ;READY NOT SET MOVB #40,SCHAR ;INIT SYNTHETIC CHAR {HED BUFFER LIMIT? BLOS MDRV08 ;NOT YET MDRV07: ;CONTINUE MOV @4(R5),@#MTA ;LOAD MEM ADDR REG MOV @6(R5),@#MTN ;LOAD COUNTER REG MDRV03:MOV @2(R5),R0 ;FETCH COMMAND WORD FROM LIST MDRV3A:MOV R0,R2 ;TEMPORARY SWAB R2 BIC #177775,R2;GET INT ABLE BIT MOVB R2,MINTFG ;SAVE (EITHER 10 OR 0) CLR @#MTS ;STATUS REG RESET ;****************************************************** MOV R0,@#MTC ;LO|;TIMDGN.S07 ;27-JAN-72 ;TIMDGN.S04 ; ************* T I M D G N . P A L ************************** ; 26-JAN-72 ; 20-JAN-72 ; TIMER MODULE DIAGNOSTIC ROUTINE - TEST #1 OF 4 ; THIS ROUTINE SETS UP THE INTERRUPT VECTORS, ; CLEARS CORE UP TO THE LOADERS, SETS CPU LEVEL TO 7, ; ENABLES THE MODULE INTERRUPTS, AND DELAYS FOR ; FIVE SECONDS. THEN IT DROPS THE CPU PRIORITY BY ONE ; LEVEL, AND COUNTS THE INTERRUPTS AND THE ORDER ; IN WHICH THEY COME IN. IF THE INTERRUPTS}M DELAY AFTER PRINT CNTR16: .BYTE 0 ;COUNTER FOR OPTIMUM SET LINENO: .BYTE 0 ;CURRENT LINE NUMBER PARITY: .BYTE 0 ;USED TO CALC CHARACTER PARITY PTYCNT: .BYTE 0 ;...ALSO SCHAR: .BYTE 0 ;SYNTHETIC FIRST CHARACTER WDCNT: .BYTE 0 ;WORD COUNT (LINE WIDTH) .EVEN PFWORD: .WORD 0 ;HOLDS P/F CHAR FOR T-O-F IN AUTO MODE BOUNDL: .WORD 377 ;LOWER BUFFER BOUNDARY BOUNDH: .W~ MOVB #66.,WDCNT ;INIT PAGING PARAMETERS MOVB PAGE,LINENO BNE LPDB15 ;INIT PAGE SIZE IF SPECIFIED... MOVB #66,LINENO ;...ELSE SET FOR FULL PAGE LPDB15: JSR PC,LPDC  ;BUILD FIRST BUFFER ; ; NOW WE ARE READY TO COMMAND PRINT OF THE LINE ; ; THIS IS ENTRY POINT TO PRINT ANOTHER LINE ; ; NOW COMPUTE WORD- AND LINE-COUNTS LPDD: MOV CURBUF,R0 ;BUFFER START: NO P/F CHARACTER MOVB COUNT,R1 AD COMMAND REGISTER: ;INITIATES TAPE OPERATION ;****************************************************** JSR PC,DELAY ;MUST WAIT BEFORE CHECKING STATUS .PAGE MDRV05: BIT #1000,@2(R5) ;INTRPT ABLED? BEQ BUSYCK ;NO: CHECK BUSY LOADCK: ;LOAD-POINT CHECK BIT #2,@#MTS ;AT LOAD POINT? BNE BUSYCK ;YES: WAIT FOR BUSY TO CLEAR TSTB MINTFG ; FAIL TO ; COME IN IN THE PROPER ORDER, OR FAIL TO COME IN ; AT ALL, THE TEST WILL HALT WITH THE ERROR NUMBER ; DISPLAYED IN THE "DATA" LIGHTS. ; ; R0 = %0 R1 = %1 R2 = %2 R3 = %3 R4 = %4 R5 = %5 SP = %6 PC = %7 PS = 177776 SWR = 177570 ; ; ; INIT ALL VECTORS BELOW 400 WITH "HALTS" ; .ASECT .=16000 TIMA00: MOV #.,SP  ;INIT STACK CLR R0 CLR R1 TIMA10: TST (R1)+ MOV R1,(R0)+ CLR (R1)+ TST (R0)+ TSTB R0 BNE TIMA10 MORD LP.DGN-37 ;UPPER BUFFER BOUNDARY CURBUF: .WORD 0 ;BEGINNING OF CURRENT BUFFER CURBND: .WORD 377  ;END OF CURRENT BUFFER TIMOUT: .WORD 3200. ;# OF 31-MICROSEC WAIT-LOOPS FOR INT TIMER: .WORD 0 ;USED TO TIME IT OUT DONDLY: .WORD 202. ;WAIT AFTER 'DONE' FOR INT: 1 MILLISEC DAMP: .WORD 1233 ;FIRST TERM FOR RANDOM # GENERATOR SEED: .WORD 7622 ;FIRST SEED FOR ABOVE CONSOL: 0  ;LINE WIDTH: NO P/F CHAR BNE LPDD20 ;WILL USE 'COUNT' SPECIFIED DECB WDCNT ;USE AUTOMATIC LINE WIDTH BNE LPDD10 ;STILL SHRINKING MOVB #66.,WDCNT ;FULL LINE AGAIN LPDD10: MOVB WDCNT,R1 ;TMP'Y HOLD LPDD20: BIT #1,@#SWR ;AUTO MODE? BNE LPDD30 ;YES: NO P/F CHAR INC R1 ;IN P/F MODE: ONE EXTRA WORD TST -(R0) ;AND ONE WORD SOONER IN BUFINTRPT ABLED: WATCH FLAG BNE LOADCK ;NO INTRPT YET: CHECK LOAD POINT AGAIN EXIT: TSTB EXSWCH ;EXIT OR RETURN? BNE MDRV01 ;BACK AFTER NEW UNIT SELECT MOV @#MTS,STAT;SAVE STATUS BIT ERRPAT,STAT;SEE IF ANY ACTIVE ERRORS BNE ERR5 ;YES:OPERATOR MUST DUMP STATUS RTS R5 ;EXIT DRIVER ; BUSYCK:BIT #100,@#MTS;CHECK "BUSY" BIT BNE BUSYCK ;STILL BUSY BR EXIT ;BUSY BIT IS CLEOV VECTOR,R0 MOV #340,R1 MOV #6,R2 TIMA20: MOV INTADS(R2),(R0)+ ;INIT PC VECTOR MOV R1,(R0)+  ;INIT PS DEC R2 DEC R2 BNE TIMA20   ;LAST TABLE LOC = 0 ; ; MOV #TIMB20,4  ;FIND HOW MUCH CORE CLR R0 TIMB10: TST (R0)  ;WILL TRAP ON NO CORE ADD #20000,R0 ;NEXT BAY BR TIMB10 TIMB20: MOV #6,4   ;TRAP HERE:RESET VECTOR CMP (SP)+,(SP)+  ;RESET STACK SUB #300,R0   ;BACK OFF BELOW LOADERS TIMB30: CLR -(R0)   ;CLEA ;HOLDS CONSOLE OPTIONS .END FER MOVB PFCHAR,(R0) ;LOAD FIRST BUFF WORD W/P/F CHAR BR LPDE20 ;GO SET UP PRINTER REGISTER... ;BYPASS AUTO PAGE COUNT LPDE90: MOVB HOMECH,R2 ;USE VFU TO SKIP TO TOP-OF-FORM BISB #100,R2 ;COMBINE CHANNEL # AND VFU COMD BIT BR LPDE10 ;GO PUT IT OUT LPDD30: BIT #2,@#SWR ;DOUBLE SPACE? BEQ LPDD40 ;NO DECB LINENO ;YES:COUNT TWO LARED ; DELAY: MOV #20,R0 ;MUST WAIT SHORT TIME BEFORE DEC R0 ;MAKING FIRST CHECK ON STATUS BNE .-2 RTS PC ; MDRV02:BIT #100,@#MTS;TEST CTRLR STATUS "BUSY" FLAG BNE ERR1 ;OLD UNIT STILL BUSY INCB EXSWCH ;SET SWITCH TO RE-ENTER ROUTINE MOV @2(R5),R0 ;AFTER NEW SELECT BIC #146777,R0 ;GET NEW UNIT # & INT ABLE MOV R0,R1 BIC #147777,R1 MOV R1,CURUNT ;SAVE NEW UNIT # R ALL CORE CMP R0,#PGMEND  ;...DOWN TO THIS PGM BHI TIMB30 ;------------------------- MOV ENBAD,R3 BIT #4000,SWR ;RUN CALIBRATE? BEQ TIMC05 JMP CALIBRATE TIMC05: MOV #TIMA00,SP TIMC10: RESET   ;CLEAR EVERYTHING, INCLUDING STALL CLR CONTA1 CLR CONTA2 CLR COUNTC MOV SWR,R0 MOV R0,R1 BIC #-34-1,R0 MOV R0,R2 MOV R0,ENBPAT e* 6##  Z*DASA ECODBERE KITIEN$MOPR AS DU ZZj*&^ %0 e@@e*m &   c `@@ @?*)#&%7 2JANFEBMARAPRMAY*JUNJULAUGSEPOCTNOVDECL e* `  %@ 44`*4W-& 5"< de&X#N#e % INES LPDD40: DECB LINENO BGE LPDE20 ;NOT END OF PAGE YET MOVB PAGE,LINENO ;REACHED END: RESET BICB #340,HOMECH ;IS VFU OPTION SELECTED? BNE LPDE90 ;YES ;NO: WILL TRY TO SKIP 'N' LINES TSTB PFCHAR ;ALLOWED TO DO A P/F COMMAND? BEQ LPDE20 ;NO: FILL ENTIRE PAGE MOV #66.,R2 ;YES: CALC # OF LINES TO SKIP MOVB PAGE,R3  BR MDRV3A ;NOW SELECT UNIT .WORD ,,,,,,,,,, ;PATCH SPACE ; ; ERR5: INC R3 ;MASKED ERROR(S) FOUND AT COMPLETIOM ERR4: INC R3 ;FILE PROTECT VIOLATION ERR3: INC R3 ;CONTOLLER NOT READY ERR2: INC R3 ;CONTROLLER BUSY ERR1: INC R3 ;OLD UNIT BUSY ON NEW SELECT ADD #60,R3 ;FORM ERROR NUMBER IN ASCII JSR PC,PRTERR ;GO PRINT ERROR MESSAGE JMP DMPSTA ;SEE IF STATUS DUMP BEFORE EXIT ; ; PRTERR: CLR R5 MOV #5,R4 TIMC11: ASR R2 ADC R5 DEC R4 BNE TIMC11 MOV R5,R2 BIC #-340-1,R1 MOV R1,LEVEL BIT #20000,SWR BNE TIMC12 MOV R1,PS MOV R0,(R3) BR TIMC13 TIMC12: MOV R0,(R3) MOV R1,PS TIMC13: CLR R4 MOV #2,BITFLG CLR INTFLG CLR INTCNT MOV MSECS,R5 ;*&^ % 6DECNOVOCTSEP*AUGJULJUNMAYAPRMARFEBJANXXX .*E 5 @`e"* /: W: "` *@0- Lt *&^ %eE ɕ * hɊ4$ JRR X*A!⊎ &. P f*%f/ @e h"RA8"*2 Ɍ",$* ;NO SUCH THING AS A BYTE SUBTRACT SUB R3,R2 LPDE10: MOV R2,-(SP) JSR PC,GETPTY ;GET EVEN PARITY(IF ALLOWED) MOVB (SP)+,PFWORD ;NOW HAVE EITHER SKIP-LINE... ;...OR SKIP-TO-CHANNEL COMMAND ; ; NOW OUTPUT THIS ONE-WORD P/F COMMAND AND WAIT FOR FINISH CLR @#R.LF ;SET MODE TO P/F MODE MOV #PFWORD,@#R.AD ;ADDRESS OF LINE/CHANNEL COMMAND WORD MOV #-1,@#R.WC ;ONLY ONEJSR PC,CRLF ;PRINT ERROR MESSAGE JSR R5,ONCH .WORD ERRBUF .WORD 4 MOV R3,R4 JSR PC,OCH ; GO PRINT ERROR NUMBER RTS PC ERRBUF:.ASCII /ERR / .EVEN ; ; OUTIN: JSR PC,PRTNUM ;PRINT CURRENT VALUE OF PARAME JSR R5,ONCH .WORD REQBUF .WORD 4 JSR R5,INN ;REQUEST A NEW VALUE IFLAG: .BYTE 0 ;ERROR FLAG IDIGS: .BYTE 0 ;# DIGITS TSTB IDIGS ;ANY DATA? DELAY FOR "MSECS" MILLISECONDS JSR PC,DELAY ;///////////////////////////////////////////////////////////////////// SUB #40,@#PS  ;DROP CPU STATUS TO LET ;     INTERRUPTS COME IN. ;///////////////////////////////////////////////////////////////////// BR .+2 BR .+2 BR .+2 CMP INTCNT,R2 BEQ TIMC20   ;YES MOV INTFLG,R0 BR SCOPE   ;TOO FEW OR TOO MANY TIMC20: RESET MOV #7,177566 MOV #100.,R5 JSR Ɋ,^ "*4$ $RR"*X&( @ %   |A*vv@K * `Be (/*e E T%T%T%TTTpT **$ (a% e}*e e  e %& H*4&eJ###  p&*Xf&e"f&AAcD#|D 7 WORD MOV #4000,@#R.CM ;!!!!!COMMAND PRINT!!!!!! TST @#R.ST ;WAIT FOR DONE BEQ .-4 LPDE20: MOV R0,@#R.AD ;BUFFER START ADDRESS NEG R1 ;WORD COUNT IS NEGATIVE MOV R1,@#R.WC ;OUTPUT WORD COUNT MOV @#SWR,R0 ;GET SWITCH OPTIONS MOV R0,@#R.LF ;SET UP AUTO OR P/F MODE SWAB R0 BIC #37777,R0 ;GET INTERRUPT ENABLE BITS BIS #400 BNE RTN ;YES JMP DIALOG ;NO: HE WAS JUST LOOKING RTN: RTS PC ;NEW DATA IN R4 REQBUF:.ASCII / ?:/ ERRSET:MOV ERRPAT,R4 ;CURRENT MASK FOR STATUS WORD JSR PC,OUTIN ;PRINT AND ASK MOV R4,ERRPAT ;STORE NEW ONE BR ERRSET ;VERIFY LOC: MOV OFFSET,R4 ;MEMORY BUFFER LOCATION JSR PC,OUTIN ;PRINT & ASK MOV R4,OFFSET ;STORE NEW VALUE MOV R4,R3 ;OFFSET ADD #WRITBF,R3 ;CALC PC,DELAY TST @#SWR BMI TIMC10   ;DO IT AGAIN MOV #177777,R0 HALT    ;SUCCESSFUL FINISH BR TIMC10   ;AFTER "CONTINUE" SWITCH ;--------------------------------------------------------------------- INTA: INC CONTA1 BIS #4,R4 BR INTSVC INTB: INC CONTB1 BIS #10,R4 BR INTSVC INTC: INC COUNTC BIS #20,R4 INTSVC: BIT #10000,SWR BEQ INTSFILE 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(*0,R0 ;SET 'START' BIT ;////////////////////////////////////////////////////////// MOV R0,@#R.CM ;!!!!!!!P R I N T!!!!!!!! ;////////////////////////////////////////////////////////// ; MOV #LPDI20,200 ;SET INTERRUPT VECTOR TO THE ROUTINE JSR PC,LPDC ;USE THIS TIME TO CREATE NEXT BUFFER ; ;------------------------------- ; ; NOW WE WAIT HERE UNTIL EITHER THE INTERRUPT COMES (IF ENABLED) ; ..OR UNTIL 'DONE' COMES UP (IF INTERACTUAL MEMORY LOC'N MOV R3,WRITAD ;LOAD IT ADD #READBF,R4 ;CALC BEGIN OF READ BUFFER MOV R4,READAD BR LOC ;PRINT AGAIN FOR CHECK ; RECNT: MOV NRECS,R4 ;# OF RECORDS PER FILE JSR PC,OUTIN MOV R4,NRECS BR RECNT FILECT:MOVB NFILES,R4 ;# OF FILES PER TEST JSR PC,OUTIN MOVB R4,NFILES BR FILECT ; WORDCT:MOV XCOUNT,R4 ;#WORDS/RECORD JSR PC,OUTIN MOV R4,XCOV1 BIC R4,ENBPAT MOV ENBPAT,(R3) INTSV1: CMP SP,#TIMA00-4 ;CHECK FOR PROPER PUSH BEQ INTS10   ;O.K. MOV #400,R0 BR SCOPE   ;STACK INCORRECT INTS10: TST DLYCTR BEQ INTS20   ;DELAY HAS COMPLETED MOV #1000,R0 BR SCOPE INTS20: MOV 2(SP),R0 ;CHECK LEVEL OF CPU @ TIME OF INT ADD #40,R0 BIC #177437,R0 CMP R0,LEVEL BEQ INTS30 MOV #1400,R0 BR SCOPE INTS30: 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 >ߋt'@* fARUPT NOT ENABLED). ; ERROR STOPS ARE PROVIDED FOR STATUS ERRORS, UNEXPECTED INTERRUPTS, ; OR NO RESPONSE AFTER A MAXIMUM ALLOWED TIME INTERVAL. LPDF10: MOV TIMOUT,TIMER ;SET MAXIMUM TIMER MOV @#R.ST,R1 ;FETCH STATUS BMI LPDF20 ;'DONE' IS UP!! COM R1 ;INVERT ALL BITS THAT SHOULD BE SET BIT #40002,R1 ;TEST BUSY AND ON-LINE FOR SET BEQ LPDF70 ;BOTH ARE SET ERR030: SCOPE UNT BR WORDCT ; ; MINT = . ;THIS IS THE MAG TAPE INTERRUPT RTNE TSTB MINTFG ;IS MAG TAPE INTERRUPT EXPECTED? BNE .+10 ;YES HALT ;;NO: ERROR JMP DIALOG ;MAY "CONTINUE" AFTER HALT CLRB MINTFG ;SHOW THAT INTERRUPT HAS COME I RTI ; COMMND:MOV COMAND,R4 ;COMMAND FORMAT (MANUAL) JSR PC,OUTIN MOV R4,COMAND BR COMMND ; PARAMS:MOV #PLIST,R2 ;LIST INPUT PARAMETERS  INC INTCNT ASL BITFLG BIS BITFLG,INTFLG CMP R4,INTFLG BEQ INTS40 MOV #2000,R0 BR SCOPE INTS40: RTI  ;RETURN AND IMMEDIATELY PROCESS ANOTHER INT ;   ...UNLESS THIS IS LAST ONE, IN WHICH CASE ;   ...MAIN PROGRAM WILL MAKE FINAL CHECKS. ;---------------------------------------------------------------- SCOPE: CLR (R3) ;DISABLE ALL INTS BIT #40000,@#SWR BNE C05JMP HALT ! 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 &&&A |  ;ERROR: ONE OF THEM WAS NOT SET LPDF70: COM R1 ;BACK TO NORMAL BIT #34,R1 ;TEST FOR ERRORS OR READY BEQ LPDF80 ;GOOD: NONE IS SET ERR040: SCOPE ;ERROR:AT LEAST ONE OF ABOVE IS SET LPDF80: DEC TIMER ;WAIT FOR 'DONE' OR INTERRUPT BNE LPDF10 ;KEEP LOOPING CLR @#R.CM ;DISABLE INTERRUPT: TIMER IS ZERO ERR050: SCOPE ;ERROR: TIME'S UP: NO FINISH ; L BR STAT1 ;USE PRINT STATUS ROUTINE ; STATUS:MOV #SLIST ,R2 ;PRINT STATUS WORDS STAT1: MOV (R2)+,R4 ;GET NEXT REGISTER ADDRESS BEQ DLGRTN ;LAST ENTRY IS ZERO MOV (R4),R4 ;GET CURRENT REGISTER CONTENTS JSR PC,PRTNUM JSR PC,FORMAT BR STAT1 ; SLIST: .WORD MTC,MTS,MTN,MTA,STAT,0 ; PLIST: .WORD COMAND,OFFSET,XCOUNT,NRECS,NFILES .WORD ERRPAT,0 ; ; DATAIN = . ;THIS IS THE ALL-PURPOSE DATA RTNE  MOV R4,R0 HALT C05JMP: JMP TIMC05 LEVEL: 0 VECTOR: 320 ENBAD: 167002 MSECS: 10.*1000.+1 DLYCTR: 0 INTCNT: 0 BITFLG: 0 INTFLG: .WORD 0 ENBPAT: 0 INTADS: .WORD 0,INTC,INTB,INTA ;ADDRESSES OF INT RTNES ; DELAY: MOV R5,DLYCTR DLOOP1: MOV #202.,R5  ;1 MSEC LOOP DEC R5 BNE .-2 DEC DLYCTR BNE DLOOP1 RTS PC INTRAD: INTRC,INTRB,INTRA MINSET: 1 MINS: 0 CONTA1: 0 CONTA2: 0 CONTB1: 0 CONTB2: 0 COUNTC: 0 COUNTD: 0 CALIBRATEK* &^ % e0e K" A  * W$@ $` @ *  F e 8  @ 1   * A% W)E((x:      0F* &^ % @ ̋'@ߓf*   D @e   *    % % E4$  *  %@eJ!!! E0v8 p 2* &^ %ea@W0=&& & PDF20: CLR @#R.CM ;DISABLE INTERRUPT BIT #40031,R1 ;TEST BUSY,PARITIES, AND LOW PAPER BEQ LPDF40 ;NONE UP: O.K. ERR060: SCOPE ;STATUS ERROR WITH 'DONE' LPDF40: TSTB @#SWR ;WAS THE 'DONE' INTERRUPT ENABLED? BPL LPDG00 ;NO: THIS IS THE CORRECT SEQUENCE MOV DONDLY,R3 ;ENABLED: WAIT FOR INTERRUPT... DEC R3 ;...FOR ADDITIONAL DELAY... BNE .-2 MOVB #SPCE,R4 JSR PC,OCH MOV #'=,R4 JSR PC,OCH ;REQUEST 'B' OR "W" JSR PC,ICH ;FIRST CHR MOV #100000,R1 ;READY FOR BYTE SET/CLEAR CMP #'W,R4 ;"W"? BEQ DWORD ;YES:FORM LIST BY WORDS CMP #'B,R4 ;"B"? BEQ BWORD ;YES:FORM BY BYTES BR DATAIN ;TRY AGAIN DWORD: BIC R1,MOVINS ;SET FOR WORD REFERENCES BIC R1,DMOVE BIC R1,PRTDAT BR GETCHR: MOV VECTOR,R0 MOV #4,R2 CALB00: MOV INTRAD(R2),(R0)+ MOV R1,(R0)+ DEC R2 DEC R2 BGE CALB00 MOV #WALL,100 MOV R1,102 LOOP: MOV #60.*60.,COUNTD ;INIT MINUTE TIMER MOV MINSET,MINS CLR CONTA1 CLR CONTA2 CLR CONTB1 CLR CONTB2 CLR COUNTC MOV SWR,R0 BIC #-34-1,R0 MOV R* K<<< B: e  * ` `  d L b $ $"* < A!  a* 2 " KX *4 <LI/: `*X A d   | l* &^ sɌ3 o m7R* A!B0Z0W9* W   B *  •/  :   ;...BETWEEN 'DONE' AND INTERRUPT ERR070: SCOPE ;SHUCKS, INTERRUPT NEVER CAME ; ; ENTER HERE AFTER A SUCCESSFUL 'DONE' WITHOUT INTERRUPT ENABLED ; LPDG00: JSR PC,LPD.ST ;GO MAKE A COMPLETE STATUS CHECK FIRST ERR080: SCOPE ;STATUS ERROR RETURN BIT #4,@#SWR ;IS STALL SELECTED OUT FRONT? BEQ LPDG50 ;NOT TODAY ; STALL FOR A RANDOM # OF M-SECS BETWEEN 8 AND 1023. MOV SEED,R0 ;; GENERAL FILE DUMP PROGRAM R0=%0 R1=%1 R2=%2 R3=%3 R4=%4 R5=%5 SP=%6 PC=%7 TAB=11 LF=12 ; MAIN PROGRAM START: MOV #KBOLNK,-(SP) EMT 6 ; .INIT MOV #KBILNK,-(SP) EMT 6 ; .INIT MOV #LNKOUT,-(SP) EMT 6 ; .INIT MOV #KBOFIL,-(SP) MOV #KBOLNK,-(SP) EMT 16 ; .OPEN (O) 0,167002 MOV #100,177546 WAIT BR .-2 INTRA: INC CONTA1 BNE AEXIT INC CONTA2 AEXIT: RTI INTRB: INC CONTB1 BNE BEXIT INC CONTB2 BEXIT: RTI INTRC: INC COUNTC RTI WALL: DEC COUNTD BNE WEXIT MOV #60.*60.,COUNTD DEC MINS BNE WEXIT CLR 167002 MOV #7,177566 HALT BR LOO BWORD: BIS R1,MOVINS ;SET FOR BYTE REFERENCES BIS R1,DMOVE BIS R1,PRTDAT GETCHR:CLRB $COLON CLR R3 ;WORD IN LIST COUNTER JSR PC,ICH ;2ND CHR:SPACE,COLON,OR RETURN CMPB #':,R4 BEQ COLON ;COLON-REQUEST A NEW LIST CMPB #SPCE,R4 BEQ GETNUM ;PRINT REQUEST W/SPEC'D ADDR CMPB #CR,R4 BEQ DODATA ;RETURN: GO EXECUTE BR DATAIN ;NONE OF ABOVE: TRY AGAIN GETNUM:JSEED (=RNUM(N-1)) ROL R0 ROL R0 ; X4 ADD DAMP,R0 MOV R0,-(SP) ;RNUM(N)=4*RNUM(N-1)+DAMP(N-1) ROL R0 ROL R0 ADD DAMP,R0 ROL R0 ROL R0 MOV R0,DAMP ;DAMP(N)=64*RNUM(N-1)+20*DAMP(N-1) ; RANDOM NUMBER NOW GENERATED AND ROUTINE READIED FOR NEXT TIME BIC #177007,(SP)+ ;MASK 10C@w: 3>C@,B 4w\C@wv D\C@BECTAPE COPY BR DLIST1+2 ;CONTINUE FILLING BUFFER ; ; PRTNUM = . ;PRINT NUMBER SUBROUTINE MOV R0,-(SP) ;SAVE USED REGISTERS MOV R3,-(SP) MOV #6,R0 ;DIGIT COUNT FOR "PRINT A NUMBER" MOV R4,R3 ;# TO PRINT CLR R4 ;1ST DIG ASL R3 ROL R4 BR PRT020 PRT010:CLR R4 ;NEXT 5 DIGS ASL R3 ROL R4 ASL R3 ROL R4 ASL R3 ROL R4 PRT020:ADD ;ONLY INT ON ERROR, AND IT CAME IN LPDI50: BIT #40031,R2 ;TEST BUSY AND ERRORS BEQ LPDG00 ;TEST PASSED: NOW FOR FINAL PROCESSING ERR130: SCOPE ;AT LEAST ONE OF ABOVE IS SET ; ;------------------------------- ; ; THE FOLLOWING ARE SUBROUTINES USED IN DIAGNOSTIC ; ; SUBROUTINE: SELECTS PROPER FIRST CHARACTER FOR NEXT LINE... ; ...AND FILLS BUFFER ACCORDING TO MODE SELECTED LPDC01: MOV BOUNDL,CURBND ;RESET BUFFER TO BOUNDA;# WORDS READ BCC .+4 ;WAS NOT AN ODD NUMBER INC R2 ;DON'T LOSE LAST BYTE CONVRT: ;CONVERT BINARY TO OCTAL ASCII MOV #16.,R3 ;PRINT 8 CELLS PER LINE MOV #OUTDAT,R1 AGAIN: MOV (R0)+,-(SP) ;NEXT BINARY WORD MOV R1,-(SP) ;ASCII LIST POINTER MOV #5,-(SP) ; "BIN2O" EMT 42 ; .CVT FROM BINARY TO OCTAL ASCII ADD #6,R1  V001A  C,CORIGINAL ON UNIT COPY T,*CO UNIT ????  *** I/O ,NCERROR, UNIT  *** UNRECOVERA0rCBLE COPY ERROR M C$!C COPY COMPLETED  C %CVERIFY COPY (Y OR N)? N C #60,R4 ;MAKE TTY CHR JSR PC,OCH ;PRINT CHAR DEC R0 ;DONE? BGT PRT010 ;NO MOV (SP)+,R3 ;RESTORE REGISTERS MOV (SP)+,R0 RTS PC ;RETURN ; ; FORMAT:INCB PPOS ;POSITION POINTER CMPB PPOS,#10 ;8 POS PRINTED? BGE FOR020 ;YES:NEW LINE MOV #40,R4 ;NO:OUTPUT 2 SPACES JSR PC,OCH JSR PC,OCH RTS PC FOR020:JSR PC,CRLF ;DO RETURN &LFRY LPDC: MOV #340,@#PS ;RAISE CPU LEVEL TO INHIBIT INTRPT ADD #134.,CURBND ;CALC END OF NEW BUFFER CMP CURBND,BOUNDH ;HAVE WE GONE BEYOND LIMIT? BHI LPDC01 ;YES: GO RESET MOV CURBND,CURBUF ;NOW CALCULATE... SUB #131.,CURBUF ;...ADDRESS OF BUFFER BEGIN MOV CURBUF,R1 ;AND SET IT UP FOR ROUTINE MOVB @#SWR+1,R0 ;CHARACTER IS IN UPPER SWITCH BYTE BIC #177600,R0 ;ONLY LOW 7 BITS (PA ;BUMP TO BYTE FOLLOWING LAST CHAR MOVB #TAB,(R1)+ ;PUT TABS BETWEEN EACH SIX CHARS DEC R2 ;BLOCK END? BEQ BLKEND ;YEAH DEC R3 ;LINE END? BGT AGAIN ;NO BR LINEND ;SKIP FIRST "LF" BLKEND: MOVB #LF,(R1)+ ;BLOCK END TAKES TWO LINE FEEDS LINEND: MOVB #LF,(R1)+ ;LINE END TAKES ONLY ONE SUB #OUTDAT,R1 ;GET # OF BYTES CONVERTE RTS PC ; ; ; OUTPUT A CHARACTER ; OCH: TSTB @#TPS ;TTY READY? BPL OCH ;NO MOVB R4,@#TPB ;YES:OUTPUT CHAR RTS PC ; ; TTYINT:MOVB @#TKB,TTYTMP ;TTY KB INTERRUPT BICB #600,TTYTMP;CLEAR CHANNEL EIGHT CMPB #'H,TTYTMP ;IS CHAR HALT CHAR "H"? BNE FLGTST ;NO BIT #2,@#SWR ;CHECK FOR "RESET" OPTION BEQ DLGRTN ;NOT SELECTED: NO RESET JMP HALT ;YES:GO STOP UNITS RITY LATER) BNE LPDC10 ;IF NOT ZERO, USE CHARACTER THERE... MOVB SCHAR,R0 ;...ELSE USE SYNTHETIC CHARACTER... INCB SCHAR ;...AND KEEP BUMPING IT CMPB SCHAR,#140 ;KEEP BETWEEN 37 AND 140 BLT LPDC10 MOVB #40,SCHAR ; ; NOW FILL LINE BUFFER AND SET (OPTIONAL) PARITY BIT ; LPDC10: MOVB #16.,CNTR16 ;PREPARE FOR OPTIMUM SET (MAYBE) LPDC20: MOV R0,-(SP) ;LOAD FOR CALL TO PARITY D MOV R1,OUTABC ;STASH IN OUTPUT BYTE COUNT MOV #OUTBUF,-(SP) MOV #LNKOUT,-(SP) EMT 2 ; .WRITE (TO LP:) MOV #LNKOUT,-(SP) EMT 1 ; .WAIT TST R2 ;WAS BLOCK END REACHED? BNE CONVRT ;NO: GO BACK AND CONVERT SOME MORE EOFTST: BITB #100,INSTAT ;END-OF-FILE? BEQ READ ;GO BACK FOR ANOTHER (POSSIBLE) READFIRST FLGTST:TSTB REQFLG ;REQUEST PENDING? BEQ TYEXIT ;NO CLRB REQFLG INCB CHRFG ;INDICATE CHAR READY TYEXIT:RTI ; ; ICH: INCB REQFLG ;INPUT A CHARACTER & ECHO IT TSTCH: TSTB CHRFG ;IS ONE AVAILABLE BEQ TSTCH ;NO CLRB CHRFG ;CLEAR READY FOR NEXT TIME MOVB TTYTMP,R4 ;YES CMP R4,#CR ;IS THIS A CARRIAGE RETURN? BNE ECHO ;NO: GO ECHO IT JSR PC,CRLF ;YES: OU JSR PC,GETPTY ;GO GET PARITY CALC'D (IF OPTION IS ON MOV (SP)+,R0 ;DONE: CHARACTER RETURNED ON STACK MOVB R0,(R1)+ ;PUT CHARACTER INTO BUFFER BICB #200,R0 ;CLEAR PARITY FOR NEXT TIME BIT #40,@#SWR ;IS OPTIMUM SET SELECTED? BNE LPDC80 ;YES BIT #20,@#SWR ;REPEAT SAME CHARACTER DOWN LINE? BEQ LPDC70 ;YES LPDC30: INC R0 ;NO: GENERATE ENT MOV #LNKOUT,-(SP) EMT 17 ; .CLOSE LINE-PTR TO FLUSH ITS BUFFER MOV #LNKINP,-(SP) EMT 17 ;CLOSE DUMPED DATASET MOV #LNKINP,-(SP) EMT 7 ; .RLSE INPUT FILE DATASET BR PRTSGN ;...AND GO BACK TO REQUEST ANOTHER ONE .PAGE ;COMMAND INPUT LINK BLOCK 0 KBILNK: 0 .RAD50 /KBI/ 1 .RAD50 /KB/ ;COM& :((,0&Hb0T&"0 &Hb0"T&&,$H00&" H00"&&G.H&@MTPUT LF, TOO RTS PC ; ECHO: JSR PC,OCH ;ECHO ON TTY RTS PC ;CHAR IS IN R4 ; ; CRLF: MOV R4,-(SP) ;SAVE MOV #5015,R4 ;CR & LF JSR PC,OCH ;PRINT LOW BYTE SWAB R4 JSR PC,OCH CLRB PPOS ;RESET FOR POSSIBLE FORMAT MOV (SP)+,R4 ;RESTORE RTS PC ; ; ; OUTPUT N CHARS ; CALLING SEQUENCE: ; JSR R5,ONCH ; .WORD BUFADR ADDRESS OF FIRST (LOW) CHARACTER IRE 64 CHAR SET CMPB R0,#140 ;HIT LAST CHAR IN SET? BLT LPDC70 ;NO MOV #40,R0 ;YES:RESET LPDC70: CMP R1,CURBND  ;REACHED END OF THIS BUFFER? BLOS LPDC20 ;NOT YET MOV (SP),-(SP) ;PUSH RETURN ADDR FOR USEBELOW CLR 2(SP)  ;..AND CLEAR CPU STATUS WHEN WE... RTI   ;...RETURN VIA RTI ; COME HERE WHEN BUILDING SPECIAL SET OF 16 OPTIMUM SET LPDC80: DECB CNTR16 ;IS THIS SET OF 16 DONEMAND OUTPUT LINK BLOCK 0 KBOLNK: 0 .RAD50 /KBO/ 1 .RAD50 /KB/ ; DUMPED FILE INPUT LINK BLOCK 0 LNKINP: 0 ;INPUT LINK BLOCK .RAD50 /DMP/ 3 ;ROOM FOR ONE SWITCH INPDEV: 0 ;ROOM FOR PHYSICAL DEVICE NAME FROM COMMAND STRING ISWCNT: 0 ;# SWITCH WORDS FOLLOWING ISWTCH: 0 ;FIRST TWO CHARS IN SWITCH 0 LNKOUT: 0 ;OUTPUT LINK BLOCK .RAD50 /LP/ 1 .RAD500. /:&"(:,np: ~p :+,-r::"::$",^'  "&f"eѕ  "0  ѕ ѕ "w*HH" $H*H, @H::H: :,&EEEE ; .WORD NCHAR # OF CHARS ; ONCH: MOV (R5)+,R0 ;BUF ADR MOV R1,-(SP) ;SAVE IT MOV (R5)+,R1 ;# CHARS ONC010:MOVB (R0)+,R4 ;OUTPUT CHAR JSR PC,OCH DEC R1 ;DONE? BGT ONC010 ;NO MOV (SP)+,R1 ;RESTORE RTS R5 ; INPUT CHARS FROM TTY UNTIL CR ; CALLING SEQUENCE -- ; JSR R5,INCH ; .WORD BUFADR LOW BUF ADR ; .BYTE MAXCH MAX # CHARS ; .BYTE # CHARS? BNE LPDC30 ;NOT YET MOVB #16.,CNTR16 ;YES: RESET COUNT ADD #17.,R0 ;SKIP NEXT 16 CHRS CMP R0,#140 ;GONE PAST LAST CHAR? BLT LPDC70 ;NO SUB #100,R0 ;YES:RESET MODULO<40-140> BR LPDC70 ;GO SEE IF BUF IS FULL ; ;------------------------------- ; THIS IS THE ERROR STATUS CHECK MADE @ BEGIN AND AFTER EACH LINE LPD.ST: MOV @#R.ST,-(SP) ;PUSH STATUS ON /LP/ ;ALWAYS TO LINE PRINTER ;COMMAND INPUT FILENAME BLOCK 0,4 ;OPEN FOR INPUT KBIFIL: ,,,, ;COMMAND OUTPUT FILENAME BLOCK 0,2 ;OPEN FOR OUTPUT KBOFIL: ,,,, 0 4 ;INPUT FILE ALWAYS OPENED FOR INPUT FILINP: 0,0,0 ;SPACE FOR INPUT FILENANME (FROM "ASSIGN" AT KEYBOARD) 0,0,0 ;UIC & PROTECT 0 2 ;PRINT FILE ALWAYS OPENED FOR OUTPUT FILOUT: 0,0,0,0,0 ;NO FILENAME,JMM,n :p"$:&p;P #OCTAL DUMP V001A # B "" """S ? READ INCH: MOV (R5)+,R0 ;GET BUF ADR MOV R1,-(SP) ;SAVE IT MOVB (R5)+,R1 ;GET MAX CHAR CNT CLRB (R5) ;INIT COUNT INC010:JSR PC,ICH ;GET A CHAR CMPB R4,#215 ;CR? BEQ INC020 ;YES INCB (R5) ;CHR CNT CMPB (R5),R1 ;TOO MANY? BGT INC010 ;YES: IGNORE UNTIL CR MOVB R4,(R0)+ ;PUT IN BUF BR INC010 ;NEXT INC020:INC R5 ;BUMP TO RETURN MOV (STO STACK BIT #140031,(SP) ;ARE ANY ERROR BITS SET? BNE LPDS50 ;YESSIR: GO FOR ERROR RETURN BIT #2,(SP) ;TEST ON-LINE BEQ LPDS50 ;ON-LINE NOT SET ADD #2,2(SP) ;BUMP RETURN ADDRESS FOR GOOD EXIT LPDS50: TST (SP)+ ;POP STATUS OFF STACK RTS PC ;TAKE EITHER ERROR OR GOOD RETURN ; ; THIS IS THE 'GET PARITY' SUBROUTINE. IT SETS/CLEARS THE PARITY ; BIT IN THE 7 FOR LP: RAD.DT: .RAD50 /DT / ; CSI COMMAND BLOCK KBCSCB: KBICSI LNKINP ;WANT SPEC FOR INPUT FILE TO BE DUMPED FILINP ;SAME ; COMMAND INPUT CSI HEADER KBICSI: 2 ;USE "OUTPUT" FIELD ONLY (ACTUALLY FOR INPUT SPEC) ,,,,, ;RESERVE SIX MORE FOR CSI KBIBUF: 80. ;THE COMMAND STRING BUFFER .BYTE 0 ;MODE KBISTA: .BYTE 0 ;STATUS 0 ;ACTUAL BYTE COUNT KBIDATP)+,R1 ;RESTORE RTS R5 ;EXIT ; INPUT A POSITIVE OR NEGATIVE OCTAL NUMBER FROM TTY; ; A CR IS EXPECTED AS A DELIMITER AFTER THE LAST DIGIT ; ; CALLING SEQUENCE -- ; ; JSR R5,INN ; .BYTE 0 -1,0,1 ON RETURN IF NEG, ERROR, POS ; .BYTE 0 NO OF DIGITS READ ; NUMBER RETURNED IN R4, 2'S COMP IF NEG ; INN: CLR (R5)+ MOV R3,-(SP) CLR R3 INN010: JSR PC,ICH -BIT CHARACTER WHICH IS ON TOP OF THE STACK ON ENTRY, ; BUT ONLY IF BIT SWITCH #15 ON THE CONSOLE IS SET. OTHERWISE ALL ; PARITY BITS WILL BE CLEAR, WHICH IS CORRECT FOR ABOUT HALF OF THEM GETPTY: TST @#SWR ;IS BIT SWITCH #15 SET? BPL GETPEX ;OPTION NOT SELECTED MOVB #7,PTYCNT ;WILL TEST SEVEN BITS CLRB PARITY ;WILL ACCUMULATE BIT COUNT HERE MOVB 2(SP),-(SP) ;CREATE WORKING CHARACTER GETP10: RORB (SP) : .=.+80. ;CHARACTERS START HERE ;COMMAND OUTPUT LINE BUFFER KBOBUF: MSGLTH ;MAX BYTES 0 ;MODE AND STATUS MSGLTH ;ACTUAL BYTES .ASCII "OCTAL DUMP V001A" .BYTE 15,12,43,13 MSGLTH = .-KBOBUF-6 ;# BYTES IN MESSAGE .EVEN INPBUF: 0 ;MAX BYTES DEPENDS ON BLOCK SIZE OF DEVICE BEING READ INPMOD: .BYTE 0 ;MODE OF INPUT DETERMINED BY SWITCH INSTAT: .BYTE 0 ;S.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 UNIQUE ; CHARACTERS OUTSIDE THE EVALUATION RANGE OF THE DRIVER. THUS ;  ;GET A CHAR TO R4 CMPB R4,#' ;IGNORE BLANKS BEQ INN010 CMPB R4,#'- ;IS IT A MINUS SIGN '(*) BEQ INN020 ;YES CMPB R4,#CR ;NO, IS IT A CR BEQ INN030 ;YES CMPB R4,#'/ BEQ INN030 ;SLASH COUNTS SAME AS RETURN CMPB R4,#60 ;IS IT A VALID OCTAL DIGIT BLT INN060 ;NO CMPB R4,#67 ;MAYBE BGT INN060 ;NO ASL R3  ;SHIFT OFF LOW BIT ADCB PARITY ;ACCUMULATE DECB PTYCNT ;MORE BITS? BNE GETP10 ;MORE! TST (SP)+ ;;POP WORKING CHAR OFF STACK ASLB 2(SP) ;;POSITION CHAR TO ACCEPT PARITY BIT RORB PARITY ;LOAD 'C' WITH PARITY BIT RORB 2(SP) ;SHIFT PARITY BIT INTO CHARACTER GETPEX: RTS PC ;BACK WITH CHARACTER ON TOP OF STACK ; ; ; THE FOLLTATUS INPABC: 0 ;ACTUAL INPUT BYTE COUNT INPDAT ;ADDR OF INPUT DATA BUFFER OUTBUF: 132. ;MAX BYTES IN PRINT BUFFER .BYTE 6 ;UNFORMATTED ASCII; DUMP MODE OUSTAT: .BYTE 0 ;STATUS OUTABC: 0 ;ACTUAL OUTPUT BYTE COUNT OUTDAT ;OUTPUT DATA BUFFER INPDAT: .=.+512.;INPUT DATA BUFFER: MUST ACCOMMODATE A DECTAPE BLOCK OUTDAT: .=.+132.;OUTPUT DATA BUFFER ; 9-FEB-72 ;M W K 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  ;YES, MOVE DIGIT INTO NUMBER ASL R3 BCS INN060 ;GT 177777? ASL R3 BCS INN060 ;GT 177777? BICB #370,R4 ADD R4,R3 INCB -1(R5) ;INCREMENT DIGIT CNT BR INN010 ;GET NEXT DIGIT INN020: MOVB #-1,-2(R5) ;SET FLAG TO NEG NUMBER BR INN010 ;GET NEXT DIGIT INN030: CMPB -1(R5),#6 ;EXCEED 6 DIGITS? BGT INN060 ;YES, ERROR MOV R3,ROWING SUBROUTINE IS A BASIC 1-MILLISECOND DELAY. ; IT LOOPS FOR 'N' MILLISECONDS, WHERE 'N' IS THE NUMBER ON TOP ; OF THE STACK ON ENTRY. THE STACK IS CLEARED BEFORE EXIT. ; DELAY: MOV 2(SP),-(SP) ;PUT 'N' FORWARD MOV 2(SP),4(SP) ;PUT RETURN ADDRESS BACK ONE WORD DELAY1: MOV #132.,2(SP) ;BASIC DELAY FOR 1 M-SEC DELAY2: DEC 2(SP) ;COUNT IT, MAN BNE DELAY2 ;KEEP GOING... DEC (SP) ;THIS IS THE # OF MLEIN .END START 40 ; PRIORITY LOCKOUT MASK FOR PSR .PAGE .TITLE DISCIO,CHKPIO,PFRITE ;*********************************************************************** ;* DISCIO,CHKPIO,PFRITE * ;* * ;* PROGRAM IDENTIFICATION. DISCIO * ;* * ;* PURPOSE. THIS SUBROUTINE IS RESPON4 ;NO TSTB -2(R5) ;IS NUMBER NEG. BEQ INN050 ;NOT NEG NEG R4 ;YES, TWO'S COMP NUMBER INN040: MOV (SP)+,R3 ;RESTORE R3 RTS R5 ;EXIT W/RESULT IN R4 INN050: MOVB #1,-2(R5) ;SET FLAG TO POS NUMBER BR INN040 INN060: CLRB -2(R5) ;SET FLAG TO ERROR BR INN040 .PAGE ;******* SYSTEM SUBPROGRAM TO PRINT WRITE AND READ CRCC'S********* CRCPRT: JSR PC,CRLF -SECS TO DELAY BNE DELAY1 ;OUTER LOOP STILL HOT CMP (SP)+,(SP)+ ;POP 'N' AND LOCAL COUNTER OFF STACK RTS PC ;GO BACK ; ; ; THIS IS THE SCOPE ROUTINE. IF BIT SWITCH #3 IS NOT SET, ANY ; ERROR WILL CAUSE STOP HERE, WITH STATUS DISPLAYED IN "DATA" LIGHTS. ; IF THE SWITCH IS SET, ALL ERRORS WILL FALL THROUGH HERE, AND ; THE DIAGNOSTIC WILL CONTINUE IN SPITE OF THEM ; SCOPEI: CMP (SP)+,(SP)+ ;IT IS ENTERED BY EMT: POPSIBLE FOR ALL COMMUNICATIONS * ;* THE LINKAGE TO SUBROUTINES CHKPIO AND PFRITE ARE RESPECTIVELY: * ;* * ;* DATE * ;* REVISION * ;* * ;*********************************************************************** .DEF DISCIO,CHKPIO,PFRI MOV WRITAD,R0 JSR PC,CRCCHK JSR PC,FORMAT MOV READAD,R0 JSR PC,CRCCHK JMP DIALOG ;********** ROUTINE TO CALCULATE CRCC FROM WRITE AND READ BUFFERS... ; ...AND PRINT EACH OUT IN BINARY: [7 6 5 4 3 2 1 0 P] CRCCHK: MOV XCOUNT,R1 ;WORDS ASL R1 ;BYTES CLR R2 ;CRCC CRC100: MOVB (R0)+,R3 ;WORK REG MOV R3,-(SP) ; STACK BIT #10,@#SWR ;IS BIT SWITCH # 3 SET? BEQ SCOPE1 ;NO: THEN HALT SCOPE2: JMP LPDD ;IS SET: THEN CONTINUE SCOPE1: MOV @#R.ST,R0 ;DISPLAY STATUS IN LIGHTS STOP03: HALT ;FIRST HALT TO DISPLAY STATUS MOV -4(SP),R0 ;NOW SHOW THE ADDRESS OF THE ERROR STOP04: HALT ;...DURING THE SECOND HALT BR SCOPE2 ;GO AGAIN AFTER 'CONTINUE' ; ; BYTLST = . TE .REF PHYDEV,ACTIVE,IOSTAT,RESTOR,QSAVE,DSPTCH .REF UNSPND,ERRTYP,QUEUE,LOGMAX ; .CSECT DISCIO ; ; CHKPIO = . PSR = 177776 ; PROCESSOR STATUS REGISTER PLOCK = 000340 ; PRIORITY LOCKOUT MASK FOR PSR .PAGE .TITLE DISCIO,CHKPIO,PFRITE ;*********************************************************************** ;* DISCIO,CHKPIO,PFRITE * ;* ALSO WORK MOV #8.,R4 CLR R5 ;PARITY CRC110: ASR (SP) ;SHIFT OFF NTH BIT ADC R5 ;ACCUM SET BIT COUNT DEC R4 BNE CRC110 SWAB R3 CLRB R3 TST (SP)+ INC R5 ;MAKE PARITY ODD ASR R5 ;SHIFT PARITY TO CARRY ADCB R3 SWAB R3 ;PARITY BIT NOW IN BIT #8 JSR PC,EOR ; ;LIST OF PARAMETER BYTES... ; ...LOADED AT BEGIN OF RUN PFCHAR: .BYTE 0 ;HOLDS PAPER-FEED CHARACTER, IF ANY COUNT: .BYTE 0 ;HOLDS WORD COUNT FOR LINE WIDTH PAGE: .BYTE 0 ;HOLDS NUMBER OF LINES PER PAGE HOMECH: .BYTE 0 ;HOLDS CHANNEL # FOR TOP-OF-FORM, SPEED: .BYTE 0 ;HOLDS MINIMUM DELAY AFTER PRINT CNTR16: .BYTE 0 ;COUNTER FOR OPTIMUM SET LINENO: .BYTE 0  * ;* PROGRAM IDENTIFICATION. DISCIO * ;* * ;* PURPOSE. THIS SUBROUTINE IS RESPONSIBLE FOR ALL COMMUNICATIONS * ;* THE LINKAGE TO SUBROUTINES CHKPIO AND PFRITE ARE RESPECTIVELY: * ;* * ;* DATE * ;* REVISION EOR NEW DATA WORD INTO CRC CLR R4 MOV R2,R3 ;NEW CRCC SWAB R3 ASRB R3 ;P TO C FOR FOLLOWING SHIFT TO BIT #0 ROLB R2 ;THIS IS THE CRC SHIFT (P TO 0, ETC.) ADC R4 ;SAVE NEW PARITY BIT BEQ CRC120 ;NOT SET: BYPASS SELECTIVE INVERSIONS MOV #74,R3 JSR PC,EOR ;INVERT BITS 2,3,4 & 5 IN NEW CRCC CRC120: SWAB R2 ;PR ;CURRENT LINE NUMBER PARITY: .BYTE 0 ;USED TO CALC CHARACTER PARITY PTYCNT: .BYTE 0 ;...ALSO SCHAR: .BYTE 0 ;SYNTHETIC FIRST CHARACTER WDCNT: .BYTE 0 ;WORD COUNT (LINE WIDTH) .EVEN PFWORD: .WORD 0 ;HOLDS P/F CHAR FOR T-O-F IN AUTO MODE BOUNDL: .WORD 377 ;LOWER BUFFER BOUNDARY BOUNDH: .WORD LP.DGN-37 ;UPPER BUFFER BOUNDARY CURBUF: .WORD 0 ;BEGINNING OF CURRENT BUFF * ;* * ;*********************************************************************** .DEF DISCIO,CHKPIO,PFRITE .REF PHYDEV,ACTIVE,IOSTAT,RESTOR,QSAVE,DSPTCH .REF UNSPND,ERRTYP,QUEUE,LOGMAX ; .CSECT DISCIO ; ; CHKPIO = . PSR = 177776 ; PROCESSOR STATUS REGISTER PLOCK = 000340 ; PRIORITY LOCKOUT MESERVE LOW 8 BITS CLRB R2 ;PREPARE FOR PARITY BIT ADD R4,R2 ;PUT 0 OR 1 FOR PARITY SWAB R2 ;***NEW CRCC WITH PARITY AND INVERSIONS* DEC R1 ;ANY MORE DATA BYTES? BNE CRC100 ;YES MOV #753,R3 ;NO: PREPARE TO DO FINAL INVERSION JSR PC,EOR ;INVERT ALL FINAL BITS BUT #2 & 4 ;******* NOW PRINT THE COMPUTED CRCC IN BINARY***** MOV #9.ER CURBND: .WORD 377  ;END OF CURRENT BUFFER TIMOUT: .WORD 3200. ;# OF 31-MICROSEC WAIT-LOOPS FOR INT TIMER: .WORD 0 ;USED TO TIME IT OUT DONDLY: .WORD 202. ;WAIT AFTER 'DONE' FOR INT: 1 MILLISEC DAMP: .WORD 1233 ;FIRST TERM FOR RANDOM # GENERATOR SEED: .WORD 7622 ;FIRST SEED FOR ABOVE .END ASK FOR PSR .PAGE .TITLE DISCIO,CHKPIO,PFRITE ;*********************************************************************** ;* DISCIO,CHKPIO,PFRITE * ;* * ;* PROGRAM IDENTIFICATION. DISCIO * ;* * ;* PURPOSE. THIS SUBROUTINE IS RESPONSIBLE FOR ALL COMMUNICATIONS * ,R5 MOV #CRCBUF,R4 CRC130: MOVB #60,(R4)+ ;INIT PRINT BUFFER TO ALL ZEROS DEC R5 BNE CRC130 SWAB R2 ;PARITY FIRST ASRB R2 ADCB -(R4) SWAB R2 MOV #8.,R5 CRC150: ASRB R2 ADCB -(R4) DEC R5 BNE CRC150 JSR R5,ONCH ;PRINT THE NINE BITS .WORD CRCMSG .WORD CRBFLN RTS PC EOR: ;SU;* THE LINKAGE TO SUBROUTINES CHKPIO AND PFRITE ARE RESPECTIVELY: * ;* * ;* DATE * ;* REVISION * ;* * ;*********************************************************************** .DEF DISCIO,CHKPIO,PFRITE .REF PHYDEV,ACTIVBROUTINE TO EOR R3 INTO R2 MOV R3,R5 BIC R2,R5 BIC R3,R2 BIS R5,R2 RTS PC CRCMSG: .ASCII "CRCC = " CRCBUF: .BYTE 0,0,0,0,0,0,0,0,0 CRBFLN = .-CRCMSG .PAGE COMAND:.WORD 0 CURUNT:.WORD 0 EOFCOM:.WORD 4 ;END-OF-FILE BIT ERRPAT:.WORD 0 EXCOM: .WORD 0 NFILES:.WORD 0 NRECS: .WORD 0 OFFSET:.WORD 0 READAD: .WORD READBF ;CURRENT READ BUFFER BEGIN ADDR STAT: .WORD 0 UNITNO:.WORE,IOSTAT,RESTOR,QSAVE,DSPTCH .REF UNSPND,ERRTYP,QUEUE,LOGMAX ; .CSECT DISCIO ; ; CHKPIO = . PSR = 177776 ; PROCESSOR STATUS REGISTER PLOCK = 000340 ; PRIORITY LOCKOUT MASK FOR PSR .PAGE .TITLE DISCIO,CHKPIO,PFRITE ;*********************************************************************** ;* DISCIO,CHKPIO,PFRITE * ;* D 0 WRITAD: .WORD WRITBF ;CURRENT WRITE BUFFER BEGIN XCOUNT:.WORD 0 XRECS: .WORD 0 CHRFG: .BYTE 0 EXSWCH:.BYTE 0 MCODE: .BYTE 0 MINTFG:.BYTE 0 PPOS: .BYTE 0 REQFLG:.BYTE 0 TTYTMP:.BYTE 0 WRTCTR:.BYTE 0 XFILES:.BYTE 0 $COLON:.BYTE 0 .END