VIS50A: WORD ^O2000 ; NEW FORMAT DRIVER
RTN; 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 B0.15 ; Bitmap showing
WORD B16.31 ; which TCRT functions
WORD B32.47 ; are implemented.
WORD B48.63 ;
WORD B64.79 ;
; TCRT bitmap equates:
B0.15 = ^B0111111111111111 ; Rightmost (low-order) bit is bit 0.
B16.31 = ^B0000000000000000 ;
B32.47 = ^B0000000000000000 ;
B48.63 = ^B0000000000000000 ;
B64.79 = ^B0000000000000000 ;
FUNCS = 80. ; Size of bitmap, in bits.
; Impure area (storage allocated to the terminal at system init time).
; Equates relative to (A0).
ESCNT= 0 ; esc chr skip counter
ESCNT2= 1
ISTATE = 0 ; Input state (see equates at INPUT).
TFLAGS = 2 ; Terminal state (flags: see below).
ATTRIB = 4 ; Display attributes (see below).
HILOSW = 4 ; set intensity sw
LSTLIN = 5
OSTATE = 6
O.CNT= 8
G0SW= 9
XYPTR= 0A
IMPSIZ = 10. ; Impure area size.
; 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
;------------------- 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,#'J ; clr eos?
BEQ SETNUL
CMPB D1,#'* ; clr scrn?
BNE 1$
LEA A6,CRTCLR+1
MOV #300.,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
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,#10.
BNE CRTX
CRTZ: TTYL CRTNUL
CRTX: RTN
;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-.
CRCB:
C1: BYTE 233,'H,0 ;CURSOR HOME
C2: BYTE 215,0 ;CURSOR RETURN
C3: BYTE 13,0 ;CURSOR UP
C4: BYTE 12,0 ;CURSOR DOWN
C5: BYTE 10,0 ;CURSOR LEFT
C6: BYTE 14,0 ;CURSOR RIGHT
C7: BYTE 233,43,0 ;LOCK KEYBOARD
C8: BYTE 233,42,0,0 ;UNLOCK KEYBOARD
C10: BYTE 233,'k,233,'J,0 ;ERASE TO END OF SCREEN
C11: BYTE 233,'U,0 ;PROTECT FIELD
C12: BYTE 233,'T,0 ;UNPROTECT FIELD
C13: BYTE 233,'q,0 ;ENABLE PROTECTED FIELDS
C14: BYTE 233,'s,0 ;DISABLE PROTECTED FIELDS
C9: BYTE 233,'K,0 ;ERASE TO END OF LINE
EVEN
OT.TAB:
BYTE '(,'T ; protect off
BYTE '),'U ; protect on
BYTE '','s ; protect mode off
BYTE '&,'q ; protect mode on
BYTE 'T,'K ; clr eol
BYTE 'Y,^H80 ; clr eos
BYTE 0
EVEN
END