| 175 | //=========================================================================== |
| 176 | |
| 177 | BYTE Video::VideoSetMode(WORD pc, WORD address, BYTE write, BYTE d, ULONG uExecutedCycles) |
| 178 | { |
| 179 | const uint32_t oldVideoMode = g_uVideoMode; |
| 180 | |
| 181 | VidHDCard* vidHD = GetCardMgr().GetVidHDCard(); |
| 182 | |
| 183 | address &= 0xFF; |
| 184 | switch (address) |
| 185 | { |
| 186 | case 0x00: g_uVideoMode &= ~VF_80STORE; break; |
| 187 | case 0x01: g_uVideoMode |= VF_80STORE; break; |
| 188 | case 0x0C: if (!IS_APPLE2) { g_uVideoMode &= ~VF_80COL; NTSC_SetVideoTextMode(40); } break; |
| 189 | case 0x0D: if (!IS_APPLE2) { g_uVideoMode |= VF_80COL; NTSC_SetVideoTextMode(80); } break; |
| 190 | case 0x0E: if (!IS_APPLE2) g_nAltCharSetOffset = 0; break; // Alternate char set off |
| 191 | case 0x0F: if (!IS_APPLE2) g_nAltCharSetOffset = 256; break; // Alternate char set on |
| 192 | case 0x22: if (vidHD) vidHD->VideoIOWrite(pc, address, write, d, uExecutedCycles); break; // VidHD IIgs video mode register |
| 193 | case 0x29: if (vidHD) vidHD->VideoIOWrite(pc, address, write, d, uExecutedCycles); break; // VidHD IIgs video mode register |
| 194 | case 0x34: if (vidHD) vidHD->VideoIOWrite(pc, address, write, d, uExecutedCycles); break; // VidHD IIgs video mode register |
| 195 | case 0x35: if (vidHD) vidHD->VideoIOWrite(pc, address, write, d, uExecutedCycles); break; // VidHD IIgs video mode register |
| 196 | case 0x50: g_uVideoMode &= ~VF_TEXT; break; |
| 197 | case 0x51: g_uVideoMode |= VF_TEXT; break; |
| 198 | case 0x52: g_uVideoMode &= ~VF_MIXED; break; |
| 199 | case 0x53: g_uVideoMode |= VF_MIXED; break; |
| 200 | case 0x54: g_uVideoMode &= ~VF_PAGE2; break; |
| 201 | case 0x55: g_uVideoMode |= VF_PAGE2; break; |
| 202 | case 0x56: g_uVideoMode &= ~VF_HIRES; break; |
| 203 | case 0x57: g_uVideoMode |= VF_HIRES; break; |
| 204 | case 0x5E: if (!IS_APPLE2) g_uVideoMode |= VF_DHIRES; break; |
| 205 | case 0x5F: if (!IS_APPLE2) g_uVideoMode &= ~VF_DHIRES; break; |
| 206 | } |
| 207 | |
| 208 | if (vidHD && vidHD->IsSHR()) |
| 209 | g_uVideoMode |= VF_SHR; |
| 210 | else |
| 211 | g_uVideoMode &= ~VF_SHR; |
| 212 | |
| 213 | if (!IS_APPLE2) |
| 214 | RGB_SetVideoMode(address); |
| 215 | |
| 216 | // Only 1-cycle delay for VF_TEXT & VF_MIXED mode changes (GH#656) |
| 217 | bool delay = false; |
| 218 | if ((oldVideoMode ^ g_uVideoMode) & (VF_TEXT|VF_MIXED)) |
| 219 | delay = true; |
| 220 | |
| 221 | uint32_t ntscVideoMode = g_uVideoMode; |
| 222 | if ((!IS_APPLE2) && (GetCardMgr().QueryAux() == CT_Empty || GetCardMgr().QueryAux() == CT_80Col)) // aux empty or 80col (GH#1341) |
| 223 | { |
| 224 | g_uVideoMode &= ~VF_DHIRES; |
| 225 | if (GetCardMgr().QueryAux() == CT_Empty) |
| 226 | { |
| 227 | if ((g_uVideoMode & VF_80COL) == 0) |
| 228 | g_uVideoMode &= ~VF_80COL_AUX_EMPTY; |
| 229 | else |
| 230 | g_uVideoMode |= VF_80COL_AUX_EMPTY; |
| 231 | } |
| 232 | |
| 233 | ntscVideoMode = g_uVideoMode; |
| 234 | if (!(ntscVideoMode & VF_TEXT)) |
no test coverage detected