aboutsummaryrefslogtreecommitdiff
path: root/amforth-6.5/msp430/words/um-star.asm
blob: 7b031b052b0a42f0729054ed3c6f1368178a71c2 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
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