0000 ; 1 . ORIGINAL TINY BASIC INTERMEDIATE INTERPRETER
0000 ; 2 .
0000 ; 3 . EXECUTIVE INITIALIZATION
0000 ; 4 .
0000 ; 5 :STRT PC ":Q^" COLON, X-ON
0000 243A91;
0003 ; 6 GL
0003 27; 7 SB
0004 10; 8 BE L0 BRANCH IF NOT EMPTY
0005 E1; 9 BR STRT TRY AGAIN IF NULL LINE
0006 59; 10 :L0 BN STMT TEST FOR LINE NUMBER
0007 C5; 11 IL IF SO, INSERT INTO PROGRAM
0008 2A; 12 BR STRT GO GET NEXT
0009 56; 13 :XEC SB SAVE POINTERS FOR RUN WITH
000A 10; 14 RB CONCATENATED INPUT
000B 11; 15 XQ
000C 2C; 16 .
000D ; 17 . STATEMENT EXECUTOR
000D ; 18 .
000D ; 19 :STMT BC GOTO "LET"
000D 8B4C45D4;
0011 ; 20 BV * MUST BE A VARIABLE NAME
0011 A0; 21 BC * "="
0012 80BD; 22 :LET JS EXPR GO GET EXPRESSION
0014 30BC; 23 BE * IF STATEMENT END,
0016 E0; 24 SV STORE RESULT
0017 13; 25 NX
0018 1D; 26 .
0019 ; 27 :GOTO BC PRNT "GO"
0019 9447CF;
001C ; 28 BC GOSB "TO"
001C 8854CF;
001F ; 29 JS EXPR GET LINE NUMBER
001F 30BC; 30 BE *
0021 E0; 31 SB (DO THIS FOR STARTING)
0022 10; 32 RB
0023 11; 33 GO GO THERE
0024 16; 34 .
0025 ; 35 :GOSB BC * "SUB" NO OTHER WORD BEGINS "GO..."
0025 805355C2;
0029 ; 36 JS EXPR
0029 30BC; 37 BE *
002B E0; 38 GS
002C 14; 39 GO
002D 16; 40 .
002E ; 41 :PRNT BC SKIP "PR"
002E 9050D2;
0031 ; 42 BC P0 "INT" OPTIONALLY OMIT "INT"
0031 83494ED4;
0035 ; 43 :P0 BE P3
0035 E5; 44 BR P6 IF DONE, GO TO END
0036 71; 45 :P1 BC P4 ";"
0037 88BB; 46 :P2 BE P3
0039 E1; 47 NX NO CRLF IF ENDED BY ; OR ,
003A 1D; 48 :P3 BC P7 '"'
003B 8FA2; 49 PQ QUOTE MARKS STRING
003D 21; 50 BR P1 GO CHECK DELIMITER
003E 58; 51 :SKIP BR IF (ON THE WAY THRU)
003F 6F; 52 :P4 BC P5 ","
0040 83AC; 53 PT COMMA SPACING
0042 22; 54 BR P2
0043 55; 55 :P5 BC P6 ":"
0044 83BA; 56 PC "S^" OUTPUT X-OFF
0046 2493; 57 :P6 BE *
0048 E0; 58 NL THEN CRLF
0049 23; 59 NX
004A 1D; 60 :P7 JS EXPR TRY FOR AN EXPRESSION
004B 30BC; 61 PN
004D 20; 62 BR P1
004E 48; 63 .
004F ; 64 :IF BC INPT "IF"
004F 9149C6;
0052 ; 65 JS EXPR
0052 30BC; 66 JS RELO
0054 3134; 67 JS EXPR
0056 30BC; 68 BC I1 "THEN" OPTIONAL NOISEWORD
0058 84544845CE;
005D ; 69 :I1 CP COMPARE SKIPS NEXT IF TRUE
005D 1C; 70 NX FALSE.
005E 1D; 71 J STMT TRUE. GO PROCESS STATEMENT
005F 380D; 72 .
0061 ; 73 :INPT BC RETN "INPUT"
0061 9A494E5055D4;
0067 ; 74 :I2 BV * GET VARIABLE
0067 A0; 75 SB SWAP POINTERS
0068 10; 76 BE I4
0069 E7; 77 :I3 PC "? Q^" LINE IS EMPTY; TYPE PROMPT
006A 243F2091;
006E ; 78 GL READ INPUT LINE
006E 27; 79 BE I4 DID ANYTHING COME?
006F E1; 80 BR I3 NO, TRY AGAIN
0070 59; 81 :I4 BC I5 "," OPTIONAL COMMA
0071 81AC; 82 :I5 JS EXPR READ A NUMBER
0073 30BC; 83 SV STORE INTO VARIABLE
0075 13; 84 RB SWAP BACK
0076 11; 85 BC I6 "," ANOTHER?
0077 82AC; 86 BR I2 YES IF COMMA
0079 4D; 87 :I6 BE * OTHERWISE QUIT
007A E0; 88 NX
007B 1D; 89 .
007C ; 90 :RETN BC END "RETURN"
007C 895245545552CE;
0083 ; 91 BE *
0083 E0; 92 RS RECOVER SAVED LINE
0084 15; 93 NX
0085 1D; 94 .
0086 ; 95 :END BC LIST "END"
0086 85454EC4;
008A ; 96 BE *
008A E0; 97 WS
008B 2D; 98 .
008C ; 99 :LIST BC RUN "LIST"
008C 984C4953D4;
0091 ; 100 BE L2
0091 EC; 101 :L1 PC "@^@^@^@^J^@^" PUNCH LEADER
0092 24000000000A80;
0099 ; 102 LS LIST
0099 1F; 103 PC "S^" PUNCH X-OFF
009A 2493; 104 NL
009C 23; 105 NX
009D 1D; 106 :L2 JS EXPR GET A LINE NUMBER
009E 30BC; 107 BE L3
00A0 E1; 108 BR L1
00A1 50; 109 :L3 BC * "," SEPARATED BY COMMAS
00A2 80AC; 110 BR L2
00A4 59; 111 .
00A5 ; 112 :RUN BC CLER "RUN"
00A5 855255CE;
00A9 ; 113 J XEC
00A9 380A; 114 .
00AB ; 115 :CLER BC REM "CLEAR"
00AB 86434C4541D2;
00B1 ; 116 MT
00B1 2B; 117 .
00B2 ; 118 :REM BC DFLT "REM"
00B2 845245CD;
00B6 ; 119 NX
00B6 1D; 120 .
00B7 ; 121 :DFLT BV * NO KEYWORD...
00B7 A0; 122 BC * "=" TRY FOR LET
00B8 80BD; 123 J LET IT'S A GOOD BET.
00BA 3814; 124 .
00BC ; 125 . SUBROUTINES
00BC ; 126 .
00BC ; 127 :EXPR BC E0 "-" TRY FOR UNARY MINUS
00BC 85AD; 128 JS TERM AHA
00BE 30D3; 129 NE
00C0 17; 130 BR E1
00C1 64; 131 :E0 BC E4 "+" IGNORE UNARY PLUS
00C2 81AB; 132 :E4 JS TERM
00C4 30D3; 133 :E1 BC E2 "+" TERMS SEPARATED BY PLUS
00C6 85AB; 134 JS TERM
00C8 30D3; 135 AD
00CA 18; 136 BR E1
00CB 5A; 137 :E2 BC E3 "-" TERMS SEPARATED BY MINUS
00CC 85AD; 138 JS TERM
00CE 30D3; 139 SU
00D0 19; 140 BR E1
00D1 54; 141 :E3 RT
00D2 2F; 142 .
00D3 ; 143 :TERM JS FACT
00D3 30E2; 144 :T0 BC T1 "*" FACTORS SEPARATED BY TIMES
00D5 85AA; 145 JS FACT
00D7 30E2; 146 MP
00D9 1A; 147 BR T0
00DA 5A; 148 :T1 BC T2 "/" FACTORS SEPARATED BY DIVIDE
00DB 85AF; 149 JS FACT
00DD 30E2; 150 DV
00DF 1B; 151 BR T0
00E0 54; 152 :T2 RT
00E1 2F; 153 .
00E2 ; 154 :FACT BC F0 "RND" *RND FUNCTION*
00E2 97524EC4;
00E6 ; 155 LN 257*128 STACK POINTER FOR STORE
00E6 0A;
00E7 8080; 156 FV THEN GET RNDM
00E9 12; 157 LN 2345 R:=R*2345+6789
00EA 0A;
00EB 0929; 158 MP
00ED 1A; 159 LN 6789
00EE 0A;
00EF 1A85; 160 AD
00F1 18; 161 SV
00F2 13; 162 LB 128 GET IT AGAIN
00F3 0980; 163 FV
00F5 12; 164 DS
00F6 0B; 165 JS FUNC GET ARGUMENT
00F7 3130; 166 BR F1
00F9 61; 167 :F0 BR F2 (SKIPPING)
00FA 73; 168 :F1 DS
00FB 0B; 169 SX 2 PUSH TOP INTO STACK
00FC 02; 170 SX 4
00FD 04; 171 SX 2
00FE 02; 172 SX 3
00FF 03; 173 SX 5
0100 05; 174 SX 3
0101 03; 175 DV PERFORM MOD FUNCTION
0102 1B; 176 MP
0103 1A; 177 SU
0104 19; 178 DS PERFORM ABS FUNCTION
0105 0B; 179 LB 6
0106 0906; 180 LN 0
0108 0A;
0109 0000; 181 CP (SKIP IF + OR 0)
010B 1C; 182 NE
010C 17; 183 RT
010D 2F; 184 :F2 BC F3 "USR" *USR FUNCTION*
010E 8F5553D2;
0112 ; 185 BC * "(" 3 ARGUMENTS POSSIBLE
0112 80A8; 186 JS EXPR ONE REQUIRED
0114 30BC; 187 JS ARG
0116 312A; 188 JS ARG
0118 312A; 189 BC * ")"
011A 80A9; 190 US GO DO IT
011C 2E; 191 RT
011D 2F; 192 :F3 BV F4 VARIABLE?
011E A2; 193 FV YES. GET IT
011F 12; 194 RT
0120 2F; 195 :F4 BN F5 NUMBER?
0121 C1; 196 RT GOT IT.
0122 2F; 197 :F5 BC * "(" OTHERWISE MUST BE (EXPR)
0123 80A8; 198 :F6 JS EXPR
0125 30BC; 199 BC * ")"
0127 80A9; 200 RT
0129 2F; 201 .
012A ; 202 :ARG BC A0 "," COMMA?
012A 83AC; 203 J EXPR YES, GET EXPRESSION
012C 38BC; 204 :A0 DS NO, DUPLICATE STACK TOP
012E 0B; 205 RT
012F 2F; 206 .
0130 ; 207 :FUNC BC * "("
0130 80A8; 208 BR F6
0132 52; 209 RT
0133 2F; 210 .
0134 ; 211 :RELO BC R0 "=" CONVERT RELATION OPERATORS
0134 84BD; 212 LB 2 TO CODE BYTE ON STACK
0136 0902; 213 RT =
0138 2F; 214 :R0 BC R4 "<"
0139 8EBC; 215 BC R1 "="
013B 84BD; 216 LB 3 <=
013D 0903; 217 RT
013F 2F; 218 :R1 BC R3 ">"
0140 84BE; 219 LB 5 <>
0142 0905; 220 RT
0144 2F; 221 :R3 LB 1 <
0145 0901; 222 RT
0147 2F; 223 :R4 BC * ">"
0148 80BE; 224 BC R5 "="
014A 84BD; 225 LB 6 >=
014C 0906; 226 RT
014E 2F; 227 :R5 BC R6 "<"
014F 84BC; 228 LB 5 ><
0151 0905; 229 RT
0153 2F; 230 :R6 LB 4 >
0154 0904; 231 RT
0156 2F; 232 .
0157 ; 0000
0000