/ DISPLAY PROCESSING PROGRAM / LAST EDIT: 15-AUG-1988 14:00:00 CJL / MAY BE ASSEMBLED WITH '/J' SWITCH SET. / THIS PROGRAM PROCESSES X, Y PAIR DATA ON THE DISK CREATED BY A PRIOR PROGRAM / (SUCH AS FOCAL, ETC.). THE DATA FORMAT IS PROSCRIBED BY THE FOCAL "DPATCH" / PROGRAM. / PROGRAM USAGE: / AFTER RUNNING THE DATA CREATION PROGRAM, INVOKE THIS PROGRAM AS FOLLOWS: / .GET BDSPRC BINARY OF THIS ASSEMBLY / .R$ NORMAL RUN TO PROCESS ONLY THIS SET OF DATA / OR / .R$/P TO PRESERVE PRIOR DATA THUS "OR"-ING IN THIS DATA / THIS WILL CREATE (OR ADD TO IF /P) DATA ON THE DISK IN PIXEL PLOT FORMAT FOR / FURTHER PROCESSING BY OTHER GRAPHICS UTILITIES. / PROGRAM DEFINITIONS. / FIELD DEFINITIONS. PIXFLD= 2^10 /PIXEL FIELD PRGFLD= 0^10 /PROGRAM FIELD XYFLD= 1^10 /FIELD FOR X, Y DATA PAIRS / SYSTEM DEFINITIONS. SBOOT= 7600 /MONITOR EXIT ADDRESS SWMX= 7605 /SWITCHES /M-/X SYSIO= 7640 /I/O ROUTINES ENTRY POINT WRITE= 4000 /SYSIO WRITE FUNCTION BIT / XY DEVICE DEFINITIONS. XYBLK= 4400 /STARTING BLOCK FOR X, Y DATA PAIRS XYHIGH= 6260 /UPPER BLOCK LIMIT FOR X, Y DATA PAIRS XYUNIT= 3 /LOGICAL UNIT FOR X, Y DATA PAIRS / NUMERIC LOAD DEFINITIONS. NL4000= CLA CLL CML RAR /LOAD AC WITH 4000 NL7777= CLA CMA /LOAD AC WITH 7777 / GRAPHICS DEFINITIONS. DECIMAL /MAKE IT EASIER NEGX= -384 /LARGEST X COORDINATE (NEGATIVE) NEGY= -768 /LARGEST Y COORDINATE (NEGATIVE) OCTAL /BACK TO NORMAL / GRAPHICS COORDINATE SYSTEM DEFINITIONS. / THE TWO-DIMENSIONAL GRAPHICS COORDINATE SYSTEM IS DEFINED AS A SYMMETRICAL / RECTANGLE: / [NEGX, -NEGY-1] ------------------------------------------- [-NEGX-1, -NEGY-1] / ! ! / ! ! / ! ! / ! ! / ! ! / ! ! / ! ! / ! ! / ! ! / ! [0, 0] ! / ! ! / ! ! / ! ! / ! ! / ! ! / ! ! / ! ! / ! ! / ! ! / [NEGX, NEGY] ------------------------------------------------- [-NEGX-1, NEGY] / PIXEL OUTPUT DEVICE DEFINITIONS. PXLOWER=0000&7740 /STARTING BLOCK ON FIRST PIXEL UNIT FOR PIXEL /GRAPHICS (MUST BE A MULTIPLE OF 40) PXUNT1= 3 /FIRST UNIT FOR PIXEL GRAPHICS PXUNT2= 4 /SECOND UNIT FOR PIXEL GRAPHICS (IF NECESSARY) PXUNT3= 5 /THIRD UNIT FOR PIXEL GRAPHICS (IF NECESSARY) PXUNT4= 6 /FOURTH UNIT FOR PIXEL GRAPHICS (IF NECESSARY) / NOTE: PIXEL GRAPHICS OUTPUT UNITS ARE ASSUMED TO BE CAPABLE OF SUPPORTING / 4096 BLOCKS EACH (IF NECESSARY). THE LOWER LIMIT BLOCK FOR EACH OF THE / SECONDARY UNITS IS IMPLICITLY 0000. GENERALLY, PXLOWER=0000 SHOULD BE CHOSEN / FOR LARGE PIXEL PLANES, SINCE NEARLY THE ENTIRE CAPACITY OF THREE UNITS / (2.67188 LOGICAL UNITS) IS REQUIRED TO HOLD THE DEFINITION OF A MAXIMUM / GRAPHICS PLANE (4096X4096). LARGER VALUES OF PXLOWER COULD REQUIRE USAGE OF A / FOURTH GRAPHICS OUTPUT UNIT. (THIS IS UNNECESSARY.) / CALCULATION OF UPPER LIMIT OF PIXEL GRAPHICS USAGE. / TO CALCULATE THE USAGE OF PIXEL GRAPHICS OUTPUT UNIT(S), THE FOLLOWING / DEFINITIONS APPLY: XRANGE= -NEGX-NEGX /COUNT OF VALID X VALUES. YRANGE= -NEGY-NEGY /COUNT OF VALID Y VALUES. YWORDS= YRANGE-1%14+1 /COUNT OF Y WORDS NEEDED FOR EVERY X LINE. / TOTWRDS=YWORDS*XRANGE /TOTAL DISK WORDS NEEDED FOR ENTIRE PIXEL /GRAPHICS SET. / TOTBLKS=(TOTWRDS+177)/200 /TOTAL DISK BLOCKS NEEDED FOR ENTIRE PIXEL /GRAPHICS SET. / PXUSAGE=(TOTBLKS+37)&(-40) /TOTAL DISK BLOCK USAGE IN BLOCKS ROUNDED UP /TO NEAREST FIELD. / PXLIMIT=PXUSAGE+PXLOWER /FIRST BLOCK NOT USED FOR PIXEL GRAPHICS. / IF PXLIMIT < 10000 THEN THE ENTIRE PIXEL GRAPHICS SET FITS ON A SINGLE PIXEL / GRAPHICS OUTPUT UNIT. IF PXLIMIT > 10000 THEN THE FIRST PIXEL GRAPHICS OUTPUT / UNIT IS USED THROUGH BLOCK 7777. TO CALCULATE USAGE ON THE SECOND PIXEL / GRAPHICS OUTPUT UNIT, SUBTRACT 10000 FROM PXLIMIT TO FORM THE SECOND UNIT / LIMIT. IF THIS VALUE IS ALSO > 10000 THEN THE ENTIRE SECOND UNIT IS USED / (0000-7777). IN THIS CASE, SUBTRACTING 10000 FROM THE SECOND UNIT LIMIT WILL / FORM THE THIRD UNIT LIMIT; IF THE RESULTING VALUE IS > 10000 THEN THE PXLOWER / VALUE WAS TOO HIGH TO FIT ALL OF THE DATA ON THREE UNITS AND A FOURTH UNIT IS / REQUIRED. (THE ENTIRE DEFINITION OF A MAXIMUM (4096X4096) PIXEL PLANE / REQUIRES LESS THAN THREE (2.67188) COMPLETE LOGICAL UNITS.) CHOOSING / PXLOWER=0000 (AS RECOMMENDED) GUARANTEES ALL DATA ON THREE UNITS OR LESS. PAGE 0 /START AT THE BEGINNING *10 /GET TO AUTO-INDEX AREA *20 /GET PAST AUTO-INDEX AREA BIT, .-. /=> LATEST BIT TO OR INTO CURFLD, .-. /CURRENT VIRTUAL FIELD DIRTYSW,.-. /VIRTUAL BUFFER DIRTY SWITCH HICNT, .-. /HIGH-ORDER DISPLAY COUNT LATFLD, .-. /LATEST VIRTUAL FIELD LOCNT, .-. /LOW-ORDER DISPLAY COUNT L177, 177; 0 /CONSTANT 0000 0177 L37, 37; 0 /CONSTANT 0000 0037 PIXLOWE,PXLOWER;0 /LOWER BLOCK LIMIT FOR PIXEL OUTPUT PIXUPPE,ZBLOCK 2 /UPPER BLOCK LIMIT FOR PIXEL OUTPUT WORD, .-. /LATEST Y WORD X, .-. /LATEST X DATA Y, .-. /LATEST Y DATA / EAE DEFINITIONS. CAM= CLA MQL /CLEAR AC, MQ DAD= JMS I [DADD] /DOUBLE-PRECISION ADD DST= JMS I [DSTORE]/DOUBLE-PRECISION STORE DVI= JMS I [XDVI] /DIVIDE LSR= JMS I [XLSR] /LOGICAL SHIFT RIGHT MUY= JMS I [XMUY] /MULTIPLY PAGE /START AT THE BEGINNING START, JMS I (INITIALIZE) /SETUP POINTERS, ETC. LOOP, JMS GETXY /GET A PAIR JMS I (PUTXY) /PUT A PAIR ISZ LOCNT /COUNT THIS ONE SKP /SKIP IF NOT DONE (INNER) ISZ HICNT /DONE WITH ALL POINTS? JMP LOOP /NO, KEEP GOING JMS I [WRITIO] /YES, WRITE OUT LAST BUFFER JMP I [SBOOT] /GOODBYE! GETXY, .-. /GET A PAIR ROUTINE JMP I GETEXIT /GO WHERE YOU HAVE TO GETEXIT,GETINIT /EXIT ROUTINE CDF XYFLD /GOTO PAIR FIELD TAD I GETPTR /GET AN X VALUE DCA X /STASH IT ISZ GETPTR /BUMP TO NEXT TAD I GETPTR /GET A Y VALUE DCA Y /STASH IT ISZ GETPTR /BUMP TO NEXT NOP /JUST IN CASE CDF PRGFLD /BACK TO OUR FIELD JMP I GETXY /RETURN TO MAIN CALLER / COMES HERE TO READ IN THE NEXT BUFFER. GETIO, JMS I [SYSIO] /CALL I/O ROUTINES GETPTR, 0000 /TRANSFER ADDRESS XYFUN, .-.^100+XYFLD+XYUNIT /PAGE COUNT WILL BE FILLED IN XYBLOCK,.-. /BLOCK WILL BE FILLED IN GETLUP, JMS GETEXIT /ACQUIRE LATEST X, Y PAIR AND RETURN TAD GETPTR /GET THE POINTER SZA CLA /SKIP IF AT END OF BUFFER JMP GETLUP /ELSE JUST KEEP GOING TAD XYBLOCK /GET THE BLOCK TAD [40] /UPDATE TO NEXT BUFFER DCA XYBLOCK /STORE BACK CLL /CLEAR LINK FOR TEST TAD XYBLOCK /GET THE NEW BLOCK TAD [40] /ADD ON TENTATIVE COUNT TAD (-XYHIGH) /COMPARE TO DEVICE UPPER LIMIT SNL /SKIP IF NEAR END OF DEVICE JMP XYOK /JUMP IF NOT CIA /NOW HAVE HOW MANY NOT TO USE SKP /DON'T CLEAR! XYOK, CLA /CLEAN UP / TAD [40] /NOW HAVE LATEST PAGE COUNT AND [37] /JUST PAGE BITS FOR CALL CLL RTL;RTL;RTL /MOVE UP TAD (XYFLD+XYUNIT) /ADD ON FIELD AND UNIT BITS DCA XYFUN /STORE IN-LINE JMP GETIO /CONTINUE THERE / COMES HERE TO INITIALIZE FIRST BUFFER, ETC. GETINIT,JMS I [SYSIO] /CALL I/O ROUTINES 0000 /TRANSFER ADDRESS 40&37^100+XYFLD+XYUNIT /FUNCTION XYBLK /BLOCK DCA GETPTR /CLEAR THE POINTER TAD (XYBLK) /SETUP THE DCA XYBLOCK /INITIAL BLOCK CDF XYFLD /GOTO PAIR FIELD TAD I GETPTR /GET THE LOW-ORDER COUNT CLL CIA /INVERT IT FOR COUNTING DCA LOCNT /STASH IT ISZ GETPTR /BUMP TO NEXT TAD I GETPTR /GET THE HIGH-ORDER COUNT CMA /INVERT IT FOR COUNTING SZL /CARRY? IAC /YES, SO INCREMENT DCA HICNT /STASH IT ISZ GETPTR /BUMP TO NEXT TAD LOCNT /GET LOW-ORDER COUNT SNA /SKIP IF NOT ZERO TAD HICNT /ELSE GET HIGH-ORDER COUNT SNA CLA /SKIP IF NOT ZERO JMP I [SBOOT] /NO DATA, SO JUST LEAVE! JMP GETLUP /CONTINUE THERE PAGE / X, Y OUTPUT ROUTINE. PUTXY, .-. /OUTPUT X, Y ROUTINE NL4000 /SET SIGN BIT TAD Y /NOW HAVE Y (UNSIGNED) IFNZRO YRANGE < MQL /PUT IN LOW-ORDER (%4096) MUY; YRANGE /SCALE TO PREVAILING RANGE OF Y > MQL /MOVE TO LOW-ORDER DVI; 14 /DIVIDE BY 12 TO GET WORD AND BIT TAD (PIXTABLE) /POINT TO PROPER BIT MASK DCA BIT /STASH THE POINTER MQA /GET QUOTIENT DCA WORD /SAVE AS RELATIVE WORD NUMBER NL4000 /SET SIGN BIT TAD X /NOW HAVE X (UNSIGNED) IFNZRO XRANGE < MQL /PUT IN LOW-ORDER (%4096) MUY; XRANGE /SCALE TO PREVAILING RANGE OF X > MQL /MOVE TO LOW-ORDER MUY; YWORDS /MULTIPLY BY HOW MANY Y-WORDS THERE ARE SWP /GET LOW-ORDER FIRST CLL /START WITH CLEAR LINK TAD WORD /ADD ON RELATIVE WORD NUMBER FROM Y SWP /SWAP BACK SZL /CARRY? IAC /YES, SO INCREMENT HIGH-ORDER / WE NOW HAVE THE WORD ADDRESS WHERE THE BIT TO OR IN ACTUALLY IS. DCA LATFLD /SAVE THIS BIT'S FIELD MQA /GET WORD ADDRESS DCA WORD /STASH IT / DETERMINE IF LATEST FIELD IS RESIDENT. TAD CURFLD /GET CURRENT FIELD IN MEMORY CIA /INVERT FOR TESTING TAD LATFLD /COMPARE TO LATEST BIT'S FIELD SNA CLA /SKIP IF DIFFERENT JMP PUTIT /JUMP IF THEY MATCH JMS I [WRITIO] /WRITE OUT CURRENT BUFFER TAD LATFLD /GET OUR FIELD DCA CURFLD /MAKE IT THE CURRENT FIELD JMS I [READIO] /READ IN THE EXISTING WORDS PUTIT, TAD I BIT /GET THE PROPER BIT TO SET MQL /INTO MQ FOR NOW CDF PIXFLD /GOTO BUFFER FIELD TAD I WORD /GET THE CURRENT WORD MQA /OR IN OUR BIT DCA I WORD /STORE BACK COMPOSITE CDF PRGFLD /BACK TO OUR FIELD DCA DIRTYSW /INDICATE THIS BUFFER IS NOW DIRTY JMP I PUTXY /RETURN READIO, .-. /READ ROUTINE CLA /CLEAN UP TAD CURFLD /GET CURRENT FIELD CLL RTL;RAL /MOVE UP DCA READBLK /STORE AS BLOCK NUMBER JMS I [IO] /CALL I/O ROUTINES 0000 /TRANSFER ADDRESS 40&37^100+PIXFLD /READ FUNCTION READBLK,.-. /BLOCK NUMBER WILL BE FILLED IN NL7777 /INDICATE THE DCA DIRTYSW /BUFFER IS CLEAN JMP I READIO /RETURN WRITIO, .-. /WRITE ROUTINE CLA /CLEAN UP ISZ DIRTYSW /IS THE BUFFER CLEAN? SKP /SKIP IF NOT JMP I WRITIO /RETURN IF SO TAD CURFLD /GET CURRENT FIELD CLL RTL;RAL /MOVE UP DCA WRIBLK /STORE AS BLOCK NUMBER JMS I [IO] /CALL I/O ROUTINES 0000 /TRANSFER ADDRESS 40&37^100+PIXFLD+WRITE /WRITE FUNCTION WRIBLK, .-. /BLOCK NUMBER WILL BE FILLED IN JMP I WRITIO /RETURN PAGE INITIAL,.-. /INITIALIZE ROUTINE CAM /CLEAN UP TAD XRANG/(XRANGE) /GET X-WORD VALUE SNA CLA /SKIP IF NOT FULL RANGE JMP CAL4096 /JUMP IF FULL RANGE TAD (YWORDS) /GET Y-WORD COUNT MQL /TO LOW-ORDER MUY; XRANG, XRANGE /MULTIPLY BY X-WORD COUNT SKP /DON'T USE 4096 VALUE CAL4096,TAD (YWORDS) /NOW HAVE (Y-WORD COUNT)*4096 DAD; L177 /ROUND UP TO NEXT BLOCK LSR; 7 /%200 FOR BLOCK COUNT DAD; L37 /ROUND UP TO NEXT FIELD DAD; PIXLOWER /ADD ON LOWER LIMIT BLOCK NUMBER SWP /GET LOW-ORDER AND [7740] /JUST FIELD BITS SWP /RESTORE LSR; 2 /REDUCE TO QUAD NUMBER DST; PIXUPPER /STORE QUAD-BLOCK LIMIT VALUE NL7777 /INDICATE THAT DCA DIRTYSW /LATEST BUFFER IS CLEAN NL7777 /SETUP AN DCA CURFLD /IMPOSSIBLE FIELD TAD (GETINIT) /RESET THE DCA I (GETEXIT) /INPUT CO-ROUTINE TAD I (SWMX) /GET /M-/X SWITCHES AND (400) /JUST /P SWITCH SZA CLA /SKIP IF NOT SET JMP I INITIALIZE /JUST RETURN IF SET DCA CLRBLK /ZERO CLEARING BLOCK CDF PIXFLD /GOTO PIXEL FIELD DCA I CLRBLK /CLEAR A WORD ISZ CLRBLK /DONE YET? JMP .-2 /NO, GO BACK CDF PRGFLD /BACK TO OUR FIELD CLRLUP, JMS I [IO] /CALL I/O ROUTINES 0000 /TRANSFER ADDRESS 40&37^100+PIXFLD+WRITE /WRITE FUNCTION CLRBLK, .-. /BLOCK WILL BE FILLED IN TAD CLRBLK /GET THE BLOCK TAD [10] /UPDATE TO NEXT FIELD DCA CLRBLK /STORE BACK TAD CLRBLK /GET THE LATEST BLOCK CIA /INVERT FOR TEST TAD PIXUPPER /COMPARE TO UPPER LIMIT SZA CLA /SKIP IF AT END JMP CLRLUP /ELSE KEEP GOING JMP I INITIALIZE /RETURN / QUAD-BLOCK => MULTIPLE UNIT I/O ROUTINE. IO, .-. /QUAD-BLOCK I/O ROUTINE CLA /CLEAN UP TAD I IO /GET TRANSFER ADDRESS DCA TRADDR /STASH IT ISZ IO /BUMP TO NEXT TAD I IO /GET FUNCTION WORD (WITHOUT UNIT) DCA TRFUN /SAVE FOR NOW ISZ IO /BUMP TO NEXT TAD I IO /GET BLOCK ARGUMENT AND (1777) /JUST BLOCK BITS CLL RTL /ADJUST QUADS TO BLOCK NUMBER DCA TRBLK /STASH THE BLOCK NUMBER TAD I IO /GET BLOCK ARGUMENT AGAIN RTL;RAL /MOVE DOWN AND [3] /ISOLATE UNIT BITS TAD (TAD IOTABLE)/FORM PROPER INSTRUCTION DCA .+1 /STORE IN-LINE TAD IOTABLE+.-. /PROPER UNIT WILL BE FILLED IN TAD TRFUN /ADD ON FUNCTION BITS DCA TRFUN /STASH THE FINAL FUNCTION WORD JMS I [SYSIO] /CALL REAL I/O ROUTINES TRADDR, .-. /WILL BE TRANSFER ADDRESS TRFUN, .-. /WILL BE FUNCTION WORD TRBLK, .-. /WILL BE BLOCK NUMBER ISZ IO /BUMP PAST BLOCK ARGUMENT JMP I IO /RETURN / I/O UNIT TABLE. IOTABLE,PXUNT1 /FIRST I/O UNIT PXUNT2 /SECOND I/O UNIT (IF NECESSARY) PXUNT3 /THIRD I/O UNIT (IF NECESSARY) PXUNT4 /FOURTH I/O UNIT (IF NECESSARY) PAGE / DIVIDE ROUTINE. XDVI, .-. /DIVIDE DCA XDVIAC /SAVE HIGH-ORDER MQA /GET LOW-ORDER DCA XDVIMQ /STASH IT TAD I XDVI /GET THE ARGUMENT VALUE CIA /INVERT IT DCA XDIVSOR /SAVE AS DIVISOR TAD XDVIAC /GET BACK AC STL CMA /COMPLEMENT AND SET LINK FOR TEST TAD I XDVI /ADD ON DIVISOR SZL CLA /SKIP IF NO OVERFLOW JMP XDVIEXT /JUMP IF OVERFLOW TAD (-14) /SETUP THE DCA XDVICT /SHIFT COUNTER XDVILP, TAD XDVIMQ /GET LOW-ORDER CLL RAL /MOVE UP DCA XDVIMQ /STORE BACK TAD XDVIAC /GET HIGH-ORDER RAL /MOVE UP DCA XDVIAC /STORE BACK TAD XDVIAC /GET HIGH-ORDER TAD XDIVSOR /COMPARE TO DIVISOR SZL /SKIP IF SMALLER DCA XDVIAC /ELSE STORE BACK SZL CLA /SKIP IF SMALLER ISZ XDVIMQ /ELSE BUMP QUOTIENT ISZ XDVICT /SHIFTED ENOUGH? JMP XDVILP /NO, KEEP GOING TAD XDVIMQ /GET LOW-ORDER MQL /LOAD IT TAD XDVIAC /GET HIGH-ORDER XDVIEXT,ISZ XDVI /BUMP PAST ARGUMENT JMP I XDVI /RETURN XDVIMQ, .-. /LOW-ORDER STORAGE OF PASSED VALUE XDVIAC, .-. /HIGH-ORDER STORAGE OF PASSED VALUE XDVICT, .-. /SHIFT COUNTER XDIVSOR,.-. /DIVISOR / MULTIPLY ROUTINE. XMUY, .-. /MULTIPLY ROUTINE CLA CLL /CLEAN UP TAD (-15) /SETUP THE DCA XMUYCT /SHIFT COUNTER XMUYUP, RAR /SHIFT RIGHT SWP /INTO LOW-ORDER; GET LOW-ORDER RAR /SHIFT RIGHT SWP /RETURN TO LOW-ORDER; GET ORIGINAL HIGH-ORDER ISZ XMUYCT /SHIFTED ENOUGH? SKP /SKIP IF NOT JMP XMUYEXT /EXIT IF SO SNL /LATEST BIT ON JMP XMUYUP /NO, JUST KEEP GOING CLL /YES, CLEAR LINK FOR PROPER CARRY TAD I XMUY /ADD ON ARGUMENT VALUE JMP XMUYUP /KEEP GOING XMUYEXT,ISZ XMUY /BUMP PAST THE ARGUMENT JMP I XMUY /RETURN XMUYCT, .-. /SHIFT COUNTER DADD, .-. /ADD ROUTINE DCA XMUYCT /SAVE HIGH-ORDER TAD I DADD /GET ARGUMENT DCA XMUY /STASH IT MQA /GET LOW-ORDER CLL /INITIALIZE CARRY TAD I XMUY /ADD ON LOW-ORDER ARGUMENT MQL /PUT INTO MQ ISZ DADD /BUMP PAST ARGUMENT ISZ XMUY /BUMP TO HIGH-ORDER RAL /GET CARRY TAD XMUYCT /RESTORE AC TAD I XMUY /ADD ON HIGH-ORDER ARGUMENT JMP I DADD /RETURN DSTORE, .-. /STORE ROUTINE DCA XMUYCT /SAVE AC TAD I DSTORE /GET ARGUMENT DCA XMUY /STASH IT MQA /GET LOW-ORDER DCA I XMUY /STORE IT ISZ DSTORE /BUMP PAST ARGUMENT ISZ XMUY /BUMP TO HIGH-ORDER TAD XMUYCT /RESTORE AC DCA I XMUY /STORE IT TAD XMUYCT /RESTORE AC AGAIN JMP I DSTORE /RETURN / LOGICAL SHIFT RIGHT ROUTINE. XLSR, .-. /LOGICAL SHIFT RIGHT ROUTINE DCA XMUY /SAVE AC FOR NOW TAD I XLSR /GET SHIFT COUNT CMA /INVERT FOR COUNTING DCA XDVI /STASH THE COUNTER TAD XMUY /RESTORE AC JMP XLSRTST /CONTINUE THERE XLSRLUP,CLL RAR /MOVE TO THE RIGHT SWP /GET LOW-ORDER RAR /MOVE TO THE RIGHT SWP /RESTORE XLSRTST,ISZ XDVI /DONE YET? JMP XLSRLUP /NO, KEEP GOING CLL /YES, CLEAR LINK NOW ISZ XLSR /BUMP PAST SHIFT COUNT JMP I XLSR /RETURN / PIXEL BIT TABLE. PIXTABL,4000 /BIT[0] 2000 /BIT[1] 1000 /BIT[2] 0400 /BIT[3] 0200 /BIT[4] 0100 /BIT[5] 0040 /BIT[6] 0020 /BIT[7] 0010 /BIT[8] 0004 /BIT[9] 0002 /BIT[10] 0001 /BIT[11] PAGE $ /THAT'S ALL FOLK!