ASMB,R,L,C
      HED D.00D 91703-16105 * (C) HEWLETT PACKARD CO. 1976
      NAM D.00D 91703-16105 REV A 740509
      SPC 1 
******************************************************************
*  * (C) COPYRIGHT HEWLETT-PACKARD COMPANY 1976.  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.       *
******************************************************************
      SPC 2 
      SPC 1 
******************************************
* 
*D.00D              TELETYPE DRIVER FOR DS1-B 
* 
*SOURCE PART #      91703-18105 
* 
*REL PART #         91703-16105 
* 
*WRITTEN BY:        JIM HARTSELL
* 
*DATE WRITTEN*
* 
*DATE MODIFIED:     5-9-74
* 
********************************************* 
* 
* 
***************************************** 
* D.00 CRT/TELEPRINTER DRIVER FOR 
* 9701 BCS TERMINALS. 
***************************************** 
* 
      ENT D.00,I.00 
* 
      EXT ATTEN 
      EXT $BUSY 
      EXT $ESC
* 
TTY   EQU 15B       NOMINAL TTY CHANNEL 
* 
*   THIS MODULE OF THE HP-2116 BASIC CONTROL SYSTEM 
* SOFTWARE IS DESIGNED TO OPERATE THE ASR-33/35 
* TELE-TYPEWRITER. THE FUNCTION OF THIS DRIVER IS 
* TO INITIATE, CONTINUE AND COMPLETE A READ/WRITE 
* OPERATION REQUESTED THROUGH INPUT/OUTPUT CONTROL. 
* 
*  THE DRIVER WILL REJECT A -FUNCTION SELECT- 
* REQUEST AS NONE OF THE DEFINED FUNCTIONS IS 
* APPLICABLE FOR THE ASR DEVICE.
* 
* 
***  D.00     INITIATOR SECTION  ***
* 
      SKP 
D.00  NOP        D.00  NOP           * ENTRY / EXIT * 
      STA SAVA      SAVE EQT ENTRY ADDRESS. 
      STB RQA       SAVE REQUEST ADDRESS
      LDA B,I       GET WORD 2 OF REQUEST, ROTATE 
      ALF           REQUEST CODE TO LOW A 
      AND O17       ISOLATE FUNCTION CODE 
      LDB DFLG      CHECK DRIVER FLAG - 
      SZB           DRIVER IDLE?
      SZA,RSS       CLEAR?
RSSI  RSS           YES. ACCEPT COMMAND.
      JMP REJB      REJECT THIS REQUEST.
      ADA M3        SUBTRACT 3 FROM CODE
      SSA,RSS       IF RESULT +, THEN ILLEGAL CODE, 
      JMP RCER      REJECT REQUEST. 1,2 LEGAL.
* 
      LDA SAVA,I    GET WORD 1 OF EQT ENTRY.
      AND O77       GET I/O SLOT
      IOR LIAI
      STA I.6       LIA TTY (102500)
      ADA O100
      STA I.10      OTA TTY (102600)
      ADA O1100 
      STA ISYN1     STC,C TTY (103700)
      XOR OTBM
      STA I.9       OTB TTY (106600)
* 
ACC2  ISZ SAVA      SET ADDRESS OF EQT ENTRY TO 
      LDA SAVA      GET EQT ADDRESS 
      STA EQT2      POINTER TO STATUS 
      INA 
      STA EQT3      POINTER TO LOG
      LDA D.00      MOVE RETURN ADDRESS...
      STA I.00      TO "DISMISS INTERRUPT." 
      STA DFLG      SET DRIVER FLAG BUSY (NOT = 0). 
      CLA 
      STA CHC       AND CHARACTER COUNTER 
      STA SAVAX     AND SET TO TELL IOC ALL OK. 
      LDA RQA,I     GET FUNCTION CODE 
      ALF 
      AND O17 
      SZA,RSS       CHECK FUNCTION CODE: CLEAR? 
      JMP CLEAR     YES. SET STATUS AND EXIT. 
* 
      LDA RQA,I     GET FUNCTION CODE 
      STA FUNC      SAVE IT 
      CLB,CLE       CLEAR "B", CLEAR "E". 
      ALF,ALF 
      RAL,ELA       PUT BINARY MODE BIT INTO
      ERB           SIGN BIT OF B.
      LDA EQT2,I    GET STATUS WORD 
      IOR IBIT      SET O-FIELD = 2 (BUSY) AND
      STA EQT2,I    STORE.
      ISZ RQA 
      ISZ RQA 
      LDA RQA 
      LDA A,I       GET BUFFER ADDRESS. 
      RAL,CLE,SLA,ERA  IF INDIRECT, 
      JMP *-2       GET DIRECT ADDRESS. 
      STA BUF       SAVE BUFFER ADDRESS.
      STA BUFS
      ISZ RQA 
      LDA RQA,I     GET BUFFER LENGTH.
      SSA 
      INB,RSS       NEGATIVE: FLAG CHARS IN LOG.
      ALS,SLA       POSITIVE: DOUBLE FOR CHARS
      CMA,INA       NEGATIVE: MAKE POSITIVE CHARS.
      STA IOSYZ     SAVE POSITIVE CHAR COUNT
      STB EQT3,I    STORE FLAG IN XMIT LOG
      LDB FUNC
      BLF,SLB       INPUT OR OUTPUT?
      JMP INGO      INPUT.
      JMP TTYO      OUTPUT
* 
RCER  CLB,RSS       ---REJECT SECTION R. C. ERROR (B=0).
REJB  LDB IBIT      DEVICE/DRIVER NOT AVAILABLE 
      CLA,INA       SET (A) NON-ZERO AND
      JMP D.00,I    EXIT TO IOC AND REJECT. 
* 
* 
***  CONTINUATOR SECTION  *** 
*     ENTERED AT I.00 BY TTY INTERRUPT. 
* 
ISYNC NOP 
I.10  OTA TTY       OUTPUT CHAR OR INSTR
      LDA SAVEX 
      CLO 
      SLA,ELA 
      STF 1         OVERFLOW ON 
      LDB SAVBX 
      STF 0 
ISYN1 STC TTY,C     START TTY CLOCK 
      LDA OPINT 
      SZA 
      JMP ISYN2 
      LDA SAVAX 
      JMP I.00,I    DISMISS INTERRUPT 
ISYN2 CLA 
      STA OPINT 
      JMP ATTEN     PROCESS OPERATOR ATTENTION. 
* 
I.00  NOP           TTY INTERRUPT HERE
      STA SAVAX     SAVE A, 
      STB SAVBX     B,
      ERB,BLS       E,
      SFC 1         AND 
      INB           OVERFLOW
      STB SAVEX 
I.6   LIA TTY 
      AND O177      REMOVE 8-LEVEL BIT
      JMP ISYNC,I   RETURN TO CALLING ROUTINE.
* 
      SKP 
* 
*     INPUT SECTION 
* 
RDCH  NOP           INPUT A CHARACTER 
      LDB FUNC
      LDA DA        READ AND ECHO INSTRUCTION 
      BLF,BLF 
      SLB,RSS       TEST "P" (PRINT)
      LDA DB        READ ONLY INSTRUCTION 
      JSB ISYNC     GET A CHARACTER.
      JSB TSTCH     CHECK FOR CONTROL 
      JMP RDCH,I
* 
INGO  LDA BUFS      RESET STARTING BUFFER ADDRESS.
      STA BUF 
      CLB 
      JMP INA4      GO GET FIRST CHAR.
* 
IASC2 JSB RDCH      READ ASCII CHARACTER
      STA CH        SAVE IT 
      SZA,RSS       NULL? 
      JMP IASC2     YES. IGNORE 
      CPA O12       LINE FEED?
      JMP IASC2     YES, IGNORE.
      CPA O15       CAR RETURN? 
      JMP IRETN     YES, END OF RECORD
      CPA RUBO      RUBOUT? 
      JMP RDEL      DELETE RECORD 
      CPA BAKSP     BACKSPACE CHAR? 
      JMP DELE      DELETE PREVIOUS CHAR. 
      CPA BKSPC     BACKSPACE KEY?
      JMP DELE2     DELETE PREVIOUS CHARACTER.
      LDB CHC 
      CPB IOSYZ     BUFFER FULL (ASCII)?
      JMP IASC2     YES. LOOK FOR CAR RETURN. 
* 
* INSERT CHARACTER IN BUFFER
* 
IBIN3 LDB CHC 
      SLB,INB,RSS   SKIP IF LOWER CHAR
      ALF,SLA,ALF   UPPER. ALWAYS SKIP
X.6   XOR BUF,I     COMBINE LOWER WITH PRIOR
      XOR O40       INSERT/REMOVE BLANK 
      STA BUF,I     STORE IN BUFFER 
      SLB,RSS       IF LOWER CHAR,
      ISZ BUF       ADD 1 TO BUFFER ADDRESS 
INA4  STB CHC       CHARS IN BUFFER 
      LDA EQT3,I    GET MODE
      SSA,RSS 
      JMP IASC2     ASCII. GO READ CHAR.
      CPB IOSYZ     BUFFER FULL (BINARY)? 
      JMP STAT      YES, EXIT.
      JSB RDCH      READ BINARY CHARACTER 
      JMP IBIN3     GO STORE IT.
* 
      SKP 
DELE  LDA O137      OUTPUT BACK-ARROW.
      JSB TYO 
DELE2 LDB CHC       DELETE A CHARACTER. 
      SZB,RSS 
      JMP IASC2     BUFFER EMPTY: IGNORE
      CCA 
      ADB A 
      SLB,RSS       IF LEFT CHAR DELETED, 
      JMP INA4      DONE. 
      ADA BUF 
      STA BUF       BACK UP POINTER 
      LDA BUF,I 
      AND O377      GET RIGHT HALF
      JMP X.6       GO PURGE IT.
* 
RDEL  JSB KILL      CANCEL INPUT. 
      JMP INGO
* 
KILL  NOP 
      LDA O134      OUTPUT BACKSLASH. 
      JSB TYO 
      LDA O15       OUTPUT CARRIAGE RETURN. 
      JSB TYO 
      LDA O12       OUTPUT LINE FEED. 
      JSB TYO 
      JMP KILL,I
* 
TSTCH NOP           CHECK FOR CONTROL CHARACTER 
      CPA O33      ESCAPE (OPERATOR BREAK)? 
      JMP CC        YES. GO PROCESS IT. 
      CPA O176
      JMP CC
      JMP TSTCH,I 
* 
CC    LDA $BUSY     REMOTE I/O BUSY?
      SZA,RSS 
      JMP *+3       NO, ACCEPT THE INTERRUPT. 
      STA $ESC      YES, SET $ESC 
      JMP TSTCH,I    AND IGNORE INTERRUPT.
      CLA           OPERATOR BREAK. 
      STA CHC 
      INA          FLAG OPERATOR INPUT. 
      STA OPINT 
      JMP CLEAR    CLEAR THE DRIVER.
* 
* PROCESS CARRIAGE RETURN: END OF MESSAGE 
* 
IRETN LDA O12       ECHO LINEFEED 
      JSB TYO 
      LDB CHC       THESE SIX INSTRUCTIONS ...
      SZB           DEFAULT A NULL INPUT ...
      JMP STAT
      LDA LBLNK     INTO A SINGLE BLANK.
      STA BUF,I 
      ISZ CHC 
      JMP STAT
* 
* STATUS SECTION
* 
CLEAR BSS 0 
STAT  LDA EQT2,I    GET STATUS WORD 
      AND MST       (37400) PRUNE PRIOR STATUS
      STA EQT2,I    STORE STATUS WORD 
      LDB CHC 
      LDA EQT3,I    DOES USER WANT CHARS OR WORDS?
      SLA,ELA       SKIP IF WORDS. BINARY FLAG TO E 
      RBL,SLB       CHARS. DOUBLE AND SKIP. 
      INB           WORDS. ROUND COUNT UP.
      ERB           HALVE COUNT, COMBINE BINARY BIT 
      STB EQT3,I    STORE IN XMIT LOG.
      CLB           CLEAR DRIVER-BUSY FLAG. 
      STB DFLG
* 
IDLE  LDA DA        ECHO INPUT
      JSB ISYNC     IDLE LOOP 
      JSB TSTCH     CHECK FOR CONTROL CHARACTER 
      JMP IDLE      IGNORE INPUT
* 
      SKP 
* 
*  OUTPUT SECTION 
* 
TTYO  JSB OUTGO     DUMP THE BUFFER 
      JMP STAT      ALL DONE. 
* 
OUTGO NOP           SUBROUTINE TO DUMP BUFFER 
      CMA 
      STA CHX       -CHAR COUNT-1 
      CLB 
      STB CHC       INITIALIZE OUTPUT COUNT 
OUTLP JSB GETCH     GET CHAR FROM BUFFER
      SSB,RSS       IF BINARY, OR 
      SEZ           IF HONESTY MODE,
      JMP OUTC      GO OUTPUT CHAR. 
      LDB CHX 
      CPA O137      IS IT A LEFT ARROW? 
      INB,SZB       IS IT ALSO LAST CHARACTER?
      JMP OUTC      NO. GO OUTPUT.
      JMP OUTGO,I   SUPPRESS CR/LF. 
* 
OUTC  JSB TYO 
      JMP OUTLP 
* 
GETCH NOP           GET CHAR FROM BUFFER
      LDA BUF,I     GET WORD CONTAINING 
      LDB CHC       NEXT CHAR.
      SLB,RSS 
      ALF,ALF       MOVE TO RIGHT HALF
      AND O177      ISOLATE LOWER CHARACTER.
      SLB,INB       IF CURRENT CHAR IS LOWER, 
      ISZ BUF       ADD 1 TO BUFFER ADDRESS 
      STB CHC 
      LDB FUNC
      BLF,ELB       HONESTY TO E
      BLF           BINARY TO SIGN
      ISZ CHX       CHARS ALL GONE? 
      JMP GETCH,I   NO, RETURN. 
      SSB,RSS       BINARY, OR
      SEZ           HONESTY MODE? 
      JMP OUTGO,I   YES. DONE.
      LDA O15       CAR RTN 
      JSB TYO       OUTPUT THE CHARACTER
      LDA O12 
      JSB TYO       OUTPUT LINEFEED.
      JMP OUTGO,I   ALL DONE. 
* 
      SKP 
TYO   NOP           CHAR OUTPUT SUBROUTINE
      LDB LOUT      PRINT COMMAND 
I.9   OTB TTY       OUTPUT INSTRUCTION
      JSB ISYNC     OUTPUT THE CHARACTER
      CPA O177      CHECK ECHO. BREAK?
      JMP TYO,I     NO. EXIT. 
      LDA LOUT
      INA,SZA       WAIT FOR BREAK CHAR ... 
      JMP *-1       TO FINISH COMING IN.
      LDA DB
      JSB ISYNC     GET AN INPUT CHAR 
      JSB TSTCH     CHECK FOR CONTROL 
      CPA O177      RUBOUT? 
      RSS 
      JMP TYO,I     NO, RETURN. 
      JSB KILL      YES, OUTPUT /, CR, LF.
      JMP STAT      FAKE COMPLETION.
      SKP 
* CONSTANT, FLAG, AND STORAGE SECTION 
* 
A     EQU 0 
B     EQU 1 
      SUP 
* 
SAVAX NOP           STORAGE AREA
SAVBX NOP           FOR SAVING REGISTERS
SAVEX NOP           WHILE PROCESSING INTERRUPT. 
* 
SAVA  NOP           EQT ADDRESS 
FUNC  NOP           REQUESTED FUNCTION
RQA   NOP           REQUEST ADDRESS 
DFLG  NOP           DRIVER BUSY FLAG.  =0, NOT BUSY 
* 
M3    OCT -3
O10   OCT 10       BACKSPACE CHAR(CONT. H)
O12   OCT 12
O15   OCT 15
O17   OCT 17
O40   OCT 40
O77   OCT 77
O100  OCT 100 
O134  OCT 134 
O137  OCT 137 
BAKSP EQU O10 
BKSPC OCT 31
O33   OCT 33        ESCAPE KEY. 
O176  OCT 176 
O177  OCT 177 
RUBO  EQU O177
O377  OCT 377 
LBLNK OCT 20000 
IBIT  OCT 100000
MST   OCT 37400 
LIAI  LIA 0 
OTBM  OCT 5100
O1100 OCT 1100
CH    NOP 
* 
EQT2  NOP 
EQT3  NOP 
BUF   NOP 
BUFS  NOP 
IOSYZ NOP 
CHC   NOP 
CHX   NOP 
* 
* 
LOUT  OCT 120000    PRINT OUTPUT
DA    OCT 160000    ECHO INPUT
DB    OCT 140000    NON-ECHO INPUT
OPINT NOP 
* 
      BSS 0         CHECK SIZE
* 
      END 
                                                                                                                                                                                                                        