aboutsummaryrefslogtreecommitdiff
path: root/examples/example3b_spi_tclasm/instructions.s.tcl
diff options
context:
space:
mode:
authorWojciech Kosior <kwojtus@protonmail.com>2020-12-29 19:56:04 +0100
committerWojciech Kosior <kwojtus@protonmail.com>2020-12-29 19:56:04 +0100
commit68c80359ba0983bc21a18c0270025be9b441c0bb (patch)
treea06a04eb8756f96d05c55768bd356917847cdc95 /examples/example3b_spi_tclasm/instructions.s.tcl
parent5b6a3f3b216939a11ed1978d7da4dd6bbe4edc2a (diff)
downloadAGH-engineering-thesis-68c80359ba0983bc21a18c0270025be9b441c0bb.tar.gz
AGH-engineering-thesis-68c80359ba0983bc21a18c0270025be9b441c0bb.zip
add the ability to include additional data at the end of bitstream image and prepare an example, that reads thic data through SPI and displays it
Diffstat (limited to 'examples/example3b_spi_tclasm/instructions.s.tcl')
-rw-r--r--examples/example3b_spi_tclasm/instructions.s.tcl142
1 files changed, 142 insertions, 0 deletions
diff --git a/examples/example3b_spi_tclasm/instructions.s.tcl b/examples/example3b_spi_tclasm/instructions.s.tcl
new file mode 100644
index 0000000..294a73e
--- /dev/null
+++ b/examples/example3b_spi_tclasm/instructions.s.tcl
@@ -0,0 +1,142 @@
+### Relevant addresses:
+### * h140000 - h1401FF - SPI data transfer memory
+### * h140200 - h140201 - SPI bytes_to_output reg
+### * h140202 - h140203 - SPI bytes_to_receive reg
+### * h140204 - h140207 - SPI operating reg
+### * h1C0008 - h1C0009 - low bits of timer reg
+### * h100000 - h1009FF - VGA text memory
+### * h100A00 - h100A01 - VGA power-on register
+### * h1C0006 - h1C0007 - LED2 register
+
+### The bitstream binary itself is 135100 bytes big. We append our data
+### at the and of this binary file, so it can later be found at address
+### 135100 on the flash chip.
+
+set_sp h100000; # 2 16-bit instructions
+
+### power up flash ship
+## set bytes_to_output to 1
+const 1; # 1 16-bit instruction
+storew h140200; # 2 16-bit instructions
+## set bytes_to_receive to 0
+const 0; # 1 16-bit instruction
+storew h140202; # 2 16-bit instructions
+## release power-down SPI command
+const 0xAB; # 2 16-bit instructions
+storeb h140000; # 2 16-bit instructions
+## start SPI operation
+const 1; # 1 16-bit instruction
+storew h140204; # 2 16-bit instructions
+
+### wait for at least 3000 ns after command gets sent
+## reset the timer
+const 0; # 1 16-bit instruction
+storew h1C0008; # 2 16-bit instructions
+
+## loop until 45 ticks pass; 45 ticks is 3600 ns; additional 600ns is enough
+## for power-up command to be sent
+# there were 18 16-bit instructions up to this point, so loop address is 36
+loadwzx h1C0008; # 2 16-bit instructions
+const 45; # 1 16-bit instruction
+lt; # 1 16-bit instruction
+cond_jump 36; # 1 16-bit instruction
+
+### we'll transfer a total of 2400 bytes by making 5 transfers of 480 bytes;
+### our SPI peripheral is capable of transfering at most 511 bytes in one go
+## initialize transfers counter
+const 0; # 1 16-bit instruction
+storew h080000; # 2 16-bit instructions
+
+### transfers loop starts here, it'll execute 5 times
+# there were 26 16-bit instructions up to this point, so loop address is 52
+### read 480 bytes from SPI
+## set bytes_to_output to 5
+const 5; # 1 16-bit instruction
+storew h140200; # 2 16-bit instructions
+## set bytes_to_receive to 480
+const 480; # 2 16-bit instructions
+storew h140202; # 2 16-bit instructions
+## fast read SPI command
+const 0x0B; # 1 16-bit instruction
+storeb h140000; # 2 16-bit instructions
+## prepare address; 135100 is base address of our data inside flash memory
+const 135100; # 2 16-bit instructions
+## compute the offset of bytes, that have already been read
+loadwzx h080000; # 2 16-bit instructions
+const 480; # 2 16-bit instructions
+mul; # 1 16-bit instruction
+## also store the computed offset for later
+storew h080002; # 2 16-bit instructions
+## add the offset
+loadwzx h080002; # 2 16-bit instructions
+add; # 1 16-bit instruction
+## store the address in big endian
+store h080008; # 2 16-bit instructions
+load h080008; # 2 16-bit instructions
+const 256; # 2 16-bit instructions
+div; # 1 16-bit instruction
+storew h140002; # 2 16-bit instructions
+load h080008; # 2 16-bit instructions
+storeb h140003; # 2 16-bit instructions
+load h080008; # 2 16-bit instructions
+const 65536; # 2 16-bit instructions
+div; # 1 16-bit instruction
+storeb h140001; # 2 16-bit instructions
+## start SPI operation
+const 1; # 1 16-bit instruction
+storew h140204; # 2 16-bit instructions
+
+### force wait for operation completion
+const 0; # 1 16-bit instruction
+storew h140200; # 2 16-bit instructions
+
+### assume data to be ascii characters and print it to screen
+### initialize index to 0
+const 0; # 1 16-bit instruction
+storew h080004; # 2 16-bit instructions
+
+## print characters in a loop
+# there were 77 16-bit instructions up to this point, so loop address is 154
+## load current index value, get 2 copies of it, add offset to one copy
+loadwzx h080004
+loadwzx h080002
+add
+loadwzx h080004
+## load 4 bytes from SPI memory
+load+ h140000
+## write to VGA memory
+store+ h100000
+## increase index
+loadwzx h080004
+const 4
+add
+storew h080004
+## compare index to 479
+loadwzx h080004
+const 479
+lt
+cond_jump 154
+
+## increase transfers count
+loadwzx h080000
+const 1
+add
+storew h080000
+
+## switch LED2
+loadwzx h080000
+const 2
+rem
+storew h1C0006
+
+## if less than 5 transfers were done, continue with another one
+loadwzx h080000
+const 5
+lt
+cond_jump 52
+
+### after loops, start generating VGA output
+const -1
+store h100A00
+
+halt