; ; INDIVIDUAL FUNCTION HANDLER ROUTINES ; DOWN LDA #$02 ; SELECT DOWN COMMAND BPL WCMD ; AND WRITE IT ; ; UP LDA #$03 ; SELECT PEN UP COMMAND BPL WCMD ; AND WRITE IT ; ; CLEAR THE CURRENT SCREEN ; CLEAR: LDA C4COPY ; CHECK NO BAD WRITE MODES AND #5 BNE LONGC BIT COLOUR BPL CLEAR0 LDA COLCOP AND #$55 BEQ CLEAR0 LONGC: LDY #1 ;TO SET ERASER LDA #0 JSR SCREEN JMP PEN ; CLEAR0: LDA #$4 JSR WCMD ; ; PEN LDA #$00 ; SELECT PEN COMMAND BPL WCMD ; AND WRITE IT ; ; ERASER LDA #$01 ; SELECT ERASER BPL WCMD ; AND WRITE IT ; ; HOME LDA #$06 ; SELECT CLS AND X=0,Y=0 ; ; WRITE COMMAND ROUTINE, CHECKS STATUS ; WCMD JSR READY STA CMD ; CHECK STATUS AND WRITE COMMAND RTS ; THE JOB IS COMPLETE ; ; SELECT CYCLIC SCREEN MODE ; CYCLIC LDA CTRL1 ; GET EXISTING VALUE AND #$07 ; MASK OFF BOTTOM BITS ORA #$08 ; AND SET CYCLIC BIT BPL WCTRL1 ; AND WRITE BACK ; ; SELECT CLIPING MODE ; CLIP LDA CTRL1 ; READ EXISTING VALUE AND #$07 ; CLEAR THE BIT BPL WCTRL1 ; AND WRITE BACK ; ; SET SCREEN TO SPECIFIED COLOUR ; FLASH: LDY #0 ; FILL SCREEN LDA #2 ; SET PEN JMP SCREEN ; WCTRL1: JSR READY ; WAIT FOR COMPLETION STA CTRL1 ; 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 ; ; SELECT LINE TYPE ; DRAW JSR GETNUM ; PICK UP NUMBER LDA VALLSB ; LOAD PARAMETER AND #3 ; 0-3 ONLY ALLOWED STA TEMP1 ; SAVE LDA CTRL2 ; GET REGISTER AND #$FC ; MASK REGISTER ORA TEMP1 ; AND PUT IN LINE TYPE STA CTRL2 ; AND WRITE BACK RTS ; DONE IT ; ; SELECT TEXT TYPE, SIZE ETC ; TEXT JSR GETNUM ; GET FIRST NUMBER LDA VALLSB ; PICK UP VALUE AND #$01 ; MASK OFF 0 OR 1 ONLY ASL A ; MOVE TO RIGHT BIT POSITION ASL A STA TEMP1 ; SAVE IN TEMP STORAGE JSR GETCOM ; PROCESS LINE TO NEXT COMMA JSR GETNUM ; AND PICK UP NUMBER LDA VALLSB ; GET VALUE AND #$01 ; AND MASK 0 OR 1 ONLY ASL A ; SHIFT TO RIGHT POSITION ASL A ASL A ORA TEMP1 ; OR IN PREVIOUS BIT STA TEMP1 ; AND SAVE AGAIN LDA CTRL2 ; GET REGISTER AND #$F3 ; MASK BITS FROM REGISTER ORA TEMP1 ; SET NEW BITS STA CTRL2 ; AND WRITE BACK JSR GETCOM ; PROCESS TO NEXT COMMA JSR GETNUM ; THEN GET NEXT NUMBER LDA VALLSB ; PICK UP VALUE AND #$0F ; AND MASK RELEVANT BITS ASL A ; SHIFT TO MS NIBBLE ASL A ASL A ASL A STA TEMP1 ; AND SAVE JSR GETCOM ; PROCESS TO NEXT COMMA JSR GETNUM ; AND GET NEXT NUMBER LDA VALLSB ; PICK UP VALUE AND #$0F ; 0-15 ONLY ORA TEMP1 ; OR IN PREVIOUS VALUE STA CSIZE ; WRITE TO CHARACTER SIZE REGISTER RTS ; DONE IT ; ; PRINT A CHARACTER STRING IN THE SPECIFIED STYLE ; PRINT JSR GETSTR ; GET STRING VAR JSR SETSTR ; AND SET UP POINTERS STA TEMP1 ; STRING LENGTH STX TEMP2 ; STRING POINTER STY TEMP2+1 LDA STRCHK ; PICK UP NUMBER TYPE BEQ PERR ; PRINT SYNTAX ERROR LDY #$0 ; SET UP STRING POINTER LDA TEMP1 ; CHECK STRING LENGTH BEQ PDONE ; NULL STRING ; PLOOP LDA (TEMP2),Y ; GET CHARACTER JSR READY ; CHECK STATUS STA CMD ; WRITE CHARACTER INY ; BUMP POINTER CPY TEMP1 ; DONE ALL CHARACTERS BNE PLOOP ; AND DO THE REST PDONE RTS ; DONE IT ; ; ROUTINE TO DRAW A LINE BETWEEN ANY TWO POINTS ; PLOT CMP #TOKTO ; IS IT 'PLOT TO' BEQ PLTO ; YES DONT GET X1,Y1 JSR MOVE ; SET UP START COORDS JSR CHRGOT ; GET NEXT CHARACTER CMP #TOKTO ; IS IT 'TO' NOW BEQ PLTO ; YES DRAW LINE PERR: JMP SYNERR ; SYNTAX ERROR ; PAGAIN: JSR POINT ; JUMP POINT FOR 2ND ETC "TO"S ; PLTO JSR CHRGET ; MOVE PAST 'TO' JSR GETNUM ; AND GET THE NUMBER LDA VALLSB ; PICK UP VALUE STA XTLSB ; AND SAVE LDA VALMSB ; AND MOST SIGNIFICANT STA XTMSB ; AND SAVE JSR GETCOM ; MOVE PAST COMMA JSR GETNUM ; AND GET NEXT NUMBER LDA VALLSB ; PICK UP Y LSB STA YTLSB ; AND SAVE LDA VALMSB ; MOST SIGNIFICANT BYTE STA YTMSB ; AND SAVE JSR PLOTC ; PLOT THE LINE JSR CHRGOT ; GET NEXT CHARACTER CMP #TOKTO ; IS IT "TO" ? BEQ PAGAIN ; IF SO, PLOT TO NEXT CO-ORD RTS ; 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 ROR DXTLSB CLC ROR DYTMSB ROR DYTLSB LDA DXTMSB ORA DYTMSB ; BOTH < 256 ? BNE DB2LP ; IF NOT DIVIDE AGAIN ; JSR PLAST ; PLOT PART LINE JSR POINT ; FUDGE FOR INVERSE MODE JMP PLOTC ; THEN DO REST OF LINE ; PLAST: LDA DXTLSB ; GET X PROJECTION 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 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 STY 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 DISPLACEMENT 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 OUT CORRECT DISPLACEMENT VALUES EOR #$FF ; IF MINUS, MAKE POSITIVE AND #$0F ; LIMIT TO 12 BITS TAX TYA EOR #$FF TAY INY BNE RET2 INX RET2: LDA #2 ; RETURN 2 IF NEGATIVE DISPLACEMENT RTS RET0: AND #$0F TAX LDA #0 RTS ; ; FIND OUT THE CURRENT SCREEN POSITION ; READ: JSR SAVCRD ; SAVE SCREEN POSITION JSR CHKPRM ; CHECK WE HAVE GOT TWO INTEGERS FOR RETURN PARMS LDX #0 ; FOR X CO-ORDS JSR SAVINT ; STORE X THROUGH (INTPNT) JSR GETCOM ; GET SECOND INTEGER JSR CHKPRM ; SET UP INTEGER VALIDITY AND POINTER LDX #2 ; FOR Y CO-ORDS SAVINT: LDY #0 ; SET POINTER LDA TXM,X ; GET X OR Y MSB FROM TX AND #$0F ; MASK TO RIGHT RANGE STA (INTPNT),Y ; PUT INTO INTEGER INY ; POINT TO NEXT LDA TXL,X ; SECOND HALF OF INTEGER STA (INTPNT),Y ; AND WRITE THAT TOO RTS ; DONE IT ; ; ROUTINE TO CHECK A VALID INTEGER AND SET POINTERS ; CHKPRM JSR GETINT ; ASK APPLE FOR INTEGER LDA STRCHK ; CHECK INTEGER BNE CHKERR ; SYNTAX ERROR CHKP1 LDA STRCHK+1 ; CHECK SECOND VALIDITY CODE BPL CHKERR RTS ; ALL IS OK CHKERR: JMP SYNERR ; SYNTAX ERROR DUFF INTEGER ; ; TEST THE CURRENT POINT TO SEE IF ON OR OFF ; AT JSR SAVCRD ; SAVE CURRENT POSITION JSR MOVE ; SET POINT FROM PARAMETER JSR GETCOM ; GET PAST COMMA JSR CHKPRM ; GET INTEGER AND VALIDATE LDY #$00 ; SET OFFSET TYA ; MSB IS 0 STA (INTPNT),Y ; CLEAR MSB JSR GSETUP ; READ COLOUR FROM SCREEN JSR GETCOL ; GET COLOUR INTO ACC LDY #1 ; WRITE LSB STA (INTPNT),Y ; AND WRITE TO INTEGER JMP RESCRD ; RESTORE OLD POSITION ; 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 COMPLETED ; CMASK: DFB 1,2,4,8,$10,$20,$40,$80 ; GETCOL: BIT COLOUR ; 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 CMASK,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 ; ; MOVE TO A NEW POINT WITHOUT DRAWING ; MOVE JSR GETNUM ; PICK UP X LDA VALMSB ; GET MSB OF POINT AND #$7F ; MAKE POSITIVE STA XMSB ; WRITE TO VGP LDA VALLSB ; GET LSB OF POINT STA XLSB ; WRITE TO VGP JSR GETCOM ; GET PAST NEXT COMMA JSR GETNUM ; THEN THE NUMBER LDA VALMSB ; GET MSB OF ADDRESS AND #$7F ; MAKE POSITIVE STA YMSB ; AND SET Y LDA VALLSB ; GET LSB VALUE STA YLSB ; AND TELL VGP RTS ; DONE IT ; ; SET CURSOR SIZE FOR LATER USE ; STORE JSR GETBYT ; GET SIZE PARAMETER STX XSIZE ; CURSOR SIZE RTS ; DONE IT ; ; DRAW CROSS HAIR CURSOR AT THE ; CURRENT POSITION WITH THE SPECIFIED SIZE ; POS 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 IT LDA XSIZE ; PICK UP SIZE STA DELTAX ; TELL VGP STA DELTAY ; IN BOTH PROJECTIONS 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 REGISTERS ; RESVGP: LDX #2 ; RESTORE VGP STATUS RESVLP: LDA TEMP1,X STA CTRL1,X DEX BPL RESVLP RTS ; ; TABLE OF COMMANDS FOR CURSOR ; CMDTBL DFB $12,$14,$10,$16 ; SETRMW: LDA C4COPY ; SET INVERT WRITE MODE AND #$18 ORA #4 STA CTRL4 BIT COLOUR BPL XSET LDA COLCOP AND #$88 ORA #$44 STA COLREG XSET: RTS ; ; INVERT THE STATE OF EACH PIXEL ON ; THE SCREEN BY INVERTING LARGE ; BLOCKS ; ROUTINE HONOURS PROTECTED PLANES IN COLOUR MODES ; INVERT: JSR SETRMW ; SET INVERT LDY #0 LDA #3 ; SET PEN , DOWN ; SCREEN: PHA JSR SAVVGP ; SAVE POSITION,CTRL1,CTRL2,CSIZE PLA ORA CTRL1 DEY ; IF Y WAS 1 THEN SET ERASER BNE SCRN2 AND #$FD ; THAT IS, CLEAR BIT 1 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 SCREEN 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 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 LINE TXA DEY ; 8LINES PER SCREEN BPL INLOP ; AND LOOP JSR RESCOL ; RESTORE COLOUR REGISTERS JSR RESVGP ; RESTORE CTRL1,CTRL2,CSIZE ; RESCRD: 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 ; 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 ; ; SCREEN ADDRESS TABLES FOR FILL ; ILSBT DFB $00,$40,$80,$C0,$00,$40,$80,$C0 IMSBT DFB $00,$00,$00,$00,$01,$01,$01,$01 LOOPCT: DFB 6 ; USA INTERLACED DFB 7 ; UK INTERLACED DFB 3 ; USA NON-INTERLACED DFB 3 ; UK NON-INTERLACED ; LASTSZ: DFB 8 DFB 0 DFB 4 DFB 0 ; ; SELECT PAGE 1 ; HGR LDA C3COPY ; GET REGISTER COPY AND #$1F ; MASK PAGE 2 BIT BPL HGRSAV ; UPDATE PAGE BIT ; ; SELECT PAGE 2 ; HGR2 LDA C3COPY ; GET REGISTER COPY ORA #$20 HGRSAV: STA C3COPY ; UPDATE COPY STA CTRL3 ; UPDATE REGISTER RTS ; ; SELECT INVERSE MODE ; INVERSE LDA #$44 ; SET ALLINVERTED BPL WINVER ; UPDATE INVER ; ; SELECT NORMAL MODE ; NORMAL LDA #$00 ; RESET COLOUR WINVER: STA TEMP1 ; SAVE LDA C4COPY AND #$18 ORA TEMP1 STA C4COPY STA CTRL4 ; WRITE NEW COLOUR BIT COLOUR BPL XNORM LDA COLCOP ; IF COLOUR THEN AND #$88 ; CHANGE ALSO ORA TEMP1 STA COLCOP STA COLREG XNORM: RTS ; ; PUTCOL - SET WRITE MODE / COLOUR ; LSCON: DFB 1,4,2 MSCON: DFB $10,$40,$20 ; ;COLOUR 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 COLOUR BPL XPUT ; THATS IT IF MONOCHROME PHA ; SAVE NEW SETTING LDA COLCOP AND #$88 ROR TEMP1 BCC PDATA2 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 ; WPRCNT: LDA #0 ; SET ADDITIVE COLOUR BPL PUTW ; INVCNT: LDA #1 ; SET INVERT COLOUR BPL PUTW ; DATCNT: LDA #2 ; SET ABSOLUTE COLOUR PUTW: PHA JSR GETNUM ; GET COLOUR LDA VALLSB STA TEMP1 ; SAVE FOR PUTCOL PLA TAY ; SET Y TO MODE JSR PUTCOL ; THEN SET REGISTERS STA C4COPY ; SET COPY BIT COLOUR ; COLOUR MODE ? BPL XPUTWD STY COLCOP ; SAVE COLOUR COPY XPUTWD: RTS ; ;ASC - A SPECIAL COLOUR ALLOWS ;THE SETTING OF ANY WRITE MODE ;COMBINATION. ; ASC: JSR GETNUM ; NUMBER FOR RED PLANE LDA VALLSB AND #7 STA VALLSB LDA C4COPY ; GET COPY AND #$18 ORA VALLSB STA C4COPY STA CTRL4 ; SET NEW WRITE MODE (RED) BIT COLOUR ; COLOUR MODE / BPL XASC JSR GETCOM ; SKIP COMMA JSR GETNUM ; NUMBER FOR GREEN PLANE LDA VALLSB AND #7 STA TEMP1 ; TEMP SAVE GREEN JSR GETCOM ; SKIP COMMA JSR GETNUM ; NUMBER FOR BLUE PLANE LDA VALLSB ASL A ASL A ASL A ASL A ; SHIFT INTO MS NIBL AND #$70 ORA TEMP1 STA TEMP1 LDA COLCOP ; GET COPY AND #$88 ORA TEMP1 ; SET NEW WRITE MODES STA COLCOP STA COLREG XASC: RTS ; ; CIRCLE PLOT ROUTINES ; USING BRESENHAM'S CIRCLE ALGORITHM ; CALL FROM BASIC BY: ; &S R FOR CIRCLE ; &F R FOR FILLED CIRCLE ; R DEFINES THE RADIUS ; POSITION SET BEFORE CALL IS USED AS THE CENTRE POINT ; POSITION RESET TO CENTRE POINT AFTER CALL ; ; ; CIRCLE PLOT ROUTINE ; CIRCLE: LDA #0 ; SET OUTLINE MODE BEQ CIRDO ; DO CIRCLE FILLED: LDA #1 ; SET FILLED MODE CIRDO: STA CSTAT ; SAVE OUTLINE/FILL STATUS JSR SAVCRD ; GET PRESENT 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 JSR GETNUM ; PICK UP RADIUS LDA VALMSB AND #$7F ; RADIUS MUST BE POSITIVE STA DYCMSB LDA VALLSB STA DYCLSB ORA DYCMSB 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 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 ; DECREMENT 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 ERROR 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 = 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 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 CENTRE 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 CSTAT ; 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 FOR 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 FDO1: 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 ; POINT8: JSR CXPX JSR CYPY ; PLOT CX+DXC,CY+DYC JSR POINT JSR CXMY JSR CYPX ; PLOT CX-DYC,CY+DXC JSR POINT JSR CXMX JSR CYMY ; PLOT CX-DXC,CY-DYC JSR POINT JSR CXPY JSR CYMX ; PLOT CX+DYC,CY-DXC JSR POINT ; POINT4: JSR CXPY JSR CYPX ; PLOT CX+DYC,CY+DXC JSR POINT JSR CXMX JSR CYPY ; PLOT CX+DXC,CY+DYC JSR POINT JSR CXMY JSR CYMX ; PLOT CX-DYC,CY-DXC JSR POINT JSR CXPX JSR CYMY ; PLOT CX+DXC,CY-DYC ; POINT: LDA #$88 JMP WCMD ; PLOT THE POINT ; TSAVE: LDX #3 ; COPY DXC,DYC TO TXC,TYC 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 THE 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 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 CXEND: 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 ; CYMX: 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 YCLSB ; 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 RTS ; M2ADD3: TYA ; XY = XY + XY + 3 ASL A TAY TXA ROL A TAX TYA CLC ADC #3 TAY BCC NCY INX NCY: RTS ; ; EXTRA ROUTINES FOR VGP][ ; ;APPLEV - DISPLAY APPLE VIDEO ; APPLEV: LDA C3COPY AND #$3B ; MASK OUT OLD BIT BPL RVIDEO ; RESTORE ; ;VGPV - DISPLAY VGP VIDEO VGPV: LDA C3COPY ORA #4 ; SET VGP VIDEO RVIDEO: STA C3COPY STA CTRL3 RTS ; ;INTERL - SELECT INTERLACED OR NON-INTERLACED ; OPERATION ; &INT P ; P=0 FOR NON-INTERLACED, P=1 FOR INTERLACED ; INTERL: JSR GETNUM LDA C3COPY AND #$3D ; MASK OUT OLD INTERLACED BIT ROR VALLSB ; GET LS BIT BCS RVIDEO ORA #2 ; SET NON-INTERLACED BNE RVIDEO ; ; SUBPAG - SELECT SUBPAGE USE IN NON-INTERLACED MODE ; &ON S ; S=0 FOR SUBPAGE 0, S=1 FOR SUBPAGE 1 ; SUBPAG: JSR GETNUM LDA C3COPY AND #$2F ; MASK OUT OLD SUBPAGE ROR VALLSB ; ROTATE LS BIT INTO CARRY BCC RVIDEO ORA #$10 ; SET SUBPAGE BIT BNE RVIDEO ; ; BORDER - SET BORDER COLOUR ; &OR C ; MONOCHROME: C=1 BLACK, C=0 WHITE ; COLOUR: C=7 BLACK, C=6 RED, C=5 GREEN, C=3 BLUE ; BORDER: JSR GETNUM LDA C4COPY ; GET SAVED COPY AND #$17 ; MASK OUT BORDER ROR VALLSB BCC BOR1 ORA #8 ; OR IN BLACK BOR1: STA C4COPY ; SET NEW BORDER STA CTRL4 BIT COLOUR ; COLOUR ? BPL XBOR ; EXIT IF NOT LDA VALLSB 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: DFB 0,8,$80,$88 ; SCRLUP: DEC CYCOPY ; SCROLL UP JMP SETPAN ; SCRLDN: INC CYCOPY ; SCROLL DOWN JMP SETPAN ; PANRIT: DEC CXCOPY ; PAN RIGHT JMP SETPAN ; PANLFT: INC CXCOPY ; PAN LEFT JMP SETPAN ; PANSET: JSR GETBYT STX CXCOPY JMP SETPAN ; SCRSET: JSR GETBYT STX CYCOPY ; SETPAN: LDA STATUS AND #2 ; WRITE FOR PAGE BLANK BEQ SETPAN LDA CXCOPY STA PAN LDA CYCOPY STA SCROLL RTS ; ; SELECT DISPLAY FORMAT + COLOUR OPERATION ; &FOR A,C ; A=0 FOR US, A=1 FOR UK FORMAT ; C=0 FOR MONO, C=1 FOR COLOUR ; FORMAT: JSR GETNUM LDA C3COPY ; PRESENT FORMAT ROR A ; ROTATE LS OFF ROR VALLSB ; REPLACE WITH NEW ROL A ; ROTATE BACK IN STA CTRL3 ; SET NEW FORMAT STA C3COPY JSR GETCOM ; SKIP COMMA JSR GETNUM ; GET COLOUR/MONO ROR VALLSB ; LS BIT INTO CARRY ROR COLOUR ; SET COLOUR FLAG ; ; NEW - INITIALISE VGP ; NEW: LDA #$10 ; INIT CURSOR SIZE STA XSIZE LDA #0 STA CXCOPY STA CYCOPY JSR SETPAN LDA #$88 ; CLEAR BORDER STA C4COPY STA COLCOP JSR NORMAL ; RESET COLOUR LDA C3COPY AND #3 STA C3COPY LDA #1 ; UK , 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 JSR WCMD ; CLEAR PAGE 1, VGP REGS JSR READY LDA C3COPY STA CTRL3 ; RESTORE FORMAT LDA #3 STA CTRL1 ; PEN ON, PEN DOWN RTS LDA #$88 ; CLEAR BORDER STA C4COPY STA COLCOP JMP NORMAL ; RESET COLOUR LST OFF