Вчера вечером сделал первые наброски файлового менеджера.
Каждый программист должен в своей жизни написать Norton CommanderПока контроллер работает только в режиме чтения, поэтому вторая панель не особо нужна.
Но! Она играет важную роль. Текст на экране рисуется относительно долго, и сократив его до двух колонок получилось значительно повысить скорость работы. При этом, при перемещении курсора (когда требуется скролл) я не рисую весь текст повторно, а активно использую копирование видеопамяти.
А копировать видеопамять в цвете у этого компьютера не получится, поэтому расцветки файлов не будет.Но зато быстро.
Теперь надо написать код связывающий его и микроконтроллер.
Как хорошо писать на Си под эти компыФункция копирования видеопамяти:
Просто и быстро. Хотя ассемблерные вставки то же пока присутствуют.Код:void scroll1(char* d, char* s, uchar w, uchar h) { for(; w; --w, d+=0x100, s+=0x100) memswap(d, s, h); }
Макросы я добавил, что ускорить программу. Что бы всё что можно рассчитать во время компиляции, считалось во время компиляции.Код:void fillRect1_int(uchar len, uchar x, uchar* a) { asm { lda fillRect1_int_2 fillRect1_int_cmd2: nop ; CMA = 2F NOP = 00 mov d, a lda fillRect1_int_1 mov e, a fillRect1_int_l0: mov a, m fillRect1_int_cmd: ora d ; XRA D = AA, ANA D = A2, ORA D = B2 mov m, a inx h dcr e jnz fillRect1_int_l0 } } void fillRect1(uchar* a, ushort c, uchar l, uchar r, uchar h) { if(c==0) { fillRect1_int(h, l & r, a); return; } --c; fillRect1_int(h, l, a); a += 0x100; for(; c; --c) { fillRect1_int(h, 0xFF, a); a += 0x100; } fillRect1_int(h, r, a); } #define QUARDCOORDS(XX,YY) ((uchar*)(0x9000)+(YY)+((XX)*256) ) #define FILLRECTARGS(X0,Y,X1) QUARDCOORDS(X0/8, Y0), ((X1)+1)/8-(X0/8), (0xFF >> ((uchar)(X0) & 7)), (0xFF >> ((uchar)((X1)+1) & 7)) ^ 0xFF, (Y1)-(Y0)+1 void fillRect(ushort x0, uchar y0, ushort x1, uchar y1) { fillRect1(FILLRECTARGS(x0, y0, x1, y1)); } void graphXor() { asm { mvi a, 0AAh jmp graph1_l1 } } void graph0() { asm { mvi a, 0A2h sta fillRect1_int_cmd mvi a, 02Fh jmp graph1_l2 } } void graph1() { asm { mvi a, 0B2h graph1_l1: sta fillRect1_int_cmd xra a graph1_l2: sta fillRect1_int_cmd2 } }
Медленно, потому что расчет адреса будет производится при вызове.
fillRect(8,5,184,232);
Быстро, потому что расчет адреса будет производится при компиляции.
fillRect1(FILLRECTARGS(8, 5, 184, 232));
Во вложении RKS файл, код на Си и промежуточный файл на асме.
Контроля переполнения буферов пути и ком строки я пока не сделал.
Еще надо будет свою функцию сканирования клавиатуры делать. Тут нет автоповтора и заглавных букв.
Я заголовочные файлы для BIOS начал писать и граф. библиотеку.





Пока контроллер работает только в режиме чтения, поэтому вторая панель не особо нужна.
Но зато быстро.
Ответить с цитированием