;***************************************************************************; ; ; ; ; ; VT52 Terminal Driver ; ; ; ; ; ;***************************************************************************; ;Copyright (C) 1986 by UltraSoft. All Rights Reserved. ; ;Written by: David Pallmann ; ;100 20-Jul-86 created. /DFP OBJNAM .TDV SEARCH SYS SEARCH SYSSYM SEARCH TRM BS=10 LF=12 ESC=33 ;Define capability flags ; TDVFLG=TD$EOS!TD$EOL!TD$MLT ;********; ; VT52 ; ;********; ;Terminal driver communications area VT52: WORD TD$NEW ; terminal attributes 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: ; erase to end of screen ; erase to end of line 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 BS,40,BS,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 ;******************** ;* 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 ESC,'Y,0,0 ROR D1,#8. ;SEND ROW FIRST ORB #200,D1 ;SET HIGH BIT ADDB #37,D1 ;ADD OFFSET TTY ;SEND ROW ROL D1,#8. ;SEND COLUMN SECOND ORB #200,D1 ;SET HIGH BIT ADDB #37,D1 ;ADD OFFSET TTY ;SEND COLUMN 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 ESC,'H,ESC,'J,0 EVEN CRTZ: 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 ;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-. BYTE C21-.,C22-.,C23-.,C24-.,C25-.,C26-.,C27-.,C28-.,C29-.,C30-. BYTE C31-.,C32-.,C33-.,C34-.,C35-. BYTE C36-.,C37-.,C38-.,C39-.,C40-. BYTE C41-.,C42-.,C43-.,C44-.,C45-. BYTE 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-. CRCB: C1: BYTE ESC,'H,0 ;CURSOR HOME C2: BYTE 215,0 ;CURSOR RETURN C3: BYTE ESC,'A,0 ;CURSOR UP C4: BYTE LF,0 ;CURSOR DOWN C5: BYTE BS,0 ;CURSOR LEFT C6: BYTE ESC,'D,0 ;CURSOR RIGHT C7: ;LOCK KEYBOARD C8: BYTE 0 ;UNLOCK KEYBOARD C9: BYTE ESC,'K,0 ;ERASE TO END OF LINE C10: BYTE ESC,'J,0 ;ERASE TO END OF SCREEN C11: ;PROTECT FIELD C12: ;UNPROTECT FIELD C13: ;ENABLE PROTECTED FIELDS C14: ;DISABLE PROTECTED FIELDS C15: C16: C17: C18: C19: C20: C21: C22: BYTE 0 C23: BYTE ESC,'F,0 ;ENTER GRAPHICS MODE C24: BYTE ESC,'G,0 ;EXIT GRAPHICS MODE C25: C26: C27: C28: C29: BYTE 0 C30: C31: BYTE ' ,0 C32: BYTE '<,0 C33: BYTE '>,0 C34: C35: BYTE ' ,0 C36: C37: BYTE 0 C38: C39: C40: C41: C42: C43: C44: C45: BYTE '+,0 C46: BYTE '-,0 C47: BYTE '|,0 C48: BYTE '+,0 C49: ; solid block C50: ; slant block C51: BYTE 'O,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: ; 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 EVEN WORD 0 END .