aboutsummaryrefslogtreecommitdiff
path: root/design/rom.s.tcl
diff options
context:
space:
mode:
Diffstat (limited to 'design/rom.s.tcl')
-rwxr-xr-xdesign/rom.s.tcl54
1 files changed, 54 insertions, 0 deletions
diff --git a/design/rom.s.tcl b/design/rom.s.tcl
new file mode 100755
index 0000000..db142a0
--- /dev/null
+++ b/design/rom.s.tcl
@@ -0,0 +1,54 @@
+#!/usr/bin/env tclsh
+
+source tclasm.tcl
+
+## also look at stack_machine_cond_jump test
+
+## we're going to write numbers from 0 to 639 at addresses h100000 to h1009FC
+## and then write non-zero value at h100A00
+
+# this will translate to 3 16-bit instructions
+set_sp h0FFFFC
+
+## set up the counter
+# each of those 2 will translate to 1 16-bit instruction
+const 0
+stack down
+
+## this is the point we later jump to, address 10
+
+tee
+## compute address: counter * 4 + h100000
+stack down
+const 4
+mul
+const h100000
+add
+stack up
+## load computed address to im
+exchange_im
+## save value of counter at address pointed by im
+swap
+store
+swap
+## increase counter by 1
+const 1
+add
+## compare value of counter to 640
+tee
+stack down
+const 640
+sub
+stack up
+## loop if counter != 640
+cond_jump 10
+
+## write hFFFFFFFF to address h100A00 (the point is to write a non-zero value
+## there, but because our stack machine only knows how to write 32-bit values
+## to memory, we'll write to h100A00 and h100A02, both being mapped as the
+## VGA power-on register - what matters is the later write, so at least one of
+## higher 16 bits of written value has to be non-zero)
+const -1
+store@ h100A00
+
+halt