aboutsummaryrefslogtreecommitdiff
path: root/amforth-6.5/avr8/words/n-spi.asm
diff options
context:
space:
mode:
Diffstat (limited to 'amforth-6.5/avr8/words/n-spi.asm')
-rw-r--r--amforth-6.5/avr8/words/n-spi.asm55
1 files changed, 55 insertions, 0 deletions
diff --git a/amforth-6.5/avr8/words/n-spi.asm b/amforth-6.5/avr8/words/n-spi.asm
new file mode 100644
index 0000000..45f6cdc
--- /dev/null
+++ b/amforth-6.5/avr8/words/n-spi.asm
@@ -0,0 +1,55 @@
+; ( addr len -- )
+; MCU
+; read len bytes from SPI to addr
+VE_N_SPIR:
+ .dw $ff05
+ .db "n@spi",0
+ .dw VE_HEAD
+ .set VE_HEAD = VE_N_SPIR
+XT_N_SPIR:
+ .dw PFA_N_SPIR
+PFA_N_SPIR:
+ movw temp0, tosl
+ loadtos
+ movw zl, tosl
+ movw tosl, temp0
+PFA_N_SPIR_LOOP:
+ out_ SPDR, zerol
+PFA_N_SPIR_LOOP1:
+ in_ temp2, SPSR
+ sbrs temp2, SPIF
+ rjmp PFA_N_SPIR_LOOP1
+ in_ temp2, SPDR
+ st Z+, temp2
+ sbiw tosl, 1
+ brne PFA_N_SPIR_LOOP
+ loadtos
+ jmp_ DO_NEXT
+
+; ( addr len -- )
+; MCU
+; write len bytes to SPI from addr
+VE_N_SPIW:
+ .dw $ff05
+ .db "n!spi",0
+ .dw VE_HEAD
+ .set VE_HEAD = VE_N_SPIW
+XT_N_SPIW:
+ .dw PFA_N_SPIW
+PFA_N_SPIW:
+ movw temp0, tosl
+ loadtos
+ movw zl, tosl
+ movw tosl, temp0
+PFA_N_SPIW_LOOP:
+ ld temp2, Z+
+ out_ SPDR, temp2
+PFA_N_SPIW_LOOP1:
+ in_ temp2, SPSR
+ sbrs temp2, SPIF
+ rjmp PFA_N_SPIW_LOOP1
+ in_ temp2, SPDR ; ignore the data
+ sbiw tosl, 1
+ brne PFA_N_SPIW_LOOP
+ loadtos
+ jmp_ DO_NEXT