.TITLE MG02.. GENERAL INPUT OUTPUT PROCEDURES IN MACRO ; ; .IDENT /MG02.A/ ; ; MODS LIST ; ; (A) AUTOMATIC LUN ASIGNMENT FOR TERMINAL ; ; .PAGE .SBTTL VDU OUTPUT DATA SELECT PROCEDURE ; ; .MCALL QIOW$S ; ; ; V$IO:: ; R0 = REPLY WORD ; R1 = MODE STRING ; R2 = DATA STRING ; ; SPECIAL NOTE (LUN ONE MUST BE ASSIGNED TO TERMINAL BEFORE USE) ; ; MOV R2,V$00 ;LOAD MESSAGE ADDRESS IN STORE AREA ; MOV #V$S20,R2 ;HOLD ADDRESS OF SETCUR MESSAGE CALL R$POS2 ;DOES SETCUR EXIST IN MODE STRING IFERROR 40$ ;J IF MISMATCH OF CHARACTERS ; TSTB V$00 ;IS LINE VALUE <0 BLT 20$ ;J IF OUT OF RANGE CMPB V$00,#20 ;IF LINE NUMBER IN RANGE 0 - 20 BLE 25$ ;J IF IN RANGE 20$: CLRB V$00 ;SET LINE VALUE TO ZERO (ERROR) 25$: TSTB V$00+1 ;IS COLUMN VALUE <0 BLT 30$ ;J IF VALUE OUT OF RANGE CMPB V$00+1,#71. ;IS COLUMN IN RANGE (0 - 72) BLE 35$ ;J IF COL VALUE OK 30$: CLRB V$00+1 ;SET COLUMN VALUE TO ZERO (ERROR) 35$: ADD #20040,V$00 ;ADD 32 TO BOTH COL AND LINE BYTES MOV V$00,V$09 ;LOAD POSITION BYTES INTO SET CUR STRING MOV #V$08,R0 ;HOLD STRING ADDRESS TO OUTPUT CALL V$TX ;PERFORM SET CURSOR OPERATION BR 80$ ;J TO END OF OUTPUT MODE ; ; 40$: SAVE R3 MOV #V$LST,R3 ;HOLD ADDRESS OF CONTROL LIST ; 50$: TST @R3 ;IS THIS THE END OF THE LIST BEQ 80$ ;J IF END MOV (R3)+,R2 ;HOLD CONTROL CHARACTERS CALL R$POS2 ;DO CHARACTERS EXIST IN MODE STRING IFERROR 70$ ;J IF MISMATCH ; MOV (R3)+,R0 ;HOLD CHARACTER STRING ADDRESS CALL V$TX ;OUTPUT CHARACTER STRING BR 50$ ;CONTINUE ROUND LOOP ; 70$: ADD #2,R3 ;STEP ONTO NEXT STRING ADDRESS BR 50$ ;CONTINUE ROUND LOOP ; ; ; .PAGE .SBTTL . CHECK FOR INPUT REQUEST ; ; 80$: UNSAVE R3 ;TEST IF INPUT REQUIRED MOV #V$S16,R2 ;TEST FOR I (INPUT) CALL R$POS2 IFERROR 180$ ;J IF INPUT NOT REQD CLR V$STR ;SET UP STRING LENGTH = ZERO ; MOV #IO.RLB,V$FUN ;STORE BASIC FUNCTION CODE READ ECHO ON MOV #V$S12,R2 ;CHECK IF INPUT PROMPT REQD CALL R$POS2 ;DOES - CHARACTER EXIST IFSUCCESS 82$ ;J IF NO PROMPT REQD MOV #IO.RPR,V$FUN ;SET INPUT WITH PROMPT MARKER ; 82$: SAVE R3,R4,R5 ;SAVE REGISTERS R3 TO R5 MOV #V$S13,R2 ;TEST IF ECHO REQD CALL R$POS2 ;CHECK IF @ CHARACTER IN MODE STRING IFERROR 85$ ;J IF ECHO REQUIRED (@ NOT IN MODE) ; MOV #IO.RNE,V$FUN ;CONVERT FUNCTION READ NO ECHO 85$: MOV V$CNT,R5 ;DEFAULT READ BUFFER SIZE MOV #V$S14,R2 ;HAS READ SIZE BEEN SPECIFIED CALL R$POS2 ;CHECK IF ( FOUND IN MODE IFERROR 100$ ;J IF DEFAULT REQD ; ; EVALUATE NUMBER OF CHARACTERS TO READ ; MOV R0,R3 ;HOLD START POSITION OF NUMBER MOV #V$S15,R2 ;NUMERIC END TERMINATOR INC R0 ;POINT TO NEXT CHARACTER AS THE ;START POSITION TO SEARCH FROM CALL R$POS3 ;DOES TERMINATOR EXIST IFERROR 90$ ;J IF NO TERMINATOR ADD R1,R3 ADD #2,R3 ;R3 -> START CHARACTER OF NUMBER MOV #'),R4 ;R4 HOLDS TERMINATING CHARACTER CALL C$DECINT ;CONVERT CHARACTERS TO INTEGER TST R0 ;IS NUMBER OF CHARACTERS TO READ BLE 90$ ;IN RANGE 1 -> VDUCNT CMP R0,V$CNT BGT 90$ ;J IF RANGE ERROR MOV R0,R5 ;HOLD NUMBER OF CHARACTERS TO READ BR 100$ ;READ CHARACTER STRING ; 90$: ;ERROR IN INPUT SYNTAX MOV #V$S17,R0 CALL V$TX ;OUTPUT ERROR MESSAGE BR 160$ ;EXIT RESTORING REGISTERS ; .PAGE .SBTTL . PERFORM I/O ; 100$: ;READ STRING SECTION CALL V$ON ;ASSIGN LUN IF NOT ASSIGNED .LIST ME QIOW$S V$FUN,V$LUN,V$EFN,,#V$ISB,,<#V$STR+2,R5,0,#V$S18+2,V$S18> .NLIST ME ; FUNCTION IN V$FUN LUN V$LUN EVENT FLAG V$EFN R5 CHARACTERS ; IF FUNCTION SET FOR INPUT AND PROMPT V$S18 = PROMPT STRING MOV V$ISB+2,V$STR ;STORE NUMBER OF CHARACTERS READ CMPB V$ISB+1,#13. ;WAS TERMINATION BY CR BNE 160$ ;J IF OTHER TERMINATOR MOV #V$01,R0 ;HOLD LF CHARACTER CALL V$TX ;OUTPUT LF CHARACTER ; 160$: ;RESTORE REGISTERS UNSAVE R3,R4,R5 ;RESTORE R3 TO R5 ; 180$: MOV #V$STR,R0 ;R0 -> INPUT STRING ADDRESS RETURN ;EXIT ; .END ; ;