aboutsummaryrefslogtreecommitdiff
path: root/amforth-6.5/msp430/words/um-star.asm
diff options
context:
space:
mode:
authorDimitri Sokolyuk <demon@dim13.org>2017-08-19 12:15:28 +0200
committerDimitri Sokolyuk <demon@dim13.org>2017-08-19 12:15:28 +0200
commit67d25d837ac55f28a366c0a3b262e439a6e75fc3 (patch)
treedf7715c7724c5935ab87c807f3b8b4ef529315e3 /amforth-6.5/msp430/words/um-star.asm
parente0d6784e89dba33226c0edb815bb974486fa7c48 (diff)
Add AmForth
Diffstat (limited to 'amforth-6.5/msp430/words/um-star.asm')
-rw-r--r--amforth-6.5/msp430/words/um-star.asm38
1 files changed, 38 insertions, 0 deletions
diff --git a/amforth-6.5/msp430/words/um-star.asm b/amforth-6.5/msp430/words/um-star.asm
new file mode 100644
index 0000000..7b031b0
--- /dev/null
+++ b/amforth-6.5/msp430/words/um-star.asm
@@ -0,0 +1,38 @@
+;C UM* u1 u2 -- ud unsigned 16x16->32 mult.
+ CODEHEADER(XT_UMSTAR,3,"um*")
+.ifdef MPY
+ dint
+ mov @PSP, &MPY
+ mov TOS, &OP2
+ nop ; 1 cycle for calculation
+ mov &RESLO, 0(PSP)
+ mov &RESHI, TOS
+ eint
+.else
+ ; IROP1 = TOS register
+ MOV @PSP,IROP2L ; get u1, leave room on stack
+ PUSH IRACL ; possibly used as register B
+;
+; T.I. SIGNED MULTIPLY SUBROUTINE: IROP1 x IROP2L -> IRACM|IRACL
+MPYU: CLR IRACL ; 0 -> LSBs RESULT
+ CLR IRACM ; 0 -> MSBs RESULT
+; UNSIGNED MULTIPLY AND ACCUMULATE SUBROUTINE:
+; (IROP1 x IROP2L) + IRACM|IRACL -> IRACM|IRACL
+MACU: CLR IROP2M ; MSBs MULTIPLIER
+ MOV #1,IRBT ; BIT TEST REGISTER
+L_002: BIT IRBT,IROP1 ; TEST ACTUAL BIT
+ JZ L_01 ; IF 0: DO NOTHING
+ ADD IROP2L,IRACL ; IF 1: ADD MULTIPLIER TO RESULT
+ ADDC IROP2M,IRACM
+L_01: RLA IROP2L ; MULTIPLIER x 2
+ RLC IROP2M
+;
+ RLA IRBT ; NEXT BIT TO TEST
+ JNC L_002 ; IF BIT IN CARRY: FINISHED
+; END T.I. ROUTINE section 5.1.1 of MSP430 Family Application Reports
+ MOV IRACL,0(PSP) ; low result on stack
+ MOV IRACM,TOS ; high result in TOS
+ POP IRACL ; possibly used as register B
+
+.endif
+ NEXT