src/mess/drivers/pasopia.c
| r0 | r8409 | |
| 1 | /*************************************************************************** |
| 2 | |
| 3 | Toshiba PASOPIA / PASOPIA7 emulation |
| 4 | |
| 5 | Skeleton driver. |
| 6 | |
| 7 | ****************************************************************************/ |
| 8 | |
| 9 | #include "emu.h" |
| 10 | #include "cpu/z80/z80.h" |
| 11 | |
| 12 | // sketchy port 0x3c implementation to see what the CPU does... |
| 13 | // however, it writes 0x11 - in theory setting BASIC+BIOS in the lower banks |
| 14 | // and then it writes at 0x0000... maybe bank1 should be RAM? or |
| 15 | // should we have writes to RAM and only reads to BIOS/BASIC? |
| 16 | static WRITE8_HANDLER( paso7_bankswitch ) |
| 17 | { |
| 18 | UINT8 *cpu = memory_region(space->machine, "maincpu"); |
| 19 | UINT8 *basic = memory_region(space->machine, "basic"); |
| 20 | |
| 21 | if (BIT(data, 0)) |
| 22 | { |
| 23 | memory_unmap_write(space, 0x0000, 0x7fff, 0, 0); |
| 24 | memory_set_bankptr(space->machine, "bank1", basic); |
| 25 | memory_set_bankptr(space->machine, "bank2", cpu + 0x10000); |
| 26 | } |
| 27 | else if (BIT(data, 1)) |
| 28 | { |
| 29 | memory_install_write_bank(space, 0x0000, 0x3fff, 0, 0, "bank1"); |
| 30 | memory_install_write_bank(space, 0x4000, 0x7fff, 0, 0, "bank2"); |
| 31 | memory_set_bankptr(space->machine, "bank1", cpu); |
| 32 | memory_set_bankptr(space->machine, "bank2", cpu + 0x4000); |
| 33 | } |
| 34 | else |
| 35 | { |
| 36 | memory_unmap_write(space, 0x0000, 0x7fff, 0, 0); |
| 37 | memory_set_bankptr(space->machine, "bank1", cpu + 0x10000); |
| 38 | memory_set_bankptr(space->machine, "bank2", cpu + 0x10000); |
| 39 | } |
| 40 | |
| 41 | if (BIT(data, 2)) |
| 42 | memory_unmap_readwrite(space, 0x8000, 0xbfff, 0, 0); |
| 43 | else |
| 44 | { |
| 45 | memory_install_write_bank(space, 0x8000, 0xbfff, 0, 0, "bank3"); |
| 46 | memory_set_bankptr(space->machine, "bank3", cpu + 0x8000); |
| 47 | } |
| 48 | // bit 2 also selects vram |
| 49 | |
| 50 | // bit 3? PIO2 port C |
| 51 | |
| 52 | // bank4 is always RAM |
| 53 | } |
| 54 | |
| 55 | static ADDRESS_MAP_START(paso7_mem, ADDRESS_SPACE_PROGRAM, 8) |
| 56 | ADDRESS_MAP_UNMAP_HIGH |
| 57 | AM_RANGE( 0x0000, 0x3fff ) AM_RAMBANK("bank1") |
| 58 | AM_RANGE( 0x4000, 0x7fff ) AM_RAMBANK("bank2") |
| 59 | AM_RANGE( 0x8000, 0xbfff ) AM_RAMBANK("bank3") |
| 60 | AM_RANGE( 0xc000, 0xffff ) AM_RAMBANK("bank4") |
| 61 | ADDRESS_MAP_END |
| 62 | |
| 63 | static ADDRESS_MAP_START( paso7_io , ADDRESS_SPACE_IO, 8) |
| 64 | ADDRESS_MAP_UNMAP_HIGH |
| 65 | ADDRESS_MAP_GLOBAL_MASK(0xff) |
| 66 | AM_RANGE( 0x3c, 0x3c ) AM_WRITE(paso7_bankswitch) |
| 67 | #if 0 |
| 68 | AM_RANGE( 0x08, 0x0b ) // PIO0 |
| 69 | AM_RANGE( 0x0c, 0x0f ) // PIO1 |
| 70 | AM_RANGE( 0x10, 0x11 ) // CRTC |
| 71 | AM_RANGE( 0x20, 0x23 ) // PIO2 |
| 72 | AM_RANGE( 0x28, 0x2b ) // CTC |
| 73 | AM_RANGE( 0x3a, 0x3a ) // PSG0 |
| 74 | AM_RANGE( 0x3b, 0x3b ) // PSG1 |
| 75 | AM_RANGE( 0xe0, 0xe6 ) // FLOPPY |
| 76 | #endif |
| 77 | ADDRESS_MAP_END |
| 78 | |
| 79 | /* Input ports */ |
| 80 | static INPUT_PORTS_START( paso7 ) |
| 81 | INPUT_PORTS_END |
| 82 | |
| 83 | static MACHINE_RESET( paso7 ) |
| 84 | { |
| 85 | } |
| 86 | |
| 87 | static VIDEO_START( paso7 ) |
| 88 | { |
| 89 | } |
| 90 | |
| 91 | static VIDEO_UPDATE( paso7 ) |
| 92 | { |
| 93 | return 0; |
| 94 | } |
| 95 | |
| 96 | static MACHINE_DRIVER_START( paso7 ) |
| 97 | /* basic machine hardware */ |
| 98 | MDRV_CPU_ADD("maincpu",Z80, XTAL_4MHz) |
| 99 | MDRV_CPU_PROGRAM_MAP(paso7_mem) |
| 100 | MDRV_CPU_IO_MAP(paso7_io) |
| 101 | |
| 102 | MDRV_MACHINE_RESET(paso7) |
| 103 | |
| 104 | /* video hardware */ |
| 105 | MDRV_SCREEN_ADD("screen", RASTER) |
| 106 | MDRV_SCREEN_REFRESH_RATE(50) |
| 107 | MDRV_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(2500)) /* not accurate */ |
| 108 | MDRV_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) |
| 109 | MDRV_SCREEN_SIZE(640, 480) |
| 110 | MDRV_SCREEN_VISIBLE_AREA(0, 640-1, 0, 480-1) |
| 111 | MDRV_PALETTE_LENGTH(2) |
| 112 | MDRV_PALETTE_INIT(black_and_white) |
| 113 | |
| 114 | MDRV_VIDEO_START(paso7) |
| 115 | MDRV_VIDEO_UPDATE(paso7) |
| 116 | MACHINE_DRIVER_END |
| 117 | |
| 118 | /* ROM definition */ |
| 119 | ROM_START( pasopia7 ) |
| 120 | ROM_REGION( 0x14000, "maincpu", ROMREGION_ERASEFF ) |
| 121 | ROM_LOAD( "bios.rom", 0x10000, 0x4000, CRC(b8111407) SHA1(ac93ae62db4c67de815f45de98c79cfa1313857d)) |
| 122 | |
| 123 | ROM_REGION( 0x8000, "basic", ROMREGION_ERASEFF ) |
| 124 | ROM_LOAD( "basic.rom", 0x0000, 0x8000, CRC(8a58fab6) SHA1(5e1a91dfb293bca5cf145b0a0c63217f04003ed1)) |
| 125 | |
| 126 | ROM_REGION( 0x800, "font", ROMREGION_ERASEFF ) |
| 127 | ROM_LOAD( "font.rom", 0x0000, 0x0800, CRC(a91c45a9) SHA1(a472adf791b9bac3dfa6437662e1a9e94a88b412)) |
| 128 | |
| 129 | ROM_REGION( 0x20000, "kanji", ROMREGION_ERASEFF ) |
| 130 | ROM_LOAD( "kanji.rom", 0x0000, 0x20000, CRC(6109e308) SHA1(5c21cf1f241ef1fa0b41009ea41e81771729785f)) |
| 131 | ROM_END |
| 132 | |
| 133 | static DRIVER_INIT( paso7 ) |
| 134 | { |
| 135 | UINT8 *bios = memory_region(machine, "maincpu"); |
| 136 | const address_space *space = cputag_get_address_space(machine, "maincpu", ADDRESS_SPACE_PROGRAM); |
| 137 | |
| 138 | memory_unmap_write(space, 0x0000, 0xbfff, 0, 0); |
| 139 | memory_set_bankptr(machine, "bank1", bios + 0x10000); |
| 140 | memory_set_bankptr(machine, "bank2", bios + 0x10000); |
| 141 | memory_set_bankptr(machine, "bank3", bios + 0x10000); |
| 142 | // memory_set_bankptr(machine, "bank4", bios + 0x10000); |
| 143 | } |
| 144 | |
| 145 | /* Driver */ |
| 146 | |
| 147 | /* YEAR NAME PARENT COMPAT MACHINE INPUT INIT COMPANY FULLNAME FLAGS */ |
| 148 | COMP( 19??, pasopia7, 0, 0, paso7, paso7, paso7, "Toshiba", "PASOPIA 7", GAME_NOT_WORKING | GAME_NO_SOUND ) |