DRIVER_INIT_MEMBER(drgnmst_state,drgnmst) { UINT8 *drgnmst_PICROM_HEX = memregion("user1")->base(); UINT16 *drgnmst_PICROM = (UINT16 *)memregion("audiocpu")->base(); UINT8 *drgnmst_PCM = memregion("oki1")->base(); INT32 offs, data; UINT16 src_pos = 0; UINT16 dst_pos = 0; UINT8 data_hi, data_lo; /* Configure the OKI-0 PCM data into a MAME friendly bank format */ /* $00000-1ffff is the same through all banks */ /* $20000-3ffff in each bank is actually the switched area */ for (offs = 0x1ffff; offs >= 0; offs--) { drgnmst_PCM[0x120000 + offs] = drgnmst_PCM[0xa0000 + offs]; drgnmst_PCM[0x100000 + offs] = drgnmst_PCM[0x00000 + offs]; drgnmst_PCM[0x0e0000 + offs] = drgnmst_PCM[0x80000 + offs]; drgnmst_PCM[0x0c0000 + offs] = drgnmst_PCM[0x00000 + offs]; drgnmst_PCM[0x0a0000 + offs] = drgnmst_PCM[0x60000 + offs]; drgnmst_PCM[0x080000 + offs] = drgnmst_PCM[0x00000 + offs]; drgnmst_PCM[0x060000 + offs] = drgnmst_PCM[0x40000 + offs]; drgnmst_PCM[0x040000 + offs] = drgnmst_PCM[0x00000 + offs]; } /**** Convert the PIC16C55 ASCII HEX dump to pure HEX ****/ do { if ((drgnmst_PICROM_HEX[src_pos + 0] == ':') && (drgnmst_PICROM_HEX[src_pos + 1] == '1') && (drgnmst_PICROM_HEX[src_pos + 2] == '0')) { src_pos += 9; for (offs = 0; offs < 32; offs += 4) { data_hi = drgnmst_asciitohex((drgnmst_PICROM_HEX[src_pos + offs + 0])); data_lo = drgnmst_asciitohex((drgnmst_PICROM_HEX[src_pos + offs + 1])); if ((data_hi <= 0x0f) && (data_lo <= 0x0f)) { data = (data_hi << 4) | (data_lo << 0); data_hi = drgnmst_asciitohex((drgnmst_PICROM_HEX[src_pos + offs + 2])); data_lo = drgnmst_asciitohex((drgnmst_PICROM_HEX[src_pos + offs + 3])); if ((data_hi <= 0x0f) && (data_lo <= 0x0f)) { data |= (data_hi << 12) | (data_lo << 8); drgnmst_PICROM[dst_pos] = data; dst_pos += 1; } } } src_pos += 32; } /* Get the PIC16C55 Config register data */ if ((drgnmst_PICROM_HEX[src_pos + 0] == ':') && (drgnmst_PICROM_HEX[src_pos + 1] == '0') && (drgnmst_PICROM_HEX[src_pos + 2] == '2') && (drgnmst_PICROM_HEX[src_pos + 3] == '1')) { src_pos += 9; data_hi = drgnmst_asciitohex((drgnmst_PICROM_HEX[src_pos + 0])); data_lo = drgnmst_asciitohex((drgnmst_PICROM_HEX[src_pos + 1])); data = (data_hi << 4) | (data_lo << 0); data_hi = drgnmst_asciitohex((drgnmst_PICROM_HEX[src_pos + 2])); data_lo = drgnmst_asciitohex((drgnmst_PICROM_HEX[src_pos + 3])); data |= (data_hi << 12) | (data_lo << 8); m_audiocpu->pic16c5x_set_config(data); src_pos = 0x7fff; /* Force Exit */ } src_pos += 1; } while (src_pos < 0x0b7b); /* 0x0b7b is the size of the HEX rom loaded */ }
void drgnmst_state::init_drgnmst() { uint8_t *drgnmst_PICROM_HEX = memregion("user1")->base(); uint16_t *drgnmst_PICROM = (uint16_t *)memregion("audiocpu")->base(); uint16_t src_pos = 0; uint16_t dst_pos = 0; /* Configure the OKI-0 PCM data into a MAME friendly bank format */ /* $00000-1ffff is the same through all banks */ /* $20000-3ffff in each bank is actually the switched area */ m_oki1bank->configure_entries(0, 8, memregion("oki1")->base() + 0x20000, 0x20000); //m_oki1bank->configure_entries(0, 8, memregion("oki1")->base(), 0x20000); // TODO : Correct? /**** Convert the PIC16C55 ASCII HEX dump to pure HEX ****/ do { if ((drgnmst_PICROM_HEX[src_pos + 0] == ':') && (drgnmst_PICROM_HEX[src_pos + 1] == '1') && (drgnmst_PICROM_HEX[src_pos + 2] == '0')) { src_pos += 9; for (int32_t offs = 0; offs < 32; offs += 4) { uint8_t data_hi = drgnmst_asciitohex((drgnmst_PICROM_HEX[src_pos + offs + 0])); uint8_t data_lo = drgnmst_asciitohex((drgnmst_PICROM_HEX[src_pos + offs + 1])); if ((data_hi <= 0x0f) && (data_lo <= 0x0f)) { int32_t data = (data_hi << 4) | (data_lo << 0); data_hi = drgnmst_asciitohex((drgnmst_PICROM_HEX[src_pos + offs + 2])); data_lo = drgnmst_asciitohex((drgnmst_PICROM_HEX[src_pos + offs + 3])); if ((data_hi <= 0x0f) && (data_lo <= 0x0f)) { data |= (data_hi << 12) | (data_lo << 8); drgnmst_PICROM[dst_pos] = data; dst_pos += 1; } } } src_pos += 32; } /* Get the PIC16C55 Config register data */ if ((drgnmst_PICROM_HEX[src_pos + 0] == ':') && (drgnmst_PICROM_HEX[src_pos + 1] == '0') && (drgnmst_PICROM_HEX[src_pos + 2] == '2') && (drgnmst_PICROM_HEX[src_pos + 3] == '1')) { src_pos += 9; uint8_t data_hi = drgnmst_asciitohex((drgnmst_PICROM_HEX[src_pos + 0])); uint8_t data_lo = drgnmst_asciitohex((drgnmst_PICROM_HEX[src_pos + 1])); int32_t data = (data_hi << 4) | (data_lo << 0); data_hi = drgnmst_asciitohex((drgnmst_PICROM_HEX[src_pos + 2])); data_lo = drgnmst_asciitohex((drgnmst_PICROM_HEX[src_pos + 3])); data |= (data_hi << 12) | (data_lo << 8); m_audiocpu->set_config(data); src_pos = 0x7fff; /* Force Exit */ } src_pos += 1; } while (src_pos < 0x0b7b); /* 0x0b7b is the size of the HEX rom loaded */ }