macpwrbk030.cpp: fixed CPU/MCU comms and improved video. [R. Belmont]

This commit is contained in:
arbee 2022-12-24 00:22:47 -05:00
parent 59194837ab
commit 48ac30bc7a

View File

@ -200,9 +200,6 @@ private:
emu_timer *m_6015_timer = nullptr;
WRITE_LINE_MEMBER(adb_irq_w) { m_adb_irq_pending = state; }
int m_adb_irq_pending = 0;
u16 mac_via_r(offs_t offset);
void mac_via_w(offs_t offset, u16 data, u16 mem_mask);
u16 mac_via2_r(offs_t offset);
@ -285,17 +282,32 @@ private:
u8 m_pmu_via_bus = 0, m_pmu_ack = 0, m_pmu_req = 0;
u8 pmu_data_r() { return m_pmu_via_bus; }
void pmu_data_w(u8 data) { m_pmu_via_bus = data; }
void pmu_data_w(u8 data)
{
// if the 68k has valid data on the bus, don't overwrite it
if (m_pmu_req)
{
m_pmu_via_bus = data;
}
}
u8 pmu_comms_r() { return (m_pmu_req<<7); }
void pmu_comms_w(u8 data)
{
m_via1->write_cb1(BIT(data, 5));
m_pmu_ack = BIT(data, 6);
m_via1->write_cb1(BIT(data, 5) ^ 1);
if (m_pmu_ack != BIT(data, 6))
{
m_pmu_ack = BIT(data, 6);
machine().scheduler().synchronize();
}
}
int m_adb_line = 0;
void set_adb_line(int state) { m_adb_line = state; }
u8 pmu_adb_r() { return (m_adb_line<<1); }
void pmu_adb_w(u8 data) { m_macadb->adb_linechange_w((data & 1) ^ 1); }
void pmu_adb_w(u8 data)
{
m_adb_line = (data & 1) ^ 1;
m_macadb->adb_linechange_w((data & 1) ^ 1);
}
u8 pmu_in_r() { return 0x20; } // bit 5 is 0 if the Target Disk Mode should be enabled
};
@ -464,19 +476,14 @@ u32 macpb030_state::screen_update_macpb160(screen_device &screen, bitmap_ind16 &
{
u16 *line = &bitmap.pix(y);
for (int x = 0; x < 640; x+=8)
for (int x = 0; x < 640/4; x++)
{
u8 const pixels = vram8[(y * 80) + (BYTE4_XOR_BE(x/8))];
static const u16 palette[2] = { 0, 3 };
*line++ = palette[(pixels >> 7)&1];
*line++ = palette[(pixels >> 6)&1];
*line++ = palette[(pixels >> 5)&1];
*line++ = palette[(pixels >> 4)&1];
*line++ = palette[(pixels >> 3)&1];
*line++ = palette[(pixels >> 2)&1];
*line++ = palette[(pixels >> 1)&1];
*line++ = palette[(pixels & 1)];
static const u16 palette[4] = { 0, 1, 2, 3 };
u8 const pixels = vram8[(y * 640/4) + (BYTE4_XOR_BE(x))];
*line++ = palette[((pixels >> 6) & 3)];
*line++ = palette[((pixels >> 4) & 3)];
*line++ = palette[((pixels >> 2) & 3)];
*line++ = palette[(pixels & 3)];
}
}
return 0;
@ -489,19 +496,10 @@ u32 macpb030_state::screen_update_macpbwd(screen_device &screen, bitmap_rgb32 &b
for (int y = 0; y < 480; y++)
{
u32 *line = &bitmap.pix(y);
for (int x = 0; x < 640; x+=8)
for (int x = 0; x < 640; x++)
{
uint8_t const pixels = vram8[(y * 80) + (BYTE4_XOR_BE(x/8))];
static const u32 palette[2] = { 0xffffffff, 0 };
*line++ = palette[(pixels >> 7) & 1];
*line++ = palette[(pixels >> 6) & 1];
*line++ = palette[(pixels >> 5) & 1];
*line++ = palette[(pixels >> 4) & 1];
*line++ = palette[(pixels >> 3) & 1];
*line++ = palette[(pixels >> 2) & 1];
*line++ = palette[(pixels >> 1) & 1];
*line++ = palette[(pixels & 1)];
u8 const pixels = vram8[(y * 640) + (BYTE4_XOR_BE(x))];
*line++ = m_colors[pixels ^ 0xff];
}
}
@ -603,7 +601,6 @@ TIMER_CALLBACK_MEMBER(macpb030_state::mac_6015_tick)
m_via1->write_ca1(m_ca1_data);
m_pmu->set_input_line(m50753_device::M50753_INT1_LINE, ASSERT_LINE);
m_macadb->adb_vblank();
}
u16 macpb030_state::scsi_r(offs_t offset, u16 mem_mask)
@ -721,15 +718,15 @@ void macpb030_state::macwd_w(offs_t offset, uint32_t data, uint32_t mem_mask)
case 0xf2:
if (mem_mask == 0xff000000) // DAC control
{
m_clutoffs = data >> 24;
m_clutoffs = (data >> 24);
m_count = 0;
}
else if (mem_mask == 0x00ff0000) // DAC data
{
m_colors[m_count++] = (data >> 16) & 0xff;
m_colors[m_count++] = ((data >> 16) & 0x3f) << 2;
if (m_count == 3)
{
// printf("RAMDAC: color %d = %02x %02x %02x\n", m_rbv_clutoffs, m_rbv_colors[0], m_rbv_colors[1], m_rbv_colors[2]);
//printf("RAMDAC: color %d = %02x %02x %02x\n", m_clutoffs, m_colors[0], m_colors[1], m_colors[2]);
m_wd_palette[m_clutoffs] = rgb_t(m_colors[0], m_colors[1], m_colors[2]);
m_clutoffs++;
m_count = 0;
@ -737,7 +734,7 @@ void macpb030_state::macwd_w(offs_t offset, uint32_t data, uint32_t mem_mask)
}
else
{
printf("macwd: Unknown DAC write, data %08x, mask %08x\n", data, mem_mask);
logerror("macwd: Unknown DAC write, data %08x, mask %08x\n", data, mem_mask);
}
break;
@ -766,7 +763,6 @@ void macpb030_state::macpb140_map(address_map &map)
map(0x50016000, 0x50017fff).rw(FUNC(macpb030_state::swim_r), FUNC(macpb030_state::swim_w)).mirror(0x01f00000);
map(0x50024000, 0x50027fff).r(FUNC(macpb030_state::buserror_r)).mirror(0x01f00000); // bus error here to make sure we aren't mistaken for another decoder
map(0xfee08000, 0xfeffffff).ram().share("vram");
}
@ -878,7 +874,11 @@ void macpb030_state::mac_via2_out_a(u8 data)
void macpb030_state::mac_via2_out_b(u8 data)
{
m_pmu_req = BIT(data, 2);
if (m_pmu_req != BIT(data, 2))
{
m_pmu_req = BIT(data, 2);
machine().scheduler().synchronize();
}
}
static INPUT_PORTS_START( macadb )
@ -903,8 +903,6 @@ void macpb030_state::macpb140(machine_config &config)
m_pmu->write_p<4>().set(FUNC(macpb030_state::pmu_adb_w));
m_pmu->read_in_p().set(FUNC(macpb030_state::pmu_in_r));
config.set_perfect_quantum(m_maincpu);
SCREEN(config, m_screen, SCREEN_TYPE_RASTER);
m_screen->set_refresh_hz(60.15);
m_screen->set_vblank_time(ATTOSECONDS_IN_USEC(1260));
@ -1191,13 +1189,13 @@ ROM_START(macpd210)
ROM_REGION(0x1800, "pmu", ROMREGION_ERASE00)
ROM_END
COMP(1991, macpb140, 0, 0, macpb140, macadb, macpb030_state, init_macpb140, "Apple Computer", "Macintosh PowerBook 140", MACHINE_NOT_WORKING)
COMP(1991, macpb170, macpb140, 0, macpb170, macadb, macpb030_state, init_macpb140, "Apple Computer", "Macintosh PowerBook 170", MACHINE_NOT_WORKING)
COMP(1992, macpb145, macpb140, 0, macpb145, macadb, macpb030_state, init_macpb140, "Apple Computer", "Macintosh PowerBook 145", MACHINE_NOT_WORKING)
COMP(1992, macpb145b, macpb140, 0, macpb170, macadb, macpb030_state, init_macpb140, "Apple Computer", "Macintosh PowerBook 145B", MACHINE_NOT_WORKING)
COMP(1992, macpb160, 0, 0, macpb160, macadb, macpb030_state, init_macpb160, "Apple Computer", "Macintosh PowerBook 160", MACHINE_NOT_WORKING)
COMP(1992, macpb180, macpb160, 0, macpb180, macadb, macpb030_state, init_macpb160, "Apple Computer", "Macintosh PowerBook 180", MACHINE_NOT_WORKING)
COMP(1992, macpb180c, macpb160, 0, macpb180c, macadb, macpb030_state, init_macpb160, "Apple Computer", "Macintosh PowerBook 180c", MACHINE_NOT_WORKING)
COMP(1991, macpb140, 0, 0, macpb140, macadb, macpb030_state, init_macpb140, "Apple Computer", "Macintosh PowerBook 140", MACHINE_NOT_WORKING)
COMP(1991, macpb170, macpb140, 0, macpb170, macadb, macpb030_state, init_macpb140, "Apple Computer", "Macintosh PowerBook 170", MACHINE_NOT_WORKING)
COMP(1992, macpb145, macpb140, 0, macpb145, macadb, macpb030_state, init_macpb140, "Apple Computer", "Macintosh PowerBook 145", MACHINE_NOT_WORKING)
COMP(1992, macpb145b, macpb140, 0, macpb170, macadb, macpb030_state, init_macpb140, "Apple Computer", "Macintosh PowerBook 145B", MACHINE_NOT_WORKING)
COMP(1992, macpb160, 0, 0, macpb160, macadb, macpb030_state, init_macpb160, "Apple Computer", "Macintosh PowerBook 160", MACHINE_NOT_WORKING)
COMP(1992, macpb180, macpb160, 0, macpb180, macadb, macpb030_state, init_macpb160, "Apple Computer", "Macintosh PowerBook 180", MACHINE_NOT_WORKING)
COMP(1992, macpb180c, macpb160, 0, macpb180c, macadb, macpb030_state, init_macpb160, "Apple Computer", "Macintosh PowerBook 180c", MACHINE_NOT_WORKING)
// PowerBook Duos (may or may not belong in this driver ultimately)
COMP(1992, macpd210, 0, 0, macpd210, macadb, macpb030_state, init_macpb160, "Apple Computer", "Macintosh PowerBook Duo 210", MACHINE_NOT_WORKING)
// PowerBook Duos (may or may not belong in this driver ultimately)
COMP(1992, macpd210, 0, 0, macpd210, macadb, macpb030_state, init_macpb160, "Apple Computer", "Macintosh PowerBook Duo 210", MACHINE_NOT_WORKING)