trunk/src/mess/drivers/jr200.c
| r20488 | r20489 | |
| 24 | 24 | { |
| 25 | 25 | public: |
| 26 | 26 | jr200_state(const machine_config &mconfig, device_type type, const char *tag) |
| 27 | | : driver_device(mconfig, type, tag) , |
| 28 | | m_vram(*this, "vram"), |
| 29 | | m_cram(*this, "cram"), |
| 30 | | m_mn1271_ram(*this, "mn1271_ram"){ } |
| 27 | : driver_device(mconfig, type, tag) |
| 28 | , m_vram(*this, "vram") |
| 29 | , m_cram(*this, "cram") |
| 30 | , m_mn1271_ram(*this, "mn1271_ram") |
| 31 | , m_maincpu(*this, "maincpu") |
| 32 | , m_beeper(*this, BEEPER_TAG) |
| 33 | , m_pcg(*this, "pcg") |
| 34 | , m_gfx_rom(*this, "gfx_rom") |
| 35 | , m_gfx_ram(*this, "gfx_ram") |
| 36 | , m_row0(*this, "ROW0") |
| 37 | , m_row1(*this, "ROW1") |
| 38 | , m_row2(*this, "ROW2") |
| 39 | , m_row3(*this, "ROW3") |
| 40 | , m_row4(*this, "ROW4") |
| 41 | , m_row5(*this, "ROW5") |
| 42 | , m_row6(*this, "ROW6") |
| 43 | , m_row7(*this, "ROW7") |
| 44 | , m_row8(*this, "ROW8") |
| 45 | , m_row9(*this, "ROW9") |
| 46 | { } |
| 31 | 47 | |
| 32 | 48 | required_shared_ptr<UINT8> m_vram; |
| 33 | 49 | required_shared_ptr<UINT8> m_cram; |
| r20488 | r20489 | |
| 54 | 70 | virtual void palette_init(); |
| 55 | 71 | UINT32 screen_update_jr200(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect); |
| 56 | 72 | TIMER_CALLBACK_MEMBER(timer_d_callback); |
| 73 | |
| 74 | protected: |
| 75 | required_device<cpu_device> m_maincpu; |
| 76 | required_device<device_t> m_beeper; |
| 77 | required_memory_region m_pcg; |
| 78 | required_memory_region m_gfx_rom; |
| 79 | required_memory_region m_gfx_ram; |
| 80 | required_ioport m_row0; |
| 81 | required_ioport m_row1; |
| 82 | required_ioport m_row2; |
| 83 | required_ioport m_row3; |
| 84 | required_ioport m_row4; |
| 85 | required_ioport m_row5; |
| 86 | required_ioport m_row6; |
| 87 | required_ioport m_row7; |
| 88 | required_ioport m_row8; |
| 89 | required_ioport m_row9; |
| 57 | 90 | }; |
| 58 | 91 | |
| 59 | 92 | |
| r20488 | r20489 | |
| 159 | 192 | } |
| 160 | 193 | else // tile mode |
| 161 | 194 | { |
| 162 | | gfx_data = machine().root_device().memregion(attr & 0x40 ? "pcg" : "gfx_ram")->base(); |
| 195 | gfx_data = (attr & 0x40) ? m_pcg->base() : m_gfx_ram->base(); |
| 163 | 196 | |
| 164 | 197 | pen = (gfx_data[(tile*8)+yi]>>(7-xi) & 1) ? (attr & 0x7) : ((attr & 0x38) >> 3); |
| 165 | 198 | } |
| r20488 | r20489 | |
| 175 | 208 | |
| 176 | 209 | READ8_MEMBER(jr200_state::jr200_pcg_1_r) |
| 177 | 210 | { |
| 178 | | UINT8 *pcg = memregion("pcg")->base(); |
| 179 | | |
| 180 | | return pcg[offset+0x000]; |
| 211 | return m_pcg->base()[offset+0x000]; |
| 181 | 212 | } |
| 182 | 213 | |
| 183 | 214 | READ8_MEMBER(jr200_state::jr200_pcg_2_r) |
| 184 | 215 | { |
| 185 | | UINT8 *pcg = memregion("pcg")->base(); |
| 186 | | |
| 187 | | return pcg[offset+0x400]; |
| 216 | return m_pcg->base()[offset+0x400]; |
| 188 | 217 | } |
| 189 | 218 | |
| 190 | 219 | WRITE8_MEMBER(jr200_state::jr200_pcg_1_w) |
| 191 | 220 | { |
| 192 | | UINT8 *pcg = memregion("pcg")->base(); |
| 193 | | |
| 194 | | pcg[offset+0x000] = data; |
| 221 | m_pcg->base()[offset+0x000] = data; |
| 195 | 222 | machine().gfx[1]->mark_dirty((offset+0x000) >> 3); |
| 196 | 223 | } |
| 197 | 224 | |
| 198 | 225 | WRITE8_MEMBER(jr200_state::jr200_pcg_2_w) |
| 199 | 226 | { |
| 200 | | UINT8 *pcg = memregion("pcg")->base(); |
| 201 | | |
| 202 | | pcg[offset+0x400] = data; |
| 227 | m_pcg->base()[offset+0x400] = data; |
| 203 | 228 | machine().gfx[1]->mark_dirty((offset+0x400) >> 3); |
| 204 | 229 | } |
| 205 | 230 | |
| 206 | 231 | READ8_MEMBER(jr200_state::jr200_bios_char_r) |
| 207 | 232 | { |
| 208 | | UINT8 *gfx = memregion("gfx_ram")->base(); |
| 209 | | |
| 210 | | return gfx[offset]; |
| 233 | return m_gfx_ram->base()[offset]; |
| 211 | 234 | } |
| 212 | 235 | |
| 213 | 236 | |
| 214 | 237 | WRITE8_MEMBER(jr200_state::jr200_bios_char_w) |
| 215 | 238 | { |
| 216 | | // UINT8 *gfx = memregion("gfx_ram")->base(); |
| 217 | | |
| 218 | 239 | /* TODO: writing is presumably controlled by an I/O bit */ |
| 219 | | // gfx[offset] = data; |
| 240 | // m_gfx_ram->base()[offset] = data; |
| 220 | 241 | // machine().gfx[0]->mark_dirty(offset >> 3); |
| 221 | 242 | } |
| 222 | 243 | |
| r20488 | r20489 | |
| 230 | 251 | { |
| 231 | 252 | int row, col, table = 0; |
| 232 | 253 | UINT8 keydata = 0; |
| 233 | | static const char *const keynames[] = { "ROW0", "ROW1", "ROW2", "ROW3", "ROW4", "ROW5", "ROW6", "ROW7", "ROW8" }; |
| 234 | 254 | |
| 235 | | if (ioport("ROW9")->read() & 0x07) |
| 255 | if (m_row9->read() & 0x07) |
| 236 | 256 | { |
| 237 | 257 | /* shift, upper case */ |
| 238 | 258 | table = 1; |
| r20488 | r20489 | |
| 241 | 261 | /* scan keyboard */ |
| 242 | 262 | for (row = 0; row < 9; row++) |
| 243 | 263 | { |
| 244 | | UINT8 data = ioport(keynames[row])->read(); |
| 264 | UINT8 data = 0xff; |
| 245 | 265 | |
| 266 | switch ( row ) |
| 267 | { |
| 268 | case 0: data = m_row0->read(); break; |
| 269 | case 1: data = m_row1->read(); break; |
| 270 | case 2: data = m_row2->read(); break; |
| 271 | case 3: data = m_row3->read(); break; |
| 272 | case 4: data = m_row4->read(); break; |
| 273 | case 5: data = m_row5->read(); break; |
| 274 | case 6: data = m_row6->read(); break; |
| 275 | case 7: data = m_row7->read(); break; |
| 276 | case 8: data = m_row8->read(); break; |
| 277 | } |
| 278 | |
| 246 | 279 | for (col = 0; col < 8; col++) |
| 247 | 280 | { |
| 248 | 281 | if (!BIT(data, col)) |
| r20488 | r20489 | |
| 264 | 297 | WRITE8_MEMBER(jr200_state::jr200_beep_w) |
| 265 | 298 | { |
| 266 | 299 | /* writing 0x0e enables the beeper, writing anything else disables it */ |
| 267 | | beep_set_state(machine().device(BEEPER_TAG),((data & 0xf) == 0x0e) ? 1 : 0); |
| 300 | beep_set_state(m_beeper,((data & 0xf) == 0x0e) ? 1 : 0); |
| 268 | 301 | } |
| 269 | 302 | |
| 270 | 303 | WRITE8_MEMBER(jr200_state::jr200_beep_freq_w) |
| r20488 | r20489 | |
| 275 | 308 | |
| 276 | 309 | beep_freq = ((m_freq_reg[0]<<8) | (m_freq_reg[1] & 0xff)) + 1; |
| 277 | 310 | |
| 278 | | beep_set_frequency(machine().device(BEEPER_TAG),84000 / beep_freq); |
| 311 | beep_set_frequency(m_beeper,84000 / beep_freq); |
| 279 | 312 | } |
| 280 | 313 | |
| 281 | 314 | WRITE8_MEMBER(jr200_state::jr200_border_col_w) |
| r20488 | r20489 | |
| 286 | 319 | |
| 287 | 320 | TIMER_CALLBACK_MEMBER(jr200_state::timer_d_callback) |
| 288 | 321 | { |
| 289 | | machine().firstcpu->set_input_line(0, HOLD_LINE); |
| 322 | m_maincpu->set_input_line(0, HOLD_LINE); |
| 290 | 323 | } |
| 291 | 324 | |
| 292 | 325 | READ8_MEMBER(jr200_state::mn1271_io_r) |
| r20488 | r20489 | |
| 483 | 516 | |
| 484 | 517 | void jr200_state::machine_start() |
| 485 | 518 | { |
| 486 | | beep_set_frequency(machine().device(BEEPER_TAG),0); |
| 487 | | beep_set_state(machine().device(BEEPER_TAG),0); |
| 519 | beep_set_frequency(m_beeper,0); |
| 520 | beep_set_state(m_beeper,0); |
| 488 | 521 | m_timer_d = machine().scheduler().timer_alloc(timer_expired_delegate(FUNC(jr200_state::timer_d_callback),this)); |
| 489 | 522 | } |
| 490 | 523 | |
| 491 | 524 | void jr200_state::machine_reset() |
| 492 | 525 | { |
| 493 | | UINT8 *gfx_rom = machine().root_device().memregion("gfx_rom")->base(); |
| 494 | | UINT8 *gfx_ram = memregion("gfx_ram")->base(); |
| 526 | UINT8 *gfx_rom = m_gfx_rom->base(); |
| 527 | UINT8 *gfx_ram = m_gfx_ram->base(); |
| 495 | 528 | int i; |
| 496 | 529 | memset(m_mn1271_ram,0,0x800); |
| 497 | 530 | |