gibstov

Terraspin.BAS

Jul 3rd, 2016
195
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 3.42 KB | None | 0 0
  1. 100 REM BASIC Month: Terraspin
  2. 110 REM http://reddit.com/r/RetroBattlestations
  3. 120 REM written by FozzTexx - Atari 8-bit port by Gibstov
  4.  
  5. 130 REM IBM BASIC has bitwise operators so much of the line clipping
  6. 140 REM logic is simplified compared to the Apple II version.
  7.  
  8. 150 GOTO 200
  9. 160 VV= INT(VV) / 2 - INT(VV / 2) > 0:RETURN
  10.  
  11. 200 REM === Initialize variables
  12. 205 DIM SK(16), CM$(300), C$(1),C2$(1):DEG
  13. 210 SW = 319:SH = 191:XS = SW / 1000:YS = (SH * 4) / (1000 * 3)
  14. 220 SW = SW - 1:SH = SH - 1
  15. 230 PI = 3.14159
  16.  
  17. 250 REM === Set turtle start at center of screen pointing up, pen up
  18. 260 TX = 500:TY = SH / YS / 2:TA = 90:TP = 0
  19.  
  20. 300 REM === Get command to execute
  21. 310 CM$="5 ( D 12 ( 210 M 5 ( 30 T 10 M ) ) U 100 T 150 M )"
  22.  
  23. 490 GR.8+16:COLOR 1:POKE 712,0
  24.  
  25. 500 REM === Command interpreter
  26. 510 IP = 1:SP = 0
  27. 520 C$ = CM$(IP, IP)
  28. 530 IF C$ = " " THEN IP = IP + 1:GOTO 520
  29. 540 IF C$ >= "-" AND C$ <= "9" THEN V = VAL(CM$(IP)):GOSUB 1010:GOSUB 1210
  30. 550 IF C$ = "(" THEN V = IP:GOSUB 1010
  31. 560 IF C$ = ")" THEN GOSUB 2010
  32. 570 IF C$ = "M" THEN GOSUB 2510
  33. 580 IF C$ = "T" THEN GOSUB 3010
  34. 590 IF C$ = "U" THEN GOSUB 3510
  35. 600 IF C$ = "D" THEN GOSUB 4010
  36. 610 IP = IP + 1
  37. 620 IF IP > LEN(CM$) THEN POKE 712,96:GOTO 700
  38. 630 GOTO 520
  39.  
  40. 700 GOTO 700
  41.  
  42. 1000 REM === Push onto stack
  43. 1010 SP = SP + 1:SK(SP) = V
  44. 1020 RETURN
  45.  
  46. 1100 REM === Pop from stack
  47. 1110 V = SK(SP):SP = SP - 1
  48. 1120 RETURN
  49.  
  50.  
  51. 1200 REM === Skip over number
  52. 1210 IP = IP + 1
  53. 1220 IF IP > LEN(CM$) THEN END
  54. 1230 C2$ = CM$(IP,IP)
  55. 1240 IF C2$ >= "-" AND C2$ <= "9" THEN GOTO 1210
  56. 1250 IP = IP - 1
  57. 1260 RETURN
  58.  
  59. 1500 REM === Plot a line
  60. 1510 PLOT X1,Y1:DR. X2,Y2
  61. 1520 RETURN
  62.  
  63. 2000 REM === Loop instruction end
  64. 2010 GOSUB 1110:BP = V
  65. 2020 GOSUB 1110:LR = V
  66. 2030 LR = LR - 1
  67. 2040 IF LR < 1 THEN RETURN
  68. 2050 V = LR:GOSUB 1010
  69. 2060 V = BP:GOSUB 1010
  70. 2070 IP = BP
  71. 2080 RETURN
  72.  
  73. 2500 REM === Move
  74. 2510 GOSUB 1110
  75. 2520 LX = V * COS(360-TA):LY = V * SIN(360-TA)
  76. 2530 IF TP > 0 THEN X1 = TX:Y1 = TY:X2 = X1 + LX:Y2 = Y1 + LY:GOSUB 4510
  77. 2540 TX = TX + LX:TY = TY + LY
  78. 2550 RETURN
  79.  
  80. 3000 REM === TurnL.50
  81. 3010 GOSUB 1110
  82. 3020 TA = TA + V
  83. 3030 IF TA < 0 THEN TA = TA + 360:GOTO 3030
  84. 3040 IF TA >= 360 THEN TA = TA - 360:GOTO 3040
  85. 3050 RETURN
  86.  
  87. 3500 REM === Pen up
  88. 3510 TP = 0
  89. 3520 RETURN
  90.  
  91. 4000 REM === Pen down
  92. 4010 TP = 1
  93. 4020 RETURN
  94.  
  95. 4500 REM === Draw line, clipping if needed
  96. 4510 X1 = X1 * XS:X2 = X2 * XS:Y1 = Y1 * YS:Y2 = Y2 * YS
  97. 4520 X = X1:Y = Y1:GOSUB 5010:C1 = C
  98. 4530 X = X2:Y = Y2:GOSUB 5010:C2 = C
  99. 4540 IF C1 = 0 AND C2 = 0 THEN GOSUB 1510:RETURN
  100. 4550 GOSUB 5510:IF C THEN RETURN
  101. 4560 C = C1:IF C = 0 THEN C = C2
  102. 4570 VV=C:GOSUB 16:IF VV THEN X = X1 + (X2 - X1) * (SH - Y1) / (Y2 - Y1):Y = SH:GOTO 4610
  103. 4580 VV=C / 2:GOSUB 160:IF VV THEN X = X1 + (X2 - X1) * (0 - Y1) / (Y2 - Y1):Y = 0:GOTO 4610
  104. 4590 VV=C / 4:GOSUB 160:IF VV THEN Y = Y1 + (Y2 - Y1) * (SW - X1) / (X2 - X1):X = SW:GOTO 4610
  105. 4600 VV=C / 8:GOSUB 160:IF VV THEN Y = Y1 + (Y2 - Y1) * (0 - X1) / (X2 - X1):X = 0:GOTO 4610
  106. 4610 IF C = C1 THEN X1 = X:Y1 = Y:GOTO 4630
  107. 4620 X2 = X:Y2 = Y
  108. 4630 GOTO 4520
  109.  
  110. 5000 REM === Calculate region code
  111. 5010 C = 0
  112. 5020 IF Y > SH THEN C = C + 1
  113. 5030 IF Y < 0 THEN C = C + 2
  114. 5040 IF X > SW THEN C = C + 4
  115. 5050 IF X < 0 THEN C = C + 8
  116. 5060 RETURN
  117.  
  118. 5500 REM === Bitwise AND of C1 and C2
  119. 5510 C = 0:EP = 1:FOR I = 1 TO 4
  120. 5515 VV = (C1 / EP):GOSUB 160: V1=VV: VV= (C2 / EP):GOSUB 160
  121. 5520 C = C + V1 * VV * EP
  122. 5530 EP = EP * 2:NEXT I
  123. 5540 RETURN
Add Comment
Please, Sign In to add comment