#include "pico_int.h"
#include "sound/ym2612.h"
+#include "memory.h"
#include "debug.h"
#define bit(r, x) ((r>>x)&1)
{
struct PicoVideo *pv=&Pico.video;
unsigned char *reg=pv->reg, r;
- extern int HighPreSpr[];
int i, sprites_lo, sprites_hi;
char *dstrp;
sprites_lo = sprites_hi = 0;
- for (i = 0; HighPreSpr[i] != 0; i+=2)
- if (HighPreSpr[i+1] & 0x8000)
+ for (i = 0; Pico.est.HighPreSpr[i] != 0; i+=2)
+ if (Pico.est.HighPreSpr[i+1] & 0x8000)
sprites_hi++;
else sprites_lo++;
sprintf(dstrp, "mode set 4: %02x\n", (r=reg[0xC])); MVP;
sprintf(dstrp, "interlace: %i%i, cells: %i, shadow: %i\n", bit(r,2), bit(r,1), (r&0x80) ? 40 : 32, bit(r,3)); MVP;
sprintf(dstrp, "scroll size: w: %i, h: %i SRAM: %i; eeprom: %i (%i)\n", reg[0x10]&3, (reg[0x10]&0x30)>>4,
- !!(SRam.flags & SRF_ENABLED), !!(SRam.flags & SRF_EEPROM), SRam.eeprom_type); MVP;
- sprintf(dstrp, "sram range: %06x-%06x, reg: %02x\n", SRam.start, SRam.end, Pico.m.sram_reg); MVP;
+ !!(Pico.sv.flags & SRF_ENABLED), !!(Pico.sv.flags & SRF_EEPROM), Pico.sv.eeprom_type); MVP;
+ sprintf(dstrp, "sram range: %06x-%06x, reg: %02x\n", Pico.sv.start, Pico.sv.end, Pico.m.sram_reg); MVP;
sprintf(dstrp, "pend int: v:%i, h:%i, vdp status: %04x\n", bit(pv->pending_ints,5), bit(pv->pending_ints,4), pv->status); MVP;
- sprintf(dstrp, "pal: %i, hw: %02x, frame#: %i, cycles: %i\n", Pico.m.pal, Pico.m.hardware, Pico.m.frame_count, SekCyclesDone()); MVP;
+ sprintf(dstrp, "pal: %i, hw: %02x, frame#: %i, cycles: %u\n", Pico.m.pal, Pico.m.hardware, Pico.m.frame_count, SekCyclesDone()); MVP;
sprintf(dstrp, "M68k: PC: %06x, SR: %04x, irql: %i\n", SekPc, SekSr, SekIrqLevel); MVP;
for (r = 0; r < 8; r++) {
sprintf(dstrp, "d%i=%08x, a%i=%08x\n", r, SekDar(r), r, SekDar(r+8)); MVP;
unsigned int *sprite;
int code, code2, sx, sy, height;
- sprite=(unsigned int *)(Pico.vram+((table+(link<<2))&0x7ffc)); // Find sprite
+ sprite=(unsigned int *)(PicoMem.vram+((table+(link<<2))&0x7ffc)); // Find sprite
// get sprite info
code = sprite[0];
void PDebugShowPalette(unsigned short *screen, int stride)
{
+ struct PicoEState *est = &Pico.est;
int x, y;
Pico.m.dirtyPal = 1;
- if (PicoAHW & PAHW_SMS)
+ if (PicoIn.AHW & PAHW_SMS)
PicoDoHighPal555M4();
else
- PicoDoHighPal555(1);
+ PicoDoHighPal555(1, 0, est);
Pico.m.dirtyPal = 1;
screen += 16*stride+8;
for (y = 0; y < 8*4; y++)
for (x = 0; x < 8*16; x++)
- screen[x + y*stride] = HighPal[x/8 + (y/8)*16];
+ screen[x + y*stride] = est->HighPal[x/8 + (y/8)*16];
screen += 160;
for (y = 0; y < 8*4; y++)
for (x = 0; x < 8*16; x++)
- screen[x + y*stride] = HighPal[(x/8 + (y/8)*16) | 0x40];
+ screen[x + y*stride] = est->HighPal[(x/8 + (y/8)*16) | 0x40];
screen += stride*48;
for (y = 0; y < 8*4; y++)
for (x = 0; x < 8*16; x++)
- screen[x + y*stride] = HighPal[(x/8 + (y/8)*16) | 0x80];
+ screen[x + y*stride] = est->HighPal[(x/8 + (y/8)*16) | 0x80];
}
#if defined(DRAW2_OVERRIDE_LINE_WIDTH)
struct PicoVideo *pvid=&Pico.video;
int table=0,u,link=0,*sprite=0,*fsprite,oldsprite[2];
int x,y,max_sprites = 80, oldcol, oldreg;
+ unsigned char olddbg;
if (!(pvid->reg[12]&1))
max_sprites = 64;
for (u=0; u < max_sprites && u <= which; u++)
{
- sprite=(int *)(Pico.vram+((table+(link<<2))&0x7ffc)); // Find sprite
+ sprite=(int *)(PicoMem.vram+((table+(link<<2))&0x7ffc)); // Find sprite
link=(sprite[0]>>16)&0x7f;
if (!link) break; // End of sprites
}
if (u >= max_sprites) return;
- fsprite = (int *)(Pico.vram+(table&0x7ffc));
+ fsprite = (int *)(PicoMem.vram+(table&0x7ffc));
oldsprite[0] = fsprite[0];
oldsprite[1] = fsprite[1];
fsprite[0] = (sprite[0] & ~0x007f01ff) | 0x000080;
fsprite[1] = (sprite[1] & ~0x01ff8000) | 0x800000;
oldreg = pvid->reg[7];
- oldcol = Pico.cram[0];
+ oldcol = PicoMem.cram[0];
+ olddbg = pvid->debug_p;
pvid->reg[7] = 0;
- Pico.cram[0] = 0;
- PicoDrawMask = PDRAW_SPRITES_LOW_ON;
+ PicoMem.cram[0] = 0;
+ pvid->debug_p = PVD_KILL_A | PVD_KILL_B;
PicoFrameFull();
for (y = 0; y < 8*4; y++)
{
- unsigned char *ps = PicoDraw2FB + DRAW2_LINE_WIDTH*y + 8;
+ unsigned char *ps = Pico.est.Draw2FB + DRAW2_LINE_WIDTH*y + 8;
for (x = 0; x < 8*4; x++)
- if (ps[x]) screen[x] = HighPal[ps[x]], ps[x] = 0;
+ if (ps[x]) screen[x] = Pico.est.HighPal[ps[x]], ps[x] = 0;
screen += stride;
}
fsprite[0] = oldsprite[0];
fsprite[1] = oldsprite[1];
pvid->reg[7] = oldreg;
- Pico.cram[0] = oldcol;
- PicoDrawMask = -1;
+ PicoMem.cram[0] = oldcol;
+ pvid->debug_p = olddbg;
}
-#define dump_ram(ram,fname) \
+#define dump_ram_m(ram,fname,mode) \
{ \
unsigned short *sram = (unsigned short *) ram; \
FILE *f; \
\
for (i = 0; i < sizeof(ram)/2; i++) \
sram[i] = (sram[i]<<8) | (sram[i]>>8); \
- f = fopen(fname, "wb"); \
+ f = fopen(fname, mode); \
if (f) { \
fwrite(ram, 1, sizeof(ram), f); \
fclose(f); \
sram[i] = (sram[i]<<8) | (sram[i]>>8); \
}
+#define dump_ram(ram,fname) \
+ dump_ram_m(ram,fname,"wb")
+
#define dump_ram_noswab(ram,fname) \
{ \
FILE *f; \
void PDebugDumpMem(void)
{
- dump_ram_noswab(Pico.zram, "dumps/zram.bin");
- dump_ram(Pico.cram, "dumps/cram.bin");
+#if 0
+ char buf[1 << M68K_MEM_SHIFT];
+ unsigned int a;
+ for (a = 0; ; a++) {
+ uptr v = m68k_read16_map[a];
+ if (map_flag_set(v))
+ break;
+ v <<= 1;
+ v += a << M68K_MEM_SHIFT;
+ memcpy(buf, (void *)v, sizeof(buf));
+ dump_ram_m(buf, "dumps/cart.bin", a ? "ab" : "wb");
+ }
+#endif
+ dump_ram_noswab(PicoMem.zram, "dumps/zram.bin");
+ dump_ram(PicoMem.cram, "dumps/cram.bin");
- if (PicoAHW & PAHW_SMS)
+ if (PicoIn.AHW & PAHW_SMS)
{
- dump_ram_noswab(Pico.vramb, "dumps/vram.bin");
+ dump_ram_noswab(PicoMem.vramb, "dumps/vram.bin");
}
else
{
- dump_ram(Pico.ram, "dumps/ram.bin");
- dump_ram(Pico.vram, "dumps/vram.bin");
- dump_ram(Pico.vsram,"dumps/vsram.bin");
+ dump_ram(PicoMem.ram, "dumps/ram.bin");
+ dump_ram(PicoMem.vram, "dumps/vram.bin");
+ dump_ram(PicoMem.vsram,"dumps/vsram.bin");
}
- if (PicoAHW & PAHW_MCD)
+ if (PicoIn.AHW & PAHW_MCD)
{
dump_ram(Pico_mcd->prg_ram, "dumps/prg_ram.bin");
if (Pico_mcd->s68k_regs[3]&4) // 1M mode?
}
#ifndef NO_32X
- if (PicoAHW & PAHW_32X)
+ if (PicoIn.AHW & PAHW_32X)
{
dump_ram(Pico32xMem->sdram, "dumps/sdram.bin");
dump_ram(Pico32xMem->dram[0], "dumps/dram0.bin");
{
int lines, line_sample;
- if (PicoAHW & PAHW_SMS)
+ if (PicoIn.AHW & PAHW_SMS)
return;
if (Pico.m.pal) {
- lines = 312;
+ lines = 313;
line_sample = 68;
} else {
lines = 262;
}
z80_resetCycles();
- emustatus &= ~1;
+ PsndStartFrame();
- if (Pico.m.z80Run && !Pico.m.z80_reset && (PicoOpt&POPT_EN_Z80))
- PicoSyncZ80(line_sample*488);
- if (ym2612.dacen && PsndDacLine <= line_sample)
- PsndDoDAC(line_sample);
- if (PsndOut)
+ if (/*Pico.m.z80Run &&*/ !Pico.m.z80_reset && (PicoIn.opt&POPT_EN_Z80))
+ PicoSyncZ80(Pico.t.m68c_cnt + line_sample * 488);
+ if (PicoIn.sndOut)
PsndGetSamples(line_sample);
- if (Pico.m.z80Run && !Pico.m.z80_reset && (PicoOpt&POPT_EN_Z80)) {
- PicoSyncZ80(224*488);
+ if (/*Pico.m.z80Run &&*/ !Pico.m.z80_reset && (PicoIn.opt&POPT_EN_Z80)) {
+ PicoSyncZ80(Pico.t.m68c_cnt + 224 * 488);
z80_int();
}
- if (ym2612.dacen && PsndDacLine <= 224)
- PsndDoDAC(224);
- if (PsndOut)
+ if (PicoIn.sndOut)
PsndGetSamples(224);
// sync z80
- if (Pico.m.z80Run && !Pico.m.z80_reset && (PicoOpt&POPT_EN_Z80))
- PicoSyncZ80(Pico.m.pal ? 151809 : 127671); // cycles adjusted for converter
- if (PsndOut && ym2612.dacen && PsndDacLine <= lines-1)
- PsndDoDAC(lines-1);
+ if (/*Pico.m.z80Run &&*/ !Pico.m.z80_reset && (PicoIn.opt&POPT_EN_Z80)) {
+ Pico.t.m68c_cnt += Pico.m.pal ? 151809 : 127671; // cycles adjusted for converter
+ PicoSyncZ80(Pico.t.m68c_cnt);
+ }
+ if (PicoIn.sndOut && ym2612.dacen && Pico.snd.dac_line < lines)
+ PsndDoDAC(lines - 1);
+ PsndDoPSG(lines - 1);
timers_cycle();
+ Pico.t.m68c_aim = Pico.t.m68c_cnt;
}
void PDebugCPUStep(void)
{
- if (PicoAHW & PAHW_SMS)
+ if (PicoIn.AHW & PAHW_SMS)
z80_run_nr(1);
else
SekStepM68k();