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/msp430/words/um-star.asm | 38 ++++++++++++++++++++++++++++++++++++ 1 file changed, 38 insertions(+) create mode 100644 amforth-6.5/msp430/words/um-star.asm (limited to 'amforth-6.5/msp430/words/um-star.asm') 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 -- cgit v1.2.3