trunk/src/mess/drivers/pcd.c
| r243445 | r243446 | |
| 19 | 19 | #include "machine/wd_fdc.h" |
| 20 | 20 | #include "machine/mc146818.h" |
| 21 | 21 | #include "sound/speaker.h" |
| 22 | #include "video/scn2674.h" |
| 22 | 23 | |
| 23 | | |
| 24 | 24 | //************************************************************************** |
| 25 | 25 | // TYPE DEFINITIONS |
| 26 | 26 | //************************************************************************** |
| r243445 | r243446 | |
| 36 | 36 | m_speaker(*this, "speaker"), |
| 37 | 37 | m_sasi(*this, "sasi"), |
| 38 | 38 | m_fdc(*this, "fdc"), |
| 39 | | m_rtc(*this, "rtc") |
| 39 | m_rtc(*this, "rtc"), |
| 40 | m_crtc(*this, "crtc"), |
| 41 | m_vram(*this, "vram"), |
| 42 | m_charram(8*1024) |
| 40 | 43 | { } |
| 41 | 44 | |
| 42 | | DECLARE_WRITE_LINE_MEMBER( pic1_irq ); |
| 43 | | DECLARE_READ8_MEMBER( pic1_slave_ack_r ); |
| 45 | DECLARE_READ8_MEMBER( irq_callback ); |
| 44 | 46 | TIMER_DEVICE_CALLBACK_MEMBER( timer0_tick ); |
| 45 | 47 | DECLARE_WRITE_LINE_MEMBER( i186_timer1_w ); |
| 46 | 48 | |
| 47 | | DECLARE_READ8_MEMBER( crt_data_r ); |
| 48 | | DECLARE_WRITE8_MEMBER( crt_data_w ); |
| 49 | | DECLARE_READ8_MEMBER( crt_status_r ); |
| 49 | DECLARE_READ8_MEMBER( charram_r ); |
| 50 | DECLARE_WRITE8_MEMBER( charram_w ); |
| 51 | DECLARE_READ16_MEMBER( nmi_io_r ); |
| 52 | DECLARE_WRITE16_MEMBER( nmi_io_w ); |
| 53 | DECLARE_READ16_MEMBER( unk_r ); |
| 54 | DECLARE_WRITE16_MEMBER( unk_w ); |
| 55 | DECLARE_READ8_MEMBER( stat_r ); |
| 56 | DECLARE_WRITE8_MEMBER( stat_w ); |
| 57 | DECLARE_READ8_MEMBER( led_r ); |
| 58 | DECLARE_WRITE8_MEMBER( led_w ); |
| 59 | UINT32 screen_update(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect); |
| 50 | 60 | |
| 51 | 61 | protected: |
| 52 | 62 | // driver_device overrides |
| 53 | 63 | virtual void machine_start(); |
| 64 | virtual void machine_reset(); |
| 54 | 65 | |
| 55 | 66 | private: |
| 56 | 67 | required_device<i80186_cpu_device> m_maincpu; |
| r243445 | r243446 | |
| 60 | 71 | required_device<omti5100_device> m_sasi; |
| 61 | 72 | required_device<wd2793_t> m_fdc; |
| 62 | 73 | required_device<mc146818_device> m_rtc; |
| 74 | required_device<scn2674_device> m_crtc; |
| 75 | required_shared_ptr<UINT16> m_vram; |
| 76 | dynamic_buffer m_charram; |
| 77 | UINT8 m_stat, m_led; |
| 63 | 78 | }; |
| 64 | 79 | |
| 65 | 80 | |
| r243445 | r243446 | |
| 67 | 82 | // MACHINE EMULATION |
| 68 | 83 | //************************************************************************** |
| 69 | 84 | |
| 85 | static const gfx_layout pcd_charlayout = |
| 86 | { |
| 87 | 8, 14, /* 8 x 14 characters */ |
| 88 | 512, /* 512 characters */ |
| 89 | 1, /* 1 bits per pixel */ |
| 90 | { 0 }, /* no bitplanes */ |
| 91 | /* x offsets */ |
| 92 | { 0, 1, 2, 3, 4, 5, 6, 7 }, |
| 93 | /* y offsets */ |
| 94 | { 0*8, 1*8, 2*8, 3*8, 4*8, 5*8, 6*8, 7*8, 8*8, 9*8, 10*8, 11*8, 12*8, 13*8, 14*8 }, |
| 95 | 8*16 |
| 96 | }; |
| 70 | 97 | void pcd_state::machine_start() |
| 71 | 98 | { |
| 99 | machine().device<gfxdecode_device>("gfxdecode")->set_gfx(0, global_alloc(gfx_element(machine().device<palette_device>("palette"), pcd_charlayout, m_charram, 0, 2, 0))); |
| 72 | 100 | } |
| 73 | 101 | |
| 74 | | WRITE_LINE_MEMBER( pcd_state::pic1_irq ) |
| 102 | void pcd_state::machine_reset() |
| 75 | 103 | { |
| 76 | | logerror("pic1 irq: %d\n", state); |
| 77 | | m_maincpu->int0_w(state); // ? |
| 104 | m_stat = 0; |
| 105 | m_led = 0; |
| 78 | 106 | } |
| 79 | 107 | |
| 80 | | READ8_MEMBER( pcd_state::pic1_slave_ack_r ) |
| 108 | READ8_MEMBER( pcd_state::irq_callback ) |
| 81 | 109 | { |
| 82 | | if (offset == 0) // irq 0 |
| 83 | | return m_pic2->acknowledge(); |
| 84 | | |
| 85 | | return 0x00; |
| 110 | return (offset ? m_pic2 : m_pic1)->acknowledge(); |
| 86 | 111 | } |
| 87 | 112 | |
| 88 | 113 | TIMER_DEVICE_CALLBACK_MEMBER( pcd_state::timer0_tick ) |
| r243445 | r243446 | |
| 96 | 121 | m_speaker->level_w(state); |
| 97 | 122 | } |
| 98 | 123 | |
| 99 | | READ8_MEMBER( pcd_state::crt_data_r ) |
| 124 | READ8_MEMBER( pcd_state::charram_r ) |
| 100 | 125 | { |
| 101 | | logerror("crt_data_r @ %02x\n", offset); |
| 102 | | return 0xff; |
| 126 | return m_charram[offset >> 1]; |
| 103 | 127 | } |
| 104 | 128 | |
| 105 | | WRITE8_MEMBER( pcd_state::crt_data_w ) |
| 129 | WRITE8_MEMBER( pcd_state::charram_w ) |
| 106 | 130 | { |
| 107 | | logerror("crt_data_w %02x @ %02x\n", data, offset); |
| 131 | m_charram[offset >> 1] = data; |
| 108 | 132 | } |
| 109 | 133 | |
| 110 | | READ8_MEMBER( pcd_state::crt_status_r ) |
| 134 | READ16_MEMBER( pcd_state::nmi_io_r ) |
| 111 | 135 | { |
| 112 | | logerror("crt_status_r @ %02x\n", offset); |
| 113 | | return 0xff; |
| 136 | if(space.debugger_access()) |
| 137 | return 0; |
| 138 | logerror("%s: unmapped %s %04x\n", machine().describe_context(), space.name(), offset << 1); |
| 139 | m_stat |= 8; |
| 140 | m_maincpu->set_input_line(INPUT_LINE_NMI, PULSE_LINE); |
| 141 | return 0; |
| 114 | 142 | } |
| 115 | 143 | |
| 144 | WRITE16_MEMBER( pcd_state::nmi_io_w ) |
| 145 | { |
| 146 | if(space.debugger_access()) |
| 147 | return; |
| 148 | logerror("%s: unmapped %s %04x\n", machine().describe_context(), space.name(), offset << 1); |
| 149 | m_stat |= 8; |
| 150 | m_maincpu->set_input_line(INPUT_LINE_NMI, PULSE_LINE); |
| 151 | } |
| 116 | 152 | |
| 153 | READ16_MEMBER( pcd_state::unk_r ) |
| 154 | { |
| 155 | return 0; |
| 156 | } |
| 157 | |
| 158 | WRITE16_MEMBER( pcd_state::unk_w ) |
| 159 | { |
| 160 | } |
| 161 | |
| 162 | READ8_MEMBER( pcd_state::stat_r ) |
| 163 | { |
| 164 | return m_stat; |
| 165 | } |
| 166 | |
| 167 | WRITE8_MEMBER( pcd_state::stat_w ) |
| 168 | { |
| 169 | m_stat = data; |
| 170 | } |
| 171 | |
| 172 | READ8_MEMBER( pcd_state::led_r ) |
| 173 | { |
| 174 | return m_led; |
| 175 | } |
| 176 | |
| 177 | WRITE8_MEMBER( pcd_state::led_w ) |
| 178 | { |
| 179 | for(int i = 0; i < 6; i++) |
| 180 | logerror("%c", (data & (1 << i)) ? '-' : '*'); |
| 181 | logerror("\n"); |
| 182 | m_led = data; |
| 183 | } |
| 184 | |
| 185 | UINT32 pcd_state::screen_update(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect) |
| 186 | { |
| 187 | //bitmap.fill(0, cliprect); |
| 188 | m_crtc->scn2574_draw(machine(), bitmap, cliprect, m_vram); |
| 189 | return 0; |
| 190 | } |
| 191 | |
| 117 | 192 | //************************************************************************** |
| 118 | 193 | // ADDRESS MAPS |
| 119 | 194 | //************************************************************************** |
| 120 | 195 | |
| 121 | 196 | static ADDRESS_MAP_START( pcd_map, AS_PROGRAM, 16, pcd_state ) |
| 122 | 197 | AM_RANGE(0x00000, 0x3ffff) AM_RAM // fixed 256k for now |
| 198 | AM_RANGE(0xf0000, 0xf7fff) AM_RAM AM_SHARE("vram") |
| 199 | //AM_RANGE(0xf7000, 0xfbfff) AM_READWRITE8(charram_r, charram_w, 0xffff) |
| 123 | 200 | AM_RANGE(0xfc000, 0xfffff) AM_ROM AM_REGION("bios", 0) |
| 201 | AM_RANGE(0x00000, 0xfffff) AM_READWRITE(nmi_io_r, nmi_io_w) |
| 124 | 202 | ADDRESS_MAP_END |
| 125 | 203 | |
| 126 | 204 | static ADDRESS_MAP_START( pcd_io, AS_IO, 16, pcd_state ) |
| 127 | 205 | ADDRESS_MAP_UNMAP_HIGH |
| 128 | 206 | AM_RANGE(0xf000, 0xf7ff) AM_RAM AM_SHARE("nvram") |
| 129 | | AM_RANGE(0xf840, 0xf841) AM_DEVREADWRITE8("pic1", pic8259_device, read, write, 0xff00) |
| 130 | | AM_RANGE(0xf900, 0xf907) AM_DEVREADWRITE8("fdc", wd2793_t, read, write, 0x00ff) |
| 131 | | // AM_RANGE(0xf940, 0xf941) // sasi controller here? |
| 132 | | AM_RANGE(0xf980, 0xf981) AM_READWRITE8(crt_data_r, crt_data_w, 0x00ff) AM_READ8(crt_status_r, 0xff00) |
| 133 | | // AM_RANGE(0xfa00, 0xfa7f) // pcs4-n (peripheral chip select) |
| 207 | AM_RANGE(0xf800, 0xf801) AM_DEVREADWRITE8("pic1", pic8259_device, read, write, 0xffff) |
| 208 | AM_RANGE(0xf820, 0xf821) AM_DEVREADWRITE8("pic2", pic8259_device, read, write, 0xffff) |
| 209 | AM_RANGE(0xf840, 0xf841) AM_READWRITE8(stat_r, stat_w, 0x00ff) |
| 210 | AM_RANGE(0xf840, 0xf841) AM_READWRITE8(led_r, led_w, 0xff00) |
| 211 | AM_RANGE(0xf880, 0xf88f) AM_READWRITE(unk_r, unk_w) // mmu? |
| 212 | AM_RANGE(0xf900, 0xf907) AM_DEVREADWRITE8("fdc", wd2793_t, read, write, 0xffff) |
| 213 | //AM_RANGE(0xf940, 0xf943) scsi |
| 214 | AM_RANGE(0xf9c0, 0xf9c3) AM_DEVREADWRITE8("usart1",mc2661_device,read,write,0xffff) // UARTs |
| 215 | AM_RANGE(0xf9d0, 0xf9d3) AM_DEVREADWRITE8("usart2",mc2661_device,read,write,0xffff) |
| 216 | AM_RANGE(0xf9e0, 0xf9e3) AM_DEVREADWRITE8("usart3",mc2661_device,read,write,0xffff) |
| 217 | AM_RANGE(0xf980, 0xf987) AM_DEVWRITE8("crtc", scn2674_device, mpu4_vid_scn2674_w, 0x00ff) |
| 218 | AM_RANGE(0xf980, 0xf987) AM_DEVREAD8("crtc", scn2674_device, mpu4_vid_scn2674_r, 0xff00) |
| 219 | // AM_RANGE(0xfa00, 0xfa7f) // pcs4-n (peripheral chip select) |
| 220 | AM_RANGE(0x0000, 0xffff) AM_READWRITE(nmi_io_r, nmi_io_w) |
| 134 | 221 | ADDRESS_MAP_END |
| 135 | 222 | |
| 136 | 223 | |
| r243445 | r243446 | |
| 144 | 231 | SLOT_INTERFACE_END |
| 145 | 232 | |
| 146 | 233 | static MACHINE_CONFIG_START( pcd, pcd_state ) |
| 147 | | MCFG_CPU_ADD("maincpu", I80186, XTAL_16MHz / 2) |
| 234 | MCFG_CPU_ADD("maincpu", I80186, XTAL_16MHz) |
| 148 | 235 | MCFG_CPU_PROGRAM_MAP(pcd_map) |
| 149 | 236 | MCFG_CPU_IO_MAP(pcd_io) |
| 150 | 237 | MCFG_80186_TMROUT1_HANDLER(WRITELINE(pcd_state, i186_timer1_w)) |
| 238 | MCFG_80186_IRQ_SLAVE_ACK(READ8(pcd_state, irq_callback)) |
| 151 | 239 | |
| 152 | | MCFG_TIMER_DRIVER_ADD_PERIODIC("timer0_tick", pcd_state, timer0_tick, attotime::from_hz(XTAL_16MHz / 2 / 16)) |
| 240 | MCFG_TIMER_DRIVER_ADD_PERIODIC("timer0_tick", pcd_state, timer0_tick, attotime::from_hz(XTAL_16MHz / 24)) // adjusted to pass post |
| 153 | 241 | |
| 154 | | MCFG_PIC8259_ADD("pic1", WRITELINE(pcd_state, pic1_irq), VCC, READ8(pcd_state, pic1_slave_ack_r)) |
| 155 | | MCFG_PIC8259_ADD("pic2", DEVWRITELINE("pic1", pic8259_device, ir0_w), GND, NULL) |
| 242 | MCFG_PIC8259_ADD("pic1", DEVWRITELINE("maincpu", i80186_cpu_device, int0_w), VCC, NULL) |
| 243 | MCFG_PIC8259_ADD("pic2", DEVWRITELINE("maincpu", i80186_cpu_device, int1_w), VCC, NULL) |
| 156 | 244 | |
| 157 | 245 | #if 0 |
| 158 | 246 | MCFG_RAM_ADD(RAM_TAG) |
| r243445 | r243446 | |
| 167 | 255 | MCFG_OMTI5100_ADD("sasi") |
| 168 | 256 | |
| 169 | 257 | // floppy disk controller |
| 170 | | MCFG_WD2793x_ADD("fdc", XTAL_16MHz/2/8) |
| 258 | MCFG_WD2793x_ADD("fdc", XTAL_16MHz/8) |
| 171 | 259 | MCFG_WD_FDC_INTRQ_CALLBACK(DEVWRITELINE("pic1", pic8259_device, ir6_w)) |
| 172 | 260 | MCFG_WD_FDC_DRQ_CALLBACK(DEVWRITELINE("maincpu", i80186_cpu_device, drq1_w)) |
| 173 | 261 | |
| r243445 | r243446 | |
| 188 | 276 | MCFG_SOUND_ADD("speaker", SPEAKER_SOUND, 0) |
| 189 | 277 | MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.50) |
| 190 | 278 | |
| 279 | // video hardware |
| 280 | MCFG_SCREEN_ADD("screen", RASTER) |
| 281 | MCFG_SCREEN_SIZE(640, 350) |
| 282 | MCFG_SCREEN_VISIBLE_AREA(0, 639, 0, 349) |
| 283 | MCFG_SCREEN_REFRESH_RATE(50) |
| 284 | MCFG_SCREEN_UPDATE_DRIVER(pcd_state, screen_update) |
| 285 | |
| 286 | MCFG_GFXDECODE_ADD("gfxdecode", "palette", empty) |
| 287 | MCFG_PALETTE_ADD_BLACK_AND_WHITE("palette") |
| 288 | |
| 289 | MCFG_SCN2674_VIDEO_ADD("crtc", 0, NULL); |
| 290 | MCFG_SCN2674_GFXDECODE("gfxdecode") |
| 291 | MCFG_SCN2674_PALETTE("palette") |
| 292 | |
| 191 | 293 | // rtc |
| 192 | 294 | MCFG_MC146818_ADD("rtc", XTAL_32_768kHz) |
| 193 | 295 | MCFG_MC146818_IRQ_HANDLER(DEVWRITELINE("pic1", pic8259_device, ir7_w)) |
| r243445 | r243446 | |
| 202 | 304 | ROM_REGION(0x4000, "bios", 0) |
| 203 | 305 | ROM_LOAD16_BYTE("s26361-d359.d42", 0x0001, 0x2000, CRC(e20244dd) SHA1(0ebc5ddb93baacd9106f1917380de58aac64fe73)) |
| 204 | 306 | ROM_LOAD16_BYTE("s26361-d359.d43", 0x0000, 0x2000, CRC(e03db2ec) SHA1(fcae8b0c9e7543706817b0a53872826633361fda)) |
| 307 | ROM_FILL(0xb64, 1, 0xe2) // post expects 0xd0 fdc command to be instant, give it a delay |
| 308 | ROM_FILL(0xb65, 1, 0xfe) |
| 309 | ROM_FILL(0x3ffe, 1, 0xb4) // fix csum |
| 310 | ROM_FILL(0x3fff, 1, 0x22) |
| 205 | 311 | |
| 206 | 312 | // gfx card (scn2674 with 8741), to be moved |
| 207 | 313 | ROM_REGION(0x400, "graphics", 0) |