mirror of
https://github.com/RaySollium99/picodrive.git
synced 2025-09-05 07:17:45 -04:00
UIQ3 bugfixes, SVP drc indirect jumps, stuff
git-svn-id: file:///home/notaz/opt/svn/PicoDrive@572 be3aeb3a-fb24-0410-a615-afba39da0efa
This commit is contained in:
parent
02ba8788a0
commit
f8af96349e
29 changed files with 193 additions and 157 deletions
15
Pico/Cart.c
15
Pico/Cart.c
|
@ -137,8 +137,10 @@ zip_failed:
|
||||||
if (f == NULL)
|
if (f == NULL)
|
||||||
goto cso_failed;
|
goto cso_failed;
|
||||||
|
|
||||||
|
#ifndef __EPOC32__
|
||||||
/* we use our own buffering */
|
/* we use our own buffering */
|
||||||
setvbuf(f, NULL, _IONBF, 0);
|
setvbuf(f, NULL, _IONBF, 0);
|
||||||
|
#endif
|
||||||
|
|
||||||
cso = malloc(sizeof(*cso));
|
cso = malloc(sizeof(*cso));
|
||||||
if (cso == NULL)
|
if (cso == NULL)
|
||||||
|
@ -192,9 +194,6 @@ cso_failed:
|
||||||
f = fopen(path, "rb");
|
f = fopen(path, "rb");
|
||||||
if (f == NULL) return NULL;
|
if (f == NULL) return NULL;
|
||||||
|
|
||||||
/* we use our own buffering */
|
|
||||||
setvbuf(f, NULL, _IONBF, 0);
|
|
||||||
|
|
||||||
file = malloc(sizeof(*file));
|
file = malloc(sizeof(*file));
|
||||||
if (file == NULL) {
|
if (file == NULL) {
|
||||||
fclose(f);
|
fclose(f);
|
||||||
|
@ -207,6 +206,12 @@ cso_failed:
|
||||||
file->type = PMT_UNCOMPRESSED;
|
file->type = PMT_UNCOMPRESSED;
|
||||||
fseek(f, 0, SEEK_SET);
|
fseek(f, 0, SEEK_SET);
|
||||||
|
|
||||||
|
#ifndef __EPOC32__ // makes things worse on Symbian
|
||||||
|
if (file->size > 0x400000)
|
||||||
|
/* we use our own buffering */
|
||||||
|
setvbuf(f, NULL, _IONBF, 0);
|
||||||
|
#endif
|
||||||
|
|
||||||
return file;
|
return file;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -445,7 +450,7 @@ int PicoCartLoad(pm_file *f,unsigned char **prom,unsigned int *psize)
|
||||||
rom=PicoCartAlloc(size);
|
rom=PicoCartAlloc(size);
|
||||||
if (rom==NULL) {
|
if (rom==NULL) {
|
||||||
elprintf(EL_STATUS, "out of memory (wanted %i)", size);
|
elprintf(EL_STATUS, "out of memory (wanted %i)", size);
|
||||||
return 1;
|
return 2;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (PicoCartLoadProgressCB != NULL)
|
if (PicoCartLoadProgressCB != NULL)
|
||||||
|
@ -470,7 +475,7 @@ int PicoCartLoad(pm_file *f,unsigned char **prom,unsigned int *psize)
|
||||||
if (bytes_read <= 0) {
|
if (bytes_read <= 0) {
|
||||||
elprintf(EL_STATUS, "read failed");
|
elprintf(EL_STATUS, "read failed");
|
||||||
free(rom);
|
free(rom);
|
||||||
return 1;
|
return 3;
|
||||||
}
|
}
|
||||||
|
|
||||||
// maybe we are loading MegaCD BIOS?
|
// maybe we are loading MegaCD BIOS?
|
||||||
|
|
|
@ -53,7 +53,7 @@ char *PDebugMain(void)
|
||||||
sprintf(dstrp, "z80Run: %i, z80_reset: %i, z80_bnk: %06x\n", Pico.m.z80Run, Pico.m.z80_reset, Pico.m.z80_bank68k<<15); MVP;
|
sprintf(dstrp, "z80Run: %i, z80_reset: %i, z80_bnk: %06x\n", Pico.m.z80Run, Pico.m.z80_reset, Pico.m.z80_bank68k<<15); MVP;
|
||||||
z80_debug(dstrp); MVP;
|
z80_debug(dstrp); MVP;
|
||||||
if (strlen(dstr) > sizeof(dstr))
|
if (strlen(dstr) > sizeof(dstr))
|
||||||
printf("warning: debug buffer overflow (%i/%i)\n", strlen(dstr), sizeof(dstr));
|
elprintf(EL_STATUS, "warning: debug buffer overflow (%i/%i)\n", strlen(dstr), sizeof(dstr));
|
||||||
|
|
||||||
return dstr;
|
return dstr;
|
||||||
}
|
}
|
||||||
|
|
20
Pico/Draw.c
20
Pico/Draw.c
|
@ -839,7 +839,7 @@ static void DrawSpritesSHi(unsigned char *sprited)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
#endif
|
#endif // !_ASM_DRAW_C
|
||||||
|
|
||||||
static void DrawSpritesHiAS(unsigned char *sprited, int sh)
|
static void DrawSpritesHiAS(unsigned char *sprited, int sh)
|
||||||
{
|
{
|
||||||
|
@ -850,6 +850,8 @@ static void DrawSpritesHiAS(unsigned char *sprited, int sh)
|
||||||
cnt = sprited[0] & 0x7f;
|
cnt = sprited[0] & 0x7f;
|
||||||
if (cnt == 0) return;
|
if (cnt == 0) return;
|
||||||
|
|
||||||
|
rendstatus |= PDRAW_SPR_LO_ON_HI;
|
||||||
|
|
||||||
p = &sprited[3];
|
p = &sprited[3];
|
||||||
|
|
||||||
// Go through sprites:
|
// Go through sprites:
|
||||||
|
@ -1200,7 +1202,7 @@ static void FinalizeLineBGR444(int sh)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!sh && (rendstatus & PDRAW_ACC_SPRITES))
|
if (!sh && (rendstatus & PDRAW_SPR_LO_ON_HI))
|
||||||
mask=0x3f; // accurate sprites
|
mask=0x3f; // accurate sprites
|
||||||
|
|
||||||
for(i = 0; i < len; i++)
|
for(i = 0; i < len; i++)
|
||||||
|
@ -1228,7 +1230,7 @@ static void FinalizeLineRGB555(int sh)
|
||||||
{
|
{
|
||||||
#ifndef PSP
|
#ifndef PSP
|
||||||
int i, mask=0xff;
|
int i, mask=0xff;
|
||||||
if (!sh && (rendstatus & PDRAW_ACC_SPRITES))
|
if (!sh && (rendstatus & PDRAW_SPR_LO_ON_HI))
|
||||||
mask=0x3f; // accurate sprites, upper bits are priority stuff
|
mask=0x3f; // accurate sprites, upper bits are priority stuff
|
||||||
|
|
||||||
for (i = 0; i < len; i++)
|
for (i = 0; i < len; i++)
|
||||||
|
@ -1236,7 +1238,7 @@ static void FinalizeLineRGB555(int sh)
|
||||||
#else
|
#else
|
||||||
extern void amips_clut(unsigned short *dst, unsigned char *src, unsigned short *pal, int count);
|
extern void amips_clut(unsigned short *dst, unsigned char *src, unsigned short *pal, int count);
|
||||||
extern void amips_clut_6bit(unsigned short *dst, unsigned char *src, unsigned short *pal, int count);
|
extern void amips_clut_6bit(unsigned short *dst, unsigned char *src, unsigned short *pal, int count);
|
||||||
if (!sh && (rendstatus & PDRAW_ACC_SPRITES))
|
if (!sh && (rendstatus & PDRAW_SPR_LO_ON_HI))
|
||||||
amips_clut_6bit(pd, ps, pal, len);
|
amips_clut_6bit(pd, ps, pal, len);
|
||||||
else amips_clut(pd, ps, pal, len);
|
else amips_clut(pd, ps, pal, len);
|
||||||
#endif
|
#endif
|
||||||
|
@ -1250,7 +1252,7 @@ static void FinalizeLine8bit(int sh)
|
||||||
int len, rs = rendstatus;
|
int len, rs = rendstatus;
|
||||||
static int dirty_count;
|
static int dirty_count;
|
||||||
|
|
||||||
if (!sh && !(rs & PDRAW_ACC_SPRITES) && Pico.m.dirtyPal == 1 && DrawScanline < 222)
|
if (!sh && Pico.m.dirtyPal == 1 && DrawScanline < 222)
|
||||||
{
|
{
|
||||||
// a hack for mid-frame palette changes
|
// a hack for mid-frame palette changes
|
||||||
if (!(rs & PDRAW_SONIC_MODE))
|
if (!(rs & PDRAW_SONIC_MODE))
|
||||||
|
@ -1374,8 +1376,8 @@ static int DrawDisplay(int sh)
|
||||||
if (!(PicoDrawMask & PDRAW_SPRITES_HI_ON));
|
if (!(PicoDrawMask & PDRAW_SPRITES_HI_ON));
|
||||||
else if (rendstatus & PDRAW_INTERLACE)
|
else if (rendstatus & PDRAW_INTERLACE)
|
||||||
DrawAllSpritesInterlace(1, sh);
|
DrawAllSpritesInterlace(1, sh);
|
||||||
// AS on and have both lo/hi sprites and lo before hi sprites?
|
// have sprites without layer pri bit ontop of sprites with that bit
|
||||||
else if ((sprited[1] & 0xd0) == 0xd0 && (rendstatus & PDRAW_ACC_SPRITES))
|
else if ((sprited[1] & 0xd0) == 0xd0 && (PicoOpt & POPT_ACC_SPRITES))
|
||||||
DrawSpritesHiAS(sprited, sh);
|
DrawSpritesHiAS(sprited, sh);
|
||||||
else if (sh && (sprited[1] & SPRL_MAY_HAVE_OP))
|
else if (sh && (sprited[1] & SPRL_MAY_HAVE_OP))
|
||||||
DrawSpritesSHi(sprited);
|
DrawSpritesSHi(sprited);
|
||||||
|
@ -1394,13 +1396,11 @@ static int DrawDisplay(int sh)
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// MUST be called every frame
|
||||||
PICO_INTERNAL void PicoFrameStart(void)
|
PICO_INTERNAL void PicoFrameStart(void)
|
||||||
{
|
{
|
||||||
// prepare to do this frame
|
// prepare to do this frame
|
||||||
rendstatus = 0;
|
rendstatus = 0;
|
||||||
if (PicoOpt & POPT_ACC_SPRITES)
|
|
||||||
rendstatus |= PDRAW_ACC_SPRITES;
|
|
||||||
if ((Pico.video.reg[12]&6) == 6)
|
if ((Pico.video.reg[12]&6) == 6)
|
||||||
rendstatus |= PDRAW_INTERLACE; // interlace mode
|
rendstatus |= PDRAW_INTERLACE; // interlace mode
|
||||||
|
|
||||||
|
|
|
@ -76,8 +76,9 @@ PICO_INTERNAL u32 PicoCheckPc(u32 pc)
|
||||||
pc&=~1;
|
pc&=~1;
|
||||||
if ((pc<<8) == 0)
|
if ((pc<<8) == 0)
|
||||||
{
|
{
|
||||||
printf("%i:%03i: game crash detected @ %06x\n", Pico.m.frame_count, Pico.m.scanline, SekPc);
|
elprintf(EL_STATUS|EL_ANOMALY, "%i:%03i: game crash detected @ %06x\n",
|
||||||
return (int)Pico.rom + Pico.romsize; // common crash condition, can happen if acc timing is off
|
Pico.m.frame_count, Pico.m.scanline, SekPc);
|
||||||
|
return (int)Pico.rom + Pico.romsize; // common crash condition, may happen with bad ROMs
|
||||||
}
|
}
|
||||||
|
|
||||||
PicoCpuCM68k.membase=PicoMemBase(pc&0x00ffffff);
|
PicoCpuCM68k.membase=PicoMemBase(pc&0x00ffffff);
|
||||||
|
|
|
@ -172,7 +172,7 @@ extern int PicoDrawMask;
|
||||||
// internals
|
// internals
|
||||||
#define PDRAW_SPRITES_MOVED (1<<0) // (asm)
|
#define PDRAW_SPRITES_MOVED (1<<0) // (asm)
|
||||||
#define PDRAW_WND_DIFF_PRIO (1<<1) // not all window tiles use same priority
|
#define PDRAW_WND_DIFF_PRIO (1<<1) // not all window tiles use same priority
|
||||||
#define PDRAW_ACC_SPRITES (1<<2) // accurate sprites (copied from PicoOpt)
|
#define PDRAW_SPR_LO_ON_HI (1<<2) // seen sprites without layer pri bit ontop spr. with that bit
|
||||||
#define PDRAW_INTERLACE (1<<3)
|
#define PDRAW_INTERLACE (1<<3)
|
||||||
#define PDRAW_DIRTY_SPRITES (1<<4) // (asm)
|
#define PDRAW_DIRTY_SPRITES (1<<4) // (asm)
|
||||||
#define PDRAW_SONIC_MODE (1<<5) // mid-frame palette changes for 8bit renderer
|
#define PDRAW_SONIC_MODE (1<<5) // mid-frame palette changes for 8bit renderer
|
||||||
|
|
|
@ -541,10 +541,6 @@ PICO_INTERNAL void z80_reset(void);
|
||||||
PICO_INTERNAL void z80_exit(void);
|
PICO_INTERNAL void z80_exit(void);
|
||||||
extern int PsndDacLine;
|
extern int PsndDacLine;
|
||||||
|
|
||||||
#ifdef __cplusplus
|
|
||||||
} // End of extern "C"
|
|
||||||
#endif
|
|
||||||
|
|
||||||
// emulation event logging
|
// emulation event logging
|
||||||
#ifndef EL_LOGMASK
|
#ifndef EL_LOGMASK
|
||||||
#define EL_LOGMASK 0
|
#define EL_LOGMASK 0
|
||||||
|
@ -590,5 +586,9 @@ extern void lprintf(const char *fmt, ...);
|
||||||
#define cdprintf(x...)
|
#define cdprintf(x...)
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
} // End of extern "C"
|
||||||
|
#endif
|
||||||
|
|
||||||
#endif // PICO_INTERNAL_INCLUDED
|
#endif // PICO_INTERNAL_INCLUDED
|
||||||
|
|
||||||
|
|
|
@ -1663,7 +1663,7 @@ static void emit_block_prologue(void)
|
||||||
// check if there are enough cycles..
|
// check if there are enough cycles..
|
||||||
// note: r0 must contain PC of current block
|
// note: r0 must contain PC of current block
|
||||||
EOP_CMP_IMM(11,0,0); // cmp r11, #0
|
EOP_CMP_IMM(11,0,0); // cmp r11, #0
|
||||||
emit_call(A_COND_LE, ssp_drc_end);
|
emit_jump(A_COND_LE, ssp_drc_end);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* cond:
|
/* cond:
|
||||||
|
@ -1684,20 +1684,29 @@ static void emit_block_epilogue(int cycles, int cond, int pc, int end_pc)
|
||||||
if (target != NULL)
|
if (target != NULL)
|
||||||
emit_jump(A_COND_AL, target);
|
emit_jump(A_COND_AL, target);
|
||||||
else {
|
else {
|
||||||
emit_jump(A_COND_AL, ssp_drc_next);
|
int ops = emit_jump(A_COND_AL, ssp_drc_next);
|
||||||
// cause the next block to be emitted over jump instrction
|
// cause the next block to be emitted over jump instruction
|
||||||
tcache_ptr--;
|
tcache_ptr -= ops;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
u32 *target1 = (pc < 0x400) ? ssp_block_table_iram[ssp->drc.iram_context][pc] : ssp_block_table[pc];
|
u32 *target1 = (pc < 0x400) ? ssp_block_table_iram[ssp->drc.iram_context][pc] : ssp_block_table[pc];
|
||||||
u32 *target2 = (end_pc < 0x400) ? ssp_block_table_iram[ssp->drc.iram_context][end_pc] : ssp_block_table[end_pc];
|
u32 *target2 = (end_pc < 0x400) ? ssp_block_table_iram[ssp->drc.iram_context][end_pc] : ssp_block_table[end_pc];
|
||||||
if (target1 != NULL)
|
if (target1 != NULL)
|
||||||
emit_jump(cond, target1);
|
emit_jump(cond, target1);
|
||||||
else emit_call(cond, ssp_drc_next_patch);
|
|
||||||
if (target2 != NULL)
|
if (target2 != NULL)
|
||||||
emit_jump(tr_neg_cond(cond), target2); // neg_cond, to be able to swap jumps if needed
|
emit_jump(tr_neg_cond(cond), target2); // neg_cond, to be able to swap jumps if needed
|
||||||
else emit_call(tr_neg_cond(cond), ssp_drc_next_patch);
|
#ifndef __EPOC32__
|
||||||
|
// emit patchable branches
|
||||||
|
if (target1 == NULL)
|
||||||
|
emit_call(cond, ssp_drc_next_patch);
|
||||||
|
if (target2 == NULL)
|
||||||
|
emit_call(tr_neg_cond(cond), ssp_drc_next_patch);
|
||||||
|
#else
|
||||||
|
// won't patch indirect jumps
|
||||||
|
if (target1 == NULL || target2 == NULL)
|
||||||
|
emit_jump(A_COND_AL, ssp_drc_next);
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1708,6 +1717,7 @@ void *ssp_translate_block(int pc)
|
||||||
int ret, end_cond = A_COND_AL, jump_pc = -1;
|
int ret, end_cond = A_COND_AL, jump_pc = -1;
|
||||||
|
|
||||||
//printf("translate %04x -> %04x\n", pc<<1, (tcache_ptr-tcache)<<2);
|
//printf("translate %04x -> %04x\n", pc<<1, (tcache_ptr-tcache)<<2);
|
||||||
|
|
||||||
block_start = tcache_ptr;
|
block_start = tcache_ptr;
|
||||||
known_regb = 0;
|
known_regb = 0;
|
||||||
dirty_regb = KRREG_P;
|
dirty_regb = KRREG_P;
|
||||||
|
@ -1748,7 +1758,7 @@ void *ssp_translate_block(int pc)
|
||||||
emit_block_epilogue(ccount, end_cond, jump_pc, pc);
|
emit_block_epilogue(ccount, end_cond, jump_pc, pc);
|
||||||
|
|
||||||
if (tcache_ptr - tcache > SSP_TCACHE_SIZE/4) {
|
if (tcache_ptr - tcache > SSP_TCACHE_SIZE/4) {
|
||||||
elprintf(EL_ANOMALY, "tcache overflow!\n");
|
elprintf(EL_ANOMALY|EL_STATUS|EL_SVP, "tcache overflow!\n");
|
||||||
fflush(stdout);
|
fflush(stdout);
|
||||||
exit(1);
|
exit(1);
|
||||||
}
|
}
|
||||||
|
@ -1825,6 +1835,7 @@ void ssp1601_dyn_reset(ssp1601_t *ssp)
|
||||||
memset(svp->iram_rom, 0, 0x800);
|
memset(svp->iram_rom, 0, 0x800);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
void ssp1601_dyn_run(int cycles)
|
void ssp1601_dyn_run(int cycles)
|
||||||
{
|
{
|
||||||
if (ssp->emu_status & SSP_WAIT_MASK) return;
|
if (ssp->emu_status & SSP_WAIT_MASK) return;
|
||||||
|
|
|
@ -178,27 +178,49 @@ static void emit_mov_const(int cond, int d, unsigned int val)
|
||||||
EOP_C_DOP_IMM(cond, need_or ? A_OP_ORR : A_OP_MOV, 0, need_or ? d : 0, d, 0, val&0xff);
|
EOP_C_DOP_IMM(cond, need_or ? A_OP_ORR : A_OP_MOV, 0, need_or ? d : 0, d, 0, val&0xff);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void check_offset_24(int val)
|
static int is_offset_24(int val)
|
||||||
{
|
{
|
||||||
if (val >= (int)0xff000000 && val <= 0x00ffffff) return;
|
if (val >= (int)0xff000000 && val <= 0x00ffffff) return 1;
|
||||||
printf("offset_24 overflow %08x\n", val);
|
return 0;
|
||||||
exit(1);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static void emit_call(int cond, void *target)
|
static int emit_xbranch(int cond, void *target, int is_call)
|
||||||
{
|
{
|
||||||
int val = (unsigned int *)target - tcache_ptr - 2;
|
int val = (unsigned int *)target - tcache_ptr - 2;
|
||||||
check_offset_24(val);
|
int direct = is_offset_24(val);
|
||||||
|
u32 *start_ptr = tcache_ptr;
|
||||||
|
|
||||||
EOP_C_B(cond,1,val & 0xffffff); // bl target
|
if (direct)
|
||||||
|
{
|
||||||
|
EOP_C_B(cond,is_call,val & 0xffffff); // b, bl target
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
#ifdef __EPOC32__
|
||||||
|
// elprintf(EL_SVP, "emitting indirect jmp %08x->%08x", tcache_ptr, target);
|
||||||
|
if (is_call)
|
||||||
|
EOP_ADD_IMM(14,15,0,8); // add lr,pc,#8
|
||||||
|
EOP_C_AM2_IMM(cond,1,0,1,15,15,0); // ldrcc pc,[pc]
|
||||||
|
EOP_MOV_REG_SIMPLE(15,15); // mov pc, pc
|
||||||
|
EMIT((u32)target);
|
||||||
|
#else
|
||||||
|
// should never happen
|
||||||
|
elprintf(EL_STATUS|EL_SVP|EL_ANOMALY, "indirect jmp %08x->%08x", target, tcache_ptr);
|
||||||
|
exit(1);
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
|
return tcache_ptr - start_ptr;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void emit_jump(int cond, void *target)
|
static int emit_call(int cond, void *target)
|
||||||
{
|
{
|
||||||
int val = (unsigned int *)target - tcache_ptr - 2;
|
return emit_xbranch(cond, target, 1);
|
||||||
check_offset_24(val);
|
}
|
||||||
|
|
||||||
EOP_C_B(cond,0,val & 0xffffff); // b target
|
static int emit_jump(int cond, void *target)
|
||||||
|
{
|
||||||
|
return emit_xbranch(cond, target, 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void handle_caches(void)
|
static void handle_caches(void)
|
||||||
|
|
|
@ -40,7 +40,6 @@ ssp_block_table_iram:
|
||||||
.space SSP_BLOCKTAB_IRAM_SIZE
|
.space SSP_BLOCKTAB_IRAM_SIZE
|
||||||
.space SSP_BLOCKTAB_ALIGN_SIZE
|
.space SSP_BLOCKTAB_ALIGN_SIZE
|
||||||
|
|
||||||
|
|
||||||
.text
|
.text
|
||||||
.align 2
|
.align 2
|
||||||
|
|
||||||
|
@ -59,6 +58,7 @@ ssp_block_table_iram:
|
||||||
@ r9: r4-r6 (.654)
|
@ r9: r4-r6 (.654)
|
||||||
@ r10: P
|
@ r10: P
|
||||||
@ r11: cycles
|
@ r11: cycles
|
||||||
|
@ r12: tmp
|
||||||
|
|
||||||
|
|
||||||
#define SSP_OFFS_GR 0x400
|
#define SSP_OFFS_GR 0x400
|
||||||
|
@ -207,7 +207,7 @@ ssp_drc_do_patch:
|
||||||
bic r3, r3, #1 @ L bit
|
bic r3, r3, #1 @ L bit
|
||||||
orr r3, r3, r12,lsl #6
|
orr r3, r3, r12,lsl #6
|
||||||
mov r3, r3, ror #8 @ patched branch instruction
|
mov r3, r3, ror #8 @ patched branch instruction
|
||||||
str r3, [r1, #-4]
|
str r3, [r1, #-4] @ patch the bl/b to jump directly to another handler
|
||||||
|
|
||||||
ssp_drc_dp_end:
|
ssp_drc_dp_end:
|
||||||
str r2, [r7, #SSP_OFFS_TMP1]
|
str r2, [r7, #SSP_OFFS_TMP1]
|
||||||
|
|
|
@ -9,7 +9,7 @@
|
||||||
#ifdef _MSC_VER
|
#ifdef _MSC_VER
|
||||||
#define snprintf _snprintf
|
#define snprintf _snprintf
|
||||||
#endif
|
#endif
|
||||||
#ifdef UIQ3
|
#ifdef __EPOC32__
|
||||||
#define snprintf(b,s,...) sprintf(b,##__VA_ARGS__)
|
#define snprintf(b,s,...) sprintf(b,##__VA_ARGS__)
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|
|
@ -402,7 +402,7 @@ test your BIOS.
|
||||||
The Sega/Mega CD unit had two blinking LEDs (red and green) on it. This option
|
The Sega/Mega CD unit had two blinking LEDs (red and green) on it. This option
|
||||||
will display them on top-left corner of the screen.
|
will display them on top-left corner of the screen.
|
||||||
|
|
||||||
@@2. "CDDA audio (using mp3s)"
|
@@2. "CDDA audio"
|
||||||
This option enables CD audio playback.
|
This option enables CD audio playback.
|
||||||
|
|
||||||
@@2. "PCM audio"
|
@@2. "PCM audio"
|
||||||
|
@ -497,6 +497,7 @@ both buttons for that action to happen).
|
||||||
There is also option to enable 6 button pad (will allow you to configure XYZ
|
There is also option to enable 6 button pad (will allow you to configure XYZ
|
||||||
keys), and an option to set turbo rate (in Hz) for turbo buttons.
|
keys), and an option to set turbo rate (in Hz) for turbo buttons.
|
||||||
#endif
|
#endif
|
||||||
|
#ifndef UIQ
|
||||||
|
|
||||||
|
|
||||||
Cheat support
|
Cheat support
|
||||||
|
@ -535,6 +536,7 @@ PATCH FILE: Sonic 2.bin.pat
|
||||||
|
|
||||||
Put the file into your ROMs directory. Then load the .pat file as you would
|
Put the file into your ROMs directory. Then load the .pat file as you would
|
||||||
a ROM. Then Cheat Menu Option should appear in main menu.
|
a ROM. Then Cheat Menu Option should appear in main menu.
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
What is emulated?
|
What is emulated?
|
||||||
|
|
|
@ -6,7 +6,7 @@
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
#ifdef UIQ3
|
#ifdef __EPOC32__
|
||||||
#include <unistd.h>
|
#include <unistd.h>
|
||||||
#endif
|
#endif
|
||||||
#include "config.h"
|
#include "config.h"
|
||||||
|
|
|
@ -44,9 +44,11 @@ extern void menu_romload_end(void);
|
||||||
|
|
||||||
|
|
||||||
// utilities
|
// utilities
|
||||||
static void strlwr_(char* string)
|
static void strlwr_(char *string)
|
||||||
{
|
{
|
||||||
while ( (*string++ = (char)tolower(*string)) );
|
char *p;
|
||||||
|
for (p = string; *p; p++)
|
||||||
|
*p = (char)tolower(*p);
|
||||||
}
|
}
|
||||||
|
|
||||||
static int try_rfn_cut(char *fname)
|
static int try_rfn_cut(char *fname)
|
||||||
|
@ -345,6 +347,7 @@ int emu_ReloadRom(char *rom_fname)
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
get_ext(rom_fname, ext);
|
get_ext(rom_fname, ext);
|
||||||
|
lprintf("gmv loaded for %s\n", rom_fname);
|
||||||
}
|
}
|
||||||
else if (!strcmp(ext, ".pat"))
|
else if (!strcmp(ext, ".pat"))
|
||||||
{
|
{
|
||||||
|
@ -407,7 +410,9 @@ int emu_ReloadRom(char *rom_fname)
|
||||||
rom_loaded = 0;
|
rom_loaded = 0;
|
||||||
|
|
||||||
if ( (ret = PicoCartLoad(rom, &rom_data, &rom_size)) ) {
|
if ( (ret = PicoCartLoad(rom, &rom_data, &rom_size)) ) {
|
||||||
sprintf(menuErrorMsg, "PicoCartLoad() failed.");
|
if (ret == 2) sprintf(menuErrorMsg, "Out of memory");
|
||||||
|
else if (ret == 3) sprintf(menuErrorMsg, "Read failed");
|
||||||
|
else sprintf(menuErrorMsg, "PicoCartLoad() failed.");
|
||||||
lprintf("%s\n", menuErrorMsg);
|
lprintf("%s\n", menuErrorMsg);
|
||||||
goto fail2;
|
goto fail2;
|
||||||
}
|
}
|
||||||
|
@ -774,13 +779,13 @@ void emu_updateMovie(void)
|
||||||
} else {
|
} else {
|
||||||
// MXYZ SACB RLDU
|
// MXYZ SACB RLDU
|
||||||
PicoPad[0] = ~movie_data[offs] & 0x8f; // ! SCBA RLDU
|
PicoPad[0] = ~movie_data[offs] & 0x8f; // ! SCBA RLDU
|
||||||
if(!(movie_data[offs] & 0x10)) PicoPad[0] |= 0x40; // A
|
if(!(movie_data[offs] & 0x10)) PicoPad[0] |= 0x40; // C
|
||||||
if(!(movie_data[offs] & 0x20)) PicoPad[0] |= 0x10; // B
|
if(!(movie_data[offs] & 0x20)) PicoPad[0] |= 0x10; // A
|
||||||
if(!(movie_data[offs] & 0x40)) PicoPad[0] |= 0x20; // A
|
if(!(movie_data[offs] & 0x40)) PicoPad[0] |= 0x20; // B
|
||||||
PicoPad[1] = ~movie_data[offs+1] & 0x8f; // ! SCBA RLDU
|
PicoPad[1] = ~movie_data[offs+1] & 0x8f; // ! SCBA RLDU
|
||||||
if(!(movie_data[offs+1] & 0x10)) PicoPad[1] |= 0x40; // A
|
if(!(movie_data[offs+1] & 0x10)) PicoPad[1] |= 0x40; // C
|
||||||
if(!(movie_data[offs+1] & 0x20)) PicoPad[1] |= 0x10; // B
|
if(!(movie_data[offs+1] & 0x20)) PicoPad[1] |= 0x10; // A
|
||||||
if(!(movie_data[offs+1] & 0x40)) PicoPad[1] |= 0x20; // A
|
if(!(movie_data[offs+1] & 0x40)) PicoPad[1] |= 0x20; // B
|
||||||
PicoPad[0] |= (~movie_data[offs+2] & 0x0A) << 8; // ! MZYX
|
PicoPad[0] |= (~movie_data[offs+2] & 0x0A) << 8; // ! MZYX
|
||||||
if(!(movie_data[offs+2] & 0x01)) PicoPad[0] |= 0x0400; // X
|
if(!(movie_data[offs+2] & 0x01)) PicoPad[0] |= 0x0400; // X
|
||||||
if(!(movie_data[offs+2] & 0x04)) PicoPad[0] |= 0x0100; // Z
|
if(!(movie_data[offs+2] & 0x04)) PicoPad[0] |= 0x0100; // Z
|
||||||
|
|
|
@ -152,7 +152,7 @@ These options just show if your BIOS files were correctly detected by the emulat
|
||||||
4. "CD LEDs"
|
4. "CD LEDs"
|
||||||
The Sega/Mega CD unit had two blinking LEDs (red and green) on it. This option will display them on top-left corner of the screen.
|
The Sega/Mega CD unit had two blinking LEDs (red and green) on it. This option will display them on top-left corner of the screen.
|
||||||
|
|
||||||
5. "CDDA audio (using mp3s)"
|
5. "CDDA audio"
|
||||||
This option enables CD audio playback.
|
This option enables CD audio playback.
|
||||||
|
|
||||||
6. "PCM audio"
|
6. "PCM audio"
|
||||||
|
|
|
@ -283,7 +283,7 @@ static void blit(const char *fps, const char *notice)
|
||||||
// 8bit accurate renderer
|
// 8bit accurate renderer
|
||||||
if (Pico.m.dirtyPal)
|
if (Pico.m.dirtyPal)
|
||||||
{
|
{
|
||||||
int pallen = 0x40;
|
int pallen = 0xc0;
|
||||||
Pico.m.dirtyPal = 0;
|
Pico.m.dirtyPal = 0;
|
||||||
if (Pico.video.reg[0xC]&8) // shadow/hilight mode
|
if (Pico.video.reg[0xC]&8) // shadow/hilight mode
|
||||||
{
|
{
|
||||||
|
@ -293,21 +293,14 @@ static void blit(const char *fps, const char *notice)
|
||||||
memcpy32(localPal+0xc0, localPal+0x40, 0x40);
|
memcpy32(localPal+0xc0, localPal+0x40, 0x40);
|
||||||
pallen = 0x100;
|
pallen = 0x100;
|
||||||
}
|
}
|
||||||
else if (rendstatus & PDRAW_ACC_SPRITES) {
|
|
||||||
vidConvCpyRGB32(localPal, Pico.cram, 0x40);
|
|
||||||
memcpy32(localPal+0x40, localPal, 0x40);
|
|
||||||
memcpy32(localPal+0x80, localPal, 0x40);
|
|
||||||
memcpy32(localPal+0xc0, localPal, 0x40);
|
|
||||||
pallen = 0x100;
|
|
||||||
}
|
|
||||||
else if (rendstatus & PDRAW_SONIC_MODE) { // mid-frame palette changes
|
else if (rendstatus & PDRAW_SONIC_MODE) { // mid-frame palette changes
|
||||||
vidConvCpyRGB32(localPal, Pico.cram, 0x40);
|
vidConvCpyRGB32(localPal, Pico.cram, 0x40);
|
||||||
vidConvCpyRGB32(localPal+0x40, HighPal, 0x40);
|
vidConvCpyRGB32(localPal+0x40, HighPal, 0x40);
|
||||||
vidConvCpyRGB32(localPal+0x80, HighPal+0x40, 0x40);
|
vidConvCpyRGB32(localPal+0x80, HighPal+0x40, 0x40);
|
||||||
pallen = 0xc0;
|
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
vidConvCpyRGB32(localPal, Pico.cram, 0x40);
|
vidConvCpyRGB32(localPal, Pico.cram, 0x40);
|
||||||
|
memcpy32(localPal+0x80, localPal, 0x40); // for spr prio mess
|
||||||
}
|
}
|
||||||
if (pallen > 0xc0) {
|
if (pallen > 0xc0) {
|
||||||
localPal[0xc0] = 0x0000c000;
|
localPal[0xc0] = 0x0000c000;
|
||||||
|
|
|
@ -29,5 +29,11 @@
|
||||||
//#define dprintf(f,...) printf("%05i:%03i: " f "\n",Pico.m.frame_count,Pico.m.scanline,##__VA_ARGS__)
|
//#define dprintf(f,...) printf("%05i:%03i: " f "\n",Pico.m.frame_count,Pico.m.scanline,##__VA_ARGS__)
|
||||||
#define dprintf(x...)
|
#define dprintf(x...)
|
||||||
|
|
||||||
|
// platform
|
||||||
|
#define PLAT_MAX_KEYS 32
|
||||||
|
#define PLAT_HAVE_JOY 1
|
||||||
|
#define PATH_SEP "/"
|
||||||
|
#define PATH_SEP_C '/'
|
||||||
|
|
||||||
#endif //PORT_CONFIG_H
|
#endif //PORT_CONFIG_H
|
||||||
|
|
||||||
|
|
|
@ -350,7 +350,7 @@ static void blit(const char *fps, const char *notice)
|
||||||
// 8bit accurate renderer
|
// 8bit accurate renderer
|
||||||
if (Pico.m.dirtyPal)
|
if (Pico.m.dirtyPal)
|
||||||
{
|
{
|
||||||
int pallen = 0x40;
|
int pallen = 0xc0;
|
||||||
Pico.m.dirtyPal = 0;
|
Pico.m.dirtyPal = 0;
|
||||||
if (Pico.video.reg[0xC]&8) // shadow/hilight mode
|
if (Pico.video.reg[0xC]&8) // shadow/hilight mode
|
||||||
{
|
{
|
||||||
|
@ -360,13 +360,6 @@ static void blit(const char *fps, const char *notice)
|
||||||
memcpy32(localPal+0xc0, localPal+0x40, 0x40);
|
memcpy32(localPal+0xc0, localPal+0x40, 0x40);
|
||||||
pallen = 0x100;
|
pallen = 0x100;
|
||||||
}
|
}
|
||||||
else if (rendstatus & PDRAW_ACC_SPRITES) {
|
|
||||||
vidConvCpyRGB32(localPal, Pico.cram, 0x40);
|
|
||||||
memcpy32(localPal+0x40, localPal, 0x40);
|
|
||||||
memcpy32(localPal+0x80, localPal, 0x40);
|
|
||||||
memcpy32(localPal+0xc0, localPal, 0x40);
|
|
||||||
pallen = 0x100;
|
|
||||||
}
|
|
||||||
else if (rendstatus & PDRAW_SONIC_MODE) { // mid-frame palette changes
|
else if (rendstatus & PDRAW_SONIC_MODE) { // mid-frame palette changes
|
||||||
vidConvCpyRGB32(localPal, Pico.cram, 0x40);
|
vidConvCpyRGB32(localPal, Pico.cram, 0x40);
|
||||||
vidConvCpyRGB32(localPal+0x40, HighPal, 0x40);
|
vidConvCpyRGB32(localPal+0x40, HighPal, 0x40);
|
||||||
|
@ -375,6 +368,7 @@ static void blit(const char *fps, const char *notice)
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
vidConvCpyRGB32(localPal, Pico.cram, 0x40);
|
vidConvCpyRGB32(localPal, Pico.cram, 0x40);
|
||||||
|
memcpy32(localPal+0x80, localPal, 0x40);
|
||||||
}
|
}
|
||||||
if (pallen > 0xc0) {
|
if (pallen > 0xc0) {
|
||||||
localPal[0xc0] = 0x0000c000;
|
localPal[0xc0] = 0x0000c000;
|
||||||
|
|
|
@ -263,7 +263,7 @@ static void do_pal_update(int allow_sh, int allow_as)
|
||||||
localPal[0xe0] = 0;
|
localPal[0xe0] = 0;
|
||||||
localPal[0xf0] = 0x001f;
|
localPal[0xf0] = 0x001f;
|
||||||
}
|
}
|
||||||
else if (allow_as && (rendstatus & PDRAW_ACC_SPRITES))
|
else if (allow_as && (rendstatus & PDRAW_SPR_LO_ON_HI))
|
||||||
{
|
{
|
||||||
memcpy32((int *)dpal+0x80/2, (void *)localPal, 0x40*2/4);
|
memcpy32((int *)dpal+0x80/2, (void *)localPal, 0x40*2/4);
|
||||||
}
|
}
|
||||||
|
@ -290,7 +290,7 @@ static void EmuScanPrepare(void)
|
||||||
|
|
||||||
if (Pico.m.dirtyPal)
|
if (Pico.m.dirtyPal)
|
||||||
do_pal_update(1, 1);
|
do_pal_update(1, 1);
|
||||||
if ((rendstatus & PDRAW_ACC_SPRITES) && !(Pico.video.reg[0xC]&8))
|
if ((rendstatus & PDRAW_SPR_LO_ON_HI) && !(Pico.video.reg[0xC]&8))
|
||||||
amips_clut_f = amips_clut_6bit;
|
amips_clut_f = amips_clut_6bit;
|
||||||
else amips_clut_f = amips_clut;
|
else amips_clut_f = amips_clut;
|
||||||
}
|
}
|
||||||
|
|
|
@ -35,6 +35,7 @@
|
||||||
#include "../common/emu.h"
|
#include "../common/emu.h"
|
||||||
#include "emu.h"
|
#include "emu.h"
|
||||||
|
|
||||||
|
extern "C" char menuErrorMsg[];
|
||||||
|
|
||||||
////////////////////////////////////////////////////////////////
|
////////////////////////////////////////////////////////////////
|
||||||
//
|
//
|
||||||
|
@ -235,26 +236,18 @@ void CPicolAppView::DisplayOpenROMDialogL()
|
||||||
iROMLoaded = EFalse;
|
iROMLoaded = EFalse;
|
||||||
switch (res)
|
switch (res)
|
||||||
{
|
{
|
||||||
case PicoErrRomOpenFailed:
|
case PicoErrRomOpenFailed: {
|
||||||
CEikonEnv::Static()->InfoWinL(_L("Error"), _L("Failed to open file."));
|
TBuf<64> mErrorBuff;
|
||||||
|
TPtrC8 buff8((TUint8*) menuErrorMsg);
|
||||||
|
mErrorBuff.Copy(buff8);
|
||||||
|
CEikonEnv::Static()->InfoWinL(_L("Error"), mErrorBuff);
|
||||||
break;
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
case PicoErrOutOfMem:
|
case PicoErrOutOfMem:
|
||||||
CEikonEnv::Static()->InfoWinL(_L("Error"), _L("Failed to allocate memory."));
|
CEikonEnv::Static()->InfoWinL(_L("Error"), _L("Failed to allocate memory."));
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case PicoErrNotRom:
|
|
||||||
CEikonEnv::Static()->InfoWinL(_L("Error"), _L("The file you selected is not a game ROM."));
|
|
||||||
break;
|
|
||||||
|
|
||||||
case PicoErrNoRomsInArchive:
|
|
||||||
CEikonEnv::Static()->InfoWinL(_L("Error"), _L("No game ROMs found in zipfile."));
|
|
||||||
break;
|
|
||||||
|
|
||||||
case PicoErrUncomp:
|
|
||||||
CEikonEnv::Static()->InfoWinL(_L("Error"), _L("Failed while unzipping ROM."));
|
|
||||||
break;
|
|
||||||
|
|
||||||
case PicoErrEmuThread:
|
case PicoErrEmuThread:
|
||||||
CEikonEnv::Static()->InfoWinL(_L("Error"), _L("Failed to create emulation thread. Try to restart this application."));
|
CEikonEnv::Static()->InfoWinL(_L("Error"), _L("Failed to create emulation thread. Try to restart this application."));
|
||||||
break;
|
break;
|
||||||
|
|
|
@ -37,7 +37,6 @@ extern const char *actionNames[];
|
||||||
RSemaphore initSemaphore;
|
RSemaphore initSemaphore;
|
||||||
RSemaphore pauseSemaphore;
|
RSemaphore pauseSemaphore;
|
||||||
RSemaphore loadWaitSemaphore;
|
RSemaphore loadWaitSemaphore;
|
||||||
int pico_was_reset = 0;
|
|
||||||
static CPicolAppView *appView = 0;
|
static CPicolAppView *appView = 0;
|
||||||
|
|
||||||
|
|
||||||
|
@ -65,9 +64,7 @@ TInt CPicoGameSession::Do(const TPicoServRqst what, TAny *param)
|
||||||
|
|
||||||
case PicoMsgReset:
|
case PicoMsgReset:
|
||||||
if(rom_loaded) {
|
if(rom_loaded) {
|
||||||
PicoReset();
|
return ChangeRunState(PGS_Reset);
|
||||||
pico_was_reset = 1;
|
|
||||||
return ChangeRunState(PGS_Running);
|
|
||||||
}
|
}
|
||||||
return 1;
|
return 1;
|
||||||
|
|
||||||
|
@ -182,13 +179,14 @@ TInt CPicoGameSession::loadROM(TPtrC16 *pptr)
|
||||||
// If successful, in will enter PGS_Running state by itself.
|
// If successful, in will enter PGS_Running state by itself.
|
||||||
loadrom_fname = (char *)writeBuf.PtrZ();
|
loadrom_fname = (char *)writeBuf.PtrZ();
|
||||||
loadrom_result = 0;
|
loadrom_result = 0;
|
||||||
|
loadWaitSemaphore.Wait(1); // make sure sem is not set
|
||||||
ret = ChangeRunState(PGS_ReloadRom);
|
ret = ChangeRunState(PGS_ReloadRom);
|
||||||
if(ret) return ret;
|
if(ret) return ret;
|
||||||
|
|
||||||
loadWaitSemaphore.Wait(20*1000*1000);
|
loadWaitSemaphore.Wait(60*1000*1000);
|
||||||
|
|
||||||
if (loadrom_result == 0)
|
if (loadrom_result == 0)
|
||||||
return PicoErrNotRom;
|
return PicoErrRomOpenFailed;
|
||||||
|
|
||||||
emu_getGameName(buff);
|
emu_getGameName(buff);
|
||||||
TPtrC8 buff8((TUint8*) buff);
|
TPtrC8 buff8((TUint8*) buff);
|
||||||
|
@ -198,11 +196,9 @@ TInt CPicoGameSession::loadROM(TPtrC16 *pptr)
|
||||||
|
|
||||||
// debug
|
// debug
|
||||||
#ifdef __DEBUG_PRINT
|
#ifdef __DEBUG_PRINT
|
||||||
TInt cells = User::CountAllocCells();
|
TInt mem, cells = User::CountAllocCells();
|
||||||
TInt mem;
|
|
||||||
User::AllocSize(mem);
|
User::AllocSize(mem);
|
||||||
DEBUGPRINT(_L("comm: cels=%d, size=%d KB"), cells, mem/1024);
|
DEBUGPRINT(_L("comm: cels=%d, size=%d KB"), cells, mem/1024);
|
||||||
ChangeRunState(PGS_DebugHeap, PGS_Running);
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
|
|
|
@ -27,8 +27,8 @@ enum TPicoGameState {
|
||||||
PGS_Paused,
|
PGS_Paused,
|
||||||
PGS_Quit,
|
PGS_Quit,
|
||||||
PGS_KeyConfig,
|
PGS_KeyConfig,
|
||||||
PGS_DebugHeap,
|
|
||||||
PGS_ReloadRom,
|
PGS_ReloadRom,
|
||||||
|
PGS_Reset,
|
||||||
};
|
};
|
||||||
|
|
||||||
enum TPicoServRqst {
|
enum TPicoServRqst {
|
||||||
|
@ -49,11 +49,8 @@ enum TPicoGenErrors { // generic errors
|
||||||
PicoErrNoErr = 0, // OK
|
PicoErrNoErr = 0, // OK
|
||||||
PicoErrRomOpenFailed,
|
PicoErrRomOpenFailed,
|
||||||
PicoErrOutOfMem,
|
PicoErrOutOfMem,
|
||||||
PicoErrNotRom,
|
|
||||||
PicoErrNoRomsInArchive,
|
|
||||||
PicoErrUncomp, // 5
|
|
||||||
PicoErrOutOfMemSnd,
|
PicoErrOutOfMemSnd,
|
||||||
PicoErrGenSnd, // 7 generic sound system error
|
PicoErrGenSnd, // generic sound system error
|
||||||
PicoErrEmuThread
|
PicoErrEmuThread
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
# makefile for uiq3_patcher_0_2.tar.gz
|
# makefile for uiq3_patcher_0_2.tar.gz setup, modified
|
||||||
export CROSS = arm-none-symbianelf-
|
export CROSS = arm-none-symbianelf-
|
||||||
APPNAME = PicoDrive
|
APPNAME = PicoDrive
|
||||||
VER_MAJ = 1
|
VER_MAJ = 1
|
||||||
|
@ -141,6 +141,20 @@ engine/blit_asm.o : engine/blit.s
|
||||||
@echo ">>>" $@
|
@echo ">>>" $@
|
||||||
$(AS) $(ASFLAGS) $< -o $@
|
$(AS) $(ASFLAGS) $< -o $@
|
||||||
|
|
||||||
# App.o can't be optimized
|
|
||||||
#App.o : App.cpp
|
readme.txt: ../../tools/textfilter ../base_readme.txt
|
||||||
# $(CC) $(CXXFLAGS) -O0 -c $< -o $@
|
../../tools/textfilter ../base_readme.txt $@ UIQ
|
||||||
|
|
||||||
|
# ----------- release -----------
|
||||||
|
ifneq ($(findstring rel,$(MAKECMDGOALS)),)
|
||||||
|
ifeq ($(VER),)
|
||||||
|
$(error need VER)
|
||||||
|
endif
|
||||||
|
endif
|
||||||
|
|
||||||
|
rel: picodrive.sis readme.txt
|
||||||
|
zip -9 -j ../../PicoDrive_uiq3_$(VER).zip $^
|
||||||
|
mkdir bin_to_cso_mp3
|
||||||
|
cp ../../tools/bin_to_cso_mp3/* bin_to_cso_mp3/
|
||||||
|
zip -9 -r ../../PicoDrive_uiq3_$(VER).zip bin_to_cso_mp3
|
||||||
|
rm -rf bin_to_cso_mp3
|
||||||
|
|
|
@ -65,6 +65,7 @@ void emu_prepareDefaultConfig(void)
|
||||||
defaultConfig.Frameskip = -1; // auto
|
defaultConfig.Frameskip = -1; // auto
|
||||||
defaultConfig.volume = 80;
|
defaultConfig.volume = 80;
|
||||||
defaultConfig.scaling = 0;
|
defaultConfig.scaling = 0;
|
||||||
|
defaultConfig.KeyBinds[0xd5] = 1<<26; // back
|
||||||
}
|
}
|
||||||
|
|
||||||
/* used by config engine only, not actual menus */
|
/* used by config engine only, not actual menus */
|
||||||
|
@ -102,7 +103,7 @@ const int opt2_entry_count = OPT2_ENTRY_COUNT;
|
||||||
menu_entry cdopt_entries[] =
|
menu_entry cdopt_entries[] =
|
||||||
{
|
{
|
||||||
{ "CD LEDs", MB_ONOFF, MA_CDOPT_LEDS, ¤tConfig.EmuOpt, 0x0400, 0, 0, 1, 1 },
|
{ "CD LEDs", MB_ONOFF, MA_CDOPT_LEDS, ¤tConfig.EmuOpt, 0x0400, 0, 0, 1, 1 },
|
||||||
{ "CDDA audio (using mp3s)", MB_ONOFF, MA_CDOPT_CDDA, &PicoOpt, 0x0800, 0, 0, 1, 1 },
|
{ "CDDA audio", MB_ONOFF, MA_CDOPT_CDDA, &PicoOpt, 0x0800, 0, 0, 1, 1 },
|
||||||
{ "PCM audio", MB_ONOFF, MA_CDOPT_PCM, &PicoOpt, 0x0400, 0, 0, 1, 1 },
|
{ "PCM audio", MB_ONOFF, MA_CDOPT_PCM, &PicoOpt, 0x0400, 0, 0, 1, 1 },
|
||||||
{ NULL, MB_NONE, MA_CDOPT_READAHEAD, NULL, 0, 0, 0, 1, 1 },
|
{ NULL, MB_NONE, MA_CDOPT_READAHEAD, NULL, 0, 0, 0, 1, 1 },
|
||||||
{ "SaveRAM cart", MB_ONOFF, MA_CDOPT_SAVERAM, &PicoOpt, 0x8000, 0, 0, 1, 1 },
|
{ "SaveRAM cart", MB_ONOFF, MA_CDOPT_SAVERAM, &PicoOpt, 0x8000, 0, 0, 1, 1 },
|
||||||
|
|
|
@ -171,7 +171,7 @@ void ExceptionHandler(TExcType exc)
|
||||||
#include <stdio.h> // vsprintf
|
#include <stdio.h> // vsprintf
|
||||||
|
|
||||||
// debug print from c code
|
// debug print from c code
|
||||||
extern "C" void lprintf(char *format, ...)
|
extern "C" void lprintf(const char *format, ...)
|
||||||
{
|
{
|
||||||
va_list args;
|
va_list args;
|
||||||
char buffer[512];
|
char buffer[512];
|
||||||
|
|
|
@ -16,7 +16,7 @@
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
extern "C"
|
extern "C"
|
||||||
#endif
|
#endif
|
||||||
void lprintf(char *format, ...);
|
void lprintf(const char *format, ...);
|
||||||
#endif
|
#endif
|
||||||
#else
|
#else
|
||||||
#define DEBUGPRINT(x...)
|
#define DEBUGPRINT(x...)
|
||||||
|
|
|
@ -84,8 +84,8 @@ char *loadrom_fname = NULL;
|
||||||
int loadrom_result = 0;
|
int loadrom_result = 0;
|
||||||
static timeval noticeMsgTime = { 0, 0 }; // when started showing
|
static timeval noticeMsgTime = { 0, 0 }; // when started showing
|
||||||
static CGameAudioMS *gameAudio = 0; // the audio object itself
|
static CGameAudioMS *gameAudio = 0; // the audio object itself
|
||||||
static int reset_timing;
|
static int reset_timing = 0;
|
||||||
extern int pico_was_reset;
|
static int pico_was_reset = 0;
|
||||||
extern RSemaphore initSemaphore;
|
extern RSemaphore initSemaphore;
|
||||||
extern RSemaphore pauseSemaphore;
|
extern RSemaphore pauseSemaphore;
|
||||||
extern RSemaphore loadWaitSemaphore;
|
extern RSemaphore loadWaitSemaphore;
|
||||||
|
@ -170,21 +170,27 @@ static void TargetEpocGameL()
|
||||||
int thissec = 0, frames_done = 0, frames_shown = 0;
|
int thissec = 0, frames_done = 0, frames_shown = 0;
|
||||||
int target_fps, target_frametime;
|
int target_fps, target_frametime;
|
||||||
int i, lim_time;
|
int i, lim_time;
|
||||||
//TRawEvent blevent;
|
|
||||||
|
|
||||||
MainInit();
|
MainInit();
|
||||||
buff[0] = 0;
|
buff[0] = 0;
|
||||||
|
|
||||||
|
// try to start pico
|
||||||
|
DEBUGPRINT(_L("PicoInit()"));
|
||||||
PicoInit();
|
PicoInit();
|
||||||
|
PicoDrawSetColorFormat(2);
|
||||||
// just to keep the backlight on (works only on UIQ2)
|
PicoWriteSound = updateSound;
|
||||||
//blevent.Set(TRawEvent::EActive);
|
|
||||||
|
|
||||||
// loop?
|
// loop?
|
||||||
for(;;)
|
for(;;)
|
||||||
{
|
{
|
||||||
if (gamestate == PGS_Running)
|
if (gamestate == PGS_Running)
|
||||||
{
|
{
|
||||||
|
#ifdef __DEBUG_PRINT
|
||||||
|
TInt mem, cells = User::CountAllocCells();
|
||||||
|
User::AllocSize(mem);
|
||||||
|
DEBUGPRINT(_L("worker: cels=%d, size=%d KB"), cells, mem/1024);
|
||||||
|
#endif
|
||||||
|
|
||||||
// switch context to other thread
|
// switch context to other thread
|
||||||
User::After(50000);
|
User::After(50000);
|
||||||
// prepare window and stuff
|
// prepare window and stuff
|
||||||
|
@ -203,7 +209,7 @@ static void TargetEpocGameL()
|
||||||
if(!noticeMsgTime.tv_sec) strcpy(noticeMsg, "NTSC@SYSTEM@/@60@FPS");
|
if(!noticeMsgTime.tv_sec) strcpy(noticeMsg, "NTSC@SYSTEM@/@60@FPS");
|
||||||
}
|
}
|
||||||
target_frametime = 1000000/target_fps;
|
target_frametime = 1000000/target_fps;
|
||||||
if(!noticeMsgTime.tv_sec && pico_was_reset)
|
if (!noticeMsgTime.tv_sec && pico_was_reset)
|
||||||
gettimeofday(¬iceMsgTime, 0);
|
gettimeofday(¬iceMsgTime, 0);
|
||||||
|
|
||||||
// prepare CD buffer
|
// prepare CD buffer
|
||||||
|
@ -263,6 +269,7 @@ static void TargetEpocGameL()
|
||||||
frames_shown -= target_fps; if (frames_shown < 0) frames_shown = 0;
|
frames_shown -= target_fps; if (frames_shown < 0) frames_shown = 0;
|
||||||
if (frames_shown > frames_done) frames_shown = frames_done;
|
if (frames_shown > frames_done) frames_shown = frames_done;
|
||||||
}
|
}
|
||||||
|
User::ResetInactivityTime();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -331,14 +338,23 @@ static void TargetEpocGameL()
|
||||||
CPolledActiveScheduler::Instance()->Schedule();
|
CPolledActiveScheduler::Instance()->Schedule();
|
||||||
CGameWindow::FreeResources();
|
CGameWindow::FreeResources();
|
||||||
}
|
}
|
||||||
|
else if(gamestate == PGS_Reset)
|
||||||
|
{
|
||||||
|
PicoReset();
|
||||||
|
pico_was_reset = 1;
|
||||||
|
gamestate = PGS_Running;
|
||||||
|
}
|
||||||
else if(gamestate == PGS_ReloadRom)
|
else if(gamestate == PGS_ReloadRom)
|
||||||
{
|
{
|
||||||
loadrom_result = emu_ReloadRom(loadrom_fname);
|
loadrom_result = emu_ReloadRom(loadrom_fname);
|
||||||
pico_was_reset = 1;
|
pico_was_reset = 1;
|
||||||
if (loadrom_result)
|
if (loadrom_result)
|
||||||
gamestate = PGS_Running;
|
gamestate = PGS_Running;
|
||||||
else
|
else {
|
||||||
|
extern char menuErrorMsg[];
|
||||||
gamestate = PGS_Paused;
|
gamestate = PGS_Paused;
|
||||||
|
lprintf("%s\n", menuErrorMsg);
|
||||||
|
}
|
||||||
DEBUGPRINT(_L("done loading ROM, retval=%i"), loadrom_result);
|
DEBUGPRINT(_L("done loading ROM, retval=%i"), loadrom_result);
|
||||||
loadWaitSemaphore.Signal();
|
loadWaitSemaphore.Signal();
|
||||||
User::After(50000);
|
User::After(50000);
|
||||||
|
@ -363,15 +379,8 @@ static void TargetEpocGameL()
|
||||||
User::After(150000);
|
User::After(150000);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
emu_WriteConfig(0);
|
||||||
CGameWindow::FreeResources();
|
CGameWindow::FreeResources();
|
||||||
} else if(gamestate == PGS_DebugHeap) {
|
|
||||||
#ifdef __DEBUG_PRINT
|
|
||||||
TInt cells = User::CountAllocCells();
|
|
||||||
TInt mem;
|
|
||||||
User::AllocSize(mem);
|
|
||||||
DEBUGPRINT(_L("worker: cels=%d, size=%d KB"), cells, mem/1024);
|
|
||||||
gamestate = gamestate_next;
|
|
||||||
#endif
|
|
||||||
} else if(gamestate == PGS_Quit) {
|
} else if(gamestate == PGS_Quit) {
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
@ -397,11 +406,6 @@ static void MainInit()
|
||||||
|
|
||||||
DumpMemInfo();
|
DumpMemInfo();
|
||||||
|
|
||||||
// try to start pico
|
|
||||||
DEBUGPRINT(_L("PicoInit()"));
|
|
||||||
PicoDrawSetColorFormat(2);
|
|
||||||
PicoWriteSound = updateSound;
|
|
||||||
|
|
||||||
// if (pauseSemaphore.Handle() <= 0)
|
// if (pauseSemaphore.Handle() <= 0)
|
||||||
// pauseSemaphore.CreateLocal(0);
|
// pauseSemaphore.CreateLocal(0);
|
||||||
DEBUGPRINT(_L("initSemaphore.Signal()"));
|
DEBUGPRINT(_L("initSemaphore.Signal()"));
|
||||||
|
@ -776,6 +780,8 @@ void CGameWindow::DoKeys(void)
|
||||||
areaActions = 0;
|
areaActions = 0;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (movie_data) emu_updateMovie();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -875,8 +881,11 @@ void CGameWindow::RunEvents(TUint32 which)
|
||||||
sprintf(noticeMsg, "SAVE@SLOT@%i@SELECTED", state_slot);
|
sprintf(noticeMsg, "SAVE@SLOT@%i@SELECTED", state_slot);
|
||||||
gettimeofday(¬iceMsgTime, 0);
|
gettimeofday(¬iceMsgTime, 0);
|
||||||
}
|
}
|
||||||
if(which & 0x0020) if(gameAudio) currentConfig.volume = gameAudio->ChangeVolume(0);
|
if ((which & 0x0030) && gameAudio != NULL) {
|
||||||
if(which & 0x0010) if(gameAudio) currentConfig.volume = gameAudio->ChangeVolume(1);
|
currentConfig.volume = gameAudio->ChangeVolume((which & 0x0010) ? 1 : 0);
|
||||||
|
sprintf(noticeMsg, "VOL@%02i@", currentConfig.volume);
|
||||||
|
gettimeofday(¬iceMsgTime, 0);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -182,7 +182,7 @@ static void drawTextM2Fat(int x, int y, const char *text)
|
||||||
static void drawTextFpsCenter0(const char *text)
|
static void drawTextFpsCenter0(const char *text)
|
||||||
{
|
{
|
||||||
if(!text) return;
|
if(!text) return;
|
||||||
drawTextM2(214, 216, text);
|
drawTextM2((Pico.video.reg[12]&1) ? 234 : 214, 216, text);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void drawTextFpsFit0(const char *text)
|
static void drawTextFpsFit0(const char *text)
|
||||||
|
@ -206,7 +206,7 @@ static void drawTextFps0(const char *text)
|
||||||
static void drawTextNoticeCenter0(const char *text)
|
static void drawTextNoticeCenter0(const char *text)
|
||||||
{
|
{
|
||||||
if(!text) return;
|
if(!text) return;
|
||||||
drawTextM2(2, 216, text);
|
drawTextM2(42, 216, text);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void drawTextNoticeFit0(const char *text)
|
static void drawTextNoticeFit0(const char *text)
|
||||||
|
@ -250,12 +250,14 @@ static void fillLocalPal(void)
|
||||||
memcpy32(localPal+0xc0, localPal+0x40, 0x40);
|
memcpy32(localPal+0xc0, localPal+0x40, 0x40);
|
||||||
localPal[0xe0] = 0x00000000; // reserved pixels for OSD
|
localPal[0xe0] = 0x00000000; // reserved pixels for OSD
|
||||||
localPal[0xf0] = 0x00ee0000;
|
localPal[0xf0] = 0x00ee0000;
|
||||||
} else if (rendstatus & 0x20) { // mid-frame palette changes
|
}
|
||||||
|
else if (rendstatus & PDRAW_SONIC_MODE) { // mid-frame palette changes
|
||||||
vidConvCpyRGB32(localPal, Pico.cram, 0x40);
|
vidConvCpyRGB32(localPal, Pico.cram, 0x40);
|
||||||
vidConvCpyRGB32(localPal+0x40, HighPal, 0x40);
|
vidConvCpyRGB32(localPal+0x40, HighPal, 0x40);
|
||||||
vidConvCpyRGB32(localPal+0x80, HighPal+0x40, 0x40);
|
vidConvCpyRGB32(localPal+0x80, HighPal+0x40, 0x40);
|
||||||
} else {
|
} else {
|
||||||
vidConvCpyRGB32(localPal, Pico.cram, 0x40);
|
vidConvCpyRGB32(localPal, Pico.cram, 0x40);
|
||||||
|
memcpy32(localPal+0x80, localPal, 0x40); // for sprite prio mess
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -266,8 +268,6 @@ static void vidBlit_90(int full)
|
||||||
unsigned char *ps = PicoDraw2FB+328*8;
|
unsigned char *ps = PicoDraw2FB+328*8;
|
||||||
unsigned long *pd = (unsigned long *) screenbuff;
|
unsigned long *pd = (unsigned long *) screenbuff;
|
||||||
|
|
||||||
if (Pico.m.dirtyPal) fillLocalPal();
|
|
||||||
|
|
||||||
if(Pico.video.reg[12]&1)
|
if(Pico.video.reg[12]&1)
|
||||||
vidConvCpy_90(pd, ps, localPal, 320/8);
|
vidConvCpy_90(pd, ps, localPal, 320/8);
|
||||||
else {
|
else {
|
||||||
|
@ -284,8 +284,6 @@ static void vidBlit_270(int full)
|
||||||
unsigned char *ps = PicoDraw2FB+328*8;
|
unsigned char *ps = PicoDraw2FB+328*8;
|
||||||
unsigned long *pd = (unsigned long *) screenbuff;
|
unsigned long *pd = (unsigned long *) screenbuff;
|
||||||
|
|
||||||
if (Pico.m.dirtyPal) fillLocalPal();
|
|
||||||
|
|
||||||
if(Pico.video.reg[12]&1)
|
if(Pico.video.reg[12]&1)
|
||||||
vidConvCpy_270(pd, ps, localPal, 320/8);
|
vidConvCpy_270(pd, ps, localPal, 320/8);
|
||||||
else {
|
else {
|
||||||
|
@ -303,8 +301,6 @@ static void vidBlitCenter_0(int full)
|
||||||
unsigned char *ps = PicoDraw2FB+328*8+8;
|
unsigned char *ps = PicoDraw2FB+328*8+8;
|
||||||
unsigned long *pd = (unsigned long *) screenbuff;
|
unsigned long *pd = (unsigned long *) screenbuff;
|
||||||
|
|
||||||
if (Pico.m.dirtyPal) fillLocalPal();
|
|
||||||
|
|
||||||
if(Pico.video.reg[12]&1) ps += 32;
|
if(Pico.video.reg[12]&1) ps += 32;
|
||||||
vidConvCpy_center_0(pd, ps, localPal);
|
vidConvCpy_center_0(pd, ps, localPal);
|
||||||
if(full) vidClear(pd + 224*256, 96);
|
if(full) vidClear(pd + 224*256, 96);
|
||||||
|
@ -316,8 +312,6 @@ static void vidBlitCenter_180(int full)
|
||||||
unsigned char *ps = PicoDraw2FB+328*8+8;
|
unsigned char *ps = PicoDraw2FB+328*8+8;
|
||||||
unsigned long *pd = (unsigned long *) screenbuff;
|
unsigned long *pd = (unsigned long *) screenbuff;
|
||||||
|
|
||||||
if (Pico.m.dirtyPal) fillLocalPal();
|
|
||||||
|
|
||||||
if(Pico.video.reg[12]&1) ps += 32;
|
if(Pico.video.reg[12]&1) ps += 32;
|
||||||
vidConvCpy_center_180(pd, ps, localPal);
|
vidConvCpy_center_180(pd, ps, localPal);
|
||||||
if(full) vidClear(pd + 224*256, 96);
|
if(full) vidClear(pd + 224*256, 96);
|
||||||
|
@ -326,8 +320,6 @@ static void vidBlitCenter_180(int full)
|
||||||
|
|
||||||
static void vidBlitFit_0(int full)
|
static void vidBlitFit_0(int full)
|
||||||
{
|
{
|
||||||
if (Pico.m.dirtyPal) fillLocalPal();
|
|
||||||
|
|
||||||
if(Pico.video.reg[12]&1)
|
if(Pico.video.reg[12]&1)
|
||||||
vidConvCpy_center2_40c_0(screenbuff, PicoDraw2FB+328*8, localPal, 168);
|
vidConvCpy_center2_40c_0(screenbuff, PicoDraw2FB+328*8, localPal, 168);
|
||||||
else vidConvCpy_center2_32c_0(screenbuff, PicoDraw2FB+328*8, localPal, 168);
|
else vidConvCpy_center2_32c_0(screenbuff, PicoDraw2FB+328*8, localPal, 168);
|
||||||
|
@ -337,8 +329,6 @@ static void vidBlitFit_0(int full)
|
||||||
|
|
||||||
static void vidBlitFit_180(int full)
|
static void vidBlitFit_180(int full)
|
||||||
{
|
{
|
||||||
if (Pico.m.dirtyPal) fillLocalPal();
|
|
||||||
|
|
||||||
if(Pico.video.reg[12]&1)
|
if(Pico.video.reg[12]&1)
|
||||||
vidConvCpy_center2_40c_180(screenbuff, PicoDraw2FB+328*8, localPal, 168);
|
vidConvCpy_center2_40c_180(screenbuff, PicoDraw2FB+328*8, localPal, 168);
|
||||||
else vidConvCpy_center2_32c_180(screenbuff, PicoDraw2FB+328*8-64, localPal, 168);
|
else vidConvCpy_center2_32c_180(screenbuff, PicoDraw2FB+328*8-64, localPal, 168);
|
||||||
|
@ -348,8 +338,6 @@ static void vidBlitFit_180(int full)
|
||||||
|
|
||||||
static void vidBlitFit2_0(int full)
|
static void vidBlitFit2_0(int full)
|
||||||
{
|
{
|
||||||
if (Pico.m.dirtyPal) fillLocalPal();
|
|
||||||
|
|
||||||
if(Pico.video.reg[12]&1)
|
if(Pico.video.reg[12]&1)
|
||||||
vidConvCpy_center2_40c_0(screenbuff, PicoDraw2FB+328*8, localPal, 224);
|
vidConvCpy_center2_40c_0(screenbuff, PicoDraw2FB+328*8, localPal, 224);
|
||||||
else vidConvCpy_center2_32c_0(screenbuff, PicoDraw2FB+328*8, localPal, 224);
|
else vidConvCpy_center2_32c_0(screenbuff, PicoDraw2FB+328*8, localPal, 224);
|
||||||
|
@ -359,8 +347,6 @@ static void vidBlitFit2_0(int full)
|
||||||
|
|
||||||
static void vidBlitFit2_180(int full)
|
static void vidBlitFit2_180(int full)
|
||||||
{
|
{
|
||||||
if (Pico.m.dirtyPal) fillLocalPal();
|
|
||||||
|
|
||||||
if(Pico.video.reg[12]&1)
|
if(Pico.video.reg[12]&1)
|
||||||
vidConvCpy_center2_40c_180(screenbuff, PicoDraw2FB+328*8, localPal, 224);
|
vidConvCpy_center2_40c_180(screenbuff, PicoDraw2FB+328*8, localPal, 224);
|
||||||
else vidConvCpy_center2_32c_180(screenbuff, PicoDraw2FB+328*8-64, localPal, 224);
|
else vidConvCpy_center2_32c_180(screenbuff, PicoDraw2FB+328*8-64, localPal, 224);
|
||||||
|
@ -453,6 +439,7 @@ int vidInit(void *vidmem, int reinit)
|
||||||
vidBlit = vidBlit_270;
|
vidBlit = vidBlit_270;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fillLocalPal();
|
||||||
vidBlit(1);
|
vidBlit(1);
|
||||||
PicoOpt |= 0x100;
|
PicoOpt |= 0x100;
|
||||||
Pico.m.dirtyPal = 1;
|
Pico.m.dirtyPal = 1;
|
||||||
|
@ -475,6 +462,7 @@ void vidDrawFrame(char *noticeStr, char *fpsStr, int num)
|
||||||
drawTextFps(fpsStr);
|
drawTextFps(fpsStr);
|
||||||
drawTextNotice(noticeStr);
|
drawTextNotice(noticeStr);
|
||||||
|
|
||||||
|
if (Pico.m.dirtyPal) fillLocalPal();
|
||||||
vidBlit(!num); // copy full frame once a second
|
vidBlit(!num); // copy full frame once a second
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -19,7 +19,7 @@
|
||||||
#define CAN_HANDLE_240_LINES 0 // for now
|
#define CAN_HANDLE_240_LINES 0 // for now
|
||||||
|
|
||||||
// logging emu events
|
// logging emu events
|
||||||
#define EL_LOGMASK (EL_STATUS|EL_IDLE) // (EL_STATUS|EL_ANOMALY|EL_UIO|EL_SRAMIO|EL_INTS|EL_CDPOLL) // xffff
|
#define EL_LOGMASK (EL_STATUS) // |EL_SVP|EL_ANOMALY)
|
||||||
|
|
||||||
//extern void dprintf(char *format, ...);
|
//extern void dprintf(char *format, ...);
|
||||||
//#define dprintf(f,...) printf("%05i:%03i: " f "\n",Pico.m.frame_count,Pico.m.scanline,##__VA_ARGS__)
|
//#define dprintf(f,...) printf("%05i:%03i: " f "\n",Pico.m.frame_count,Pico.m.scanline,##__VA_ARGS__)
|
||||||
|
|
|
@ -35,10 +35,9 @@ ELF2E32 = elf2e32
|
||||||
BMCONV = bmconv
|
BMCONV = bmconv
|
||||||
EPOCRC = EPOCROOT=$(EPOCROOT) epocrc
|
EPOCRC = EPOCROOT=$(EPOCROOT) epocrc
|
||||||
|
|
||||||
PATH := $(EPOCROOT)/bin:$(GCCPATH)/bin:$(GCCPATH)/$(GCCPREF)/bin:$(PATH)
|
PATH := $(EPOCROOT)/bin:$(GCCPATH)/bin:$(PATH)
|
||||||
|
|
||||||
# TODO: do we really need -mapcs?
|
# -march=armv5t ?
|
||||||
# -march=armv5t
|
|
||||||
CFLAGS += -Wall -pipe -nostdinc -msoft-float
|
CFLAGS += -Wall -pipe -nostdinc -msoft-float
|
||||||
CFLAGS += -DNDEBUG -D_UNICODE -D__GCCE__ -D__SYMBIAN32__ -D__EPOC32__ -D__MARM__
|
CFLAGS += -DNDEBUG -D_UNICODE -D__GCCE__ -D__SYMBIAN32__ -D__EPOC32__ -D__MARM__
|
||||||
CFLAGS += -D__EABI__ -D__MARM_ARMV5__ -D__EXE__ -D__SUPPORT_CPP_EXCEPTIONS__ -D__MARM_ARMV5__
|
CFLAGS += -D__EABI__ -D__MARM_ARMV5__ -D__EXE__ -D__SUPPORT_CPP_EXCEPTIONS__ -D__MARM_ARMV5__
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue