472 lines
6.8 KiB
Plaintext
472 lines
6.8 KiB
Plaintext
; Comba/KCM Macros for TI msp430
|
|
;
|
|
; The latest version of the IAR Workbench C compiler seems to have forgotten how to
|
|
; handle local variables in inline assembly language, so you might have to go and
|
|
; change a, b, c and carry in mrcomba.c to the actual registers assigned by the
|
|
; compiler. Look at the assembler .s output file to figure this.
|
|
;
|
|
; Alternatively replace a, b, c and carry with globals g_a, g_b, g_c and g_carry, as
|
|
; the compiler inline assembly does seem to recognise global variables. So at file
|
|
; scope of mrcomba.c place
|
|
;
|
|
; static mr_small *g_a,*g_b,*g_c,g_carry;
|
|
;
|
|
; and modify all references to a, b, c and carry in mrcomba.c to g_a,g_b,g_c and g_carry
|
|
;
|
|
; See ecdhp16.c for an example that uses this file
|
|
;
|
|
; Triple register is r8|r7|r6
|
|
;
|
|
; See makemcs.txt for more information about this file
|
|
;
|
|
; Contributed by Piotr Szczechowiak
|
|
; (uses hardware multiplier)
|
|
;
|
|
MACRO MUL_START
|
|
__asm (
|
|
"PUSH r10\n"
|
|
"PUSH r11\n"
|
|
"PUSH r12\n"
|
|
"MOV &a,r10\n"
|
|
"MOV &b,r11\n"
|
|
"MOV &c,r12\n"
|
|
"PUSH r8\n"
|
|
"PUSH r7\n"
|
|
"PUSH r6\n"
|
|
"PUSH r5\n"
|
|
|
|
"CLR r8\n"
|
|
"CLR r7\n"
|
|
"CLR r6\n"
|
|
"CLR r5\n"
|
|
ENDM
|
|
;
|
|
; STEP macros
|
|
;
|
|
MACRO STEP
|
|
"MOV (2*%d)(r10),r15\n"
|
|
"MOV r15,&0130h\n"
|
|
"MOV (2*%d)(r11),r15\n"
|
|
"MOV r15,&0138h\n"
|
|
"ADD &013Ah,r6\n"
|
|
"ADDC &013Ch,r7\n"
|
|
"ADDC r5,r8\n"
|
|
ENDM
|
|
;
|
|
; MFIN macro
|
|
;
|
|
MACRO MFIN
|
|
"MOV r6,(2*%d)(r12)\n"
|
|
"MOV r7,r6\n"
|
|
"MOV r8,r7\n"
|
|
"CLR r8\n"
|
|
ENDM
|
|
;
|
|
; LAST
|
|
;
|
|
MACRO LAST
|
|
"MOV (2*%d)(r10),r15\n"
|
|
"MOV r15,&0130h\n"
|
|
"MOV (2*%d)(r11),r15\n"
|
|
"MOV r15,&0138h\n"
|
|
"ADD &013Ah,r6\n"
|
|
ENDM
|
|
;
|
|
; MULE
|
|
;
|
|
MACRO MUL_END
|
|
"MOV r6,(2*%d)(r12)\n"
|
|
"POP r5\n"
|
|
"POP r6\n"
|
|
"POP r7\n"
|
|
"POP r8\n"
|
|
"POP r12\n"
|
|
"POP r11\n"
|
|
"POP r10\n"
|
|
);
|
|
ENDM
|
|
;
|
|
; SQR_START
|
|
;
|
|
MACRO SQR_START
|
|
__asm (
|
|
"PUSH r10\n"
|
|
"PUSH r12\n"
|
|
"MOV &a,r10\n"
|
|
"MOV &c,r12\n"
|
|
"PUSH r8\n"
|
|
"PUSH r7\n"
|
|
"PUSH r6\n"
|
|
"PUSH r5\n"
|
|
"CLR r8\n"
|
|
"CLR r7\n"
|
|
"CLR r6\n"
|
|
"CLR r5\n"
|
|
ENDM
|
|
;
|
|
; DSTEP
|
|
;
|
|
MACRO DSTEP
|
|
"MOV (2*%d)(r10),r15\n"
|
|
"MOV r15,&0130h\n"
|
|
"MOV (2*%d)(r10),r15\n"
|
|
"MOV r15,&0138h\n"
|
|
"ADD &013Ah,r6\n"
|
|
"ADDC &013Ch,r7\n"
|
|
"ADDC r5,r8\n"
|
|
"ADD &013Ah,r6\n"
|
|
"ADDC &013Ch,r7\n"
|
|
"ADDC r5,r8\n"
|
|
ENDM
|
|
;
|
|
; SELF
|
|
;
|
|
MACRO SELF
|
|
"MOV (2*%d)(r10),r15\n"
|
|
"MOV r15,&0130h\n"
|
|
"MOV r15,&0138h\n"
|
|
"ADD &013Ah,r6\n"
|
|
"ADDC &013Ch,r7\n"
|
|
"ADDC r5,r8\n"
|
|
ENDM
|
|
;
|
|
; SFIN
|
|
;
|
|
MACRO SFIN
|
|
"MOV r6,(2*%d)(r12)\n"
|
|
"MOV r7,r6\n"
|
|
"MOV r8,r7\n"
|
|
"CLR r8\n"
|
|
ENDM
|
|
;
|
|
; SQR_END
|
|
;
|
|
MACRO SQR_END
|
|
"MOV r6,(2*%d)(r12)\n"
|
|
"POP r5\n"
|
|
"POP r6\n"
|
|
"POP r7\n"
|
|
"POP r8\n"
|
|
"POP r12\n"
|
|
"POP r10\n"
|
|
);
|
|
ENDM
|
|
;
|
|
; REDC_START
|
|
;
|
|
MACRO REDC_START
|
|
__asm (
|
|
"PUSH r10\n"
|
|
"PUSH r11\n"
|
|
"PUSH r12\n"
|
|
"MOV &a,r10\n"
|
|
"MOV &b,r11\n"
|
|
"MOV &ndash,r12\n"
|
|
"PUSH r8\n"
|
|
"PUSH r7\n"
|
|
"PUSH r6\n"
|
|
"PUSH r5\n"
|
|
"CLR r8\n"
|
|
"CLR r7\n"
|
|
"MOV r10,r6\n"
|
|
"CLR r5\n"
|
|
ENDM
|
|
;
|
|
; RFINU macro
|
|
;
|
|
MACRO RFINU
|
|
"MOV r6,&0130h\n"
|
|
"MOV r12,&0138h\n"
|
|
"MOV &013Ah,(2*%d)(r10)\n"
|
|
"MOV r11,&0130h\n"
|
|
"MOV &013Ah,&0138h\n"
|
|
"ADD &013Ah,r6\n"
|
|
"ADDC &013Ch,r7\n"
|
|
"ADDC r5,r8\n"
|
|
"MOV r7,r6\n"
|
|
"MOV r8,r7\n"
|
|
"CLR r8\n"
|
|
"MOV (2*(%d+1))(r10),r15\n"
|
|
"ADD r15,r6\n"
|
|
"ADDC r5,r7\n"
|
|
"CLR r8\n"
|
|
ENDM
|
|
;
|
|
; RFIND macro
|
|
;
|
|
MACRO RFIND
|
|
"MOV r6,(2*%d)(r10)\n"
|
|
"MOV r7,r6\n"
|
|
"MOV r8,r7\n"
|
|
"CLR r8\n"
|
|
"MOV (2*(%d+1))(r10),r15\n"
|
|
"ADD r15,r6\n"
|
|
"ADDC r5,r7\n"
|
|
"CLR r8\n"
|
|
ENDM
|
|
;
|
|
; REDC_END macro
|
|
;
|
|
MACRO REDC_END
|
|
"MOV r6,(2*%d)(r10)\n"
|
|
"MOV r7,(2*(%d+1))(r10)\n"
|
|
"POP r5\n"
|
|
"POP r6\n"
|
|
"POP r7\n"
|
|
"POP r8\n"
|
|
"POP r12\n"
|
|
"POP r11\n"
|
|
"POP r10\n"
|
|
);
|
|
ENDM
|
|
;
|
|
; ADD_START macro
|
|
;
|
|
MACRO ADD_START
|
|
__asm (
|
|
"PUSH r10\n"
|
|
"PUSH r11\n"
|
|
"PUSH r12\n"
|
|
"PUSH r13\n"
|
|
"MOV &a,r10\n"
|
|
"MOV &b,r11\n"
|
|
"MOV &c,r12\n"
|
|
"MOV (2*0)(r10),r15\n"
|
|
"MOV (2*0)(r11),r13\n"
|
|
"ADD r13,r15\n"
|
|
"MOV r15,(2*0)(r12)\n"
|
|
ENDM
|
|
;
|
|
; ADD macro - c[.]=a[.]+b[.]
|
|
;
|
|
MACRO ADD
|
|
"MOV (2*%d)(r10),r15\n"
|
|
"MOV (2*%d)(r11),r13\n"
|
|
"ADDC r13,r15\n"
|
|
"MOV r15,(2*%d)(r12)\n"
|
|
ENDM
|
|
;
|
|
; ADD_END macro.
|
|
;
|
|
MACRO ADD_END
|
|
"CLR r15\n"
|
|
"ADC r15\n"
|
|
"MOV r15,&carry\n"
|
|
"POP r13\n"
|
|
"POP r12\n"
|
|
"POP r11\n"
|
|
"POP r10\n"
|
|
);
|
|
ENDM
|
|
;
|
|
; INC_START macro. Do first one.
|
|
;
|
|
MACRO INC_START
|
|
__asm (
|
|
"PUSH r10\n"
|
|
"PUSH r11\n"
|
|
"PUSH r13\n"
|
|
"MOV &a,r10\n"
|
|
"MOV &b,r11\n"
|
|
"MOV (2*0)(r10),r15\n"
|
|
"MOV (2*0)(r11),r13\n"
|
|
"ADD r13,r15\n"
|
|
"MOV r15,(2*0)(r10)\n"
|
|
ENDM
|
|
;
|
|
; INC macro a[.]+=b[.]
|
|
;
|
|
MACRO INC
|
|
"MOV (2*%d)(r10),r15\n"
|
|
"MOV (2*%d)(r11),r13\n"
|
|
"ADDC r13,r15\n"
|
|
"MOV r15,(2*%d)(r10)\n"
|
|
ENDM
|
|
MACRO INC_END
|
|
"CLR r15\n"
|
|
"ADC r15\n"
|
|
"MOV r15,&carry\n"
|
|
"POP r13\n"
|
|
"POP r11\n"
|
|
"POP r10\n"
|
|
);
|
|
ENDM
|
|
MACRO SUB_START
|
|
__asm (
|
|
"PUSH r10\n"
|
|
"PUSH r11\n"
|
|
"PUSH r12\n"
|
|
"PUSH r13\n"
|
|
"MOV &a,r10\n"
|
|
"MOV &b,r11\n"
|
|
"MOV &c,r12\n"
|
|
"MOV (2*0)(r10),r15\n"
|
|
"MOV (2*0)(r11),r13\n"
|
|
"SUB r13,r15\n"
|
|
"MOV r15,(2*0)(r12)\n"
|
|
ENDM
|
|
;
|
|
; SUB macro - c[.]=a[.]-b[.]
|
|
;
|
|
MACRO SUB
|
|
"MOV (2*%d)(r10),r15\n"
|
|
"MOV (2*%d)(r11),r13\n"
|
|
"SUBC r13,r15\n"
|
|
"MOV r15,(2*%d)(r12)\n"
|
|
ENDM
|
|
MACRO SUB_END
|
|
"CLR r15\n"
|
|
"ADC r15\n"
|
|
"XOR.B #1,r15\n"
|
|
"MOV r15,&carry\n"
|
|
"POP r13\n"
|
|
"POP r12\n"
|
|
"POP r11\n"
|
|
"POP r10\n"
|
|
);
|
|
ENDM
|
|
;
|
|
; DEC_START macro
|
|
;
|
|
MACRO DEC_START
|
|
__asm (
|
|
"PUSH r10\n"
|
|
"PUSH r11\n"
|
|
"PUSH r13\n"
|
|
"MOV &a,r10\n"
|
|
"MOV &b,r11\n"
|
|
"MOV (2*0)(r10),r15\n"
|
|
"MOV (2*0)(r11),r13\n"
|
|
"SUB r13,r15\n"
|
|
"MOV r15,(2*0)(r10)\n"
|
|
ENDM
|
|
;
|
|
; DEC macro a[.]-=b[.]
|
|
;
|
|
MACRO DEC
|
|
"MOV (2*%d)(r10),r15\n"
|
|
"MOV (2*%d)(r11),r13\n"
|
|
"SUBC r13,r15\n"
|
|
"MOV r15,(2*%d)(r10)\n"
|
|
ENDM
|
|
;
|
|
; DEC_END macro
|
|
;
|
|
MACRO DEC_END
|
|
"CLR r15\n"
|
|
"ADC r15\n"
|
|
"XOR.B #1,r15\n"
|
|
"MOV r15,&carry\n"
|
|
"POP r13\n"
|
|
"POP r11\n"
|
|
"POP r10\n"
|
|
);
|
|
ENDM
|
|
;
|
|
; KADD_START macro. Zero Carry
|
|
;
|
|
MACRO KADD_START
|
|
"PUSH r10\n"
|
|
"PUSH r11\n"
|
|
"PUSH r12\n"
|
|
"PUSH r13\n"
|
|
"MOV &a,r10\n"
|
|
"MOV &b,r11\n"
|
|
"MOV &c,r12\n"
|
|
"MOV &n,r13\n"
|
|
"CLRC\n"
|
|
"k%d:\n"
|
|
ENDM
|
|
;
|
|
; KASL macro
|
|
;
|
|
MACRO KASL
|
|
"DEC r13\n"
|
|
"JZ k%d\n"
|
|
"CLR r15\n"
|
|
"ADC r15\n"
|
|
"ADD #(2*%d),r10\n"
|
|
"ADD #(2*%d),r11\n"
|
|
"ADD #(2*%d),r12\n"
|
|
"RRC r15\n"
|
|
"JMP k%d\n"
|
|
"k%d:\n"
|
|
ENDM
|
|
;
|
|
; KADD_END macro
|
|
;
|
|
MACRO KADD_END
|
|
"CLR r15\n"
|
|
"ADC r15\n"
|
|
"MOV r15,&carry\n"
|
|
"POP r13\n"
|
|
"POP r12\n"
|
|
"POP r11\n"
|
|
"POP r10\n"
|
|
);
|
|
ENDM
|
|
;
|
|
; KINC_START macro
|
|
;
|
|
MACRO KINC_START
|
|
"PUSH r10\n"
|
|
"PUSH r11\n"
|
|
"PUSH r13\n"
|
|
"MOV &a,r10\n"
|
|
"MOV &b,r11\n"
|
|
"MOV &n,r13\n"
|
|
"CLRC\n"
|
|
"k%d:\n"
|
|
ENDM
|
|
;
|
|
; KIDL macro
|
|
;
|
|
MACRO KIDL
|
|
"DEC r13\n"
|
|
"JZ k%d\n"
|
|
"CLR r15\n"
|
|
"ADC r15\n"
|
|
"ADD #(2*%d),r10\n"
|
|
"ADD #(2*%d),r11\n"
|
|
"RRC r15\n"
|
|
"JMP k%d\n"
|
|
"k%d:\n"
|
|
ENDM
|
|
;
|
|
; KINC_END macro
|
|
;
|
|
MACRO KINC_END
|
|
"CLR r15\n"
|
|
"ADC r15\n"
|
|
"MOV r15,&carry\n"
|
|
"POP r13\n"
|
|
"POP r11\n"
|
|
"POP r10\n"
|
|
);
|
|
ENDM
|
|
;
|
|
; KDEC_START macro. Zero carry
|
|
;
|
|
MACRO KDEC_START
|
|
"PUSH r10\n"
|
|
"PUSH r11\n"
|
|
"PUSH r13\n"
|
|
"MOV &a,r10\n"
|
|
"MOV &b,r11\n"
|
|
"MOV &n,r13\n"
|
|
"CLRC\n"
|
|
"k%d:\n"
|
|
ENDM
|
|
;
|
|
; KDEC_END macro
|
|
;
|
|
MACRO KDEC_END
|
|
"CLR r15\n"
|
|
"ADC r15\n"
|
|
"MOV r15,&carry\n"
|
|
"POP r13\n"
|
|
"POP r11\n"
|
|
"POP r10\n"
|
|
);
|
|
ENDM
|