.TITLE DRAW / / 8 JUL 77 (011; PDH) ENSURE THAT 'CLEAR' HAS BEEN CALLED / 12 APR 77 (010; PDH) MAKE 13-BIT ADDRESS FOR 'CHRS .+2' / 2 FEB 77 (009; PDH) UPDATE TO HANDLE 'TEXT' FILES / 6 JUL 76 (008: PDH) CONVERT TO XVM/RSX V1A / 5 JUL 76 (007: PDH) MODIFY FOR USE WITH DOS F4 / 19 MAY 76 (006: PDH) MODIFY TO RUN ON THE PDP-15 WITH THE VT15 / 9 JUL 74 (PDH) REMOVE INTERACTION-WITH-CLOUDY PROBLEM / 25 JAN 74 (PDH) CORRECT PROBLEM WHEN ADDING ALREADY EXISTING FILE / 5 DEC 73 (PDH) CORRECT DELETION OF NON-EXISTENT FILE / 31 OCT 73 - PAUL HENDERSON / / SUBROUTINE TO CONNECT AND DISCONNECT DISPLAY FILES. / CALLING SEQUENCE: / / CALL DRAW (IVECT,FIRST,LAST) / / WHERE: IVECT IS THE NAME OF AN ARRAY CONTAINING THE DISPLAY FILE, / FIRST IS THE ELEMENT NUMBER OF THE START OF THE DISPLAY FILE, / LAST IS THE ELEMENT NUMBER OF THE END OF THE DISPLAY FILE, OR / ZERO IF THE DISPLAY FILE IS TO BE DELETED. / / TO ASSEMBLE FOR USE WITH 'WATRAN', NO PARAMETERS ARE REQUIRED. / TO ASSEMBLE FOR DEC FORTRAN, THE SYMBOL /F4=1 / MUST BE DEFINED. / / IF ASSEMBLED FOR WATRAN, A SEPARATE ENTRY POINT FOR ASSEMBLY / LANGUAGE CALLING PROGRAMS IS PROVIDED. THE NAME OF THIS ENTRY / POINT IS 'DRAWS', AND CALLING SEQUENCE REQUIRED IS SIMILAR TO / THE CALLING SEQUENCE FROM DEC FORTRAN. A VERY MUCH SIMPLIFIED / VERSION OF '.DA' IS CODED IN-LINE FOR THIS ENTRY POINT. / .EJECT / 'DRAW' HAS A QUITE LONG HISTORY, BEING ONE OF THE FIRST MEMBERS / OF THE UNIVERSITY OF WATERLOO GRAPHICS LIBRARY. IT HAS GONE / THROUGH SEVERAL CHANGES OF PHILOSOPHY SINCE THE ORIGINAL VERSION, / WHICH WAS AN 8K ONLY MODEL. THE PRESENT DISPLAY HARDWARE ALLOWS / DISPLAY FILES TO BE EXECUTED FROM ANY MEMORY BANK. THE DISPLAY / CAN INCREMENT ITS ADDRESS COUNTER ACROSS A BANK BOUNDARY, BUT / CANNOT JUMP ACROSS (SUBROUTINE MODE). THIS REQUIRES SPECIAL CARE / WHEN CHAINING FILES SO THAT THE NUMBER OF BANK BOUNDARY CROSSINGS / IS MINIMIZED. / / THE VT15 DOES NOT ALLOW A DISPLAY FILE TO CROSS A BANK BOUNDARY. / 'DRAW' WILL TRUNCATE SUCH FILES AT THE BOUNDARY CROSSING. / IDX=ISZ / INDEX POINTER, SKIP NOT EXPECTED INC=ISZ / INCREMENT POSITIVE COUNTER CHRI= 0 / CHARACTER IMMEDIATE - SINGLE CHARACTER CHRS=040000 / CHARACTER STRING (MEMORY REFERENCE) DJMP=600000 / .GLOBL DRAW,DR.W,FILER,CLEAR,CLOUDY,C.SWTH,P.BASE / .EJECT / NORMAL ENTRY FOR DEC FORTRAN, & SPECIAL ENTRY FOR WATRAN ASSEMBLY / LANGUAGE CALLS. / DRAWS XX .IFDEF F4 .GLOBL .DA / JMS* .DA JMP .+4 IVCT FRST LST DRAW=DRAWS IVECT=IVCT FIRST=FRST LAST=LST .ENDC .IFUND F4 .GLOBL DRAWS,.ARG,.ERROR LAC DRAWS /TRANSFER RETURN POINTER DAC DRAW IDX DRAWS /POINT TO 1ST ARGUMENT LAC* DRAWS /GET POINTER TO MACRO CALLING ARGUMENT IDX DRAWS /INCREMENT TO NEXT ARGUMENT DAC IVECT SPA LAC* IVECT /IN CASE OF DOUBLE INDIRECT DAC IVECT LAC* DRAWS IDX DRAWS /INCREMENT TO 3RD ARGUMENT DAC FIRST SPA LAC* FIRST /IN CASE OF DOUBLE INDIRECT DAC FIRST LAC* DRAWS DAC LAST SPA LAC* LAST DAC LAST JMP ARGSIN /ARGUMENTS ARE ALL IN NOW / ERR65 LAW 65 /ILLEGAL MODE IN MACRO SUBROUTINE ARGUMENT JMS* .ERROR .ENDC .EJECT .IFUND F4 / SUBROUTINE TO VALIDATE MODE OF SUBROUTINE ARGUMENTS. MODE BITS ARE / IN AC 0-3 ON ENTRY TO SUBROUTINE. VALID MODES ARE SINGLE AND / DOUBLE INTEGER ONLY. ALL OTHER MODES GIVE TERMINAL ERROR 65 (OCTAL). / CALLING SEQUENCE: / / LAC ARGUMENT /POINTER TO DATA WITH MODE IN AC 0-3 / JMS VALID8 / (RETURN POINT IF DOUBLE INTEGER) / (RETURN POINT IF SINGLE INTEGER) / VALID8 XX RAL /SHIFT ILLEGAL MODE BITS TO LINK & AC0 SPA!SZL!RAL /DOUBLE INTEGER BIT TO AC0. (SPA&SZL) JMP ERR65 /NOT INTEGER MODE ARGUMENT SMA /WILL BE -VE IF DOUBLE INTEGER IDX VALID8 /INCREMENT RETURN ADDRESS FOR SINGLE JMP* VALID8 / DRAW XX JMS* .ARG JMP .+4 IVECT FIRST LAST LAC IVECT JMS VALID8 /VALIDATE ARGUMENT MODES JMP ERR65 /'IVECT' MUST BE SINGLE INTEGER LAC FIRST JMS VALID8 IDX FIRST /POINT TO LEAST SIGNIFICANT HALF OF DOUBLE LAC LAST JMS VALID8 IDX LAST /IFF DOUBLE INTEGER .ENDC / ARGSIN LAC* CLEAR / HAS 'CLEAR' BEEN CALLED? SNA / IF NOT, IT WILL BE CALLED HERE TO JMS* CLEAR / PREVENT A MAJOR DISASTER (HUNG SYSTEM) LAC* FILER SBASIC DAC SBASIC /START OF BASIC DISPLAY FILE EBASIC AAC 2 /END OF BASIC DISPLAY FILE BEGINA DAC* SBASIC /INSERT POINTER IN BASIC FILE ENDA IAC BEGINB DAC EBASIC ENDB LAC (KLEAR /LINK 'DRAW' TO 'CLEAR' BEGINC DAC* DR.W ENDC JMS KLEAR /TIE BASIC DISPLAY FILE TOGETHER SHORTF LAC .+2 DAC ARGSIN /SHORT-CIRCUIT THE SETUP ROUTINE JMP .+1 .EJECT L.M1 LAW -1 TAD* FIRST TAD IVECT TAD* P.BASE / RELOCATE TO REAL ADDRESS DAC BEGINB /START OF SPECIFIED DISPLAY FILE L.M2 LAW -2 TAD* LAST SAD L.M2 /IS LAST=0? JMP REMOVE /YES. REMOVE EXISTING DISPLAY FILE TAD IVECT TAD* P.BASE / ADD PARTITION BASE TO VIRTUAL ADDR DAC* BEGINB /INSERT POINTER IN NEW FILE IAC DAC ENDB / END OF NEW DISPLAY FILE LAC BEGINB IAC / POINT TO BEGINNING OF ACTUAL DISPLAY CODE AND (060000 / SAVE ONLY BANK BITS DAC SHORTF / IN CASE WE NEED TO SHORTEN FILE XOR ENDB AND (060000 / BEGINNING AND END OF DISPLAY FILE SNA / MUST BE IN SAME BANK JMP INSERT / FILE IS OK. LAC* P.BASE / GET BASE ADDRESS OF PARTITION AND (700000 / NEED ONLY UPPER ADDRESS BITS XOR SHORTF XOR (17777 / FILE WILL BE TRUNCATED AT BANK BOUNDARY DAC ENDB TCA / HOWEVER, WE MUST ENSURE ENOUGH ROOM TAD BEGINB / (2 LOCATIONS) TO INSERT THE TRUNCATION. IAC SMA / IF NOT ENOUGH ROOM, JMP* DRAW / SIMPLY RETURN. / .EJECT / INSERT NEW DISPLAY FILE INTO CHAIN / INSERT JMS SEARCH /FIND A LIKELY SPOT FOR THE NEW FILE CLC /NEW FILE GOES HIGHEST IN MEMORY SNA /EXISTING FILE RETURNS HERE WITH AC=0 JMP* DRAW /***DON'T INSERT AGAIN!!!*** INC* C.SWTH /INCREMENT FILE COUNTER JMS LINK /LINK END OF NEW FILE INTO CHAIN / / NOW SEE IF WE HAVE A 'TEXT' FILE. 'TEXT' FILES REQUIRE SPECIAL CARE. / THEY ARE OF THE FORM: / / IVECT 0 / (BEGINB / INT!SCALE / LPON! . . . !ESCR / PTY IY / PTX IX / CHRI!10000 52 / '*' (UNIQUE TO 'TEXT' FILE) / CHRS .+2 / INSERTED BY 'DRAW' / DJMP PAST / INSERTED BY 'DRAW' / .ASCII ' . . . ' / .ASCII <15> ; .LOC .-1 / PAST DJMP* .+1 / (NEXT FILE / (ENDB / LAC BEGINB AAC 5 DAC BEGINC / POINT TO 'TEXT' IDENTIFIER LAC* BEGINC SAD (CHRI!10000 52 SKP JMP INSRT2 / NOT A 'TEXT' FILE IDX BEGINC / POINT TO 1ST WORD TO BE FILLED LAC BEGINC AND (17777 TAD (CHRS 2 / GENERATE 'CHRS .+2 DAC* BEGINC / INSERT INTO FILE IDX BEGINC / POINT TO 2ND WORD LAW -1 TAD ENDB AND (17777 XOR (DJMP / INSERT 'DJMP PAST' DAC* BEGINC / INTO 2ND INTERNAL WORD INSRT2 LAC BEGINB DAC BEGINC /SUBROUTINE 'LINK' USES LOCATIONS LAC ENDA / 'ENDB' & 'BEGINC'. DAC ENDB UNLINK JMS LINK /LINK OLD CHAIN TO NEW LINK JMS* CLOUDY /NECESSARY FOR SYNCHRONIZATION JMP .+2 DUMMY /ARGUMENT FOR 'CLOUDY' JMP* DRAW / DUMMY XX JMP* DUMMY /DUMMY SUBROUTINE EXECUTED FROM 'CLOUDY' / / REMOVE EXISTING FILE FROM DISPLAY CHAIN / REMOVE JMS SEARCH /SEARCH FOR SPECIFIED FILE SKP SZA!CLC /NON-ZERO AC MEANS FILE NOT FOUND JMP* DRAW /FILE NOT FOUND - NO DIAGNOSTIC TAD* C.SWTH /FILE FOUND. DECREMENT FILE COUNTER DAC* C.SWTH /AND UNLINK FROM CHAIN. LAC ENDA /MOVE 'ENDA' TO DAC ENDB /'ENDB' BEFORE IT GETS CLOBBBERED JMS NXLINK /POINT 'BEGINC' TO NEXT FILE JMP UNLINK .EJECT / SUBROUTINE TO SEARCH THROUGH EXISTING DISPLAY FILES. THIS SUBROUTINE / IS USED FOR BOTH INSERTION & DELETION OF FILES. SUBROUTINE / RETURNS WHEN GOOD SPOT FOR INSERTION IS FOUND, OR WHEN SPECIFIED FILE / IS LOCATED, OR WHEN BEGINNING OF BASIC DISPLAY IS FOUND. / / CALLING SEQUENCE: / / JMS SEARCH / (RETURN POINT IF LOCATION NOT FOUND) / (RETURN POINT IF LOCATION FOUND) / / **NB** THIS WILL REQUIRE SOME RE-WORK FOR USE IN B/F. / SEARCH XX LAC* FILER /INITIALIZE POINTER TO BEGINNING OF DAC BEGINC /BASIC DISPLAY FILE. / TRYNXT JMS NXLINK /GET POINTERS TO NEXT LINK IN CHAIN SAD SBASIC /HAVE WE COME FULL CIRCLE IN SEARCH? JMP* SEARCH /YES. EXIT. TCA TAD BEGINB / (BEGINB-BEGINC) SMA!SZA /SKIP ON (MINUS.OR.ZERO) AC JMP TRYNXT /NOT CORRECT ONE. TRY NEXT DISPLAY FILE. IDX SEARCH /HAVE FOUND CORRECT SPOT. JMP* SEARCH / NXLINK XX LAC* BEGINC /FIRST WORD IN DISPLAY FILE POINTS TO IAC /SECOND LAST WORD OF DISPLAY FILE. DAC ENDA / POINT TO LAST WORD (ADDRESS OF 2ND WORD LAW -1 / OF NEXT DISPLAY FILE). TAD* ENDA / GET POINTER TO ABSOLUTE BEGINNING OF DAC BEGINC / NEXT LINK IN CHAIN. JMP* NXLINK .EJECT / SUBROUTINE TO LINK IN END OF ONE DISPLAY FILE TO BEGINNING OF / THE NEXT ONE. / LINK XX IDX BEGINC / POINT TO 1ST DISPLAY CODE WORD LAW -1 TAD ENDB DAC ENDB / POINT TO SECOND LAST WORD OF NEW FILE AND (17777 / EXTRACT 13-BIT ADDRESS TAD (DJMP* 1 / GENERATE 'DJMP* LAST WORD' DAC* ENDB IDX ENDB / POINT TO LAST WORD LAC BEGINC DAC* ENDB / PUT IN ADDRESS OF NEXT LINK JMP* LINK /LINK NOW TIED IN. / / SUBROUTINE TO TIE BASIC DISPLAY FILE ON ITSELF ON INITIAL CALL / TO 'DRAW' AND ALSO ON CALLS TO 'CLEAR'. / KLEAR XX LAC SBASIC /PUT ARGUMENTS FOR SUBROUTINE 'LINK' DAC BEGINC /IN PROPER PLACE. LAC EBASIC DAC ENDB JMS LINK /TIE BASIC FILE ON ITSELF JMP* KLEAR .END