Кто любит RISC в жизни, заходим, не стесняемся.
Ответить

Re: Радио 86 РК на STM32

Пт май 25, 2012 07:57:10

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)

Re: Радио 86 РК на STM32

Пт май 25, 2012 08:18:43

бредовые идеи, извините - плохо вьехал в проблему
как то это (на 8 битном авре) обходится без фрэйм буфера http://belogic.com/uzebox/howitsmade.htm может и тут так
иль мегу отдельную поставить для видео

Re: Радио 86 РК на STM32

Пт май 25, 2012 08:41:11

неее.. доп проц под видео не кул. идеи то бредовые, да вот въехать бы не мешало.зачастую бредовые идеи порождают гениальный смысл. Реализация вывода видео здесь очень продумана. Я тоже попервах вообще не понимал как это работает. По сути можно особо не разбираться попробывать обновление повесить на какой нить 30ти герцовый таймер и все. Вот промежуточный буфер хочу убрать....мешает он мне.

Re: Радио 86 РК на STM32

Пт май 25, 2012 12:54:36

Зачем таймер ? полное копирование ?
Ты же всегда знаешь КОГДА и КАКИЕ именно байты обновляются.
Смысл в слепом избыточном процессе ?

Re: Радио 86 РК на STM32

Пт май 25, 2012 13:58:21

хм, тоже мысль. нам же эмулятор выдает конкретный адрес : куда писать. в какое знакоместо.... в принципе зачем нам переписывать целиковый буфер в 2 кило когда можно умело просчитать смещение и записать в этот адрес один байт. :idea:
Ответить