+ __endasm;
+}
+
+#elif defined(_MULLONG_ASM_LARGE)
+
+void
+_mullong_dummy (void) __naked
+{
+ __asm
+
+__mullong:
+
+ .globl __mullong
+
+ ; the result c will be stored in r4...r7
+ #define c0 r4
+ #define c1 r5
+ #define c2 r6
+ #define c3 r7
+
+ ; c0 a0 * b0
+ ; c1 a1 * b0 + a0 * b1
+ ; c2 a2 * b0 + a1 * b1 + a0 * b2
+ ; c3 a3 * b0 + a2 * b1 + a1 * b2 + a0 * b3
+
+#if !defined(SDCC_PARMS_IN_BANK1)
+ .area XSEG (XDATA)
+
+__mullong_PARM_2:
+
+ .globl __mullong_PARM_2
+
+ .ds 4
+#endif
+ .area CSEG (CODE)
+
+ ; parameter a comes in a, b, dph, dpl
+ mov r0,dpl ; save parameter a
+ mov r1,dph
+ mov r2,b
+ mov r3,a
+
+ #define a0 r0
+ #define a1 r1
+ #define a2 r2
+ #define a3 r3
+
+ ; Byte 0
+ mov b,a0
+#if defined(SDCC_PARMS_IN_BANK1)
+ mov a,b1_0 ; b0
+#else
+ mov dptr,#__mullong_PARM_2
+ movx a,@dptr ; b0
+#endif
+ mul ab ; a0 * b0
+ mov c0,a
+ mov c1,b
+
+ ; Byte 1
+ mov b,a1
+#if defined(SDCC_PARMS_IN_BANK1)
+ mov a,b1_0 ; b0
+#else
+ movx a,@dptr ; b0
+#endif
+ mul ab ; a1 * b0
+ add a,c1
+ mov c1,a
+ clr a
+ addc a,b
+ mov c2,a
+
+ mov b,a0
+#if defined(SDCC_PARMS_IN_BANK1)
+ mov a,b1_1 ; b1
+#else
+ inc dptr ; b1
+ movx a,@dptr
+#endif
+ mul ab ; a0 * b1
+ add a,c1
+ mov c1,a
+ mov a,b
+ addc a,c2
+ mov c2,a
+ clr a
+ rlc a
+ mov c3,a
+
+ ; Byte 2
+ mov b,a1
+#if defined(SDCC_PARMS_IN_BANK1)
+ mov a,b1_1 ; b1
+#else
+ movx a,@dptr ; b1
+#endif
+ mul ab ; a1 * b1
+ add a,c2
+ mov c2,a
+ mov a,b
+ addc a,c3
+ mov c3,a
+
+ mov b,a0
+#if defined(SDCC_PARMS_IN_BANK1)
+ mov a,b1_2 ; b2
+#else
+ inc dptr ; b2
+ movx a,@dptr
+#endif
+ mul ab ; a0 * b2
+ add a,c2
+ mov c2,a
+ mov a,b
+ addc a,c3
+ mov c3,a
+
+ mov b,a2
+#if defined(SDCC_PARMS_IN_BANK1)
+ mov a,b1_0 ; b0
+#else
+ mov dptr,#__mullong_PARM_2
+ movx a,@dptr ; b0
+#endif
+ mul ab ; a2 * b0
+ add a,c2
+ mov c2,a
+ mov a,b
+ addc a,c3
+ mov c3,a
+
+ ; Byte 3
+ mov b,a3
+#if defined(SDCC_PARMS_IN_BANK1)
+ mov a,b1_0 ; b0
+#else
+ movx a,@dptr ; b0
+#endif
+ mul ab ; a3 * b0
+ add a,c3
+ mov c3,a
+
+ mov b,a2
+#if defined(SDCC_PARMS_IN_BANK1)
+ mov a,b1_1 ; b1
+#else
+ inc dptr ; b1
+ movx a,@dptr
+#endif
+ mul ab ; a2 * b1
+ add a,c3
+ mov c3,a
+
+ mov b,a1
+#if defined(SDCC_PARMS_IN_BANK1)
+ mov a,b1_2 ; b2
+#else
+ inc dptr ; b2
+ movx a,@dptr
+#endif
+ mul ab ; a1 * b2
+ add a,c3
+ mov c3,a
+
+ mov b,a0
+#if defined(SDCC_PARMS_IN_BANK1)
+ mov a,b1_3 ; b3
+#else
+ inc dptr ; b3
+ movx a,@dptr
+#endif
+ mul ab ; a0 * b3
+ add a,c3
+
+ mov b,c2
+ mov dph,c1
+ mov dpl,c0
+ ret
+
+ __endasm;
+}
+
+#elif defined(SDCC_USE_XSTACK) && defined(SDCC_STACK_AUTO)
+
+void
+_mullong_dummy (void) __naked
+{
+ __asm
+
+__mullong:
+
+ .globl __mullong
+
+ ; the result c will be stored in r4...r7
+ #define c0 r4
+ #define c1 r5
+ #define c2 r6
+ #define c3 r7
+
+ #define a0 dpl
+ #define a1 dph
+ #define a2 r2
+ #define a3 r3
+
+ #define b0 r1
+
+ ; c0 a0 * b0
+ ; c1 a1 * b0 + a0 * b1
+ ; c2 a2 * b0 + a1 * b1 + a0 * b2
+ ; c3 a3 * b0 + a2 * b1 + a1 * b2 + a0 * b3
+
+ ; parameter a comes in a, b, dph, dpl
+ mov r2,b ; save parameter a
+ mov r3,a
+
+ mov a,#-4 ; 1 b 4 bytes
+ add a,_spx ; 1
+ mov r0,a ; 1 r0 points to b0
+
+ ; Byte 0
+ movx a,@r0 ; b0
+ mov b0,a ; we need b0 several times
+ inc r0 ; r0 points to b1
+ mov b,a0
+ mul ab ; a0 * b0
+ mov c0,a
+ mov c1,b
+
+ ; Byte 1
+ mov a,a1
+ mov b,b0
+ mul ab ; a1 * b0
+ add a,c1
+ mov c1,a
+ clr a
+ addc a,b
+ mov c2,a
+
+ mov b,a0
+ movx a,@r0 ; b1
+ mul ab ; a0 * b1
+ add a,c1
+ mov c1,a
+ mov a,b
+ addc a,c2
+ mov c2,a
+ clr a
+ rlc a
+ mov c3,a
+
+ ; Byte 2
+ mov a,a2
+ mov b,b0
+ mul ab ; a2 * b0
+ add a,c2
+ mov c2,a
+ mov a,b
+ addc a,c3
+ mov c3,a
+
+ mov b,a1
+ movx a,@r0 ; b1
+ mul ab ; a1 * b1
+ add a,c2
+ mov c2,a
+ mov a,b
+ addc a,c3
+ mov c3,a
+
+ mov b,a0
+ inc r0
+ movx a,@r0 ; b2
+ mul ab ; a0 * b2
+ add a,c2
+ mov c2,a
+ mov a,b
+ addc a,c3
+ mov c3,a
+
+ ; Byte 3
+ mov a,a3
+ mov b,b0
+ mul ab ; a3 * b0
+ add a,c3
+ mov c3,a
+
+ mov b,a1
+ movx a,@r0 ; b2
+ mul ab ; a1 * b2
+ add a,c3
+ mov c3,a
+
+ mov b,a2
+ dec r0
+ movx a,@r0 ; b1
+ mul ab ; a2 * b1
+ add a,c3
+ mov c3,a
+
+ mov b,a0
+ inc r0
+ inc r0
+ movx a,@r0 ; b3
+ mul ab ; a0 * b3
+ add a,c3
+
+ mov b,c2
+ mov dph,c1
+ mov dpl,c0
+
+ ret
+
+ __endasm;