;****************************************************************
;* *
;* FREEDOM 200 TERMINAL UNIT ROUTINE *
;* *
;* by *
;* *
;* ULTRASCIENCE DIVISION OF GIBBS LABORATORIES *
;* *
;* Copyright Ultrascience 1985 (C) *
;* *
;* 1824 WILMETTE AVE, WILMETTE, IL 60091 *
;* *
;* 312/256-0080 *
;* *
;* REV. 5.1 LAST UPDATE 01/26/85 *
;* *
;****************************************************************
;
; IMPORTANT MESSAGE:
;
; THIS PROGRAM OR ANY PART OF THIS PROGRAM MAY NOT BE COPIED FOR
; PROFIT BY ANYONE OTHER THAN ULTRASCIENCE. ANYONE WISHING TO
; USE THE PROGRAM MAY DO SO AT NO CHARGE, PROVIDED THEY NOTIFY
; ULTRASCIENCE THAT THEY ARE USING THE PROGRAM AND AGREE TO SEND
; INFORMATION ABOUT BUGS OR IMPROVEMENTS TO ULTRASCIENCE. THIS
; BUG AND IMPROVEMENT INFORMATION WILL BE AVAILABLE TO ALL USERS
; OF THE PROGRAM.
;
; Ultrascience can provide specialized manuals for a modest fee.
;
JMPINP: JMP INP
JMPECH: JMP ECHO
JMPCRT: JMP CRT ; go handle TCRT codes
JMPINI: JMP INI
; Macro to send leadin character and control character
DEFINE CNTRL CHTER ; Control Character Macro
BYTE CHTER-100,0
EVEN
ENDM
DEFINE ESC CHTER,EXTRA ; Escape Macro
IF B,EXTRA, BYTE 233,CHTER,0
IF NB,EXTRA, BYTE 233,CHTER,EXTRA,0
EVEN
ENDM
DEFINE ENH CHTER,OPT
BYTE 233,'G
IF B,CHTER, BYTE '0
IF NB,CHTER, BYTE CHTER
IF NB,OPT, BYTE 40,0
IF B,OPT, BYTE 0
ENDM
;********************
;* 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
INP: SAVE A3 ; save reg.
MOV T.IMP(A5),A3 ; get impure area pointer
MOVW #T$IMI!T$XLT,D7 ; set image and translate mode mask
ANDW @A5,D7 ; any of the modes on ? (function key translation)
BEQ INPEXT ; no, no function key handling
CMPB 20(A3),#-1 ; is this a returning translated key ?
BEQ WHOXLT ; yes, go process it some more
TSTB 20(A3) ; function key xlation in progress ?
BNE FCTPRO ; jump if function processing in progress
CMPB D1,#1 ; function lead-in ?
BEQ LEADIN ; yes, do it
CMPB D1,#33 ; function lead-in ?
BNE INPEXT ; no, skip it
LEADIN: MOVB D1,20(A3) ; save byte
MOV A5,14(A3) ; save TRMDEF
MOV #2000.,4(A3) ; set time count (0.2 seconds)
CLR @A3 ; clear timer link
LEA A6,FCTCHR ; index timer routine
MOV A6,10(A3) ; reset flag
TIMER @A3 ; queue up timer entry
KILLD1: MOVB #']-100,D1 ; kill character with harmless character
INPEXT: REST A3 ; restore reg.
LCC #0 ; set normal processing
RTN ; get back to TRMSER
; Function key processing
FCTPRO: CMPB D1,#1 ; ^A ?
BEQ KILLD1 ; yes, kill it
CMPB D1,#33 ; ESC ?
BEQ KILLD1 ; yes, kill it
CMPB 20(A3),#33 ; escape lead-in ?
BEQ ESCIN ; yes, do simple conversion
CMPB 20(A3),#1 ; ^A lead-in ?
BNE KILLD1 ; no, extra data - kill it
CTAIN: SUBB #100,D1 ; convert character to control chr.
ESCIN: ORB #200,D1 ; set high bit so converter can differentiate
MOVB D1,20(A3) ; save byte for FRE200.SVX
BR KILLD1 ; go away after doing character
WHOXLT: CLRW 20(A3) ; done translation
MOVW #T$XLT,D7 ; prepare to check escape processing bit
ANDW @A5,D7 ; does program translate or should we do it ?
BNE INPEXT ; they'll do it
; We translate
LEA A6,XTABL ; get conversion table address
XLOOP: MOVB (A6)+,D7 ; get byte from table
BEQ INPEXT ; jump if end of table (unsupported function)
CMPB D1,D7 ; found a match ?
BEQ L416 ; yes, swap bytes
INC A6 ; get past conversion byte
BR XLOOP ; continue checking
L416: MOVB @A6,D1 ; convert the character
BR INPEXT ; return to INPUT routine for exit to TRMSER
; Send queued up character
FCTCHR: SAVE A0,A5,D1 ; save regs.
MOV @A0,A5 ; get TRMDEF pointer
MOVB 4(A0),D1 ; get character to send
SETB 4(A0) ; say we've done it
TRMICP ; put character in input buffer
REST A0,A5,D1 ; restore regs.
RTN ; get back to monitor
; Translation table
XTABL: BYTE 200,33 ; f1 - ESC Unshifted function keys
BYTE 201,0 ; f2 - trap
BYTE 202,0 ; f3 - trap
BYTE 203,0 ; f4 - trap
BYTE 204,'X-100 ; f5 - match
BYTE 205,'O-100 ; f6 - concatenate
BYTE 206,'E-100 ; f7 - end of file
BYTE 207,'T-100 ; f8 - next page
BYTE 210,'N-100 ; f9 - end of line
BYTE 211,'W-100 ; f10 - next word
BYTE 240,33 ; F1 - ESC Shifted function keys
BYTE 241,0 ; F2 - trap
BYTE 242,0 ; F3 - trap
BYTE 243,0 ; F4 - trap
BYTE 244,'P-100 ; F5 - mark
BYTE 245,'\-100 ; F6 - toggle line ins. mode
BYTE 246,'S-100 ; F7 - center page
BYTE 247,'R-100 ; F8 - previous page
BYTE 250,'U-100 ; F9 - beginning of page
BYTE 251,'A-100 ; F10 - previous word
BYTE 305,'B-100 ; line insert
BYTE 241.,'Q-100 ; toggle character insert mode
BYTE 321,'F-100 ; insert character
BYTE 322,'Z-100 ; delete line
BYTE 324,'V-100 ; delete word
BYTE 327,'D-100 ; delete character
BYTE 331,'Y-100 ; delete to end of line
BYTE 000,000
;********************
;* INI *
;********************
;Handle initialization of the terminal
INI: SAVE A6,D1,D2,D3 ; save registers
MOV #INISIZ,D3 ; get size of string to send
LEA A6,INISTR ; index the string
MOV A6,D1
TRMBFQ ; output the string
MOV T.IMP(A5),A6 ; get impure area
CLR @A6 ;
SET 14(A6) ;
REST A6,D1,D2,D3 ; restore registers
RTN
INISTR: CNTRL '^
ESC '*
; Re-program down arrow, word left, word right, scroll up, scroll down
BYTE 233,'|,'O-100,'1,'J-100,'Y-100
BYTE 233,'|,'J-100,'1,'A-100,'Y-100
BYTE 233,'|,'K-100,'1,'W-100,'Y-100
BYTE 233,'|,'H-100,'1,'R-100,'Y-100
BYTE 233,'|,'I+100,'1,'T-100,'Y-100
BYTE 233,'|,40,'1,'H-100,'Y-100
BYTE 233,'g,233,'f
ASCII / Terminal operating under Ultrascience FRE200.TDV ver. 5.1/
BYTE 15,233,'O-100
ASCII / System booting.../
BYTE 12,12,15,'.
BYTE 200
INISIZ=.-INISTR
EVEN
;********************
;* 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,'=,0,0
ADD #17437,D1 ;ADD POSITION OFFSETS (37)
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
PUSH A2 ;SAVE A2
ASL D1 ; Times 2 (word offset).
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
MOVW @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
; Word 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-.
WORD C15-.,C16-.,C17-.,C18-.,C19-.,C20-.,C21-.,C22-.
WORD C23-.,C24-.,C25-.,C26-.,C27-.,C28-.,C29-.
WORD C30-.,C31-.,C32-.,C33-.,C34-.,C35-.,C36-.,C37-.,C38-.,C39-.
WORD C40-.,C41-. ; [101]
WORD C42-.,C43-.,C44-.,C45-.,C46-.,C47-.,C48-.,C49-.; [101]
WORD C50-.,C51-.,C52-.,C53-.,C54-.,C55-.,C56-.,C57-.,C58-.,C59-.
WORD C60-.,C61-.,C62-.,C63-.,C64-.,C65-.,C66-.,C67-.,C68-.,C69-.
WORD C70-.,C71-.,C72-.,C73-.,C74-.,C75-.,C76-.,C77-.,C78-.
WORD C79-.,C80-.,C81-.,C82-.,C83-.,C84-.,C85-.,C86-.,C87-.
WORD C88-.,C89-.,C90-.,C91-.,C92-.,C93-.,C94-.,C95-.,C96-.
WORD C97-.,C98-.,C99-.,C100-.,C101-.,C102-.,C103-.,C104-.
WORD C105-.,C106-.,C107-.,C108-.,C109-.,C110-.,C111-.,C112-.
WORD C113-.,C114-.,C115-.,C116-.,C117-.,C118-.,C119-.,C120-.
WORD C121-.,C122-.,C123-.,C124-.,C125-.,C126-.,C127-.,C128-.
WORD C129-.,C130-.,C131-.,C132-.,C133-.,C134-.,C135-.,C136-.
WORD C137-.,C138-.,C139-.,C140-.,C141-.,C142-.,C143-.,C144-.
WORD C145-.,C146-.,C147-.,C148-.,C149-.,C150-.,C151-.,C152-.
WORD C153-.,C154-.,C155-.,C156-.,C157-.,C158-.,C159-.,C160-.
WORD C161-.,C162-.,C163-.,C164-.,C165-.,C166-.,C167-.,C168-.
WORD C169-.,C170-.,C171-.,C172-.,C173-.,C174-.,C175-.,C176-.
WORD C177-.,C178-.,C179-.,C180-.,C181-.,C182-.,C183-.,C184-.
WORD C185-.,C186-.,C187-.,C188-.,C189-.,C190-.,C191-.,C192-.
WORD C193-.,C194-.,C195-.,C196-.,C197-.,C198-.,C199-.,C200-.
WORD C201-.,C202-.,C203-.,C204-.,C205-.,C206-.,C207-.,C208-.
WORD C209-.,C210-.,C211-.,C212-.,C213-.,C214-.,C215-.,C216-.
WORD C217-.,C218-.,C219-.,C220-.,C221-.,C222-.,C223-.,C224-.
WORD C225-.,C226-.,C227-.,C228-.,C229-.
CRCB:
C0: ESC '*,200 ; Clear screen
C1: CNTRL '^ ; Cursor Home (move to column 1,1)
C2: CNTRL 'M ; Cursor Return (move to column 1)
C3: CNTRL 'K ; Cursor Up
C4: CNTRL 'J ; Cursor Down
C5: CNTRL 'H ; Cursor Left
C6: CNTRL 'L ; Cursor Right
C7: ESC '# ; Lock Keyboard
C8: ESC '" ; Unlock Keyboard
C9: ESC 'T ; Erase to End of Line
C10: ESC 'Y ; Erase to End of Screen
C11: ESC ') ; Enter Background Display Mode (reduced intensity)
C12: ESC '( ; Enter Foreground Display mode (normal intensity)
C13: ESC '& ; Enable Protected fields
C14: ESC '' ; Disable Protected Fields
C15: ESC 'R ; Delete Line
C16: ESC 'E ; Insert Line
C17: ESC 'W ; Delete Character
C18: ESC 'Q ; Insert Character
C19: ESC '? ; Read Cursor Address
C20: ESC 3 ; Read Character at Current Cursor Position
C21: BYTE 40
ENH '2 ; Start Blinking Field
C22: ENH ,1 ; End Blinking Field
C23: ESC '$ ; Start Line Drawing Mode (enable alternate chr. set)
C24: ESC '% ; End Line Drawing Mode (disable alternate chr. set)
C25: ESC '[ ; Set Horizontal Position
C26: ESC '] ; Set Vertical Position
C27: BYTE 0 ; Set Terminal Attributes
C28: ESC '.,'3 ; Cursor on
C29: ESC '.,'0 ; Cursor off
C30: BYTE 40
ENH '8 ; Start underline field
C31: ENH ,1 ; End underline field
C32: BYTE 40
ENH '4 ; Start reverse video field
C33: ENH ,1 ; End reverse video field
C34: BYTE 40
ENH '6 ; Start reverse blink field
C35: ENH ,1 ; End reverse blink field
C36: ENH 'n ; Turn off screen display
C37: ENH 'o ; 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 ; Intersection
C49: ; Solid block
C50: BYTE 0 ; Slant block
C51: BYTE '#,0 ; Cross-hatch block
C52: BYTE '=,0 ; Double line horizontal
C53: BYTE 'H,0 ; Double line vertical
C54: ; Send message to function key
C55: BYTE 0 ; Send message to shifted function key
C56: BYTE 233,"m0,40,'7,0 ; Set normal display format
C57: ESC 'm,'0 ; Set horizontal split (follow with row code)
C58: ; Set vertical split (30 chr. columns)
C59: ; Set vertical split (40 chr. columns)
C60: ; Set vertical split column to next chr.
C61: ; Activate split segment 0
C62: ; Activate split segment 1
C63: ESC 'f ; Send message to host message field
C64: BYTE '+,0 ; Up arrow
C65: BYTE '-,0 ; Down arrow
C66: BYTE 0 ; Raised dot
C67: ; End of line marker
C68: ; Horizontal tab symbol
C69: ; Paragraph
C70: ; Dagger
C71: BYTE 0 ; Section
C72: BYTE '',0 ; Cent sign
C73: ; One quarter
C74: BYTE 0 ; One half
C75: BYTE 'i,0 ; Degree
C76: BYTE 0 ; Trademark
C77: BYTE '* ; Copyright
C78: BYTE 0 ; Registered
C79: ESC 'P ; Print screen
C80: ; Set 130 col. screen
C81: BYTE 0 ; Set 80 col. screen
C82: ESC '` ; Enable transparent print mode
C83: ESC 'a ; Disable transparent print mode
C84: ; Begin writing to alternate page
C85: ; End writing to alternate page
C86: ; Toggle page
C87: ; Copy to alternate page
C88: ; Insert column
C89: ; Delete column
C90: ; Block fill with attribute
C91: ; Block fill with character
C92: ; Draw a box
C93: ; Scroll box up one line
C94: BYTE 0 ; Scroll box down one line
C95: ESC '9 ; Select jump scroll
C96: ; Select fast smooth scroll
C97: ; Select med-fast smooth scroll
C98: ; Select med-slow smooth scroll
C99: ESC '8 ; Select slow smooth scroll