;****************************************************************
;* *
;* FREEDOM 100 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.
;
; APPLICATION NOTE:
; The down arrow key of the keyboard must be disabled (See the
; FRE100 manual.
;
; Ultrascience can provide specialized manuals for a modest fee.
;
; UPDATE NOTE: Due to the new output delay (which uses much less CPU time
; than version 4.01 of the driver) it is necessary to set the
; output buffer size (last number in a TRMDEF statement) to
; no more than 100 bytes and use 200+ queue blocks in your
; AMOSL.INI to insure reliable operation.
SEARCH SYS
SEARCH SYSSYM
SEARCH TRM
OBJNAM .TDV
;Define capability flags
;
;********************
;* FRE100 *
;********************
;Terminal driver communications area
WORD TD$NEW ; terminal attributes
; If image or data mode is set we must delay for each character because
; XON/XOFF handshaking is disabled.
OUTPUT: MOVW @A5,D7 ; get terminal status word
ANDW #T$IMI!T$DAT,D7 ; is image or data mode on ?
BEQ NODEL ; no, don't delay
SAVE A3 ; save register
MOV T.OQX(A5),A3 ; index base of output queue block
QINS A3 ; insert a block
BNE RESIT ; no delay if out of queue blocks
MOV #10,(A3)+ ; set output-freeze type block
MOV #1,(A3)+ ; set ^S flag
CLR (A3)+ ; clear link to next TIMER queue
; To increase or decrease the delay change #450 below to other non-zero value
MOV #450,(A3)+ ; set delay time
LEA A6,OUTDEL ; get ^Q routine address
MOV A6,(A3)+ ; store for TIMER call
MOV A5,(A3) ; get TRMDEF pointer
TIMER -14(A3) ; queue up timer block
RESIT: REST A3 ; restore the register
NODEL: LCC #10 ; set negative flag for normal processing
RTN ; get back to TRMSER
; Timer queue routine to reset ^S flag
OUTDEL: CLR -20(A0) ; clear ^S flag
PUSH A5 ; save A5
MOV @A0,A5 ; get JOBTRM index
TSTB @A5 ; output-in-progress flag on ?
BMI OIPB ; yes, no need to initiate
ORW #T$OIP,@A5 ; set in progress flag
MOV T.IDV(A5),A6 ; get IDV driver address
CALL @A6 ; call IDV
OIPB: POP A5 ; restore A5
RTN ; get back
;********************
;* 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
PAGE
;********************
;* 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 FCTCHR routine
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 305,'B-100 ; line insert
BYTE 321,'Q-100 ; toggle character ins. mode
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
PAGE
;********************
;* INI *
;********************
;Handle initialization of the terminal
INI: SAVE D1,D2 ; save registers
MOV #INISIZ,D3 ; get size of string to send
LEA A6,INISTR ; index the string
MOV A6,D1
TRMBFQ ; output the string
REST D1,D2 ; restore registers
MOV T.IMP(A5),A6 ; get impure area
CLR @A6 ;
SET 16(A6) ;
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,'=,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:
PAGE
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 ') ; Start Protected field (reduced intensity)
C12: ESC '( ; End protected fielde (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: BYTE 0 ; 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 '.,'1 ; 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: ; Turn off screen display
C37: BYTE 0 ; 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: ; Send message to shifted function key
C56: ; Set normal display format
C57: ; 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: BYTE 0 ; Send message to host message field
C64: BYTE '^,0 ; Up arrow
C65: BYTE 'v,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: BYTE 't,0 ; Dagger
C71: BYTE 0 ; Section
C72: BYTE 'c,0 ; Cent sign
C73: BYTE 0 ; One quarter
C74: BYTE 0 ;
One half
C75: BYTE 'o,0 ; Degree
C76: BYTE 0 ; Trademark
C77: BYTE 'c,0 ; Copyright
C78: ; 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