goapple2/source/applesoft/S.F49C
2014-05-09 17:59:16 -07:00

224 lines
8.7 KiB
Plaintext

1010 *--------------------------------
1020 * "XDRAW" ONE BIT
1030 *--------------------------------
1040 LRUDX1 CLC C=0 MEANS NO 90 DEGREE ROTATION
1050 LRUDX2 LDA HGR.DX+1 C=1 MEANS ROTATE 90 DEGREES
1060 AND #4 IF BIT2=0 THEN DON'T PLOT
1070 BEQ LRUD4 YES, DO NOT PLOT
1080 LDA #$7F NO, LOOK AT WHAT IS ALREADY THERE
1090 AND MON.HMASK
1100 AND (MON.GBASL),Y SCREEN BIT = 1?
1110 BNE LRUD3 YES, GO CLEAR IT
1120 INC HGR.COLLISIONS NO, COUNT THE COLLISION
1130 LDA #$7F AND TURN THE BIT ON
1140 AND MON.HMASK
1150 BPL LRUD3 ...ALWAYS
1160 *--------------------------------
1170 * "DRAW" ONE BIT
1180 *--------------------------------
1190 LRUD1 CLC C=0 MEANS NO 90 DEGREE ROTATION
1200 LRUD2 LDA HGR.DX+1 C=1 MEANS ROTATE
1210 AND #4 IF BIT2=0 THEN DO NOT PLOT
1220 BEQ LRUD4 DO NOT PLOT
1230 LDA (MON.GBASL),Y
1240 EOR HGR.BITS 1'S WHERE ANY BITS NOT IN COLOR
1250 AND MON.HMASK LOOK AT JUST THIS BIT POSITION
1260 BNE LRUD3 THE BIT WAS ZERO, SO PLOT IT
1270 INC HGR.COLLISIONS BIT IS ALREADY 1; COUNT COLLSN
1280 *--------------------------------
1290 * TOGGLE BIT ON SCREEN WITH (A)
1300 *--------------------------------
1310 LRUD3 EOR (MON.GBASL),Y
1320 STA (MON.GBASL),Y
1330 *--------------------------------
1340 * DETERMINE WHERE NEXT POINT WILL BE, AND MOVE THERE
1350 * C=0 IF NO 90 DEGREE ROTATION
1360 * C=1 ROTATES 90 DEGREES
1370 *--------------------------------
1380 LRUD4 LDA HGR.DX+1 CALCULATE THE DIRECTION TO MOVE
1390 ADC HGR.QUADRANT
1400 AND #3 WRAP AROUND THE CIRCLE
1410 CON.03 .EQ *-1 (( A CONSTANT ))
1420 *
1430 * 00 -- UP
1440 * 01 -- DOWN
1450 * 10 -- RIGHT
1460 * 11 -- LEFT
1470 *
1480 CMP #2 C=0 IF 0 OR 1, C=1 IF 2 OR 3
1490 ROR PUT C INTO SIGN, ODD/EVEN INTO C
1500 BCS MOVE.LEFT.OR.RIGHT
1510 *--------------------------------
1520 MOVE.UP.OR.DOWN
1530 BMI MOVE.DOWN SIGN FOR UP/DOWN SELECT.
1540 *--------------------------------
1550 * MOVE UP ONE PIXEL
1560 * IF ALREADY AT TOP, GO TO BOTTOM
1570 *
1580 * REMEMBER: Y-COORD GBASH GBASL
1590 * ABCDEFGH PPPFGHCD EABAB000
1600 *--------------------------------
1610 CLC MOVE UP
1620 LDA MON.GBASH CALC. BASE ADDRESS OF PREV. LINE
1630 BIT CON.1C LOOK AT BITS 000FGH00 IN GBASH
1640 BNE .5 SIMPLE, JUST FGH=FGH-1
1650 * GBASH=PPP000CD, GBASL=EABAB000
1660 ASL MON.GBASL WHAT IS "E"?
1670 BCS .3 E=1, THEN EFGH=EFGH-1
1680 BIT CON.03 LOOK AT 000000CD IN GBASH
1690 BEQ .1 Y-POS IS AB000000 FORM
1700 ADC #$1F CD <> 0, SO CDEFGH=CDEFGH-1
1710 SEC
1720 BCS .4 ...ALWAYS
1730 .1 ADC #$23 ENOUGH TO MAKE GBASH=PPP11111 LATER
1740 PHA SAVE FOR LATER
1750 LDA MON.GBASL GBASL IS NOW ABAB0000 (AB=00,01,10)
1760 ADC #$B0 0000+1011=1011 AND CARRY CLEAR
1770 * OR 0101+1011=0000 AND CARRY SET
1780 * OR 1010+1011=0101 AND CARRY SET
1790 BCS .2 NO WRAP-AROUND NEEDED
1800 ADC #$F0 CHANGE 1011 TO 1010 (WRAP-AROUND)
1810 .2 STA MON.GBASL FORM IS NOW STILL ABAB0000
1820 PLA PARTIALLY MODIFIED GBASH
1830 BCS .4 ...ALWAYS
1840 .3 ADC #$1F
1850 .4 ROR MON.GBASL SHIFT IN E, TO GET EABAB000 FORM
1860 .5 ADC #$FC FINISH GBASH MODS
1870 UD.1 STA MON.GBASH
1880 RTS
1890 *--------------------------------
1900 CLC <<<NEVER USED>>>
1910 *--------------------------------
1920 * MOVE DOWN ONE PIXEL
1930 * IF ALREADY AT BOTTOM, GO TO TOP
1940 *
1950 * REMEMBER: Y-COORD GBASH GBASL
1960 * ABCDEFGH PPPFGHCD EABAB000
1970 *--------------------------------
1980 MOVE.DOWN
1990 LDA MON.GBASH TRY IT FIRST, BY FGH=FGH+1
2000 ADC #4 GBASH = PPPFGHCD
2010 CON.04 .EQ *-1 (( CONSTANT ))
2020 BIT CON.1C IS FGH FIELD NOW ZERO?
2030 BNE UD.1 NO, SO WE ARE FINISHED
2040 * YES, RIPPLE THE CARRY AS HIGH
2050 * AS NECESSARY
2060 ASL MON.GBASL LOOK AT "E" BIT
2070 BCC .2 NOW ZERO; MAKE IT 1 AND LEAVE
2080 ADC #$E0 CARRY = 1, SO ADDS $E1
2090 CLC IS "CD" NOT ZERO?
2100 BIT CON.04 TESTS BIT 2 FOR CARRY OUT OF "CD"
2110 BEQ .3 NO CARRY, FINISHED
2120 * INCREMENT "AB" THEN
2130 * 0000 --> 0101
2140 * 0101 --> 1010
2150 * 1010 --> WRAP AROUND TO LINE 0
2160 LDA MON.GBASL 0000 0101 1010
2170 ADC #$50 0101 1010 1111
2180 EOR #$F0 1010 0101 0000
2190 BEQ .1
2200 EOR #$F0 0101 1010
2210 .1 STA MON.GBASL NEW ABAB0000
2220 LDA HGR.PAGE WRAP AROUND TO LINE ZERO OF GROUP
2230 BCC .3 ...ALWAYS
2240 .2 ADC #$E0
2250 .3 ROR MON.GBASL
2260 BCC UD.1 ...ALWAYS
2270 *--------------------------------
2280 * HLINRL IS NEVER CALLED BY APPLESOFT
2290 *
2300 * ENTER WITH: (A,X) = DX FROM CURRENT POINT
2310 * (Y) = DY FROM CURRENT POINT
2320 *--------------------------------
2330 HLINRL PHA SAVE (A)
2340 LDA #0 CLEAR CURRENT POINT SO HGLIN WILL
2350 STA HGR.X ACT RELATIVELY
2360 STA HGR.X+1
2370 STA HGR.Y
2380 PLA RESTORE (A)
2390 *--------------------------------
2400 * DRAW LINE FROM LAST PLOTTED POINT TO (A,X),(Y)
2410 *
2420 * ENTER WITH: (A,X) = X OF TARGET POINT
2430 * (Y) = Y OF TARGET POINT
2440 *--------------------------------
2450 HGLIN PHA COMPUTE DX = X- X0
2460 SEC
2470 SBC HGR.X
2480 PHA
2490 TXA
2500 SBC HGR.X+1
2510 STA HGR.QUADRANT SAVE DX SIGN (+ = RIGHT, - = LEFT)
2520 BCS .1 NOW FIND ABS (DX)
2530 PLA FORMS 2'S COMPLEMENT
2540 EOR #$FF
2550 ADC #1
2560 PHA
2570 LDA #0
2580 SBC HGR.QUADRANT
2590 .1 STA HGR.DX+1
2600 STA HGR.E+1 INIT HGR.E TO ABS(X-X0)
2610 PLA
2620 STA HGR.DX
2630 STA HGR.E
2640 PLA
2650 STA HGR.X TARGET X POINT
2660 STX HGR.X+1
2670 TYA TARGET Y POINT
2680 CLC COMPUTE DY = Y-HGR.Y
2690 SBC HGR.Y AND SAVE -ABS(Y-HGR.Y)-1 IN HGR.DY
2700 BCC .2 (SO + MEANS UP, - MEANS DOWN)
2710 EOR #$FF 2'S COMPLEMENT OF DY
2720 ADC #$FE
2730 .2 STA HGR.DY
2740 STY HGR.Y TARGET Y POINT
2750 ROR HGR.QUADRANT SHIFT Y-DIRECTION INTO QUADRANT
2760 SEC COUNT = DX -(-DY) = # OF DOTS NEEDED
2770 SBC HGR.DX
2780 TAX COUNTL IS IN X-REG
2790 LDA #$FF
2800 SBC HGR.DX+1
2810 STA HGR.COUNT
2820 LDY HGR.HORIZ HORIZONTAL INDEX
2830 BCS MOVEX2 ...ALWAYS
2840 *--------------------------------
2850 * MOVE LEFT OR RIGHT ONE PIXEL
2860 * (A) BIT 6 HAS DIRECTION
2870 *--------------------------------
2880 MOVEX ASL PUT BIT 6 INTO SIGN POSITION
2890 JSR MOVE.LEFT.OR.RIGHT
2900 SEC
2910 *--------------------------------
2920 * DRAW LINE NOW
2930 *--------------------------------
2940 MOVEX2 LDA HGR.E CARRY IS SET
2950 ADC HGR.DY E = E-DELTY
2960 STA HGR.E NOTE: DY IS (-DELTA Y)-1
2970 LDA HGR.E+1 CARRY CLR IF HGR.E GOES NEGATIVE
2980 SBC #0
2990 .1 STA HGR.E+1
3000 LDA (MON.GBASL),Y
3010 EOR HGR.BITS PLOT A DOT
3020 AND MON.HMASK
3030 EOR (MON.GBASL),Y
3040 STA (MON.GBASL),Y
3050 INX FINISHED ALL THE DOTS?
3060 BNE .2 NO
3070 INC HGR.COUNT TEST REST OF COUNT
3080 BEQ RTS.22 YES, FINISHED.
3090 .2 LDA HGR.QUADRANT TEST DIRECTION
3100 BCS MOVEX NEXT MOVE IS IN THE X DIRECTION
3110 JSR MOVE.UP.OR.DOWN IF CLR, NEG, MOVE
3120 CLC E = E+DX
3130 LDA HGR.E
3140 ADC HGR.DX
3150 STA HGR.E
3160 LDA HGR.E+1
3170 ADC HGR.DX+1
3180 BVC .1 ...ALWAYS
3190 *--------------------------------
3200 MSKTBL .HS 8182848890A0C0
3210 *--------------------------------
3220 CON.1C .HS 1C MASK FOR "FGH" BITS
3230 *--------------------------------