;***************************************************************; ; ; ; VIS50A 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 ; ;***************************************************************************** PAGE ;***************************************************************************** ; ; Terminal Definition Area ; ;***************************************************************************** LINE = 24. ; Lines/page (screen height). COLUMN = 80. ; Columns/line (screen width). 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 ; ; Correct out-of-range branches. ;JIN: JMP INPUT CRT.: JMP CRT JOUT: JMP OUTPUT PAGE ; 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 1$: CMPB D1,#'G ; attribute? BNE 2$ MOVB #2,ESCNT(A0) BR SETSK2 2$: LEA A2,OT.TAB ; CHK THE REST 3$: TSTB @A2 ; end BEQ OUTX CMPB D1,(A2)+ ; Eq? BEQ 4$ INC A2 BR 3$ 4$: MOVB @A2,D1 BIT #^H80,D1 ; sleep needed? BEQ OUTX LEA A6,CLREOS MOVI 3,D3 BR DOINS SETSKP: MOVB #1,ESCNT(A0) ; set count to 1 SETSK2: MOVB #'6,D1 ; fake out BR OUTX SETSK3: MOVB #7,ESCNT(A0) BR SETSK2 SETNUL: LEA A0,T.OQX(A5) QINS A0 CLR (A0)+ MOV #330.,(A0)+ LEA A2,CRTNUL SETADR: MOV A2,@A0 JMP OUTX SET24: LEA A6,POS24 MOVI 3,D3 ; SETB ESCNT2(A0) ; SET TO KILL NEXT EREOL DOINS: MOV A6,D1 LEA A0,T.OQX(A5) QINS A0 CLR (A0)+ MOV D3,(A0)+ ; length MOV D1,@A0 LCC #4 CLR D1 RTN NOOUT: CMPB ESCNT(A0),#7 BNE NOOUTS CMPB D1,#^H19 ; ^Y BEQ NOOUTC CLR D1 LCC #4 RTN NOOUTC: CLRW ESCNT(A0) NOOUTE: CLR D1 NOOUTF: CLRB ESCNT(A0) LCC #4 RTN NOOUTS: CMPB ESCNT(A0),#2 ; ^G? BNE NOOUTE MOVB #40,D1 BR NOOUTF POS24: BYTE '=,'7,40 ;,33,50 ; ^H18,01 CLREOS: BYTE 'k,33,'J EVEN 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 ;Null characters for long commands CRTCLR: BYTE 233,'T,233,'s,233,'v,^H1A 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,200,200,200 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,200,200,200 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,200,200,200 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,200,200,200 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,200,200,200 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,200,200,200 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,200,200,200 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,200,200,200 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,200,200,200 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,200,200,200 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,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-. 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 .