26 $04000000 = Drive data DMA complete
25 $02000000 = DMA overflow (lost data)?
- INTREQ is read-only, each interrupt has different method to clear the interrupt.
+ INTREQ is read-only, each interrupt bit has different clearing method (see below).
B80010.L: DMA data base address (R/W. Must be 64k aligned)
/* Optimised Chunky-to-Planar algorithm by Mequa */
static uae_u32 akiko_precalc_shift[32];
static uae_u32 akiko_precalc_bytenum[32][8];
-static void akiko_precalculate (void)
+static void akiko_c2p_precalculate(void)
{
uae_u32 i, j;
for (i = 0; i < 32; i++) {
- akiko_precalc_shift [(int)i] = 1 << i;
+ akiko_precalc_shift[i] = 1 << i;
for (j = 0; j < 8; j++) {
- akiko_precalc_bytenum[(int)i][(int)j] = (i >> 3) + ((7 - j) << 2);
+ akiko_precalc_bytenum[i][j] = (i >> 3) + ((7 - j) << 2);
}
}
}
-static void akiko_c2p_do (void)
+static void akiko_c2p_do(void)
{
int i;
}
#endif
-static void akiko_c2p_write (int offset, uae_u32 v)
+static void akiko_c2p_write(int offset, uae_u32 v)
{
if (offset == 3)
akiko_buffer[akiko_write_offset] = 0;
akiko_read_offset = -1;
}
-static uae_u32 akiko_c2p_read (int offset)
+static uae_u32 akiko_c2p_read(int offset)
{
uae_u32 v;
if (akiko_read_offset < 0) {
- akiko_c2p_do ();
+ akiko_c2p_do();
akiko_read_offset = 0;
}
akiko_write_offset = 0;
static const uae_u8 patchdata2[] = { 0x0c, 0x82, 0x00, 0x00, 0x03, 0xe8, 0x4e, 0x71, 0x4e, 0x71 };
static void patchrom(void)
{
- int i;
- if (currprefs.cpu_model > 68020 || currprefs.cachesize || currprefs.m68k_speed != 0) {
+ if (currprefs.cs_cd32cd && (currprefs.cpu_model > 68020 || currprefs.cachesize || currprefs.m68k_speed != 0)) {
uae_u8 *p = extendedkickmem_bank.baseaddr;
if (p) {
- for (i = 0; i < 524288 - 512; i++) {
+ for (int i = 0; i < 524288 - 512; i++) {
if (!memcmp(p + i, patchdata2, sizeof(patchdata2)))
return;
if (!memcmp(p + i, patchdata, sizeof(patchdata))) {
static void akiko_cdrom_free (void)
{
sys_cddev_close ();
- xfree (sector_buffer_1);
- xfree (sector_buffer_2);
- xfree (sector_buffer_info_1);
- xfree (sector_buffer_info_2);
+ xfree(sector_buffer_1);
+ xfree(sector_buffer_2);
+ xfree(sector_buffer_info_1);
+ xfree(sector_buffer_info_2);
sector_buffer_1 = 0;
sector_buffer_2 = 0;
sector_buffer_info_1 = 0;
static void akiko_reset(int hardreset)
{
patchrom();
- cdaudiostop_do ();
- nvram_read ();
+ cdaudiostop_do();
+ nvram_read();
eeprom_reset(cd32_eeprom);
+ akiko_c2p_precalculate();
cdrom_speed = 1;
cdrom_current_sector = -1;
akiko_inited = false;
}
-int akiko_init (void)
+int akiko_init(void)
{
- if (!currprefs.cs_cd32cd)
- return 0;
+ akiko_free();
device_add_reset_imm(akiko_reset);
- akiko_free ();
- akiko_precalculate ();
unitnum = -1;
- sys_cddev_open ();
- sector_buffer_1 = xmalloc (uae_u8, SECTOR_BUFFER_SIZE * 2352);
- sector_buffer_2 = xmalloc (uae_u8, SECTOR_BUFFER_SIZE * 2352);
- sector_buffer_info_1 = xmalloc (uae_u8, SECTOR_BUFFER_SIZE);
- sector_buffer_info_2 = xmalloc (uae_u8, SECTOR_BUFFER_SIZE);
- sector_buffer_sector_1 = -1;
- sector_buffer_sector_2 = -1;
- uae_sem_init (&akiko_sem, 0, 1);
- uae_sem_init(&sub_sem, 0, 1);
- uae_sem_init(&cda_sem, 0, 0);
- if (!savestate_state) {
- cdrom_playing = cdrom_paused = 0;
- cdrom_data_offset = -1;
+ if (currprefs.cs_cd32cd) {
+ sys_cddev_open();
+ sector_buffer_1 = xmalloc(uae_u8, SECTOR_BUFFER_SIZE * 2352);
+ sector_buffer_2 = xmalloc(uae_u8, SECTOR_BUFFER_SIZE * 2352);
+ sector_buffer_info_1 = xmalloc(uae_u8, SECTOR_BUFFER_SIZE);
+ sector_buffer_info_2 = xmalloc(uae_u8, SECTOR_BUFFER_SIZE);
+ sector_buffer_sector_1 = -1;
+ sector_buffer_sector_2 = -1;
+ uae_sem_init(&akiko_sem, 0, 1);
+ uae_sem_init(&sub_sem, 0, 1);
+ uae_sem_init(&cda_sem, 0, 0);
+ if (!savestate_state) {
+ cdrom_playing = cdrom_paused = 0;
+ cdrom_data_offset = -1;
+ }
+ akiko_thread_do(1);
+ gui_flicker_led(LED_HD, 0, -1);
+ akiko_inited = true;
+ device_add_hsync(AKIKO_hsync_handler);
+ device_add_rethink(rethink_akiko);
}
- akiko_thread_do(1);
- gui_flicker_led (LED_HD, 0, -1);
- akiko_inited = true;
- device_add_hsync(AKIKO_hsync_handler);
device_add_exit(akiko_free);
- device_add_rethink(rethink_akiko);
return 1;
}
uae_u8 *dstbak, *dst;
int i;
- if (!currprefs.cs_cd32cd)
- return NULL;
-
if (dstptr)
dstbak = dst = dstptr;
else
int i;
akiko_free ();
- if (!currprefs.cs_cd32cd) {
- changed_prefs.cs_cd32c2p = changed_prefs.cs_cd32cd = changed_prefs.cs_cd32nvram = true;
- currprefs.cs_cd32c2p = currprefs.cs_cd32cd = currprefs.cs_cd32nvram = true;
- akiko_init ();
- }
restore_u16 ();
restore_u16 ();
void restore_akiko_finish (void)
{
- if (!currprefs.cs_cd32cd)
- return;
- sys_cddev_close ();
- akiko_init ();
- akiko_c2p_do ();
- get_cdrom_toc ();
+ sys_cddev_close();
+ akiko_init();
+ if (currprefs.cs_cd32cd) {
+ get_cdrom_toc();
+ }
+ akiko_c2p_do();
}
void restore_akiko_final(void)
}
}
}
-