/** * Handle long-word read access from IO memory. */ uae_u32 IoMem_lget(uaecptr addr) { Uint32 idx; Uint32 val; addr &= 0x00ffffff; /* Use a 24 bit address */ if (addr < 0xff8000 || !regs.s) { /* invalid memory addressing --> bus error */ M68000_BusError(addr, BUS_ERROR_READ); return -1; } if (addr > 0xfffffc) { fprintf(stderr, "Illegal IO memory access: IoMem_lget($%x)\n", addr); return -1; } IoAccessBaseAddress = addr; /* Store for exception frame */ nIoMemAccessSize = SIZE_LONG; nBusErrorAccesses = 0; idx = addr - 0xff8000; IoAccessCurrentAddress = addr; pInterceptReadTable[idx](); /* Call 1st handler */ if (pInterceptReadTable[idx+1] != pInterceptReadTable[idx]) { IoAccessCurrentAddress = addr + 1; pInterceptReadTable[idx+1](); /* Call 2nd handler */ } if (pInterceptReadTable[idx+2] != pInterceptReadTable[idx+1]) { IoAccessCurrentAddress = addr + 2; pInterceptReadTable[idx+2](); /* Call 3rd handler */ } if (pInterceptReadTable[idx+3] != pInterceptReadTable[idx+2]) { IoAccessCurrentAddress = addr + 3; pInterceptReadTable[idx+3](); /* Call 4th handler */ } /* Check if we completely read from a bus-error region */ if (nBusErrorAccesses == 4) { M68000_BusError(addr, BUS_ERROR_READ); return -1; } val = IoMem_ReadLong(addr); LOG_TRACE(TRACE_IOMEM_RD, "IO read.l $%06x = $%08x\n", addr, val); return val; }
/** * Handle long-word read access from IO memory. */ uae_u32 IoMem_lget(uaecptr addr) { Uint32 idx; Uint32 val; if ((addr & IO_SEG_MASK) >= IO_SIZE) { /* invalid memory addressing --> bus error */ M68000_BusError(addr, BUS_ERROR_READ); return -1; } IoAccessBaseAddress = addr; /* Store for exception frame */ nIoMemAccessSize = SIZE_LONG; nBusErrorAccesses = 0; idx = addr & IO_SEG_MASK; IoAccessCurrentAddress = addr; pInterceptReadTable[idx](); /* Call 1st handler */ if (pInterceptReadTable[idx+1] != pInterceptReadTable[idx]) { IoAccessCurrentAddress = addr + 1; pInterceptReadTable[idx+1](); /* Call 2nd handler */ } if (pInterceptReadTable[idx+2] != pInterceptReadTable[idx+1]) { IoAccessCurrentAddress = addr + 2; pInterceptReadTable[idx+2](); /* Call 3rd handler */ } if (pInterceptReadTable[idx+3] != pInterceptReadTable[idx+2]) { IoAccessCurrentAddress = addr + 3; pInterceptReadTable[idx+3](); /* Call 4th handler */ } /* Check if we completely read from a bus-error region */ if (nBusErrorAccesses == 4) { M68000_BusError(addr, BUS_ERROR_READ); return -1; } val = IoMem_ReadLong(addr); LOG_TRACE(TRACE_IOMEM_RD, "IO read.l $%06x = $%08x\n", addr, val); return val; }
/** * Handle long-word read access from IO memory. */ uae_u32 IoMem_lget(uaecptr addr) { Uint32 idx; Uint32 val; int n; /* Check if access is made by a new instruction or by the same instruction doing multiple long accesses */ if ( IoAccessInstrPrevClock == CyclesGlobalClockCounter ) IoAccessInstrCount++; /* Same instruction, increase access count */ else { IoAccessInstrPrevClock = CyclesGlobalClockCounter; if ( ( OpcodeFamily != i_MVMEL ) && ( OpcodeFamily != i_MVMLE ) ) IoAccessInstrCount = 0; /* Instruction is not a movem : no multiple accesses */ else IoAccessInstrCount = 1; /* 1st access of a movem.l */ } addr &= 0x00ffffff; /* Use a 24 bit address */ if (addr < 0xff8000 || !regs.s) { /* invalid memory addressing --> bus error */ M68000_BusError(addr, BUS_ERROR_READ, BUS_ERROR_SIZE_LONG, BUS_ERROR_ACCESS_DATA); return -1; } if (addr > 0xfffffc) { fprintf(stderr, "Illegal IO memory access: IoMem_lget($%x)\n", addr); return -1; } IoAccessBaseAddress = addr; /* Store for exception frame */ nIoMemAccessSize = SIZE_LONG; nBusErrorAccesses = 0; idx = addr - 0xff8000; IoAccessCurrentAddress = addr; pInterceptReadTable[idx](); /* Call 1st handler */ for (n = 1; n < nIoMemAccessSize; n++) { if (pInterceptReadTable[idx+n] != pInterceptReadTable[idx+n-1]) { IoAccessCurrentAddress = addr + n; pInterceptReadTable[idx+n](); /* Call n-th handler */ } } /* Check if we completely read from a bus-error region */ if (nBusErrorAccesses == 4) { M68000_BusError(addr, BUS_ERROR_READ, BUS_ERROR_SIZE_LONG, BUS_ERROR_ACCESS_DATA); return -1; } val = IoMem_ReadLong(addr); LOG_TRACE(TRACE_IOMEM_RD, "IO read.l $%06x = $%08x pc=%x\n", addr, val, M68000_GetPC()); return val; }