; THIS MODULE CONTAINS THE SYSTIME MARK3 GRAPHICS ROUTINES. ; ; ; ; THE FOLLOWING ROUTINES ARE CONTAINED IN THIS MODULE: ; ; ; ; BOX - DRAW A BOX ; ; AXIS - DRAW AN AXIS ; ; HLINE - DRAW A HORIZONTAL LINE ; ; VLINE - DRAW A VERTICAL LINE ; ; ; ;==============================================================================; ;==============================================================================; ; ; ; ; ; CALLING CONVENTION: ; ; =================== ; ; ; ; THE ROUTINES HAVE A STANDARD $CALLG INTERFACE: ; ; ; ; CALL BOX (LINE,COL,LINLEN,COLLEN[,IERR) ; ; CALL AXIS (LINE,COL,LINLEN,COLLEN[,IERR) ; ; CALL HLINE (LINE,COL,LINLEN[,IERR) ; ; CALL VLINE (LINE,COL,LINLEN[,IERR) ; ; ; ; WHERE: ; ; ; ; LINE - THE START LINE NUMBER OF THE FIGURE ; ; COL - THE START COLUMN NUMBER OF THE FIGURE ; ; LINLEN - THE LENGTH OF THE LINE TO DRAW ; ; COLLEN - THE LENGTH OF THE COLUMN SIDE TO DRAW ; ; IERR - OPTIONAL ERROR PARAMETER ; ; ; ; NOTE: ; ; ; ; ALL PARAMETERS ARE OF I2 TYPE. ; ; ; ; NEGATIVE LENGTHS WILL BE INTERPRETED CORRECTLY. ; ; ; ; ; ; EXTERNAL REFERENCES: ; ; ==================== ; ; ; ; ERROR CONDITIONS: ; ; ================= ; ; ; ; TWO ERROR CONDITIONS MAY BE DETECTED: ; ; ; ; 1. ILLEGAL NUMBER OF PARAMETERS PROVIDED ; ; ERROR NUMBER = 1 ; ; 2. INVALID DATA VALUE ; ; ERROR NUMBER = 6 ; ; ; ; ERRORS ARE RETURNED IN R0 AND WHERE PROVIDED, IN THE ERROR ; ; PARAMETER. .PAGE .TITLE GPHINT .ident /V01X01/ .MCALL QIOW$S ; ; ; ; ; DUE TO SHORTAGE OF REGISTERS, THE RE-CALCULATED PARAMETERS ; ARE KEPT IN A LOCAL PARAMETER LIST. THIS PARAMETER LIST ; IS DUMPED ONTO THE STACK BEFORE THE THREAD SWITCH. ; PLIST: .BLKW 4 ; LOCAL PARAMETER LIST ; ; ; .PAGE .SBTTL SUBROUTINE HLINE - DESCRIPTION ;====================================== ; ; ; ; THIS ROUTINE IS THE USER INTER-FACE ROUTINE WHICH IS USED ; TO DRAW A GRAPHIC HORIZONTAL LINE ON PAGE 2 OF THE MARK3 ; VDU. ; ; ON ENTRY: ; ; @2(R5) = THE START LINE NUMBER ; @4(R5) = THE START COLUMN NUMBER ; @6(R5) = THE LENGTH OF THE LINE ; ; IF THE LENGTH IS NEGATIVE, THEN THE COLUMN NUMBER PROVIDED ; IS ASSUMED TO BE THE END COLUMN OF THE REQUIRED LINE. ; ; CHECKS ARE MADE SO THAT: ; ; 1. THE LENGTH IS NOT ZERO ; 2. THE LINE NUMBER IS BETWEEN 1 AND 25 ; 3. THE START COLUMN IS BETWEEN 1 SND 80 ; 4. THE END COLUMN IS BETWEEN 1 AND 80 ; ; .PAGE .SBTTL SUBROUTINE HLINE - CODE ;=============================== ; ; ; ; HLINE:: MOV R0,-(SP) MOV R1,-(SP) MOV R2,-(SP) MOV R3,-(SP) MOV R4,-(SP) ; ; ; FIRST CHECK THAT A VALID NUMBER OF PARAMETERS HAS BEEN PROVIDED. ; IF SO, REMEMBER THE ADDRESS OF THE RETURN PARAMETER. IF NOT, ; EXIT WITH -1. ; MOV #4,R0 ; 4 PARAMETERS EXPECTED CALL PRMCHK ; CHECK CORRECT NUMBER PROVIDED MOV R0,-(SP) ; remember error param address BGE 30$ ; YES --> MOV #1,R1 ; ERROR RETURN JMP EREXIT ; ERROR EXIT ; ; ; ; THIS PATCH OF CODE IS BRANCHED TO WHEN AN PARAMETER ERROR IS ; DISCOVERED. ; 20$: MOV #6,R1 ; ERROR CODE JMP EREXIT ; NORMAL EXIT CODE ; ; ; ; 30$: MOV @4(R5),R3 ; COLUMN NUMBER PARAMETER MOV @6(R5),R4 ; LENGTH PARAMETER ; ; ; .PAGE .SBTTL SUBROUTINE HLINE - CODE 2 ;================================= ; ; ; ; THIS SECTION OF CODE VALIDATES THE PARAMETER VALUES. ; ; ; THE LINE NUMBER MUST BE IN THE RANGE 1 - 24 ; TST @2(R5) ; IS LINE < 0 ? BLE 20$ ; YES - ERROR. CMP @2(R5),#24. ; LINE > 24 ? BGT 20$ ; YES - ERROR. ; ; ; THE LENGTH MAY NOT BE ZERO ; TST R4 ; IS THE LENGTH 0 ? BEQ 20$ ; YES - ERROR. ; ; ; IF THE LENGTH IS -VE THEN ADJUST THE COLUMN ; TST R4 ; IS LENGTH -VE ? BGT 40$ ; NO - > ADD R4,R3 ; YES - ADJUST COLUMN AND INC R3 ; (TAKING LAST POS INTO CONS) NEG R4 ; ... NEGATE THE LENGTH. ; ; ; SEE IF FIRST COLUMN IS IN RANGE 1 - 80. ; 40$: TST R3 ; COLUMN = 0 OR -VE ? BLE 20$ ; YES - ERROR CMP R3,#80. ; COLUMN > 80 ? BGT 20$ ; YES - ERROR ; ; ; CALCULATE LAST COLUMN POSITION AND CHECK THAT ITS IN RANGE ; MOV R3,R1 ; R1 = FINAL ... ADD R4,R1 ; DEC R1 ; .. COLUMN POSITION. TST R1 ; LAST COLUMN > 0 BLE 20$ ; NO - ERROR CMP R1,#80. ; LAST COLUMN > 80 BGT 20$ ; YES - ERROR MOV R4,-(SP) ; REMEMBER LINE LENGTH ON STACK ; ; .PAGE .SBTTL SUBROUTINE HLINE - CODE 3 ;================================= ; ; ; ; THE PARAMETER CHECKING IS COMPLETE - WE NOW CREATE THE ; APPROPRIATE GRAPHIC SEQUENCES. ; ; FIRST INITIALISE TO GRAPHICS ; CALL GON ; SWITCH GRAPHICS ON ; ; ; NOW POSITION AT THE START LINE / COLUMN ; MOV @2(R5),R0 ; LINE POSITION PARAMETER MOV R3,R1 ; COLUMN POSITION PARAMETER CALL POS ; POSITION CURSOR ; ; ; NOW DRAW THE HORIZONTAL LINE FOR AS MANY CHARACTERS AS ; REQUIRED. ; MOV (SP)+,R0 ; NO OF CHARS IN LINE CALL HL ; DRAW THE LINE ; ; ; NOW SWITCH OFF THE GRAPHICS ; CALL GOFF ; SWITCH OFF GRAPHICS ; ; ; ALL IS DONE - NOW PERFORM THE EXIT TO THE CALLING ROUTINE ; CLR R0 ; SIGNIFY SUCCESS JMP EXIT ; COMMON EXIT ; ; .PAGE .SBTTL SUBROUTINE VLINE - DESCRIPTION ;====================================== ; ; ; ; THIS ROUTINE IS THE USER INTER-FACE ROUTINE WHICH IS USED ; TO DRAW A GRAPHIC VERTICAL LINE ON PAGE 2 OF THE MARK3 ; VDU. ; ; ON ENTRY: ; ; @2(R5) = THE START LINE NUMBER ; @4(R5) = THE START COLUMN NUMBER ; @6(R5) = THE LENGTH OF THE LINE ; ; IF THE LENGTH IS NEGATIVE, THEN THE LINE NUMBER PROVIDED ; IS ASSUMED TO BE THE END LINE OF THE REQUIRED LINE. ; ; CHECKS ARE MADE SO THAT: ; ; 1. THE LENGTH IS NOT ZERO ; 2. THE LINE NUMBER IS BETWEEN 1 AND 25 ; 3. THE START COLUMN IS BETWEEN 1 SND 80. ; 4. THE END LINE IS BETWEEN 24 AND 80. ; ; .PAGE .SBTTL SUBROUTINE VLINE - CODE ;=============================== ; ; ; ; VLINE:: MOV R0,-(SP) MOV R1,-(SP) MOV R2,-(SP) MOV R3,-(SP) MOV R4,-(SP) ; ; ; FIRST CHECK THAT A VALID NUMBER OF PARAMETERS HAS BEEN PROVIDED. ; IF SO, REMEMBER THE ADDRESS OF THE RETURN PARAMETER. IF NOT, ; EXIT WITH -1. ; MOV #4,R0 ; 4 PARAMETERS EXPECTED CALL PRMCHK ; CHECK CORRECT NUMBER PROVIDED TST R0 ; O.K. ? BGE 10$ ; YES --> MOV #1,R1 ; MMS CODE JMP EREXIT ; ERROR EXIT ; 10$: MOV R0,-(SP) ; REMEMBER ERROR PARAM ADDRESS BR 30$ ; AND CONTINUE ; ; ; ; THIS PATCH OF CODE IS BRANCHED TO WHEN AN PARAMETER ERROR IS ; DISCOVERED. ; 20$: MOV #6,R1 ; MMS CODE JMP EREXIT ; ERROR EXIT ; ; ; ; 30$: MOV @2(R5),R3 ; LINE NUMBER PARAMETER MOV @6(R5),R4 ; LENGTH PARAMETER ; ; ; .PAGE .SBTTL SUBROUTINE VLINE - CODE 2 ;================================= ; ; ; ; THIS SECTION OF CODE VALIDATES THE PARAMETER VALUES. ; ; ; THE COLUMN NUMBER MUST BE IN THE RANGE 1 - 80 ; TST @4(R5) ; IS COLUMN < 0 ? BLE 20$ ; YES - ERROR. CMP @4(R5),#80. ; LINE > 80 ? BGT 20$ ; YES - ERROR. ; ; ; THE LENGTH MAY NOT BE ZERO ; TST R4 ; IS THE LENGTH 0 ? BEQ 20$ ; YES - ERROR. ; ; ; IF THE LENGTH IS -VE THEN ADJUST THE LINE ; TST R4 ; IS LENGTH -VE ? BGT 40$ ; NO - > ADD R4,R3 ; YES - ADJUST COLUMN AND INC R3 ; (TAKING LAST POS INTO CONS) NEG R4 ; ... NEGATE THE LENGTH. ; ; ; SEE IF FIRST LINE IS IN RANGE 1 - 24. ; 40$: TST R3 ; LINE = 0 OR -VE ? BLE 20$ ; YES - ERROR CMP R3,#24. ; LINE > 24 ? BGT 20$ ; YES - ERROR ; ; ; CALCULATE LAST LINE POSITION AND CHECK THAT ITS IN RANGE ; MOV R3,R1 ; R1 = FINAL ... ADD R4,R1 ; DEC R1 ; .. LINE POSITION. TST R1 ; LAST LINE > 0 BLE 20$ ; NO - ERROR CMP R1,#24. ; LAST LINE > 24 BGT 20$ ; YES - ERROR ; ; ; PRESERVE CORRECTED PARAMETERS ON THE STACK ; MOV R3,-(SP) ; LINE LENGTH MOV R4,-(SP) ; LINE START ; ; .PAGE .SBTTL SUBROUTINE VLINE - CODE 3 ;================================= ; ; ; ; THE PARAMETER CHECKING IS COMPLETE - WE NOW CREATE THE ; APPROPIATE GRAPHIC SEQUENCES. ; ; FIRST INITIALISE TO GRAPHICS ; CALL GON ; SWITCH GRAPHICS ON ; ; ; NOW DRAW THE VERTICAL LINE FOR AS MANY CHARACTERS AS ; REQUIRED. ; MOV (SP)+,R0 ; NO OF CHARS IN LINE MOV (SP)+,R1 ; LINE START MOV @4(R5),R2 ; COLUMN POSITION CALL VL ; DRAW THE LINE ; ; ; NOW SWITCH OFF THE GRAPHICS ; CALL GOFF ; SWITCH OFF GRAPHICS ; ; ; ALL IS DONE - NOW PERFORM THE EXIT TO THE CALLING ROUTINE ; CLR R0 ; SIGNIFY SUCCESS JMP EXIT ; COMMON EXIT ; ; .PAGE .SBTTL SUBROUTINE BOX - DESCRIPTION ;====================================== ; ; ; ; THIS ROUTINE IS THE USER INTER-FACE ROUTINE WHICH IS USED ; TO DRAW A RECTANGULAR COX ON PAGE 2 OF THE MARK3 VDU. ; ; ON ENTRY: ; ; @2(R5) = THE START LINE NUMBER ; @4(R5) = THE START COLUMN NUMBER ; @6(R5) = THE LENGTH OF THE LINE ; @8.(R5) = THE LENGTH OF THE COLUMN SIDE ; ; IF LENGTHS ARE NEGATIVE THEN IT IS ASSUMED THAT THE CORRES- ; PONDING LINE BOUNDARY IS AN END PARAMETER RATHER THAN A ; START. ; ; CHECKS ARE MADE SO THAT: ; ; 1. THE LENGTH IS NOT ZERO ; 2. THE LINE NUMBER IS BETWEEN 1 AND 25 ; 3. THE START COLUMN IS BETWEEN 1 AND 80 ; 4. THE END LINE IS BETWEEN 1 AND 24 ; 5. THE END COLUMN IS BETWEEN 1 AND 80 ; ; .PAGE .SBTTL SUBROUTINE BOX - CODE 1 ;================================= ; ; ; ; BOX:: MOV R0,-(SP) MOV R1,-(SP) MOV R2,-(SP) MOV R3,-(SP) MOV R4,-(SP) ; ; ; FIRST CHECK THAT A VALID NUMBER OF PARAMETERS HAS BEEN PROVIDED. ; IF SO, REMEMBER THE ADDRESS OF THE RETURN PARAMETER. IF NOT, ; EXIT WITH -1. ; MOV #5,R0 ; 4 PARAMETERS EXPECTED CALL PRMCHK ; CHECK CORRECT NUMBER PROVIDED TST R0 ; O.K. ? BGE 10$ ; YES --> MOV #1,R1 ; MMS CODE JMP EREXIT ; ERROR EXIT ; ; 10$: MOV R0,-(SP) ; REMEMBER ERROR PARAM ADDRESS BR 30$ ; AND CONTINUE ; ; ; THIS PATCH OF CODE IS ENTERED WHEN A PARAMETER ERROR IS ; ENCOUNTERED. ; 20$: MOV #6,R1 ; MMS CODE JMP EREXIT ; ERROR EXIT ; ; ; ; 30$: MOV @2(R5),R3 ; LINE NUMBER MOV @4(R5),R4 ; COLUMN NUMBER MOV @6(R5),R0 ; LINE LENGTH MOV @8.(R5),R1 ; COLUMN LENGTH ; ; ; .PAGE .SBTTL SUBROUTINE BOX - CODE 2 ;================================= ; ; ; ; THIS SECTION OF CODE CHECKS THE PARAMETER VALUES ; ; ; LINE CHECKING ; TST R0 ; LINE LENGTH NEGATIVE ? BGT 40$ ; NOT NEGATIVE ADD R0,R3 ; TIS NEGATIVE - ADJUST LENGTH INC R3 ; NEG R0 ; NEGATE LENGTH 40$: CMP R0,#2 ; LESS THAN 2 ? BLT 20$ ; YES - ERROR. TST R3 ; LINE IS NEGATIVE ? BLE 20$ ; YES - ERROR MOV R3,R2 ; R2 = LAST COLUMN POSITION ADD R0,R2 ; DEC R2 ; CMP R2,#24. ; IN RANGE ? BGT 20$ ; NO - ERROR ; ; ; COLUMN CHECKING ; TST R1 ; COLUMN LENGTH NEGATIVE ? BGT 50$ ; NOT NEGATIVE ADD R1,R4 ; TIS NEGATIVE - ADJUST LENGTH INC R4 ; NEG R1 ; NEGATE LENGTH CMP R1,#2 ; LESS THAN 2 ? ; 50$: BLT 20$ ; YES - ERROR. ; TST R4 ; COLUMN IS NEGATIVE ? BLE 20$ ; YES - ERROR MOV R4,R2 ; R2 = LAST COLUMN POSITION ADD R1,R2 ; DEC R2 ; CMP R2,#80. ; IN RANGE ? BGT 20$ ; NO - ERROR ; ; ; THE PARAMETERS HAVE BEEN RE-CALCULATED TO TAKE INTO ACCOUNT ; NEGATIVE LINE LENGTHS. DUMP THE NEW PARAMETERS INTO THE ; PARAMETER LIST. ; MOV R3,PLIST ; LINE START MOV R0,PLIST+2 ; LINE LENGTH MOV R4,PLIST+4 ; COLUMN START MOV R1,PLIST+6 ; COLUMN LENGTH ; .PAGE .SBTTL SUBROUTINE BOX - CODE 3 ;================================= ; ; ; THIS SECTION OF CODE DRAWS THE BOX ; ; ; INITIALISE THE GRAPHICS ; CALL GON ; SWITCH GRAPHICS ON ; ; ; POSITION AT TOP LEFT AND DRAW ANGLE ; MOV PLIST,R0 ; R0 = LINE MOV PLIST+4,R1 ; R1 = COLUMN CALL POS ; POSITION CURSOR MOV #2,R0 ; R0 = TOP LEFT CALL CORNER ; DRAW ANGLE CHARACTER ; ; ; DRAW THE NORTH LINE ; MOV PLIST+6,R0 ; DRAW LINE SUB #2,R0 ; CALL HL ; ; ; ; DRAW TOP RIGHT CORNER ; MOV #1,R0 ; PARAMETER ... CALL CORNER ; FOR DRAWING CORNERS ; ; ; NOW DRAW THE WEST LINE ; ; MOV PLIST+2,R0 ; R0 = NUMBER OF VERTICAL CHARS SUB #2,R0 ; ... - THE ANGLE CHARACTERS MOV R3,R1 ; R1 = ANGLE LINE POSITION INC R1 ; R1 = LINE BELOW ANGLE MOV PLIST+4,R2 ; R2 = COLUMN CALL VL ; DRAW THE VERTICAL LINE ; ; ; DRAW BOTTOM LEFT ANGLE AND THE SOUTH FACE ; MOV #3,R0 ; R0 = BOTTOM LEFT ANGLE CODE CALL CORNER ; DRAW IT MOV PLIST+6,R0 ; NUMBER OF CHARS IN LINE SUB #2,R0 ; ... - THE CORNERS CALL HL ; DRAW BOTTOM LINE ; ; .PAGE .SBTTL SUBROUTINE BOX - CODE 4 ;================================= ; ; ; ; ; ADD THE THIRD CORNER ; CLR R0 ; R0 = BOTTOM RIGHT ANGLE CALL CORNER ; DRAW IT ; ; ; NOW DRAW THE LAST LINE ON THE EAST FACE ; MOV PLIST+2,R0 ; LINE LENGTH ... SUB #2,R0 ; ... - THE ANGLES MOV R3,R1 ; THE LINE POSITION ... INC R1 ; + THE ANGLE MOV PLIST+4,R2 ; THE COLUMN POSITON ... ADD PLIST+6,R2 ; DEC R2 ; (ADJUSTED) CALL VL ; DRAW THE LINE ; ; ; SWITCH OFF THE GRAPHICS ; CALL GOFF ; SWITCH OFF GRAPHICS AND OUTPUT ; ; ; ALL DONE - RETURN ; CLR R0 ; SIGNIFY SUCCESS JMP EXIT ; COMMON EXIT .PAGE .SBTTL SUBROUTINE AXIS - DESCRIPTION ;====================================== ; ; ; ; THIS ROUTINE IS THE USER INTER-FACE ROUTINE WHICH IS USED ; TO DRAW A RECTANGULAR AXIS ON PAGE 2 OF THE MARK3 VDU. ; ; ON ENTRY: ; ; @2(R5) = THE START LINE NUMBER ; @4(R5) = THE START COLUMN NUMBER ; @6(R5) = THE LENGTH OF THE LINE ; @8.(R5) = THE LENGTH OF THE COLUMN SIDE ; ; THE ORIENTATION OF THE AXIS IS DETERMINED BY THE SIGN OF ; THE LENGTHS. ; ; CHECKS ARE MADE SO THAT: ; ; 1. THE LENGTH IS NOT ZERO ; 2. THE LINE NUMBER IS BETWEEN 1 AND 25 ; 3. THE START COLUMN IS BETWEEN 1 AND 80 ; 4. THE END LINE IS BETWEEN 1 AND 24 ; 5. THE END COLUMN IS BETWEEN 1 AND 80 ; ; .PAGE .SBTTL SUBROUTINE AXIS - CODE 1 ;================================= ; ; ; ; AXIS:: MOV R0,-(SP) MOV R1,-(SP) MOV R2,-(SP) MOV R3,-(SP) MOV R4,-(SP) ; ; ; FIRST CHECK THAT A VALID NUMBER OF PARAMETERS HAS BEEN PROVIDED. ; IF SO, REMEMBER THE ADDRESS OF THE RETURN PARAMETER. IF NOT, ; EXIT WITH -1. ; MOV #5,R0 ; 4 PARAMETERS EXPECTED CALL PRMCHK ; CHECK CORRECT NUMBER PROVIDED TST R0 ; O.K. ? BGE 10$ ; YES --> MOV #1,R1 ; MMS CODE JMP EREXIT ; ERROR EXIT ; 10$: MOV R0,-(SP) ; REMEMBER ERROR PARAM ADDRESS BR 30$ ; AND CONTINUE ; ; ; THIS PATCH OF CODE IS ENTERED WHEN A PARAMETER ERROR IS ; ENCOUNTERED. ; 20$: MOV #6,R1 ; MMS CODE JMP EREXIT ; ERROR EXIT CODE ; ; ; ; ; .PAGE .SBTTL SUBROUTINE AXIS - CODE 2 ;================================= ; ; ; ; THIS SECTION OF CODE CHECKS THE PARAMETER VALUES ; ; ; LINE CHECKING ; 30$: MOV @2(R5),R3 ; CALCULATE NEW EXTREME LINE POS ADD @6(R5),R3 ; DEC R3 ; TST @6(R5) ; LINE LENGTH NEGATIVE ? BGT 40$ ; NOT NEGATIVE ADD #2,R3 ; ADJUST FINAL EXTREME ; 40$: TST @2(R5) ; ORIG LINE IS NEGATIVE ? BLE 20$ ; YES - ERROR TST R3 ; NEW LINE IS NEGATIVE ? BLE 20$ ; YES - ERROR CMP @2(R5),#24. ; OLD LINE IS IN RANGE ? BGT 20$ ; NO - ERROR CMP R3,#24. ; NEW LINE IN RANGE ? BGT 20$ ; NO - ERROR ; ; ; COLUMN CHECKING ; MOV @4(R5),R4 ; CALCULATE NEW EXTREME COLUMN POS ADD @8.(R5),R4 ; DEC R4 ; TST @8.(R5) ; COLUMN LENGTH NEGATIVE ? BGT 50$ ; NOT NEGATIVE ADD #2,R4 ; ADJUST FINAL EXTREME 50$: MOV R4,PLIST ; PLIST = COLUMN ORIGIN ; TST @4(R5) ; ORIG COLUMN IS NEGATIVE ? BLE 20$ ; YES - ERROR TST R4 ; NEW COLUMN IS NEGATIVE ? BLE 20$ ; YES - ERROR CMP @4(R5),#80. ; OLD COLUMN IS IN RANGE ? BGT 20$ ; NO - ERROR CMP R4,#80. ; NEW COLUMN IN RANGE ? BGT 20$ ; NO - ERROR ; ; .PAGE .SBTTL SUBROUTINE AXIS - CODE 3 ;================================= ; ; ; ESTABLISH WHICH CORNER IS REQUIRED IN R4 ; MOV @6(R5),R0 ; R0 = GIVEN LINE LENGTH MOV @8.(R5),R1 ; R1 = GIVEN COLUMN LENGTH TST R0 ; LINE NEGATIVE ? BLT 60$ ; YES --> ; ; ; POSTIVE LINE ; MOV #2,-(SP) ; ASSUME POSITIVE COLUMN TST R1 ; IS IT ? BGT 70$ ; YES --> DEC (SP) ; NO - ADJUST COLUMN PARAMETER BR 70$ ; FINISHED ; ; ; NEGATIVE LINE ; 60$: MOV #3,-(SP) ; ASSUME POSITIVE COLUMN TST R1 ; IS IT ? BGT 70$ ; YES --> CLR (SP) ; NO - ADJUST CORNER PARAMETER ; ; .PAGE .SBTTL SUBROUTINE AXIS - CODE 4 ;================================= ; ; ; DRAWING THE AXIS ; ; ; SWITCH GRAPHICS ON ; 70$: CALL GON ; SWITCH GRAPHICS ON ; ; ; DRAW THE COLUMN AXIS ; MOV @2(R5),R0 ; POSITION LINE NUMBER MOV @4(R5),R1 ; ASSUME POSTIVE COLUMN CMP @4(R5),PLIST ; TRUE ? BLT 80$ ; YES --> MOV PLIST,R1 ; NO - START AT BACK END ! 80$: CALL POS ; POSTION AT LEAST SIG, END MOV @8.(R5),R0 ; NUMBER OF CHARS TO DRAW BGE 85$ ; NEG R0 ; 85$: CALL HL ; DRAW HORIZONATL LINE ; ; ; DRAW THE LINE AXIS ; MOV @4(R5),R2 ; POSITION COLUMN NUMBER MOV @2(R5),R1 ; ASSUME POSTIVE LINE CMP @2(R5),R3 ; TRUE ? BLT 90$ ; YES --> MOV R3,R1 ; NO - START AT BACK END ! 90$: MOV @6(R5),R0 ; NUMBER OF CHARS TO DRAW BGE 95$ ; NEG R0 ; 95$: CALL VL ; DRAW VERTICAL LINE ; ; ; POSITION AT CORNER POSITION ; MOV @2(R5),R0 ; CORNER LINE POSITION MOV @4(R5),R1 ; CORNER COLUMN POSITION CALL POS ; POSITION CURSOR ; ; ; DRAW APPROPIATE CORNER AS CALCULATED ABOVE ; MOV (SP)+,R0 ; POP CORNER PARAMETER OFF STACK CALL CORNER ; DRAW THE CORNER ; ; ; ALL DONE - SWITCH OFF THE GRAPHICS OUTPUT AND RETURN ; CALL GOFF ; SWITCH OFF GRAPHICS CLR R0 ; SIGNIFY SUCCESS BR EXIT ; JOIN COMMON EXIT CODE .PAGE .SBTTL COMMON EXIT CODE ;======================= ; ; ; ; ; ; THIS SECTION OF CODE PERFORMS A COMMON EXIT FOR THE USER- ; INTERFACE ROUTINES. ; EXIT: ; NORMAL EXIT CODE ;==== ; ; MOV (SP)+,R1 ; R1 = ADDRES OF ERROR PARAM BEQ EXIT1 ; IF 0, NONE EXISTS. CLR (R1) ; DOES EXIST - FILL WITH RETURN ; EXIT1: TSTB OUT ; Output it? BEQ 10$ ; No - carry on TST BYTCNT ; Anything to output? BEQ 10$ ; No - carry on CALL OUTPUT ; Output it ; Output it all ; 10$: MOV (SP)+,R4 ; Restore Registers MOV (SP)+,R3 MOV (SP)+,R2 MOV (SP)+,R1 MOV (SP)+,R0 RETURN ; RETURN TO USER PROGRAM ; ; ; ERROR EXIT ; ; ; EREXIT: ; ERROR EXIT CODE ;====== ; ; MOV (SP)+,R4 ; IS THERE AN ERROR PARAMETER BLE 10$ ; NO --> MOV R1,(R4) ; LOAD THE ERROR REPLY 10$: BR EXIT1 ; Common Exit ; ; ; .PAGE .SBTTL SUBROUTINE BUFCHK - DESCRIPTION AND CODE ;=============================================== ; ; ; ; ; THIS ROUTINE IS USED TO CHECK WHETHER OR NOT THIS STAGE ; OF THE OPERATION WILL CAUSE THE OUTPUT BUFFER TO OVERFLOW. ; ; IF IT WILL NOT, THE ROUTINE SIMPLY RETURNS. ; ; IF IT DOES, THEN THE ROUTINE PRTGPH IS CALLED TO EMPTY THE ; OUTPUT BUFFER. THIS IS A SYNCHRONOUS OPERATION. ; ; BUFCHK: ; ENTRY POINT ;====== ; ; ; ; ON ENTRY R4 CONTAINS THE CURRENT ADDRESS OF THE INCREMENTED ; BUFFER. ; R0 CONTAINS THE NUMBER OF CHARACTERS THAT THE NEXT STAGE OF ; THE OPERATION WILL GENERATE. ; ; R4 + R0 MUST NOT EXCEED TOTBYT + ADDBUF ; ; MOV R4,-(SP) ; = POTENTIAL NEW ADDRESS ADD R0,(SP) ; MOV ADDBUF,-(SP) ADD TOTBYT,(SP) CMP (SP)+,(SP)+ ; Is There Room? BGE 10$ ; YES - SIMPLY CARRY ON. CALL OUTPUT ; YES - FIRST EMPTY THE BUFFER 10$: ADD R0,BYTCNT ; Count This lot RETURN ; RETURN WITH ENOUGH SPACE ; ; .PAGE .SBTTL SUBROUTINE GON - DESCRIPTION AND CODE ;=============================================== ; ; ; ; THIS ROUTINE IS CALLED BY EACH OF THE FOUR USER INTERFACE ; ROUTINES ONCE THE ELEMENETARY PARAMETER CHECKING HAS ; TAKEN PLACE AND WE ARE SURE THAT GRAPHIC OUTPUT WILL BE ; GENERATED. ; ; IT HAS THE FOLLOWING FUNCTIONS: ; ; 1. SET UP R4 TO POINT TO CURRENT POSITION IN ; OUTPUT STRING. ; ; 2. SET UP GRAPHICS SEQUENCE TO DIRECT OUTPUT ; TO PAGE 2 OF THE MARK 3. ; ; ; GON: ; ENTRY POINT ;=== ; ; ; R4 = CURRENT POSITION IN OUTPUT BUFFER ; MOV ADDBUF,R4 ADD BYTCNT,R4 ; ADD #3,BYTCNT ; ; ; DIRECT OUTPUT TO PAGE 2 OF THE MARK 3. ; MOVB #^O033,(R4)+ ; ESCAPE MOVB #^O117,(R4)+ ; ... O MOVB #^O062,(R4)+ ; ... 2 ; ; ; END OF INITIALISATION ; RETURN ; RETURN ; ; .PAGE .SBTTL SUBROUTINE GOFF - DESCRIPTION AND CODE ;=============================================== ; ; ; ; ; THIS ROUTINE IS USED TO TERMINATE A GRAPHICS SEQUENCE. IT ; PERFORMS THE FOLLOWING FUNCTIONS: ; ; 1. DIRECTS OUTPUT TO PAGE 1 ; 2. EMPTIES THE GRAPHICS BUFFER ; ; GOFF: ; ENTRY POINT ;==== ; ; ; FIRST ENSURE THAT WE CAN FIT TERMINATING SEQUENCE INTO THE ; BUFFER. ; MOV #3,R0 ; ROUTINE GENERATES 3 CHARACTERS CALL BUFCHK ; CHECK ROOM AND EMPTY IF NECESSARY ; ; ; DIRECT OUTPUT TO PAGE 1 ; MOVB #^O033,(R4)+ ; ESCAPE ... MOVB #^O117,(R4)+ ; ... O MOVB #^O061,(R4)+ ; ... 1 ; ; ; NOW EMPTY THE BUFFER ; CALL OUTPUT ; EMPTY THE BUFFER ; ; ; EXIT ; RETURN ; RETURN TO CALLING ROUTINE ; ; .PAGE .SBTTL SUBROUTINE POS - DESCRIPTION AND CODE ;=============================================== ; ; ; ; ; ; LINE AND COLUMN POSITION AND INSERTS INTO THE OUTPUT BUFFER THE ; REQUIRED ESCAPE SEQUENCE TO PSOTION THE CURSOR ON THE MARK 3. ; ; ; POS: ; ENTRY POINT ;=== ; ; ; CHECK THAT THERE IS ROOM IN THE OUTPUT BUFFER FOR THE SEQUENCE ; MOV R0,-(SP) MOV R1,-(SP) ;PRESERVE PARAMETERS MOV #5,R0 ; 5 CHARS GENERATED CALL BUFCHK ; CHECK THERE IS ROOM MOV (SP)+,R1 ; Restore the Parameters MOV (SP)+,R0 ; ; ; ; NOW INSERT THE ESCAPE SEQUENCE ; ADD #31.,R0 ; ADJUST LINE & COL ADD #31.,R1 ; MOVB #^O15,(R4)+ ; C/R TO CONFUSE THE DRIVER MOVB #^O033,(R4)+ ; ESCAPE ... MOVB #^O131,(R4)+ ; ... Y MOVB R0,(R4)+ ; ... LINE + 31 MOVB R1,(R4)+ ; ... COL + 31 ; ; ; ALL DONE ; SUB #31.,R0 ;RESET LINE & COL SUB #31.,R1 ; RETURN ; EXIT ; ; .PAGE .SBTTL SUBROUTINE CORNER - DESCRIPTION AND CODE ;=============================================== ; ; ; ; THIS ROUTINE INSERTS A GRAPHIC CORNER CHARACTER ON THE SCREEN ; AT THE CURRENT CURSOR POSITION. ; ; R0 CONTAINS THE CORNER REQUIRED: ; ; 0 = BOTTOM RIGHT ; 1 = TOP RIGHT ; 2 = TOP LEFT ; 3 = BOTTOM LEFT ; CORNER: ; ENTRY POINT ;====== ; ; ; FIRST CHECK THAT THERE IS ROOM FOR THE CHARACTER ; MOV R0,-(SP) ; PRESERVE THE PARAMETER MOV #1,R0 ; 1 CHARACTER GENERATED BY ROUTINE CALL BUFCHK ; CHECK THAT THERE IS ROOM ; ; ; NOW INSERT THE CHARACTER REQUIRED ; MOV (SP)+,R0 ; R0 = CHARACTER REQUIRED ADD #106.,R0 ; ADD FIRST CORNER CHARACTER VALUE MOVB R0,(R4)+ ; INSERT THE CHARACTER ; ; ; AND EXIT ; RETURN ; EXIT .. ; .PAGE .SBTTL SUBROUTINE HL - DESCRIPTION AND CODE ;=============================================== ; ; ; ; THIS ROUTINE DRAWS A HORIZONTAL LINE FROM THE CURRENT CURSOR ; POSITION FOR N CHARACTERS. ; ; ON ENTRY R0 CONTAINS THE NUMBER OF CHARACTERS TO BE DRAWN ; ; HL: ; ENTRY POINT ;== ; ; ; FIRST CHECK THAT THERE IS ENOUGH ROOM IN THE BUFFER FOR THE ; SEQUENCE. ; CALL BUFCHK ; CHECK THAT THERE IS ROOM ; ; ; NOW INSERT THE LINE CHARACTERS ; TST R0 ; ANY TO INSERT ? BEQ 20$ ; NO --> 10$: MOVB #^O161,(R4)+ ; INSERT EACH CHARACTER SOB R0,10$ ; ... IN TURN. ; ; ; ALL DONE - EXIT ; 20$: RETURN ; RETURN ; ; .PAGE .SBTTL SUBROUTINE VL - DESCRIPTION ;====================================== ; ; ; ; THIS ROUTINE INSERTS INTO THE OUTPUT BUFFER A VERTICAL LINE ; ; ON ENTRY: ; ; R0 = LINE LENGTH ; R1 = LINE NUMBER ; R2 = START COLUMN NUMBER ; ; ON EXIT, THE CURSOR IS POSITIONED IMMEDIATELY BELOW THE BOTTOM ; OF THE LINE. ; ; ; ; .PAGE .SBTTL SUBROUTINE VL - CODE ;=============================== ; ; ; ; CALCULATE NUMBER OF CHARACTERS GENERATED IN THE OUTPUT BUFFER ; VL: MOV R0,-(SP) ; Save Parameters MOV R1,-(SP) MOV R2,-(SP) MUL #6,R0 ; 6 CHARS PER CHARACTER MOV R1,R0 ; ADD #5,R0 ; + 5 FOR FINAL POSITION CALL BUFCHK ; CHECK THAT THERE IS ROOM MOV (SP)+,R2 ; Restore the Parameters MOV (SP)+,R1 ; MOV (SP)+,R0 ; ; ; NOW INSERT THE ESCAPE SEQUENCES ; ; FIRST THE POSITION ; ADD #31.,R1 ;ADJUST LINE & COL ADD #31.,R2 ; TST R0 ; NO CHARACTERS TO OUTPUT ? BEQ 20$ ; NO --> 10$: MOVB #^O015,(R4)+ ; C/R TO OVERCOME TERM DRIVER MOVB #^O033,(R4)+ ; ESCAPE ... MOVB #^O131,(R4)+ ; ... Y MOVB R1,(R4)+ ; ... LINE + 31 MOVB R2,(R4)+ ; ... COL + 31 ; ; ; NOW THE CHARACTER ; MOVB #^O170,(R4)+ ; VERTICAL LINE CHARACTER ; ; ; REPEAT FOR EACH CHARACTER ; INC R1 ; INCREMENT THE LINE NUMBER SOB R0,10$ ; REPEAT FOR EACH LINE ; ; ; ; NOW POINT THE POINTER TO BELOW THE LAST CHARACTER ; 20$: MOVB #^O015,(R4)+ ; C/R TO OVERCOME TERM DRIVER PROBLEM MOVB #^O033,(R4)+ ; ESCAPE ... MOVB #^O131,(R4)+ ; ... Y MOVB R1,(R4)+ ; ... LINE + 31 MOVB R2,(R4)+ ; ... COL + 31 ; ; ; ALL DONE - SO EXIT ; SUB #31.,R1 ;RESET LINE & COL SUB #31.,R2 ; RETURN ; EXIT .PAGE .SBTTL SUBROUTINE OUTPUT - DESCRIPTION AND CODE ;=============================================== ; ; ; ; ; THIS ROUTINE OUTPUTS THE CURRENT BUFFER TO THE SCREEN. ; ; OUTPUT: ; SEND PACKET TO TMS ;====== ; ; ; ; FIRST SAVE ODD REGISTERS JUST IN CASE ; QIOW$S #IO.WLB,LUN,#1,,,, MOV ADDBUF,R4 ; Reset R4 CLR BYTCNT ; And the count RETURN ; RETURN TO CALLING ROUTINE ; ; .PAGE .SBTTL END OF MODULE ;==================== ; ; ; .END