trunk/src/mame/machine/igs025.c
| r26057 | r26058 | |
| 64 | 64 | save_item(NAME(m_kb_ptr)); |
| 65 | 65 | |
| 66 | 66 | |
| 67 | | m_olds_prot_hold = 0; |
| 68 | | m_olds_prot_hilo = 0; |
| 69 | | m_olds_prot_hilo_select = 0; |
| 70 | 67 | |
| 71 | | m_olds_cmd = 0; |
| 72 | | m_olds_reg = 0; |
| 73 | | m_olds_ptr = 0; |
| 68 | |
| 74 | 69 | m_olds_bs = 0; |
| 75 | | m_olds_cmd3 = 0; |
| 70 | m_kb_cmd3 = 0; |
| 76 | 71 | |
| 77 | | save_item(NAME(m_olds_cmd)); |
| 78 | | save_item(NAME(m_olds_reg)); |
| 79 | | save_item(NAME(m_olds_ptr)); |
| 72 | |
| 80 | 73 | save_item(NAME(m_olds_bs)); |
| 81 | | save_item(NAME(m_olds_cmd3)); |
| 74 | save_item(NAME(m_kb_cmd3)); |
| 82 | 75 | |
| 83 | 76 | |
| 84 | | m_drgw2_cmd = 0; |
| 85 | | m_drgw2_ptr = 0; |
| 86 | | m_drgw2_prot_hilo = 0; |
| 87 | | m_drgw2_prot_hilo_select = 0; |
| 88 | | m_drgw2_prot_hold = 0; |
| 89 | 77 | |
| 90 | | save_item(NAME(m_drgw2_cmd)); |
| 91 | | save_item(NAME(m_drgw2_ptr)); |
| 92 | | save_item(NAME(m_drgw2_prot_hilo)); |
| 93 | | save_item(NAME(m_drgw2_prot_hilo_select)); |
| 94 | | save_item(NAME(m_drgw2_prot_hold)); |
| 95 | 78 | } |
| 96 | 79 | |
| 97 | 80 | void igs025_device::device_reset() |
| r26057 | r26058 | |
| 105 | 88 | m_kb_ptr = 0; |
| 106 | 89 | m_kb_swap = 0; |
| 107 | 90 | |
| 108 | | m_olds_prot_hold = 0; |
| 109 | | m_olds_prot_hilo = 0; |
| 110 | | m_olds_prot_hilo_select = 0; |
| 111 | 91 | |
| 112 | | m_olds_cmd = 0; |
| 113 | | m_olds_reg = 0; |
| 114 | | m_olds_ptr = 0; |
| 115 | 92 | m_olds_bs = 0; |
| 116 | | m_olds_cmd3 = 0; |
| 93 | m_kb_cmd3 = 0; |
| 117 | 94 | |
| 118 | | m_drgw2_cmd = 0; |
| 119 | | m_drgw2_ptr = 0; |
| 120 | | m_drgw2_prot_hilo = 0; |
| 121 | | m_drgw2_prot_hilo_select = 0; |
| 122 | | m_drgw2_prot_hold = 0; |
| 123 | | |
| 124 | 95 | } |
| 125 | 96 | |
| 126 | | void igs025_device::killbld_protection_calculate_hold(int y, int z) |
| 127 | | { |
| 128 | | unsigned short old = m_kb_prot_hold; |
| 129 | 97 | |
| 130 | | m_kb_prot_hold = ((old << 1) | (old >> 15)); |
| 131 | | |
| 132 | | m_kb_prot_hold ^= 0x2bad; |
| 133 | | m_kb_prot_hold ^= BIT(z, y); |
| 134 | | m_kb_prot_hold ^= BIT( old, 7) << 0; |
| 135 | | m_kb_prot_hold ^= BIT(~old, 13) << 4; |
| 136 | | m_kb_prot_hold ^= BIT( old, 3) << 11; |
| 137 | | |
| 138 | | m_kb_prot_hold ^= (m_kb_prot_hilo & ~0x0408) << 1; |
| 139 | | } |
| 140 | | |
| 141 | 98 | void igs025_device::killbld_protection_calculate_hilo() |
| 142 | 99 | { |
| 143 | 100 | UINT8 source; |
| r26057 | r26058 | |
| 269 | 226 | |
| 270 | 227 | /* todo, collapse this all into above */ |
| 271 | 228 | |
| 272 | | void igs025_device::olds_protection_calculate_hold(int y, int z) // calculated in routine $12dbc2 in olds |
| 273 | | { |
| 274 | | unsigned short old = m_olds_prot_hold; |
| 275 | 229 | |
| 276 | | m_olds_prot_hold = ((old << 1) | (old >> 15)); |
| 277 | | |
| 278 | | m_olds_prot_hold ^= 0x2bad; |
| 279 | | m_olds_prot_hold ^= BIT(z, y); |
| 280 | | m_olds_prot_hold ^= BIT( old, 7) << 0; |
| 281 | | m_olds_prot_hold ^= BIT(~old, 13) << 4; |
| 282 | | m_olds_prot_hold ^= BIT( old, 3) << 11; |
| 283 | | |
| 284 | | m_olds_prot_hold ^= (m_olds_prot_hilo & ~0x0408) << 1; // $81790c |
| 285 | | } |
| 286 | | |
| 287 | 230 | void igs025_device::olds_protection_calculate_hilo() // calculated in routine $12dbc2 in olds |
| 288 | 231 | { |
| 289 | 232 | UINT8 source; |
| 290 | 233 | |
| 291 | | m_olds_prot_hilo_select++; |
| 292 | | if (m_olds_prot_hilo_select > 0xeb) { |
| 293 | | m_olds_prot_hilo_select = 0; |
| 234 | m_kb_prot_hilo_select++; |
| 235 | if (m_kb_prot_hilo_select > 0xeb) { |
| 236 | m_kb_prot_hilo_select = 0; |
| 294 | 237 | } |
| 295 | 238 | |
| 296 | | source = olds_source_data[m_drgw2_protection_region][m_olds_prot_hilo_select]; |
| 239 | source = olds_source_data[m_drgw2_protection_region][m_kb_prot_hilo_select]; |
| 297 | 240 | |
| 298 | | if (m_olds_prot_hilo_select & 1) // $8178fa |
| 241 | if (m_kb_prot_hilo_select & 1) // $8178fa |
| 299 | 242 | { |
| 300 | | m_olds_prot_hilo = (m_olds_prot_hilo & 0x00ff) | (source << 8); // $8178d8 |
| 243 | m_kb_prot_hilo = (m_kb_prot_hilo & 0x00ff) | (source << 8); // $8178d8 |
| 301 | 244 | } |
| 302 | 245 | else |
| 303 | 246 | { |
| 304 | | m_olds_prot_hilo = (m_olds_prot_hilo & 0xff00) | (source << 0); // $8178d8 |
| 247 | m_kb_prot_hilo = (m_kb_prot_hilo & 0xff00) | (source << 0); // $8178d8 |
| 305 | 248 | } |
| 306 | 249 | } |
| 307 | 250 | |
| r26057 | r26058 | |
| 309 | 252 | { |
| 310 | 253 | if (offset == 0) |
| 311 | 254 | { |
| 312 | | m_olds_cmd = data; |
| 255 | m_kb_cmd = data; |
| 313 | 256 | } |
| 314 | 257 | else |
| 315 | 258 | { |
| 316 | | switch (m_olds_cmd) |
| 259 | switch (m_kb_cmd) |
| 317 | 260 | { |
| 318 | 261 | case 0x00: |
| 319 | | m_olds_reg = data; |
| 262 | m_kb_reg = data; |
| 320 | 263 | break; |
| 321 | 264 | |
| 322 | 265 | case 0x02: |
| r26057 | r26058 | |
| 327 | 270 | { |
| 328 | 271 | m_execute_external(); |
| 329 | 272 | |
| 330 | | m_olds_cmd3 = ((data >> 4) + 1) & 0x3; |
| 273 | m_kb_cmd3 = ((data >> 4) + 1) & 0x3; |
| 331 | 274 | } |
| 332 | 275 | break; |
| 333 | 276 | |
| 334 | 277 | case 0x04: |
| 335 | | m_olds_ptr = data; |
| 278 | m_kb_ptr = data; |
| 336 | 279 | break; |
| 337 | 280 | |
| 338 | 281 | case 0x20: |
| r26057 | r26058 | |
| 343 | 286 | case 0x25: |
| 344 | 287 | case 0x26: |
| 345 | 288 | case 0x27: |
| 346 | | m_olds_ptr++; |
| 347 | | olds_protection_calculate_hold(m_olds_cmd & 0x0f, data & 0xff); |
| 289 | m_kb_ptr++; |
| 290 | olds_protection_calculate_hold(m_kb_cmd & 0x0f, data & 0xff); |
| 348 | 291 | break; |
| 349 | 292 | |
| 350 | 293 | // default: |
| r26057 | r26058 | |
| 357 | 300 | { |
| 358 | 301 | if (offset) |
| 359 | 302 | { |
| 360 | | switch (m_olds_cmd) |
| 303 | switch (m_kb_cmd) |
| 361 | 304 | { |
| 362 | 305 | case 0x01: |
| 363 | | return m_olds_reg & 0x7f; |
| 306 | return m_kb_reg & 0x7f; |
| 364 | 307 | |
| 365 | 308 | case 0x02: |
| 366 | 309 | return m_olds_bs | 0x80; |
| 367 | 310 | |
| 368 | 311 | case 0x03: |
| 369 | | return m_olds_cmd3; |
| 312 | return m_kb_cmd3; |
| 370 | 313 | |
| 371 | 314 | case 0x05: |
| 372 | 315 | { |
| 373 | | switch (m_olds_ptr) |
| 316 | switch (m_kb_ptr) |
| 374 | 317 | { |
| 375 | 318 | case 1: |
| 376 | 319 | return 0x3f00 | ((m_kb_game_id >> 0) & 0xff); |
| r26057 | r26058 | |
| 389 | 332 | |
| 390 | 333 | case 5: |
| 391 | 334 | default: // >= 5 |
| 392 | | return 0x3f00 | BITSWAP8(m_olds_prot_hold, 5,2,9,7,10,13,12,15); // $817906 |
| 335 | return 0x3f00 | BITSWAP8(m_kb_prot_hold, 5,2,9,7,10,13,12,15); // $817906 |
| 393 | 336 | } |
| 394 | 337 | } |
| 395 | 338 | |
| r26057 | r26058 | |
| 403 | 346 | } |
| 404 | 347 | |
| 405 | 348 | |
| 406 | | void igs025_device::drgw2_protection_calculate_hold(int y, int z) |
| 407 | | { |
| 408 | | unsigned short old = m_drgw2_prot_hold; |
| 409 | 349 | |
| 410 | | m_drgw2_prot_hold = ((old << 1) | (old >> 15)); |
| 411 | 350 | |
| 412 | | m_drgw2_prot_hold ^= 0x2bad; |
| 413 | | m_drgw2_prot_hold ^= BIT(z, y); |
| 414 | | m_drgw2_prot_hold ^= BIT( old, 7) << 0; |
| 415 | | m_drgw2_prot_hold ^= BIT(~old, 13) << 4; |
| 416 | | m_drgw2_prot_hold ^= BIT( old, 3) << 11; |
| 417 | | |
| 418 | | m_drgw2_prot_hold ^= (m_drgw2_prot_hilo & ~0x0408) << 1; |
| 419 | | } |
| 420 | | |
| 421 | 351 | void igs025_device::drgw2_protection_calculate_hilo() |
| 422 | 352 | { |
| 423 | 353 | UINT8 source; |
| 424 | 354 | |
| 425 | | m_drgw2_prot_hilo_select++; |
| 426 | | if (m_drgw2_prot_hilo_select > 0xeb) { |
| 427 | | m_drgw2_prot_hilo_select = 0; |
| 355 | m_kb_prot_hilo_select++; |
| 356 | if (m_kb_prot_hilo_select > 0xeb) { |
| 357 | m_kb_prot_hilo_select = 0; |
| 428 | 358 | } |
| 429 | 359 | |
| 430 | | source = m_drgw2_source_data[m_drgw2_protection_region][m_drgw2_prot_hilo_select]; |
| 360 | source = m_drgw2_source_data[m_drgw2_protection_region][m_kb_prot_hilo_select]; |
| 431 | 361 | |
| 432 | | if (m_drgw2_prot_hilo_select & 1) |
| 362 | if (m_kb_prot_hilo_select & 1) |
| 433 | 363 | { |
| 434 | | m_drgw2_prot_hilo = (m_drgw2_prot_hilo & 0x00ff) | (source << 8); |
| 364 | m_kb_prot_hilo = (m_kb_prot_hilo & 0x00ff) | (source << 8); |
| 435 | 365 | } |
| 436 | 366 | else |
| 437 | 367 | { |
| 438 | | m_drgw2_prot_hilo = (m_drgw2_prot_hilo & 0xff00) | (source << 0); |
| 368 | m_kb_prot_hilo = (m_kb_prot_hilo & 0xff00) | (source << 0); |
| 439 | 369 | } |
| 440 | 370 | } |
| 441 | 371 | |
| 442 | 372 | READ16_MEMBER(igs025_device::drgw2_d80000_protection_r ) |
| 443 | 373 | { |
| 444 | | switch (m_drgw2_cmd) |
| 374 | switch (m_kb_cmd) |
| 445 | 375 | { |
| 446 | 376 | case 0x05: |
| 447 | 377 | { |
| 448 | | switch (m_drgw2_ptr) |
| 378 | switch (m_kb_ptr) |
| 449 | 379 | { |
| 450 | 380 | case 1: |
| 451 | 381 | return 0x3f00 | ((m_kb_game_id >> 0) & 0xff); |
| r26057 | r26058 | |
| 461 | 391 | |
| 462 | 392 | case 5: |
| 463 | 393 | default: |
| 464 | | return 0x3f00 | BITSWAP8(m_drgw2_prot_hold, 5,2,9,7,10,13,12,15); |
| 394 | return 0x3f00 | BITSWAP8(m_kb_prot_hold, 5,2,9,7,10,13,12,15); |
| 465 | 395 | } |
| 466 | 396 | |
| 467 | 397 | return 0x3f00; |
| r26057 | r26058 | |
| 479 | 409 | // return 0; |
| 480 | 410 | |
| 481 | 411 | // default: |
| 482 | | // logerror("%06x: warning, reading with igs003_reg = %02x\n", space.device().safe_pc(), m_drgw2_cmd); |
| 412 | // logerror("%06x: warning, reading with igs003_reg = %02x\n", space.device().safe_pc(), m_kb_cmd); |
| 483 | 413 | } |
| 484 | 414 | |
| 485 | 415 | return 0; |
| r26057 | r26058 | |
| 489 | 419 | { |
| 490 | 420 | if (offset == 0) |
| 491 | 421 | { |
| 492 | | m_drgw2_cmd = data; |
| 422 | m_kb_cmd = data; |
| 493 | 423 | return; |
| 494 | 424 | } |
| 495 | 425 | |
| 496 | | switch (m_drgw2_cmd) |
| 426 | switch (m_kb_cmd) |
| 497 | 427 | { |
| 498 | 428 | case 0x20: |
| 499 | 429 | case 0x21: |
| r26057 | r26058 | |
| 503 | 433 | case 0x25: |
| 504 | 434 | case 0x26: |
| 505 | 435 | case 0x27: |
| 506 | | m_drgw2_ptr++; |
| 507 | | drgw2_protection_calculate_hold(m_drgw2_cmd & 0x0f, data & 0xff); |
| 436 | m_kb_ptr++; |
| 437 | drgw2_protection_calculate_hold(m_kb_cmd & 0x0f, data & 0xff); |
| 508 | 438 | break; |
| 509 | 439 | |
| 510 | 440 | // case 0x08: // Used only on init.. |
| r26057 | r26058 | |
| 520 | 450 | // break; |
| 521 | 451 | |
| 522 | 452 | // default: |
| 523 | | // logerror("%06x: warning, writing to igs003_reg %02x = %02x\n", space.device().safe_pc(), m_drgw2_cmd, data); |
| 453 | // logerror("%06x: warning, writing to igs003_reg %02x = %02x\n", space.device().safe_pc(), m_kb_cmd, data); |
| 524 | 454 | } |
| 525 | 455 | } |
| 526 | 456 | |
| 527 | 457 | |
| 528 | 458 | |
| 459 | void igs025_device::drgw2_protection_calculate_hold(int y, int z) |
| 460 | { |
| 461 | unsigned short old = m_kb_prot_hold; |
| 529 | 462 | |
| 463 | m_kb_prot_hold = ((old << 1) | (old >> 15)); |
| 464 | |
| 465 | m_kb_prot_hold ^= 0x2bad; |
| 466 | m_kb_prot_hold ^= BIT(z, y); |
| 467 | m_kb_prot_hold ^= BIT(old, 7) << 0; |
| 468 | m_kb_prot_hold ^= BIT(~old, 13) << 4; |
| 469 | m_kb_prot_hold ^= BIT(old, 3) << 11; |
| 470 | |
| 471 | m_kb_prot_hold ^= (m_kb_prot_hilo & ~0x0408) << 1; |
| 472 | } |
| 473 | |
| 474 | |
| 475 | void igs025_device::olds_protection_calculate_hold(int y, int z) // calculated in routine $12dbc2 in olds |
| 476 | { |
| 477 | unsigned short old = m_kb_prot_hold; |
| 478 | |
| 479 | m_kb_prot_hold = ((old << 1) | (old >> 15)); |
| 480 | |
| 481 | m_kb_prot_hold ^= 0x2bad; |
| 482 | m_kb_prot_hold ^= BIT(z, y); |
| 483 | m_kb_prot_hold ^= BIT(old, 7) << 0; |
| 484 | m_kb_prot_hold ^= BIT(~old, 13) << 4; |
| 485 | m_kb_prot_hold ^= BIT(old, 3) << 11; |
| 486 | |
| 487 | m_kb_prot_hold ^= (m_kb_prot_hilo & ~0x0408) << 1; // $81790c |
| 488 | } |
| 489 | |
| 490 | void igs025_device::killbld_protection_calculate_hold(int y, int z) |
| 491 | { |
| 492 | unsigned short old = m_kb_prot_hold; |
| 493 | |
| 494 | m_kb_prot_hold = ((old << 1) | (old >> 15)); |
| 495 | |
| 496 | m_kb_prot_hold ^= 0x2bad; |
| 497 | m_kb_prot_hold ^= BIT(z, y); |
| 498 | m_kb_prot_hold ^= BIT(old, 7) << 0; |
| 499 | m_kb_prot_hold ^= BIT(~old, 13) << 4; |
| 500 | m_kb_prot_hold ^= BIT(old, 3) << 11; |
| 501 | |
| 502 | m_kb_prot_hold ^= (m_kb_prot_hilo & ~0x0408) << 1; |
| 503 | } |
| 504 | |
| 505 | |
| 506 | |
| 507 | |
| 530 | 508 | const device_type IGS025 = &device_creator<igs025_device>; |