/ DISPLAY OVERLAY FOR P?S/8 FOCAL / LAST EDIT: 27-NOV-1989 17:00:00 CJL / P?S/8 FOCAL OVERLAY FOR BUFFERED DISPLAY OF X-Y POINTS ON A SCOPE INTERFACE. / THIS OVERLAY PROVIDES A DISPLAY FUNCTION TO P?S/8 FOCAL SIMILAR TO FOCAL-12 / OR BASIC-RT. IT CAN BE ASSEMBLED FOR SEVERAL HARDWARE CONFIGURATIONS: / SETTING AA01A=1 CREATES A VERSION FOR THE AA01A (A. S. D-A). / SETTING AX08=1 CREATES A VERSION FOR THE AX08 WITH RM-503 SCOPE. / SETTING S34D=1 CREATES A VERSION FOR THE 34D SCOPE. / SETTING VC12=1 CREATES A VERSION FOR THE PDP-12 SCOPE. / SETTING VC8E=1 CREATES A VERSION FOR THE LAB-8/E SCOPE. / SETTING CSW=1 CAUSES THE CONSOLE SWITCHES TO CONTROL AN ADDITIONAL DELAY. / THIS IS BEYOND THE NORMAL HARDWARE FLAGS, ETC. / FUNCTIONS AVAILABLE: / FDIS(X,Y) INSERT POINT AT (X,Y) INTO DISPLAY BUFFER. / FDIS(0) CLEAR ALL POINTS FROM DISPLAY BUFFER. / FDIS(NON-ZERO) FORCE ALL POINTS TO DISPLAY ONCE. / FIO(NEGATIVE) RETURNS NUMERICAL VALUE (MODULO 128) OF NEXT ASCII CHARACTER / TYPED; P?S/8 FOCAL WILL WAIT FOR INPUT IF NECESSARY (WHILE / BUFFERING THE DISPLAY). SINCE INTEGER CONVERSION IS USED / FOR EVALUATION, THE ARGUMENT MUST BE NEGATIVE OR WITHIN / THE RANGE 2048-4095 MOD 4096. / FIO(CHAR<2048) OUTPUT ASCII CHARACTER; P?S/8 FOCAL WILL BUFFER THE DISPLAY / IF IT MUST WAIT TO OUTPUT THE CHARACTER. SINCE INTEGER / CONVERSION IS USED FOR EVALUATION, THE ARGUMENT MUST BE / POSITIVE AND BETWEEN 0000-2047 MOD 4096. NORMAL OUTPUT / DEVICES GENERALLY REDUCE THE CHARACTER VALUE RANGE TO / 0000-0255 MOD 256 ALLOWING ANY COMBINATION OF ASCII / CHARACTER OUTPUT WITH OR WITHOUT PARITY SET. / ALL CURRENT POINTS WILL BE DISPLAYED WHILE P?S/8 FOCAL WAITS FOR EITHER / KEYBOARD INPUT OR TERMINAL OUTPUT. / THIS OVERLAY CAN BE USED WITH THE "OPATCH" AND "VT8PCH" OVERLAYS, BUT MUST / BE LOADED LAST TO PREVENT PATCH CONFLICT. / USE OF THIS OVERLAY WITH INCOMPATIBLE VERSIONS OF FOCAL/OVERLAYS WILL YIELD / THE ERROR MESSAGE: 'FOCAL/OVERLAY CONFLICT!' FOLLOWED BY EXIT TO P?S/8. / DOMAIN AND RANGE CONSIDERATIONS: / AA01A VERSIONS RANGE FROM -2048 THROUGH 2047. / VC-8/E, 34D VERSIONS RANGE FROM -512 THROUGH 511. / AX08, VC-12 VERSIONS RANGE FROM -256 THROUGH 255. / DISPLAY STORAGE CONSIDERATIONS. / THE TYPICAL OSCILLOSCOPE WITH SHORT PHOSPHOR PERSISTENCE REQUIRES A REFRESH / 30 TIMES/SEC. TO AVOID FLICKER. DUE TO HARDWARE LIMITATIONS, THIS YIELDS / AN UPPER LIMIT OF APPROX. 1200 POINTS IN THE DISPLAY BUFFER. THE STANDARD / VERSION OF THIS OVERLAY ALLOWS 1984 POINTS, WHICH SHOULD SUPPORT MOST / APPLICATIONS. / SHOULD MORE POINTS BE REQUIRED, THE '/2' OPTION CAN BE INVOKED WHICH INCREASES / THE DISPLAY LIMIT TO 3968 POINTS. THIS OPTION REQUIRES AN ADDITIONAL MEMORY / FIELD (TWO FIELDS USED FOR DISPLAY BUFFER INSTEAD OF ONE). A LONG PERSISTENCE / OR MORE PREFERABLY A STORAGE SCOPE IS REQUIRED TO MAKE PROPER USE OF THIS / OPTION. (N. B. DARK ROOM CONDITIONS ALLOW FOR AN EFFECTIVE INCREASE IN / PERSISTENCE BY UTILIZING THE "AFTER-BURN" EFFECT OF THE PHOSPOR.) / IF A STORAGE SCOPE IS AVAILABLE, OR FOR POST-PROCESSING APPLICATIONS BY / OTHER UTILITIES, THE '/V' OPTION IS AVAILABLE TO MAKE THE DISPLAY LIST / BUFFERING OCCUR IN VIRTUAL MEMORY (USING AVAILABLE DISK SPACE). THIS CAUSES / SEVERE FLICKER, AS MUCH TIME IS SPENT WAITING FOR DISK I/O AND THE ACTUAL / DISPLAY HARDWARE. SEVERAL DISK PARAMETERS MUST BE SET (SEE BELOW) TO DEFINE / THE VIRTUAL DISPLAY BUFFER. DEPENDING ON THESE PARAMETERS, UP TO 262143 / BUFFERED DISPLAY POINTS CAN BE ACCOMODATED. THIS OPTION DOES NOT REQUIRE / ADDITIONAL MEMORY BEYOND THE NORMAL VERSION (ONE FIELD USED FOR DISPLAY / BUFFER). / ALL VERSIONS WILL YIELD THE SAME ERROR MESSAGE "?04.:3" IF THE DISPLAY / BUFFER IS EXCEEDED. / ASSEMBLY PARAMETERS. / SET ONE OF THE FOLLOWING HARDWARE PARAMETERS BY REMOVING THE "/": / AA01A= 1 /CREATE AA01A (A. S.) VERSION / AX08= 1 /CREATE AX08 VERSION / S34D= 1 /CREATE 34D VERSION / VC12= 1 /CREATE VC-12 VERSION / VC8E= 1 /CREATE VC-8/E VERSION / SET ONE OF THE FOLLOWING PARAMETERS GOVERNING CONSOLE-CONTROLLED DELAY BY / REMOVING THE "/": / CSW= 0 /NO ADDITIONAL CONSOLE-CONTROLLED DELAY / CSW= 1 /USE CONSOLE SWITCHES FOR ADDITIONAL DELAY / SET THE DISPLAY FIELD(S): / DFIELD= 20 /(FIRST OF TWO) DISPLAY FIELD(S) / SET THE VIRTUAL PARAMETERS (FOR '/V' OPTION): / XYBLK= 4400 /STARTING BLOCK FOR VIRTUAL DISPLAY BUFFER / XYHIGH= 6260 /UPPER BLOCK LIMIT FOR VIRTUAL DISPLAY BUFFER / XYUNIT= 7 /LOGICAL UNIT FOR VIRTUAL DISPLAY BUFFER / CONDITIONAL ASSEMBLY PARAMETERS. IFNDEF AA01A /DON'T CREATE AA01A (A. S.) VERSION IFNDEF AX08 /DON'T CREATE AX08 VERSION IFNDEF CSW /DON'T CAUSE CONSOLE DELAY IFNDEF DFIELD /USE FIELD(S) TWO (AND THREE) FOR DISPLAY IFNDEF S34D /DON'T CREATE 34D VERSION IFNDEF TTY /BASE DEVICE CODE OF TTY: IFNDEF VC12 /DON'T CREATE VC-12 VERSION IFNDEF VC8E /DON'T CREATE VC-8/E VERSION IFNDEF XYBLK /STARTING BLOCK FOR VIRTUAL DISPLAY BUFFER IFNDEF XYHIGH /UPPER BLOCK LIMIT FOR VIRTUAL DISPLAY BUFFER IFNDEF XYUNIT /LOGICAL UNIT FOR VIRTUAL DISPLAY BUFFER / DEFAULT PARAMETERS. H= AA01A!AX08!S34D!VC12 /ACCUMULATE PARAMETERS H= H!VC8E /ACCUMULATE PARAMETERS IFZERO H /DEFAULT TO AA01A (A. S.) VERSION / I/O AND PERIPHERAL DEFINITIONS. ALPHA= 0000 /DISPLAY ALPHA REGISTER FOR VC-12 DAL1= 6551 /LOAD X ON AA01A (A. S.) DAL2= 6552 /LOAD Y ON AA01A (A. S.) DILX= 6053 /LOAD X ON VC-8/E DILY= 6054 /LOAD Y ON VC-8/E DINT= 6554 /INTENSIFY ON AA01A (A. S.) DIS= 0140 /DISPLAY POINT ON VC-12 DISA= 6304 /INTENSIFY ON AX08 DISD= 6052 /SKIP ON DISPLAY DONE DIXY= 6055 /INTENSIFY ON VC-8/E DXC= 6301 /CLEAR X ON AX08 DXL= 6302 /LOAD X ON AX08 DIXL= 6053 /LOAD X ON 34D DYC= 6311 /CLEAR Y ON AX08 DYL= 6312 /LOAD Y ON AX08 DYS= 6067 /LOAD Y AND INTENSIFY ON 34D LINC= 6141 /GOTO LINC MODE FOR VC-12 PDP= 0002 /GOTO PDP-8 MODE FOR VC-12 KCCIOT= TTY^10+6002 /CLEAR KEYBOARD FLAG KRSIOT= TTY^10+6004 /READ KEYBOARD BUFFER KSFIOT= TTY^10+6001 /SKIP ON KEYBOARD FLAG TLSIOT= TTY+1^10+6006 /OUTPUT TO TELEPRINTER TSFIOT= TTY+1^10+6001 /SKIP ON TELEPRINTER FLAG / DEFINITIONS FROM FOCAL, 1969 (ORIGINAL PAPER-TAPE VERSION). CHAR= 0066 /FOCAL'S CHARACTER BUFFER COMGO= 1163 /COMMAND DISPATCH TABLE ADDRESS C200= 0123 /CONSTANT 0200 EFUN3I= 0136 /FUNCTION RETURN POINTER ERROR5= 2725 /ERROR FUNCTION EVAL= 1613 /EVALUATOR ROUTINE FLAC= 0044 /FLOATING AC FNTABF= 0374 /FUNCTION ADDRESS TABLE FNTABL= 2165 /HASHED FUNCTION NAME TABLE INDEV= 0064 /INPUT ROUTINE POINTER INTEGER=0053 /FLOATING TO FIXED CONVERSION POINTER OUTDEV= 0063 /OUTPUT ROUTINE POINTER PDLXR= 0013 /PUSHDOWN LIST AUTO-INDEX REGISTER PUSHA= JMS I 142 /PUSH WORD ONTO STACK P177= 0106 /CONSTANT 0177 P7600= 0104 /CONSTANT 7600 RETURN= JMP I EFUN3I /FUNCTION RETURN INSTRUCTION XDYS= 1142 /FDIS FUNCTION ADDRESS XINT= 1160 /INTEGER PART ROUTINE / DEFINITIONS FROM P?S/8 AND THE P?S/8 FOCAL OVERLAY. BEOFZAP=7505 /BINARY LOADER ZAP WORD BONCE= 3600 /OVERLAY ONCE-ONLY ADDRESS CINPUT= 2600 /CONSOLE INPUT ROUTINE CINWAIT=2601 /INPUT ROUTINE WAIT LOCATION COUTPUT=2630 /OUTPUT ROUTINE ADDRESS INCON= 0031 /EQUATED FROM CONSOLE! OUTCON= 0033 /EQUATED FROM CONSOLE! PRGFLD= 0000 /PROGRAM FIELD SBOOT= 7600 /BOOTSTRAP TO HERE SCRSIZE=7611 /SOFTWARE CORE SIZE WORD SWAPBLK=2417 /SWAP BLOCK SWMX= 7605 /PASSED SWITCHES: /M-/X SWY9= 7606 /PASSED SWITCHES: Y, Z, 0-9 SYSIO= 7640 /SYSTEM I/O ENTRY WRITE= 4000 /SYSIO WRITE BIT / NUMERIC LOAD DEFINITIONS. NL0001= CLA IAC /LOAD AC WITH 0001 NL0002= CLA CLL CML RTL /LOAD AC WITH 0002 NL7775= CLA CLL CMA RTL /LOAD AC WITH 7775 NL7777= CLA CMA /LOAD AC WITH 7777 / INSTRUCTION DEFINITIONS. JMPC= JMP . /CURRENT PAGE JUMP INSTRUCTION JMSC= JMS . /CURRENT PAGE JMS INSTRUCTION JMSSYSI=SYSIO&177+JMSC /CALL TO SYSIO ON ITS PAGE FIELD 0 /ENSURE FIELD ZERO *175 /OVER AVAILABLE LOCATION PDSPLAY,DSPLAY /DISPLAY BUFFER ROUTINE POINTER *FNTABF+3 /OVER FUNCTION ADDRESS TABLE XDIS /POINT TO DISPLAY FUNCTION *FNTABF+14 /OVER FNEW ADDRESS XIO /POINT TO INPUT/OUTPUT FUNCTION *XDYS /OVER EXISTING XDIS CODE / FIO FUNCTION. XIO, JMS I INTEGER /GET LOW-ORDER FROM FIXED FLAC SMA CLA /SKIP IF INPUT JMP XOUT /JUMP IF OUTPUT JMS I INDEV /GET A CHARACTER / AC WILL BE NON-ZERO IF FIO(NEGATIVE), ZERO IF FDIS(XX). / FDIS FUNCTION ENTERS HERE WITH CLEAR AC. XDIS, CIF DFIELD /GOTO CODE FIELD JMP XIOMORE /CINTINUE THERE / COMES HERE IF FIN(POSITIVE). XOUT, TAD FLAC+2 /GET LOW-ORDER AGAIN JMS I OUTDEV /PRINT THE CHARACTER XRET, RETURN /RETURN TO FOCAL / FIELD ZERO FLOATING TO FIX CALL. INTPUSH,SNA /ANY PASSED VALUE? JMS I INTEGER /NO, GET LOW-ORDER FROM FIXED FLAC PUSHA /PUSH EITHER WAY EVALRET,CIF DFIELD /GOTO CODE FIELD JMP PUSHMORE /CONTINUE THERE ZBLOCK XINT-. /EMPTY SPACE XINT= . /UPPER LIMIT FOR DISPLAY CODE *FNTABL+3 /OVER HASHED NAME TABLE "D^2+"I^2+"S /MAKE SURE FDIS FUNCTION IS PRESENT *FNTABL+14 /OVER FNEW "I^2+"O /ENTER FIO FUNCTION HASHED NAME *SWAPBLK+3 /OVER EMPTY SPACE PAST SWAPPER / FIELD ZERO DISPLAY BUFFER ENTRY POINT. DSPLAY, .-. /DISPLAY BUFFER ROUTINE CIF DFIELD /GOTO CODE FIELD JMP DSPMORE /CONTINUE THERE *CINPUT-1 /OVER AVAILABLE SPACE SKP /ALLOW EFFECTIVE "JMP .-4" AS WELL AS "JMP .-2" /FOR "CINWAIT" ROUTINE *CINWAIT+2 /OVER JMP CINWAIT JMS I PDSPLAY/[DSPLAY]/DISPLAY BUFFER WHILE WAITING FOR INPUT FIELD DFIELD%10 /IN (FIRST) BUFFER FIELD *ALPHA /START AT THE BEGINNING ALPHA, .-. /ALPHA REGISTER FOR PDP-12 VERSION DSPBACK,-4-1 /**** OPATCH OR VT8PCH **** -2-1 DSPRETU,.-. /BUFFERED DISPLAY CALLER RETURN ADDRESS STKTMP, .-. /TEMPORARY FOR STACK OPERATIONS / FIX THE FLAC AND PUSH ROUTINE. FIXPUSH,.-. /FIX AND PUSH ROUTINE CIF CDF PRGFLD /GOING TO FIELD ZERO JMP I [INTPUSH] /CONTINUE THERE / COMES BACK HERE WHEN THROUGH. PUSHMOR,JMP I FIXPUSH /RETURN *10 /GET TO AUTO-INDEX AREA LOCNT, /LOW-ORDER COUNTER FOR VIRTUAL DISPLAY XR1, .-. /AUTO-INDEX FOR DISPLAY HICNT, /HIGH-ORDER COUNTER FOR VIRTUAL DISPLAY XR2, .-. /SECOND AUTO-INDEX FOR DISPLAY HDIRTY, /HEADER BLOCK STATUS: 1=NOT READ, 0=DIRTY, -1=CLEAN XR3, OUTBUFFER-1 /AUTO-INDEX FOR FDIS, ETC. BDIRTY, /DISPLAY BLOCK STATUS: 1=NOT READ, 0=DIRTY, -1=CLEAN XR4, OUTBUFFER-1 /SECOND AUTO-INDEX FOR FDIS, ETC. DISCNT, 0 /CURRENT DISPLAY COUNT DSPCNT, .-. /DISPLAY BUFFER COUNTER X, .-. /"X" COORDINATE Y, .-. /"Y" COORDINATE *20 /GET PAST AUTO-INDEX AREA / POP ELEMENT OFF OF STACK ROUTINE. POPAC, .-. /POP INTO AC ROUTINE ISZ I [PDLXR] /BUMP STACK POINTER TAD I [PDLXR] /GET THE NEW VALUE DCA STKTMP /STASH IT TAD I STKTMP /GET THE VALUE JMP I POPAC /RETURN / DISPLAY BUFFER SUBROUTINE. DISPLAY,.-. /DISPLAY ROUTINE VDSZP1, TAD DISCNT /GET CURRENT DISPLAY COUNT **** /V **** JMP I VDSZP2 VDSZP2, CMA /INVERT FOR COUNTING **** /V **** VDSPLAY GETPTR, DCA DSPCNT /STASH THE COUNTER HDCNTLO,TAD [OUTBUFFER-1] /POINT TO HDCNTHI,DCA XR1 /DISPLAY BUFFER TAD [OUTBUFFER-1] /POINT TO DCA XR2 /DISPLAY BUFFER IOF /PREVENT PROBLEMS! JMP DISPIN /CONTINUE THERE DISPLP, CDF DFIELD /GOTO OUR (FIRST) FIELD TAD I XR1 /GET X VALUE IFNZRO AA01A < DAL1 /LOAD X CLA /CLEAN UP > IFNZRO AX08 < TAD [400] /MAKE IT SYMMETRICAL DXC DXL /LOAD X CLA /CLEAN UP > IFNZRO S34D < DIXL /LOAD X CLA /CLEAN UP > IFNZRO VC12 < TAD [400] /MAKE IT SYMMETRICAL DCA ALPHA /STORE X > IFNZRO VC8E < DILX /LOAD X ON VC-8/E CLA /CLEAN UP > ZAP8K1, CDF DFIELD /**** /2 **** CDF DFIELD+10 ZAP8K2, TAD I XR1 /**** /2 **** TAD I XR2 IFNZRO AA01A < DAL2 /LOAD Y CLA /CLEAN UP AND I 0 /WASTE AND I 0 /SOME TIME DINT /INTENSIFY > IFNZRO AX08 < DYC DYL DISA /LOAD Y AND INTENSIFY CLA /CLEAN UP > IFNZRO S34D < DYS /LOAD Y AND INTENSIFY CLA /CLEAN UP > IFNZRO VC12 < LINC /GOTO L...MODE DIS ALPHA /DISPLAY THE POINT PDP /BACK TO P...MODE CLA /CLEAN UP > IFNZRO VC8E < DILY /LOAD Y ON VC-8/E CLA /CLEAN UP DISD /WAIT FOR DONE JMP .-1 /ON VC-8/E DIXY /INTENSIFY POINT NOW > IFNZRO CSW < LAS /GET CONSOLE SWITCHES DCA STKTMP /STASH AS COUNTER ISZ STKTMP /WAITED LONG ENOUGH? JMP .-1 /NO, KEEP GOING > / COMES HERE AT THE END OF ONE DISPLAY CYCLE. DISPIN, ISZ DSPCNT /DONE ALL YET? JMP DISPLP /NO, KEEP GOING ION /SAFE TO COME OUT NOW JMP I DISPLAY /YES, RETURN / COMES HERE TO FINISH THE BUFFERED DISPLAY CALL. DSPMORE,TAD I [DSPLAY] /GET THE CALLER TAD DSPBACKUP /GET BACKUP FACTOR OF TWO OR FOUR AS NECESSARY / NOW HAVE EFFECTIVE "JMP .-4" IF "OPATCH" OR "VT8PCH" IS NOT PRESENT, / NOW HAVE EFFECTIVE "JMP .-2" IF "OPATCH" OR "VT8PCH" IS PRESENT. DCA DSPRETURN /STORE EFFECTIVE RETURN ADDRESS AS ABOVE JMS DISPLAY /CALL BUFFER DISPLAY ROUTINE CIF CDF PRGFLD /GOTO CALLING FIELD JMP I DSPRETURN /RETURN TO CALLER / COMES HERE TO FINISH THE "FIO", "FDIS" FUNCTIONS. XIOMORE,SNA /INPUT/OUTPUT FUNCTION? JMP DODISP /NO, MUST BE DISPLAY AND [177] /JUST SEVEN-BIT DCA I [FLAC+1] /STORE IN HIGH-ORDER DCA I [FLAC+2] /CLEAR LOW-ORDER TAD [13] /GET SHIFT FACTOR DCA I [FLAC] /SET EXPONENT DISPRET,CIF CDF PRGFLD /GOING TO FIELD ZERO JMP I [XRET] /FINISH IT THERE / COMES HERE TO FINISH "FDIS" FUNCTION. DODISP, JMS FIXPUSH /FIX AND PUSH FIRST ARGUMENT TAD I [CHAR] /GET THE LATEST CHARACTER TAD [-",] /COMPARE TO "," SZA CLA /SKIP IF IT MATCHES JMP DISP1 /JUMP IF ONLY ONE ARGUMENT TAD [EVALRETURN] /GET OUR RETURN JMS FIXPUSH /PUSH IT ON STACK TAD [EVALMORE] /SETUP THE PROPER DCA FIXPUSH /RETURN ADDRESS CIF CDF PRGFLD /GOING TO FIELD ZERO JMP I [EVAL-1] /EFFECTIVELY PUSHJ;EVAL-1 AND RETURN TO "EVALMORE" / COMES BACK HERE AFTER EVALUATING THE SECOND "FDIS" ARGUMENT. EVALMOR,JMS FIXPUSH /FIX THE SECOND ARGUMENT AND PUSH IT JMS POPAC /GET IT BACK DCA Y /SAVE AS "Y" COORDINATE JMS POPAC /GET PREVIOUS ARGUMENT DCA X /SAVE AS "X" COORDINATE VPTZP1, TAD XR3 /GET OUTPUT POINTER **** /V **** JMP I VPTZP2 VPTZP2, IAC /SEE IF AT END **** /V **** VPUTIT PUTPTR, SZA CLA /SKIP IF TOO FAR LATBLK, JMP DISPOK /JUMP IF NOT VERROR, TAD [XDYS+6] /GET ERROR ADDRESS CIF PRGFLD /GOING TO FIELD ZERO JMP I [ERROR5] /GO COMPLAIN THERE / INSERT THE LATEST PAIR INTO THE DISPLAY BUFFER. DISPOK, ISZ DISCNT /BUMP UP DISPLAY COUNT DSPBLK, CDF DFIELD /GOTO BUFFER FIELD TAD X /GET X VALUE DCA I XR3 /PUT IT IN ZAP8K3, CDF DFIELD /**** /2 **** CDF DFIELD+10 TAD Y /GET Y VALUE ZAP8K4, DCA I XR3 /**** /2 **** DCA I XR4 JMP DISPRETURN /FINISH IT THERE / COMES HERE IF "FDIS(ONE ARGUMENT)". DISP1, JMS POPAC /RETRIEVE THE ARGUMENT SNA CLA /SKIP IF NON-ZERO JMP WIPEOUT /ELSE WIPE OUT THE BUFFER JMS DISPLAY /DISPLAY THE BUFFER ONCE NOW JMP DISPRETURN /FINISH IT THERE WIPEOUT,DCA DISCNT /CLEAR DISPLAY COUNT VWPZP1, TAD [OUTBUFFER-1] /RESET THE **** /V **** JMP I VWPZP2 VWPZP2, DCA XR3 /BUFFER POINTER **** /V **** VWIPOUT TAD [OUTBUFFER-1] /RESET THE DCA XR4 /SECOND BUFFER POINTER JMP DISPRETURN /FINISH IT THERE JMPIVDS=JMP I VDSZP2 /INSTRUCTION DEFINITION JMPIVPT=JMP I VPTZP2 /INSTRUCTION DEFINITION JMPIVWP=JMP I VWPZP2 /INSTRUCTION DEFINITION PAGE OUTBUFF=. /NON-VIRTUAL DISPLAY BUFFER HERE / COMES HERE TO CLEAR ALL VIRTUAL POINTS. VWIPOUT,CDF DFIELD /GOTO OUR FIELD DCA HDCNTLOW /CLEAR LOW-ORDER DISPLAY COUNT IN HEADER BLOCK DCA HDCNTHIGH /CLEAR HIGH-ORDER DISPLAY COUNT IN HEADER BLOCK DCA HDIRTY /INDICATE HEADER BLOCK SHOULD BE WRITTEN JMS I (WRIHEAD) /GO WRITE HEADER BLOCK JMP DISPRETURN /CONTINUE THERE / COMES HERE TO DISPLAY ALL VIRTUAL POINTS. VDSPLAY,JMS I (WRITBLK) /WRITE LATEST BLOCK (IF ANY) JMS I (REDHEAD) /READ IN HEADER (IF NECESSARY) JMS I (WRIHEAD) /WRITE OUT HEADER (IF NECESSARY) TAD HDCNTLOW /GET LOW-ORDER DISPLAY COUNT CMA /INVERT FOR COUNTING DCA LOCNT /STASH IT TAD HDCNTHIGH /GET HIGH-ORDER DISPLAY COUNT CMA /INVERT FOR COUNTING DCA HICNT /STASH IT TAD (DBUFFER+2) /SETUP THE INITIAL DCA GETPTR /DISPLAY POINTER TAD (XYBLK) /SETUP THE INITIAL DCA DSPBLK /DISPLAY BLOCK NL0001 /INDICATE THAT IT DCA BDIRTY /MUST BE READ IN JMP VDISPIN /CONTINUE THERE VDISPLP,JMS I (READBLK) /ENSURE LATEST DISPLAY BLOCK IS READ IN TAD I GETPTR /GET AN X VALUE IFNZRO AA01A < DAL1 /LOAD X CLA /CLEAN UP > IFNZRO AX08 < TAD [400] /MAKE IT SYMMETRICAL DXC DXL /LOAD X CLA /CLEAN UP > IFNZRO S34D < DIXL /LOAD X CLA /CLEAN UP > IFNZRO VC12 < TAD [400] /MAKE IT SYMMETRICAL DCA ALPHA /STORE X > IFNZRO VC8E < DILX /LOAD X ON VC-8/E CLA /CLEAN UP > ISZ GETPTR /BUMP TO Y VALUE TAD I GETPTR /GET A Y VALUE IFNZRO AA01A < DAL2 /LOAD Y CLA /CLEAN UP AND I 0 /WASTE AND I 0 /SOME TIME DINT /INTENSIFY > IFNZRO AX08 < DYC DYL DISA /LOAD Y AND INTENSIFY CLA /CLEAN UP > IFNZRO S34D < DYS /LOAD Y AND INTENSIFY CLA /CLEAN UP > IFNZRO VC12 < CIF DFIELD /PREVENT LINC INTERRUPTS LINC /GOTO L...MODE DIS ALPHA /DISPLAY THE POINT PDP /BACK TO P...MODE CLA /CLEAN UP > IFNZRO VC8E < DILY /LOAD Y ON VC-8/E CLA /CLEAN UP DISD /WAIT FOR DONE JMP .-1 /ON VC-8/E DIXY /INTENSIFY POINT NOW > IFNZRO CSW < LAS /GET CONSOLE SWITCHES DCA STKTMP /STASH AS COUNTER ISZ STKTMP /WAITED LONG ENOUGH? JMP .-1 /NO, KEEP GOING > ISZ GETPTR /BUMP TO NEXT PAIR TAD GETPTR /GET THE POINTER TAD (-DBUFFER-200) /COMPARE TO END OF BUFFER SZA CLA /SKIP IF AT END JMP VDISPIN /JUMP IF NOT TAD (DBUFFER) /RESET THE DCA GETPTR /BUFFER POINTER ISZ DSPBLK /BUMP TO NEXT BLOCK NL0001 /INDICATE IT WILL DCA BDIRTY /HAVE TO BE READ IN VDISPIN,ISZ LOCNT /BUMP LOW-ORDER COUNT SKP /SKIP IF NOT DONE ISZ HICNT /ELSE BUMP HIGH-ORDER COUNT JMP VDISPLP /KEEP GOING JMP I DISPLAY /RETURN TO CALLER / COMES HERE TO OUTPUT LATEST POINT TO VIRTUAL BUFFER. VPUTIT, JMS I (REDHEAD) /ENSURE HEADER BLOCK DATA IS AVAILABLE NL0001 CLL /SET INCREMENT TAD HDCNTLOW /NOW HAVE LOW-ORDER COUNT DCA STKTMP /SAVE FOR LATER TAD HDCNTHIGH /GET HIGH-ORDER COUNT SZL /SKIP IF NO CARRY IAC /ELSE BUMP IT AND (77) /JUST LOW-ORDER CLL RTL;RTL;RTL /MOVE LOWEST TO HIGHEST DCA LATBLK /STORE FOR NOW TAD STKTMP /GET THE LOW-ORDER COUNT CLL RTR;RTR;RTR /MOVE DOWN HIGHEST TO LOWEST AND (77) /JUST LOW-ORDER BITS TAD LATBLK /ADD ON HIGH-ORDER BITS TAD (XYBLK) /NOW HAVE ABSOLUTE BLOCK DCA LATBLK /STORE COMPOSITE TAD STKTMP /GET LOW-ORDER AGAIN AND (77) /JUST LOW-ORDER BITS CLL RAL /ADJUST TO WORD OFFSET SZA /SKIP IF AT BEGINNING OF NEW BLOCK JMP BLKOK /JUMP IF NOT AT BEGINNING OF A BLOCK TAD LATBLK /GET LATEST BLOCK TAD (-XYHIGH) /COMPARE TO UPPER LIMIT SNA CLA /SKIP IF NOT AT UPPER LIMIT JMP VERROR /ELSE COMPLAIN BLKOK, TAD (DBUFFER) /NOW HAVE ABSOLUTE ADDRESS DCA PUTPTR /STASH THE POINTER TAD LATBLK /GET LATEST BLOCK CIA /INVERT FOR TESTING TAD DSPBLK /COMPARE TO CURRENT BLOCK SNA CLA /SKIP IF DIFFERENT JMP VPUTOK /JUMP IF THEY MATCH JMS I (WRITBLK) /WRITE CURRENT BLOCK TAD LATBLK /MAKE OUR BLOCK DCA DSPBLK /THE CURRENT BLOCK NL0001 /INDICATE IT IS DCA BDIRTY /NOT EVEN READ IN (WHO CARES?) VPUTOK, TAD PUTPTR /GET THE POINTER AND [177] /JUST OFFSET BITS SZA CLA /IF AT BEGINNING DON'T READ IN JUNK JMS I (READBLK) /ENSURE BLOCK IS READ IN JUST IN CASE TAD X /GET LATEST X VALUE DCA I PUTPTR /STORE IN BLOCK ISZ PUTPTR /BUMP TO NEXT TAD Y /GET LATEST Y VALUE DCA I PUTPTR /STORE IN BLOCK ISZ PUTPTR /BUMP TO NEXT DCA BDIRTY /INDICATE BLOCK MUST BE WRITTEN BACK ISZ HDCNTLOW /BUMP LOW-ORDER COUNT SKP /SKIP IF NO OVERFLOW ISZ HDCNTHIGH /ELSE BUMP HIGH-ORDER DCA HDIRTY /INDICATE HEADER BLOCK MUST BE WRITTEN ALSO JMP DISPRETURN /CONTINUE THERE PAGE / SUPPORT ROUTINES. READBLK,.-. /READ A DATA BLOCK ROUTINE CDF DFIELD /ENSURE OUR FIELD TAD BDIRTY /GET DATA STATUS OF CURRENT BLOCK SPA SNA CLA /SKIP IF NOT READ IN JMP I READBLK /RETURN IF READ IN TAD DSPBLK /GET CURRENT BLOCK DCA REDBLK /STORE IN-LINE CIF PRGFLD /GOTO SYSTEM FIELD JMS I [SYSIO] /CALL I/O ROUTINES DBUFFER /TRANSFER ADDRESS 1^100+DFIELD+XYUNIT /READ FUNCTION WORD REDBLK, .-. /BLOCK NUMBER WILL BE FILLED IN NL7777 /INDICATE THE DCA BDIRTY /BLOCK IS IN AND CLEAN JMP I READBLK /RETURN WRITBLK,.-. /WRITE A DATA BLOCK ROUTINE CDF DFIELD /ENSURE OUR FIELD TAD BDIRTY /GET BUFFER STATUS SZA CLA /SKIP IF MUST BE WRITTEN JMP I WRITBLK /ELSE JUST RETURN TAD DSPBLK /GET CURRENT BLOCK DCA WRIBLK /STORE IN-LINE CIF PRGFLD /GOTO SYSTEM FIELD JMS I [SYSIO] /CALL I/O ROUTINES DBUFFER /TRANSFER ADDRESS 1^100+DFIELD+XYUNIT+WRITE /WRITE FUNCTION WRIBLK, .-. /BLOCK NUMBER WILL BE FILLED IN NL7777 /INDICATE THE DATA DCA BDIRTY /IS NOW CLEAN JMP I WRITBLK /RETURN WRIHEAD,.-. /WRITE THE HEADER BLOCK ROUTINE CDF DFIELD /ENSURE OUR FIELD TAD HDIRTY /GET HEADER STATUS SZA CLA /SKIP IF MUST BE WRITTEN JMP I WRIHEAD /ELSE JUST RETURN CIF PRGFLD /GOTO SYSTEM FIELD JMS I [SYSIO] /CALL I/O ROUTINES HDBUFFER /TRANSFER ADDRESS 1^100+DFIELD+XYUNIT /READ FUNCTION XYBLK /BLOCK NUMBER TAD HDCNTLOW /GET LOW-ORDER COUNT DCA I (HDBUFFER) /STORE IN BUFFER TAD HDCNTHIGH /GET HIGH-ORDER COUNT DCA I (HDBUFFER+1) /STORE IN BUFFER CIF PRGFLD /GOTO SYSTEM FIELD JMS I [SYSIO] /CALL I/O ROUTINES HDBUFFER /TRANSFER ADDRESS 1^100+DFIELD+XYUNIT+WRITE /WRITE FUNCTION XYBLK /BLOCK NUMBER HRESET, NL7777 /INDICATE THE HEADER DATA DCA HDIRTY /IS NOW CLEAN JMP I WRIHEAD /RETURN REDHEAD,.-. /HEADER READ ROUTINE CDF DFIELD /ENSURE OUR FIELD TAD HDIRTY /GET HEADER STATUS SPA SNA CLA /SKIP IF NOT READ IN JMP I REDHEAD /RETURN IF READ IN ALREADY CIF PRGFLD /GOTO SYSTEM FIELD JMS I [SYSIO] /CALL I/O ROUTINES HDBUFFER /TRANSFER ADDRESS 1^100+DFIELD+XYUNIT /READ FUNCTION XYBLK /BLOCK NUMBER TAD I (HDBUFFER) /GET THE LOW-ORDER COUNT DCA HDCNTLOW /STASH IT TAD I (HDBUFFER+1) /GET THE HIGH-ORDER COUNT DCA HDCNTHIGH /STASH IT NL7777 /INDICATE THE HEADER DCA HDIRTY /INFORMATION IS AVAILABLE JMP I REDHEAD /RETURN PAGE DBUFFER=. /DISPLAY DATA BLOCK BUFFER HERE HDBUFF= .+200 /HEADER BLOCK BUFFER HERE FIELD 0 /BACK TO FIELD ZERO / ONCE-ONLY CODE STARTS HERE. *BONCE /OVER DEFAULT ONCE-ONLY AREA BONCE, TAD I (SWMX) /GET /M-/X SWITCH AND (4) /JUST /V SWITCH SNA CLA /SKIP IF SET JMP TEST2 /JUMP IF NOT CDF DFIELD /GOTO OUR CODE FIELD TAD (JMPIVDSZP2) /GET "JMP I VDSZP2" DCA I (VDSZP1) /ZAP DISPLAY ROUTINE TAD (VDSPLAY) /GET VIRTUAL DISPLAY ROUTINE POINTER DCA I (VDSZP2) /ZAP IT IN TAD (JMPIVPTZP2) /GET "JMP I VPTZP2" DCA I (VPTZP1) /ZAP OUTPUT ROUTINE TAD (VPUTIT) /GET VIRTUAL OUTPUT ROUTINE POINTER DCA I (VPTZP2) /ZAP IT IN TAD (JMPIVWPZP2) /GET "JMP I VWPZP2" DCA I (VWPZP1) /ZAP WIPEOUT ROUTINE TAD (VWIPOUT) /GET VIRTUAL WIPEOUT ROUTINE POINTER DCA I (VWPZP2) /ZAP IT IN NL7777 /SET CURRENT DISPLAY BLOCK DCA I (DSPBLK) /TO AN IMPOSSIBLE VALUE NL7777 /INDICATE THE DISPLAY BLOCK DCA I (BDIRTY) /NEED NOT BE WRITTEN NL0001 /INDICATE THE HEADER BLOCK DCA I (HDIRTY) /MUST BE READ IN FIRST JMP LTEST /CONTINUE THERE TEST2, TAD I (SWY9) /GET /Y-/9 SWITCHES AND C200/[200] /JUST /2 BIT SNA CLA /SKIP IF SET JMP LTEST /JUMP IF NOT CDF DFIELD /GOTO OUR CODE FIELD TAD I (ZAP8K1) /GET CDF DFIELD TAD (10) /MAKE IT CDF DFIELD+10 DCA I (ZAP8K1) /STORE BACK ISZ I (ZAP8K2) /MAKE IT TAD I XR2 TAD I (ZAP8K1) /GET CDF DFIELD+10 DCA I (ZAP8K3) /STORE OVER CDF DFIELD ISZ I (ZAP8K4) /MAKE IT DCA I XR4 LTEST, CDF PRGFLD /BACK TO OUR FIELD TAD I (COMGO+10) /GET CURRENT "L" COMMAND ADDRESS TAD (-XINT) /ADD ON UPPER LIMIT CLL /CLEAR LINK FOR TEST TAD (XINT-XDYS) /ADD ON RANGE SNL CLA /SKIP IF IN DANGER RANGE JMP DSPFIX /JUMP IF NOT TAD P7600/[SBOOT] /REVERT THE "L" COMMAND DCA I (COMGO+10) /TO ONLY SAFE VALUE DSPFIX, TAD I (COUTPUT+5) /GET POSSIBLE LOCATION TAD (-TESTVALUE) /COMPARE TO TEST VALUE SNA CLA /SKIP IF NOT "OPATCH" OR "VT8PCH" VALUE JMP OPRESENT /JUMP IF ABOVE-MENTIONED OVERLAY PRESENT TAD I (COUTPUT+6) /GET NORMAL LOCATION TAD (-TESTVALUE) /COMPARE TO TEST VALUE SZA CLA /SKIP IF IT MATCHES JMP BADFOCAL /JUMP IF UNKNOWN VERSION TAD (JMS I PDSPLA/[DSPLAY])/GET ZAPPING INSTRUCTION DCA I (COUTPUT+6) /STORE OVER OUTPUT ROUTINE JMP LODFIX /CONTINUE THERE / COMES HERE IF "OPATCH" OR "VT8PCH" HAVE CHANGED THE OUTPUT ROUTINE. OPRESEN,TAD (JMS I PDSPLA/[DSPLAY])/GET ZAPPING INSTRUCTION DCA I (COUTPUT+5) /STORE OVER MODIFIED OUTPUT ROUTINE CDF DFIELD /GOTO CODE FIELD NL7775 /TAD (-2-1) /SETUP NEW DCA I (DSPBACKUP) /BACKUP FACTOR FOR MODIFIED CODE CDF PRGFLD /BACK TO FIELD ZERO LODFIX, DCA I (BEOFZAP) /REPAIR LOADER JMP I (BEOFZAP) /RESUME LOADING / COMES HERE IF UNKNOWN COMBINATION OF FOCAL AND OVERLAYS IS PRESENT. BADFOCA,JMS I (OUTINITIALIZE) /INITIALIZE OUTPUT ROUTINES BADTALK,TAD I BMSGPTR /GET A MESSAGE CHARACTER SNA /END OF LIST? JMP I P7600/[SBOOT] /YES, GOODBYE JMS I (P7CH) /NO, SEND IT ISZ BMSGPTR /BUMP TO NEXT JMP BADTALK /KEEP GOING BMSGPTR,BMESSAGE /MESSAGE POINTER PAGE TESTVAL=COUTPUT+3&177+JMPC /JMP COUTPUT+3 ON ITS PAGE / OUTPUT ROUTINE FOR COMPLAINT MESSAGES. P7CH, .-. /SEVEN-BIT PRINT ROUTINE DCA P7TEMP /STASH PASSED VALUE P7AGN, JMS CHKUP /CHECK FOR <^C>, ETC. TAD P7TEMP /GET THE VALUE P7TSF, TSFIOT /**** CONSOLE **** CIF MCS+10 P7JMP, JMP P7AGN /**** CONSOLE **** JMS OUTCON P7TLS, TLSIOT /**** CONSOLE **** JMP P7AGN JMS CHKUP /CHECK FOR <^C>, ETC. JMP I P7CH /RETURN CHKUP, .-. /CHECK FOR <^C>, ETC. ROUTINE JMS CTLCTST /CHECK FOR <^C> SZA /SKIP IF NOTHING CAME IN TAD (-"Q!300) /ELSE COMPARE TO <^Q> SNA /SKIP IF NEITHER CASE JMP CHKCLR /ELSE FORGET IT TAD (-"S+"Q) /COMPARE TO <^S> SZA CLA /SKIP IF IT MATCHES JMP I CHKUP /ELSE RETURN JMS CTLCTST /GET ANOTHER CHARACTER TAD (-"Q!300) /COMPARE TO <^Q> SZA CLA /SKIP IF IT MATCHES JMP .-3 /ELSE KEEP GOING CHKCLR, DCA INCHAR /OBLITERATE <^Q>, ETC. JMP I CHKUP /RETURN CTLCTST,.-. /CHECK FOR <^C> ROUTINE CLA /CLEAN UP CHKKSF, KSFIOT /**** CONSOLE **** CIF MCS+10 CHKJMP, JMP I CTLCTST /**** CONSOLE **** JMS INCON CHKKRS, KRSIOT/OR KRBIOT /**** CONSOLE **** JMP I CTLCTST AND P177/[177] /JUST SEVEN BITS DCA INCHAR /STASH THE CHARACTER NL7775 /-3 TAD INCHAR /COMPARE INPUT TO <^C> SNA /SKIP IF OTHER ISZ I (SCRSIZE) /ELSE SET SOFT INDICATOR SPA SNA CLA /SKIP IF <^D> OR GREATER JMP I P7600/[SBOOT] /ELSE GOODBYE CHKKCC, KCCIOT/OR 0000 /**** CONSOLE **** 0000 TAD INCHAR /GET THE CHARACTER JMP I CTLCTST /RETURN OUTINIT,.-. /OUTPUT INITIALIZE ROUTINE TAD I P7600/[SBOOT] /GET BOOTSTRAP INSTRUCTION TAD (-JMSSYSIO) /COMPARE TO POSSIBLE VALUE SNA CLA /SKIP IF DIFFERENT JMP CHKCOVERLAY /JUMP IF IT MATCHES ISZ CHKKRS /TURN "KRSIOT" ISZ CHKKRS /INTO "KRBIOT" DCA CHKKCC /DESTROY "KCCIOT" CHKCOVR,NL0002 /SETUP "C" BIT MASK AND I (SCRSIZE) /GET THE "C" BIT SNA CLA /SKIP IF CONSOLE OVERLAY PRESENT JMP I OUTINITIALIZE /RETURN IF NOT TAD I (SCRSIZE) /GET THE CORE SIZE WORD RTR;RAR /MOVE OVER AND AND (70) /ISOLATE MCS BITS TAD (CIF 10) /TURN INTO CIF MCS+10 DCA P7TSF /STORE OVER "TSFIOT" TAD P7JMP /GET "JMP P7AGN" DCA P7TLS /STORE OVER "TLSIOT" TAD (JMS OUTCON) /GET OUTPUT CALL INSTRUCTION DCA P7JMP /STORE OVER "JMP P7AGN" TAD P7TSF /GET "CIF MCS+10" AGAIN DCA CHKKSF /STORE OVER "KSFIOT" TAD CHKJMP /GET "JMP I CTLCTST" DCA CHKKRS /STORE OVER "KRSIOT" (OR "KRBIOT") TAD (JMS INCON) /GET INPUT CALL INSTRUCTION DCA CHKJMP /STORE OVER "JMP I CTLCTST" DCA CHKKCC /DESTROY "KCCIOT" JMP I OUTINITIALIZE /RETURN INCHAR, .-. /INPUT TEMPORARY P7TEMP, .-. /OUTPUT TEMPORARY / COMPLAINT MESSAGE. BMESSAG,"G&37 / "M&37 / "J&37 / "F&177 "O&177 "C&177 "A&177 "L&177 "/&177 "O&177 "V&177+40 "E&177+40 "R&177+40 "L&177+40 "A&177+40 "Y&177+40 " &177 "C&177 "O&177+40 "N&177+40 "F&177+40 "L&177+40 "I&177+40 "C&177+40 "T&177+40 "!&177 0 /THIS ENDS THE LIST PAGE *BEOFZAP /OVER LOADER SKP /MAKE IT COME TO US $ /THAT'S ALL FOLK!