Fix table based multiplication for 16bit results
This commit is contained in:
parent
34220b96e3
commit
05d6b3d223
|
@ -4897,7 +4897,7 @@ int NativeCodeBasicBlock::ShortMultiply(InterCodeProcedure* proc, NativeCodeProc
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
mIns.Push(NativeCodeInstruction(ASMIT_LDA, ASMIM_ABSOLUTE_X, 0, nproc->mGenerator->AllocateShortMulTable(mul, ins->mSrc[index].mRange.mMaxValue + 1, true)));
|
mIns.Push(NativeCodeInstruction(ASMIT_LDA, ASMIM_ABSOLUTE_X, 0, nproc->mGenerator->AllocateShortMulTable(mul, ins->mSrc[index].mRange.mMaxValue + 1, true)));
|
||||||
mIns.Push(NativeCodeInstruction(ASMIT_STA, ASMIM_ZERO_PAGE, dreg));
|
mIns.Push(NativeCodeInstruction(ASMIT_STA, ASMIM_ZERO_PAGE, dreg + 1));
|
||||||
}
|
}
|
||||||
|
|
||||||
return dreg;
|
return dreg;
|
||||||
|
|
|
@ -0,0 +1,169 @@
|
||||||
|
#include <c64/joystick.h>
|
||||||
|
#include <c64/vic.h>
|
||||||
|
#include <c64/sprites.h>
|
||||||
|
#include <c64/memmap.h>
|
||||||
|
#include <c64/rasterirq.h>
|
||||||
|
#include <stdlib.h>
|
||||||
|
#include <string.h>
|
||||||
|
#include <assert.h>
|
||||||
|
#include <stdio.h>
|
||||||
|
|
||||||
|
// Character set
|
||||||
|
char charset[2048] = {
|
||||||
|
#embed "../resources/breakoutchars.bin"
|
||||||
|
};
|
||||||
|
|
||||||
|
char spriteset[2048] = {
|
||||||
|
#embed "../resources/breakoutsprites.bin"
|
||||||
|
};
|
||||||
|
|
||||||
|
byte * const Screen = (byte *)0xc800;
|
||||||
|
byte * const Font = (byte *)0xd000;
|
||||||
|
byte * const Color = (byte *)0xd800;
|
||||||
|
byte * const Sprites = (byte *)0xd800;
|
||||||
|
|
||||||
|
|
||||||
|
inline void brick_put(char x, char y, char c)
|
||||||
|
{
|
||||||
|
Screen[40 * y + x + 0] = 96; Color[40 * y + x + 0] = c;
|
||||||
|
Screen[40 * y + x + 1] = 97; Color[40 * y + x + 1] = c;
|
||||||
|
Screen[40 * y + x + 2] = 98; Color[40 * y + x + 2] = c;
|
||||||
|
Screen[40 * y + x + 40] = 99; Color[40 * y + x + 40] = c;
|
||||||
|
Screen[40 * y + x + 41] = 100; Color[40 * y + x + 41] = c;
|
||||||
|
Screen[40 * y + x + 42] = 101; Color[40 * y + x + 42] = c;
|
||||||
|
}
|
||||||
|
|
||||||
|
void brick_init(void)
|
||||||
|
{
|
||||||
|
for(char y=0; y<6; y++)
|
||||||
|
{
|
||||||
|
for(char x=0; x<12; x++)
|
||||||
|
{
|
||||||
|
brick_put(3 * x + 2, 2 * y + 2, 8 + y);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void brick_clr(char x, char y)
|
||||||
|
{
|
||||||
|
char c = Screen[40 * y + x + 0];
|
||||||
|
|
||||||
|
if (c >= 96 && c < 102)
|
||||||
|
{
|
||||||
|
c -= 96;
|
||||||
|
|
||||||
|
if (c >= 3)
|
||||||
|
{
|
||||||
|
y --;
|
||||||
|
c -= 3;
|
||||||
|
}
|
||||||
|
|
||||||
|
x -= c;
|
||||||
|
|
||||||
|
Screen[40 * y + x + 0] = 32;
|
||||||
|
Screen[40 * y + x + 1] = 32;
|
||||||
|
Screen[40 * y + x + 2] = 32;
|
||||||
|
Screen[40 * y + x + 40] = 32;
|
||||||
|
Screen[40 * y + x + 41] = 32;
|
||||||
|
Screen[40 * y + x + 42] = 32;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
int main(void)
|
||||||
|
{
|
||||||
|
mmap_trampoline();
|
||||||
|
|
||||||
|
// Install character set
|
||||||
|
mmap_set(MMAP_RAM);
|
||||||
|
memcpy(Font, charset, 2048);
|
||||||
|
memcpy(Sprites, spriteset, 256);
|
||||||
|
mmap_set(MMAP_NO_BASIC);
|
||||||
|
|
||||||
|
// Switch screen
|
||||||
|
vic_setmode(VICM_TEXT_MC, Screen, Font);
|
||||||
|
|
||||||
|
spr_init(Screen);
|
||||||
|
|
||||||
|
// Change colors
|
||||||
|
vic.color_border = VCOL_BLACK;
|
||||||
|
vic.color_back = VCOL_BLUE;
|
||||||
|
vic.color_back1 = VCOL_WHITE;
|
||||||
|
vic.color_back2 = VCOL_DARK_GREY;
|
||||||
|
|
||||||
|
memset(Screen, ' ', 1000);
|
||||||
|
|
||||||
|
brick_init();
|
||||||
|
|
||||||
|
float sx = 100, sy = 180, vx = 3.2, vy = -4.0;
|
||||||
|
|
||||||
|
spr_set(0, true, 200, 200, 96, 1, false, false, false);
|
||||||
|
|
||||||
|
for(;;)
|
||||||
|
{
|
||||||
|
vic.color_border++;
|
||||||
|
|
||||||
|
for(char i=0; i<4; i++)
|
||||||
|
{
|
||||||
|
sx += vx;
|
||||||
|
sy += vy;
|
||||||
|
// vy += 0.01;
|
||||||
|
|
||||||
|
bool mirrorX = false, mirrorY = false;
|
||||||
|
|
||||||
|
if (sx + 6 > 320 || sx < 0)
|
||||||
|
mirrorX = true;
|
||||||
|
if (sy + 6 > 200 || sy < 0)
|
||||||
|
mirrorY = true;
|
||||||
|
|
||||||
|
int x0 = (int)sx >> 3;
|
||||||
|
int y0 = (int)sy >> 3;
|
||||||
|
int x1 = (int)(sx + 6) >> 3;
|
||||||
|
int y1 = (int)(sy + 6) >> 3;
|
||||||
|
|
||||||
|
bool c00 = y0 >= 0 && Screen[40 * y0 + x0] >= 96;
|
||||||
|
bool c01 = y0 >= 0 && Screen[40 * y0 + x1] >= 96;
|
||||||
|
bool c10 = y1 < 24 && Screen[40 * y1 + x0] >= 96;
|
||||||
|
bool c11 = y1 < 24 && Screen[40 * y1 + x1] >= 96;
|
||||||
|
|
||||||
|
if (vx < 0 && (c00 && !c01 || c10 && !c11))
|
||||||
|
mirrorX = true;
|
||||||
|
else if (vx > 0 && (c01 && !c00 || c11 && !c10))
|
||||||
|
mirrorX = true;
|
||||||
|
|
||||||
|
if (vy < 0 && (c00 && !c10 || c01 && !c11))
|
||||||
|
mirrorY = true;
|
||||||
|
else if (vy > 0 && (c10 && !c00 || c11 && !c01))
|
||||||
|
mirrorY = true;
|
||||||
|
|
||||||
|
if (c00 || c01 || c10 || c11)
|
||||||
|
{
|
||||||
|
brick_clr(x0, y0);
|
||||||
|
brick_clr(x1, y0);
|
||||||
|
brick_clr(x0, y1);
|
||||||
|
brick_clr(x1, y1);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (mirrorY)
|
||||||
|
{
|
||||||
|
vy = -vy;
|
||||||
|
sy += 2 * vy;
|
||||||
|
// vy *= 0.99;
|
||||||
|
}
|
||||||
|
if (mirrorX)
|
||||||
|
{
|
||||||
|
vx = -vx;
|
||||||
|
sx += 2 * vx;
|
||||||
|
// vx *= 0.99;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
spr_move(0, sx + 24, sy + 50);
|
||||||
|
|
||||||
|
vic.color_border--;
|
||||||
|
|
||||||
|
vic_waitFrame();
|
||||||
|
}
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
|
@ -2,3 +2,4 @@ call ..\..\bin\oscar64 snake.c
|
||||||
call ..\..\bin\oscar64 -n lander.c
|
call ..\..\bin\oscar64 -n lander.c
|
||||||
call ..\..\bin\oscar64 -n maze3d.c
|
call ..\..\bin\oscar64 -n maze3d.c
|
||||||
call ..\..\bin\oscar64 -n -O3 missile.c
|
call ..\..\bin\oscar64 -n -O3 missile.c
|
||||||
|
call ..\..\bin\oscar64 -n breakout.c
|
||||||
|
|
Binary file not shown.
Binary file not shown.
Loading…
Reference in New Issue