;**************************************************************************; ; ; ; HAZEL TERMINAL UNIT ROUTINE - for AMOS/L ; ; ; ;**************************************************************************; ; ASL-02012-00 ; NOTICE ; ;All rights reserved. This software is the property of Alpha Microsystems ;and the material contained herein is the proprietary property and trade ;secrets of Alpha Microsystems, embodying substantial creative efforts and ;confidential information, ideas and expressions, no part of which may be ;reproduced or transmitted in any form or by any means, electronic, ;mechanical, or otherwise, including photocopying or input into any ;information storage or retrieval system without the express written ;permission of Alpha Microsystems. ; ;CAUTION: Unauthorized distribution or reproduction of this material may ;subject you to legal action. ; ;Copyright (C) 1982 - Alpha Microsystems ; ;Edit History: ; ; Modified from AMS's SOROC driver on 11/22/82 by Gary S. DeCamp ; for WESTERN COMPUTER SYSTEMS, INC. ; Modified by Tim Beckner on 3/27/83 to add arrows. SEARCH SYS SEARCH SYSSYM SEARCH TRM OBJNAM HAZELE.TDV ;******************** ;* HAZEL * ;******************** ;TERMINAL DRIVER COMMUNICATIONS AREA HAZEL: WORD 2000 ;TERMINAL ATTRIBUTES BR INPUT ;INPUT ROUTINE RTN ;OUTPUT ROUTINE BR ECHO ;ECHO ROUTINE BR JMPCRT ;CRT CONTROL RTN ;no initialize routine yet WORD 0 ; (size) no impure area yet BYTE 24. ;number of rows BYTE 80. ;number of columns LWORD 101400 ;terminal has: ; insert/delete line ; erase to end of screen ; erase to end of line JMPCRT: JMP CRT ; go handle TCRT codes ;******************** ;* INPUT * ;******************** ;INPUT Routine ;Translate ^P to ^L, ^] to ^P, ^L to ^K, ^K to ^J ; INPUT: PUSH A2 ; PUSH A2 onto Stack AND #177,D1 ; Strip Hi-Order Bit LEA A2,XTBL ; Get Table Address INPUTC: CMPB D1,(A2)+ ; Is this the One? BEQ INPUTT ; YES - Translate INC A2 ; NO - Move to Next Char TSTB @A2 ; End of Table? BEQ INPUTR ; YES - No Change BR INPUTC ; Go Back to Next Char INPUTT: MOVB @A2,D1 ; Translate Character! INPUTR: POP A2 ; POP A2 off of Stack RTN ;******************** ;* 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 ;******************** ;* 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 126.,17.,0,0 SUBW #401,D1 ;ADD POSITION OFFSETS OR #100200,D1 TTY ;Send Column First RORW D1,#8. ;SEND ROW SECOND TTY RTN ;SPECIAL COMMANDS - D1 CONTAINS THE COMMAND CODE IN THE LOW BYTE CRTS: AND #377,D1 ;STRIP THE HIGH BYTE ;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 ;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 CRTX: POP A2 ;RESTORE A2 RTN EVEN ;XTBL Translation Table ;Translate ^P to ^L, ^] to ^P, ^L to ^K, ^K to ^J ; XTBL: BYTE 176,0 ; Leadin - Discard BYTE 20,14 ; ^P to ^K BYTE 35,20 ; ^] to ^P BYTE 14,13 ; ^L to ^K BYTE 13,12 ; ^K to ^J BYTE 0 EVEN ;BYTE OFFSET AND DATA TABLES FOLLOW FOR ALL COMMANDS CRCA: BYTE C0-.,C1-.,C2-.,C3-.,C4-.,C5-.,C6-.,C7-.,C8-. BYTE C9-.,C10-.,C11-.,C12-.,C13-.,C14-. BYTE C15-.,C16-.,C17-.,C18-.,C19-.,C20-.,C21-. BYTE C22-.,C23-.,C24-.,C25-.,C26-.,C27-. CRCB: C0: BYTE 126.,28.,0 ;Clear screen and set normal intensity C1: BYTE 126.,18.,0 ;CURSOR HOME C2: BYTE 215,0 ;CURSOR RETURN C3: BYTE 126.,12.,0 ;CURSOR UP C4: BYTE 126.,11.,0 ;CURSOR DOWN C5: BYTE 8.,0 ;CURSOR LEFT C6: BYTE 16.,0 ;CURSOR RIGHT C7: BYTE 126.,21.,0 ;LOCK KEYBOARD C8: BYTE 126.,6.,0 ;UNLOCK KEYBOARD C9: BYTE 126.,15.,0 ;ERASE TO END OF LINE C10: BYTE 126.,24.,0 ;ERASE TO END OF SCREEN C11: BYTE 126.,25.,0 ;Background display (low intensity) C12: BYTE 126.,31.,0 ;Foreground display (high intensity) C13: BYTE 0 ;ENABLE PROTECTED FIELDS C14: BYTE 0 ;DISABLE PROTECTED FIELDS C15: BYTE 126.,19.,0 ;Delete line C16: BYTE 126.,26.,0 ;Insert line C17: BYTE 0 ;Delete character C18: BYTE 0 ;Insert character C19: BYTE 126.,5,0 ;Read cursor address C20: BYTE 0 ;Read character at cursor address C21: BYTE 0 ;Start blinking field C22: BYTE 0 ;End blinking field C23: BYTE 0 ;Start line drawing mode C24: BYTE 0 ;End line drawing mode C25: BYTE 0 ;Set horizontal position C26: BYTE 0 ;Set vertical position C27: BYTE 126.,36.,0 ;Return to Switches EVEN END .