; ; CUR.MAC ; ; A SUBROUTINE TO TEST THE POSITIONING OF THE CURSOR ON EITHER ; A HAZELTINE TERMINAL OR A VT-52. IF A VT-52 IS USED. THE ; FIRST ARGUMENT IS 1. IF A HAZELINE IS USED THE FIRST ARGUMENT ; IS 2. ; TO POSITION THE CURSOR FROM A FORTRAN PROGRAM GIVE THE COMMAND ; CALL CUR CUR(TERM,VER,HOR,[MONITOR]) WHERE TERM IS 1 OR 2. ; VER IS THE VERTICAL ; DISTANCE (2 TO 24 FOR A VT-52 AND 1 TO 23 FOR A HAZELTINE). ; HOR IS THE HORIZONTAL DISTANCE (1 TO 80 FOR A VT-52 AND 0 TO 79 ; FOR A HAZELTINE). MONITOR IS AN OPTIONAL ARGUMENT WHICH IS ; IF IT IS 1, WILL POSITION THE CURSOR, IF 0, WILL NOT ; ; TO ERASE A LINE, GIVE THE COMMAND CALL ELINE(TERM,VER,[MONITOR]) ; ; TO ERASE THE ENTIRE SCREEN, GIVE THE COMMAND CALL ERASE(TERM,[MONITOR]) ; IN ALL CASES, THE ARGUMENT, MONITOR IS OPTIONAL AND IF NOT CALLED ; WILL DEFAULT TO MONITORING ; THE ARGUMENTS, TERM AND MONITOR, MUST BE BYTES, HOR AND VER MUST BE ; INTEGERS. ; ; .TITLE CUR .MCALL QIOW$C,QIOW$S CUR:: CMPB (R5),#4 ; ARE THERE 4 ARGUMENTS BLT 1$ ; WE WANT TO POSITION THE CURSOR TSTB @10(R5) ; ARGUMENT WAS THERE, WHAT IS IT? BEQ DONE ; WAS 0 SO DON'T WANT TO POSITION CUR 1$: MOVB @2(R5),R1 ; GET 1ST ARG. (WHAT TERMINAL IS THIS?) BIC #177400,R1 ; CLEAR 1ST BYTE OF R1 CMP R1,#1 ; ISTHIS A V-52 BEQ VT52 ; YES IT IS CMP R1,#2 ; IS THIS A HAZELTINE TERMINAL BEQ HAZ ; YES IT IS CMP R1,#3 ; IS THIS A VT100 BEQ VT100 ; YES IT IS JMP ER1 ; IF GET HERE IT ISN'T EITHER BR DONE HAZ: MOV @4(R5),R1 ; GET THE LINE NO. ADD #31.,R1 ; ADD ONLY 31 BECAUSE FORTRAN MUST PUT A LINE ; FEED BEFORE EXECUTING. IF THIS WAS BEING ; USED BY MACRO PROGRAM PROBABLY ADD 32. MOVB R1,TAB+3 MOV @6(R5),R1 ; GET THE COLUMN NO. CMP R1,#31. ; COL NO. LESS THAN 32, ADD 96 TO BGT HAZ2 ADD #96.,R1 ; COL NO. 32 OR MORE; USE AS IS. HAZ2: MOVB R1,TAB+2 QIOW$C IO.WVB,5,1,,,, DONE: RETURN VT52: MOV @4(R5),R1 ADD #36,R1 ; ADD ONLY 36 BECAUSE APPARENTLY FORTRAN ; DOES A LINE FEED BEFORE WRITING. ; IF USED MACRO PROGRAM WOULD PROB ; ADD 37 MOVB R1,TAV+2 MOV @6(R5),R1 ; GET THE HORIZONTAL DISTANCE ADD #37,R1 MOVB R1,TAV+3 QIOW$C IO.WVB,5,1,,,, BR DONE ; ; COMPUTE CURSOR FOR VT100 ; ; VT100: MOV @4(R5),R1 ; GET Y VALUE (LINE NO.) MOV #CU,R0 ADD #2,R0 ; GOT ADDRESS OF WHERE IT WILL GO CLR R2 ; SURPRESS LEADING ZEROES CALL $CBDMG ; CHANGE TO DECIMAL ASCII MOVB #73,(R0)+ ; PUT A SEMICOLON NEXT MOV @6(R5),R1 ; GET X VALUE (COLUMN NO.) CLR R2 CALL $CBDMG MOVB #110,(R0)+ ; STRING MUST END WITH CAP H SUB #CU,R0 ; GET LENGTH OF STRING QIOW$S #IO.WVB,#5,#1,,,,<#CU,R0> ; TRANSMIT STRING RETURN ELINE:: CMPB (R5),#3 ; ARE THERE 3 ARGUMENTS? BLT 2$ ; NO ARGUMENT ABOUT MONITORING OR NOT TSTB @6(R5) ; DO WE MONITOR BEQ DONE ; NO WE DON'T 2$: MOVB @2(R5),R1 ; GET FIRST ARGUMENT CMP R1,#1 ; IS THIS A VT-52 BEQ ELVT ; YES IT IS. CMP R1,#2 ; IS THIS A HAZELINE BEQ ELHA ; YES IT IS. BR ER1 ; IT IS NEITHER ELVT: MOV @4(R5),R1 ; ERASE A LINE ON VT-52 ADD #37,R1 MOVB R1,ELV QIOW$C IO.WVB,5,1,,,, BR DONE ELHA: MOV @4(R5),R1 ; ERASE A LINE ON HAZELTINE ADD #32.,R1 MOVB R1,TAB+3 CLRB TAB+2 QIOW$C IO.WVB,5,1,,,, ; GO TO THAT LINE QIOW$C IO.WVB,5,1,,,, ; ERASE THAT LINE BR DONE ERASE:: CMPB (R5),#2 ; IS MON AN ARGUMENT (IS THERE MORE THAN 1 ARG) BLT 3$ ; ONLY 1 ARGUMENT TSTB @4(R5) ; IS MON ZEROE BEQ DONE ; YES IT WAS 3$: MOVB @2(R5),R1 CMP R1,#1 BEQ ERAV CMP R1,#2 BEQ ERH CMP R1,#3 BEQ ERV1 BR ER1 ERAV: QIOW$C IO.WVB,5,1,,,, BR DONE ERH: QIOW$C IO.WVB,5,1,,,, ; ERASE THE HAZELTINE CRT BR DONE ERV1: QIOW$C IO.WVB,5,1,,,, RETURN ER1: QIOW$C IO.WVB,5,1,,,, RETURN TAB: .BYTE 33,21,0,0 ; CURSOR POSITION ON HAZELTINE TAV: .BYTE 33,131,0,0 ; CURSOR POSITION ON VT-52 EL: .BYTE 33,17 ; ERASE LINE ON A HAZELINE ELLV: .BYTE 33,131 ; ERASE LINE ON VT-52 ELV: .BYTE .BYTE 40,33,113 ER: .BYTE 33,34 ERV: .BYTE 33,110,33,112 CU: .BYTE 33,133 .BLKB 10. ER100: .BYTE 33,133,62,112 MES1: .ASCII / WRITING TO NEITHER A HAZELTINE OR A VT-52/ L1=.-MES1 .END