Not logged in

Artifact 4c180c51fac79e67125cc44813b9c5275d17622b:

File langs/basic.rx part of check-in [04d16f1b58] - basic: a couple of bug fixes, additional LET forms by crc on 2011-06-03 14:00:17. [annotate]


0000: 28 20 52 78 42 41 53 49 43 20 7e 7e 7e 7e 7e 7e  ( RxBASIC ~~~~~~
0010: 7e 7e 7e 7e 7e 7e 7e 7e 7e 7e 7e 7e 7e 7e 7e 7e  ~~~~~~~~~~~~~~~~
0020: 7e 7e 7e 7e 7e 7e 7e 7e 7e 7e 7e 7e 7e 7e 7e 7e  ~~~~~~~~~~~~~~~~
0030: 7e 7e 7e 7e 7e 7e 7e 7e 7e 7e 7e 7e 7e 7e 7e 7e  ~~~~~~~~~~~~~~~~
0040: 7e 7e 7e 7e 7e 7e 7e 7e 7e 7e 7e 7e 7e 20 29 0a  ~~~~~~~~~~~~~ ).
0050: 28 20 54 68 69 73 20 69 73 20 61 20 6d 69 6e 69  ( This is a mini
0060: 6d 61 6c 69 73 74 69 63 20 42 41 53 49 43 20 63  malistic BASIC c
0070: 6f 6d 70 69 6c 65 72 2e 20 49 74 27 73 20 77 72  ompiler. It's wr
0080: 69 74 74 65 6e 20 69 6e 20 52 65 74 72 6f 20 61  itten in Retro a
0090: 6e 64 20 72 75 6e 73 20 6f 6e 20 20 20 20 29 0a  nd runs on    ).
00a0: 28 20 4e 67 61 72 6f 20 76 69 72 74 75 61 6c 20  ( Ngaro virtual 
00b0: 6d 61 63 68 69 6e 65 2e 20 20 20 20 20 20 20 20  machine.        
00c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
00d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
00e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 29 0a                ).
00f0: 28 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  (               
0100: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0110: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0120: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0130: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 29 0a                ).
0140: 28 20 54 68 65 20 69 6d 70 6c 65 6d 65 6e 61 74  ( The implemenat
0150: 69 6f 6e 20 77 61 73 20 66 69 72 73 74 20 64 65  ion was first de
0160: 73 63 72 69 62 65 64 20 6f 6e 20 74 68 65 20 43  scribed on the C
0170: 6f 72 70 73 65 20 62 6c 6f 67 20 69 6e 20 70 6f  orpse blog in po
0180: 73 74 20 23 39 38 3a 20 20 20 20 20 20 20 29 0a  st #98:       ).
0190: 28 20 68 74 74 70 3a 2f 2f 72 78 2d 63 6f 72 65  ( http://rx-core
01a0: 2e 6f 72 67 2f 64 65 76 2f 63 6f 72 70 73 65 2f  .org/dev/corpse/
01b0: 61 72 74 69 63 6c 65 2f 39 38 20 20 20 20 20 20  article/98      
01c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
01d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 29 0a                ).
01e0: 28 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  (               
01f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0200: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0210: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0220: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 29 0a                ).
0230: 28 20 54 68 65 72 65 20 61 72 65 20 73 74 72 69  ( There are stri
0240: 6e 67 20 76 61 72 69 61 62 6c 65 73 20 61 6e 64  ng variables and
0250: 20 6e 75 6d 65 72 69 63 20 76 61 72 69 61 62 6c   numeric variabl
0260: 65 73 2e 20 54 77 65 6e 74 79 20 73 69 78 20 6f  es. Twenty six o
0270: 66 20 65 61 63 68 2c 20 6e 61 6d 65 64 20 29 0a  f each, named ).
0280: 28 20 41 24 20 2d 20 5a 24 20 66 6f 72 20 74 68  ( A$ - Z$ for th
0290: 65 20 73 74 72 69 6e 67 20 76 61 72 69 61 62 6c  e string variabl
02a0: 65 73 20 61 6e 64 20 41 23 20 74 6f 20 5a 23 20  es and A# to Z# 
02b0: 66 6f 72 20 74 68 65 20 69 6e 74 65 67 65 72 20  for the integer 
02c0: 76 61 72 69 61 62 6c 65 73 2e 20 20 20 20 29 0a  variables.    ).
02d0: 28 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  (               
02e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
02f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0300: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0310: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 29 0a                ).
0320: 28 20 56 61 6c 69 64 20 53 79 6e 74 61 78 20 46  ( Valid Syntax F
0330: 6f 72 6d 73 3a 20 20 20 20 20 20 20 20 20 20 20  orms:           
0340: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0350: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0360: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 29 0a                ).
0370: 28 20 20 20 30 30 30 30 20 20 43 4c 53 20 20 20  (   0000  CLS   
0380: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0390: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
03a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
03b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 29 0a                ).
03c0: 28 20 20 20 30 30 30 30 20 20 50 52 49 4e 54 20  (   0000  PRINT 
03d0: 3c 76 61 72 69 61 62 6c 65 3e 5b 74 79 70 65 5d  <variable>[type]
03e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
03f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0400: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 29 0a                ).
0410: 28 20 20 20 30 30 30 30 20 20 50 52 49 4e 54 20  (   0000  PRINT 
0420: 22 73 74 72 69 6e 67 22 20 20 20 20 20 20 20 20  "string"        
0430: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0440: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0450: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 29 0a                ).
0460: 28 20 20 20 30 30 30 30 20 20 49 4e 50 55 54 20  (   0000  INPUT 
0470: 3c 76 61 72 69 61 62 6c 65 3e 5b 74 79 70 65 5d  <variable>[type]
0480: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0490: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
04a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 29 0a                ).
04b0: 28 20 20 20 30 30 30 30 20 20 47 4f 54 4f 20 20  (   0000  GOTO  
04c0: 3c 6c 69 6e 65 3e 20 20 20 20 20 20 20 20 20 20  <line>          
04d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
04e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
04f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 29 0a                ).
0500: 28 20 20 20 30 30 30 30 20 20 4c 45 54 20 20 20  (   0000  LET   
0510: 3c 76 61 72 69 61 62 6c 65 3e 5b 74 79 70 65 5d  <variable>[type]
0520: 20 3d 20 76 61 6c 75 65 20 20 20 20 20 20 20 20   = value        
0530: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0540: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 29 0a                ).
0550: 28 20 20 20 30 30 30 30 20 20 49 46 20 20 20 20  (   0000  IF    
0560: 3c 76 61 72 69 61 62 6c 65 3e 5b 74 79 70 65 5d  <variable>[type]
0570: 20 3c 63 6f 6e 64 3e 20 3c 76 61 72 69 61 62 6c   <cond> <variabl
0580: 65 3e 5b 74 79 70 65 5d 20 54 48 45 4e 20 3c 73  e>[type] THEN <s
0590: 74 61 74 65 6d 65 6e 74 3e 20 20 20 20 20 29 0a  tatement>     ).
05a0: 28 20 20 20 30 30 30 30 20 20 45 4e 44 20 20 20  (   0000  END   
05b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
05c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
05d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
05e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 29 0a                ).
05f0: 28 20 20 20 30 30 30 30 20 20 52 55 4e 20 20 20  (   0000  RUN   
0600: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0610: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0620: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0630: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 29 0a                ).
0640: 28 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  (               
0650: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0660: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0670: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0680: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 29 0a                ).
0690: 28 20 57 69 74 68 20 72 65 67 61 72 64 73 20 74  ( With regards t
06a0: 6f 20 74 68 65 20 69 6d 70 6c 65 6d 65 6e 74 61  o the implementa
06b0: 74 69 6f 6e 2c 20 6c 69 6e 65 20 6e 75 6d 62 65  tion, line numbe
06c0: 72 73 20 61 72 65 20 72 65 71 75 69 72 65 64 2e  rs are required.
06d0: 20 57 65 20 68 61 76 65 20 61 6e 20 20 20 29 0a   We have an   ).
06e0: 28 20 61 72 72 61 79 20 6f 66 20 34 6b 20 6c 69  ( array of 4k li
06f0: 6e 65 73 2e 20 45 61 63 68 20 65 6c 65 6d 65 6e  nes. Each elemen
0700: 74 20 70 6f 69 6e 74 73 20 74 6f 20 61 20 73 75  t points to a su
0710: 62 72 6f 75 74 69 6e 65 2e 20 53 6f 20 52 78 42  broutine. So RxB
0720: 41 53 49 43 20 77 69 6c 6c 20 20 20 20 20 29 0a  ASIC will     ).
0730: 28 20 63 6f 6d 70 69 6c 65 20 65 61 63 68 20 6c  ( compile each l
0740: 69 6e 65 20 61 73 20 61 20 73 65 70 61 72 61 74  ine as a separat
0750: 65 20 73 75 62 72 6f 75 74 69 6e 65 2e 20 52 55  e subroutine. RU
0760: 4e 20 77 69 6c 6c 20 63 79 63 6c 65 20 74 68 72  N will cycle thr
0770: 6f 75 67 68 20 65 61 63 68 20 20 20 20 20 29 0a  ough each     ).
0780: 28 20 74 68 65 20 61 72 72 61 79 2c 20 65 78 65  ( the array, exe
0790: 63 75 74 69 6e 67 20 74 68 65 20 73 75 62 72 6f  cuting the subro
07a0: 75 74 69 6e 65 20 66 6f 72 20 65 61 63 68 20 6c  utine for each l
07b0: 69 6e 65 2e 20 20 20 20 20 20 20 20 20 20 20 20  ine.            
07c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 29 0a                ).
07d0: 28 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  (               
07e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
07f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0800: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0810: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 29 0a                ).
0820: 28 20 41 6c 6c 20 63 6f 6d 6d 61 6e 64 73 20 61  ( All commands a
0830: 6e 64 20 76 61 72 69 61 62 6c 65 73 20 6d 75 73  nd variables mus
0840: 74 20 62 65 20 55 50 50 45 52 43 41 53 45 2e 20  t be UPPERCASE. 
0850: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0860: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 29 0a                ).
0870: 28 20 7e 7e 7e 7e 7e 7e 7e 7e 7e 7e 7e 7e 7e 7e  ( ~~~~~~~~~~~~~~
0880: 7e 7e 7e 7e 7e 7e 7e 7e 7e 7e 7e 7e 7e 7e 7e 7e  ~~~~~~~~~~~~~~~~
0890: 7e 7e 7e 7e 7e 7e 7e 7e 7e 7e 7e 7e 7e 7e 7e 7e  ~~~~~~~~~~~~~~~~
08a0: 7e 7e 7e 7e 7e 7e 7e 7e 7e 7e 7e 7e 7e 7e 7e 7e  ~~~~~~~~~~~~~~~~
08b0: 7e 7e 7e 7e 7e 7e 7e 7e 7e 7e 7e 7e 7e 20 29 0a  ~~~~~~~~~~~~~ ).
08c0: 28 20 54 6f 64 6f 3a 20 20 20 20 20 20 20 20 20  ( Todo:         
08d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
08e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
08f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0900: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 29 0a                ).
0910: 28 20 20 20 2d 20 48 61 6e 64 6c 65 20 61 64 64  (   - Handle add
0920: 69 74 69 6f 6e 61 6c 20 4c 45 54 20 66 6f 72 6d  itional LET form
0930: 73 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  s               
0940: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0950: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 29 0a                ).
0960: 28 20 20 20 2d 20 41 64 64 20 52 45 4d 20 66 6f  (   - Add REM fo
0970: 72 20 63 6f 6d 6d 65 6e 74 73 20 20 20 20 20 20  r comments      
0980: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0990: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
09a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 29 0a                ).
09b0: 28 20 20 20 2d 20 41 64 64 20 47 4f 53 55 42 20  (   - Add GOSUB 
09c0: 61 6e 64 20 52 45 54 55 52 4e 20 5b 73 74 69 6c  and RETURN [stil
09d0: 6c 20 75 73 65 20 6c 69 6e 65 20 6e 75 6d 62 65  l use line numbe
09e0: 72 73 5d 20 20 20 20 20 20 20 20 20 20 20 20 20  rs]             
09f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 29 0a                ).
0a00: 28 20 20 20 2d 20 41 6c 6c 6f 77 20 66 6f 72 20  (   - Allow for 
0a10: 72 65 74 75 72 6e 20 74 6f 20 52 65 74 72 6f 20  return to Retro 
0a20: 3f 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ?               
0a30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0a40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 29 0a                ).
0a50: 28 20 20 20 2d 20 41 6c 6c 6f 77 20 66 6f 72 20  (   - Allow for 
0a60: 72 65 74 75 72 6e 20 74 6f 20 52 78 42 41 53 49  return to RxBASI
0a70: 43 20 72 61 74 68 65 72 20 74 68 61 6e 20 73 68  C rather than sh
0a80: 75 74 74 69 6e 67 20 64 6f 77 6e 20 74 68 65 20  utting down the 
0a90: 56 4d 20 20 20 20 20 20 20 20 20 20 20 20 29 0a  VM            ).
0aa0: 28 20 7e 7e 7e 7e 7e 7e 7e 7e 7e 7e 7e 7e 7e 7e  ( ~~~~~~~~~~~~~~
0ab0: 7e 7e 7e 7e 7e 7e 7e 7e 7e 7e 7e 7e 7e 7e 7e 7e  ~~~~~~~~~~~~~~~~
0ac0: 7e 7e 7e 7e 7e 7e 7e 7e 7e 7e 7e 7e 7e 7e 7e 7e  ~~~~~~~~~~~~~~~~
0ad0: 7e 7e 7e 7e 7e 7e 7e 7e 7e 7e 7e 7e 7e 7e 7e 7e  ~~~~~~~~~~~~~~~~
0ae0: 7e 7e 7e 7e 7e 7e 7e 7e 7e 7e 7e 7e 7e 20 29 0a  ~~~~~~~~~~~~~ ).
0af0: 28 20 43 6f 70 79 72 69 67 68 74 20 5b 63 5d 20  ( Copyright [c] 
0b00: 32 30 31 31 2c 20 43 68 61 72 6c 65 73 20 43 68  2011, Charles Ch
0b10: 69 6c 64 65 72 73 2e 20 20 55 73 65 20 75 6e 64  ilders.  Use und
0b20: 65 72 20 74 68 65 20 49 53 43 20 4c 69 63 65 6e  er the ISC Licen
0b30: 73 65 20 20 20 20 20 20 20 20 20 20 20 20 29 0a  se            ).
0b40: 28 20 7e 7e 7e 7e 7e 7e 7e 7e 7e 7e 7e 7e 7e 7e  ( ~~~~~~~~~~~~~~
0b50: 7e 7e 7e 7e 7e 7e 7e 7e 7e 7e 7e 7e 7e 7e 7e 7e  ~~~~~~~~~~~~~~~~
0b60: 7e 7e 7e 7e 7e 7e 7e 7e 7e 7e 7e 7e 7e 7e 7e 7e  ~~~~~~~~~~~~~~~~
0b70: 7e 7e 7e 7e 7e 7e 7e 7e 7e 7e 7e 7e 7e 7e 7e 7e  ~~~~~~~~~~~~~~~~
0b80: 7e 7e 7e 7e 7e 7e 7e 7e 7e 7e 7e 7e 7e 20 29 0a  ~~~~~~~~~~~~~ ).
0b90: 0a 63 72 65 61 74 65 20 6c 69 6e 65 73 0a 20 20  .create lines.  
0ba0: 34 30 39 36 20 61 6c 6c 6f 74 0a 0a 63 72 65 61  4096 allot..crea
0bb0: 74 65 20 73 76 61 72 73 0a 20 20 32 37 20 61 6c  te svars.  27 al
0bc0: 6c 6f 74 0a 0a 63 72 65 61 74 65 20 6e 76 61 72  lot..create nvar
0bd0: 73 0a 20 20 32 37 20 61 6c 6c 6f 74 0a 0a 3a 20  s.  27 allot..: 
0be0: 73 65 74 43 75 72 72 65 6e 74 4c 69 6e 65 20 28  setCurrentLine (
0bf0: 20 22 2d 20 29 0a 20 20 68 65 72 65 20 67 65 74   "- ).  here get
0c00: 54 6f 6b 65 6e 20 74 6f 4e 75 6d 62 65 72 20 6c  Token toNumber l
0c10: 69 6e 65 73 20 2b 20 21 20 3b 0a 0a 3a 20 68 61  ines + ! ;..: ha
0c20: 6e 64 6c 65 4b 65 79 77 6f 72 64 20 20 28 20 22  ndleKeyword  ( "
0c30: 2d 20 29 20 3b 0a 0a 3a 20 62 61 73 69 63 20 28  - ) ;..: basic (
0c40: 20 2d 20 29 0a 20 20 72 65 70 65 61 74 20 63 72   - ).  repeat cr
0c50: 20 73 65 74 43 75 72 72 65 6e 74 4c 69 6e 65 20   setCurrentLine 
0c60: 68 61 6e 64 6c 65 4b 65 79 77 6f 72 64 20 61 67  handleKeyword ag
0c70: 61 69 6e 20 3b 0a 0a 0a 28 20 48 65 6c 70 65 72  ain ;...( Helper
0c80: 20 46 75 6e 63 74 69 6f 6e 73 20 7e 7e 7e 7e 7e   Functions ~~~~~
0c90: 7e 7e 7e 7e 7e 7e 7e 7e 7e 7e 7e 7e 7e 7e 7e 7e  ~~~~~~~~~~~~~~~~
0ca0: 7e 7e 7e 7e 7e 7e 7e 7e 7e 7e 7e 7e 7e 7e 7e 7e  ~~~~~~~~~~~~~~~~
0cb0: 7e 7e 7e 7e 7e 7e 7e 7e 7e 7e 7e 7e 7e 7e 7e 7e  ~~~~~~~~~~~~~~~~
0cc0: 7e 7e 7e 7e 7e 20 29 0a 3a 20 23 20 28 20 6e 2d  ~~~~~ ).: # ( n-
0cd0: 20 29 20 31 20 2c 20 2c 20 3b 0a 0a 3a 20 67 65   ) 1 , , ;..: ge
0ce0: 74 56 61 72 69 61 62 6c 65 20 28 20 22 2d 61 66  tVariable ( "-af
0cf0: 20 29 0a 20 20 67 65 74 63 20 64 75 70 20 70 75   ).  getc dup pu
0d00: 74 63 20 27 41 20 2d 20 67 65 74 63 20 64 75 70  tc 'A - getc dup
0d10: 20 70 75 74 63 20 27 24 20 3d 20 5b 20 73 76 61   putc '$ = [ sva
0d20: 72 73 20 2b 20 2d 31 20 5d 20 5b 20 6e 76 61 72  rs + -1 ] [ nvar
0d30: 73 20 2b 20 30 20 5d 20 69 66 20 3b 0a 0a 0a 28  s + 0 ] if ;...(
0d40: 20 52 78 42 41 53 49 43 20 43 6f 6d 6d 61 6e 64   RxBASIC Command
0d50: 73 20 7e 7e 7e 7e 7e 7e 7e 7e 7e 7e 7e 7e 7e 7e  s ~~~~~~~~~~~~~~
0d60: 7e 7e 7e 7e 7e 7e 7e 7e 7e 7e 7e 7e 7e 7e 7e 7e  ~~~~~~~~~~~~~~~~
0d70: 7e 7e 7e 7e 7e 7e 7e 7e 7e 7e 7e 7e 7e 7e 7e 7e  ~~~~~~~~~~~~~~~~
0d80: 7e 7e 7e 7e 7e 7e 7e 7e 7e 7e 7e 7e 20 29 0a 3a  ~~~~~~~~~~~~ ).:
0d90: 20 64 6f 5f 63 6c 73 20 20 20 20 28 20 2d 20 29   do_cls    ( - )
0da0: 0a 20 20 26 63 6c 65 61 72 20 2c 20 26 3b 20 64  .  &clear , &; d
0db0: 6f 20 3b 0a 0a 3a 20 64 6f 5f 70 72 69 6e 74 20  o ;..: do_print 
0dc0: 20 28 20 22 2d 20 29 0a 20 20 67 65 74 63 20 64   ( "- ).  getc d
0dd0: 75 70 20 70 75 74 63 0a 20 20 64 75 70 20 27 22  up putc.  dup '"
0de0: 20 3d 20 5b 20 64 72 6f 70 20 27 22 20 61 63 63   = [ drop '" acc
0df0: 65 70 74 20 74 69 62 20 6b 65 65 70 53 74 72 69  ept tib keepStri
0e00: 6e 67 20 23 20 26 70 75 74 73 20 2c 20 5d 0a 20  ng # &puts , ]. 
0e10: 20 20 20 20 20 20 20 20 20 20 5b 20 27 41 20 2d            [ 'A -
0e20: 20 67 65 74 63 20 64 75 70 20 70 75 74 63 20 27   getc dup putc '
0e30: 24 20 3d 20 5b 20 73 76 61 72 73 20 2b 20 23 20  $ = [ svars + # 
0e40: 26 40 20 2c 20 26 70 75 74 73 20 2c 20 5d 0a 20  &@ , &puts , ]. 
0e50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0e60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0e70: 20 20 20 20 5b 20 6e 76 61 72 73 20 2b 20 23 20      [ nvars + # 
0e80: 26 40 20 2c 20 26 70 75 74 6e 20 2c 20 5d 20 69  &@ , &putn , ] i
0e90: 66 20 5d 20 69 66 0a 20 20 26 3b 20 64 6f 20 3b  f ] if.  &; do ;
0ea0: 0a 0a 7b 7b 0a 20 20 3a 20 72 65 61 64 53 74 72  ..{{.  : readStr
0eb0: 69 6e 67 20 28 20 22 2d 24 20 29 20 72 65 6d 61  ing ( "-$ ) rema
0ec0: 70 70 69 6e 67 20 5b 20 72 65 6d 61 70 70 69 6e  pping [ remappin
0ed0: 67 20 6f 66 66 20 31 30 20 61 63 63 65 70 74 20  g off 10 accept 
0ee0: 74 69 62 20 5d 20 70 72 65 73 65 72 76 65 20 3b  tib ] preserve ;
0ef0: 0a 2d 2d 2d 72 65 76 65 61 6c 2d 2d 2d 0a 20 20  .---reveal---.  
0f00: 3a 20 64 6f 5f 69 6e 70 75 74 20 20 28 20 22 2d  : do_input  ( "-
0f10: 20 29 0a 20 20 20 20 67 65 74 56 61 72 69 61 62   ).    getVariab
0f20: 6c 65 20 5b 20 26 72 65 61 64 53 74 72 69 6e 67  le [ &readString
0f30: 20 2c 20 26 6b 65 65 70 53 74 72 69 6e 67 20 5d   , &keepString ]
0f40: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
0f50: 20 5b 20 26 67 65 74 54 6f 6b 65 6e 20 2c 20 20   [ &getToken ,  
0f60: 20 26 74 6f 4e 75 6d 62 65 72 20 20 20 5d 20 69   &toNumber   ] i
0f70: 66 20 2c 20 23 20 26 21 20 2c 20 26 3b 20 64 6f  f , # &! , &; do
0f80: 20 3b 0a 7d 7d 0a 0a 3a 20 64 6f 5f 67 6f 74 6f   ;.}}..: do_goto
0f90: 20 20 20 28 20 22 2d 20 29 0a 20 20 38 20 2c 20     ( "- ).  8 , 
0fa0: 67 65 74 54 6f 6b 65 6e 20 74 6f 4e 75 6d 62 65  getToken toNumbe
0fb0: 72 20 6c 69 6e 65 73 20 2b 20 2c 20 26 3b 20 64  r lines + , &; d
0fc0: 6f 20 3b 0a 0a 7b 7b 0a 20 20 3a 20 73 74 72 50  o ;..{{.  : strP
0fd0: 72 65 70 65 6e 64 20 5e 73 74 72 69 6e 67 73 27  repend ^strings'
0fe0: 70 72 65 70 65 6e 64 20 3b 0a 0a 20 20 3a 20 61  prepend ;..  : a
0ff0: 73 73 69 67 6e 56 61 6c 75 65 20 28 20 61 66 22  ssignValue ( af"
1000: 2d 20 29 0a 20 20 20 20 5b 20 67 65 74 63 20 70  - ).    [ getc p
1010: 75 74 63 20 27 22 20 61 63 63 65 70 74 20 74 69  utc '" accept ti
1020: 62 20 6b 65 65 70 53 74 72 69 6e 67 20 5d 0a 20  b keepString ]. 
1030: 20 20 20 5b 20 67 65 74 54 6f 6b 65 6e 20 74 6f     [ getToken to
1040: 4e 75 6d 62 65 72 20 5d 20 69 66 20 32 23 20 26  Number ] if 2# &
1050: 21 20 2c 20 26 3b 20 64 6f 20 3b 0a 20 20 3a 20  ! , &; do ;.  : 
1060: 61 73 73 69 67 6e 56 61 72 69 61 62 6c 65 20 28  assignVariable (
1070: 20 61 66 22 2d 20 29 0a 20 20 20 20 3b 0a 20 20   af"- ).    ;.  
1080: 3a 20 61 64 64 56 61 72 69 61 62 6c 65 20 20 28  : addVariable  (
1090: 20 61 66 22 2d 20 29 0a 20 20 20 20 5b 20 67 65   af"- ).    [ ge
10a0: 74 56 61 72 69 61 62 6c 65 20 64 72 6f 70 20 6f  tVariable drop o
10b0: 76 65 72 20 23 20 26 40 20 2c 20 23 20 26 40 20  ver # &@ , # &@ 
10c0: 2c 20 26 73 74 72 50 72 65 70 65 6e 64 20 2c 20  , &strPrepend , 
10d0: 23 20 26 21 20 2c 20 26 3b 20 64 6f 20 5d 0a 20  # &! , &; do ]. 
10e0: 20 20 20 5b 20 67 65 74 56 61 72 69 61 62 6c 65     [ getVariable
10f0: 20 64 72 6f 70 20 6f 76 65 72 20 23 20 26 40 20   drop over # &@ 
1100: 2c 20 23 20 26 40 20 2c 20 26 2b 20 2c 20 20 20  , # &@ , &+ ,   
1110: 20 20 20 20 20 20 20 23 20 26 21 20 2c 20 26 3b         # &! , &;
1120: 20 64 6f 20 5d 20 69 66 20 3b 0a 20 20 3a 20 73   do ] if ;.  : s
1130: 75 62 56 61 72 69 61 62 6c 65 20 20 28 20 61 66  ubVariable  ( af
1140: 22 2d 20 29 0a 20 20 20 20 5b 20 22 5c 6e 45 52  "- ).    [ "\nER
1150: 52 4f 52 5c 6e 22 20 70 75 74 73 20 5d 0a 20 20  ROR\n" puts ].  
1160: 20 20 5b 20 67 65 74 56 61 72 69 61 62 6c 65 20    [ getVariable 
1170: 64 72 6f 70 20 6f 76 65 72 20 23 20 26 40 20 2c  drop over # &@ ,
1180: 20 23 20 26 40 20 2c 20 73 77 61 70 2c 20 26 2d   # &@ , swap, &-
1190: 20 2c 20 20 20 20 23 20 26 21 20 2c 20 26 3b 20   ,    # &! , &; 
11a0: 64 6f 20 5d 20 69 66 20 3b 0a 2d 2d 2d 72 65 76  do ] if ;.---rev
11b0: 65 61 6c 2d 2d 2d 0a 20 20 3a 20 64 6f 5f 6c 65  eal---.  : do_le
11c0: 74 20 20 20 20 28 20 2d 20 29 0a 20 20 20 20 67  t    ( - ).    g
11d0: 65 74 56 61 72 69 61 62 6c 65 0a 20 20 20 20 67  etVariable.    g
11e0: 65 74 54 6f 6b 65 6e 0a 20 20 20 20 5b 20 22 3d  etToken.    [ "=
11f0: 22 20 20 63 6f 6d 70 61 72 65 20 5d 20 5b 20 64  "  compare ] [ d
1200: 72 6f 70 20 61 73 73 69 67 6e 56 61 6c 75 65 20  rop assignValue 
1210: 20 20 20 5d 20 77 68 65 6e 0a 20 20 20 20 5b 20     ] when.    [ 
1220: 22 3a 3d 22 20 63 6f 6d 70 61 72 65 20 5d 20 5b  ":=" compare ] [
1230: 20 64 72 6f 70 20 61 73 73 69 67 6e 56 61 72 69   drop assignVari
1240: 61 62 6c 65 20 5d 20 77 68 65 6e 0a 20 20 20 20  able ] when.    
1250: 5b 20 22 2b 3d 22 20 63 6f 6d 70 61 72 65 20 5d  [ "+=" compare ]
1260: 20 5b 20 64 72 6f 70 20 61 64 64 56 61 72 69 61   [ drop addVaria
1270: 62 6c 65 20 20 20 20 5d 20 77 68 65 6e 0a 20 20  ble    ] when.  
1280: 20 20 5b 20 22 2d 3d 22 20 63 6f 6d 70 61 72 65    [ "-=" compare
1290: 20 5d 20 5b 20 64 72 6f 70 20 73 75 62 56 61 72   ] [ drop subVar
12a0: 69 61 62 6c 65 20 20 20 20 5d 20 77 68 65 6e 0a  iable    ] when.
12b0: 20 20 20 20 64 72 6f 70 20 3b 0a 7d 7d 0a 0a 7b      drop ;.}}..{
12c0: 7b 0a 20 20 3a 20 69 66 53 74 72 69 6e 67 0a 20  {.  : ifString. 
12d0: 20 20 20 23 20 26 40 20 2c 20 67 65 74 54 6f 6b     # &@ , getTok
12e0: 65 6e 20 67 65 74 56 61 72 69 61 62 6c 65 20 64  en getVariable d
12f0: 72 6f 70 20 23 20 26 40 20 2c 0a 20 20 20 20 26  rop # &@ ,.    &
1300: 63 6f 6d 70 61 72 65 20 2c 20 22 3c 3e 22 20 63  compare , "<>" c
1310: 6f 6d 70 61 72 65 20 5b 20 26 6e 6f 74 20 2c 20  ompare [ &not , 
1320: 5d 20 69 66 54 72 75 65 20 3b 0a 20 20 3a 20 69  ] ifTrue ;.  : i
1330: 66 4e 75 6d 62 65 72 0a 20 20 20 20 23 20 26 40  fNumber.    # &@
1340: 20 2c 20 67 65 74 54 6f 6b 65 6e 20 67 65 74 56   , getToken getV
1350: 61 72 69 61 62 6c 65 20 64 72 6f 70 20 23 20 26  ariable drop # &
1360: 40 20 2c 0a 20 20 20 20 66 69 6e 64 20 64 72 6f  @ ,.    find dro
1370: 70 20 40 64 2d 3e 78 74 20 2c 20 3b 0a 2d 2d 2d  p @d->xt , ;.---
1380: 72 65 76 65 61 6c 2d 2d 2d 0a 20 20 3a 20 64 6f  reveal---.  : do
1390: 5f 69 66 20 20 20 20 20 28 20 2d 20 29 0a 20 20  _if     ( - ).  
13a0: 20 20 67 65 74 56 61 72 69 61 62 6c 65 0a 20 20    getVariable.  
13b0: 20 20 26 69 66 53 74 72 69 6e 67 20 26 69 66 4e    &ifString &ifN
13c0: 75 6d 62 65 72 20 69 66 20 67 65 74 54 6f 6b 65  umber if getToke
13d0: 6e 20 64 72 6f 70 20 32 35 20 2c 20 26 64 72 6f  n drop 25 , &dro
13e0: 70 20 2c 20 68 61 6e 64 6c 65 4b 65 79 77 6f 72  p , handleKeywor
13f0: 64 20 26 3b 20 64 6f 20 3b 0a 7d 7d 0a 0a 3a 20  d &; do ;.}}..: 
1400: 64 6f 5f 65 6e 64 20 20 20 20 28 20 2d 20 29 0a  do_end    ( - ).
1410: 20 20 26 62 79 65 20 2c 20 26 3b 20 64 6f 20 3b    &bye , &; do ;
1420: 0a 0a 3a 20 64 6f 5f 72 75 6e 20 20 20 20 28 20  ..: do_run    ( 
1430: 2d 20 29 0a 20 20 26 3b 20 64 6f 20 63 72 20 6c  - ).  &; do cr l
1440: 69 6e 65 73 20 72 65 70 65 61 74 20 40 2b 20 5b  ines repeat @+ [
1450: 20 30 3b 20 64 6f 20 5d 20 64 6f 20 61 67 61 69   0; do ] do agai
1460: 6e 20 3b 0a 0a 0a 28 20 50 61 74 63 68 20 74 68  n ;...( Patch th
1470: 65 20 68 61 6e 64 6c 65 4b 65 79 77 6f 72 64 20  e handleKeyword 
1480: 73 74 75 62 20 74 6f 20 70 72 6f 63 65 73 73 20  stub to process 
1490: 74 68 65 20 52 78 42 41 53 49 43 20 63 6f 6d 6d  the RxBASIC comm
14a0: 61 6e 64 73 20 7e 7e 7e 7e 7e 7e 7e 7e 7e 7e 7e  ands ~~~~~~~~~~~
14b0: 7e 7e 7e 20 29 0a 3a 20 64 69 73 70 61 74 63 68  ~~~ ).: dispatch
14c0: 20 28 20 22 2d 20 29 0a 20 20 67 65 74 54 6f 6b   ( "- ).  getTok
14d0: 65 6e 0a 20 20 20 20 5b 20 22 43 4c 53 22 20 20  en.    [ "CLS"  
14e0: 20 63 6f 6d 70 61 72 65 20 5d 20 5b 20 64 72 6f   compare ] [ dro
14f0: 70 20 64 6f 5f 63 6c 73 20 20 20 5d 20 77 68 65  p do_cls   ] whe
1500: 6e 0a 20 20 20 20 5b 20 22 50 52 49 4e 54 22 20  n.    [ "PRINT" 
1510: 63 6f 6d 70 61 72 65 20 5d 20 5b 20 64 72 6f 70  compare ] [ drop
1520: 20 64 6f 5f 70 72 69 6e 74 20 5d 20 77 68 65 6e   do_print ] when
1530: 0a 20 20 20 20 5b 20 22 49 4e 50 55 54 22 20 63  .    [ "INPUT" c
1540: 6f 6d 70 61 72 65 20 5d 20 5b 20 64 72 6f 70 20  ompare ] [ drop 
1550: 64 6f 5f 69 6e 70 75 74 20 5d 20 77 68 65 6e 0a  do_input ] when.
1560: 20 20 20 20 5b 20 22 47 4f 54 4f 22 20 20 63 6f      [ "GOTO"  co
1570: 6d 70 61 72 65 20 5d 20 5b 20 64 72 6f 70 20 64  mpare ] [ drop d
1580: 6f 5f 67 6f 74 6f 20 20 5d 20 77 68 65 6e 0a 20  o_goto  ] when. 
1590: 20 20 20 5b 20 22 4c 45 54 22 20 20 20 63 6f 6d     [ "LET"   com
15a0: 70 61 72 65 20 5d 20 5b 20 64 72 6f 70 20 64 6f  pare ] [ drop do
15b0: 5f 6c 65 74 20 20 20 5d 20 77 68 65 6e 0a 20 20  _let   ] when.  
15c0: 20 20 5b 20 22 49 46 22 20 20 20 20 63 6f 6d 70    [ "IF"    comp
15d0: 61 72 65 20 5d 20 5b 20 64 72 6f 70 20 64 6f 5f  are ] [ drop do_
15e0: 69 66 20 20 20 20 5d 20 77 68 65 6e 0a 20 20 20  if    ] when.   
15f0: 20 5b 20 22 45 4e 44 22 20 20 20 63 6f 6d 70 61   [ "END"   compa
1600: 72 65 20 5d 20 5b 20 64 72 6f 70 20 64 6f 5f 65  re ] [ drop do_e
1610: 6e 64 20 20 20 5d 20 77 68 65 6e 0a 20 20 20 20  nd   ] when.    
1620: 5b 20 22 52 55 4e 22 20 20 20 63 6f 6d 70 61 72  [ "RUN"   compar
1630: 65 20 5d 20 5b 20 64 72 6f 70 20 64 6f 5f 72 75  e ] [ drop do_ru
1640: 6e 20 20 20 5d 20 77 68 65 6e 0a 20 20 64 72 6f  n   ] when.  dro
1650: 70 20 3b 0a 26 64 69 73 70 61 74 63 68 20 69 73  p ;.&dispatch is
1660: 20 68 61 6e 64 6c 65 4b 65 79 77 6f 72 64 0a 0a   handleKeyword..
1670: 62 61 73 69 63 0a 30 30 30 32 20 50 52 49 4e 54  basic.0002 PRINT
1680: 20 22 59 6f 75 72 20 4e 61 6d 65 3f 20 22 0a 30   "Your Name? ".0
1690: 30 30 33 20 4c 45 54 20 41 24 20 3d 20 22 63 72  003 LET A$ = "cr
16a0: 63 78 22 0a 30 30 30 34 20 49 4e 50 55 54 20 42  cx".0004 INPUT B
16b0: 24 0a 30 30 30 35 20 49 46 20 41 24 20 3d 20 42  $.0005 IF A$ = B
16c0: 24 20 54 48 45 4e 20 50 52 49 4e 54 20 22 6d 61  $ THEN PRINT "ma
16d0: 74 63 68 5c 6e 22 0a 30 30 30 36 20 49 46 20 41  tch\n".0006 IF A
16e0: 24 20 3c 3e 20 42 24 20 54 48 45 4e 20 50 52 49  $ <> B$ THEN PRI
16f0: 4e 54 20 22 6e 6f 20 6d 61 74 63 68 5c 6e 22 0a  NT "no match\n".
1700: 30 30 30 37 20 4c 45 54 20 41 23 20 3d 20 31 30  0007 LET A# = 10
1710: 30 0a 30 30 30 38 20 4c 45 54 20 42 23 20 3d 20  0.0008 LET B# = 
1720: 32 30 30 0a 30 30 31 30 20 4c 45 54 20 41 23 20  200.0010 LET A# 
1730: 2b 3d 20 42 23 0a 30 30 31 31 20 50 52 49 4e 54  += B#.0011 PRINT
1740: 20 41 23 0a 30 30 31 32 20 4c 45 54 20 42 23 20   A#.0012 LET B# 
1750: 3d 20 35 30 0a 30 30 31 33 20 4c 45 54 20 41 23  = 50.0013 LET A#
1760: 20 2d 3d 20 42 23 0a 30 30 31 34 20 50 52 49 4e   -= B#.0014 PRIN
1770: 54 20 41 23 0a 30 39 39 39 20 45 4e 44 0a 34 30  T A#.0999 END.40
1780: 30 30 20 52 55 4e 0a                             00 RUN.