Думаю, дай я перепишу твою программу на Си. За одно посмотрю, как под Специалист программировать.
Там 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:\\>");
Еще фаза некорректно выбирается. Точнее не выбирается вообще. И пока только черный фон.