.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