forked from RetroBattlestations/Terraspin
-
Notifications
You must be signed in to change notification settings - Fork 0
/
TRS80CoCo.txt
113 lines (95 loc) · 3.05 KB
/
TRS80CoCo.txt
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
100 REM BASIC Month: Terraspin
110 REM http://reddit.com/r/RetroBattlestations
120 REM written by FozzTexx
125 REM modifed for the TRS-80 Color Computer by swampyness
130 REM CoCo BASIC has bitwise operators so much of the line clipping
140 REM logic is simplified compared to the Apple II version.
200 REM === Initialize variables
210 SW = 256:SH = 128:XS = SW / 1000:YS = (SH * 4) / (1000 * 3)
220 SW = SW - 1:SH = SH - 1
230 PI = 3.14159
250 REM === Set turtle start at center of screen pointing up, pen up
260 TX = 500:TY = SH / YS / 2:TA = 90:TP = 0
300 REM === Get command to execute
310 CM$="5 ( D 12 ( 210 M 5 ( 30 T 10 M ) ) U 100 T 150 M )"
490 PMODE 3,1:SCREEN 1,0:PCLS 0:COLOR 1
500 REM === Command interpreter
510 IP = 1:SP = 0
520 C$ = MID$(CM$, IP, 1)
530 IF C$ = " " THEN IP = IP + 1:GOTO 520
540 IF C$ >= "-" AND C$ <= "9" THEN V = VAL(MID$(CM$, IP)):GOSUB 1010:GOSUB 1210
550 IF C$ = "(" THEN V = IP:GOSUB 1010
560 IF C$ = ")" THEN GOSUB 2010
570 IF C$ = "M" THEN GOSUB 2510
580 IF C$ = "T" THEN GOSUB 3010
590 IF C$ = "U" THEN GOSUB 3510
600 IF C$ = "D" THEN GOSUB 4010
610 IP = IP + 1
620 IF IP > LEN(CM$) THEN 7010
630 GOTO 520
1000 REM === Push onto stack
1010 SP = SP + 1:SK(SP) = V
1020 RETURN
1100 REM === Pop from stack
1110 V = SK(SP):SP = SP - 1
1120 RETURN
1200 REM === Skip over number
1210 IP = IP + 1
1220 IF IP > LEN(CM$) THEN 1250
1230 C2$ = MID$(CM$, IP, 1)
1240 IF C2$ >= "-" AND C2$ <= "9" THEN GOTO 1210
1250 IP = IP - 1
1260 RETURN
1500 REM === Plot a line
1510 LINE(X1,Y1)-(X2,Y2),PSET
1520 RETURN
2000 REM === Loop instruction end
2010 GOSUB 1110:BP = V
2020 GOSUB 1110:LR = V
2030 LR = LR - 1
2040 IF LR < 1 THEN RETURN
2050 V = LR:GOSUB 1010
2060 V = BP:GOSUB 1010
2070 IP = BP
2080 RETURN
2500 REM === Move
2510 GOSUB 1110
2520 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 4510
2540 TX = TX + LX:TY = TY + LY
2550 RETURN
3000 REM === Turn
3010 GOSUB 1110
3020 TA = TA + V
3030 IF TA < 0 THEN TA = TA + 360:GOTO 3030
3040 IF TA >= 360 THEN TA = TA - 360:GOTO 3040
3050 RETURN
3500 REM === Pen up
3510 TP = 0
3520 RETURN
4000 REM === Pen down
4010 TP = 1
4020 RETURN
4500 REM === Draw line, clipping if needed
4510 X1 = X1 * XS:X2 = X2 * XS:Y1 = Y1 * YS:Y2 = Y2 * YS
4520 X = X1:Y = Y1:GOSUB 5010:C1 = C
4530 X = X2:Y = Y2:GOSUB 5010:C2 = C
4540 IF C1 = 0 AND C2 = 0 THEN GOSUB 1510:RETURN
4550 IF C1 AND C2 THEN RETURN
4560 C = C1:IF C = 0 THEN C = C2
4570 IF C AND 1 THEN X = X1 + (X2 - X1) * (SH - Y1) / (Y2 - Y1):Y = SH:GOTO 4610
4580 IF C AND 2 THEN X = X1 + (X2 - X1) * (0 - Y1) / (Y2 - Y1):Y = 0:GOTO 4610
4590 IF C AND 4 THEN Y = Y1 + (Y2 - Y1) * (SW - X1) / (X2 - X1):X = SW:GOTO 4610
4600 IF C AND 8 THEN Y = Y1 + (Y2 - Y1) * (0 - X1) / (X2 - X1):X = 0:GOTO 4610
4610 IF C = C1 THEN X1 = X:Y1 = Y:GOTO 4630
4620 X2 = X:Y2 = Y
4630 GOTO 4520
5000 REM === Calculate region code
5010 C = 0
5020 IF Y > SH THEN C = C OR 1
5030 IF Y < 0 THEN C = C OR 2
5040 IF X > SW THEN C = C OR 4
5050 IF X < 0 THEN C = C OR 8
5060 RETURN
7000 REM ==== Preview
7010 GOTO 7010