mirror of
https://github.com/AppleWin/AppleWin.git
synced 2025-01-24 00:34:43 +00:00
Added support for Apple II/II+ 2K video ROMs (fixes #205)
This commit is contained in:
parent
6bf7299225
commit
af899fa90a
@ -1289,14 +1289,14 @@ int APIENTRY WinMain(HINSTANCE passinstance, HINSTANCE, LPSTR lpCmdLine, int)
|
||||
if ((g_hCustomRomF8 == INVALID_HANDLE_VALUE) || (GetFileSize(g_hCustomRomF8, NULL) != 0x800))
|
||||
g_bCustomRomF8Failed = true;
|
||||
}
|
||||
else if (strcmp(lpCmdLine, "-videorom") == 0) // Use 4K,8K or 16K video ROM for Enhanced //e
|
||||
else if (strcmp(lpCmdLine, "-videorom") == 0) // Use 2K (for II/II+). Use 4K,8K or 16K video ROM (for Enhanced //e)
|
||||
{
|
||||
lpCmdLine = GetCurrArg(lpNextArg);
|
||||
lpNextArg = GetNextArg(lpNextArg);
|
||||
|
||||
if (!ReadVideoRomFile(lpCmdLine))
|
||||
{
|
||||
std::string msg = "Failed to load video rom (not found or not exactly 4/8/16KiB)";
|
||||
std::string msg = "Failed to load video rom (not found or not exactly 2/4/8/16KiB)";
|
||||
LogFileOutput("%s", msg.c_str());
|
||||
MessageBox(g_hFrameWindow, msg.c_str(), TEXT("AppleWin Error"), MB_OK);
|
||||
}
|
||||
|
@ -154,11 +154,11 @@ void userVideoRom4K(csbits_t csbits, const BYTE* pVideoRom)
|
||||
}
|
||||
}
|
||||
|
||||
void userVideoRom(void)
|
||||
void userVideoRomForIIe(void)
|
||||
{
|
||||
const BYTE* pVideoRom;
|
||||
UINT size = GetVideoRom(pVideoRom); // 4K or 8K
|
||||
if (!size)
|
||||
UINT size = GetVideoRom(pVideoRom); // 2K or 4K or 8K
|
||||
if (size < kVideoRomSize4K)
|
||||
return;
|
||||
|
||||
if (size == kVideoRomSize4K)
|
||||
@ -173,6 +173,50 @@ void userVideoRom(void)
|
||||
|
||||
//-------------------------------------
|
||||
|
||||
void userVideoRom2K(csbits_t csbits, const BYTE* pVideoRom)
|
||||
{
|
||||
int RA = 0; // rom address
|
||||
|
||||
for (int i=0; i<256; i++, RA+=8)
|
||||
{
|
||||
for (int y=0; y<8; y++)
|
||||
{
|
||||
BYTE d=0;
|
||||
BYTE n = pVideoRom[RA+y];
|
||||
|
||||
// UTAII:8-30 "Bit 7 of your EPROM fonts will control flashing in the lower 1024 bytes of the EPROM"
|
||||
// UTAII:8-31 "If you leave O7 (EPROM Output7) reset in these patterns, the resulting characters will be inversions..."
|
||||
if (!(n & 0x80) && RA < 1024)
|
||||
n = n ^ 0x7f;
|
||||
n &= 0x7f;
|
||||
|
||||
// UTAII:8-30 "TEXT ROM pattern is ... reversed"
|
||||
for (BYTE j=0; j<7; j++)
|
||||
{
|
||||
if (n & 1)
|
||||
d |= 1;
|
||||
d <<= 1;
|
||||
n >>= 1;
|
||||
}
|
||||
|
||||
d >>= 1; // Undo the last left shift
|
||||
csbits[0][i][y] = d;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void userVideoRomForIIPlus(void)
|
||||
{
|
||||
const BYTE* pVideoRom;
|
||||
UINT size = GetVideoRom(pVideoRom); // 2K or 4K or 8K
|
||||
if (size != kVideoRomSize2K)
|
||||
return;
|
||||
|
||||
userVideoRom2K(&csbits_a2[0], pVideoRom);
|
||||
}
|
||||
|
||||
//-------------------------------------
|
||||
|
||||
void make_csbits(void)
|
||||
{
|
||||
get_csbits(&csbits_enhanced2e[0], TEXT("CHARSET40"), 0); // Enhanced //e: Alt char set off
|
||||
@ -188,7 +232,10 @@ void make_csbits(void)
|
||||
memcpy(&csbits_2e[1][64], &csbits_2e[0][64], 32*8);
|
||||
|
||||
// Try to use any user-provided video ROM for Enhanced //e
|
||||
userVideoRom();
|
||||
userVideoRomForIIe();
|
||||
|
||||
// Try to use any user-provided video ROM for II/II+
|
||||
userVideoRomForIIPlus();
|
||||
}
|
||||
|
||||
csbits_t GetEnhanced2e_csbits(void)
|
||||
|
@ -1160,7 +1160,7 @@ bool ReadVideoRomFile(const char* pRomFile)
|
||||
return false;
|
||||
|
||||
const ULONG size = GetFileSize(h, NULL);
|
||||
if (size == kVideoRomSize4K || size == kVideoRomSize8K || size == kVideoRomSize16K)
|
||||
if (size == kVideoRomSize2K || size == kVideoRomSize4K || size == kVideoRomSize8K || size == kVideoRomSize16K)
|
||||
{
|
||||
DWORD bytesRead;
|
||||
if (ReadFile(h, g_videoRom, size, &bytesRead, NULL) && bytesRead == size)
|
||||
@ -1197,7 +1197,7 @@ void SetVideoRomRockerSwitch(bool state)
|
||||
|
||||
bool IsVideoRom4K(void)
|
||||
{
|
||||
return g_videoRomSize == 0 || g_videoRomSize == kVideoRomSize4K;
|
||||
return g_videoRomSize <= kVideoRomSize4K;
|
||||
}
|
||||
|
||||
//===========================================================================
|
||||
|
@ -200,7 +200,8 @@ void Video_SetBitmapHeader( WinBmpHeader_t *pBmp, int nWidth, int nHeight, int n
|
||||
|
||||
BYTE VideoSetMode(WORD pc, WORD addr, BYTE bWrite, BYTE d, ULONG uExecutedCycles);
|
||||
|
||||
const UINT kVideoRomSize4K = 4*1024;
|
||||
const UINT kVideoRomSize2K = 1024*2;
|
||||
const UINT kVideoRomSize4K = kVideoRomSize2K*2;
|
||||
bool ReadVideoRomFile(const char* pRomFile);
|
||||
UINT GetVideoRom(const BYTE*& pVideoRom);
|
||||
bool GetVideoRomRockerSwitch(void);
|
||||
|
Loading…
x
Reference in New Issue
Block a user