1.31 release

git-svn-id: file:///home/notaz/opt/svn/PicoDrive@80 be3aeb3a-fb24-0410-a615-afba39da0efa
This commit is contained in:
notaz 2007-03-25 22:21:21 +00:00
parent 782f8f2211
commit c008977e8e
12 changed files with 160 additions and 50 deletions

View file

@ -52,7 +52,9 @@ static u32 m68k_reg_read16(u32 a)
goto end;
case 2:
d = (Pico_mcd->s68k_regs[a]<<8) | (Pico_mcd->s68k_regs[a+1]&0xc7);
dprintf("m68k_regs r3: %02x @%06x", (u8)d, SekPc);
// the DMNA delay must only be visible on s68k side (Lunar2, Silpheed)
if (Pico_mcd->m.state_flags&2) { d &= ~1; d |= 2; }
//printf("m68k_regs r3: %02x @%06x\n", (u8)d, SekPc);
goto end;
case 4:
d = Pico_mcd->s68k_regs[4]<<8;
@ -117,7 +119,7 @@ void m68k_reg_write8(u32 a, u32 d)
return;
case 3: {
u32 dold = Pico_mcd->s68k_regs[3]&0x1f;
dprintf("m68k_regs w3: %02x @%06x", (u8)d, SekPc);
//printf("m68k_regs w3: %02x @%06x\n", (u8)d, SekPc);
d &= 0xc2;
if ((dold>>6) != ((d>>6)&3))
dprintf("m68k: prg bank: %i -> %i", (Pico_mcd->s68k_regs[a]>>6), ((d>>6)&3));
@ -207,7 +209,7 @@ u32 s68k_reg_read16(u32 a)
return ((Pico_mcd->s68k_regs[0]&3)<<8) | 1; // ver = 0, not in reset state
case 2:
d = (Pico_mcd->s68k_regs[a]<<8) | (Pico_mcd->s68k_regs[a+1]&0x1f);
dprintf("s68k_regs r3: %02x @%06x", (u8)d, SekPcS68k);
//printf("s68k_regs r3: %02x @%06x\n", (u8)d, SekPcS68k);
goto poll_detect;
case 6:
return CDC_Read_Reg();
@ -279,7 +281,7 @@ void s68k_reg_write8(u32 a, u32 d)
return; // only m68k can change WP
case 3: {
int dold = Pico_mcd->s68k_regs[3];
dprintf("s68k_regs w3: %02x @%06x", (u8)d, SekPcS68k);
//printf("s68k_regs w3: %02x @%06x\n", (u8)d, SekPcS68k);
d &= 0x1d;
d |= dold&0xc2;
if (d&4) {
@ -482,7 +484,9 @@ static u16 PicoReadM68k16(u32 a)
// prg RAM
if ((a&0xfe0000)==0x020000 && (Pico_mcd->m.busreq&2)) {
u8 *prg_bank = Pico_mcd->prg_ram_b[Pico_mcd->s68k_regs[3]>>6];
wrdprintf("m68k_prgram r16: [%i,%06x] @%06x", Pico_mcd->s68k_regs[3]>>6, a, SekPc);
d = *(u16 *)(prg_bank+(a&0x1fffe));
wrdprintf("ret = %04x", d);
goto end;
}
@ -655,6 +659,7 @@ static void PicoWriteM68k16(u32 a,u16 d)
// prg RAM
if ((a&0xfe0000)==0x020000 && (Pico_mcd->m.busreq&2)) {
u8 *prg_bank = Pico_mcd->prg_ram_b[Pico_mcd->s68k_regs[3]>>6];
wrdprintf("m68k_prgram w16: [%i,%06x] %04x @%06x", Pico_mcd->s68k_regs[3]>>6, a, d, SekPc);
*(u16 *)(prg_bank+(a&0x1fffe))=d;
return;
}
@ -863,7 +868,9 @@ static u16 PicoReadS68k16(u32 a)
// prg RAM
if (a < 0x80000) {
wrdprintf("s68k_prgram r16: [%06x] @%06x", a, SekPcS68k);
d = *(u16 *)(Pico_mcd->prg_ram+a);
wrdprintf("ret = %04x", d);
goto end;
}
@ -979,7 +986,6 @@ static u32 PicoReadS68k32(u32 a)
d = Pico_mcd->word_ram1M[bank][((a+0)^1)&0x1ffff] << 16;
d |= Pico_mcd->word_ram1M[bank][((a+1)^1)&0x1ffff];
d |= d << 4; d &= 0x0f0f0f0f;
dprintf("FIXME: decode");
} else {
// allow access in any mode, like Gens does
u16 *pm=(u16 *)(Pico_mcd->word_ram2M+(a&0x3fffe)); d = (pm[0]<<16)|pm[1];
@ -1058,8 +1064,6 @@ static void decode_write8(u32 a, u8 d, int r3)
d &= 0x0f;
if (!(a&1)) d <<= 4;
//dprintf("FIXME: decode, r3 = %02x", r3);
if (r3 == 8) {
if ((!(*pd & (~oldmask))) && d) goto do_it;
} else if (r3 > 8) {
@ -1097,15 +1101,11 @@ static void decode_write16(u32 a, u16 d, int r3)
} else {
*pd = d;
}
//dprintf("FIXME: decode");
}
#endif
// -----------------------------------------------------------------
//void PicoWriteS68k8_(u32 a,u8 d);
//void PicoWriteS68k8__(u32 a,u8 d);
#ifdef _ASM_CD_MEMORY_C
void PicoWriteS68k8(u32 a,u8 d);
#else
@ -1116,16 +1116,6 @@ static void PicoWriteS68k8(u32 a,u8 d)
#endif
a&=0xffffff;
#if 0
PicoWriteS68k8_(a, d);
/* if ((a&0xfc0000)!=0x080000) {
PicoWriteS68k8_(a, d);
return;
}
printf("r3: %02x\n", Pico_mcd->s68k_regs[3]);
PicoWriteS68k8__(a,d);*/
return;
#endif
// prg RAM
if (a < 0x80000) {
@ -1205,6 +1195,7 @@ static void PicoWriteS68k16(u32 a,u16 d)
// prg RAM
if (a < 0x80000) {
wrdprintf("s68k_prgram w16: [%06x] %04x @%06x", a, d, SekPcS68k);
*(u16 *)(Pico_mcd->prg_ram+a)=d;
return;
}

View file

@ -489,7 +489,13 @@ m_m68k_read8_r02:
m_m68k_read8_r03:
add r1, r1, #0x110000
ldrb r0, [r1, #3]
add r1, r1, #0x002200
ldr r1, [r1, #4]
and r0, r0, #0xc7
tst r1, #2 @ DMNA pending?
bxeq lr
bic r0, r0, #1
orr r0, r0, #2
bx lr
m_m68k_read8_r04:
add r1, r1, #0x110000
@ -677,9 +683,15 @@ m_m68k_read16_r00:
m_m68k_read16_r02:
add r1, r1, #0x110000
ldrb r0, [r1, #2]
ldrb r1, [r1, #3]
and r1, r1, #0xc7
orr r0, r1, r0, lsl #8
ldrb r2, [r1, #3]
add r1, r1, #0x002200
ldr r1, [r1, #4]
and r2, r2, #0xc7
orr r0, r2, r0, lsl #8
tst r1, #2 @ DMNA pending?
bxeq lr
bic r0, r0, #1
orr r0, r0, #2
bx lr
m_m68k_read16_r04:
add r1, r1, #0x110000

View file

@ -68,7 +68,7 @@ int PicoResetMCD(int hard)
memset(&Pico_mcd->m, 0, sizeof(Pico_mcd->m));
*(unsigned int *)(Pico_mcd->bios + 0x70) = 0xffffffff; // reset hint vector (simplest way to implement reg6)
Pico_mcd->m.state_flags |= 2; // s68k reset pending
Pico_mcd->m.state_flags |= 1; // s68k reset pending
Pico_mcd->s68k_regs[3] = 1; // 2M word RAM mode with m68k access after reset
Reset_CD();

View file

@ -31,8 +31,6 @@ static void gfx_cd_start(void)
{
int upd_len;
dprintf("gfx_cd_start()");
// rot_comp.XD_Mul = ((rot_comp.Reg_5C & 0x1f) + 1) * 4; // unused
rot_comp.Function = (rot_comp.Reg_58 & 7) | (Pico_mcd->s68k_regs[3] & 0x18); // Jmp_Adr
// rot_comp.Buffer_Adr = (rot_comp.Reg_5E & 0xfff8) << 2; // unused?
@ -61,6 +59,8 @@ static void gfx_cd_start(void)
break;
}
dprintf("gfx_cd_start, stamp_map_addr=%06x", rot_comp.Stamp_Map_Adr);
gfx_cd_update();
}
@ -95,6 +95,18 @@ static void gfx_do(unsigned int func, unsigned short *stamp_base, unsigned int H
// MAKE_IMAGE_LINE
while (H_Dot)
{
// MAKE_IMAGE_PIXEL
if (!(func & 1)) // NOT TILED
{
int mask = (func & 4) ? 0x00800000 : 0x00f80000;
if ((ecx | edx) & mask)
{
if (func & 0x18) goto Next_Pixel;
pixel = 0;
goto Pixel_Out;
}
}
if (func & 2) // mode 32x32 dot
{
if (func & 4) // 16x16 screen
@ -122,19 +134,7 @@ static void gfx_do(unsigned int func, unsigned short *stamp_base, unsigned int H
}
}
// MAKE_IMAGE_PIXEL
if (!(func & 1)) // NOT TILED
{
int mask = (func & 4) ? 0x00800000 : 0x00f80000;
if ((ecx | edx) & mask)
{
if (func & 0x18) goto Next_Pixel;
pixel = 0;
goto Pixel_Out;
}
}
edi = stamp_base[ebx];// | (stamp_base[ebx+1] << 16);
edi = stamp_base[ebx];
esi = (edi & 0x7ff) << 7;
if (!esi) { pixel = 0; goto Pixel_Out; }
edi >>= (11+1);