trunk/src/mess/drivers/hp16500.c
| r242668 | r242669 | |
| 1 | 1 | /*************************************************************************** |
| 2 | 2 | |
| 3 | | Hewlett-Packard HP16500b Logic Analyzer |
| 3 | Hewlett-Packard HP16500a/b/c Logic Analyzer |
| 4 | 4 | |
| 5 | These are weird, the "a" has more in common with the older 1650/1651 |
| 6 | than the 16500b. |
| 7 | |
| 8 | 16500a rev 00.00: |
| 9 | MC68000 @ 10 MHz |
| 10 | MC68A45 CRTC |
| 11 | FDC9793 floppy controller (WD1793 type) |
| 12 | TMS9914A GPIB bus interface |
| 13 | SCN2661 DUART/timer |
| 14 | |
| 15 | IRQ1 = VBL, IRQ2 = 20b007, IRQ3 = ?, IRQ4 = 20d000, IRQ5 = 20d007, |
| 16 | IRQ6 = ?, IRQ7 = ? |
| 17 | |
| 18 | 16500a rev 00.02: |
| 19 | MC68000 @ 10 MHz |
| 20 | MC68A45 CRTC |
| 21 | Z0765A08PSC floppy controller (NEC765 type) |
| 22 | TMS9914A GPIB bus interface |
| 23 | SCN2661 DUART/timer |
| 24 | |
| 25 | 16500b: |
| 5 | 26 | MC68EC030 @ 25 MHz |
| 6 | 27 | |
| 7 | 28 | WD37C65C floppy controller (NEC765 type) |
| r242668 | r242669 | |
| 21 | 42 | |
| 22 | 43 | #include "emu.h" |
| 23 | 44 | #include "cpu/m68000/m68000.h" |
| 45 | #include "video/mc6845.h" |
| 24 | 46 | |
| 25 | 47 | class hp16500_state : public driver_device |
| 26 | 48 | { |
| r242668 | r242669 | |
| 32 | 54 | |
| 33 | 55 | virtual void video_start(); |
| 34 | 56 | UINT32 screen_update_hp16500(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect); |
| 57 | UINT32 screen_update_hp16500a(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect); |
| 35 | 58 | |
| 36 | 59 | required_device<cpu_device> m_maincpu; |
| 37 | 60 | dynamic_array<UINT8> m_vram; |
| r242668 | r242669 | |
| 46 | 69 | DECLARE_WRITE8_MEMBER (val_w); |
| 47 | 70 | DECLARE_READ32_MEMBER(vbl_state_r); |
| 48 | 71 | DECLARE_WRITE32_MEMBER(vbl_ack_w); |
| 72 | DECLARE_WRITE16_MEMBER(vbl_ack16_w); |
| 49 | 73 | |
| 74 | DECLARE_WRITE8_MEMBER(pal_ctrl_w); |
| 75 | DECLARE_WRITE8_MEMBER(pal_r_w); |
| 76 | DECLARE_WRITE8_MEMBER(pal_g_w); |
| 77 | DECLARE_WRITE8_MEMBER(pal_b_w); |
| 78 | |
| 79 | DECLARE_WRITE16_MEMBER(maskval_w); |
| 80 | |
| 81 | DECLARE_WRITE_LINE_MEMBER(vsync_changed); |
| 82 | MC6845_UPDATE_ROW(crtc_update_row); |
| 83 | |
| 50 | 84 | INTERRUPT_GEN_MEMBER(vblank); |
| 51 | 85 | |
| 52 | 86 | private: |
| r242668 | r242669 | |
| 63 | 97 | m_maincpu->set_input_line(M68K_IRQ_1, CLEAR_LINE); |
| 64 | 98 | } |
| 65 | 99 | |
| 100 | WRITE16_MEMBER(hp16500_state::vbl_ack16_w) |
| 101 | { |
| 102 | m_maincpu->set_input_line(M68K_IRQ_1, CLEAR_LINE); |
| 103 | } |
| 104 | |
| 105 | WRITE_LINE_MEMBER( hp16500_state::vsync_changed ) |
| 106 | { |
| 107 | if (state) |
| 108 | { |
| 109 | m_maincpu->set_input_line(M68K_IRQ_1, ASSERT_LINE); |
| 110 | } |
| 111 | } |
| 112 | |
| 113 | MC6845_UPDATE_ROW( hp16500_state::crtc_update_row ) |
| 114 | { |
| 115 | UINT32 *p = &bitmap.pix32(y); |
| 116 | int i, pos; |
| 117 | |
| 118 | pos = y * 144; |
| 119 | |
| 120 | for (i = 0; i < x_count; i++) |
| 121 | { |
| 122 | *p++ = m_palette[m_vram[pos+0x00000]]; |
| 123 | *p++ = m_palette[m_vram[pos+0x10000]]; |
| 124 | *p++ = m_palette[m_vram[pos+0x20000]]; |
| 125 | *p++ = m_palette[m_vram[pos+0x30000]]; |
| 126 | pos++; |
| 127 | *p++ = m_palette[m_vram[pos+0x00000]]; |
| 128 | *p++ = m_palette[m_vram[pos+0x10000]]; |
| 129 | *p++ = m_palette[m_vram[pos+0x20000]]; |
| 130 | *p++ = m_palette[m_vram[pos+0x30000]]; |
| 131 | pos++; |
| 132 | } |
| 133 | } |
| 134 | |
| 135 | WRITE8_MEMBER(hp16500_state::pal_ctrl_w) |
| 136 | { |
| 137 | m_clutoffs = data & 0xf; |
| 138 | } |
| 139 | |
| 140 | |
| 141 | WRITE8_MEMBER(hp16500_state::pal_r_w) |
| 142 | { |
| 143 | m_colors[0] = (data<<4); |
| 144 | m_palette[m_clutoffs] = rgb_t(m_colors[0], m_colors[1], m_colors[2]); |
| 145 | } |
| 146 | |
| 147 | WRITE8_MEMBER(hp16500_state::pal_g_w) |
| 148 | { |
| 149 | m_colors[1] = (data<<4); |
| 150 | m_palette[m_clutoffs] = rgb_t(m_colors[0], m_colors[1], m_colors[2]); |
| 151 | } |
| 152 | |
| 153 | WRITE8_MEMBER(hp16500_state::pal_b_w) |
| 154 | { |
| 155 | m_colors[2] = (data<<4); |
| 156 | m_palette[m_clutoffs] = rgb_t(m_colors[0], m_colors[1], m_colors[2]); |
| 157 | } |
| 158 | |
| 159 | WRITE16_MEMBER(hp16500_state::maskval_w) |
| 160 | { |
| 161 | // by analogy with the string printer code from the 16500b, which |
| 162 | // appears to be a direct port... |
| 163 | m_val = ((data>>8) & 0xff) ^ 0xff; |
| 164 | m_mask = (data & 0xff) ^ 0xff; |
| 165 | } |
| 166 | |
| 167 | static ADDRESS_MAP_START(hp16500a_map, AS_PROGRAM, 16, hp16500_state) |
| 168 | AM_RANGE(0x000000, 0x00ffff) AM_ROM AM_REGION("bios", 0) |
| 169 | |
| 170 | AM_RANGE(0x201000, 0x201001) AM_WRITE(maskval_w) |
| 171 | |
| 172 | AM_RANGE(0x204000, 0x204001) AM_WRITE8(pal_ctrl_w, 0x00ff) |
| 173 | AM_RANGE(0x205000, 0x205001) AM_WRITE8(pal_r_w, 0x00ff) |
| 174 | AM_RANGE(0x206000, 0x206001) AM_WRITE8(pal_g_w, 0x00ff) |
| 175 | AM_RANGE(0x207000, 0x207001) AM_WRITE8(pal_b_w, 0x00ff) |
| 176 | |
| 177 | AM_RANGE(0x20c000, 0x20c001) AM_DEVREADWRITE8("crtc", mc6845_device, status_r, address_w, 0x00ff) |
| 178 | AM_RANGE(0x20c002, 0x20c003) AM_DEVREADWRITE8("crtc", mc6845_device, register_r, register_w, 0x00ff) |
| 179 | |
| 180 | AM_RANGE(0x20e000, 0x20e001) AM_WRITE(vbl_ack16_w) |
| 181 | |
| 182 | AM_RANGE(0x600000, 0x61ffff) AM_WRITE(vram_w) |
| 183 | AM_RANGE(0x600000, 0x67ffff) AM_READ8(vram_r, 0x00ff) |
| 184 | |
| 185 | AM_RANGE(0x980000, 0x9fffff) AM_RAM |
| 186 | |
| 187 | AM_RANGE(0xa70000, 0xa7ffff) AM_RAM |
| 188 | ADDRESS_MAP_END |
| 189 | |
| 190 | UINT32 hp16500_state::screen_update_hp16500a(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect) |
| 191 | { |
| 192 | return 0; |
| 193 | } |
| 194 | |
| 66 | 195 | static ADDRESS_MAP_START(hp16500_map, AS_PROGRAM, 32, hp16500_state) |
| 67 | 196 | AM_RANGE(0x00000000, 0x0001ffff) AM_ROM AM_REGION("bios", 0) |
| 68 | 197 | AM_RANGE(0x0020f000, 0x0020f003) AM_WRITE(palette_w) |
| r242668 | r242669 | |
| 174 | 303 | return 0; |
| 175 | 304 | } |
| 176 | 305 | |
| 306 | static MACHINE_CONFIG_START( hp16500a, hp16500_state ) |
| 307 | /* basic machine hardware */ |
| 308 | MCFG_CPU_ADD("maincpu", M68000, 10000000) |
| 309 | MCFG_CPU_PROGRAM_MAP(hp16500a_map) |
| 310 | |
| 311 | MCFG_SCREEN_ADD("screen", RASTER) |
| 312 | MCFG_SCREEN_RAW_PARAMS(10000000, 0x320, 0, 0x240, 0x19c, 0, 0x170 ) |
| 313 | MCFG_SCREEN_UPDATE_DEVICE( "crtc", mc6845_device, screen_update ) |
| 314 | |
| 315 | MCFG_MC6845_ADD("crtc", MC6845, "screen", 10000000/9) |
| 316 | MCFG_MC6845_SHOW_BORDER_AREA(false) |
| 317 | MCFG_MC6845_CHAR_WIDTH(8) |
| 318 | MCFG_MC6845_UPDATE_ROW_CB(hp16500_state, crtc_update_row) |
| 319 | MCFG_MC6845_OUT_VSYNC_CB(WRITELINE(hp16500_state, vsync_changed)) |
| 320 | |
| 321 | MCFG_SPEAKER_STANDARD_STEREO("lspeaker", "rspeaker") |
| 322 | MACHINE_CONFIG_END |
| 323 | |
| 177 | 324 | static MACHINE_CONFIG_START( hp16500, hp16500_state ) |
| 178 | 325 | /* basic machine hardware */ |
| 179 | 326 | MCFG_CPU_ADD("maincpu", M68EC030, 25000000) |
| r242668 | r242669 | |
| 192 | 339 | static INPUT_PORTS_START( hp16500 ) |
| 193 | 340 | INPUT_PORTS_END |
| 194 | 341 | |
| 342 | ROM_START( hp165ka0 ) |
| 343 | ROM_REGION16_BE(0x20000, "bios", 0) |
| 344 | ROM_LOAD16_BYTE( "16500-80002.bin", 0x000000, 0x008000, CRC(0324b75a) SHA1(837855fce9288139226c914cc0c43061e25b57d2) ) |
| 345 | ROM_LOAD16_BYTE( "16500-80001.bin", 0x000001, 0x008000, CRC(362c8cbf) SHA1(812b79d1a31d09ec632a6842b11548168d82b5e7) ) |
| 346 | ROM_END |
| 347 | |
| 195 | 348 | ROM_START( hp16500b ) |
| 196 | 349 | ROM_REGION32_BE(0x20000, "bios", 0) |
| 197 | | ROM_LOAD32_BYTE( "16500-80014.bin", 0x000000, 0x008000, CRC(35187716) SHA1(82067737892ecd356a5454a43d9ce9b38ac2397f) ) |
| 198 | | ROM_LOAD32_BYTE( "16500-80015.bin", 0x000001, 0x008000, CRC(d8d26c1c) SHA1(b5b956c17c9d6e54519a686b5e4aa733b266bf6f) ) |
| 199 | | ROM_LOAD32_BYTE( "16500-80016.bin", 0x000002, 0x008000, CRC(61457b39) SHA1(f209315ec22a8ee9d44a0ec009b1afb47794bece) ) |
| 200 | | ROM_LOAD32_BYTE( "16500-80017.bin", 0x000003, 0x008000, CRC(e0b1096b) SHA1(426bb9a4756d8087bded4f6b61365d733ffbb09a) ) |
| 350 | ROM_LOAD32_BYTE( "16500-80014.bin", 0x000000, 0x008000, CRC(35187716) SHA1(82067737892ecd356a5454a43d9ce9b38ac2397f) ) |
| 351 | ROM_LOAD32_BYTE( "16500-80015.bin", 0x000001, 0x008000, CRC(d8d26c1c) SHA1(b5b956c17c9d6e54519a686b5e4aa733b266bf6f) ) |
| 352 | ROM_LOAD32_BYTE( "16500-80016.bin", 0x000002, 0x008000, CRC(61457b39) SHA1(f209315ec22a8ee9d44a0ec009b1afb47794bece) ) |
| 353 | ROM_LOAD32_BYTE( "16500-80017.bin", 0x000003, 0x008000, CRC(e0b1096b) SHA1(426bb9a4756d8087bded4f6b61365d733ffbb09a) ) |
| 201 | 354 | ROM_END |
| 202 | 355 | |
| 356 | COMP( 1994, hp165ka0, 0, 0, hp16500a, hp16500, driver_device, 0, "Hewlett Packard", "HP 16500a", GAME_NOT_WORKING|GAME_NO_SOUND) |
| 203 | 357 | COMP( 1994, hp16500b, 0, 0, hp16500, hp16500, driver_device, 0, "Hewlett Packard", "HP 16500b", GAME_NOT_WORKING|GAME_NO_SOUND) |