      JSB A2LP      DO IT 
      LDA CHCNT     RESTORE ZONE COUNT
      STA CHCNC 
      LDB .40       MINIMUM OF ONE ZONE COUNT 
      ADB .13 
      ISZ LFCNT 
      JMP *-2 
      STB TMOTX       TO NEXT CHARACTER 
      LDB LNCNT     RESET LINE COUNT
      STB LFCNT 
      JMP OTCH,I
* 
LFCNT DEC -60 
LNCNT DEC -60 
FFTM  DEC 780 
      SKP 
*         OUTPUT A REG TO LINE PRINTER
*                B REG = MAX TIME OUT 
* 
A2LP  NOP 
      STB TMOTS     SAVE TIME OUT 
      LDB A2LPS     SAVE PREVIOUS 
      STB A2LPP        CHARACTER
      STA A2LPS     SAVE OUTPUT 
      LDA JSBI
A2LP0 STA LP
      LDB MXTMO 
      CLA,INA       DO TIMMING TESTS
      CPA TMFLG     ? 
      STB TMOTS     SET MAX TIME OUT
      LDA A2LPS     RETRIEVE CHARACTER
A2LP1 OTA LP        GIVE CHARACTER TO LINE PRINTER
      STF INTP      TURN ON INTERRUPTS
A2LP2 STC LP,C      TRANSFER CHARACTER
      LDA TMOTS     PICK UP THE TIME OUT
      JSB TMRR,I    GO WAIT 
      CLF INTP      TURN OFF INTERRUPTS 
      LDA A2LPS     GET CURRENT OUTPUT
      LDB A2LPP     GET PREVIOUS OUTPUT 
E030  JSB ERMS,I    REPORT TIME OUT 
      DEF LPTOM     POINTER TO MESSAGE
      CLA           ALTER JSB IN CFR
      STA CRJSB     TO SKIP FORM FEED IF LP IS OFF LINE 
      JSB CFR       GO WAIT UNTIL READY 
      LDA JSBFF     RESTORE JSB INSTR 
      STA CRJSB     IN CFR ROUTINE
      RSS 
A2LPI NOP 
      CLF INTP
A2LP3 CLC LP,C      TURN OFF LINE PRINTER 
      JMP A2LP,I    RETURN
* 
LPTOM EQU * 
      ASC 10,E030 L.P. TIME OUT/
TMOTX NOP 
A2LPS NOP 
A2LPP NOP 
MXTMO DEC 2000      2 SECONDS MAX 
TMOTS NOP 
TMFLG NOP 
JSBI  JSB A2LPI 
JSBFF JSB FFP 
      SKP 
*         CHECK FOR READY 
* 
CFR   NOP 
CFRSC LIA LP        GET CURRENT STATUS
      SZA           IS IT READY?
      JMP E031      NO
      STA TMFLG 
CRJSB JSB FFP       DO FORM FEED IF NEEDED
      LDB MXTMO     SET MAX TIME OUT
      STB TMOTX 
      JMP CFR,I     YES 
E031  JSB ERMS,I    NO REPORT IT
      DEF LPNRM     POINTER TO MESSAGE
      JMP CFR+1     STAY IN LOOP UNTIL READY
* 
LPNRM EQU * 
      ASC 11,E031 L.P. NOT READY/ 
* 
*         OUTPUT CARRIAGE RETURN AND LINE FEED
* 
CRLF  NOP 
      JSB CRP       DO CARRIAGE RETURN
      JSB LFP       DO LINE FEED
      JMP CRLF,I    RETURN
      SKP 
*         CYCLIC PATERN PRINT 
* 
CPP   NOP 
      SZA,RSS       IF CHRS = 0 
CPP.1 LDA DM80        THEN DEFAULT TO 80
      SSA,RSS       IF CHRS IS POS. 
      CMA,INA         THEN MAKE IT NEG. 
      STA CPC       SAVE NUMBER OF CHRS 
      ADA D90       CHRS NOT> .90 
      SSA           ? 
      JMP CPP.1     YES USE 80 CHRS 
      SZB,RSS       IF LINE COUNT = 0 
CPP.2 LDB DM60        THEN DEFAULT TO 60
      SSB,RSS       IF LNCNT IS POS.
      CMB,INB         THEN MAKE IT NEG. 
      STB CNTR      SAVE LINE COUNT 
      ADB D90       IF LNCNT> 90
      SSB           ? 
      JMP CPP.2       THEN USE 60 LINES 
CPPL0 JSB CYBFI     SET UP CYCLIC BUFFER
      LDA CYBFD     GET ADDRESS 
      LDB CPC         AND COUNT 
      JSB OTP       OUTPUT BUFFER 
      JSB CRLF      DO A RETURN LINE FEED 
      ISZ CNTR      DONE? 
      JMP CPPL0     NO
      CLA           YES 
      JMP CPP,I     RETURN TO EXEC
* 
CPC   NOP 
      SKP 
*         PUT CYCLIC PATTERN IN BUFFER
* 
CYBFI NOP 
      LDB CYBFD     SET POINTER 
      STB CYBFT       TO CYCLIC BUFFER
      LDA CYLC      GET LAST STARTING CHARACTER 
      INA           MOVE UP ONE 
      CPA .140      LAST CHARACTER? 
      LDA .40       YES 
      STA CYLC      SAVE FOR NEXT BUFFER
      LDB DM90      GET MAX BUFFER COUNT
CYBFL STA CYBFT,I   STORE CHARACTER 
      INA           MOVE TO NEXT CHARACTER
      CPA .140      IS IT LAST CHR? 
      LDA .40       YES 
      ISZ CYBFT     MOVE POINTER
      INB,SZB       IS BUFFER FULL
      JMP CYBFL     NO
      JMP CYBFI,I   YES RETURN
* 
CYBFT NOP 
CYLC  OCT 40
CYBFD DEF *+1 
      BSS 90
      SKP 
*         OUTPUT A CHR OR BUFFER
* 
*         A = CHR OR ADDRESS
*         B = +^  OR   -^ 
* 
OTP   NOP 
      STA OTPT      SAVE CHR OR ADDRESS 
      SSB           CHR OR ADDRESS? 
      JMP OTPB      IT'S A BUFFER OUTPUT
      CMB,INB       CHR, MAKE COUNT NEG.
      STB OTPC      SAVE COUNT
      LDA OTPT      RETRIEVE CHARACTER
      JSB OTCH      OUTPUT IT 
      ISZ OTPC      ALL DONE? 
      JMP *-3       NO
      JMP OTP,I       AND RETURN
* 
OTPB  STB OTPC      SAVE COUNT
      LDA OTPT,I    GET CHARACTER 
      JSB OTCH      OUTPUT IT 
      ISZ OTPT      MOVE POINTER
      ISZ OTPC      ALL DONE? 
      JMP *-4       NO
      JMP OTP,I     RETURN
* 
OTPT  NOP 
OTPC  NOP 
* 
*         OUTPUT PACKED BUFFER
* 
OTP2  NOP 
      STA OTPC      SAVE NUMBER OF CHARACTERS 
      CLE,ELB 
      STB OTPT        AND ADDRESS POINTER 
OTP2L LDB OTPT      GET CHARACTER ADDRESS 
      CLE,ERB       E _ UPPER LOWER FLAG
      LDA B,I       2 CHR TO  A REG 
      SEZ,RSS       UPPER?
      ALF,ALF       YES 
      AND .177      MASK OFF OPPSITE CHARACTER
      JSB OTCH      OUTPUT A TO LINE PRINTER
      ISZ OTPT      MOVE TO NEXT CHARACTER
      ISZ OTPC      IS THERE MORE OUTPUT? 
      JMP OTP2L     YES 
      JMP OTP2,I     NOW RETURN 
      SKP 
*         RANDOM NUMBER GENERATOR 
* 
GRN   NOP 
      STA RNA       SAVE LOWER LIMIT
      CMA,INA 
      ADB 0 
      STB RNB       SAVE UPPER LIMIT
GRNL  LDA BASE      GET BASE
      ADA PRIME     SUBTRACT THE PRIME
      SSA           SKIP IF STILL POSITIVE
      LDA BASE      OOPS, BASE NOT BIG ENOUGH 
      ELA           DOUBLE BASE FOR REMAINDER 
      STA BASE      SAVE FOR NEXT TIME
      AND .177      USE ONLY LOWER BITS 
      CMA,INA       MAKE IT NEG.
      ADA RNA       ADD LOWER LIMIT 
      SSA,RSS       IS IT ABOVE?
      JMP GRNL      NO - TRY ANOTHER PASS 
      ADA RNB       ADD UPPER LIMIT 
      SSA           IS IT BELOW?
      JMP GRNL      NO - TRY ANOTHER PASS 
      LDA BASE      YES RETRIEVE NUMBER 
      AND .177
      JMP GRN,I     RETURN TO CALLER
* 
RNA   NOP 
RNB   NOP 
PRIME DEC -31069
BASE  BSS 1 
      SKP 
*                   MANUAL CONTROL
* 
TST01 EQU * 
* 
MNC   NOP           ENTRY FROM CONTROL PROGRAM
      LDB S128      CHECK S.R. 12 AND 8 
      JSB SWRT,I
      JMP MNC,I     NO MANUAL TEST
* 
      CLA,INA 
      STA TMFLG     INHIBIT TIMMING CHECKS
* 
H035  JSB MSGH,I    TELL OPERATOR TO
      DEF MNCM2        TURN OFF POWER 
* 
      LDB STAT1     100001
      JSB MNCCS     CHECK STATUS
* 
H036  JSB MSGH,I    TELL OPERATOR TO
      DEF MNCM3        TURN ON POWER
* 
      LDB STAT1     100001
      JSB MNCCS     CHECK STATUS
* 
      LDA DM60      SET WAIT LOOP COUNT 
      STA CNTR
MNCL0 CLB,INB       CHECK FOR READY STATUS
MNCS1 LIA LP
      CPA B 
      JMP MNCN1     OK
      LDA D1000     NO -
      JSB TMRR,I    WELL WAIT 
      ISZ CNTR      WAITED ENOUGH 
      JMP MNCL0     NO
E037  JSB ERMS,I    YES - REPORT NOT READY
      DEF NRM       POINTER TO MESSAGE
      JMP MNC,I     ABORT TEST
* 
NRM   EQU * 
      ASC 12,E037 NO READY RESPONSE/
      SKP 
MNCN1 JSB MSGH,I    TELL OPERATOR TO
      DEF MNCM0        PUT L.P. ON-LINE 
* 
      CLB 
      JSB MNCCS     CHECK STATUS
* 
H034  JSB MSGH,I    TELL OPERATOR TO
      DEF MNCM1        MASTER CLEAR LINE PRINTER
* 
      CLB,INB 
      JSB MNCCS     CHECK STATUS
* 
H033  JSB MSGH,I    TELL OPERATOR TO
      DEF MNCM0        PUT L.P. ON-LINE 
* 
      CLB 
      JSB MNCCS     CHECK STATUS
* 
      JSB FFP       DO FORM FEED
* 
      LDA DM20      OUTPUT "TOP-OF-FORM COMPUTER" 
      LDB TOFCD 
      JSB OTP2
* 
      LDA DM60      OUTPUT 60 
      STA CNTR        LINE FEEDS
      JSB CRLF
      ISZ CNTR      DONE? 
      JMP *-2       NO
* 
      LDA DM31      OUTPUT "PERFORATION STEP OVER COMPUTER" 
      LDB PSOCD 
      JSB OTP2
* 
H040  JSB MSGH,I    TELL OPERATOR TO
      DEF MNCM4        TOGGLE TOP OF FORM 
* 
      CLB,INB 
      JSB MNCCS     CHECK STATUS
* 
      JSB MSGH,I    TELL OPERATOR TO
      DEF MNCM0        PUT L.P. ON-LINE 
* 
      CLB 
      JSB MNCCS     CHECK STATUS
* 
      LDA DM20      OUTPUT "TOP-OF-FORM MANUAL" 
      LDB TOFMD 
      JSB OTP2
* 
      LDA DM55      OUTPUT 55 
      STA CNTR        LINE FEEDS
      JSB CRLF
      ISZ CNTR      DONE? 
      JMP *-2       NO
      SKP 
H041  JSB MSGH,I    TELL OPERATOR TO
      DEF MNCM5      TOGGLE PAPER STEP 5 TIMES
* 
      CLB,INB 
      JSB MNCCS     CHECK STATUS
* 
      JSB MSGH,I    TELL OPERATOR TO
      DEF MNCM0       PUT L.P. ON-LINE
* 
      CLB 
      JSB MNCCS     CHECK STATUS
* 
      LDA DM30      OUTPUT "PERFORATION STEP OVER MANUAL" 
      LDB PSOMD 
      JSB OTP2
* 
      JSB CRLF
* 
      JMP MNC,I     RETURN TO CONTROL 
* 
MNCCS NOP 
MNCS2 LIA LP        GET CURRENT STATUS
      CPA B         IS IT OK
      JMP MNCCS,I   YES 
      JSB ERMS,I    NO - REPORT ERROR 
      DEF STERM     POINTER TO MESSAGE
      JMP MNCCS,I   RETURN
* 
STERM EQU * 
      ASC 11,E032 INCORRECT STATUS/ 
      SKP 
MNCM0 ASC 11,H033 PUT L.P. ON-LINE/ 
* 
MNCM1 ASC 12,H034 MASTER CLEAR L.P./
* 
MNCM2 ASC 13,H035 TURN OFF L.P. POWER/
* 
MNCM3 ASC 12,H036 TURN ON L.P. POWER/ 
* 
MNCM4 ASC 12,H040 PUT L.P. OFF-LINE.
      ASC 14, TOGGLE TOP-OF-FORM SWITCH/
* 
MNCM5 ASC 12,H041 PUT L.P. OFF-LINE.
      ASC 14, TOGGLE PAPER-STEP 5 TIMES/
* 
TOFCD DEF *+1 
      ASC 10,TOP-OF-FORM COMPUTER 
* 
PSOCD DEF *+1 
      ASC 15,PERFORATION STEP OVER COMPUTER 
* 
TOFMD DEF *+1 
      ASC 10,TOP-OF-FORM MANUAL 
* 
PSOMD DEF *+1 
      ASC 15,PERFORATION STEP OVER MANUAL 
* 
STAT1 OCT 100001
      SKP 
*                   PAPER HANDLING CYCLIC PRINT 
* 
TST02 EQU * 
* 
* 
CP    NOP 
      JSB CFR       CHECK FOR READY 
      LDA DM20      20
      JSB TCYO         CYCLIC CHARACTERS PER LINE 
      LDA DM40      40
      JSB TCYO         CYCLIC CHARACTERS PER LINE 
      LDA DM60      60
      JSB TCYO         CYCLIC CHARACTERS PER LINE 
      LDA DM80      80
      JSB TCYO         CYCLIC CHARACTERS PER LINE 
* 
      JSB CYBFI 
      LDA DM80      SET EIGHTY COLUMNS
      STA TEMP      FOR BACKWARD PRINT
CPL1  LDB TEMP
      LDA .40 
      INB           ONE LESS THAN COUNT 
      SZB,RSS 
      JMP CPL3      NO MORE BLANKS TO OUTPUT
      CMB,INB       MAKE + FOR OTP ROUTINE
      JSB OTP       OUTPUT NUMBER OF SPACES 
CPL3  LDA TEMP
      CMA,INA       GET CYCLIC CHARACTER
      ADA CYBFD 
      LDA A,I 
      JSB OTCH      OUTPUT IT 
      JSB CRP       DO CARRIAGE RETURN
      ISZ TEMP      MORE LINES
      JMP CPL1      YES 
* 
      JSB CRLF
      JSB CRLF
      JSB CRLF
      JSB CRLF
* 
      LDA DM80      OUTPUT
      STA TEMP        80 LINES OF DECREASING
CPL2  LDB TEMP          BACK ARROW
      LDA BKAR      GET BACK ARROW
      CMB,INB 
      JSB OTP 
      JSB CRLF      OUTPUT LINE FEED AND CARRIAGE RETURN
      ISZ TEMP
      JMP CPL2
      JMP CP,I      RETURN TO CONTROL 
* 
BKAR  OCT 137 
      SKP 
*         OUTPUT CYCLIC PATERN
* 
TCYO  NOP 
      STA TEMP      SAVE NUMBER OF CHARACTERS 
      LDA DM60      SET LINE COUNT
      STA CNTR
TCYOL JSB CYBFI     INITIALIZE BUFFER 
      LDA CYBFD     GET POINTER 
      LDB TEMP      GET COUNT 
      JSB OTP 
      JSB CRLF
      ISZ CNTR      DO ANOTHER LINE?
      JMP TCYOL     YES 
      JMP TCYO,I    NO
      SKP 
*                   ILLEGAL OPERATIONS
* 
TST03 EQU * 
* 
ILO   NOP 
      JSB CFR       CHECK FOR READY 
      LDA DM60      SET LOOP
      INA 
      STA CNTR         COUNTR FOR 59 LINES
ILOL1 LDA .40       GET A 
      LDB .140       CHR
      JSB GRN       RANDOMLY
      STA CYLC      SAVE IT FOR CYCLIC PATTERN
      JSB CYBFI     INITIALIZE BUFFER 
      CLA           GET RANDOM
      LDB D80         NUMBER
      JSB GRN          OF CHARACTERS
      LDB A         B = COUNT 
      LDA CYBFD     A = ADDRESS 
      CMB,INB       OUTPUT BUFFER 
      JSB OTP       DO IT 
      JSB CRLF
      ISZ CNTR      DONE 59 LINES?
      JMP ILOL1     NO  WELL DO ANOTHER 
* 
      CLA           OUTPUT ALL NON ASCII CHARACTERS 
ILOL2 STA TEMP
      JSB OTCH      OUTPUT DATA 
      LDA TEMP      MOVE TO NEXT CHARACTER
      INA 
      CPA .12       SKIP LINE FEED
      INA 
      CPA .14       SKIP FORM FEED
      INA 
      CPA .15       SKIP CARRIAGE RETURN
      INA 
      CPA .40       SKIP ASCII SET INCL. SPACE
      LDA .140
      CPA .177      IS THAT ALL 
      JMP *+2       YES 
      JMP ILOL2     NO DO IT AGAIN
      LDA .40       OUTPUT 2 SPACES 
      LDB .2
      JSB OTP 
      LDA AZ        OUTPUT 80 CHR Z'S 
      LDB D80 
      JSB OTP 
* 
      JMP ILO,I     RETURN TO CONTROL 
      SKP 
*                   ALLIGNMENT
* 
TST04 EQU * 
* 
AL    NOP 
      JSB CFR       CHECK FOR READY 
      LDA DM60      SET FOR 60 LINES
      STA CNTR
ALL1  LDA AM        OUTPUT 80 
      LDB D80         CHR M 
      JSB OTP 
      JSB CRLF
      ISZ CNTR      ALL DONE? 
      JMP ALL1      NO
* 
      LDA DM60      SET FOR 60 LINES
      STA CNTR
ALL2  LDA AE        OUTPUT 80 
      LDB D80         CHR E 
      JSB OTP 
      JSB CRLF
      ISZ CNTR      ALL DONE? 
      JMP ALL2      NO
* 
      LDA .40       START WITH BLANK
ALL3  STA TEMP      SAVE IT 
      LDB D80       SET FOR 80 CHR'S
      JSB OTP 
      JSB CRLF
      LDA TEMP      GET CHR 
      INA             MOVE UP ONE 
      CPA .140      IS THAT ALL?
      JMP *+2       YES 
      JMP ALL3      NO
* 
      JMP AL,I      RETURN TO CONTROL 
      END 
                                                                                                                                                                                                        