mirror of
https://github.com/RaySollium99/picodrive.git
synced 2025-09-05 15:27:46 -04:00
bugfixes, but silpheed is broken
git-svn-id: file:///home/notaz/opt/svn/PicoDrive@72 be3aeb3a-fb24-0410-a615-afba39da0efa
This commit is contained in:
parent
5c69a605ae
commit
48e8482fc2
8 changed files with 317 additions and 26 deletions
|
@ -269,6 +269,7 @@ void z80_write16(unsigned short data, unsigned short a);
|
||||||
// cd/Memory.c
|
// cd/Memory.c
|
||||||
void PicoMemSetupCD(void);
|
void PicoMemSetupCD(void);
|
||||||
void PicoMemResetCD(int r3);
|
void PicoMemResetCD(int r3);
|
||||||
|
void PicoMemResetCDdecode(int r3);
|
||||||
unsigned char PicoReadCD8 (unsigned int a);
|
unsigned char PicoReadCD8 (unsigned int a);
|
||||||
unsigned short PicoReadCD16(unsigned int a);
|
unsigned short PicoReadCD16(unsigned int a);
|
||||||
unsigned int PicoReadCD32(unsigned int a);
|
unsigned int PicoReadCD32(unsigned int a);
|
||||||
|
|
|
@ -245,6 +245,7 @@ int PicoCdLoadState(void *file)
|
||||||
wram_2M_to_1M(Pico_mcd->word_ram2M);
|
wram_2M_to_1M(Pico_mcd->word_ram2M);
|
||||||
#ifdef _ASM_CD_MEMORY_C
|
#ifdef _ASM_CD_MEMORY_C
|
||||||
PicoMemResetCD(Pico_mcd->s68k_regs[3]);
|
PicoMemResetCD(Pico_mcd->s68k_regs[3]);
|
||||||
|
PicoMemResetCDdecode(Pico_mcd->s68k_regs[3]);
|
||||||
#endif
|
#endif
|
||||||
if (Pico_mcd->m.audio_track > 0 && Pico_mcd->m.audio_track < Pico_mcd->TOC.Last_Track)
|
if (Pico_mcd->m.audio_track > 0 && Pico_mcd->m.audio_track < Pico_mcd->TOC.Last_Track)
|
||||||
mp3_start_play(Pico_mcd->TOC.Tracks[Pico_mcd->m.audio_track].F, Pico_mcd->m.audio_offset);
|
mp3_start_play(Pico_mcd->TOC.Tracks[Pico_mcd->m.audio_track].F, Pico_mcd->m.audio_offset);
|
||||||
|
|
|
@ -34,12 +34,6 @@ typedef unsigned int u32;
|
||||||
// -----------------------------------------------------------------
|
// -----------------------------------------------------------------
|
||||||
|
|
||||||
|
|
||||||
#ifndef _ASM_CD_MEMORY_C
|
|
||||||
void PicoMemResetCD(int r3)
|
|
||||||
{
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifndef _ASM_CD_MEMORY_C
|
#ifndef _ASM_CD_MEMORY_C
|
||||||
static u32 m68k_reg_read16(u32 a)
|
static u32 m68k_reg_read16(u32 a)
|
||||||
{
|
{
|
||||||
|
@ -237,6 +231,7 @@ void s68k_reg_write8(u32 a, u32 d)
|
||||||
//dprintf("s68k_regs w%2i: [%02x] %02x @ %06x", realsize, a, d, SekPcS68k);
|
//dprintf("s68k_regs w%2i: [%02x] %02x @ %06x", realsize, a, d, SekPcS68k);
|
||||||
|
|
||||||
// TODO: review against Gens
|
// TODO: review against Gens
|
||||||
|
// Warning: d might have upper bits set
|
||||||
switch (a) {
|
switch (a) {
|
||||||
case 2:
|
case 2:
|
||||||
return; // only m68k can change WP
|
return; // only m68k can change WP
|
||||||
|
@ -252,6 +247,10 @@ void s68k_reg_write8(u32 a, u32 d)
|
||||||
PicoMemResetCD(d);
|
PicoMemResetCD(d);
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
#ifdef _ASM_CD_MEMORY_C
|
||||||
|
if ((d ^ dold) & 0x1d)
|
||||||
|
PicoMemResetCDdecode(d);
|
||||||
|
#endif
|
||||||
if (!(dold & 4)) {
|
if (!(dold & 4)) {
|
||||||
dprintf("wram mode 2M->1M");
|
dprintf("wram mode 2M->1M");
|
||||||
wram_2M_to_1M(Pico_mcd->word_ram2M);
|
wram_2M_to_1M(Pico_mcd->word_ram2M);
|
||||||
|
@ -298,7 +297,7 @@ void s68k_reg_write8(u32 a, u32 d)
|
||||||
return;
|
return;
|
||||||
case 0x31:
|
case 0x31:
|
||||||
dprintf("s68k set int3 timer: %02x", d);
|
dprintf("s68k set int3 timer: %02x", d);
|
||||||
Pico_mcd->m.timer_int3 = d << 16;
|
Pico_mcd->m.timer_int3 = (d & 0xff) << 16;
|
||||||
break;
|
break;
|
||||||
case 0x33: // IRQ mask
|
case 0x33: // IRQ mask
|
||||||
dprintf("s68k irq mask: %02x", d);
|
dprintf("s68k irq mask: %02x", d);
|
||||||
|
@ -1048,6 +1047,8 @@ static void decode_write16(u32 a, u16 d, int r3)
|
||||||
|
|
||||||
// -----------------------------------------------------------------
|
// -----------------------------------------------------------------
|
||||||
|
|
||||||
|
//void PicoWriteS68k8_(u32 a,u8 d);
|
||||||
|
//void PicoWriteS68k8__(u32 a,u8 d);
|
||||||
#ifdef _ASM_CD_MEMORY_C
|
#ifdef _ASM_CD_MEMORY_C
|
||||||
void PicoWriteS68k8(u32 a,u8 d);
|
void PicoWriteS68k8(u32 a,u8 d);
|
||||||
#else
|
#else
|
||||||
|
@ -1058,6 +1059,16 @@ static void PicoWriteS68k8(u32 a,u8 d)
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
a&=0xffffff;
|
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
|
// prg RAM
|
||||||
if (a < 0x80000) {
|
if (a < 0x80000) {
|
||||||
|
@ -1071,7 +1082,7 @@ static void PicoWriteS68k8(u32 a,u8 d)
|
||||||
a &= 0x1ff;
|
a &= 0x1ff;
|
||||||
rdprintf("s68k_regs w8: [%02x] %02x @ %06x", a, d, SekPcS68k);
|
rdprintf("s68k_regs w8: [%02x] %02x @ %06x", a, d, SekPcS68k);
|
||||||
if (a >= 0x58 && a < 0x68)
|
if (a >= 0x58 && a < 0x68)
|
||||||
gfx_cd_write(a&~1, (d<<8)|d);
|
gfx_cd_write16(a&~1, (d<<8)|d);
|
||||||
else s68k_reg_write8(a,d);
|
else s68k_reg_write8(a,d);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
@ -1146,7 +1157,7 @@ static void PicoWriteS68k16(u32 a,u16 d)
|
||||||
a &= 0x1fe;
|
a &= 0x1fe;
|
||||||
rdprintf("s68k_regs w16: [%02x] %04x @ %06x", a, d, SekPcS68k);
|
rdprintf("s68k_regs w16: [%02x] %04x @ %06x", a, d, SekPcS68k);
|
||||||
if (a >= 0x58 && a < 0x68)
|
if (a >= 0x58 && a < 0x68)
|
||||||
gfx_cd_write(a, d);
|
gfx_cd_write16(a, d);
|
||||||
else {
|
else {
|
||||||
if (a == 0xe) { // special case, 2 byte writes would be handled differently
|
if (a == 0xe) { // special case, 2 byte writes would be handled differently
|
||||||
Pico_mcd->s68k_regs[0xf] = d;
|
Pico_mcd->s68k_regs[0xf] = d;
|
||||||
|
@ -1231,8 +1242,8 @@ static void PicoWriteS68k32(u32 a,u32 d)
|
||||||
a &= 0x1fe;
|
a &= 0x1fe;
|
||||||
rdprintf("s68k_regs w32: [%02x] %08x @ %06x", a, d, SekPcS68k);
|
rdprintf("s68k_regs w32: [%02x] %08x @ %06x", a, d, SekPcS68k);
|
||||||
if (a >= 0x58 && a < 0x68) {
|
if (a >= 0x58 && a < 0x68) {
|
||||||
gfx_cd_write(a, d>>16);
|
gfx_cd_write16(a, d>>16);
|
||||||
gfx_cd_write(a+2, d&0xffff);
|
gfx_cd_write16(a+2, d&0xffff);
|
||||||
} else {
|
} else {
|
||||||
s68k_reg_write8(a, d>>24);
|
s68k_reg_write8(a, d>>24);
|
||||||
s68k_reg_write8(a+1,(d>>16)&0xff);
|
s68k_reg_write8(a+1,(d>>16)&0xff);
|
||||||
|
|
301
Pico/cd/Memory.s
301
Pico/cd/Memory.s
|
@ -62,7 +62,7 @@
|
||||||
.endm
|
.endm
|
||||||
|
|
||||||
|
|
||||||
@ the jumptables themselves
|
@ the jumptables themselves.
|
||||||
m_m68k_read8_table: mk_m68k_jump_table read 8
|
m_m68k_read8_table: mk_m68k_jump_table read 8
|
||||||
m_m68k_read16_table: mk_m68k_jump_table read 16
|
m_m68k_read16_table: mk_m68k_jump_table read 16
|
||||||
m_m68k_read32_table: mk_m68k_jump_table read 32
|
m_m68k_read32_table: mk_m68k_jump_table read 32
|
||||||
|
@ -77,6 +77,26 @@ m_s68k_write8_table: mk_s68k_jump_table write 8
|
||||||
m_s68k_write16_table: mk_s68k_jump_table write 16
|
m_s68k_write16_table: mk_s68k_jump_table write 16
|
||||||
m_s68k_write32_table: mk_s68k_jump_table write 32
|
m_s68k_write32_table: mk_s68k_jump_table write 32
|
||||||
|
|
||||||
|
m_s68k_decode_write_table:
|
||||||
|
.long m_s68k_write8_2M_decode_b0_m0
|
||||||
|
.long m_s68k_write16_2M_decode_b0_m0
|
||||||
|
.long m_s68k_write32_2M_decode_b0_m0
|
||||||
|
.long m_s68k_write8_2M_decode_b0_m1
|
||||||
|
.long m_s68k_write16_2M_decode_b0_m1
|
||||||
|
.long m_s68k_write32_2M_decode_b0_m1
|
||||||
|
.long m_s68k_write8_2M_decode_b0_m2
|
||||||
|
.long m_s68k_write16_2M_decode_b0_m2
|
||||||
|
.long m_s68k_write32_2M_decode_b0_m2
|
||||||
|
.long m_s68k_write8_2M_decode_b1_m0
|
||||||
|
.long m_s68k_write16_2M_decode_b1_m0
|
||||||
|
.long m_s68k_write32_2M_decode_b1_m0
|
||||||
|
.long m_s68k_write8_2M_decode_b1_m1
|
||||||
|
.long m_s68k_write16_2M_decode_b1_m1
|
||||||
|
.long m_s68k_write32_2M_decode_b1_m1
|
||||||
|
.long m_s68k_write8_2M_decode_b1_m2
|
||||||
|
.long m_s68k_write16_2M_decode_b1_m2
|
||||||
|
.long m_s68k_write32_2M_decode_b1_m2
|
||||||
|
|
||||||
|
|
||||||
@ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
|
@ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
|
||||||
|
|
||||||
|
@ -84,6 +104,7 @@ m_s68k_write32_table: mk_s68k_jump_table write 32
|
||||||
.align 4
|
.align 4
|
||||||
|
|
||||||
.global PicoMemResetCD
|
.global PicoMemResetCD
|
||||||
|
.global PicoMemResetCDdecode
|
||||||
.global PicoReadM68k8
|
.global PicoReadM68k8
|
||||||
.global PicoReadM68k16
|
.global PicoReadM68k16
|
||||||
.global PicoReadM68k32
|
.global PicoReadM68k32
|
||||||
|
@ -141,10 +162,12 @@ m_s68k_write32_table: mk_s68k_jump_table write 32
|
||||||
ldr r3, =m_m68k_&\on&\sz&_wordram1_1M_b0
|
ldr r3, =m_m68k_&\on&\sz&_wordram1_1M_b0
|
||||||
str r2, [r1, #16*4]
|
str r2, [r1, #16*4]
|
||||||
str r3, [r1, #17*4]
|
str r3, [r1, #17*4]
|
||||||
ldr r2, =m_s68k_&\on&\sz&_wordram_2M_decode_b1
|
|
||||||
ldr r3, =m_s68k_&\on&\sz&_wordram_1M_b1
|
ldr r3, =m_s68k_&\on&\sz&_wordram_1M_b1
|
||||||
|
.ifeqs "\on", "read"
|
||||||
|
ldr r2, =m_s68k_&\on&\sz&_wordram_2M_decode_b1
|
||||||
str r2, [r12,#4*4]
|
str r2, [r12,#4*4]
|
||||||
str r2, [r12,#5*4]
|
str r2, [r12,#5*4]
|
||||||
|
.endif
|
||||||
str r3, [r12,#6*4]
|
str r3, [r12,#6*4]
|
||||||
b 9f @ pmr_8_done
|
b 9f @ pmr_8_done
|
||||||
|
|
||||||
|
@ -153,10 +176,12 @@ m_s68k_write32_table: mk_s68k_jump_table write 32
|
||||||
ldr r3, =m_m68k_&\on&\sz&_wordram1_1M_b1
|
ldr r3, =m_m68k_&\on&\sz&_wordram1_1M_b1
|
||||||
str r2, [r1, #16*4]
|
str r2, [r1, #16*4]
|
||||||
str r3, [r1, #17*4]
|
str r3, [r1, #17*4]
|
||||||
ldr r2, =m_s68k_&\on&\sz&_wordram_2M_decode_b0
|
|
||||||
ldr r3, =m_s68k_&\on&\sz&_wordram_1M_b0
|
ldr r3, =m_s68k_&\on&\sz&_wordram_1M_b0
|
||||||
|
.ifeqs "\on", "read"
|
||||||
|
ldr r2, =m_s68k_&\on&\sz&_wordram_2M_decode_b0
|
||||||
str r2, [r12,#4*4]
|
str r2, [r12,#4*4]
|
||||||
str r2, [r12,#5*4]
|
str r2, [r12,#5*4]
|
||||||
|
.endif
|
||||||
str r3, [r12,#6*4]
|
str r3, [r12,#6*4]
|
||||||
|
|
||||||
9: @ pmr_8_done:
|
9: @ pmr_8_done:
|
||||||
|
@ -173,6 +198,27 @@ PicoMemResetCD: @ r3
|
||||||
bx lr
|
bx lr
|
||||||
|
|
||||||
|
|
||||||
|
PicoMemResetCDdecode: @r3
|
||||||
|
ldr r1, =m_s68k_write8_table
|
||||||
|
ldr r3, =m_s68k_decode_write_table
|
||||||
|
and r2, r0, #0x18
|
||||||
|
mov r2, r2, lsr #3
|
||||||
|
cmp r2, #3
|
||||||
|
moveq r2, #2 @ mode3 is same as mode2?
|
||||||
|
tst r0, #1
|
||||||
|
addeq r2, r2, #3 @ bank1 (r2=0..5)
|
||||||
|
add r2, r2, r2, lsl #1 @ *= 3
|
||||||
|
add r2, r3, r2, lsl #2
|
||||||
|
ldmia r2, {r0,r3,r12}
|
||||||
|
str r0, [r1, #4*4]
|
||||||
|
str r0, [r1, #5*4]
|
||||||
|
str r3, [r1, #4*4+8*4]
|
||||||
|
str r3, [r1, #5*4+8*4]
|
||||||
|
str r12,[r1, #4*4+8*4*2]
|
||||||
|
str r12,[r1, #5*4+8*4*2]
|
||||||
|
bx lr
|
||||||
|
|
||||||
|
|
||||||
.pool
|
.pool
|
||||||
|
|
||||||
@ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
|
@ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
|
||||||
|
@ -1529,6 +1575,50 @@ m_s68k_read32_regs_gfx:
|
||||||
bx lr
|
bx lr
|
||||||
.endm
|
.endm
|
||||||
|
|
||||||
|
.macro m_s68k_write8_2M_decode map_addr
|
||||||
|
ldr r2, =(Pico+0x22200)
|
||||||
|
eor r0, r0, #2
|
||||||
|
ldr r2, [r2]
|
||||||
|
movs r0, r0, lsr #1 @ +4-6 <<16
|
||||||
|
add r2, r2, #\map_addr @ map to our address
|
||||||
|
.endm
|
||||||
|
|
||||||
|
.macro m_s68k_write8_2M_decode_m0 map_addr @ mode off
|
||||||
|
m_s68k_write8_2M_decode \map_addr
|
||||||
|
ldrb r0, [r2, r0]!
|
||||||
|
and r1, r1, #0x0f
|
||||||
|
movcc r1, r1, lsl #4
|
||||||
|
andcc r3, r0, #0x0f
|
||||||
|
andcs r3, r0, #0xf0
|
||||||
|
orr r3, r3, r1
|
||||||
|
cmp r0, r3 @ avoid writing if result is same
|
||||||
|
strneb r3, [r2]
|
||||||
|
bx lr
|
||||||
|
.endm
|
||||||
|
|
||||||
|
.macro m_s68k_write8_2M_decode_m1 map_addr @ mode underwrite
|
||||||
|
ands r1, r1, #0x0f
|
||||||
|
bxeq lr
|
||||||
|
m_s68k_write8_2M_decode \map_addr
|
||||||
|
ldrb r0, [r2, r0]!
|
||||||
|
movcc r1, r1, lsl #4
|
||||||
|
andcc r3, r0, #0x0f
|
||||||
|
andcs r3, r0, #0xf0
|
||||||
|
tst r3, r3
|
||||||
|
bxeq lr
|
||||||
|
orr r3, r3, r1
|
||||||
|
cmp r0, r3
|
||||||
|
strneb r3, [r2]
|
||||||
|
bx lr
|
||||||
|
.endm
|
||||||
|
|
||||||
|
.macro m_s68k_write8_2M_decode_m2 map_addr @ mode overwrite
|
||||||
|
ands r1, r1, #0x0f
|
||||||
|
bxeq lr
|
||||||
|
m_s68k_write8_2M_decode_m0 \map_addr @ same as in off mode
|
||||||
|
.endm
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
m_s68k_write8_prg: @ 0x000000 - 0x07ffff
|
m_s68k_write8_prg: @ 0x000000 - 0x07ffff
|
||||||
m_s68k_write8_wordram_2M: @ 0x080000 - 0x0bffff
|
m_s68k_write8_wordram_2M: @ 0x080000 - 0x0bffff
|
||||||
|
@ -1536,9 +1626,23 @@ m_s68k_write8_wordram_1M_b1: @ 0x0c0000 - 0x0dffff, maps to 0x0e0000
|
||||||
m_s68k_write8_ram 0x020000
|
m_s68k_write8_ram 0x020000
|
||||||
|
|
||||||
|
|
||||||
m_s68k_write8_wordram_2M_decode_b0: @ 0x080000 - 0x0bffff
|
m_s68k_write8_2M_decode_b0_m0: @ 0x080000 - 0x0bffff
|
||||||
m_s68k_write8_wordram_2M_decode_b1: @ 0x080000 - 0x0bffff
|
m_s68k_write8_2M_decode_m0 0x080000
|
||||||
bx lr @ TODO
|
|
||||||
|
m_s68k_write8_2M_decode_b0_m1:
|
||||||
|
m_s68k_write8_2M_decode_m1 0x080000
|
||||||
|
|
||||||
|
m_s68k_write8_2M_decode_b0_m2:
|
||||||
|
m_s68k_write8_2M_decode_m2 0x080000
|
||||||
|
|
||||||
|
m_s68k_write8_2M_decode_b1_m0:
|
||||||
|
m_s68k_write8_2M_decode_m0 0x0a0000
|
||||||
|
|
||||||
|
m_s68k_write8_2M_decode_b1_m1:
|
||||||
|
m_s68k_write8_2M_decode_m1 0x0a0000
|
||||||
|
|
||||||
|
m_s68k_write8_2M_decode_b1_m2:
|
||||||
|
m_s68k_write8_2M_decode_m2 0x0a0000
|
||||||
|
|
||||||
|
|
||||||
m_s68k_write8_wordram_1M_b0: @ 0x0c0000 - 0x0dffff (same as our offset :)
|
m_s68k_write8_wordram_1M_b0: @ 0x0c0000 - 0x0dffff (same as our offset :)
|
||||||
|
@ -1614,6 +1718,57 @@ m_s68k_write8_regs:
|
||||||
bx lr
|
bx lr
|
||||||
.endm
|
.endm
|
||||||
|
|
||||||
|
.macro m_s68k_write16_2M_decode map_addr
|
||||||
|
ldr r2, =(Pico+0x22200)
|
||||||
|
eor r0, r0, #2
|
||||||
|
ldr r2, [r2]
|
||||||
|
mov r0, r0, lsr #1 @ +4-6 <<16
|
||||||
|
add r2, r2, #\map_addr @ map to our address
|
||||||
|
.endm
|
||||||
|
|
||||||
|
.macro m_s68k_write16_2M_decode_m0 map_addr @ mode off
|
||||||
|
m_s68k_write16_2M_decode \map_addr
|
||||||
|
bic r1, r1, #0xf0
|
||||||
|
orr r1, r1, r1, lsr #4
|
||||||
|
strb r1, [r2, r0]
|
||||||
|
bx lr
|
||||||
|
.endm
|
||||||
|
|
||||||
|
.macro m_s68k_write16_2M_decode_m1 map_addr @ mode underwrite
|
||||||
|
bics r1, r1, #0xf000
|
||||||
|
bicnes r1, r1, #0x00f0
|
||||||
|
bxeq lr
|
||||||
|
orr r1, r1, r1, lsr #4
|
||||||
|
m_s68k_write16_2M_decode \map_addr
|
||||||
|
ldrb r0, [r2, r0]!
|
||||||
|
and r3, r1, #0x0f
|
||||||
|
and r1, r1, #0xf0
|
||||||
|
tst r0, #0x0f
|
||||||
|
orreq r0, r0, r3
|
||||||
|
tst r0, #0xf0
|
||||||
|
orreq r0, r0, r1
|
||||||
|
strb r0, [r2]
|
||||||
|
bx lr
|
||||||
|
.endm
|
||||||
|
|
||||||
|
.macro m_s68k_write16_2M_decode_m2 map_addr @ mode overwrite
|
||||||
|
bics r1, r1, #0xf000
|
||||||
|
bicnes r1, r1, #0x00f0
|
||||||
|
bxeq lr
|
||||||
|
orr r1, r1, r1, lsr #4
|
||||||
|
m_s68k_write16_2M_decode \map_addr
|
||||||
|
ldrb r0, [r2, r0]!
|
||||||
|
ands r3, r1, #0x0f
|
||||||
|
andne r0, r0, #0xf0
|
||||||
|
orrne r0, r0, r3
|
||||||
|
ands r1, r1, #0xf0
|
||||||
|
andne r0, r0, #0x0f
|
||||||
|
orrne r0, r0, r1
|
||||||
|
strb r0, [r2]
|
||||||
|
bx lr
|
||||||
|
.endm
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
m_s68k_write16_prg: @ 0x000000 - 0x07ffff
|
m_s68k_write16_prg: @ 0x000000 - 0x07ffff
|
||||||
m_s68k_write16_wordram_2M: @ 0x080000 - 0x0bffff
|
m_s68k_write16_wordram_2M: @ 0x080000 - 0x0bffff
|
||||||
|
@ -1621,9 +1776,23 @@ m_s68k_write16_wordram_1M_b1: @ 0x0c0000 - 0x0dffff, maps to 0x0e0000
|
||||||
m_s68k_write16_ram 0x020000
|
m_s68k_write16_ram 0x020000
|
||||||
|
|
||||||
|
|
||||||
m_s68k_write16_wordram_2M_decode_b0: @ 0x080000 - 0x0bffff
|
m_s68k_write16_2M_decode_b0_m0: @ 0x080000 - 0x0bffff
|
||||||
m_s68k_write16_wordram_2M_decode_b1: @ 0x080000 - 0x0bffff
|
m_s68k_write16_2M_decode_m0 0x080000
|
||||||
bx lr @ TODO
|
|
||||||
|
m_s68k_write16_2M_decode_b0_m1:
|
||||||
|
m_s68k_write16_2M_decode_m1 0x080000
|
||||||
|
|
||||||
|
m_s68k_write16_2M_decode_b0_m2:
|
||||||
|
m_s68k_write16_2M_decode_m2 0x080000
|
||||||
|
|
||||||
|
m_s68k_write16_2M_decode_b1_m0:
|
||||||
|
m_s68k_write16_2M_decode_m0 0x0a0000
|
||||||
|
|
||||||
|
m_s68k_write16_2M_decode_b1_m1:
|
||||||
|
m_s68k_write16_2M_decode_m1 0x0a0000
|
||||||
|
|
||||||
|
m_s68k_write16_2M_decode_b1_m2:
|
||||||
|
m_s68k_write16_2M_decode_m2 0x0a0000
|
||||||
|
|
||||||
|
|
||||||
m_s68k_write16_wordram_1M_b0: @ 0x0c0000 - 0x0dffff (same as our offset :)
|
m_s68k_write16_wordram_1M_b0: @ 0x0c0000 - 0x0dffff (same as our offset :)
|
||||||
|
@ -1664,7 +1833,7 @@ m_s68k_write16_regs_spec: @ special case
|
||||||
ldr r2, [r2]
|
ldr r2, [r2]
|
||||||
add r0, r0, #0x00000f
|
add r0, r0, #0x00000f
|
||||||
strb r1, [r2, r0] @ if (a == 0xe) s68k_regs[0xf] = d;
|
strb r1, [r2, r0] @ if (a == 0xe) s68k_regs[0xf] = d;
|
||||||
bxeq lr
|
bx lr
|
||||||
|
|
||||||
|
|
||||||
@ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
|
@ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
|
||||||
|
@ -1681,6 +1850,98 @@ m_s68k_write16_regs_spec: @ special case
|
||||||
bx lr
|
bx lr
|
||||||
.endm
|
.endm
|
||||||
|
|
||||||
|
.macro m_s68k_write32_2M_decode map_addr
|
||||||
|
ldr r2, =(Pico+0x22200)
|
||||||
|
eor r0, r0, #2
|
||||||
|
ldr r2, [r2]
|
||||||
|
mov r0, r0, lsr #1 @ +4-6 <<16
|
||||||
|
add r2, r2, #\map_addr @ map to our address
|
||||||
|
.endm
|
||||||
|
|
||||||
|
.macro m_s68k_write32_2M_decode_m0 map_addr @ mode off
|
||||||
|
m_s68k_write32_2M_decode \map_addr
|
||||||
|
bic r1, r1, #0x000000f0
|
||||||
|
bic r1, r1, #0x00f00000
|
||||||
|
orr r1, r1, r1, lsr #4
|
||||||
|
mov r3, r1, lsr #16
|
||||||
|
strb r3, [r2, r0]!
|
||||||
|
tst r0, #1
|
||||||
|
strneb r1, [r2, #-1]
|
||||||
|
streqb r1, [r2, #3]
|
||||||
|
bx lr
|
||||||
|
.endm
|
||||||
|
|
||||||
|
.macro m_s68k_write32_2M_decode_m1 map_addr @ mode underwrite
|
||||||
|
bics r1, r1, #0x000000f0
|
||||||
|
bicnes r1, r1, #0x0000f000
|
||||||
|
bicnes r1, r1, #0x00f00000
|
||||||
|
bicnes r1, r1, #0xf0000000
|
||||||
|
bxeq lr
|
||||||
|
orr r1, r1, r1, lsr #4
|
||||||
|
m_s68k_write32_2M_decode \map_addr
|
||||||
|
ldrb r3, [r2, r0]!
|
||||||
|
tst r0, #1
|
||||||
|
ldrneb r0, [r2, #-1]
|
||||||
|
ldreqb r0, [r2, #3]
|
||||||
|
and r12,r1, #0x0000000f
|
||||||
|
orr r0, r0, r3, lsl #16
|
||||||
|
orrne r0, r0, #0x80000000 @ remember addr lsb bit
|
||||||
|
tst r0, #0x0000000f
|
||||||
|
orreq r0, r0, r12
|
||||||
|
tst r0, #0x000000f0
|
||||||
|
andeq r12,r1, #0x000000f0
|
||||||
|
orreq r0, r0, r12
|
||||||
|
tst r0, #0x000f0000
|
||||||
|
andeq r12,r1, #0x000f0000
|
||||||
|
orreq r0, r0, r12
|
||||||
|
tst r0, #0x00f00000
|
||||||
|
andeq r12,r1, #0x00f00000
|
||||||
|
orreq r0, r0, r12
|
||||||
|
tst r0, #0x80000000
|
||||||
|
strneb r0, [r2, #-1]
|
||||||
|
streqb r0, [r2, #3]
|
||||||
|
mov r0, r0, lsr #16
|
||||||
|
strb r0, [r2]
|
||||||
|
bx lr
|
||||||
|
.endm
|
||||||
|
|
||||||
|
.macro m_s68k_write32_2M_decode_m2 map_addr @ mode overwrite
|
||||||
|
bics r1, r1, #0x000000f0
|
||||||
|
bicnes r1, r1, #0x0000f000
|
||||||
|
bicnes r1, r1, #0x00f00000
|
||||||
|
bicnes r1, r1, #0xf0000000
|
||||||
|
bxeq lr
|
||||||
|
orr r1, r1, r1, lsr #4
|
||||||
|
m_s68k_write32_2M_decode \map_addr
|
||||||
|
ldrb r3, [r2, r0]!
|
||||||
|
tst r0, #1
|
||||||
|
ldrneb r0, [r2, #-1]
|
||||||
|
ldreqb r0, [r2, #3]
|
||||||
|
orrne r1, r1, #0x80000000 @ remember addr lsb bit
|
||||||
|
orr r0, r0, r3, lsl #16
|
||||||
|
tst r1, #0x0000000f
|
||||||
|
andeq r12,r0, #0x0000000f
|
||||||
|
orreq r1, r1, r12
|
||||||
|
tst r1, #0x000000f0
|
||||||
|
andeq r12,r0, #0x000000f0
|
||||||
|
orreq r1, r1, r12
|
||||||
|
tst r1, #0x000f0000
|
||||||
|
andeq r12,r0, #0x000f0000
|
||||||
|
orreq r1, r1, r12
|
||||||
|
tst r1, #0x00f00000
|
||||||
|
andeq r12,r0, #0x00f00000
|
||||||
|
orreq r1, r1, r12
|
||||||
|
cmp r0, r1
|
||||||
|
bxeq lr
|
||||||
|
tst r1, #0x80000000
|
||||||
|
strneb r1, [r2, #-1]
|
||||||
|
streqb r1, [r2, #3]
|
||||||
|
mov r1, r1, lsr #16
|
||||||
|
strb r1, [r2]
|
||||||
|
bx lr
|
||||||
|
.endm
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
m_s68k_write32_prg: @ 0x000000 - 0x07ffff
|
m_s68k_write32_prg: @ 0x000000 - 0x07ffff
|
||||||
m_s68k_write32_wordram_2M: @ 0x080000 - 0x0bffff
|
m_s68k_write32_wordram_2M: @ 0x080000 - 0x0bffff
|
||||||
|
@ -1688,9 +1949,23 @@ m_s68k_write32_wordram_1M_b1: @ 0x0c0000 - 0x0dffff, maps to 0x0e0000
|
||||||
m_s68k_write32_ram 0x020000
|
m_s68k_write32_ram 0x020000
|
||||||
|
|
||||||
|
|
||||||
m_s68k_write32_wordram_2M_decode_b0: @ 0x080000 - 0x0bffff
|
m_s68k_write32_2M_decode_b0_m0: @ 0x080000 - 0x0bffff
|
||||||
m_s68k_write32_wordram_2M_decode_b1: @ 0x080000 - 0x0bffff
|
m_s68k_write32_2M_decode_m0 0x080000
|
||||||
bx lr @ TODO
|
|
||||||
|
m_s68k_write32_2M_decode_b0_m1:
|
||||||
|
m_s68k_write32_2M_decode_m1 0x080000
|
||||||
|
|
||||||
|
m_s68k_write32_2M_decode_b0_m2:
|
||||||
|
m_s68k_write32_2M_decode_m2 0x080000
|
||||||
|
|
||||||
|
m_s68k_write32_2M_decode_b1_m0:
|
||||||
|
m_s68k_write32_2M_decode_m0 0x0a0000
|
||||||
|
|
||||||
|
m_s68k_write32_2M_decode_b1_m1:
|
||||||
|
m_s68k_write32_2M_decode_m1 0x0a0000
|
||||||
|
|
||||||
|
m_s68k_write32_2M_decode_b1_m2:
|
||||||
|
m_s68k_write32_2M_decode_m2 0x0a0000
|
||||||
|
|
||||||
|
|
||||||
m_s68k_write32_wordram_1M_b0: @ 0x0c0000 - 0x0dffff (same as our offset :)
|
m_s68k_write32_wordram_1M_b0: @ 0x0c0000 - 0x0dffff (same as our offset :)
|
||||||
|
|
|
@ -51,6 +51,7 @@ int PicoResetMCD(int hard)
|
||||||
gfx_cd_reset();
|
gfx_cd_reset();
|
||||||
#ifdef _ASM_CD_MEMORY_C
|
#ifdef _ASM_CD_MEMORY_C
|
||||||
PicoMemResetCD(1);
|
PicoMemResetCD(1);
|
||||||
|
PicoMemResetCDdecode(1);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
|
|
|
@ -55,7 +55,7 @@ typedef struct {
|
||||||
unsigned int Cur_Track;
|
unsigned int Cur_Track;
|
||||||
int File_Add_Delay;
|
int File_Add_Delay;
|
||||||
char CDD_Complete;
|
char CDD_Complete;
|
||||||
int pad[7];
|
int pad[6];
|
||||||
} _scd;
|
} _scd;
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -987,7 +987,6 @@ void emu_forced_frame(void)
|
||||||
|
|
||||||
PicoOpt |= 0x10;
|
PicoOpt |= 0x10;
|
||||||
PicoFrameFull();
|
PicoFrameFull();
|
||||||
PicoOpt = po_old;
|
|
||||||
|
|
||||||
if (!(Pico.video.reg[12]&1)) {
|
if (!(Pico.video.reg[12]&1)) {
|
||||||
vidCpyM2 = vidCpyM2_32col;
|
vidCpyM2 = vidCpyM2_32col;
|
||||||
|
@ -997,6 +996,8 @@ void emu_forced_frame(void)
|
||||||
vidCpyM2((unsigned char *)gp2x_screen+320*8, framebuff+328*8);
|
vidCpyM2((unsigned char *)gp2x_screen+320*8, framebuff+328*8);
|
||||||
vidConvCpyRGB32(localPal, Pico.cram, 0x40);
|
vidConvCpyRGB32(localPal, Pico.cram, 0x40);
|
||||||
gp2x_video_setpalette(localPal, 0x40);
|
gp2x_video_setpalette(localPal, 0x40);
|
||||||
|
|
||||||
|
PicoOpt = po_old;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void simpleWait(int thissec, int lim_time)
|
static void simpleWait(int thissec, int lim_time)
|
||||||
|
|
|
@ -220,6 +220,7 @@ Changelog
|
||||||
* Integrated "better sync" code into cyclone code, what made this mode much faster.
|
* Integrated "better sync" code into cyclone code, what made this mode much faster.
|
||||||
* Fixed a bug related to game specific config saving.
|
* Fixed a bug related to game specific config saving.
|
||||||
* Frameskipper was skipping sound processing, what caused some audio desyncs. Fixed.
|
* Frameskipper was skipping sound processing, what caused some audio desyncs. Fixed.
|
||||||
|
* Fixed reset not working for some games.
|
||||||
|
|
||||||
1.201
|
1.201
|
||||||
+ Added basic cheat support (GameGenie and Genecyst patches).
|
+ Added basic cheat support (GameGenie and Genecyst patches).
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue