Цитата Сообщение от vinxru Посмотреть сообщение
Думаю, дай я перепишу твою программу на Си. За одно посмотрю, как под Специалист программировать.

Там 50% кода занимает функция вывода текста. Её не стоило переписывать, ибо тормозить будет. Мой компилятор пока не особо шустрый. Но что бы разобраться, переписал её. Работает не особо медленнее оригинала.

Обмозгую и добавлю ассемблерных вставок.

Код:
extern uchar chargen[2048];

#define LOADCHAR \
    c = *text, ++text; \
    if(c==0) break; \
    down = (c >= 0xB0 && c < 0xF0); \
    s = chargen + c*8;

#define PRINTX(M,V,A) \
    *d = (*d & M); if(down) *d ^= (*s V); \
    ++d; \
    for(i=8; i; --i) \
      *d = (*d & M) ^ (*s V), ++d, ++s; \
    --s; \
    *d = (*d & M); if(down) *d ^= (*s V); \
    d += A - 9; \

void printx(uchar* dd, char* text) {
  register uchar* d = dd;
  uchar* s;
  uchar c, i, down;
  while(1) { 
    // Фаза 1
    LOADCHAR
    PRINTX(0x03, << 2, 0)

    // Фаза 2
    LOADCHAR
    PRINTX(0xFC, >> 4, 0x100)
    s -= 7;
    PRINTX(0x0F, << 4, 0)

    // Фаза 3
    LOADCHAR
    PRINTX(0xF0, >> 2, 0x100)
    s -= 7;
    PRINTX(0x3F, << 6, 0)

    // Фаза 4
    LOADCHAR
    PRINTX(0xC0, , 0x100)
  } 
}

#define COORDS(x,y) (uchar*)((y)*10+(x)*256+0x9000)

void main() {
  uchar y;

  memset((uchar*)(0x9000), 0, 0x3000);

             //1234567890123456789012345678901234567890123456789012345678901234
  printx(COORDS(0, 0), "+------------ C:\\ ------------+ +------------ C:\\ ------------+");
  for(y=1; y<23; y++)
    printx(COORDS(0, y), "\xB3              \xB3              \xB3 \xB3              \xB3              \xB3");
  printx(COORDS(0, 23), "+--------------+--------------+ +--------------+--------------+");
  printx(COORDS(0, 24), "C:\\>");
Еще фаза некорректно выбирается. Точнее не выбирается вообще. И пока только черный фон.
Когда релиз компилера?
И очень нужен long (32 бита)