From 1f75bdc6f6627abfe42f0fbafa576c491e28d053 Mon Sep 17 00:00:00 2001 From: cracyc Date: Thu, 6 Nov 2014 21:21:43 -0600 Subject: (mess) pc9801: cleanup and refactor(nw) --- src/mess/drivers/pc9801.c | 1122 +++++++++++---------------------------------- 1 file changed, 271 insertions(+), 851 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 m_ram; required_device m_gfxdecode; required_device m_palette; + required_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("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("ppi8255_sys")->write(space, (offset & 6) >> 1,data); - } -} - -READ8_MEMBER(pc9801_state::pc9801_40_r) -{ - if((offset & 1) == 0) - { - return machine().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("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("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("ppi8255_fdd")->write(space, (offset & 6) >> 1,data); - } -} - -READ8_MEMBER(pc9801_state::pc9801_60_r) -{ - 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) +WRITE8_MEMBER(pc9801_state::nmi_ctrl_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) -{ - 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) +READ8_MEMBER(pc9801_state::txt_scrl_r) { - 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("upd765_2hd")->msr_r(space, 0, 0xff); - case 2: return machine().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("upd765_2hd:0")->get_device(); - if(floppy && ready) - ready = floppy->ready_r(); - floppy = machine().device("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("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("upd765_2hd")->reset(); + m_fdc_2hd->soft_reset(); m_fdc_2hd_ctrl = data; - pc9801_fdc_2hd_update_ready(NULL, 0); - machine().device("upd765_2hd:0")->get_device()->mon_w(data & 0x40 ? ASSERT_LINE : CLEAR_LINE); - machine().device("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("0")->get_device()->mon_w(data & 8 ? ASSERT_LINE : CLEAR_LINE); + m_fdc_2hd->subdevice("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("upd765_2dd")->msr_r(space, 0, 0xff); - case 2: return machine().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("0")->get_device()->ready_r()) ? 0x10 : 0; + ret |= (m_fdc_2dd->subdevice("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("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("upd765_2dd")->reset(); + m_fdc_2dd->soft_reset(); m_fdc_2dd_ctrl = data; - machine().device("upd765_2dd:0")->get_device()->mon_w(data & 0x08 ? ASSERT_LINE : CLEAR_LINE); - machine().device("upd765_2dd:1")->get_device()->mon_w(data & 0x08 ? ASSERT_LINE : CLEAR_LINE); + m_fdc_2dd->subdevice("0")->get_device()->mon_w(data & 8 ? CLEAR_LINE : ASSERT_LINE); + m_fdc_2dd->subdevice("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("ppi8255_mouse")->read(space, (offset & 6) >> 1); - } -} - -WRITE8_MEMBER(pc9801_state::pc9801_mouse_w) -{ - if((offset & 1) == 0) - { - //return 0xff; - } - else - { - machine().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 / + 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 / AM_RANGE(0x0064, 0x0065) AM_WRITE8(pc9801_vrtc_mask_w,0xffff) AM_RANGE(0x0068, 0x0069) AM_WRITE8(pc9801_video_ff_w,0xffff) //mode FF / // AM_RANGE(0x006c, 0x006f) border color / - 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 / + 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 / // AM_RANGE(0x0188, 0x018b) AM_READWRITE8(pc9801_opn_r,pc9801_opn_w,0xffff) //ym2203 opn / - AM_RANGE(0x7fd8, 0x7fdf) AM_READWRITE8(pc9801_mouse_r,pc9801_mouse_w,0xffff) // / 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) -{ - return pc9801_30_r(space,offset); -} - -READ8_MEMBER(pc9801_state::pc9801rs_70_r) +READ8_MEMBER(pc9801_state::grcg_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("upd765_2hd:0")->get_device()->set_rpm(data & 0x02 ? 360 : 300); - machine().device("upd765_2hd:1")->get_device()->set_rpm(data & 0x02 ? 360 : 300); + m_fdc_2hd->subdevice("0")->get_device()->set_rpm(data & 0x02 ? 360 : 300); + m_fdc_2hd->subdevice("1")->get_device()->set_rpm(data & 0x02 ? 360 : 300); - machine().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("upd765_2hd")->msr_r(space, 0, 0xff); - case 2: return machine().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("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("upd765_2hd")->reset(); + m_fdc_2hd->soft_reset(); - pc9801_fdc_2hd_update_ready(NULL, 0); - - machine().device("upd765_2hd:0")->get_device()->mon_w(data & 0x40 ? ASSERT_LINE : CLEAR_LINE); - machine().device("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("upd765_2hd:0")->get_device()->mon_w(data & 0x08 ? ASSERT_LINE : CLEAR_LINE); -// machine().device("upd765_2hd:1")->get_device()->mon_w(data & 0x08 ? ASSERT_LINE : CLEAR_LINE); + //TODO: verify + if(!(m_fdc_ctrl & 4)) + { + m_fdc_2hd->subdevice("0")->get_device()->mon_w(data & 8 ? CLEAR_LINE : ASSERT_LINE); + m_fdc_2hd->subdevice("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("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) "" // 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,89 +1993,17 @@ READ8_MEMBER( pc9801_state::pc9801rs_midi_r ) return 0xff; } -READ8_MEMBER(pc9801_state::pc9801rs_pit_mirror_r) +READ8_MEMBER(pc9801_state::pic_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 ((offset >= 4) ? m_pic2 : m_pic1)->read(space, offset & 3); +} - return 0xff; +WRITE8_MEMBER(pc9801_state::pic_w) +{ + ((offset >= 4) ? m_pic2 : m_pic1)->write(space, offset & 3, data); } -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 / - AM_RANGE(0x0064, 0x0067) AM_WRITE8(pc9801_vrtc_mask_w, 0xffffffff) - AM_RANGE(0x0068, 0x006b) AM_WRITE8(pc9801rs_video_ff_w,0xffffffff) //mode FF / - 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 / - 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 / - 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) // / pit mirror ports - AM_RANGE(0x7fd8, 0x7fdf) AM_READWRITE8(pc9801_mouse_r, pc9801_mouse_w, 0xffffffff) // / 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); -} - -WRITE8_MEMBER(pc9801_state::pic_w) -{ - ((offset >= 4) ? m_pic2 : m_pic1)->write(space, offset & 3, data); -} - -READ8_MEMBER(pc9801_state::pc9801ux_gvram_r) +READ8_MEMBER(pc9801_state::pc9801ux_gvram_r) { return m_pc9801rs_grcg_r(offset & 0x7fff,(offset>>15)+1); } @@ -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 / - 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 / - 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 / 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 / + 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 / AM_RANGE(0x0064, 0x0067) AM_WRITE8(pc9801_vrtc_mask_w, 0xffffffff) AM_RANGE(0x0068, 0x006b) AM_WRITE8(pc9821_video_ff_w, 0xffffffff) //mode FF / - 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 / + 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 / // AM_RANGE(0x0cfc, 0x0cff) PCI bus - AM_RANGE(0x3fd8, 0x3fdf) AM_READWRITE8(pc9801rs_pit_mirror_r, pc9801rs_pit_mirror_w, 0xffffffff) // / pit mirror ports - AM_RANGE(0x7fd8, 0x7fdf) AM_READWRITE8(pc9801_mouse_r, pc9801_mouse_w, 0xffffffff) // / mouse ppi8255 ports + AM_RANGE(0x3fd8, 0x3fdf) AM_DEVREADWRITE8("pit8253", pit8253_device, read, write, 0xff00ff00) // / 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(":upd765_2hd"); - if (fdc) - { - floppy_image_device *floppy; - floppy = machine().device("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("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(":upd765_2hd:0")->get_device(); - if (floppy) - floppy->mon_w(CLEAR_LINE); - floppy = machine().device(":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) -- cgit v1.2.3