FMTNU STA BUF2A     SAVE OCT OR INT FLAG
      LDA B         CHANGE HANDS
      LDB FMTCH     GET LAST CHARACTER? 
      CPB NUMB      IS IT A NUMBER OUTPUT?
      RSS 
      JMP FMTR,I    NO RETURN TO CALLER 
      LDB FMTBF     YES GET LOCATION FOR NUMBER 
      CLE           POSITION FOR UPPER BYTE 
      ISZ BUF2A     IS IT OCTAL OR INTEGER
      JMP *+3       OCTAL 
      JSB O2ASC     OCTAL CONVERSION
      RSS 
      JSB D2ASC     INTEGER CONVERSION
      LDB FMTBF     POINT TO NUMBERS
      JMP FMTR0     OUTPUT THEM 
* 
SLASH OCT 57
LAROW OCT 137 
NUMB  OCT 43
FMTPS NOP 
FMTCH NOP 
FMTBF DEF *+1 
      OCT 0,0,0 
      SKP 
*         OCTAL TO ASCII CONVERSION 
*         CALL: 
* 
*         CLE = UPPER  OR CCE = LOWER 
*         LDA <OCTAL NUMBER>
*         LDB <BUFFER ADDRESS>
*         JSB O2AS,I
*         <NORMAL RETURN> 
* 
* 
O2ASC NOP           ENTER 
      ELB           SET-UP BUFFER POINTER 
      STB BUFFR     SAVE IT 
      LDB %M6       NUMBER OF ASCII CHARACTERS
      STB CCNT      SAVE COUNT
      CLB,INB       SET MASK FOR FIRST CHARACTER
      RAL           ROTATE IT IN
      STA D2ASC     SAVE RESULT 
      AND B         MASK UNWANTED BITS
O2AS1 AND %B7       MASK OFF UPPER BITS 
      ADA %B60      ADD ASCII NUMBER
      JSB A2BUF     PUT IT IN THE BUFFER
      JMP O2ASC,I   RETURN IF ALL DONE
      LDA D2ASC     RETRIEVE NUMBER 
      RAL,RAL       ROTATE FOR NEXT CHARACTER 
      RAL 
      STA D2ASC 
      JMP O2AS1     AND DO IT 
* 
* 
*         THE ABOVE ROUTINE DOES NOT ELIMINATE LEFT ZEROS 
      SKP 
*         DECIMAL TO ASCII CONVERSION 
* 
*         CALL: 
* 
*         CLE = UPPER   OR  CCE = LOWER 
*         LDA <DECIMAL NUMBER>
*         LDB <BUFFER ADDRESS>
*         JSB D2AS,I
*         <NORMAL RETURN> 
* 
* 
D2ASC NOP 
      ELB           SET-UP BUFFER POINTER 
      STB BUFFR     SAVE IT 
      LDB %M6       SET CHR COUNT 
      STB CCNT      SAVE IT 
      LDB A         SAVE NUMBER 
      SSA           IS IT NEGATIVE? 
      CMA,INA       YES - MAKE IT POSITIVE
      STA ASC2N     SAVE FOR STORAGE
      LDA %B40      GET SPACE IF POSITIVE 
      SSB           WAS IT? 
      LDA %B55      NO GET MINUS SIGN 
      JSB A2BUF     ADD IT TO BUFFER
      NOP 
      JSB DIV       CONVERT NUMBER
      DEC -10000    OUTPUT 10000 CHARACTER
      DEC -1000     OUTPUT 1000  CHARACTER
%NE2  DEC -100      OUTPUT 100   CHARACTER
      DEC -10       OUTPUT 10    CHARACTER
%M1   DEC -1        OUTPUT 1     CHARACTER
* 
* 
DIV   NOP           ENTER 
      LDA ASC2N     GET NUMBER
      CLB           ZERO COUNT
DIV0  ADA DIV,I     SUBTRACT DIVISOR
      SSA           WAS IT LESS THAN DIVISOR? 
      JMP DIV1      YES - THEN OUTPUT IT
      INB           NO - INCREMENT THE COUNT
      STA ASC2N     AND SAVE RESULTS
      JMP DIV0      DO IT AGAIN 
DIV1  LDA B 
      ADA %B60      MAKE IT ASCII 
      JSB A2BUF     ADD IT TO BUFFER
      JMP D2ASC,I   RETURN IF ALL NUMBERS DONE
      ISZ DIV       MOVE TO NEXT NUMBER 
      JMP DIV+1     DO IT 
* 
*         THE ABOVE ROUTINE DOES NOT ELIMINATE LEFT ZEROS 
      SKP 
*         ASCII CONVERSION
* 
*         CALL: 
*         CLA <=INTEGER   CCA=OCTAL 
*         LDB <BUFFER ADDRESS>
*         CLE <UPPER CHARACTER  CCE-LOWER CHARACTER>
*         JSB AS2N,I
*         <NORMAL RETURN   A=NUMBER 
*                          B=BUFFER ADDRESS OF NEXT CHARACTER 
*                          E=UPPER/LOWER
* 
ASC2N NOP           ENTER 
      SZA           IS IT OCTAL OR INTEGER? 
      LDA RSS       SET UP FOR OCTAL CONVERSION 
      STA TYPE      SET TYPE OF CONVERSION
      ELB           SET UP
      STB BUFFR       BUFFER ADDRESS
      LDA %B7       SET MAX COUNT CONVERSION
      CMA,INA 
      STA CCNT
      CLB           CLEAR OR ZERO NUMBER
ASC0  STB D2ASC 
JBF2A JSB BUF2A     GET A CHARACTER 
      JMP ASC1      REACHED SIX CHARACTERS
      ADA %M72      CHECK 
      SSA,RSS       IF
      JMP ASC1        IT'S
      ADA %B12         DIGIT
      SSA           ? 
      JMP ASC1      NO RETURN 
      LDB D2ASC 
TYPE  NOP           DECISION MAKER
      JMP INTCV     GOTO INTEGER CONVERSION 
* 
      ADA %M10     IS NUMBER > 7
      SSA,RSS       ? 
      JMP ASC1      YES 
      ADA %B10       NO - RESTORE NUMBER
      RBL,RBL       MOVE NUMBER UP
      RBL 
      JMP ASC2
* 
INTCV BLS           FORM
      ADA B         BINARY
      BLS,BLS       EQUIVALENT
ASC2  ADB A         ADD NEW NUMBER
      JMP ASC0      DO NEXT CHARACTER 
* 
ASC1  LDA D2ASC     GET NUMBER
      CCB           MOVE BUFFER POINTER BACK 1
      ADB BUFFR        CHARACTER
      CLE,ERB       SET UPPER OR LOWER
      JMP ASC2N,I   RETURN TO CALLER
      SKP 
*         SWITCH REGISTER CHECK 
* 
SWR   NOP           ENTER SWITCH REG CHECK
      LIA SWREG     GET EXTERNAL REGISTER 
      AND B         MASK OUT UNWANTED BITS
      SZA,RSS       ANY BITS UP 
      ISZ SWR       YES RETURN P+2
      JMP SWR,I     RETURN TO CALLER
* 
* 
*         1 MILLSEC. TIMER
* 
TMR   NOP           ENTRY 1 MILLSEC CLOCK 
      CMA,INA       NEGATE TIME WANTED
      LDB TMC       GET TIME COUNT
      INB,SZB       IS TIME UP? 
TMI   JMP *-1       NO TRY AGAIN
      INA,SZA       YES IS THERE MORE TIME? 
      JMP *-4       YES DO LOOP GAIN
      JMP TMR,I     RETURN TO CALLER
* 
TMC   DEC -252      1 MILSEC. TIME OUT COUNT
* 
* 
*         DEVICE DRIVER ROUTINES
* 
SETUP NOP 
      CMA           NEGATE COUNT
      STA CCNT      SAVE FOR USE AS COUNTER 
      RBL           MAKE POINTER IN TO BYTE 
      STB BUFFR     KEEP IT 
      LDB JBF2A     GET STANDARD OUT PUT FRAM BUFFER
      SSA,RSS       IS IT FORMAT STRING?
      LDB JFM2A     YES GET CHR FROM FORMAT ROUTINE 
      STB SLO1
      LDA SETUP,I   GET OTA FOR CONTROL WORDS 
      ISZ SETUP 
      STA SETOT     PUT IT IN PLACE 
      STA SETIN       FOR OUTPUT AND INPUT
      LDA SETUP,I   GET LOCATION OF I/O ROUTINE 
      ADA SETUP 
      ISZ SETUP 
      STA AIO 
      JMP SETUP,I   AND RETURN
* 
JFM2A JMP FMTC
AIO   NOP 
      SKP 
*         INPUT TO BUFFER AS REQUIRED 
* 
IN    NOP 
      LDA IN,I      OUTPUT CONTROL WORDS
      ISZ IN
      SZA,RSS       ANY TO OUTPUT?
      JMP *+3       NO
SETIN NOP           YES OUTPUT IT 
      JMP *-5 
      ISZ CCNT      CHECK IF INPUT REQ. WAS ZERO? 
      RSS 
      JMP IN,I      YES - EXIT
      ISZ IN        SKIP INTERRUPT INSTRUCTION
IN1   JSB AIO,I     GET A CHARACTER 
      AND %B177     NO MASK OFF BIT 7 
      CPA %B177     IS IT A RUBOUT? 
      JMP RBOUT     YES 
      CPA %B15      IS IT A CARRIAGE RETURN?
      JMP IN2       YES 
      JSB A2BUF     NO - ADD CHARACTER TO BUFFER
RSS   RSS           BUFFER FULL 
      JMP IN1 
      LDA COUNT     GET INPUT COUNT 
      JMP IN,I      RETURN TO CALLER
* 
RBOUT JSB ICRLF     DO A RETUEN LINE FEED 
      LDA COUNT     RESTORE 
      LDB BUFFA     COUNT AND BUFFER
      JMP CNSLI+1   NOW TRY AGAIN 
* 
IN2   LDA CCNT      DETERMINE COUNT 
      ADA COUNT 
      JSB ICRLF     DO RETURN LINE FEED 
      JMP IN,I      RETURN TO CALLER
* 
ICRLF NOP 
      STA SWR       SAVE A REG
      CLA 
      JSB CNSLO 
      LDA SWR       RESTORE A REG 
      JMP ICRLF,I 
      SKP 
*         OUT BUFFER TO DEVICE
* 
OUT   NOP 
      LDA OUT,I     GET CONTROL WORD
      ISZ OUT 
      SZA,RSS       ANY?
      JMP *+3       NO
SETOT NOP           YES OUTPUT IT 
      JMP *-5       DO NEXT ONE 
SLO1  NOP           GET A CHATACTER FROM BUFFER OR FMTR 
      JMP SLO2      END OF BUFFER DO CR/LF
      AND %B177 
      CPA %B177     WAS IT A RUBOUT?
      JMP SLO2+1    YES 
      CPA %B15      IS IT A CARRIAGE RETURN?
      JMP SLO1      YES IGNORE IT 
      CPA %B12      IS IT A LINE FEED?
      RSS 
      JMP *+3       NO
      JSB OCRLF     YES DO IT 
      JMP SLO1
      JSB AIO,I     OUTPUT CHARACTER
      JMP SLO1      NO DO NEXT CHARACTER
SLO2  JSB OCRLF     NOW OUTPUT CR/LF
      CLA 
      ISZ OUT 
      JMP OUT,I     RETURN TO CALLER
* 
*         OUTPUT CARRIAGE RETURN + LINE FEED
* 
OCRLF NOP 
      LDA %B15      GET CARRIAGE RETURN 
      LDB OUT,I     CHECK IF STANDARD LF
      CPB %B12      ? 
      JSB AIO,I     OUTPUT IT 
      LDA OUT,I     GET LINE FEED COMMAND 
      JSB AIO,I     OUTPUT IT 
      LDA %B377     GET RESPONSE TIME 
      JSB TMR       GO TO 1 MILLSEC TIMER 
      JMP OCRLF,I   RETURN
      SKP 
*         GET A CHARACTER FROM THE BUFFER INTO A REG. 
*         CALL: 
* 
*         JSB BUF2A 
*         <RETURN IF BUFFER EMPTY>
*         <RETURN WITH CHARACTER IN AREG.>
* 
BUF2A NOP 
      LDB BUFFR     GET NEXT CHARACTER ADDRESS
      JSB GETFC     GET CHARACTER 
      ISZ BUFFR     MOVE BUFFER TO NEXT CHARACTER 
      ISZ CCNT      NO COUNT THIS CHARACTER 
      ISZ BUF2A     SET GOOD RETURN 
      JMP BUF2A,I 
* 
*         PUT A CHARACTER IN A REG. INTO BUFFER 
*         CALL: 
* 
*         LDA <CHARACTER> 
*         JSB A2BUF 
*         <RETURN IF BUFFER IS FULL>
*         <NORMAL RETURN> 
* 
A2BUF NOP 
      LDB BUFFR     GET BUFFER POINTER
      JSB PCIB      PUT CHARACTER IN BUFFER 
      ISZ BUFFR     MOVE TO NEXT CHARACTER
      ISZ CCNT      IS THAT ALL 
      ISZ A2BUF     NO
      JMP A2BUF,I   RETURN TO CALLER
* 
*         GET A CHARACTER FROM FORMAT STRING
* 
GETFC NOP 
      CLE,ERB       ADJUST UPPER/LOWER
      LDA B,I       GET 2 CHARACTERS
      SEZ,RSS       IS IT UPPER OR LOWER
      ALF,ALF       IT'S UPPER
      AND %B377     MASK UNWANTED BITS
      JMP GETFC,I   RETURN
* 
*         PUT A REG. INTO BUFFER
* 
PCIB  NOP 
      STA BUF2A     SAVE THE CHARACTER
      SLB,INB       GET OPPSITE CHARACTER 
      ADB %M2 
      JSB GETFC 
      ALF,ALF       MOVE INTO UPPER 
      IOR BUF2A     ADD NEW CHARACTER 
      SEZ           SHOULD IT BE SWAPPED? 
      ALF,ALF       YES 
      STA B,I       STORE IT
      JMP PCIB,I    RETURN TO CALLER
      SKP 
*         CONSTANTS AND STORAGE 
* 
%B2   OCT 2 
%B7   OCT 7 
%B10  OCT 10
%B12  OCT 12
%B15  OCT 15
%B40  OCT 40
%B55  OCT 55
%B60  OCT 60
%B121 OCT 121 
%B126 OCT 126 
%B177 OCT 177 
%B377 OCT 377 
%M2   OCT -2
%M6   OCT -6
%M10  OCT -10 
%M60  OCT -60 
%M72  OCT -72 
%BT15 OCT 100000
* 
H77LD LDA 120B      REPLACE HLT 77B WITH JSB
* 
LDSN  NOP 
LDSNX NOP 
LDBP  NOP 
LDBPS NOP 
* 
COUNT NOP           INITIAL BUFFER COUNT
CCNT  NOP           WORKING BUFFER COUNT
BUFFA NOP           INITIAL BUFFER ADDRESS
BUFFR NOP           WORKING ADDRESS POINTER 
      SKP 
*         PROGRAM LOADER SECTION
* 
*         INITIAL START IS FROM 120B
*           A-REG = SERIAL NUMBER DESIRED 
*                 = 0 = LOAD NEXT CONSECUTIVE PROGRAM 
* 
*           B-REG = BIT PATTERN FOR SERIAL EXECUTION (SET =RUN IT)
* 
*         AT COMPLETION OF THE LOAD 
*         THE A-REG. IS SET TO THE CURRENT DSN. 
*         IF RUN IS PRESSED THE PROGRAM DOES A JMP 100B.
* 
LOAD  NOP           ENTRY FOR START OR CONTINUATION 
      CLC INTP,C    TURN ALL OFF
      STA CCNT      SAVE A-REG
      LDA LOAD
      CPA %B121     IS THIS A RESTART 
      JMP LOADP     YES 
* 
LOADS LDB LDBP      NO - ANY MORE 
      SZB           FOR SERIAL EXECUTION
      JMP LOADX 
      LDB LDBPS     GET ORIGINAL SELECTION
      STB LDBP
      LDA LDSN      GET SERIAL NUMBER 
      SZA,RSS 
      JMP HLT77-1   DONT LOOP 
      JMP LODRW     REWIND DEVICE 
LOADX CLA           READ NEXT CONSECUTIVE PROGRAM 
      LDB H77LD     REPLACE HLT 77B INSTRUCTION 
      JSB LOADB 
      OTA SWREG     CLEAR S-REG.
      LDB LDBP      CHECK TO EXECUTE IT 
      CLE,ERB 
      STB LDBP
      SEZ           ??
      JMP 100B      EXECUTE THE PROGRAM 
      JMP LOADS     NO MOVE TO NEXT ONE 
* 
LOADP LDA CCNT      RESTORE A-REG 
      STA LDSN      SAVE IT 
      STB LDBPS     SAVE BIT PATTERN
      STB LDBP
LODRW CCB           GET REWIND (SKIP 1 FILE)
      SZA           REWIND? 
      JSB DRI,I     YES 
      LDA LDSN      RESTORE SERIAL NUMBER 
      LDB LDBPS     SERIAL EXECUTION? 
      SZB           ? 
      JMP LOADX+1   YES DO IT 
      JSB LOADB     LOAD AN ABS FILE
      OTA SWREG     CLEAR S-REG.
      LDA DSN       GET CURRENT SERIAL NUMBER 
HLT77 HLT 77B       LOAD OK 
      JMP 100B      YES START EXECUTION 
      SKP 
LOADB NOP 
      STA LDSNX     SAVE REQUEST
      STB LDRXX     SET INSTRUCTION FOR HLT 77B 
      CLB,INB,RSS   DON'T CHECK FOR EOT 
LDRR  LDB %B2       LOOK FOR END OF TAPE
      JSB LDVR      READ FIRST RECORD 
      SZA,RSS       EOF?
      JMP LOADB,I   YES NORMAL RETURN 
      SSA,RSS       EOT?
      JMP *+5 
      LDA LDSN      RESTORE ORIGINAL A AND B REG. 
      LDB LDBPS 
      OCT 106070    WAIT FOR OPERATOR 
      JMP 120B      START ALL OVER
      ALF,ALF       RETURN IS A = COUNT 
      CMA,INA       MAKE IT NEGATIVE
      STA CCNT      SAVE COUNT
      CLB 
      JSB LDVR      READ ADDRESS
      STA BUFFA     THIS WORD IS THE STORE ADDRESS
      STA COUNT     INITIALIZE CHECKSUM 
LDRL  CLB 
      JSB LDVR      READ A WORD 
      STA BUFFR     SAVE WORD 
      ADA COUNT     ADD WORD
      STA COUNT       TO CHECKSUM 
      LDA BUFFA     GET CURRENT ADDRESS 
      LDB LDSNX     GET SERIAL NUMBER 
      SZB,RSS 
      JMP *+7       NO DSN SKIP CHECK 
      CPA %B126      IS THIS ADDRESS 126B 
      CPB BUFFR     YES IS IT THIS DSN? 
      JMP *+4       YES 
LDRFF LDB %M2       NO GET FILE FORWARD 
      JSB LDVR
      JMP LDRR-1    START READING AGAIN 
      CMA,INA       IS THE ADDRESS IN THE 
      ADA LDMXA       PROTECTED AREA
      SSA,RSS       ? 
      JMP *+3 
      HLT 55B 
      JMP LDRFF     YES - TRY NEXT FILE 
      LDA BUFFR     GET CONTENTS FOR MEMORY 
      CPA HLT77     CHECK FOR HLT 
LDRXX NOP           YES REPLACE WITH LDA JSB 107B,I INST
      STA BUFFA,I   PUT IT IN MEMORY
      ISZ BUFFA     MOVE TO NEXT LOCATION 
      ISZ CCNT      IS THAT ALL?
      JMP LDRL      NO
      CLB 
      JSB LDVR      READ CHECKSUM FROM FILE 
      CPA COUNT     DOES CHECKSUM AGREE?
      JMP LDRR      READ NEXT RECORD
      HLT 11B       TELL OPERATOR OF CHECKSUM ERROR 
      JMP LDRR      READ NEXT RECORD
      SKP 
*     CONSOLE OUTPUT AND INPUT AND LINE PRINTER OUTPUT
* 
CNSLO NOP 
      OCT 0,0,0,0,0,0,0,0,0,0 
      OCT 0,0,0,0,0,0,0,0,0,0 
CNSLI NOP 
      OCT 0,0,0,0,0,0,0,0,0,0,0 
      OCT 0,0,0,0,0,0,0,0,0,0,0,0 
LNPTR NOP 
      OCT 0,0,0,0,0,0,0,0,0,0 
      OCT 0,0,0,0,0,0,0,0,0,0 
* 
*     LOADER DRIVER (DIAGNOSTIC INPUT DEVICE
* 
*         B = +1 READ TO FIRST RECORD 
*                A = 0  NEXT FILE 
*                A = #  SERIAL NUMBER OF FILE 
*         B = +2 READ NEXT RECORD 
*         B =  0 READ A WORD OF THE RECORD
*         B = -1 REWIND AND FILE FORWARD
*         B = -2 REWIND ONLY
*         B = -3 FILE FORWARD ONLY
* 
LDVR  NOP 
* 
*        RETURN 
*        A = 0  END OF FILE 
*        A = -1 END OF TAPE (FILES) 
*        A = +# RECORD COUNT
* 
* 
      REP 246B
      OCT 106075    MEMORY HALT 
      SKP 
BFR   EQU BUFFR-6000B 
BFA   EQU BUFFA-6000B 
CNT   EQU CCNT-6000B
COT   EQU COUNT-6000B 
ISZ   EQU 36000B
LDA   EQU 62000B
LDB   EQU 66000B
ADA   EQU 42000B
ADB   EQU 46000B
STA   EQU 72000B
STB   EQU 76000B
AND   EQU 12000B
IOR   EQU 32000B
XOR   EQU 22000B
CPA   EQU 52000B
CPB   EQU 56000B
JSB   EQU 16000B
JMP   EQU 26000B
SETP  EQU SETUP-6000B 
.IN   EQU IN-6000B
.OUT  EQU OUT-6000B 
CSLI  EQU CNSLI-6000B 
CSLO  EQU CNSLO-6000B 
LPTR  EQU LNPTR-6000B 
LD    EQU LDVR-6000B
PTMA  EQU 7677B-LDVR-PTDMA-1 IF ANY OF THESE GO 
MGMA  EQU 7677B-LDVR-MGBF-60  NEGATIVE -THE ALLOWED 
DSMA  EQU 7677B-LDVR-DSDMC    AREA HAS BEEN EXCEEDED
DFMA  EQU 7677B-LDVR-DFDMC    AND MUST BE CORRECTED 
CTMA  EQU 7677B-LDVR-CTCW3
* 
      END 
                