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