MCPcopy Create free account
hub / github.com/AppleWin/AppleWin / IO

Method IO

source/LanguageCard.cpp:113–169  ·  view source on GitHub ↗

Source from the content-addressed store, hash-verified

111}
112
113BYTE __stdcall LanguageCardUnit::IO(WORD PC, WORD uAddr, BYTE bWrite, BYTE uValue, ULONG nExecutedCycles)
114{
115 UINT uSlot = ((uAddr & 0xff) >> 4) - 8;
116 LanguageCardUnit* pLC = (LanguageCardUnit*) MemGetSlotParameters(uSlot);
117 _ASSERT(uSlot == SLOT0);
118#if DEBUG_LC_ACCESS
119 LogOutput("S%d: %04X (PC=%04X)\n", uSlot, uAddr, PC);
120#endif
121
122 UINT memmode = pLC->GetLCMemMode();
123 UINT lastmemmode = memmode;
124 memmode &= ~(MF_BANK2 | MF_HIGHRAM);
125
126 if (!(uAddr & 8))
127 memmode |= MF_BANK2;
128
129 if (((uAddr & 2) >> 1) == (uAddr & 1))
130 memmode |= MF_HIGHRAM;
131
132 if (uAddr & 1) // GH#392
133 {
134 if (!bWrite && pLC->GetLastRamWrite())
135 {
136 memmode |= MF_WRITERAM; // UTAIIe:5-23
137 }
138 else if (bWrite && pLC->GetLastRamWrite() && pLC->IsOpcodeRMWabs(uAddr)) // GH#700
139 {
140 memmode |= MF_WRITERAM;
141 }
142 }
143 else
144 {
145 memmode &= ~MF_WRITERAM; // UTAIIe:5-23
146 }
147
148 pLC->SetLastRamWrite( ((uAddr & 1) && !bWrite) ); // UTAIIe:5-23
149 pLC->SetLCMemMode(memmode);
150
151 const bool bCardChanged = GetCardMgr().GetLanguageCardMgr().GetLastSlotToSetMainMemLC() != SLOT0;
152 if (bCardChanged)
153 pLC->SetMainMemLanguageCardMemory();
154
155 //
156
157 if (MemOptimizeForModeChanging(PC, uAddr))
158 return bWrite ? 0 : MemReadFloatingBus(nExecutedCycles);
159
160 // IF THE MEMORY PAGING MODE HAS CHANGED, UPDATE OUR MEMORY IMAGES AND
161 // WRITE TABLES.
162 if ((lastmemmode != memmode) || bCardChanged)
163 {
164 // NB. Always SetMemMode() - locally may be same, but card may've changed
165 GetCardMgr().GetLanguageCardMgr().SetMemMode(uSlot);
166 }
167
168 return bWrite ? 0 : MemReadFloatingBus(nExecutedCycles);
169}
170

Callers

nothing calls this directly

Calls 12

MemGetSlotParametersFunction · 0.85
LogOutputFunction · 0.85
GetLCMemModeMethod · 0.80
GetLastRamWriteMethod · 0.80
IsOpcodeRMWabsMethod · 0.80
SetLastRamWriteMethod · 0.80
SetLCMemModeMethod · 0.80
SetMemModeMethod · 0.80
MemReadFloatingBusFunction · 0.70

Tested by

no test coverage detected