trunk/src/mess/machine/c64_fcc.c
| r20598 | r20599 | |
| 7 | 7 | |
| 8 | 8 | **********************************************************************/ |
| 9 | 9 | |
| 10 | /* |
| 11 | |
| 12 | TODO: |
| 13 | |
| 14 | 629D ldx #$00 |
| 15 | 629F stx $0e |
| 16 | 62A1 sta $df00 |
| 17 | 62A4 inc $d020 |
| 18 | 62A7 dec $d020 |
| 19 | 62AA cpx $0e |
| 20 | 62AC beq $62a4 <-- eternal loop here |
| 21 | 62AE rts |
| 22 | |
| 23 | */ |
| 24 | |
| 10 | 25 | #include "c64_fcc.h" |
| 11 | 26 | |
| 12 | 27 | |
| r20598 | r20599 | |
| 50 | 65 | //------------------------------------------------- |
| 51 | 66 | |
| 52 | 67 | static ADDRESS_MAP_START( c64_fcc_map, AS_PROGRAM, 8, c64_final_chesscard_device ) |
| 53 | | AM_RANGE(0x0000, 0x7fff) AM_RAM |
| 68 | AM_RANGE(0x0000, 0x1fff) AM_MIRROR(0x6000) AM_READWRITE(nvram_r, nvram_w) |
| 54 | 69 | AM_RANGE(0x8000, 0xffff) AM_ROM AM_REGION(G65SC02P4_TAG, 0) |
| 55 | 70 | ADDRESS_MAP_END |
| 56 | 71 | |
| r20598 | r20599 | |
| 60 | 75 | //------------------------------------------------- |
| 61 | 76 | |
| 62 | 77 | static MACHINE_CONFIG_FRAGMENT( c64_fcc ) |
| 63 | | MCFG_CPU_ADD(G65SC02P4_TAG, M65SC02, 5000000) |
| 78 | MCFG_CPU_ADD(G65SC02P4_TAG, M65SC02, XTAL_5MHz) |
| 64 | 79 | MCFG_CPU_PROGRAM_MAP(c64_fcc_map) |
| 65 | 80 | MACHINE_CONFIG_END |
| 66 | 81 | |
| r20598 | r20599 | |
| 117 | 132 | c64_final_chesscard_device::c64_final_chesscard_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock) : |
| 118 | 133 | device_t(mconfig, C64_FCC, "Final ChessCard", tag, owner, clock), |
| 119 | 134 | device_c64_expansion_card_interface(mconfig, *this), |
| 120 | | m_maincpu(*this, G65SC02P4_TAG) |
| 135 | device_nvram_interface(mconfig, *this), |
| 136 | m_maincpu(*this, G65SC02P4_TAG), |
| 137 | m_bank(0), |
| 138 | m_ramen(0) |
| 121 | 139 | { |
| 122 | 140 | } |
| 123 | 141 | |
| r20598 | r20599 | |
| 137 | 155 | |
| 138 | 156 | void c64_final_chesscard_device::device_reset() |
| 139 | 157 | { |
| 158 | m_maincpu->reset(); |
| 159 | |
| 160 | m_bank = 0; |
| 161 | m_ramen = 0; |
| 162 | m_game = 0; |
| 140 | 163 | } |
| 141 | 164 | |
| 142 | 165 | |
| r20598 | r20599 | |
| 148 | 171 | { |
| 149 | 172 | if (!roml) |
| 150 | 173 | { |
| 151 | | data = m_roml[(m_bank << 13) | (offset & 0x1fff)]; |
| 174 | if (m_ramen) |
| 175 | { |
| 176 | data = m_nvram[offset & 0x1fff]; |
| 177 | } |
| 178 | else |
| 179 | { |
| 180 | data = m_roml[(m_bank << 14) | (offset & 0x3fff)]; |
| 181 | } |
| 152 | 182 | } |
| 183 | else if (!romh) |
| 184 | { |
| 185 | data = m_roml[(m_bank << 14) | (offset & 0x3fff)]; |
| 186 | } |
| 153 | 187 | |
| 154 | 188 | return data; |
| 155 | 189 | } |
| r20598 | r20599 | |
| 161 | 195 | |
| 162 | 196 | void c64_final_chesscard_device::c64_cd_w(address_space &space, offs_t offset, UINT8 data, int sphi2, int ba, int roml, int romh, int io1, int io2) |
| 163 | 197 | { |
| 164 | | if (!io1) |
| 198 | if (!roml) |
| 165 | 199 | { |
| 166 | | printf("IO1 %04x %02x\n", offset, data); |
| 167 | | m_bank = data; |
| 200 | if (m_ramen) |
| 201 | { |
| 202 | m_nvram[offset & 0x1fff] = data; |
| 203 | } |
| 168 | 204 | } |
| 205 | else if (!io1) |
| 206 | { |
| 207 | /* |
| 208 | |
| 209 | bit description |
| 210 | |
| 211 | 0 ? |
| 212 | 1 |
| 213 | 2 |
| 214 | 3 |
| 215 | 4 |
| 216 | 5 |
| 217 | 6 |
| 218 | 7 |
| 219 | |
| 220 | */ |
| 169 | 221 | |
| 170 | | if (!io2) printf("IO1 %04x %02x\n", offset, data); |
| 222 | printf("IO1 %04x %02x\n", offset, data); |
| 223 | m_bank = BIT(data, 0); |
| 224 | } |
| 225 | else if (!io2) |
| 226 | { |
| 227 | /* |
| 228 | |
| 229 | bit description |
| 230 | |
| 231 | 0 ? |
| 232 | 1 |
| 233 | 2 |
| 234 | 3 |
| 235 | 4 |
| 236 | 5 |
| 237 | 6 |
| 238 | 7 ? |
| 239 | |
| 240 | */ |
| 241 | |
| 242 | printf("IO2 %04x %02x\n", offset, data); |
| 243 | m_ramen = BIT(data, 0); |
| 244 | m_game = BIT(data, 7); |
| 245 | } |
| 171 | 246 | } |
| 247 | |
| 248 | |
| 249 | //------------------------------------------------- |
| 250 | // nvram_r - NVRAM read |
| 251 | //------------------------------------------------- |
| 252 | |
| 253 | READ8_MEMBER( c64_final_chesscard_device::nvram_r ) |
| 254 | { |
| 255 | return m_nvram[offset & m_nvram_mask]; |
| 256 | } |
| 257 | |
| 258 | |
| 259 | //------------------------------------------------- |
| 260 | // nvram_w - NVRAM write |
| 261 | //------------------------------------------------- |
| 262 | |
| 263 | WRITE8_MEMBER( c64_final_chesscard_device::nvram_w ) |
| 264 | { |
| 265 | m_nvram[offset & m_nvram_mask] = data; |
| 266 | } |
trunk/src/mess/machine/c64_fcc.h
| r20598 | r20599 | |
| 25 | 25 | // ======================> c64_final_chesscard_device |
| 26 | 26 | |
| 27 | 27 | class c64_final_chesscard_device : public device_t, |
| 28 | | public device_c64_expansion_card_interface |
| 28 | public device_c64_expansion_card_interface, |
| 29 | public device_nvram_interface |
| 29 | 30 | { |
| 30 | 31 | public: |
| 31 | 32 | // construction/destruction |
| r20598 | r20599 | |
| 37 | 38 | virtual ioport_constructor device_input_ports() const; |
| 38 | 39 | |
| 39 | 40 | DECLARE_INPUT_CHANGED_MEMBER( reset ); |
| 41 | DECLARE_READ8_MEMBER( nvram_r ); |
| 42 | DECLARE_WRITE8_MEMBER( nvram_w ); |
| 40 | 43 | |
| 41 | 44 | protected: |
| 42 | 45 | // device-level overrides |
| r20598 | r20599 | |
| 44 | 47 | virtual void device_start(); |
| 45 | 48 | virtual void device_reset(); |
| 46 | 49 | |
| 50 | // device_nvram_interface overrides |
| 51 | virtual void nvram_default() { } |
| 52 | virtual void nvram_read(emu_file &file) { if (m_nvram != NULL) { file.read(m_nvram, m_nvram_size); } } |
| 53 | virtual void nvram_write(emu_file &file) { if (m_nvram != NULL) { file.write(m_nvram, m_nvram_size); } } |
| 54 | |
| 47 | 55 | // device_c64_expansion_card_interface overrides |
| 48 | 56 | virtual UINT8 c64_cd_r(address_space &space, offs_t offset, UINT8 data, int sphi2, int ba, int roml, int romh, int io1, int io2); |
| 49 | 57 | virtual void c64_cd_w(address_space &space, offs_t offset, UINT8 data, int sphi2, int ba, int roml, int romh, int io1, int io2); |
| r20598 | r20599 | |
| 52 | 60 | required_device<m65sc02_device> m_maincpu; |
| 53 | 61 | |
| 54 | 62 | UINT8 m_bank; |
| 63 | int m_ramen; |
| 55 | 64 | }; |
| 56 | 65 | |
| 57 | 66 | |
trunk/src/mess/video/mos6566.c
| r20598 | r20599 | |
| 89 | 89 | REGISTER_FAST |
| 90 | 90 | }; |
| 91 | 91 | |
| 92 | static int UNUSED_BITS[0x40] = |
| 93 | { |
| 94 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, |
| 95 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0x00, 0x01, 0x70, 0xf0, 0x00, 0x00, 0x00, 0x00, 0x00, |
| 96 | 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xff, |
| 97 | 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff |
| 98 | }; |
| 92 | 99 | |
| 93 | 100 | // VICE palette |
| 94 | 101 | static const rgb_t PALETTE[] = |
| r20598 | r20599 | |
| 2460 | 2467 | { |
| 2461 | 2468 | case 0x11: |
| 2462 | 2469 | val = (m_reg[offset] & ~0x80) | ((m_rasterline & 0x100) >> 1); |
| 2470 | val |= UNUSED_BITS[offset]; |
| 2463 | 2471 | break; |
| 2464 | 2472 | |
| 2465 | 2473 | case 0x12: |
| 2466 | 2474 | val = m_rasterline & 0xff; |
| 2475 | val |= UNUSED_BITS[offset]; |
| 2467 | 2476 | break; |
| 2468 | 2477 | |
| 2469 | 2478 | case 0x16: |
| 2470 | 2479 | val = m_reg[offset] | 0xc0; |
| 2480 | val |= UNUSED_BITS[offset]; |
| 2471 | 2481 | break; |
| 2472 | 2482 | |
| 2473 | 2483 | case 0x18: |
| 2474 | 2484 | val = m_reg[offset] | 0x01; |
| 2485 | val |= UNUSED_BITS[offset]; |
| 2475 | 2486 | break; |
| 2476 | 2487 | |
| 2477 | 2488 | case 0x19: /* interrupt flag register */ |
| 2478 | 2489 | /* clear_interrupt(0xf); */ |
| 2479 | 2490 | val = m_reg[offset] | 0x70; |
| 2491 | val |= UNUSED_BITS[offset]; |
| 2480 | 2492 | break; |
| 2481 | 2493 | |
| 2482 | 2494 | case 0x1a: |
| 2483 | 2495 | val = m_reg[offset] | 0xf0; |
| 2496 | val |= UNUSED_BITS[offset]; |
| 2484 | 2497 | break; |
| 2485 | 2498 | |
| 2486 | 2499 | case 0x1e: /* sprite to sprite collision detect */ |
| 2487 | 2500 | val = m_reg[offset]; |
| 2488 | 2501 | m_reg[offset] = 0; |
| 2489 | 2502 | clear_interrupt(4); |
| 2503 | val |= UNUSED_BITS[offset]; |
| 2490 | 2504 | break; |
| 2491 | 2505 | |
| 2492 | 2506 | case 0x1f: /* sprite to background collision detect */ |
| 2493 | 2507 | val = m_reg[offset]; |
| 2494 | 2508 | m_reg[offset] = 0; |
| 2495 | 2509 | clear_interrupt(2); |
| 2510 | val |= UNUSED_BITS[offset]; |
| 2496 | 2511 | break; |
| 2497 | 2512 | |
| 2498 | 2513 | case 0x20: |
| r20598 | r20599 | |
| 2501 | 2516 | case 0x23: |
| 2502 | 2517 | case 0x24: |
| 2503 | 2518 | val = m_reg[offset]; |
| 2519 | val |= UNUSED_BITS[offset]; |
| 2504 | 2520 | break; |
| 2505 | 2521 | |
| 2506 | 2522 | case 0x00: |
| r20598 | r20599 | |
| 2535 | 2551 | case 0x2d: |
| 2536 | 2552 | case 0x2e: |
| 2537 | 2553 | val = m_reg[offset]; |
| 2554 | val |= UNUSED_BITS[offset]; |
| 2538 | 2555 | break; |
| 2539 | 2556 | |
| 2540 | 2557 | case REGISTER_KCR: |
| r20598 | r20599 | |
| 2545 | 2562 | DBG_LOG(2, "vic read", ("%.2x:%.2x\n", offset, val)); |
| 2546 | 2563 | } |
| 2547 | 2564 | else |
| 2548 | | val = 0xff; |
| 2565 | { |
| 2566 | val |= UNUSED_BITS[offset]; |
| 2567 | } |
| 2549 | 2568 | break; |
| 2550 | 2569 | |
| 2551 | 2570 | case 0x31: |
| r20598 | r20599 | |
| 2563 | 2582 | case 0x3d: |
| 2564 | 2583 | case 0x3e: |
| 2565 | 2584 | case 0x3f: /* not used */ |
| 2566 | | // val = m_reg[offset]; // |
| 2567 | | val = 0xff; |
| 2568 | 2585 | DBG_LOG(2, "vic read", ("%.2x:%.2x\n", offset, val)); |
| 2586 | val |= UNUSED_BITS[offset]; |
| 2569 | 2587 | break; |
| 2570 | 2588 | |
| 2571 | 2589 | default: |
| 2572 | 2590 | val = m_reg[offset]; |
| 2591 | val |= UNUSED_BITS[offset]; |
| 2573 | 2592 | } |
| 2574 | 2593 | |
| 2575 | 2594 | if ((offset != 0x11) && (offset != 0x12)) |