;***************************************************************;
; ;
; TLL920 TERMINAL UNIT ROUTINE ;
;****************************************************************
;* *
;* Alpha Base Modified *
;* *
;****************************************************************
;
;
;
SEARCH SYS
SEARCH TRM ; Terminal Service Equates (octal).
OBJNAM .TDV
RADIX 16 ; Hex used throughout.
; Equates of non-printing ASCII chars used in this driver.
BS =08 ; backspace
TAB =09 ; (horizontal) tab
CR =0D ; carriage-return
LF =0A ; line-feed
CTRL.U =15 ; ^U
ESC =1B ; escape
ES$ =9B ; escape with bit-7 on
SPACE =20 ; space
RUB =7F ; rubout
SEMI =3B ; semicolon
NULL =00 ; null
PARITY =80 ; added to char to set parity bit
CNTRL =40 ; subtracted to make control char
ESCON=^H4000 ; esc found bit
$CTLA =^H01 ; control a
$BS =^H08 ; backspace
$TAB =^H09 ; tab
$LF =^H0A ; line- feed
$VT =^H0B ; vertical tab
$FF =^H0C ; right- arrow, formfeed
$CR =^H0D ; carriage return
$CTLU =^H15 ; control u
$CTLZ =^H1A ; control z
$ESC =^H1B ; escape char
$SPACE =^H20
$COMMA =^H2C ; comma
$SEMC =^H3B ; semicolon
$LB =^H3C ; <
$RUB =^H7F ; rubout
BIT7 =^H80 ; set bit 7
$CTLA7 =1+BIT7 ; ^A- don't strip first
$CR7 =$CR+BIT7 ; carriage return
$ESC7 =$ESC+BIT7 ; escape with bit7 set
CTLMSK =^H1F ; for masking to control chars
;*****************************************************************************
;
; CONFIGURING THIS DRIVER
;
;*****************************************************************************
; Macro to send leadin character and control character
DEFINE CNTRL CHTER ; Control Character Macro
BYTE CHTER-^H40,0
ENDM
TLL920: WORD ^O2000 ; NEW FORMAT DRIVER
BR JIN ; Input Routine
BR JOUT ; Output Routine
BR ECHO ; Echo Routine
BR CRT. ; Crt Control
RTN; INIT ; Initialization routine
WORD IMPSIZ ; Impure zone size
BYTE LINE,COLUMN ; Screen dimensions
WORD B16.31 ; which TCRT functions
WORD B0.15 ; Bitmap showing
WORD B48.63 ;
WORD B32.47 ; are implemented.
WORD B64.79 ;
; Impure area (storage allocated to the terminal at system init time).
; Equates relative to (A0).
ESCNT= 4 ; esc chr skip counter
ESCNT2= 5
ISTATE = 0 ; Input state (see equates at INPUT).
TFLAGS = 2 ; Terminal state (flags: see below).
EOLSW = 6
O.CNT= 8
G0SW= 9
XYPTR= 0A
IMPSIZ = 10. ; Impure area size.
CH2 =^H01 ; d ; ch2 flags 'function char #2 ok'
FIP =^H10 ; e ; bsh = function in progress flag
; Terminal hardware state.
PAGE
INIT:
;*****************************************************************************
; This routine is called once at system initialization time.
; The impure area is initialized here.
;*****************************************************************************
; MOV T.IMP(A5),A0 ; Find impure area.
; CLRW OSTATE(A0)
; MOV #I.INIT,ISTATE(A0) ; Set input state to initial state.
RTN
;* ECHO *
;****************
; Special echo processing is done here
; Rubouts will backspace and erase the previous character
; Control-U will erase the entire line by backspacing and erasing
ECHO: CMP D1,#$CTLU ; Control-U
JEQ CTRLU
CMP D1,#$RUB ; Rubout
JNE ECHX
; Rubouts are handled by the old backspace-and-erase game
; D6ecial handling must be performed if we are rubbing out a tab
; R3 contains the character being rubbed out
RUBOUT: CMP D3,#$TAB ; Was it a TAB?
BEQ RBTB ; Yes
; Rubout was of a printable character - Queue up the backspace sequence
KRTG: MOV #3,D3 ; Set character count
LEA A6,ERUB ; Set buffer address
MOV A6,D1
TRMBFQ ; Queue the backspace sequence
RTN
ERUB: BYTE $BS,$SPACE,$BS,0
; Rubout was of a TAB - we must calculate how big the TAB was and backup over it
RBTB: CLR D3
MOVW T.POB(A5),D3 ; Set beginning position count
MOV T.ICC(A5),D2 ; Set input character count
MOV T.IBF(A5),A6 ; Set input buffer base
KRTS: DEC D2 ; Done with scan?
BMI KRTQ ; Yes
MOVB (A6)+,D1 ; Scan forward calculating position
CMP D1,#$TAB
BEQ KRTT
CMP D1,#$CR
BEQ KRTC
CMP D1,#$ESC
BEQ KRTI
CMP D1,#$SPACE ; Control-Char
BLO KRTS
CMP D1,#'y ; why doesn't it check for { | } ??
BHI KRTS
KRTI: INC D3 ; Increment position for one character
BR KRTS
KRTT: ADD #10,D3 ; Adjust position for TAB
AND #~7,D3
BR KRTS
KRTC: CLR D3 ; Clear position for CR
BR KRTS
KRTQ: COM D3 ; Calculate necessary backspaces
AND #7,D3
INC D3
MOV #10,D1 ; Set immediate backspace character
TRMBFQ ; Queue the backspaces
ECHX: RTN
; Echo a CONTROL-U by erasing the entire line
CTRLU: TST D6 ; No action if nothing to erase
BEQ CTUX
CLR D3
MOVW T.POO(A5),D3 ; Calculate backspace number to erase THE LINE
SUBW T.POB(A5),D3
BEQ ECHX
CMP D3,T.ILS(A5) ; Insure not greater than terminal width
BLOS CLUA
MOV T.ILS(A5),D3
CLUA: MOV #$BS,D1 ; Queue up backspaces
TRMBFQ
ASL D1,#2
TRMBFQ
MOV #$BS,D1
TRMBFQ
CTUX: RTN
PAGE
;****************
;* INPUT *
;****************
;
INPUT:
MOV T.IMP(A5),A3 ; setup impure area
ANDW #~^H0FF80,D1 ; just data
BIT #FIP,@A3 ; is FIP (function in progress) flag on?
BNE FUNCTE ; yes- branch
BIT #IMI,@A5
BNE GR1 ; IMAGE MODE ON DONT TRAnslate
CMPB D1,#^H08 ; is it back space key ?
BNE GR ; no just return
MOVB #^H7F,D1
GR: RTN
GR1: CMPB D1,#01 ; CTL A?
BNE GR
CLRB D1 ; clear the byte
BIS #FIP+CH2,@A3 ; SET BOTH CODES
BR INER
INE: ; ESC FOUND
INXT: RTN
INER: CLR D1
RTN ; return without telling system
CHRS: ANDW #~CH2,@A3 ; clear
RTN
FUNCTE:
BIT #CH2,@A3 ; MIDDLE of funct?
BEQ FUNCRC ; no - its time to translate
LEA A6,FNCTAB ; pu @ of function table
FNLP1:
TSTB @A6
BNE 1$
MOVB D1,ESCNT+1(A3) ; set for ^G function
BR SETCG
1$: CMPB D1,(A6)+
BEQ DOFNCT
INC A6
BR FNLP1 ; go loop
DOFNCT: MOVB @A6,D1
BIT #^H80,D1 ; F5 of F8?
BEQ CHRS ; NO - its reqular replace
MOVB D1,ESCNT+1(A3) ; SAVE OUTPUT
SETCG: MOVB #07,D1 ; set ^G
BR CHRS
FUNCRC: ANDW #~FIP,@A3 ; reset sw
CMPB D1,#$CR ; cr part of funct
BNE 2$
CMPB T.LCH(A5),#07 ; ^G LAST?
BNE INER
MOVB ESCNT+1(A3),D1
2$: CLRB ESCNT+1(A3) ; just incase
RTN
;------------------- OUTPUT ROUTINE
RADIX 8
OUTPUT: ; routine to override tll950
MOV T.IMP(A5),A0
TSTB ESCNT(A0) ; Alpha base codes
JNE NOOUT
BIT #ESCON,@A0 ; esc sequence?
BNE TSTSEQ
CMPB D1,#^H1B ; esc ?
BNE OUTX
BIS #ESCON,@A0
OUTX:
LCC #10
RTN
TSTSEQ:
ANDW #~ESCON,@A0 ; clear the indicator
CMPB D1,#'= ; cursor?
BEQ OUTX ; yes go to it
CMPB D1,#'.
BEQ SETSKP
CMPB D1,#'f ; line 25 msg?
JEQ SET24
CMPB D1,#'| ; set function
BEQ SETSK3
CMPB D1,#'Y ; clr eos?
BEQ EOLCHK
CMPB D1,#'* ; clr scrn?
BNE 1$
LEA A6,CRTCLR+1
MOV #23.,D3
BR DOINS
RADIX 8
;********************
;* CRT *
;********************
;SPECIAL CRT CONTROL PROCESSING
;D1 CONTAINS THE CONTROL CODE FOR X,T POSITIONING OR SPECIAL COMMANDS
;IF D1 IS POSITIVE WE HAVE SCREEN POSITIONING (ROW IN HI BYTE, COL IN LO BYTE)
;IF D1 IS NEGATIVE WE HAVE THE SPECIAL COMMAND IN THE LOW BYTE
CRT: TSTW D1 ;IS IT CURSOR POSITION?
BMI CRTS ; NO
;CURSOR POSITIONING - D1 CONTAINS X,Y COORDINATES
TTYI ;SEND POSITION COMMAND
BYTE 233,75,0,0
ADDW #17437,D1 ;ADD POSITION OFFSETS
SWAB D1 ;SEND ROW FIRST
TTY
SWAB D1 ;SEND COLUMN SECOND
TTY
SLEEP #400. ; **** May need tweaking
RTN
;SPECIAL COMMANDS - D1 CONTAINS THE COMMAND CODE IN THE LOW BYTE
CRTS: MOVB D1,D1 ;STRIP THE HIGH BYTE
BNE CRTU ; AND BRANCH UNLESS CLEAR SCREEN
TTYL CRTCLR ;SPECIAL CASE FOR CLEAR SCREEN
RTN
;COMMAND PROCESSING PER DIRECTOR TABLES
CRTU: CMPB D1,#CRCB-CRCA ;CHECK FOR VALID CODE
BHI CRTX ; AND BYPASS IF BAD
PUSH A2
LEA A2,CRCA-1 ;INDEX THE TABLE
CLR D7
MOVB D1,D7
ADD D7,A2 ;ADD COMMAND CODE
MOVB @A2,D7 ;PICK UP DATA FIELD OFFSET
ADD D7,A2 ;MAKE ABSOLUTE DATA ADDRESS
TTYL @A2 ;PRINT THE DATA FIELD
POP A2
CMPB D1,#1 ; home cursor?
BEQ CRTZ ; sleep a little
CMPB D1,#10.
BNE CRTX
CRTZ: TTYL CRTNUL
CRTX: RTN
;Null characters for long commands
CRTCLR: BYTE 233,52,233,''
CRTNUL: BYTE 200,200,200,200,200,200,200,200,200,200,200,200,200,200,200
BYTE 200,200,200,200,200,200,200,200,200,200,200,200,0
EVEN
; Byte offset and data tables follow for all commands
CRCA: BYTE C1-.,C2-.,C3-.,C4-.,C5-.,C6-.,C7-.,C8-.
BYTE C9-.,C10-.,C11-.,C12-.,C13-.,C14-.
BYTE C15-.,C16-.,C17-.,C18-.,C19-.,C20-.,C21-.,C22-.
BYTE C23-.,C24-.
PAGE
CRCB:
C1: CNTRL '^ ; Cursor Home (move to column 1,1)
C2: CNTRL 'M+200 ; Cursor Return (move to column 1)
C3: CNTRL 'K ; Cursor Up
C4: CNTRL 'J ; Cursor Down
C5: CNTRL 'H ; Cursor Left
C6: CNTRL 'L ; Cursor Right
C7: LDIN '# ; Lock Keyboard
C8: LDIN '" ; Unlock Keyboard
C9: LDIN 'T ; Erase to End of Line
C10: LDIN 'Y ; Erase to End of Screen
C11: LDIN ') ; Enter Background Display Mode (reduced intensity)
C12: LDIN '( ; Enter Foreground Display mode (normal intensity)
C13: LDIN '& ; Enable Protected fields
C14: LDIN '' ; Disable Protected Fields
C15: LDIN 'R ; Delete Line
C16: LDIN 'E ; Insert Line
C17: LDIN 'W ; Delete Character
C18: LDIN 'Q ; Insert Character
C19: LDIN '? ; Read Cursor Address
C20: BYTE 0 ; Read Character at Current Cursor Position
C21: LDIN '^ ; Start Blinking Field
C22: LDIN 'q ; End Blinking Field
C23: ATTR '8 ; Start Line Drawing Mode (enable alternate character set)
C24: ATTR '0 ; End Line Drawing Mode (disable alternate character set)
EVEN