ASMB,R,L,C,N        <HARDWIRED VERSION> 
      HED <DVT05> GLASS TELETYPE DRIVER 
      IFZ           ##
      NAM DVT05,0 12966-16003 1944 791105 (MODEM) 
      XIF           ##
      IFN           HARDWIRED VERSION 
      NAM DVT05,0 12966-16002 1944 791105 (HARDWIRED) 
      XIF 
* 
      ENT IT05,CT05 
      EXT $LIST,.SBT,.LBT,$OPSY 
      IFZ           ##
      EXT $UPIO 
      XIF           ##
* 
******************************************
*                                        *
*            NOTE:                       *
* MODEM VERSION FEATURES ARE ENABLED     *
* USING THE "Z" ASSEMBLY OPTION.         *
* SUCH ITEMS ARE FLAGGED BY ##.          *
* THE HARDWIRED VERSION IS A SUBSET OF   *
* THE MODEM VERSION, AND IS ASSEMBLED    *
* USING THE "N" ASSEMBLY OPTION.         *
******************************************
*     SOURCE: HP RTE DVT05 12966-18006 (HARDWIRED)
*     RELOC.: HP RTE DVT05 12966-16002 (HARDWIRED)
*     MINI-CARTRIDGE: 12966-13301 (HARDWIRED) 
* 
*   ##SOURCE: HP RTE DVT05 12966-18007 (MODEM)
*   ##RELOC.: HP RTE DVT05 12966-16003 (MODEM)
*   ##MINI-CARTRIDGE: 12966-13302 (MODEM) 
*     MANUAL: HP RTE DVT05 12966-94010 (BOTH VERSIONS)
*   ##SUPPLEMENT:  12966-94015 (MODEM)
*     PRODUCT: 12966A-A04 OR A05 (HARDWIRED)
*  ##      OR  12966A-A08 (MODEM) 
* 
*     PRMR:   B.B.,ARS
* 
* 
***************************************************************** 
* (C) COPYRIGHT HEWLETT-PACKARD COMPANY 1979. ALL RIGHTS        * 
* RESERVED. NO PART OF THIS PROGRAM MAY BE PHOTOCOPIED,         * 
* REPRODUCED OR TRANSLATED TO ANOTHER PROGRAM LANGUAGE WITHOUT  * 
* THE PRIOR WRITTEN CONSENT OF HEWLETT-PACKARD COMPANY.         * 
***************************************************************** 
      SKP 
*2.1    INPUT/OUTPUT INTERFACE
* 
*       DVT05 WILL COMMUNICATE
*       VIA THE 12966A BUFFERED ASYNCHRONOUS DATA COMMUNICATION 
*       INTERFACE CARD OVER A HARDWIRED LINE
*       OR A MODEM. ##
* 
*2.2    MAJOR FUNCTIONS 
* 
*       DVT05 PROVIDES THE FOLLOWING MAJOR FUNCTIONS: 
*    1. I/O CONTROL OF A CRT. 
*    2. READ OR WRITE REQUEST TO KEYBOARD AND DISPLAY.
*    3. CONSOLE OR TERMINAL USE.
*2.2.1 CRT CONTROL REQUEST
* 
*ICNWD
*    01-SET OPERATIONAL MODE, TIMEOUT HANDLING, AND 
*       LINE TERMINATION MODE.
* 
*       BIT(S)   FUNCTION 
*        15      1 = DO NOT DOWN DEVICE ON TIMEOUT
*                0 = LET SYSTEM PROCESS TIMEOUT 
*        14      1 = ISSUE A <DC1> PROMPT AT THE BEGINNING
*                    OF EACH READ OPERATION.
*                0 = PERFORM A NORMAL READ. 
*        13-9    <CR> DELAY IN STALL CHARACTERS (0 TO 31).
*        8-4     <LF> DELAY IN STALL CHARACTERS (0 TO 31).
*        3-0     NOT USED.
* 
*    11-SPACE "IPRM" LINES    (IPRM=1 TO 255) 
*    20-ENABLE TERMINAL.  ALLOWS TERMINAL TO SCHEDULE PROGRAM WHEN KEY IS 
*       STRUCK. 
*    21-DISABLE TERMINAL.  INHIBIT SCHEDULING OF TERMINAL'S PROGRAM.
*    22-SET NEW TIME OUT  (IN OPTIONAL PARAMETER) 
*    23-CLEAR THE OUTPUT QUEUE (BUFFER FLUSH).
*       ALL BUFFERED REQUESTS IN THE QUEUE WILL 
*       BE IGNORED UNTIL EITHER A READ REQUEST
*       OR A CONTROL 24 REQUEST IS RECEIVED.
*    24-RESTORE OUTPUT PROCESSING.  REQUIRED ONLY IF SOME OF BUFFER IS
*       TO BE SAVED.
*    30-SET COMMUNICATION LINE PARAMETERS.
*       BITS     FUNCTION 
*       15-9     NOT USED.
*       8        1=MODEM ## 
*                0=HARDWIRED
*       7-6      NOT USED.
*       5        1=PARITY ON (GENERATES 7 BIT + PARITY CHAR. SIZE)
*                0=PARITY OFF (GENERATES 8 BIT CHAR. SIZE)
*       4        1=PARITY EVEN
*                0=PARITY ODD 
*       3210     BAUD RATE
*       0000 ==> EXTERNAL 
*       0001 ==>   50 
*       0010 ==>   75 
*       0011 ==>  110 
*       0100 ==>  134.5 
*       0101 ==>  150 
*       0110 ==>  300 
*       0111 ==>  600 
*       1000 ==>  900 
*       1001 ==> 1200 
*       1010 ==> 1800 
*       1011 ==> 2400 
*       1100 ==> 3600 
*       1101 ==> 4800 
*       1110 ==> 7200 
*       1111 ==> 9600 
* 
*      -ANY CONTROL REQUEST, VALID OR INVALID, WILL RESULT IN ENABLING
*       INTERRUPT ON A TERMINAL IF THE TERMINAL HAS BEEN ENABLED. 
      SKP 
*2.2.2  COMMUNICATION LINE CONTROL
* 
*ICNWD
*      0-CLEAR OPERATION. 
*     31-LINE OPEN/CLOSE (MODEM OPERATION ONLY). ## 
*        OPTIONAL PARAMETER NON-ZERO => LINE OPEN 
*        OPTIONAL PARAMETER = 0 => LINE CLOSE.
*        SETS MODEM CONTROL LINES FOR COMMUNICATION 
*        OVER A MODEM LINK, OR CAUSES THE TELEPHONE TO
*        DISCONNECT.
*     32-AUTO ANSWER (MODEM OPERATION ONLY). ## 
*        ALLOWS THE COMPUTER TO ANSWER INCOMING 
*        TELEPHONE CALLS, IF THE MODEM IS SO EQUIPPED.
* 
* 
*2.2.3  DATA OUT TO DISPLAY 
* 
*      -FUNCTION BIT DEFINITIONS
*       BIT  6 = 1    BINARY OUTPUT MODE
*       BIT 10 = 1    HONEST OUTPUT MODE
*                     IN THIS DRIVER, HONEST
*                     OR BINARY MODES ARE 
*                     IDENTICAL.
* 
*      -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.
*      -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 AUTOMATICALLY. 
*       ANYTHING IN THE BUFFER IN HONEST MODE IS SENT TO THE TERMINAL.
      SKP 
*2.2.4  DATA INPUT FROM KEYBOARD CHARACTER MODE 
* 
*      -FUNCTION BIT DEFINITIONS
*       BIT  6 = 0    ASCII INPUT MODE
*       BIT  6 = 1    BINARY INPUT MODE 
*       BIT  8 = 1    ECHO INPUT TO THE TERMINAL
*       BIT  8 = 0    NOTHING ECHOS TO THE TERMINAL.
*       BIT 10 = 1    HONEST INPUT MODE 
* 
*       IN CHARACTER MODE THE TERMINAL TRANSMITS A CHARACTER AT A TIME AS 
*       THE KEY IS DEPRESSED.  THE RECORD TERMINATION IS A CR.  THE 
*       DRIVER ECHOS A <CR>,<LF> IF ECHO IS ENABLED, OTHERWISE NO 
*       TERMINATION CHARACTER IS ECHOED.
*       A RECORD TERMINATOR MUST BE ENTERED TO COMPLETE REQUEST, EVEN IF THE
*       USERS BUFFER IS FULL.  TRANSMISSION LOG IS RETURNED IN B REG. 
*       THERE ARE THREE TYPES OF CHARACTER MODE PROCESSING:  HONEST,
*       ASCII NON-HONEST, AND BINARY. 
*    A. HONEST ASCII, AND/OR BINARY 
*       ALL CHARACTERS ARE SENT TO USERS BUFFER. IF AN ODD NUMBER OF
*       BYTES IS REQUESTED, THE LAST BYTE IN THE WORD IS STUFFED WITH 
*       A SPACE (40B) IF ASCII, OR A NULL IF BINARY. THIS MAY RESULT IN 
*       WRITING ONE BYTE PAST THE END OF THE REQUESTED BUFFER.
*    B. NON-HONEST ASCII
*       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 4
*       ENTERING CONTROL D WILL CAUSE BIT 5 TO BE SET IN TERMINAL 
*       STATUS WORD AND TRANSMISSION TERMINATED WITH B REG. = 0.  THIS
*       BIT WILL BE CLEARED UPON NEXT ENTRY.
*      *CARRIAGE RETURN ASCII 15
*       ENTERING A <CR> TERMINATES THE LINE, AND CAUSES A <CR,LF> 
*       TO BE ECHOED TO THE TERMINAL IF THE ECHO BIT IS SET.
      SKP 
*2.2.5  CRT STATUS REQUEST  (RETURNED IN EQT5)
* 
*  BIT
*    1 -TERMINAL ENABLED.  IF THE STATUS WORD IS FOR A TERMINAL (NOT A
*       SYSTEM CONSOLE) TYPING ANY KEY WILL SCHEDULE THE TERMINAL'S 
*       PROGRAM (IF IT HAS ONE).
*    2 -TIME OUT.  THE LAST OPERATION RESULTED IN A TIME OUT.  THE
*       DEVICE IS SET DOWN IF EQT18 BIT 15 IS ZERO. 
*    3 -PARITY ERROR.  A PARITY ERROR WAS ENCOUNTERED ON THE LAST READ, 
*       SO THE OPERATION WAS RETRIED. (A PARITY ERROR IS TREATED LIKE 
*       A RUBOUT.)
*    4 -MODEM LINE ERROR. ##  INDICATES THAT THE LINE IS
*       CURRENTLY DOWN. 
*    5 -CONTROL D ENTERED.  THE USER HAS HIT THIS KEY.
*    6 -BREAK KEY HIT.  THE DRIVER SCHEDULES THE TERMINAL 
*       PROGRAM OR SETS OPERATOR ATTENTION, AND COMPLETES 
*       IF THE BREAK KEY IS STRUCK
*       DURING AN OUTPUT OPERATION.  A BREAK DURING INPUT IS
*       TREATED AS A RUBOUT, AND WILL DELETE THE CURRENT INPUT
*       LINE IN ALL MODES.  IF ECHO IS ENABLED, A SLASH,(/),<CR><LF>
*       IS OUTPUT TO THE TERMINAL.
*       AN UNEXPECTED BREAK CAUSES ANY ENABLED TERMINAL PROGRAM 
*       TO BE SCHEDULED.
*    7 -BUFFER FLUSH IN PROGRESS
*       THIS IS SET BY A CONTROL 23 CALL, AND STAYS SET UNTIL 
*       A) A READ OPERATION IS ENCOUNTERED, 
*       B) A CONTROL 24 (BUFFER UNFLUSH) CALL IS ENCOUNTERED, OR
*       C) THE QUEUE IS EMPTY.
* 
* 
*2.2.6  CONSOLE OR TERMINAL USAGE.
* 
*       IF AT GENERATAION THE CRT 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.
*       STRIKING THE BREAK KEY DURING OUTPUT WILL DO THE SAME,
*       BUT WILL ALSO SET THE BREAK BIT IN EQT5.
*       A BREAK DURING INPUT WILL BE TREATED AS A RUBOUT. 
*       IF THE CRT IS A CONSOLE THEN STRIKING A KEY WILL GET THE SYSTEM'S 
*       ATTENTION AND A "*" PROMPT WILL BE WRITTEN. 
*2.2.7  GENERATION INTO THE SYSTEM. 
* 
*       THE EQT SETUP MUST BE AS FOLLOWS: 
*        SC,DVT05,X=6[,B][,T=XXXXX] 
*         WHERE SC IS THE SELECT CODE, XXXXX IS THE 
*         DESIRED TIME OUT VALUE [OPTIONAL], AND
*         B SPECIFIES BUFFERING [OPTIONAL]. 
      HED <IT05>
******************************************
* SUBROUTINE <IT05> IS ALWAYS ENTERED TO *
* INITIALIZE A SYSTEM OR USER REQUEST TO *
* ANY CRT SUBSYSTEM.                     *
******************************************
IT05  NOP 
      STA SCH       SAVE SELECT CODE
      CLB 
      STB INITF     SET IT05 CT05 POINTER 
      IFZ           ##
      STB EQT19,I   ## CLEAR $UPIO FLAG 
      XIF           ##
      LDA EQT5,I    GET EQT5
      AND NB620     CLEAR EOT,BRK,TO BITS 
      STA EQT5,I    PUT IT BACK 
      JSB SETIO     CONFIGURE IO
SFS01 SFS CARD      IF FLAG SET THEN POWER FAIL 
      JMP IT051     FLAG NOT SET
      JSB XMIT4 
      LDA CW6       CLR ALL CARD INTERRUPTS 
IT053 JSB OUT2      (0-377) 
      CPA LWRD6     IS THIS ALL?
      JMP IT051     YES! FINISHED 
      INA 
      JMP IT053     DO IT AGAIN 
IT051 EQU * 
      JSB CDINT     INITIALIZE CARD 
      LDA REQTP     GET REQUEST TYPE
      CPA B3
      JMP IT05C     THIS IS A CONTROL REQUEST.
      IFZ           ##
      JSB LINCK     ## CHECK THE MODEM LINES
      LDA REQTP     ## GET BACK THE REQUEST 
      XIF           ##
      SLA 
      JMP IT05R     THIS IS A READ REQUEST
      JMP IT05W     THIS IS A WRITE REQUEST 
      SKP 
****************************************************
*      TERMINAL STATUS                             *
*     BIT           STATUS                         *
*     1             TERMINAL ENABLED               *
*     2             TIME OUT                       *
*     3             PARITY ERROR                   *
*     4             LINE ERROR (MODEM) ##          *
*     5             "CONTROL D" ENTERED            *
*     6             BREAK FLAG SET                 *
*     7             BUFFER FLUSH ENABLED           *
****************************************************
* 
****************************************************
*      CRT CONTROL                                 *
*     EXEC CODE     CRT CONTROL REQUEST            *
*     01            SET DATA PARAMETERS            *
*                   OPTIONAL PARAMETER:            *
*          BIT(S)   FUNCTION                       *
*          15       1 = DO NOT SET DOWN ON TIMEOUT *
*                   0 = LET SYSTEM PROCESS TIMEOUT *
*          14       SEND A <DC1> TO THE TERMINAL   *
*                   AT THE START OF A READ         *
*                   (LINE OR PROMPT MODE).         *
*                   TO TRIGGER THE TERMINAL.       *
*          13-9     <CR> DELAY IN STALL CHARACTERS *
*                   (NUMBER OF NULLS TO OUTPUT     *
*                   AFTER A CARRIAGE RETURN.)      *
*          8-4      <LF> DELAY IN STALL CHARACTERS *
*                   (NUMBER OF NULLS TO OUTPUT     *
*                   AFTER A LINE FEED.)            *
*          3-0      NOT USED.                      *
*     11            SPACE LINES                    *
*     20            ENABLE TERMINAL                *
*     21            DISABLE TERMINAL               *
*     22            SET TIME OUT                   *
*     23            SET BUFFER FLUSH               *
*     24            REMOVE BUFFER FLUSH            *
*     30            SET UP LINE PARAMETERS         *
*           BIT(S)  FUNCTION                       *
*           15-9    NOT USED                       *
*           8       1=MODEM ##                     *
*                   0=HARD WIRED                   *
*           7-6     NOT USED                       *
*           5       1=PARITY ON (7 BIT CHAR. SIZE) *
*                   0=PARITY OFF (8 BIT CHAR. SIZE)*
*           4       1=PARITY EVEN                  *
*                   0=PARITY ODD                   *
*           3210    BAUD RATE                      *
*           0000    EXTERNAL                       *
*           0001      50                           *
*           0010      75                           *
*           0011     110                           *
*           0100     134.5                         *
*           0101     150                           *
*           0110     300                           *
*           0111     600                           *
*           1000     900                           *
*           1001    1200                           *
*           1010    1800                           *
*           1011    2400                           *
*           1100    3600                           *
*           1101    4800                           *
*           1110    7200                           *
*           1111    9600                           *
*     31            OPEN/CLOSE LINE (MODEM) ##     *
*                   OPTIONAL PARAMETER INDICATES   *
*                   OPEN IF NON-ZERO, CLOSE IF = 0.*
*     32            AUTO ANSWER (MODEM) ##         *
****************************************************
      HED <IT05C> 
****************************************************
* <IT05C> DOES CONTROL REQUEST PROCESSING FOR THE  *
* KEYBOARD/DISPLAY.                                *
****************************************************
IT05C LDA FUNCT     GET CONTROL WORD
      LDB EQT7,I    GET OPTIONAL PARAMETER
      CPA B1        CHECK OPTIONAL PARAMETER
      JMP CN01      SET UP FUNCTIONAL MODE
      CPA B11 
      JMP CN11      GO SPACE LINES
      CPA B20 
      JMP CN20      GO ENABLE TERMINAL
      CPA B21 
      JMP CN21      GO DISABLE TERMINAL 
      CPA B22 
      JMP CN22      GO SET TIME OUT 
      CPA B23 
      JMP CN23      GO SET BUFFER FLUSH 
      CPA B24 
      JMP CN24      GO REMOVE BUFFER FLUSH
      CPA B30 
      JMP CN30      GO SET LINE PARAMETERS
      IFZ ##
      CPA B31       MODEM LINE OPEN ##
      JMP CN31      RESERVED FOR MODEM ## 
      CPA B32       MODEM LINE OPEN - AUTO ANSWER ##
      JMP CN32      RESERVED FOR MODEM ## 
      XIF ##
      SZA           CHECK FOR CLEAR REQUEST 
      JMP REJ2      ILLEGAL CONTROL REQUEST 
* 
CN00  EQU *         PROCESS CLEAR REQUEST 
      JSB CLRCD     CLEAN OFF CARD
      LDA EQT20,I   GET LAST COMMAND
      RAR 
      SLA,RSS       IF WRITE OR CONTROL, SEND NULL
      JMP REJ2A     KEEP INTERRUPTS ON IF MODEM 
      CLB           SEND A NULL 
      JSB OUT1
      JMP EOOP1     TO ALLOW CHAR. OUT OF UART
* 
*  SET FUNCTIONAL MODE
* 
CN01  EQU * 
      STB EQT18,I   SAVE OPTIONAL PARAMETER 
      JMP REJ2      EXIT
* 
**SPACE LINES*****
**MAX NO. IS 255**
* 
CN11  EQU * 
      IFZ           ##
      JSB LINCK     ## THIS CONT. REQ. NEEDS LINCK
      XIF           ##
      LDA EQT7,I    GET OPTIONAL PARAMETER
      SSA           CHECK FOR NEG. VALUE
      CMA,INA       INVERT IF NEGATIVE
      AND B377      LIMIT TO < 256
      CMA,INA,SZA,RSS IF ZERO  USE 1
      CCA           SET TO -1 
      STA EQT7,I    PUT IT BACK 
CN11L JSB EORP      OUTPUT (CR,LF)
      ISZ EQT7,I
      JMP CN11L 
      CLA 
      STA EQT19,I   SET A REG. EXIT 
      JMP EOOP4 
* 
**GO ENABLE TERMINAL(BIT 1 OF EQT5)** 
* 
CN20  LDA EQT17,I   IF -1 THEN NO PROG. TO SCHED. 
      INA,SZA       OR "0" INTO EQT5 IF NO PROG.
      LDA B2        SET BIT 1 (TERM. ENABLED) 
IOR5  IOR EQT5,I    CONSTRUCT NEW STATUS WORD 
ST5   STA EQT5,I    RESTORE EQT5
      JMP REJ2      GO EXIT A=2 
      SKP 
* 
**GO DISABLE TERMINAL** 
* 
CN21  LDA B.3 
AND5  AND EQT5,I    REMOVE BIT 1
      JMP ST5 
* 
**GO SET NEW TIME OUT** 
* 
CN22  EQU *         T.O. VALUE IN B 
      SSB,RSS       ONLY ZERO AND POSITIVE LEGAL
      CMB,INB       NEGATE IT 
      STB EQT14,I   STORE NEW TIME OUT. 
      JMP REJ2
* 
**GO SET BUFFER FLUSH   (BIT  7 OF EQT5)**
* 
CN23  LDA B200      SET BIT7  IN EQT5 
      JMP IOR5
* 
**GO REMOVE BUFFER FLUSH**
* 
CN24  LDA NBIT7     REMOVE BIT 7
      JMP AND5
* 
**GO SET LINE PARAMETERS**
* 
CN30  BLF,BLS       SHIFT LEFT 5 BITS 
      LDA EQT21,I   GET OLD INFO. 
      AND BN67      CLEAR PART OF IT
      IOR B         PUT IN THE NEW
      STA EQT21,I   SAVE IT 
      JMP REJ2      EXIT
* 
**PERFORM OPEN LINE FUNCTION (MODEM) ## **
      IFZ ##
* 
CN31  EQU * ##
      SZB           CHECK FOR OPEN OR CLOSE ##
CN31C LDB B114K     LINE OPEN (114000) CA & CD ## 
      LDA EQT21,I   AND OPEN FLAG (SIGN BIT) ## 
      AND BN14K     CLEAR OUT BITS 11,12,15 ##
      IOR B         MAYBE PUT THEM BACK ##
      STA EQT21,I   ##
      SZB           ##
      LDB B32       SET LINE CONTROL REF. IN ## 
      STB EQT10,I   EQT10 ##
      JSB SETIO     FIX UP CW4 ## 
      JSB CDSET     SET UP CARD ##
CN31A LDB DM200     2 SECOND TIMEOUT ## 
      JSB EXIT0     EXIT WITH SPECIFIED TIMEOUT## 
* 
CN31B JSB CHRIN     GET MODEM LINE STATUS ##
      LDB EQT7,I    CHECK FOR LINE CLOSE ## 
      LDA BSTAT     GET BOARD STATUS ## 
      SZB,RSS       IF LINE CLOSE MASK CC FOR 202T MODEM ## 
      AND NBIT3     ##
      AND B32       IF OPEN LOOK FOR CB,CC,CF ##
      CPA EQT10,I   IF CLOSE, SHOULD BE ALL ZEROS ##
      CLA,RSS       EXIT ## 
      JMP CN31A     LINE STATUS INAPPROPRIATE - TRY AGAIN ##
      JMP CT05,I    LINE EXIT ##
* 
**PERFORM AUTO ANSWER FUNCTION (MODEM) ## **
* 
CN32  EQU *         AUTO ANSWER ##
      LDA CW2       SET CE REF. = 0 ##
      JSB OUT2      ##
      LDA ENCE      ENABLE CE INTERRUPT (RING) ## 
      JSB OUT2      ##
      STA EQT7,I    NON-ZERO FOR LINE OPEN ## 
      CLB           CLEAR TIME OUT ## 
      JSB EXIT0     WAIT FOR RING INTERRUPT ##
* 
      JMP CN31C     GO DO LINE OPEN ##
      XIF ##
      HED <IT05W> 
**********************************************
*         EQT6 FOR READ\WRITE                *
* EQT6 FOR READ\WRITE OPERATIONS IS:         *
*     BIT           MEANING                  *
*     6             0\1 IS ASCII\BINARY      *
*     8             0\1 IS OFF\ON ECHO       *
*     10            0\1 OFF\ON HONEST MODE   *
**********************************************
IT05W 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 ITW1      YES!
      CMA,INA       MAKE POS AGAIN
      RAL           MULTIPLY WORDS X 2 AND
ITW1  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 ITW31     YES! IT IS ZERO 
      JSB TRAN1     GO TO OUTPUT SUBROUTINE 
ITW30 JSB EXIT1     WAIT B.E. INTERRUPT 
      LDA BSTAT     CHECK FOR BUFFER EMPTY
      ALF,ALF 
      SSA,RSS 
      JMP ITW30     NOT BUFFER EMPTY - WAIT 
ITW31 LDA HONST     IS THIS HONEST MODE?
      SZA,RSS       NO - SKIP CRLF   1909 
      JSB EORP      THIS IS ASCII 
      JMP EOOP2     DONE WITH OUTPUT. 
      HED <IT05R><P.ERR><TIMER> 
*************************************************** 
* <IT05R> DOES KEYBOARD READ.                     * 
* THE DRIVER ASSUMES A CHARACTER TRANSFER IF      * 
* HONEST MODE IS SET.                             * 
*************************************************** 
IT05R CLB,INB 
      JSB I05W1     GO SETUP EQT9 AND EQT10 
      LDA FUNCT     CHECK IF ECHO SET 
      JSB ECHO      SET/CLR = 20/0 ECHO 
      LDB HONST     SEE IF HONEST MODE
      SZB 
      JMP IT05H     SET UP FOR HONEST MODE
      LDB BN1       SET RUBOUT INTERRUPT & XMIT 
      JSB CDSET     SETS UP BOARD TO ACCEPT SPEC. CHAR. 
      LDA C6404     60404 CNTL-D INTERRUPT
      JSB OUT2
      LDA C6410     60410 BACKSPACE INTERRUPT 
      JSB OUT2
      LDA C6415     60415 CR INTERRUPT
      JSB OUT2
IT05H LDA EQT18,I   CHECK EQT18 
      RAL           FOR BIT 14 SET
      SSA,RSS       IF SO, SEND <DC1> 
      JMP IT05I     NOT NEEDED
      LDA B21       <DC1> 
      JSB OUT2      SEND IT 
      LDA N64 
      JSB TIMER     WAIT AT LEAST 150 USEC. 
      LDB B4        FOR CHAR. TO CLEAR UART 
      ADB HONST 
RSS   RSS 
IT05I LDB HONST     GET HONEST FLAG 
      JSB CDSET     SET CARD FOR RECEIVE (BIT 0=1 FOR HONEST) 
      JMP C05R8 
* 
P.ERR NOP           PROCESS PARITY ERRORS 
      LDA EQT5,I
      IOR B10       SET PARITY ERROR BIT 3
      STA EQT5,I
      JMP P.ERR,I   RETURN
* 
* 
TIMER NOP           2.5 USEC TIMER (XE) PER LOOP
      SSA,INA,RSS 
      JMP TIMER,I 
      JMP *-2 
* 
      HED <CT05>
******************************************************************
* SUBROUTINE <CT05> INITIALIZES THE COMPLETION SECTION           *
* FOR ALL COMPLETION INTERRUPTS.                                 *
******************************************************************
CT05  NOP 
      STA SCH       SAVE SC 
      LDB RSS       SET CONT. FLAG
      STB INITF     TO RSS
      JSB SETIO     CONFIGURE IO
      IFZ           ##
      LDA EQT19,I   ## CHECK FOR $UPIO ENTRY
      SSA           ## SET NEGATIVE BY LINCK - TRY AGAIN
      JMP $UPIO     ##
      XIF           ##
      JSB CDSTT     GET CARD STATUS 
      AND B40       CHECK FOR BUFFER OVERFLOW 
      SZA,RSS       HAS IT OVER FLOWED? 
      JMP CT5A2     NO
      IFZ           ##
SWH01 NOP           ## NOP/RSS HARD/MODEM 
      XIF           ##
      JMP EOOP9     YES,ERROR EXIT (B=3,XMISSON ERROR)
CT5A2 LDA BSTAT     GET BOARD STATUS BACK 
      AND B100      MASK FOR BREAK
      SZA,RSS 
      JMP CT5A0 
      IOR EQT5,I    PUT IT INTO EQT5
      STA EQT5,I
CT5A0 LDA CW577     CLEAR ALL INTERRUPTS
      JSB OUT2
      LDB EQT1,I    GET QUE WORD
      SZB           IS A REQUEST IN PROCESS?
      JMP CT5A1     YES!
      JSB SCHED     NO REQUEST IN PROCESS.FIND OUT
      JMP EXIT5     WHAT HAPPENED AND EXIT
CT5A1 EQU * 
      LDA EQT4,I
      AND B4000     CHECK FOR TIME OUT ENTRY
      SZA           IS THIS TIME OUT (BIT 11)?
      JMP TIMOT     YES!
      LDB EQT11,I   GET INTERRUPT ADDRESS 
      JMP B,I       GOTO IT 
      HED CONSTANTS AND VARIABLES 
***************************************************** 
* "B.X" IS NEG. BINARY NO., "D.X" IS NEG. DECIMAL NO* 
* "BN" IS SOME BINARY NO.                           * 
* SEE BELOW.                                        * 
***************************************************** 
* 
NB620 OCT 177602
LWRD6 OCT 60377     LAST SPECIAL CHARACTER CODE 
B11   OCT 11
CW6   OCT 60000 
B20   OCT 20
B21   OCT 21
B22   OCT 22
B23   OCT 23
B24   OCT 24
B30   OCT 30
      IFZ           ##
B31   OCT 31        ##
B32   OCT 32        ##
DM200 DEC -200      ##
ENCE  OCT 10004     ##
B114K OCT 114000    ##
BN14K OCT 63777     ##
NBIT3 OCT 177767    ##
CW2   OCT 20000     ##
      XIF           ##
BN67  OCT 54037     RETAIN BITS 14,12,11,4-0
B1    OCT 1 
B2    OCT 2 
B.3   OCT 177775
B100  OCT 100 
B200  OCT 200 
NBIT7 OCT 177577
C6404 OCT 60404     CONTROL-D INTERRUPT SET 
C6410 OCT 60410     BACKSPACE INTERRUPT SET 
C6415 OCT 60415     CR INTERRUPT SET
B377  OCT 377 
BN1   OCT 57712 
B40   OCT 40
B10   OCT 10
BN6   OCT 120004
CW604 OCT 60004 
CW610 OCT 60010 
CW615 OCT 60015 
CW677 OCT 60177 
N64   DEC -64 
B3    OCT 3 
B4000 OCT 4000
FUNCT NOP           CONTROL FUNCTION (EQT6 BITS 6-10) 
HONST NOP           HONEST\ASCII (1\0)
REQTP NOP           REQUEST TYPE (1-3)
BSTAT NOP           CARD STATUS 
CDATA NOP           COMPLETE DATA WORD ON CARD
      HED <CDINT> 
*************************************************** 
* SUBROUTINE <CDINT> INITIALIZES 12966            * 
* IO CARD.                                        * 
* BELOW ARE THE INITIAL CONDITIONS FOR CONTROL:   * 
*     WORD 0 DO NOT SEND                          * 
*     WORD 1 DO NOT SEND                          * 
*     WORD 2 CE=1  STATUS REF. AND MASTER RESET   * 
*     WORD 3 CHARACTER FRAME CONTROL              * 
*         CHAR. SIZE=8 BITS                       * 
*         NO  PARITY                              * 
*         ECHO PER EQT6 BIT 8                     * 
*         STOP BIT PER BAUD RATE                  * 
*                                                 * 
*     WORD 4 INTERFACE CONTROL                    * 
*         BAUD RATE PER SETUP CALL                * 
*         DMA CONTROL OFF                         * 
*         SBA/SCA ON                              * 
*         CD (DATA TERM. READY) OFF               * 
*         CA (REQUEST TO SEND) OFF                * 
*         TRANSMIT MODE ON                        * 
*                                                 * 
*     WORD 5 CLEAR CARD INTERRUPTS                * 
*                                                 * 
*     WORD 6 SPECIAL CHARACTER                    * 
*         ALL USED SPECIAL CHARACTERS             * 
*         ARE CLEARED.                            * 
*************************************************** 
CDINT NOP 
      LDA BN6 
      JSB OUT2      SEND WORD 120004
      LDA FUNCT     GET ECHO BIT
      JSB ECHO      (BIT 4) 
      JSB XMIT4     PUT INTO XMIT 
      LDA CW577     SEND WORD 50077 
      JSB OUT2
      LDA CW604     SET A REG. = 60004
      JSB OUT2      CLEAR CNTL-D INTERRUPT
      LDA CW610     CLEAR BACKSPACE INTERRUPT 
      JSB OUT2
      LDA CW615     CLEAR CR INTERRUPT  1909
      JSB OUT2      1909
      LDA CW677     CLEAR RUBOUT INTERRUPT
      JSB OUT2
      JMP CDINT,I   RETURN
      HED <CDSET><CDSTT>
******************************************************
* SUBROUTINE <CDSET> SETS UP THE IO CARD PER B REG.  *
* <BIT 0>  1/0 IS  CHARACTER/BLOCK                   *
* <BIT 1>  1/0 IS  TRANSMIT/RECEIVE                  *
* <BIT 2>  1/0 IS  CLEAR/NOT CLEAR INTERUPT FLAGS    *
* <BIT 3>  1/0     SPECIAL CHARACTER IS/IS NOT TO BE *
* ADDED OR DELETED.SPECIAL CHARACTER IS IN POSITION  *
* <BIT 6-12>. <BIT 14> 1/0  IS ADD/DELETE            *
* SPECIAL CHARACTER.                                 *
******************************************************
CDSET NOP 
      LDA BIT12     SET WORD1 IN A REG. 
      SLB,BRS 
      IOR B40       "OR" CHARACTER MODE BIT 
      JSB OUT2
      LDA CW4       SET WORD 4 IN A 
      SLB,BRS 
      IOR B400      SET XMIT
      JSB OUT2
      LDA CW577     SET WORD 5 IN A REG.
      SLB,BRS 
      JSB OUT2      MAY NOT GET SENT
      LDA CW6       SET WORD 6 IN A REG.
      SLB,RSS 
      JMP CDSET,I   RETURN
      BRS,BRS 
      BRS 
      IOR B         "OR" SPECIAL CHARACTER
      JSB OUT2
      JMP CDSET,I 
* 
CDSTT EQU *         GET CARD STATUS AND PUT IT IN BSTAT 
      NOP           ENTRY POINT 
CLC01 CLC CARD
LIA01 LIA CARD
      STA BSTAT 
      JMP CDSTT,I   RETURN WITH STATUS IN A REG.
      HED <CHPRC> 
**********************************************
*<CHPRC> PROCESSES DATA ON KEYBOARD          *
* READ REQUESTS. "CCNT"    COUNTS THE NUMBER *
* OF CHARACTERS WE HAVE PROCESSED AND IS USED*
* TO LIMIT THE TIME WE ARE IN THE DRIVER.    *
* FOR ASCII READS THE EOR IS DETECTED BY     *
* LOOKING FOR THE SPECIAL CHAR. BIT SET ON   *
* THE 12966 CARD.                            *
**********************************************
C05R8 JSB EXIT1     WAIT FOR INTERRUPT
      LDA BSTAT     CHECK FOR PARITY ERROR
      AND B40       BIT 5 
      STA B         SAVE IT 
      SZA 
      JSB P.ERR     SET UP EQT5 TO INDICATE P.E.
* 
*    NOTES ON PARITY ERROR HANDLING:
*    CURRENTLY THE FACT THAT A PARITY ERROR OCCURRED IS NOTED 
*    IN EQT5, AND THE OPERATION IS RESTARTED.  IT IS POSSIBLE 
*    THAT SOME USERS MAY PREFER THAT THE OPERATION COMPLETE 
*    OR DOWN THE DEVICE.  THESE ARE A MATTER OF PERSONAL PREFERENCE.
* 
      LDA BSTAT     CHECK FOR BREAK 
      AND B100
      IOR B         OR PARITY ERROR 
      SZA 
      JMP RUBOT     TREAT IT LIKE A RUBOUT
CHPRC LDA N64       SET CHARACTER PROCESS. COUNT TO -64 
      STA CCNT
CHPCC JSB CHRIN     GET CHARACTER 
      LDA CDATA     CONTROL IF VALID DATA 
      SSA,RSS       SKIP IF GOOD
      JMP C05R8     EXIT AND WAIT NEXT INTERRUPT
      LDB HONST 
      SZB           IS THIS HONEST? 
      JMP CHPR9     YES,THIS IS HONEST
      LDA DATA      THIS IS ASCII 
      LDB CDATA     GET DATA WORD 
      RBL           ISOLATE SPEC. CHAR. BIT 
      SSB           IS IT SPECIAL?
      JMP SPCHK     YES - SEE WHAT IT IS
      CPA LF        IS IT A LINE FEED?
      JMP CHPCC     YES - IGNORE IT 
      JMP CHPR9     PROCESS A NORMAL CHARACTER
* 
SPCHK EQU *         PROCESS SPECIAL CHARS.
      CPA B177      IS IT A RUBOUT? 
      JMP RUBOT     YES! GO PROCESS RUBOUT
      CPA B4        IS IT A CONTROL "D" (SET EOT) 
      JMP CNTLD     YES! GO SET EOT 
      CPA B10       CHECK FOR BACKSPACE 
      JMP BS1       IF IT FALLS THROUGH, IT WAS A <CR>
      LDB EQT9,I    PROCESS ASCII END OF RECORD 
CHPR5 LDA FUNCT     SEE IF ASCII OR NOT 
      SLA           BIT 0 = 0 =>ASCII 
      CLA,RSS       BIT 0 = 1 =>BINARY
      LDA B40       ASCII FILL CHARACTER (SPACE)
      SLB           IF NEXT BYTE ODD, 
      JSB .SBT      THEN STUFF IT 
      JSB CLRCD     GET EXCESS CHARS. OFF THE BOARD 
      LDA HONST     IF HONEST, NO <CR,LF> ECHO
      SZA,RSS 
      LDA FUNCT     GET FUNCTION BITS IF NOT HONEST 
      RAR,RAR       PUT ECHO OR 0 IN BIT 0
      SLA           CHECK FOR ECHO
      JSB EORP      SEND <CR,LF> IF ECHO IS ENABLED.
      JMP EOOP2     THEN EXIT.
      SKP 
CHPR9 LDB EQT9,I    GET CURRENT CHAR. ADD.
      CPB EQT10,I   IS BUFFER FULL? 
      JMP CHPR5     YES BUFFER FULL 
      LDA DATA      GET CHARACTER 
      JSB .SBT      STORE IT  1909
      STB EQT9,I    STORE INCREMENTED ADDRESS 
      CPB EQT10,I   IS BUFFER FULL? 
      JMP CHPR5     YES IT IS 
CHPR6 EQU * 
      LDA BSTAT     CHECK FOR BUFFER EMPTY
      ALF,ALF 
      SSA           IS BUFFER EMPTY?
      JMP C05R8 
      ISZ CCNT      INCREMENT BUFFER COUNT
      JMP CHPCC     IF NOT ZERO GET ANOTHER CHAR. 
      LDB CHPC2     SETUP INTERRUPT RETURN
      STB EQT11,I 
STF01 STF CARD      SET FLAG FOR IMMEDIATE INTERRUPT
      JMP EXIT4     THIS IS ALL WE CAN PROCESS,EXIT 
* 
CHPC2 DEF CHPRC     RETURN POINTER
* 
BS1   LDA EQT7,I    GET STARTING ADDRESS OF BUFFER
      RAL           MULTIPLY BY 2 
      CPA EQT9,I    ARE WE AT STARTING ADDRESS? 
      JMP RUBOT     YES! PROCESS AS RUBOUT
      CCB 
      ADB EQT9,I    DECREMENT CURRENT ADDRESS 
      STB EQT9,I
      JMP CHPR6     GO GET NEXT CHARACTER 
      HED <CHRIN><CLRCD><CNTLD><ECHO> 
****************************************************
* SUBROUTINE <CHRIN> READS 1 CHARACTER FROM IO CARD*
* AND PLACES IT IN A REG.                          *
* BOARD STATUS IS ALSO READ                        *
* DATA = ASCII INPUT CHARACTER                     *
* BSTAT=BOARD STATUS                               *
****************************************************
CHRIN NOP 
STC02 STC CARD,C    PUT CARD IN DATA MODE 
LIA02 LIA CARD      GET DATA WORD 
      STA CDATA     STORE COMPLETE DATA WORD AT CDATA 
      JSB CDSTT     GET CARD STATUS 
      LDA CDATA     GET BACK COMPLETE DATA WORD 
      AND B377      ISOLATE DATA CHAR.(0-7) 
      STA DATA      STORE IT
STC03 STC CARD,C    THIS IS NECESSARY 
      JMP CHRIN,I   INTERRUPT 
* 
*********************************************** 
* SUBROUTINE <CLRCD> GETS DATA OFF CARD UNTIL * 
* BUFFER EMPTY.                               * 
*********************************************** 
CLRCD NOP 
      LDB B4        SET CARD TO RECEIVE AND CLR. INT. 
      JSB CDSET 
CLRC1 JSB CHRIN     GET CHARACTER 
      LDA BSTAT     CHECK FOR BUFFER EMPTY
      ALF,ALF 
      CMA,SSA       MAKE SIGN 0 IF EMPTY
      LDA CDATA     COMES HERE IF NOT EMPTY 
      SSA           A POSITIVE IF BUFFER EMPTY
      JMP CLRC1     NEG. FOR VALID CHAR. - YES IT IS
      JMP CLRCD,I   RETURN - BUFFER EMPTY OR INVAL.CHAR.
* 
CNTLD LDA B40       SET BIT 5 (EOT) 
      IOR EQT5,I   IN TERMINAL STATUS 
      STA EQT5,I
      CLA 
      STA EQT19,I   SET AREG. EXIT
      JMP EOOP4     GO SET B REG. TO  0 AND EXIT
* 
ECHO  NOP           SET ECHO ON CARD PER A REG. 
      RAL,RAL       MOVE BIT 2 TO BIT 4 
      AND B20       MASK FOR ECHO BIT 
      IOR CW3       A =20/0 IS ECHO ON\OFF
      JSB OUT2
      JMP ECHO,I
      HED <EOOP 1, 2, 3, 4, 8, 9> 
********************************************************* 
* <EOOP1> AND <EOOP2> ARE ENTRIES FOR COMPLETION (P+1)  * 
* EXITS.                                                * 
********************************************************* 
EOOP8 LDB CCNT      THIS EXIT IS USED IF UNDERSCORE 
      CPB N128      IS ONLY CHAR.  1909 
      RSS 
EOOP1 JSB EXIT1 
EOOP2 CLA 
      STA EQT19,I   SET A REG. EXIT 
      JMP EOOP3 
* 
EOOP9 LDB B3        SET B=3 FOR XMISSION ERROR
      STB EQT19,I   A REG. EXIT 
*********************************************************** 
* <EOOP4> IS ENTRY FOR B=0 (TRANS. LOG =0) EXIT.          * 
*********************************************************** 
EOOP4 CLA 
      STA EQT8,I    SET UP FOR B REG. =0 EXIT 
**********************************************************
* <EOOP3> SETS IO CARD FOR NEXT INTERRUPT                *
* OR REQUEST.                                            *
* IT ALSO SETS THE TRANSMISSION LOG IN B REG. (+CHAR. OR *
* + WORDS). IF EQT8 =0 (VIA EOOP4) THEN B=0.             *
**********************************************************
EOOP3 EQU * 
      CLA,INA       1 
      CPA REQTP     IF READ, DON'T BOTHER CHECKING
      JMP EOP3B 
      LDA EQT5,I    CHECK FOR BREAK 
      AND B100      IS IT SET?
      SZA 
      JSB SCHED     IF SO, SCHEDULE A PROGRAM 
EOP3B JSB CDINT     CLR SPECIAL INTERRUPTS
      IFZ           ##
      JSB LINCK     ## SEE IF OPERATION COMPLETED 
      XIF           ##
      JSB CLRCD     GET ALL DATA OFF CARD 
      JSB SETEM 
      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 EOP3A     THESE ARE CHARACTERS
      INB           INCREMENT SO EVEN FOR DIVIDE
      BRS           DIVIDE TO CONVERT TO WORDS
EOP3A SZA,RSS       IF EQT8 IS 0 THEN CLEAR B REG.
      CLB 
      LDA INITF     SEE IF WE EVER LEFT 
      SZA,RSS       IF A NOT=0, WE'RE OK
      JMP IMCOM     IMMED. COMPLETION 
      LDA EQT19,I   SET A REG. EXIT 
      JMP CT05,I
      HED <EORP>
********************************************************* 
* <EORP> DOES ASCII WRITE EOR PROCESSING                * 
********************************************************* 
EORP  NOP 
      LDA EORP      SAVE RETURN ADDRESS 
      STA EQT16,I 
      LDB CR        OUTPUT A  <CR>
      JSB OUT1
      LDA EQT18,I   GET STALL COUNT 
      RRR 9         MOVE BITS 13-9 TO LOW BITS
      AND B37       MASK IT 
      CMA,INA,SZA,RSS CHECK FOR ZERO
      JMP EORP2     NO STALLS REQUIRED
      STA EORP      STORE COUNTER 
      CLA           GENERATE THE NULL 
EORP1 JSB OUT2      SEND IT 
      ISZ EORP      COUNT IT
      JMP EORP1     GO DO IT AGAIN
EORP2 LDA LF        OUTPUT A   <LF> 
      JSB OUT2
      LSR 11        MOVE LF COUNT TO BITS 0-4 IN B
      CMB,INB,SZB,RSS CHECK FOR ZERO
      JMP EORP4     WE ARE DONE 
      CLA           MAKE A NULL 
EORP3 JSB OUT2      SEND IT 
      INB,SZB       LOOP UNTIL DONE 
      JMP EORP3 
EORP4 JSB EXIT1     WAIT B.E. INTERRUPT 
      LDA BSTAT     SEE IF BUFFER EMPTY 
      ALF,ALF 
      SSA,RSS 
      JMP EORP4     NO - TRY AGAIN
      LDA EQT16,I 
      JMP A,I 
      HED <EXIT0><EXIT1><EXIT4><EXIT5>
****************************************************
* <EXIT0> IS USED FOR CONTINUATION EXITS WITH THE  *
* TIMEOUT VALUE SET IN THE B REGISTER. ##          *
* <EXIT1> IS USED FOR INITIATOR OPERATION WITH     *
* INITIATED EXITS (A=0), AND COMPLETION            *
* CONTINUATION EXITS (P+2).  "INITF" INDICATES     *
* WHICH EXIT TO TAKE.                              *
****************************************************
      IFZ ##
EXIT0 NOP           ##
      LDA EXIT0     SAVE RETURN ADDRESS ##
      STA EQT11,I   FOR INTERRUPT ##
      JMP EXIT3     ##
      XIF ##
* 
EXIT1 NOP 
      LDB EXIT1     GET CALLING PROGRAMS ADDRESS+1
      STB EQT11,I   STORE AT EQT11,I FOR INTERRUPT
      LDA REQTP     GET REQUEST TYPE
      LDB EQT14,I   GET NORMAL TIMEOUT
      ARS,SLA,RAL   CHECK FOR WRITE OR CONTROL
      LDB TO30      APPROX. > 30 SECONDS
EXIT3 STB EQT15,I   NORMAL OR DEFAULT TIMEOUT 
      XOR CW577     IF WRITE, WILL BE 50075 
      JSB OUT2      CLEAR ALL BUT BREAK INTERRUPTS
EXIT5 EQU * 
STC04 STC CARD,C    RE-INITIALIZE CARD FOR INTERRUPT
EXIT4 CLA 
INITF NOP           INITIATION\COMPL. FLAG NOP\RSS
      JMP IT05,I    INITIATION RETURN 
      ISZ CT05      RETURN
      JMP CT05,I    COMPLETION RETURN 
      HED <CONSTANTS> 
***************************************************** 
* "B.X" IS NEG. BINARY NO., "D.X" IS NEG. DECIMAL NO* 
* "BN" IS SOME BINARY NO.                           * 
* SEE BELOW.                                        * 
***************************************************** 
* 
B.6   OCT 177772
BIT12 OCT 10000 
LF    OCT 12
B37   OCT 37
B17   OCT 17
B137  OCT 137 
B317  OCT 317 
CR    OCT 15
B177  OCT 177 
B4    OCT 4 
B134  OCT 134 
B5    OCT 5 
CW577 OCT 50077 
B400  OCT 400 
CW3A  OCT 30002 
CW3   OCT 30003     THIS ONE GETS CHANGED FOR PARITY
CW4   OCT 40440     CONTROL WORD 4 (DYNAMICALLY ALTERED)
CW440 OCT 40040     CONTROL WORD 4 (BASE SITUATION) 
STF0  STF 0 
N128  DEC -128
B1100 OCT 1100
B14   OCT 14
TO30  DEC -3000 
B600  OCT 600 
B500  OCT 500 
EQT16 NOP 
EQT17 NOP 
EQT18 NOP 
EQT19 NOP 
EQT20 NOP 
EQT21 NOP 
DATA  NOP           ASCII DATA WORD 
      IFZ           ##
CW132 OCT 10032     ##
BIT15 OCT 100000    ##
      HED <LINCK> 
* 
LINCK NOP           ## CHECK MODEM STATUS LINES 
SWH02 NOP           ## HARD/MODEM NOP/RSS 
      JMP LINCK,I   ## HARD WIRED - DON'T BOTHER
* 
      LDB EQT1      ## CHECK FOR SYSTEM CONSOLE 
      CPB SYSTY     ## IF SO, DON'T DOWN IT 
      JMP LINCK,I   ##
      JSB CHRIN     ## GET LINE STATUS
      LDA BSTAT     ##
      AND B32       ## CHECK FOR CLR TO SEND (CB), CARRIER (CF),
      CPA B32       ## AND DATA SET READY (CC)
      JMP LINCK,I   ## GO DO IT 
* 
      IOR CW2       ## STUFF STATUS INTO CONWD 2
      JSB OUT2      ## SET STATUS REFERENCE 
      LDA CW132     ## ENABLE LINE CHANGE INTERRUPT 
      JSB OUT2      ##
      LDA EQT19,I   ## SET $UPIO FLAG 
      IOR BIT15     ## INTO THE SIGN BIT
      STA EQT19,I   ##
      LDA B20       ## SET "BAD LINE# STATUS
      IOR EQT5,I    ##
      STA EQT5,I    ## INTO EQT5. 
      LDA B3        ## TRANSMISSION ERROR 
      LDB INITF     ## SEE IF WE EVER LEFT
      SZB           ##
      CLA,INA,RSS   ## CONTINUATOR EXIT 
      JMP IT05,I    ## RETURN 
      JMP CT05,I    ## NOT READY RETURN 
      XIF           ##
      HED <NXQU><OUT1><OUT2><RECIV> 
*************************************************** 
* FOR ALL WRITE AND CONTROL REQUESTS              * 
* THE BUFFER FLUSH BIT IS EXAMINED.               * 
* <NXQU> IS CALLED BY ALL WRITE AND CONTROL       * 
* REQUESTS IF THE BUFFER FLUSH BIT IS SET.        * 
**************************************************
NXQU  NOP           IF LAST REQUEST IN QUE THEN STOP FLUSH
      LDA $OPSY     GET SYSTEM TYPE 
      RAR,SLA       CHECK FOR DMS SYSTEM
      JMP GTDMS     THIS IS A DMS SYSTEM
OLDSY LDA EQT1,I    CLEAR THE BUFFER FLUSH BIT7 SO
      LDA A,I       THAT NEXT REQUEST WILL BE DONE. 
CHECK SZA           IF NOT LAST REQUEST DO NOT CLR BIT7.
      JMP NXQU,I    THIS IS NOT THE LAST REQUEST. 
      LDA EQT5,I    LAST REQUEST
      AND NBIT7     REMOVE BIT7 
      STA EQT5,I    RESTORE EQT5
      JMP NXQU,I    AND RETURN
* 
GTDMS RSA           CHECK MAP. IF SYSTEM, NO CROSS LOAD 
      ALF,SLA       BIT12 = 0/1 FOR SYSTEM/USER 
      RSS 
      JMP OLDSY     SYSTEM MAP
      XLA EQT1,I    USER MAP CROSS LOAD 
      XLA A,I 
      JMP CHECK 
************************************************* 
* SUBROUTINE <OUT1>  IS GENERAL OUTPUT ROUTINE  * 
* TO TERMINAL. CHAR. IS IN B REG.               * 
************************************************* 
OUT1  NOP           GENERAL PURPOSE CHARACTER OUTPUT ROUTINE
      JSB XMIT4     SET CARD TO TRANSMIT
      LDA B         GET DATA
      JSB OUT2      SEND TO TERMINAL
      JMP OUT1,I    RETURN
* 
OUT2  NOP           GENERAL PURPOSE OUTPUT ROUTINE
OTA10 OTA CARD      FOR CARD COMMUNICATION
      JMP OUT2,I
* 
RECIV NOP 
      LDB B5        SET CARD UP FOR RECEIVE,CHAR. 
      JSB CDSET 
      CLA 
      JSB ECHO      TURN OFF ECHO 
STC05 STC CARD,C    ENABLE INTERRUPT
      JMP RECIV,I 
      HED <REJ2><RUBOT> 
**********************************************
* <REJ2>                                     *
* EXIT IS A=2 (ILLEGAL CONTROL REQUEST).     *
* (ALSO IMMEDIATE COMPLETION WITH B=0).      *
*                                            *
* <REJ1>                                     *
* EXIT CAUSES AN IO07 PROGRAM ABORT.         *
**********************************************
REJ2A EQU * 
      IFZ           ##
      JSB NXQU      ##
      JSB LINCK     ## SEE IF THE MODEM STAYED UP 
      RSS           ## DON'T DO NXQU AGAIN
      XIF           ##
REJ2  JSB NXQU      CHECK QUE 
      JSB SETEM     SETUP CARD FOR EXIT 
IMCOM LDA B2
      RSS 
REJ1  CLA,INA 
      JMP IT05,I
********************************************
* <RUBOT> IS CALLED IF RUBOUT INTERRUPT IS *
* DETECTED. IT DELETES THE CURRENT RECORD  *
* AND OUTPUTS (/,CR,LF).                   *
********************************************
RUBOT JSB CLRCD     GET RID OF GARBAGE ON THE BOARD 
      LDA FUNCT 
      RAR,RAR 
      SLA,RSS       CHECK FOR ECHO
      JMP IT05R     NOT SET - DON'T SEND /<CR><LF>
      LDB B134      OUTPUT A SLASH
      JSB OUT1
      JSB EORP      GO OUTPUT <CR,LF> 
      JMP IT05R     RE START INPUT
      HED <SCHED> 
***************************************************** 
* <SCHED> IS CALLED WHENEVER AN INTERRUPT OCCURS AND* 
* NO PROGRAM IS SCHEDULED (I.E. USER HITS A KEY TO  * 
* GET THE SYSTEM'S ATTENTION.                       * 
***************************************************** 
SCHED NOP 
      JSB RECIV     PUT INTO RECEIVE
      JSB CHRIN     GET THE INPUT CHARACTER 
      STA EQT6,I    SAVE CHAR. FOR PROGRAM
      JSB CLRCD     GET CHAR. OFF CARD
      CLA 
      STA EQT15,I   SET T.O. TO 0 
      LDB EQT1      IS THIS THE SYSTEM CONSOLE? 
      CPB SYSTY 
      JMP OPFLG     YES! GO SET OPERATOR FLAG 
      LDB EQT17,I   GET TERMINAL ID ADD.
      LDA EQT5,I    IS TERMINAL ENABLED?
      RAR,SLA 
      SSB           YES! IT IS ENABLED
      JMP SCHED,I   IT IS NOT 
      STB SCH1      1740 RTE
      LDB EQT4      1740 RTE
      STB SCH       1740 RTE
      JSB $LIST     GO SCHEDULE TERM. PROG
      OCT 601       THIS IS CONTROL FOR $LIST 
SCH1  NOP           ID SEGMENT ADDRESS
SCH   NOP           EQT4 ADDRESS  OR SELECT CODE
      JMP SCHED,I   RETURN
OPFLG ISZ OPATN     SET OPER. ATTN. FLAG
      JMP SCHED,I   EXIT
      HED <SETEM><TIMOT>
*********************************************** 
* <SETEM> ENABLES IO CARD INTERRUPT IF TERM.  * 
* HAS BEEN ENABLED OR IF TERMINAL IS A        * 
* SYSTEM CONSOLE.                             * 
*********************************************** 
SETEM NOP           SUBROUTINE TO SETUP IO CARD FOR RECEIVE 
      JSB RECIV     SET CARD TO RECEIVE 
      LDA EQT5,I    MODE PRIOR TO EXIT. GET TERM.STATUS 
      RAR,SLA       IS TERMINAL ENABLED? (BIT 1=1)
      JMP SETEM,I   YES, IT IS - RETURN 
      LDA SYSTY     GET CONSOLE EQT 
      CPA EQT1      IS THIS THE SYSTEM CONSOLE ?
      JMP SETEM,I   YES, IT IS
CLC02 CLC CARD      NONE OF THE ABOVE - INHIBIT INTERRUPTS
      JMP SETEM,I   RETURN
* 
TIMOT EQU *         TIME OUT PROCESSING 
      XOR EQT4,I    CLEAR T.O. BIT
      STA EQT4,I
      IFZ ##
      LDA EQT21,I   CHECK CN32 FLAG ##
      SSA           ##
      JMP CN31B     ##
      XIF ##
      LDA EQT5,I
      IOR B4        SET TIME OUT STATUS 
      STA EQT5,I
      LDA EQT18,I   GET DEVICE PARAMETER
      LDB B4        SET FOR T.O. ERROR
      SSA           IF SIGN SET DO NOT DOWN ON TIMEOUT
      CLB           NO ERROR
      STB EQT19,I   SET A REG. FOR EXIT 
      JMP EOOP4     B REG. 0 EXIT 
      HED <TRAN1><XMIT4>
**************************************************
* <TRAN1> WRITES TO THE DEVICE.                  *
* STARTING ADDRESS OF DATA IS EQT9,I             *
* "TRAN1" COUNTS THE NUMBER OF CHAR. IN ONE      *
* TRANSMISSION AND IS USED TO LIMIT THE TIME     *
* IN THE DRIVER FOR A SINGLE INTERRUPT.          *
* IF BUFFER IS NOT EMPTIED IN 1 CALL TO<TRAN1> WE*
* WILL WAIT FOR A BUFFER EMPTY INTERRUPT AND     *
* COMPLETE THE TRANSMISSION.                     *
**************************************************
CCNT  EQU *         CHARACTER COUNT 
TRAN1 NOP 
      LDA TRAN1     SAVE RETURN ADDRESS 
      STA EQT16,I 
      JSB XMIT4     SET CARD FOR XMIT 
TRAN4 LDB N128      GET READY TO SEND A FULL BUFFER 
      STB CCNT      IN ONE TRANSMISSION 
      LDB EQT9,I    GET BUFFER ADDRESS X 2
TRAN2 JSB .LBT      GET BYTE (ADDR. IN B) 1909
      CPB EQT10,I   IS THIS THE LAST WORD?
      RSS           PROCESS END OF RECORD 
      JMP OUT6      NO - IGNORE CHECKS 1909 
      STB EQT9,I    YES - RESTORE INCREMENTED EQT9 1909 
      LDB HONST     IS IT HONEST? 
      SZB           1909
      JMP OUT5      YES - IGNORE CHECKS 
      CPA B137      IS THIS A "_" UNDERSCORE? 
      JMP EOOP8     YES! GO TO END OF OUTPUT PROCESSING 
OUT5  LDB EQT9,I    RESTORE B REGISTER
OUT6  OTA CARD      OUTPUT CHAR. TO CARD
      CPB EQT10,I   HAVE WE SENT LAST WORD? 
      JMP TRAN5     THIS IS THE LAST CHARACTER
      ISZ CCNT      INCREMENT CHAR. COUNT.
      JMP TRAN2     WE HAVE NOT SENT ALL THE CHARS. 
      STB EQT9,I    PUT BACK THE B REGISTER 
TRAN6 JSB EXIT1     WE HAVE SENT 128 CHAR.
      LDA BSTAT     CHECK FOR BUFFER EMPTY
      ALF,ALF 
      SSA 
      JMP TRAN4     BUFFER IS EMPTY - CONTINUE
      JMP TRAN6     NO - GO WAIT FOR IT 
TRAN5 STB EQT9,I    SAVE B REGISTER FOR TRANS. LOG
      LDA EQT16,I   GET RETURN ADDRESS
      JMP A,I       RETURN
* 
XMIT4 NOP           SET BOARD TO XMIT 
      LDA CW4       GET CONTROL WORD
      IOR B400      PUT IN XMIT 
      JSB OUT2      SEND IT 
      JMP XMIT4,I   RETURN
      HED <SETIO> 
**********************************************************
*<SETIO> CONFIGURES IO INSTRUCTIONS TO SELECT CODE SET   *
* IN A REG.                                              *
**********************************************************
* 
****************************************************
* SETUP EXTENSIONS ON EQT                          *
*                                                  *
*     EQT NO.       USE                            *
*     1-8           STANDARD                       *
*     9             RUNNING CHAR. ADDRESS          *
*     10            LAST CHAR. ADDRESS OR          *
*                   LINE CONTROL REFERENCE FOR     *
*                   LINE OPEN/CLOSE ##             *
*     11            ADDRESS TO GO ON INTERRUPT     *
*     12            NO. OF EQT EXTENSIONS          *
*     13            EQT EXTENSION STARTING ADD.    *
*     14-15         STD                            *
*     16            <EORP><TRAN1> RETURN ADDRESS   *
*     17            ID ADDRESS OF TERM. PROG.      *
*     18            MODE CONTROL PARAMETERS        *
*           BIT(S)                                 *
*            15     1= DO NOT DOWN THE DEVICE ON   *
*                   TIME OUT.                      *
*                   0= LET THE SYSTEM HANDLE T.O.  *
*            14     1= SEND <DC1> CHARACTER AT THE *
*                      BEGINNING OF EACH READ.     *
*                   0= NORMAL OPERATION.           *
*            13-9   <CR> DELAY IN STALL CHARACTERS *
*                   (0 TO 31).                     *
*            8-4    <LF> DELAY IN STALL CHARACTERS *
*                   (0 TO 31).                     *
*            3-0    NOT USED.                      *
*     19            A-REG EXIT VALUE  OR           *
*                   <$UPIO> FLAG (SIGN BIT)        *
*     20            LAST REQUEST CODE              *
*     21            LINE CONTROL PARAMETERS        *
*           BIT(S)  FUNCTION                       *
*            15     CN32 FLAG ##                   *
*            14     RESERVED                       *
*            13     0= HARDWIRED                   *
*                   1= MODEM ##                    *
*            12     "CA" (RTS) SET ##              *
*            11     "CD" (DTR) SET ##              *
*            10     1= PARITY ON                   *
*                   0= PARITY OFF                  *
*             9     1= PARITY EVEN                 *
*                   0= PARITY ODD                  *
*            8-5    BAUD RATE                      *
*            4-0    RESERVED                       *
****************************************************
SETIO NOP 
      LDA SCH       GET SELECT CODE 
      IOR STF0      CONSTRUCT STF 
      CPA STF01     ALREADY CONFIGURED? 
      JMP SETI1     YES - SKIP SOME CODE. 
      STA STF01     STF IS 1021XX 
      IOR B400      CONSTRUCT LIA AND SAVE
      STA LIA01     LIA IS 1025XX 
      STA LIA02 
      XOR B600      CONSTRUCT SFS 
      STA SFS01     SFS IS 1023XX 
      XOR B500      CONSTRUCT OTA AND SAVE
      STA OTA10     OTA IS 1026XX 
      STA OUT6
      IOR B1100     STC,C IS 1037XX 
      STA STC02 
      STA STC03 
      STA STC04 
      STA STC05 
      IOR B4000     CONSTRUCT CLC,C AND SAVE
      STA CLC01     CLC,C IS  1077XX
      STA CLC02 
SETI1 EQU * 
      LDA EQT4,I    CHECK FOR FIRST TIME THROUGH
      ALF,SLA       "I WILL HANDLE TIME OUT" BIT
      JMP SETIA     IF NOT FIRST TIME, SKIP CHECKS
      LDA EQT6,I    CHECK FOR SYSTEM REQUEST
      SSA 
      JMP SETIA     IF SYSTEM REQUEST, SKIP CHECKS
      LDA EQT13,I   CHECK FOR EXTENTS SET UP
      SZA           ZERO + (-6) IS ERROR
      LDA EQT12,I   CHECK FOR ENOUGH EXTENTS
      ADA B.6       IS IT =>6?
      SSA           OK IF POSITIVE
      JMP REJ1      GO OUT WITH IO07
SETIA EQU * 
      LDA EQT6,I    GET CONTROL WORD
      LSR 6         SHIFT IT
      AND B37       MASK IT 
      STA FUNCT     SAVE IT 
      AND B21       BIT6 OR 10 INDICATES HONEST MODE
      SZA           MAKE IT A 1 OR ZERO FOR HONEST/ASCII
      CLA,INA       GENERATE A 1
      STA HONST 
      LDA EQT6,I    GET REQUEST TYPE
      AND B3
      STA REQTP 
      LDA EQT13,I   GET STARTING ADDRESS OF EXT.
      CPA EQT16     SEE IF SET UP 
      JMP SETI2     YES - SKIP SOME STUFF 
      STA EQT16     SET ADD. OF EQT16 
      INA 
      STA EQT17 
      INA 
      STA EQT18 
      INA 
      STA EQT19 
      INA 
      STA EQT20 
      INA 
      STA EQT21 
      LDA EQT4,I    CHECK FOR FIRST TIME THROUGH
      ALF,SLA       WITH BIT 12 
      JMP SETI2     NOT FIRST TIME
      CLA           SET UP DEFAULT BAUD RATE
      STA EQT21,I 
      LDA SCH       SET UP SCHEDULE FLAG
      ADA B.6 
      ADA INTBA     GET SCHEDULE WORD IF NEG. 
      LDB A,I 
      CMB,SSB,INB   CHANGE SIGN OF WORD 
      CCB           NO PROG. TO SCHED. (INT. POINTS TO EQT) 
      STB EQT17,I   SAVE FOR FUTURE REF.
      LDB EQT1      PUT EQT ADDRESS INTO INT. TABLE 
      STB A,I 
      LDA EQT4,I    DONE WITH INITIAL SETUP 
      IOR BIT12     SET "I WILL HANDLE T.O." BIT
      STA EQT4,I    PUT IT BACK 
SETI2 LDA EQT21,I   GET ALL LINE PARAMETERS 
      IFZ           ##
      RAL,RAL       ## CHECK BIT 13 
      SSA,RSS       ## FOR HARDWIRED
      CLB,RSS       ## HARDWIRED
      LDB RSS       ## MODEM
      STB SWH01     ##
      STB SWH02     ##
      LSR 7         ## ADJUST A REG.
      XIF           ##
      IFN 
      LSR 5         SHIFT BITS TO RIGHT 
      XIF 
      AND B317      ISOLATE BAUD RATE & CONTROL BITS
      IOR CW440 
      STA CW4       SET UP CONTROL WORD 4 
      AND B17       ISOLATE BAUD RATE 
      STA EXIT1     SAVE BAUD RATE
      LDA EQT21,I   GET PARITY INFO.
      LSR 7         SHIFT INTO PLACE
      AND B14       MASK IT 
      IOR CW3A      PUT IN BASIC CW3 INFO.
      LDB EXIT1     CHECK FOR 110 BAUD
      CPB B3
      IOR B40       IF SO,THEN 2 STOP BITS
      STA CW3       SAVE IT 
      AND B10       CHECK FOR PARITY ON 
      SZA,RSS       IF NO PARITY CHAR. SIZE IS 8
      ISZ CW3 
      LDA REQTP     GET REQUEST TYPE
      CPA B1        IS IT READ? 
      JMP OVER2     YES - SKIP THE CHECKS 
      SLA           WRITE?
      JMP CN024     CONTROL - CHECK IT OUT
OVER1 LDB EQT5,I    IF BUFFER FLUSH SET 
      BLF,BLF       THEN EXIT VIA REJ2
      SSB           SEE IF FLUSH
      JMP OVER8     YES - COMPLETE THE FLUSH
OVER2 LDA EQT6,I    NORMAL NON CNTL-0 REQUEST 
      STA EQT20,I   SAVE THE COMMAND
      JMP SETIO,I   RETURN
* 
CN024 EQU *         CHECK FOR BUFFER UNFLUSH & SYST. CNTL 0 
      LDA FUNCT     CHECK FUNCTION CODE 
      CPA B24       IS IT UNFLUSH?
      JMP CN24      YES - UNFLUSH THE BUFFER
      SZA,RSS       IS IT CNTROL 0? 
      LDA EQT6,I    YES - CHECK FOR SYSTEM REQUEST
      SSA 
      JMP SETIO,I   IS SYSTEM REQUEST - GO DO IT
      JMP OVER1     CHECK FOR FLUSH 
* 
*                   BUFFER FLUSH EXITS
* 
OVER8 LDA INITF     GET IT05/CT05 FLAG
      SZA 
      JMP OVER2     CT05 EXIT 
      JMP REJ2
* 
      HED <EQU'S,EQT DEFINITIONS> 
* EQU'S FOR VARIOUS ENTRIES 
A     EQU 0         DEFINE A REG. 
B     EQU 1         DEFINE B REG. 
CARD  EQU 67B       DEFINE CARD FOR IO INSTRUCTIONS 
* 
* SYSTEM BASE PAGE COMMUNICATION AREA 
* 
.     EQU 1650B     ESTABLISH ORIGIN OF 
*                   BASE PAGE 
EQT1  EQU .+8 
EQT2  EQU .+9       ADDRESSES 
EQT3  EQU .+10
EQT4  EQU .+11      OF CURRENT
EQT5  EQU .+12
EQT6  EQU .+13      EQT ENTRY 
EQT7  EQU .+14
EQT8  EQU .+15
EQT9  EQU .+16
EQT10 EQU .+17
EQT11 EQU .+18
EQT12 EQU .+81
EQT13 EQU .+82
EQT14 EQU .+83
EQT15 EQU .+84
* 
INTBA EQU .+4 
SYSTY EQU .+21      EQT ENTRY ADDRESS OF SYSTEM CONSOLE 
* 
OPATN EQU .+52      OPERATOR KEYBOARD ATTN. FLAG
* 
* 
* 
      ORG *         DRIVER LENGTH 
      END 
                              