Именно.
Вид для печати
Именно.
Сегодня сил нет паять.
Ну дык тяпница же!
Робяты, а почему вы не хотите сделть отдельный драйвер с быстрым выводом? Допилить его до совместимости с VT52 и пользовать _общий_ драйвер из множества разных программ. А то fifan лепит прямо по экрану, vinxru лепит прямо по экрану, а используют одни и те же идеи вывода символа.
vinxru, если вы не принципиальный писатель исключительно своего кода, то может пригодится мой оконный драйвер? Я вот частенько заимствую из OpenSource - не всегда код (и не всегда он сомпилируем на наших слабых машинках) иногда идеи, и не. Мой драйвер теоретически для VT52, но оттуда используется только позиционирование курсора, очистка экрана и собственно вывод на экран - те п\п что у вас уже есть. Драйвер при вводе символа автоматически поддерживает "текстовый экранный буфер" (SCREEN.C), что при окрытии окна требует в 8 раз меньше места для сохранения подоконного содержимого (т.к. сохраняются коды символов, а не память), а при закрытии окна происходит перевывод на экран этого содержимого (при вашей быстрой п\п вывода символа будет очень симпатично, даже на тормозном Орионовском драйвере было терпимо), а самое главное дает оконные функции без переписывания всего экрана и лазания в экранную память в сугубой псевдографике, т.е. аппаратно независимо - хоть на Апогее с его текстовым экраном, хоть на Орионе с его графическим экраном. Написаны оконные функции (WINDOWS.C), несколько базовых контролов (CONTROL.C) поддерживается некая система псевдообъектных сущностей, связанных сообщениями/событиями. Двухпанельный коммандер как с картинки отрисовывался бы вызовом 2-х подпрограмм создания 2-х объектов (собственно такой коммандер на этих библиотеках и сделан - п\п do_menu() в MENU2.C). А все скроллинги внутри контролов уже реализованы, количество столбцов - это тупо свойство и может переключаться и т.п.
Написано на С. Либа минималистическая (компромисно с удобством), и эффективным компилятором компилируется в несколько килобайт.
http://s58.radikal.ru/i161/1303/bc/99c7db759a6a.jpg
http://s49.radikal.ru/i125/1303/00/e0fe01ca7504.jpg
Все, с пайкой вроде покончено! О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. Жду программатор из Китая.
Я посмотрю, даже попытаюсь скомпилировать. Но выводить графику напрямую на экран быстрее, чем через VT52
Надо определиться6 графику или псевдографику. Второе быстро и через вывод символа.
Время, время. Сегодня все мои родные заболели гриппом и ушли спать, поэтому у меня появилось время доделать Спец.
http://s018.radikal.ru/i500/1303/89/9da02f0ce1dd.jpg
Сделал чтение каталога. Остается это прикрутить к коммандеру.
Хотя есть еще мысль, сделать стандартные точки входа в 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);
}