100 REM 'HIRES' CIRCLE - POTENTIAL 110 REM SOURCE FILE BY ANTHONY BRYANT 120 SYS 700 130 .OPT N 140 ; 150 ; 160 ;"HIRES" VARIABLES BY G.KIZIAK 170 X1 = $C027 ;CURRENT POSITION 180 Y1 = $C029 190 X2 = $C02B ;NEW POSITION 200 Y2 = $C02D 210 XC = $C02F ;CIRC CENTRE (ALSO BOX) 220 YC = $C031 230 HM = $C035 ;HIRES/MULTI FLAG 240 ; 250 ; 260 ;"HIRES" INTERNAL SUBROUTINES 270 IGETI =$C17C ;INTERNAL GET INTEGER 280 IEGET =$C187 ;INTERNAL EAT & GET X,Y 290 MOVE =$C26E ;'MOVE' RTN 300 IMOV =$C271 ;INTERNAL MOVETO X1,Y1 310 IPLT =$C375 ;INTERNAL PLOT 320 IDRW =$C42B ;INTERNAL DRAWTO 330 ; 340 ;ZERO PAGE LABELS 350 T1 = $22 360 T2 = $24 370 FLAG = $26 380 X = $27 390 Y = $29 400 PHI = $57 410 PHIY = $59 420 PHIXY = $5B 430 ; 440 *=$8000 ;545 BYTES 450 ; 460 XR .WOR 0 ;X RADIUS 470 YR .WOR 0 ;Y RADIUS 480 X3 .WOR 0 ;POTENTIAL Y 490 Y3 .WOR 0 ;POTENTIAL X 500 ; 510 ;SUBROUTINE MOVETO XC,YC 520 MOVC LDX #3 530 LDA X2,X 540 STA XC,X 550 DEX 560 BPL MOVC+2 570 RTS 580 ; 590 ;SUBROUTINE MOVETO XR,YR 600 MOVR LDX #3 610 LDA X2,X 620 STA XR,X 630 DEX 640 BPL MOVR+2 650 RTS 660 ; 670 ;SYS CIRCLE,XC,YC,XR,YR 680 CIRCLE = * 690 JSR IEGET 700 JSR MOVC ;MOVETO XC,YC 710 JSR IEGET 720 JSR MOVR ;MOVETO XR,YR 730 LDA #0 740 STA FLAG 750 STA PHI 760 STA PHI+1 770 STA Y 780 STA Y+1 790 ; 800 CASES LDA XR 810 STA X ;X=XR 820 CMP YR 830 LDA XR+1 840 STA X+1 850 SBC YR+1 860 BCS LOOP ;BRANCH IF XR >= YR 870 SWAP LDA #$FF 880 STA FLAG 890 LDA YR 900 STA X 910 TAX ;X=YR 920 LDA YR+1 930 STA X+1 940 TAY ;AND SWAP 950 LDA XR 960 STA YR 970 STX XR ; XR WITH YR 980 LDA XR+1 990 STA YR+1 1000 STY XR+1 1010 ; 1020 LOOP = * ;MAIN LOOP START 1030 LDX Y+1 1040 STX PHIY+1 1050 LDA Y 1060 ASL ;PHIY=PHI+Y+Y+1 1070 ROL PHIY+1 1080 SEC 1090 ADC PHI 1100 STA PHIY 1110 LDA PHIY+1 1120 ADC PHI+1 1130 STA PHIY+1 1140 LDX X+1 1150 STX PHIXY+1 1160 LDA X 1170 ASL ;PHIXY=PHIY-X-X+1 1180 ROL PHIXY+1 1190 STA PHIXY 1200 CLC 1210 LDA PHIY 1220 SBC PHIXY 1230 STA PHIXY 1240 LDA PHIY+1 1250 SBC PHIXY+1 1260 STA PHIXY+1 1270 ; 1280 LDA X 1290 LDX X+1 1300 LDY FLAG 1310 BMI ALTN 1320 STA X2 1330 STX X2+1 1340 JSR SCALE 1350 STA Y3 1360 STX Y3+1 1370 LDA Y 1380 LDX Y+1 1390 STA X3 1400 STX X3+1 1410 JSR SCALE 1420 STA Y2 1430 STX Y2+1 1440 JMP DOPLT 1450 ALTN STA Y3 1460 STX Y3+1 1470 JSR SCALE 1480 STA X2 1490 STX X2+1 1500 LDA Y 1510 LDX Y+1 1520 STA Y2 1530 STX Y2+1 1540 JSR SCALE 1550 STA X3 1560 STX X3+1 1570 ; 1580 DOPLT JSR PLOT4 1590 LDA X3 1600 LDX X3+1 1610 STA X2 1620 STX X2+1 1630 LDA Y3 1640 LDX Y3+1 1650 STA Y2 1660 STX Y2+1 1670 JSR PLOT4 1680 ; 1690 INC Y 1700 BNE J1 1710 INC Y+1 ;Y=Y+1 1720 J1 LDA PHIY 1730 LDX PHIY+1 ;PHI=PHIY 1740 STA PHI 1750 STX PHI+1 1760 ABS1 JSR ABSV ;TAKE ABS(PHIY) 1770 STA T2 1780 STX T2+1 1790 LDA PHIXY 1800 LDX PHIXY+1 1810 ABS2 JSR ABSV ;TAKE ABS(PHIXY) 1820 STA T1 1830 STX T1+1 1840 ; 1850 DOIF LDA T1 ;IF ABS(PHIXY) 1860 CMP T2 ; < ABS(PHIY) 1870 LDA T1+1 1880 SBC T2+1 ;THEN ... 1890 BCS ELSE ;ELSE ... 1900 THEN LDA PHIXY 1910 LDX PHIXY+1 1920 STA PHI 1930 STX PHI+1 ;PHI=PHIXY 1940 LDA X 1950 BNE J2 1960 DEC X+1 1970 J2 DEC X ;X=X-1 1980 ELSE LDA X ;IF X >= Y 1990 CMP Y ;THEN LOOP 2000 LDA X+1 2010 SBC Y+1 2020 BCC STOP ;ELSE STOP 2030 JMP LOOP 2040 STOP RTS 2050 ; 2060 ;SUBROUTINE REFLECT POINTS & PLOT 2070 PLOT4 = * 2080 LDA XC 2090 CLC 2100 ADC X2 2110 STA X1 2120 PHA 2130 LDA XC+1 2140 ADC X2+1 2150 STA X1+1 2160 PHA 2170 LDA YC 2180 CLC 2190 ADC Y2 2200 STA Y1 2210 LDA YC+1 2220 ADC Y2+1 2230 STA Y1+1 2240 JSR IPLT 2250 LDA XC 2260 SEC 2270 SBC X2 2280 STA X1 2290 LDA XC+1 2300 SBC X2+1 2310 STA X1+1 2320 JSR IPLT 2330 LDA YC 2340 SEC 2350 SBC Y2 2360 STA Y1 2370 LDA YC+1 2380 SBC Y2+1 2390 STA Y1+1 2400 JSR IPLT 2410 PLA 2420 STA X1+1 2430 PLA 2440 STA X1 2450 JMP IPLT 2460 ; 2470 ;SUBROUTINE ABSOLUTE VALUE 2480 ABSV BPL ABOK 2490 CLC 2500 EOR #$FF 2510 ADC #1 2520 PHA 2530 TXA 2540 EOR #$FF 2550 ADC #0 2560 TAX 2570 PLA 2580 ABOK RTS 2590 ; 2600 ;SUBROUTINE TO SCALE OFFSET 2610 SCALE = * ;T1=T2*YR/XR 2620 STA T2 2630 STX T2+1 2640 LDA #0 2650 STA T1 2660 STA T1+1 2670 LDX #17 2680 CLC ;16 BIT INTEGER MATH 2690 MULLP ROR T1+1 2700 ROR T1 2710 ROR T2+1 2720 ROR T2 2730 BCC DECN1 2740 CLC 2750 LDA YR 2760 ADC T1 2770 STA T1 2780 LDA YR+1 2790 ADC T1+1 2800 STA T1+1 2810 DECN1 DEX 2820 BNE MULLP 2830 LDA XR 2840 ORA XR+1 2850 BEQ ERROR 2860 LDA #0 2870 STA T1 2880 STA T1+1 2890 LDX #16 ;16 BIT INTEGER MATH 2900 DIVLP ROL T2 2910 ROL T2+1 2920 ROL T1 2930 ROL T1+1 2940 SEC 2950 LDA T1 2960 SBC XR 2970 TAY 2980 LDA T1+1 2990 SBC XR+1 3000 BCC DECN2 3010 STY T1 3020 STA T1+1 3030 DECN2 DEX 3040 BNE DIVLP 3050 ROL T2 3060 ROL T2+1 3070 LDA T2 3080 LDX T2+1 3090 RTS 3100 ERROR JMP $BB8A ;"DIVISION BY ZERO" 3110 ; 3120 .END