src/mess/drivers/mz6500.c
| r11750 | r11751 | |
| 1 | 1 | /*************************************************************************** |
| 2 | 2 | |
| 3 | | Robotron mz6500 |
| 3 | Sharp MZ-6500 |
| 4 | 4 | |
| 5 | | 04/10/2009 Skeleton driver. |
| 6 | 5 | |
| 7 | | http://www.robotrontechnik.de/index.htm?/html/computer/mz6500.htm |
| 8 | 6 | |
| 9 | 7 | ****************************************************************************/ |
| 10 | 8 | |
| 11 | 9 | #include "emu.h" |
| 12 | 10 | #include "cpu/i86/i86.h" |
| 11 | #include "machine/upd765.h" |
| 12 | #include "video/upd7220.h" |
| 13 | 13 | |
| 14 | 14 | |
| 15 | 15 | class mz6500_state : public driver_device |
| 16 | 16 | { |
| 17 | 17 | public: |
| 18 | 18 | mz6500_state(const machine_config &mconfig, device_type type, const char *tag) |
| 19 | | : driver_device(mconfig, type, tag) { } |
| 19 | : driver_device(mconfig, type, tag), |
| 20 | m_hgdc(*this, "upd7220") |
| 21 | { } |
| 20 | 22 | |
| 23 | required_device<upd7220_device> m_hgdc; |
| 24 | |
| 25 | virtual bool screen_update(screen_device &screen, bitmap_t &bitmap, const rectangle &cliprect); |
| 21 | 26 | }; |
| 22 | 27 | |
| 28 | bool mz6500_state::screen_update(screen_device &screen, bitmap_t &bitmap, const rectangle &cliprect) |
| 29 | { |
| 30 | bitmap_fill(&bitmap, &cliprect, 0); |
| 31 | |
| 32 | /* graphics */ |
| 33 | m_hgdc->update_screen(&bitmap, &cliprect); |
| 34 | |
| 35 | return 0; |
| 36 | } |
| 37 | |
| 38 | static UPD7220_DISPLAY_PIXELS( hgdc_display_pixels ) |
| 39 | { |
| 40 | //mz6500_state *state = device->machine().driver_data<mz6500_state>(); |
| 41 | int xi,gfx[3]; |
| 42 | UINT8 pen; |
| 43 | |
| 44 | gfx[0] = vram[address + 0x00000]; |
| 45 | gfx[1] = vram[address + 0x10000]; |
| 46 | gfx[2] = vram[address + 0x20000]; |
| 47 | |
| 48 | for(xi=0;xi<8;xi++) |
| 49 | { |
| 50 | pen = ((gfx[0] >> (xi)) & 1) ? 1 : 0; |
| 51 | pen|= ((gfx[1] >> (xi)) & 1) ? 2 : 0; |
| 52 | pen|= ((gfx[2] >> (xi)) & 1) ? 4 : 0; |
| 53 | |
| 54 | *BITMAP_ADDR16(bitmap, y, x + xi) = pen; |
| 55 | } |
| 56 | } |
| 57 | |
| 58 | |
| 23 | 59 | static VIDEO_START( mz6500 ) |
| 24 | 60 | { |
| 25 | 61 | } |
| 26 | 62 | |
| 27 | | static SCREEN_UPDATE( mz6500 ) |
| 63 | |
| 64 | static READ8_HANDLER( fdc_r ) |
| 28 | 65 | { |
| 29 | | return 0; |
| 66 | return (offset == 0) ? upd765_status_r(space->machine().device("upd765"),0) : upd765_data_r(space->machine().device("upd765"),0); |
| 30 | 67 | } |
| 31 | 68 | |
| 69 | static WRITE8_HANDLER( fdc_w ) |
| 70 | { |
| 71 | if(offset) |
| 72 | upd765_data_w(space->machine().device("upd765"),0,data); |
| 73 | } |
| 74 | |
| 75 | static READ8_HANDLER( mz6500_vram_r ) |
| 76 | { |
| 77 | mz6500_state *state = space->machine().driver_data<mz6500_state>(); |
| 78 | |
| 79 | return state->m_hgdc->vram_r(*space, offset); |
| 80 | } |
| 81 | |
| 82 | static WRITE8_HANDLER( mz6500_vram_w ) |
| 83 | { |
| 84 | mz6500_state *state = space->machine().driver_data<mz6500_state>(); |
| 85 | |
| 86 | state->m_hgdc->vram_w(*space, offset, data); |
| 87 | } |
| 88 | |
| 32 | 89 | static ADDRESS_MAP_START(mz6500_map, AS_PROGRAM, 16) |
| 33 | 90 | ADDRESS_MAP_UNMAP_HIGH |
| 34 | 91 | AM_RANGE(0x00000,0x9ffff) AM_RAM |
| 35 | 92 | // AM_RANGE(0xa0000,0xbffff) kanji/dictionary ROM |
| 36 | | // AM_RANGE(0xc0000,0xeffff) vram |
| 93 | AM_RANGE(0xc0000,0xeffff) AM_READWRITE8(mz6500_vram_r,mz6500_vram_w,0xffff) |
| 37 | 94 | AM_RANGE(0xfc000,0xfffff) AM_ROM AM_REGION("ipl", 0) |
| 38 | 95 | ADDRESS_MAP_END |
| 39 | 96 | |
| r11750 | r11751 | |
| 41 | 98 | ADDRESS_MAP_UNMAP_HIGH |
| 42 | 99 | // AM_RANGE(0x0000, 0x000f) i8237 dma |
| 43 | 100 | // AM_RANGE(0x0010, 0x001f) i8255 |
| 44 | | // AM_RANGE(0x0020, 0x002f) upd765 |
| 101 | AM_RANGE(0x0020, 0x0021) AM_MIRROR(0xe) AM_READWRITE8(fdc_r,fdc_w,0xffff) |
| 45 | 102 | // AM_RANGE(0x0030, 0x003f) i8259 master |
| 46 | 103 | // AM_RANGE(0x0040, 0x004f) i8259 slave |
| 47 | 104 | // AM_RANGE(0x0050, 0x0050) segment byte for DMA |
| 48 | 105 | // AM_RANGE(0x0060, 0x0060) system port A |
| 49 | 106 | // AM_RANGE(0x0070, 0x0070) system port C |
| 50 | 107 | // AM_RANGE(0x00cd, 0x00cd) MZ-1R32 |
| 51 | | // AM_RANGE(0x0100, 0x010f) upd7220 |
| 108 | AM_RANGE(0x0100, 0x0103) AM_MIRROR(0xc) AM_DEVREADWRITE8_MODERN("upd7220", upd7220_device, read, write, 0x00ff) |
| 52 | 109 | // AM_RANGE(0x0110, 0x011f) video address / data registers (priority) |
| 53 | 110 | // AM_RANGE(0x0120, 0x012f) video registers |
| 54 | 111 | // AM_RANGE(0x0130, 0x013f) video register |
| r11750 | r11751 | |
| 71 | 128 | { |
| 72 | 129 | } |
| 73 | 130 | |
| 131 | static WRITE_LINE_DEVICE_HANDLER( fdc_irq ) |
| 132 | { |
| 133 | //printf("%02x IRQ\n",state); |
| 134 | } |
| 135 | |
| 136 | static WRITE_LINE_DEVICE_HANDLER( fdc_drq ) |
| 137 | { |
| 138 | //printf("%02x DRQ\n",state); |
| 139 | } |
| 140 | |
| 141 | static const struct upd765_interface upd765_intf = |
| 142 | { |
| 143 | DEVCB_LINE(fdc_irq), |
| 144 | DEVCB_LINE(fdc_drq), |
| 145 | NULL, |
| 146 | UPD765_RDY_PIN_CONNECTED, |
| 147 | {FLOPPY_0, FLOPPY_1, NULL, NULL} |
| 148 | }; |
| 149 | |
| 150 | static const floppy_config mz6500_floppy_config = |
| 151 | { |
| 152 | DEVCB_NULL, |
| 153 | DEVCB_NULL, |
| 154 | DEVCB_NULL, |
| 155 | DEVCB_NULL, |
| 156 | DEVCB_NULL, |
| 157 | FLOPPY_STANDARD_5_25_DSHD, |
| 158 | FLOPPY_OPTIONS_NAME(default), |
| 159 | NULL |
| 160 | }; |
| 161 | |
| 162 | |
| 163 | static UPD7220_INTERFACE( hgdc_intf ) |
| 164 | { |
| 165 | "screen", |
| 166 | hgdc_display_pixels, |
| 167 | NULL, |
| 168 | DEVCB_NULL, |
| 169 | DEVCB_NULL, |
| 170 | DEVCB_NULL |
| 171 | }; |
| 172 | |
| 173 | static ADDRESS_MAP_START( upd7220_map, AS_0, 8 ) |
| 174 | AM_RANGE(0x00000, 0x3ffff) AM_DEVREADWRITE_MODERN("upd7220", upd7220_device, vram_r, vram_w) |
| 175 | ADDRESS_MAP_END |
| 176 | |
| 177 | |
| 74 | 178 | static MACHINE_CONFIG_START( mz6500, mz6500_state ) |
| 75 | 179 | /* basic machine hardware */ |
| 76 | 180 | MCFG_CPU_ADD("maincpu", I8086, 4000000) //unk clock |
| r11750 | r11751 | |
| 79 | 183 | |
| 80 | 184 | MCFG_MACHINE_RESET(mz6500) |
| 81 | 185 | |
| 186 | MCFG_UPD765A_ADD("upd765", upd765_intf) |
| 187 | MCFG_FLOPPY_2_DRIVES_ADD(mz6500_floppy_config) |
| 188 | |
| 82 | 189 | /* video hardware */ |
| 83 | 190 | MCFG_SCREEN_ADD("screen", RASTER) |
| 84 | 191 | MCFG_SCREEN_REFRESH_RATE(50) |
| r11750 | r11751 | |
| 86 | 193 | MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) |
| 87 | 194 | MCFG_SCREEN_SIZE(640, 480) |
| 88 | 195 | MCFG_SCREEN_VISIBLE_AREA(0, 640-1, 0, 480-1) |
| 89 | | MCFG_SCREEN_UPDATE(mz6500) |
| 90 | 196 | |
| 91 | | MCFG_PALETTE_LENGTH(2) |
| 92 | | MCFG_PALETTE_INIT(black_and_white) |
| 197 | MCFG_UPD7220_ADD("upd7220", 4000000, hgdc_intf, upd7220_map) |
| 93 | 198 | |
| 199 | MCFG_PALETTE_LENGTH(8) |
| 200 | // MCFG_PALETTE_INIT(black_and_white) |
| 201 | |
| 94 | 202 | MCFG_VIDEO_START(mz6500) |
| 95 | 203 | MACHINE_CONFIG_END |
| 96 | 204 | |
| r11750 | r11751 | |
| 104 | 212 | |
| 105 | 213 | ROM_REGION( 0x40000, "kanji", ROMREGION_ERASEFF ) |
| 106 | 214 | ROM_LOAD( "kanji.rom", 0x0000, 0x40000, CRC(b618e25d) SHA1(1da93337fecde6c0f8a5bd68f3f0b3222a38d63e)) |
| 107 | | |
| 108 | 215 | ROM_END |
| 109 | 216 | |
| 110 | 217 | /* Driver */ |