mirror of
https://github.com/ekeeke/Genesis-Plus-GX.git
synced 2024-12-26 03:01:50 +01:00
[Core/CD] improved accuracy of CDC transfer to Main-CPU (resp. Sub-CPU) when destination is set to Sub-CPU (resp. Main-CPU) (verified on real hardware, cf. Krikzz's mcd-verificator)
This commit is contained in:
parent
b35a602bb3
commit
16589b558f
@ -2,7 +2,7 @@
|
||||
* Genesis Plus
|
||||
* CD data controller (LC8951x compatible)
|
||||
*
|
||||
* Copyright (C) 2012-2023 Eke-Eke (Genesis Plus GX)
|
||||
* Copyright (C) 2012-2024 Eke-Eke (Genesis Plus GX)
|
||||
*
|
||||
* Redistribution and use of this code or any derivative works are permitted
|
||||
* provided that the following conditions are met:
|
||||
@ -769,13 +769,13 @@ unsigned char cdc_reg_r(void)
|
||||
return data;
|
||||
}
|
||||
|
||||
unsigned short cdc_host_r(void)
|
||||
unsigned short cdc_host_r(uint8 cpu_access)
|
||||
{
|
||||
/* read CDC buffered data (gate-array register $08) */
|
||||
uint16 data = scd.regs[0x08>>1].w;
|
||||
|
||||
/* check if host data transfer is enabled */
|
||||
if (scd.regs[0x04>>1].byte.h & 0x40)
|
||||
/* check if host data transfer is started for selected CPU */
|
||||
if ((scd.regs[0x04>>1].byte.h & 0x47) == cpu_access)
|
||||
{
|
||||
/* check if EDT bit (gate-array register $04) is set (host data transfer is finished) */
|
||||
if (scd.regs[0x04>>1].byte.h & 0x80)
|
||||
|
@ -2,7 +2,7 @@
|
||||
* Genesis Plus
|
||||
* CD data controller (LC8951x compatible)
|
||||
*
|
||||
* Copyright (C) 2012-2023 Eke-Eke (Genesis Plus GX)
|
||||
* Copyright (C) 2012-2024 Eke-Eke (Genesis Plus GX)
|
||||
*
|
||||
* Redistribution and use of this code or any derivative works are permitted
|
||||
* provided that the following conditions are met:
|
||||
@ -40,6 +40,9 @@
|
||||
|
||||
#define cdc scd.cdc_hw
|
||||
|
||||
#define CDC_MAIN_CPU_ACCESS 0x42
|
||||
#define CDC_SUB_CPU_ACCESS 0x43
|
||||
|
||||
/* CDC hardware */
|
||||
typedef struct
|
||||
{
|
||||
@ -67,6 +70,6 @@ extern void cdc_dma_update(void);
|
||||
extern void cdc_decoder_update(uint32 header);
|
||||
extern void cdc_reg_w(unsigned char data);
|
||||
extern unsigned char cdc_reg_r(void);
|
||||
extern unsigned short cdc_host_r(void);
|
||||
extern unsigned short cdc_host_r(uint8 cpu_access);
|
||||
|
||||
#endif
|
||||
|
@ -680,7 +680,7 @@ static unsigned int scd_read_word(unsigned int address)
|
||||
/* CDC host data (word access only ?) */
|
||||
if (address == 0x08)
|
||||
{
|
||||
return cdc_host_r();
|
||||
return cdc_host_r(CDC_SUB_CPU_ACCESS);
|
||||
}
|
||||
|
||||
/* LED & RESET status */
|
||||
|
@ -537,7 +537,7 @@ unsigned int ctrl_io_read_word(unsigned int address)
|
||||
{
|
||||
s68k_sync();
|
||||
}
|
||||
return cdc_host_r();
|
||||
return cdc_host_r(CDC_MAIN_CPU_ACCESS);
|
||||
}
|
||||
|
||||
/* H-INT vector (word access only ?) */
|
||||
|
Loading…
Reference in New Issue
Block a user