;**************************************************************************;
; ;
; TELEVIDEO 912 TERMINAL DRIVER ;
; ;
; This driver was written by Tom Dahlquist for the National Farmer's Union ;
; Insurance Co. It is compatible with AMOS/L 1.3 and with AlphaBase 4.8. ;
; Since combinations of attributes are not supported by the 912, I have ;
; substituted single attributes for them; e.g., if the program attempts to ;
; set reverse/blink I do blink, and so forth. Occasional screen weirdnesses
; with 4.8 are due to the fact that they still have some ESCape sequences ;
; hard-coded into it, not due to errors in the driver. ;
; ;
;**************************************************************************;
; ASL-02012-00
SEARCH SYS
SEARCH SYSSYM
SEARCH TRM
OBJNAM 0,0,[TDV]
DEFINE CNTRL CHTER ; Control Character Macro
BYTE CHTER-^H40,0
ENDM
;********************
;* TVI912 *
;********************
;Terminal driver communications area
TVI912: WORD TD$NEW!TD$TCH ; terminal attributes
BR JMPINP ; input routine [102]
RTN ; output routine
BR ECHO ; echo routine
BR JMPCRT ; crt control
RTN ; INIT routine
WORD 4 ; impure area of one longword.
ROWCNT:
BYTE 24. ; number of rows
COLCNT:
BYTE 80. ; number of columns
LWORD TDVFLG ; terminal has:
; insert/delete line
; insert/delete character
; reverse video attribute
; dim video attribute
; blinking video attribute
; underlined video attribute
; erase to end of screen
; erase to end of line
; split screen
; status line
; is an AlphaTERMINAL
; line graphics
BR JMPTCH ; entry for TRMCHR routine
JMPINP: JMP INP ; go handle input [102]
JMPCRT: JMP CRT ; go handle TCRT codes
JMPTCH: JMP TCH ; go handle TRMCHR call
;********************
;* ECHO *
;********************
;SPECIAL ECHO PROCESSING IS PERFORMED HERE
;RUBOUTS WILL BACKSPACE AND ERASE THE PREVIOUS CHARACTER
;CONTROL-U WILL ERASE THE ENTIRE LINE BY BACKSPACING AND ERASING
ECHO: CMPB D1,#25 ;CONTROL-U
BEQ CTRLU ;
CMPB D1,#177 ;RUBOUT
BNE ECHX ;
;RUBOUTS ARE HANDLED BY THE OLD BACKSPACE-AND-ERASE GAME
;SPECIAL HANDLING MUST BE PERFORMED IF WE ARE RUBBING OUT A TAB
;D6 CONTAINS THE CHARACTER BEING RUBBED OUT
RUBOUT: CMPB D6,#11 ;WAS IT A TAB?
BEQ RBTB ; YES
CMPB D6,#40 ; no, was it a control char.? [103]
BLO RBX ; yes - [103][104]
;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 ; INTO D1
TRMBFQ ;QUEUE THE BACKSPACE SEQUENCE
RBX: RTN ; [103]
ERUB: BYTE 10,40,10,0
;RUBOUT WAS OF A TAB - WE MUST CALCULATE HOW BIG THE TAB WAS AND BACKUP OVER IT
RBTB: CLR D3 ;PRECLEAR 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
CMPB D1,#11 ; TAB
BEQ KRTT
CMPB D1,#15 ; CR
BEQ KRTC
CMPB D1,#33 ; ALTMODE
BEQ KRTI
CMPB D1,#40 ; CONTROL-CHAR
BLO KRTS
CMPB D1,#172
BHI KRTS
KRTI: INC D3 ;INCREMENT POSITION FOR ONE CHARACTER
BR KRTS
KRTT: ADD #10,D3 ;ADJUST POSITION FOR TAB
AND #^C7,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 ;PRECLEAR 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 #10,D1 ;QUEUE UP BACKSPACES
TRMBFQ
ASL D1,#2 ;QUEUE UP SPACES
TRMBFQ
MOV #10,D1 ;QUEUE UP BACKSPACES
TRMBFQ
CTUX: RTN
PAGE
;********************
;* TCH *
;********************
;Handle TRMCHR call
;A1 points to argument block, A2 indexes this TDV, D2 contains flags
;Can only use A1,A2,A6,D1,D2,D6,D7
TCH: MOV TD.FLG(A2),TC.FLG(A1) ; transfer flags
; MOV JOBCUR,A6 ; index job
; MOV JOBTRM(A6),A6 ; index terminal control area
; MOV T.IMP(A6),A6 ; index impure area
CLR D6 ; preclear register
MOVB ROWCNT(A2),D6 ; get row count
MOVW D6,TC.ROW(A1) ; transfer row count
MOVB COLCNT(A2),D6 ; Get column count [103]
MOVW D6,TC.COL(A1) ; transfer column count. [103]
; MOVW @A6,TC.COL(A1) ; transfer column count [103]
CLRW TC.CLR(A1) ; no colors
MOVW #0,TC.TSL(A1) ; set length of top status line [101]
MOVW #0,TC.SSL(A1) ; set length of shifted status line [101]
MOVW #0,TC.USL(A1) ; set length of unshifted status line [101]
MOV D2,D7 ; get TRMCHR argument flags [101]
AND #TC$BMP,D7 ; does user want bitmap [101]
BEQ 20$ ; no - skip transfer code [101]
; user has requested bitmap -- return to him
PUSH A1 ; save argument block index [101]
ADDW #TC.BMP,A1 ; index bitmap return area [101]
LEA A6,TCHBMP ; index our bitmap [101]
MOV #<256./16.>-1,D7 ; get amount to transfer [101]
10$: MOVW (A6)+,(A1)+ ; transfer to user
DBF D7,10$ ; loop until done
POP A1 ; restore register
20$: RTN ; return to TRMCHR monitor routine
;********************
; INP *
;********************
;
;
INP: BMI INMLT ; skip if multi-byte processing
ANDB #177,D1 ; strip hi byte...
CMPB D1,#1 ; function code?
BEQ INPM ; yes - could be multi-byte sequence
LCC #0 ; no - normal processing
RTN
INPM: LCC #PS.N ; possible multi-byte - return N flag
RTN
;Multi-byte processing is done here
;This occurs when TRMSER has accumulated all bytes of a multi-byte keystroke
;D0 contains the character count and A0 indexes the data string
;A5 indexes the terminal definition block and must be preserved
;The translated character must be returned in D1 for storage
;This routine may destroy only A0,A3,A6,D0,D6,D7
INMLT: MOVB (A0)+,D1 ; get the first character
DECB D0 ; no translation if single character
BEQ INMX
;Function codes require additional translation so that they become 200-237
MOVB (A0)+,D1 ; get the second character
CMPB D1,#'1 ; see if in range 1 and above...
BLO INMX ; if lower, no trans...
SUBB #'1,D1 ; offset so that Func 1 becomes 0
ORB #200,D1 ; set bit 7 on
BIT #T$XLT,@A5 ; are we doing translation?
BEQ INMNOT ; no - check for another translation
INMX: LCC #0 ; reset the flags
INMX2: RTN
;Come here if program is not doing translation and we must do our own
INMNOT: LEA A6,XLTTBL ; index the translation table
10$: MOVB (A6)+,D7 ; get character
BEQ INMX2 ; end of table - ignore the character
CMPB D1,D7 ; is it in the table?
BEQ 20$ ; yes -
INC A6 ; no - bypass translation
BR 10$ ; loop for more -
;Come here to translate the character
20$: MOVB @A6,D1 ; translate the character
BR INMX
;Translation table
XLTTBL: BYTE 0,0
PAGE
;********************
;* 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
ADD #17437,D1 ;ADD POSITION OFFSETS
ROR D1,#8. ;SEND ROW FIRST
TTY
ROL D1,#8. ;SEND COLUMN SECOND
TTY
RTN
;SPECIAL COMMANDS - D1 CONTAINS THE COMMAND CODE IN THE LOW BYTE
CRTS: AND #377,D1 ;STRIP THE HIGH BYTE
BNE CRTU ; AND BRANCH UNLESS CLEAR SCREEN
TTYI ;SPECIAL CASE FOR CLEAR SCREEN
BYTE 233,52,0
EVEN
CRTZ: TTYL CRTNUL ; OUTPUT SOME NULLS
RTN
;COMMAND PROCESSING PER DIRECTOR TABLES
CRTU: PUSH A2 ;SAVE A2
CMP D1,#CRCB-CRCA ;CHECK FOR VALID CODE
BHI CRTX ; AND BYPASS IF BAD
LEA A2,CRCA-1 ;INDEX THE TABLE
ADD D1,A2 ;ADD COMMAND CODE
MOVB @A2,D1 ;PICK UP DATA FIELD OFFSET
ADD D1,A2 ;MAKE ABSOLUTE DATA ADDRESS
TTYL @A2 ;PRINT THE DATA FIELD
CMPB @A2,#36 ;SLEEP IF HOME COMMAND
BEQ CRTXZ
CMPB 1(A2),#100 ;SLEEP IF ERASE COMMAND
BHI CRTXZ
CRTX: POP A2 ;RESTORE A2
RTN
CRTXZ: POP A2 ;RESTORE A2
BR CRTZ ; AND GO OUTPUT NULLS
;Null characters for long commands
CRTNUL: BYTE 200,200,200,200,200,200,200,200,200,200,200,0
EVEN
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: ; start line drawing mode (enable alternate character set)
C24: ; end line drawing mode (disable alternate character set)
C25: ; set horizontal position
C26: ; set vertical position
C27: ; set terminal attributes
C28: ; cursor on
C29: BYTE 0 ; cursor off
C30: LDIN 'l ; start underscore
C31: LDIN 'm ; end underscore
C32: LDIN 'j ; start reverse video
C33: LDIN 'k ; end reverse video
C34: LDIN 'j ; start reverse blink
C35: LDIN 'k ; end reverse blink
C36: ; turn off screen display
C37: BYTE 0 ; turn on screen display
C38: BYTE '+,0 ; top left corner
C39: BYTE '+,0 ; top right corner
C40: BYTE '+,0 ; bottom left corner
C41: BYTE '+,0 ; bottom right corner
C42: BYTE '-,0 ; top intersect
C43: BYTE '|,0 ; right intersect
C44: BYTE '|,0 ; left intersect
C45: BYTE '-,0 ; bottom intersect
C46: BYTE '-,0 ; horizontal line
C47: BYTE '|,0 ; vertical line
C48: BYTE '+,0 ; intersection
C49: ; solid block
C50: BYTE 0 ; slant block
C51: BYTE '#,0 ; cross-hatch block
C52: BYTE '=,0 ; double line horizontal
C53: BYTE '|,0 ; double line vertical
C54: ; send message to function key line
C55: ; send message to shifted function key line
C56: ; set normal display format
C57: ; set horizontal split (follow with row code)
C58: ; set vertical split (39 char columns)
C59: ; set vertical split (40 char columns)
C60: ; set vertical split column to next char
C61: ; activate split segment 0
C62: ; activate split segment 1
C63: BYTE 0 ; send message to host message field
C64: BYTE '^,0 ; up-arrow
C65: BYTE '!,0 ; down-arrow
C66: BYTE ' ,0 ; raised dot
C67: BYTE '~,0 ; end of line marker
C68: BYTE '\,0 ; horizontal tab symbol
C69: BYTE '&,0 ; paragraph
C70: ; dagger
C71: BYTE ' ,0 ; section
C72: BYTE 'c,0 ; cent sign
C73: ; one-quarter
C74: ; one-half
C75: ; degree
C76: ; trademark
C77: ; copyright
C78: BYTE ' ,0 ; registered
C79: ; print screen
C80: ; reserved for set to wide mode
C81: ; reserved for set to normal mode
C82: ; enter transparent print mode
C83: ; exit transparent print mode
C84: ; begin writing to alternate page
C85: ; end writing to alternate page
C86: ; toggle page
C87: ; copy to alternate page
C88: ; insert column
C89: ; delete column
C90: ; block fill with attribute
C91: ; block fill with character
C92: ; draw a box
C93: ; scroll box up one line
C94: ; scroll box down one line
C95: ; select jump scroll
C96: ; select fast smooth scroll
C97: ; select med-fast smooth scroll
C98: ; select med-slow smooth scroll
C99: BYTE 0 ; select slow smooth scroll
C100: LDIN 'l ; start underscore/blink
C101: LDIN 'm ; end underscore/blink
C102: LDIN 'j ; start underscore/reverse
C103: LDIN 'k ; end underscore/reverse
C104: LDIN 'j ; start underscore/reverse/blink
C105: LDIN 'k ; end underscore/reverse/blink
C106: ; start underscore w/o space
C107: ; end underscore w/o space
C108: ; start reverse w/o space
C109: ; end reverse w/o space
C110: ; start reverse/blinking w/o space
C111: ; end reverse/blinking w/o space
C112: ; start underscore/blinking w/o space
C113: ; end underscore/blinking w/o space
C114: ; start underscore/reverse w/o space
C115: ; end underscore/reverse w/o space
C116: ; start underscore/reverse/blinking w/o space
C117: ; end underscore/reverse/blinking w/o space
C118: ; start blink w/o space
C119: ; end blink w/o space
C120: ; set cursor to blinking block
C121: ; set cursor to steady block
C122: ; set cursor to blinking underline
C123: ; set cursor to steady underline
C124: ; spare
C125: ; spare
C126: ; spare
C127: BYTE 0 ; spare
C128: BYTE 33,'=,'7,' ; select top status line
C129: ; end of all status line
C130: ; select unshifted status line
C131: ; select shifted status line
C132: ; select black text
C133: ; select white text
C134: ; select blue text
C135: ; select mag
neta text
C136: ; select red text
C137: ; select yellow text
C138: ; select green text
C139: ; select cyan text
C140: BYTE 0 ; select black reverse text
; AlphaBase uses the following CRT calls (as of 4.8) instead of the ones
; which are defined as standard.
C141: LDIN 'j ; select white reverse text
C142: LDIN 'k ; select blue reverse text
C143: LDIN 'j ; select magneta reverse text
C144: LDIN 'k ; select red reverse text
C145: LDIN 'l ; select yellow reverse text
C146: LDIN 'm ; select green reverse text
C147: BYTE 0 ; select cyan reverse text
EVEN
WORD 0
END