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/umslashmod.asm | 62 +++++++++++++++++++++++++++++++++++ 1 file changed, 62 insertions(+) create mode 100644 amforth-6.5/avr8/words/umslashmod.asm (limited to 'amforth-6.5/avr8/words/umslashmod.asm') diff --git a/amforth-6.5/avr8/words/umslashmod.asm b/amforth-6.5/avr8/words/umslashmod.asm new file mode 100644 index 0000000..6adfbb1 --- /dev/null +++ b/amforth-6.5/avr8/words/umslashmod.asm @@ -0,0 +1,62 @@ +; ( ud u2 -- rem quot) +; Arithmetics +; unsigned division ud / u2 with remainder +VE_UMSLASHMOD: + .dw $ff06 + .db "um/mod" + .dw VE_HEAD + .set VE_HEAD = VE_UMSLASHMOD +XT_UMSLASHMOD: + .dw PFA_UMSLASHMOD +PFA_UMSLASHMOD: + movw temp4, tosl + + ld temp2, Y+ + ld temp3, Y+ + + ld temp0, Y+ + ld temp1, Y+ + +;; unsigned 32/16 -> 16r16 divide + +PFA_UMSLASHMODmod: + + ; set loop counter + ldi temp6,$10 + +PFA_UMSLASHMODmod_loop: + ; shift left, saving high bit + clr temp7 + lsl temp0 + rol temp1 + rol temp2 + rol temp3 + rol temp7 + + ; try subtracting divisor + cp temp2, temp4 + cpc temp3, temp5 + cpc temp7,zerol + + brcs PFA_UMSLASHMODmod_loop_control + +PFA_UMSLASHMODmod_subtract: + ; dividend is large enough + ; do the subtraction for real + ; and set lowest bit + inc temp0 + sub temp2, temp4 + sbc temp3, temp5 + +PFA_UMSLASHMODmod_loop_control: + dec temp6 + brne PFA_UMSLASHMODmod_loop + +PFA_UMSLASHMODmod_done: + ; put remainder on stack + st -Y,temp3 + st -Y,temp2 + + ; put quotient on stack + movw tosl, temp0 + jmp_ DO_NEXT -- cgit v1.2.3