static void music_playback(int param) { int pattern = 0; if ((OKIM6295_status_0_r(0) & 0x08) == 0) { if (sslam_bar != 0) { sslam_bar += 1; if (sslam_bar >= (sslam_snd_loop[sslam_melody][0] + 1)) sslam_bar = 1; } pattern = sslam_snd_loop[sslam_melody][sslam_bar]; if (pattern == 0xff) { /* Restart track from first bar */ sslam_bar = 1; pattern = sslam_snd_loop[sslam_melody][sslam_bar]; } if (pattern == 0x00) { /* Non-looped track. Stop playing it */ sslam_track = 0; sslam_melody = 0; sslam_bar = 0; timer_enable(music_timer,0); } if (pattern) { logerror("Changing bar in music track to pattern %02x\n",pattern); OKIM6295_data_0_w(0,(0x80 | pattern)); OKIM6295_data_0_w(0,0x81); } } // { // pattern = sslam_snd_loop[sslam_melody][sslam_bar]; // popmessage("Music track: %02x, Melody: %02x, Pattern: %02x, Bar:%02d",sslam_track,sslam_melody,pattern,sslam_bar); // } }
static void sslam_play(int melody, int data) { int status = OKIM6295_status_0_r(0); logerror("Playing sample %01x:%02x from command %02x\n",sslam_snd_bank,sslam_sound,data); if (sslam_sound == 0) ui_popup("Unknown sound command %02x",sslam_sound); if (melody) { if (sslam_melody != sslam_sound) { sslam_melody = sslam_sound; sslam_melody_loop = sslam_sound; if (status & 0x08) OKIM6295_data_0_w(0,0x40); OKIM6295_data_0_w(0,(0x80 | sslam_melody)); OKIM6295_data_0_w(0,0x81); } } else { if ((status & 0x01) == 0) { OKIM6295_data_0_w(0,(0x80 | sslam_sound)); OKIM6295_data_0_w(0,0x11); } else if ((status & 0x02) == 0) { OKIM6295_data_0_w(0,(0x80 | sslam_sound)); OKIM6295_data_0_w(0,0x21); } else if ((status & 0x04) == 0) { OKIM6295_data_0_w(0,(0x80 | sslam_sound)); OKIM6295_data_0_w(0,0x41); } } }
static void oki_play_sample(int sample_no) { UINT16 table_start = (sample_no & 0x80) ? read16(SAMPLE_TABLE_1) : read16(SAMPLE_TABLE_0); UINT8 byte1 = read8(table_start + 2 * (sample_no & 0x7f) + 0); UINT8 byte2 = read8(table_start + 2 * (sample_no & 0x7f) + 1); int chip = (byte1 & 0x80) >> 7; if ((byte1 & 0x7f) == 0) { /* stop all channels */ if (chip == 0) OKIM6295_data_0_w(0, 0x78 ); else OKIM6295_data_1_w(0, 0x78 ); } else { int sample = byte1 & 0x7f; int ch = byte2 & 0x03; int force = (byte2 & 0x80) >> 7; if (!force && (NMK004_state.oki_playing & (1 << (ch + 4*chip)))) return; NMK004_state.oki_playing |= 1 << (ch + 4*chip); /* stop channel */ if (chip == 0) OKIM6295_data_0_w(0, (0x08 << ch) ); else OKIM6295_data_1_w(0, (0x08 << ch) ); if (sample != 0) { UINT8 *rom = memory_region(REGION_SOUND1 + chip); int bank = (byte2 & 0x0c) >> 2; int vol = (byte2 & 0x70) >> 4; if (bank != 3) memcpy(rom + 0x20000,rom + 0x40000 + bank * 0x20000,0x20000); if (chip == 0) { OKIM6295_data_0_w(0, 0x80 | sample ); OKIM6295_data_0_w(0, (0x10 << ch) | vol ); } else { OKIM6295_data_1_w(0, 0x80 | sample ); OKIM6295_data_1_w(0, (0x10 << ch) | vol ); } } }
static void play_oki_sound(int game_sound, int data) { int status = OKIM6295_status_0_r(0); logerror("Playing sample %02x from command %02x\n",game_sound,data); if (game_sound != 0) { if ((status & 0x01) == 0) { OKIM6295_data_0_w(0,(0x80 | game_sound)); OKIM6295_data_0_w(0,0x11); } else if ((status & 0x02) == 0) { OKIM6295_data_0_w(0,(0x80 | game_sound)); OKIM6295_data_0_w(0,0x21); } else if ((status & 0x04) == 0) { OKIM6295_data_0_w(0,(0x80 | game_sound)); OKIM6295_data_0_w(0,0x41); } else if ((status & 0x08) == 0) { OKIM6295_data_0_w(0,(0x80 | game_sound)); OKIM6295_data_0_w(0,0x81); } } }
static void write_memory_8(unsigned int address, unsigned int data) { if (address < 0x004000) workram[address] = data; else if ((address >= 0x4000) && (address < 0x8000)) workram[0x10000 + (address & 0x3fff)] = data; else if (address == 0x400001) ym2151_last_adr = data; else if (address == 0x400003) YM2151WriteReg(0, ym2151_last_adr, data); else if (address == 0x400005) OKIM6295_data_0_w(0, data); else if ((address >= 0xc00000) && (address < 0xc08000)) workram[address & 0x7fff] = data; else if ((address >= 0xfe0000) && (address < 0xffffff)) workram[0x10000 + (address & 0x1ffff)] = data; else printf("W8: %x @ %x (PC=%x)\n", data, address, m68k_get_reg(NULL, M68K_REG_PC)); }
static void sslam_play(int track, int data) { int status = OKIM6295_status_0_r(0); if (data < 0x80) { if (track) { if (sslam_track != data) { sslam_track = data; sslam_bar = 1; if (status & 0x08) OKIM6295_data_0_w(0,0x40); OKIM6295_data_0_w(0,(0x80 | data)); OKIM6295_data_0_w(0,0x81); timer_adjust(music_timer, TIME_IN_MSEC(4), 0, TIME_IN_HZ(250)); /* 250Hz for smooth sequencing */ } } else { if ((status & 0x01) == 0) { OKIM6295_data_0_w(0,(0x80 | data)); OKIM6295_data_0_w(0,0x11); } else if ((status & 0x02) == 0) { OKIM6295_data_0_w(0,(0x80 | data)); OKIM6295_data_0_w(0,0x21); } else if ((status & 0x04) == 0) { OKIM6295_data_0_w(0,(0x80 | data)); OKIM6295_data_0_w(0,0x41); } } } else { /* use above 0x80 to turn off channels */ if (track) { timer_enable(music_timer,0); sslam_track = 0; sslam_melody = 0; sslam_bar = 0; } data &= 0x7f; OKIM6295_data_0_w(0,data); } }
void batsugun_okisnd_w(int data) { /* ui_popup("Writing %04x to Sound CPU",data); */ if (data == 0) { OKIM6295_data_0_w(0,0x78); /* Stop playing effects */ } else if ((data > 0) && (data < 64)) { play_oki_sound(batsugun_cmd_snd[data], data); } }
static INTERRUPT_GEN( sslam_interrupt ) { if ((OKIM6295_status_0_r(0) & 0x08) == 0) { switch(sslam_melody_loop) { case 0x060: sslam_melody_loop = 0x061; break; case 0x061: sslam_melody_loop = 0x062; break; case 0x062: sslam_melody_loop = 0x060; break; case 0x065: sslam_melody_loop = 0x165; break; case 0x165: sslam_melody_loop = 0x265; break; case 0x265: sslam_melody_loop = 0x365; break; case 0x365: sslam_melody_loop = 0x066; break; case 0x066: sslam_melody_loop = 0x067; break; case 0x067: sslam_melody_loop = 0x068; break; case 0x068: sslam_melody_loop = 0x065; break; case 0x063: sslam_melody_loop = 0x063; break; case 0x064: sslam_melody_loop = 0x064; break; case 0x069: sslam_melody_loop = 0x069; break; case 0x06a: sslam_melody_loop = 0x06a; break; case 0x06b: sslam_melody_loop = 0x06b; break; case 0x06c: sslam_melody_loop = 0x06c; break; default: sslam_melody_loop = 0x00; break; } if (sslam_melody_loop) { /* logerror("Changing to sample %02x\n",sslam_melody_loop); */ OKIM6295_data_0_w(0,((0x80 | sslam_melody_loop) & 0xff)); OKIM6295_data_0_w(0,0x81); } } }
static WRITE8_HANDLER( playmark_snd_control_w ) { static int oki_old_bank = -1; playmark_oki_control = data; if(data & 3) { if(oki_old_bank != (data & 3)) { oki_old_bank = data & 3; OKIM6295_set_bank_base(0, 0x40000 * (oki_old_bank - 1)); } } if ((data & 0x38) == 0x18) { OKIM6295_data_0_w(0, playmark_oki_command); } /* !(data & 0x80) -> sound enable */ /* data & 0x40 -> always set */ }
static WRITE16_HANDLER( adpcm_w ) { if (ACCESSING_LSB) OKIM6295_data_0_w(offset, data & 0xff); }
static WRITE16_HANDLER( oki_w ) { if(offset) OKIM6295_data_0_w(machine, 0, data); }
static WRITE16_HANDLER( tumblep_oki_w ) { OKIM6295_data_0_w(0,data&0xff); /* STUFF IN OTHER BYTE TOO..*/ }
static WRITE_HANDLER( adpcm_w ) { if (!(data & 0x00ff0000)) OKIM6295_data_0_w(offset, data & 0xff); }
static void adpcm_w(int offset, int data) { if (!(data & 0x00ff0000)) OKIM6295_data_0_w(offset, data & 0xff); }
static WRITE8_HANDLER( aquarium_oki_w ) { logerror("Z80-PC:%04x Writing %04x to the OKI M6295\n",activecpu_get_previouspc(),aquarium_snd_bitswap(data)); OKIM6295_data_0_w( 0, (aquarium_snd_bitswap(data)) ); }
static WRITE32_HANDLER( oki_32bit_w ) { OKIM6295_data_0_w(0, data & 0xff); }