.TITLE ISCIO
.IDENT /2909.3/
;
;
;
;
; WRITTEN BY RAY DI MARCO
; 29-SEP-80.
;
;
;
; VERSION 290980/02.
;
;
;--------------------------------------------------------------------
;
;
; THIS MODULE CONTAINS THE ROUTINES NEEDED TO DO I/O TO AND FROM THE
; CONSOLE. THE ROUTINES AVAILABLE ARE-
;
; ISC.CI INPUT ONE CHRACTER FROM THE CONSOLE
; ISC.CO OUTPUT ONE CHRACTER TO THE CONSOLE
; ISC.LI INPUT A LINE FROM THE CONSOLE
; ISC.LO OUTPUT A LINE TO THE CONSOLE
; ISC.ES ERASE THE CONSOLE SCREEN
; ISC.EL ERASE A LINE ON THE CONSOLE SCREEN
; ISC.XY POSITION THE CUSOR ON THE SCREEN
;
;
; THESE ROUTINES HAVE BEEN WRITTEN TO DRIVE A INTECOLOR TERMINAL, ASSUMING THAT
; THE PROGRAM OPERATES UNDER THE RSTE/E RT11 EMULATOR. THE TERMINAL
; CHARACTERISTICS MUST BE (FORM;NO UPARROW;STALL;SCOPE;FORM;TAB). THIS
; MODULE CAN ALSO OPERATE UNDER THE RT-11 OPERATING SYSTEM IF THE VALUE
; OF THE 'ESCOUT' CONSTANT IS CHANGED TO 33(OCTAL).
;
;
;
.SBTTL MODIFICATIONS
;
;
; 6-MAR-81 ADD IN SUPPORT OF COLOUR CHANGE IN 'ISC.CO'
; 23-Mar-83 Use <6>
codes to change colour; this makes more
; compatiable with RDM1EM type terminals.
;
.SBTTL DOCUMENTATION - REGISTERS USAGE AND ARGUMENT PASSING
;
;
; ALL THE ROUTINES IN THE MODULE PRESERVE ALL REGISTERS. THE ARGUMENTS ARE
; PASSED VIA THE REGISTERS AS FOLLOWS-
;
; ISC.CO CHARACTER IS PASSED IN 'R0'
; ISC.CI CHARACTER IS RETURNED IN 'R0'
; ISC.LO ADDRESS OF ASCII STRING IS PASSED OVER IN 'R0'
; ISC.LI ADDRESS OF BUFFER IS PASSED OVER IN 'R0'
; ISC.ES .... NO ARGUMENT ...
; ISC.EL ADDRESS OF LINE IS PASSED OVER IN LOB OF R0.
; ISC.XY COORDINATES ARE PASSED OVER IN 'R0' (X=LOB,Y=HOB)
;
;
;
.SBTTL DOCUMENTATION - NOTES
;
;
; THE MODULE SETS THE SPECIAL INPUT MODE BIT IN THE 'JSW' TO STOP THE
; MONITOR ECHOING THE INPUT.
;
; IF A CHARACTER IS INPUT IT IS DISCARDED AND ANOTHER CHARACTER IS
; INPUT.
;
; THE MAXIMUM INPUT LINE SIZE IS 78 CHARACTERS. THIS IS DETERMINED BY
; THE 'LINSIZ' CONSTANT.
;
;
;
.SBTTL DECLARATIONS
;
;
.MCALL .TTYOUT,.TTYIN,.TTINR ; I/O MACROS
.MCALL .PUSH,.POP ; STACKING
;
.GLOBL ISC.CI,ISC.CO ; CHARACTER IN/OUT
.GLOBL ISC.LI,ISC.LO ; LINE IN/OUT
.GLOBL ISC.ES,ISC.EL ; ERASE SCREEN/LINE
.GLOBL ISC.XY ; POSITION CUSOR
;
;
TTY.NE = 10000 ; SPECIAL TTY MODE - NO ECHO
JSW = 44 ; JSW FOR RT11
LINSIZ = 78. ; INPUT LINE SIZE
;
;
;
.SBTTL DEFINITIONS - CHARATER CODES
;
;
.IIF NDF,POS, POS = 'C-'@ ; POSITION CUSOR
.IIF NDF,BELL, BELL = 'G-'@ ; BELL
.IIF NDF,BS, BS = 'Z-'@ ; BACKSPACE
.IIF NDF,TAB, TAB = 'I-'@ ; TAB
.IIF NDF,LF, LF = 'J-'@ ; LINEFEED
.IIF NDF,CR, CR = 'M-'@ ; CARRIAGE RETURN
.IIF NDF,ESC, ESC = 33 ; CHARACTER 'ESCAPE'
.IIF NDF,SPACE, SPACE = 40 ; SPACE
.IIF NDF,ESCOUT, ESCOUT = 155. ; CHARACTER 'ESCAPE'
.IIF NDF,DELETE, DELETE = 177 ; DELETE CHARACTER
;
;
;
.PSECT CODE ; OPEN CODE SECTION
; ------ ----
.SBTTL DEFINITION - MACRO '.OUT'
;
;
; THIS ROUTINE CAUSES A NUMBER OF CHARCATERS TO BE OUTPUT TO
; THE CONSOLE.
;
;
.MACRO .OUT CHAR
.IF B,
CALL ISC.CO
.MEXIT
.ENDC
MOV R0,-(SP)
.IRP X,
MOVB X,R0
CALL ISC.CO
.ENDR
MOV (SP)+,R0
.ENDM .OUT
;
;
.SBTTL INITIALIZATION CODE
;
;
;
; HERE WE ENTER SPECIAL TTY MODE. THIS IS DONE BY SETTING A BIT IN
; THE JSW. AS A RESULT OF THIS THE MONITOR WILL NOT ECHO CHARACTERS.
;
;
.PSECT INITLZ ; OPEN SECTION
; ------ ------
;
;
BIS #TTY.NE,@#JSW ; DISABLE MONITOR ECHO
;
;
.PSECT CODE ; OPEN CODE SECTION
; ------ ----
;
;
;
.SBTTL ROUTINE - 'ISC.CI' ... INPUT A CHARACTER FROM TERMINAL
;
;
; WE INPUT A CHARACTER AND RETURN IT IN R0.
;
;
ISC.CI: .TTYIN ; GET A CHARACTER (-> R0)
BIC #^C377,R0 ; LEAVE LOB ONLY
CMP R0,#40 ; SPECIAL CHARACTER?
BLO 100$ ; YES -> SKIP
RETURN ; EXIT
;
100$: CMP R0,#CR ; WAS IT A ?
BNE 200$ ; NO -> 200$
.TTINR ; STRIP OF
MOV #CR,R0 ; RETURN A ..
RETURN ; ...
;
200$: CMP R0,#ESC ; ESCAPE CHAR?
BNE 400$ ; NO -> SKIP
.TTYIN ; INPUT ANOTHER CHAR
BIC #^C377,R0 ; STRIP
BIS #200,R0 ; SET BIT
RETURN ; HOME
;
400$: .PUSH R1 ; SAVE R1
MOV #1000$,R1 ; R1 -> TRANSLATION TABLE
410$: ADD #4,R1 ; POINT NEXT ENTRY
CMP R0,(R1) ; AT EOT?
BHI 410$ ; LOOP
BNE 470$ ; NO MATCH -> EXIT
MOV 2(R1),R0 ; TRANSLATE
470$: .POP R1 ; RESTORE
RETURN ; BYE
;
;
1000$: .WORD 0,0 ; START OF TABLE
.WORD 10.,302 ; ->
.WORD 12.,320 ; <^L> ->
.WORD 25.,303 ; <^Y> ->
.WORD 26.,304 ; <^Z> ->
.WORD 28.,301 ; <^\> ->
.WORD 377,377 ; EOT
;
.SBTTL ROUTINE - 'ISC.CO' ... OUTPUT A CHARACTER TO CONSOLE
;
;
;
ISC.CO: .PUSH R0 ; save R0
CALL 10$ ; output character
.POP R0 ; restore R0
RETURN ; done
;
10$: CMPB R0,#200 ; SPECIAL CODE?
BLO 300$ ; NO -> 300$
CMPB R0,#ESCOUT ; ESCAPE CODE
BEQ 400$ ; YES -> OUTIT
100$: CMPB R0,#201 ; BG ON ?
BNE 110$ ; no --> SKIP
.OUT <#6,#6> ; yes -> change to blue
RETURN ; done
110$: CMPB R0,#202 ; BG OFF?
BNE 120$ ; no --> SKIP
.OUT <#6,#7> ; yes -> change to blue
RETURN ; done
120$: CMPB R0,#203 ; FG ON?
BNE 130$ ; no --> SKIP
.OUT <#6,#2> ; yes -> change to blue
RETURN ; done
130$: CMPB R0,#204 ; FG OFF?
BNE 140$ ; no --> SKIP
.OUT <#6,#7> ; yes -> change to blue
140$: RETURN ; done
;
300$: CMPB R0,#140 ; LC?
BLO 400$ ; NO -> SKIP
.IIF NDF,$$$$LC,BIC #40,R0 ; MAKE UC
400$: .TTYOUT ; CHARACTER (R0) --> CONSOLE
RETURN ; HOME
;
;
.SBTTL ROUTINE - 'ISC.LO' ... OUTPUT A LINE TO CONSOLE
;
;
ISC.LO: .PUSH ; SAVE
MOV R0,R1 ; STR ADD -> R1
10$: MOVB (R1)+,R0 ; GET CHAR
BLE 100$ ; EOS -> SKIP
CALL ISC.CO ; SEND IT TO TTY
BR 10$ ; LOOP
;
100$: BLT 200$ ; EXIT
.OUT <#CR,#LF> ;
200$: .POP ; RESTORE
RETURN ; EXIT
;
;
.SBTTL ROUTINE - 'ISC.LI' ... INPUT A LINE FROM CONSOLE
;
;
; SET UP REGISTERS (AFTER SAVING THEM) AS FOLLOWS-
;
; R2 COUNT OF CHARACTERS IN BUFFER
; R1 STORE POINTER
; R0 HOLDS INPUT CHRACTER
;
;
ISC.LI: .PUSH ; SAVE
MOV R0,R1 ; BUFFER ADDRESS -> R1
CLR R2 ; NO CHARACTERS IN BUFFER
;
;
; MAIN LOOP. INPUT A CHARACTER. IF IT IS A , <^U> OR
; TAKE APPROPRIATE ACTION. IF IT IS NOT A LEGAL CHARACTER IGNORE
; IT. IF BUFFER IS FULL RING BELL AND IGNORE IT. IF CHARACTER
; IS LEGAL ECHO IT AND STORE IT IN BUFFER.
;
;
10$: CALL ISC.CI ; GET A CHARACTER
CMP R0,#CR ; A ?
BEQ 100$ ; YES -> 100$
CMP R0,#<'U-'@> ; A ^U?
BEQ 200$ ; YES -> 200$
CMP R0,#<'K-'@> ; A ^K
BEQ 200$ ; YES -> 200$
CMP R0,#DELETE ; A DELETE?
BEQ 300$ ; YES -> 300$
CMP R0,#BS ; BACK SPACE?
BEQ 300$ ; YES -> 300$
CMP R0,#40 ; >= SPACE?
BLO 10$ ; NO -> IGNORE -> 10$
CMP R2,#LINSIZ ; BUFFER FULL?
BHIS 400$ ; YES -> 400$
CALL ISC.CO ; ECHO
MOVB R0,(R1)+ ; SAVE CHARACTER
INC R2 ; UP COUNT
BR 10$ ; LOOP
;
;
;
;
;
; DETECTED , WHICH MEANS THAT INPUT MODE IS TERMINATED. WE
; PLACE A NULL AT THE END OF THE BUFFER AND EXIT.
;
100$: CALL ISC.CO ; OUTPUT A CHARACTER
CLRB (R1) ; NULL AT EOL
.POP ; RESTORE
RETURN ; HOME
;
;
;
; DETECTED A <^U>, WHICH MEANS LINE IS THE BE DISCARDED. CARRY OUT
; MULTIPLE DELETE OPERATIONS TILL ALL CHARACTERS IN BUFFER ARE
; DISCARDED.
;
200$: TST R2 ; ANY CHARACTERS IN BUFFER?
BEQ 10$ ; NO -> EXIT LOOP
CALL 1000$ ; DELETE CHARACTER
BR 200$ ; LOOP
;
;
;
; WE ARE DELETING A CHARACTER.
;
300$: CALL 1000$ ; DELETE A CHARACTER
BR 10$ ; EXIT SUBMODE
;
;
;
; BUFFER IS FULL - CANNOT ACCEPT CHARACTER - THERE RING BELL.
;
400$: .OUT #BELL ; TELL BUFFER FULL
BR 100$ ; EXIT SUBMODE
;
;
;
; THIS ROUTINE CAUSES THE LAST CHARACTER TO BE TYPED IN TO BE DISCARDED
; FROM THE INPUT BUFFER AND DELETED FROM THE SCREEN.
;
;
1000$: TST R2 ; ANY CHARACTERS TO DELETE?
BEQ 1010$ ; NO -> EXIT
.OUT <#BS,#SPACE,#BS> ;
DEC R1 ; DOWN POINTER
DEC R2 ; DOWN COUNTER
1010$: RETURN ; DONE
;
.SBTTL LINE ERASE PRIMITIVE - 'ISC.EL'
;
;
;
; THIS ROUTINE CLEARS A LINE ON THE SCREEN. ALL REGISTERS ARE
; PRESERVED THROUGH THE ROUTINE.
;
;
ISC.EL: CALL ISC.XY ; POSITION CUSOR ON LINE
.OUT <#<'K-'@>> ; ERASE LINE
RETURN ; ALL DONE
;
;
;
;
.SBTTL SCREEN ERASE PRIMITIVE - 'ISC.ES'
;
;
;
ISC.ES: .OUT <#<'L-'@>> ; ERASE PAGE
RETURN ; HOME
;
;
.SBTTL ROUTINE - 'ISC.XY' ... POSITION CUSOR ON SCREEN
;
;
;
; THIS ROUTINE CUASES THE CUSOR TO BE POSITIONED AT X,Y. THE COORDINATES
; ARE PASSED AS FOLLOWS-
;
; X == LOB OF R0
; Y == HOB OF R0
;
;
; ALL REGISTERS ARE PRESERVED THROUGH THE ROUTINE.
;
;
ISC.XY: .PUSH R0 ; SAVE COORDINATES
.OUT #POS ; TELL WISH TO POSITION
MOVB (SP),R0 ; GET X COORDINATE
BIC #^C177,R0 ; ENSURE IN RANGE
.OUT ; SEND OUT X COORDINATE
;
MOV (SP),R0 ; GET COORDINATES
SWAB R0 ; Y -> LOB
BIC #^C177,R0 ; ENSURE IN RANGE
.OUT ; SEND OUT Y COORDINATE
;
.POP R0 ; RESTORE
RETURN ; ALL DONE
;
;
;
.END