O^#Ԩq VGP2SUP4.CODEvgq VGP2SUP5.CODEvgq VGP2.A.CODEFqVGP2.A.CODEFVGP2 q* VGP2.A.TEXTvgԨ*N VGP2.B.TEXTvgԨNd VGP2.C.TEXTvgԨdx VGP2.D.TEXTvgqx VGP2.U.TEXTvgq VGP2.X.TEXTvgq VGP2U.CODE=vgq VGP2SUP2.CODEvgq VGP2SUP3.CODEvg .TITLE"VGP][ PASCAL SUPPORT 16-APR-84 AJC"  ; !.MACRO pop !PLA !STA %1 !PLA !STA %1+1 !.ENDM ! !.MACRO push !LDA %1+1 !PHA !LDA %1 !PHA !.ENDM  ;  SLOT .EQU 4 ; CHANGE THIS FOR DIFFERENT SLOTS BASE .EQU SLOT*10+0C080 ; CALCULATE VGP ADDRERD: LDA TYL ; RESTORE SCREEN POSITION STA YLSB LDA TYM STA YMSB RSXCRD: LDA TXL ; RESTORE X CO-ORD STA XLSB ; WRITE BACK TO VGP LDA TXM STA XMSB ; FOR ALL REGISTERS RTS ; DONE IT ; RESVGP: LDX #2 ; RESTORE VGP STATUS RESVLP: LDA TEMP1,X STA CTRLTRL1 ; AND PUT BACK INTO REGISTER RTS ; DONE IT ; ; READY ROUTINE DOES STATUS CHECK READY PHA ; SAVE WORK REGISTER RWAIT LDA STATUS ; READ STATUS AND #04 ; MASK READY BIT BEQ RWAIT ; NOT DONE, LOOP PLA ; GET VALUE BACK TO A RTS ; AND CONTINUE  ; RESC!LDA COLCOP ; RESTORE BLUE & GREEN PLANES IF COLOUR !STA COLREG  RESDON: RTS  ; ; WRITE COMMAND ROUTINE, CHECKS STATUS WCMD JSR READY STA CMD ; CHECK STATUS AND WRITE COMMAND RTS ; THE JOB IS COMPLETE ; WCTRL1: JSR READY ; WAIT FOR COMPLETION STA C  C4COPY .BYTE 0  COLCOP .BYTE 0  COLOR .BYTE 0  ;  ; RESET COLOUR ROUTINE  RESCOL: JSR READY !LDA C4COPY ; GET RED PLANE COPY !STA CTRL4 ; RESTORE VGP REGISTER !BIT COLOR ; MONO / COLOUR ? !BPL RESDON PY,COLCOP,COLOR !.DEF WCMD,READY,WCTRL1,RESCOL !.DEF SAVVGP,SAVCRD,SVXCRD,RESVGP,RESCRD,RSXCRD  ;  BITDL .BYTE 0 ; BIT MAP PERMANENT STORAGE  BITDM .BYTE 0  BITX .BYTE 0  BITY .BYTE 0  BITM .BYTE 0  C3COPY .BYTE 0 ; VGP STATUS PERMANENT STORAGEQU 47.  DYCMSB .EQU 48.  TXCLSB .EQU 49. ; CIRCLE TEMP STORES  TXCMSB .EQU 50.  TYCLSB .EQU 51.  TYCMSB .EQU 52. ; !.proc zzzzz0  ; DUMMY PROCEDURE TO HOLD PRIVATE VARIABLES + GENERAL ROUTINES  ; !.DEF BITDL,BITDM,BITX,BITY,BITM !.DEF C3COPY,C4COJUMPL .EQU 37. ; AREA FILL JUMP  JUMPM .EQU 38.  DLSB .EQU 39. ; CIRCLE ERROR TERM  DMSB .EQU 40.  XCLSB .EQU 41. ; CIRCLE CENTRE  XCMSB .EQU 42.  YCLSB .EQU 43.  YCMSB .EQU 44.  DXCLSB .EQU 45. ; CIRCLE WORKING STORES  DXCMSB .EQU 46.  DYCLSB .EL .EQU 29. ; STORAGE OF SCREEN POSITION TYM .EQU 30. PXNLSB .EQU 31. ; PREVIOUS LINE LEFT X PT. PXNMSB .EQU 32. PXPLSB .EQU 33. ; PREVIOUS LINE RIGHT X PT PXPMSB .EQU 34. STACKO .EQU 35. ; SAVE FOR STACKC STACKC .EQU 36. ; AREA FILL STACK COUNTER SB .EQU 21. ; TEMP Y COORD MSB DXTLSB .EQU 22. ; TEMP DELTAX LSB DXTMSB .EQU 23. ; TEMP DELATX MSB DYTLSB .EQU 24. ; TEMP DELATY LSB DYTMSB .EQU 25. ; TEMP DELATY MSB ACMDT .EQU 26. ; CONSOLIDATED COMMAND TEMP TXL .EQU 27. TXM .EQU 28. ; FOUR BYTES FOR TYURN REGISTER LSB VALMSB .EQU 14. ; VARIABLE GET RETURN REGISTER MSB TEMP1 .EQU 15. ; TEMP STORE IN ZERO PAGE TEMP2 .EQU 16. ; SOME MORE TEMP3 .EQU 17. XTLSB .EQU 18. ; TEMP X COORD LSB XTMSB .EQU 19. ; TEMP X COORD MSB YTLSB .EQU 20. ; TEMP Y COORD LSB YTM COLRB .EQU BASE2 ; READ COLOUR - BLUE PLANE  COLRG .EQU BASE2+1 ; READ COLOUR - GREEN PLANE  COLREG .EQU BASE2+2 ; WRITE MODE - BLUE / GREEN ; ; TEMP STORAGE IN ZERO PAGE  ; RETURN .EQU 0 ; STORES RETURN ADDRESS  VALLSB .EQU 13. ; VARIABLE GET RETION LSB CTRL3 .EQU BASE1 ; VGP][ FORMAT REGISTER CTRL4 .EQU BASE1+1 ; WRITE MODE (MONO / RED PLANE) SCROLL .EQU BASE1+2 ; SCROLL POSITION PAN .EQU BASE1+3 ; PAN POSITION COLRR .EQU BASE1+4 ; READ COLOUR (MONO / RED PLANE) SE+2 ; CONTROL 2 REG CSIZE .EQU BASE+3 ; CHARACTER SIZE DELTAX .EQU BASE+5 ; X PROJECTION DELTAY .EQU BASE+7 ; Y PROJECTION XMSB .EQU BASE+8 ; X POSITION MSB XLSB .EQU BASE+9 ; X POSITION LSB YMSB .EQU BASE+10. ; Y POSITION MSB YLSB .EQU BASE+11. ; Y POSITSS FROM SOLT BASE1 .EQU SLOT*100+0C000 ; AND SPECIAL REGISTERS NOT IN VGP BASE2 .EQU BASE+10 ; FOR COLOUR EXPANDER CARD (IF FITTED)  STATUS .EQU BASE ; VGP REGISTERS CMD .EQU BASE ; CMD IS WRITE ONLY CTRL1 .EQU BASE+1 ; REST OF THE REGISTERS CTRL2 .EQU BA1,X DEX BPL RESVLP RTS ;  SAVVGP: LDX #2 ; SAVE VGP STATUS SAVLP: LDA CTRL1,X STA TEMP1,X DEX BPL SAVLP ; SAVCRD LDA YLSB ; SAVE SCREEN POSITION STA TYL ; AND SAVE LDA YMSB ; FOR ALL REGISTERS STA TYM SVXCRD: LDA XLSB STA TXL LDA XMSB STA TXM RTS ; DONE IT ;  ; INITIALISE VGP !.proc init  ; .REF C4COPY,COLCOP,RESCOL,C3COPY,READY !LDA #88 ; CLEAR BORDER STA C4COPY STA COLCOP JSR RESCOL ; RESET COLOUR LDA #0 !STA PAN !STA SCROLL !LDA C3COPY AND #3 STA C3COPY LDA #1 ; UK ,1 LOOPCT: .BYTE 6 ; USA INTERLACED .BYTE 7 ; UK INTERLACED .BYTE 3 ; USA NON-INTERLACED .BYTE 3 ; UK NON-INTERLACED ; LASTSZ: .BYTE 8 .BYTE 0 .BYTE 4 .BYTE 0 ;  ; ****** TEXT OPERATIONS *********************************************  ; ; SELECT TEE TXA DEY ; 8LINES PER SCREEN BPL INLOP ; AND LOOP JSR RESCOL ; RESTORE COLOUR REGISTERS JSR RESVGP ; RESTORE CTRL1,CTRL2,CSIZE JMP RESCRD ; ; SCREEN ADDRESS TABLES FOR FILL ; ILSBT .BYTE 00,40,80,0C0,00,40,80,0C0 IMSBT .BYTE 00,00,00,00,01,01,01,0 LDA IMSBT,Y ; GET MSB STA YMSB ; WRITE TO VGP LDA XTMSB ; SET PAGE TO WRITE STA XMSB LDX #8 ; COUNT BLOCKS PER LINE LDA #0B ; SET BLOCK DRAW CMD ; INLOP1 JSR READY ; WAIT FOR VGP STA CMD ; AND INVERT BLOCK DEX ; COUNT BNE INLOP1 ; 8 BLOCKS PER LINREEN SIZE TAX LDY LOOPCT,X ; SET LOOP COUNT LDA #0D ; RESET X POSITION STA CMD ; WRITE COMMAND LDA LASTSZ,X ; GET 1ST SIZE INLOP JSR READY ; WAIT FOR VGP STA CSIZE ; SET BLOCK SIZE LDA ILSBT,Y ; GET LSB ADDRESS STA YLSB ; WRITE IT CTRL2,CSIZE PLA ; SET PEN/ERASER !ORA CTRL1 !DEY ; IF Y 1 THEN SET ERASER !BNE SCRN2 !AND #0FD  SCRN2: STA CTRL1 !LDA #00 ; NOW SET TO WHAT WE WANT STA CTRL2 ; MODE ETC LDA XMSB ; SAVE PAGE TO WRITE AND #2 STA XTMSB LDA #3 AND C3COPY ; GET SCECTED PLANES IN COLOUR MODES .proc invert_screen  ; !.REF C3COPY,SETRMW,READY,SAVVGP,RESPOS,RESVGP,RESCRD,RESCOL !.DEF SCREEN !JSR READY !JSR SETRMW ; SET INVERT LDY #0 !LDA #3 ; PEN ON AND DOWN  ;  SCREEN: PHA !JSR SAVVGP ; SAVE POSITION,CTRL1, JSR WCMD ;THEN MAKE SURE PEN IS SELECTED JMP PEN ;  ; FILL THE SCREEN IN THE CURRENT WRITE MODE !.proc fill  ; !.REF SCREEN !LDY #0 !LDA #2 !JMP SCREEN  ;  ; INVERT THE STATE OF EACH PIXEL ON THE SCREEN BY INVERTING BLOCKS ; ROUTINE HONOURS PROTN,PEN LDA C4COPY ; CHECK FOR BAD WRITE MODES !AND #5 !BNE LONGC !BIT COLOR !BPL CLEAR0 !LDA COLCOP !AND #55 !BEQ CLEAR0  LONGC LDY #1 ; IF BAD WRITE MODE, CLEAR SCREEN BY PIXEL !LDA #0 !JSR SCREEN !JMP PEN  CLEAR0 LDA #4 EF WCTRL1 LDA CTRL1 ; READ EXISTING VALUE AND #07 ; CLEAR THE BIT JMP WCTRL1 ; AND WRITE BACK ;  ; ****** SCREEN OPERATIONS *******************************************  ;  ; CLEAR CURRENT SCREEN !.proc clear  ; !.REF WCMD,C4COPY,COLCOP,COLOR,SCREESPEED BIT !JMP WCTRL1  ;  ; SELECT CYCLIC SCREEN MODE .proc cyclic  ; !.REF WCTRL1 LDA CTRL1 ; GET EXISTING VALUE AND #0F ; MASK OFF BOTTOM BITS ORA #08 ; AND SET CYCLIC BIT JMP WCTRL1 ; AND WRITE BACK ; ; SELECT CLIPING MODE .proc clip  ; !.R LDA #05 ; X=0,Y=0 JMP WCMD  ;  ; SELECT HIGH SPEED WRITE !.proc high  ; !.REF WCTRL1 !LDA CTRL1 !AND #0F !ORA #4 ; SET HIGH SPEED BIT !JMP WCTRL1  ;  ; SELECT NORMAL SPEED WRITE !.proc low  ; !.REF WCTRL1 !LDA CTRL1 !AND #0B ; RESET HIGH N UP COMMAND JMP WCMD ; AND WRITE IT ;  ; .proc pen  ; !.REF WCMD LDA #00 ; SELECT PEN COMMAND JMP WCMD ; AND WRITE IT ; .proc eraser  ; !.REF WCMD LDA #01 ; SELECT ERASER JMP WCMD ; AND WRITE IT ; !.proc home  ; !.REF WCMD LDA #3 STA CTRL1 ; PEN ON, PEN DOWN RTS  ;  ; ****** PRIMITIVE OPERATIONS ****************************************  ; .proc down  ; !.REF WCMD LDA #02 ; SELECT DOWN COMMAND JMP WCMD ; AND WRITE IT ; .proc up  ; !.REF WCMD LDA #03 ; SELECT PE INTERLACED FOR CLEAR STA CTRL3 ASL A ; A=2 STA XMSB ; SET WRITE TO PAGE 2 ASL A ; A=4 FOR CLEAR SCREEN STA CMD ; CLEAR PAGE 2 JSR READY LDA #0 STA XMSB LDA #7 STA CMD ; CLEAR PAGE 1, VGP REGS JSR READY LDA C3COPY STA CTRL3 ; RESTORE FORMAT XT TYPE, SIZE ETC .proc text,4  ; text(type,orient,xs,ys :integer);  ; .REF READY !pop RETURN !PLA !AND #0F ; AND MASK RELEVANT BITS STA TEMP1 ; AND SAVE PLA !PLA ASL A ; SHIFT TO MS NIBBLE ASL A ASL A ASL A ORA TEMP1 ; OR IN PREVIOUS VALUE JSR READY STA CSIZE ; WRITE TO CHARACTER SIZE REGISTER PLA !PLA !AND #01 ; MASK OFF 0 OR 1 ONLY ASL A ; MOVE TO RIGHT BIT POSITION ASL A ASL A STA TEMP1 ; SAVE IN TEMP STORAGE PLA !PLA ; AND GET ORIENT AND #01 A TEMP1 STA C4COPY JSR READY !STA CTRL4 ; WRITE NEW COLOUR BIT COLOR BPL XNORM LDA COLCOP ; IF COLOUR THEN AND #88 ; CHANGE ALSO ORA TEMP1 STA COLCOP STA COLREG XNORM: RTS ; ; SET WRITE PROTECT COLOUR !.proc protect,1  ; !.REF PUTW !LDY #0 !ODE .proc inverse  ; .REF WINVER !LDA #44 ; SET ALLINVERTED JMP WINVER ; UPDATE INVER ; ; SELECT NORMAL MODE .proc normal  ; .DEF WINVER  .REF COLOR,COLCOP,C4COPY,READY !LDA #00 ; RESET COLOUR WINVER: STA TEMP1 ; SAVE LDA C4COPY AND #18 OR; SELECT PAGE 2 .proc page2  ; !.DEF HGRSET !.REF C3COPY,READY !LDX #1  HGRSET: LDA C3COPY ; GET REGISTER COPY AND #1F DEX !BNE HGRSAV !ORA #20  HGRSAV: STA C3COPY ; UPDATE COPY JSR READY !STA CTRL3 ; UPDATE REGISTER RTS ; ; SELECT INVERSE M  ; SELECT PAGE TO DISPLAY !.proc pagdis,1  ; PARAMETER 0:DISPLAY PAGE 0, 1:PAGE 1  ; !.REF HGRSET !pop RETURN !PLA !AND #1 !TAX !PLA !push RETURN !JMP HGRSET  ; ; SELECT PAGE 1 .proc page1  ; !.REF HGRSET !LDX #0 !JMP HGRSET  ; MASK,Y CMP #1 LDA TEMP1 ROL A AND #7 RTS GTMONO: LDA COLRR ; LOAD COLOUR AND CMASK,Y ; MASK OFF UNWANTED BEQ XGTM ; IF Z THEN COLOUR = 0 LDA #1 ; ELSE COLOUR = 1 XGTM: RTS ; ; ****** PAGE & WRITE MODE (COLOUR) SETTING **************************  ;ETED ; CMASK .BYTE 1,2,4,8,10,20,40,80 ; GETCOL: BIT COLOR ; COLOUR ? BPL GTMONO LDA COLRB ; LOAD BLUE COLOUR AND CMASK,Y CMP #1 ; CS IF Z ROL TEMP1 ; SAVE BLUE STATE LDA COLRG ; LOAD GREEN AND CMASK,Y CMP #1 ROL TEMP1 LDA COLRR ; LOAD RED AND C STA @TESTV,Y ; AND WRITE TO INTEGER TYA !INY !STA @TESTV,Y ; CLEAR MSB !RTS  ; GSETUP: LDA XLSB ; GET MASK AND #7 TAY ; Y IS SUBSCRIPT INTO MASK ARRAY LDA #0F ; DIRECT IMAGE ACCESS REQUEST JSR WCMD ; SEND THE COMMAND JMP READY ; WAIT UNTIL COMPL:integer);  ;  TESTV .EQU 2 !.REF WCMD,READY,COLOR !.DEF GSETUP,GETCOL pop RETURN !pop TESTV ; GET POINTER TO STORE COLOUR !push RETURN !JSR READY !JSR GSETUP ; READ COLOUR FROM SCREEN JSR GETCOL ; GET COLOUR INTO ACC LDY #0 ; WRITE LSB GET LSB OF X POSITION !STA @WHEREX,Y !LDA YLSB ; GET LSB OF Y !STA @WHEREY,Y !INY !LDA XMSB ; GET MSB OF X !STA @WHEREX,Y !LDA YMSB ; GET MSB OF Y !STA @WHEREY,Y !RTS  ; ; RETURN THE COLOUR OF THE CURRENT POINT .proc test,1  ; test(var colour FIND OUT THE CURRENT SCREEN POSITION .proc where,2  ; where(var x,y :integer)  ; WHEREX .EQU 2  WHEREY .EQU 4 !.REF READY !pop RETURN !pop WHEREY ; GET ADDRESS OF Y STORE !pop WHEREX ; AND OF X STORE !push RETURN !JSR READY !LDY #0 !LDA XLSB ;PLOOP CPY TEMP1 ; END OF STRING ? !BEQ PDONE !INY  LDA @TEMP2,Y ; GET CHARACTER JSR WCMD ; CHECK STATUS & WRITE CHARACTER JMP PLOOP ; AND DO THE REST PDONE RTS ; DONE IT ; ; ****** ROUTINES WHICH RETURN VALUE(S) ******************************  ;  ;NT A CHARACTER STRING IN THE SPECIFIED STYLE .proc vprint,1  ; vprint(var text :string);  ; .REF WCMD !pop RETURN !pop TEMP2 ; GET ADDRESS OF STRING !push RETURN !LDY #0 !LDA @TEMP2,Y !STA TEMP1 ; SAVE STRING LENGTH ; URN !RTS ; DONE IT ; ; DRAW A 4*4 BLOCK SCALED BY THE CHARACTER SIZE & STYLE !.proc block4  ; !.REF WCMD !LDA #0B !JMP WCMD  ;  ; DRAW A 5*8 BLOCK SCALED BY THE CHARACTER SIZE & STYLE !.proc block5  ; !.REF WCMD !LDA #0A !JMP WCMD  ;  ; PRI; AND MASK 0 OR 1 ONLY ASL A ; SHIFT TO RIGHT POSITION ASL A ORA TEMP1 ; OR IN PREVIOUS BIT STA TEMP1 ; AND SAVE AGAIN !LDA CTRL2 ; GET REGISTER AND #0F3 ; MASK BITS FROM REGISTER ORA TEMP1 ; SET NEW BITS STA CTRL2 ; AND WRITE BACK PLA !push RETJMP PUTW  ;  ; SET INVERTING COLOUR !.proc invert,1  ; !.REF PUTW !LDY #1 !JMP PUTW  ;  ; SET ABSOLUTE COLOUR !.proc colour,1  ; !.DEF PUTW,PUTCOL !.REF READY,C4COPY,COLCOP,COLOR !LDY #2 PUTW: pop RETURN !PLA !STA TEMP1 !PLA !push RETURN  PUTW2: JSR READY  JSR PUTCOL ; SET REGISTERS STA C4COPY ; SET COPY BIT COLOR ; COLOUR MODE ? BPL XPUTWD STY COLCOP ; SAVE COLOUR COPY XPUTWD: RTS ; ; PUTCOL - SET WRITE MODE / COLOUR ; LSCON: .BYTE 1,4,2 MSCON: .BYTE 10,40,20 ; ;COLPERATION .proc format,1  ; PARAMETER BIT | ON/OFF  ; 0 UK MODE / US MODE  ; 1 NON-INTERLACED / INTERLACED  ; 2 COLOUR / MONOCHROME  ; !.REF init,READY,C3COPY,COLOR !pop RETURN !JSR READY PLA !TAXoffset,1  ; PARAMETER VALUE 0-63  ; !.REF READY !pop RETURN !JSR READY  BLNKX: LDA STATUS ; WAIT FOR BLANKING !AND #2 !BEQ BLNKX !PLA !AND #3F !STA SCROLL ; SAVE IN SCROLL REGISTER !PLA !push RETURN !RTS  ; ; SELECT DISPLAY FORMAT + COLOUR O!.proc xoffset,1  ; PARAMETER VALUE 0-63  ; !.REF READY !pop RETURN !JSR READY  BLNKX: LDA STATUS ; WAIT FOR BLANKING !AND #2 !BEQ BLNKX !PLA !AND #3F !STA PAN ; SAVE IN PAN REGISTER !PLA !push RETURN !RTS  ; ; SET SCROLL POSITION !.proc yOR ; COLOUR ? BPL XBOR ; EXIT IF NOT LDA TEMP1 AND #3 TAY LDA COLCOP AND #77 ; MASK OUT OLD BORDER ORA BORMSK,Y ; OR IN NEW VALUE STA COLCOP STA COLREG ; SET COLOUR BORDER XBOR: RTS ; BORMSK: .BYTE 0,8,80,88 ; ; SET PAN POSITION CK  ; !.REF C4COPY,COLCOP,COLOR,READY !pop RETURN !PLA !STA TEMP1 !PLA !push RETURN LDA C4COPY ; GET SAVED COPY AND #17 ; MASK OUT BORDER ROR TEMP1 BCC BOR1 ORA #8 ; OR IN BLACK BOR1: STA C4COPY ; SET NEW BORDER JSR READY !STA CTRL4 BIT COL0 !STA TEMP1 !LDA C3COPY AND #2F ; MASK OUT OLD SUBPAGE ORA TEMP1 ; OR IN NEW SUBPAGE JMP RVIDEO ; ; BORDER - SET BORDER COLOUR .proc border,1  ; MONOCHROME: PARAMETER 0:WHITE, 1:BLACK  ; COLOUR: PARAMETER 0:WHITE, 3:BLUE, 5:GREEN, 6:RED, 7:BLA!LDA C3COPY ORA #2 EOR TEMP1 ; SET INTERLACE BIT JMP RVIDEO ; ; SUBPAG - SELECT SUBPAGE USE IN NON-INTERLACED MODE .proc subpg,1  ; PARAMETER 0:SUBPAGE 0, 1:SUBPAGE 1  ; !.REF RVIDEO,C3COPY pop RETURN !PLA !ROL A !ROL A !ROL A !ROL A !AND #1IDEO: JSR READY !STA C3COPY STA CTRL3 !PLA !push RETURN RTS ; ; SELECT INTERLACED OR NON-INTERLACED OPERATION .proc interlace,1 ; PARAMETER 0:NON-INTERLACED, 1:INTERLACED ; .REF RVIDEO,C3COPY pop RETURN !PLA !ROL A !AND #2 !STA TEMP1 ECT POSITION OF VIDEO SWITCH !.proc video,1  ; PARAMETER 0:APPLE VIDEO, 1:VGP VIDEO !.DEF RVIDEO !.REF C3COPY,READY !pop RETURN !PLA !ROL A !ROL A !AND #4 !STA TEMP1 !LDA C3COPY AND #0FB ; MASK OUT VIDEO BIT !ORA TEMP1 ; ADD NEW VIDEO BIT  RVRL4 !RTS  CPLANE: AND #2 !BNE BPLANE !LDA COLCOP ; DO GREEN PLANE !AND #0F8 !JMP MSTORE  BPLANE: LDA TEMP1 ; DO BLUE PLANE !ASL A !ASL A !ASL A !ASL A !STA TEMP1 !LDA COLCOP !AND #8F  MSTORE: ORA TEMP1 !STA COLCOP STA COLREG RTS ;  ; SEL!TAY ; GET PLANE NO. !PLA !PLA !AND #7 !STA TEMP1 ; GET WRITE_MODE !PLA !push RETURN !BIT COLOR ; COLOUR FITTED ? !BPL RPLANE ; IF NOT, DO RED PLANE !TYA !BNE CPLANE  RPLANE: LDA C4COPY ; DO RED PLANE !AND #18 !ORA TEMP1 !STA C4COPY !STA CT************************ ; ; SET A WRITE MODE IN A GIVEN WRITE PLANE !.proc mode,2  ; mode(write_mode,plane :integer);  ; WRITE_MODE IS NO. FROM 0-7  ; PLANE 0:RED, 1:GREEN, 2:BLUE  ; !.REF READY,C4COPY,COLCOP,COLOR !pop RETURN !JSR READY !PLA AND #88 ORA LSCON,Y PDATA2: ROR TEMP1 BCC PDATA3 ORA MSCON,Y PDATA3: STA COLREG ; SET REGISTER TAY ; SAVE SETTING IN Y PLA ; RESTORE CTRL4 COPY XPUT: RTS ; ;CTRL4 COPY RETURNED IN A, ;COLREG COPY IN Y ;  ; ****** EXTRA ROUTINES FOR VGP][ ************OUR IN TEMP1, MODE IN Y ; PUTCOL: LDA C4COPY AND #18 ROR TEMP1 BCC PDATA1 ORA LSCON,Y ; THEN OTHER MODE PDATA1: STA CTRL4 ; SET REGISTER BIT COLOR BPL XPUT ; THATS IT IF MONOCHROME PHA ; SAVE NEW SETTING LDA COLCOP AND #88 ROR TEMP1 BCC PDATA2 !ROR A !ROR A !ROR A ; ROTATE COLOUR BIT INTO CARRY !ROR COLOR ; AND INTO COLOUR STATUS BYTE !TXA !AND #3 ; MASK OFF FOR DISPLAY FORMAT BITS !STA TEMP1 !PLA !push RETURN !LDA C3COPY ; PRESENT FORMAT AND #3C ; MASK OFF ORA TEMP1 !STA CTRL3 ; SET NEW FORMAT STA C3COPY !RTS !; !.INCLUDE #5:VGP2.B.TEXT !.INCLUDE #5:VGP2.C.TEXT !.INCLUDE #5:VGP2.D.TEXT !.end S STA VALLSB ; TEMP STORE FOR YSIZE LDA BITDL ; TRANSFER DATA POINTER TO 0 PAGE STA TEMP2 LDA BITDM STA TEMP2+1 JSR READY ; SAVE VGP POSITION LDY #3  BSVLP: LDA XMSB,Y !STA SAVEXM,Y !DEY !BPL BSVLP !LDA BITM ; CHECK MODE ROR A BCC BITVLP ; ITM !.REF STACK1,DSTACK,STXLSB,STXMSB !.REF PLOTB,WCMD,READY,SVXCRD !.REF RESCOL,PUTCOL  ;  .DEF CAFRSY,BTPLOT,BITDRW,BITDLP,BYTDRW,GTDATA  ;  SAVEXM .EQU 8  SAVEXL .EQU 9  ;  LDA BITX ; CHECK XSIZE BEQ BITRTS ;RETURN IF 0 LDA BITY BEQ BITRT!PLA !STA BITX !PLA !pop BITDL !push RETURN !RTS ; ; BIT MAP DRAW ; WRITES BIT MAP TO PRESENT POSITION ; POSITION IS RESTORED ON RETURN TO BASIC ; OUTPUT TO SCREEN IS CLIPPED TO X MARGIN OF SCREEN ; !.proc draw_map  ; !.REF BITDL,BITDM,BITX,BITY,BSIVE BYTES ARE PLOTTED ; IN THE X DIRECTION. ;  .proc define_map,4  ;  ; procedure define_map (var mem; xsize,ysize,mode :integer);  ; !.REF BITDL,BITDM,BITX,BITY,BITM  ; !pop RETURN !PLA !STA BITM ; STORE MODE !PLA !PLA !STA BITY !PLA LAYED ; 2 M.S.BITS SPECIFY OPERATION ; 00 - DONT PLOT POINT ; 01 - SET WRITR TO 6 L.S.BITS THEN PLOT POINT ; 10 - SET INVER THEN PLOT POINT ; 11 - SET DATAR THEN PLOT POINT ; LOWEST ADDRESS OF BIT MAP IS WRITTEN TO THE ; PRESENT POSITION. SUCCES MAP CONTENTS: ; ONE POINT IS DRAWN PER BIT IN THE DATA STRING ; L.S. BIT IS PLOTTED TO THE LEFT ; L.S. BYTE IS TO THE LEFT ; IF BIT IS ON THEN POINT IS DRAWN ; EACH LINE STARTS WITH NEW BYTE OF DATA ; ; BYTE MAP CONTENTS: ; ONE BYTE PER POINT TO BE DISP; ****** BIT MAP DEFINE AND DRAW ROUTINES **************************** ;  ; define_map (MEM,XSIZE,YSIZE,MODE); ; WHERE MEM IS 16 BIT ADDRESS OF START OF BIT MAP ; XSIZE,YSIZE ARE THE SIZE OF THE BIT MAP ; MODE IS EVEN FOR BIT MAP, ODD FOR BYTE MAP ; ; BITO^#ԨPLOT BITS ; BYTVLP: LDX BITX ; LOAD XSIZE STX VALMSB ; TEMP SAVE JSR BYTDRW ; DO ONE LINES WORTH DEC VALLSB BEQ BITRSY ; EXIT IF NO MORE LINES JSR NEWLIN JMP BYTVLP ; BITVLP: LDA BITX STA VALMSB ; TEMP SAVE LDA #0 STA TEMP1 ; RESET PLOT FLAG JSR BITDRW ; DO ONE LINES WORTH JSR BTPLOT ; FINISH OFF PLOT DEC VALLSB BEQ BITRSY JSR NEWLIN JMP BITVLP ; BITRSY: JSR READY ; RESTORE POSITION LDY #3  BRSTR: LDA SAVEXM,Y !STA XMSB,Y !DEY !BPL BRSTR  CAFRSY: LDA BITM !ROR A !BCC BITRTS ; REONDS FOR PREVIOUS LINE STA PXPMSB CAFMLP: JSR TESTL ; PLOT LINES BNE CAFMLP ; LOOP WHILE STACK NOT EMPTY JMP CAFRSY ; RESTORE COLOUR REGISTERS IF BYTE MAP FILL CAFRTS: RTS  ;  ; "POINTS STACK"  STYLSB .BLOCK STKSIZ  STYMSB .BLOCK STKSIZ  STXLSB .BLLDA FMODE AND #4 ; BIT MAP FILL ? BEQ CANBIT LDA BITX ; IF SO , CHECK BIT MAP OK BEQ CAFRTS ; RETURN IF EITHER SIZE IS 0 LDA BITY BEQ CAFRTS CANBIT: JSR STACK1 ; SAVE INITIAL POSITION LDA #0FF ; INITIALISE OLD LINE STATUS STA PXNMSB ; SET INITIAL C TXA ; MODE 0 ? BEQ INTCOL LDA FCOLOR AND #7 ; MASK OFF BIT COLOR ; COLOUR VGP ? BMI STACOL AND #1 ; IF MONO THEN LS BIT ONLY BPL STACOL ; BRANCH ALWAYS ; INTCOL: JSR GSETUP ; GET SCREEN COLOUR JSR GETCOL ; STACOL: STA FCOLOR ; AND SAVE FOR TESTP .EQU 255.  ; !pop RETURN !PLA !STA FCOLOR !PLA !PLA !STA FMODE ; SAVE FOR BIT MAP TEST AND #3 ; MASK OFF UNWANTED ASL A ; SET JUMP ADDRESS FOR TESTP TAX PLA !push RETURN !LDA CAFTAB,X ; LSB STA JUMPL LDA CAFTAB+1,X ; MSB STA JUMPM .REF CAFRSY,SAVCRD,RSXCRD,DSMATH,READY,WCMD !.REF GETCOL,GSETUP,DPLOTB,COLOR  .REF BITDL,BITDM,BITX,BITY,BITM !.REF C3COPY,GTDATA,PLOTB,BITDLP,BITDRW,BYTDRW !.REF SPLOTB,BTPLOT  ;  FCOLOR .EQU 2  FMODE .EQU 3  BSTAT .EQU 4  CSTAT .EQU 5  STKSIZ COLOUR <> COLOUR ; COLOUR IS A NUMBER FROM 0 TO 7 ; TO FILL WITH DEFINED BITMAP, ADD 4 TO MODE ; RETURNS WITH POSITION SET TO POSITION ON ENTRY  ; .proc cafill,2  ;  ; cafill (mode,colour);  ;  .DEF STYLSB,STYMSB,STXLSB,STXMSB,SOXLSB,SOXMSB  ; !; ****** COMPLEX AREA FILL *******************************************  ; ; MODE 0: FILL WHILE SCREEN COLOUR = INITIAL POINT COLOUR ; MODE 1: FILL WHILE SCREEN COLOUR .NOR. COLOUR = 0 ; MODE 2: FILL WHILE SCREEN COLOUR = COLOUR ; MODE 3: FILL WHILE SCREEN BIT LINE INC TEMP1 ; RESET PLOT FLAG ; BITMVX: INC XLSB ; MOVE TO NEXT POINT BNE BXINCT !INC XMSB  BXINCT: PLA TAX PLA DEX ; LOOP UNTIL BIT COUNT = 0 BNE BITDLP BEQ BITDRW ; BRANCH ALWAYS ; OM LS BITR INTO CARRY PHA ; SAVE ROTATION TXA PHA ; SAVE X BIT TEMP1 ; IS PLOT FLAG ON ? BMI BPLTON BCC BITMVX JSR SVXCRD ; 1ST POINT OF PLOT, SAVE IN TX DEC TEMP1 ; SET PLOT FLAG BMI BITMVX ; ALWAYS BRANCH ; BPLTON: BCS BITMVX JSR BTPLOT ; PLOT 0 BEQ BYTHND TAX LDY #0 STY VALMSB ; FOR BORROW CONDITION SEC SBC #8 ; AT LEAST 8 POINTS LEFT ? BCC BITLT8 ; IF NOT THEN JUST DO NO. IN X STA VALMSB ; PUT BACK FOR NEXT TIME LDX #8 BITLT8: JSR GTDATA ; GET DATA BYTE BITDLP: ROR A ; ROTATE DATA FR!DEY !JSR PUTCOL !LDA #88 !JSR WCMD ; PLOT THE POINT JSR READY ; WAIT FOR VGP ; JINC: INC XLSB ; INC X POSITION BNE JINC2 !INC XMSB  JINC2: DEC VALMSB ; DEC NO. OF POINTS BNE BYTDRW ; LOOP X BYTHND: RTS ; BITDRW: LDA VALMSB ; PLOT WHILE VALMSB <>RW: LDA VALMSB ; BYTE MODE: DRAW ONE LINES WORTH BEQ BYTHND ; RETURN IF NO. OF POINTS = 0 JSR GTDATA ; GET DATA BYTE CMP #40 ; DO NOTHING ? BCC JINC ; IF YES, JUST INC VGP ADDRESS ; STA TEMP1 ; SAVE FOR ROTATE ROL A !ROL A !ROL A !AND #3 !TAY SET X, INC Y LDA SAVEXL ; GET SAVED X POS STA XLSB LDA SAVEXM STA XMSB INC YLSB ; INCREMENT Y BNE YRTS !INC YMSB  YRTS: RTS  ; GTDATA: LDY #0 ; GET DATA BYTE LDA @TEMP2,Y INC TEMP2 BNE INCD INC TEMP2+1 ; INCREMENT DATA POINTER INCD: RTS ; BYTDTURN IF BIT MODE  JSR RESCOL  BITRTS: RTS ; BTPLOT: BIT TEMP1 ; IS PLOT FLAG SET ? BPL BTPLNO LDA XLSB BNE BTMNNO !DEC XMSB  BTMNNO: DEC XLSB !JSR PLOTB ; PLOT TO POSITION - 1 INC XLSB BNE BTPLNO !INC XMSB  BTPLNO: RTS ; NEWLIN: JSR READY ; REOCK STKSIZ  STXMSB .BLOCK STKSIZ  SOXLSB .BLOCK STKSIZ  SOXMSB .BLOCK STKSIZ ; TESTL: JSR GSETUP JSR TESTP ; FILL ANOTHER LINES WORTH BNE DSTACK ; UNLESS ON BOUNDARY NSTACK: LDA STACKC STA STACKO ; SAVE STACK COUNTER JSR SAVCRD ; SAVE PRESENT POSITION JSR GSETUP ; PERFORM SCREEN READ TL1: JSR XDEC ; MOVE TO LEFT UNTIL BOUNDARY BCS TL2 LDA XLSB AND #7 TAY CMP #7 ; IF 7 THEN SCREEN READ JSR TESTMN BEQ TL1 TL2: JSR XINC ; BACK ONTO NON-BOUNDARY JSR SPLOTB ; SAVSB SBC XMSB RTS ; CHKLIN: LDA XLSB ; SAVE X POS STA DLSB LDA XMSB STA DMSB LDA PXPMSB BPL CONDEC ; CHECK PREVIOUS LINE JSR YINC BCS CONCHK BCC NOCON ; IF BOUND THEN SKIP CONDEC: JSR YDEC BEQ NOCON2 ; IF BOUND THEN SKIP CONCHK: LDA PXPMSB EOR #8 STA STYMSB,X CHKDON: RTS ; ; CHKLIN LOOKS AT THE LINES ABOVE ; AND BELOW THE PRESENT LINE ; IT STACKS POINTS ON BOUNDARY ; TO NO BOUNDARY TRANSITIONS ; CMPD: SEC ; COMPARE POSITION WITH LDA DLSB ; SAVED RIGHT LIMIT SBC XLSB ; IF PAST , RETURN CC LDA DM LDA XLSB ; YES, IS IT ON LINE ? SBC STXLSB,X LDA XMSB SBC STXMSB,X BCC CHKSTK ; BRANCH IF PT RIGHT OF LINE LDA STXLSB,X SBC TXL LDA STXMSB,X SBC TXM BCC CHKSTK ; BRANCH IF PT LEFT OF LINE LDA STYMSB,X ; REMOVE PT BY SETTING MS OF Y ORA #80 ; IF ONE DOES LIE ON THE LINE ABOUT TO BE PLOTTED ; THEN THE POINT IS REMOVED ; CHKSTK: DEC STACKO BEQ CHKDON ; TEST ALL POINTS EXCEPT INITIAL LDX STACKO LDA STYMSB,X CMP TYM ; SAME Y ? BNE CHKSTK LDA STYLSB,X CMP TYL BNE CHKSTK SEC NEXT ONE ; PSTKOK: LDA XLSB STA STXLSB,X LDA XMSB STA STXMSB,X LDA YLSB STA STYLSB,X LDA YMSB STA STYMSB,X LDA DLSB STA SOXLSB,X LDA CSTAT ; GET DIRECTION ORA DMSB STA SOXMSB,X INC STACKC RTS ; ; ; THE NEXT SECTION TESTS POINTS ON THE STACK PSDUF2 ; IF THIS POINT DISCARDED STA STYMSB,X ; ELSE MOVE POINT DETAILS LDA STYLSB,Y ; DOWN THE STACK STA STYLSB,X LDA STXMSB,Y STA STXMSB,X LDA STXLSB,Y STA STXLSB,X LDA SOXMSB,Y STA SOXMSB,X LDA SOXLSB,Y STA SOXLSB,X INX BNE PSDUF2 ; AND DO BMI PSDUFF INX CPX #STKSIZ BCC PSNEXT RTS ; STACK FAULT PSDUFF: TXA ; YES, MAKE ROOM FOR NEW TAY PSDUF2: DEC STACKC ; ADJUST TOP OF STACK POINTER DEC STACKO INY ; GET NEXT POINT CPY #STKSIZ BCS PSTKOK ; ROOM MADE , STACK POINT LDA STYMSB,Y BMI LDA #0 ; SET STACKC TO 0 TO STORE VGP POSITION STA STACKC ; ON BOTTOM OF "STACK" JSR READY ; PSTACK: LDX STACKC CPX #STKSIZ BCC PSTKOK ; IF NOT FULL , STACK LDX #1 ; FULL , LOOK THROUGH STACK PSNEXT: LDA STYMSB,X ; ANY DISCARDED POINTS ? XLSB SBC STXLSB,X ; LEFT OF LINE ? LDA XMSB SBC STXMSB,X BCC ZSTKLP ; POINT OK IF LT LINE LDA SOXLSB,X SBC XLSB ; POINT TO RIGHT OF LINE ? LDA SOXMSB,X AND #0F SBC XMSB BCC ZSTKLP DONTST: RTS ; DISCARD POINT IF ALREADY PLOTTED ; STACK1:KLP LDA CSTAT ; GET DIRECTION EOR SOXMSB,X ; CHECK DIRECTIONS BPL ZSTKLP ; IF SAME THEN OK LDA STYLSB,X ; CHECK IF SAME Y CMP TYL BNE ZSTKLP LDA STYMSB,X CMP TYM BNE ZSTKLP ; ; Y VALUE IS THE SAME ; NOW CHECK IF WITHIN LINE LIMITS ; SEC LDACSTACK: JSR TESTPL ; CHECK BOUND BNE CONSET ; IF ON, SET BOUNDARY ASL BSTAT ; CHECK FOR BOUND TO NO BOUND BCC CONCLR ZSTACK: LDX STACKO ; NOW CHECK THRO' STACK FOR CONFLICTS ZSTKLP: DEX BEQ PSTACK ; STACK IF OK LDA STYMSB,X ; POINT DELETED ? BMI ZST STA XLSB STA PXNLSB LDA STXMSB,X STA PXNMSB STA XMSB LDA STYLSB,X STA YLSB LDA STYMSB,X STA YMSB LDA SOXLSB,X STA PXPLSB LDA SOXMSB,X STA PXPMSB TXA RTS ; CONSET: LDA #80 ; SET BOUNDARY STA BSTAT CONCLR: RTS ; IF SO, FINISH STA STACKC BNE DSTACK STMPTY: JSR CHKSTK ; CHECK STACKED POINTS JSR CAPLOT ; PLOT THE LINE ; DSTACK: DEC STACKC ; PULL NEXT POINT FROM "STACK" LDX STACKC LDA STYMSB,X ; IF M.S. BIT SET, DSTACK AGAIN BMI DSTACK JSR READY LDA STXLSB,X E POSITION FOR PLOTB JSR GSETUP ; SCREEN READ TL21: JSR XINC BCS TL3 ; MOVE RIGHT UNTIL BOUND JSR TESTPL BEQ TL21 TL3: JSR XDEC ; BACK OFF BOUND JSR CHKLIN ; CHECK LINES ABOVE AND BELOW LDA STACKC ; IS STACK FULL ? CMP #STKSIZ BCC STMPTY LDA #1 ;0 ; INVERT DIRECTION BIT AND #80 STA CSTAT ; AND SAVE FOR CSTACK LDA #80 STA BSTAT ; SET BOUNDARY FLAG JSR RSXCRD ; SET X POS TO START JSR GSETUP ; SCREEN COLOUR READ CONL1: JSR CMPD ; CHECK FOR END BCC NOCON ; IF END THEN FINISH LDA XLSB ; LOOP WHILE POS < PREVIOUS LEFT SBC PXNLSB LDA XMSB SBC PXNMSB BCS XGEPXN JSR CSTACK ; STACK POINT IF WANTED JSR XINC BCC CONL1 ; XGEPXN: LDA PXPLSB ; SET TO RIGHT OF PREVIOUS LINE STA XLSB LDA PXPMSB STA XMSB JSR XINC ; + 1 BCS NOCO X VALUE FOR LATER LDA BITX ; GET XSIZE OF BIT MAP STA VALMSB ; TEMP SAVE LDA BITM ; BIT MAP MODE ? ROR A BCS TDBYT ; ; BIT MODE, CALCULATE START POSITION WITHIN BYTE ; TXA AND #7 STA VALLSB ; SAVE BIT START TXA LSR A ; DIVIDE BY 8 FOR BYTE STARTVE BNE TDIVX SEC LDA BITY STY TEMP2 SBC TEMP2 TAY TDIVX: TXA BEQ TDIVXN LDA ACMDT AND #2 ; NEQ IF X NEGATIVE BNE TDIVXN SEC LDA BITX STX TEMP2 SBC TEMP2 TAX ; ; REGS X,Y HOLD START PT RELATIVE TO START OF BIT MAP ; TDIVXN: STX TEMP1 ; SAVE TAX ; WE ONLY NEED REMAINDER SBC BITX STA DXTLSB BCS DIVXLP DEC DXTMSB BPL DIVXLP ; ; IF DISPLACEMENT IS NEGATIVE THEN SUBTRACT ; REMAINDER FROM BIT MAP SIZE ; TYA BEQ TDIVX ; IF OFFSET 0, THEN OK LDA ACMDT ; PLOT COMMAND AND #4 ; NEQ IF Y NEGATIAP ; JSR DSMATH ; SETS DXC,DYC TO DISPLACEMENT FROM INITIAL DIVYLP: SEC ; DIVIDE DYC BY BITY LDA DYTLSB TAY ; REMAINDER IS IN Y SBC BITY STA DYTLSB BCS DIVYLP DEC DYTMSB BPL DIVYLP DIVXLP: SEC ; SAME FOR X LDA DXTLSB AL POINT TO XT,YT FOR MATHS STA XTLSB LDA STXMSB STA XTMSB LDA STYLSB STA YTLSB LDA STYMSB STA YTMSB ; ; GET DISPLACEMENT FROM INITIAL POINT ; THEN DIVIDE THAT BY THE SIZE OF THE BIT MAP ; THE REMAINDERS WILL GIVE THE START POSITION WITHIN THE BIT MS FROM PRESENT POSITION TO XT,YT ; CAPLOT: LDA FMODE ; CHECK FOR BIT MAP MODE AND #4 BNE CAPBIT JMP PLOTB ; CAPBIT: JSR SPLOTB ; BIT MAP MODE INY BNE CAIXY ; INC DESTINATION INX CAIXY: STY XCLSB STX XCMSB ; AND SAVE IN XC ; LDA STXLSB ; COPY INITI CMP YLSB RTS ; YNINC: SEC RTS ; CC IF GREATER ; NOTINT: LDA #207. CMP YLSB RTS ; CC IF GREATER ; YDEC2: JSR YDEC YDEC: LDA YLSB BNE YSDEC ORA YMSB BEQ YNDEC ; EQ IF BOUNDARY DEC YMSB YSDEC: DEC YLSB ORA #1 ; SET NE YNDEC: RTS ; ; CAPLOT FILL; UK / US ? BCC USTEST INC YLSB BNE YNINC INC YMSB EOR YMSB ; EOR INTERLACED BIT WITH MS POSITION ROR A ; CC IF BOUNDARY RTS ; USTEST: INC YLSB BNE TESTYU INC YMSB TESTYU: ROR A ; TEST INTERLACED BCS NOTINT LDA YMSB BEQ YNINC LDA #159. LDA XMSB INC XMSB EOR XMSB ; CHECK FOR BOUND CMP #3 RTS ; XDEC: LDA XLSB BNE XDEC1 DEC XLSB ; CS IF BOUNDARY LDA XMSB DEC XMSB EOR XMSB ; CHECK FOR BOUND CMP #3 RTS XDEC1: DEC XLSB XNM: CLC RTS ; YINC: LDA C3COPY ; CHECK SCREEN FORMAT ROR A EN <> SAVED COLOUR RTS CAF1: AND FCOLOR ; BOUNDARY IF SCREEN .AND. COLOUR PARAMETER <> 0 RTS CAF3: CMP FCOLOR ; BOUNDARY IF SCREEN = COLOUR PARAMETER BEQ CAF30 LDA #0 ; SET EQ RTS CAF30: ROL A ; SET NE RTS ; XINC: INC XLSB ; CS IF BOUNDARY BNE XNM JSR WCMD ; READ SCREEN COLOUR JSR READY ; WAIT FOR IT TESTP: JSR GETCOL ; GET SCREEN COLOUR JMP @JUMPL ; GO TO CAF0 - CAF3 CAFTAB: .WORD CAF0 ; MODE 0 .WORD CAF1 ; MODE 1 .WORD CAF0 ; MODE 2 .WORD CAF3 ; MODE 3 ; CAF0: CMP FCOLOR ; BOUNDARY IF SCREE POSITION STA YLSB LDA TYM STA YMSB LDA DLSB ; RESTORE X POS STA XLSB LDA DMSB STA XMSB RTS ; ; TESTP TESTS SCREEN COLOUR AT PRESENT POSITION ; RETURNS NE IF BOUNDARY ; TESTPL: LDA XLSB AND #7 TAY TESTMN: BNE TESTP LDA #0F INC YLSB BNE NOCON2 INC YMSB NOCON2: JSR YINC BCC XPRO PROCHK: LDA PXPMSB AND #80 STA CSTAT ; SAVE DIRECTION LDA #80 STA BSTAT JSR RSXCRD JSR GSETUP PROL1: JSR CMPD BCC XPRO ; EXIT AT END JSR CSTACK JSR XINC BCC PROL1 XPRO: LDA TYL ; RESTORN ; END IF BOUND LDA #80 STA BSTAT ; JSR GSETUP CONL2: JSR CMPD BCC NOCON ; EXIT IF END OF LINE JSR CSTACK ; STACK POINT IF WANTED JSR XINC BCC CONL2 ; NOCON: LDA PXPMSB ; NOW CHECK THE OTHER LINE BPL PROINC JSR YDEC2 BNE PROCHK BEQ XPRO PROINC: LSR A LSR A TAX LDA BITX ; GET NO. OF BYTES PER LINE OF BIT MAP LSR A LSR A ; DIVIDE BY 8 LSR A STA VALMSB LDA BITX AND #7 ; PLUS ONE BYTE IF PART USED BEQ TDBYT INC VALMSB ; ; NOW CALCULATE START POSITION WITHIN BIT MAP DATA ; TDBYT: LDA #0 ; CLEAR TEMP2 STA TEMP2 STA TEMP2+1 TDBYLP: CLC ; TEMP2 = ((BYTES/LINE) * Y POSITION TYA BEQ TDBYEX DEY LDA TEMP2 ADC VALMSB STA TEMP2 BCC TDBYLP INC TEMP2+1 BCS TDBYLP ; TDBYEX: LDA TEMP2 ADC BITDL ; ADD IN DATA POINTER STA TEN^ԨԨ TXL ; SAVE DESTINATION STX TXM RTS ; DPLOTB: STY DELTAX ; SET X DISPLACEMENT LDA #10 ; PLOT COMMAND STA CMD ; TELL VGP TO DO IT RTS  Q EPLOTB ; LAST PLOT IF < 256 LDY #255. JSR DPLOTB LDA #88 !JSR WCMD !JSR READY JMP PLOTBL EPLOTB: JSR DPLOTB JSR READY JMP RSXCRD ; RESTORE POSITION AT END ; SPLOTB: JSR READY ; SWAP TX FOR VGP X LDX XMSB LDY XLSB JSR RSXCRD ; TXL -> VGP X STYzzzzz1  ; DUMMY PROCEDURE  ; .DEF PLOTB,SPLOTB,DPLOTB !.REF WCMD,READY,RSXCRD  PLOTB: JSR SPLOTB ; SWAP TX FOR VGP X PLOTBL: SEC ; GET DISPLACEMENT LDA TXL SBC XLSB TAY ; TEMP STORE FOR < 256 LDA TXM SBC XMSB AND #0F ; VGP ONLY 12 BITS WIDE BE LDX #0 ; NONE LEFT IF OVER THE END TDSOME: BNE TDALL ; PLOT FULL BIT MAP LINE IF > 255 TXA ; MAX REQUIRED CMP VALMSB ; COMPARE WITH BIT MAP SIZE BCS TDALL STA VALMSB ; ADJUST NO. OF POINTS TO PLOT TDALL: RTS  ; ; PLOTB PLOTS FROM TX TO VGP X .proc OINTER TO START OF X LINE STA TEMP2+1 LDA BITX ; GET BIT MAP X SIZE BITVAL: STA VALMSB ; TEMP STORE JSR READY SEC LDA XCLSB ; DESTINATION + 1 SBC XLSB ; SUBTRACT FROM PRESENT POSITION TAX LDA XCMSB SBC XMSB BCS TDSOME BITLIN ; LOOP UNTIL END OF PLOT LDA VALMSB ; WHEN VALMSB IS 0 BEQ TDIEXT JSR BITDRW JMP TDBITL TDIEXT: JMP BTPLOT ; CHECK PLOT FLAG, IF SET FINISH PLOT TDDEXT: RTS ; BITLIN: LDA DLSB ; INITIALISE FOR A BIT MAP LINE STA TEMP2 LDA DMSB ; RESET DATA PNO. OF BITS TO SKIP BROTLP: DEX ; ROTATE DATA TO SKIP UNWANTED BITS BMI BROTEX LSR A BPL BROTLP ; BRANCH ALWAYS BROTEX: LDX TEMP1 ; GET NUMBER OF BITS TO PLOT 1ST TIME STY TEMP1 ; RESET PLOT FLAG JSR BITDLP ; JUMP INTO BIT DRAW ROUTINE ; TDBITL: JSR LDA VALMSB ; LOAD MAX BITS TO PLOT TAY ; SAVE IN CASE OF BORROW SBC TEMP1 ; SUB NO. OF BITS THIS BYTE BCS BVALOK STY TEMP1 ; UPDATE NO OF BITS WANTED LDA #0 BVALOK: STA VALMSB ; UPDATE NO. OF BITS TO DO JSR GTDATA ; GET DATA BYTE LDX VALLSB ; GET DRAW PART OF LINE JSR BITLIN ; SET UP NO. OF POINTS REQD. JMP TDDBYT ; AND SO ON... ; ; BIT MAP FILL ; TDDBIT: SEC ; SET UP FIRST CALL FOR PLOT LDA #8 SBC VALLSB ; SUB NO. OF BITS TO SKIP STA TEMP1 ; TO GET NO. OF BITS THIS BYTE TO PLOT T NO. OF POINTS LEFT IN THIS LINE OF BIT MAP JSR BITVAL ; CHECK WITH NO. OF POINTS REQUIRED AND ADJUST IF NEEDED LDA BITM ; BIT OR BYTE MODE ? ROR A BCC TDDBIT ; ; BYTE MAP FILL ; TDDBYT: LDA VALMSB BEQ TDDEXT ; EXIT IF NO. OF POINTS = 0 JSR BYTDRW ;MP2 STA DLSB LDA TEMP2+1 ADC BITDM STA TEMP2+1 STA DMSB ; D = START OF LINE ADDRESS TXA ; TEMP2 = TEMP2 + X REMAINDER ADC TEMP2 STA TEMP2 BCC TDBYEN INC TEMP2+1 ; ; NOW PLOT FROM PRESENT POSITION TO XC-1,YC ; TDBYEN: LDA BITX SEC SBC TEMP1 ; GE ; ****** MOVE & LINE DRAWING *****************************************  ; ; MOVE TO A NEW POINT WITHOUT DRAWING .proc move,2  ; move(x,y :integer)  ;  RETRN2 .EQU 8 !.REF READY !pop RETRN2 !JSR READY !PLA !STA YLSB ; WRITE TO VGP PLA ; GET LSB IT LDY #3 ; SET COMMAND COUNTER ; CURLOP LDA CMDTBL,Y STA CMD ; GET COMMAND AND WRITE JSR READY ; WAIT TILL DONE JSR RESCRD ; AND RESTORE CENTRE DEY ; POINT TO NEXT BPL CURLOP ; PROCESS THE REST UNTIL ALL COMMANDS SENT JSR RESCOL ; RESTORE COLOUR TAY ; IN BOTH PROJECTIONS PLA ; IGNORE MSB !push RETURN  JSR SAVVGP ; SAVE SCREEN POSITION,CTRL1,CTRL2,CSIZE JSR SETRMW ; SET INVERT COLOUR LDA #00 ; READY TO CLEAR STA CTRL2 ; PRESET MODE FOR CURSOR LDA #03 ; PEN DOWN AND PEN STA CTRL1 ; AND SET; DRAW CROSS HAIR CURSOR AT THE CURRENT POSITION  .proc cursor,1  ; cursor(size :integer);  ; !.REF READY,SAVVGP,COLOR,COLCOP,C4COPY !.REF RESCRD,RESVGP,RESCOL !.DEF SETRMW !pop RETURN JSR READY !PLA ; PICK UP SIZE STA DELTAX ; TELL VGP STA DEL CORRECT DISPLACEMENT VALUES EOR #0FF ; IF MINUS, MAKE POSITIVE AND #0F ; LIMIT TO 12 BITS TAX TYA EOR #0FF TAY INY BNE RET2 INX RET2: LDA #2 ; RETURN 2 IF NEGATIVE DISPLACEMENT RTS RET0: AND #0F TAX LDA #0 RTS ; MENT ASL A ;SHIFT FOR Y COMPONENT OF COMMAND ORA ACMDT ; ADD IN X COMPONENT ORA #11 ; ADD IN BASE COMMAND STA ACMDT ; SAVE COMMAND FOR LATER STY DYTLSB ; SAVE Y DISPLACEMENT STX DYTMSB RTS ; ; CKSIGN - UTILITY FOR PLOT CKSIGN: BPL RET0 ; WORKS OUTY DXTLSB ; SAVE X DISPLACEMENT STX DXTMSB SEC ; SET READY FOR SUBTRACT LDA YTLSB ; GET FIRST Y SBC TYL ; TAKE FROM POSITION REG TAY ; AND SAVE AS DISPLACEMENT LDA YTMSB ; GET SECOND Y SBC TYM ; TAKE FROM POSITION REG JSR CKSIGN ; SAVE AS DISPLACE SEC ; SET READY FOR SUBTRACT LDA XTLSB ; GET FIRST X SBC TXL ; TAKE FROM POSITION REG TAY ; AND SAVE AS DISPLACEMENT LDA XTMSB ; GET SECOND X SBC TXM ; TAKE FROM POSITION REG JSR CKSIGN ; SAVE AS DISPLACEMENT STA ACMDT ; SAVE FOR CMD GENERATION STN STA DELTAX ; WRITE TO VGP LDA DYTLSB ; GET Y PROJECTION STA DELTAY ; WRITE TO VGP LDA ACMDT ; GET COMMAND JMP WCMD ; DRAW THE LINE ; DSMATH: JSR READY ; CALCULATE DISPLACEMENTS JSR SAVCRD ; GET SCREEN POSITION CLD ; NOT DECIMAL MODE R DXTLSB CLC ROR DYTMSB ROR DYTLSB LDA DXTMSB ORA DYTMSB ; BOTH < 256 ? BNE DB2LP ; IF NOT DIVIDE AGAIN ; JSR PLAST ; PLOT PART LINE LDA #88 ; FUDGE FOR INVERSE MODE JSR WCMD !JMP PLOTC ; THEN DO REST OF LINE ; PLAST: LDA DXTLSB ; GET X PROJECTIOB ; AND SAVE pop XTLSB ; AND SAVE LINE2: push RETURN  PLOTC: JSR DSMATH ; CALCULATE DISPLACEMENTS TXA ORA DXTMSB ; IS EITHER PROJECTION > 255 BEQ PLAST ; NO, DO LAST PART OF LINE DB2LP: CLC ; DIVIDE DISPLACEMENT BY 2 UNTIL BOTH < 256 ROR DXTMSB RO!pop YTLSB !pop XTLSB !JSR MOVE ; SET UP START COORDS JMP LINE2  ;  ; ROUTINE TO DRAW A LINE FROM PRESENT POSITION TO SPECIFIED POINT !.proc line,2  ; line(tox,toy :integer);  ; !.REF READY,WCMD,SAVCRD !.DEF LINE2,DSMATH !pop RETURN  pop YTLSET REGISTER AND #0FC ; MASK REGISTER ORA TEMP1 ; AND PUT IN LINE TYPE STA CTRL2 ; AND WRITE BACK RTS ; DONE IT ; ; ROUTINE TO DRAW A LINE BETWEEN ANY TWO POINTS .proc draw,4  ; draw(fromx,fromy,tox,toy :integer);  ; .REF MOVE,LINE2 !pop RETURN ush RETURN !LDA #88 !JMP WCMD  ;  ; SELECT LINE TYPE .proc linetype,1  ; parameter 0:solid,1:dots,2:dashes,3:dots & dashes  ; .REF READY !pop RETURN !PLA !AND #3 ; 0-3 ONLY ALLOWED STA TEMP1 ; SAVE PLA !push RETURN !JSR READY !LDA CTRL2 ; G OF POINT STA YMSB ; WRITE TO VGP !PLA !STA XLSB ; WRITE TO VGP PLA ; GET LSB OF POINT STA XMSB ; WRITE TO VGP push RETRN2 !RTS ; DONE IT ;  ; MOVE TO A NEW POINT THEN DRAW A SINGLE DOT !.proc dot,2  ; !.REF move,WCMD !pop RETURN !JSR move !pREGISTERS JMP RESVGP ; & RESTORE VGP STATUS ; ; TABLE OF COMMANDS FOR CURSOR ; CMDTBL .BYTE 12,14,10,16 ; SETRMW: LDA C4COPY ; SET INVERT WRITE MODE AND #18 ORA #4 STA CTRL4 BIT COLOR BPL XSET LDA COLCOP AND #88 ORA #44 STA COLREG XSET: RTS ; ; CIRCLE PLOT ROUTINES ; USING BRESENHAM'S CIRCLE ALGORITHM ; POSITION SET BEFORE CALL IS USED AS THE CENTRE POINT ; POSITION RESET TO CENTRE POINT AFTER CALL ; .proc circle,1  ; circle (radius :integer); !.REF CIRDO !LDA #0 ; SET OUTLINE MODE JMP CC,CY+DXC JSR CPOINT JSR CXMX JSR CYPY ; PLOT CX+DXC,CY+DYC JSR CPOINT JSR CXMY JSR CYMX ; PLOT CX-DYC,CY-DXC JSR CPOINT JSR CXPX JSR CYMY ; PLOT CX+DXC,CY-DYC ;  CPOINT: LDA #88 JMP WCMD ; PLOT THE POINT ; TSAVE: LDX #3 ; COPY DXC,DYC TO TXC,TYCT8: JSR CXPX JSR CYPY ; PLOT CX+DXC,CY+DYC JSR CPOINT JSR CXMY JSR CYPX ; PLOT CX-DYC,CY+DXC JSR CPOINT JSR CXMX JSR CYMY ; PLOT CX-DXC,CY-DYC JSR CPOINT JSR CXPY JSR CYMX ; PLOT CX+DYC,CY-DXC JSR CPOINT ; POINT4: JSR CXPY JSR CYPX ; PLOT CX+DYFDO1: JSR CYMX ; PLOT CX+Y,CY-X TO CX-Y,CY-X PMAJOR: JSR CXMY JSR SVXCRD JSR CXPY JMP PLOTB ; DPOINT: LDA DXCLSB ORA DXCMSB BEQ POINT4 ; IF DXC=0 THEN PLOT 4 JSR XSUBY ; DXC-DYC TYA BNE POINT8 TXA BEQ POINT4 ; IF DXC=DYC THEN PLOT 4 ; POINR NEXT TIME FDO4: JSR PMINOR ; PLOT MINOR LINES FSAVE: JSR TSAVE ; TX,TY = DX,DY LDA DXCLSB ; IS X = 0 ? ORA DXCMSB BEQ FDO1 ; IF SO, PLOT DIAMETER FDO2: JSR CYPX JSR PMAJOR ; PLOT CX+Y,CY+X TO CX-Y,CY+X AT ; STATUS ? BEQ DPOINT ; IF OUTLINE THEN PLOT POINTS JSR XSUBY TYA BNE FNEQ ; IF DXC=DYC THEN PLOT MAJOR LINES ONLY TXA BEQ FDO2 FNEQ: LDA TYCLSB ; SAME Y VALUE ? CMP DYCLSB BNE FDO4 LDA TYCMSB CMP DYCMSB BEQ FSAVE ; IF SAME THEN JUST SAVE FOTRE POINT OF CIRCLE ; DXC,DYC HOLD POSITION IN 1ST OCTANT OF POINT TO ; BE PLOTTED RELATIVE TO CENTRE ; NORMALLY PLOTS EIGHT POINTS (4 LINES) OF CIRCLE ; IF DXC=0 OR DXC=DYC THEN PLOTS FOUR ; POINTS (2 LINES) SINCE THE OTHERS ARE THE SAME ; POINTS: LDA CST BNE RESXC ; THEN PLOT ONE MORE SET OF POINTS TXA BNE RESXC LMAJOR: JSR POINTS ; RESXC: LDX #3 ; SET POSITION TO XC,YC ENDCLP: LDA XCLSB,X STA TXL,X DEX BPL ENDCLP JSR READY JMP RESCRD ; ; POINTS - PLOTS POINTS OR LINES OF CIRCLE ; XC,YC HOLD CEN= OLD Y CMP DXCLSB BNE LASTDO LDA TYCMSB CMP DXCMSB BEQ LMAJOR ; THEN DONT PLOT MINOR LASTDO: JSR PMINOR ; PLOT SAVED LINES IF FILLED MODE JSR XSUBY ; SET UP XY AGAIN OUTEND: TYA ; IF DXC TERM = RADIUS TERM RROR CLC ADC DLSB STA DLSB TXA ADC DMSB STA DMSB INC DXCLSB ; INCREMENT DXC TERM BNE ARCLP INC DXCMSB BNE ARCLP ARCEND: LDA CSTAT BEQ OUTEND TYA BNE LASTDO TXA BNE LASTDO ; IF X <> Y THEN ALWAYS PLOT LAST MINOR LINES LDA TYCLSB ; IF NEW X EMENT RADIUS TERM BNE RADDEC DEC DYCMSB RADDEC: DEC DYCLSB JSR XSUBY JMP ARC2 DLT0: LDY DXCLSB ; USE DXC TERM ONLY LDX DXCMSB ARC2: JSR M2ADD3 ; MULTIPLY BY 2 THEN ADD 3 TYA ; MULTIPLY BY 2 ASL A TAY TXA ROL A TAX TYA ; ADD ERROR TERM TO OLD E JSR M2ADD3 ; MULTIPLY BY 2 THEN ADD 3 STY DLSB STX DMSB ; AND STORE ERROR TERM ARCLP: JSR XSUBY ; LOOP WHILE DXC < DYC BCS ARCEND JSR POINTS ; PLOT 8 POINTS AROUND CIRCLE LDA DMSB BMI DLT0 ; IF ERROR < 0 THEN DONT USE RADIUS TERM LDA DYCLSB ; DECRORA DYCLSB BNE RADOK RTS ; RETURN IF RADIUS = 0 RADOK: CLD LDA #0 ; INITIALISE ERROR TERM STA DXCLSB ; TO 3-2*RADIUS STA DXCMSB JSR TSAVE ; COPY INITIAL DXC,DYC INTO TXC,TYC JSR XSUBY ; SUBTRACT RADIUS FROM 0 RESENT POSITION INTO TXL,TYL LDX #3 ; SAVE CENTRE POINT INTO XC,YC CINLP: LDA TXL,X ; GET PRESENT POSITION STA XCLSB,X DEX BPL CINLP pop RETURN !pop DYCLSB ; PICK UP RADIUS push RETURN !LDA DYCMSB AND #7F ; RADIUS MUST BE POSITIVE STA DYCMSB IRDO ; DO CIRCLE ; !.proc filled_circle,1  ; filled_circle (radius :integer);  CSTAT .EQU 5 !.DEF CIRDO !.REF WCMD,PLOTB,READY,RESCRD,SAVCRD,SVXCRD  LDA #1 ; SET FILLED MODE CIRDO: STA CSTAT ; SAVE OUTLINE/FILL STATUS JSR READY !JSR SAVCRD ; GET P TSLP: LDA DXCLSB,X STA TXCLSB,X DEX BPL TSLP RTS ; ; PMINOR: JSR SWAP ; SWAP DXC,DYC FOR TXC,TYC JSR CYPY JSR PMIN ; PLOT CX-X,CY+Y TO CX+X,CY+Y JSR CYMY JSR PMIN ; PLOT CX-X,CY-Y TO CX+X,CY-Y ; SWAP: LDX #3 ; SWAP NEW XY FOR OLDVALUE IN TXC,TYC SWAPLP: LDA DXCLSB,X TAY LDA TXCLSB,X STA DXCLSB,X TYA STA TXCLSB,X DEX BPL SWAPLP RTS ; PMIN: JSR CXMX ; PLOT MINOR LINES JSR SVXCRD JSR CXPX JMP PLOTB ; ; CX.. ROUTINES SET X CO-ORD INTO T (I.E. THE DISPLAYED PAGE) !AND #20 ; BIT 5 OF C3COPY !BEQ PAGE0 !LDA #2  PAGE0: STA XPAGE !RTS  ;  XPAGE .BYTE 0 ; STORES THE MS BIT OF VGP X REG  ;  YUPTOP: .WORD 416. ; US INTERLACED !.WORD 512. ; UK INTERLACED !.WORD 208. ; US NON-INTERLACED ; WHICH IS IN BIT 1 OF C3COPY !EOR #1 !AND #1 ; NZ IF INTERLACED !STA INTERL !LDA C3COPY !AND #3 ; MASK OFF INTERLACED,UK/US MODE BITS !ASL A !TAY !LDA YUPTOP,Y !STA YLSB !INY !LDA YUPTOP,Y !STA YMSB !LDA C3COPY ; GET PAGE TO BE OPERATED UPON .proc zzzzz2  ; DUMMY PROCEDURE  ; !.REF SAVCRD,READY,C3COPY !.DEF YTOP,CYDEC,CHECKX,XPAGE  INTERL .EQU 5  YTOP: JSR READY ; WAIT FOR VGP !JSR SAVCRD ; SAVE POSITION  ; SET Y POSITION TO TOP OF SCREEN !LDA C3COPY ; GET INTERLACED STATUS !ROR AN^Ԩq ; M2ADD3: TYA ; XY = XY + XY + 3 ASL A TAY TXA ROL A TAX TYA CLC ADC #3 TAY BCC NCY INX NCY: RTS ; Y CO-ORD OF CENTRE SEC SBC DYCLSB ; MINUS Y VALUE OF POINT TAY LDA YCMSB SBC DYCMSB ; CYEND: TAX JSR READY STX YMSB STY YLSB ; STORE Y CO-ORD IN VGP RTS ; XSUBY: LDA DXCLSB ; XY = DXC-DYC SEC SBC DYCLSB TAY LDA DXCMSB SBC DYCMSB TAX RTSCYMX: LDA YCLSB ; Y CO-ORD OF CENTRE SEC SBC DXCLSB ; MINUS X VALUE OF POINT TAY LDA YCMSB SBC DXCMSB JMP CYEND ; CYPY: LDA YCLSB ; Y CO-ORD OF CENTRE CLC ADC DYCLSB ; PLUS Y VALUE OF POINT TAY LDA YCMSB ADC DYCMSB JMP CYEND ; CYMY: LDA YCLSBEND: TAX JSR READY ; WAIT FOR VGP READY STY XLSB ; SET X CO-ORDS IN VGP STX XMSB RTS ; ; CY.. ROUTINES SET Y CO-ORD INTO VGP ; CYPX: LDA YCLSB ; Y CO-ORD OF CENTRE CLC ADC DXCLSB ; PLUS X VALUE OF POINT TAY LDA YCMSB ADC DXCMSB JMP CYEND ; SBC DXCMSB JMP CXEND ; CXPY: LDA XCLSB ; X CO-ORD OF CENTRE CLC ADC DYCLSB ; PLUS Y VALUE OF POINT TAY LDA XCMSB ADC DYCMSB JMP CXEND ; CXMY: LDA XCLSB ; X CO-ORD OF CENTRE SEC SBC DYCLSB ; MINUS Y VALUE OF POINT TAY LDA XCMSB SBC DYCMSB CXHE VGP ; RETURNS PLUS IF X CO-ORD IS OK ; CXPX: LDA XCLSB ; X CO-ORD OF CENTRE CLC ADC DXCLSB ; PLUS X VALUE OF POINT TAY LDA XCMSB ADC DXCMSB JMP CXEND ; CXMX: LDA XCLSB ; X CO-ORD OF CENTRE SEC SBC DXCLSB ; MINUS X VALUE OF POINT TAY LDA XCMSB !.WORD 256. ; UK NON-INTERLACED  ;  CYDEC: LDA YLSB ; DECREMENT Y POSITION !BNE DYL !DEC YMSB  DYL: DEC YLSB  RTS  ;  CHECKX: LDA XMSB !EOR XPAGE !AND #2 ; OFF RHS OF SCREEN ? !BEQ NODEC !JSR CYDEC ; IF SO, DECREMENT Y POSITION & !LDA #0 ; RESET X POSITION !STA XLSB !LDA XPAGE !STA XMSB !LDA YMSB !AND #8  NODEC: RTS  ;  ; DUMP TO PRINTER ROUTINE !.proc dump,3  ; dump (printer_type,interface_type,interface_slot :integer)  ; printer_type 0:mx80, 1:mx82, 2:fx80  ; interfaTPUT CHARACTER !INY !STA @IBASE,Y ; STROBE ON !LDY #4 !STA @IBASE,Y ; STROBE OFF  xdump: RTS  LGRAPP: INY  LGRLP: LDA @IBASE,Y !EOR #3 !AND #7 !BNE LGRLP ; WAIT FOR NOT BUSY !LDY #20  WRP: DEY !BNE WRP ; WAIT SOME MORE !INY !PLA !STA @IBASEIT FOR PRINTER NOT BUSY !PLA !DEY !STA @IBASE,Y ; THEN SEND CHAR !RTS  LGPLUS: INY  LGPLP: LDA @IBASE,Y !EOR #2 !AND #0E !BNE LGPLP ; WAIT FOR NOT BUSY !LDY #20  WGP: DEY !BNE WGP ; WAIT A BIT MORE (FOR ACK TIME) !INY !PLA !STA @IBASE,Y ; OU!cmp #2 !bcs xdump !lda #1B ; output esc '3 to fix lf size !jsr lprint !lda #33  ;  ; LPRINT - PRINT ROUTINE  ;  LPRINT: PHA ; SAVE CHAR TO BE OUTPUT !LDY ITYPE !BEQ LGRAPP !DEY !BEQ LGPLUS  EPSON: LDY #1  EPLP: LDA @IBASE1,Y !BMI EPLP ; WAITION 0 ? !BEQ DEXIT !JMP DUMPLP  ;  DEXIT: JSR RESCRD ; IF SO, THATS IT !LDx #0C ; RESET LINE SPACE TO 12/72"  ;  lfsize: lda #1B ; set lf size to n/72" !JSR LPRINT !LDA #41 !JSR LPRINT !txa !jsr lprint !lda ptype ; if mx series then X80 THEN END IS @ $1E0 !AND #1 !BEQ LINELP !LDA XLSB !CMP #0E0 !BNE LINELP !BEQ XLINE  NMX80: LDA XMSB ; ELSE, END IS @ $200 !EOR XPAGE !AND #2 !BEQ LINELP  ;  XLINE: LDA #0A ; OUTPUT LF TO PRINTER !JSR LPRINT  LDA YLSB !ORA YMSB ; IS Y POSDEX  COLINT: DEX !BNE GETDOT  ; !LDA DOTS !JSR LPRINT ; PRINT THE PATTERN IN DOTS  ; !INC XLSB ; INCREMENT X POSITION AND TEST FOR END OF LINE !BNE NIXM !INC XMSB  NIXM: LDA PTYPE !beq emx80 !cmp #2 ; rx80 ? !BNE NMX80  emx80: LDA XMSB ; IF M!JSR GETCOL ; GET THE SCREEN COLOUR !BIT COLOR ; MONOCHROME OR COLOUR ? !BMI ISCOL !ORA #6  ISCOL: CMP #7 ; 7 IS BLACK !BEQ COLOFF !SEC !ROL DOTS !SEC !BCS COLEX  COLOFF: ASL DOTS !CLC  COLEX: LDA INTERL ; INTERLACED !BNE COLINT !ROL DOTS !A XLSB  LDA XPAGE !STA XMSB  ;  ; NOW OUTPUT A HORIZONTAL LINE (8 NEEDLES HIGH)  ;  LINELP: LDA YTEMP+1 ; RESTORE Y POSITION !STA YMSB !LDA YTEMP !STA YLSB  LDX #8 ; GET 8 DOTS  GETDOT: JSR CYDEC ; DECREMENT Y POSITION !JSR GSETUP 00 $02 !JSR LPRINT  LDA #5  GMX82: JSR LPRINT ; MX82: ESCAPE K $00 $02 !LDA #0 !JSR LPRINT !LDA #2  GLAST: JSR LPRINT  ;  ; OK NOW SET THE VGP  ; !LDA YLSB !STA YTEMP !LDA YMSB !STA YTEMP+1 ; SAVE Y POSITION  LDA #0 ; RESET X POSITION !STINTER TO ACCEPT GRAPHICS LINE !JSR LPRINT !lda #4B ; 'K !LDY PTYPE !beq gmx80 !cpy #5 !beq gfx80 !DEY !DEY !bne gmx82  GMX80: JSR LPRINT ; MX80: ESCAPE K $E0 $01 !LDA #0E0 !JSR LPRINT !LDA #1 !BPL GLAST  GFX80: LDA #2A ; FX80: ESCAPE * $05 $ JSR YTOP ; SAVE POSITION & SET Y TO TOP OF SCREEN  ;  ; SET UP PRINTER  ; !LDx #8 ; set lf space to 8/72" !JSR Lfsize  OUTCR0: LDA #0D ; SEND RETURN TO START OFF OK !JSR LPRINT  ;  ; END OF SET UP , MAIN DUMP LOOP  ;  DUMPLP: LDA #1B ; SET PRST NOT EQUAL VGP SLOT NO. !BEQ BAD !CMP #6 ; MUST BE LESS THAN 6 !BCC GOOD  BAD: RTS  GOOD: ORA #0C0 !STA IBASE1+1 !ASL A !ASL A !ASL A !ASL A ; MULTIPLY SLOT * 16 !ORA #80 !STA IBASE !LDA #0C0 !STA IBASE+1 !LDA #0 !STA IBASE1  ; p RETURN !PLA ; GET SLOT !STA ISLOT !PLA !PLA ; GET INTERFACE TYPE !STA ITYPE !PLA !PLA ; GET PRINTER TYPE !STA PTYPE !PLA !push RETURN  ;  ; CHECK SLOT NO. AND SET UP BASE POINTERS  ; !LDA ISLOT ; MUST NOT EQUAL 0. !BEQ BAD !CMP #SLOT ; MUce_type 0:grappler, 1:grappler+, 2:epson  ; interface_slot 1 through 5  ;  PTYPE .EQU 2  ITYPE .EQU 3  ISLOT .EQU 4  INTERL .EQU 5  IBASE .EQU 6  IBASE1 .EQU 8  YTEMP .EQU 10.  DOTS .EQU 12. !.REF RESCRD,GSETUP,GETCOL,YTOP,CYDEC,COLOR,XPAGE !po,Y ; OUTPUT CHARACTER !RTS  ;  ; RUN LENGTH ENCODE / DECODE ROUTINES  ; TO SUPPORT DISK SAVE / LOAD PROGRAMS  ;  ; INITIALISE POSITION AND VARIABLES FOR CODE ROUTINES !.proc code_init  ;  .DEF DCOUNT,DOTS,CODEND !.REF YTOP,CYDEC,XPAGE !JSR YTOP ; SET Y POSITION TO TOP OF SCREEN !JSR CYDEC ; DECREMENT Y POSITION !LDY #0 !STY XLSB !LDA XPAGE !STA XMSB ; RESET X POSITION !STY DCOUNT !STY CODEND !DEY !STY DOTS ; SET DOTS TO 0FF  RTS  ;  DCOUNT .BYTE 0  DOTS .BYTE 0  CODEND . DECDLP ; LOOP UNTIL BUFFER EMPTY  BYEBYE: RTS ; RETURN TO PASCAL  INVALID !JSR READY ; WAIT FOR COMPLETION !INC XLSB ; INCREMENT X POSITION !BNE ENDCHK !INC XMSB !JSR CHECKX !BEQ ENDCHK !STA CODEND ; SET CODEND NZ TO MARK FINISH !JMP RESCRD ; FINISH BY RESTORING VGP POSITION  ENDCHK: LDA BCOUNT+1 !AND #2 !BEQ!TAX ; SAVE COLOUR !ROL A !ROL A ; SHIFT NO. INTO LS 2 BITS !ROL A !AND #3  RDPAIR: SEC ; SUBTRACT 1 !SBC #1 !STA DELTAX ; SET VECTOR LENGTH !STX TEMP1 !LDY #2 !JSR PUTCOL !LDA #10 !STA CMD ; AND PLOT THE VECTOR !SEC !ROR DOTS ; SET OLD BYTETR: INC BCOUNT !BNE NIBCNT ; INCREMENT COUNT !INC BCOUNT+1  NIBCNT: LDX DOTS !STA DOTS ; SWAP NEW FOR OLD !CPX #40 ; VALID OLD VALUE ? !BCC RDPAIR ; YES IF < 40  CMP #40 ; IS NEW BYTE SINGLE ? !BCC ENDCHK ; IF NOT GET NEXT BYTE TER !push RETURN !LDA CODEND !BNE BYEBYE ; FORGET IT IF CODEND IS NZ !LDA #0 ; RESET COUNT !STA BCOUNT !STA BCOUNT+1  DECDLP: LDY #0 !LDA @BPTR,Y ; GET NEXT BYTE FROM THE BUFFER !INC BPTR !BNE NIBPTR ; INCREMENT BUFFER POINTER !INC BPTR+1  NIBPIN BUFFER !push RETURN !RTS ; RETURN TO PASCAL  ;  ; DECODE ROUTINE  .proc decode,1  ; decode (var 512_byte_buffer)  ;  BPTR .EQU 2  BCOUNT .EQU 4 !.REF DOTS,CODEND,RESCRD,READY,CYDEC,PUTCOL,CHECKX,XPAGE !pop RETURN !pop BPTR ; GET BUFFER POIN ENNINC: INC BCOUNT ; INCREMENT COUNT !BNE ENCDLP !INC BCOUNT+1 !LDA BCOUNT+1 !AND #2  BEQ ENCDLP  BNE NOTRES  ;  FINISH: STA CODEND ; SET CODEND NZ TO MARK FINISH  JSR RESCRD ; RESTORE VGP POSITION  NOTRES: push BCOUNT ; RETURN NO. OF BYTES T20: LDX #0 ; CLEAR DCOUNT !STX DCOUNT !BEQ WRTBYT ; AND STORE SECOND BYTE  ;  WRITFF: LDA #0FF  WRIT17: STA DCOUNT !LDA SAVCOL ; GET COLOUR  ;  WRTBYT: LDY #0 !STA @BPTR,Y !INC BPTR !BNE ENNINC ; INCREMENT BUFFER POINTER !INC BPTR+1 COLOUR !BEQ ENCLP1 ; LOOP UNTIL DIFFERENT  ;  ESTORE: LDA DOTS !BEQ WRITFF !CMP #4 ; IF LESS THAN 4, STORE AS SINGLE BYTE !BCS WRIT17 !ROR A !ROR A !ROR A ; ROTATE TO 2 MS BITS !AND #0C0 !ORA SAVCOL !BNE WRTBYT ; AND STORE SINGLE BYTE  ;  WRI#2 !BNE ESTORE ; IF SO STORE WHAT WE HAVE  NOXMSB: LDA XLSB !AND #7 !TAY !BNE NOSCAN ; IF COLOUR REGS STILL VALID !LDA #0F ; ELSE INITIATE COLOUR SCAN !STA CMD !JSR READY  NOSCAN: JSR GETCOL ; GET NEXT POINT COLOUR !CMP SAVCOL ; COMPARE WITH 1ST !STA DOTS ; RESET DOTS COUNT  ;  ENCLP1: INC DOTS ; INCREMENT COUNT OF SAME COLOUR POINTS !BEQ ESTORE ; IF MAXIMUM NO. OF DOTS THE SAME, STORE !INC XLSB ; INCREMENT X POSITION !BNE NOXMSB !INC XMSB !LDA XMSB ; OFF RHS OF SCREEN ? !EOR XPAGE !AND YES STORE IT !LDA CODEND ; HAVE WE FINISHED ALREADY ? !BNE NOTRES ; IF YES, FORGET IT !JSR CHECKX ; OFF THE BOTTOM OF THE SCREEN ? !BNE FINISH ; IF SO, QUIT  JSR GSETUP !JSR GETCOL ; GET COLOUR FROM THE SCREEN !STA SAVCOL ; TEMP STORE  LDA #0 CHECKX,XPAGE  pop RETURN !PLA ; DESTACK 4 BYTES BECAUSE ITS A FUNCTION !PLA !PLA !PLA !pop BPTR ; GET BUFFER POINTER  LDA #0 !STA BCOUNT !STA BCOUNT+1 ; RESET BUFFER COUNT  ;  ENCDLP: LDA DCOUNT ; BYTE LEFT OVER FROM LAST TIME ? !BNE WRIT20 ;BYTE 8  ;  ; ENCODE FUNCTION  .func encode,1  ; encode (var 512_byte_buffer)  ;  BPTR .EQU 2 ; POINTER TO THE BUFFER  BCOUNT .EQU 4 ; BUFFER COUNT  SAVCOL .EQU 6 ; TEMP COLOUR SAVE !.REF DCOUNT,DOTS,CODEND,RESCRD !.REF GSETUP,GETCOL,READY,CYDEC,N^Ԩqsave_file,file_name); 0(*$I+*) 0if ioresult = 0 then begin 8close (save_file); 8write ('Remove old ',filename,' ? '); 8if yesorno = false then exit (save); 0end;  rewrite (save_file,file_name); (* open for write *) 0WRITE ('Saving.'n (' '); 0write ('Save as ? '); 0readln (file_name); 0blocks := length (file_name); 0if blocks = 0 then exit (save); 0if (pos ('.pic',file_name) = 0) AND 3(pos ('.PIC',file_name) = 0) then 3file_name := concat (file_name,'.PIC'); 0(*$I-*) 0reset (8write (' OK ? '); 8if yesorno = true then exit (vgpformat); 0 frmat := 0; 0end; (until true = false; (end; ( ( (procedure save; (var 0blocks :integer; 0save_file :file; 0file_name :string; ( (begin 0clear_screen; 0heading; 0writel,','); 8if bit2 = 0 then writeln ('monochrome,') 8else writeln ('colour,'); 8if bit0 = 0 then write ('US,') 8else write ('UK,'); 8if bit1 <> 0 then write ('non-'); 8write ('interlaced,'); 8if bit1 <> 0 then write ('sub-page ',subpage+1,','); 8begin 8 bit1 := 2; ( write ('Sub-page 1 ? '); @if yesorno = false then subpage := 1; 8end; 0 frmat := 1; 0end 0else 0begin 8format (bit0+bit1+bit2); 8subpg (subpage); 8pagdis (page); 8write ('Page ',page+12 := 0; 0 if yesorno = true then bit2 := 4; 0 write ('US mode ? '); 0 bit0 := 0; 0 if yesorno = false then bit0 := 1; 0 write ('Interlaced ? '); 0 bit1 := 0; 8subpage := 0; 0 if yesorno = false then (procedure vgpformat; (begin (repeat ( clear_screen; 0writeln ('VGP format:'); 0gotoxy (0,2); 0if frmat = 0 then 0begin 0 write ('Use page 1 ? '); 8page := 0; 8if yesorno = false then page := 1; 8write ('Colour ? '); 0 bitd; ( ( (function yesorno :boolean; (begin 0repeat 8read (typed); 0 if typed = 'n' then typed := 'N'; 8if typed = 'y' then typed := 'Y'; 0until (typed = 'N') OR (typed = 'Y'); 0writeln (' '); 0yesorno := (typed <> 'N'); (end; ( ( ing; (begin 0gotoxy(0,0); 0write ('Vgp: G(et S(ave D(ump F(mrt Q(uit [1.1]'); (end; ( ( (procedure clear_screen; (begin ( write (chr(12)); ( gotoxy (0,0); (end; ( ( (procedure quit; (begin 0clear_screen; 0exit (program); (enmat (config :integer); external;  procedure dump (printer_type,iface_type,iface_slot :integer); external;  procedure code_init; external;  function encode (var buffer) :integer; external;  procedure decode (var buffer); external;   (procedure headprogram vgp2u;  var (typed :char; (ptype,itype,slotn,frmat,bit0,bit1,bit2,subpage,page :integer; (buffer :packed array[0..511] of char;   procedure pagdis (pageno :integer); external;  procedure subpg (oneorzero :integer); external;  procedure for); 0code_init; 0blocks := 1; 0while (encode (buffer)<>0) AND (blocks=1) AND (ioresult=0) do 0begin 8blocks := blockwrite (save_file,buffer,1); 0 write ('.'); 0end;  close (save_file,lock);  writeln (' '); 0writeln ('VGP screen --> ',file_name); (end;   (procedure getf; (var 0blocks :integer; 0get_file :file; 0file_name :string; (begin 0clear_screen; 0heading; 0writeln (' '); 0write ('Get ? '); 0readln (file_name); 0blocks := length (file_nN^Ԩq 'F': vgpformat; 8'Q': quit; 0end;  until true = false;  end.   repeat 0heading; 0read (typed); ( case typed of 0 'g': getf; ( 's': save; ( 'd': print; 0 'f': vgpformay; 8'q': quit; 8'G': getf; ( 'S': save; ( 'D': print; ( 8write ('Card slot no. (1 - 5) ?'); 8read (typed); 8slotn := ord (typed) - 48; 0until true = false; (end;    begin  ptype := 2; (* fx80 *) (itype := 1; (* grappler+ *) (slotn := 1; (* interface slot no. *) (frmat := 0; (vgpformat; (= 'q') OR (typed = 'Q') then 8begin @clear_screen; 8 exit (print); 8end; 8ptype := ord (typed) - 48; 8gotoxy (0,4); 8write ('Card (0:Grappler 1:Grappler+ 2:Epson) ?'); 8read (typed); 8itype := ord (typed) - 48; 8gotoxy(0,5); dump (ptype,itype,slotn); @ clear_screen; Hexit (print); 8 end; 8end; 8gotoxy(0,2); 8writeln ('Printer (0:MX80 1:MX100 2:RX80'); 8write (' 3:RX100 4:MX82 5:FX80) Q(uit ?'); 8read (typed); 8if (typed 8 end; @writeln ('printer,'); @write ('via a'); @case itype of @0: write (' Grappler'); @1: write (' Grappler+'); @2: write ('n Epson'); @end; @write (' card in slot ',slotn,' OK ?'); 8 if yesorno = true then begin  8if (slotn >= 1) AND (slotn < 6) then 8begin 8 write ('Dump using an '); @case ptype of 8 0: write ('MX80 '); 8 1: write ('MX100 '); @2: write ('RX80 '); @3: write ('RX100 '); @4: write ('MX82 '); 8 5: write ('FX80 ');=0); 0close (get_file); ( writeln (' '); 0writeln (file_name,' --> VGP screen'); (end; ( (  procedure print; (begin 0repeat 8clear_screen; 8if (ptype >= 0) AND (ptype < 6) then 8if (itype >= 0) AND (itype < 3) then writeln ('*** File not found ***'); 8exit (getf); 0end; 0code_init; 0write ('Loading.'); 0repeat 8blocks := blockread (get_file,buffer,1); 8write ('.'); 8if blocks = 1 then decode (buffer); 0until (eof (get_file)) OR (ioresult<>0) OR (blocksame); 0if blocks = 0 then exit (getf); 0if (pos ('.pic',file_name) = 0) AND 3(pos ('.PIC',file_name) = 0) then 0file_name := concat (file_name,'.PIC'); 0(*$I-*) 0reset (get_file,file_name); 0(*$I+*) 0if ioresult <> 0 then begin  program example;   (* full list of all VGP][ support routines declared as external *)   procedure init; external;  procedure down; external;  procedure up; external;  procedure pen; external;  procedure eraser; external;  procedure home; externaצ'Vgp: G(et S(ave D(ump F(mrt Q(uit [1.1]@     náNyáYNYÍ N<D   VGP format:áצ Use page 1 ? GVGP2U xt);  end;   begin  end.   procedure dump (printer_type,iface_type,iface_slot :integer); external;  procedure code_init; external;  function encode (var buffer) :integer; external;  procedure decode (var buffer); external;   procedure print (txt :string);  begin (vprint (txto,yto :integer); external;  procedure line (xto,yto :integer); external;  procedure cursor (size :integer); external;  procedure circle (radius :integer); external;  procedure filled_circle (radius :integer); external; al;  procedure draw_map; external;  procedure cafill (mode,boundary :integer); external;  procedure move (x,y :integer); external;  procedure dot (x,y :integer); external;  procedure line_type (ltype :integer); external;  procedure draw (xfrom,yfrom,procedure border (col :integer); external;  procedure xoffset (offset :integer); external;  procedure yoffset (offset :integer); external;  procedure format (config :integer); external;  procedure define_map (var mem; xsize,ysize,mode :integer); extern procedure colour (col :integer); external;  procedure mode (write_mode,plane :integer); external;  procedure video (vgporapple :integer); external;  procedure interlace (yesorno :integer); external;  procedure subpg (oneorzero :integer); external;  eger); external;  procedure page1; external;  procedure page2; external;  procedure inverse; external;  procedure normal; external;  procedure protect (col :integer); external;  procedure invert (col :integer); external; ; external;  procedure block4; external;  procedure block5; external;  procedure vprint (var txt :string); external;  procedure where (var x,y :integer); external;  procedure test (var screen_colour :integer); external;  procedure pagdis (pageno :intl;  procedure clear; external;  procedure high; external;  procedure low; external;  procedure cyclic; external;  procedure clip; external;  procedure fill; external;  procedure invert_screen; external;  procedure text (slant,orient,xs,ys :integer) צ Colour ?  צ US mode ?   Interlaced ?  (צ Sub-page 1 ?   Page  ,á! monochrome,צcolour,áצUS,UK,ˡnon- interlaced,ˡ+ sub-page  ,צ OK ?     %  Ɓ.   ZZZZZ0 {ihcQL10hhhhHH2\11@ @2***)8 8n1  8 2L )`eLK2+*! >0j4 H Zn*2p 0J I  , # ` )("4hhhhhhhh0W2~ 8 s " 8 11) M# )) 8 ҭ1jjj)00Ј)2 HHHH`#  , " 8 ,x 0 8& 8 & ٥ )Ъ M# )  LF  A  3 3H( 0h`ȱI) hȑ`ȱI) h`#  zromdJu ) 2ȹ2u ) 1``M1) :1)`NI<"srqiWhhhhhhhhHH`     K  *     )f$,x Hw )f)$f'h`F*SONKC62xhhh**)u ) u hHH`4hhh****)u )/Ld  &hh hjjjnx )hHHu )<ču `)#< u jI)hhhHH $ :ȑ`) L  @,x "92&92&92*)`92`XW/'iQPGhhh)hHHL u ) u `$hhhhHH *v ,x w `@ v! %5"$&(*,.02468:<>@gDguJLNPRTVXZy^   ,,` ,` ,`H)h````nmifa\hqQÍ 0 'Card (0:Grappler 1:Grappler+ 2:Epson) ?0 צCard slot no. (1 - 5) ?0    (  {wso k gDs`;צ Grappler+#צn EpsonL7! card in slot   OK ?   Printer (0:MX80 1:MX100 2:RX80' 3:RX100 4:MX82 5:FX80) Q(uit ?ɄɄɄצDump using an tMX80 uצMX100 aצRX80 NRX100 :MX82 'צFX80  |kYH6%printer,via aD GrapplerPSצ.PICTSP*"ˡ.*** File not found ***Loading. .á  "ˍÍ * --> VGP screen|  . VGP screen --> *Ɓ.  Get ? *P*áצ.pic*צ.PIC*Ä*SS* Save as ? *P*áצ.pic*צ.PIC*Ä*SS*PSצ.PICTSP*"áF Remove old * ?  *צSaving. Ä"ÄGApple 1.1 ,,` ,` ,`H)h````nmifa\ ­)  ©`EDC:7)\LHH%& ),0 ) )  & " VL`j `$ΨΩ ` ``' @***) `8 jHH$0  0 mhht<( )&! UPhhhhh) h)h)?hHH`(hh hjjjn)hHH)<`)#<hhhhhhhhhhHH` 6gb  j  L* m  L< hHH`4hhh*) EL "hhh****))/L &hhhhHH)f  ,))w=`7.-)!Xhh )h)?hHH`(hh hhhHH *,`@ )f$,H)f)$f'h`F*SONKC62xhh hhh)hHH,)`))LG )`O?94+hhhh**)) `XW/'iQPGhhh)hHHLL) `$DL) , )`'"!<LLh LhhhhHH ȱ L` 2hhhhhhHH ȭ`>hhhhHH $ :ȑ`) L @,"92&92&92*)`92 H h ))-x | hp  L@@UOHDi\C876 hhh)hh  hh) hh) )hHH`.H LLLLL) L) L) L)L) ,)U  L L)$!<L G$#  )      $$  / $$[0 ZY \[X!W"`` #A[0]W\[8ZYԽXW)`$ $A[0`$#)[0[\\YYZZWWXXέZY\['X(W$`#3#[\8ZYݽZYѽ[ [`8'(`'(" S  a"I) 7BITM C3COPY SAVVGP VRESCRD 6WCMD RESVGP KSVXCRD jSAVCRD `COLOR WCTRL1 %BITY COLCOP RESCOL  C4COPY BITX READY ,)`eLK2+*! nFp<lX,Z:t`v$HRh~t2H^t5` )("4hhhhhhhhББ Б БM)) ҭjjj)Ј) HHHH`{ihcQL10hhhhHH\@ @2***)8 8n  L3 3H( 0h`ȱI) hȑ`ȱI) h`#  zromdJ ` )("4hhhhhhhhW~ s ) H`     K  *      ,0 8& 8 & ٥ )𱭩Ъ M)  LF  A  :9876543210/.-,+*)('&8}|K  jI)) 2ȹ2) 1`ΪΫ`M1) :1)`NI<"srqiWhhhhhhhhH L-1` ^  n  n-1-1`  zL)e-*e.L)8-*.L)e/*e0L)8/*0 `+e-,e.L+8-,.L+e/,e0L+8/,0 `-8/.0` *i`o\[TSRQMC<; '( 5 (0/0/ Lb-.  *e''e((-.ƥ 3-4. O  ) L6 3/40 O E-.    L-.- $ z  @   @   @   @   @   @   @ zI`)`icB1n^]\hh hhHH B>  L) , ) D`C6]N8732-%" zL )hhh/h0HH0)0/`ة-. E *hh HHL hhh)hHH )`*hhhhhh L $hhhhhhHH Jffff ; LL 8 }8 }  `I)  U 65cqjbG:2.$!,~ ,8) = L = L ``G4+*76/.-&bhh hhhh HH`8  0J I  L8 L`'( 8)*`] Z / ( $  |hedcba`_^]\[TPLHE@61($!]]]]`ͫ`   ΪΫ `)L )*ZY\[ 88) 8) 8j) JJJJJJ) em'm(e8 T j ? I L    !"    "  * ")   '(`) l%`%``*`#M`ΩΨM`Ω`j Mj`j ͫ`8RSXCRD @BITDM BITDL ZZZZZ0 ZZZZZ0 C3COPY  COLCOP LCOP RESCOL SCOL C4COPY COPY READY Y INIT INIT WCMD MD DOWN DOWN UP UP WCMD MD PEN PEN WCMD MD WCMD -MD ERASER WCMD ]MD SVXCRD XCRD PUTCOL XTCOL PLOTB OTB BITDLP &STXMSB CAFRSY &cBITY TY DRAWMAP &DRAWMAP &BITDRW &INIT BITM hTM BITY mTY DEFINEMA %DEFINEMA%BITX rTX BITDM BITDL {wL STACK1 BITM  GTDATA &XOFFSET "XOFFSET "READY ADY YOFFSET #YOFFSET #READY ADY C3COPY H>PY FORMAT $FORMAT $COLOR /LOR READY 'ADY C3COPY RCOPY SUBPG SUBPG  RVIDEO YIDEO COLOR LOR BORDER !BORDER !COLCOP OP C4COPY }PY READY ADY PY READY ADY C3COPY PY READY ADY VIDEO VIDEO RVIDEO C3COPY )COPY INTERLAC INTERLACRVIDEO 0IDEO 6R COLOUR COLOUR COLCOP <OP C4COPY 'PY READY ADY MODE MODE COLOR LOR COLCOP  C4COPY PY READY ADY NORMAL NORMAL PUTW TW PROTECT PROTECT PUTW TW INVERT INVERT PUTW PUTCOL *COLOR e[PY HGRSET READY hADY PAGE2 PAGE2 WINVER NVER INVERSE INVERSE WINVER COLOR LOR COLCOP OP C4COPY COLOR LOR GSETUP $READY Y TEST TEST HGRSET 4RSET PAGDIS PAGDIS HGRSET GRSET PAGE1 PAGE1 C3COPY BLOCK4 WCMD  MD BLOCK5 BLOCK5 WCMD >MD VPRINT VPRINT WHERE WHERE READY mADY GETCOL :WCMD MD INVERTSC INVERTSCSCREEN  RESCOL dSCOL SETRMW TRMW READY W< TEXT TEXT READY ADY WCMD MD BLOCK4 LCOP C4COPY COPY FILL FILL  SCREEN REEN C3COPY -COPY SAVVGP VVGP RESCRD jSCRD RESPOS RESVGP gSVGP TRL1 CLIP CLIP  WCTRL1 TRL1 PEN  WCMD MD CLEAR CLEAR  COLOR LOR SCREEN REEN COLCOP ERASER HOME HOME WCMD AMD HIGH HIGH WCTRL1 ZTRL1 LOW LOW  WCTRL1 pTRL1 CYCLIC CYCLIC  WCTRL1 STXLSB RESCOL SCOL BYTDRW &BITX  READY `#DSTACK BITDM TDM BTPLOT &mBITDL TDL BITM  SOXMSB 'WC3COPY COPY SOXLSB 'XGETCOL $ OL GTDATA DATA WCMD MD SAVCRD QVCRD PLOTB $OTB COLOR  LOR  ZZZZZ0 SCRD CHECKX ECKX PUTCOL TCOL READY ADY CODEND ND DOTS  XPAGE DECODE 5DECODE 5 ENCODE 4ENCODE 4DCOUNT :3 GSETUP ETUP READY ADY CODEND WND DOTS  XPAGE AGE CYDEC RESCRD DCOUNT 3CODEINIT 3CODEINIT3YTOP OP CODEND 3DOTS 3XPAGE AGE CYDEC RESCRD ZSCRD GETCOL OL CHECKX ECKX RESCRD SCRD GETCOL TCOL COLOR LOR GSETUP ETUP YTOP $OP DUMP 2DUMP 2XPAGE sE CYDEC DEC READY qqC3COPY uk CYDEC 1:CHECKX 1FSAVCRD hVCRD READY eADY YTOP 1XPAGE 11ZZZZZ2 1ZZZZZ2 1CYDEC DEC RDO CIRCLE /CIRCLE /FILLEDCI 0FILLEDCI0RESCRD tSCRD CIRDO 0WCMD MD SVXCRD 6RD SAVCRD VCRD PLOTB <B RESCRD eSCRD RESVGP nSVGP COLOR LOR COLCOP LCOP RESCOL kSCOL C4COPY uCOPY SETRMW .BREADY b9Y CIRDO LINE2 lNE2 WCMD  SAVCRD VCRD LINE -LINE -LINE2 -DSMATH -JREADY ADY CURSOR .CURSOR .SAVVGP JVVGP READY ADY WCMD MD MOVE  VE DOT *DOT *LINETYPE +LINETYPE+READY ;ADY MOVE iVE DRAW ,DRAW ,4PLOT BITDL TDL WCMD MD PLOTB (DPLOTB (=SPLOTB (,READY  RSXCRD RD ZZZZZ1 (ZZZZZ1 (MOVE )MOVE )@\/ CAFILL 'CAFILL 'SPLOTB 'lTB DSMATH FMATH STYMSB '[READY ESTYLSB '\RSXCRD XRD BITDM TDM BTPLOT BITDLP $TDLP STXMSB 'YCAFRSY G FRSY DPLOTB BITY qM4 BITDRW .TDRW STXLSB 'ZBYTDRW TDRW GSETUP [&oTE! BITX GApple 1.1 ,,` ,` ,`H)h````nmifa\ Íí)  é`EDC:7)\LHH%& ),0 ) )  & " VL`j `$θι ` ``' @***) `8 jHH$0  0 mhht<( )&! UPhhhhh) h)h)?hHH`(hh hjjjn)hHH)<Í`)#<hhhhhhhhhhHH` 6gb  j  L* m  L< hHH`4hhh*) EL "hhh****))/L &hhhhHH)f  ,))w=`7.-)!Xhh )h)?hHH`(hh hhhHH *,`@ )f$,H)f)$f'h`F*SONKC62xhh hhh)hHH,)`))LG )`O?94+hhhh**)) `XW/'iQPGhhh)hHHLL) `$DL) , )`'"!<LLh LhhhhHH ȱ L` 2hhhhhhHH ȭ`>hhhhHH $ :ȑ`) L @,"92&92&92*)`92 H h ))-x | hp  L@@UOHDi\C876 hhh)hh  hh) hh) )hHH`.H LLLLL) L) L) L)L) ,)U  L L)$!<L G$#  )      $$  / $$[0 ZY \[X!W"`` #A[0]W\[8ZYԽXW)`$ $A[0`$#)[0[\\YYZZWWXXέZY\['X(W$`#3#[\8ZYݽZYѽ[ [`8'(`'(" S  a"I) 7BITM C3COPY SAVVGP VRESCRD 6WCMD RESVGP KSVXCRD jSAVCRD `COLOR WCTRL1 %BITY COLCOP RESCOL  C4COPY BITX READY ,)`eLK2+*! nFp<lX,Z:t`v$HRh~t2H^t5` )("4hhhhhhhhББ Б БM)) ҭjjj)Ј) HHHH`{ihcQL10hhhhHH\@ @2***)8 8n  L3 3H( 0h`ȱI) hȑ`ȱI) h`#  zromdJ ` )("4hhhhhhhhW~ s ) H`     K  *      ,0 8& 8 & ٥ )𱭹Ъ M)  LF  A  :9876543210/.-,+*)('&8}|K  jI)) 2ȹ2) 1`κλ`M1) :1)`NI<"srqiWhhhhhhhhH L-1` ^  n  n-1-1`  zL)e-*e.L)8-*.L)e/*e0L)8/*0 `+e-,e.L+8-,.L+e/,e0L+8/,0 `-8/.0` *i`o\[TSRQMC<; '( 5 (0/0/ Lb-.  *e''e((-.ƥ 3-4. O  ) L6 3/40 O E-.    L-.- $ z  @   @   @   @   @   @   @ zI`)`icB1n^]\hh hhHH B>  L) , ) D`C6]N8732-%" zL )hhh/h0HH0)0/`ة-. E *hh HHL hhh)hHH )`*hhhhhh L $hhhhhhHH Jffff ; LL 8 }8 }  `I)  U 65cqjbG:2.$!,~ ,8) = L = L ``G4+*76/.-&bhh hhhh HH`8  0J I  L8 L`'( 8)*`] Z / ( $  |hedcba`_^]\[TPLHE@61($!]]]]`ͻ`   κλ `)L )*ZY\[ 88) 8) 8j) JJJJJJ) em'm(e8 T j ? I L    !"    "  * ")   '(`) l%`%``*`#M`ιθM`ι`j Mj`j ͻ`8RSXCRD @BITDM BITDL ZZZZZ0 ZZZZZ0 C3COPY  COLCOP LCOP RESCOL SCOL C4COPY COPY READY Y INIT INIT WCMD MD DOWN DOWN UP UP WCMD MD PEN PEN WCMD MD WCMD -MD ERASER WCMD ]MD SVXCRD XCRD PUTCOL XTCOL PLOTB OTB BITDLP &STXMSB CAFRSY &cBITY TY DRAWMAP &DRAWMAP &BITDRW &INIT BITM hTM BITY mTY DEFINEMA %DEFINEMA%BITX rTX BITDM BITDL {wL STACK1 BITM  GTDATA &XOFFSET "XOFFSET "READY ADY YOFFSET #YOFFSET #READY ADY C3COPY H>PY FORMAT $FORMAT $COLOR /LOR READY 'ADY C3COPY RCOPY SUBPG SUBPG  RVIDEO YIDEO COLOR LOR BORDER !BORDER !COLCOP OP C4COPY }PY READY ADY PY READY ADY C3COPY PY READY ADY VIDEO VIDEO RVIDEO C3COPY )COPY INTERLAC INTERLACRVIDEO 0IDEO 6R COLOUR COLOUR COLCOP <OP C4COPY 'PY READY ADY MODE MODE COLOR LOR COLCOP  C4COPY PY READY ADY NORMAL NORMAL PUTW TW PROTECT PROTECT PUTW TW INVERT INVERT PUTW PUTCOL *COLOR e[PY HGRSET READY hADY PAGE2 PAGE2 WINVER NVER INVERSE INVERSE WINVER COLOR LOR COLCOP OP C4COPY COLOR LOR GSETUP $READY Y TEST TEST HGRSET 4RSET PAGDIS PAGDIS HGRSET GRSET PAGE1 PAGE1 C3COPY BLOCK4 WCMD  MD BLOCK5 BLOCK5 WCMD >MD VPRINT VPRINT WHERE WHERE READY mADY GETCOL :WCMD MD INVERTSC INVERTSCSCREEN  RESCOL dSCOL SETRMW TRMW READY W< TEXT TEXT READY ADY WCMD MD BLOCK4 LCOP C4COPY COPY FILL FILL  SCREEN REEN C3COPY -COPY SAVVGP VVGP RESCRD jSCRD RESPOS RESVGP gSVGP TRL1 CLIP CLIP  WCTRL1 TRL1 PEN  WCMD MD CLEAR CLEAR  COLOR LOR SCREEN REEN COLCOP ERASER HOME HOME WCMD AMD HIGH HIGH WCTRL1 ZTRL1 LOW LOW  WCTRL1 pTRL1 CYCLIC CYCLIC  WCTRL1 STXLSB RESCOL SCOL BYTDRW &BITX  READY `#DSTACK BITDM TDM BTPLOT &mBITDL TDL BITM  SOXMSB 'WC3COPY COPY SOXLSB 'XGETCOL $ OL GTDATA DATA WCMD MD SAVCRD QVCRD PLOTB $OTB COLOR  LOR  ZZZZZ0 SCRD CHECKX ECKX PUTCOL TCOL READY ADY CODEND ND DOTS  XPAGE DECODE 5DECODE 5 ENCODE 4ENCODE 4DCOUNT :3 GSETUP ETUP READY ADY CODEND WND DOTS  XPAGE AGE CYDEC RESCRD DCOUNT 3CODEINIT 3CODEINIT3YTOP OP CODEND 3DOTS 3XPAGE AGE CYDEC RESCRD ZSCRD GETCOL OL CHECKX ECKX RESCRD SCRD GETCOL TCOL COLOR LOR GSETUP ETUP YTOP $OP DUMP 2DUMP 2XPAGE sE CYDEC DEC READY qqC3COPY uk CYDEC 1:CHECKX 1FSAVCRD hVCRD READY eADY YTOP 1XPAGE 11ZZZZZ2 1ZZZZZ2 1CYDEC DEC RDO CIRCLE /CIRCLE /FILLEDCI 0FILLEDCI0RESCRD tSCRD CIRDO 0WCMD MD SVXCRD 6RD SAVCRD VCRD PLOTB <B RESCRD eSCRD RESVGP nSVGP COLOR LOR COLCOP LCOP RESCOL kSCOL C4COPY uCOPY SETRMW .BREADY b9Y CIRDO LINE2 lNE2 WCMD  SAVCRD VCRD LINE -LINE -LINE2 -DSMATH -JREADY ADY CURSOR .CURSOR .SAVVGP JVVGP READY ADY WCMD MD MOVE  VE DOT *DOT *LINETYPE +LINETYPE+READY ;ADY MOVE iVE DRAW ,DRAW ,4PLOT BITDL TDL WCMD MD PLOTB (DPLOTB (=SPLOTB (,READY  RSXCRD RD ZZZZZ1 (ZZZZZ1 (MOVE )MOVE )@\/ CAFILL 'CAFILL 'SPLOTB 'lTB DSMATH FMATH STYMSB '[READY ESTYLSB '\RSXCRD XRD BITDM TDM BTPLOT BITDLP $TDLP STXMSB 'YCAFRSY G FRSY DPLOTB BITY qM4 BITDRW .TDRW STXLSB 'ZBYTDRW TDRW GSETUP [&oTE! BITX GApple 1.1 ,,` ,` ,`H)h````nmifa\ čĭ)  ĩ`EDC:7)\LHH%& ),0 ) )  & " VL`j `$ ` ``' @***) `8 jHH$0  0 mhht<( )&! UPhhhhh) h)h)?hHH`(hh hjjjn)hHH)<č`)#<hhhhhhhhhhHH` 6gb  j  L* m  L< hHH`4hhh*) EL "hhh****))/L &hhhhHH)f  ,))w=`7.-)!Xhh )h)?hHH`(hh hhhHH *,`@ )f$,H)f)$f'h`F*SONKC62xhh hhh)hHH,)`))LG )`O?94+hhhh**)) `XW/'iQPGhhh)hHHLL) `$DL) , )`'"!<LLh LhhhhHH ȱ L` 2hhhhhhHH ȭ`>hhhhHH $ :ȑ`) L @,"92&92&92*)`92 H h ))-x | hp  L@@UOHDi\C876 hhh)hh  hh) hh) )hHH`.H LLLLL) L) L) L)L) ,)U  L L)$!<L G$#  )      $$  / $$[0 ZY \[X!W"`` #A[0]W\[8ZYԽXW)`$ $A[0`$#)[0[\\YYZZWWXXέZY\['X(W$`#3#[\8ZYݽZYѽ[ [`8'(`'(" S  a"I) 7BITM C3COPY SAVVGP VRESCRD 6WCMD RESVGP KSVXCRD jSAVCRD `COLOR WCTRL1 %BITY COLCOP RESCOL  C4COPY BITX READY ,)`eLK2+*! nFp<lX,Z:t`v$HRh~t2H^t5` )("4hhhhhhhhББ Б БM)) ҭjjj)Ј) HHHH`{ihcQL10hhhhHH\@ @2***)8 8n  L3 3H( 0h`ȱI) hȑ`ȱI) h`#  zromdJ ` )("4hhhhhhhhW~ s ) H`     K  *      ,0 8& 8 & ٥ )Ъ M)  LF  A  :9876543210/.-,+*)('&8}|K  jI)) 2ȹ2) 1``M1) :1)`NI<"srqiWhhhhhhhhH L-1` ^  n  n-1-1`  zL)e-*e.L)8-*.L)e/*e0L)8/*0 `+e-,e.L+8-,.L+e/,e0L+8/,0 `-8/.0` *i`o\[TSRQMC<; '( 5 (0/0/ Lb-.  *e''e((-.ƥ 3-4. O  ) L6 3/40 O E-.    L-.- $ z  @   @   @   @   @   @   @ zI`)`icB1n^]\hh hhHH B>  L) , ) D`C6]N8732-%" zL )hhh/h0HH0)0/`ة-. E *hh HHL hhh)hHH )`*hhhhhh L $hhhhhhHH Jffff ; LL 8 }8 }  `I)  U 65cqjbG:2.$!,~ ,8) = L = L ``G4+*76/.-&bhh hhhh HH`8  0J I  L8 L`'( 8)*`] Z / ( $  |hedcba`_^]\[TPLHE@61($!]]]]``    `)L )*ZY\[ 88) 8) 8j) JJJJJJ) em'm(e8 T j ? I L    !"    "  * ")   '(`) l%`%``*`#M`M``j Mj`j `8RSXCRD @BITDM BITDL ZZZZZ0 ZZZZZ0 C3COPY  COLCOP LCOP RESCOL SCOL C4COPY COPY READY Y INIT INIT WCMD MD DOWN DOWN UP UP WCMD MD PEN PEN WCMD MD WCMD -MD ERASER WCMD ]MD SVXCRD XCRD PUTCOL XTCOL PLOTB OTB BITDLP &STXMSB CAFRSY &cBITY TY DRAWMAP &DRAWMAP &BITDRW &INIT BITM hTM BITY mTY DEFINEMA %DEFINEMA%BITX rTX BITDM BITDL {wL STACK1 BITM  GTDATA &XOFFSET "XOFFSET "READY ADY YOFFSET #YOFFSET #READY ADY C3COPY H>PY FORMAT $FORMAT $COLOR /LOR READY 'ADY C3COPY RCOPY SUBPG SUBPG  RVIDEO YIDEO COLOR LOR BORDER !BORDER !COLCOP OP C4COPY }PY READY ADY PY READY ADY C3COPY PY READY ADY VIDEO VIDEO RVIDEO C3COPY )COPY INTERLAC INTERLACRVIDEO 0IDEO 6R COLOUR COLOUR COLCOP <OP C4COPY 'PY READY ADY MODE MODE COLOR LOR COLCOP  C4COPY PY READY ADY NORMAL NORMAL PUTW TW PROTECT PROTECT PUTW TW INVERT INVERT PUTW PUTCOL *COLOR e[PY HGRSET READY hADY PAGE2 PAGE2 WINVER NVER INVERSE INVERSE WINVER COLOR LOR COLCOP OP C4COPY COLOR LOR GSETUP $READY Y TEST TEST HGRSET 4RSET PAGDIS PAGDIS HGRSET GRSET PAGE1 PAGE1 C3COPY BLOCK4 WCMD  MD BLOCK5 BLOCK5 WCMD >MD VPRINT VPRINT WHERE WHERE READY mADY GETCOL :WCMD MD INVERTSC INVERTSCSCREEN  RESCOL dSCOL SETRMW TRMW READY W< TEXT TEXT READY ADY WCMD MD BLOCK4 LCOP C4COPY COPY FILL FILL  SCREEN REEN C3COPY -COPY SAVVGP VVGP RESCRD jSCRD RESPOS RESVGP gSVGP TRL1 CLIP CLIP  WCTRL1 TRL1 PEN  WCMD MD CLEAR CLEAR  COLOR LOR SCREEN REEN COLCOP ERASER HOME HOME WCMD AMD HIGH HIGH WCTRL1 ZTRL1 LOW LOW  WCTRL1 pTRL1 CYCLIC CYCLIC  WCTRL1 STXLSB RESCOL SCOL BYTDRW &BITX  READY `#DSTACK BITDM TDM BTPLOT &mBITDL TDL BITM  SOXMSB 'WC3COPY COPY SOXLSB 'XGETCOL $ OL GTDATA DATA WCMD MD SAVCRD QVCRD PLOTB $OTB COLOR  LOR  ZZZZZ0 SCRD CHECKX ECKX PUTCOL TCOL READY ADY CODEND ND DOTS  XPAGE DECODE 5DECODE 5 ENCODE 4ENCODE 4DCOUNT :3 GSETUP ETUP READY ADY CODEND WND DOTS  XPAGE AGE CYDEC RESCRD DCOUNT 3CODEINIT 3CODEINIT3YTOP OP CODEND 3DOTS 3XPAGE AGE CYDEC RESCRD ZSCRD GETCOL OL CHECKX ECKX RESCRD SCRD GETCOL TCOL COLOR LOR GSETUP ETUP YTOP $OP DUMP 2DUMP 2XPAGE sE CYDEC DEC READY qqC3COPY uk CYDEC 1:CHECKX 1FSAVCRD hVCRD READY eADY YTOP 1XPAGE 11ZZZZZ2 1ZZZZZ2 1CYDEC DEC RDO CIRCLE /CIRCLE /FILLEDCI 0FILLEDCI0RESCRD tSCRD CIRDO 0WCMD MD SVXCRD 6RD SAVCRD VCRD PLOTB <B RESCRD eSCRD RESVGP nSVGP COLOR LOR COLCOP LCOP RESCOL kSCOL C4COPY uCOPY SETRMW .BREADY b9Y CIRDO LINE2 lNE2 WCMD  SAVCRD VCRD LINE -LINE -LINE2 -DSMATH -JREADY ADY CURSOR .CURSOR .SAVVGP JVVGP READY ADY WCMD MD MOVE  VE DOT *DOT *LINETYPE +LINETYPE+READY ;ADY MOVE iVE DRAW ,DRAW ,4PLOT BITDL TDL WCMD MD PLOTB (DPLOTB (=SPLOTB (,READY  RSXCRD RD ZZZZZ1 (ZZZZZ1 (MOVE )MOVE )@\/ CAFILL 'CAFILL 'SPLOTB 'lTB DSMATH FMATH STYMSB '[READY ESTYLSB '\RSXCRD XRD BITDM TDM BTPLOT BITDLP $TDLP STXMSB 'YCAFRSY G FRSY DPLOTB BITY qM4 BITDRW .TDRW STXLSB 'ZBYTDRW TDRW GSETUP [&oTE! BITX GApple 1.1 ,,` ,` ,`H)h````nmifa\ ōŭ)  ũ`EDC:7)\LHH%& ),0 ) )  & " VL`j `$ ` ``' @***) `8 jHH$0  0 mhht<( )&! UPhhhhh) h)h)?hHH`(hh hjjjn)hHH)<ō`)#<hhhhhhhhhhHH` 6gb  j  L* m  L< hHH`4hhh*) EL "hhh****))/L &hhhhHH)f  ,))w=`7.-)!Xhh )h)?hHH`(hh hhhHH *,`@ )f$,H)f)$f'h`F*SONKC62xhh hhh)hHH,)`))LG )`O?94+hhhh**)) `XW/'iQPGhhh)hHHLL) `$DL) , )`'"!<LLh LhhhhHH ȱ L` 2hhhhhhHH ȭ`>hhhhHH $ :ȑ`) L @,"92&92&92*)`92 H h ))-x | hp  L@@UOHDi\C876 hhh)hh  hh) hh) )hHH`.H LLLLL) L) L) L)L) ,)U  L L)$!<L G$#  )      $$  / $$[0 ZY \[X!W"`` #A[0]W\[8ZYԽXW)`$ $A[0`$#)[0[\\YYZZWWXXέZY\['X(W$`#3#[\8ZYݽZYѽ[ [`8'(`'(" S  a"I) 7BITM C3COPY SAVVGP VRESCRD 6WCMD RESVGP KSVXCRD jSAVCRD `COLOR WCTRL1 %BITY COLCOP RESCOL  C4COPY BITX READY ,)`eLK2+*! nFp<lX,Z:t`v$HRh~t2H^t5` )("4hhhhhhhhББ Б БM)) ҭjjj)Ј) HHHH`{ihcQL10hhhhHH\@ @2***)8 8n  L3 3H( 0h`ȱI) hȑ`ȱI) h`#  zromdJ ` )("4hhhhhhhhW~ s ) H`     K  *      ,0 8& 8 & ٥ )Ъ M)  LF  A  :9876543210/.-,+*)('&8}|K  jI)) 2ȹ2) 1``M1) :1)`NI<"srqiWhhhhhhhhH L-1` ^  n  n-1-1`  zL)e-*e.L)8-*.L)e/*e0L)8/*0 `+e-,e.L+8-,.L+e/,e0L+8/,0 `-8/.0` *i`o\[TSRQMC<; '( 5 (0/0/ Lb-.  *e''e((-.ƥ 3-4. O  ) L6 3/40 O E-.    L-.- $ z  @   @   @   @   @   @   @ zI`)`icB1n^]\hh hhHH B>  L) , ) D`C6]N8732-%" zL )hhh/h0HH0)0/`ة-. E *hh HHL hhh)hHH )`*hhhhhh L $hhhhhhHH Jffff ; LL 8 }8 }  `I)  U 65cqjbG:2.$!,~ ,8) = L = L ``G4+*76/.-&bhh hhhh HH`8  0J I  L8 L`'( 8)*`] Z / ( $  |hedcba`_^]\[TPLHE@61($!]]]]``    `)L )*ZY\[ 88) 8) 8j) JJJJJJ) em'm(e8 T j ? I L    !"    "  * ")   '(`) l%`%``*`#M`M``j Mj`j `8RSXCRD @BITDM BITDL ZZZZZ0 ZZZZZ0 C3COPY  COLCOP LCOP RESCOL SCOL C4COPY COPY READY Y INIT INIT WCMD MD DOWN DOWN UP UP WCMD MD PEN PEN WCMD MD WCMD -MD ERASER WCMD ]MD SVXCRD XCRD PUTCOL XTCOL PLOTB OTB BITDLP &STXMSB CAFRSY &cBITY TY DRAWMAP &DRAWMAP &BITDRW &INIT BITM hTM BITY mTY DEFINEMA %DEFINEMA%BITX rTX BITDM BITDL {wL STACK1 BITM  GTDATA &XOFFSET "XOFFSET "READY ADY YOFFSET #YOFFSET #READY ADY C3COPY H>PY FORMAT $FORMAT $COLOR /LOR READY 'ADY C3COPY RCOPY SUBPG SUBPG  RVIDEO YIDEO COLOR LOR BORDER !BORDER !COLCOP OP C4COPY }PY READY ADY PY READY ADY C3COPY PY READY ADY VIDEO VIDEO RVIDEO C3COPY )COPY INTERLAC INTERLACRVIDEO 0IDEO 6R COLOUR COLOUR COLCOP <OP C4COPY 'PY READY ADY MODE MODE COLOR LOR COLCOP  C4COPY PY READY ADY NORMAL NORMAL PUTW TW PROTECT PROTECT PUTW TW INVERT INVERT PUTW PUTCOL *COLOR e[PY HGRSET READY hADY PAGE2 PAGE2 WINVER NVER INVERSE INVERSE WINVER COLOR LOR COLCOP OP C4COPY COLOR LOR GSETUP $READY Y TEST TEST HGRSET 4RSET PAGDIS PAGDIS HGRSET GRSET PAGE1 PAGE1 C3COPY BLOCK4 WCMD  MD BLOCK5 BLOCK5 WCMD >MD VPRINT VPRINT WHERE WHERE READY mADY GETCOL :WCMD MD INVERTSC INVERTSCSCREEN  RESCOL dSCOL SETRMW TRMW READY W< TEXT TEXT READY ADY WCMD MD BLOCK4 LCOP C4COPY COPY FILL FILL  SCREEN REEN C3COPY -COPY SAVVGP VVGP RESCRD jSCRD RESPOS RESVGP gSVGP TRL1 CLIP CLIP  WCTRL1 TRL1 PEN  WCMD MD CLEAR CLEAR  COLOR LOR SCREEN REEN COLCOP ERASER HOME HOME WCMD AMD HIGH HIGH WCTRL1 ZTRL1 LOW LOW  WCTRL1 pTRL1 CYCLIC CYCLIC  WCTRL1 STXLSB RESCOL SCOL BYTDRW &BITX  READY `#DSTACK BITDM TDM BTPLOT &mBITDL TDL BITM  SOXMSB 'WC3COPY COPY SOXLSB 'XGETCOL $ OL GTDATA DATA WCMD MD SAVCRD QVCRD PLOTB $OTB COLOR  LOR SCRD CHECKX ECKX PUTCOL TCOL READY ADY CODEND ND DOTS  XPAGE DECODE 5DECODE 5 ENCODE 4ENCODE 4DCOUNT :3 GSETUP ETUP READY ADY CODEND WND DOTS  XPAGE AGE CYDEC RESCRD DCOUNT 3CODEINIT 3CODEINIT3YTOP OP CODEND 3DOTS 3XPAGE AGE CYDEC RESCRD ZSCRD GETCOL OL CHECKX ECKX RESCRD SCRD GETCOL TCOL COLOR LOR GSETUP ETUP YTOP $OP DUMP 2DUMP 2XPAGE sE CYDEC DEC READY qqC3COPY uk CYDEC 1:CHECKX 1FSAVCRD hVCRD READY eADY YTOP 1XPAGE 11ZZZZZ2 1ZZZZZ2 1CYDEC DEC RDO CIRCLE /CIRCLE /FILLEDCI 0FILLEDCI0RESCRD tSCRD CIRDO 0WCMD MD SVXCRD 6RD SAVCRD VCRD PLOTB <B RESCRD eSCRD RESVGP nSVGP COLOR LOR COLCOP LCOP RESCOL kSCOL C4COPY uCOPY SETRMW .BREADY b9Y CIRDO LINE2 lNE2 WCMD  SAVCRD VCRD LINE -LINE -LINE2 -DSMATH -JREADY ADY CURSOR .CURSOR .SAVVGP JVVGP READY ADY WCMD MD MOVE  VE DOT *DOT *LINETYPE +LINETYPE+READY ;ADY MOVE iVE DRAW ,DRAW ,4PLOT BITDL TDL WCMD MD PLOTB (DPLOTB (=SPLOTB (,READY  RSXCRD RD ZZZZZ1 (ZZZZZ1 (MOVE )MOVE )@\/ CAFILL 'CAFILL 'SPLOTB 'lTB DSMATH FMATH STYMSB '[READY ESTYLSB '\RSXCRD XRD BITDM TDM BTPLOT BITDLP $TDLP STXMSB 'YCAFRSY G FRSY DPLOTB BITY qM4 BITDRW .TDRW STXLSB 'ZBYTDRW TDRW GSETUP [&oTE! BITX