;**************************************************************************;
; ;
; SOROC TERMINAL UNIT ROUTINE ;
; ;
;**************************************************************************;
; 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:
;
SEARCH SYS
SEARCH TRM
; OBJNAM SOROC.TDV
;********************
;* SOROC *
;********************
;TERMINAL DRIVER COMMUNICATIONS AREA
SOROC: WORD 0 ;TERMINAL ATTRIBUTES
RTN ;INPUT ROUTINE
BR OUTPUT ;OUTPUT ROUTINE
BR ECHO ;ECHO ROUTINE
JMP CRT ;CRT CONTROL
;********************
;* 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 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
;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 36,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 ;UNLOCK KEYBOARD
C9: BYTE 233,124,0 ;ERASE TO END OF LINE
C10: BYTE 233,131,0 ;ERASE TO END OF SCREEN
C11: BYTE 233,51,0 ;PROTECT FIELD
C12: BYTE 233,50,0 ;UNPROTECT FIELD
C13: BYTE 233,46,0 ;ENABLE PROTECTED FIELDS
C14: BYTE 233,47,0 ;DISABLE PROTECTED FIELDS
EVEN
WORD 0
END