ASMB,L,C,R,Z      ***RTE 2640\2644\2645 LOGICAL  DRIVER** 
*     NAME:   LDVR5   32 PORT VERSION 
*     SOURCE: HP 2644 \2645  RTE LDVR5 91731-18003
*     RELOC.: HP 2644A\2645  RTE LDVR5 91731-16006  WITH CTU
*     RELOC.: HP 264X        RTE LDVR5 91731-16005  WITHOUT CTU 
* 
*     PRMR:   B.B. (LOGICAL-LDVR5-MOD B.R.) 
* 
*     REVISIONS (RXX) BY G.D. 
*     LAST REV: (R06) 4/3/79   SET DVR TYPE TO 05 ON CALL 
*     LAST REV: (R05) 10/19/78
*               (R04) 10/3/78 
*               (R03) 9/18/78 
*               (R02) 9/11/78 
*               (R01) 9/7/78
* 
* 
***************************************************************** 
* (C) COPYRIGHT HEWLETT-PACKARD COMPANY 1978. ALL RIGHTS        * 
* RESERVED. NO PART OF THIS PROGRAM MAY BE PHOTOCOPIED,         * 
* REPRODUCED OR TRANSALATED TO ANOTHER PROGRAM LANGUAGE WITHOUT * 
* THE PRIOR WRITTEN CONSENT OF HEWLETT-PACKARD COMPANY.         * 
***************************************************************** 
* 
****LDVR5 WILL WORK WITH 2640B\2645 
* 
*********************************************** 
* FOR CTU AND OR PRINTER OPERATION INCLUDE    * 
* "Z" PARAMETER IN ASSEMBLY CONTROL STATEMENT * 
*     ASMB,R,Z                                * 
*********************************************** 
* 
* 
*********************************************** 
* FOR KEYBOARD\DISPLAY OPERATION ONLY         * 
* INCLUDE "N" PARAMETER IN CONTROL STATEMENT  * 
*     ASMB,R,N                                * 
*********************************************** 
* 
*2.1    INPUT/OUTPUT INTERFACE
* 
*       LDVR5 WILL COMMUNICATE WITH THE 2644A/2640A VIA THE 12920 
*       ASYNCHRONOUS DATA COMMUNICATION INTERFACE. LDVR5 WILL ALSO
*       FUNCTION WITH A 2640A FOR THOSE APPLICATIONS WHERE THE CTU IS 
*       NOT REQUIRED.  COMMUNICATION FROM THE 2644A/2640A KEYBOARD MAY BE 
*       IN EITHER CHARACTER OR BLOCK MODE.  THE TERMINAL CAN BE USED WITH 
*       "LINE STRAPPING", OR "PAGE STRAPPING" AND HENCE A SINGLE LINE OR
*       THE ENTIRE DISPLAY MEMORY CAN BE TRANSMITTED AFTER BEING ENABLED. 
* 
* 
*2.2    MAJOR FUNCTIONS 
* 
*       LDVR5  PROVIDES THE FOLLOWING MAJOR FUNCTIONS:
*    1. I/O CONTROL OF CARTRIDGE TAPE UNIT (CTU),CRT,AND TERMINAL PRINTER.
*    2. READ OR WRITE REQUEST TO CTU WITH BINARY OR ASCII DATA. 
*    3. READ OR WRITE REQUEST TO KEYBOARD AND DISPLAY.
*    4. STATUS REQUEST TO CTU AND KEYBOARD. 
*    5. CONSOLE OR TERMINAL USE.
*    6. WRITE REQUEST TO TERMINAL PRINTER (2644 2645 ONLY)
* 
* 
*2.2.1  CTU CONTROL REQUEST 
* 
*ICNWD (CONTROL LEFT OR RIGHT CTU AS SELECTED BY LOGICAL UNIT NUMBER) 
*    01-WRITE END OF FILE 
*    02-BACKSPACE 1 RECORD
*    03-FORWARD SPACE 1 RECORD
*    14-BACKSPACE 1 FILE
*    13-FORWARD SPACE 1 FILE
*    4 -REWIND
*    27-LOCATE FILE.  THIS IS AN ABSOLUTE FILE NUMBER.
*    26-WRITE END OF VALID DATA (EOV) 
*    10-WRITE EOF IF NOT JUST WRITTEN OR NOT AT BOT 
*    32-UPDATE INTERNAL TERMINAL STATUS 
* 
*      *NOTES ON CTU CONTROL REQUEST *
*    A. A REWIND, BACKSPACE RECORD, OR BACKSPACE FILE WILL PERFORM
*       NO ACTION IF THE TAPE UNIT IS AT LOAD POINT.  THIS CONDITION
*       WILL BE SET IN THE STATUS WORD (BIT 6 SET). 
*    B. IF THE END-OF-TAPE MARK IS SENSED DURING A WRITE OPERATION, 
*       AN END OF VALID DATA MARK WILL BE RECORDED AUTOMATICALLY.  IF 
*       A WRITE REQUEST WAS BEING PROCESSED, THE CURRENT RECORD WILL
*       BE RECORDED.  IF A READ REQUEST WAS IN PROCESS THE CURRENT
*       RECORD WILL BE READ.  THIS CONDITION WILL BE SET IN THE STATUS
*       WORD. 
*    C. FOR FILE MOTION COMMANDS THE TAPE IS POSITIONED AFTER THE 
*       FILE MARK.
*    D. READ REQUESTS WILL BE REJECTED IF THE TAPE IS AT EOV.  THE
*       EOV MAY BE OVERWRITTEN WITH DATA OR A FILE MARK UNLESS THE
*       TAPE IS AT END-OF-TAPE. 
*    E. AN INVALID FUNCTION CODE WILL CAUSE THE DRIVER TO EXIT WITH 
*       THE FUNCTION IGNORED. IF THE FUNCTION CODE IS VALID, EXIT IS
*       NORMAL. 
*     F. DYNAMIC STATUS PUTS THE STATUS OF THE LAST LEFT OR RIGHT 
*        CTU OPERATION IN PRAM1.
* 
* 
*2.2.2  CRT CONTROL REQUEST 
* 
*ICNWD
*     11-SPACE "IPRM" LINES -IPRM PG. EJECT 9871 ONLY 
*    22-SET NEW TIME OUT  (IN OPTIONAL PARAMETER) 
*    24-RESTORE OUTPUT PROCESSING.  REQUIRED ONLY IF SOME OF BUFFER IS
*       TO BE SAVED.
*      -ANY CONTROL REQUEST, VALID OR INVALID, WILL RESULT IN ENABLING
*       INTERRUPT ON A TERMINAL IF THE TERMINAL HAS BEEN ENABLED. 
* 
* 
*2.2.3  CTU READ/WRITE REQUEST
* 
*      -READ/WRITE FROM LEFT OR RIGHT CTU AS SELECTED BY LOGICAL UNIT 
*       NUMBER. 
*      -IF THE OPERATION FAILED, RETURN WILL BE THROUGH DVS00 WITH BIT
*       5 OF EQT 19=0 
*ICNWD
* 
*    6 -0/1 IS ASCII/BINARY 
*    7 -1 AND 6 -0 READ A COMPLETE FILE(ASCII)-ILLEGAL FOR BLK&PG 
*    10-0/1 IS NOT HONEST/HONEST
* 
*      -BINARY INPUT IS A STRING OF CHARACTERS SPECIFIED BY THE BUFFER
*       LENGTH PARAMETER IN THE REQUEST. IF THE REQUIRED LENGTH IS FILLED 
*       BEFORE A END-OF-RECORD (EOR) IS ENCOUNTERED, THE REMAINING DATA 
*       IS IGNORED AND THE CTU WILL STOP AT THE NEXT EOR.  IF A EOR IS
*       ENCOUNTERED BEFORE THE REQUIRED LENGTH IS FILLED THE CTU WILL 
*       HALT IN THE EOR.
*        IF BUFFER LENGTH=0, THEN SKIP
*       ONE RECORD. 
*      -BINARY OUTPUT IS A STRING OF CHARACTERS SPECIFIED BY THE BUFFER 
*       LENGTH PARAMETER IN THE REQUEST.  MAXIMUM RECORD LENGTH IS 128
*       WORDS.  THIS LIMIT IS SET BY THE CTU DATA BUFFER. 
*      -ASCII INPUT IS A STRING OF CHARACTERS TERMINATED BY A CARRIAGE
*       RETURN (CR).  IF THE REQUIRED LENGTH IS FULFILLED BEFORE A CR 
*       IS INPUT, THE REMAINING CHARACTERS ARE IGNORED.  IN ANY CASE, A 
*       CR CODE MUST BE INPUT.
*      -ASCII FILE READ (200B+LU), ALL CHARACTERS ARE READ UNTIL
*       AN EOF IS ENCOUNTERED,IE. AN 'RS' CHAR. 
*      -ASCII OUTPUT IS A STRING OF CHARACTERS SET BY THE BUFFER LENGTH.
*       MAXIMUM RECORD LENGTH IS 127 WORDS (CR IS SENT BY LDVR5 ).  THE 
*       DRIVER WILL TERMINATE THE REQUEST IF IT SEES A "CR", "LF" OR "RS".
*       THE DRIVER USES THE "CR" AS A RECORD TERMINATOR ON INPUT
*       AND THE 2644A USES THE "LF" AS RECORD TERMINATOR ON OUTPUT.A "RS" 
*       IS PASSED TO THE DRIVER WHEN THE CTU ENCOUNTERS A FILE GAP. 
* 
* 
*2.2.4  ASCII OUT TO DISPLAY
* 
*      -ASCII OUTPUT IS A STRING OF CHARACTERS, THE NUMBER OF WHICH IS
*       DESIGNATED BY THE BUFFER LENGTH.  THE STRING IS TERMINATED BY A 
*       CARRIAGE RETURN AND LINE FEED (BOTH SUPPLIED BY DRIVER).
*      -IF AN UNDERSCORE (ASCII 137) IS THE LAST CHARACTER IN THE NEW 
*       BUFFER, THE CARRIAGE RETURN, LINE FEED AND UNDERSCORE CODES ARE 
*       NOT OUTPUT TO THE CRT.
*      -BUFFER LENGTH SHOULD BE LIMITED TO 80 DISPLAYABLE CHARACTERS. 
*      -THE CURSOR WILL REMAIN IN COLUMN 80 IF CURSOR END-OF-LINE WRAP
*       AROUND STRAP IS NOT IN.  OTHERWISE AN AUTOMATIC CR LF ARE GENERATED.
*      -HONEST MODE WRITE THE CR AND LF ARE NOT OUTPUT.  AN UNDERSCORE
*       WILL ALWAYS BE OUTPUT TO DISPLAY IF IN BUFFER.
*      -DURING OUTPUT TO DISPLAY STRIKING ANY KEY WILL FREEZE OUTPUT. TO
*       RESUME STRIKE ANY KEY.  TO GET SYSTEM ATTENTION HIT <BREAK>.
* 
*     -BINARY WILL STRIP "ESC", EXCEPT WHEN SUB=3 
* 
*2.2.5  ASCII INPUT FROM KEYBOARD CHARACTER MODE
* 
*       THE DRIVER DETECTS WHETHER A CHARACTER MODE OR BLOCK MODE REQUEST 
*       WILL FOLLOW BY EXAMINING THE FIRST CHARACTER.  IF IT IS A DC2 
*       THEN THE DRIVER ASSUMES THE ENTER KEY HAS BEEN PRESSED AND A
*       BLOCK TRANSMISSION IS PENDING.  THE DRIVER RESPONDS WITH A DC1 TO 
*       TRIGGER THE BLOCK TRANSFERS.  IF THE FIRST CHARACTER IS NOT A DC1 
*       THEN THE DRIVER ASSUMES A CHARACTER TRANSFER IS PENDING.
*       IN CHARACTER MODE THE TERMINAL TRANSMITS A CHARACTER AT A TIME AS 
*       THE KEY IS DEPRESSED.  THE RECORD TERMINATION IS A CR OR RS.  THE 
*       DRIVER ECHOS A LF.
*       A RECORD TERMINATOR MUST BE ENTERED TO COMPLETE REQUEST, EVEN IF THE
*       USERS BUFFER IS FULL.  TRANSMISSION LOG IS RETURNED IN EQT 6
*       THERE ARE TWO TYPES OF CHARACTER MODE PROCESSING:  HONEST AND NON-HONEST
*    A. HONEST
*       ALL CHARACTERS EXCEPT CR AND RS SENT TO USERS BUFFER. 
*    B. NON-HONEST
*       THE DRIVER WILL PROCESS THE BELOW SPECIAL CHARACTERS: 
*      *DEL (RUBOUT) ASCII 177
*       ENTERING DEL WILL DELETE THE CURRENT RECORD AND CAUSE (\, 
*       CRLF)TO BE OUTPUT.  THIS IS USED TO DELETE THE CURRENT LINE 
*       AND START A NEW LINE. 
*      *BACKSPACE ASCII 10
*       ENTERING BACKSPACE WILL DELETE THE LAST CHARACTER.  THE 
*       TERMINAL WILL LOCALLY MOVE THE CURSOR BACK ONE POSITION.
*      *LINEFEED ASCII 12 
*       THIS WILL NOT BE SENT TO USER'S BUFFER. 
*     * CNTROL D ASCII 40 
*       ENTERING CONTROL D WILL CAUSE BIT 5 TO BE SET IN TERMINAL 
*       STATUS WORD AND TRANSMISSION TERMINATED WITH LOG. = 0.    THIS
*       BIT WILL BE CLEARED UPON NEXT ENTRY.
* 
* 
*2.2.6  ASCII INPUT FROM KEYBOARD BLOCK MODE
* 
*       IN BLOCK MODE THE TERMINAL TRANSMITS EITHER A LINE AT A TIME (LINE
*       STRAPPING) ON A PAGE (PAGE STRAPPING).  THE DRIVER DETERMINES TYPE
*       OF STRAPPING BY A TERMINAL STATUS REQUEST.
*    A. LINE STRAPPING
*       THE TERMINATOR IS A CR WHICH IS NOT PASSED TO USER'S
*       BUFFER.  IMBEDDED RS'S ARE NOT PASSED.
*    B. PAGE STRAPPING
*       THE TERMINATOR IS A RS WHICH IS NOT PASSED TO USER'S BUFFER.  THE 
*       LINE SEPARATORS CR, LF ARE PASSED TO USER'S BUFFER. 
*    C. A "RS"  IS NEVER PASSED TO  BUFFER
*    D. BLOCK READS ARE OF 2 TYPES: 
*       1. TERMINAL ENABLED (ENTER PRESSED) 
*       2. USER ENABLED ("ESC" SMALL "D" SENT)
* 
* 
*2.2.7  CTU DYNAMIC STATUS REQUEST (RETURNED IN IBUF) 
*        FOR: CALL EXEC(1,3700B+LU,IBUF,1) , IBUF(1) WILL CONTAIN;
* 
*  BIT
*    7 -END OF FILE SENSED.  A FILE MARK HAS BEEN DETECTED DURING A PRIOR 
*       READ OPERATION OR A FILE MARK HAS JUST BEEN RECORDED. 
*    6 -LOAD POINT SENSED.  CARTRIDGE TAPE IS AT OR BEFORE LOAD 
*       POINT MARKER.  MEANINFUL ONLY IF CARTRIDGE IS INSERTED. 
*    5 -END OF TAPE SENSED.  THE CARTRIDGE TAPE HAS PASED OVER EARLY
*       WARNING MARKER IN THE TAPE AND AN END-OF-VALID DATA MARK HAS BEEN 
*       RECORDED AUTOMATICALLY.  COMMANDS DIRECTING FORWARD MOTION OF TAPE
*       WILL BE REJECTED.  THIS STATUS ONLY HAS MEANING IF A CARTRIDGE IS 
*       INSERTED. 
*    4 -READ\WRITE  ERROR.WRITE 2645 ONLY 
*       A READ ERROR EXISTS IF THREE SUCCESSIVE ATTEMPTS FAILED TO READ 
*       THE DATA IN THE RECORD.  THE TAPE IS POSITIONED AFTER THE BAD 
*       RECORD. 
*    3 -LAST COMMAND ABORTED.  THE LAST COMMAND INITIATED FROM THE CPU OR 
*       KEYBOARD WAS UNSUCCESSFULLY PERFORMED.  OTHER STATUS CONDITIONS 
*       MAY BE CHECKED FOR CAUSE. 
*    2 -WRITE PROTECTED.  THE FILE PROTECT TAB ON THE CARTRIDGE IS IN THE 
*       POSITION TO PROHIBIT RECORDING OF DATA.  THIS STATUS ONLY HAS 
*       MEANING IF A CARTRIDGE IS INSERTED AND A RECORDING OPERATION HAS
*       BEEN ATTEMPTED. 
*    1 -END OF VALID DATA.  THE CARTRIDGE TAPE DETECTED AN END-OF-VALID 
*       DATA MARK DURING A PRIOR READ OR SEARCH OPERATION OR HAS JUST 
*       COMPLETED RECORDING AN END-OF VALID DATA MARK.  IN EITHER CASE, 
*       THE TAPE IS POSITIONED BEFORE THE END-OF VALID DATA MARK.  RECORDING
*       OPERATIONS MAY BE EXECUTED TO OVERWRITE THIS MARK WITH DATA 
*       OR A FILE MARK, UNLESS THE TAPE IS AT END OF TAPE.
*    0 -CARTRIDGE NOT INSERTED OR UNIT BUSY.
* 
* 
*2.2.8  CRT STATUS REQUEST  (RETURNED IN IEQT5) 
*        FOR: CALL EXEC(13,LU,IEQT5)
* 
*  BIT
*    7 -BUFFER FLUSH IN PROGRESS
*    6 -BREAK KEY HIT 
*    5 -CONTROL D ENTERED 
*    4 -TIME OUT
*    3 -SPEED SENSE IN PROGRESS 
*    2 -BAD COMMUNICATION LINE
*    1 -PAUSE MODE
*    0 -TERMINAL ENABLED(1) DISABLED(0) 
* 
* 
*2.2.9  CONSOLE OR TERMINAL USAGE.
* 
*       IF AT GENERATAION THE 2644A IS IDENTIFIED AS A TERMINAL (VIA THE
*       INTERRUPT TABLE) THEN STRIKING A KEY WILL SCHEDULE THE PROGRAM
*       ASSOCIATED WITH THAT TERMINAL IF THE TERMINAL HAS BEEN ENABLED
*       VIA A CONTROL REQUEST.
*       IF THE 2644 IS A CONSOLE THEN STRIKING A KEY WILL GET THE SYSTEM'S
*       ATTENTION AND A "*" PROMPT WILL BE WRITTEN. 
* 
*       LINE PROTOCOL:
* 
*       THIS DRIVER DOES NOT SUPPORT MAIN CHANNEL 
*       PROTOCOL FOR LINE TURN-AROUND DURING
*       HALF DUPLEX MODEM USE. LDVR5 RELIES UPON THE
*       PHYSICAL DRIVER TO PERFORM LINE TURN-AROUNDS
*       USING REVERSE CHANNEL PROTOCOL. 
* 
*       USE:
* 
*       LDVR5 IS A TYPE 30 PROGRAM. FOR RTE IV IT MUST
*       RESIDE IN THE SUB-SYSTEM GOBAL AREA, ALSO FOR RTEM-III. 
* 
*          ******CAUTION***** 
* 
*       IF LDVR5 IS USED AS A SUBROUTINE TO A USER PROGRAM
*       THE USER PROGRAM SHOULD LOCK IT SELF INTO CORE
*       DURING ALL I-O, AND THE DEFAULT TTY DRIVER
*       MUST BE RE-ATTACHED (SEE BELOW) BEFORE THE
*       THE USER PROGRAM COMPLETES. 
* 
*       INITIALIZATION: 
* 
*       TO ATTACH LDVR5 AS THE LOGICAL DRIVER DO THE FOLLOWING: 
* 
*         FROM FORTRAN  -  CALL EXEC(3,2500B+LU,IPRAM)
* 
*                         WHERE LU = LU NUMBER OF THE RESPECTIVE
*                                    DEVICE.
*                               IPRAM = THE ADDRESS OF THE ENTRY
*                                       POINT "LINT" IN LDVR5.
* 
*                          NOTE:  THE ADDRESS OF "LINT" MAY BE
*                                 OBTAINED FROM THE GENERATOR 
*                                 LISTING, OR A CALL TO LDVR5 
*                                 SEE BELOW FOR CALL FORMAT.
* 
*         FROM THE FILE MANAGER:
* 
*           :CN,LU,25B,IPRAM     PRAMATERS SAME AS ABOVE. 
* 
*       TO DETACH LDVR5 AND RE-ATTACH THE DEFAULT TTY DRIVER
*       DO THE FOLLOWING: 
* 
*         FROM FORTRAN:  CALL EXEC(3,2500B+LU,0)
*         FROM FMGR:     :CN,LU,25B,0 
* 
* 
******************************************
* SUBROUTINE<LDVR5>IS ENTERED TO         *
* OBTAIN THE ADDRESS OF THE ENTRY POINT  *
* OF "LINT" FOR ASSIGNING LDVR5 AS THE   *
* LOGICAL DRIVER                         *
******************************************
*   CALL SEQUENCE:
* 
*   CALL LDVR5(IPRAM) 
* 
*     WHERE IPRAM = PARAMETER TO RETURN ADDRESS OF "LINT" 
*                   FOR THE USER PROGRAM. 
* 
* 
      IFN 
      NAM LDVR5,30  91731-16005   REV.1926  790403
      XIF 
* 
      IFZ 
      NAM LDVR5,30  91731-16006   REV.1926  790403
      XIF 
      ENT LDVR5,LINT
      EXT $LIBR,$LIBX 
LDVR5 NOP 
      JSB $LIBR     MAKE PRIVILEGED 
      NOP 
      LDB LDVR5     GET PARAMETERS 1805 
      LDA B,I       GET RETURN ADDRESS 1805 
      STA LDVR5     SAVE IT FOR EXIT 1805 
      INB           BUMP ADDRESS TO PARAMETER 1805
      LDB B,I       GET PARAMETER ADDRESS 1805
      RBL,CLE,SLB,ERB CHECK FOR INDIRECT 1805 
      JMP *-2       1805
      LDA L5ADR     GET ADDRES OF "LINT"
      STA B,I       GIVE ADDRESS TO USER PROG.  1805
      JSB $LIBX           RETURN
      DEF LDVR5 
* 
* 
***************************************** 
*                                       * 
*    ENTER HERE FROM PHYSICAL DRIVER    * 
*                                       * 
***************************************** 
* 
      DEC 1926      REVISION CODE. ALWAYS BEFORE LINT (= EQT17-1) 
* 
* 
* 
LINT  NOP           INITALIZATION CALLS 
      JMP LINIT     COME TO HERE
* 
LRED  NOP           READ CALLS COME HERE
      JMP LREAD 
* 
LWRT  NOP           WRITE CALLS COME  HERE
      JMP LWRTE 
* 
LINIT STA ASAVE     SAVE CONTENTS OF A REG
      STB BSAVE     SAVE B REG. 
      LDA LINT      SAVE RETURN 
      STA RTN       ADDRESS 
      JSB SETIO     CONFIGURE IO
      LDA EQT27,I   FOR BINARY CTU READ 
      AND CMB3      CLR SELECTED BITS 
      STA EQT27,I   BIT 0 (0\1=TERM.STAT. READ NO\YES)
* 
      JMP I.051 
* 
* 
* 
***************************************************** 
* "B.X" IS NEG. BINARY NO., "D.X" IS NEG. DECIMAL NO* 
* "BN" IS SOME BINARY NO.                           * 
* SEE BELOW.                                        * 
***************************************************** 
* 
L5ADR DEF LINT
ASAVE NOP 
BSAVE NOP 
RTN   NOP 
CMB3  OCT 177767
CMB5  OCT 177737
CMB12 OCT 167777
B11   OCT 11
DTMSK OCT 140377    (R06) 
B2400 OCT 2400    (R06) 
* 
* 
* 
I.051 LDA EQT5,I    (R06) SET DRIVER TYPE TO 05 
      AND DTMSK     (R06) 
      IOR B2400     (R06) 
      STA EQT5,I    (R06) 
      JSB CDINT 
************************************************
* THOSE PORTIONS OF CODE WITHIN <IFZ> AND <XIF>*
* BOUNDRIES ARE DELETED IF <Z> OPTION IS NOT   *
* INCLUDED IS ASSEMBLY CONTROL STATEMENT       *
************************************************
* 
* 
      IFZ 
SWH1A NOP               SWITCH CRT \CTU ,LP= RSS\NOP
* 
      JMP I.251     YES! A CTU OR LP REQUEST
      XIF 
      LDA TEMP4     GET REQUEST 
      RAR 
      SSA,SLA       CONT.?
      JMP I.05C     YES 
      SSA,RSS       READ OR WRITE 
      JMP I.05W     WRITE 
      JMP I.05R     READ
* 
******************************************************************
* 
* 
* 
TIMOT EQU * 
      CLA 
      JMP RTN,I     LOOKS LIKE A BAD RET. TIME OUT
* 
* 
* 
BREAK NOP 
      LDA EQT5,I    SET THE BREAK 
      IOR B100      BIT FOR THE PHYSICAL
      STA EQT5,I    DRIVER
      LDB EQT13,I   KNOCK OUT 
      ADB B5        THE BREAK BIT - 12 -
      LDA B,I       IN EQ21 
      AND CMB12 
      STA B,I       RESTORE 
      JMP BREAK,I   RETURN FOR CHAR PROCESSING
* 
************************************************* 
* <I.05C> DOES CONTROL REQUEST PROCESSING FOR   * 
* THE KEYBOARD\DISPLAY.                         * 
************************************************* 
* 
*******TERMINAL STATUS******************************
*     BIT           STATUS                         *
*     5             "CONTROL D" ENTERED            *
*     7             BUFFER FLUSH ENABLED           *
*                                                  *
****************************************************
* 
* 
*******CRT CONTROL**********************************
*     EXEC CODE     CRT CONTROL REQUEST            *
*     11            SPACE LINES 
*     22            SET TIME OUT                   *
*                                                  *
****************************************************
* 
I.05C LDA RDTYP     GET CONTROL WORD TYPE 
      LDB EQT7,I
      SSB,RSS 
      CMB,INB       COMPLEMENT OPTIONAL PARAMETER 
* 
      CPA B11 
      JMP CN11      GO SPACE LINES
      CPA B22 
      JMP CN22      GO SET TIME OUT 
      CPA B32       UPDATE STATUS?
      JMP CN32      YES 
* 
********************REJECT REQUEST******************
* 
      JMP REJ1      ILLEGAL CONTROL REQUEST 
* 
LF    OCT 12
B37   OCT 37
B20   OCT 20
B21   OCT 21
B22   OCT 22
B2    OCT 2 
B.3   OCT 177775
B100  OCT 100 
B200  OCT 200 
B17   OCT 17
B32   OCT 32
B70   OCT 70
* 
**SPACE LINES*****
**MAX NO. IS 55** 
* 
CN11  SZB,RSS       CHECK FOR 0 VALUE 
      CCB           CHANGE TO -1
      STB EQT7,I
      ADB B70       MAX NO. OF (CR,LF'S) IS 55
      SSB           BECAUSE CARD BUFFER IS 128
      JMP REJ1
      JSB XMIT
      JSB EORP      OUTPUT (CR,LF)
      JSB ENAK      GIVE TERM. TIME TO PROCESS
      ISZ EQT7,I
      JMP *-4 
CN11A CLA 
      STA EQT29,I   SET A REG. EXIT 
      JMP EOOP4 
* 
* 
* 
CN22  EQU *         PRAM1 HAS THE TIME
      STB EQT14,I   FOR STANDARD TIMEOUT
      JMP REJ1      RETURN
CN32  JSB SPCH1 
      JSB TERST     UPDATE TERMINAL STATUS
      JMP CN11A 
**********EQT6 FOR READ\WRITE*****************
* 
* EQT6 FOR READ\WRITE OPERATIONS IS:         *
*     BIT           MEANING                  *
*     6             0\1 IS ASCII\BINARY      *
*     7             -1 AND 6 -0 FILE(ASC) READ
*     8             0\1 IS OFF\ON ECHO       *
*     10            0\1 OFF\ON HONEST MODE   *
*     9 AND 10 SET   USER ENABLED BLOCK READ *
* 
**********************************************
* 
* 
LWRTE STA ASAVE    SAVE A 
      STB BSAVE     AND B 
      LDA LWRT      GET ENTRY ADDRESS 
      STA RTN       SAVE FOR RETURN 
      JSB SETIO 
      LDA ASAVE     IS THE THE FIRST TIME?
      CPA B.1 
      JMP LWRT1     YES START WRITE 
      JSB BITCK     CHECK CONDITION BITS
      JMP TIMOT     TIMEOUT BIT15 ON
      JMP TIMOT     LINE ERROR BIT 14 ON
      JMP TIMOT     DATA ERROR BIT 13 ON
      JSB BREAK     BREAK BIT 12 ON 
      LDA EQT5,I    (R01) PAUSE MODE??
      RAR,SLA       (R01) 
      JMP REJ3      (R03) YES, IGNORE INT.
      LDA EQT11,I   NO, CONTINUE WITH WRITE 
      SZA,RSS       ARE WE TRYING TO COMPLETE?
      JMP REJ2      YES,IGNORE THE CHAR 
      JMP A,I 
LWRT1 CLA 
      STA EQT30,I   INIT RECORD COUNT 
      JMP I.051 
* 
* 
* 
I.05W CLB,RSS       SETUP EQT9(RUNNING CHAR. ADD.) AND
I05W1 NOP           EQT 10 (LAST CHAR. ADD.)
      LDA EQT7,I    GET BUFFER STARTING ADDRESS 
      RAL,CLE       MULTIPLY S.A. BY TWO
      STA EQT9,I    STORE AT EQT9 
      LDA EQT8,I    GET BUFFER LENGTH 
      CMA,SSA,INA,RSS COMPLEMENT,ARE THEY CHAR.?
      JMP I.W1      YES!
      CMA,INA       MAKE POS AGAIN
      RAL                MULTIPLY WORDS X 2  AND
* 
I.W1  ADA EQT9,I
      STA EQT10,I   STORE LAST CHAR. ADD. AT EQT10,I
      CMA,INA       MAKE LAST CHAR. ADD. NEG. 
      ADA EQT9,I    - NO. OF CHAR. ARE NOW IN A REG.
      SZB 
      JMP I05W1,I 
      SZA,RSS       IS IT 0 ? 
      JMP I.W32     YES! IT IS ZERO 
* 
      JSB TRAN1     GOTO OUTPUT SUBROUTINE
* 
      LDA TEMP2     IS THIS HONEST MODE?
      SZA 
      JMP EOOP2 
* 
I.W32 JSB XMIT
      JSB EORP      THIS IS NOT HONEST
      JMP EOOP2     ABOVE NEEDED FOR INTERRUPT
* 
* 
**********************************************
* <TRAN1> WRITES TO THE DISPLAY,CTU AND PRINTER.
* STARTING ADDRESS OF DATA IS EQT9,I             *
**************************************************
* 
* 
TRAN1 NOP 
      LDA TRAN1     SAVE RETURN ADDRESS 
      STA EQT29,I 
      JSB XMIT      SET CARD FOR XMIT 
* 
TRAN2 EQU * 
      LDB EQT9,I    GET BUFFER ADDRESS X 2
      CLE,ERB       DIVIDE BY TWO TO GET TRUE ADD.
* 
      JSB MAPRD     GET WORD
      SEZ,RSS       DO WE WANT UPPER OR LOWER CHAR.?
      ALF,ALF            UPPER!  SHIFT TO LOWER 
      AND B377           LOWER!  MASK WORD
      IFZ 
* 
SWH1B NOP           CRT\CTU=RSS\NOP 
      JMP TRAN3     YES! IGNORE BELOW CHECKS
      XIF 
* 
* 
      LDB FILL      DO NOT SEND "ESC" TO CRT ON 
      SZB           BINARY WRITE. 
      JMP ON1 
      LDB TEM11     IS THIS UNIT 3? 
      CPB B3        IF SO SKIP ESC CHECK
      JMP ON1 
      CPA ESC       IS THIS AN ESCAPE?
      JMP OUT6B 
* 
ON1   CLB,INB       SET B REG TO  1 
      ADB EQT9,I    ADD     1 TO   EQT9 
      CPB EQT10,I   IS THIS THE LAST WORD?
      RSS 
      JMP OUT6      NO! CONTINUE
      LDB TEMP2     IS THIS HONEST? 
      SZB 
      JMP OUT6      THIS IS HONEST,IGNORE UNDERSCORE
      CPA B137           IS THIS A "_" UNDERSCORE?
      JMP EOOP8      YES! GO TO END OF OUTPUT PROCESSING
      JMP OUT6
      IFZ 
TRAN3 LDB FILL      IS THIS BINARY? 
      SZB,RSS 
      JMP OUT6      THIS IS BINARY,OUTPUT CHARACTER 
      CPA CR        IS IT A <CR> ?
      RSS 
      CPA LF        IS IT A LINEFEED? 
      RSS           IT IS A <LF>
      CPA RS        IS IT A <RS>
      JMP TRAN5     YES,TERMINATE ON <CR> OR<LF>OR<RS>
      XIF 
* 
OUT6  JSB OUT1      OUTPUT CHAR. TO CARD.CHAR.
OUT6B ISZ EQT9,I    INCREMENT CHAR. COUNT 
      LDB EQT9,I    GET CURRENT CHAR. ADD.R 
      CPB EQT10,I   HAVE WE SENT LAST WORD? 
      JMP TRAN5     THIS IS THE LAST CHARACTER
      JMP TRAN2     WE HAVE NOT SENT ALL CHAR 
* 
TRAN5 LDA EQT29,I   GET RETURN ADDRESS
      JMP A,I       RETURN
* 
* 
*************************************************** 
* <LREAD> DOES KEYBOARD READ. IF FIRST CHARACTER  * 
* A "DC2" THE DRIVER EXPECTS A BLOCK TRANSFER AND * 
* WILL SEND A DC1 TO TRIGGER IT. IF THE FIRST     * 
* CHAR. IS NOT A "DC2" THE DRIVER ASSUMES A CHAR. * 
* TRANSFER. 
*************************************************** 
* 
* 
LREAD STA ASAVE   SAVE A
      STB BSAVE     AND B 
      LDA LRED      GET ENTRY ADDRESS 
      STA RTN       SAVE FOR RETURN 
      JSB SETIO     GO SET UP THE EQ'S
      LDA ASAVE     IS THE THE FRIST
      CPA B.1       TIME? 
      JMP LWRT1     YES, START TO READ
      JSB BITCK     GO CHECK CONDITION BITS 
      JMP TIMOT     TIMOUT BIT 15 ON
      JMP TIMOT     LINE ERROR BIT 14 ON
      JMP TIMOT     DATA ERROR BIT 13 ON
      NOP           BREAK,CAN'T GET ON READ 
      LDA EQT4,I    (R03) CRT SUBCHANNEL? 
      AND B3700     (R03) 
      SZA           (R03) 
      JMP LRED2     (R03) NO, NO PAUSE ON CTU!!!
      LDA EQT6,I    (R01) DOING READ OR WRITE?
      SLA           (R01) WRITE -> CHECK FOR PAUSE
      JMP LRED2     (R01) READ, CONTINUE
      LDA EQT31,I   (R01) CHECK LINE DIRECTION
      SSA           (R02) 
      JMP LRED2     (R01) READ, CONTINUE
      LDA EQT5,I    (R01) FLIP PAUSE BIT
      XOR B2        (R01) 
      STA EQT5,I    (R01) 
      RAR,SLA       (R01) WAIT NOW? 
      JMP REJ3      (R03) YES, WAIT FOR NEXT INT. 
      LDA BIT12     (R03) NO, OUTPUT NULL TO RESTART WRITE
      JMP REJ4      (R03) 
LRED2 LDA EQT11,I   NOTHING ELSE, RETURN
      SZA,RSS       ARE WE TRYING TO FINISH?
      JMP REJ2      YES, IGNORE THIS CHAR.
      JMP A,I       NO
* 
* 
* 
I.05R EQU * 
      JSB SPCH1     SET <CR> AND <RS> SPECIAL CHAR. 
      CLB,INB 
      JSB I05W1     GO SETUP EQT9 AND EQT10 
      LDA EQT6,I    CHECK IF ECHO SET 
      AND B400      ISOLATE BIT 8 (SET ECHO)
      JSB ECHO      SET/CLR = 20/0   ECHO 
      LDA BN9       SET RUBOUT INT. 
      JSB CDSET 
      LDA BN40      SET CONTROL "D" INT.
      JSB CDSET 
      LDA EQT6,I    CHECK FOR USER ENABLED BLOCK READ 
      AND B3000     BITS 9,10 WILL BE SET 
      CPA B3000 
      JMP C05R3     THIS IS ENABLED BLOCK READ
I.05S JSB DC1OT     ENABLE TRANSFER 
* 
      JSB CHRIN     GET CHARACTER 
      CPA B22       IS IT A DC2?
      JMP C05R4     FIRST CHAR. IS A DC2
* 
* 
*******THIS IS A CHARACTER TRANSFER*********
* 
* 
      LDA TEMP2     IS THIS HONEST? 
      SZA 
      JSB CLRNT 
      JMP CHPR8 
* 
* 
CLRNT NOP 
      LDA BN56      CLR. RUBOUT INT.
      JSB CDSET 
      LDA B412      CLR. CONTROL "D" INT. 
      JSB CDSET 
      JMP CLRNT,I 
* 
RS    OCT 36
B377  OCT 377 
B3700 OCT 3700      (R03) 
B137  OCT 137 
CR    OCT 15
BN9   OCT 57712 
BN10  OCT 40000 
BN11  OCT 43612 
BN12  OCT 41512 
BN13  OCT 140000
BN40  OCT 40412 
B177  OCT 177 
B4    OCT 4 
B144  OCT 144 
B3000 OCT 3000
B1512 OCT 1512
B3612 OCT 3612
BN56  OCT 17712 
B412  OCT 412 
* 
* 
***********THIS IS A BLOCK TRANSFER*********
* 
* 
C05R3 LDA EQT27,I   THIS IS A BLOCK TRANSFER
      SSA           (R04) 
      RSS           YES 
      JMP REJ1      NO ERROR
      JSB XMIT      GO TO TRANSMIT MODE 
      LDA ESC       OUTPUT  <ESC> 
      JSB OUT1
      LDA B144      OUTPUT SMALL <D>
      JSB OUT1
C05R4 EQU * 
      LDA EQT27,I   GET STATUS
      AND BN13      SAVE 15-14
      CPA BN13      BLOCK AND PAGE? 
      RSS 
      JMP *+4       NO
      LDA B1512     YES, TAKE CR AS SPECIAL 
      JSB CDSET 
      JMP C05R6     GO READ 
      SSA,RSS       IS IT BLOCK?
      JMP I.05S     NO, IGNORE DC2
      LDA B3612     REMOVE "RS" INT. ("CR" ONLY FOR LINE) 
      JSB CDSET     FOR  ASCII CTU,  LINE STRAP AND BLOCK 
* 
C05R6 JSB CLRNT 
      CLA 
      JSB ECHO      TURN OFF ECHO 
      JSB DC1OT     TRIGGER TRANSFER
C05R7 RSS           AND WAIT FOR INTERRUPT
* 
* 
**********************************************
*<CHPRC> PROCESSES DATA ON KEYBOARD AND CTU  *
* READ REQUESTS.                             *
*  BINARY EOR IS DETECTED BY THE CHAR.       *
* COUNT READ FROM THE TAPE.                  *
**********************************************
* 
* 
CHPRC JSB OUT1       EXIT AND AND WAIT FOR CHAR.
      JSB CHRIN     GET CHARACTER 
CHPR8 LDB FILL
      SZB,RSS       IS THIS BINARY? 
      JMP CHPR9     YES,THIS IS BINARY
* 
********THIS IS ASCII*******
* 
* 
* 
      LDA TEM14     GET DATA WORD 
      SZA,RSS       IS IT SPECIAL?
      JMP CHPR2     NO
* 
      IFZ 
SWH1C NOP           SWITCH  NOP\RSS =CTU\CRT
      JMP EOOP5     THIS IS CTU ASCII TRANSFER
      XIF 
      LDA EQT27,I   GET TERMINAL STATUS 
      AND BN13      ISOLATE PAGE(15) AND BLK(14)
      CPA BN13      ARE THEY BOTH SET?
      JMP EOOP2     YES,TERMINATE REQUEST 
      LDA TEMP8     GET CHARACTER 
      CPA B177      IS IT A RUBOUT? 
      JMP  RUB01    YES! GO PROCESS RUBOUT
      CPA B4        IS IT A CONTROL "D" (SET EOT) 
      JMP CNTLD     YES! GO SET EOT 
CHP9  JSB XMIT
      JSB EORP      FOR CHAR. OR LINE STRAP BLK REQUES
      JMP EOOP1     FIRST SEND <CR,LF>
* 
* 
CHPR2 LDA EQT27,I 
      IFZ 
SWH1D NOP           CRT\CTU = RSS\NOP 
      JMP CHPR9     THIS IS A CTU ASCII READ
      XIF 
      SSA           IS IT BLOCK MODE? 
      JMP CHPRA     YES! SKIP BELOW CHECKS
* 
      LDA TEMP2     IS THIS HONEST MODE?
      SZA 
      JMP CHPR9     THIS IS HONEST MODE 
      LDA TEMP8     GET CHARACTER 
      JMP LINFD     CHAR. TRANSFER AND NOT HONEST 
********************************************
* <RUB01> IS CALLED IF RUBOUT CHARACTER IS *
* DETECTED. IT DELETES THE CURRENT RECORD  *
* AND OUTPUTS (/,CR,LF).                   *
********************************************
* 
* 
RUB01 JSB XMIT
      LDA B134      OUTPUT A SLASH
      JSB OUT1
      JSB EORP      GO OUTPUT <CR,LF> 
      JMP I.051     RE START INPUT
* 
LINFD CPA LF        IS THIS A LINEFEED? 
      JMP CHPRC     YES,GO GET NEXT CHARACTER 
      CPA CR        IS THIS A CR ?
      JMP CHP9      YES! IT IS A CR,EXIT
      CPA B4        IS FIRST CHAR. A CONTROL "D" ?
      JMP CNTLD     YES!
* 
      CPA B10       IS THIS A BACKSPACE 
RSS   RSS 
      JMP CHPR9     NO! CONTINUE
      LDA EQT7,I    GET STARTING ADDRESS OF BUFFER
      RAL           MULTIPLY BY 2 
      CPA EQT9,I    ARE WE AT STARTING ADDRESS? 
      JMP RUB01     YES! PROCESS AS RUBOUT
      CCB 
      ADB EQT9,I    DECREMENT CURRENT ADDRESS 
      STB EQT9,I
      CLE,ERB       DIVIDE BY TWO TO GET TRUE ADDRESS 
      JSB MAPRD     (R04) FETCH CHAR
      AND BN15      MASK HIGH END 
      ADA FILL      ADD ASCII FILL CHARACTER
      JSB MAPWR     (R04) RESTORE 
      JMP CHPR6     GO GET NEXT CHARACTER 
* 
* 
B134  OCT 134 
BN15  OCT 177400
B40   OCT 40
B60   OCT 60
* 
CNTLD EQU *         SET BIT 5 (EOT) 
      LDA EQT5,I
      IOR B40       SET BIT 5 
      STA EQT5,I
      CLA 
      STA EQT29,I   SET AREG. EXIT
      JMP EOOP4     GO SET B REG. TO  0 AND EXIT
* 
* 
CHPRA LDA TEMP8 
      CPA RS        REMOVE "RS" 
      JMP CHPR6 
CHPR9 EQU * 
      LDB EQT9,I    GET CURRENT CHAR. ADD.
      CPB EQT10,I   IS BUFFER FULL? 
      JMP CHPR6     YES BUFFER FULL 
      LDB EQT9,I    GET CHARACTER ADDRESS 
      ISZ EQT9,I    INCREMENT 
      CLE,ERB       CONVERT TO WORD ADDRESS.
      JSB MAPRD     GET CHARACTER 
      STA BSAVE 
      LDA TEMP8 
      SEZ,RSS       IF E=0 THEN EVEN AND
      ALF,SLA,ALF   HENCE SHIFT CHAR. TO UPPER 8.SKIP 
      XOR BSAVE     IF ODD ADDRESS XOR WITH CHAR. 
      XOR FILL      XOR FILL TO ADD FILL IF EVEN
      JSB MAPWR     REPLACE FULL WORD 
      LDB EQT9,I    IS THIS THE LAST WORD?
      CPB EQT10,I 
      RSS           YES IT IS 
      JMP *+5 
      LDA FILL      IF BINARY KEYBOARD REQUEST AND BUFFER 
      ADA TEM10     FULL THEN EXIT
      CPA B60 
      JMP EOOP2     YES! EXIT 
CHPR6 ISZ EQT30,I   INCREMENT RECORD LENGTH COUNT.FOR 
      JMP CHPRC     IF NOT ZERO GET ANOTHER CHAR. 
      IFZ 
      JMP EOOP5     THIS IS ALL FOR BINARY READ 
      XIF 
* 
*  READ FROM USER MAP IF EQT1 IS NEG. ADDRESS IN B. 
* 
MAPRD NOP 
      LDA EQT1      IS IT NEG.??
      SSA 
      JMP *+3       YES, USE USER MP
      LDA B,I       GET CHAR FROM SYSTEM
      JMP MAPRD,I 
      XLA B,I       GET CHAR FROM  USER MAP 
      JMP MAPRD,I 
* 
*  WRITE TO USER MAP IF EQT1 IS NEG. ADDRESS IN B.
* 
MAPWR NOP 
      STA BSAVE     SAVE TEMP 
      LDA EQT1      ARE MAPS CHANGED? 
      SSA 
      JMP *+4       YES STORE TO USER MAP 
      LDA BSAVE 
      STA B,I       NO, PUT IN TO SYSTEM MAP
      JMP MAPWR,I 
      LDA BSAVE 
      XSA B,I       TO USER MAP 
      JMP MAPWR,I 
      IFZ 
* 
* 
* 
*************************************************** 
* <I.251> DOES CTU AND PRINTER REQUEST PROCESSING * 
*************************************************** 
* 
* 
* 
I.251 LDA TEMP4     GET REQUEST TYPE(1-3) 
      RAR 
      SSA,SLA 
      JMP I.25C     THIS IS CTU OR LP A CONTROL REQUEST 
      SSA 
      JMP I.25R     THIS IS CTU A READ REQUEST
* 
*********CTU OR PRINTER WRITE REQUEST********** 
* 
      CLB,INB 
      JSB I05W1     GO SET EQT9 AND EQT10 
      LDB FILL
      SZA           IS CHARACTER COUNT ZERO?
      JMP I25W6     NO! IT IS NOT ZERO
      SZB,RSS       IS IT BINARY
      JMP REJ1      EXIT WITH A=1 
I25W6 SZB           IF BINARY MAX LENGTH IS D 256 
      JMP *+3       FOR ASCII MAX LENTH    IS D 254 (NEDED CR,LF) 
      ADA B400
      RSS 
      ADA D254      THIS IS ASCII 
      SSA           LESS THAN 254 CHARACTERS
      JMP REJ1      IT IS NOT,THEREFORE EXIT
* 
* 
      JSB CTPRP     GO PREP. TERMINAL FOR TRANSFER
      LDA B144
      JSB OUT1      OUTPUT <SMALL D>
      LDA FILL      GET FILL CHARACTER
      SZA           IS IT BINARY? 
      JMP I25W2     NO! THIS IS ASCII 
* 
***********CTU BINARY WRITE******** 
* 
      LDA EQT8,I    GET   BUFFER LENGTH 
      SSA,RSS       IF WORDS MULTIPLY X2
      RAL 
      SSA           IF CHARACTERS (-) MAKE POS. 
      CMA,INA 
      JSB BINAS     GO CONVERT TO ASCII AND SEND
* 
* 
I25W2 LDA B127      OUTPUT <CAP.W> TO INITIALIZE CTU TRANSFER 
      JSB OUT1
* 
* 
      LDA FILL      IS THIS BINARY
      SZA,RSS 
      JSB ENAK      THIS IS BINARY,GO HANDSHAKE 
      LDB EQT8,I    GET WORD COUNT
      SZB           IS IT ZERO?(ASCII ONLY,BINARY CHECKED 
* 
      JSB TRAN1     ALREADY).IT IS NOT ZERO 
      LDA FILL      GET FILL CHAR.
      SZA           IS IT BINARY
      JSB EORP      NO! THIS IS ASCII,WRITE A "CR,LF" 
I25W5 EQU *         &&&&FOR <CR OR RS> INTERRUPT
      JSB DC1OT     GO TRIGGER STATUS REPORT
* 
* 
      JSB CHRIN     GET STATUS CHARACTER
* 
      JSB OUT1      GET THE @@&&&&*** CR....
      LDA EQT33,I 
      CPA B106      FAILURE?
      JMP I25W7     YES 
      CLA,RSS 
I25W7 LDA B10       SET BIT 3 IN EQT5 FOR PRINT FAIL
      LDB TEM10     IS THIS A PRINTER?
      CPB B64 
      JMP EOOP6     THIS IS A PRINTER 
      JMP EOOP7     THIS IS A CTU 
* 
* 
D254  DEC 254 
B127  OCT 127 
B163  OCT 163 
B122  OCT 122 
B62   OCT 62
* 
* 
***********THIS IS A CTU READ REQUEST******** 
* 
I.25R EQU * 
      JSB SPCH1     SET <CR> AND <RS> AS SPECIAL
      LDA RDTYP     LOOK AT TYPE
      CPA B37       IS IT?
      JMP CN6C      YES SPECIAL READ
      LDB TEM10     IF READ FROM PRINTER REJECT 
      CPB B64 
      JMP REJ1
      LDB EQT8,I    GET BUFFER LENGTH 
      SZB,RSS       IS IT ZERO? 
      JMP CN3C      YES --GO SKIP ONE RECORD
      CLB,INB       NO!, IT IS NOT ZERO 
      JSB I05W1     GO SET UP EQT9,EQT10
      LDB RDTYP     IS THIS A FILE READ?
      CPB B2        IS THIS IT? 
      RSS           YES 
      JMP *+5       NO
      LDA EQT27,I   CHECK FOR BOTH BLOCK
      AND BN13      AND PAGE STRAP, IF SO 
      CPA BN13
      JMP REJ1      REJECT THIS READ
      JSB CTPRP     GO PREP. TERM. FOR CTU TRANSFER 
      LDA B163
      JSB OUT1      OUTPUT <SMALL "S">
      LDA FILL
      SZA,RSS       IS THIS BINARY? 
      JMP I25R2     YES! THIS IS BINARY 
      LDA B60       OUTPUT A ZERO FOR RECORD
      LDB RDTYP 
      CPB B2
      LDA B64       OR 4 FOR FILE 
      JSB OUT1
      LDA B122      OUTPUT <CAP."R">
      JSB OUT1
* 
* THIS IS ASCII 
      LDA B1512     DISABLE <CR>  IF FILE READ
      LDB RDTYP     GET TYPE
      CPB B2
      JSB CDSET 
      JMP C05R6     GO TRIGGER TRANSFER FOR ASCII 
* 
* 
****THIS IS BINARY READ*****
* 
I25R2 LDA B62       OUTPUT <2>
      JSB OUT1
      LDA B122      OUTPUT <CAP."R">
      JSB OUT1
      JSB CDINT     ####
      JSB SPCH1     SET FOR <CR,RS> INTERRUPT 
      JSB DC1OT     TRIGGER BYTE COUNT
* 
      LDA B.4       INITIALIZE TO READ 4 BYTES
      STA EQT30,I 
      CLA 
I25R5 ALF           SHIFT UP
      STA EQT35,I   AND STORE 
      JSB CHRIN     GET CHARACTER 
      CPA RS        IS IT A" RS"? 
      JMP I25R6     YES,THIS IS ALL 
      AND B17       ISOLATE DATA
      IOR EQT35,I   "OR" WITH LAST BYTE 
      STA EQT35,I   SAVE
      JSB OUT1      GET NEXT
      LDA EQT35,I   GET NUMB AGAIN
      ISZ EQT30,I   IS THIS ALL?? 
      JMP I25R5     NO! GET NEXT BYTE 
      CMA,INA       THIS IS ALL,COMPLEMENT
      STA EQT30,I   STORE BINARY RECORD LENGTH. 
      JSB DC1OT     TRIGGER TRANSFER
      JMP C05R7     GO ENABLE TRANSFER
I25R6 LDA EQT27,I   DO WE NEED TO GET 
      AND BN13      THAT CR?
      CPA BN13
      JMP EOOP5     NO COMPLETE 
      JSB OUT1      YES GET IT
      JMP EOOP5 
* 
* 
***************************************************** 
*<I.25C DOES CTU AND PRINTER CONTROL REQUEST        * 
* PROCESSING. BELOW ARE THE LEGAL CODES.            * 
* THE CTU CONTROL CODE AND OPTIONAL PARAM.          * 
* ARE IN PARENTHESIS.                               * 
*                                                   * 
*          CARTRIDGE TAPE UNIT  (CTU)               * 
* EXEC CODE          CONTROL REQUEST                * 
*     1(5)          WRITE END OF FILE               * 
*     2(1,-1)       BACKSPACE 1 RECORD              * 
*     3(1,1)        FORWARD SPACE 1 RECORD          * 
*     4(0)          REWIND                          * 
*     10            GEN. LEADER (CTU WEOF)          * 
*     13(2)         FORWARD SPACE 1 FILE            * 
*     14(2,-1)      BACKSPACE 1 FILE                * 
*     26(6)         WRITE END OF VALID DATA (EOV)   * 
*     27(2,P)       LOCATE FILE <P>                 * 
*                                                   * 
*          PRINTER                                  * 
*     11            SPACE <P> LINES IF OPTIONAL     * 
*                   PARAM (+) OR PAGE EJECT IF      * 
*                   OPTIONAL PARAM (-). 
*                   PAGE EJECT 9871 ONLY
***************************************************** 
* 
* 
I.25C LDA RDTYP     GET CONTROL WORD
      STA EQT10,I    STORE FOR LATER USE
      LDB TEM10     GET DEVICE TYPE 
      CPB B64       IS IT A LP? 
      JMP CN28C     YES! IT IS A LP 
      CPA B1        IS IT EOF?
      JMP CN1C      YES!
      CPA B2        IS IT BACKSPACE RECORD? 
      JMP CN50C     YES!
      CPA B3        FORWARD SPACE?
      JMP CN3C      YES!
      CPA B4        REWIND? 
      JMP CN4C      YES!
      CPA B10       GENERATE LEADER(EOF)
      JMP CN10C 
      CPA B11       T.O.F TO CTU IS WEOF
      JMP CN1C      WRITE EOF 
      CPA B13       FORWARD SPACE 1 FILE? 
      JMP CN13C     YES!
      CPA B14       BACKSPACE FILE? 
      JMP CN50C     YES!
      CPA B26       WRITE EOV?
      JMP CN26C     YES!
      CPA B27       LOCATE FILE <P> OR SPACE <P> LINES
      JMP CN27C     YES 
* 
**************ILLEGAL CONTROL REQUEST*************  * 
* 
      JMP REJ1
* 
B1    OCT 1 
B14   OCT 14
B26   OCT 26
B27   OCT 27
B65   OCT 65
B55   OCT 55
B160  OCT 160 
B66   OCT 66
B103  OCT 103 
* 
******BACKSPACE 1 OR 2 RECORDS******
* 
BSR1  NOP           BACKSPACE 1 
      LDB B61       GET ASCII <1> 
      LDA BSR1
      JMP OVER1 
BSR2  NOP           BACKSPACE 2 
      LDA BSR2
      LDB B62       GET ASCII <2> 
OVER1 STA EQT8,I    STORE RETURN ADD. 
      STB EQT9,I    SAVE 1 OR 2 
      LDA B55       SEND ASCII (-)
      JSB OUT4
      LDA EQT9,I    RETREIVE BS NUMBER
      JSB OUT1
      LDA B160      SEND <SMALL "P">
      JSB OUT1
      LDA B70       SEND <ASCII 8>
      JMP OUT5
* 
*********WRITE EOF************* 
* 
CN1C  LDA B65       WRITE END OF FILE 
      JSB OUT4      OUTPUT  <ASCII 5> 
      JMP OUT3
* 
***********FORWARD SPACE RECORD************** 
* 
FSR1  NOP 
      LDA FSR1      SAVE RETURN ADD.
      RSS 
CN3C  CLA 
      STA EQT8,I
      LDA B3        SET CONTROL REQUEST 
      STA TEMP4     BECAUSE MAY GET HERE FROM READ 0
      ADA B300      SET FOR FORWARD RECORD
      IOR EQT6,I    ALSO SET IN CONWD BECAUSE WILL EXIT 
      STA EQT6,I
      LDA B160
      JSB OUT4
CN3C1 LDA B61       OUTPUT <SMALL "P" AND ASCII 1>
      JMP OUT5
**********REWIND*************** 
CN4C  JSB CTPRP 
      LDA B60       REWIND
      JMP OUT5
* 
**********DYNAMIC STATUS***************** 
CN6C  EQU * 
      CLB,INB 
      JSB I05W1     GO SET EQT'S
      SZA,RSS       IS IT ZERO WD COUNT?
      JMP REJ1      YES , IGNORE REQUEST
      JSB CTUST     GET CTU STATUS
      STA B 
      LDA TEM11     GET DEVICE TYPE (OCTAL) 
      RAL 
      AND EQT27,I   TEST EOF FLAG FOR DEVICE
      SZA 
      ADB B200      EOF FLAG IS SET. SET IN IBUF
      LDA EQT7,I    GET ADDRESS 
      SWP           (R01) SET UP... 
      JSB MAPWR     (R01) ...FOR CROSS MAP STORE
      ISZ EQT9,I    BUMP FOR TRANSMIT LOG 
      CLA           SET FOR GOOD RETURN 
      STA EQT29,I 
      JMP EOOP3 
* 
* 
*********LEADER AND TOP OF FORM********** 
* FOR THIS REQUEST DRIVER WRITES A EOF  * 
* IF IT DID NOT JUST DO SO,OR TAPE IS   * 
* NOT AT LOAD  POINT                    * 
***************************************** 
* 
CN10C JSB CTUST     GET STATUS
      AND B300
      SZA,RSS       DID WE JUST WRITE A EOF OR AT LP? 
      JMP CN1C      NO! GO WRITE IT 
      JMP EOOP4     YES,DO NOT WRITE TWO IN A ROW 
* 
**********FORWARD SPACE 1 FILE ************ 
* 
CN13C LDA B62       OUTPUT <ASCII 2>
      JSB OUT4
      JMP OUT3
* 
************BACKSPACE 1 FILE *************
* 
BSF1  NOP 
      LDA BSF1
      STA EQT8,I
      LDA B55       OUTPUT <ASCII ->
      JSB OUT4
      LDA B61       OUTPUT <ASCII "1">
      JSB OUT1
      LDA B160      OUTPUT <SMALL "P">
      JSB OUT1
      LDA B62       OUTPUT <ASCII 2>
      JMP OUT5
* 
********WRITE END OF VALID DATA (EOV) 
* 
CN26C LDA B66       OUTPUT <ASCII 6>
      JSB OUT4
      JMP OUT3
* 
*******LOCATE ABSOLUTE FILE (CTU)*********
*****************OR***********************
*******SPACE LINES (PRINTER)**************
* 
CN28C LDA EQT10,I   GET CONTROL REQUEST 
      CPA B11       IS IT T.0.F. OR SPACE LINES?
      RSS 
      JMP REJ1      ONLY LEGAL CONTROL TO PRINTER IS 11B
CN27C JSB CTPRP     PREP. TERM. FOR CTU REQUEST 
      LDA EQT7,I    GET FILE NO.
      SZA,RSS       IF ZERO CHANGE TO 1 
      INA 
      JSB BINAS     CONVERT TO ASCII AND SEND 
      LDA B160      OUTPUT <SMALL"P"> 
      JSB OUT1
      LDB TEM10     GET DEVICE TYPE 
      CPB B64       IS IT LP? 
      RSS           YES A LP
      JMP CN27D 
      LDB EQT7,I    GET OPTIONAL PARAM. IF (-) THEN T.O.F.
      SSB,RSS       IF (+) THEN SPACE (EQT7) LINES. 
      JMP CN3C1     GO OUTPUT <ASCII 1> 
CN27D LDA B62       OUTPUT <ASCII 2>
* 
OUT5  JSB OUT1
OUT3  LDA B103      OUTPUT <CAP. "C"> 
      JSB OUT1
      JMP I25W5     GO WAIT FOR REQUEST COMPLETION
OUT4  NOP 
      LDB OUT4      SAVE RETURN ADDRESS 
      STB EQT29,I 
      JSB CTPRP 
      JSB OUT1
      LDA EQT29,I 
      JMP A,I 
* 
*********BACKSPACE FILE AND RECORD********
* 
* BACKSPACE   FILE AND RECORD REQUIRES SPECIAL PROCESSING * 
* TO POSITION AND SET STATUS AS A MAG. TAPE UNIT. THIS    * 
* SPECIAL PROCESSING ENABLES THE USE OF EXISTING MTU      * 
* SUBROUTINES. IF THE TAPE IS POSITIONED AFTER AN EOF THEN* 
* IT WILL MOVE BEFORE THE EOF AND A FLAG SET IN EQT27     * 
* (BIT3/BIT2  =RIGHT CTU/LEFT CTU) WHICH IS EXAMINED BY   * 
* A DYNAMIC STATUS REQUEST. THESE SPECIAL EOF FLAGS ARE   * 
* NECESSARY BECAUSE THE 264X DOES NOT RETURN EOF STATUS   * 
* BEFORE THE EOF MARK.                                    * 
* 
*********************************************************** 
* 
* 
* 
CN50C LDA EQT27,I   SET CN50C ENTRY FLAG
      IOR B10       BIT3
      STA EQT27,I 
      LDB RSS       SET CN50C FLAG
      STB EOOP7 
      JSB BSR1      ISSUE BACKSPACE 1 RECORD
      JSB CTUST     GET STATUS
      STA TEM8
      AND B103      CHECK FOR L.P.
      SZA 
      JMP EOOPB     WE ARE THERE
      LDA TEM8      NOT AT L.P. 
      AND B200      IF WE ARE AFTER EOF THE BIT 7 SET 
      SZA,RSS 
      JMP CN54C     TAPE NOT AFTER EOF
CN55C JSB BSR2      ISSUE BACKSPACE 2 RECORDS 
      JSB CTUST     IF AT EOF AGAIN WE ARE AFTER ANOTHER EOF
      STA TEM8
      AND B103      CHECK FOR L.P.
      SZA 
      JMP EOOPB 
      LDA TEM8
      AND B200      AND HENCE NO FORWARD SPACE
      SZA           DO NOT SET EQT27 EOF FLAG IF
      JMP EOOPB     BETWEEN EOF'S 
      JSB FSR1      FORWARD ONE TO GET US BEFORE EOF
* 
* 
      LDA TEM11     GET DEVICE TYPE 
      RAL           FOR SETTING EOF FLAG IN EQT27 
      IOR EQT27,I   BIT1/BIT2=EOF LCTU/EOF RCTU 
      AND BN55   REMOVE CN50C FLAG
      STA EQT27,I   RESTORE IT
      JSB CTUST     GET STATUS
      IOR B200    ADD EOF BIT 
      STA TEM8
      JMP EOOPA 
* 
* 
CN54C LDA EQT10,I   TAPE NOT AFTER EOF
      CPA B2        IS THIS A BS RECORD?
      JMP EOOPB     YES 
      JSB FSR1      GET TAPE TO ORIGINAL POSITION 
      JSB BSF1      BS FILE TO GET US AFTER EOF 
      JMP CN55C     NOW POSITION BEFORE EOF 
      XIF 
* 
RECIV NOP 
      LDA BIT15     SET CARD UP FOR RECEIVE,CHAR. 
      IOR EQT31,I    UPDATE 
      STA EQT31,I    FOR NEXT IO OPERATION
      JMP RECIV,I 
****************************************************
* SUBROUTINE <CHRIN> CHECHS  CHARACTER FROM IO CARD*
* AND PLACES IT IN A REG.                          *
* SPECIAL CHARCTER STATUS IS ALSO DETERMINED       *
* TEMP8=DATA                                       *
* TEMP14= SPECIAL CHARACTER READ                   *
* 
****************************************************
* 
CHRIN NOP 
      LDA CHRIN 
      STA EQT37,I 
      CLA           CLEAR 
      STA TEM14     SPEC. CHAR. STATUS
      LDA ASAVE     GET REC WORD
      AND B377      ISOLATE DATA CHAR.(0-7) 
      STA EQT33,I   STORE IT
      LDB FILL      IS THIS BINARY? 
      SZB,RSS 
      JMP CHSPJ     YES,SKIP CHECKS 
      AND B177      ASCII DATA
      STA EQT33,I   WITHOUT PARITY BIT
      LDB EQT27,I   GET STATE WORD
      BLF           LOOK AT SPECIAL CHAR. BITS
      SLB,RSS       LOOK FOR CR?
      JMP *+3       NO LOOK NEXT
      CPA CR        YES, LOOK 
      JMP CHSPH     IS CR 
      SSB,RSS 
      JMP *+3       NO LOOK NEXT
      CPA RS        YES, LOOK 
      RSS           IS RS 
      JMP *+7 
      LDA EQT27,I   IS T BLOCK AND PAGE?
      AND BN13
      CPA BN13
      RSS           YES, DON'T LOOK FOR CR
      JSB OUT1      GET THE <CR>
      JMP CHSPH 
      RBL,RBL       LOOK FOR R.O. AND CNTL-D
      SLB,RSS       LOOK FOR RUBOUT?
      JMP *+3       NO, LOOK NEXT 
      CPA B177      IS IT R.O.? 
      JMP CHSPH     YES 
      SSB,RSS       LOOK FOR CNTL-D?
      JMP CHSPJ     NO,RETURN 
      CPA B4        IS IT CNTL-D? 
      JMP CHSPH     YES 
      JMP CHSPJ     NO,RETURN 
CHSPH LDA BN10      FOUND A SPECIAL CHAR. 
      STA TEM14     TURN ON SPEC. CHAR BIT
CHSPJ LDA EQT33,I 
      STA TEMP8     GET REC. CHAR 
      LDB EQT37,I 
      JMP B,I       THAT CAUSED THE INTERRUPT 
* 
* 
* 
*********************************************** 
* SUBROUTINE <DC1OT> TRIGGERS BLOCK TRANSFERS * 
* FROM THE CPU. THIS IS DONE BY SENDING A     * 
* DC1 <B21> TO TRIGGER THE TRANSFER AND       * 
* THEN SETTING UP  TO RECEIVE DATA.           * 
*********************************************** 
* 
DC1OT NOP 
      LDA DC1OT     SAVE RETURN ADDRESS 
      STA EQT32,I 
      JSB XMIT      SET UP FOR XMIT 
      LDA B21       TO INHIBIT TRANS. UNTIL READY 
      JSB OUT1      OUTPUT DC1
      JSB RECIV     SET RECIVE MODE 
      JSB OUT1      WAIT FOR REC CHAR.
      LDA EQT32,I   GET RETURN ADDRESS
      JMP A,I       RETURN
* 
B5    OCT 5 
BN55  OCT 177767
B10   OCT 10
B400  OCT 400 
* 
* 
BITCK NOP 
      LDA ASAVE     GET CONDITION BITS
      RAL,SLA 
      JMP BITCK,I   BIT 15
      ISZ BITCK 
      RAL,SLA 
      JMP BITCK,I   BIT 14
      ISZ BITCK 
      RAL,SLA 
      JMP BITCK,I   BIT 13
      ISZ BITCK 
      SSA 
      JMP BITCK,I   BIT 12
      ISZ BITCK     NONE
      JMP BITCK,I   RETURN
* 
* 
* 
* 
* 
******************************************************
* SUBROUTINE <CDSET> SETS UP THE SPECIAL CHARACTERS. *
* THE SPECIAL CHARACTER IS IN POSITION (THE A REG.)  *
* <BIT 6-12>. <BIT 14> 1/0  IS ADD/DELETE            *
* SPECIAL CHARACTER.                                 *
******************************************************
* 
CDSET NOP 
      STA B         SAVE IN B 
      RBL           PUT ADD/DELETE BIT IN 15
      ALF,ALF 
      RAL,RAL       PUT CHAR IN LOW ORDER 
      AND B177      FIND OUT WHICH CHAR 
      CPA CR        CARRAGE RET.? 
      LDA BIT12     YES 
      CPA RS        REC. SEP.?
      LDA BIT11     TES 
      CPA B177      RUBOUT? 
      LDA BIT10     YES 
      CPA B4        CNTL-D? 
      LDA BIT9
      SSB,RSS 
      CMA,RSS       NO
      JMP *+3       DELETE
      AND EQT27,I   ADD 
      RSS 
      IOR EQT27,I 
      STA EQT27,I   RESTORE STATUS
      JMP CDSET,I   RETURN
* 
ECHO  NOP           SET ECHO ON CARD PER A REG. 
      STA B         SAVE A
      LDA EQT31,I 
      AND CMB11 
      SZB,RSS       TURN ECHO ON OR OFF?
      IOR BIT11     OFF 
      STA EQT31,I   RESTORE 
      JMP ECHO,I
* 
*************************************************** 
* SUBROUTINE <CDINT> INITIALIZES SPEC. CHARS.     * 
* BELOW ARE THE INITIAL CONDITIONS FOR CONTROL:   * 
*                                                 * 
*         ALL USED SPECIAL CHARACTERS (EXCEPT     * 
*         RUBOUT) ARE CLEARD                      * 
*                                                 * 
*************************************************** 
* 
* 
CDINT NOP 
      LDA B1512     DISABLE CR
      JSB CDSET 
      LDA B3612     DISABLE RS
      JSB CDSET 
      LDA BN56      DISABLE RUBOUT
      JSB CDSET 
      LDA BN40      ENABLE CNTL-D 
      JSB CDSET 
      CLA 
      LDB TEM10     GET DEVICE TYPE 
      ADB TEMP4     AD####
      CPB B61       IS IT A CRT 
      IOR B20       YES! TURN ON  ECHO
      JSB ECHO      IT IS OFF FOR CTU AND LP
* 
      JMP CDINT,I   (4 THRU 36) 
B61   OCT 61
BIT15 OCT 100000
BIT13 OCT 20000     (R03) 
BIT14 OCT 040000
BIT12 OCT 010000
BIT11 OCT 004000
BIT10 OCT 002000
BIT9  OCT 001000
CMB14 OCT 137777
ESC   OCT 33
B136  OCT 136 
B.4   OCT 177774
B.7   DEC -7
D.10  DEC -10 
* 
********************************************* 
* SUBROUTINE <TERST> READS TERMINAL STATUS  * 
* AND SETS EQT27 FOR :                      * 
* CHARACTER\BLOCK 0\1          (BIT15)      * 
* LINE STRAP\PAGE STRAP   0\1  (BIT14)      * 
********************************************* 
* 
TERST NOP 
      CLA 
      JSB ECHO      TURN ECHO OFF 
      JSB SPCH1 
      JSB XMIT      SET XMIT MODE 
      LDA ESC       OUTPUT ESCAPE 
      JSB OUT1
      LDA B136      OUTPUT CARROT. THESE TWO CHARACTERS 
      JSB OUT1      PREP. TERM. FOR STATUS
* 
      JSB DC1OT     GO TRIGGER STATUS TRANSMISSION WITH DC1 
* 
      LDA D.10      SET TO GET 10 BYTES 
      STA EQT30,I   SAVE COUNT
      RSS 
TERS1 JSB OUT1      WAIT FOR CHAR.
      JSB CHRIN     GO GET CHAR..IT IS NECESARY TO READ 
      LDB EQT30,I   IS THIS THE 
      CPB B.7       ONE ? 
      JMP TERS0     YES 
      CPB B.5 
      RSS 
      JMP TERS2 
      AND B2
      RAR,RAR 
      STA B 
      LDA EQT27,I 
      RAL,CLE,ERA   CLEAR CHAR/BLOCK
      IOR B         UPDATE
      STA EQT27,I 
      JMP TERS2 
TERS0 AND B10       YES LOOK FOR LINE PAGE
      ALF,ALF 
      ALF,RAR       MOVE TO POS 15  . (LINE\PAGE =0\1)
      STA B         SAVE
      LDA EQT27,I   GET STATUS
      AND CMB14     CLEAR L/P BIT (14)
      IOR B         UPDATE
      STA EQT27,I 
TERS2 LDA TEM14   IS IT A SPECIAL CHAR. ? 
      SZA 
      JMP *+3       YES THE MUST BE A 2640X 
      ISZ EQT30,I   BUMP COUNT
      JMP TERS1     LOOK FOR NEXT 
      LDA B20       ALL FINISHED
      JSB ECHO      SET ECHO
      CLA 
      STA EQT30,I         CLEAR BIN COUNT 
      JMP TERST,I 
* 
************************************************* 
* SUBROUTINE <ENAK> OUTPUTS AN ENK TO TERMINAL  * 
* AND WAITS FOR AN ACK.                         * 
************************************************* 
* 
ENAK  NOP 
      LDA ENAK
      STA EQT33,I   SAVE RETURN ADDRESS 
      JSB XMIT      SET UP FOR TRANSMIT 
      LDA B5        OUTPUT ENK TO TERMINAL
      JSB OUT1      WAIT FOR XMIT INTERRUPT 
      JSB RECIV     SET START READ-SHEC.CONDITION 
      JSB OUT1      GO SET START READ 
* 
      LDA EQT33,I   GET RETURN ADDRESS
      JMP A,I       RETURN
* 
      IFZ 
* 
************************************************
* SUBROUTINE <CTUST> READS THE CTU STATUS      *
*                                              *
*SET  BIT0--UNIT BUSY OR CARTRIDGE NOT INSERTED*
*     BIT1--END OF VALID DATA                  *
*     BIT2--CARTRIDGE NOT WRITE ENABLED        *
*-------------- 
*     BIT3--LAST COMMAND  ABORTED              *
*     BIT4--READ\WRITE ERROR                   *
*     BIT5--END OF TAPE                        *
* ----------- 
*     BIT6--LOAD POINT                         *
*     BIT7--END OF FILE                        *
*                                              *
*  THE CTU STATUS COMES IN THREE BYTES         *
* 
*     BYTE
*     1             EOF - LP - EOT - WR. ERR(2645)
*     2             CMD.AB.- W.P. - RD.ERR. -BUSY(2645) 
*     3             RD.ERR. - RD.ERR.(HARD) - EOD -C.I. 
************************************************
* 
CTUST NOP 
      LDA CTUST     SAVE RETURN ADDRESS 
      STA EQT34,I 
* 
      CLA           TURN OFF
      JSB ECHO      ECHO FOR STATUS READ
* 
      JSB CTPRP     GO PREP. TERMINAL FOR CTU TRANSFER
      LDA B136      OUTPUT <^>
      JSB OUT1
      JSB DC1OT     TRIGGER TRANSFER WITH DC1 
* 
      LDB B.5       INITIALIZE STATUS COUNT 
      STB EQT30,I 
      RSS 
* 
* 
CTUS1 JSB OUT1
      JSB CHRIN     GET CHARACTER 
      ISZ EQT30,I     ARE THESE STATUS BYTES? 
      JMP CTUS1     NO! GO GET NEXT CHAR. 
      AND B17 
      ALF 
      STA EQT30,I 
      JSB OUT1
      JSB CHRIN     GET STATUS BYTE NO. 2 
      AND B15      ISOLATE BITS 0,2,3 
      IOR EQT30,I     "OR" BYTE 1 WITH BYTE 2 
      STA EQT30,I   STORE IT TEMPORARILY
      JSB OUT1
      JSB CHRIN     GET BYTE 3
      AND B4        CHECK FOR READ ERROR
      RAL,RAL       MOVE TO BIT 4 
      IOR EQT30,I 
      STA B 
      LDA TEMP8     GET BYTE 3
      AND B3        ISOLATE FIRST TWO BITS (WEN AND EOV)
      XOR B1         COMPL. C.I.
      IOR B         OR WITH BYTES 1 AND2
      XOR B10       COMPLEMENT BIT  3 
      AND B377      ISOLATE STATUS BITS 
      STA EQT30,I   SAVE STATUS 
      JSB OUT1      FOR THE LAST CHAR 
      LDA EQT30,I   GET STATUS
      CLB           CLEAR 
      STB EQT30,I   RECORD COUNT
* 
      LDB EQT34,I   SAVE RETURN ADDRESS 
      JMP B,I 
* 
CTPRP NOP           THIS SUBROUTINE PREPARES TERMINAL TO ACCEPT 
      LDB CTPRP     SAVE RETURN ADDRESS 
      STB EQT35,I 
      STA EQT32,I   CTU CONTROL AND R\W REQUESTS
      JSB XMIT
      LDA EQT27,I   CHECK FOR KEYBOARD DISABLE BIT
      AND B20       (BIT4)
      SZA           IF SET ALREADY DISABLED 
      JMP OVER6 
      LDA ESC 
      JSB OUT1
      LDA B143      (SMALL "C") 
      JSB OUT1
      LDA B20 
      IOR EQT27,I   SET KEYBOARD DISABLE BIT
      STA EQT27,I 
OVER6 LDA ESC 
      JSB OUT1      OUTPUT <ESC>
      LDA B46 
      JSB OUT1      OUTPUT <&>
      LDA B160
      JSB OUT1      OUTPUT <SMALL "P">
      LDA TEM10     GET  DEVICE 
      JSB OUT1
      LDA B165
      LDB TEMP4     GET REQUEST TYPE
      CPB B3        IS IT CONTROL?
      JSB OUT1      YES, SEND <SMALL"U">
      LDA EQT32,I   RESTORE A REG 
      LDB EQT35,I   GET RETURN ADDRESS
      JMP B,I 
* 
* 
* 
* 
* 
************************************************
*SUBROUTIONE <BINAS> TAKES A NO. IN A REG.     *
* (<1000D) AND CONVERTS TO ASCII WITH MSB      *
* AT BUFF1 AND LSB AT BUFF3.                   *
*THE CHARACTERS ARE SENT MSB FIRST             *
************************************************
* 
BINAS NOP 
      LDB BINAS     SAVE RETURN ADDRESS 
      STB EQT32,I 
      SSA           IS NUMBER OK? (POSITIVE)
      JMP BINAS,I   NO! 
      LDB BN50      LOAD B WITH DEC -1000 
      ADB A         ADD NUMBER TO -1000 
      SSB,RSS       IS SIGN ZERO? 
      JMP BINAS,I   YES! EXIT FOR NUMBER >999 
      LDB ADDRT     GET BUFFER   ENDING ADDRESS 
      ADB B2        ADD 2 
      STB TEMP1     STORE IT AT TEMP1 
BINA1 CLB 
      DIV LF        DIVIDE NO. IN A REG. BY 10
      ADB B60       CONVERT TO ASCII
      STB TEMP1,I   STORE IT. 
      LDB TEMP1     GET NEXT ADDRESS
      ADB B.1       DECREMENT IT
      STB TEMP1     RESTORE IT
      SZA           IS THE A REG.(QUOTIENT) =0 ?
      JMP BINA1     NO! GO DIVIDE A REG. AGAIN
      LDA ADDRT     YES! IT IS ZERO 
      ADA B.1 
      CPA TEMP1     ARE WE FINISHED?
      JMP BINA2     YES!NOW GO OUPUT CHAR.
      CLA           NO,GO FILL REMAINING PLACES WITH
      JMP BINA1     ASCII <0> 
BINA2 LDB ADDRT     GET MSD IN B REG. 
      STB EQT29,I   STORE IT FOR LATER USE
      LDA B.3       SETUP COUNTER 
      STA EQT30,I 
I25W8 LDA B,I       GET ASCII CHAR. IN A REG. 
      JSB OUT1      GO SEND IT! 
      ISZ EQT29,I   INCREMENT ADDRESS POINTER 
      LDB EQT29,I   RESTORE IN B REG. FOR <I25W8> 
      ISZ EQT30,I   ISZ COUNT COUNTER 
      JMP I25W8     THERE ARE MORE,GO GET 'EM 
      LDA EQT32,I   GET RETURN ADDRESS
      JMP A,I 
* 
ADDRT DEF BUFF1 
BUFF1 BSS 3 
B46   OCT 46
B165  OCT 165 
B15   OCT 15
B30   OCT 30
B143  OCT 143 
* 
      XIF 
************************************************* 
* SUBROUTINE <OUT1>  IS GENERAL OUTPUT ROUTINE  * 
* TO TERMINAL. CHAR. IS IN A REG.               * 
************************************************* 
* 
OUT1  NOP           GENERAL PURPOSE CHARACTER OUTPUT ROUTINE
      LDB OUT1
      STB EQT36,I   SAVE RETURN ADDRESS 
      AND B377      CLEAR UPPER HALF
      STA B         SAVE A
      LDA EQT31,I         GET EQT31 
      AND BN15      SAVE UPPER
      IOR B         UPDATE
      STA EQT31,I   OLD DATA WORD 
      JSB EXIT1     EXIT AND OUTPUT CHARACTER 
      LDA EQT31,I 
      AND BIT11     KEEP ECHO 
      STA EQT31,I   CONDITION 
      LDA EQT36,I   GET RETURN ADDRESS
      JMP A,I 
* 
* 
XMIT  NOP           SET CARD UP FOR XMIT
      LDA EQT31,I 
      RAL,CLE,ERA   KNOCK OUT OLD READ. 
      IOR BIT14     TURN ON START WRITE BIT 
      STA EQT31,I    FOR NEXT WRITE 
      JMP XMIT,I
* 
* 
SPCH1 NOP           THIS SUBROUTINE SETS SPECIAL CHAR. INTERRUPTS 
      LDA BN12
      JSB CDSET     SET <CR> INTERRUPT
      LDA BN11
      JSB CDSET     SET  <RS> INTERRUPTS
      JMP SPCH1,I   RETURN
* 
* 
B.1   OCT 177777
B.5   OCT 177773
BN50  DEC -1000 
* 
* 
*********************************************** 
* <REJ2><REJ1>                               *
*********************************************** 
* 
* 
REJ3  LDA BIT13     (R03) NO-OP -> IGNORE INT 
      JMP REJ4      (R05) 
REJ2  CLA           ERROR RETURN
      CLB 
      ISZ RTN       TO PHYSICAL 
REJ1  EQU * 
      JMP RTN,I     DRIVER
* 
****************************************************
* <EXIT1> IS USED FOR CONTINUATION EXITS TO THE    *
* LOGICAL DRIVER, P+1 RETURNS.                     *
****************************************************
* 
EXIT1 NOP 
      LDB EXIT1     GET CALLING PROGRAMS ADDRESS+1
      STB EQT11,I   STORE AT EQT11,I FOR INTERRUPT
REJ4  STA TEM12     (R05) SAVE DATA/DIR.
      LDA TEM11     GET DEVICE TYPE 
      CPA B3
      CLA 
      LDB EQT14,I   GET SET TIMEOUT 
      SZA           IF NON CRT THEN SET 
      LDB TOUT      60 SEC.  TIME OUT 
      LDA TEM12     DATA DIR. 
      ISZ RTN       BUMP FOR CONTINUATION 
      JMP RTN,I     AND RETURN
* 
* 
********************************************************* 
* <EORP> DOES ASCII CTU AND DISPLAY WRITE EOR PROCESSING* 
********************************************************* 
* 
* 
EORP  NOP 
      LDA EORP      SAVE RETURN ADDRESS 
      STA EQT29,I 
      LDA CR        OUTPUT A  <CR>
      JSB OUT1
      LDA LF        OUTPUT A   <LF> 
      JSB OUT1
      LDA EQT29,I 
      JMP A,I 
* 
* 
********************************************
* <KEYBD> ENABLES KEYBOARD IF IT HAS BEEN  *
* LOCKED BY A CTU REQUEST                 * 
********************************************
* 
KEYBD NOP 
      LDA EQT27,I 
      AND B20       IS IT LOCKED (BIT 4) SET
      SZA,RSS 
      JMP KEYBD,I   NO! 
      JSB XMIT
      LDA ESC       UNLOCK KEYBOARD 
      JSB OUT1
      LDA B142
      JSB OUT1      SEND SMALL B
      JSB CDINT 
      LDA EQT27,I 
      AND BN3       REMOVE KEYBD LOCK BIT 
      STA EQT27,I 
      JMP KEYBD,I 
* 
EOOP7 NOP           IF CN50C FLAG IS SET(BIT3,EQT27)
      JMP EOOPC     THEN EOOP7 IS <RSS> 
      LDA EQT8,I    IT IS SET 
      JMP A,I 
* 
EOOP8 LDB TEMP1     THIS EXIT IS USED IF UNDERSCORE 
      CPB CMB5       IS ONLY CHAR.
      RSS 
* 
********************************************************* 
* <EOOP1> AND <EOOP2> ARE ENTRIES FOR COMPLETION (P+1)  * 
* EXITS. THE TERMINAL OR CTU STATUS IS TEMPORARLY PUT   * 
* IN TEMP5.                                             * 
********************************************************* 
* 
EOOP1 EQU * 
EOOP2 CLA 
      STA EQT29,I      SET A REG. EXIT
      JMP EOOP3 
* 
EOOPC LDB TEMP4     IF CONTROL ALWAYS GET STATUS
      IFZ 
      CPB B3
      RSS 
      SZA           IF GOOD WRITE DO NOT GET STATUS 
EOOP5 JSB CTUST      YES!,GO UPDATE CTU STATUS
EOOP6 STA TEM8
* 
EOOPB LDA BN55      REMOVE EOF FLAG IN EQT27
      LDB TEM11     BECAUSE TAPE HAS MOVED
      RBL 
      XOR B 
      LDB EQT27,I 
      AND B 
      STA EQT27,I 
      LDA TEM8
* 
******************************************************
* A READ TO END OF TAPE WILL GIVE BELOW STATUS       *
*     STATUS                                         *
*     0             GOOD READ                        *
*     40            END OF TAPE. GOOD RECORD READ    *
*     240           EOT+EOF. NO RECORD READ,         *
*                   SET FOR NR(A=1) EXIT             *
*     42            EOT+EOV                          *
*     52            EOT+EOV+ABORT                    *
*                                                    *
******************************************************
* 
* 
******************************************************
* A WRITE TO END OF TAPE WILL GIVE BELOW STATUS      *
*     STATUS                                         *
*     42            EOT+EOV GOOD RECORD WRITTEN      *
*     52            EOT+EOV+ABORT (NO RECORD WRITTEN)*
*                   SET ET(A=1) EXIT                 *
*                                                    *
******************************************************
* 
******************************************************
* READ TO EOV IN MIDDLE OF TAPE                      *
*     STATUS                                         *
*     200           EOF                              *
*     2             EOV                              *
*     12            EOV+ABORT                        *
*                   SET NOT READY EXIT               *
*                                                    *
******************************************************
* 
EOOPA AND B373      REMOVE WRITE PROTECT
      CPA B240      IF EOF+EOT THEN SET NR
      JMP OVER4 
      CPA B52       IF FAILURE ON WRITE 
      JMP OVER4     DUE TO EOT DO THIS(SAVE REQ.) 
      AND B30       CHECK FOR CMD ABORT 
      SZA           OR READ-WRITE ERROR 
      JMP OVER4     SET N.R.
      CLB 
      STB EQT29,I      SET A=0 FOR GOOD EXIT
      JMP EOOP3 
OVER4 CLB,INB       SET NR
      STB EQT29,I   SET A REG. EXIT 
      XIF 
*********************************************************** 
* <EOOP4> IS ENTRY FOR B=0 (TRANS. LOG =0) EXIT.          * 
*********************************************************** 
* 
EOOP4 CLA 
      STA EQT8,I    SET UP FOR B REG. =0 EXIT 
* 
**********************************************************
* <EOOP3> SETS 2640\2644  AND IO CARD FOR NEXT INTERRUPT *
* OR REQUEST,  AND SETS EITHER CTU OR CRT STATUS IN EQT5 *
* 
* IT ALSO SETS THE TRANSMISSION LOG IN B REG. (+CHAR. OR *
* + WORDS). IF EQT8 =0 (VIA EOOP4) THEN B=0.             *
**********************************************************
* 
EOOP3 EQU * 
      JSB KEYBD     ENABLE KEYBD IF LOCKED
      LDB EQT13,I   LOOK TO SEE IF
      ADB B6        FULL OR HALF DUPLEX 
      LDA B,I       WELL??
      SSA 
      JSB ENAK      FULL DUPLEX, HANDSHAKE BEFORE EXIT
      CLA,INA       SET ECHO ON 
      JSB ECHO      IF OFF
      CLA           INDICATE WE ARE TRYING
      STA EQT11,I     TO FINISH 
      LDB EQT9,I    GET 2X LAST CHAR. ADDRESS 
      CMB,INB       MAKE NEG. 
      ADB EQT7,I    SUBTRACT TWO TIMES STARTING ADD.
      ADB EQT7,I
      CMB,INB 
      LDA EQT8,I    IF WORDS THEN DIV. BY 2 
      SSA 
      JMP *+4       THESE ARE CHARACTERS
      SLB           IS LSB SET? 
      INB           YES! INCREMENT SO EVEN FOR DIVIDE 
      BRS           DIVIDE TO CONVERT TO WORDS
* 
      SZA,RSS       IF EQT8 IS 0 THEN CLEAR B REG.
      CLB 
      STB EQT6,I    SAVE XMIT LOG 
      LDA EQT13,I   EXTENT ADDRESS
      ADA B3        BUMP TO EQ19
      LDB EQT29,I   WHAT KIND OF END IS IT? 
      SZB           SKIP IF GOOD
      JMP RTN,I     BAD RETURN
      LDB A 
      LDA B,I 
      IOR B40       TURN ON BIT 5 
      STA B,I       IN EQ19 FOR GOOD END
      JMP RTN,I     RETURN
* 
* 
* 
BN3   OCT 100007
TOUT  DEC -600
B373  OCT 373 
B142  OCT 142 
B240  OCT 240 
B106  OCT 106 
B64   OCT 64
B300  OCT 300 
B3    OCT 3 
B6    OCT 6 
B13   OCT 13
D.11  DEC -11 
B2000 OCT 2000
B52   OCT 52
B77   OCT 77        (R05) 
BM40  OCT 177740    (R05) 
CMB11 OCT 173777
**********************************************************
*<SETIO> CONFIGURES IO INSTRUCTIONS TO SELECT CODE SET   *
* IN A REG.                                              *
**********************************************************
* 
SETIO NOP 
      LDA BSAVE     GET EQT ADDRESS 
      STA EQT1
      SSA 
      CMA,INA       MAKE POS. IF NEG. 
      ADA B3        BUMP TO EQT4
      STA EQT4
      INA 
      STA EQT5
      INA 
      STA EQT6
      INA 
      STA EQT7
      INA 
      STA EQT8
      INA 
      STA EQT9
      INA 
      STA EQT10 
      INA 
      STA EQT11 
      ADA B2
      STA EQT13 
      INA 
      STA EQT14 
      IFN 
      LDA B60       SET FOR CRT IF NO "Z" IN ASMB STATEMENT 
      STA TEM10 
      XIF 
* 
      IFZ 
      LDA EQT4,I    GET SUBCHANNEL TO IDENTIFY DEVICE 
      LSR 6          SC=0 IS CRT (TEM10=60) 
      AND B37       SC=1 IS L CTU )(TEM10=61) 
      STA TEM11 
      CPA B3        IS THIS UNIT 3? 
      CLA           YES 
      ADA B60       SC=2 IS R CTU (TEM10=62)
      STA TEM10     SC=4 IS PRINTER (TEM10=64)
      XIF 
      LDA EQT6,I    GET CONTROL WORD
      LDB TEM10     GET DEVICE
      CPB B64       IS IT LP? 
      CLA           YES! SET FOR ASCII
      RAR           BIT6 1\0 IS BIN\ASCII 
      AND B40       ISOLATE BIT 5 
      XOR B40       REMOVE BIT 5 IF BINARY
      STA FILL      SET FILL CHARACTER
      LDA EQT6,I    GET WORD AGAIN TO SET HONEST WORD 
      LSR 6 
      AND B37 
      STA RDTYP 
      LDA EQT6,I
      AND B2000     HONEST IS BIT 10 =1 
      STA TEMP2 
* 
      IFZ 
      LDA TEM10 
      CLB 
      CPA B60       SET SWITCH CRT/CTU = RSS/NOP
      LDB RSS 
      STB SWH1A 
      STB SWH1B 
      STB SWH1C 
      STB SWH1D 
* 
      XIF 
* 
****************************************************
* SETUP EXTENSIONS ON EQT                          *
*                                                  *
*     EQT NO.       USE                            *
*     1-8           STANDARD                       *
*     9             RUNNING CHAR. ADDRESS          *
*     10            LAST CHAR. ADDRESS             *
*     11            ADDRESS TO GO ON INTERRUPT     *
*     12            NO. OF EQT EXTENSIONS          *
*     13            EQT EXTENSION STARTING ADD.    *
*     14-15         STD                            *
*     16-26         USED BY THE PHYSICAL DRIVER    *
*     27            TERMINAL STRAPPING AND CTU INFO*
*                   BIT 15 IS 0\1 =CHAR.\BLOCK     *
*                   BIT 14 IS 0\1 =LINE\PAGE       *
*                   BIT 12 IS CR SEARCH            *
*                   BIT 11 IS RS SEARCH            *
*                   BIT 10 IS RUBOUT SEARCH        *
*                   BIT  9 IS CNTLD SEARCH         *
*                   BIT  4 IS KEYBOARD LOCKED      *
*                   BIT  3 IS CNC50 FLAG
*                   BIT  2 IS RCTU EOF FLAG 
*                   BIT  1 IS LCTU EOF FLAG 
*                   BIT  0 IS UNUSED               *
*     28            STORAGE FOR ICNWD              *
*     29            <TRAN1> RETURN ADDRESS         *
*                   AND A REG. EXIT 
*     30            BINARY RECORD LENTGH           *
*     31            <OUT1> RETURN ADD.             *
*     32            <DC1> AND <BINAS> RETURN ADDRES*
*     33            <ENAK> RETURN ADDRESS          *
*     34            <CTUST> RETURN ADDRESS         *
*     35            <CTPRP> RETURN ADDRESS         *
*     36            <OUT1> RETURN ADDRESS          *
*     37            <CHRIN> RETURN ADDRESS         *
* 
****************************************************
* 
* 
      LDA EQT4,I    GET STARTING ADDRESS OF EXT.
      AND B77       (R05) SELECT CODE 
      ADA BM40      (R05) MINUS 40 = PORT NUMBER
      MPY B13       THE ADDRESS IN
      ADA EQADR     TEMP STORAGE
      LDB D.11
      STB TEMP1     STORE NO. OF EXT. AT TEMP1
      LDB ADR27     GET ADD. OF EQT27 
      STA B,I       STORE S.A. OF EXT. IN IT
      INA 
      INB 
      ISZ TEMP1 
      JMP *-4 
* 
      CLB           IF CN50C FLAG IS SET THEN 
      LDA EQT27,I   STORE A <RSS> AT EOOP7
      AND B10 
      SZA 
      LDB RSS 
      STB EOOP7 
* 
      LDA EQT6,I    GET CONTROL WORD
      AND B3
      STA TEMP4     STORE REQUEST TYPE AT TEMP4 
      CPA B3        IS THIS CONTROL?
      JMP OVER7     YES 
      JMP OVER2     NO,READ OR WRITE
OVER7 LDA EQT6,I
      LSR 6         IF CONTROL TYPE 0 
      AND B37       THEN SPECIAL PROCESSING REQUIRED
      SZA,RSS       AT <OVER3>
      JMP OVER3 
* 
* 
OVER2 LDA EQT6,I
      RAL,CLE,SLA,ERA   CLR 15 IF SYS REQ 
      STA EQT6,I    NORMAL NON CNTL 0 REQ.
      STA EQT28,I   STORE CURRENT CONWD FOR SYS. INTERRUPT
      JMP SETIO,I 
* 
*                   SPECIAL "CONTROL 0" PROCESSING
* 
OVER3 LDA EQT6,I    IS THIS A SYSTEM REQ.?
      SSA,RSS 
      JMP REJ1      NO! 
* 
      LDA EQT28,I   GET OLD CONWD 
      STA EQT6,I    PUT IN CURRENT CONWD
      AND B2        IF WRITE MUST COMPLETE XFER 
      CPA B2        OR TERMINAL WILL HANG 
      JMP OVER9 
      LDA EQT9,I    NO MORE DATA IN USERS BUFFER! 
      STA EQT10,I   IT IS GONE!!! 
OVER9 LDA TEM11     IF NON CRT REQ. WE MUST COMPLETE
      SZA 
      JMP REJ1      CONTINUE NOT CRT REQ. 
* 
      JSB KEYBD     ENABLE KEYBOARD IF LOCKED 
      LDA EQT6,I
      RAR 
      SLA,RSS       IF WRITE OR CONT. THEN SEND NULL
      JMP REJ1      THIS IS A CRT READ
      CLA           SEND NULL TO ALLOW CHAR. OUT OF UART
      JSB OUT1
      JMP EOOP1 
ADR27 DEF EQT27 
EQT1  NOP 
EQT4  NOP 
EQT5  NOP 
EQT6  NOP 
EQT7  NOP 
EQT8  NOP 
EQT9  NOP 
EQT10 NOP 
EQT11 NOP 
EQT13 NOP 
EQT14 NOP 
EQT27 NOP 
EQT28 NOP 
EQT29 NOP 
EQT30 NOP 
EQT31 NOP 
EQT32 NOP 
EQT33 NOP 
EQT34 NOP 
EQT35 NOP 
EQT36 NOP 
EQT37 NOP 
* 
*     TEMPORARY STORAGE FOR EQT27 TO EQT35
* 
      SUP 
* 
* 
A     EQU 0         DEFINE A REG. 
B     EQU 1         DEFINE B REG. 
* 
* 
* 
* 
* 
*CONSTANT STORAGE <CONST> **********
FILL  NOP           BINARY ASCII(SPACE = 0\40)
TEMP1 NOP 
TEMP2 NOP           HONEST MODE =2000 (NOT =0)
TEMP4 NOP           REQUEST TYPE (1-3 
TEMP8 NOP           ASCII DATA WORD 
TEM8  NOP           TEMPORARY STATUS
TEM10 NOP           IN ASCIIYPE 
TEM11 NOP           DEVICE TYPE(IN BINARY)
TEM12 NOP 
TEM14 NOP           COMPLETE DATA WORD ON CARD
RDTYP NOP 
EQADR DEF EQTXX 
EQTXX BSS 176+176   (R05) 
      ORG * 
      END 
                                                        