summaryrefslogtreecommitdiffstatshomepage
diff options
context:
space:
mode:
author Olivier Galibert <galibert@pobox.com>2019-06-26 23:54:40 +0200
committer Olivier Galibert <galibert@pobox.com>2019-06-26 23:54:55 +0200
commitffe04a3f0801b3a90db471e79cb1f2ed8413bcfa (patch)
treefe5b652cd13b7555f4b96ed67f0177094b5b1ee9
parent952b2d2de4da444f8b1906ebecb86e246f1b0ce2 (diff)
mindset: More graphics fixes [O. Galibert]
-rw-r--r--src/mame/drivers/mindset.cpp246
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);