Improve interpreter and I/O slightly for lemonade, add lemonade.sh source patch
authorNick Downing <nick@ndcode.org>
Wed, 18 May 2022 07:07:07 +0000 (17:07 +1000)
committerNick Downing <nick@ndcode.org>
Wed, 18 May 2022 08:11:39 +0000 (18:11 +1000)
.gitignore
.gitmodules [new file with mode: 0644]
Makefile
apple_io.py
applesoft_basic.t
dos33fsprogs [new submodule]
lemonade.bas.patch [new file with mode: 0644]
lemonade.sh [new file with mode: 0755]

index a5a627b..962d91c 100644 (file)
@@ -1,8 +1,13 @@
 *.tok
 __pycache__
+/Lemonade_Stand_1979_Apple.do
 /bas_to_tok.py
 /element.py
+/lemonade.bas
+/lemonade.bin
+/lemonade.tok
 /lex_yy.py
+/orig
 /tok_to_bas.py
 /t_def.py
 /y_tab.py
diff --git a/.gitmodules b/.gitmodules
new file mode 100644 (file)
index 0000000..562a840
--- /dev/null
@@ -0,0 +1,3 @@
+[submodule "dos33fsprogs"]
+       path = dos33fsprogs
+       url = https://github.com/nickd4/dos33fsprogs.git
index 34cc206..451d446 100644 (file)
--- a/Makefile
+++ b/Makefile
@@ -4,7 +4,12 @@
        rm __temp__.py
        chmod a+x $@
 
-all: element.py lex_yy.py t_def.py y_tab.py bas_to_tok.py tok_to_bas.py
+.PHONY: all
+all: dos33fsprogs element.py lex_yy.py t_def.py y_tab.py bas_to_tok.py tok_to_bas.py
+
+.PHONY: dos33fsprogs
+dos33fsprogs:
+       ${MAKE} ${MAKEFLAGS} -C dos33fsprogs/utils/dos33fs-utils dos33 mkdos33fs
 
 element.py:
        pitree --install-element
@@ -23,6 +28,7 @@ bas_to_tok.py: bas_to_tok.l
 tok_to_bas.py: tok_to_bas.l
 
 clean:
+       ${MAKE} ${MAKEFLAGS} -C dos33fsprogs/utils/dos33fs-utils clean
        rm -f \
 element.py \
 lex_yy.py \
index 978bd84..d79aebd 100755 (executable)
@@ -142,23 +142,24 @@ ROM_IOSAVE = 0xFF4A # Save all working registers
 ROM_OLDRST = 0xFF59 # Old reset entry, no autostart
 ROM_MON = 0xFF65 # Enter monitor and beep spkr
 
+# see https://imgur.com/h0NNOc3
 # colors (map 15 apple colors to 16 VT100 colours, some duplicate or unused)
 colors = [
   0x0, # black -> black
-  0x5, # dark pink -> magenta
-  0x1, # dark blue -> blue
-  0x5, # dark purple -> magenta
-  0x2, # dark green -> green
-  0x7, # grey 1 -> white
-  0x9, # light blue -> intense blue
-  0xd, # light purple -> intense magenta
-  0x6, # dark yellow -> yellow
-  0xe, # orange -> intense yellow
+  0x1, # red -> red
+  0x4, # d.blue -> blue
+  0x5, # purple -> magenta
+  0x2, # d.green -> green
+  0x7, # gray 1 -> white
+  0xc, # m.blue -> intense blue
+  0xd, # l.blue -> intense magenta
+  0x3, # brown -> yellow
+  0xb, # orange -> intense yellow
   0x7, # grey 2 -> white
-  0xc, # pink -> intense red
-  0xa, # light green -> intense green
-  0xe, # light yellow -> intense yellow
-  0xb, # light cyan -> intense cyan
+  0xd, # pink -> intense magenta
+  0xa, # l.green -> intense green
+  0xb, # yellow -> intense yellow
+  0xe, # aqua -> intense cyan
   0xf, # white -> intense white
 ]
 
index 55aebbe..fb6b590 100644 (file)
@@ -370,7 +370,7 @@ def execute(self, context):
       )
 
     variable.value += step
-    if variable.value > end:
+    if (variable.value > end if step >= 0 else variable.value < end):
       break
 
     context.i = i
@@ -611,10 +611,36 @@ def execute(self, context):
   assert False
 @method(StatementOnGoto)
 def execute(self, context):
-  assert False
+  value = self.children[0].get_int(context)
+  if value < 0:
+    raise Exception(
+      f'?ILLEGAL QUANTITY ERROR IN {context.line_number():d}'
+    )
+  if value >= 1 and value < len(self.children):
+    context.i = context.find_line(self.children[value].int_value)
+    context.j = 1
 @method(StatementOnGosub)
 def execute(self, context):
-  assert False
+  value = self.children[0].get_int(context)
+  if value < 0:
+    raise Exception(
+      f'?ILLEGAL QUANTITY ERROR IN {context.line_number():d}'
+    )
+  if value >= 1 and value < len(self.children):
+    i = context.i
+    j = context.j
+    context.i = context.find_line(self.children[value].int_value)
+    context.j = 1
+    try:
+      context.execute()
+    except ReturnException:
+      pass
+    except NextException:
+      raise Exception(
+        f'?NEXT WITHOUT FOR ERROR IN {context.line_number():d}'
+      )
+    context.i = i
+    context.j = j
 @method(StatementWait)
 def execute(self, context):
   assert False
diff --git a/dos33fsprogs b/dos33fsprogs
new file mode 160000 (submodule)
index 0000000..ea5e0e9
--- /dev/null
@@ -0,0 +1 @@
+Subproject commit ea5e0e975817069ee881f9b75bf14b1dcbb98d47
diff --git a/lemonade.bas.patch b/lemonade.bas.patch
new file mode 100644 (file)
index 0000000..40a6f1f
--- /dev/null
@@ -0,0 +1,82 @@
+--- orig/lemonade.bas  2022-05-18 16:49:43.864568949 +1000
++++ lemonade.bas       2022-05-18 16:50:22.500570506 +1000
+@@ -207,28 +207,46 @@
+ 10110POKE782,208:POKE783,245:POKE784,174:POKE785,0:POKE786,3:POKE787,76:POKE788,2:POKE789,3:POKE790,96:POKE791,0:POKE792,0
+ 10190RETURN
+ 11000REM  INTRODUCTION
+-11100TEXT:HOME:GR:COLOR=12:FORI=0TO39:HLIN0,39ATI:NEXT:VTAB2
+-11110PRINT";LLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLL;LLLLL";
+-11120PRINT";LLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLL;LLLLL";
+-11130PRINT";LLLL;;;;L;;;;;L;;;;L;;;;L;;;;L;;;;L;;;;";
+-11140PRINT";LLLL;LL;L;L;L;L;LL;L;LL;LLLL;L;LL;L;LL;";
+-11150PRINT";LLLL;;;;L;L;L;L;LL;L;LL;L;;;;L;LL;L;;;;";
+-11160PRINT";LLLL;LLLL;L;L;L;LL;L;LL;L;LL;L;LL;L;LLL";
+-11170PRINT";;;;L;;;;L;LLL;L;;;;L;LL;L;;;;L;;;;L;;;;";
+-11200VTAB11
+-11210PRINT"LLLLLLLL;;;;;LL;LLLLLLLLLLLLLLL;LLLLLLLL";
+-11220PRINT"LLLLLLLL;LLLLLL;LLLLLLLLLLLLLLL;LLLLLLLL";
+-11230PRINT"LLLLLLLL;LLLLL;;;L;;;;L;;;;L;;;;LLLLLLLL";
+-11240PRINT"LLLLLLLL;;;;;LL;LLLLL;L;LL;L;LL;LLLLLLLL";
+-11250PRINT"LLLLLLLLLLLL;LL;LL;;;;L;LL;L;LL;LLLLLLLL";
+-11260PRINT"LLLLLLLLLLLL;LL;LL;LL;L;LL;L;LL;LLLLLLLL";
+-11270PRINT"LLLLLLLL;;;;;LL;LL;;;;L;LL;L;;;;LLLLLLLL";
++11100TEXT:HOME:GR:COLOR=12:FORI=0TO39:HLIN0,39ATI:NEXT:REM VTAB2
++11101REM                       111111111122222222223333333333
++11102REM             0123456789012345678901234567890123456789
++11110REM  2- 3 PRINT";LLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLL;LLLLL";
++11120REM  4- 5 PRINT";LLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLL;LLLLL";
++11130REM  6- 7 PRINT";LLLL;;;;L;;;;;L;;;;L;;;;L;;;;L;;;;L;;;;";
++11140REM  8- 9 PRINT";LLLL;LL;L;L;L;L;LL;L;LL;LLLL;L;LL;L;LL;";
++11150REM 10-11 PRINT";LLLL;;;;L;L;L;L;LL;L;LL;L;;;;L;LL;L;;;;";
++11160REM 12-13 PRINT";LLLL;LLLL;L;L;L;LL;L;LL;L;LL;L;LL;L;LLL";
++11170REM 14-15 PRINT";;;;L;;;;L;LLL;L;;;;L;LL;L;;;;L;;;;L;;;;";
++11171COLOR=11
++11172VLIN2,15AT0:HLIN 0,3AT14:HLIN0,3AT15:REM L
++11173HLIN5,8AT6:HLIN5,8AT7:VLIN6,15AT5:VLIN6,11AT8:HLIN5,8AT10:HLIN5,8AT11:HLIN5,8AT14:HLIN5,8AT15:REM e
++11174HLIN10,14AT6:HLIN10,14AT7:VLIN6,15AT10:VLIN6,13AT12:VLIN6,15AT14:REM m
++11175HLIN16,19AT6:HLIN16,19AT7:VLIN6,15AT16:VLIN6,15AT19:HLIN16,19AT14:HLIN16,19AT15:REM o
++11176HLIN21,24AT6:HLIN21,24AT7:VLIN6,15AT21:VLIN6,15AT24:REM n
++11177HLIN26,29AT6:HLIN26,29AT7:VLIN6,15AT29:HLIN26,29AT10:HLIN26,29AT11:VLIN10,15AT26:HLIN26,29AT14:HLIN26,29AT15:REM a
++11178VLIN2,15AT34:HLIN31,34AT6:HLIN31,34AT7:VLIN6,15AT31:HLIN31,34AT14:HLIN31,34AT15:REM d
++11179HLIN36,39AT6:HLIN36,39AT7:VLIN6,15AT36:VLIN6,11AT39:HLIN36,39AT10:HLIN36,39AT11:HLIN36,39AT14:HLIN36,39AT15:REM e
++11200REM VTAB11
++11101REM                       111111111122222222223333333333
++11102REM             0123456789012345678901234567890123456789
++11210REM 20-21 PRINT"LLLLLLLL;;;;;LL;LLLLLLLLLLLLLLL;LLLLLLLL";
++11220REM 22-23 PRINT"LLLLLLLL;LLLLLL;LLLLLLLLLLLLLLL;LLLLLLLL";
++11230REM 24-25 PRINT"LLLLLLLL;LLLLL;;;L;;;;L;;;;L;;;;LLLLLLLL";
++11240REM 26-27 PRINT"LLLLLLLL;;;;;LL;LLLLL;L;LL;L;LL;LLLLLLLL";
++11250REM 28-29 PRINT"LLLLLLLLLLLL;LL;LL;;;;L;LL;L;LL;LLLLLLLL";
++11260REM 30-31 PRINT"LLLLLLLLLLLL;LL;LL;LL;L;LL;L;LL;LLLLLLLL";
++11270REM 32-33 PRINT"LLLLLLLL;;;;;LL;LL;;;;L;LL;L;;;;LLLLLLLL";
++11271HLIN8,12AT20:HLIN8,12AT21:VLIN20,27AT8:HLIN8,12AT26:HLIN8,12AT27:VLIN26,33AT12:HLIN8,12AT32:HLIN8,12AT33:REM S
++11272VLIN20,33AT15:HLIN14,16AT24:HLIN14,16AT25:REM t
++11273HLIN18,21AT24:HLIN18,21AT25:VLIN24,33AT21:HLIN18,21AT28:HLIN18,21AT29:VLIN28,33AT18:HLIN18,21AT32:HLIN18,21AT33:REM a
++11274HLIN23,26AT24:HLIN23,26AT25:VLIN24,33AT23:VLIN24,33AT26:REM n
++11275VLIN20,33AT31:HLIN28,31AT24:HLIN28,31AT25:VLIN24,33AT28:HLIN28,31AT32:HLIN28,31AT33:REM d
+ 11280VTAB23:PRINT"  COPYRIGHT 1979    APPLE COMPUTER INC."
+ 11300GOSUB11700:FORI=1TO2000:NEXT
+-11310POKE33,1:POKE34,9:POKE35,19
++11310REM POKE33,1:POKE34,9:POKE35,19
+ 11320FORI=39TO7STEP-1:COLOR=15:VLIN18,37ATI:COLOR=12:IFI<39THENVLIN18,36ATI+1
+ 11330COLOR=15:IFI<30THENVLIN18,36ATI+10
+-11340COLOR=12:IFI<29THENVLIN18,37ATI+11:POKE32,I+11:VTAB11:HTABI+12:PRINT:READA$:PRINTA$;
++11340COLOR=12:IFI<29THENVLIN18,37ATI+11:COLOR=11:ONI-6GOSUB11490,11490,11490,11490,11526,11525,11525,11525,11524,11490,11490,11523,11521,11522,11521,11521:REM POKE32,I+11:VTAB11:HTABI+12:PRINT:READA$:PRINTA$;
+ 11350FORJ=14TOI+I:NEXT:NEXT:FORI=1TO1000:NEXT
+ 11360COLOR=13:VLIN14,36AT12:FORI=36TO20STEP-1:HLIN8,16ATI
+ 11370FORJ=1TO50:NEXT:POKE768,I*3-12:POKE769,12:CALL770:NEXT:COLOR=12:VLIN14,19AT12
+@@ -237,7 +255,13 @@
+ 11490RETURN
+ 11500REM  DATA
+ 11510DATA96,180,128,60,114,60,128,120,144,60,152,60,128,255,128,60,114,60,85,120,96,60,102,60,114,120,102,60,96,255,0,0
+-11520DATA,,,,,,L;LL;,L;LL;,;;LL;;,L;LL;,L;;;;,,,;L;;;;,;L;LL;,;L;LL;,;L;LL;,;;;LL;,,,,,*
++11520REM DATA,,,,,,L;LL;,L;LL;,;;LL;;,L;LL;,L;;;;,,,;L;;;;,;L;LL;,;L;LL;,;L;LL;,;;;LL;,,,,,*
++11521VLIN24,25ATI+11:VLIN30,31ATI+11:RETURN:REM L;LL;
++11522VLIN22,25ATI+11:VLIN30,33ATI+11:RETURN:REM ;;LL;;
++11523VLIN24,31ATI+11:RETURN:REM L;;;;
++11524VLIN22,23ATI+11:VLIN26,33ATI+11:RETURN:REM ;L;;;;
++11525VLIN22,23ATI+11:VLIN26,27ATI+11:VLIN32,33ATI+11:RETURN:REM ;L;LL;
++11526VLIN22,27ATI+11:VLIN32,33ATI+11:RETURN:REM ;;;LL;
+ 11530DATA96,16,85,4,128,4,96,4,76,4,128,4,96,16,0,0
+ 11540DATA114,120,144,60,114,255,1,120,128,120,144,60,128,120,114,60,144,120,171,255,228,255,0,0
+ 11550DATA152,180,152,120,152,60,144,120,152,60,171,120,192,60,152,255,0,0
diff --git a/lemonade.sh b/lemonade.sh
new file mode 100755 (executable)
index 0000000..5a49209
--- /dev/null
@@ -0,0 +1,13 @@
+#!/bin/sh
+rm -f Lemonade_Stand_1979_Apple.do
+wget https://archive.org/download/Lemonade_Stand_1979_Apple/Lemonade_Stand_1979_Apple.do
+mkdir --parents orig
+cp Lemonade_Stand_1979_Apple.do orig
+dos33fsprogs/utils/dos33fs-utils/dos33 orig/Lemonade_Stand_1979_Apple.do LOAD LEMONADE lemonade.bin
+./bin_to_tok.py <lemonade.bin >lemonade.tok
+./tok_to_bas.py <lemonade.tok >lemonade.bas
+cp lemonade.bas orig
+patch lemonade.bas <lemonade.bas.patch
+./bas_to_tok.py <lemonade.bas >lemonade.tok
+./tok_to_bin.py <lemonade.tok >lemonade.bin
+dos33fsprogs/utils/dos33fs-utils/dos33 Lemonade_Stand_1979_Apple.do SAVE A lemonade.bin "LEMONADE PATCHED"