forked from RetroBattlestations/Terraspin
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathCommodore64.txt
More file actions
142 lines (121 loc) · 4.3 KB
/
Commodore64.txt
File metadata and controls
142 lines (121 loc) · 4.3 KB
1
100 REM BASIC Month: Terraspin110 REM http://reddit.com/r/RetroBattlestations120 REM written by FozzTexx - Commodore 64 port by FozzTexx130 REM Commodore 64 BASIC has bitwise operators so much of the line140 REM clipping logic is simplified compared to the Apple II version.150 REM The Commodore 64 has *no* graphics commands at all. All graphics160 REM has to be done using PEEKs and POKEs. Line drawing is handled by170 REM a complicated routine at 1500. Individual pixels are then plotted180 REM with the routine at 1700.200 REM === Initialize variables210 SW = 320:SH = 200:XS = SW / 1000:YS = (SH * 4) / (1000 * 3)220 SW = SW - 1:SH = SH - 1230 PI = 3.14159250 REM === Set turtle start at center of screen pointing up, pen up260 TX = 500:TY = SH / YS / 2:TA = 90:TP = 0300 REM === Get command to execute310 CM$="5 ( D 12 ( 210 M 5 ( 30 T 10 M ) ) U 100 T 150 M )"460 REM ### If the program crashes it will470 REM ### be stuck in graphics mode.480 REM ### Type RUN 999 to get back to text.490 GOSUB 6010500 REM === Command interpreter510 IP = 1:SP = 0520 C$ = MID$(CM$, IP, 1)530 IF C$ = " " THEN IP = IP + 1:GOTO 520540 IF C$ >= "-" AND C$ <= "9" THEN V = VAL(MID$(CM$, IP)):GOSUB 1010:GOSUB 1210550 IF C$ = "(" THEN V = IP:GOSUB 1010560 IF C$ = ")" THEN GOSUB 2010570 IF C$ = "M" THEN GOSUB 2510580 IF C$ = "T" THEN GOSUB 3010590 IF C$ = "U" THEN GOSUB 3510600 IF C$ = "D" THEN GOSUB 4010610 IP = IP + 1620 IF IP > LEN(CM$) THEN END630 GOTO 520999 POKE 53272,PEEK(53272) AND 247:POKE 53265,PEEK(53265) AND 223:END1000 REM === Push onto stack1010 SP = SP + 1:SK(SP) = V1020 RETURN1100 REM === Pop from stack1110 V = SK(SP):SP = SP - 11120 RETURN1200 REM === Skip over number1210 IP = IP + 11220 IF IP > LEN(CM$) THEN 12501230 C2$ = MID$(CM$, IP, 1)1240 IF C2$ >= "-" AND C2$ <= "9" THEN GOTO 12101250 IP = IP - 11260 RETURN1500 REM === Plot a line1510 X1% = X1:X2% = X2:Y1% = Y1:Y2% = Y21520 DX% = ABS(X2% - X1%):SX% = -1:IF X1% < X2% THEN SX% = 11530 DY% = ABS(Y2% - Y1%):SY% = -1:IF Y1% < Y2% THEN SY% = 11540 ER% = -DY%:IF DX% > DY% THEN ER% = DX%1550 ER% = ER% / 21560 GOSUB 17101570 IF X1% = X2% AND Y1% = Y2% THEN RETURN1580 E2% = ER%1590 IF E2% > -DX% THEN ER% = ER% - DY%:X1% = X1% + SX%1600 IF X1% = X2% AND Y1% = Y2% THEN RETURN1610 IF E2% < DY% THEN ER% = ER% + DX%:Y1% = Y1% + SY%1620 IF X1% = X2% AND Y1% = Y2% THEN RETURN1630 GOTO 15601700 REM === Plot a point1710 CH% = INT(X1% / 8):RO% = INT(Y1% / 8):LN% = Y1% AND 71720 BY = BASE + RO% * 320 + 8 * CH% + LN%:BI% = 7 - (X1% AND 7)1730 POKE BY,PEEK(BY) OR (2 ^ BI%)1740 RETURN2000 REM === Loop instruction end2010 GOSUB 1110:BP = V2020 GOSUB 1110:LR = V2030 LR = LR - 12040 IF LR < 1 THEN RETURN2050 V = LR:GOSUB 10102060 V = BP:GOSUB 10102070 IP = BP2080 RETURN2500 REM === Move2510 GOSUB 11102520 LX = V * COS((360 - TA) * PI / 180):LY = V * SIN((360 - TA) * PI / 180)2530 IF TP > 0 THEN X1 = TX:Y1 = TY:X2 = X1 + LX:Y2 = Y1 + LY:GOSUB 45102540 TX = TX + LX:TY = TY + LY2550 RETURN3000 REM === Turn3010 GOSUB 11103020 TA = TA + V3030 IF TA < 0 THEN TA = TA + 360:GOTO 30303040 IF TA >= 360 THEN TA = TA - 360:GOTO 30403050 RETURN3500 REM === Pen up3510 TP = 03520 RETURN4000 REM === Pen down4010 TP = 14020 RETURN4500 REM === Draw line, clipping if needed4510 X1 = X1 * XS:X2 = X2 * XS:Y1 = Y1 * YS:Y2 = Y2 * YS4520 X = X1:Y = Y1:GOSUB 5010:C1 = C4530 X = X2:Y = Y2:GOSUB 5010:C2 = C4540 IF C1 = 0 AND C2 = 0 THEN GOSUB 1510:RETURN4550 IF C1 AND C2 THEN RETURN4560 C = C1:IF C = 0 THEN C = C24570 IF C AND 1 THEN X = X1 + (X2 - X1) * (SH - Y1) / (Y2 - Y1):Y = SH:GOTO 46104580 IF C AND 2 THEN X = X1 + (X2 - X1) * (0 - Y1) / (Y2 - Y1):Y = 0:GOTO 46104590 IF C AND 4 THEN Y = Y1 + (Y2 - Y1) * (SW - X1) / (X2 - X1):X = SW:GOTO 46104600 IF C AND 8 THEN Y = Y1 + (Y2 - Y1) * (0 - X1) / (X2 - X1):X = 0:GOTO 46104610 IF C = C1 THEN X1 = X:Y1 = Y:GOTO 46304620 X2 = X:Y2 = Y4630 GOTO 45205000 REM === Calculate region code5010 C = 05020 IF Y > SH THEN C = C OR 15030 IF Y < 0 THEN C = C OR 25040 IF X > SW THEN C = C OR 45050 IF X < 0 THEN C = C OR 85060 RETURN6000 REM === Enable graphics and clear screen6010 BASE = 2 * 4096:POKE 53272,PEEK(53272) OR 8:POKE 53265,PEEK(53265) OR 326020 FOR I = 1024 to 2023:POKE I,3:NEXT6030 FOR I = BASE TO BASE + 7999:POKE I,255:POKE I, 0:NEXT6040 RETURN