Spartan пожалуй крутоват будет. В принципе, не буду расхваливать stm32 но камушек многое что заслужил. Спорить не надо. Сделаем и то и то. Основной упор будет на рк86. Знаю что практически все игрушки лезут в видеосистему в обход монитора. О CP/M я как то намекнул, что будет нецелесообразно ее ставить ввиду того что память озу мк ограничена 64 кило памяти, из них системой отъедается порядка 10ти на как уже говорил видеобуферы. Поэтому о более 32кило под память программ и нужды компа как говорится все что есть....
По теме: значит сейчас работа идет в области усовершенствования разгребания видеобуфера.
Ниже подпрограмма, которая формирует непосредственно из символьного буфера данные, которые загоняются в экран.
вызывается так : updateFrameBuffer(tileMap, Font6x8);, где
// строк столбцов
uint8_t tileMap[TILES_HIGH][TILES_WIDE]; // основной буфер (видеопамять 25 на 80 символов )
Font6x8 - массив знакогенератора
Код:
uint8_t Font6x8[256][8] = {
{
_0b00000000, //Character 0
_0b00000000,
_0b00000000,
_0b00000000,
_0b00000000,
_0b00000000,
_0b00000000,
_0b00000000
}, {
_0b00000000, //Character 1
_0b00100000,
_0b01110000,
_0b11111000,
_0b01110000,
_0b00100000,
_0b00000000,
_0b00000000
},
и так далее
после вызова этой подпрограммы экран обновляется. Ни о чем больше думать не надо, дальше работает DMA то есть этап вывода в экран тв заканчивается этой подпрограммой.
Код:
void updateFrameBuffer(uint8_t map[][TILES_WIDE], uint8_t font[][FONT_HEIGHT])
{// 80 8
uint8_t i;
uint8_t j;
uint8_t k;
uint32_t l;
for(j = 0; j < TILES_HIGH ; j++) // цикл на кол-во строк (25)
{
for(k=0;k<8;k++)
{
l=0;
for(i = 0; i < TILES_WIDE; i += 8 ) // цикл на количество символов в строке (80)
{
frameBuffer[(j+TOP_MARGIN)*FONT_HEIGHT+k][l++] = font[map[j][i]][k] << 8 | font[map[j][i+1]][k] << 2 | font[map[j][i+2]][k] >> 4;
frameBuffer[(j+TOP_MARGIN)*FONT_HEIGHT+k][l++] = font[map[j][i+2]][k] << 12 | font[map[j][i+3]][k] << 6 | font[map[j][i+4]][k] | font[map[j][i+5]][k] >> 6;
frameBuffer[(j+TOP_MARGIN)*FONT_HEIGHT+k][l++] = font[map[j][i+5]][k] << 10 | font[map[j][i+6]][k] << 4 | font[map[j][i+7]][k] >> 2;
}
frameBuffer[(j+TOP_MARGIN)*FONT_HEIGHT+k][BUFFER_LINE_LENGTH-1]=0;
}
}
}
пишется все в uint16_t frameBuffer[BUFFER_VERT_SIZE][BUFFER_LINE_LENGTH];
где
#define BUFFER_LINE_LENGTH 31
#define BUFFER_VERT_SIZE 240
вот и получается таки графический массив 7440 байт.
Как уже писал ранее проблема состоит в том, что мне приходится выгребать данные из буфера основной памяти РК
unsigned char main_memory[32767]; адреса 0х76d0 - 0х7fff
алгоритм сейчас такой. я перехватываю запись по адресам 76d0 - 7fff перегоняю ВЕСЬ буфер уже в tileMap, и даю команду запустить updateFrameBuffer. В результате при постоянной записи в экран получается почти 99% замедление работы эмулятора так как постоянно двигаются 2х килобайтные массивы. Зато я увидел работу монитора в целом и проверил эмуляцию 8080 и ps2.как то так. остаются доработки.

У кого есть мысли по этому поводу?
Кому интересно - могу напостить подпрограммы вывода в экран (связка работы таймера и DMA)