Annotation of generator/src/mem68k.c, revision 1.1.1.1

1.1       root        1: /*****************************************************************************/
                      2: /*     Generator - Sega Genesis emulation - (c) James Ponder 1997-1998       */
                      3: /*****************************************************************************/
                      4: /*                                                                           */
                      5: /* mem68k.c                                                                  */
                      6: /*                                                                           */
                      7: /*****************************************************************************/
                      8: 
                      9: #include <stdio.h>
                     10: 
                     11: #include "generator.h"
                     12: #include "cpu68k.h"
                     13: #include "mem68k.h"
                     14: #include "vdp.h"
                     15: #include "cpuz80.h"
                     16: #include "gensound.h"
                     17: #include "ui.h"
                     18: 
                     19: #undef DEBUG_BUS
                     20: #undef DEBUG_SRAM
                     21: #undef DEBUG_RAM
                     22: #undef DEBUG_BANK
                     23: 
                     24: /*** forward references ***/
                     25: 
                     26: uint8 *mem68k_memptr_bad(uint32 addr);
                     27: uint8 *mem68k_memptr_rom(uint32 addr);
                     28: uint8 *mem68k_memptr_ram(uint32 addr);
                     29: 
                     30: uint8  mem68k_fetch_bad_byte(uint32 addr);
                     31: uint16 mem68k_fetch_bad_word(uint32 addr);
                     32: uint32 mem68k_fetch_bad_long(uint32 addr);
                     33: uint8  mem68k_fetch_rom_byte(uint32 addr);
                     34: uint16 mem68k_fetch_rom_word(uint32 addr);
                     35: uint32 mem68k_fetch_rom_long(uint32 addr);
                     36: uint8  mem68k_fetch_sram_byte(uint32 addr);
                     37: uint16 mem68k_fetch_sram_word(uint32 addr);
                     38: uint32 mem68k_fetch_sram_long(uint32 addr);
                     39: uint8  mem68k_fetch_yam_byte(uint32 addr);
                     40: uint16 mem68k_fetch_yam_word(uint32 addr);
                     41: uint32 mem68k_fetch_yam_long(uint32 addr);
                     42: uint8  mem68k_fetch_bank_byte(uint32 addr);
                     43: uint16 mem68k_fetch_bank_word(uint32 addr);
                     44: uint32 mem68k_fetch_bank_long(uint32 addr);
                     45: uint8  mem68k_fetch_io_byte(uint32 addr);
                     46: uint16 mem68k_fetch_io_word(uint32 addr);
                     47: uint32 mem68k_fetch_io_long(uint32 addr);
                     48: uint8  mem68k_fetch_ctrl_byte(uint32 addr);
                     49: uint16 mem68k_fetch_ctrl_word(uint32 addr);
                     50: uint32 mem68k_fetch_ctrl_long(uint32 addr);
                     51: uint8  mem68k_fetch_vdp_byte(uint32 addr);
                     52: uint16 mem68k_fetch_vdp_word(uint32 addr);
                     53: uint32 mem68k_fetch_vdp_long(uint32 addr);
                     54: uint8  mem68k_fetch_ram_byte(uint32 addr);
                     55: uint16 mem68k_fetch_ram_word(uint32 addr);
                     56: uint32 mem68k_fetch_ram_long(uint32 addr);
                     57: 
                     58: void mem68k_store_bad_byte(uint32 addr,  uint8  data);
                     59: void mem68k_store_bad_word(uint32 addr,  uint16 data);
                     60: void mem68k_store_bad_long(uint32 addr,  uint32 data);
                     61: void mem68k_store_rom_byte(uint32 addr,  uint8  data);
                     62: void mem68k_store_rom_word(uint32 addr,  uint16 data);
                     63: void mem68k_store_rom_long(uint32 addr,  uint32 data);
                     64: void mem68k_store_sram_byte(uint32 addr, uint8  data);
                     65: void mem68k_store_sram_word(uint32 addr, uint16 data);
                     66: void mem68k_store_sram_long(uint32 addr, uint32 data);
                     67: void mem68k_store_yam_byte(uint32 addr,  uint8  data);
                     68: void mem68k_store_yam_word(uint32 addr,  uint16 data);
                     69: void mem68k_store_yam_long(uint32 addr,  uint32 data);
                     70: void mem68k_store_bank_byte(uint32 addr, uint8  data);
                     71: void mem68k_store_bank_word(uint32 addr, uint16 data);
                     72: void mem68k_store_bank_long(uint32 addr, uint32 data);
                     73: void mem68k_store_io_byte(uint32 addr,   uint8  data);
                     74: void mem68k_store_io_word(uint32 addr,   uint16 data);
                     75: void mem68k_store_io_long(uint32 addr,   uint32 data);
                     76: void mem68k_store_ctrl_byte(uint32 addr, uint8  data);
                     77: void mem68k_store_ctrl_word(uint32 addr, uint16 data);
                     78: void mem68k_store_ctrl_long(uint32 addr, uint32 data);
                     79: void mem68k_store_vdp_byte(uint32 addr,  uint8  data);
                     80: void mem68k_store_vdp_word(uint32 addr,  uint16 data);
                     81: void mem68k_store_vdp_long(uint32 addr,  uint32 data);
                     82: void mem68k_store_ram_byte(uint32 addr,  uint8  data);
                     83: void mem68k_store_ram_word(uint32 addr,  uint16 data);
                     84: void mem68k_store_ram_long(uint32 addr,  uint32 data);
                     85: 
                     86: unsigned int mem68k_cont1_a = 0;
                     87: unsigned int mem68k_cont1_b = 0;
                     88: unsigned int mem68k_cont1_c = 0;
                     89: unsigned int mem68k_cont1_up = 0;
                     90: unsigned int mem68k_cont1_down = 0;
                     91: unsigned int mem68k_cont1_left = 0;
                     92: unsigned int mem68k_cont1_right = 0;
                     93: unsigned int mem68k_cont1_start = 0;
                     94: 
                     95: unsigned int mem68k_cont2_a = 0;
                     96: unsigned int mem68k_cont2_b = 0;
                     97: unsigned int mem68k_cont2_c = 0;
                     98: unsigned int mem68k_cont2_up = 0;
                     99: unsigned int mem68k_cont2_down = 0;
                    100: unsigned int mem68k_cont2_left = 0;
                    101: unsigned int mem68k_cont2_right = 0;
                    102: unsigned int mem68k_cont2_start = 0;
                    103: 
                    104: static unsigned int mem68k_cont1store;
                    105: static unsigned int mem68k_cont2store;
                    106: 
                    107: /*** memory map ***/
                    108: 
                    109: t_mem68k_def mem68k_def[] = {
                    110: 
                    111:   { 0x000, 0x400, mem68k_memptr_rom,
                    112:     mem68k_fetch_rom_byte, mem68k_fetch_rom_word, mem68k_fetch_rom_long,
                    113:     mem68k_store_rom_byte, mem68k_store_rom_word, mem68k_store_rom_long },
                    114: 
                    115:   { 0x400, 0x1000, mem68k_memptr_bad,
                    116:     mem68k_fetch_bad_byte, mem68k_fetch_bad_word, mem68k_fetch_bad_long,
                    117:     mem68k_store_bad_byte, mem68k_store_bad_word, mem68k_store_bad_long },
                    118: 
                    119:   { 0xA00, 0xA02, mem68k_memptr_bad,
                    120:     mem68k_fetch_sram_byte, mem68k_fetch_sram_word, mem68k_fetch_sram_long,
                    121:     mem68k_store_sram_byte, mem68k_store_sram_word, mem68k_store_sram_long },
                    122: 
                    123:   { 0xA04, 0xA05, mem68k_memptr_bad,
                    124:     mem68k_fetch_yam_byte, mem68k_fetch_yam_word, mem68k_fetch_yam_long,
                    125:     mem68k_store_yam_byte, mem68k_store_yam_word, mem68k_store_yam_long },
                    126: 
                    127:   { 0xA06, 0xA07, mem68k_memptr_bad,
                    128:     mem68k_fetch_bank_byte, mem68k_fetch_bank_word, mem68k_fetch_bank_long,
                    129:     mem68k_store_bank_byte, mem68k_store_bank_word, mem68k_store_bank_long },
                    130: 
                    131:   { 0xA10, 0xA11, mem68k_memptr_bad,
                    132:     mem68k_fetch_io_byte, mem68k_fetch_io_word, mem68k_fetch_io_long,
                    133:     mem68k_store_io_byte, mem68k_store_io_word, mem68k_store_io_long },
                    134: 
                    135:   { 0xA11, 0xA12, mem68k_memptr_bad,
                    136:     mem68k_fetch_ctrl_byte, mem68k_fetch_ctrl_word, mem68k_fetch_ctrl_long,
                    137:     mem68k_store_ctrl_byte, mem68k_store_ctrl_word, mem68k_store_ctrl_long },
                    138: 
                    139:   { 0xC00, 0xC01, mem68k_memptr_bad,
                    140:     mem68k_fetch_vdp_byte, mem68k_fetch_vdp_word, mem68k_fetch_vdp_long,
                    141:     mem68k_store_vdp_byte, mem68k_store_vdp_word, mem68k_store_vdp_long },
                    142: 
                    143:   { 0xFF0, 0x1000, mem68k_memptr_ram,
                    144:     mem68k_fetch_ram_byte, mem68k_fetch_ram_word, mem68k_fetch_ram_long,
                    145:     mem68k_store_ram_byte, mem68k_store_ram_word, mem68k_store_ram_long },
                    146: 
                    147:   { 0, 0, NULL, NULL, NULL, NULL, NULL, NULL, NULL }
                    148: 
                    149: };
                    150: 
                    151: uint8 *(*mem68k_memptr[0x1000])(uint32 addr);
                    152: uint8 (*mem68k_fetch_byte[0x1000])(uint32 addr);
                    153: uint16 (*mem68k_fetch_word[0x1000])(uint32 addr);
                    154: uint32 (*mem68k_fetch_long[0x1000])(uint32 addr);
                    155: void (*mem68k_store_byte[0x1000])(uint32 addr, uint8 data);
                    156: void (*mem68k_store_word[0x1000])(uint32 addr, uint16 data);
                    157: void (*mem68k_store_long[0x1000])(uint32 addr, uint32 data);
                    158: 
                    159: /*** initialise memory tables ***/
                    160: 
                    161: int mem68k_init(void)
                    162: {
                    163:   int i = 0;
                    164:   int j;
                    165: 
                    166:   do {
                    167:     for (j = mem68k_def[i].start; j < mem68k_def[i].end; j++) {
                    168:       mem68k_memptr[j] = mem68k_def[i].memptr;
                    169:       mem68k_fetch_byte[j] = mem68k_def[i].fetch_byte;
                    170:       mem68k_fetch_word[j] = mem68k_def[i].fetch_word;
                    171:       mem68k_fetch_long[j] = mem68k_def[i].fetch_long;
                    172:       mem68k_store_byte[j] = mem68k_def[i].store_byte;
                    173:       mem68k_store_word[j] = mem68k_def[i].store_word;
                    174:       mem68k_store_long[j] = mem68k_def[i].store_long;
                    175:     }
                    176:     i++;
                    177:   } while ((mem68k_def[i].start != 0) || (mem68k_def[i].end != 0));
                    178:   return 0;
                    179: }
                    180: 
                    181: 
                    182: /*** memptr routines - called for IPC generation so speed is not vital ***/
                    183: 
                    184: uint8 *mem68k_memptr_bad(uint32 addr)
                    185: {
                    186:   LOG_CRITICAL(("%08X [MEM] Invalid memory access 0x%X", regs.pc, addr));
                    187:   return cpu68k_rom;
                    188: }
                    189: 
                    190: uint8 *mem68k_memptr_rom(uint32 addr)
                    191: {
                    192:   if (addr < cpu68k_romlen) {
                    193:     return(cpu68k_rom+addr);
                    194:   }
                    195:   LOG_CRITICAL(("%08X [MEM] Invalid memory access to ROM 0x%X", regs.pc,
                    196:                addr));
                    197:   return cpu68k_rom;
                    198: }
                    199: 
                    200: uint8 *mem68k_memptr_ram(uint32 addr)
                    201: {
                    202:   /* LOG_USER(("%08X [MEM] Executing code from RAM 0x%X\n", regs.pc, addr)); */
                    203:   addr-= 0xFF0000;
                    204:   return(cpu68k_ram+addr);
                    205: }
                    206: 
                    207: 
                    208: /*** BAD fetch/store ***/
                    209: 
                    210: uint8 mem68k_fetch_bad_byte(uint32 addr)
                    211: {
                    212:   LOG_CRITICAL(("%08X [MEM] Invalid memory fetch (byte) 0x%X", regs.pc,        addr));
                    213:   return 0;
                    214: }
                    215: 
                    216: uint16 mem68k_fetch_bad_word(uint32 addr)
                    217: {
                    218:   LOG_CRITICAL(("%08X [MEM] Invalid memory fetch (word) 0x%X", regs.pc, addr));
                    219:   return 0;
                    220: }
                    221: 
                    222: uint32 mem68k_fetch_bad_long(uint32 addr)
                    223: {
                    224:   LOG_CRITICAL(("%08X [MEM] Invalid memory fetch (long) 0x%X", regs.pc, addr));
                    225:   return 0;
                    226: }
                    227: 
                    228: void mem68k_store_bad_byte(uint32 addr, uint8 data)
                    229: {
                    230:   LOG_CRITICAL(("%08X [MEM] Invalid memory store (byte) 0x%X", regs.pc, addr));
                    231: }
                    232: 
                    233: void mem68k_store_bad_word(uint32 addr, uint16 data)
                    234: {
                    235:   LOG_CRITICAL(("%08X [MEM] Invalid memory store (word) 0x%X", regs.pc, addr));
                    236: }
                    237: 
                    238: void mem68k_store_bad_long(uint32 addr, uint32 data)
                    239: {
                    240:   LOG_CRITICAL(("%08X [MEM] Invalid memory store (long) 0x%X", regs.pc, addr));
                    241: }
                    242: 
                    243: 
                    244: /*** ROM fetch/store ***/
                    245: 
                    246: uint8 mem68k_fetch_rom_byte(uint32 addr)
                    247: {
                    248:   if (addr < cpu68k_romlen) {
                    249:     return (*(uint8 *)(cpu68k_rom+addr));
                    250:   }
                    251:   LOG_CRITICAL(("%08X [ROM] Invalid memory fetch (byte) 0x%X", regs.pc, addr));
                    252:   return 0;
                    253: }
                    254: 
                    255: uint16 mem68k_fetch_rom_word(uint32 addr)
                    256: {
                    257: #ifdef DEBUG_BUS
                    258:   if (addr & 1) {
                    259:     LOG_CRITICAL(("%08X [ROM] Bus error 0x%X", regs.pc, addr));
                    260:     return 0;
                    261:   }
                    262: #endif
                    263:   if (addr < cpu68k_romlen) {
                    264:     return LOCENDIAN16(*(uint16 *)(cpu68k_rom+addr));
                    265:   }
                    266:   LOG_CRITICAL(("%08X [ROM] Invalid memory fetch (word) 0x%X", regs.pc, addr));
                    267:   return 0;
                    268: }
                    269: 
                    270: uint32 mem68k_fetch_rom_long(uint32 addr)
                    271: {
                    272: #ifdef DEBUG_BUS
                    273:   if (addr & 1) {
                    274:     LOG_CRITICAL(("%08X [ROM] Bus error 0x%X", regs.pc, addr));
                    275:     return 0;
                    276:   }
                    277: #endif
                    278:   if (addr < cpu68k_romlen) {
                    279: #ifdef ALIGNLONGS
                    280:     return (LOCENDIAN16(*(uint16 *)(cpu68k_rom+addr))<<16) |
                    281:       LOCENDIAN16(*(uint16 *)(cpu68k_rom+addr+2));
                    282: #else
                    283:     return LOCENDIAN32(*(uint32 *)(cpu68k_rom+addr));
                    284: #endif
                    285:   }
                    286:   LOG_CRITICAL(("%08X [ROM] Invalid memory fetch (long) 0x%X", regs.pc, addr));
                    287:   return 0;
                    288: }
                    289: 
                    290: void mem68k_store_rom_byte(uint32 addr, uint8 data)
                    291: {
                    292:   LOG_CRITICAL(("%08X [ROM] Invalid memory store (byte) 0x%X", regs.pc, addr));
                    293: }
                    294: 
                    295: void mem68k_store_rom_word(uint32 addr, uint16 data)
                    296: {
                    297:   LOG_CRITICAL(("%08X [ROM] Invalid memory store (word) 0x%X", regs.pc, addr));
                    298: }
                    299: 
                    300: void mem68k_store_rom_long(uint32 addr, uint32 data)
                    301: {
                    302:   LOG_CRITICAL(("%08X [ROM] Invalid memory store (long) 0x%X", regs.pc, addr));
                    303: }
                    304: 
                    305: 
                    306: /*** SRAM fetch/store ***/
                    307: 
                    308: uint8 mem68k_fetch_sram_byte(uint32 addr)
                    309: {
                    310: #ifdef DEBUG_SRAM
                    311:   LOG_VERBOSE(("%08X [SRAM] Fetch byte from %X", regs.pc, addr));
                    312: #endif
                    313:   addr-= 0xA00000;
                    314:   return (*(uint8 *)(cpuz80_ram+addr));
                    315: }
                    316: 
                    317: uint16 mem68k_fetch_sram_word(uint32 addr)
                    318: {
                    319: #ifdef DEBUG_BUS
                    320:   if (addr & 1) {
                    321:     LOG_CRITICAL(("%08X [SRAM] Bus error 0x%X", regs.pc, addr));
                    322:     return 0;
                    323:   }
                    324: #endif
                    325: #ifdef DEBUG_SRAM
                    326:   LOG_VERBOSE(("%08X [SRAM] Fetch word from %X", regs.pc, addr));
                    327: #endif
                    328:   addr-= 0xA00000;
                    329:   return LOCENDIAN16(*(uint16 *)(cpuz80_ram+addr));
                    330: }
                    331: 
                    332: uint32 mem68k_fetch_sram_long(uint32 addr)
                    333: {
                    334: #ifdef DEBUG_BUS
                    335:   if (addr & 1) {
                    336:     LOG_CRITICAL(("%08X [SRAM] Bus error 0x%X", regs.pc, addr));
                    337:     return 0;
                    338:   }
                    339: #endif
                    340: #ifdef DEBUG_SRAM
                    341:   LOG_VERBOSE(("%08X [SRAM] Fetch long from %X", regs.pc, addr));
                    342: #endif
                    343:   addr-= 0xA00000;
                    344: #ifdef ALIGNLONGS
                    345:   return (LOCENDIAN16(*(uint16 *)(cpuz80_ram+addr))<<16) |
                    346:     LOCENDIAN16(*(uint16 *)(cpuz80_ram+addr+2));
                    347: #else
                    348:   return LOCENDIAN32(*(uint32 *)(cpuz80_ram+addr));
                    349: #endif
                    350: }
                    351: 
                    352: void mem68k_store_sram_byte(uint32 addr, uint8 data)
                    353: {
                    354: #ifdef DEBUG_SRAM
                    355:   LOG_VERBOSE(("%08X [SRAM] Store byte to %X", regs.pc, addr));
                    356: #endif
                    357:   addr-= 0xA00000;
                    358:   *(uint8 *)(cpuz80_ram+addr) = data;
                    359:   return;
                    360: }
                    361: 
                    362: void mem68k_store_sram_word(uint32 addr, uint16 data)
                    363: {
                    364: #ifdef DEBUG_BUS
                    365:   if (addr & 1) {
                    366:     LOG_CRITICAL(("%08X [SRAM] Bus error 0x%X", regs.pc, addr));
                    367:     return;
                    368:   }
                    369: #endif
                    370: #ifdef DEBUG_SRAM
                    371:   LOG_VERBOSE(("%08X [SRAM] Store word to %X", regs.pc, addr));
                    372: #endif
                    373:   addr-= 0xA00000;
                    374:   *(uint16 *)(cpuz80_ram+addr) = LOCENDIAN16(data);
                    375:   return;
                    376: }
                    377: 
                    378: void mem68k_store_sram_long(uint32 addr, uint32 data)
                    379: {
                    380: #ifdef DEBUG_BUS
                    381:   if (addr & 1) {
                    382:     LOG_CRITICAL(("%08X [SRAM] Bus error 0x%X", regs.pc, addr));
                    383:     return;
                    384:   }
                    385: #endif
                    386: #ifdef DEBUG_SRAM
                    387:   LOG_VERBOSE(("%08X [SRAM] Store byte to %X", regs.pc, addr));
                    388: #endif
                    389:   addr-= 0xA00000;
                    390: #ifdef ALIGNLONGS
                    391:   *(uint16 *)(cpuz80_ram+addr) = LOCENDIAN16((uint16)(data>>16));
                    392:   *(uint16 *)(cpuz80_ram+addr+2) = LOCENDIAN16((uint16)(data));
                    393: #else
                    394:   *(uint32 *)(cpuz80_ram+addr) = LOCENDIAN32(data);
                    395: #endif
                    396:   return;
                    397: }
                    398: 
                    399: 
                    400: /*** YAM fetch/store ***/
                    401: 
                    402: uint8 mem68k_fetch_yam_byte(uint32 addr)
                    403: {
                    404:   addr-= 0xA04000;
                    405:   /* LOG_USER(("%08X [YAM] fetch (byte) 0x%X", regs.pc, addr)); */
                    406:   if (addr < 4) {
                    407:     return sound_ym2612fetch(addr);
                    408:   } else {
                    409:     LOG_CRITICAL(("%08X [YAM] Invalid YAM fetch (byte) 0x%X", regs.pc, addr));
                    410:     return 0;
                    411:   }
                    412: }
                    413: 
                    414: uint16 mem68k_fetch_yam_word(uint32 addr)
                    415: {
                    416: #ifdef DEBUG_BUS
                    417:   if (addr & 1) {
                    418:     LOG_CRITICAL(("%08X [YAM] Bus error 0x%X", regs.pc, addr));
                    419:     return 0;
                    420:   }
                    421: #endif
                    422:   addr-= 0xA04000;
                    423:   LOG_CRITICAL(("%08X [YAM] Invalid memory fetch (word) 0x%X", regs.pc, addr));
                    424:   return 0;
                    425: }
                    426: 
                    427: uint32 mem68k_fetch_yam_long(uint32 addr)
                    428: {
                    429: #ifdef DEBUG_BUS
                    430:   if (addr & 1) {
                    431:     LOG_CRITICAL(("%08X [YAM] Bus error 0x%X", regs.pc, addr));
                    432:     return 0;
                    433:   }
                    434: #endif
                    435:   addr-= 0xA04000;
                    436:   /* no longs please */
                    437:   LOG_CRITICAL(("%08X [YAM] Invalid memory fetch (long) 0x%X", regs.pc, addr));
                    438:   return 0;
                    439: }
                    440: 
                    441: void mem68k_store_yam_byte(uint32 addr, uint8 data)
                    442: {
                    443:   addr-= 0xA04000;
                    444:   /* LOG_USER(("%08X [YAM] (68k) store (byte) 0x%X (%d)", regs.pc, addr,
                    445:      data)); */
                    446:   if (addr < 4)
                    447:     sound_ym2612store(addr, data);
                    448:   else
                    449:     LOG_CRITICAL(("%08X [YAM] Invalid YAM store (byte) 0x%X", regs.pc, addr));
                    450: }
                    451: 
                    452: void mem68k_store_yam_word(uint32 addr, uint16 data)
                    453: {
                    454: #ifdef DEBUG_BUS
                    455:   if (addr & 1) {
                    456:     LOG_CRITICAL(("%08X [YAM] Bus error 0x%X", regs.pc, addr));
                    457:     return;
                    458:   }
                    459: #endif
                    460:   addr-= 0xA04000;
                    461:   LOG_CRITICAL(("%08X [YAM] Invalid memory store (word) 0x%X", regs.pc, addr));
                    462: }
                    463: 
                    464: void mem68k_store_yam_long(uint32 addr, uint32 data)
                    465: {
                    466: #ifdef DEBUG_BUS
                    467:   if (addr & 1) {
                    468:     LOG_CRITICAL(("%08X [YAM] Bus error 0x%X", regs.pc, addr));
                    469:     return;
                    470:   }
                    471: #endif
                    472:   addr-= 0xA04000;
                    473:   /* no longs please */
                    474:   LOG_CRITICAL(("%08X [YAM] Invalid memory store (long) 0x%X", regs.pc, addr));
                    475: }
                    476: 
                    477: 
                    478: /*** BANK fetch/store ***/
                    479: 
                    480: uint8 mem68k_fetch_bank_byte(uint32 addr)
                    481: {
                    482:   /* write only */
                    483:   LOG_CRITICAL(("%08X [BANK] Invalid memory fetch (byte) 0x%X", regs.pc,
                    484:                addr));
                    485:   return 0;
                    486: }
                    487: 
                    488: uint16 mem68k_fetch_bank_word(uint32 addr)
                    489: {
                    490:   /* write only */
                    491:   LOG_CRITICAL(("%08X [BANK] Invalid memory fetch (word) 0x%X", regs.pc,
                    492:                addr));
                    493:   return 0;
                    494: }
                    495: 
                    496: uint32 mem68k_fetch_bank_long(uint32 addr)
                    497: {
                    498:   /* write only */
                    499:   LOG_CRITICAL(("%08X [BANK] Invalid memory fetch (long) 0x%X", regs.pc,
                    500:                addr));
                    501:   return 0;
                    502: }
                    503: 
                    504: void mem68k_store_bank_byte(uint32 addr, uint8 data)
                    505: {
                    506:   addr-= 0xA06000;
                    507:   if (addr == 0x000) {
                    508: #ifdef DEBUG_SRAM
                    509:     LOG_VERBOSE(("%08X [BANK] Store byte to %X", regs.pc, addr));
                    510: #endif
                    511:     cpuz80_bankwrite(data);
                    512:   } else {
                    513:     LOG_CRITICAL(("%08X [BANK] Invalid memory store (byte) 0x%X", regs.pc,
                    514:                  addr));
                    515:   }
                    516: }
                    517: 
                    518: void mem68k_store_bank_word(uint32 addr, uint16 data)
                    519: {
                    520:   addr-= 0xA06000;
                    521:   if (addr == 0x000) {
                    522: #ifdef DEBUG_SRAM
                    523:     LOG_VERBOSE(("%08X [BANK] Store word to %X", regs.pc, addr));
                    524: #endif
                    525:     cpuz80_bankwrite(data>>8);
                    526:   } else {
                    527:     LOG_CRITICAL(("%08X [BANK] Invalid memory store (word) 0x%X", regs.pc,
                    528:                  addr));
                    529:   }
                    530: }
                    531: 
                    532: void mem68k_store_bank_long(uint32 addr, uint32 data)
                    533: {
                    534:   addr-= 0xA06000;
                    535:   /* no longs please */
                    536:   LOG_CRITICAL(("%08X [BANK] Invalid memory store (long) 0x%X", regs.pc,
                    537:                addr));
                    538: }
                    539: 
                    540: 
                    541: /*** I/O fetch/store ***/
                    542: 
                    543: uint8 mem68k_fetch_io_byte(uint32 addr)
                    544: {
                    545:   /* LOG_USER(("%08X [IO] Memory fetch (byte) 0x%X", regs.pc, addr)); */
                    546:   addr-= 0xA10000;
                    547:   switch (addr) {
                    548:   case 0:
                    549:     LOG_CRITICAL(("%08X [IO] Invalid memory fetch (byte) 0x%X",
                    550:                  regs.pc, addr));
                    551:     return 0;
                    552:   case 0x1:
                    553:     /* version */
                    554:     return (1<<5 | vdp_pal<<6 | vdp_overseas<<7);
                    555:   case 0x3:
                    556:     LOG_USER(("%08X [IO] getting controller 1 state - %02X store",
                    557:              regs.pc, mem68k_cont1store));
                    558:     if (mem68k_cont1store & 1<<6) {
                    559:       return (1<<6 | (1-mem68k_cont1_up) | (1-mem68k_cont1_down)<<1 |
                    560:              (1-mem68k_cont1_left)<<2 | (1-mem68k_cont1_right)<<3 |
                    561:              (1-mem68k_cont1_b)<<4 | (1-mem68k_cont1_c)<<5);
                    562:     } else {
                    563:       return ((1-mem68k_cont1_up) | (1-mem68k_cont1_down)<<1 |
                    564:              (1-mem68k_cont1_a)<<4 | (1-mem68k_cont1_start)<<5);
                    565:     }
                    566:   case 0x5:
                    567:     LOG_USER(("%08X [IO] getting controller 2 state - %02X store",
                    568:              regs.pc, mem68k_cont2store));
                    569:     if (mem68k_cont2store & 1<<6) {
                    570:       return (1<<6 | (1-mem68k_cont2_up) | (1-mem68k_cont2_down)<<1 |
                    571:              (1-mem68k_cont2_left)<<2 | (1-mem68k_cont2_right)<<3 |
                    572:              (1-mem68k_cont2_b)<<4 | (1-mem68k_cont2_c)<<5);
                    573:     } else {
                    574:       return ((1-mem68k_cont2_up) | (1-mem68k_cont2_down)<<1 |
                    575:              (1-mem68k_cont2_a)<<4 | (1-mem68k_cont2_start)<<5);
                    576:     }
                    577:   case 0x9:
                    578:   case 0xB:
                    579:     return 0;
                    580:   default:
                    581:     LOG_CRITICAL(("%08X [IO] Invalid memory fetch (byte) 0x%X",
                    582:                  regs.pc, addr));
                    583:     return 0;
                    584:   }
                    585: }
                    586: 
                    587: uint16 mem68k_fetch_io_word(uint32 addr)
                    588: {
                    589:   /* LOG_USER(("%08X [IO] Memory fetch (word) 0x%X", regs.pc, addr)); */
                    590: #ifdef DEBUG_BUS
                    591:   if (addr & 1) {
                    592:     LOG_CRITICAL(("%08X [ROM] Bus error 0x%X", regs.pc, addr));
                    593:     return 0;
                    594:   }
                    595: #endif
                    596:   addr-= 0xA10000;
                    597:   switch (addr>>1) {
                    598:   case 0: /* version */
                    599:     return (1<<5 | vdp_pal<<6 | vdp_overseas<<7);
                    600:   case 1: /* data 1 */
                    601:     return 0;
                    602:   case 2: /* data 2 */
                    603:     return 0;
                    604:   case 3: /* data E */
                    605:     return 0;
                    606:   case 4: /* ctrl 1 */
                    607:   case 5: /* ctrl 2 */
                    608:   case 6: /* ctrl E */
                    609:   case 7: /* TxData 1 */
                    610:   case 8: /* RxData 1 */
                    611:   case 9: /* S-Mode 1 */
                    612:   case 10: /* TxData 2 */
                    613:   case 11: /* RxData 2 */
                    614:   case 12: /* S-Mode 2 */
                    615:   case 13: /* TxData E */
                    616:   case 14: /* RxData E */
                    617:   case 15: /* S-Mode E */
                    618:     LOG_CRITICAL(("%08X [IO] Invalid memory fetch (word) 0x%X",
                    619:                  regs.pc, addr));
                    620:     return 0;
                    621:   default:
                    622:     LOG_CRITICAL(("%08X [IO] Invalid memory fetch (word) 0x%X",
                    623:                  regs.pc, addr));
                    624:     return 0;
                    625:   }
                    626: }
                    627: 
                    628: uint32 mem68k_fetch_io_long(uint32 addr)
                    629: {
                    630: #ifdef DEBUG_BUS
                    631:   if (addr & 1) {
                    632:     LOG_CRITICAL(("%08X [ROM] Bus error 0x%X", regs.pc, addr));
                    633:     return 0;
                    634:   }
                    635: #endif
                    636:   if (addr >= 0xA1001E) {
                    637:     LOG_CRITICAL(("%08X [IO] Invalid memory fetch (long) 0x%X",
                    638:                  regs.pc, addr));
                    639:     return 0;
                    640:   }
                    641:   return (mem68k_fetch_io_word(addr)<<16) | mem68k_fetch_io_word(addr+2);
                    642: }
                    643: 
                    644: void mem68k_store_io_byte(uint32 addr, uint8 data)
                    645: {
                    646:   /* LOG_USER(("%08X [IO] Memory store (byte) 0x%X", regs.pc, addr)); */
                    647:   addr-= 0xA10000;
                    648:   switch (addr) {
                    649:   case 0x3:
                    650:     mem68k_cont1store = data;
                    651:     return;
                    652:   case 0x5:
                    653:     mem68k_cont2store = data;
                    654:     return;
                    655:   case 0x9:
                    656:     if (data != 0x40) {
                    657:      LOG_CRITICAL(("%08X [IO] Invalid controller 1 setting (0x%X)",
                    658:                   regs.pc, data));
                    659:     }
                    660:     return;
                    661:   case 0xB:
                    662:     if (data != 0x40) {
                    663:       LOG_CRITICAL(("%08X [IO] Invalid controller 2 setting (0x%X)",
                    664:                    regs.pc, data));
                    665:     }
                    666:     return;
                    667:   case 0xD:
                    668:   case 0xF:
                    669:   case 0x11:
                    670:   case 0x13:
                    671:   case 0x15:
                    672:   case 0x17:
                    673:   case 0x19:
                    674:   case 0x1B:
                    675:   case 0x1D:
                    676:   case 0x1F:
                    677:     return;
                    678:   default:
                    679:     LOG_CRITICAL(("%08X [IO] Invalid memory store (byte) 0x%X",
                    680:                  regs.pc, addr));
                    681:     return;
                    682:   }
                    683: }
                    684: 
                    685: void mem68k_store_io_word(uint32 addr, uint16 data)
                    686: {
                    687:   /* LOG_USER(("%08X [IO] Memory store (word) 0x%X", regs.pc, addr)); */
                    688: #ifdef DEBUG_BUS
                    689:   if (addr & 1) {
                    690:     LOG_CRITICAL(("%08X [ROM] Bus error 0x%X", regs.pc, addr));
                    691:     return;
                    692:   }
                    693: #endif
                    694:   addr-= 0xA10000;
                    695:   switch (addr>>1) {
                    696:   case 1: /* data 1 */
                    697:   case 2: /* data 2 */
                    698:   case 3: /* data E */
                    699:     LOG_CRITICAL(("%08X [IO] Word store to DATA 0x%X", regs.pc, addr));
                    700:     return;
                    701:   case 4: /* ctrl 1 */
                    702:   case 5: /* ctrl 2 */
                    703:   case 6: /* ctrl E */
                    704:     LOG_CRITICAL(("%08X [IO] Word store to CTRL 0x%X", regs.pc, addr));
                    705:     return;
                    706:   case 7: /* TxData 1 */
                    707:   case 8: /* RxData 1 */
                    708:   case 9: /* S-Mode 1 */
                    709:   case 10: /* TxData 2 */
                    710:   case 11: /* RxData 2 */
                    711:   case 12: /* S-Mode 2 */
                    712:   case 13: /* TxData E */
                    713:   case 14: /* RxData E */
                    714:   case 15: /* S-Mode E */
                    715:     LOG_CRITICAL(("%08X [IO] Invalid memory store (word) 0x%X",
                    716:                  regs.pc, addr));
                    717:     return;
                    718:   default:
                    719:     LOG_CRITICAL(("%08X [IO] Invalid memory store (word) 0x%X",
                    720:                  regs.pc, addr));
                    721:   }
                    722: }
                    723: 
                    724: void mem68k_store_io_long(uint32 addr, uint32 data)
                    725: {
                    726:   addr-= 0xA10000;
                    727:   if (addr >= 0x1E) {
                    728:     LOG_CRITICAL(("%08X [IO] Invalid memory store (long) 0x%X",
                    729:                  regs.pc, addr));
                    730:     return;
                    731:   }
                    732:   mem68k_store_io_word(addr, (uint16)(data<<16));
                    733:   mem68k_store_io_word(addr+2, (uint16)data);
                    734:   return;
                    735: }
                    736: 
                    737: 
                    738: /*** CTRL fetch/store ***/
                    739: 
                    740: uint8 mem68k_fetch_ctrl_byte(uint32 addr)
                    741: {
                    742:   addr-= 0xA11000;
                    743:   /* 0x000 mode (write only), 0x100 z80 busreq, 0x200 z80 reset (write only) */
                    744:   if (addr == 0x100) {
                    745:     return cpuz80_active ? 1 : 0;
                    746:   }
                    747:   LOG_CRITICAL(("%08X [CTRL] Invalid memory fetch (byte) 0x%X",
                    748:                regs.pc, addr));
                    749:   return 0;
                    750: }
                    751: 
                    752: uint16 mem68k_fetch_ctrl_word(uint32 addr)
                    753: {
                    754:   addr-= 0xA11000;
                    755:   /* 0x000 mode (write only), 0x100 z80 busreq, 0x200 z80 reset (write only) */
                    756:   if (addr == 0x100) {
                    757:     return cpuz80_active ? 0x100 : 0;
                    758:   }
                    759:   LOG_CRITICAL(("%08X [CTRL] Invalid memory fetch (word) 0x%X",
                    760:                regs.pc, addr));
                    761:   return 0;
                    762: }
                    763: 
                    764: uint32 mem68k_fetch_ctrl_long(uint32 addr)
                    765: {
                    766:   addr-= 0xA11000;
                    767:   /* no long access allowed */
                    768:   LOG_CRITICAL(("%08X [CTRL] Invalid memory fetch (long) 0x%X",
                    769:                regs.pc, addr));
                    770:   return 0;
                    771: }
                    772: 
                    773: void mem68k_store_ctrl_byte(uint32 addr, uint8 data)
                    774: {
                    775:   addr-= 0xA11000;
                    776:   if (addr == 0x000 || addr == 0x001) {
                    777:     /* z80 memory mode - not applicable for production carts */
                    778:     return;
                    779:   } else if (addr == 0x100) {
                    780:     /* bus request */
                    781:     if (data & 1) {
                    782:       cpuz80_stop();
                    783:       LOG_DEBUG1(("%08X Z80 stopped", regs.pc));
                    784:     } else {
                    785:       cpuz80_start();
                    786:       LOG_DEBUG1(("%08X Z80 started", regs.pc));
                    787:     }
                    788:   } else if (addr == 0x101) {
                    789:     return; /* ignore low byte */
                    790:   } else if (addr == 0x200) {
                    791:     /* z80 reset request */
                    792:     if (!(data & 1)) {
                    793:       /* cpuz80_stop(); */
                    794:       cpuz80_resetcpu();
                    795:       sound_genreset();
                    796:       LOG_DEBUG1(("%08X Z80 reset", regs.pc));
                    797:     } else {
                    798:       cpuz80_unresetcpu();
                    799:       LOG_DEBUG1(("%08X Z80 un-reset", regs.pc));
                    800:     }
                    801:   } else if (addr == 0x201) {
                    802:     return; /* ignore low byte */
                    803:   } else {
                    804:     LOG_CRITICAL(("%08X [CTRL] Invalid memory store (byte) 0x%X",
                    805:                  regs.pc, addr));
                    806:   }
                    807: }
                    808: 
                    809: void mem68k_store_ctrl_word(uint32 addr, uint16 data)
                    810: {
                    811:   addr-= 0xA11000;
                    812:   if (addr == 0x000) {
                    813:     /* z80 memory mode - not applicable for production carts */
                    814:     return;
                    815:   } else if (addr == 0x100) {
                    816:     /* bus request */
                    817:     if (data == 0x100) {
                    818:       cpuz80_stop();
                    819:       LOG_DEBUG1(("%08X Z80 stopped", regs.pc));
                    820:     } else {
                    821:       cpuz80_start();
                    822:       LOG_DEBUG1(("%08X Z80 started", regs.pc));
                    823:     }
                    824:   } else if (addr == 0x200) {
                    825:     /* z80 reset request */
                    826:     if (!(data & 0x100)) {
                    827:       /* cpuz80_stop(); */
                    828:       cpuz80_resetcpu();
                    829:       sound_genreset();
                    830:       LOG_DEBUG1(("%08X Z80 reset", regs.pc));
                    831:     } else {
                    832:       cpuz80_unresetcpu();
                    833:       LOG_DEBUG1(("%08X Z80 un-reset", regs.pc));
                    834:     }
                    835:   } else {
                    836:     LOG_CRITICAL(("%08X [CTRL] Invalid memory store (word) 0x%X",
                    837:                  regs.pc, addr));
                    838:   }
                    839: }
                    840: 
                    841: void mem68k_store_ctrl_long(uint32 addr, uint32 data)
                    842: {
                    843:   addr-= 0xA11000;
                    844:   /* no long access allowed */
                    845:   LOG_CRITICAL(("%08X [CTRL] Invalid memory store (long) 0x%X",
                    846:                regs.pc, addr));
                    847: }
                    848: 
                    849: 
                    850: /*** VDP fetch/store ***/
                    851: 
                    852: uint8 mem68k_fetch_vdp_byte(uint32 addr)
                    853: {
                    854:   addr-= 0xC00000;
                    855:   switch(addr) {
                    856:   case 0:
                    857:   case 1:
                    858:   case 2:
                    859:   case 3:
                    860:     /* data port */
                    861:     LOG_CRITICAL(("%08X [VDP] Byte fetch from data port 0x%X",
                    862:                  regs.pc, addr));
                    863:     return 0;
                    864:   case 4:
                    865:     /* control port */
                    866:     return vdp_status()>>8; /* upper 8 bits */
                    867:   case 5:
                    868:     /* control port */
                    869:     return vdp_status(); /* lower 8 bits */
                    870:   case 6:
                    871:   case 7:
                    872:     /* unknown control port */
                    873:     LOG_CRITICAL(("%08X [VDP] Byte fetch from control port 0x%X",
                    874:                  regs.pc, addr));
                    875:     return 0;
                    876:   case 8:
                    877:     /* hv counter */
                    878:     return mem68k_fetch_vdp_word(0xc00008)>>8; /* upper 8 bits */
                    879:   case 9:
                    880:     /* hv counter */
                    881:     return mem68k_fetch_vdp_word(0xc00008); /* lower 8 bits */
                    882:   case 17:
                    883:     LOG_CRITICAL(("%08X [VDP] PSG byte fetch.", regs.pc));
                    884:     return 0;
                    885:   default:
                    886:     LOG_CRITICAL(("%08X [VDP] Invalid memory fetch (byte) 0x%X",
                    887:                  regs.pc, addr));
                    888:     return 0;
                    889:   }
                    890: }
                    891: 
                    892: uint16 mem68k_fetch_vdp_word(uint32 addr)
                    893: {
                    894: #ifdef DEBUG_BUS
                    895:   if (addr & 1) {
                    896:     LOG_CRITICAL(("%08X [VDP] Bus error 0x%X", regs.pc, addr));
                    897:     return 0;
                    898:   }
                    899: #endif
                    900:   addr-= 0xC00000;
                    901:   switch(addr>>1) {
                    902:   case 0:
                    903:   case 1:
                    904:     /* data port */
                    905: #ifdef DEBUG_VDP
                    906:     LOG_VERBOSE(("%08X [VDP] Word fetch from data port 0x%X",
                    907:                 regs.pc, addr));
                    908: #endif
                    909:     return vdp_fetchdata_word();
                    910:   case 2:
                    911:   case 3:
                    912:     /* control port */
                    913: #ifdef DEBUG_VDP
                    914:     LOG_VERBOSE(("%08X [VDP] Word fetch from control port "
                    915:                 "(status) 0x%X", regs.pc, addr));
                    916: #endif
                    917:     return vdp_status();
                    918:   case 4:
                    919:     /* hv counter */
                    920: #ifdef DEBUG_VDP
                    921:     LOG_VERBOSE(("%08X [VDP] Word fetch from hv counter 0x%X",
                    922:                 regs.pc, addr));
                    923: #endif
                    924:     /* we always return 0 for the horizontal position */
                    925:     if (vdp_interlace) {
                    926:       /* interlace mode - replace lowest bit with highest bit */
                    927:       LOG_CRITICAL(("Interlace mode HV read - check this"));
                    928:       return ((((vdp_line & ~1)<<8) | (vdp_line & 0x100)) & 0xff00) |
                    929:        vdp_gethpos();
                    930:     } else {
                    931:       /* non-interlace mode */
                    932:       LOG_VERBOSE(("%02X", vdp_gethpos()));
                    933:       return (vdp_line<<8) | vdp_gethpos();
                    934:     }
                    935:   case 8:
                    936:     LOG_CRITICAL(("%08X [VDP] PSG/prohibited word fetch.", regs.pc));
                    937:     return 0;
                    938:   default:
                    939:     LOG_CRITICAL(("%08X [VDP] Invalid memory fetch (word) 0x%X",
                    940:                  regs.pc, addr));
                    941:     return 0;
                    942:   }
                    943: }
                    944: 
                    945: uint32 mem68k_fetch_vdp_long(uint32 addr)
                    946: {
                    947: #ifdef DEBUG_BUS
                    948:   if (addr & 1) {
                    949:     LOG_CRITICAL(("%08X [VDP] Bus error 0x%X", regs.pc, addr));
                    950:     return 0;
                    951:   }
                    952: #endif
                    953:   addr-= 0xC00000;
                    954:   switch(addr>>1) {
                    955:   case 0:
                    956:     /* data port */
                    957: #ifdef DEBUG_VDP
                    958:     LOG_VERBOSE(("%08X [VDP] Long fetch from data port 0x%X",
                    959:                 regs.pc, addr));
                    960: #endif
                    961:     return (vdp_fetchdata_word()<<16) | vdp_fetchdata_word();
                    962:   case 2:
                    963:     /* control port */
                    964: #ifdef DEBUG_VDP
                    965:     LOG_VERBOSE(("%08X [VDP] Long fetch from control port 0x%X",
                    966:                 regs.pc, addr));
                    967: #endif
                    968:     return 0;
                    969:   case 4:
                    970:     /* hv counter ish */
                    971:     LOG_CRITICAL(("%08X [VDP] Long fetch from hv/prohibited 0x%X",
                    972:                  regs.pc, addr));
                    973:     return 0;
                    974:   default:
                    975:     LOG_CRITICAL(("%08X [VDP] Invalid memory fetch (word) 0x%X",
                    976:                  regs.pc, addr));
                    977:     return 0;
                    978:   }
                    979: }
                    980: 
                    981: void mem68k_store_vdp_byte(uint32 addr, uint8 data)
                    982: {
                    983:   addr-= 0xC00000;
                    984:   switch(addr) {
                    985:   case 0:
                    986:   case 1:
                    987:   case 2:
                    988:   case 3:
                    989:     /* data port */
                    990: #ifdef DEBUG_VDP
                    991:     LOG_VERBOSE(("%08X [VDP] Byte store to data port 0x%X\n", regs.pc, addr));
                    992: #endif
                    993:     vdp_storedata_byte(data);
                    994:     return;
                    995:   case 4:
                    996:   case 5:
                    997:   case 6:
                    998:   case 7:
                    999:     /* control port */
                   1000:     LOG_CRITICAL(("%08X [VDP] Byte store to control port 0x%X", regs.pc,
                   1001:                  addr));
                   1002:     return;
                   1003:   case 8:
                   1004:   case 9:
                   1005:     /* hv counter */
                   1006:     LOG_CRITICAL(("%08X [VDP] Byte store to hv counter 0x%X", regs.pc, addr));
                   1007:     return;
                   1008:   case 17:
                   1009:     sound_psgwrite(data);
                   1010:     return;
                   1011:   default:
                   1012:     LOG_CRITICAL(("%08X [VDP] Invalid memory store (byte) 0x%X",
                   1013:                  regs.pc, addr));
                   1014:     return;
                   1015:   }
                   1016: }
                   1017: 
                   1018: void mem68k_store_vdp_word(uint32 addr, uint16 data)
                   1019: {
                   1020: #ifdef DEBUG_BUS
                   1021:   if (addr & 1) {
                   1022:     LOG_CRITICAL(("%08X [VDP] Bus error 0x%X", regs.pc, addr));
                   1023:     return;
                   1024:   }
                   1025: #endif
                   1026:   addr-= 0xC00000;
                   1027:   switch(addr>>1) {
                   1028:   case 0:
                   1029:   case 1:
                   1030:     /* data port */
                   1031: #ifdef DEBUG_VDP
                   1032:     LOG_CRITICAL(("%08X [VDP] Word store to data port 0x%X", regs.pc, addr));
                   1033: #endif
                   1034:     vdp_storedata_word(data);
                   1035:     return;
                   1036:   case 2:
                   1037:   case 3:
                   1038: #ifdef DEBUG_VDP
                   1039:     LOG_VERBOSE(("%08X [VDP] Word store to control port 0x%X", regs.pc, addr));
                   1040: #endif
                   1041:     /* control port */
                   1042:     vdp_storectrl(data);
                   1043:     return;
                   1044:   case 4:
                   1045:     /* hv counter */
                   1046:     LOG_CRITICAL(("%08X [VDP] Word store to hv counter 0x%X", regs.pc, addr));
                   1047:     return;
                   1048:   case 8:
                   1049:     LOG_CRITICAL(("%08X [VDP] PSG/prohibited word store.", regs.pc));
                   1050:     return;
                   1051:   default:
                   1052:     LOG_CRITICAL(("%08X [VDP] Invalid memory store (word) 0x%X", regs.pc,
                   1053:                  addr));
                   1054:     return;
                   1055:   }
                   1056: }
                   1057: 
                   1058: void mem68k_store_vdp_long(uint32 addr, uint32 data)
                   1059: {
                   1060: #ifdef DEBUG_BUS
                   1061:   if (addr & 1) {
                   1062:     LOG_CRITICAL(("%08X [VDP] Bus error 0x%X", regs.pc, addr));
                   1063:     return;
                   1064:   }
                   1065: #endif
                   1066:   addr-= 0xC00000;
                   1067:   switch(addr>>1) {
                   1068:   case 0:
                   1069:     /* data port */
                   1070: #ifdef DEBUG_VDP
                   1071:     LOG_VERBOSE(("%08X [VDP] Long store to data port 0x%X\n", regs.pc, addr));
                   1072: #endif
                   1073:     vdp_storedata_word((uint16)(data>>16));
                   1074:     vdp_storedata_word((uint16)(data));
                   1075:     return;
                   1076:   case 2:
                   1077:     /* control port */
                   1078: #ifdef DEBUG_VDP
                   1079:     LOG_VERBOSE(("%08X [VDP] Long store to control port 0x%X", regs.pc, addr));
                   1080: #endif
                   1081:     vdp_storectrl((uint16)(data>>16));
                   1082:     vdp_storectrl((uint16)(data));
                   1083:     return;
                   1084:   case 4:
                   1085:     /* hv counter */
                   1086:     LOG_CRITICAL(("%08X [VDP] Long store to hv/prohibited 0x%X", regs.pc,
                   1087:                  addr));
                   1088:     return;
                   1089:   default:
                   1090:     LOG_CRITICAL(("%08X [VDP] Invalid memory store (long) 0x%X", regs.pc,
                   1091:                  addr));
                   1092:     return;
                   1093:   }
                   1094: }
                   1095: 
                   1096: 
                   1097: /*** RAM fetch/store ***/
                   1098: 
                   1099: uint8 mem68k_fetch_ram_byte(uint32 addr)
                   1100: {
                   1101:   addr-= 0xFF0000;
                   1102:   return (*(uint8 *)(cpu68k_ram+addr));
                   1103: }
                   1104: 
                   1105: uint16 mem68k_fetch_ram_word(uint32 addr)
                   1106: {
                   1107:   addr-= 0xFF0000;
                   1108:   return LOCENDIAN16(*(uint16 *)(cpu68k_ram+addr));
                   1109: }
                   1110: 
                   1111: uint32 mem68k_fetch_ram_long(uint32 addr)
                   1112: {
                   1113:   addr-= 0xFF0000;
                   1114: #ifdef ALIGNLONGS
                   1115:   return (LOCENDIAN16(*(uint16 *)(cpu68k_ram+addr))<<16) |
                   1116:     LOCENDIAN16(*(uint16 *)(cpu68k_ram+addr+2));
                   1117: #else
                   1118:   return LOCENDIAN32(*(uint32 *)(cpu68k_ram+addr));
                   1119: #endif
                   1120: }
                   1121: 
                   1122: void mem68k_store_ram_byte(uint32 addr, uint8 data)
                   1123: {
                   1124:   addr-= 0xFF0000;
                   1125:   *(uint8 *)(cpu68k_ram+addr) = data;
                   1126:   return;
                   1127: }
                   1128: 
                   1129: void mem68k_store_ram_word(uint32 addr, uint16 data)
                   1130: {
                   1131:   addr-= 0xFF0000;
                   1132:   *(uint16 *)(cpu68k_ram+addr) = LOCENDIAN16(data);
                   1133:   return;
                   1134: }
                   1135: 
                   1136: void mem68k_store_ram_long(uint32 addr, uint32 data)
                   1137: {
                   1138:   addr-= 0xFF0000;
                   1139: #ifdef ALIGNLONGS
                   1140:   *(uint16 *)(cpu68k_ram+addr) = LOCENDIAN16((uint16)(data>>16));
                   1141:   *(uint16 *)(cpu68k_ram+addr+2) = LOCENDIAN16((uint16)(data));
                   1142: #else
                   1143:   *(uint32 *)(cpu68k_ram+addr) = LOCENDIAN32(data);
                   1144: #endif
                   1145:   return;
                   1146: }

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.