|
|
1.1 ! root 1: /* Generator is (c) James Ponder, 1997-2001 http://www.squish.net/generator/ */ ! 2: ! 3: #include <stdio.h> ! 4: ! 5: #include "generator.h" ! 6: #include "mem68k.h" ! 7: #include "cpuz80.h" ! 8: #include "memz80.h" ! 9: #include "gensound.h" ! 10: #include "gensoundi.h" ! 11: #include "ui.h" ! 12: ! 13: /*** forward references ***/ ! 14: ! 15: uint8 memz80_fetch_bad_byte(uint16 addr); ! 16: uint8 memz80_fetch_sram_byte(uint16 addr); ! 17: uint8 memz80_fetch_yam_byte(uint16 addr); ! 18: uint8 memz80_fetch_bank_byte(uint16 addr); ! 19: uint8 memz80_fetch_mem_byte(uint16 addr); ! 20: uint8 memz80_fetch_psg_byte(uint16 addr); ! 21: ! 22: void memz80_store_bad_byte(uint16 addr, uint8 data); ! 23: void memz80_store_sram_byte(uint16 addr, uint8 data); ! 24: void memz80_store_yam_byte(uint16 addr, uint8 data); ! 25: void memz80_store_bank_byte(uint16 addr, uint8 data); ! 26: void memz80_store_mem_byte(uint16 addr, uint8 data); ! 27: void memz80_store_psg_byte(uint16 addr, uint8 data); ! 28: ! 29: /*** file scope variables */ ! 30: ! 31: /*** memory map ***/ ! 32: ! 33: t_memz80_def memz80_def[] = { ! 34: { 0x00, 0x40, memz80_fetch_sram_byte, memz80_store_sram_byte }, ! 35: { 0x40, 0x41, memz80_fetch_yam_byte, memz80_store_yam_byte }, ! 36: { 0x41, 0x60, memz80_fetch_bad_byte, memz80_store_bad_byte }, ! 37: { 0x60, 0x70, memz80_fetch_bank_byte, memz80_store_bank_byte }, ! 38: { 0x70, 0x7F, memz80_fetch_bad_byte, memz80_store_bad_byte }, ! 39: { 0x7F, 0x80, memz80_fetch_psg_byte, memz80_store_psg_byte }, ! 40: { 0x80, 0x100, memz80_fetch_mem_byte, memz80_store_mem_byte }, ! 41: { 0, 0, NULL, NULL } ! 42: }; ! 43: ! 44: uint8 (*memz80_fetch_byte[0x100])(uint16 addr); ! 45: void (*memz80_store_byte[0x100])(uint16 addr, uint8 data); ! 46: ! 47: /*** initialise memory tables ***/ ! 48: ! 49: int memz80_init(void) ! 50: { ! 51: int i = 0; ! 52: int j; ! 53: ! 54: do { ! 55: for (j = memz80_def[i].start; j < memz80_def[i].end; j++) { ! 56: memz80_fetch_byte[j] = memz80_def[i].fetch_byte; ! 57: memz80_store_byte[j] = memz80_def[i].store_byte; ! 58: } ! 59: i++; ! 60: } while ((memz80_def[i].start != 0) || (memz80_def[i].end != 0)); ! 61: return 0; ! 62: } ! 63: ! 64: /*** BAD fetch/store ***/ ! 65: ! 66: uint8 memz80_fetch_bad_byte(uint16 addr) ! 67: { ! 68: LOG_CRITICAL(("[Z80] Invalid memory fetch (byte) 0x%X", addr)); ! 69: return 0; ! 70: } ! 71: ! 72: void memz80_store_bad_byte(uint16 addr, uint8 data) ! 73: { ! 74: LOG_CRITICAL(("[Z80] Invalid memory store (byte) 0x%X", addr)); ! 75: } ! 76: ! 77: /*** SRAM fetch/store ***/ ! 78: ! 79: uint8 memz80_fetch_sram_byte(uint16 addr) ! 80: { ! 81: return (*(uint8 *)(cpuz80_ram+(addr & 0x1fff))); ! 82: } ! 83: ! 84: void memz80_store_sram_byte(uint16 addr, uint8 data) ! 85: { ! 86: *(uint8 *)(cpuz80_ram+(addr & 0x1fff)) = data; ! 87: return; ! 88: } ! 89: ! 90: /*** YAM fetch/store ***/ ! 91: ! 92: uint8 memz80_fetch_yam_byte(uint16 addr) ! 93: { ! 94: addr-= 0x4000; ! 95: if (addr < 4) { ! 96: return soundi_ym2612fetch(addr); ! 97: } else { ! 98: LOG_CRITICAL(("[Z80] invalid YAM fetch (byte) 0x%X", addr)); ! 99: return 0; ! 100: } ! 101: } ! 102: ! 103: void memz80_store_yam_byte(uint16 addr, uint8 data) ! 104: { ! 105: addr-= 0x4000; ! 106: /* LOG_USER(("[YAM] (z80) store (byte) 0x%X (%d)", addr, data)); */ ! 107: if (addr < 4) ! 108: soundi_ym2612store(addr, data); ! 109: else ! 110: LOG_CRITICAL(("[Z80] invalid YAM store (byte) 0x%X", addr)); ! 111: } ! 112: ! 113: /*** BANK fetch/store ***/ ! 114: ! 115: uint8 memz80_fetch_bank_byte(uint16 addr) ! 116: { ! 117: /* write only */ ! 118: LOG_CRITICAL(("[Z80] Bank fetch (Byte) 0x%X", addr)); ! 119: return 0; ! 120: } ! 121: ! 122: void memz80_store_bank_byte(uint16 addr, uint8 data) ! 123: { ! 124: /* set bank */ ! 125: cpuz80_bankwrite(data); ! 126: } ! 127: ! 128: /*** MEM (banked) fetch/store ***/ ! 129: ! 130: uint8 memz80_fetch_mem_byte(uint16 addr) ! 131: { ! 132: return (fetchbyte(cpuz80_bank | (addr-0x8000))); ! 133: } ! 134: ! 135: void memz80_store_mem_byte(uint16 addr, uint8 data) ! 136: { ! 137: /* LOG_USER(("WRITE whilst bank = %08X (%08X)", cpuz80_bank, ! 138: addr-0x8000)); */ ! 139: storebyte(cpuz80_bank | (addr-0x8000), data); ! 140: } ! 141: ! 142: /*** PSG fetch/store ***/ ! 143: ! 144: uint8 memz80_fetch_psg_byte(uint16 addr) ! 145: { ! 146: /* write only */ ! 147: LOG_CRITICAL(("[Z80] Invalid memory read (byte) 0x%X", addr)); ! 148: return 0; ! 149: } ! 150: ! 151: void memz80_store_psg_byte(uint16 addr, uint8 data) ! 152: { ! 153: if (addr == 0x7f11) ! 154: sound_psgwrite(data); ! 155: else ! 156: LOG_CRITICAL(("[Z80] Invalid memory store (byte) 0x%X", addr)); ! 157: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.