Именно.
Именно.
Сегодня сил нет паять.
Ну дык тяпница же!
Робяты, а почему вы не хотите сделть отдельный драйвер с быстрым выводом? Допилить его до совместимости с VT52 и пользовать _общий_ драйвер из множества разных программ. А то fifan лепит прямо по экрану, vinxru лепит прямо по экрану, а используют одни и те же идеи вывода символа.
vinxru, если вы не принципиальный писатель исключительно своего кода, то может пригодится мой оконный драйвер? Я вот частенько заимствую из OpenSource - не всегда код (и не всегда он сомпилируем на наших слабых машинках) иногда идеи, и не. Мой драйвер теоретически для VT52, но оттуда используется только позиционирование курсора, очистка экрана и собственно вывод на экран - те п\п что у вас уже есть. Драйвер при вводе символа автоматически поддерживает "текстовый экранный буфер" (SCREEN.C), что при окрытии окна требует в 8 раз меньше места для сохранения подоконного содержимого (т.к. сохраняются коды символов, а не память), а при закрытии окна происходит перевывод на экран этого содержимого (при вашей быстрой п\п вывода символа будет очень симпатично, даже на тормозном Орионовском драйвере было терпимо), а самое главное дает оконные функции без переписывания всего экрана и лазания в экранную память в сугубой псевдографике, т.е. аппаратно независимо - хоть на Апогее с его текстовым экраном, хоть на Орионе с его графическим экраном. Написаны оконные функции (WINDOWS.C), несколько базовых контролов (CONTROL.C) поддерживается некая система псевдообъектных сущностей, связанных сообщениями/событиями. Двухпанельный коммандер как с картинки отрисовывался бы вызовом 2-х подпрограмм создания 2-х объектов (собственно такой коммандер на этих библиотеках и сделан - п\п do_menu() в MENU2.C). А все скроллинги внутри контролов уже реализованы, количество столбцов - это тупо свойство и может переключаться и т.п.
Написано на С. Либа минималистическая (компромисно с удобством), и эффективным компилятором компилируется в несколько килобайт.
Последний раз редактировалось Error404; 03.03.2013 в 00:18.
Лучше сделать и жалеть, чем не сделать и жалеть.
Некоторые из моих поделок тут: https://github.com/serge-404
Все, с пайкой вроде покончено! Оcталось программы доделать.
---------- Post added at 02:17 ---------- Previous post was at 02:11 ----------
Процессоры кончилисьОдин на 4 компьютера.
---------- Post added at 02:19 ---------- Previous post was at 02:17 ----------
Программатор шьет теперь только флешки на MX28F1000. Жду программатор из Китая.
С любовью к вам, Yandex.Direct
Размещение рекламы на форуме способствует его дальнейшему развитию
Я посмотрю, даже попытаюсь скомпилировать. Но выводить графику напрямую на экран быстрее, чем через VT52
Надо определиться6 графику или псевдографику. Второе быстро и через вывод символа.
Время, время. Сегодня все мои родные заболели гриппом и ушли спать, поэтому у меня появилось время доделать Спец.
Сделал чтение каталога. Остается это прикрутить к коммандеру.
Хотя есть еще мысль, сделать стандартные точки входа в BIOS. Запуск программы, чтение файла, чтение каталога. Что бы разделить коммандер и SD-контроллер.
Код:#include <spec/bios.h> typedef struct { ulong fsize; /* File size */ ushort fdate; /* Last modified date */ ushort ftime; /* Last modified time */ uchar fattrib; /* Attribute */ char fname[13]; /* File name */ } FILINFO; #define CLC_PORT (*(char*)0xF001) #define DATA_PORT (*(char*)0xF002) #define CTL_PORT (*(char*)0xF003) #define CLC_BIT 0x80 #define SEND_MODE 0x90 // Настройка: 1 0 0 A СH 0 B CL 1=ввод 0=вывод #define RECV_MODE 0x99 void pulse() { CLC_PORT = CLC_BIT; CLC_PORT = 0; } void cmdStart() { // Начало передачи CTL_PORT = SEND_MODE; // Передаем код команды DATA_PORT = 0x13; pulse(); DATA_PORT = 0xB4; pulse(); DATA_PORT = 0x57; pulse(); } uchar wait() { for(;;) { pulse(); if(DATA_PORT == 0) continue; if(DATA_PORT == 1) return 0; return 1; } } uchar openDir(char* path) { cmdStart(); // Код команды DATA_PORT = 3; pulse(); // Передаем путь for(;;) { DATA_PORT = *path; pulse(); if(*path==0) break; ++path; } // Переключаемся в режим приема CTL_PORT = RECV_MODE; // МК должен ответить кодом 12h pulse(); if(DATA_PORT != 0x12) return 0xEF; // Ожидание готовности if(wait()) return 0xEE; // Результат выполнения pulse(); return DATA_PORT; } void recvBuffer(void* b, uchar l) { while(l) { pulse(); *(uchar*)b = DATA_PORT; ++((uchar*)b); --l; } } uchar readDir(FILINFO* dir) { uchar r; cmdStart(); // Код команды DATA_PORT = 4; pulse(); // Переключаемся в режим приема CTL_PORT = RECV_MODE; // МК должен ответить кодом 12h pulse(); if(DATA_PORT != 0x12) return 0xEF; // Ошибка // Ожидание готовности if(wait()) return 0xEE; // Ошибка // МК должен ответить кодом ?? pulse(); r = DATA_PORT; // Принимаем файл recvBuffer(dir, sizeof(FILINFO)); // Последний файл if(dir->fname[0]==0) return 0xEC; return r; } void main() { FILINFO dir; uchar i; uchar n; puts("OPENDIR & READDIR TEST\r\n"); if(i=openDir("")) { puts("OPENDIR RESULT "); puthex(i); puts("\r\n"); while(1); } puts("OPENED\r\n"); n=0; for(;;) { i=readDir(&dir); if(i) break; puthex(n); putch(' '); for(i=0; i<13 && dir.fname[i]; ++i) putch(dir.fname[i]); for(; i<13; ++i) putch(' '); putch(' '); puthex(((char*)&dir.fsize)[3]); puthex(((char*)&dir.fsize)[2]); puthex(((char*)&dir.fsize)[1]); puthex(((char*)&dir.fsize)[0]); putch(' '); puthex(((char*)&dir.fdate)[1]); puthex(((char*)&dir.fdate)[0]); putch(' '); puthex(((char*)&dir.ftime)[1]); puthex(((char*)&dir.ftime)[0]); putch(' '); puthex(dir.fattrib); puts("\r\n"); ++n; } puts("READDIR RESULT "); puthex(i); puts("\r\n"); while(1); }
Лучше сделать и жалеть, чем не сделать и жалеть.
Некоторые из моих поделок тут: https://github.com/serge-404
Эту тему просматривают: 1 (пользователей: 0 , гостей: 1)