The OpenNET Project / Index page

[ новости /+++ | форум | теги | ]

форумы  помощь  поиск  регистрация  майллист  ВХОД  слежка  RSS
"Доступ к видеопамяти по адресу B8000 и иже с ним"
Вариант для распечатки  
Пред. тема | След. тема 
Форумы Программирование под UNIX (Public)
Изначальное сообщение [Проследить за развитием треда]

"Доступ к видеопамяти по адресу B8000 и иже с ним" 
Сообщение от КапитанПень Искать по авторуВ закладки(ok) on 11-Сен-05, 22:58  (MSK)
Алфавитно-цифровой режим (он во 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".


  

  Правка | Высказать мнение | Ответить | Рекомендовать в FAQ | Cообщить модератору | Наверх

 Оглавление

Индекс форумов | Темы | Пред. тема | След. тема
Сообщения по теме

1. "Доступ к видеопамяти по адресу B8000 и иже с ним" 
Сообщение от mezantrop Искать по авторуВ закладки(??) on 12-Сен-05, 09:57  (MSK)
>Алфавитно-цифровой режим (он во 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. Подразумевается, что у вас на сервере вообще может не быть "экрана", и очень часто так оно и есть. Существует понятие терминала, и функции управления им.
  Удалить Правка | Высказать мнение | Ответить | Рекомендовать в FAQ | Cообщить модератору | Наверх

2. "Доступ к видеопамяти по адресу B8000 и иже с ним" 
Сообщение от Forth Искать по авторуВ закладки(??) on 12-Сен-05, 10:04  (MSK)
>>Алфавитно-цифровой режим (он во 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.
  Удалить Правка | Высказать мнение | Ответить | Рекомендовать в FAQ | Cообщить модератору | Наверх

3. "Доступ к видеопамяти по адресу B8000 и иже с ним" 
Сообщение от Av Искать по авторуВ закладки(??) on 12-Сен-05, 10:33  (MSK)
>  Когда-то из-под DOS-а это получалось легко.
>FreeBSD такие фокусы не одобряет. Пишет "bus error".

Почитай документацию о сегментации в защищенном режиме работы процессоров семейства 386, архитектуре Unix. Потом сам будешь нам рассказывать почему такие методы не катят..

  Удалить Правка | Высказать мнение | Ответить | Рекомендовать в FAQ | Cообщить модератору | Наверх

4. "Доступ к видеопамяти по адресу B8000 и иже с ним" 
Сообщение от КапитанПень Искать по авторуВ закладки(??) on 12-Сен-05, 21:01  (MSK)
  Щас расскажу зачем столь странные желания у старого капитана.
  У нас, в маленьком офисе посреди маленького провинциального городка
стоит сервер Unix. Стоит на шкафу. Выполняет все что нужно для небольшого офиса. И к этому серверу подключен монитор.
Я хочу на этот монитор вывести часы с огромными цифрами. Время чтоб показывал.
Не хочу загромождать сервер X-Windows, поэтому и режим алфавитно-цифровой.
  Программулька получилась микроскопическая, пол-часа потратил, чтоб в текстовом редакторе начертить из ' 'пробелов и '#'(чертей) огромные цифры от 0 до 9.
  Закатал в каталог /usr/local/etc/rc.d файлец  clock.sh для автозапуска
и программа таки запускается при включении компа и загрузке системы.
НО... Но, написанная с использованием curses программа нормально работает только если ее запустить ручками из командной строки.
  А если запускать  из /usr/local/etc/rc.d - то выводит на экран заместо гигантских цифирь всякую байду. Ручками запускать трудно - компьютер-то на шкафу. Да и не солидно.
  Ну так вот. Значит буду изучать файл /dev/mem, может что выйдет.

  Удалить Правка | Высказать мнение | Ответить | Рекомендовать в FAQ | Cообщить модератору | Наверх

5. "Доступ к видеопамяти по адресу B8000 и иже с ним" 
Сообщение от elvenic Искать по авторуВ закладки(??) on 12-Сен-05, 23:25  (MSK)
>  Щас расскажу зачем столь странные желания у старого капитана.
>  У нас, в маленьком офисе посреди маленького провинциального городка
>стоит сервер 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 на вашу программу?


  Удалить Правка | Высказать мнение | Ответить | Рекомендовать в FAQ | Cообщить модератору | Наверх

7. "Доступ к видеопамяти по адресу B8000 и иже с ним" 
Сообщение от КапитанПень Искать по авторуВ закладки(??) on 12-Сен-05, 23:38  (MSK)
>Не, ну не солидно как-то старому капитану DOS-овские фокусы в Unix переносить.
>Я все-таки бы потратил время на решение проблемы, почемы curses-прграмма не
>работает если из rc.d запускается. Может, ей TERM=vt100 или чего-то похожего
>не хватает? И как, интересно, вы ей текущий терминал устанавливали? Может,
>имеет смысл поковырять /etc/inittab  на предмет замены getty на вашу
>программу?

Я вот о том, что есть файл такой /etc/inittab и что можно через него тип терминала(или какая там еще абстракция) для программы задавать
узнал тока вот сейчас. А скока еще всяких фишек в Unix придется познавать, запоминать. Тексты-то все без картинок, скушные.
А так раз, и пригодились навыки работы напрямую с PC-video-памятью.
Сэкономленное время можно посвятить просмотру телевизора. :)


  Удалить Правка | Высказать мнение | Ответить | Рекомендовать в FAQ | Cообщить модератору | Наверх

6. "Доступ к видеопамяти по адресу B8000 и иже с ним" 
Сообщение от КапитанПень Искать по авторуВ закладки(??) on 12-Сен-05, 23:25  (MSK)
Большое спасибо 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;
}
/////////////////
В будущем хочу еще сделать, чтоб выводилась как-нить сетевая активность в офисе. У кого, например, широковещательных пакетов многовато. Или вообще кто чемпион по внешнему трафику. И народу не скучно, и польза от старого выцветшего монитора на шкафу.


  Удалить Правка | Высказать мнение | Ответить | Рекомендовать в FAQ | Cообщить модератору | Наверх

8. "Доступ к видеопамяти по адресу B8000 и иже с ним" 
Сообщение от MKuznetsov emailИскать по авторуВ закладки(??) on 16-Сен-05, 13:12  (MSK)
извращенцы ;-)

#!/bin/sh
while 1 ; do
clear
banner `date`
sleep 1
done

вообщем man date ,banner

  Удалить Правка | Высказать мнение | Ответить | Рекомендовать в FAQ | Cообщить модератору | Наверх

9. "Доступ к видеопамяти по адресу B8000 и иже с ним" 
Сообщение от КапитанПень Искать по авторуВ закладки(??) on 22-Сен-05, 11:01  (MSK)
Да, вообще-то мой ник для чатов "Изовращенец".
Не знал я о существовании команды -banner-.
Хе-хе, это, видать, в помощь слабовидящим сисадминам.
Теперь ясно, почему FreeBSD не помещается на одну трехдюймовую дискету -
ей мешает груз вот таких вот "полезных" команд.
Часто бывает легче состряпать из обрывков уже имеющихся знаний горбатенькую программулю, чем читать man banner и еще разбираться с обычаями и легендами Unix-терминалов.
  Но... в общем, извиняйте, я действительно не знал о таком простом решении.
  Кстати, часики в офисе понравились. Теперь буду рисовать названия месяцев "сен.окт.ноя.дек.янв и т.д." - Календарь интерактивный буит.
Ну, это помимо иногда выводящейся диаграммы интернет-трафика.
  

  Удалить Правка | Высказать мнение | Ответить | Рекомендовать в FAQ | Cообщить модератору | Наверх

10. "Доступ к видеопамяти по адресу B8000 и иже с ним" 
Сообщение от mezantrop Искать по авторуВ закладки(??) on 23-Сен-05, 11:49  (MSK)
>Да, вообще-то мой ник для чатов "Изовращенец".
>Не знал я о существовании команды -banner-.
>Хе-хе, это, видать, в помощь слабовидящим сисадминам.
>Теперь ясно, почему FreeBSD не помещается на одну трехдюймовую дискету -
>ей мешает груз вот таких вот "полезных" команд.
>Часто бывает легче состряпать из обрывков уже имеющихся знаний горбатенькую программулю, чем
>читать man banner и еще разбираться с обычаями и легендами Unix-терминалов.
>
>  Но... в общем, извиняйте, я действительно не знал о таком
>простом решении.
>  Кстати, часики в офисе понравились. Теперь буду рисовать названия месяцев
>"сен.окт.ноя.дек.янв и т.д." - Календарь интерактивный буит.
>Ну, это помимо иногда выводящейся диаграммы интернет-трафика.
>


есть программа cal :)

  Удалить Правка | Высказать мнение | Ответить | Рекомендовать в FAQ | Cообщить модератору | Наверх

11. "Доступ к видеопамяти по адресу B8000 и иже с ним" 
Сообщение от Al Искать по авторуВ закладки(??) on 26-Сен-05, 00:58  (MSK)
Вобще то бесконечный цикл может выглядить следующим образом:

for(;;){ }

  Удалить Правка | Высказать мнение | Ответить | Рекомендовать в FAQ | Cообщить модератору | Наверх

12. "Доступ к видеопамяти по адресу B8000 и иже с ним" 
Сообщение от Knyazev Alexey emailИскать по авторуВ закладки on 27-Сен-05, 01:13  (MSK)
>Вобще то бесконечный цикл может выглядить следующим образом:
>
>for(;;){ }

или так:
while (1) {
}

Вообще, интересное получилось обсуждение. Особенно спасибо за banner!!!

  Удалить Правка | Высказать мнение | Ответить | Рекомендовать в FAQ | Cообщить модератору | Наверх


Архив | Удалить

Индекс форумов | Темы | Пред. тема | След. тема
Оцените тред (1=ужас, 5=супер)? [ 1 | 2 | 3 | 4 | 5 ]
Пожалуйста, прежде чем написать сообщение, ознакомьтесь с данными рекомендациями.




Партнёры:
PostgresPro
Inferno Solutions
Hosting by Hoster.ru
Хостинг:

Закладки на сайте
Проследить за страницей
Created 1996-2024 by Maxim Chirkov
Добавить, Поддержать, Вебмастеру