src/mess/machine/c64.c
| r11483 | r11484 | |
| 1414 | 1414 | space->install_legacy_write_handler( 0xde00, 0xde01, FUNC(easy_calc_result_bank_w) ); |
| 1415 | 1415 | } |
| 1416 | 1416 | |
| 1417 | static WRITE8_HANDLER( pagefox_bank_w ) |
| 1418 | { |
| 1419 | /* |
| 1420 | |
| 1421 | Die 96KB des Moduls belegen in 6 16K-Banken den Modulbereich von $8000- $c000. |
| 1422 | Die Umschaltung erfolgt mit einem Register in $DE80 (-$DEFF, nicht voll decodiert), |
| 1423 | welches nur beschrieben und nicht gelesen werden kann. Durch Schreiben der Werte |
| 1424 | $08 oder $0A selektiert man eine der beiden RAM-Banke, $FF deselektiert das Modul. |
| 1425 | |
| 1426 | Zusatzlich muss Adresse 1 entsprechend belegt werden :$37 fur Lesezugriffe auf das |
| 1427 | Modul, $35 oder $34 fur Lesezugriffe auf das Ram des C64. Schreibzugriffe lenkt |
| 1428 | der C64 grundsatzlich ins eigene RAM, weshalb zum Beschreiben des Modulrams ein |
| 1429 | Trick notwendig ist: Man schaltet das Ram-Modul parallel zum C64-Ram, rettet vor |
| 1430 | dem Schreiben den C64-Ram-Inhalt und stellt ihn nachher wieder her... |
| 1431 | |
| 1432 | Ldy#0 |
| 1433 | Lda#$35 |
| 1434 | Sta 1 |
| 1435 | Loop Lda (Ptr),y |
| 1436 | Pha |
| 1437 | Lda#$08 |
| 1438 | Sta $DE80 |
| 1439 | Lda (Quell),y |
| 1440 | Sta (Ptr),y |
| 1441 | Lda#$FF |
| 1442 | Sta $DE80 |
| 1443 | Pla |
| 1444 | Sta (Ptr),y |
| 1445 | Iny |
| 1446 | Bne Loop |
| 1447 | |
| 1448 | */ |
| 1449 | |
| 1450 | c64_state *state = space->machine().driver_data<c64_state>(); |
| 1451 | UINT8 *cart = space->machine().region("user1")->base(); |
| 1452 | |
| 1453 | if (data == 0xff) |
| 1454 | { |
| 1455 | // hide cartridge |
| 1456 | state->m_game = 1; |
| 1457 | state->m_exrom = 1; |
| 1458 | c64_bankswitch(space->machine(), 0); |
| 1459 | } |
| 1460 | else |
| 1461 | { |
| 1462 | int bank = (data >> 1) & 0x03; |
| 1463 | int ram = BIT(data, 3); |
| 1464 | |
| 1465 | offs_t offset = ram ? 0x10000 : (bank * 0x4000); |
| 1466 | |
| 1467 | // map cartridge ROMs |
| 1468 | memcpy(state->m_roml, cart + offset, 0x2000); |
| 1469 | memcpy(state->m_romh, cart + offset + 0x2000, 0x2000); |
| 1470 | |
| 1471 | if (state->m_game) |
| 1472 | { |
| 1473 | // enable cartridge |
| 1474 | state->m_game = 0; |
| 1475 | state->m_exrom = 0; |
| 1476 | c64_bankswitch(space->machine(), 0); |
| 1477 | } |
| 1478 | } |
| 1479 | } |
| 1480 | |
| 1481 | static void load_pagefox_cartridge(device_image_interface &image) |
| 1482 | { |
| 1483 | c64_state *state = image.device().machine().driver_data<c64_state>(); |
| 1484 | |
| 1485 | UINT8 *rom = image.get_software_region("rom"); |
| 1486 | UINT8 *cart = image.device().machine().region("user1")->base(); |
| 1487 | memcpy(cart, rom, 0x10000); |
| 1488 | |
| 1489 | // map cartridge ROMs |
| 1490 | memcpy(state->m_roml, cart, 0x2000); |
| 1491 | memcpy(state->m_romh, cart + 0x2000, 0x2000); |
| 1492 | |
| 1493 | // install bankswitch handler |
| 1494 | address_space *space = image.device().machine().device( "maincpu")->memory().space( AS_PROGRAM ); |
| 1495 | space->install_legacy_write_handler( 0xde80, 0xdeff, FUNC(pagefox_bank_w) ); |
| 1496 | } |
| 1497 | |
| 1417 | 1498 | static void c64_software_list_cartridge_load(device_image_interface &image) |
| 1418 | 1499 | { |
| 1419 | 1500 | c64_state *state = image.device().machine().driver_data<c64_state>(); |
| r11483 | r11484 | |
| 1447 | 1528 | |
| 1448 | 1529 | if (!strcmp(cart_type, "easy_calc_result")) |
| 1449 | 1530 | load_easy_calc_result_cartridge(image); |
| 1531 | |
| 1532 | if (!strcmp(cart_type, "pagefox")) |
| 1533 | load_pagefox_cartridge(image); // TODO writing to the expanded 32KB RAM is not supported! |
| 1450 | 1534 | } |
| 1451 | 1535 | } |
| 1452 | 1536 | |