From 67d25d837ac55f28a366c0a3b262e439a6e75fc3 Mon Sep 17 00:00:00 2001 From: Dimitri Sokolyuk Date: Sat, 19 Aug 2017 12:15:28 +0200 Subject: Add AmForth --- amforth-6.5/avr8/words/reg-b.asm | 180 +++++++++++++++++++++++++++++++++++++++ 1 file changed, 180 insertions(+) create mode 100644 amforth-6.5/avr8/words/reg-b.asm (limited to 'amforth-6.5/avr8/words/reg-b.asm') diff --git a/amforth-6.5/avr8/words/reg-b.asm b/amforth-6.5/avr8/words/reg-b.asm new file mode 100644 index 0000000..4b77e99 --- /dev/null +++ b/amforth-6.5/avr8/words/reg-b.asm @@ -0,0 +1,180 @@ +; ( -- n2 ) +; Extended VM +; Read memory pointed to by register B (Extended VM) +VE_BFETCH: + .dw $ff02 + .db "b@" + .dw VE_HEAD + .set VE_HEAD = VE_BFETCH +XT_BFETCH: + .dw PFA_BFETCH +PFA_BFETCH: + savetos + movw zl, bl + ld tosl, Z+ + ld tosh, Z+ + jmp_ DO_NEXT + +; ( n1 -- n2 ) +; Extended VM +; Read memory pointed to by register B plus offset (Extended VM) +VE_NBFETCH: + .dw $ff03 + .db "nb@",0 + .dw VE_HEAD + .set VE_HEAD = VE_NBFETCH +XT_NBFETCH: + .dw PFA_NBFETCH +PFA_NBFETCH: + movw zl, bl + add zl, tosl + adc zh, tosh + ld tosl, Z+ + ld tosh, Z+ + jmp_ DO_NEXT + +; ( -- n ) +; Extended VM +; Read memory pointed to by register B, increment B by 1 cell (Extended VM) +VE_BFETCHPLUS: + .dw $ff03 + .db "b@+",0 + .dw VE_HEAD + .set VE_HEAD = VE_BFETCHPLUS +XT_BFETCHPLUS: + .dw PFA_BFETCHPLUS +PFA_BFETCHPLUS: + savetos + movw zl, bl + ld tosl, Z+ + ld tosh, Z+ + movw bl, zl + jmp_ DO_NEXT + +; ( -- n ) +; Extended VM +; Read memory pointed to by register B, decrement B by 1 cell (Extended VM) +VE_BFETCHMINUS: + .dw $ff03 + .db "b@-",0 + .dw VE_HEAD + .set VE_HEAD = VE_BFETCHMINUS +XT_BFETCHMINUS: + .dw PFA_BFETCHMINUS +PFA_BFETCHMINUS: + savetos + movw zl, bl + ld tosh, -Z + ld tosl, -Z + movw bl, zl + jmp_ DO_NEXT + +; ( n -- ) +; Extended VM +; Write memory pointed to by register B (Extended VM) +VE_BSTORE: + .dw $ff02 + .db "b!" + .dw VE_HEAD + .set VE_HEAD = VE_BSTORE +XT_BSTORE: + .dw PFA_BSTORE +PFA_BSTORE: + movw zl, bl + st Z+, tosl + st Z+, tosh + loadtos + jmp_ DO_NEXT + +; ( n offs -- ) +; Extended VM +; Write memory pointed to by register B plus offset (Extended VM) +VE_NBSTORE: + .dw $ff03 + .db "nb!",0 + .dw VE_HEAD + .set VE_HEAD = VE_NBSTORE +XT_NBSTORE: + .dw PFA_NBSTORE +PFA_NBSTORE: + movw zl, bl + add zl, tosl + adc zh, tosh + loadtos + st Z+, tosl + st Z+, tosh + loadtos + jmp_ DO_NEXT + +; ( -- n2 ) +; Extended VM +; Write memory pointed to by register B, increment B by 1 cell (Extended VM) +VE_BSTOREPLUS: + .dw $ff03 + .db "b!+",0 + .dw VE_HEAD + .set VE_HEAD = VE_BSTOREPLUS +XT_BSTOREPLUS: + .dw PFA_BSTOREPLUS +PFA_BSTOREPLUS: + movw zl, bl + st Z+, tosl + st Z+, tosh + loadtos + movw bl, zl + jmp_ DO_NEXT + +; ( -- n2 ) +; Extended VM +; Write memory pointed to by register B, decrement B by 1 cell (Extended VM) +VE_BSTOREMINUS: + .dw $ff03 + .db "b!-",0 + .dw VE_HEAD + .set VE_HEAD = VE_BSTOREMINUS +XT_BSTOREMINUS: + .dw PFA_BSTOREMINUS +PFA_BSTOREMINUS: + movw zl, bl + st -Z, tosh + st -Z, tosl + loadtos + movw bl, zl + jmp_ DO_NEXT + + + +; ( n -- ) +; Extended VM +; Write to B register (Extended VM) +VE_TO_B: + .dw $ff02 + .db ">b" + .dw VE_HEAD + .set VE_HEAD = VE_TO_B +XT_TO_B: + .dw PFA_TO_B +PFA_TO_B: + movw bl, tosl + loadtos + jmp_ DO_NEXT + +; ( n1 -- n2 ) +; Extended VM +; read the B register (Extended VM) +VE_B_FROM: + .dw $ff02 + .db "b>" + .dw VE_HEAD + .set VE_HEAD = VE_B_FROM +XT_B_FROM: + .dw PFA_B_FROM +PFA_B_FROM: + savetos + movw tosl, bl + jmp_ DO_NEXT + +; for more information read +; http://www.complang.tuwien.ac.at/anton/euroforth/ef08/papers/pelc.pdf +; adapted index based access from X/Y registers +; note: offset is byte address, not cell! -- cgit v1.2.3