Add some reverse engineering of lemonade assembly language routines
authorNick Downing <nick@ndcode.org>
Thu, 19 May 2022 10:42:40 +0000 (20:42 +1000)
committerNick Downing <nick@ndcode.org>
Thu, 19 May 2022 11:55:23 +0000 (21:55 +1000)
.gitignore
lemonade/Makefile
lemonade/lemonade_flash.sed [new file with mode: 0644]
lemonade/lemonade_flash.txt [new file with mode: 0644]
lemonade/lemonade_tone.sed [new file with mode: 0644]
lemonade/lemonade_tone.txt [new file with mode: 0644]

index d1ac77d..e5dc1cd 100644 (file)
@@ -5,6 +5,8 @@ __pycache__
 /element.py
 /lemonade/bootable.dsk
 /lemonade/lemonade.bas
+/lemonade/lemonade_flash.asm
+/lemonade/lemonade_tone.asm
 /lemonade/lemonade_patched.bas
 /lemonade/lemonade_patched.dsk
 /lex_yy.py
index 78ea202..f10116e 100644 (file)
@@ -6,7 +6,7 @@ TOK_TO_BAS=../tok_to_bas.py
 BAS_TO_TOK=../bas_to_tok.py
 
 .PHONY: all
-all: lemonade_patched.dsk
+all: lemonade_patched.dsk lemonade_tone.asm lemonade_flash.asm
 
 lemonade_patched.dsk: lemonade_patched.bin bootable.dsk
        cp bootable.dsk $@
@@ -33,12 +33,72 @@ lemonade.tok: lemonade.bin
 lemonade.bin: ../orig/Lemonade_Stand_1979_Apple.do
        ${DOS33} $< LOAD LEMONADE $@
 
+lemonade_tone.asm: bootable.dsk ../orig/Lemonade_Stand_1979_Apple.do
+       rm -f ../linapple-pie/Printer.txt
+       tr '\n' '\r' <lemonade_tone.txt |\
+( \
+  cd ../linapple-pie && \
+  ./linapple -b -1 ../lemonade/bootable.dsk -2 ../orig/Lemonade_Stand_1979_Apple.do \
+)
+       tr -d '\r' <../linapple-pie/Printer.txt |\
+sed -nf lemonade_tone.sed >__temp__.asm
+       sed -ne 's/^\(l\.[0-9a-f]\+\).*/\1/p' <__temp__.asm >__defs__.txt
+       sed -ne 's/^.\+\(l\.[0-9a-f]\+\).*/\1/p' <__temp__.asm >__refs__.txt
+       for i in `cat __defs__.txt`; \
+do \
+  if ! grep -q $$i __refs__.txt; \
+  then \
+    sed -e "s/$$i//" -i __temp__.asm; \
+  fi; \
+done
+       ( \
+  for i in `LC_ALL=C sort <__refs__.txt |uniq`; \
+  do \
+    if ! grep -q $$i __defs__.txt; \
+    then \
+      echo $$i; \
+    fi; \
+  done |sed -e 's/^l.\(.*\)/&\tequ\t$$\1/'; \
+  cat __temp__.asm; \
+) >$@
+       rm __temp__.asm __defs__.txt __refs__.txt
+
+lemonade_flash.asm: bootable.dsk ../orig/Lemonade_Stand_1979_Apple.do
+       rm -f ../linapple-pie/Printer.txt
+       tr '\n' '\r' <lemonade_flash.txt |\
+( \
+  cd ../linapple-pie && \
+  ./linapple -b -1 ../lemonade/bootable.dsk -2 ../orig/Lemonade_Stand_1979_Apple.do \
+)
+       tr -d '\r' <../linapple-pie/Printer.txt |\
+sed -nf lemonade_flash.sed >__temp__.asm
+       sed -ne 's/^\(l\.[0-9a-f]\+\).*/\1/p' <__temp__.asm >__defs__.txt
+       sed -ne 's/^.\+\(l\.[0-9a-f]\+\).*/\1/p' <__temp__.asm >__refs__.txt
+       for i in `cat __defs__.txt`; \
+do \
+  if ! grep -q $$i __refs__.txt; \
+  then \
+    sed -e "s/$$i//" -i __temp__.asm; \
+  fi; \
+done
+       ( \
+  for i in `LC_ALL=C sort <__refs__.txt |uniq`; \
+  do \
+    if ! grep -q $$i __defs__.txt; \
+    then \
+      echo $$i; \
+    fi; \
+  done |sed -e 's/^l.\(.*\)/&\tequ\t$$\1/'; \
+  cat __temp__.asm; \
+) >$@
+       rm __temp__.asm __defs__.txt __refs__.txt
+
 bootable.dsk: ../orig/Apple_DOS_v3.3_1980_Apple.do bootable.txt
        dd if=/dev/zero of=$@ count=35 bs=4096
-       \
-cd ../linapple-pie && \
-tr '\n' '\r' <../lemonade/bootable.txt |\
-./linapple -b -1 ../orig/Apple_DOS_v3.3_1980_Apple.do -2 ../lemonade/$@ \
+       tr '\n' '\r' <../lemonade/bootable.txt |\
+( \
+  cd ../linapple-pie && \
+  ./linapple -b -1 ../orig/Apple_DOS_v3.3_1980_Apple.do -2 ../lemonade/$@ \
 )
 
 clean:
@@ -50,4 +110,7 @@ lemonade_patched.bas \
 lemonade.bas \
 lemonade.tok \
 lemonade.bin \
-bootable.dsk
+bootable.dsk \
+__temp__.asm \
+__defs__.txt \
+__refs__.txt
diff --git a/lemonade/lemonade_flash.sed b/lemonade/lemonade_flash.sed
new file mode 100644 (file)
index 0000000..a22e9e6
--- /dev/null
@@ -0,0 +1,10 @@
+/^3600-/,/^367B-/{
+  y/ABCDEFGHIJKLMNOPQRSTUVWXYZ/abcdefghijklmnopqrstuvwxyz/
+  s/^\([^ ]\{4\}\)-   \([^ ]\{2\}\( [^ ]\{2\}\)*\) \+\([^ ]\{3\}\)   \(.*\)/l.\1\t\4\t\5\t\t\t\2/
+  s/\$/l./
+  s/#l\./#$/
+  s/\(,[xy]\)\t/\1/
+  s/brk\t/dfb\t0/
+  s/^l.3600/\torg\t$3600\n/
+  p
+}
diff --git a/lemonade/lemonade_flash.txt b/lemonade/lemonade_flash.txt
new file mode 100644 (file)
index 0000000..297e2bc
--- /dev/null
@@ -0,0 +1,6 @@
+LOAD LEMONADE,D2
+GOSUB 16000
+PR#1
+CALL -151
+3600LLL
+
diff --git a/lemonade/lemonade_tone.sed b/lemonade/lemonade_tone.sed
new file mode 100644 (file)
index 0000000..25386f5
--- /dev/null
@@ -0,0 +1,10 @@
+/^0302-/,/^0318-/{
+  y/ABCDEFGHIJKLMNOPQRSTUVWXYZ/abcdefghijklmnopqrstuvwxyz/
+  s/^\([^ ]\{4\}\)-   \([^ ]\{2\}\( [^ ]\{2\}\)*\) \+\([^ ]\{3\}\)   \(.*\)/l.\1\t\4\t\5\t\t\t\2/
+  s/\$/l./
+  s/#l\./#$/
+  s/\(,[xy]\)\t/\1/
+  s/brk\t/dfb\t0/
+  s/^l.0302/\torg\t$0302\n/
+  p
+}
diff --git a/lemonade/lemonade_tone.txt b/lemonade/lemonade_tone.txt
new file mode 100644 (file)
index 0000000..3994c58
--- /dev/null
@@ -0,0 +1,6 @@
+LOAD LEMONADE,D2
+GOSUB 10100
+PR#1
+CALL -151
+302L
+