Алфавитно-цифровой режим (он во FreeBSD по умолчанию), черный фон... белые буквы...
Подскажите пожалуйста, как мне выводить буквы и цифры на экран прямым доступом к памяти B8000:0000.
Когда-то из-под DOS-а это получалось легко.
FreeBSD такие фокусы не одобряет. Пишет "bus error".
Я даже разучил заклинания типа:
int shm_fd=shm_open("blabla",O_RDWR,0777);
v_addr = (unsigned char*)mmap( 0, 4000, PROT_READ|PROT_WRITE, MAP_SHARED, shm_fd, 0xB8000);
Но это не срабатывает, полученный v_addr вроде указывает на нечто(он не равен ни 0, ни -1), а при попытке записи v_addr[111]='E';
Система все-равно ругается "bus_error".
>Алфавитно-цифровой режим (он во FreeBSD по умолчанию), черный фон... белые буквы...
>Подскажите пожалуйста, как мне выводить буквы и цифры на экран прямым доступом
>к памяти B8000:0000.
> Когда-то из-под DOS-а это получалось легко.
>FreeBSD такие фокусы не одобряет. Пишет "bus error".
>Я даже разучил заклинания типа:
>int shm_fd=shm_open("blabla",O_RDWR,0777);
>v_addr = (unsigned char*)mmap( 0, 4000, PROT_READ|PROT_WRITE, MAP_SHARED, shm_fd, 0xB8000);
>Но это не срабатывает, полученный v_addr вроде указывает на нечто(он не равен
>ни 0, ни -1), а при попытке записи v_addr[111]='E';
>Система все-равно ругается "bus_error".
>
Думаю, проблемотично это сделать. Хотя-бы из общих представлений об архитектуре *NIX. Подразумевается, что у вас на сервере вообще может не быть "экрана", и очень часто так оно и есть. Существует понятие терминала, и функции управления им.
>>Алфавитно-цифровой режим (он во FreeBSD по умолчанию), черный фон... белые буквы...
>>Подскажите пожалуйста, как мне выводить буквы и цифры на экран прямым доступом
>>к памяти B8000:0000.
Ммм, а неужели необходим прямой доступ? Во-первых есть библиотека ncurses. Она позволяет на терминале рисовать такие штуки как нортон коммандир.:) Есть девайс sc и девайс vga. Шуруй от манов на них, там наверняка найдешь как обращаться непосредственно к экрану, и есть еще девайс mem (The special file /dev/mem is an interface to the physical memory of the computer. Byte offsets in this file are interpreted as physical memory addresses. Reading and writing this file is equivalent to reading and writing memory itself. Only offsets within the bounds of /dev/mem are allowed. ). Правда на него права ограниченные, имей это в виду.
Кароче выбор огромный, но более корректно будет ncurses.
> Когда-то из-под DOS-а это получалось легко.
>FreeBSD такие фокусы не одобряет. Пишет "bus error".Почитай документацию о сегментации в защищенном режиме работы процессоров семейства 386, архитектуре Unix. Потом сам будешь нам рассказывать почему такие методы не катят..
Щас расскажу зачем столь странные желания у старого капитана.
У нас, в маленьком офисе посреди маленького провинциального городка
стоит сервер Unix. Стоит на шкафу. Выполняет все что нужно для небольшого офиса. И к этому серверу подключен монитор.
Я хочу на этот монитор вывести часы с огромными цифрами. Время чтоб показывал.
Не хочу загромождать сервер X-Windows, поэтому и режим алфавитно-цифровой.
Программулька получилась микроскопическая, пол-часа потратил, чтоб в текстовом редакторе начертить из ' 'пробелов и '#'(чертей) огромные цифры от 0 до 9.
Закатал в каталог /usr/local/etc/rc.d файлец clock.sh для автозапуска
и программа таки запускается при включении компа и загрузке системы.
НО... Но, написанная с использованием curses программа нормально работает только если ее запустить ручками из командной строки.
А если запускать из /usr/local/etc/rc.d - то выводит на экран заместо гигантских цифирь всякую байду. Ручками запускать трудно - компьютер-то на шкафу. Да и не солидно.
Ну так вот. Значит буду изучать файл /dev/mem, может что выйдет.
> Щас расскажу зачем столь странные желания у старого капитана.
> У нас, в маленьком офисе посреди маленького провинциального городка
>стоит сервер Unix. Стоит на шкафу. Выполняет все что нужно для небольшого
>офиса. И к этому серверу подключен монитор.
>Я хочу на этот монитор вывести часы с огромными цифрами. Время чтоб
>показывал.
>Не хочу загромождать сервер X-Windows, поэтому и режим алфавитно-цифровой.
> Программулька получилась микроскопическая, пол-часа потратил, чтоб в текстовом редакторе начертить
>из ' 'пробелов и '#'(чертей) огромные цифры от 0 до 9.
>
> Закатал в каталог /usr/local/etc/rc.d файлец clock.sh для автозапуска
>и программа таки запускается при включении компа и загрузке системы.
>НО... Но, написанная с использованием curses программа нормально работает только если ее
>запустить ручками из командной строки.
> А если запускать из /usr/local/etc/rc.d - то выводит на
>экран заместо гигантских цифирь всякую байду. Ручками запускать трудно - компьютер-то
>на шкафу. Да и не солидно.
> Ну так вот. Значит буду изучать файл /dev/mem, может что
>выйдет.Не, ну не солидно как-то старому капитану DOS-овские фокусы в Unix переносить. Я все-таки бы потратил время на решение проблемы, почемы curses-прграмма не работает если из rc.d запускается. Может, ей TERM=vt100 или чего-то похожего не хватает? И как, интересно, вы ей текущий терминал устанавливали? Может, имеет смысл поковырять /etc/inittab на предмет замены getty на вашу программу?
>Не, ну не солидно как-то старому капитану DOS-овские фокусы в Unix переносить.
>Я все-таки бы потратил время на решение проблемы, почемы curses-прграмма не
>работает если из rc.d запускается. Может, ей TERM=vt100 или чего-то похожего
>не хватает? И как, интересно, вы ей текущий терминал устанавливали? Может,
>имеет смысл поковырять /etc/inittab на предмет замены getty на вашу
>программу?Я вот о том, что есть файл такой /etc/inittab и что можно через него тип терминала(или какая там еще абстракция) для программы задавать
узнал тока вот сейчас. А скока еще всяких фишек в Unix придется познавать, запоминать. Тексты-то все без картинок, скушные.
А так раз, и пригодились навыки работы напрямую с PC-video-памятью.
Сэкономленное время можно посвятить просмотру телевизора. :)
Большое спасибо Forth.
Я так и сделал, использовал /dev/memПриведу текст программульки.
Показывает скока время, для тех кто плохо видит.#include <stdio.h>
#include <time.h>
#include <sys/mman.h>
#include <sys/types.h>
#include <fcntl.h>
int tik=0;
char pot[]={0xDB,0xDB,0,0}; //это точечки в середине мигать
char not[]=" "; //будут, как в настоящих эл.часахchar* dig[10][20]=
{
{
" ######## ", //1
" ### ### ", //2
" ### ### ", //3
" ### ### ", //4
" ### ### ", //5
" ### ### ", //6
" ### ### ", //7
" ### ### ", //8
" ### ### ", //9
" ### ### ", //10
" ######## " //11
}
,
{
" ### ",
" #### ",
" ##### ",
" ### ",
" ### ",
" ### ",
" ### ",
" ### ",
" ### ",
" ### ",
" ##### "
}
,
{
" ######## ",
" ### ### ",
" ### ### ",
" ### ",
" ### ",
" ### ",
" ### ",
" ### ",
" ### ",
" ### ### ",
" ############ "
}
,
{
" ######## ",
" ### ### ",
" ### ### ",
" ### ",
" ### ",
" ### ",
" ### ",
" ### ",
" ### ### ",
" ### ### ",
" ######## "
}
,
{
" ### ", //1
" ### ", //2
" ### ", //3
" ### ", //4
" ### ", //5
" ### ### ", //6
" ############ ", //7
" ### ", //8
" ### ", //9
" ### ",
" ### " //10
}
,
{
" ############ ", //1
" ### ### ", //2
" ### ", //3
" ### ",
" ######### ", //4
" ### ### ", //5
" ### ", //6
" ### ", //7
" ### ### ", //8
" ### ### ", //9
" ####### " //10
}
,
{
" ###### ", //1
" ### ### ", //2
" ### ### ", //3
" ### ", //4
" ### ",
" ######### ", //5
" ### ### ", //6
" ### ### ", //7
" ### ### ", //8
" ### ### ", //9
" ######## " //10
}
,
{
" ############ ", //1
" ### ### ", //2
" ### ", //3
" ### ", //4
" ### ", //5
" ### ", //6
" ### ", //7
" ### ", //8
" ### ", //9
" ### ",
" ### "
}
,
{
" ######## ", //1
" ### ### ", //2
" ### ### ", //3
" ### ### ", //4
" ### ### ",
" ######## ", //5
" ### ### ", //6
" ### ### ", //7
" ### ### ", //8
" ### ### ", //9
" ######## " //10
}
,
{
" ######## ", //1
" ### ### ", //2
" ### ### ", //3
" ### ### ",
" ### ### ", //4
" ########### ", //5
" ### ", //6
" ### ", //7
" ### ", //8
" ### ### ", //9
" ######## " //10
}
};
char* vim;
//------------------------------------------
main ()
{
void digout(int,int);
void points (); //мигающие в середине точки
void cls();//----do open ekran--------------
unsigned char* ViMe;
int shm_fd=open("/dev/mem",O_RDWR);
if (shm_fd<0){ return;}
vim=(char*)mmap(0, 4000, PROT_READ|PROT_WRITE, MAP_SHARED|MAP_FIXED, shm_fd, 0xB8000);
if (vim<0){return;}int hour, hour_b, hour_s;
int min, min_b, min_s;
time_t t;
struct tm *tm;cls();
for (x=0; x<1000000; x++)//цикл бесконечный, практически
{ //я просто не вспомню while(true) сработает-ли?
t = time(NULL);
tm = localtime(&t);hour=tm->tm_hour;
min=tm->tm_min;hour_b=hour/10;
hour_s=hour%10;
min_b=min/10;
min_s=min%10;digout(8,hour_b); //первое число - расположение цифры на экране
digout(23,hour_s);
digout(43,min_b);
digout(58,min_s);
points (10);sleep(1);
}
}
//------------------------------------
void digout(int x, int chi)
{
int i; int t; char U;
for (i=0; i<11; i++) //for each str
{
for (t=0; t<14; t++)
{
U=dig[chi][i][t];
if (U=='#')U=0xDB;
vim[x*2+(i+5)*160+t*2]=U;
}
}
}
//---------------------------------
void points()
{
char* p1; char* p2;
tik++; if (tik>3)tik=0;
switch (tik)
{
case 0: p1=pot; p2=pot; break;
case 1: p1=not; p2=pot; break;
case 2: p1=pot; p2=pot; break;
case 3: p1=pot; p2=not; break;
default: p1=not; p2=not;
}
vim[39*2+9*160]=p1[0];
vim[39*2+9*160+2]=p1[0];
vim[39*2+12*160]=p2[0];
vim[39*2+12*160+2]=p2[0];
return;
}
//-----------------
void cls()
{
int i=0, lim=25*80;
for (i=0; i<lim; i++)
{
vim[i*2]=0x20;
vim[i*2+1]=2;
}
return;
}
/////////////////
В будущем хочу еще сделать, чтоб выводилась как-нить сетевая активность в офисе. У кого, например, широковещательных пакетов многовато. Или вообще кто чемпион по внешнему трафику. И народу не скучно, и польза от старого выцветшего монитора на шкафу.
извращенцы ;-)#!/bin/sh
while 1 ; do
clear
banner `date`
sleep 1
doneвообщем man date ,banner
Да, вообще-то мой ник для чатов "Изовращенец".
Не знал я о существовании команды -banner-.
Хе-хе, это, видать, в помощь слабовидящим сисадминам.
Теперь ясно, почему FreeBSD не помещается на одну трехдюймовую дискету -
ей мешает груз вот таких вот "полезных" команд.
Часто бывает легче состряпать из обрывков уже имеющихся знаний горбатенькую программулю, чем читать man banner и еще разбираться с обычаями и легендами Unix-терминалов.
Но... в общем, извиняйте, я действительно не знал о таком простом решении.
Кстати, часики в офисе понравились. Теперь буду рисовать названия месяцев "сен.окт.ноя.дек.янв и т.д." - Календарь интерактивный буит.
Ну, это помимо иногда выводящейся диаграммы интернет-трафика.
>Да, вообще-то мой ник для чатов "Изовращенец".
>Не знал я о существовании команды -banner-.
>Хе-хе, это, видать, в помощь слабовидящим сисадминам.
>Теперь ясно, почему FreeBSD не помещается на одну трехдюймовую дискету -
>ей мешает груз вот таких вот "полезных" команд.
>Часто бывает легче состряпать из обрывков уже имеющихся знаний горбатенькую программулю, чем
>читать man banner и еще разбираться с обычаями и легендами Unix-терминалов.
>
> Но... в общем, извиняйте, я действительно не знал о таком
>простом решении.
> Кстати, часики в офисе понравились. Теперь буду рисовать названия месяцев
>"сен.окт.ноя.дек.янв и т.д." - Календарь интерактивный буит.
>Ну, это помимо иногда выводящейся диаграммы интернет-трафика.
>
есть программа cal :)
Вобще то бесконечный цикл может выглядить следующим образом:for(;;){ }
>Вобще то бесконечный цикл может выглядить следующим образом:
>
>for(;;){ }или так:
while (1) {
}Вообще, интересное получилось обсуждение. Особенно спасибо за banner!!!