diff options
author | 2019-06-26 23:54:40 +0200 | |
---|---|---|
committer | 2019-06-26 23:54:55 +0200 | |
commit | ffe04a3f0801b3a90db471e79cb1f2ed8413bcfa (patch) | |
tree | fe5b652cd13b7555f4b96ed67f0177094b5b1ee9 /src | |
parent | 952b2d2de4da444f8b1906ebecb86e246f1b0ce2 (diff) |
mindset: More graphics fixes [O. Galibert]
Diffstat (limited to 'src')
-rw-r--r-- | src/mame/drivers/mindset.cpp | 246 |
1 files changed, 143 insertions, 103 deletions
diff --git a/src/mame/drivers/mindset.cpp b/src/mame/drivers/mindset.cpp index d39f122e13d..9740400eb0b 100644 --- a/src/mame/drivers/mindset.cpp +++ b/src/mame/drivers/mindset.cpp @@ -76,6 +76,9 @@ protected: int kbd_t1_r(); u8 kbd_d_r(); + void snd_p1_w(u8 data); + void snd_p2_w(u8 data); + void fdc_ctrl_w(u8 data); void fdc_int_w(int state); u16 fdc_clear_interrupt(); @@ -182,6 +185,16 @@ int mindset_state::kbd_t1_r() return keyscan() & 0x100; } +void mindset_state::snd_p1_w(u8 data) +{ + // logerror("snd p1 %02x\n", data); +} + +void mindset_state::snd_p2_w(u8 data) +{ + // logerror("snd p2 %02x\n", data); +} + u16 mindset_state::keyscan() { u16 src = (m_kbd_p2 << 8) | m_kbd_p1; @@ -201,7 +214,6 @@ u16 mindset_state::dispctrl_r() void mindset_state::dispctrl_w(u16 data) { - // 4000 = buffer choice (switch on int2, frame int instead of field int?) u16 chg = m_dispctrl ^ data; m_dispctrl = data; if(chg & 0xff00) @@ -224,6 +236,7 @@ void mindset_state::dispreg_w(u16 data) break; case 1: m_borderidx = data & 0xf; + logerror("border color %x\n", m_borderidx); break; case 2: { m_intpos = data; @@ -273,19 +286,59 @@ u32 mindset_state::screen_update(screen_device &screen, bitmap_rgb32 &bitmap, co // Temporary gross hack if(cliprect.max_y != 399) return 0; - int mode_type = (m_dispctrl & 0x6000) >> 13; + const u16 *bank = m_dispctrl & 0x4000 ? m_vram + 8000 : m_vram; + bool ibm_mode = m_dispctrl & 0x2000; bool interleave = m_dispctrl & 0x0800; int pixels_per_byte_order = (m_dispctrl & 0x0600) >> 9; bool large_pixels = m_dispctrl & 0x0100; - switch(mode_type) { - case 0: // Native mode + if(ibm_mode) { + if(large_pixels) { + if(!interleave) { + switch(pixels_per_byte_order) { + case 1: { + static int palind[4] = { 0, 1, 4, 5 }; + for(int field=0; field<2; field++) { + for(u32 yy=0; yy<2; yy++) { + const u16 *src = bank + 4096*yy; + for(u32 y=yy; y<200; y+=2) { + u32 *dest = &bitmap.pix32(2*y+1); + for(u32 x=0; x<320; x+=8) { + u16 sv = *src++; + *dest++ = m_palette[palind[(sv >> 6) & 3]]; + *dest++ = m_palette[palind[(sv >> 6) & 3]]; + *dest++ = m_palette[palind[(sv >> 4) & 3]]; + *dest++ = m_palette[palind[(sv >> 4) & 3]]; + *dest++ = m_palette[palind[(sv >> 2) & 3]]; + *dest++ = m_palette[palind[(sv >> 2) & 3]]; + *dest++ = m_palette[palind[(sv >> 0) & 3]]; + *dest++ = m_palette[palind[(sv >> 0) & 3]]; + *dest++ = m_palette[palind[(sv >> 14) & 3]]; + *dest++ = m_palette[palind[(sv >> 14) & 3]]; + *dest++ = m_palette[palind[(sv >> 12) & 3]]; + *dest++ = m_palette[palind[(sv >> 12) & 3]]; + *dest++ = m_palette[palind[(sv >> 10) & 3]]; + *dest++ = m_palette[palind[(sv >> 10) & 3]]; + *dest++ = m_palette[palind[(sv >> 8) & 3]]; + *dest++ = m_palette[palind[(sv >> 8) & 3]]; + } + } + } + } + return 0; + } + } + } + } + + logerror("Unimplemented ibm-compatible graphics mode (%dx%d, ppb=%d)\n", large_pixels ? 320 : 640, interleave ? 400 : 200, 2 << pixels_per_byte_order); + } else { if(large_pixels) { if(!interleave) { switch(pixels_per_byte_order) { case 0: { for(int field=0; field<2; field++) { - const u16 *src = m_vram; + const u16 *src = bank; for(u32 y=0; y<200; y++) { u32 *dest = &bitmap.pix32(2*y+field); for(u32 x=0; x<320; x+=4) { @@ -306,7 +359,7 @@ u32 mindset_state::screen_update(screen_device &screen, bitmap_rgb32 &bitmap, co case 1: { static int palind[4] = { 0, 1, 4, 5 }; for(int field=0; field<2; field++) { - const u16 *src = m_vram; + const u16 *src = bank; for(u32 y=0; y<200; y++) { u32 *dest = &bitmap.pix32(2*y+field); for(u32 x=0; x<320; x+=8) { @@ -332,6 +385,51 @@ u32 mindset_state::screen_update(screen_device &screen, bitmap_rgb32 &bitmap, co } return 0; } + case 2: { + static int palind[4] = { 0, 1 }; + for(int field=0; field<2; field++) { + const u16 *src = bank; + for(u32 y=0; y<200; y++) { + u32 *dest = &bitmap.pix32(2*y+field); + for(u32 x=0; x<320; x+=16) { + u16 sv = *src++; + *dest++ = m_palette[palind[(sv >> 7) & 1]]; + *dest++ = m_palette[palind[(sv >> 7) & 1]]; + *dest++ = m_palette[palind[(sv >> 6) & 1]]; + *dest++ = m_palette[palind[(sv >> 6) & 1]]; + *dest++ = m_palette[palind[(sv >> 5) & 1]]; + *dest++ = m_palette[palind[(sv >> 5) & 1]]; + *dest++ = m_palette[palind[(sv >> 4) & 1]]; + *dest++ = m_palette[palind[(sv >> 4) & 1]]; + *dest++ = m_palette[palind[(sv >> 3) & 1]]; + *dest++ = m_palette[palind[(sv >> 3) & 1]]; + *dest++ = m_palette[palind[(sv >> 2) & 1]]; + *dest++ = m_palette[palind[(sv >> 2) & 1]]; + *dest++ = m_palette[palind[(sv >> 1) & 1]]; + *dest++ = m_palette[palind[(sv >> 1) & 1]]; + *dest++ = m_palette[palind[(sv >> 0) & 1]]; + *dest++ = m_palette[palind[(sv >> 0) & 1]]; + *dest++ = m_palette[palind[(sv >> 15) & 1]]; + *dest++ = m_palette[palind[(sv >> 15) & 1]]; + *dest++ = m_palette[palind[(sv >> 14) & 1]]; + *dest++ = m_palette[palind[(sv >> 14) & 1]]; + *dest++ = m_palette[palind[(sv >> 13) & 1]]; + *dest++ = m_palette[palind[(sv >> 13) & 1]]; + *dest++ = m_palette[palind[(sv >> 12) & 1]]; + *dest++ = m_palette[palind[(sv >> 12) & 1]]; + *dest++ = m_palette[palind[(sv >> 11) & 1]]; + *dest++ = m_palette[palind[(sv >> 11) & 1]]; + *dest++ = m_palette[palind[(sv >> 10) & 1]]; + *dest++ = m_palette[palind[(sv >> 10) & 1]]; + *dest++ = m_palette[palind[(sv >> 9) & 1]]; + *dest++ = m_palette[palind[(sv >> 9) & 1]]; + *dest++ = m_palette[palind[(sv >> 8) & 1]]; + *dest++ = m_palette[palind[(sv >> 8) & 1]]; + } + } + } + return 0; + } } } } else { @@ -341,7 +439,7 @@ u32 mindset_state::screen_update(screen_device &screen, bitmap_rgb32 &bitmap, co static int palind[4] = { 0, 1, 4, 5 }; for(int field=0; field<2; field++) { m_palette[1] = 0xffffff; - const u16 *src = m_vram; + const u16 *src = bank; for(u32 y=0; y<200; y++) { u32 *dest = &bitmap.pix32(2*y+field); for(u32 x=0; x<640; x+=8) { @@ -359,43 +457,30 @@ u32 mindset_state::screen_update(screen_device &screen, bitmap_rgb32 &bitmap, co } return 0; } - } - } - } - - logerror("Unimplemented native mode (%dx%d, ppb=%d)\n", large_pixels ? 320 : 640, interleave ? 400 : 200, 2 << pixels_per_byte_order); - break; - - case 1: // IBM-compatible graphics mode - if(large_pixels) { - if(!interleave) { - switch(pixels_per_byte_order) { case 1: { - static int palind[4] = { 0, 1, 4, 5 }; + static int palind[4] = { 0, 4 }; for(int field=0; field<2; field++) { - for(u32 yy=0; yy<2; yy++) { - const u16 *src = m_vram + 4096*yy; - for(u32 y=yy; y<200; y+=2) { - u32 *dest = &bitmap.pix32(2*y+1); - for(u32 x=0; x<320; x+=8) { - u16 sv = *src++; - *dest++ = m_palette[palind[(sv >> 6) & 3]]; - *dest++ = m_palette[palind[(sv >> 6) & 3]]; - *dest++ = m_palette[palind[(sv >> 4) & 3]]; - *dest++ = m_palette[palind[(sv >> 4) & 3]]; - *dest++ = m_palette[palind[(sv >> 2) & 3]]; - *dest++ = m_palette[palind[(sv >> 2) & 3]]; - *dest++ = m_palette[palind[(sv >> 0) & 3]]; - *dest++ = m_palette[palind[(sv >> 0) & 3]]; - *dest++ = m_palette[palind[(sv >> 14) & 3]]; - *dest++ = m_palette[palind[(sv >> 14) & 3]]; - *dest++ = m_palette[palind[(sv >> 12) & 3]]; - *dest++ = m_palette[palind[(sv >> 12) & 3]]; - *dest++ = m_palette[palind[(sv >> 10) & 3]]; - *dest++ = m_palette[palind[(sv >> 10) & 3]]; - *dest++ = m_palette[palind[(sv >> 8) & 3]]; - *dest++ = m_palette[palind[(sv >> 8) & 3]]; - } + const u16 *src = bank; + for(u32 y=0; y<200; y++) { + u32 *dest = &bitmap.pix32(2*y+field); + for(u32 x=0; x<640; x+=16) { + u16 sv = *src++; + *dest++ = m_palette[palind[(sv >> 7) & 1]]; + *dest++ = m_palette[palind[(sv >> 6) & 1]]; + *dest++ = m_palette[palind[(sv >> 5) & 1]]; + *dest++ = m_palette[palind[(sv >> 4) & 1]]; + *dest++ = m_palette[palind[(sv >> 3) & 1]]; + *dest++ = m_palette[palind[(sv >> 2) & 1]]; + *dest++ = m_palette[palind[(sv >> 1) & 1]]; + *dest++ = m_palette[palind[(sv >> 0) & 1]]; + *dest++ = m_palette[palind[(sv >> 15) & 1]]; + *dest++ = m_palette[palind[(sv >> 14) & 1]]; + *dest++ = m_palette[palind[(sv >> 13) & 1]]; + *dest++ = m_palette[palind[(sv >> 12) & 1]]; + *dest++ = m_palette[palind[(sv >> 11) & 1]]; + *dest++ = m_palette[palind[(sv >> 10) & 1]]; + *dest++ = m_palette[palind[(sv >> 9) & 1]]; + *dest++ = m_palette[palind[(sv >> 8) & 1]]; } } } @@ -405,57 +490,7 @@ u32 mindset_state::screen_update(screen_device &screen, bitmap_rgb32 &bitmap, co } } - logerror("Unimplemented ibm-compatible graphics mode (%dx%d, ppb=%d)\n", large_pixels ? 320 : 640, interleave ? 400 : 200, 2 << pixels_per_byte_order); - break; - - case 2: // IBM-compatible character mode - if(large_pixels) { - if(!interleave) { - for(int field=0; field<2; field++) { - for(u32 y=0; y<25; y++) { - for(u32 x=0; x<40; x++) { - u16 val = m_vram[y*40+x]; - const u16 *src = m_vram + 0x1000 + ((val >> 1) & 0x7f); - for(u32 yy=0; yy<8; yy++) { - u8 pix = val & 1 ? *src >> 8 : *src; - src += 128; - u32 *dest = &bitmap.pix32(16*y+2*yy+field, 16*x); - for(u32 xx=0; xx<8; xx++) { - *dest++ = pix & (0x80 >> xx) ? m_palette[1] : m_palette[0]; - *dest++ = pix & (0x80 >> xx) ? m_palette[1] : m_palette[0]; - } - } - } - } - } - return 0; - } - } else { - if(!interleave) { - for(int field=0; field<2; field++) { - for(u32 y=0; y<25; y++) { - for(u32 x=0; x<80; x++) { - u16 val = m_vram[y*80+x]; - const u16 *src = m_vram + 0x1000 + ((val >> 1) & 0x7f); - for(u32 yy=0; yy<8; yy++) { - u8 pix = val & 1 ? *src >> 8 : *src; - src += 128; - u32 *dest = &bitmap.pix32(16*y+2*yy+field, 8*x); - for(u32 xx=0; xx<8; xx++) - *dest++ = pix & (0x80 >> xx) ? m_palette[4] : m_palette[0]; - } - } - } - } - return 0; - } - } - logerror("Unimplemented ibm-compatible character mode (%dx%d)\n", large_pixels ? 320/8 : 640/8, interleave ? 400/8 : 200/8); - break; - - case 3: // Unknown - logerror("Unknown graphics mode type 3\n"); - break; + logerror("Unimplemented native mode (%dx%d, ppb=%d)\n", large_pixels ? 320 : 640, interleave ? 400 : 200, 2 << pixels_per_byte_order); } bitmap.fill(0); @@ -531,6 +566,7 @@ void mindset_state::blit(u16 packet_seg, u16 packet_adr) u16 dst_seg = sw(m_gcos->read_word((packet_seg << 4) + ((packet_adr + 22) & 0xffff))); u16 wmask = sw(m_gcos->read_word((packet_seg << 4) + ((packet_adr + 24) & 0xffff))); u16 kmask = sw(m_gcos->read_word((packet_seg << 4) + ((packet_adr + 26) & 0xffff))); + if(1) logerror("GCO: p src %04x:%04x.%x dst %04x:%04x.%x sz %xx%x step %x:%x mask %04x:%04x k %x:%x mode %c%c%c%d%c%d%c%c%c\n", src_seg, src_adr, src_sft, dst_seg, dst_adr, dst_sft, width, height, sy, dy, rmask, wmask, (kmask >> 8) & 15, kmask & 15, mode & 0x80 ? 'k' : '-', mode & 0x40 ? 't' : 'o', @@ -551,13 +587,10 @@ void mindset_state::blit(u16 packet_seg, u16 packet_adr) // i/f = increment source / don't (used by blt_copy_word) if(mode & 0x200) { - // Weird, does one with target bbe8:0000 which blows everything up - if(dst_seg != 0xbbe8) { - u16 src = m_gcos->read_word((src_seg << 4) + src_adr); - for(u16 w=0; w != width/2; w++) { - m_gcos->write_word((dst_seg << 4) + dst_adr, src); - dst_adr += 2; - } + u16 src = m_gcos->read_word((src_seg << 4) + src_adr); + for(u16 w=0; w != width/2; w++) { + m_gcos->write_word((dst_seg << 4) + dst_adr, src); + dst_adr += 2; } } else { @@ -629,8 +662,6 @@ void mindset_state::blit(u16 packet_seg, u16 packet_adr) res = (dst & ~cmask) | (res & cmask); - // logerror("GCO: %04x * %04x = %04x @ %04x\n", src, dst, res, cmask); - m_gcos->write_word((dst_seg << 4) + dst_cadr, sw(res)); if(mode & 0x100) src_cadr += 2; @@ -654,6 +685,7 @@ void mindset_state::gco_w(u16) u16 packet_adr = sw(m_gcos->read_word(0xbfd78)); u16 global_mode = sw(m_gcos->read_word(0xbfd76)); + if(1) logerror("GCO: start %04x:%04x mode %04x (%05x)\n", packet_seg, packet_adr, global_mode, m_maincpu->pc()); switch(global_mode) { @@ -736,6 +768,12 @@ void mindset_state::maincpu_io(address_map &map) map(0x8060, 0x8060).r(m_fdc, FUNC(i8272a_device::msr_r)); map(0x8062, 0x8062).rw(m_fdc, FUNC(i8272a_device::fifo_r), FUNC(i8272a_device::fifo_w)); + map(0x8080, 0x8080).lr8("id13", []() -> u8 { return 0x13; }); // sound + map(0x80c0, 0x80c0).lr8("id3f", []() -> u8 { return 0x3f; }); // serial type 1, maybe? + map(0x8100, 0x8100).lr8("id5f", []() -> u8 { return 0x5f; }); // serial type 2 + map(0x8140, 0x8140).lr8("id70", []() -> u8 { return 0x70; }); // parallel printer, init writes 0x82 at +6 + map(0x8180, 0x8180).lr8("id73", []() -> u8 { return 0x73; }); // serial type 3 + map(0x8280, 0x8283).rw(m_syscpu, FUNC(i8042_device::upi41_master_r), FUNC(i8042_device::upi41_master_w)).umask16(0x00ff); map(0x82a0, 0x82a3).rw(m_soundcpu, FUNC(i8042_device::upi41_master_r), FUNC(i8042_device::upi41_master_w)).umask16(0x00ff); map(0x8300, 0x8301).w(FUNC(mindset_state::gco_w)); @@ -765,6 +803,8 @@ void mindset_state::mindset(machine_config &config) m_syscpu->t1_in_cb().set(FUNC(mindset_state::sys_t1_r)); I8042(config, m_soundcpu, 12_MHz_XTAL/2); + m_soundcpu->p1_out_cb().set(FUNC(mindset_state::snd_p1_w)); + m_soundcpu->p2_out_cb().set(FUNC(mindset_state::snd_p2_w)); I8749(config, m_kbdcpu, 6_MHz_XTAL); m_kbdcpu->p1_out_cb().set(FUNC(mindset_state::kbd_p1_w)); @@ -783,7 +823,7 @@ void mindset_state::mindset(machine_config &config) m_screen->scanline().set([this](int scanline) { m_maincpu->int2_w(scanline == 198); }); m_screen->screen_vblank().set(m_maincpu, FUNC(i80186_cpu_device::int1_w)); - I8272A(config, m_fdc, 8'000'000, true); + I8272A(config, m_fdc, 16_MHz_XTAL/2, true); m_fdc->intrq_wr_callback().set(FUNC(mindset_state::fdc_int_w)); m_fdc->drq_wr_callback().set(m_maincpu, FUNC(i80186_cpu_device::drq1_w)); m_fdc->set_ready_line_connected(false); |