trunk/src/mess/drivers/pokemini.c
| r32233 | r32234 | |
| 11 | 11 | #include "sound/speaker.h" |
| 12 | 12 | #include "machine/i2cmem.h" |
| 13 | 13 | #include "cpu/minx/minx.h" |
| 14 | | #include "imagedev/cartslot.h" |
| 14 | #include "bus/generic/slot.h" |
| 15 | #include "bus/generic/carts.h" |
| 15 | 16 | #include "rendlay.h" |
| 16 | 17 | |
| 17 | 18 | |
| r32233 | r32234 | |
| 54 | 55 | m_p_ram(*this, "p_ram"), |
| 55 | 56 | m_speaker(*this, "speaker"), |
| 56 | 57 | m_i2cmem(*this, "i2cmem"), |
| 57 | | m_inputs(*this, "INPUTS") { } |
| 58 | m_cart(*this, "cartslot"), |
| 59 | m_inputs(*this, "INPUTS") |
| 60 | { } |
| 58 | 61 | |
| 59 | | required_device<cpu_device> m_maincpu; |
| 60 | | required_shared_ptr<UINT8> m_p_ram; |
| 61 | 62 | UINT8 m_pm_reg[0x100]; |
| 62 | 63 | PRC m_prc; |
| 63 | 64 | TIMERS m_timers; |
| r32233 | r32234 | |
| 67 | 68 | |
| 68 | 69 | UINT32 screen_update(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect); |
| 69 | 70 | DECLARE_PALETTE_INIT(pokemini); |
| 70 | | TIMER_CALLBACK_MEMBER(pokemini_seconds_timer_callback); |
| 71 | | TIMER_CALLBACK_MEMBER(pokemini_256hz_timer_callback); |
| 72 | | TIMER_CALLBACK_MEMBER(pokemini_timer1_callback); |
| 73 | | TIMER_CALLBACK_MEMBER(pokemini_timer1_hi_callback); |
| 74 | | TIMER_CALLBACK_MEMBER(pokemini_timer2_callback); |
| 75 | | TIMER_CALLBACK_MEMBER(pokemini_timer2_hi_callback); |
| 76 | | TIMER_CALLBACK_MEMBER(pokemini_timer3_callback); |
| 77 | | TIMER_CALLBACK_MEMBER(pokemini_timer3_hi_callback); |
| 78 | | TIMER_CALLBACK_MEMBER(pokemini_prc_counter_callback); |
| 79 | | DECLARE_WRITE8_MEMBER(pokemini_hwreg_w); |
| 80 | | DECLARE_READ8_MEMBER(pokemini_hwreg_r); |
| 71 | DECLARE_WRITE8_MEMBER(hwreg_w); |
| 72 | DECLARE_READ8_MEMBER(hwreg_r); |
| 73 | DECLARE_READ8_MEMBER(rom_r); |
| 81 | 74 | DECLARE_DEVICE_IMAGE_LOAD_MEMBER(pokemini_cart); |
| 82 | 75 | |
| 83 | 76 | protected: |
| r32233 | r32234 | |
| 96 | 89 | |
| 97 | 90 | virtual void device_timer(emu_timer &timer, device_timer_id id, int param, void *ptr); |
| 98 | 91 | |
| 92 | required_device<cpu_device> m_maincpu; |
| 93 | required_shared_ptr<UINT8> m_p_ram; |
| 99 | 94 | required_device<speaker_sound_device> m_speaker; |
| 100 | 95 | required_device<i2cmem_device> m_i2cmem; |
| 96 | required_device<generic_slot_device> m_cart; |
| 101 | 97 | required_ioport m_inputs; |
| 102 | 98 | |
| 103 | | void pokemini_check_irqs(); |
| 104 | | void pokemini_update_sound(); |
| 105 | | void pokemini_seconds_timer_callback(); |
| 106 | | void pokemini_256hz_timer_callback(); |
| 107 | | void pokemini_timer1_callback(); |
| 108 | | void pokemini_timer1_hi_callback(); |
| 109 | | void pokemini_timer2_callback(); |
| 110 | | void pokemini_timer2_hi_callback(); |
| 111 | | void pokemini_timer3_callback(); |
| 112 | | void pokemini_timer3_hi_callback(); |
| 113 | | void pokemini_prc_counter_callback(); |
| 99 | void check_irqs(); |
| 100 | void update_sound(); |
| 101 | void seconds_timer_callback(); |
| 102 | void timer_256hz_callback(); |
| 103 | void timer1_callback(); |
| 104 | void timer1_hi_callback(); |
| 105 | void timer2_callback(); |
| 106 | void timer2_hi_callback(); |
| 107 | void timer3_callback(); |
| 108 | void timer3_hi_callback(); |
| 109 | void prc_counter_callback(); |
| 114 | 110 | |
| 115 | 111 | }; |
| 116 | 112 | |
| 117 | 113 | |
| 114 | READ8_MEMBER( pokemini_state::rom_r ) |
| 115 | { |
| 116 | offset += 0x2100; |
| 117 | return m_cart->read_rom(space, offset & 0x1fffff); |
| 118 | } |
| 119 | |
| 118 | 120 | static ADDRESS_MAP_START( pokemini_mem_map, AS_PROGRAM, 8, pokemini_state ) |
| 119 | | AM_RANGE( 0x000000, 0x000FFF ) AM_ROM /* bios */ |
| 120 | | AM_RANGE( 0x001000, 0x001FFF ) AM_RAM AM_SHARE("p_ram") /* VRAM/RAM */ |
| 121 | | AM_RANGE( 0x002000, 0x0020FF ) AM_READWRITE(pokemini_hwreg_r, pokemini_hwreg_w ) /* hardware registers */ |
| 122 | | AM_RANGE( 0x002100, 0x1FFFFF ) AM_ROM /* cartridge area */ |
| 121 | AM_RANGE( 0x000000, 0x000fff ) AM_ROM /* bios */ |
| 122 | AM_RANGE( 0x001000, 0x001fff ) AM_RAM AM_SHARE("p_ram") /* VRAM/RAM */ |
| 123 | AM_RANGE( 0x002000, 0x0020ff ) AM_READWRITE(hwreg_r, hwreg_w) /* hardware registers */ |
| 124 | AM_RANGE( 0x002100, 0x1fffff ) AM_READ(rom_r) /* cartridge area */ |
| 123 | 125 | ADDRESS_MAP_END |
| 124 | 126 | |
| 125 | 127 | |
| r32233 | r32234 | |
| 145 | 147 | } |
| 146 | 148 | |
| 147 | 149 | |
| 148 | | void pokemini_state::pokemini_check_irqs() |
| 150 | void pokemini_state::check_irqs() |
| 149 | 151 | { |
| 150 | 152 | int irq_set[4] = { 1, 0, 0, 0 }; |
| 151 | 153 | int prio, vector; |
| r32233 | r32234 | |
| 298 | 300 | } |
| 299 | 301 | |
| 300 | 302 | |
| 301 | | void pokemini_state::pokemini_update_sound() |
| 303 | void pokemini_state::update_sound() |
| 302 | 304 | { |
| 303 | 305 | /* Check if sound should be muted */ |
| 304 | 306 | if ( m_pm_reg[0x70] & 0x03 ) |
| r32233 | r32234 | |
| 321 | 323 | } |
| 322 | 324 | |
| 323 | 325 | |
| 324 | | void pokemini_state::pokemini_seconds_timer_callback() |
| 326 | void pokemini_state::seconds_timer_callback() |
| 325 | 327 | { |
| 326 | 328 | if ( m_pm_reg[0x08] & 0x01 ) |
| 327 | 329 | { |
| r32233 | r32234 | |
| 338 | 340 | } |
| 339 | 341 | |
| 340 | 342 | |
| 341 | | void pokemini_state::pokemini_256hz_timer_callback() |
| 343 | void pokemini_state::timer_256hz_callback() |
| 342 | 344 | { |
| 343 | 345 | if ( m_pm_reg[0x40] & 0x01 ) |
| 344 | 346 | { |
| r32233 | r32234 | |
| 366 | 368 | } |
| 367 | 369 | } |
| 368 | 370 | |
| 369 | | pokemini_check_irqs(); |
| 371 | check_irqs(); |
| 370 | 372 | } |
| 371 | 373 | } |
| 372 | 374 | } |
| 373 | 375 | |
| 374 | 376 | |
| 375 | | void pokemini_state::pokemini_timer1_callback() |
| 377 | void pokemini_state::timer1_callback() |
| 376 | 378 | { |
| 377 | 379 | m_pm_reg[0x36] -= 1; |
| 378 | 380 | /* Check for underflow of timer */ |
| r32233 | r32234 | |
| 385 | 387 | if ( m_pm_reg[0x37] == 0xFF ) |
| 386 | 388 | { |
| 387 | 389 | m_pm_reg[0x27] |= 0x08; |
| 388 | | pokemini_check_irqs(); |
| 390 | check_irqs(); |
| 389 | 391 | m_pm_reg[0x36] = m_pm_reg[0x32]; |
| 390 | 392 | m_pm_reg[0x37] = m_pm_reg[0x33]; |
| 391 | 393 | } |
| r32233 | r32234 | |
| 393 | 395 | else |
| 394 | 396 | { |
| 395 | 397 | m_pm_reg[0x27] |= 0x04; |
| 396 | | pokemini_check_irqs(); |
| 398 | check_irqs(); |
| 397 | 399 | m_pm_reg[0x36] = m_pm_reg[0x32]; |
| 398 | 400 | } |
| 399 | 401 | } |
| 400 | 402 | } |
| 401 | 403 | |
| 402 | 404 | |
| 403 | | void pokemini_state::pokemini_timer1_hi_callback() |
| 405 | void pokemini_state::timer1_hi_callback() |
| 404 | 406 | { |
| 405 | 407 | m_pm_reg[0x37] -= 1; |
| 406 | 408 | /* Check for underflow of timer */ |
| 407 | 409 | if ( m_pm_reg[0x37] == 0xFF ) |
| 408 | 410 | { |
| 409 | 411 | m_pm_reg[0x27] |= 0x08; |
| 410 | | pokemini_check_irqs(); |
| 412 | check_irqs(); |
| 411 | 413 | m_pm_reg[0x37] = m_pm_reg[0x33]; |
| 412 | 414 | } |
| 413 | 415 | } |
| 414 | 416 | |
| 415 | 417 | |
| 416 | | void pokemini_state::pokemini_timer2_callback() |
| 418 | void pokemini_state::timer2_callback() |
| 417 | 419 | { |
| 418 | 420 | m_pm_reg[0x3E] -= 1; |
| 419 | 421 | /* Check for underflow of timer */ |
| r32233 | r32234 | |
| 426 | 428 | if ( m_pm_reg[0x3F] == 0xFF ) |
| 427 | 429 | { |
| 428 | 430 | m_pm_reg[0x27] |= 0x20; |
| 429 | | pokemini_check_irqs(); |
| 431 | check_irqs(); |
| 430 | 432 | m_pm_reg[0x3E] = m_pm_reg[0x3A]; |
| 431 | 433 | m_pm_reg[0x3F] = m_pm_reg[0x3B]; |
| 432 | 434 | } |
| r32233 | r32234 | |
| 434 | 436 | else |
| 435 | 437 | { |
| 436 | 438 | m_pm_reg[0x27] |= 0x10; |
| 437 | | pokemini_check_irqs(); |
| 439 | check_irqs(); |
| 438 | 440 | m_pm_reg[0x3E] = m_pm_reg[0x3A]; |
| 439 | 441 | } |
| 440 | 442 | } |
| 441 | 443 | } |
| 442 | 444 | |
| 443 | 445 | |
| 444 | | void pokemini_state::pokemini_timer2_hi_callback() |
| 446 | void pokemini_state::timer2_hi_callback() |
| 445 | 447 | { |
| 446 | 448 | m_pm_reg[0x3F] -= 1; |
| 447 | 449 | /* Check for underfow of timer */ |
| 448 | 450 | if ( m_pm_reg[0x3F] == 0xFF ) |
| 449 | 451 | { |
| 450 | 452 | m_pm_reg[0x27] |= 0x20; |
| 451 | | pokemini_check_irqs(); |
| 453 | check_irqs(); |
| 452 | 454 | m_pm_reg[0x3F] = m_pm_reg[0x3B]; |
| 453 | 455 | } |
| 454 | 456 | } |
| 455 | 457 | |
| 456 | 458 | |
| 457 | | void pokemini_state::pokemini_timer3_callback() |
| 459 | void pokemini_state::timer3_callback() |
| 458 | 460 | { |
| 459 | 461 | m_pm_reg[0x4E] -= 1; |
| 460 | 462 | /* Check for underflow of timer */ |
| r32233 | r32234 | |
| 467 | 469 | if ( m_pm_reg[0x4F] == 0xFF ) |
| 468 | 470 | { |
| 469 | 471 | m_pm_reg[0x27] |= 0x02; |
| 470 | | pokemini_check_irqs(); |
| 472 | check_irqs(); |
| 471 | 473 | m_pm_reg[0x4E] = m_pm_reg[0x4A]; |
| 472 | 474 | m_pm_reg[0x4F] = m_pm_reg[0x4B]; |
| 473 | 475 | } |
| r32233 | r32234 | |
| 483 | 485 | if ( ( m_pm_reg[0x4E] == m_pm_reg[0x4C] ) && ( m_pm_reg[0x4F] == m_pm_reg[0x4D] ) ) |
| 484 | 486 | { |
| 485 | 487 | m_pm_reg[0x27] |= 0x01; |
| 486 | | pokemini_check_irqs(); |
| 488 | check_irqs(); |
| 487 | 489 | } |
| 488 | | pokemini_update_sound(); |
| 490 | update_sound(); |
| 489 | 491 | } |
| 490 | 492 | } |
| 491 | 493 | |
| 492 | 494 | |
| 493 | | void pokemini_state::pokemini_timer3_hi_callback() |
| 495 | void pokemini_state::timer3_hi_callback() |
| 494 | 496 | { |
| 495 | 497 | m_pm_reg[0x4F] -= 1; |
| 496 | 498 | /* Check for underflow of timer */ |
| 497 | 499 | if ( m_pm_reg[0x4F] == 0xFF ) |
| 498 | 500 | { |
| 499 | 501 | m_pm_reg[0x27] |= 0x02; |
| 500 | | pokemini_check_irqs(); |
| 502 | check_irqs(); |
| 501 | 503 | m_pm_reg[0x4F] = m_pm_reg[0x4B]; |
| 502 | 504 | } |
| 503 | 505 | |
| r32233 | r32234 | |
| 506 | 508 | if( m_pm_reg[0x4F] == m_pm_reg[0x4D] ) |
| 507 | 509 | { |
| 508 | 510 | m_pm_reg[0x27] |= 0x01; |
| 509 | | pokemini_check_irqs(); |
| 511 | check_irqs(); |
| 510 | 512 | } |
| 511 | | pokemini_update_sound(); |
| 513 | update_sound(); |
| 512 | 514 | } |
| 513 | 515 | } |
| 514 | 516 | |
| 515 | 517 | |
| 516 | | WRITE8_MEMBER(pokemini_state::pokemini_hwreg_w) |
| 518 | WRITE8_MEMBER(pokemini_state::hwreg_w) |
| 517 | 519 | { |
| 518 | 520 | static const int timer_to_cycles_fast[8] = { 2, 8, 32, 64, 128, 256, 1024, 4096 }; |
| 519 | 521 | static const int timer_to_cycles_slow[8] = { 128, 256, 512, 1024, 2048, 4096, 8192, 16384 }; |
| r32233 | r32234 | |
| 902 | 904 | Bit 6-7 R/W VDraw/VBlank trigger Interrupt #1-#2 |
| 903 | 905 | */ |
| 904 | 906 | m_pm_reg[0x20] = data; |
| 905 | | pokemini_check_irqs(); |
| 907 | check_irqs(); |
| 906 | 908 | break; |
| 907 | 909 | case 0x21: /* Event #15-#22 priority |
| 908 | 910 | Bit 0-1 R/W Unknown |
| r32233 | r32234 | |
| 910 | 912 | Bit 4-7 R/W Unknown |
| 911 | 913 | */ |
| 912 | 914 | m_pm_reg[0x21] = data; |
| 913 | | pokemini_check_irqs(); |
| 915 | check_irqs(); |
| 914 | 916 | break; |
| 915 | 917 | case 0x22: /* Event #9-#14 priority |
| 916 | 918 | Bit 0-1 R/W All #9 - #14 events - Interrupt #9-#14 |
| 917 | 919 | Bit 2-7 Unused |
| 918 | 920 | */ |
| 919 | 921 | m_pm_reg[0x22] = data; |
| 920 | | pokemini_check_irqs(); |
| 922 | check_irqs(); |
| 921 | 923 | break; |
| 922 | 924 | case 0x23: /* Event #1-#8 enable |
| 923 | 925 | Bit 0 R/W Timer 3 overflow (mirror) - Enable Interrupt #8 |
| r32233 | r32234 | |
| 930 | 932 | Bit 7 R/W V-Blank trigger - Enable Interrupt #1 |
| 931 | 933 | */ |
| 932 | 934 | m_pm_reg[0x23] = data; |
| 933 | | pokemini_check_irqs(); |
| 935 | check_irqs(); |
| 934 | 936 | break; |
| 935 | 937 | case 0x24: /* Event #9-#12 enable |
| 936 | 938 | Bit 0-5 R/W Unknown |
| 937 | 939 | Bit 6-7 Unused |
| 938 | 940 | */ |
| 939 | 941 | m_pm_reg[0x24] = data; |
| 940 | | pokemini_check_irqs(); |
| 942 | check_irqs(); |
| 941 | 943 | break; |
| 942 | 944 | case 0x25: /* Event #15-#22 enable |
| 943 | 945 | Bit 0 R/W Press key "A" event - Enable interrupt #22 |
| r32233 | r32234 | |
| 950 | 952 | Bit 7 R/W Press power button event - Enable interrupt #15 |
| 951 | 953 | */ |
| 952 | 954 | m_pm_reg[0x25] = data; |
| 953 | | pokemini_check_irqs(); |
| 955 | check_irqs(); |
| 954 | 956 | break; |
| 955 | 957 | case 0x26: /* Event #13-#14 enable |
| 956 | 958 | Bit 0-2 R/W Unknown |
| r32233 | r32234 | |
| 960 | 962 | Bit 7 R/W IR receiver - low to high trigger - Enable interrupt #13 |
| 961 | 963 | */ |
| 962 | 964 | m_pm_reg[0x26] = data; |
| 963 | | pokemini_check_irqs(); |
| 965 | check_irqs(); |
| 964 | 966 | break; |
| 965 | 967 | case 0x27: /* Interrupt active flag #1-#8 |
| 966 | 968 | Bit 0 Timer 3 overflow (mirror) / Clear interrupt #8 |
| r32233 | r32234 | |
| 973 | 975 | Bit 7 VBlank trigger / Clear interrupt #1 |
| 974 | 976 | */ |
| 975 | 977 | m_pm_reg[0x27] &= ~data; |
| 976 | | pokemini_check_irqs(); |
| 978 | check_irqs(); |
| 977 | 979 | return; |
| 978 | 980 | case 0x28: /* Interrupt active flag #9-#12 |
| 979 | 981 | Bit 0-1 Unknown |
| r32233 | r32234 | |
| 984 | 986 | Bit 6-7 Unknown |
| 985 | 987 | */ |
| 986 | 988 | m_pm_reg[0x28] &= ~data; |
| 987 | | pokemini_check_irqs(); |
| 989 | check_irqs(); |
| 988 | 990 | return; |
| 989 | 991 | case 0x29: /* Interrupt active flag #15-#22 |
| 990 | 992 | Bit 0 Press key "A" event / Clear interrupt #22 |
| r32233 | r32234 | |
| 997 | 999 | Bit 7 Press power button event / Clear interrupt #15 |
| 998 | 1000 | */ |
| 999 | 1001 | m_pm_reg[0x29] &= ~data; |
| 1000 | | pokemini_check_irqs(); |
| 1002 | check_irqs(); |
| 1001 | 1003 | return; |
| 1002 | 1004 | case 0x2A: /* Interrupt active flag #13-#14 |
| 1003 | 1005 | Bit 0-5 Unknown |
| r32233 | r32234 | |
| 1005 | 1007 | Bit 7 Unknown / Clear interrupt #13 |
| 1006 | 1008 | */ |
| 1007 | 1009 | m_pm_reg[0x2A] &= ~data; |
| 1008 | | pokemini_check_irqs(); |
| 1010 | check_irqs(); |
| 1009 | 1011 | return; |
| 1010 | 1012 | case 0x30: /* Timer 1 control 1 |
| 1011 | 1013 | Bit 0 R/W Unknown |
| r32233 | r32234 | |
| 1218 | 1220 | m_timers.timer3_hi->enable( 0 ); |
| 1219 | 1221 | } |
| 1220 | 1222 | m_pm_reg[0x48] = data; |
| 1221 | | pokemini_update_sound(); |
| 1223 | update_sound(); |
| 1222 | 1224 | break; |
| 1223 | 1225 | case 0x49: /* Timer 3 control 2 |
| 1224 | 1226 | Bit 0 R/W Unknown |
| r32233 | r32234 | |
| 1244 | 1246 | m_timers.timer3_hi->enable( 0 ); |
| 1245 | 1247 | } |
| 1246 | 1248 | m_pm_reg[0x49] = data; |
| 1247 | | pokemini_update_sound(); |
| 1249 | update_sound(); |
| 1248 | 1250 | break; |
| 1249 | 1251 | case 0x4A: /* Timer 3 preset value (low) |
| 1250 | 1252 | Bit 0-7 R/W Timer 3 preset value bit 0-7 |
| 1251 | 1253 | */ |
| 1252 | 1254 | m_pm_reg[0x4A] = data; |
| 1253 | | pokemini_update_sound(); |
| 1255 | update_sound(); |
| 1254 | 1256 | break; |
| 1255 | 1257 | case 0x4B: /* Timer 3 preset value (high) |
| 1256 | 1258 | Bit 0-7 R/W Timer 3 preset value bit 8-15 |
| 1257 | 1259 | */ |
| 1258 | 1260 | m_pm_reg[0x4B] = data; |
| 1259 | | pokemini_update_sound(); |
| 1261 | update_sound(); |
| 1260 | 1262 | break; |
| 1261 | 1263 | case 0x4C: /* Timer 3 sound-pivot (low) |
| 1262 | 1264 | Bit 0-7 R/W Timer 3 sound-pivot value bit 0-7 |
| 1263 | 1265 | */ |
| 1264 | 1266 | m_pm_reg[0x4C] = data; |
| 1265 | | pokemini_update_sound(); |
| 1267 | update_sound(); |
| 1266 | 1268 | break; |
| 1267 | 1269 | case 0x4D: /* Timer 3 sound-pivot (high) |
| 1268 | 1270 | Bit 0-7 R/W Timer 3 sound-pivot value bit 8-15 |
| r32233 | r32234 | |
| 1273 | 1275 | Pulse-Width of 100% = Same as preset-value |
| 1274 | 1276 | */ |
| 1275 | 1277 | m_pm_reg[0x4D] = data; |
| 1276 | | pokemini_update_sound(); |
| 1278 | update_sound(); |
| 1277 | 1279 | break; |
| 1278 | 1280 | case 0x4E: /* Timer 3 counter (low), read only |
| 1279 | 1281 | Bit 0-7 R/W Timer 3 counter value bit 0-7 |
| r32233 | r32234 | |
| 1323 | 1325 | break; |
| 1324 | 1326 | case 0x70: /* Sound related */ |
| 1325 | 1327 | m_pm_reg[0x70] = data; |
| 1326 | | pokemini_update_sound(); |
| 1328 | update_sound(); |
| 1327 | 1329 | break; |
| 1328 | 1330 | case 0x71: /* Sound volume |
| 1329 | 1331 | Bit 0-1 R/W Sound volume |
| r32233 | r32234 | |
| 1335 | 1337 | Bit 3-7 Unused |
| 1336 | 1338 | */ |
| 1337 | 1339 | m_pm_reg[0x71] = data; |
| 1338 | | pokemini_update_sound(); |
| 1340 | update_sound(); |
| 1339 | 1341 | break; |
| 1340 | 1342 | case 0x80: /* LCD control |
| 1341 | 1343 | Bit 0 R/W Invert colors; 0 - normal, 1 - inverted |
| r32233 | r32234 | |
| 1470 | 1472 | m_pm_reg[offset] = data; |
| 1471 | 1473 | } |
| 1472 | 1474 | |
| 1473 | | READ8_MEMBER(pokemini_state::pokemini_hwreg_r) |
| 1475 | READ8_MEMBER(pokemini_state::hwreg_r) |
| 1474 | 1476 | { |
| 1475 | 1477 | UINT8 data = m_pm_reg[offset]; |
| 1476 | 1478 | |
| r32233 | r32234 | |
| 1496 | 1498 | |
| 1497 | 1499 | DEVICE_IMAGE_LOAD_MEMBER( pokemini_state, pokemini_cart ) |
| 1498 | 1500 | { |
| 1499 | | if (image.software_entry() == NULL) |
| 1500 | | { |
| 1501 | | int size = image.length(); |
| 1501 | UINT32 size = m_cart->common_get_size("rom"); |
| 1502 | 1502 | |
| 1503 | | /* Verify that the image is big enough */ |
| 1504 | | if (size <= 0x2100) |
| 1505 | | { |
| 1506 | | image.seterror(IMAGE_ERROR_UNSPECIFIED, "Invalid ROM image: ROM image is too small"); |
| 1507 | | return IMAGE_INIT_FAIL; |
| 1508 | | } |
| 1509 | | |
| 1510 | | /* Verify that the image is not too big */ |
| 1511 | | if (size > 0x1FFFFF) |
| 1512 | | { |
| 1513 | | image.seterror(IMAGE_ERROR_UNSPECIFIED, "Invalid ROM image: ROM image is too big"); |
| 1514 | | return IMAGE_INIT_FAIL; |
| 1515 | | } |
| 1516 | | |
| 1517 | | /* Skip the first 0x2100 bytes */ |
| 1518 | | image.fseek(0x2100, SEEK_SET); |
| 1519 | | size -= 0x2100; |
| 1520 | | |
| 1521 | | if (size != image.fread( memregion("maincpu")->base() + 0x2100, size)) |
| 1522 | | { |
| 1523 | | image.seterror(IMAGE_ERROR_UNSPECIFIED, "Error occurred while reading ROM image"); |
| 1524 | | return IMAGE_INIT_FAIL; |
| 1525 | | } |
| 1503 | /* Verify that the image is big enough */ |
| 1504 | if (size <= 0x2100) |
| 1505 | { |
| 1506 | image.seterror(IMAGE_ERROR_UNSPECIFIED, "Invalid ROM image: ROM image is too small"); |
| 1507 | return IMAGE_INIT_FAIL; |
| 1526 | 1508 | } |
| 1527 | | else |
| 1509 | |
| 1510 | /* Verify that the image is not too big */ |
| 1511 | if (size > 0x1fffff) |
| 1528 | 1512 | { |
| 1529 | | UINT8 *cart_rom = image.get_software_region("rom"); |
| 1530 | | UINT32 cart_rom_size = image.get_software_region_length("rom"); |
| 1531 | | memcpy(memregion("maincpu")->base() + 0x2100, cart_rom + 0x2100, cart_rom_size - 0x2100); |
| 1513 | image.seterror(IMAGE_ERROR_UNSPECIFIED, "Invalid ROM image: ROM image is too big"); |
| 1514 | return IMAGE_INIT_FAIL; |
| 1532 | 1515 | } |
| 1533 | 1516 | |
| 1517 | m_cart->rom_alloc(size, 1); |
| 1518 | m_cart->common_load_rom(m_cart->get_rom_base(), size, "rom"); |
| 1519 | |
| 1534 | 1520 | return IMAGE_INIT_PASS; |
| 1535 | 1521 | } |
| 1536 | 1522 | |
| 1537 | 1523 | |
| 1538 | | void pokemini_state::pokemini_prc_counter_callback() |
| 1524 | void pokemini_state::prc_counter_callback() |
| 1539 | 1525 | { |
| 1540 | 1526 | address_space &space = m_maincpu->space( AS_PROGRAM ); |
| 1541 | 1527 | m_prc.count++; |
| r32233 | r32234 | |
| 1643 | 1629 | |
| 1644 | 1630 | /* Set PRC Render interrupt */ |
| 1645 | 1631 | m_pm_reg[0x27] |= 0x40; |
| 1646 | | pokemini_check_irqs(); |
| 1632 | check_irqs(); |
| 1647 | 1633 | |
| 1648 | 1634 | /* Check if the rendered data should be copied to the LCD */ |
| 1649 | 1635 | if ( m_prc.copy_enabled ) |
| r32233 | r32234 | |
| 1667 | 1653 | |
| 1668 | 1654 | /* Set PRC Copy interrupt */ |
| 1669 | 1655 | m_pm_reg[0x27] |= 0x80; |
| 1670 | | pokemini_check_irqs(); |
| 1656 | check_irqs(); |
| 1671 | 1657 | } |
| 1672 | 1658 | } |
| 1673 | 1659 | |
| r32233 | r32234 | |
| 1686 | 1672 | |
| 1687 | 1673 | /* Set up timers */ |
| 1688 | 1674 | m_timers.seconds_timer = timer_alloc(TIMER_SECONDS); |
| 1689 | | m_timers.seconds_timer->adjust( attotime::zero, 0, attotime::from_seconds( 1 ) ); |
| 1675 | m_timers.seconds_timer->adjust(attotime::zero, 0, attotime::from_seconds(1)); |
| 1690 | 1676 | |
| 1691 | 1677 | m_timers.hz256_timer = timer_alloc(TIMER_256HZ); |
| 1692 | | m_timers.hz256_timer->adjust( attotime::zero, 0, attotime::from_hz( 256 ) ); |
| 1678 | m_timers.hz256_timer->adjust(attotime::zero, 0, attotime::from_hz(256)); |
| 1693 | 1679 | |
| 1694 | 1680 | m_timers.timer1 = timer_alloc(TIMER_1); |
| 1695 | 1681 | m_timers.timer1_hi = timer_alloc(TIMER_1_HI); |
| r32233 | r32234 | |
| 1707 | 1693 | |
| 1708 | 1694 | void pokemini_state::device_timer(emu_timer &timer, device_timer_id id, int param, void *ptr) |
| 1709 | 1695 | { |
| 1710 | | switch ( id ) |
| 1696 | switch (id) |
| 1711 | 1697 | { |
| 1712 | 1698 | case TIMER_SECONDS: |
| 1713 | | pokemini_seconds_timer_callback(); |
| 1699 | seconds_timer_callback(); |
| 1714 | 1700 | break; |
| 1715 | 1701 | |
| 1716 | 1702 | case TIMER_256HZ: |
| 1717 | | pokemini_256hz_timer_callback(); |
| 1703 | timer_256hz_callback(); |
| 1718 | 1704 | break; |
| 1719 | 1705 | |
| 1720 | 1706 | case TIMER_1: |
| 1721 | | pokemini_timer1_callback(); |
| 1707 | timer1_callback(); |
| 1722 | 1708 | break; |
| 1723 | 1709 | |
| 1724 | 1710 | case TIMER_1_HI: |
| 1725 | | pokemini_timer1_hi_callback(); |
| 1711 | timer1_hi_callback(); |
| 1726 | 1712 | break; |
| 1727 | 1713 | |
| 1728 | 1714 | case TIMER_2: |
| 1729 | | pokemini_timer2_callback(); |
| 1715 | timer2_callback(); |
| 1730 | 1716 | break; |
| 1731 | 1717 | |
| 1732 | 1718 | case TIMER_2_HI: |
| 1733 | | pokemini_timer2_hi_callback(); |
| 1719 | timer2_hi_callback(); |
| 1734 | 1720 | break; |
| 1735 | 1721 | |
| 1736 | 1722 | case TIMER_3: |
| 1737 | | pokemini_timer3_callback(); |
| 1723 | timer3_callback(); |
| 1738 | 1724 | break; |
| 1739 | 1725 | |
| 1740 | 1726 | case TIMER_3_HI: |
| 1741 | | pokemini_timer3_hi_callback(); |
| 1727 | timer3_hi_callback(); |
| 1742 | 1728 | break; |
| 1743 | 1729 | |
| 1744 | 1730 | case TIMER_PRC: |
| 1745 | | pokemini_prc_counter_callback(); |
| 1731 | prc_counter_callback(); |
| 1746 | 1732 | break; |
| 1747 | 1733 | } |
| 1748 | 1734 | } |
| r32233 | r32234 | |
| 1765 | 1751 | |
| 1766 | 1752 | static MACHINE_CONFIG_START( pokemini, pokemini_state ) |
| 1767 | 1753 | /* basic machine hardware */ |
| 1768 | | MCFG_CPU_ADD( "maincpu", MINX, 4000000 ) |
| 1769 | | MCFG_CPU_PROGRAM_MAP( pokemini_mem_map) |
| 1754 | MCFG_CPU_ADD("maincpu", MINX, 4000000) |
| 1755 | MCFG_CPU_PROGRAM_MAP(pokemini_mem_map) |
| 1770 | 1756 | |
| 1771 | 1757 | MCFG_QUANTUM_TIME(attotime::from_hz(60)) |
| 1772 | 1758 | |
| r32233 | r32234 | |
| 1783 | 1769 | |
| 1784 | 1770 | MCFG_DEFAULT_LAYOUT(layout_lcd) |
| 1785 | 1771 | |
| 1786 | | MCFG_PALETTE_ADD( "palette", 4 ) |
| 1772 | MCFG_PALETTE_ADD("palette", 4) |
| 1787 | 1773 | MCFG_PALETTE_INIT_OWNER(pokemini_state, pokemini) |
| 1788 | 1774 | |
| 1789 | 1775 | /* sound hardware */ |
| r32233 | r32234 | |
| 1793 | 1779 | MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.50) |
| 1794 | 1780 | |
| 1795 | 1781 | /* cartridge */ |
| 1796 | | MCFG_CARTSLOT_ADD("cart") |
| 1797 | | MCFG_CARTSLOT_EXTENSION_LIST("min,bin") |
| 1798 | | MCFG_CARTSLOT_NOT_MANDATORY |
| 1799 | | MCFG_CARTSLOT_INTERFACE("pokemini_cart") |
| 1800 | | MCFG_CARTSLOT_LOAD(pokemini_state,pokemini_cart) |
| 1782 | MCFG_GENERIC_CARTSLOT_ADD("cartslot", GENERIC_ROM8_WIDTH, generic_plain_slot, "pokemini_cart") |
| 1783 | MCFG_GENERIC_EXTENSIONS("bin,min") |
| 1784 | MCFG_GENERIC_LOAD(pokemini_state, pokemini_cart) |
| 1801 | 1785 | |
| 1802 | 1786 | /* Software lists */ |
| 1803 | | MCFG_SOFTWARE_LIST_ADD("cart_list","pokemini") |
| 1787 | MCFG_SOFTWARE_LIST_ADD("cart_list", "pokemini") |
| 1804 | 1788 | MACHINE_CONFIG_END |
| 1805 | 1789 | |
| 1806 | 1790 | ROM_START( pokemini ) |
trunk/src/mess/drivers/pasogo.c
| r32233 | r32234 | |
| 101 | 101 | |
| 102 | 102 | #include "emu.h" |
| 103 | 103 | #include "cpu/nec/nec.h" |
| 104 | | #include "imagedev/cartslot.h" |
| 105 | 104 | #include "machine/pic8259.h" |
| 106 | 105 | #include "machine/pit8253.h" |
| 107 | 106 | #include "machine/am9517a.h" |
| 107 | #include "machine/i8255.h" |
| 108 | 108 | #include "sound/speaker.h" |
| 109 | | #include "machine/i8255.h" |
| 109 | #include "bus/generic/slot.h" |
| 110 | #include "bus/generic/carts.h" |
| 110 | 111 | |
| 111 | 112 | |
| 112 | 113 | /* |
| r32233 | r32234 | |
| 156 | 157 | , m_dma8237(*this, "dma8237") |
| 157 | 158 | , m_pit8253(*this, "pit8254") |
| 158 | 159 | , m_speaker(*this, "speaker") |
| 160 | , m_cart(*this, "cartslot") |
| 159 | 161 | { } |
| 160 | 162 | |
| 161 | 163 | required_device<cpu_device> m_maincpu; |
| r32233 | r32234 | |
| 163 | 165 | required_device<am9517a_device> m_dma8237; |
| 164 | 166 | required_device<pit8254_device> m_pit8253; |
| 165 | 167 | required_device<speaker_sound_device> m_speaker; |
| 168 | required_device<generic_slot_device> m_cart; |
| 166 | 169 | |
| 167 | 170 | DECLARE_READ8_MEMBER(ems_r); |
| 168 | 171 | DECLARE_WRITE8_MEMBER(ems_w); |
| r32233 | r32234 | |
| 212 | 215 | UINT8 m_pc_spkrdata; |
| 213 | 216 | UINT8 m_pit_out2; |
| 214 | 217 | |
| 218 | memory_region *m_maincpu_rom; |
| 219 | memory_region *m_cart_rom; |
| 220 | |
| 215 | 221 | int m_ppi_portc_switch_high; |
| 216 | 222 | int m_ppi_speaker; |
| 217 | 223 | int m_ppi_keyboard_clear; |
| r32233 | r32234 | |
| 507 | 513 | case 0: /*external*/ |
| 508 | 514 | case 1: /*ram*/ |
| 509 | 515 | sprintf(bank, "bank%d", m_ems.index + 1); |
| 510 | | membank( bank )->set_base( memregion("maincpu")->base() + (m_ems.mapper[m_ems.index].address & 0xfffff) ); |
| 516 | membank(bank)->set_base(m_maincpu_rom->base() + (m_ems.mapper[m_ems.index].address & 0xfffff)); |
| 511 | 517 | break; |
| 512 | 518 | case 3: /* rom 1 */ |
| 513 | 519 | case 4: /* pc card a */ |
| r32233 | r32234 | |
| 516 | 522 | break; |
| 517 | 523 | case 2: |
| 518 | 524 | sprintf(bank, "bank%d", m_ems.index + 1); |
| 519 | | membank( bank )->set_base( memregion("user1")->base() + (m_ems.mapper[m_ems.index].address & 0xfffff) ); |
| 525 | membank(bank)->set_base(m_cart_rom->base() + (m_ems.mapper[m_ems.index].address & 0xfffff)); |
| 520 | 526 | break; |
| 521 | 527 | } |
| 522 | 528 | break; |
| r32233 | r32234 | |
| 564 | 570 | // ADDRESS_MAP_GLOBAL_MASK(0xfFFF) |
| 565 | 571 | AM_RANGE(0x0000, 0x001f) AM_DEVREADWRITE8("dma8237", am9517a_device, read, write, 0xffff) |
| 566 | 572 | AM_RANGE(0x0020, 0x0021) AM_DEVREADWRITE8("pic8259", pic8259_device, read, write, 0xffff) |
| 567 | | AM_RANGE(0x26, 0x27) AM_READWRITE8(vg230_io_r, vg230_io_w, 0xffff ) |
| 573 | AM_RANGE(0x26, 0x27) AM_READWRITE8(vg230_io_r, vg230_io_w, 0xffff) |
| 568 | 574 | AM_RANGE(0x0040, 0x0043) AM_DEVREADWRITE8("pit8254", pit8254_device, read, write, 0xffff) |
| 569 | 575 | AM_RANGE(0x0060, 0x0063) AM_DEVREADWRITE8("ppi8255", i8255_device, read, write, 0xffff) |
| 570 | | AM_RANGE(0x6c, 0x6f) AM_READWRITE8(ems_r, ems_w, 0xffff ) |
| 576 | AM_RANGE(0x6c, 0x6f) AM_READWRITE8(ems_r, ems_w, 0xffff) |
| 571 | 577 | ADDRESS_MAP_END |
| 572 | 578 | |
| 573 | 579 | |
| r32233 | r32234 | |
| 610 | 616 | UINT32 pasogo_state::screen_update_pasogo(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect) |
| 611 | 617 | { |
| 612 | 618 | //static int width = -1, height = -1; |
| 613 | | UINT8 *rom = memregion("maincpu")->base()+0xb8000; |
| 619 | UINT8 *rom = m_maincpu_rom->base() + 0xb8000; |
| 614 | 620 | static const UINT16 c[] = { 3, 0 }; |
| 615 | 621 | int x,y; |
| 616 | 622 | // plot_box(bitmap, 0, 0, 64/*bitmap.width*/, bitmap.height, 0); |
| r32233 | r32234 | |
| 672 | 678 | |
| 673 | 679 | void pasogo_state::machine_reset() |
| 674 | 680 | { |
| 681 | astring region_tag; |
| 682 | m_cart_rom = memregion(region_tag.cpy(m_cart->tag()).cat(GENERIC_ROM_REGION_TAG)); |
| 683 | m_maincpu_rom = memregion("maincpu"); |
| 684 | |
| 685 | membank("bank27")->set_base(m_cart_rom->base()); |
| 686 | membank("bank28")->set_base(m_maincpu_rom->base() + 0xb8000/*?*/); |
| 687 | |
| 675 | 688 | m_u73_q2 = 0; |
| 676 | 689 | m_out1 = 2; // initial state of pit output is undefined |
| 677 | 690 | m_pc_spkrdata = 0; |
| r32233 | r32234 | |
| 709 | 722 | |
| 710 | 723 | READ8_MEMBER( pasogo_state::page_r ) |
| 711 | 724 | { |
| 712 | | return 0xFF; |
| 725 | return 0xff; |
| 713 | 726 | } |
| 714 | 727 | |
| 715 | 728 | |
| r32233 | r32234 | |
| 916 | 929 | MCFG_PIT8253_CLK2(4772720/4) /* pio port c pin 4, and speaker polling enough */ |
| 917 | 930 | MCFG_PIT8253_OUT2_HANDLER(WRITELINE(pasogo_state, pit8253_out2_changed)) |
| 918 | 931 | |
| 919 | | MCFG_PIC8259_ADD( "pic8259", INPUTLINE("maincpu", 0), VCC, NULL ) |
| 932 | MCFG_PIC8259_ADD("pic8259", INPUTLINE("maincpu", 0), VCC, NULL) |
| 920 | 933 | |
| 921 | | MCFG_DEVICE_ADD( "dma8237", AM9517A, XTAL_14_31818MHz/3 ) |
| 934 | MCFG_DEVICE_ADD("dma8237", AM9517A, XTAL_14_31818MHz/3) |
| 922 | 935 | MCFG_I8237_OUT_HREQ_CB(WRITELINE(pasogo_state, dma_hrq_changed)) |
| 923 | 936 | MCFG_I8237_OUT_EOP_CB(WRITELINE(pasogo_state, dma8237_out_eop)) |
| 924 | 937 | MCFG_I8237_IN_MEMR_CB(READ8(pasogo_state, dma_read_byte)) |
| r32233 | r32234 | |
| 954 | 967 | MCFG_SOUND_ADD("speaker", SPEAKER_SOUND, 0) |
| 955 | 968 | MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.80) |
| 956 | 969 | |
| 957 | | MCFG_CARTSLOT_ADD("cart") |
| 958 | | MCFG_CARTSLOT_EXTENSION_LIST("bin") |
| 959 | | MCFG_CARTSLOT_MANDATORY |
| 960 | | MCFG_CARTSLOT_INTERFACE("pasogo_cart") |
| 970 | MCFG_GENERIC_CARTSLOT_ADD("cartslot", GENERIC_ROM16_WIDTH, generic_plain_slot, "pasogo_cart") |
| 971 | MCFG_GENERIC_MANDATORY |
| 972 | |
| 961 | 973 | MCFG_SOFTWARE_LIST_ADD("cart_list","pasogo") |
| 962 | 974 | |
| 963 | 975 | MCFG_TIMER_DRIVER_ADD_PERIODIC("vg230_timer", pasogo_state, vg230_timer, attotime::from_hz(1)) |
| r32233 | r32234 | |
| 966 | 978 | |
| 967 | 979 | ROM_START(pasogo) |
| 968 | 980 | ROM_REGION(0x100000,"maincpu", ROMREGION_ERASEFF) // 1 megabyte dram? |
| 969 | | ROM_REGION(0x100000,"user1", ROMREGION_ERASEFF) |
| 970 | | ROM_CART_LOAD("cart", 0, 0x100000, ROM_NOMIRROR) |
| 971 | 981 | ROM_END |
| 972 | 982 | |
| 973 | 983 | |
| r32233 | r32234 | |
| 975 | 985 | { |
| 976 | 986 | vg230_init(); |
| 977 | 987 | memset(&m_ems, 0, sizeof(m_ems)); |
| 978 | | membank( "bank27" )->set_base( memregion("user1")->base() + 0x00000 ); |
| 979 | | membank( "bank28" )->set_base( memregion("maincpu")->base() + 0xb8000/*?*/ ); |
| 980 | 988 | } |
| 981 | 989 | |
| 982 | 990 | // YEAR NAME PARENT COMPAT MACHINE INPUT INIT COMPANY FULLNAME FLAGS |
trunk/src/mess/drivers/cc40.c
| r32233 | r32234 | |
| 77 | 77 | #include "video/hd44780.h" |
| 78 | 78 | #include "sound/dac.h" |
| 79 | 79 | #include "machine/nvram.h" |
| 80 | | #include "imagedev/cartslot.h" |
| 80 | #include "bus/generic/slot.h" |
| 81 | #include "bus/generic/carts.h" |
| 81 | 82 | |
| 82 | 83 | #include "cc40.lh" |
| 83 | 84 | |
| r32233 | r32234 | |
| 89 | 90 | : driver_device(mconfig, type, tag), |
| 90 | 91 | m_maincpu(*this, "maincpu"), |
| 91 | 92 | m_dac(*this, "dac"), |
| 93 | m_cart(*this, "cartslot"), |
| 94 | m_key_matrix(*this, "IN"), |
| 92 | 95 | m_battery_inp(*this, "BATTERY") |
| 93 | 96 | { |
| 94 | 97 | m_sysram[0] = NULL; |
| r32233 | r32234 | |
| 97 | 100 | |
| 98 | 101 | required_device<tms70c20_device> m_maincpu; |
| 99 | 102 | required_device<dac_device> m_dac; |
| 103 | required_device<generic_slot_device> m_cart; |
| 104 | required_ioport_array<8> m_key_matrix; |
| 100 | 105 | required_ioport m_battery_inp; |
| 101 | 106 | |
| 102 | 107 | nvram_device *m_nvram[2]; |
| 103 | | ioport_port *m_key_matrix[8]; |
| 104 | 108 | |
| 109 | memory_region *m_cart_rom; |
| 110 | |
| 105 | 111 | UINT8 m_bus_control; |
| 106 | 112 | UINT8 m_power; |
| 107 | 113 | UINT8 m_banks; |
| r32233 | r32234 | |
| 150 | 156 | |
| 151 | 157 | DEVICE_IMAGE_LOAD_MEMBER(cc40_state, cc40_cartridge) |
| 152 | 158 | { |
| 153 | | UINT8* pos = memregion("user1")->base(); |
| 154 | | offs_t size; |
| 159 | UINT32 size = m_cart->common_get_size("rom"); |
| 155 | 160 | |
| 156 | | if (image.software_entry() == NULL) |
| 157 | | size = image.length(); |
| 158 | | else |
| 159 | | size = image.get_software_region_length("rom"); |
| 160 | | |
| 161 | 161 | // max size is 4*32KB |
| 162 | 162 | if (size > 0x20000) |
| 163 | 163 | { |
| r32233 | r32234 | |
| 165 | 165 | return IMAGE_INIT_FAIL; |
| 166 | 166 | } |
| 167 | 167 | |
| 168 | | if (image.software_entry() == NULL) |
| 169 | | { |
| 170 | | if (image.fread(pos, size) != size) |
| 171 | | { |
| 172 | | image.seterror(IMAGE_ERROR_UNSPECIFIED, "Unable to fully read file"); |
| 173 | | return IMAGE_INIT_FAIL; |
| 174 | | } |
| 175 | | } |
| 176 | | else |
| 177 | | memcpy(pos, image.get_software_region("rom"), size); |
| 168 | m_cart->rom_alloc(size, 0x20000); // allocate a larger ROM region to have 4x32K banks |
| 169 | m_cart->common_load_rom(m_cart->get_rom_base(), size, "rom"); |
| 178 | 170 | |
| 179 | 171 | return IMAGE_INIT_PASS; |
| 180 | 172 | } |
| r32233 | r32234 | |
| 319 | 311 | membank("sysbank")->set_entry(data & 3); |
| 320 | 312 | |
| 321 | 313 | // d2-d3: cartridge 32KB page bankswitch |
| 322 | | membank("cartbank")->set_entry(data >> 2 & 3); |
| 314 | if (m_cart_rom) |
| 315 | membank("cartbank")->set_entry(data >> 2 & 3); |
| 323 | 316 | |
| 324 | 317 | m_banks = data & 0x0f; |
| 325 | 318 | } |
| r32233 | r32234 | |
| 425 | 418 | // 8x8 keyboard matrix, RESET and ON buttons are not on it. Unused entries are not connected, but some might have a purpose for factory testing(?) |
| 426 | 419 | // The numpad number keys are shared with the ones on the main keyboard, also on the real machine. |
| 427 | 420 | // PORT_NAME lists functions under [SHIFT] as secondaries. |
| 428 | | PORT_START("IN0") |
| 421 | PORT_START("IN.0") |
| 429 | 422 | PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_1_PAD) PORT_CODE(KEYCODE_1) PORT_CHAR('1') PORT_CHAR('!') |
| 430 | 423 | PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_2_PAD) PORT_CODE(KEYCODE_2) PORT_CHAR('2') PORT_CHAR('"') |
| 431 | 424 | PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_3_PAD) PORT_CODE(KEYCODE_3) PORT_CHAR('3') PORT_CHAR('#') |
| r32233 | r32234 | |
| 435 | 428 | PORT_BIT( 0x40, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_7_PAD) PORT_CODE(KEYCODE_7) PORT_CHAR('7') PORT_CHAR('&') |
| 436 | 429 | PORT_BIT( 0x80, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_8_PAD) PORT_CODE(KEYCODE_8) PORT_CHAR('8') PORT_CHAR('(') |
| 437 | 430 | |
| 438 | | PORT_START("IN1") |
| 431 | PORT_START("IN.1") |
| 439 | 432 | PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_Q) PORT_CHAR('q') PORT_CHAR('Q') |
| 440 | 433 | PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_W) PORT_CHAR('w') PORT_CHAR('W') |
| 441 | 434 | PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_E) PORT_CHAR('e') PORT_CHAR('E') |
| r32233 | r32234 | |
| 445 | 438 | PORT_BIT( 0x40, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_U) PORT_CHAR('u') PORT_CHAR('U') |
| 446 | 439 | PORT_BIT( 0x80, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_I) PORT_CHAR('i') PORT_CHAR('I') |
| 447 | 440 | |
| 448 | | PORT_START("IN2") |
| 441 | PORT_START("IN.2") |
| 449 | 442 | PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_A) PORT_CHAR('a') PORT_CHAR('A') |
| 450 | 443 | PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_S) PORT_CHAR('s') PORT_CHAR('S') |
| 451 | 444 | PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_D) PORT_CHAR('d') PORT_CHAR('D') |
| r32233 | r32234 | |
| 455 | 448 | PORT_BIT( 0x40, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_J) PORT_CHAR('j') PORT_CHAR('J') |
| 456 | 449 | PORT_BIT( 0x80, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_K) PORT_CHAR('k') PORT_CHAR('K') |
| 457 | 450 | |
| 458 | | PORT_START("IN3") |
| 451 | PORT_START("IN.3") |
| 459 | 452 | PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_Z) PORT_CHAR('z') PORT_CHAR('Z') |
| 460 | 453 | PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_X) PORT_CHAR('x') PORT_CHAR('X') |
| 461 | 454 | PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_C) PORT_CHAR('c') PORT_CHAR('C') |
| r32233 | r32234 | |
| 465 | 458 | PORT_BIT( 0x40, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_M) PORT_CHAR('m') PORT_CHAR('M') |
| 466 | 459 | PORT_BIT( 0x80, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_COMMA) PORT_CHAR(',') PORT_CHAR('<') |
| 467 | 460 | |
| 468 | | PORT_START("IN4") |
| 461 | PORT_START("IN.4") |
| 469 | 462 | PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_UNUSED ) |
| 470 | 463 | PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_SPACE) PORT_CHAR(' ') PORT_NAME("SPACE") |
| 471 | 464 | PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_UNUSED ) |
| r32233 | r32234 | |
| 475 | 468 | PORT_BIT( 0x40, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_P) PORT_CHAR('p') PORT_CHAR('P') |
| 476 | 469 | PORT_BIT( 0x80, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_O) PORT_CHAR('o') PORT_CHAR('O') |
| 477 | 470 | |
| 478 | | PORT_START("IN5") |
| 471 | PORT_START("IN.5") |
| 479 | 472 | PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_0) PORT_CODE(KEYCODE_0_PAD) PORT_CHAR('0') PORT_CHAR('\'') |
| 480 | 473 | PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_DEL) PORT_CHAR(UCHAR_MAMEKEY(END)) PORT_NAME("CLR UCL") |
| 481 | 474 | PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_LEFT) PORT_CHAR(UCHAR_MAMEKEY(LEFT)) PORT_CHAR(UCHAR_MAMEKEY(DEL)) PORT_NAME("LEFT DEL") |
| r32233 | r32234 | |
| 485 | 478 | PORT_BIT( 0x40, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_DOWN) PORT_CHAR(UCHAR_MAMEKEY(DOWN)) PORT_NAME("DOWN") |
| 486 | 479 | PORT_BIT( 0x80, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_9) PORT_CODE(KEYCODE_9_PAD) PORT_CHAR('9') PORT_CHAR(')') |
| 487 | 480 | |
| 488 | | PORT_START("IN6") |
| 481 | PORT_START("IN.6") |
| 489 | 482 | PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_UNUSED ) |
| 490 | 483 | PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_STOP) PORT_CODE(KEYCODE_DEL_PAD) PORT_CHAR('.') PORT_CHAR('>') |
| 491 | 484 | PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_PLUS_PAD) PORT_CHAR(UCHAR_MAMEKEY(PLUS_PAD)) PORT_NAME("+") |
| r32233 | r32234 | |
| 495 | 488 | PORT_BIT( 0x40, IP_ACTIVE_HIGH, IPT_UNUSED ) |
| 496 | 489 | PORT_BIT( 0x80, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_ASTERISK) PORT_CHAR(UCHAR_MAMEKEY(ASTERISK)) PORT_NAME("*") |
| 497 | 490 | |
| 498 | | PORT_START("IN7") |
| 491 | PORT_START("IN.7") |
| 499 | 492 | PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_LCONTROL) PORT_CODE(KEYCODE_RCONTROL) PORT_CHAR(UCHAR_SHIFT_2) PORT_NAME("CTL") |
| 500 | 493 | PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_LSHIFT) PORT_CODE(KEYCODE_RSHIFT) PORT_CHAR(UCHAR_SHIFT_1) PORT_NAME("SHIFT") |
| 501 | 494 | PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_END) PORT_CHAR(UCHAR_MAMEKEY(PAUSE)) PORT_NAME("BREAK") |
| r32233 | r32234 | |
| 552 | 545 | void cc40_state::machine_start() |
| 553 | 546 | { |
| 554 | 547 | // init |
| 555 | | static const char *const tags[] = { "IN0", "IN1", "IN2", "IN3", "IN4", "IN5", "IN6", "IN7" }; |
| 556 | | for (int i = 0; i < 8; i++) |
| 557 | | m_key_matrix[i] = ioport(tags[i]); |
| 548 | astring region_tag; |
| 549 | m_cart_rom = memregion(region_tag.cpy(m_cart->tag()).cat(GENERIC_ROM_REGION_TAG)); |
| 558 | 550 | |
| 559 | 551 | membank("sysbank")->configure_entries(0, 4, memregion("system")->base(), 0x2000); |
| 560 | | membank("cartbank")->configure_entries(0, 4, memregion("user1")->base(), 0x8000); |
| 552 | if (m_cart_rom) |
| 553 | membank("cartbank")->configure_entries(0, 4, m_cart_rom->base(), 0x8000); |
| 554 | else |
| 555 | membank("cartbank")->set_base(memregion("maincpu")->base() + 0x5000); |
| 561 | 556 | |
| 562 | 557 | m_nvram[0] = machine().device<nvram_device>("sysram.1"); |
| 563 | 558 | m_nvram[1] = machine().device<nvram_device>("sysram.2"); |
| r32233 | r32234 | |
| 619 | 614 | MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.25) |
| 620 | 615 | |
| 621 | 616 | /* cartridge */ |
| 622 | | MCFG_CARTSLOT_ADD("cart") |
| 623 | | MCFG_CARTSLOT_EXTENSION_LIST("bin,rom,256") |
| 624 | | MCFG_CARTSLOT_NOT_MANDATORY |
| 625 | | MCFG_CARTSLOT_LOAD(cc40_state, cc40_cartridge) |
| 626 | | MCFG_CARTSLOT_INTERFACE("cc40_cart") |
| 617 | MCFG_GENERIC_CARTSLOT_ADD("cartslot", GENERIC_ROM8_WIDTH, generic_plain_slot, "cc40_cart") |
| 618 | MCFG_GENERIC_EXTENSIONS("bin,rom,256") |
| 619 | MCFG_GENERIC_LOAD(cc40_state, cc40_cartridge) |
| 620 | |
| 627 | 621 | MCFG_SOFTWARE_LIST_ADD("cart_list", "cc40_cart") |
| 628 | 622 | MACHINE_CONFIG_END |
| 629 | 623 | |
| r32233 | r32234 | |
| 641 | 635 | |
| 642 | 636 | ROM_REGION( 0x8000, "system", 0 ) |
| 643 | 637 | ROM_LOAD( "hn61256pc09.bin", 0x0000, 0x8000, CRC(f5322fab) SHA1(1b5c4052a53654363c458f75eac7a27f0752def6) ) // system rom, banked |
| 644 | | |
| 645 | | ROM_REGION( 0x20000, "user1", ROMREGION_ERASEFF ) // cartridge area, max 4*32KB |
| 646 | 638 | ROM_END |
| 647 | 639 | |
| 648 | 640 | |