| 2128 | } |
| 2129 | |
| 2130 | static BYTE ReadByteFromMemoryWithPrefix(const WORD iAddress, AddressPrefix_t& addrPrefix) |
| 2131 | { |
| 2132 | BYTE nData = 0; |
| 2133 | |
| 2134 | if (addrPrefix.nSlot == AddressPrefix_t::kSlotInvalid |
| 2135 | && addrPrefix.nBank == AddressPrefix_t::kBankInvalid |
| 2136 | && addrPrefix.nLangCard == AddressPrefix_t::kLangCardInvalid |
| 2137 | && addrPrefix.bIsROM == false) |
| 2138 | { |
| 2139 | // No prefix, so just read from current MMU's view |
| 2140 | nData = ReadByteFromMemory(iAddress); |
| 2141 | } |
| 2142 | else if (addrPrefix.bIsROM) |
| 2143 | { |
| 2144 | nData = ReadByteFromROM(iAddress); |
| 2145 | } |
| 2146 | else |
| 2147 | { |
| 2148 | if (addrPrefix.nSlot == AddressPrefix_t::kSlotInvalid) // Main, Aux or RamWorks |
| 2149 | { |
| 2150 | uint16_t physicalAddrOffset = iAddress; |
| 2151 | if (addrPrefix.nLangCard == 1 && iAddress >= 0xD000 && iAddress <= 0xDFFF) |
| 2152 | physicalAddrOffset = iAddress - 0x1000; |
| 2153 | |
| 2154 | // Default to main mem, if LC is specified, but bank isn't |
| 2155 | int nBank = addrPrefix.nBank; |
| 2156 | if (addrPrefix.nLangCard != AddressPrefix_t::kLangCardInvalid && addrPrefix.nBank == AddressPrefix_t::kBankInvalid) |
| 2157 | nBank = 0x00; |
| 2158 | |
| 2159 | LPBYTE pMem = NULL; |
| 2160 | if (nBank == 0x00) |
| 2161 | pMem = MemGetMainPtrWithLC(physicalAddrOffset); |
| 2162 | else if (nBank != AddressPrefix_t::kBankInvalid) |
| 2163 | pMem = MemGetAuxPtrWithLC(physicalAddrOffset); |
| 2164 | |
| 2165 | if (pMem) |
| 2166 | nData = *pMem; |
| 2167 | else |
| 2168 | nData = ReadByteFromMemory(iAddress); |
| 2169 | } |
| 2170 | else // Saturn (or slot 0 LC) |
| 2171 | { |
| 2172 | if (iAddress < 0xD000) |
| 2173 | { |
| 2174 | nData = ReadByteFromMemory(iAddress); |
| 2175 | } |
| 2176 | else |
| 2177 | { |
| 2178 | // Default to bank-0, if bank isn't specified |
| 2179 | int nBank = addrPrefix.nBank; |
| 2180 | if (addrPrefix.nBank == AddressPrefix_t::kBankInvalid) |
| 2181 | nBank = 0x0; |
| 2182 | |
| 2183 | uint16_t physicalAddrOffset = iAddress; |
| 2184 | if (addrPrefix.nLangCard == 1 && iAddress >= 0xD000 && iAddress <= 0xDFFF) |
| 2185 | physicalAddrOffset = iAddress - 0x1000; |
| 2186 | |
| 2187 | nData = GetCardMgr().GetLanguageCardMgr().ReadByte(addrPrefix.nSlot, nBank, physicalAddrOffset); |
no test coverage detected