-
Notifications
You must be signed in to change notification settings - Fork 2
Expand file tree
/
Copy pathAppleII.txt
More file actions
252 lines (229 loc) · 8.91 KB
/
AppleII.txt
File metadata and controls
252 lines (229 loc) · 8.91 KB
1
100 REM BASIC Month 6: The Mandelbaum Set110 REM http://reddit.com/r/RetroBattlestations120 REM written by FozzTexx130 REM "You think you're better than me?"140 LOMEM:24576200 REM === Initialize variables and constants210 PI = 3.14159265359:DIM PT(128)220 GO(0) = 33:GO(1) = 138:GO(2) = 200230 CM(0) = 1:CM(1) = 0:CM(2) = 0240 CM(3) = 0:CM(4) = 1:CM(5) = 0250 CM(6) = 0:CM(7) = 0:CM(8) = 1260 GW = GO(2) * GO(2) / GO(1)270 TH = GO(2) + 5:GOSUB 2630:TH = TH + SZ(1):GOSUB 2630:TH = TH + SZ(1)280 RZ(0) = 280:RZ(1) = 192:REM Width & height of screen290 SX = (RZ(0) - RZ(0) * 0.05) / GW:SY = (RZ(1) - RZ(1) * 0.07) / TH300 SK = SX:IF SY < SK THEN SK = SY310 HGR2:POKE 49234,0:HCOLOR= 3320 REM "What in holy hell?"330 X = -GW / 2:Y = -GO(2) / 2:GOSUB 2030:REM Translate340 X = SK:Y = SK:GOSUB 2230:REM Scale350 X = RZ(0) / 2:Y = RZ(1) / 2:GOSUB 2030:REM Translate360 GOSUB 2820370 RESTORE:REM Reset reading of DATA back to first object380 GOSUB 2630:GOSUB 2720390 GOSUB 2630400 X = (GW - SZ(0)) * SK:Y = (GO(2) + SZ(1) + 5) * SK410 GOSUB 2030:GOSUB 2720:GOSUB 2920420 GOSUB 2630430 GX = GO(1) / 2:GY = GO(2) / 2:GB = GY - GX:OO = GO(2) * GO(2) / GO(1) - GO(1)440 GOSUB 4510500 REM "Step aside, string bean."510 X = -RZ(0) / 2:Y = -RZ(1) / 2:GOSUB 2030:REM Translate520 A = PI / 2:GOSUB 2130:REM Rotate530 X = GO(1) / GO(2):Y = X:GOSUB 2230:REM Scale540 X = RZ(0) / 2 + (GW / 2 - GO(1) / 2) * SK:Y = RZ(1) / 2:GOSUB 2030:REM Translate550 GOSUB 4510560 IF HT > 1 THEN GOTO 510570 GOSUB 4610999 END1000 REM === Update current transformation matrix1010 REM - Input: 3x3 matrix in 1D array NT1020 REM - Updates 3x3 Matrix in 1D array CM1030 FOR R = 0 TO 2:FOR C = 0 TO 21040 NM(R * 3 + C) = 01050 FOR K = 0 TO 21060 NM(R * 3 + C) = NM(R * 3 + C) + NT(R * 3 + K) * CM(K * 3 + C)1070 NEXT K, C, R1080 FOR K = 0 TO 3 * 3 - 1:CM(K) = NM(K):NEXT K1090 RETURN2000 REM === Translate - move origin2010 REM - Input: X, Y2020 REM - Updates current transformation matrix in CM2030 NT(0) = 1:NT(1) = 0:NT(2) = X2040 NT(3) = 0:NT(4) = 1:NT(5) = Y2050 NT(6) = 0:NT(7) = 0:NT(8) = 12060 GOSUB 10302070 RETURN2100 REM === Rotate - rotate drawing space2110 REM - Input: Angle in radians in A2120 REM - Updates current transformation matrix in CM2130 NT(0) = COS(A):NT(1) = -SIN(A):NT(2) = 02140 NT(3) = -NT(1):NT(4) = NT(0):NT(5) = 02150 NT(6) = 0:NT(7) = 0:NT(8) = 12160 GOSUB 10302170 RETURN2200 REM === Scale - modify unit lengths of drawing2210 REM - Input: X, Y2220 REM - Updates current transformation matrix in CM2230 NT(0) = X:NT(1) = 0:NT(2) = 02240 NT(3) = 0:NT(4) = Y:NT(5) = 02250 NT(6) = 0:NT(7) = 0:NT(8) = 12260 GOSUB 10302270 RETURN2300 REM === Transform single point using current transformation matrix2310 REM - Input: X, Y2320 REM - Returns transformed point in X and Y2330 NT(0) = X:NT(1) = Y:NT(2) = 12340 FOR R = 0 TO 22350 NM(R) = 02360 FOR K = 0 TO 22370 NM(R) = NM(R) + NT(K) * CM(R * 3 + K)2380 NEXT K, R2390 X = NM(0):Y = NM(1)2400 RETURN2500 REM === Draw line2510 REM - Input: X1,Y1 X2,Y22520 X = X1:Y = Y1:GOSUB 2330:A1 = X:B1 = Y2530 X = X2:Y = Y2:GOSUB 2330:A2 = X:B2 = Y2540 HPLOT A1,B1 TO A2,B22550 RETURN2600 REM === Load object from DATA2610 REM - Reads the next object from DATA and leaves size in array SZ2620 REM and paths in array PT2630 ZI = 0:READ ZX:SZ(0) = ZX:READ ZY:SZ(1) = ZY2640 READ ZC:PT(ZI) = ZC:ZI = ZI + 12650 IF ZC = 0 THEN RETURN2660 FOR ZJ = 1 TO ZC:READ ZX:READ ZY2670 PT(ZI) = ZX:ZI = ZI + 1:PT(ZI) = ZY:ZI = ZI + 12680 NEXT ZJ2690 GOTO 26402700 REM === Draw path2710 REM - Input: paths to draw in array PT2720 ZI = 02730 ZC = PT(ZI):ZI = ZI + 1:IF ZC = 0 THEN RETURN2740 X1 = PT(ZI):ZI = ZI + 1:Y1 = PT(ZI):ZI = ZI + 12750 FOR ZJ = 1 TO ZC - 12760 X2 = PT(ZI):ZI = ZI + 1:Y2 = PT(ZI):ZI = ZI + 12770 GOSUB 25202780 X1 = X2:Y1 = Y2:NEXT ZJ2790 GOTO 27302800 REM == Save current transformation matrix2810 REM Copies array CM to array OM2820 FOR I = 0 TO 8:OM(I) = CM(I):NEXT I2830 RETURN2900 REM == Restore transformation matrix2910 REM Copies array OM to array CM2920 FOR I = 0 TO 8:CM(I) = OM(I):NEXT I2930 RETURN3000 REM Mandelbaum arc3010 REM - Input: Arc center at CX,CY; Start/end radians in SA,EA3020 REM "If you want to live in a butcher shop, I'm gonna treat you like a piece of meat."3030 IF (EA < SA) THEN EA = EA + 2 * PI3040 NW = SZ(0):NH = SZ(1):NS = GO(0) / NW:SH = NH * NS3050 RO = GO(1) / 2:RI = RO - GO(0)3060 AL = (EA - SA) * GO(1) / 2:SG = INT(AL / SH)3070 GA = (EA - SA) / SG3080 GC = COS(2 * PI - GA):GS = SIN(2 * PI - GA):ZC = COS(0):ZS = SIN(0)3090 F1 = CX + RI * GC:G1 = CY + RI * GS3100 F2 = CX + RO * GC:G2 = CY + RO * GS3110 F3 = CX + RI * ZC:G3 = CY + RI * ZS3120 F4 = CX + RO * ZC:G4 = CY + RO * ZS3130 D1 = F3 - F1:D2 = G3 - G1:D3 = F4 - F2:D4 = G4 - G23140 L1 = SQR(D1 * D1 + D2 * D2):L2 = SQR(D3 * D3 + D4 * D4)3150 GOSUB 28203160 X = CX:Y = CY:GOSUB 2330:AX = X:AY = Y3170 REM Walk through PT and draw3180 FOR SN = 0 TO SG - 13190 GOSUB 29203200 X = -AX:Y = -AY:GOSUB 2030:REM Translate3210 A = 2 * PI - (SA + SN * GA):GOSUB 2130:REM Rotate3220 X = AX:Y = AY:GOSUB 2030:REM Translate3230 ZI = 03240 ZC = PT(ZI):ZI = ZI + 1:IF ZC = 0 THEN GOTO 33503250 X1 = PT(ZI) * NS:ZI = ZI + 13260 Y1 = PT(ZI) * NS * (L1 - 1 + (L2 - L1 - 1) * (X1 / GO(0))) / L2:ZI = ZI + 13270 X1 = X1 + CX + RI:Y1 = Y1 + CY3280 FOR ZJ = 1 TO ZC - 13290 X2 = PT(ZI) * NS:ZI = ZI + 13300 Y2 = PT(ZI) * NS * (L1 - 1 + (L2 - L1 - 1) * (X2 / GO(0))) / L2:ZI = ZI + 13310 X2 = X2 + CX + RI:Y2 = Y2 + CY3320 GOSUB 25203330 X1 = X2:Y1 = Y2:NEXT ZJ3340 GOTO 32403350 NEXT SN3360 GOSUB 29203370 RETURN4000 REM Mandelbaum line4010 REM - Input: Start and end diagonal corners in X1,Y1 and X2,Y24020 REM "Wrong attitude, you're not bringing that trash into my house."4030 NW = SZ(0):NH = SZ(1) + 14040 XD = X2 - X1:YD = Y2 - Y14050 IF XD > 0 AND YD < 0 THEN A = 0:WD = XD:HT = YD4060 IF XD < 0 AND YD < 0 THEN A = 1.5 * PI:HT = XD:WD = YD4070 IF XD < 0 AND YD > 0 THEN A = PI:WD = XD:HT = YD4080 IF XD > 0 AND YD > 0 THEN A = 0.5 * PI:HT = XD:WD = YD4090 WD = ABS(WD):HT = ABS(HT)4100 NS = WD / NW:SH = INT(NH * NS)4110 SG = INT((HT + SH - 1) / SH):SH = HT / SG4120 SX = GO(0) / NW:SY = SH / NH4130 GOSUB 28204140 AX = X1:AY = Y1:X = X1:Y = Y1:GOSUB 2330:OX = X:OY = Y4150 X = X2:Y = Y2:GOSUB 2330:XD = X - OX:YD = Y - OY4160 X = 0:Y = 0:GOSUB 23304170 X = -X:Y = -Y:GOSUB 2030:REM Translate4180 GOSUB 2130:REM Rotate4190 X = SX:Y = SY4200 IF (XD < 0 AND YD < 0) OR (XD > 0 AND YD > 0) THEN Y = SX:X = SY4210 GOSUB 2230:REM Scale4220 X = OX:Y = OY:GOSUB 2030:REM Translate4230 REM Walk through PT and draw4240 FOR SN = 0 TO SG - 14250 ZI = 04260 ZC = PT(ZI):ZI = ZI + 1:IF ZC = 0 THEN GOTO 43504270 X1 = PT(ZI):ZI = ZI + 14280 Y1 = PT(ZI) * (SH - 1) / SH:ZI = ZI + 14290 FOR ZJ = 1 TO ZC - 14300 X2 = PT(ZI):ZI = ZI + 14310 Y2 = PT(ZI) * (SH - 1) / SH - SN * (SH / SY):ZI = ZI + 14320 GOSUB 25204330 X1 = X2:Y1 = Y2:NEXT ZJ4340 GOTO 42604350 NEXT SN4360 GOSUB 29204370 REM Return height to decide if it's time to stop4380 X = AX:Y = AY + SH:GOSUB 23304390 HT = SQR((X - OX) * (X - OX) + (Y - OY) * (Y - OY))4400 RETURN4500 REM === G4510 CX = GX:CY = GY - GB:SA = 0:EA = PI:GOSUB 30304520 X1 = GO(0):Y1 = GY - GB:X2 = 0:Y2 = GY + GB:GOSUB 40304530 CX = GX:CY = GY + GB:SA = PI:EA = 0:GOSUB 30304540 X1 = GO(1):Y1 = GY + GB:X2 = GX:Y2 = GY + GB - GO(0):GOSUB 40304550 RETURN4600 REM === O4610 CX = GX + OO:CY = GY - GB:SA = 0:EA = PI:GOSUB 30304620 X1 = GO(0) + OO:Y1 = GY - GB:X2 = OO:Y2 = GY + GB:GOSUB 40304630 CX = GX + OO:CY = GY + GB:SA = PI:EA = 0:GOSUB 30304640 X1 = GO(1) - GO(0) + OO:Y1 = GY + GB:X2 = GO(1) + OO:Y2 = GY - GB:GOSUB 40304650 RETURN9000 REM "All aboard the pain train."9010 DATA 39,16,15,3,-16,0,-16,0,-13,3,-13,3,-3,0,-3,0,0,10,0,10,-3,6,-39020 DATA 6,-13,10,-13,10,-16,6,-16,3,-16,11,16,-16,12,-16,12,-13,16,-139030 DATA 16,0,19,0,19,-13,23,-13,23,-16,19,-16,16,-16,5,25,-16,27,-169040 DATA 27,-13,25,-13,25,-16,19,36,-9,33,-10,32,-11,34,-13,36,-12,399050 DATA -12,34,-16,30,-14,29,-11,32,-7,35,-6,36,-5,34,-3,32,-4,29,-49060 DATA 34,0,38,-1,39,-5,36,-9,09070 DATA 53,16,15,23,-13,23,-16,20,-16,16,-16,13,-16,13,-13,16,-13,169080 DATA -3,13,-3,13,0,23,0,23,-3,20,-3,20,-13,23,-13,18,53,-13,53,-169090 DATA 46,-16,43,-16,43,-13,43,-10,43,-6,43,-3,43,0,53,0,53,-3,46,-39100 DATA 46,-6,51,-6,51,-10,46,-10,46,-13,53,-13,11,10,-16,7,-16,3,-169110 DATA 0,-16,0,-13,3,-13,3,0,7,0,7,-13,10,-13,10,-16,14,37,-16,33,-99120 DATA 29,-16,26,-16,26,0,29,0,29,-10,32,-4,34,-4,37,-10,37,0,40,0,409130 DATA -16,37,-16,09140 DATA 52,8,5,0,0,0,-8,3,-4,5,-8,5,0,3,10,0,8,-8,6,0,2,7,-4,9,-4,4,119150 DATA 0,11,-8,15,0,15,-8,6,18,-8,16,-8,16,0,18,0,20,-4,18,-8,2,23,-49160 DATA 21,-4,4,25,-8,21,-8,21,0,25,0,3,31,0,26,0,26,-8,12,32,-4,35,-49170 DATA 36,-5,36,-7,35,-8,32,-8,32,0,35,0,35,0,36,-1,36,-3,35,-4,3,419180 DATA 0,39,-8,37,0,2,38,-4,40,-4,6,42,-8,42,-1,44,0,45,0,47,-1,47,-89190 DATA 5,48,0,48,-8,50,-4,52,-8,52,0,0