.TITLE V52IO .IDENT /2702.2/ ; ; ; ; ; WRITTEN BY RAY DI MARCO ; 27-FEB-81. ; ; ; ; VERSION 270281/02. ; ; ;-------------------------------------------------------------------- ; ; ; THIS MODULE CONTAINS THE ROUTINES NEEDED TO DO I/O TO AND FROM THE ; CONSOLE. THE ROUTINES AVAILABLE ARE- ; ; V52.CI INPUT ONE CHRACTER FROM THE CONSOLE ; V52.CO OUTPUT ONE CHRACTER TO THE CONSOLE ; V52.LI INPUT A LINE FROM THE CONSOLE ; V52.LO OUTPUT A LINE TO THE CONSOLE ; V52.ES ERASE THE CONSOLE SCREEN ; V52.EL ERASE A LINE ON THE CONSOLE SCREEN ; V52.XY POSITION THE CUSOR ON THE SCREEN ; ; ; THESE ROUTINES HAVE BEEN WRITTEN TO DRIVE A VT52 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 CODE TO 'V52.CO' TO TRAP 201/202 REV VIDIO CODES ; ; ; ; ; .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- ; ; V52.CO CHARACTER IS PASSED IN 'R0' ; V52.CI CHARACTER IS RETURNED IN 'R0' ; V52.LO ADDRESS OF ASCII STRING IS PASSED OVER IN 'R0' ; V52.LI ADDRESS OF BUFFER IS PASSED OVER IN 'R0' ; V52.ES .... NO ARGUMENT ... ; V52.EL ADDRESS OF LINE IS PASSED OVER IN LOB OF R0. ; V52.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. ; ; AN ESCAPE SEQUENCE OF THE FORM WILL BE TRAPPED BY THIS ; MODULE, AND THE CHARACTER RETURNED IN ITS PLACE. ; ; ; ; ; .SBTTL DECLARATIONS ; ; .MCALL .TTYOUT,.TTYIN,.TTINR,.PRINT ; I/O MACROS .MCALL .PUSH,.POP ; STACKING ; .GLOBL V52.CI,V52.CO ; CHARACTER IN/OUT .GLOBL V52.LI,V52.LO ; LINE IN/OUT .GLOBL V52.ES,V52.EL ; ERASE SCREEN/LINE .GLOBL V52.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,BELL, BELL = 'G-'@ ; BELL .IIF NDF,BS, BS = 'H-'@ ; 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 V52.CO .MEXIT .ENDC MOV R0,-(SP) .IRP X, MOVB X,R0 CALL V52.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 - 'V52.CI' ... INPUT A CHARACTER FROM TERMINAL ; ; ; WE INPUT A CHARACTER AND RETURN IT IN R0. ; ; V52.CI: .TTYIN ; GET A CHARACTER (-> R0) BIC #^C377,R0 ; LEAVE LOB ONLY CMP R0,#LF ; WAS IT A ? BEQ V52.CI ; YES -> IGNORE IT CMP R0,#ESC ; ESCAPE CHAR? BNE 100$ ; NO -> SKIP .TTYIN ; INPUT ANOTHER CHAR BIC #^C377,R0 ; STRIP BIS #200,R0 ; SET BIT 100$: RETURN ; HOME ; ; ; .SBTTL ROUTINE - 'V52.CO' ... OUTPUT A CHARACTER TO CONSOLE ; ; ; V52.CO: CMPB R0,#200 ; LEGAL CHAR BLO 400$ ; YES -> OUTPUT CMPB R0,#ESCOUT ; ALLOWABLE? BEQ 400$ ; YES -> SEND ; RETURN ; EXIT - NO SEND ; 400$: .TTYOUT ; CHARACTER (R0) --> CONSOLE RETURN ; HOME ; ; ; .SBTTL ROUTINE - 'V52.LO' ... OUTPUT A LINE TO CONSOLE ; ; V52.LO: .PRINT R0 ; PRINT LINE RETURN ; HOME ; ; ; ; ; .SBTTL ROUTINE - 'V52.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 ; ; V52.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 V52.CI ; GET A CHARACTER CMP R0,#CR ; A ? BEQ 100$ ; YES -> 100$ CMP R0,#<'U-'@> ; A ^U? BEQ 200$ ; YES -> 200$ CMP R0,#DELETE ; A DELETE? BEQ 300$ ; YES -> 300$ CMP R0,#40 ; >= SPACE? BLO 10$ ; NO -> IGNORE -> 10$ CMP R2,#LINSIZ ; BUFFER FULL? BHIS 400$ ; YES -> 400$ CALL V52.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 V52.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 - 'V52.EL' ; ; ; ; THIS ROUTINE CLEARS A LINE ON THE SCREEN. ALL REGISTERS ARE ; PRESERVED THROUGH THE ROUTINE. ; ; V52.EL: CALL V52.XY ; POSITION CUSOR ON LINE .OUT <#CR,#ESCOUT,#'K> ; + RETURN ; ALL DONE ; ; ; ; .SBTTL SCREEN ERASE PRIMITIVE - 'V52.ES' ; ; ; V52.ES: .OUT <#ESCOUT,#'H,#ESCOUT,#'J>; HOME + ERASE TO EOS RETURN ; HOME ; ; ; ; ; .SBTTL ROUTINE - 'V52.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. ; ; V52.XY: SWAB R0 ; SWITCH X/Y .PUSH R0 ; SAVE COORDINATES .OUT <#ESCOUT,#'Y> ; $Y -> POSITION COMMAND MOVB (SP),R0 ; GET X COORDINATE ADD #40,R0 ; ADJUST BIC #^C177,R0 ; ENSURE IN RANGE .OUT ; SEND OUT X COORDINATE ; MOV (SP),R0 ; GET COORDINATES SWAB R0 ; Y COORDINATE -> LOB ADD #40,R0 ; ADJUST BIC #^C177,R0 ; ENSURE IN RANGE .OUT ; SEND OUT Y COORDINATE ; .POP R0 ; RESTORE SWAB R0 ; SWITCH X/Y RETURN ; ALL DONE ; ; ; .END