src/mess/drivers/rx78.c
| r8616 | r8617 | |
| 1 | | /*************************************************************************** |
| 1 | /************************************************************************************************************ |
| 2 | 2 | |
| 3 | 3 | Gundam RX-78 (c) 1983 Bandai |
| 4 | 4 | |
| 5 | 5 | preliminary driver by Angelo Salese |
| 6 | 6 | |
| 7 | 7 | TODO: |
| 8 | | - caps lock doesn't seem quite right; |
| 9 | | - implement cmt / printer (hovewer no dumps are available right now) |
| 10 | | - implement joystick inputs |
| 8 | - implement cmt (hovewer no dumps are available right now) |
| 9 | - implement printer |
| 10 | - caps lock doesn't seem quite right, I need to press it twice to have the desired effect; |
| 11 | 11 | |
| 12 | | ****************************************************************************/ |
| 12 | Notes: |
| 13 | - BS-BASIC v1.0 have a graphic bug with the RX-78 logo, it doesn't set the read bank so all of the color |
| 14 | info minus plane 1 is lost when the screen scrolls vertically. Almost certainly a btanb. |
| 15 | - To stop a cmt load, press STOP + SHIFT keys |
| 13 | 16 | |
| 17 | *************************************************************************************************************/ |
| 18 | |
| 14 | 19 | #include "emu.h" |
| 15 | 20 | #include "cpu/z80/z80.h" |
| 16 | 21 | #include "sound/sn76496.h" |
| 17 | 22 | #include "devices/cartslot.h" |
| 23 | #include "devices/messram.h" |
| 18 | 24 | |
| 25 | #define MASTER_CLOCK XTAL_28_63636MHz |
| 26 | |
| 19 | 27 | static UINT8 vram_read_bank,vram_write_bank,pal_reg[7],pri_mask; |
| 20 | 28 | |
| 21 | 29 | static VIDEO_START( rx78 ) |
| r8616 | r8617 | |
| 90 | 98 | return res; |
| 91 | 99 | } |
| 92 | 100 | |
| 93 | | if(key_mux >= 1 && key_mux <= 9) |
| 101 | if(key_mux >= 1 && key_mux <= 15) |
| 94 | 102 | return input_port_read(space->machine, keynames[key_mux - 1]); |
| 95 | 103 | |
| 96 | 104 | return 0; |
| r8616 | r8617 | |
| 105 | 113 | { |
| 106 | 114 | static UINT8 *vram = memory_region(space->machine,"vram"); |
| 107 | 115 | |
| 108 | | if(vram_read_bank == 0 || vram_read_bank > 6) |
| 116 | if(vram_read_bank == 0) //|| vram_read_bank > 6) |
| 109 | 117 | return 0xff; |
| 110 | 118 | |
| 111 | 119 | return vram[offset + ((vram_read_bank - 1) * 0x2000)]; |
| r8616 | r8617 | |
| 169 | 177 | pri_mask = data; |
| 170 | 178 | } |
| 171 | 179 | |
| 180 | |
| 172 | 181 | static ADDRESS_MAP_START(rx78_mem, ADDRESS_SPACE_PROGRAM, 8) |
| 173 | 182 | ADDRESS_MAP_UNMAP_HIGH |
| 174 | 183 | AM_RANGE(0x0000, 0x1fff) AM_ROM |
| r8616 | r8617 | |
| 183 | 192 | ADDRESS_MAP_GLOBAL_MASK(0xff) |
| 184 | 193 | // AM_RANGE(0xe2, 0xe2) AM_READNOP AM_WRITENOP //printer |
| 185 | 194 | // AM_RANGE(0xe3, 0xe3) AM_WRITENOP //printer |
| 186 | | // AM_RANGE(0xf0, 0xf0) AM_NOP //cmt |
| 195 | // AM_RANGE(0xf0, 0xf0) AM_READ(cmt_r) //cmt |
| 187 | 196 | AM_RANGE(0xf1, 0xf1) AM_WRITE(vram_read_bank_w) |
| 188 | 197 | AM_RANGE(0xf2, 0xf2) AM_WRITE(vram_write_bank_w) |
| 189 | 198 | AM_RANGE(0xf4, 0xf4) AM_READWRITE(key_r,key_w) //keyboard |
| r8616 | r8617 | |
| 280 | 289 | PORT_BIT(0xf8,IP_ACTIVE_HIGH,IPT_UNUSED ) |
| 281 | 290 | |
| 282 | 291 | PORT_START("JOY1P_0") |
| 283 | | PORT_BIT( 0xff, IP_ACTIVE_HIGH, IPT_UNUSED ) |
| 292 | PORT_BIT( 0x11, IP_ACTIVE_HIGH, IPT_JOYSTICK_UP ) PORT_8WAY PORT_PLAYER(1) |
| 293 | PORT_BIT( 0x22, IP_ACTIVE_HIGH, IPT_OTHER ) PORT_NAME("P1 Up Left") PORT_PLAYER(1) |
| 294 | PORT_BIT( 0x44, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) PORT_8WAY PORT_PLAYER(1) |
| 295 | PORT_BIT( 0x88, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_PLAYER(1) |
| 296 | |
| 284 | 297 | PORT_START("JOY1P_1") |
| 285 | | PORT_BIT( 0xff, IP_ACTIVE_HIGH, IPT_UNUSED ) |
| 298 | PORT_BIT( 0x11, IP_ACTIVE_HIGH, IPT_OTHER ) PORT_NAME("P1 Down Left") PORT_PLAYER(1) |
| 299 | PORT_BIT( 0x22, IP_ACTIVE_HIGH, IPT_OTHER ) PORT_NAME("P1 Up Right") PORT_PLAYER(1) |
| 300 | PORT_BIT( 0x44, IP_ACTIVE_HIGH, IPT_UNUSED ) |
| 301 | PORT_BIT( 0x88, IP_ACTIVE_HIGH, IPT_UNUSED ) |
| 302 | |
| 286 | 303 | PORT_START("JOY1P_2") |
| 287 | | PORT_BIT( 0xff, IP_ACTIVE_HIGH, IPT_UNUSED ) |
| 304 | PORT_BIT( 0x11, IP_ACTIVE_HIGH, IPT_JOYSTICK_DOWN ) PORT_8WAY PORT_PLAYER(1) |
| 305 | PORT_BIT( 0x22, IP_ACTIVE_HIGH, IPT_OTHER ) PORT_NAME("P1 Down Right") PORT_PLAYER(1) |
| 306 | PORT_BIT( 0x44, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) PORT_8WAY PORT_PLAYER(1) |
| 307 | PORT_BIT( 0x88, IP_ACTIVE_HIGH, IPT_BUTTON2 ) PORT_PLAYER(1) |
| 308 | |
| 288 | 309 | PORT_START("JOY2P_0") |
| 289 | | PORT_BIT( 0xff, IP_ACTIVE_HIGH, IPT_UNUSED ) |
| 310 | PORT_BIT( 0x11, IP_ACTIVE_HIGH, IPT_JOYSTICK_UP ) PORT_8WAY PORT_PLAYER(2) |
| 311 | PORT_BIT( 0x22, IP_ACTIVE_HIGH, IPT_OTHER ) PORT_NAME("P2 Up Left") PORT_PLAYER(2) |
| 312 | PORT_BIT( 0x44, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) PORT_8WAY PORT_PLAYER(2) |
| 313 | PORT_BIT( 0x88, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_PLAYER(2) |
| 314 | |
| 290 | 315 | PORT_START("JOY2P_1") |
| 291 | | PORT_BIT( 0xff, IP_ACTIVE_HIGH, IPT_UNUSED ) |
| 316 | PORT_BIT( 0x11, IP_ACTIVE_HIGH, IPT_OTHER ) PORT_NAME("P2 Down Left") PORT_PLAYER(2) |
| 317 | PORT_BIT( 0x22, IP_ACTIVE_HIGH, IPT_OTHER ) PORT_NAME("P2 Up Right") PORT_PLAYER(2) |
| 318 | PORT_BIT( 0x44, IP_ACTIVE_HIGH, IPT_UNUSED ) |
| 319 | PORT_BIT( 0x88, IP_ACTIVE_HIGH, IPT_UNUSED ) |
| 320 | |
| 292 | 321 | PORT_START("JOY2P_2") |
| 293 | | PORT_BIT( 0xff, IP_ACTIVE_HIGH, IPT_UNUSED ) |
| 322 | PORT_BIT( 0x11, IP_ACTIVE_HIGH, IPT_JOYSTICK_DOWN ) PORT_8WAY PORT_PLAYER(2) |
| 323 | PORT_BIT( 0x22, IP_ACTIVE_HIGH, IPT_OTHER ) PORT_NAME("P2 Down Right") PORT_PLAYER(2) |
| 324 | PORT_BIT( 0x44, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) PORT_8WAY PORT_PLAYER(2) |
| 325 | PORT_BIT( 0x88, IP_ACTIVE_HIGH, IPT_BUTTON2 ) PORT_PLAYER(2) |
| 326 | |
| 294 | 327 | PORT_START("UNUSED") |
| 295 | 328 | PORT_BIT( 0xff, IP_ACTIVE_HIGH, IPT_UNUSED ) |
| 296 | 329 | INPUT_PORTS_END |
| r8616 | r8617 | |
| 320 | 353 | |
| 321 | 354 | static MACHINE_DRIVER_START( rx78 ) |
| 322 | 355 | /* basic machine hardware */ |
| 323 | | MDRV_CPU_ADD("maincpu",Z80, XTAL_4MHz) // 4.1mhz |
| 356 | MDRV_CPU_ADD("maincpu",Z80, MASTER_CLOCK/7) // unknown divider |
| 324 | 357 | MDRV_CPU_PROGRAM_MAP(rx78_mem) |
| 325 | 358 | MDRV_CPU_IO_MAP(rx78_io) |
| 326 | 359 | MDRV_CPU_VBLANK_INT("screen",irq0_line_hold) |
| r8616 | r8617 | |
| 329 | 362 | |
| 330 | 363 | /* video hardware */ |
| 331 | 364 | MDRV_SCREEN_ADD("screen", RASTER) |
| 332 | | MDRV_SCREEN_REFRESH_RATE(50) |
| 365 | MDRV_SCREEN_REFRESH_RATE(60) |
| 333 | 366 | MDRV_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(2500)) /* not accurate */ |
| 334 | 367 | MDRV_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) |
| 335 | 368 | MDRV_SCREEN_SIZE(192, 184) |
| 336 | 369 | MDRV_SCREEN_VISIBLE_AREA(0, 192-1, 0, 184-1) |
| 337 | 370 | MDRV_PALETTE_LENGTH(16+1) //+1 for the background color |
| 338 | | // MDRV_PALETTE_INIT(black_and_white) |
| 339 | 371 | MDRV_GFXDECODE(rx78) |
| 340 | 372 | |
| 341 | 373 | MDRV_VIDEO_START(rx78) |
| r8616 | r8617 | |
| 345 | 377 | MDRV_CARTSLOT_EXTENSION_LIST("rom") |
| 346 | 378 | MDRV_CARTSLOT_NOT_MANDATORY |
| 347 | 379 | |
| 380 | MDRV_RAM_ADD("messram") |
| 381 | MDRV_RAM_DEFAULT_SIZE("32k") |
| 382 | MDRV_RAM_EXTRA_OPTIONS("16k") |
| 383 | |
| 348 | 384 | MDRV_SPEAKER_STANDARD_MONO("mono") |
| 349 | 385 | |
| 350 | | MDRV_SOUND_ADD("sn1", SN76489A, 3579545) // unknown divider |
| 386 | MDRV_SOUND_ADD("sn1", SN76489A, XTAL_28_63636MHz/8) // unknown divider |
| 351 | 387 | MDRV_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.50) |
| 352 | 388 | MACHINE_DRIVER_END |
| 353 | 389 | |
| r8616 | r8617 | |
| 362 | 398 | ROM_REGION( 6 * 0x2000, "vram", ROMREGION_ERASE00 ) |
| 363 | 399 | ROM_END |
| 364 | 400 | |
| 401 | static DRIVER_INIT( rx78 ) |
| 402 | { |
| 403 | UINT32 ram_size = messram_get_size(machine->device("messram")); |
| 404 | const address_space *prg = cputag_get_address_space(machine, "maincpu", ADDRESS_SPACE_PROGRAM); |
| 405 | |
| 406 | if(ram_size == 0x4000) |
| 407 | memory_unmap_readwrite(prg, 0x6000, 0xafff, 0, 0); |
| 408 | } |
| 409 | |
| 365 | 410 | /* Driver */ |
| 366 | 411 | |
| 367 | 412 | /* YEAR NAME PARENT COMPAT MACHINE INPUT INIT COMPANY FULLNAME FLAGS */ |
| 368 | | COMP( 1983, rx78, 0, 0, rx78, rx78, 0, "Bandai", "Gundam RX-78", GAME_NOT_WORKING) |
| 413 | COMP( 1983, rx78, 0, 0, rx78, rx78, rx78, "Bandai", "Gundam RX-78", GAME_NOT_WORKING) |
| 369 | 414 | |