;This driver was given to me by Thomas G. Jeske, Data Processing ;Consultant, 4708 Kenneth Ave., Carmichael, CA 95608, so my generosity ;is an extension of Tom's. I learned of Tom and his QVT driver by ;talking to John Kjellman (Victorex, Walnut Creek, CA) at the '85 AMUS ;convention; it was the first day of my first AMUS convention (which ;was immensely informative and helpful for me), and we met over lunch at ;the bar. Curiously enough, many of my valuable contacts occurred at the ;bar (where it was least expensive to have lunch at THAT hotel), while ;having a sandwich and a beer. ; ;Those of you using this driver for your QUME will need to assure you ;have set the following Status line values (otherwise, DEFAULT is OK): ; ; MAIN Status: DUPLEX Edit Mode ; SET 2: 8N Data Word/Parity ; ;Note the following idiosyncracies (i.e., not yet fixed): The Down Arrow ;key does not work, but Line Feed does the down arrow. Also, some editing ;keys may not work in VUE or AlphaWRITE. I have not yet built a function ;key table or VUX file. Finally, C51 has been re-defined as "O" instead ;of "#", so that AlphaWRITE comes up looking decent. [You can leave it as ;as "#", but AlphaWRITE's initial screen, and information blocks, will ;look funny]. ; ;Thanks to AMUS and its friendly, helpful members. ;5/17/85, Roger Quillen (RWQ), Stockton, CA. ; ;********************************************************************** ;* * ;* QUME QVT-108 TERMINAL DRIVER * ;* * ;********************************************************************** ; ;File: QUME.M68 ; ; ;Edit History: ; ; SEARCH SYS SEARCH SYSSYM SEARCH TRM OBJNAM 0,0, [TDV] ;Define capability flags ; TDVFLG=TD$LID!TD$CID!TD$RVA!TD$DIM!TD$BLN!TD$UND!TD$EOS!TD$EOL ;******************** ;* QUME * ;******************** ;Terminal driver communications area QUME: WORD TD$NEW ; terminal attributes ; BR JMPINP ; input routine RTN ; input routine RTN ; output routine BR ECHO ; echo routine BR JMPCRT ; crt control RTN ; INIT routine WORD 4 ; impure area of one longword. BYTE 24. ; number of rows 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 ; line graphics JMPINP: JMP INP ; go handle input characters JMPCRT: JMP CRT ; go handle TCRT codes ;******************** ;* 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 ;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 RTN 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 ;******************** ;* INP * ;******************** ;Input character processing subroutine ;Return a negative flag to indicate possible multi-byte key codes ;Detect a negative flag which indicates the multi-byte processing return INP: BPL 10$ ; skip if NOT multi-byte processing ANDW #177,D1 MOVW T.STS(A5),D6 ANDW #T$ECS, D6 BEQ INX BR INMLT 10$: ANDW #177,D1 CMPB D1,#'; BNE 12$ MOVB #':,D1 BR 15$ 12$: CMPB D1,#': BNE 15$ MOVB #';,D1 15$: CMPB D1,#33 ; escape? BNE INX ; NO BR INPM INX: 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: CMPB D0,#1 BNE 01$ MOVW #27.,D1 BR INX 01$: CMPB D0,#2 BEQ 07$ MOV T.IBF(A5),A6 ADD T.ICC(A5),A6 03$: CMPB D0,#0 BEQ 05$ MOVB (A0)+,(A6)+ INC T.ICC(A5) INC T.BCC(A5) DEC D0 BR 03$ 05$: MOVB #0,D1 BR INX 07$: INC A0 MOVB (A0)+,D1 ; get the first character LEA A6,XLTTBL ; index the translation table 10$: MOVB (A6)+,D7 ; get character BEQ 05$ ; 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 - 20$: MOVB @A6,D1 ; translate the character BR INX ;Translation table XLTTBL: BYTE 64.,27. ; esc BYTE 65.,69. ; E BYTE 66.,88. ; X BYTE 67.,28. ; ^\ BYTE 0,0 ;******************** ;* CRT * ;******************** ;SPECIAL CRT CONTROL PROCESSING ;D1 CONTAINS THE CONTROL CODE FOR X,Y 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 commmands CRTNUL: BYTE 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-.,C9-.,C10-. BYTE C11-.,C12-.,C13-.,C14-.,C15-.,C16-.,C17-.,C18-.,C19-.,C20-. BYTE C21-.,C22-.,C23-.,C24-.,C25-.,C26-.,C27-.,C28-.,C29-.,C30-. BYTE C31-.,C32-.,C33-.,C34-.,C35-.,C36-.,C37-.,C38-.,C39-.,C40-. BYTE C41-.,C42-.,C43-.,C44-.,C45-.,C46-.,C47-.,C48-.,C49-.,C50-. BYTE C51-.,C52-.,C53-.,C54-.,C55-.,C56-.,C57-.,C58-.,C59-.,C60-. BYTE C61-.,C62-.,C63-.,C64-.,C65-.,C66-.,C67-.,C68-.,C69-.,C70-. BYTE C71-.,C72-.,C73-.,C74-.,C75-.,C76-.,C77-.,C78-.,C79-.,C80-. BYTE C81-.,C82-.,C83-.,C84-.,C85-.,C86-.,C87-.,C88-.,C89-.,C90-. BYTE C91-.,C92-.,C93-.,C94-.,C95-.,C96-.,C97-.,C98-.,C99-. BYTE C100-.,C101-.,C102-.,C103-.,C104-.,C105-.,C106-.,C107-. BYTE C108-.,C109-.,C110-.,C111-.,C112-.,C113-.,C114-.,C115-. BYTE C116-.,C117-.,C118-.,C119-.,C120-.,C121-.,C122-.,C123-. CRCB: PAGE C1: BYTE 30.,0 ; Cursor Home (move to column 1,1) C2: BYTE 200+13.,0 ; Cursor Return (move to column 1) C3: BYTE 11.,0 ; Cursor Up C4: BYTE 10.,0 ; Cursor Down C5: BYTE 8.,0 ; Cursor Left C6: BYTE 12.,0 ; Cursor Right C7: BYTE 233,43,0 ; Lock Keyboard C8: BYTE 0 ; Unlock Keyboard C9: BYTE 233,'T,0 ; Erase to End of Line C10: BYTE 233,'Y,0 ; Erase to End of Screen C11: BYTE 233,'),0 ; Enter Background Display mode (reduced intensity) C12: BYTE 233,'(,0 ; Enter Foreground Display mode (normal intensity) C13: BYTE 233,'&,0 ; Enable Protected fields C14: BYTE 233,'',0 ; Disable Protected Fields C15: BYTE 233,'R,0 ; Delete Line C16: BYTE 233,'E,0 ; Insert Line C17: BYTE 233,'W,0 ; Delete Character C18: BYTE 233,'Q,0 ; Insert Character C19: BYTE 233,'?,0 ; Read Cursor Address C20: BYTE 233,';,0 ; Clear unprotected to spaces C21: BYTE 233,'G,'2,0 ; Start Blinking Field C22: BYTE 233,'G,'0,0 ; End Blinking Field C23: BYTE 233,'$,0 ; Start Line Drawing Mode (enable alternate chr.) C24: BYTE 233,'%,0 ; End Line Drawing Mode (disable alternate chr.) C25: BYTE 233,'],0 ; Set Horizontal Position ;C26: BYTE 233,'[,0 ; Set Vertical Position C26: BYTE 233,'G,'4,0 ; Start Reversed Field C27: BYTE 233,'G,'0,0 ; End Reversed Field ;C27: BYTE 0 ; Set Terminal Attributes C28: BYTE 0 ; Cursor on C29: BYTE 0 ; Cursor off C30: BYTE 233,'G,'8,0 ; Start Underlined Field C31: BYTE 233,'G,'0,0 ; End Underlined Field C32: BYTE 233,'G,'4,0 ; Start reverse video field C33: BYTE 233,'G,'0,0 ; End reverse video field C34: BYTE 233,'G,'6,0 ; Start Reversed/ Blinking field C35: BYTE 233,'G,'0,0 ; End Reversed/Blinking field C36: BYTE 0 ; Turn off screen display C37: BYTE 0 ; Turn on screen display C38: BYTE 'f,0 ; Top left corner C39: BYTE 'g,0 ; Top right corner C40: BYTE 'e,0 ; Bottom left corner C41: BYTE 'h,0 ; Bottom right corner C42: BYTE 'n,0 ; Top intersect C43: BYTE 'l,0 ; Right intersect C44: BYTE 'm,0 ; Left intersect C45: BYTE 'o,0 ; Bottom intersect C46: BYTE 'k,0 ; Horizontal line C47: BYTE 'j,0 ; Vertical line C48: BYTE 'i,0 ; Center intersect C49: BYTE '*,0 ; Solid block C50: BYTE '@,0 ; Slant block C51: BYTE 'O,0 ; Cross-hatch block. 4/85: change to O C52: BYTE 0 ; Double line horizontal C53: BYTE 0 ; Double line vertical C54: BYTE 0 ; Send message to function key C55: BYTE 0 ; Send message to shifted function key C56: BYTE 0 ; Set normal display format C57: BYTE 0 ; Set horizontal split (follow with row code) C58: BYTE 0 ; Set vertical split (30 chr. columns) C59: BYTE 0 ; Set vertical split (40 chr. columns) C60: BYTE 0 ; Set vertical split column to next chr. C61: BYTE 0 ; Activate split segment 0 C62: BYTE 0 ; 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: BYTE ' ,0 ; Dagger C71: BYTE ' ,0 ; Section C72: BYTE ' ,0 ; Cent sign C73: BYTE ' ,0 ; One quarter C74: BYTE ' ,0 ; One half C75: BYTE ' ,0 ; Degree C76: BYTE ' ,0 ; Trademark C77: BYTE ' ,0 ; Copyright C78: BYTE ' ,0 ; Registered C79: BYTE 0 ; Print screen C80: BYTE 0 ; Set 130 col. screen C81: BYTE 0 ; Set 80 col. screen C82: BYTE 0 ; Enable transparent print mode C83: BYTE 0 ; Disable transparent print mode C84: BYTE 0 ; Begin writing to alternate page C85: BYTE 0 ; End writing to alternate page C86: BYTE 0 ; Toggle page C87: BYTE 0 ; Copy to alternate page C88: BYTE 0 ; Insert column C89: BYTE 0 ; Delete column C90: BYTE 0 ; Block fill with attribute C91: BYTE 0 ; Block fill with character C92: BYTE 0 ; Draw a box C93: BYTE 0 ; Scroll box up one line C94: BYTE 0 ; Scroll box down one line C95: BYTE 0 ; Select jump scroll C96: BYTE 0 ; Select fast smooth scroll C97: BYTE 0 ; Select med-fast smooth scroll C98: BYTE 0 ; Select med-slow smooth scroll C99: BYTE 0 ; Select slow smooth scroll C100: BYTE 0 ; C101: BYTE 0 ; C102: BYTE 233,'G,':,0 ; Start Blink/Underline C103: BYTE 233,'G,'0,0 ; End Blink/Underline C104: BYTE 233,'G,'<,0 ; Start Reverse/Underline C105: BYTE 233,'G,'0,0 ; End Reverse/Underline C106: BYTE 233,'G,'>,0 ; Start Reverse/Blink/Underline C107: BYTE 233,'G,'0,0 ; End Reverse/Blink/Underline C108: BYTE 233,'G,'1,0 ; Start blank field C109: BYTE 233,'G,'0,0 ; End blank field C110: BYTE 233,';,0 ; Clear unprotected to spaces C111: BYTE 0 ; C112: BYTE 0 ; C113: BYTE 0 ; C114: BYTE 0 ; C115: BYTE 0 ; C116: BYTE 0 ; C117: BYTE 0 ; C118: BYTE 'b,0 ; Top left curve C119: BYTE 'c,0 ; Top right curve C120: BYTE 'a,0 ; Bottom left curve C121: BYTE 'd,0 ; Bottom right curve C122: BYTE 0 ; C123: BYTE 0 ; EVEN WORD 0 END .