Add "16bit * 8bit / 8bit" to fixed point math library
This commit is contained in:
parent
4538f0295d
commit
8c77a5d256
|
@ -426,3 +426,92 @@ int lmuldiv16s(int a, int b, int c)
|
|||
E1:
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
unsigned lmuldiv16by8(unsigned a, char b, char c)
|
||||
{
|
||||
__asm {
|
||||
|
||||
lda #0
|
||||
sta accu + 0
|
||||
sta accu + 1
|
||||
sta accu + 2
|
||||
sta accu + 3
|
||||
|
||||
lda b
|
||||
beq z1
|
||||
|
||||
lda c
|
||||
l1:
|
||||
asl
|
||||
bcs e1
|
||||
cmp b
|
||||
bcs e2
|
||||
|
||||
asl a + 0
|
||||
rol a + 1
|
||||
jmp l1
|
||||
e2:
|
||||
clc
|
||||
e1:
|
||||
ror
|
||||
sta c
|
||||
|
||||
ldx #16
|
||||
l2:
|
||||
lda b
|
||||
sec
|
||||
sbc c
|
||||
bcc w1
|
||||
sta b
|
||||
|
||||
clc
|
||||
lda accu + 2
|
||||
adc a
|
||||
sta accu + 2
|
||||
lda accu + 3
|
||||
adc a + 1
|
||||
sta accu + 3
|
||||
bcc * + 8
|
||||
inc accu + 0
|
||||
bne * + 4
|
||||
inc accu + 1
|
||||
|
||||
w1:
|
||||
asl accu + 2
|
||||
rol accu + 3
|
||||
rol accu + 0
|
||||
rol accu + 1
|
||||
|
||||
asl b
|
||||
bcc w2
|
||||
lda b
|
||||
sbc c
|
||||
sta b
|
||||
|
||||
clc
|
||||
lda accu + 2
|
||||
adc a
|
||||
sta accu + 2
|
||||
lda accu + 3
|
||||
adc a + 1
|
||||
sta accu + 3
|
||||
bcc * + 8
|
||||
inc accu + 0
|
||||
bne * + 4
|
||||
inc accu + 1
|
||||
|
||||
w2:
|
||||
dex
|
||||
bne l2
|
||||
z1:
|
||||
}
|
||||
}
|
||||
|
||||
int lmuldiv16sby8(int a, char b, char c)
|
||||
{
|
||||
if (a < 0)
|
||||
return -(int)lmuldiv16by8(-a, b, c);
|
||||
else
|
||||
return lmuldiv16by8(a, b, c);
|
||||
}
|
||||
|
|
|
@ -37,6 +37,11 @@ __native unsigned lmuldiv16u(unsigned a, unsigned b, unsigned c)
|
|||
// Multiply two signed 16bit numbers and divide the result by another signed 16bit number a * b / c
|
||||
__native int lmuldiv16s(int a, int b, int c)
|
||||
|
||||
|
||||
__native unsigned lmuldiv16by8(unsigned a, char b, char c);
|
||||
|
||||
inline int lmuldiv16sby8(int a, char b, char c);
|
||||
|
||||
#pragma compile("fixmath.c")
|
||||
|
||||
#endif
|
||||
|
|
|
@ -15325,8 +15325,11 @@ bool NativeCodeBasicBlock::PeepHoleOptimizer(NativeCodeProcedure* proc, int pass
|
|||
}
|
||||
else if (mIns[i].mType == ASMIT_STY && (mIns[i].mMode == ASMIM_ZERO_PAGE || mIns[i].mMode == ASMIM_ABSOLUTE))
|
||||
{
|
||||
if (MoveStoreYUp(i))
|
||||
changed = true;
|
||||
if (i > 1 || mIns[0].mType != ASMIT_STX)
|
||||
{
|
||||
if (MoveStoreYUp(i))
|
||||
changed = true;
|
||||
}
|
||||
}
|
||||
else if (mIns[i].mType == ASMIT_LDY && mIns[i].mMode == ASMIM_ZERO_PAGE && !(mIns[i].mLive & LIVE_MEM))
|
||||
{
|
||||
|
|
Loading…
Reference in New Issue