;**************************************************************************;
; ;
; SOROC TERMINAL UNIT ROUTINE ;
; ;
;**************************************************************************;
; ASL-02011-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:
;
;[100] 3 May 1982
; Move cursor TCRT calls to correspond to new standard. /RBC
;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; ;
; MODIFIED TO SOLVE TYPE-AHEAD PROBLEM ON 03/01/83 ;
; BY: Robert C. Strunk ;
; Software Systems Consulting Incorporated ;
; 2701 Spring Grove Av, Cincinnati, OH 45225 ;
; ;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;
;********************
;* SOROC *
;********************
;TERMINAL DRIVER COMMUNICATIONS AREA
SOROC: WORD 2000 ; terminal attributes
RTN ; input routine
RTN ; output routine
BR ECHO ; echo routine
BR JMPCRT ; crt control
RTN ; no INIT routine yet
WORD 6 ; impure area FOR CURSOR POSITIONING
BYTE 24.,80. ; SCREENSIZE
LWORD 151400 ; terminal has:
; insert/delete line
; insert/delete character
; dim video attribute
; 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 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: SAVE A2,D3 ;SAVE TBUF'S REGISTERS
MOVW JOBCMS(A0),D3 ;TEST COMMAND FILE PROCESSING
ANDW #C.TRC,D3 ;IS TRACE MODE ON?
BNE CRTT ;BRANCH IF SO
MOVW JOBCMS(A0),D3 ;TEST COMMAND FILE PROCESSING
ANDW #C.SIL,D3 ;IS OUTPUT SILENCED?
BNE CRTX ;BRANCH IF IT IS
CRTT: TSTW D1 ;IS IT CURSOR POSITION?
BMI CRTS ; NO
;CURSOR POSITIONING - D1 CONTAINS X,Y COORDINATES
MOV T.IMP(A5),A2 ;PICKUP IMPURE AREA
MOV CURP,@A2 ;PLACE PREFIX FOR CURSOR POSITIONING
ADDW #^H1F1F,D1 ;COMPUTE POSITION OFFSETS
RORW D1,#8. ;SWAP ROW AND COLUMN NUMBERS
MOVW D1,4(A2) ;SEND ROW AND COLUMN (IN ORDER)
ADDW #1,A2 ;PASS OVER THE FIRST NULL
BR CRTO
CURP: BYTE 0,4,ESC,'= ;PREFIX FOR CURSOR POSITIONING
;SPECIAL COMMANDS - D1 CONTAINS THE COMMAND CODE IN THE LOW BYTE
CRTS: AND #^H0FF,D1 ;STRIP THE HIGH BYTE
;COMMAND PROCESSING PER DIRECTOR TABLES
CRTU: ASL D1 ; DOUBLE THE CODE (word offset).
CMPW D1,#CRCB-CRCA ;CHECK FOR VALID CODE
BHI CRTX ; AND BYPASS IF BAD
LEA A2,CRCA ;INDEX THE TABLE
ADDW D1,A2 ;ADD COMMAND CODE
MOVW @A2,D1 ;PICK UP DATA FIELD OFFSET
ADD D1,A2 ;MAKE ABSOLUTE DATA ADDRESS
;SEE IF WE CAN ARRANGE TO HAVE THE WHOLE STRING OUTPUT UN-INTERRUPTED
CRTO: MOV T.OBS(A5),D1 ;PICKUP TOTAL BUFFER SIZE
SUB T.OBX(A5),D1 ;SUB CURR BUFF CNT TO GET # CHAR POS LEFT
CLR D3 ;PREPARE TO
MOVB (A2)+,D3 ; PICKUP LENGTH OF DATA
BEQ CRTX ;BRANCH IF NOTHING TO OUTPUT
CMP D1,D3 ;ENOUGH ROOM FOR WHOLE STRING?
BGE CRTM ;BRANCH IF SO
SVLOK ;PREVENT (I/O) INTERRUPTS
TST T.OBX(A5) ;WE WANT AN EMPTY BUFFER
BEQ CRTW ;BRANCH IF IT'S EMPTY NOW
JWAIT J.TOW ;WAIT HERE FOR EMPTY BUFFER
CRTW: SVUNLK ;ALLOW INTERRUPTS
;ACTUALLY DISPOSE OF CHARACTER STRING TO OUTPUT BUFFER
CRTM: PUSH A2 ;SAVE ADDR OF OUTPUT FIELD
TBUF ;PRINT THE DATA FIELD
POP A2 ;RESTORE ADDR OF OUTPUT FIELD
CMPB 1(A2),#100 ;SLEEP IF LONG COMMAND (E.G. ERASE)
BLOS CRTX
LEA A2,CRTNUL ;POINT TO PAD CHARACTERS
CLR D3 ;PREPARE TO
MOVB (A2)+,D3 ; PICKUP LENGTH OF DATA
TBUF ;STALL THE PROGRAM A WHILE
CRTX: REST A2,D3 ;RESTORE TBUF'S REGISTERS
RTN
;Null characters for long commands
CRTNUL: BYTE 11.,BIT7,BIT7,BIT7,BIT7,BIT7,BIT7,BIT7,BIT7,BIT7,BIT7,BIT7
EVEN
;BYTE OFFSET AND DATA TABLES FOLLOW FOR ALL COMMANDS
CRCA: WORD C0-.,C1-.,C2-.,C3-.,C4-.,C5-.,C6-.,C7-.,C8-.
WORD C9-.,C10-.,C11-.,C12-.,C13-.,C14-.,C15-.,C16-.
WORD C17-.,C18-.,C19-.,C20-.,C21-.,C22-.,C23-.,C24-.
WORD C25-.,C26-.,C27-.,C28-.,C29-.
CRCB:
C0: BYTE 2,ESC,<'*&CTRL>!BIT7 ;ERASE SCREEN
C1: BYTE 2,'^&CTRL,BIT7 ;CURSOR HOME
C2: BYTE 1,<'M&CTRL>!BIT7 ;CURSOR RETURN
C3: BYTE 1,'K&CTRL ;CURSOR UP
C4: BYTE 1,'J&CTRL ;CURSOR DOWN
C5: BYTE 1,'H&CTRL ;CURSOR LEFT
C6: BYTE 1,'L&CTRL ;CURSOR RIGHT
C7: BYTE 2,ESC,'# ;LOCK KEYBOARD
C8: BYTE 2,ESC,'" ;UNLOCK KEYBOARD
C9: BYTE 2,ESC,'T ;ERASE TO END OF LINE
C10: BYTE 2,ESC,'Y ;ERASE TO END OF SCREEN
C11: BYTE 2,ESC,') ;PROTECT FIELD (WRT LOW ON)
C12: BYTE 2,ESC,'( ;UNPROTECT FIELD (WRT LOW OFF)
C13: BYTE 2,ESC,'& ;PROTECT MODE ON (LOW INTENS CHAR PROTECTED)
C14: BYTE 2,ESC,'' ;PROTECT MODE OFF (NOTHING PROTECTED)
C15: BYTE 2,ESC,'R ;DELETE LINE
C16: BYTE 2,ESC,'E ;INSERT LINE
C17: BYTE 2,ESC,'W ;DELETE CHARACTER
C18: BYTE 2,ESC,'Q ;INSERT CHARACTER
C19: BYTE 2,ESC,'? ;READ CURSOR ADDRESS
C20: BYTE 2,ESC,'1 ;READ CHARACTER AT CURSOR
C21: BYTE 2,ESC,'V&CTRL ;START BLINKING FIELD
C22: BYTE 2,ESC,'D&CTRL ;END BLINKING FIELD
C23: BYTE 3,ESC,'-,'4 ;ENABLE ALT CHAR SET (E.G. LINE DRAWING)
C24: BYTE 3,ESC,'-,'5 ;DISABLE ALT CHAR SET
C25: ;SET HORIZONTAL POSITION
C26: BYTE 0 ;SET VERTICAL POSITION
C27: BYTE 2,ESC,'. ;SET TERMINAL CHARACTERISTICS (WATCH THIS!)
C28: BYTE 7,ESC,'. ;CURSOR ON
ASCII /2601/
BYTE 'N&CTRL
C29: BYTE 7,ESC,'. ;CURSOR OFF
ASCII /2600/
BYTE 'N&CTRL
EVEN