trunk/src/mess/drivers/hp9k_3xx.c
| r0 | r242349 | |
| 1 | // license:BSD-3-Clause |
| 2 | // copyright-holders:R. Belmont |
| 3 | /*************************************************************************** |
| 4 | |
| 5 | hp9k3xx.c: preliminary driver for HP9000 300 Series (aka HP9000/3xx) |
| 6 | |
| 7 | Currently supporting: |
| 8 | |
| 9 | 320: |
| 10 | MC68020 CPU @ 16.67 MHz |
| 11 | HP custom MMU |
| 12 | MC68881 FPU |
| 13 | |
| 14 | 330: |
| 15 | MC68020 CPU @ 16.67 MHz |
| 16 | MC68851 MMU |
| 17 | MC68881 FPU |
| 18 | |
| 19 | All models have an MC6840 PIT on IRQ6 clocked at 250 kHz. |
| 20 | |
| 21 | TODO: |
| 22 | BBCADDR 0x420000 |
| 23 | RTC_DATA: 0x420001 |
| 24 | RTC_CMD: 0x420003 |
| 25 | HIL: 0x428000 |
| 26 | HPIB: 0x478000 |
| 27 | KBDNMIST: 0x478005 |
| 28 | DMA: 0x500000 |
| 29 | FRAMEBUF: 0x560000 |
| 30 | |
| 31 | 6840: 0x5F8001/3/5/7/9, IRQ 6 |
| 32 | |
| 33 | ****************************************************************************/ |
| 34 | |
| 35 | #include "emu.h" |
| 36 | #include "cpu/m68000/m68000.h" |
| 37 | #include "machine/6840ptm.h" |
| 38 | |
| 39 | #define MAINCPU_TAG "maincpu" |
| 40 | #define PTM6840_TAG "ptm" |
| 41 | |
| 42 | class hp9k3xx_state : public driver_device |
| 43 | { |
| 44 | public: |
| 45 | hp9k3xx_state(const machine_config &mconfig, device_type type, const char *tag) |
| 46 | : driver_device(mconfig, type, tag), |
| 47 | m_maincpu(*this, MAINCPU_TAG), |
| 48 | m_vram(*this, "vram") |
| 49 | { } |
| 50 | |
| 51 | required_device<cpu_device> m_maincpu; |
| 52 | virtual void machine_reset(); |
| 53 | |
| 54 | optional_shared_ptr<UINT32> m_vram; |
| 55 | |
| 56 | UINT32 screen_update(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect); |
| 57 | UINT32 hp98544_update(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect); |
| 58 | |
| 59 | DECLARE_READ32_MEMBER(buserror_r); |
| 60 | DECLARE_WRITE32_MEMBER(buserror_w); |
| 61 | |
| 62 | private: |
| 63 | }; |
| 64 | |
| 65 | UINT32 hp9k3xx_state::hp98544_update(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect) |
| 66 | { |
| 67 | UINT32 *scanline; |
| 68 | int x, y; |
| 69 | UINT32 pixels; |
| 70 | UINT32 m_palette[2] = { 0x00000000, 0xffffffff }; |
| 71 | |
| 72 | for (y = 0; y < 768; y++) |
| 73 | { |
| 74 | scanline = &bitmap.pix32(y); |
| 75 | for (x = 0; x < 1024/4; x++) |
| 76 | { |
| 77 | pixels = m_vram[(y * 256) + x]; |
| 78 | |
| 79 | *scanline++ = m_palette[(pixels>>24) & 1]; |
| 80 | *scanline++ = m_palette[(pixels>>16) & 1]; |
| 81 | *scanline++ = m_palette[(pixels>>8) & 1]; |
| 82 | *scanline++ = m_palette[(pixels & 1)]; |
| 83 | } |
| 84 | } |
| 85 | |
| 86 | return 0; |
| 87 | } |
| 88 | |
| 89 | // shared mappings for all 9000/3xx systems |
| 90 | static ADDRESS_MAP_START(hp9k3xx_common, AS_PROGRAM, 32, hp9k3xx_state) |
| 91 | AM_RANGE(0x00000000, 0x0001ffff) AM_ROM AM_REGION("maincpu",0) AM_WRITENOP // writes to 1fffc are the LED |
| 92 | |
| 93 | AM_RANGE(0x00200000, 0x002fffff) AM_RAM AM_SHARE("vram") // 98544 mono framebuffer |
| 94 | AM_RANGE(0x00560000, 0x00563fff) AM_ROM AM_REGION("graphics", 0x0000) // 98544 mono ROM |
| 95 | |
| 96 | AM_RANGE(0x00510000, 0x00510003) AM_READWRITE(buserror_r, buserror_w) // no "Alpha display" |
| 97 | AM_RANGE(0x00538000, 0x00538003) AM_READWRITE(buserror_r, buserror_w) // no "Graphics" |
| 98 | AM_RANGE(0x005c0000, 0x005c0003) AM_READWRITE(buserror_r, buserror_w) // no add-on FP coprocessor |
| 99 | AM_RANGE(0x005f8000, 0x005f800f) AM_DEVREADWRITE8(PTM6840_TAG, ptm6840_device, read, write, 0x00ff00ff) |
| 100 | ADDRESS_MAP_END |
| 101 | |
| 102 | // 9000/320 |
| 103 | static ADDRESS_MAP_START(hp9k320_map, AS_PROGRAM, 32, hp9k3xx_state) |
| 104 | AM_RANGE(0xffe00000, 0xffefffff) AM_READWRITE(buserror_r, buserror_w) |
| 105 | AM_RANGE(0xfff00000, 0xffffffff) AM_RAM |
| 106 | |
| 107 | AM_IMPORT_FROM(hp9k3xx_common) |
| 108 | ADDRESS_MAP_END |
| 109 | |
| 110 | |
| 111 | static ADDRESS_MAP_START(hp9k330_map, AS_PROGRAM, 32, hp9k3xx_state) |
| 112 | AM_RANGE(0xffb00000, 0xffbfffff) AM_READWRITE(buserror_r, buserror_w) |
| 113 | AM_RANGE(0xffc00000, 0xffffffff) AM_RAM |
| 114 | |
| 115 | AM_IMPORT_FROM(hp9k3xx_common) |
| 116 | ADDRESS_MAP_END |
| 117 | |
| 118 | UINT32 hp9k3xx_state::screen_update(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect) |
| 119 | { |
| 120 | return 0; |
| 121 | } |
| 122 | |
| 123 | /* Input ports */ |
| 124 | static INPUT_PORTS_START( hp9k330 ) |
| 125 | INPUT_PORTS_END |
| 126 | |
| 127 | |
| 128 | void hp9k3xx_state::machine_reset() |
| 129 | { |
| 130 | } |
| 131 | |
| 132 | READ32_MEMBER(hp9k3xx_state::buserror_r) |
| 133 | { |
| 134 | m_maincpu->set_input_line(M68K_LINE_BUSERROR, ASSERT_LINE); |
| 135 | m_maincpu->set_input_line(M68K_LINE_BUSERROR, CLEAR_LINE); |
| 136 | return 0; |
| 137 | } |
| 138 | |
| 139 | WRITE32_MEMBER(hp9k3xx_state::buserror_w) |
| 140 | { |
| 141 | m_maincpu->set_input_line(M68K_LINE_BUSERROR, ASSERT_LINE); |
| 142 | m_maincpu->set_input_line(M68K_LINE_BUSERROR, CLEAR_LINE); |
| 143 | } |
| 144 | |
| 145 | static MACHINE_CONFIG_START( hp9k320, hp9k3xx_state ) |
| 146 | /* basic machine hardware */ |
| 147 | MCFG_CPU_ADD(MAINCPU_TAG, M68020, 16670000) |
| 148 | MCFG_CPU_PROGRAM_MAP(hp9k320_map) |
| 149 | |
| 150 | MCFG_DEVICE_ADD(PTM6840_TAG, PTM6840, 0) |
| 151 | MCFG_PTM6840_INTERNAL_CLOCK(250000.0f) // from oscillator module next to the 6840 |
| 152 | MCFG_PTM6840_EXTERNAL_CLOCKS(250000.0f, 250000.0f, 250000.0f) |
| 153 | |
| 154 | MCFG_SCREEN_ADD( "screen", RASTER) |
| 155 | MCFG_SCREEN_UPDATE_DRIVER(hp9k3xx_state, hp98544_update) |
| 156 | MCFG_SCREEN_SIZE(1024,768) |
| 157 | MCFG_SCREEN_VISIBLE_AREA(0, 1024-1, 0, 768-1) |
| 158 | MCFG_SCREEN_REFRESH_RATE(70) |
| 159 | MACHINE_CONFIG_END |
| 160 | |
| 161 | static MACHINE_CONFIG_START( hp9k330, hp9k3xx_state ) |
| 162 | /* basic machine hardware */ |
| 163 | MCFG_CPU_ADD(MAINCPU_TAG, M68020PMMU, 16670000) |
| 164 | MCFG_CPU_PROGRAM_MAP(hp9k330_map) |
| 165 | |
| 166 | MCFG_DEVICE_ADD(PTM6840_TAG, PTM6840, 0) |
| 167 | MCFG_PTM6840_INTERNAL_CLOCK(250000.0f) // from oscillator module next to the 6840 |
| 168 | MCFG_PTM6840_EXTERNAL_CLOCKS(250000.0f, 250000.0f, 250000.0f) |
| 169 | |
| 170 | MCFG_SCREEN_ADD( "screen", RASTER) |
| 171 | MCFG_SCREEN_UPDATE_DRIVER(hp9k3xx_state, hp98544_update) |
| 172 | MCFG_SCREEN_SIZE(1024,768) |
| 173 | MCFG_SCREEN_VISIBLE_AREA(0, 1024-1, 0, 768-1) |
| 174 | MCFG_SCREEN_REFRESH_RATE(70) |
| 175 | MACHINE_CONFIG_END |
| 176 | |
| 177 | ROM_START( hp9k320 ) |
| 178 | ROM_REGION( 0x20000, MAINCPU_TAG, 0 ) |
| 179 | ROM_LOAD16_BYTE( "5061-6538.bin", 0x000001, 0x004000, CRC(d6aafeb1) SHA1(88c6b0b2f504303cbbac0c496c26b85458ac5d63) ) |
| 180 | ROM_LOAD16_BYTE( "5061-6539.bin", 0x000000, 0x004000, CRC(a7ff104c) SHA1(c640fe68314654716bd41b04c6a7f4e560036c7e) ) |
| 181 | ROM_LOAD16_BYTE( "5061-6540.bin", 0x008001, 0x004000, CRC(4f6796d6) SHA1(fd254897ac1afb8628f40ea93213f60a082c8d36) ) |
| 182 | ROM_LOAD16_BYTE( "5061-6541.bin", 0x008000, 0x004000, CRC(39d32998) SHA1(6de1bda75187b0878c03c074942b807cf2924f0e) ) |
| 183 | |
| 184 | ROM_REGION( 0x4000, "graphics", ROMREGION_ERASEFF | ROMREGION_BE | ROMREGION_32BIT ) |
| 185 | ROM_LOAD16_BYTE( "98544_1818-1999.bin", 0x000001, 0x002000, CRC(8c7d6480) SHA1(d2bcfd39452c38bc652df39f84c7041cfdf6bd51) ) |
| 186 | ROM_END |
| 187 | |
| 188 | ROM_START( hp9k330 ) |
| 189 | ROM_REGION( 0x20000, MAINCPU_TAG, 0 ) |
| 190 | ROM_LOAD16_BYTE( "1818-4416.bin", 0x000000, 0x010000, CRC(cd71e85e) SHA1(3e83a80682f733417fdc3720410e45a2cfdcf869) ) |
| 191 | ROM_LOAD16_BYTE( "1818-4417.bin", 0x000001, 0x010000, CRC(374d49db) SHA1(a12cbf6c151e2f421da4571000b5dffa3ef403b3) ) |
| 192 | |
| 193 | ROM_REGION( 0x4000, "graphics", ROMREGION_ERASEFF | ROMREGION_BE | ROMREGION_32BIT ) |
| 194 | ROM_LOAD16_BYTE( "98544_1818-1999.bin", 0x000001, 0x002000, CRC(8c7d6480) SHA1(d2bcfd39452c38bc652df39f84c7041cfdf6bd51) ) |
| 195 | ROM_END |
| 196 | |
| 197 | /* YEAR NAME PARENT COMPAT MACHINE INPUT INIT COMPANY FULLNAME FLAGS */ |
| 198 | COMP( 1985, hp9k320, 0, 0, hp9k320, hp9k330, driver_device, 0, "Hewlett-Packard", "HP9000/320", GAME_NOT_WORKING | GAME_NO_SOUND) |
| 199 | COMP( 1987, hp9k330, 0, 0, hp9k330, hp9k330, driver_device, 0, "Hewlett-Packard", "HP9000/330", GAME_NOT_WORKING | GAME_NO_SOUND) |