
Сообщение от
breeze
ээээ… WAT? o_O причём тут это? ты щёлкаешь банками по 16к в нужно место для заливки данных и всё, куда ты ещё подключишь уже твоё личное дело, у тебя в наличии 4 окна.
Да, это я ошибся, проверил код - действительно там все символы в одной банке лежат. В разных банках лежат код символа и код аттрибута.
Вот код расчета адреса внутри банки:
Код:
var pageOffsetBw = (x & 1) == 0 ? 0x01C0 : 0x21C0;
var pageOffsetAt = ((x + 1) & 1) == 0 ? 0x01C0 : 0x21C0;
pageOffsetBw += x >> 1;
pageOffsetAt += (x + 1) >> 1;
pageOffsetBw += (y >> 3) * 64;
pageOffsetAt += (y >> 3) * 64;
Страница и видео-режим вычисляются так:
Код:
int videoPage = (CMR0 & 0x08) == 0 ? 5 : 7; // CMR0 is the port #7FFD
var pageAt = Memory.RamPages[videoPage == 5 ? 1 : 3];
var pageBw = Memory.RamPages[videoPage];
var mode = (AtmVideoMode)(((AFE >> 6) & 1) | ((AFE >> 4) & 2)); // ATM 4.50
var mode = (AtmVideoMode)(m_pFF77 & 7); // ATM 7.10
switch (mode) {
case AtmVideoMode.Ega320x200: Renderer = Atm320Renderer; break;
case AtmVideoMode.Hwm640x200: Renderer = Atm640Renderer; break;
case AtmVideoMode.Std256x192: Renderer = SpectrumRenderer; break;
case AtmVideoMode.Txt080x025: Renderer = AtmTxtRenderer; break;
case AtmVideoMode.EvoText080: Renderer = EvoTxtRenderer; break;
case AtmVideoMode.Evo256x192: Renderer = EvoHwmRenderer; break;
case AtmVideoMode.EvoAlco16c: Renderer = EvoA16Renderer; break;
default: Renderer = SpectrumRenderer; break;
}
enum AtmVideoMode {
// ATM 1/2:
Ega320x200 = 0,
Hwm640x200 = 2,
Std256x192 = 3,
Txt080x025 = 6,
// PENTEVO:
EvoText080 = 7,
Evo256x192 = 3 | (2 << 3),
EvoAlco16c = 3 | (1 << 3),
}
m_pFF77 для ATM2 - это порт #FF77 при активном ПЗУ TRDOS или SYS=(AFB & 0x80) != 0 && (AFE & 0x80) != 0;
AFE и AFB - это верхний байт адреса при последней записи в #FE или #FB соответственно.