trunk/src/mess/drivers/c64.c
| r31202 | r31203 | |
| 32 | 32 | #define VA13 BIT(va, 13) |
| 33 | 33 | #define VA12 BIT(va, 12) |
| 34 | 34 | |
| 35 | enum |
| 36 | { |
| 37 | PLA_OUT_CASRAM = 0, |
| 38 | PLA_OUT_BASIC = 1, |
| 39 | PLA_OUT_KERNAL = 2, |
| 40 | PLA_OUT_CHAROM = 3, |
| 41 | PLA_OUT_GRW = 4, |
| 42 | PLA_OUT_IO = 5, |
| 43 | PLA_OUT_ROML = 6, |
| 44 | PLA_OUT_ROMH = 7 |
| 45 | }; |
| 46 | |
| 47 | |
| 35 | 48 | QUICKLOAD_LOAD_MEMBER( c64_state, cbm_c64 ) |
| 36 | 49 | { |
| 37 | 50 | return general_cbm_loadsnap(image, file_type, quickload_size, m_maincpu->space(AS_PROGRAM), 0, cbm_quick_sethiaddress); |
| r31202 | r31203 | |
| 66 | 79 | // read_pla - |
| 67 | 80 | //------------------------------------------------- |
| 68 | 81 | |
| 69 | | void c64_state::read_pla(offs_t offset, offs_t va, int rw, int aec, int ba, int *casram, int *basic, int *kernal, int *charom, int *grw, int *io, int *roml, int *romh) |
| 82 | int c64_state::read_pla(offs_t offset, offs_t va, int rw, int aec, int ba) |
| 70 | 83 | { |
| 71 | 84 | //int ba = m_vic->ba_r(); |
| 72 | 85 | //int aec = !m_vic->aec_r(); |
| r31202 | r31203 | |
| 78 | 91 | UINT32 input = VA12 << 15 | VA13 << 14 | game << 13 | exrom << 12 | rw << 11 | aec << 10 | ba << 9 | A12 << 8 | |
| 79 | 92 | A13 << 7 | A14 << 6 | A15 << 5 | m_va14 << 4 | m_charen << 3 | m_hiram << 2 | m_loram << 1 | cas; |
| 80 | 93 | |
| 81 | | UINT32 data = m_pla->read(input); |
| 82 | | |
| 83 | | *casram = BIT(data, 0); |
| 84 | | *basic = BIT(data, 1); |
| 85 | | *kernal = BIT(data, 2); |
| 86 | | *charom = BIT(data, 3); |
| 87 | | *grw = BIT(data, 4); |
| 88 | | *io = BIT(data, 5); |
| 89 | | *roml = BIT(data, 6); |
| 90 | | *romh = BIT(data, 7); |
| 94 | return m_pla->read(input); |
| 91 | 95 | } |
| 92 | 96 | |
| 93 | 97 | |
| r31202 | r31203 | |
| 98 | 102 | UINT8 c64_state::read_memory(address_space &space, offs_t offset, offs_t va, int aec, int ba) |
| 99 | 103 | { |
| 100 | 104 | int rw = 1; |
| 101 | | int casram, basic, kernal, charom, grw, io, roml, romh; |
| 102 | 105 | int io1 = 1, io2 = 1; |
| 103 | 106 | int sphi2 = m_vic->phi0_r(); |
| 104 | 107 | |
| 105 | | read_pla(offset, va, rw, !aec, ba, &casram, &basic, &kernal, &charom, &grw, &io, &roml, &romh); |
| 108 | int plaout = read_pla(offset, va, rw, !aec, ba); |
| 106 | 109 | |
| 107 | 110 | UINT8 data = 0xff; |
| 108 | 111 | |
| r31202 | r31203 | |
| 111 | 114 | data = m_vic->bus_r(); |
| 112 | 115 | } |
| 113 | 116 | |
| 114 | | if (!casram) |
| 117 | if (!BIT(plaout, PLA_OUT_CASRAM)) |
| 115 | 118 | { |
| 116 | 119 | if (aec) |
| 117 | 120 | { |
| r31202 | r31203 | |
| 122 | 125 | data = m_ram->pointer()[(!m_va15 << 15) | (!m_va14 << 14) | va]; |
| 123 | 126 | } |
| 124 | 127 | } |
| 125 | | if (!basic) |
| 128 | if (!BIT(plaout, PLA_OUT_BASIC)) |
| 126 | 129 | { |
| 127 | 130 | if (m_basic != NULL) |
| 128 | 131 | { |
| r31202 | r31203 | |
| 133 | 136 | data = m_kernal->base()[offset & 0x1fff]; |
| 134 | 137 | } |
| 135 | 138 | } |
| 136 | | if (!kernal) |
| 139 | if (!BIT(plaout, PLA_OUT_KERNAL)) |
| 137 | 140 | { |
| 138 | 141 | if (m_basic != NULL) |
| 139 | 142 | { |
| r31202 | r31203 | |
| 144 | 147 | data = m_kernal->base()[0x2000 | (offset & 0x1fff)]; |
| 145 | 148 | } |
| 146 | 149 | } |
| 147 | | if (!charom) |
| 150 | if (!BIT(plaout, PLA_OUT_CHAROM)) |
| 148 | 151 | { |
| 149 | 152 | data = m_charom->base()[offset & 0xfff]; |
| 150 | 153 | } |
| 151 | | if (!io) |
| 154 | if (!BIT(plaout, PLA_OUT_IO)) |
| 152 | 155 | { |
| 153 | | switch ((offset >> 10) & 0x03) |
| 156 | switch ((offset >> 8) & 0x0f) |
| 154 | 157 | { |
| 155 | | case 0: // VIC |
| 158 | case 0: |
| 159 | case 1: |
| 160 | case 2: |
| 161 | case 3: // VIC |
| 156 | 162 | data = m_vic->read(space, offset & 0x3f); |
| 157 | 163 | break; |
| 158 | 164 | |
| 159 | | case 1: // SID |
| 165 | case 4: |
| 166 | case 5: |
| 167 | case 6: |
| 168 | case 7: // SID |
| 160 | 169 | data = m_sid->read(space, offset & 0x1f); |
| 161 | 170 | break; |
| 162 | 171 | |
| 163 | | case 2: // COLOR |
| 172 | case 0x8: |
| 173 | case 0x9: |
| 174 | case 0xa: |
| 175 | case 0xb: // COLOR |
| 164 | 176 | data = m_color_ram[offset & 0x3ff] & 0x0f; |
| 165 | 177 | break; |
| 166 | 178 | |
| 167 | | case 3: // CIAS |
| 168 | | switch ((offset >> 8) & 0x03) |
| 169 | | { |
| 170 | | case 0: // CIA1 |
| 171 | | data = m_cia1->read(space, offset & 0x0f); |
| 172 | | break; |
| 179 | case 0xc: // CIA1 |
| 180 | data = m_cia1->read(space, offset & 0x0f); |
| 181 | break; |
| 173 | 182 | |
| 174 | | case 1: // CIA2 |
| 175 | | data = m_cia2->read(space, offset & 0x0f); |
| 176 | | break; |
| 183 | case 0xd: // CIA2 |
| 184 | data = m_cia2->read(space, offset & 0x0f); |
| 185 | break; |
| 177 | 186 | |
| 178 | | case 2: // I/O1 |
| 179 | | io1 = 0; |
| 180 | | break; |
| 187 | case 0xe: // I/O1 |
| 188 | io1 = 0; |
| 189 | break; |
| 181 | 190 | |
| 182 | | case 3: // I/O2 |
| 183 | | io2 = 0; |
| 184 | | break; |
| 185 | | } |
| 191 | case 0xf: // I/O2 |
| 192 | io2 = 0; |
| 186 | 193 | break; |
| 187 | 194 | } |
| 188 | 195 | } |
| 189 | 196 | |
| 197 | int roml = BIT(plaout, PLA_OUT_ROML); |
| 198 | int romh = BIT(plaout, PLA_OUT_ROMH); |
| 190 | 199 | return m_exp->cd_r(space, offset, data, sphi2, ba, roml, romh, io1, io2); |
| 191 | 200 | } |
| 192 | 201 | |
| r31202 | r31203 | |
| 198 | 207 | void c64_state::write_memory(address_space &space, offs_t offset, UINT8 data, int aec, int ba) |
| 199 | 208 | { |
| 200 | 209 | int rw = 0; |
| 201 | | int casram, basic, kernal, charom, grw, io, roml, romh; |
| 202 | 210 | offs_t va = 0; |
| 203 | 211 | int io1 = 1, io2 = 1; |
| 204 | 212 | int sphi2 = m_vic->phi0_r(); |
| 205 | 213 | |
| 206 | | read_pla(offset, va, rw, !aec, ba, &casram, &basic, &kernal, &charom, &grw, &io, &roml, &romh); |
| 214 | int plaout = read_pla(offset, va, rw, !aec, ba); |
| 207 | 215 | |
| 208 | 216 | if (offset < 0x0002) |
| 209 | 217 | { |
| r31202 | r31203 | |
| 211 | 219 | data = m_vic->bus_r(); |
| 212 | 220 | } |
| 213 | 221 | |
| 214 | | if (!casram) |
| 222 | if (!BIT(plaout, PLA_OUT_CASRAM)) |
| 215 | 223 | { |
| 216 | 224 | m_ram->pointer()[offset] = data; |
| 217 | 225 | } |
| 218 | | if (!io) |
| 226 | if (!BIT(plaout, PLA_OUT_IO)) |
| 219 | 227 | { |
| 220 | | switch ((offset >> 10) & 0x03) |
| 228 | switch ((offset >> 8) & 0x0f) |
| 221 | 229 | { |
| 222 | | case 0: // VIC |
| 230 | case 0: |
| 231 | case 1: |
| 232 | case 2: |
| 233 | case 3: // VIC |
| 223 | 234 | m_vic->write(space, offset & 0x3f, data); |
| 224 | 235 | break; |
| 225 | 236 | |
| 226 | | case 1: // SID |
| 237 | case 4: |
| 238 | case 5: |
| 239 | case 6: |
| 240 | case 7: // SID |
| 227 | 241 | m_sid->write(space, offset & 0x1f, data); |
| 228 | 242 | break; |
| 229 | 243 | |
| 230 | | case 2: // COLOR |
| 231 | | if (!grw) m_color_ram[offset & 0x3ff] = data & 0x0f; |
| 244 | case 0x8: |
| 245 | case 0x9: |
| 246 | case 0xa: |
| 247 | case 0xb: // COLOR |
| 248 | if (!BIT(plaout, PLA_OUT_GRW)) m_color_ram[offset & 0x3ff] = data & 0x0f; |
| 232 | 249 | break; |
| 233 | 250 | |
| 234 | | case 3: // CIAS |
| 235 | | switch ((offset >> 8) & 0x03) |
| 236 | | { |
| 237 | | case 0: // CIA1 |
| 238 | | m_cia1->write(space, offset & 0x0f, data); |
| 239 | | break; |
| 251 | case 0xc: // CIA1 |
| 252 | m_cia1->write(space, offset & 0x0f, data); |
| 253 | break; |
| 240 | 254 | |
| 241 | | case 1: // CIA2 |
| 242 | | m_cia2->write(space, offset & 0x0f, data); |
| 243 | | break; |
| 255 | case 0xd: // CIA2 |
| 256 | m_cia2->write(space, offset & 0x0f, data); |
| 257 | break; |
| 244 | 258 | |
| 245 | | case 2: // I/O1 |
| 246 | | io1 = 0; |
| 247 | | break; |
| 259 | case 0xe: // I/O1 |
| 260 | io1 = 0; |
| 261 | break; |
| 248 | 262 | |
| 249 | | case 3: // I/O2 |
| 250 | | io2 = 0; |
| 251 | | break; |
| 252 | | } |
| 263 | case 0xf: // I/O2 |
| 264 | io2 = 0; |
| 253 | 265 | break; |
| 254 | 266 | } |
| 255 | 267 | } |
| 256 | 268 | |
| 269 | int roml = BIT(plaout, PLA_OUT_ROML); |
| 270 | int romh = BIT(plaout, PLA_OUT_ROMH); |
| 257 | 271 | m_exp->cd_w(space, offset, data, sphi2, ba, roml, romh, io1, io2); |
| 258 | 272 | } |
| 259 | 273 | |