summaryrefslogtreecommitdiffstatshomepage
diff options
context:
space:
mode:
author cracyc <cracyc@users.noreply.github.com>2014-11-06 21:21:43 -0600
committer cracyc <cracyc@users.noreply.github.com>2014-11-07 15:47:35 -0600
commit1f75bdc6f6627abfe42f0fbafa576c491e28d053 (patch)
treeb0638004d2336111a598a156f49404f87290ae3a
parent55d38c37533793f3559dff6a4bb933d4c548f8a4 (diff)
(mess) pc9801: cleanup and refactor(nw)
-rw-r--r--src/mess/drivers/pc9801.c1108
1 files changed, 264 insertions, 844 deletions
diff --git a/src/mess/drivers/pc9801.c b/src/mess/drivers/pc9801.c
index 23b1757c123..74335de4e3b 100644
--- a/src/mess/drivers/pc9801.c
+++ b/src/mess/drivers/pc9801.c
@@ -18,7 +18,7 @@
- some later SWs put "Invalid command byte 05" (Absolutely Mahjong on Epson logo)
- Basic games are mostly untested, but I think that upd7220 fails on those (Adventureland, Xevious)
- investigate on POR bit
- - PC-9801RS+ should support uPD4990 RTC
+ - 2dd bios tries to use dma channel 2
TODO (PC-9801RS):
- extra features;
@@ -29,7 +29,6 @@
- fix CPU for some clones;
- "cache error"
- undumped IDE ROM, kludged to work
- - slave PIC never enables floppy IRQ (PC=0xffd08)
- Compatibility is untested;
TODO: (PC-486MU)
@@ -460,7 +459,8 @@ public:
m_beeper(*this, "beeper"),
m_ram(*this, RAM_TAG),
m_gfxdecode(*this, "gfxdecode"),
- m_palette(*this, "palette")
+ m_palette(*this, "palette"),
+ m_screen(*this, "screen")
{
}
@@ -487,6 +487,7 @@ public:
optional_device<ram_device> m_ram;
required_device<gfxdecode_device> m_gfxdecode;
required_device<palette_device> m_palette;
+ required_device<screen_device> m_screen;
virtual void video_start();
UINT32 screen_update(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect);
@@ -554,30 +555,15 @@ public:
UINT8 m_ext2_ff;
UINT8 m_sys_type;
- DECLARE_WRITE_LINE_MEMBER( keyboard_irq );
DECLARE_WRITE_LINE_MEMBER( write_uart_clock );
- DECLARE_READ8_MEMBER(pc9801_xx_r);
- DECLARE_WRITE8_MEMBER(pc9801_xx_w);
- DECLARE_READ8_MEMBER(pc9801_00_r);
- DECLARE_WRITE8_MEMBER(pc9801_00_w);
- DECLARE_READ8_MEMBER(pc9801_20_r);
- DECLARE_WRITE8_MEMBER(pc9801_20_w);
- DECLARE_READ8_MEMBER(pc9801_30_r);
- DECLARE_WRITE8_MEMBER(pc9801_30_w);
- DECLARE_READ8_MEMBER(pc9801_40_r);
- DECLARE_WRITE8_MEMBER(pc9801_40_w);
- DECLARE_READ8_MEMBER(pc9801_50_r);
- DECLARE_WRITE8_MEMBER(pc9801_50_w);
- DECLARE_READ8_MEMBER(pc9801_60_r);
- DECLARE_WRITE8_MEMBER(pc9801_60_w);
+ DECLARE_WRITE8_MEMBER(rtc_dmapg_w);
+ DECLARE_WRITE8_MEMBER(nmi_ctrl_w);
DECLARE_WRITE8_MEMBER(pc9801_vrtc_mask_w);
DECLARE_WRITE8_MEMBER(pc9801_video_ff_w);
- DECLARE_READ8_MEMBER(pc9801_70_r);
- DECLARE_WRITE8_MEMBER(pc9801_70_w);
- DECLARE_READ8_MEMBER(pc9801rs_70_r);
- DECLARE_WRITE8_MEMBER(pc9801rs_70_w);
- DECLARE_READ8_MEMBER(pc9801_sasi_r);
- DECLARE_WRITE8_MEMBER(pc9801_sasi_w);
+ DECLARE_READ8_MEMBER(txt_scrl_r);
+ DECLARE_WRITE8_MEMBER(txt_scrl_w);
+ DECLARE_READ8_MEMBER(grcg_r);
+ DECLARE_WRITE8_MEMBER(grcg_w);
DECLARE_READ8_MEMBER(pc9801_a0_r);
DECLARE_WRITE8_MEMBER(pc9801_a0_w);
DECLARE_READ8_MEMBER(pc9801_fdc_2hd_r);
@@ -588,8 +574,6 @@ public:
DECLARE_WRITE8_MEMBER(pc9801_tvram_w);
DECLARE_READ8_MEMBER(pc9801_gvram_r);
DECLARE_WRITE8_MEMBER(pc9801_gvram_w);
- DECLARE_READ8_MEMBER(pc9801_mouse_r);
- DECLARE_WRITE8_MEMBER(pc9801_mouse_w);
DECLARE_WRITE8_MEMBER(pc9801rs_mouse_freq_w);
inline UINT8 m_pc9801rs_grcg_r(UINT32 offset,int vbank,int vrambank);
inline UINT8 m_pc9801rs_grcg_r(UINT32 offset,int vbank) { return m_pc9801rs_grcg_r(offset, vbank, m_vram_bank); }
@@ -626,7 +610,6 @@ public:
DECLARE_WRITE8_MEMBER(pc9801rs_bank_w);
DECLARE_READ8_MEMBER(pc9801rs_f0_r);
DECLARE_WRITE8_MEMBER(pc9801rs_f0_w);
- DECLARE_READ8_MEMBER(pc9801rs_30_r);
DECLARE_READ8_MEMBER(pc9801rs_memory_r);
DECLARE_WRITE8_MEMBER(pc9801rs_memory_w);
DECLARE_READ8_MEMBER(pc9801rs_soundrom_r);
@@ -642,8 +625,6 @@ public:
DECLARE_WRITE8_MEMBER(pc9821_video_ff_w);
DECLARE_READ8_MEMBER(pc9821_a0_r);
DECLARE_WRITE8_MEMBER(pc9821_a0_w);
- DECLARE_READ8_MEMBER(pc9801rs_pit_mirror_r);
- DECLARE_WRITE8_MEMBER(pc9801rs_pit_mirror_w);
DECLARE_READ8_MEMBER(pc9801rs_access_ctrl_r);
DECLARE_WRITE8_MEMBER(pc9801rs_access_ctrl_w);
DECLARE_WRITE8_MEMBER(pc9801rs_nmi_w);
@@ -688,7 +669,7 @@ public:
DECLARE_WRITE8_MEMBER(pc9821_ext_gvram_w);
DECLARE_READ8_MEMBER(pc9821_window_bank_r);
DECLARE_WRITE8_MEMBER(pc9821_window_bank_w);
- DECLARE_READ32_MEMBER(pc9821_timestamp_r);
+ DECLARE_READ16_MEMBER(pc9821_timestamp_r);
DECLARE_READ8_MEMBER(pc9821_ext2_video_ff_r);
DECLARE_WRITE8_MEMBER(pc9821_ext2_video_ff_w);
@@ -706,7 +687,6 @@ public:
DECLARE_MACHINE_START(pc9801bx2);
DECLARE_MACHINE_START(pc9821);
DECLARE_MACHINE_START(pc9821ap2);
-
DECLARE_MACHINE_RESET(pc9801_common);
DECLARE_MACHINE_RESET(pc9801f);
DECLARE_MACHINE_RESET(pc9801rs);
@@ -714,8 +694,6 @@ public:
DECLARE_PALETTE_INIT(pc9801);
INTERRUPT_GEN_MEMBER(pc9801_vrtc_irq);
-// DECLARE_INPUT_CHANGED_MEMBER(key_stroke);
-// DECLARE_INPUT_CHANGED_MEMBER(shift_stroke);
DECLARE_READ8_MEMBER(get_slave_ack);
DECLARE_WRITE_LINE_MEMBER(pc9801_dma_hrq_changed);
DECLARE_WRITE_LINE_MEMBER(pc9801_tc_w);
@@ -725,10 +703,6 @@ public:
DECLARE_WRITE_LINE_MEMBER(pc9801_dack1_w);
DECLARE_WRITE_LINE_MEMBER(pc9801_dack2_w);
DECLARE_WRITE_LINE_MEMBER(pc9801_dack3_w);
- DECLARE_READ8_MEMBER(fdc_2hd_r);
- DECLARE_WRITE8_MEMBER(fdc_2hd_w);
- DECLARE_READ8_MEMBER(fdc_2dd_r);
- DECLARE_WRITE8_MEMBER(fdc_2dd_w);
DECLARE_READ8_MEMBER(ppi_sys_portc_r);
DECLARE_WRITE8_MEMBER(ppi_sys_portc_w);
DECLARE_READ8_MEMBER(ppi_fdd_porta_r);
@@ -753,7 +727,6 @@ public:
}m_mouse;
TIMER_DEVICE_CALLBACK_MEMBER( mouse_irq_cb );
- void pc9801_fdc_2hd_update_ready(floppy_image_device *, int);
inline UINT32 m_calc_grcg_addr(int i,UINT32 offset,int vrambank);
DECLARE_DRIVER_INIT(pc9801_kanji);
@@ -818,7 +791,7 @@ UPD7220_DISPLAY_PIXELS_MEMBER( pc9801_state::hgdc_display_pixels )
res_x = x + xi;
res_y = y;
- if(!machine().first_screen()->visible_area().contains(res_x, res_y*2+0))
+ if(!m_screen->visible_area().contains(res_x, res_y*2+0))
return;
pen = m_ext_gvram[(address*8+xi)+(m_vram_disp*0x40000)];
@@ -843,10 +816,10 @@ UPD7220_DISPLAY_PIXELS_MEMBER( pc9801_state::hgdc_display_pixels )
if(interlace_on)
{
- if(machine().first_screen()->visible_area().contains(res_x, res_y*2+0))
+ if(m_screen->visible_area().contains(res_x, res_y*2+0))
bitmap.pix32(res_y*2+0, res_x) = palette[pen + colors16_mode];
/* TODO: it looks like that PC-98xx can only display even lines ... */
- if(machine().first_screen()->visible_area().contains(res_x, res_y*2+1))
+ if(m_screen->visible_area().contains(res_x, res_y*2+1))
bitmap.pix32(res_y*2+1, res_x) = palette[pen + colors16_mode];
}
else
@@ -932,7 +905,7 @@ UPD7220_DRAW_TEXT_LINE_MEMBER( pc9801_state::hgdc_draw_text )
res_x = ((x+kanji_lr)*8+xi) * (m_video_ff[WIDTH40_REG]+1);
res_y = y+yi - (m_txt_scroll_reg[3] & 0xf);
- if(!machine().first_screen()->visible_area().contains(res_x, res_y))
+ if(!m_screen->visible_area().contains(res_x, res_y))
continue;
tile_data = 0;
@@ -973,10 +946,10 @@ UPD7220_DRAW_TEXT_LINE_MEMBER( pc9801_state::hgdc_draw_text )
if(v_line) { tile_data|=8; }
/* TODO: proper blink rate for these two */
- if(cursor_on && cursor_addr == tile_addr && machine().first_screen()->frame_number() & 0x10)
+ if(cursor_on && cursor_addr == tile_addr && m_screen->frame_number() & 0x10)
tile_data^=0xff;
- if(blink && machine().first_screen()->frame_number() & 0x10)
+ if(blink && m_screen->frame_number() & 0x10)
tile_data^=0xff;
if(yi >= char_size)
@@ -989,7 +962,7 @@ UPD7220_DRAW_TEXT_LINE_MEMBER( pc9801_state::hgdc_draw_text )
if(m_video_ff[WIDTH40_REG])
{
- if(!machine().first_screen()->visible_area().contains(res_x+1, res_y))
+ if(!m_screen->visible_area().contains(res_x+1, res_y))
continue;
if(pen != -1)
@@ -1002,86 +975,7 @@ UPD7220_DRAW_TEXT_LINE_MEMBER( pc9801_state::hgdc_draw_text )
}
-#if 0
-READ8_MEMBER(pc9801_state::pc9801_xx_r)
-{
- if((offset & 1) == 0)
- {
- printf("Read to undefined port [%02x]\n",offset+0xxx);
- return 0xff;
- }
- else // odd
- {
- printf("Read to undefined port [%02x]\n",offset+0xxx);
- return 0xff;
- }
-}
-
-WRITE8_MEMBER(pc9801_state::pc9801_xx_w)
-{
- if((offset & 1) == 0)
- {
- printf("Write to undefined port [%02x] <- %02x\n",offset+0xxx,data);
- }
- else // odd
- {
- printf("Write to undefined port [%02x] <- %02x\n",offset+0xxx,data);
- }
-}
-
-#endif
-
-READ8_MEMBER(pc9801_state::pc9801_00_r)
-{
- if((offset & 1) == 0)
- {
- if(offset & 0x14)
- printf("Read to undefined port [%02x]\n",offset+0x00);
- else
- return ((offset & 8) ? m_pic2 : m_pic1)->read(space, (offset & 2) >> 1);
- }
- else // odd
- {
- return m_dmac->read(space, (offset & 0x1e) >> 1, 0xff);
- }
-
- return 0xff;
-}
-
-WRITE8_MEMBER(pc9801_state::pc9801_00_w)
-{
- if((offset & 1) == 0)
- {
- if(offset & 0x14)
- printf("Write to undefined port [%02x] <- %02x\n",offset+0x00,data);
- else
- ((offset & 8) ? m_pic2 : m_pic1)->write(space, (offset & 2) >> 1, data);
- }
- else // odd
- {
- m_dmac->write(space, (offset & 0x1e) >> 1, data, 0xff);
- }
-}
-
-READ8_MEMBER(pc9801_state::pc9801_20_r)
-{
- if((offset & 1) == 0)
- {
- if(offset == 0)
- printf("Read to RTC port [%02x]\n",offset+0x20);
- else
- printf("Read to undefined port [%02x]\n",offset+0x20);
-
- return 0xff;
- }
- else // odd
- {
- printf("Read to undefined port [%02x]\n",offset+0x20);
- return 0xff;
- }
-}
-
-WRITE8_MEMBER(pc9801_state::pc9801_20_w)
+WRITE8_MEMBER(pc9801_state::rtc_dmapg_w)
{
if((offset & 1) == 0)
{
@@ -1094,153 +988,21 @@ WRITE8_MEMBER(pc9801_state::pc9801_20_w)
m_rtc->clk_w((data & 0x10) >> 4);
m_rtc->data_in_w(((data & 0x20) >> 5));
if(data & 0xc0)
- printf("RTC write to undefined bits %02x\n",data & 0xc0);
+ logerror("RTC write to undefined bits %02x\n",data & 0xc0);
}
else
- printf("Write to undefined port [%02x] <- %02x\n",offset+0x20,data);
+ logerror("Write to undefined port [%02x] <- %02x\n",offset+0x20,data);
}
else // odd
{
-// printf("Write to DMA bank register %d %02x\n",((offset >> 1)+1) & 3,data);
+// logerror("Write to DMA bank register %d %02x\n",((offset >> 1)+1) & 3,data);
m_dma_offset[((offset >> 1)+1) & 3] = data & 0x0f;
}
}
-READ8_MEMBER(pc9801_state::pc9801_30_r)
-{
- if((offset & 1) == 0)
- {
- if(offset & 4)
- printf("Read to undefined port [%02x]\n",offset+0x30);
- else
- printf("Read to RS-232c port [%02x]\n",offset+0x30);
-
- return 0xff;
- }
- else // odd
- {
- return machine().device<i8255_device>("ppi8255_sys")->read(space, (offset & 6) >> 1);
- }
-}
-
-WRITE8_MEMBER(pc9801_state::pc9801_30_w)
-{
- if((offset & 1) == 0)
- {
- if(offset & 4)
- printf("Write to undefined port [%02x] %02x\n",offset+0x30,data);
- else
- printf("Write to RS-232c port [%02x] %02x\n",offset+0x30,data);
- }
- else // odd
- {
- machine().device<i8255_device>("ppi8255_sys")->write(space, (offset & 6) >> 1,data);
- }
-}
-
-READ8_MEMBER(pc9801_state::pc9801_40_r)
-{
- if((offset & 1) == 0)
- {
- return machine().device<i8255_device>("ppi8255_prn")->read(space, (offset & 6) >> 1);
- }
- else // odd
- {
- if(offset & 4)
- printf("Read to undefined port [%02x]\n",offset+0x40);
- else
- {
- //printf("Read to 8251 kbd port [%02x] %08x\n",offset+0x40,m_maincpu->pc());
- if(offset == 1)
- {
- return m_keyb->rx_r(space,0);
- }
-
- return 1 | 4 | 2;
- }
- }
-
- return 0xff;
-}
-
-WRITE8_MEMBER(pc9801_state::pc9801_40_w)
-{
- if((offset & 1) == 0)
- {
- machine().device<i8255_device>("ppi8255_prn")->write(space, (offset & 6) >> 1,data);
- }
- else // odd
- {
- if(offset & 4)
- printf("Write to undefined port [%02x] <- %02x\n",offset+0x40,data);
- else
- {
- if(offset == 1)
- {
- m_keyb->tx_w(space,0,data);
- return;
- }
- //printf("Write to 8251 kbd port [%02x] <- %02x\n",offset+0x40,data);
- }
- }
-}
-
-READ8_MEMBER(pc9801_state::pc9801_50_r)
-{
- if((offset & 1) == 0)
- {
- if(offset & 4)
- printf("Read to undefined port [%02x]\n",offset+0x50);
- else
- printf("Read to NMI FF port [%02x]\n",offset+0x50);
-
- return 0xff;
- }
- else // odd
- {
- return machine().device<i8255_device>("ppi8255_fdd")->read(space, (offset & 6) >> 1);
- }
-}
-
-WRITE8_MEMBER(pc9801_state::pc9801_50_w)
-{
- if((offset & 1) == 0)
- {
- if(offset & 4)
- printf("Write to undefined port [%02x] %02x\n",offset+0x50,data);
- else
- m_nmi_ff = (offset & 2) >> 1;
-
- }
- else // odd
- {
- machine().device<i8255_device>("ppi8255_fdd")->write(space, (offset & 6) >> 1,data);
- }
-}
-
-READ8_MEMBER(pc9801_state::pc9801_60_r)
+WRITE8_MEMBER(pc9801_state::nmi_ctrl_w)
{
- if((offset & 1) == 0)
- {
- return m_hgdc1->read(space, (offset & 2) >> 1); // upd7220 character port
- }
- else // odd
- {
- printf("Read to undefined port [%02x]\n",offset+0x60);
- return 0xff;
- }
-}
-
-WRITE8_MEMBER(pc9801_state::pc9801_60_w)
-{
- if((offset & 1) == 0)
- {
- m_hgdc1->write(space, (offset & 2) >> 1,data); // upd7220 character port
- }
- else // odd
- {
- printf("Write to undefined port [%02x] <- %02x\n",offset+0x60,data);
- }
+ m_nmi_ff = (offset & 2) >> 1;
}
WRITE8_MEMBER(pc9801_state::pc9801_vrtc_mask_w)
@@ -1251,7 +1013,7 @@ WRITE8_MEMBER(pc9801_state::pc9801_vrtc_mask_w)
}
else // odd
{
- printf("Write to undefined port [%02x] <- %02x\n",offset+0x64,data);
+ logerror("Write to undefined port [%02x] <- %02x\n",offset+0x64,data);
}
}
@@ -1272,7 +1034,7 @@ WRITE8_MEMBER(pc9801_state::pc9801_video_ff_w)
case 1:
m_gfx_ff = 1;
if(data & 1)
- printf("Graphic f/f actually enabled!\n");
+ logerror("Graphic f/f actually enabled!\n");
break;
case 4:
if(m_gfx_ff)
@@ -1298,80 +1060,31 @@ WRITE8_MEMBER(pc9801_state::pc9801_video_ff_w)
"Display ON" // 7
};
- printf("Write to video FF register %s -> %02x\n",video_ff_regnames[(data & 0x0e) >> 1],data & 1);
+ logerror("Write to video FF register %s -> %02x\n",video_ff_regnames[(data & 0x0e) >> 1],data & 1);
}
}
else // odd
{
- //printf("Write to undefined port [%02x] <- %02x\n",offset+0x68,data);
+ //logerror("Write to undefined port [%02x] <- %02x\n",offset+0x68,data);
}
}
-READ8_MEMBER(pc9801_state::pc9801_70_r)
+READ8_MEMBER(pc9801_state::txt_scrl_r)
{
- if((offset & 1) == 0)
- {
- //printf("Read to display register [%02x]\n",offset+0x70);
- /* TODO: ok? */
- return m_txt_scroll_reg[offset >> 1];
- }
- else // odd
- {
- if(offset & 0x08)
- printf("Read to undefined port [%02x]\n",offset+0x70);
- else
- return m_pit8253->read(space, (offset & 6) >> 1);
- }
-
- return 0xff;
-}
-
-WRITE8_MEMBER(pc9801_state::pc9801_70_w)
-{
- if((offset & 1) == 0)
- {
-// printf("Write to display register [%02x] %02x\n",offset+0x70,data);
- m_txt_scroll_reg[offset >> 1] = data;
-
- //popmessage("%02x %02x %02x %02x",m_txt_scroll_reg[0],m_txt_scroll_reg[1],m_txt_scroll_reg[2],m_txt_scroll_reg[3]);
- }
- else // odd
- {
- if(offset < 0x08)
- m_pit8253->write(space, (offset & 6) >> 1, data);
- //else
- // printf("Write to undefined port [%02x] <- %02x\n",offset+0x70,data);
- }
+ //logerror("Read to display register [%02x]\n",offset+0x70);
+ /* TODO: ok? */
+ return m_txt_scroll_reg[offset >> 1];
}
-READ8_MEMBER(pc9801_state::pc9801_sasi_r)
+WRITE8_MEMBER(pc9801_state::txt_scrl_w)
{
- if((offset & 1) == 0)
- {
- //printf("Read to SASI port [%02x]\n",offset+0x80);
- return 0x20;
- }
- else // odd
- {
- printf("Read to undefined port [%02x]\n",offset+0x80);
- return 0xff;
- }
-}
+ //logerror("Write to display register [%02x] %02x\n",offset+0x70,data);
+ m_txt_scroll_reg[offset >> 1] = data;
-WRITE8_MEMBER(pc9801_state::pc9801_sasi_w)
-{
- if((offset & 1) == 0)
- {
- //printf("Write to SASI port [%02x] <- %02x\n",offset+0x80,data);
- }
- else // odd
- {
- //printf("Write to undefined port [%02x] <- %02x\n",offset+0xxx,data);
- }
+ //popmessage("%02x %02x %02x %02x",m_txt_scroll_reg[0],m_txt_scroll_reg[1],m_txt_scroll_reg[2],m_txt_scroll_reg[3]);
}
-
READ8_MEMBER(pc9801_state::pc9801_a0_r)
{
if((offset & 1) == 0)
@@ -1412,7 +1125,7 @@ READ8_MEMBER(pc9801_state::pc9801_a0_r)
}
}
- printf("Read to undefined port [%02x]\n",offset+0xa0);
+ logerror("Read to undefined port [%02x]\n",offset+0xa0);
return 0xff;
}
}
@@ -1452,7 +1165,7 @@ WRITE8_MEMBER(pc9801_state::pc9801_a0_w)
return;
}
default:
- printf("Write to undefined port [%02x] <- %02x\n",offset+0xa0,data);
+ logerror("Write to undefined port [%02x] <- %02x\n",offset+0xa0,data);
return;
}
}
@@ -1467,7 +1180,7 @@ WRITE8_MEMBER(pc9801_state::pc9801_a0_w)
m_font_addr = ((data & 0x7f) << 8) | (m_font_addr & 0xff);
return;
case 0x05:
- //printf("%02x\n",data);
+ //logerror("%02x\n",data);
m_font_line = ((data & 0x0f) << 1);
m_font_lr = ((data & 0x20) >> 5) ^ 1;
return;
@@ -1478,7 +1191,7 @@ WRITE8_MEMBER(pc9801_state::pc9801_a0_w)
pcg_offset = m_font_addr << 5;
pcg_offset|= m_font_line;
pcg_offset|= m_font_lr;
- //printf("%04x %02x %02x %08x\n",m_font_addr,m_font_line,m_font_lr,pcg_offset);
+ //logerror("%04x %02x %02x %08x\n",m_font_addr,m_font_line,m_font_lr,pcg_offset);
if((m_font_addr & 0xff00) == 0x5600 || (m_font_addr & 0xff00) == 0x5700)
{
m_kanji_rom[pcg_offset] = data;
@@ -1488,7 +1201,7 @@ WRITE8_MEMBER(pc9801_state::pc9801_a0_w)
}
}
- //printf("Write to undefined port [%02x) <- %02x\n",offset+0xa0,data);
+ //logerror("Write to undefined port [%02x) <- %02x\n",offset+0xa0,data);
}
}
@@ -1504,8 +1217,8 @@ READ8_MEMBER(pc9801_state::pc9801_fdc_2hd_r)
{
switch(offset & 6)
{
- case 0: return machine().device<upd765a_device>("upd765_2hd")->msr_r(space, 0, 0xff);
- case 2: return machine().device<upd765a_device>("upd765_2hd")->fifo_r(space, 0, 0xff);
+ case 0: return m_fdc_2hd->msr_r(space, 0, 0xff);
+ case 2: return m_fdc_2hd->fifo_r(space, 0, 0xff);
case 4: return 0x5f; //unknown port meaning
}
}
@@ -1516,45 +1229,39 @@ READ8_MEMBER(pc9801_state::pc9801_fdc_2hd_r)
case 1: return m_sio->data_r(space, 0);
case 3: return m_sio->status_r(space, 0);
}
- printf("Read to undefined port [%02x]\n",offset+0x90);
+ logerror("Read to undefined port [%02x]\n",offset+0x90);
return 0xff;
}
return 0xff;
}
-void pc9801_state::pc9801_fdc_2hd_update_ready(floppy_image_device *, int)
-{
- bool ready = m_fdc_2hd_ctrl & 0x40;
- floppy_image_device *floppy;
- floppy = machine().device<floppy_connector>("upd765_2hd:0")->get_device();
- if(floppy && ready)
- ready = floppy->ready_r();
- floppy = machine().device<floppy_connector>("upd765_2hd:1")->get_device();
- if(floppy && ready)
- ready = floppy->ready_r();
-
- m_fdc_2hd->ready_w(ready);
-}
-
WRITE8_MEMBER(pc9801_state::pc9801_fdc_2hd_w)
{
if((offset & 1) == 0)
{
switch(offset & 6)
{
- case 0: printf("Write to undefined port [%02x] <- %02x\n",offset+0x90,data); return;
- case 2: machine().device<upd765a_device>("upd765_2hd")->fifo_w(space, 0, data, 0xff); return;
+ case 0: logerror("Write to undefined port [%02x] <- %02x\n",offset+0x90,data); return;
+ case 2: m_fdc_2hd->fifo_w(space, 0, data, 0xff); return;
case 4:
- printf("%02x ctrl\n",data);
+ //logerror("%02x ctrl\n",data);
if(((m_fdc_2hd_ctrl & 0x80) == 0) && (data & 0x80))
- machine().device<upd765a_device>("upd765_2hd")->reset();
+ m_fdc_2hd->soft_reset();
m_fdc_2hd_ctrl = data;
- pc9801_fdc_2hd_update_ready(NULL, 0);
- machine().device<floppy_connector>("upd765_2hd:0")->get_device()->mon_w(data & 0x40 ? ASSERT_LINE : CLEAR_LINE);
- machine().device<floppy_connector>("upd765_2hd:1")->get_device()->mon_w(data & 0x40 ? ASSERT_LINE : CLEAR_LINE);
+ if(data & 0x40)
+ {
+ m_fdc_2hd->set_ready_line_connected(0);
+ m_fdc_2hd->ready_w(0);
+ }
+ else
+ m_fdc_2hd->set_ready_line_connected(1);
+
+ // TODO: is the motor control bit really inverted relative to the other fdcs?
+ m_fdc_2hd->subdevice<floppy_connector>("0")->get_device()->mon_w(data & 8 ? ASSERT_LINE : CLEAR_LINE);
+ m_fdc_2hd->subdevice<floppy_connector>("1")->get_device()->mon_w(data & 8 ? ASSERT_LINE : CLEAR_LINE);
break;
}
}
@@ -1565,7 +1272,7 @@ WRITE8_MEMBER(pc9801_state::pc9801_fdc_2hd_w)
case 1: m_sio->data_w(space, 0, data); return;
case 3: m_sio->control_w(space, 0, data); return;
}
- printf("Write to undefined port [%02x] <- %02x\n",offset+0x90,data);
+ logerror("Write to undefined port [%02x] <- %02x\n",offset+0x90,data);
}
}
@@ -1576,14 +1283,19 @@ READ8_MEMBER(pc9801_state::pc9801_fdc_2dd_r)
{
switch(offset & 6)
{
- case 0: return machine().device<upd765a_device>("upd765_2dd")->msr_r(space, 0, 0xff);
- case 2: return machine().device<upd765a_device>("upd765_2dd")->fifo_r(space, 0, 0xff);
- case 4: return 0x40; //unknown port meaning, might be 0x70
+ case 0: return m_fdc_2dd->msr_r(space, 0, 0xff);
+ case 2: return m_fdc_2dd->fifo_r(space, 0, 0xff);
+ case 4:
+ {
+ int ret = (!m_fdc_2dd->subdevice<floppy_connector>("0")->get_device()->ready_r()) ? 0x10 : 0;
+ ret |= (m_fdc_2dd->subdevice<floppy_connector>("1")->get_device()->ready_r()) ? 0x10 : 0;
+ return ret | 0x40; //unknown port meaning, might be 0x70
+ }
}
}
else
{
- printf("Read to undefined port [%02x]\n",offset+0xc8);
+ logerror("Read to undefined port [%02x]\n",offset+0xc8);
return 0xff;
}
@@ -1596,22 +1308,22 @@ WRITE8_MEMBER(pc9801_state::pc9801_fdc_2dd_w)
{
switch(offset & 6)
{
- case 0: printf("Write to undefined port [%02x] <- %02x\n",offset+0xc8,data); return;
- case 2: machine().device<upd765a_device>("upd765_2dd")->fifo_w(space, 0, data, 0xff); return;
+ case 0: logerror("Write to undefined port [%02x] <- %02x\n",offset+0xc8,data); return;
+ case 2: m_fdc_2dd->fifo_w(space, 0, data, 0xff); return;
case 4:
- printf("%02x ctrl\n",data);
+ logerror("%02x ctrl\n",data);
if(((m_fdc_2dd_ctrl & 0x80) == 0) && (data & 0x80))
- machine().device<upd765a_device>("upd765_2dd")->reset();
+ m_fdc_2dd->soft_reset();
m_fdc_2dd_ctrl = data;
- machine().device<floppy_connector>("upd765_2dd:0")->get_device()->mon_w(data & 0x08 ? ASSERT_LINE : CLEAR_LINE);
- machine().device<floppy_connector>("upd765_2dd:1")->get_device()->mon_w(data & 0x08 ? ASSERT_LINE : CLEAR_LINE);
+ m_fdc_2dd->subdevice<floppy_connector>("0")->get_device()->mon_w(data & 8 ? CLEAR_LINE : ASSERT_LINE);
+ m_fdc_2dd->subdevice<floppy_connector>("1")->get_device()->mon_w(data & 8 ? CLEAR_LINE : ASSERT_LINE);
break;
}
}
else
{
- printf("Write to undefined port [%02x] <- %02x\n",offset+0xc8,data);
+ logerror("Write to undefined port [%02x] <- %02x\n",offset+0xc8,data);
}
}
@@ -1719,28 +1431,6 @@ WRITE8_MEMBER(pc9801_state::upd7220_grcg_w)
m_pc9801rs_grcg_w(offset & 0x7fff, (offset >> 15) & 3, offset >> 17, data);
}
-READ8_MEMBER(pc9801_state::pc9801_mouse_r)
-{
- if((offset & 1) == 0)
- return 0xff;
- else
- {
- return machine().device<i8255_device>("ppi8255_mouse")->read(space, (offset & 6) >> 1);
- }
-}
-
-WRITE8_MEMBER(pc9801_state::pc9801_mouse_w)
-{
- if((offset & 1) == 0)
- {
- //return 0xff;
- }
- else
- {
- machine().device<i8255_device>("ppi8255_mouse")->write(space, (offset & 6) >> 1,data);
- }
-}
-
READ8_MEMBER(pc9801_state::ide_hack_r)
{
// this makes the ide driver not do 512 to 256 byte sector translation, the 9821 looks for bit 6 of offset 0xac403 of the kanji ram to set this, the rs unknown
@@ -1875,24 +1565,27 @@ ADDRESS_MAP_END
/* first device is even offsets, second one is odd offsets */
static ADDRESS_MAP_START( pc9801_io, AS_IO, 16, pc9801_state )
ADDRESS_MAP_UNMAP_HIGH
- AM_RANGE(0x0000, 0x001f) AM_READWRITE8(pc9801_00_r,pc9801_00_w,0xffff) // i8259 PIC (bit 3 ON slave / master) / i8237 DMA
- AM_RANGE(0x0020, 0x0027) AM_READWRITE8(pc9801_20_r,pc9801_20_w,0xffff) // RTC / DMA registers (LS244)
- AM_RANGE(0x0030, 0x0037) AM_READWRITE8(pc9801_30_r,pc9801_30_w,0xffff) //i8251 RS232c / i8255 system port
- AM_RANGE(0x0040, 0x0047) AM_READWRITE8(pc9801_40_r,pc9801_40_w,0xffff) //i8255 printer port / i8251 keyboard
- AM_RANGE(0x0050, 0x0057) AM_READWRITE8(pc9801_50_r,pc9801_50_w,0xffff) // NMI FF / i8255 floppy port (2d?)
- AM_RANGE(0x0060, 0x0063) AM_READWRITE8(pc9801_60_r,pc9801_60_w,0xffff) //upd7220 character ports / <undefined>
+ AM_RANGE(0x0000, 0x001f) AM_DEVREADWRITE8("i8237", am9517a_device, read, write, 0xff00)
+ AM_RANGE(0x0000, 0x000f) AM_READWRITE8(pic_r, pic_w, 0x00ff) // i8259 PIC (bit 3 ON slave / master) / i8237 DMA
+ AM_RANGE(0x0020, 0x0027) AM_WRITE8(rtc_dmapg_w,0xffff) // RTC / DMA registers (LS244)
+ AM_RANGE(0x0030, 0x0037) AM_DEVREADWRITE8("ppi8255_sys", i8255_device, read, write, 0xff00) //i8251 RS232c / i8255 system port
+ AM_RANGE(0x0040, 0x0047) AM_DEVREADWRITE8("ppi8255_prn", i8255_device, read, write, 0x00ff)
+ AM_RANGE(0x0040, 0x0043) AM_DEVREADWRITE8("keyb", pc9801_kbd_device, rx_r, tx_w, 0xff00) //i8255 printer port / i8251 keyboard
+ AM_RANGE(0x0050, 0x0057) AM_DEVREADWRITE8("ppi8255_fdd", i8255_device, read, write, 0xff00)
+ AM_RANGE(0x0050, 0x0053) AM_WRITE8(nmi_ctrl_w,0x00ff) // NMI FF / i8255 floppy port (2d?)
+ AM_RANGE(0x0060, 0x0063) AM_DEVREADWRITE8("upd7220_chr", upd7220_device, read, write, 0x00ff) //upd7220 character ports / <undefined>
AM_RANGE(0x0064, 0x0065) AM_WRITE8(pc9801_vrtc_mask_w,0xffff)
AM_RANGE(0x0068, 0x0069) AM_WRITE8(pc9801_video_ff_w,0xffff) //mode FF / <undefined>
// AM_RANGE(0x006c, 0x006f) border color / <undefined>
- AM_RANGE(0x0070, 0x007b) AM_READWRITE8(pc9801_70_r,pc9801_70_w,0xffff) //display registers / i8253 pit
-// AM_RANGE(0x0080, 0x0083) AM_READWRITE8(pc9801_sasi_r,pc9801_sasi_w,0xffff) //HDD SASI interface / <undefined>
+ AM_RANGE(0x0070, 0x007f) AM_DEVREADWRITE8("pit8253", pit8253_device, read, write, 0xff00)
+ AM_RANGE(0x0070, 0x007b) AM_READWRITE8(txt_scrl_r,txt_scrl_w,0x00ff) //display registers / i8253 pit
AM_RANGE(0x0080, 0x0081) AM_READWRITE8(sasi_data_r, sasi_data_w, 0x00ff)
AM_RANGE(0x0082, 0x0083) AM_READWRITE8(sasi_status_r, sasi_ctrl_w,0x00ff)
AM_RANGE(0x0090, 0x0097) AM_READWRITE8(pc9801_fdc_2hd_r,pc9801_fdc_2hd_w,0xffff) //upd765a 2hd / cmt
AM_RANGE(0x00a0, 0x00af) AM_READWRITE8(pc9801_a0_r,pc9801_a0_w,0xffff) //upd7220 bitmap ports / display registers
AM_RANGE(0x00c8, 0x00cd) AM_READWRITE8(pc9801_fdc_2dd_r,pc9801_fdc_2dd_w,0xffff) //upd765a 2dd / <undefined>
// AM_RANGE(0x0188, 0x018b) AM_READWRITE8(pc9801_opn_r,pc9801_opn_w,0xffff) //ym2203 opn / <undefined>
- AM_RANGE(0x7fd8, 0x7fdf) AM_READWRITE8(pc9801_mouse_r,pc9801_mouse_w,0xffff) // <undefined> / mouse ppi8255 ports
+ AM_RANGE(0x7fd8, 0x7fdf) AM_DEVREADWRITE8("ppi8255_mouse", i8255_device, read, write, 0xff00)
ADDRESS_MAP_END
/*************************************
@@ -1967,7 +1660,7 @@ WRITE8_MEMBER(pc9801_state::pc9801rs_bank_w)
}
}
- printf("Unknown EMS ROM setting %02x\n",data);
+ logerror("Unknown EMS ROM setting %02x\n",data);
}
if(offset == 3)
{
@@ -1975,7 +1668,7 @@ WRITE8_MEMBER(pc9801_state::pc9801rs_bank_w)
m_vram_bank = (data & 2) >> 1;
else
{
- printf("Unknown EMS RAM setting %02x\n",data);
+ logerror("Unknown EMS RAM setting %02x\n",data);
}
}
}
@@ -2016,46 +1709,40 @@ WRITE8_MEMBER(pc9801_state::pc9801rs_f0_w)
m_maincpu->set_input_line(INPUT_LINE_A20, m_gate_a20);
}
-READ8_MEMBER(pc9801_state::pc9801rs_30_r)
+READ8_MEMBER(pc9801_state::grcg_r)
{
- return pc9801_30_r(space,offset);
-}
-
-READ8_MEMBER(pc9801_state::pc9801rs_70_r)
-{
- if(offset == 0xc)
+ if(offset == 6)
{
- printf("GRCG mode R\n");
+ logerror("GRCG mode R\n");
return 0xff;
}
- else if(offset == 0x0e)
+ else if(offset == 7)
{
- printf("GRCG tile R\n");
+ logerror("GRCG tile R\n");
return 0xff;
}
-
- return pc9801_70_r(space,offset);;
+ return txt_scrl_r(space,offset);
}
-WRITE8_MEMBER(pc9801_state::pc9801rs_70_w)
+WRITE8_MEMBER(pc9801_state::grcg_w)
{
- if(offset == 0xc)
+ if(offset == 6)
{
-// printf("%02x GRCG MODE\n",data);
+// logerror("%02x GRCG MODE\n",data);
m_grcg.mode = data;
m_grcg.tile_index = 0;
return;
}
- else if(offset == 0x0e)
+ else if(offset == 7)
{
-// printf("%02x GRCG TILE %02x\n",data,m_grcg.tile_index);
+// logerror("%02x GRCG TILE %02x\n",data,m_grcg.tile_index);
m_grcg.tile[m_grcg.tile_index] = data;
m_grcg.tile_index ++;
m_grcg.tile_index &= 3;
return;
}
- pc9801_70_w(space,offset,data);
+ txt_scrl_w(space,offset,data);
}
READ8_MEMBER(pc9801_state::pc9801rs_soundrom_r)
@@ -2082,7 +1769,7 @@ READ8_MEMBER(pc9801_state::pc9801rs_memory_r)
else if(offset >= 0x00100000 && offset <= 0x00100000+m_ram_size-1) { return pc9801rs_ex_wram_r(space,offset-0x00100000); }
else if(offset >= 0xfffe0000 && offset <= 0xffffffff) { return pc9801rs_ipl_r(space,offset & 0x1ffff); }
-// printf("%08x\n",offset);
+// logerror("%08x\n",offset);
return 0x00;
}
@@ -2102,7 +1789,7 @@ WRITE8_MEMBER(pc9801_state::pc9801rs_memory_w)
else if(offset >= 0x000e0000 && offset <= 0x000e7fff) { m_pc9801rs_grcg_w(offset & 0x7fff,0,data); }
else if(offset >= 0x00100000 && offset <= 0x00100000+m_ram_size-1) { pc9801rs_ex_wram_w(space,offset-0x00100000,data); }
//else
- // printf("%08x %08x\n",offset,data);
+ // logerror("%08x %08x\n",offset,data);
}
READ8_MEMBER(pc9801_state::pc9810rs_fdc_ctrl_r)
@@ -2118,14 +1805,14 @@ WRITE8_MEMBER(pc9801_state::pc9810rs_fdc_ctrl_w)
---- ---x select irq
*/
- machine().device<floppy_connector>("upd765_2hd:0")->get_device()->set_rpm(data & 0x02 ? 360 : 300);
- machine().device<floppy_connector>("upd765_2hd:1")->get_device()->set_rpm(data & 0x02 ? 360 : 300);
+ m_fdc_2hd->subdevice<floppy_connector>("0")->get_device()->set_rpm(data & 0x02 ? 360 : 300);
+ m_fdc_2hd->subdevice<floppy_connector>("1")->get_device()->set_rpm(data & 0x02 ? 360 : 300);
- machine().device<upd765a_device>("upd765_2hd")->set_rate(data & 0x02 ? 500000 : 250000);
+ m_fdc_2hd->set_rate(data & 0x02 ? 500000 : 250000);
m_fdc_ctrl = data;
//if(data & 0xfc)
- // printf("FDC ctrl called with %02x\n",data);
+ // logerror("FDC ctrl called with %02x\n",data);
}
READ8_MEMBER(pc9801_state::pc9801rs_2hd_r)
@@ -2134,13 +1821,13 @@ READ8_MEMBER(pc9801_state::pc9801rs_2hd_r)
{
switch(offset & 6)
{
- case 0: return machine().device<upd765a_device>("upd765_2hd")->msr_r(space, 0, 0xff);
- case 2: return machine().device<upd765a_device>("upd765_2hd")->fifo_r(space, 0, 0xff);
+ case 0: return m_fdc_2hd->msr_r(space, 0, 0xff);
+ case 2: return m_fdc_2hd->fifo_r(space, 0, 0xff);
case 4: return 0x44; //2hd flag
}
}
- printf("Read to undefined port [%02x]\n",offset+0x90);
+ logerror("Read to undefined port [%02x]\n",offset+0x90);
return 0xff;
}
@@ -2151,23 +1838,30 @@ WRITE8_MEMBER(pc9801_state::pc9801rs_2hd_w)
{
switch(offset & 6)
{
- case 2: machine().device<upd765a_device>("upd765_2hd")->fifo_w(space, 0, data, 0xff); return;
+ case 2: m_fdc_2hd->fifo_w(space, 0, data, 0xff); return;
case 4:
if(data & 0x80)
- machine().device<upd765a_device>("upd765_2hd")->reset();
-
- pc9801_fdc_2hd_update_ready(NULL, 0);
+ m_fdc_2hd->soft_reset();
- machine().device<floppy_connector>("upd765_2hd:0")->get_device()->mon_w(data & 0x40 ? ASSERT_LINE : CLEAR_LINE);
- machine().device<floppy_connector>("upd765_2hd:1")->get_device()->mon_w(data & 0x40 ? ASSERT_LINE : CLEAR_LINE);
+ if(data & 0x40)
+ {
+ m_fdc_2hd->set_ready_line_connected(0);
+ m_fdc_2hd->ready_w(0);
+ }
+ else
+ m_fdc_2hd->set_ready_line_connected(1);
-// machine().device<floppy_connector>("upd765_2hd:0")->get_device()->mon_w(data & 0x08 ? ASSERT_LINE : CLEAR_LINE);
-// machine().device<floppy_connector>("upd765_2hd:1")->get_device()->mon_w(data & 0x08 ? ASSERT_LINE : CLEAR_LINE);
+ //TODO: verify
+ if(!(m_fdc_ctrl & 4))
+ {
+ m_fdc_2hd->subdevice<floppy_connector>("0")->get_device()->mon_w(data & 8 ? CLEAR_LINE : ASSERT_LINE);
+ m_fdc_2hd->subdevice<floppy_connector>("1")->get_device()->mon_w(data & 8 ? CLEAR_LINE : ASSERT_LINE);
+ }
return;
}
}
- printf("Write to undefined port [%02x] %02x\n",offset+0x90,data);
+ logerror("Write to undefined port [%02x] %02x\n",offset+0x90,data);
}
#if 0
@@ -2186,7 +1880,7 @@ READ8_MEMBER(pc9801_state::pc9801rs_2dd_r)
}
}
- printf("Read to undefined port [%02x]\n",offset+0x90);
+ logerror("Read to undefined port [%02x]\n",offset+0x90);
return 0xff;
}
@@ -2201,11 +1895,11 @@ WRITE8_MEMBER(pc9801_state::pc9801rs_2dd_w)
switch(offset & 6)
{
case 2: machine().device<upd765a_device>("upd765_2hd")->fifo_w(space, 0, data, 0xff); return;
- case 4: printf("%02x 2DD FDC ctrl\n",data); return;
+ case 4: logerror("%02x 2DD FDC ctrl\n",data); return;
}
}
- printf("Write to undefined port [%02x] %02x\n",offset+0x90,data);
+ logerror("Write to undefined port [%02x] %02x\n",offset+0x90,data);
}
#endif
@@ -2226,10 +1920,10 @@ WRITE8_MEMBER(pc9801_state::pc9801rs_video_ff_w)
"<unknown>" // 3
};
- printf("Write to extended video FF register %s -> %02x\n",ex_video_ff_regnames[(data & 0x06) >> 1],data & 1);
+ logerror("Write to extended video FF register %s -> %02x\n",ex_video_ff_regnames[(data & 0x06) >> 1],data & 1);
}
//else
- // printf("Write to extended video FF register %02x\n",data);
+ // logerror("Write to extended video FF register %02x\n",data);
return;
}
@@ -2299,78 +1993,6 @@ READ8_MEMBER( pc9801_state::pc9801rs_midi_r )
return 0xff;
}
-READ8_MEMBER(pc9801_state::pc9801rs_pit_mirror_r)
-{
- if((offset & 1) == 0)
- {
- printf("Read to undefined port [%04x]\n",offset+0x3fd8);
- return 0xff;
- }
- else // odd
- {
- if(offset & 0x08)
- printf("Read to undefined port [%02x]\n",offset+0x3fd8);
- else
- return m_pit8253->read(space, (offset & 6) >> 1);
- }
-
- return 0xff;
-}
-
-WRITE8_MEMBER(pc9801_state::pc9801rs_pit_mirror_w)
-{
- if((offset & 1) == 0)
- {
- printf("Write to undefined port [%04x] <- %02x\n",offset+0x3fd8,data);
- }
- else // odd
- {
- if(offset < 0x08)
- m_pit8253->write(space, (offset & 6) >> 1, data);
- else
- printf("Write to undefined port [%04x] <- %02x\n",offset+0x3fd8,data);
- }
-}
-
-static ADDRESS_MAP_START( pc9801rs_map, AS_PROGRAM, 32, pc9801_state )
- AM_RANGE(0x00000000, 0xffffffff) AM_READWRITE8(pc9801rs_memory_r,pc9801rs_memory_w,0xffffffff)
-ADDRESS_MAP_END
-
-static ADDRESS_MAP_START( pc9801rs_io, AS_IO, 32, pc9801_state )
- ADDRESS_MAP_UNMAP_HIGH
- AM_RANGE(0x0000, 0x001f) AM_READWRITE8(pc9801_00_r, pc9801_00_w, 0xffffffff) // i8259 PIC (bit 3 ON slave / master) / i8237 DMA
- AM_RANGE(0x0020, 0x0027) AM_READWRITE8(pc9801_20_r, pc9801_20_w, 0xffffffff) // RTC / DMA registers (LS244)
- AM_RANGE(0x0030, 0x0037) AM_READWRITE8(pc9801rs_30_r, pc9801_30_w, 0xffffffff) //i8251 RS232c / i8255 system port
- AM_RANGE(0x0040, 0x0047) AM_READWRITE8(pc9801_40_r, pc9801_40_w, 0xffffffff) //i8255 printer port / i8251 keyboard
- AM_RANGE(0x0050, 0x0053) AM_WRITE8(pc9801rs_nmi_w, 0xffffffff)
- AM_RANGE(0x005c, 0x005f) AM_READ(pc9821_timestamp_r) AM_WRITENOP // artic
- AM_RANGE(0x0060, 0x0063) AM_READWRITE8(pc9801_60_r, pc9801_60_w, 0xffffffff) //upd7220 character ports / <undefined>
- AM_RANGE(0x0064, 0x0067) AM_WRITE8(pc9801_vrtc_mask_w, 0xffffffff)
- AM_RANGE(0x0068, 0x006b) AM_WRITE8(pc9801rs_video_ff_w,0xffffffff) //mode FF / <undefined>
- AM_RANGE(0x0070, 0x007f) AM_READWRITE8(pc9801rs_70_r, pc9801rs_70_w, 0xffffffff) //display registers "GRCG" / i8253 pit
- AM_RANGE(0x0080, 0x0083) AM_READWRITE8(pc9801_sasi_r, pc9801_sasi_w, 0xffffffff) //HDD SASI interface / <undefined>
- AM_RANGE(0x0090, 0x0097) AM_READWRITE8(pc9801rs_2hd_r, pc9801rs_2hd_w, 0xffffffff)
- AM_RANGE(0x00a0, 0x00af) AM_READWRITE8(pc9801_a0_r, pc9801rs_a0_w, 0xffffffff) //upd7220 bitmap ports / display registers
- AM_RANGE(0x00bc, 0x00bf) AM_READWRITE8(pc9810rs_fdc_ctrl_r,pc9810rs_fdc_ctrl_w,0xffffffff)
- AM_RANGE(0x00c8, 0x00cf) AM_READWRITE8(pc9801rs_2hd_r, pc9801rs_2hd_w, 0xffffffff)
-// AM_RANGE(0x00ec, 0x00ef) PC-9801-86 sound board
- AM_RANGE(0x00f0, 0x00ff) AM_READWRITE8(pc9801rs_f0_r, pc9801rs_f0_w, 0xffffffff)
-// AM_RANGE(0x0188, 0x018f) AM_READWRITE8(pc9801_opn_r, pc9801_opn_w, 0xffffffff) //ym2203 opn / <undefined>
- AM_RANGE(0x0430, 0x0433) AM_READ8(ide_hack_r, 0x000000ff)
-
- AM_RANGE(0x0438, 0x043b) AM_READWRITE8(pc9801rs_access_ctrl_r,pc9801rs_access_ctrl_w,0xffffffff)
- AM_RANGE(0x043c, 0x043f) AM_WRITE8(pc9801rs_bank_w, 0xffffffff) //ROM/RAM bank
-
- AM_RANGE(0x0640, 0x064f) AM_DEVREADWRITE16("ide", ata_interface_device, read_cs0, write_cs0, 0xffffffff)
- AM_RANGE(0x0740, 0x074f) AM_DEVREADWRITE16("ide", ata_interface_device, read_cs1, write_cs1, 0xffffffff)
-
- AM_RANGE(0x3fd8, 0x3fdf) AM_READWRITE8(pc9801rs_pit_mirror_r, pc9801rs_pit_mirror_w, 0xffffffff) // <undefined> / pit mirror ports
- AM_RANGE(0x7fd8, 0x7fdf) AM_READWRITE8(pc9801_mouse_r, pc9801_mouse_w, 0xffffffff) // <undefined> / mouse ppi8255 ports
-// AM_RANGE(0xa460, 0xa463) AM_READWRITE8(pc9801_ext_opna_r, pc9801_ext_opna_w, 0xffffffff)
- AM_RANGE(0xbfd8, 0xbfdf) AM_WRITE8(pc9801rs_mouse_freq_w, 0xffffffff)
- AM_RANGE(0xe0d0, 0xe0d3) AM_READ8(pc9801rs_midi_r, 0xffffffff)
-ADDRESS_MAP_END
-
READ8_MEMBER(pc9801_state::pic_r)
{
return ((offset >= 4) ? m_pic2 : m_pic1)->read(space, offset & 3);
@@ -2412,49 +2034,35 @@ ADDRESS_MAP_END
static ADDRESS_MAP_START( pc9801ux_io, AS_IO, 16, pc9801_state )
ADDRESS_MAP_UNMAP_HIGH
-
- AM_RANGE(0x0000, 0x001f) AM_DEVREADWRITE8("i8237", am9517a_device, read, write, 0xff00)
- AM_RANGE(0x0000, 0x000f) AM_READWRITE8(pic_r, pic_w, 0x00ff) // i8259 PIC (bit 3 ON slave / master) / i8237 DMA
- AM_RANGE(0x0020, 0x0027) AM_READWRITE8(pc9801_20_r, pc9801_20_w, 0xffff) // RTC / DMA registers (LS244)
- AM_RANGE(0x0030, 0x0037) AM_DEVREADWRITE8("ppi8255_sys", i8255_device, read, write, 0xff00)
- AM_RANGE(0x0030, 0x0037) AM_READWRITE8(pc9801rs_30_r, pc9801_30_w, 0xffff) //i8251 RS232c / i8255 system port
- AM_RANGE(0x0040, 0x0047) AM_DEVREADWRITE8("ppi8255_prn", i8255_device, read, write, 0x00ff)
- AM_RANGE(0x0040, 0x0043) AM_DEVREADWRITE8("keyb", pc9801_kbd_device, rx_r, tx_w, 0xff00) //i8255 printer port / i8251 keyboard
- AM_RANGE(0x005c, 0x005f) AM_WRITENOP // time-stamp?
- AM_RANGE(0x0060, 0x0063) AM_DEVREADWRITE8("upd7220_chr", upd7220_device, read, write, 0x00ff) //upd7220 character ports / <undefined>
- AM_RANGE(0x0064, 0x0067) AM_WRITE8(pc9801_vrtc_mask_w, 0xffff)
+ AM_RANGE(0x0050, 0x0057) AM_NOP // 2dd ppi?
+ AM_RANGE(0x005c, 0x005f) AM_READ(pc9821_timestamp_r) AM_WRITENOP // artic
AM_RANGE(0x0068, 0x006b) AM_WRITE8(pc9801rs_video_ff_w,0xffff) //mode FF / <undefined>
- AM_RANGE(0x0070, 0x007f) AM_DEVREADWRITE8("pit8253", pit8253_device, read, write, 0xff00)
- AM_RANGE(0x0070, 0x007f) AM_READWRITE8(pc9801rs_70_r, pc9801rs_70_w, 0xffff) //display registers "GRCG" / i8253 pit
+ AM_RANGE(0x0070, 0x007f) AM_READWRITE8(grcg_r, grcg_w, 0x00ff) //display registers "GRCG" / i8253 pit
AM_RANGE(0x0090, 0x0097) AM_READWRITE8(pc9801rs_2hd_r, pc9801rs_2hd_w, 0xffff)
AM_RANGE(0x00a0, 0x00af) AM_READWRITE8(pc9801_a0_r, pc9801rs_a0_w, 0xffff) //upd7220 bitmap ports / display registers
AM_RANGE(0x00bc, 0x00bf) AM_READWRITE8(pc9810rs_fdc_ctrl_r,pc9810rs_fdc_ctrl_w,0xffff)
AM_RANGE(0x00c8, 0x00cf) AM_READWRITE8(pc9801rs_2hd_r, pc9801rs_2hd_w, 0xffff)
AM_RANGE(0x00f0, 0x00ff) AM_READWRITE8(pc9801rs_f0_r, pc9801rs_f0_w, 0xffff)
-// AM_RANGE(0x0188, 0x018f) AM_READWRITE8(pc9801_opn_r, pc9801_opn_w, 0xffff) //ym2203 opn / <undefined>
AM_RANGE(0x0438, 0x043b) AM_READWRITE8(pc9801rs_access_ctrl_r,pc9801rs_access_ctrl_w,0xffff)
AM_RANGE(0x043c, 0x043f) AM_WRITE8(pc9801rs_bank_w, 0xffff) //ROM/RAM bank
AM_RANGE(0x3fd8, 0x3fdf) AM_DEVREADWRITE8("pit8253", pit8253_device, read, write, 0xff00)
- AM_RANGE(0x7fd8, 0x7fdf) AM_DEVREADWRITE8("ppi8255_mouse", i8255_device, read, write, 0xff00)
// AM_RANGE(0xa460, 0xa463) AM_READWRITE8(pc9801_ext_opna_r, pc9801_ext_opna_w, 0xffff)
-
+ AM_IMPORT_FROM(pc9801_io)
ADDRESS_MAP_END
-static ADDRESS_MAP_START( pc9801bx2_io, AS_IO, 32, pc9801_state )
- AM_IMPORT_FROM(pc9801rs_io)
+static ADDRESS_MAP_START( pc9801rs_map, AS_PROGRAM, 16, pc9801_state )
+ AM_RANGE(0x00000000, 0xffffffff) AM_READWRITE8(pc9801rs_memory_r,pc9801rs_memory_w,0xffff)
+ADDRESS_MAP_END
- AM_RANGE(0x841c, 0x841f) AM_READWRITE8(sdip_0_r,sdip_0_w,0xffffffff)
- AM_RANGE(0x851c, 0x851f) AM_READWRITE8(sdip_1_r,sdip_1_w,0xffffffff)
- AM_RANGE(0x861c, 0x861f) AM_READWRITE8(sdip_2_r,sdip_2_w,0xffffffff)
- AM_RANGE(0x871c, 0x871f) AM_READWRITE8(sdip_3_r,sdip_3_w,0xffffffff)
- AM_RANGE(0x881c, 0x881f) AM_READWRITE8(sdip_4_r,sdip_4_w,0xffffffff)
- AM_RANGE(0x891c, 0x891f) AM_READWRITE8(sdip_5_r,sdip_5_w,0xffffffff)
- AM_RANGE(0x8a1c, 0x8a1f) AM_READWRITE8(sdip_6_r,sdip_6_w,0xffffffff)
- AM_RANGE(0x8b1c, 0x8b1f) AM_READWRITE8(sdip_7_r,sdip_7_w,0xffffffff)
- AM_RANGE(0x8c1c, 0x8c1f) AM_READWRITE8(sdip_8_r,sdip_8_w,0xffffffff)
- AM_RANGE(0x8d1c, 0x8d1f) AM_READWRITE8(sdip_9_r,sdip_9_w,0xffffffff)
- AM_RANGE(0x8e1c, 0x8e1f) AM_READWRITE8(sdip_a_r,sdip_a_w,0xffffffff)
- AM_RANGE(0x8f1c, 0x8f1f) AM_READWRITE8(sdip_b_r,sdip_b_w,0xffffffff)
+static ADDRESS_MAP_START( pc9801rs_io, AS_IO, 16, pc9801_state )
+ ADDRESS_MAP_UNMAP_HIGH
+ AM_RANGE(0x0050, 0x0053) AM_WRITE8(pc9801rs_nmi_w, 0xffff)
+ AM_RANGE(0x0430, 0x0433) AM_READ8(ide_hack_r, 0x00ff)
+ AM_RANGE(0x0640, 0x064f) AM_DEVREADWRITE("ide", ata_interface_device, read_cs0, write_cs0)
+ AM_RANGE(0x0740, 0x074f) AM_DEVREADWRITE("ide", ata_interface_device, read_cs1, write_cs1)
+ AM_RANGE(0xbfd8, 0xbfdf) AM_WRITE8(pc9801rs_mouse_freq_w, 0xffff)
+ AM_RANGE(0xe0d0, 0xe0d3) AM_READ8(pc9801rs_midi_r, 0xffff)
+ AM_IMPORT_FROM(pc9801ux_io)
ADDRESS_MAP_END
/*************************************
@@ -2497,7 +2105,7 @@ READ8_MEMBER(pc9801_state::pc9821_memory_r)
else if(offset >= 0x00f00000 && offset <= 0x00f9ffff) { return pc9821_ext_gvram_r(space,offset-0x00f00000); }
else if(offset >= 0xfffe0000 && offset <= 0xffffffff) { return pc9801rs_ipl_r(space,offset & 0x1ffff); }
- //printf("%08x\n",offset);
+ //logerror("%08x\n",offset);
return 0x00;
}
@@ -2527,7 +2135,7 @@ WRITE8_MEMBER(pc9801_state::pc9821_memory_w)
else if(offset >= 0x00100000 && offset <= 0x00100000+m_ram_size-1) { pc9801rs_ex_wram_w(space,offset-0x00100000,data); }
else if(offset >= 0x00f00000 && offset <= 0x00f9ffff) { pc9821_ext_gvram_w(space,offset-0x00f00000,data); }
//else
- // printf("%08x %08x\n",offset,data);
+ // logerror("%08x %08x\n",offset,data);
}
@@ -2538,7 +2146,7 @@ WRITE8_MEMBER(pc9801_state::pc9821_video_ff_w)
m_ex_video_ff[(data & 0xfe) >> 1] = data & 1;
//if((data & 0xfe) == 0x20)
- // printf("%02x\n",data & 1);
+ // logerror("%02x\n",data & 1);
}
/* Intentional fall-through */
@@ -2551,7 +2159,7 @@ READ8_MEMBER(pc9801_state::pc9821_a0_r)
{
if(m_ex_video_ff[ANALOG_256_MODE])
{
- printf("256 color mode [%02x] R\n",offset);
+ logerror("256 color mode [%02x] R\n",offset);
return 0;
}
else if(m_ex_video_ff[ANALOG_16_MODE]) //16 color mode, readback possible there
@@ -2608,7 +2216,7 @@ WRITE8_MEMBER(pc9801_state::pc9821_window_bank_w)
if(offset == 1)
m_pc9821_window_bank = data & 0xfe;
else
- printf("PC-9821 $f0000 window bank %02x\n",data);
+ logerror("PC-9821 $f0000 window bank %02x\n",data);
}
UINT8 pc9801_state::m_sdip_read(UINT16 port, UINT8 sdip_offset)
@@ -2616,7 +2224,7 @@ UINT8 pc9801_state::m_sdip_read(UINT16 port, UINT8 sdip_offset)
if(port == 2)
return m_sdip[sdip_offset];
- printf("Warning: read from unknown SDIP area %02x %04x\n",port,0x841c + port + (sdip_offset % 12)*0x100);
+ logerror("Warning: read from unknown SDIP area %02x %04x\n",port,0x841c + port + (sdip_offset % 12)*0x100);
return 0xff;
}
@@ -2628,7 +2236,7 @@ void pc9801_state::m_sdip_write(UINT16 port, UINT8 sdip_offset,UINT8 data)
return;
}
- printf("Warning: write from unknown SDIP area %02x %04x %02x\n",port,0x841c + port + (sdip_offset % 12)*0x100,data);
+ logerror("Warning: write from unknown SDIP area %02x %04x %02x\n",port,0x841c + port + (sdip_offset % 12)*0x100,data);
}
READ8_MEMBER(pc9801_state::sdip_0_r) { return m_sdip_read(offset, 0+m_sdip_bank*12); }
@@ -2664,12 +2272,12 @@ WRITE8_MEMBER(pc9801_state::sdip_b_w)
m_sdip_write(offset,11+m_sdip_bank*12,data);
if((offset & 2) == 0)
- printf("SDIP area B write %02x %02x\n",offset,data);
+ logerror("SDIP area B write %02x %02x\n",offset,data);
}
-READ32_MEMBER(pc9801_state::pc9821_timestamp_r)
+READ16_MEMBER(pc9801_state::pc9821_timestamp_r)
{
- return m_maincpu->total_cycles();
+ return (m_maincpu->total_cycles() >> (16 * offset));
}
/* basically a read-back of various registers */
@@ -2686,7 +2294,7 @@ READ8_MEMBER(pc9801_state::pc9821_ext2_video_ff_r)
{
case 3: res = m_video_ff[DISPLAY_REG]; break; // display reg
default:
- printf("PC-9821: read ext2 f/f with value %02x\n",m_ext2_ff);
+ logerror("PC-9821: read ext2 f/f with value %02x\n",m_ext2_ff);
}
return res;
@@ -2704,17 +2312,19 @@ ADDRESS_MAP_END
static ADDRESS_MAP_START( pc9821_io, AS_IO, 32, pc9801_state )
// ADDRESS_MAP_UNMAP_HIGH // TODO: a read to somewhere makes this to fail at POST
- AM_RANGE(0x0000, 0x001f) AM_READWRITE8(pc9801_00_r, pc9801_00_w, 0xffffffff) // i8259 PIC (bit 3 ON slave / master) / i8237 DMA
- AM_RANGE(0x0020, 0x0027) AM_READWRITE8(pc9801_20_r, pc9801_20_w, 0xffffffff) // RTC / DMA registers (LS244)
- AM_RANGE(0x0030, 0x0037) AM_READWRITE8(pc9801rs_30_r, pc9801_30_w, 0xffffffff) //i8251 RS232c / i8255 system port
- AM_RANGE(0x0040, 0x0047) AM_READWRITE8(pc9801_40_r, pc9801_40_w, 0xffffffff) //i8255 printer port / i8251 keyboard
+ AM_RANGE(0x0000, 0x001f) AM_DEVREADWRITE8("i8237", am9517a_device, read, write, 0xff00ff00)
+ AM_RANGE(0x0000, 0x000f) AM_READWRITE8(pic_r, pic_w, 0x00ff00ff) // i8259 PIC (bit 3 ON slave / master) / i8237 DMA
+ AM_RANGE(0x0020, 0x0027) AM_WRITE8(rtc_dmapg_w, 0xffffffff) // RTC / DMA registers (LS244)
+ AM_RANGE(0x0030, 0x0037) AM_DEVREADWRITE8("ppi8255_sys", i8255_device, read, write, 0xff00ff00) //i8251 RS232c / i8255 system port
+ AM_RANGE(0x0040, 0x0047) AM_DEVREADWRITE8("ppi8255_prn", i8255_device, read, write, 0x00ff00ff)
+ AM_RANGE(0x0040, 0x0043) AM_DEVREADWRITE8("keyb", pc9801_kbd_device, rx_r, tx_w, 0xff00ff00) //i8255 printer port / i8251 keyboard
AM_RANGE(0x0050, 0x0053) AM_WRITE8(pc9801rs_nmi_w, 0xffffffff)
- AM_RANGE(0x005c, 0x005f) AM_READ(pc9821_timestamp_r) AM_WRITENOP // artic
- AM_RANGE(0x0060, 0x0063) AM_READWRITE8(pc9801_60_r, pc9801_60_w, 0xffffffff) //upd7220 character ports / <undefined>
+ AM_RANGE(0x005c, 0x005f) AM_READ16(pc9821_timestamp_r,0xffffffff) AM_WRITENOP // artic
+ AM_RANGE(0x0060, 0x0063) AM_DEVREADWRITE8("upd7220_chr", upd7220_device, read, write, 0x00ff00ff) //upd7220 character ports / <undefined>
AM_RANGE(0x0064, 0x0067) AM_WRITE8(pc9801_vrtc_mask_w, 0xffffffff)
AM_RANGE(0x0068, 0x006b) AM_WRITE8(pc9821_video_ff_w, 0xffffffff) //mode FF / <undefined>
- AM_RANGE(0x0070, 0x007f) AM_READWRITE8(pc9801rs_70_r, pc9801rs_70_w, 0xffffffff) //display registers "GRCG" / i8253 pit
- AM_RANGE(0x0080, 0x0083) AM_READWRITE8(pc9801_sasi_r, pc9801_sasi_w, 0xffffffff) //HDD SASI interface / <undefined>
+ AM_RANGE(0x0070, 0x007f) AM_DEVREADWRITE8("pit8253", pit8253_device, read, write, 0xff00ff00)
+ AM_RANGE(0x0070, 0x007f) AM_READWRITE8(grcg_r, grcg_w, 0x00ff00ff) //display registers "GRCG" / i8253 pit
AM_RANGE(0x0090, 0x0097) AM_READWRITE8(pc9801rs_2hd_r, pc9801rs_2hd_w, 0xffffffff)
AM_RANGE(0x00a0, 0x00af) AM_READWRITE8(pc9821_a0_r, pc9821_a0_w, 0xffffffff) //upd7220 bitmap ports / display registers
// AM_RANGE(0x00b0, 0x00b3) PC9861k (serial port?)
@@ -2746,8 +2356,8 @@ static ADDRESS_MAP_START( pc9821_io, AS_IO, 32, pc9801_state )
// AM_RANGE(0x0c2d, 0x0c2d) cs4231 PCM board hi byte control
// AM_RANGE(0x0cc0, 0x0cc7) SCSI interface / <undefined>
// AM_RANGE(0x0cfc, 0x0cff) PCI bus
- AM_RANGE(0x3fd8, 0x3fdf) AM_READWRITE8(pc9801rs_pit_mirror_r, pc9801rs_pit_mirror_w, 0xffffffff) // <undefined> / pit mirror ports
- AM_RANGE(0x7fd8, 0x7fdf) AM_READWRITE8(pc9801_mouse_r, pc9801_mouse_w, 0xffffffff) // <undefined> / mouse ppi8255 ports
+ AM_RANGE(0x3fd8, 0x3fdf) AM_DEVREADWRITE8("pit8253", pit8253_device, read, write, 0xff00ff00) // <undefined> / pit mirror ports
+ AM_RANGE(0x7fd8, 0x7fdf) AM_DEVREADWRITE8("ppi8255_mouse", i8255_device, read, write, 0xff00ff00)
AM_RANGE(0x841c, 0x841f) AM_READWRITE8(sdip_0_r,sdip_0_w,0xffffffff)
AM_RANGE(0x851c, 0x851f) AM_READWRITE8(sdip_1_r,sdip_1_w,0xffffffff)
AM_RANGE(0x861c, 0x861f) AM_READWRITE8(sdip_2_r,sdip_2_w,0xffffffff)
@@ -3086,7 +2696,7 @@ WRITE_LINE_MEMBER(pc9801_state::pc9801_dma_hrq_changed)
m_dmac->hack_w(state);
-// printf("%02x HLDA\n",state);
+// logerror("%02x HLDA\n",state);
}
WRITE_LINE_MEMBER(pc9801_state::pc9801_tc_w )
@@ -3095,7 +2705,7 @@ WRITE_LINE_MEMBER(pc9801_state::pc9801_tc_w )
m_fdc_2hd->tc_w(state);
// TODO: 2dd?
-// printf("TC %02x\n",state);
+// logerror("TC %02x\n",state);
}
READ8_MEMBER(pc9801_state::pc9801_dma_read_byte)
@@ -3103,7 +2713,7 @@ READ8_MEMBER(pc9801_state::pc9801_dma_read_byte)
address_space &program = m_maincpu->space(AS_PROGRAM);
offs_t addr = (m_dma_offset[m_dack] << 16) | offset;
-// printf("%08x\n",addr);
+// logerror("%08x\n",addr);
return program.read_byte(addr);
}
@@ -3114,7 +2724,7 @@ WRITE8_MEMBER(pc9801_state::pc9801_dma_write_byte)
address_space &program = m_maincpu->space(AS_PROGRAM);
offs_t addr = (m_dma_offset[m_dack] << 16) | offset;
-// printf("%08x %02x\n",addr,data);
+// logerror("%08x %02x\n",addr,data);
program.write_byte(addr, data);
}
@@ -3124,30 +2734,10 @@ void pc9801_state::set_dma_channel(int channel, int state)
if (!state) m_dack = channel;
}
-WRITE_LINE_MEMBER(pc9801_state::pc9801_dack0_w){ /*printf("%02x 0\n",state);*/ set_dma_channel(0, state); }
-WRITE_LINE_MEMBER(pc9801_state::pc9801_dack1_w){ /*printf("%02x 1\n",state);*/ set_dma_channel(1, state); }
-WRITE_LINE_MEMBER(pc9801_state::pc9801_dack2_w){ /*printf("%02x 2\n",state);*/ set_dma_channel(2, state); }
-WRITE_LINE_MEMBER(pc9801_state::pc9801_dack3_w){ /*printf("%02x 3\n",state);*/ set_dma_channel(3, state); }
-
-READ8_MEMBER(pc9801_state::fdc_2hd_r)
-{
- return m_fdc_2hd->dma_r();
-}
-
-WRITE8_MEMBER(pc9801_state::fdc_2hd_w)
-{
- m_fdc_2hd->dma_w(data);
-}
-
-READ8_MEMBER(pc9801_state::fdc_2dd_r)
-{
- return m_fdc_2dd->dma_r();
-}
-
-WRITE8_MEMBER(pc9801_state::fdc_2dd_w)
-{
- m_fdc_2dd->dma_w(data);
-}
+WRITE_LINE_MEMBER(pc9801_state::pc9801_dack0_w){ /*logerror("%02x 0\n",state);*/ set_dma_channel(0, state); }
+WRITE_LINE_MEMBER(pc9801_state::pc9801_dack1_w){ /*logerror("%02x 1\n",state);*/ set_dma_channel(1, state); }
+WRITE_LINE_MEMBER(pc9801_state::pc9801_dack2_w){ /*logerror("%02x 2\n",state);*/ set_dma_channel(2, state); }
+WRITE_LINE_MEMBER(pc9801_state::pc9801_dack3_w){ /*logerror("%02x 3\n",state);*/ set_dma_channel(3, state); }
/*
ch1 cs-4231a
@@ -3210,18 +2800,18 @@ READ8_MEMBER(pc9801_state::ppi_mouse_porta_r)
res |= (m_mouse.lx >> isporthi) & 0xf;
}
-// printf("A\n");
+// logerror("A\n");
return res;
}
WRITE8_MEMBER(pc9801_state::ppi_mouse_porta_w)
{
-// printf("A %02x\n",data);
+// logerror("A %02x\n",data);
}
WRITE8_MEMBER(pc9801_state::ppi_mouse_portb_w)
{
-// printf("B %02x\n",data);
+// logerror("B %02x\n",data);
}
WRITE8_MEMBER(pc9801_state::ppi_mouse_portc_w)
@@ -3242,6 +2832,7 @@ WRITE8_MEMBER(pc9801_state::ppi_mouse_portc_w)
****************************************/
static SLOT_INTERFACE_START( pc9801_floppies )
+ SLOT_INTERFACE( "525dd", FLOPPY_525_DD )
SLOT_INTERFACE( "525hd", FLOPPY_525_HD )
SLOT_INTERFACE( "35hd", FLOPPY_35_HD )
SLOT_INTERFACE_END
@@ -3263,7 +2854,7 @@ SLOT_INTERFACE_END
WRITE_LINE_MEMBER( pc9801_state::fdc_2dd_irq )
{
- printf("IRQ 2DD %d\n",state);
+ logerror("IRQ 2DD %d\n",state);
if(m_fdc_2dd_ctrl & 8)
{
@@ -3275,7 +2866,7 @@ WRITE_LINE_MEMBER( pc9801_state::pc9801rs_fdc_irq )
{
/* 0xffaf8 */
- //printf("%02x %d\n",m_fdc_ctrl,state);
+ //logerror("%02x %d\n",m_fdc_ctrl,state);
if(m_fdc_ctrl & 1)
m_pic2->ir3_w(state);
@@ -3285,12 +2876,10 @@ WRITE_LINE_MEMBER( pc9801_state::pc9801rs_fdc_irq )
WRITE_LINE_MEMBER( pc9801_state::pc9801rs_fdc_drq )
{
-// printf("DRQ %d\n",state);
-
if(m_fdc_ctrl & 1)
m_dmac->dreq2_w(state ^ 1);
else
- printf("DRQ %02x %d\n",m_fdc_ctrl,state);
+ m_dmac->dreq3_w(state ^ 1);
}
UINT32 pc9801_state::pc9801_286_a20(bool state)
@@ -3332,20 +2921,6 @@ MACHINE_START_MEMBER(pc9801_state,pc9801f)
{
MACHINE_START_CALL_MEMBER(pc9801_common);
- upd765a_device *fdc;
- fdc = machine().device<upd765a_device>(":upd765_2hd");
- if (fdc)
- {
- floppy_image_device *floppy;
- floppy = machine().device<floppy_connector>("upd765_2hd:0")->get_device();
- if(floppy)
- floppy->setup_ready_cb(floppy_image_device::ready_cb(FUNC(pc9801_state::pc9801_fdc_2hd_update_ready), this));
-
- floppy = machine().device<floppy_connector>("upd765_2hd:1")->get_device();
- if(floppy)
- floppy->setup_ready_cb(floppy_image_device::ready_cb(FUNC(pc9801_state::pc9801_fdc_2hd_update_ready), this));
- }
-
m_fdc_2hd->set_rate(500000);
m_fdc_2dd->set_rate(250000);
m_sys_type = 0x00 >> 6;
@@ -3412,7 +2987,6 @@ MACHINE_RESET_MEMBER(pc9801_state,pc9801_common)
int i;
static const UINT8 default_memsw_data[0x10] =
{
- // set high nibble of byte 9 to 0xa and comment ROM_FILL below to boot from hdd
0xe1, 0x48, 0xe1, 0x05, 0xe1, 0x04, 0xe1, 0x00, 0xe1, 0x01, 0xe1, 0x00, 0xe1, 0x00, 0xe1, 0x6e
// 0xe1, 0xff, 0xe1, 0xff, 0xe1, 0xff, 0xe1, 0xff, 0xe1, 0xff, 0xe1, 0xff, 0xe1, 0xff, 0xe1, 0xff
};
@@ -3434,33 +3008,22 @@ MACHINE_RESET_MEMBER(pc9801_state,pc9801f)
{
MACHINE_RESET_CALL_MEMBER(pc9801_common);
- /* 2dd interface ready line is ON by default */
- floppy_image_device *floppy;
- floppy = machine().device<floppy_connector>(":upd765_2hd:0")->get_device();
- if (floppy)
- floppy->mon_w(CLEAR_LINE);
- floppy = machine().device<floppy_connector>(":upd765_2hd:1")->get_device();
- if (floppy)
- floppy->mon_w(CLEAR_LINE);
-
- {
- UINT8 op_mode;
- UINT8 *ROM;
- UINT8 *PRG = memregion("fdc_data")->base();
- int i;
+ UINT8 op_mode;
+ UINT8 *ROM;
+ UINT8 *PRG = memregion("fdc_data")->base();
+ int i;
- ROM = memregion("fdc_bios_2dd")->base();
- op_mode = (ioport("ROM_LOAD")->read() & 2) >> 1;
+ ROM = memregion("fdc_bios_2dd")->base();
+ op_mode = (ioport("ROM_LOAD")->read() & 2) >> 1;
- for(i=0;i<0x1000;i++)
- ROM[i] = PRG[i+op_mode*0x8000];
+ for(i=0;i<0x1000;i++)
+ ROM[i] = PRG[i+op_mode*0x8000];
- ROM = memregion("fdc_bios_2hd")->base();
- op_mode = ioport("ROM_LOAD")->read() & 1;
+ ROM = memregion("fdc_bios_2hd")->base();
+ op_mode = ioport("ROM_LOAD")->read() & 1;
- for(i=0;i<0x1000;i++)
- ROM[i] = PRG[i+op_mode*0x8000+0x10000];
- }
+ for(i=0;i<0x1000;i++)
+ ROM[i] = PRG[i+op_mode*0x8000+0x10000];
}
MACHINE_RESET_MEMBER(pc9801_state,pc9801rs)
@@ -3516,10 +3079,10 @@ TIMER_DEVICE_CALLBACK_MEMBER( pc9801_state::mouse_irq_cb )
{
m_mouse.freq_index ++;
-// printf("%02x\n",m_mouse.freq_index);
+// logerror("%02x\n",m_mouse.freq_index);
if(m_mouse.freq_index > m_mouse.freq_reg)
{
-// printf("irq %02x\n",m_mouse.freq_reg);
+// logerror("irq %02x\n",m_mouse.freq_reg);
m_mouse.freq_index = 0;
m_pic2->ir5_w(0);
m_pic2->ir5_w(1);
@@ -3527,14 +3090,9 @@ TIMER_DEVICE_CALLBACK_MEMBER( pc9801_state::mouse_irq_cb )
}
}
-WRITE_LINE_MEMBER( pc9801_state::keyboard_irq )
-{
- m_pic1->ir1_w(state);
-}
-
static MACHINE_CONFIG_FRAGMENT( pc9801_keyboard )
MCFG_DEVICE_ADD("keyb", PC9801_KBD, 53)
- MCFG_PC9801_KBD_IRQ_CALLBACK(WRITELINE(pc9801_state, keyboard_irq))
+ MCFG_PC9801_KBD_IRQ_CALLBACK(DEVWRITELINE("pic8259_master", pic8259_device, ir1_w))
MACHINE_CONFIG_END
static MACHINE_CONFIG_FRAGMENT( pc9801_mouse )
@@ -3582,17 +3140,7 @@ static MACHINE_CONFIG_FRAGMENT( pc9801_ide )
MCFG_ATA_INTERFACE_IRQ_HANDLER(DEVWRITELINE("pic8259_slave", pic8259_device, ir1_w))
MACHINE_CONFIG_END
-
-static MACHINE_CONFIG_START( pc9801, pc9801_state )
- MCFG_CPU_ADD("maincpu", I8086, 5000000) //unknown clock
- MCFG_CPU_PROGRAM_MAP(pc9801_map)
- MCFG_CPU_IO_MAP(pc9801_io)
- MCFG_CPU_VBLANK_INT_DRIVER("screen", pc9801_state, pc9801_vrtc_irq)
- MCFG_CPU_IRQ_ACKNOWLEDGE_DEVICE("pic8259_master", pic8259_device, inta_cb)
-
- MCFG_MACHINE_START_OVERRIDE(pc9801_state,pc9801f)
- MCFG_MACHINE_RESET_OVERRIDE(pc9801_state,pc9801f)
-
+static MACHINE_CONFIG_FRAGMENT( pc9801_common )
MCFG_DEVICE_ADD("pit8253", PIT8253, 0)
MCFG_PIT8253_CLK0(MAIN_CLOCK_X1) /* heartbeat IRQ */
MCFG_PIT8253_OUT0_HANDLER(DEVWRITELINE("pic8259_master", pic8259_device, ir0_w))
@@ -3605,10 +3153,8 @@ static MACHINE_CONFIG_START( pc9801, pc9801_state )
MCFG_I8237_OUT_EOP_CB(WRITELINE(pc9801_state, pc9801_tc_w))
MCFG_I8237_IN_MEMR_CB(READ8(pc9801_state, pc9801_dma_read_byte))
MCFG_I8237_OUT_MEMW_CB(WRITE8(pc9801_state, pc9801_dma_write_byte))
- MCFG_I8237_IN_IOR_2_CB(READ8(pc9801_state, fdc_2hd_r))
- MCFG_I8237_IN_IOR_3_CB(READ8(pc9801_state, fdc_2dd_r))
- MCFG_I8237_OUT_IOW_2_CB(WRITE8(pc9801_state, fdc_2hd_w))
- MCFG_I8237_OUT_IOW_3_CB(WRITE8(pc9801_state, fdc_2dd_w))
+ MCFG_I8237_IN_IOR_2_CB(DEVREAD8("upd765_2hd", upd765a_device, mdma_r))
+ MCFG_I8237_OUT_IOW_2_CB(DEVWRITE8("upd765_2hd", upd765a_device, mdma_w))
MCFG_I8237_OUT_DACK_0_CB(WRITELINE(pc9801_state, pc9801_dack0_w))
MCFG_I8237_OUT_DACK_1_CB(WRITELINE(pc9801_state, pc9801_dack1_w))
MCFG_I8237_OUT_DACK_2_CB(WRITELINE(pc9801_state, pc9801_dack2_w))
@@ -3626,44 +3172,29 @@ static MACHINE_CONFIG_START( pc9801, pc9801_state )
/* TODO: check this one */
MCFG_I8255_IN_PORTB_CB(IOPORT("DSW5"))
- MCFG_DEVICE_ADD("ppi8255_fdd", I8255, 0)
- MCFG_I8255_IN_PORTA_CB(READ8(pc9801_state, ppi_fdd_porta_r))
- MCFG_I8255_IN_PORTB_CB(READ8(pc9801_state, ppi_fdd_portb_r))
- MCFG_I8255_IN_PORTC_CB(READ8(pc9801_state, ppi_fdd_portc_r))
- MCFG_I8255_OUT_PORTC_CB(WRITE8(pc9801_state, ppi_fdd_portc_w))
-
MCFG_FRAGMENT_ADD(pc9801_keyboard)
MCFG_FRAGMENT_ADD(pc9801_mouse)
MCFG_FRAGMENT_ADD(pc9801_cbus)
- MCFG_FRAGMENT_ADD(pc9801_sasi)
- MCFG_UPD1990A_ADD(UPD1990A_TAG, XTAL_32_768kHz, NULL, NULL)
MCFG_DEVICE_ADD(UPD8251_TAG, I8251, 0)
- MCFG_UPD765A_ADD("upd765_2hd", false, true)
+ MCFG_UPD765A_ADD("upd765_2hd", true, true)
MCFG_UPD765_INTRQ_CALLBACK(DEVWRITELINE("pic8259_slave", pic8259_device, ir3_w))
MCFG_UPD765_DRQ_CALLBACK(DEVWRITELINE("i8237", am9517a_device, dreq2_w)) MCFG_DEVCB_INVERT
- MCFG_UPD765A_ADD("upd765_2dd", false, true)
- MCFG_UPD765_INTRQ_CALLBACK(WRITELINE(pc9801_state, fdc_2dd_irq))
- MCFG_UPD765_DRQ_CALLBACK(DEVWRITELINE("i8237", am9517a_device, dreq3_w)) MCFG_DEVCB_INVERT
MCFG_FLOPPY_DRIVE_ADD("upd765_2hd:0", pc9801_floppies, "525hd", pc9801_state::floppy_formats)
MCFG_FLOPPY_DRIVE_ADD("upd765_2hd:1", pc9801_floppies, "525hd", pc9801_state::floppy_formats)
- MCFG_FLOPPY_DRIVE_ADD("upd765_2dd:0", pc9801_floppies, "525hd", pc9801_state::floppy_formats)
- MCFG_FLOPPY_DRIVE_ADD("upd765_2dd:1", pc9801_floppies, "525hd", pc9801_state::floppy_formats)
-
- MCFG_SOFTWARE_LIST_ADD("disk_list","pc98")
+ MCFG_DEVICE_ADD("ppi8255_fdd", I8255, 0)
+ MCFG_I8255_IN_PORTA_CB(READ8(pc9801_state, ppi_fdd_porta_r))
+ MCFG_I8255_IN_PORTB_CB(READ8(pc9801_state, ppi_fdd_portb_r))
+ MCFG_I8255_IN_PORTC_CB(READ8(pc9801_state, ppi_fdd_portc_r))
+ MCFG_I8255_OUT_PORTC_CB(WRITE8(pc9801_state, ppi_fdd_portc_w))
- #if 0
- MCFG_RAM_ADD(RAM_TAG)
- MCFG_RAM_DEFAULT_SIZE("128K")
- MCFG_RAM_EXTRA_OPTIONS("256K,384K,512K,640K")
- #endif
+ MCFG_SOFTWARE_LIST_ADD("disk_list","pc98")
/* video hardware */
MCFG_SCREEN_ADD("screen", RASTER)
MCFG_SCREEN_REFRESH_RATE(60)
- MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(2500)) /* not accurate */
MCFG_SCREEN_UPDATE_DRIVER(pc9801_state, screen_update)
MCFG_SCREEN_SIZE(640, 480)
MCFG_SCREEN_VISIBLE_AREA(0, 640-1, 0, 200-1)
@@ -3677,14 +3208,45 @@ static MACHINE_CONFIG_START( pc9801, pc9801_state )
MCFG_DEVICE_ADDRESS_MAP(AS_0, upd7220_2_map)
MCFG_UPD7220_DISPLAY_PIXELS_CALLBACK_OWNER(pc9801_state, hgdc_display_pixels)
- MCFG_PALETTE_ADD("palette", 16)
- MCFG_PALETTE_INIT_OWNER(pc9801_state,pc9801)
- MCFG_GFXDECODE_ADD("gfxdecode", "palette", pc9801)
-
MCFG_SPEAKER_STANDARD_MONO("mono")
MCFG_SOUND_ADD("beeper", BEEP, 0)
MCFG_SOUND_ROUTE(ALL_OUTPUTS,"mono",0.15)
+ MCFG_GFXDECODE_ADD("gfxdecode", "palette", pc9801)
+MACHINE_CONFIG_END
+
+static MACHINE_CONFIG_START( pc9801, pc9801_state )
+ MCFG_CPU_ADD("maincpu", I8086, 5000000) //unknown clock
+ MCFG_CPU_PROGRAM_MAP(pc9801_map)
+ MCFG_CPU_IO_MAP(pc9801_io)
+ MCFG_CPU_VBLANK_INT_DRIVER("screen", pc9801_state, pc9801_vrtc_irq)
+ MCFG_CPU_IRQ_ACKNOWLEDGE_DEVICE("pic8259_master", pic8259_device, inta_cb)
+
+ MCFG_FRAGMENT_ADD(pc9801_common)
+
+ MCFG_MACHINE_START_OVERRIDE(pc9801_state,pc9801f)
+ MCFG_MACHINE_RESET_OVERRIDE(pc9801_state,pc9801f)
+#if 0
+ MCFG_RAM_ADD(RAM_TAG)
+ MCFG_RAM_DEFAULT_SIZE("128K")
+ MCFG_RAM_EXTRA_OPTIONS("256K,384K,512K,640K")
+#endif
+
+ MCFG_UPD765A_ADD("upd765_2dd", false, true)
+ MCFG_UPD765_INTRQ_CALLBACK(WRITELINE(pc9801_state, fdc_2dd_irq))
+ MCFG_UPD765_DRQ_CALLBACK(DEVWRITELINE("i8237", am9517a_device, dreq3_w)) MCFG_DEVCB_INVERT
+ MCFG_FLOPPY_DRIVE_ADD("upd765_2dd:0", pc9801_floppies, "525dd", pc9801_state::floppy_formats)
+ MCFG_FLOPPY_DRIVE_ADD("upd765_2dd:1", pc9801_floppies, "525dd", pc9801_state::floppy_formats)
+
+ MCFG_FRAGMENT_ADD(pc9801_sasi)
+ MCFG_UPD1990A_ADD(UPD1990A_TAG, XTAL_32_768kHz, NULL, NULL)
+
+ MCFG_DEVICE_MODIFY("i8237")
+ MCFG_I8237_IN_IOR_3_CB(DEVREAD8("upd765_2dd", upd765a_device, mdma_r))
+ MCFG_I8237_OUT_IOW_3_CB(DEVWRITE8("upd765_2dd", upd765a_device, mdma_w))
+
+ MCFG_PALETTE_ADD("palette", 16)
+ MCFG_PALETTE_INIT_OWNER(pc9801_state,pc9801)
MACHINE_CONFIG_END
#if 0
@@ -3697,100 +3259,32 @@ MACHINE_CONFIG_END
#endif
static MACHINE_CONFIG_START( pc9801rs, pc9801_state )
- MCFG_CPU_ADD("maincpu", I386, MAIN_CLOCK_X1*8) // unknown clock.
+ MCFG_CPU_ADD("maincpu", I386SX, MAIN_CLOCK_X1*8) // unknown clock.
MCFG_CPU_PROGRAM_MAP(pc9801rs_map)
MCFG_CPU_IO_MAP(pc9801rs_io)
MCFG_CPU_VBLANK_INT_DRIVER("screen", pc9801_state, pc9801_vrtc_irq)
MCFG_CPU_IRQ_ACKNOWLEDGE_DEVICE("pic8259_master", pic8259_device, inta_cb)
+ MCFG_FRAGMENT_ADD(pc9801_common)
+
MCFG_MACHINE_START_OVERRIDE(pc9801_state,pc9801rs)
MCFG_MACHINE_RESET_OVERRIDE(pc9801_state,pc9801rs)
- MCFG_DEVICE_ADD("pit8253", PIT8253, 0)
- MCFG_PIT8253_CLK0(MAIN_CLOCK_X1) /* heartbeat IRQ */
- MCFG_PIT8253_OUT0_HANDLER(DEVWRITELINE("pic8259_master", pic8259_device, ir0_w))
- MCFG_PIT8253_CLK1(MAIN_CLOCK_X1) /* Memory Refresh */
- MCFG_PIT8253_CLK2(MAIN_CLOCK_X1) /* RS-232c */
- MCFG_PIT8253_OUT2_HANDLER(WRITELINE(pc9801_state, write_uart_clock))
-
- MCFG_DEVICE_ADD("i8237", AM9517A, MAIN_CLOCK_X1*8) // unknown clock
- MCFG_I8237_OUT_HREQ_CB(WRITELINE(pc9801_state, pc9801_dma_hrq_changed))
- MCFG_I8237_OUT_EOP_CB(WRITELINE(pc9801_state, pc9801_tc_w))
- MCFG_I8237_IN_MEMR_CB(READ8(pc9801_state, pc9801_dma_read_byte))
- MCFG_I8237_OUT_MEMW_CB(WRITE8(pc9801_state, pc9801_dma_write_byte))
- MCFG_I8237_IN_IOR_2_CB(READ8(pc9801_state, fdc_2hd_r))
- MCFG_I8237_OUT_IOW_2_CB(WRITE8(pc9801_state, fdc_2hd_w))
- MCFG_I8237_OUT_DACK_0_CB(WRITELINE(pc9801_state, pc9801_dack0_w))
- MCFG_I8237_OUT_DACK_1_CB(WRITELINE(pc9801_state, pc9801_dack1_w))
- MCFG_I8237_OUT_DACK_2_CB(WRITELINE(pc9801_state, pc9801_dack2_w))
- MCFG_I8237_OUT_DACK_3_CB(WRITELINE(pc9801_state, pc9801_dack3_w))
- MCFG_PIC8259_ADD( "pic8259_master", INPUTLINE("maincpu", 0), VCC, READ8(pc9801_state,get_slave_ack) )
- MCFG_PIC8259_ADD( "pic8259_slave", DEVWRITELINE("pic8259_master", pic8259_device, ir7_w), GND, NULL ) // TODO: Check ir7_w
-
- MCFG_DEVICE_ADD("ppi8255_sys", I8255, 0)
- MCFG_I8255_IN_PORTA_CB(IOPORT("DSW2"))
- MCFG_I8255_IN_PORTB_CB(IOPORT("DSW1"))
- MCFG_I8255_IN_PORTC_CB(READ8(pc9801_state, ppi_sys_portc_r))
- MCFG_I8255_OUT_PORTC_CB(WRITE8(pc9801_state, ppi_sys_portc_w))
-
- MCFG_DEVICE_ADD("ppi8255_prn", I8255, 0)
- /* TODO: check this one */
- MCFG_I8255_IN_PORTB_CB(IOPORT("DSW5"))
-
- MCFG_DEVICE_ADD("ppi8255_fdd", I8255, 0)
- MCFG_I8255_IN_PORTA_CB(READ8(pc9801_state, ppi_fdd_porta_r))
- MCFG_I8255_IN_PORTB_CB(READ8(pc9801_state, ppi_fdd_portb_r))
- MCFG_I8255_IN_PORTC_CB(READ8(pc9801_state, ppi_fdd_portc_r))
- MCFG_I8255_OUT_PORTC_CB(WRITE8(pc9801_state, ppi_fdd_portc_w))
+ MCFG_DEVICE_MODIFY("i8237")
+ MCFG_DEVICE_CLOCK(MAIN_CLOCK_X1*8); // unknown clock
- MCFG_FRAGMENT_ADD(pc9801_keyboard)
- MCFG_FRAGMENT_ADD(pc9801_mouse)
MCFG_FRAGMENT_ADD(pc9801_ide)
MCFG_UPD4990A_ADD("upd1990a", XTAL_32_768kHz, NULL, NULL)
- MCFG_DEVICE_ADD(UPD8251_TAG, I8251, 0)
-
- MCFG_UPD765A_ADD("upd765_2hd", true, true)
- MCFG_UPD765_INTRQ_CALLBACK(WRITELINE(pc9801_state, pc9801rs_fdc_irq))
- MCFG_UPD765_DRQ_CALLBACK(WRITELINE(pc9801_state, pc9801rs_fdc_drq))
- //"upd765_2dd"
- MCFG_FLOPPY_DRIVE_ADD("upd765_2hd:0", pc9801_floppies, "525hd", pc9801_state::floppy_formats)
- MCFG_FLOPPY_DRIVE_ADD("upd765_2hd:1", pc9801_floppies, "525hd", pc9801_state::floppy_formats)
-
- MCFG_SOFTWARE_LIST_ADD("disk_list","pc98")
-
- MCFG_FRAGMENT_ADD(pc9801_cbus)
MCFG_RAM_ADD(RAM_TAG)
MCFG_RAM_DEFAULT_SIZE("1664K")
MCFG_RAM_EXTRA_OPTIONS("640K,3712K,7808K")
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_REFRESH_RATE(60)
- MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(2500)) /* not accurate */
- MCFG_SCREEN_UPDATE_DRIVER(pc9801_state, screen_update)
- MCFG_SCREEN_SIZE(640, 480)
- MCFG_SCREEN_VISIBLE_AREA(0, 640-1, 0, 200-1)
-
- MCFG_DEVICE_ADD("upd7220_chr", UPD7220, 5000000/2)
- MCFG_DEVICE_ADDRESS_MAP(AS_0, upd7220_1_map)
- MCFG_UPD7220_DRAW_TEXT_CALLBACK_OWNER(pc9801_state, hgdc_draw_text)
- MCFG_UPD7220_VSYNC_CALLBACK(DEVWRITELINE("upd7220_btm", upd7220_device, ext_sync_w))
-
- MCFG_DEVICE_ADD("upd7220_btm", UPD7220, 5000000/2)
+ MCFG_DEVICE_MODIFY("upd7220_btm")
MCFG_DEVICE_ADDRESS_MAP(AS_0, upd7220_grcg_2_map)
- MCFG_UPD7220_DISPLAY_PIXELS_CALLBACK_OWNER(pc9801_state, hgdc_display_pixels)
MCFG_PALETTE_ADD("palette", 16+16)
MCFG_PALETTE_INIT_OWNER(pc9801_state,pc9801)
- MCFG_GFXDECODE_ADD("gfxdecode", "palette", pc9801)
-
- MCFG_SPEAKER_STANDARD_MONO("mono")
-
-// MCFG_SOUND_ADD("opna", YM2608, MAIN_CLOCK_X1*4) // unknown clock / divider
-// MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 1.00)
-
- MCFG_SOUND_ADD("beeper", BEEP, 0)
- MCFG_SOUND_ROUTE(ALL_OUTPUTS,"mono",0.15)
MACHINE_CONFIG_END
static MACHINE_CONFIG_DERIVED( pc9801ux, pc9801rs )
@@ -3805,109 +3299,35 @@ MACHINE_CONFIG_END
static MACHINE_CONFIG_DERIVED( pc9801bx2, pc9801rs )
MCFG_CPU_REPLACE("maincpu",I486,25000000)
- MCFG_CPU_PROGRAM_MAP(pc9801rs_map)
- MCFG_CPU_IO_MAP(pc9801bx2_io)
+ MCFG_CPU_PROGRAM_MAP(pc9821_map)
+ MCFG_CPU_IO_MAP(pc9821_io)
MCFG_CPU_VBLANK_INT_DRIVER("screen", pc9801_state, pc9801_vrtc_irq)
MCFG_CPU_IRQ_ACKNOWLEDGE_DEVICE("pic8259_master", pic8259_device, inta_cb)
MCFG_MACHINE_START_OVERRIDE(pc9801_state,pc9801bx2)
MACHINE_CONFIG_END
-static MACHINE_CONFIG_START( pc9821, pc9801_state )
- MCFG_CPU_ADD("maincpu", I486, 16000000) // unknown clock
+static MACHINE_CONFIG_DERIVED( pc9821, pc9801rs )
+ MCFG_CPU_REPLACE("maincpu", I486, 16000000) // unknown clock
MCFG_CPU_PROGRAM_MAP(pc9821_map)
MCFG_CPU_IO_MAP(pc9821_io)
MCFG_CPU_VBLANK_INT_DRIVER("screen", pc9801_state, pc9801_vrtc_irq)
MCFG_CPU_IRQ_ACKNOWLEDGE_DEVICE("pic8259_master", pic8259_device, inta_cb)
+ MCFG_DEVICE_MODIFY("pit8253")
+ MCFG_PIT8253_CLK0(MAIN_CLOCK_X2)
+ MCFG_PIT8253_CLK1(MAIN_CLOCK_X2)
+ MCFG_PIT8253_CLK2(MAIN_CLOCK_X2)
+
MCFG_MACHINE_START_OVERRIDE(pc9801_state,pc9821)
MCFG_MACHINE_RESET_OVERRIDE(pc9801_state,pc9821)
- MCFG_DEVICE_ADD("pit8253", PIT8253, 0)
- MCFG_PIT8253_CLK0(MAIN_CLOCK_X2) /* heartbeat IRQ */
- MCFG_PIT8253_OUT0_HANDLER(DEVWRITELINE("pic8259_master", pic8259_device, ir0_w))
- MCFG_PIT8253_CLK1(MAIN_CLOCK_X2) /* Memory Refresh */
- MCFG_PIT8253_CLK2(MAIN_CLOCK_X2) /* RS-232c */
- MCFG_PIT8253_OUT2_HANDLER(WRITELINE(pc9801_state, write_uart_clock))
-
- MCFG_DEVICE_ADD("i8237", AM9517A, 16000000) // unknown clock
- MCFG_I8237_OUT_HREQ_CB(WRITELINE(pc9801_state, pc9801_dma_hrq_changed))
- MCFG_I8237_OUT_EOP_CB(WRITELINE(pc9801_state, pc9801_tc_w))
- MCFG_I8237_IN_MEMR_CB(READ8(pc9801_state, pc9801_dma_read_byte))
- MCFG_I8237_OUT_MEMW_CB(WRITE8(pc9801_state, pc9801_dma_write_byte))
- MCFG_I8237_IN_IOR_2_CB(READ8(pc9801_state, fdc_2hd_r))
- MCFG_I8237_OUT_IOW_2_CB(WRITE8(pc9801_state, fdc_2hd_w))
- MCFG_I8237_OUT_DACK_0_CB(WRITELINE(pc9801_state, pc9801_dack0_w))
- MCFG_I8237_OUT_DACK_1_CB(WRITELINE(pc9801_state, pc9801_dack1_w))
- MCFG_I8237_OUT_DACK_2_CB(WRITELINE(pc9801_state, pc9801_dack2_w))
- MCFG_I8237_OUT_DACK_3_CB(WRITELINE(pc9801_state, pc9801_dack3_w))
- MCFG_PIC8259_ADD( "pic8259_master", INPUTLINE("maincpu", 0), VCC, READ8(pc9801_state,get_slave_ack) )
- MCFG_PIC8259_ADD( "pic8259_slave", DEVWRITELINE("pic8259_master", pic8259_device, ir7_w), GND, NULL ) // TODO: Check ir7_w
-
- MCFG_DEVICE_ADD("ppi8255_sys", I8255, 0)
- MCFG_I8255_IN_PORTA_CB(IOPORT("DSW2"))
- MCFG_I8255_IN_PORTB_CB(IOPORT("DSW1"))
- MCFG_I8255_IN_PORTC_CB(READ8(pc9801_state, ppi_sys_portc_r))
- MCFG_I8255_OUT_PORTC_CB(WRITE8(pc9801_state, ppi_sys_portc_w))
-
- MCFG_DEVICE_ADD("ppi8255_prn", I8255, 0)
- /* TODO: check this one */
- MCFG_I8255_IN_PORTB_CB(IOPORT("DSW5"))
-
- MCFG_DEVICE_ADD("ppi8255_fdd", I8255, 0)
- MCFG_I8255_IN_PORTA_CB(READ8(pc9801_state, ppi_fdd_porta_r))
- MCFG_I8255_IN_PORTB_CB(READ8(pc9801_state, ppi_fdd_portb_r))
- MCFG_I8255_IN_PORTC_CB(READ8(pc9801_state, ppi_fdd_portc_r))
- MCFG_I8255_OUT_PORTC_CB(WRITE8(pc9801_state, ppi_fdd_portc_w))
-
- MCFG_FRAGMENT_ADD(pc9801_keyboard)
- MCFG_FRAGMENT_ADD(pc9801_mouse)
- MCFG_FRAGMENT_ADD(pc9801_ide)
- MCFG_UPD4990A_ADD("upd1990a", XTAL_32_768kHz, NULL, NULL)
- MCFG_DEVICE_ADD(UPD8251_TAG, I8251, 0)
-
- MCFG_UPD765A_ADD("upd765_2hd", false, true)
- MCFG_UPD765_INTRQ_CALLBACK(DEVWRITELINE("pic8259_slave", pic8259_device, ir3_w))
- MCFG_UPD765_DRQ_CALLBACK(DEVWRITELINE("i8237", am9517a_device, dreq2_w)) MCFG_DEVCB_INVERT
- //"upd765_2dd"
- MCFG_FLOPPY_DRIVE_ADD("upd765_2hd:0", pc9801_floppies, "525hd", pc9801_state::floppy_formats)
- MCFG_FLOPPY_DRIVE_ADD("upd765_2hd:1", pc9801_floppies, "525hd", pc9801_state::floppy_formats)
-
- MCFG_SOFTWARE_LIST_ADD("disk_list","pc98")
-
- MCFG_FRAGMENT_ADD(pc9801_cbus)
-
- MCFG_RAM_ADD(RAM_TAG)
- MCFG_RAM_DEFAULT_SIZE("1664K")
- MCFG_RAM_EXTRA_OPTIONS("3712K,7808K")
-
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_REFRESH_RATE(60)
- MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(2500)) /* not accurate */
- MCFG_SCREEN_UPDATE_DRIVER(pc9801_state, screen_update)
- MCFG_SCREEN_SIZE(640, 480)
- MCFG_SCREEN_VISIBLE_AREA(0, 640-1, 0, 200-1)
-
- MCFG_DEVICE_ADD("upd7220_chr", UPD7220, 5000000/2)
- MCFG_DEVICE_ADDRESS_MAP(AS_0, upd7220_1_map)
- MCFG_UPD7220_DRAW_TEXT_CALLBACK_OWNER(pc9801_state, hgdc_draw_text)
- MCFG_UPD7220_VSYNC_CALLBACK(DEVWRITELINE("upd7220_btm", upd7220_device, ext_sync_w))
-
- MCFG_DEVICE_ADD("upd7220_btm", UPD7220, 5000000/2)
- MCFG_DEVICE_ADDRESS_MAP(AS_0, upd7220_grcg_2_map)
- MCFG_UPD7220_DISPLAY_PIXELS_CALLBACK_OWNER(pc9801_state, hgdc_display_pixels)
+ MCFG_DEVICE_MODIFY("i8237")
+ MCFG_DEVICE_CLOCK(16000000); // unknown clock
+ MCFG_DEVICE_REMOVE("palette")
MCFG_PALETTE_ADD("palette", 16+16+256)
MCFG_PALETTE_INIT_OWNER(pc9801_state,pc9801)
- MCFG_GFXDECODE_ADD("gfxdecode", "palette", pc9801)
-
- MCFG_SPEAKER_STANDARD_MONO("mono")
-
-// MCFG_SOUND_ADD("opna", YM2608, MAIN_CLOCK_X1*4) // unknown clock / divider
-// MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 1.00)
-
- MCFG_SOUND_ADD("beeper", BEEP, 0)
- MCFG_SOUND_ROUTE(ALL_OUTPUTS,"mono",0.15)
MACHINE_CONFIG_END
static MACHINE_CONFIG_DERIVED( pc9821ap2, pc9821)