Сообщение от
Blade
Как сделано отключение TR-DOS?
Порты TRDOS активируются по сигналу DOSEN (обычная логика TRDOS) или SYSEN (известен как CPM= (m_aFF77 & 0x200) == 0)
m_aFF77 - адрес последнего обращения к системному порту #FF77, при записи в порт #FF77 устанавливается так:
Код:
if (DOSEN || SYSEN)
{
m_pFF77 = value;
m_aFF77 = addr;
UpdateMapping();
}
Пзу TRDOS мапится так:
Код:
int index = ((CMR0 & 0x10) >> 2);
int w0 = m_pXFF7[index + 0];
int w1 = m_pXFF7[index + 1];
int w2 = m_pXFF7[index + 2];
int w3 = m_pXFF7[index + 3];
int romPage0 = (w0 & 0x80) != 0 ? (w0 & romMask & 0xFE) | (DOSEN | SYSEN ? 1 : 0) : w0 & romMask;
int romPage1 = (w1 & 0x80) != 0 ? (w1 & romMask & 0xFE) | (DOSEN | SYSEN ? 1 : 0) : w1 & romMask;
int romPage2 = (w2 & 0x80) != 0 ? (w2 & romMask & 0xFE) | (DOSEN | SYSEN ? 1 : 0) : w2 & romMask;
int romPage3 = (w3 & 0x80) != 0 ? (w3 & romMask & 0xFE) | (DOSEN | SYSEN ? 1 : 0) : w3 & romMask;
Здесь:
CMR0 - значение порта #7FFD
romMask - маска пзу, зависит от объема пзу (вычисляется как pageCount-1, где pageCount - число страниц пзу)
m_pXFF7 - значения вывода в порт #xFF7, при записи в порт формируется так:
Код:
m_pXFF7[((CMR0 & 0x10) >> 2) | ((addr >> 14) & 3)] = value ^ 0x3F;
Здесь addr - это адрес порта, value - значение которое выводится в порт.