IPB
ЛогинПароль:

> Правила раздела!

1. Заголовок или название темы должно быть информативным !
2. Все тексты фрагментов программ должны помещаться в теги [code] ... [/code] или [code=pas] ... [/code].
3. Прежде чем задавать вопрос, см. "FAQ" и используйте ПОИСК !
4. НЕ используйте форум для личного общения!
5. Самое главное - это раздел теоретический, т.е. никаких задач и программ (за исключением небольших фрагментов) - для этого есть отдельный раздел!

 
 Ответить  Открыть новую тему 
> Буфер клавиатуры
сообщение
Сообщение #1


Гуру
*****

Группа: Пользователи
Сообщений: 1 117
Пол: Мужской
Реальное имя: Богдан

Репутация: -  11  +


Решил даром не флудить.
Что представляет с себя буфер клавиатуры? Где он хранится и каковой его размер?
И как вот этот код
Цитата

while keypressed do readkey;


или


repeat
  readkey
until not keypressed;


его очищает?


--------------------
Лао-Цзы :
Знать много и не выставлять себя знающим есть нравственная высота. Знать мало и выставлять себя знающим есть болезнь. Только понимая эту болезнь, мы можем избавиться от нее.
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #2


Уникум
*******

Группа: Пользователи
Сообщений: 6 823
Пол: Мужской
Реальное имя: Лопáрь (Андрей)

Репутация: -  159  +


Цитата(Bokul @ 12.12.2006 1:51) *

Что представляет с себя буфер клавиатуры? Где он хранится и каковой его размер?
И как вот этот код .. его очищает?

Обычный буфер типа FIFO (первым вошел - первым вышел), размер, кажется, 16 байт... могу ошибаться, давно было..
Находится где-то в области досовской памяти.. Тебе нужно точно?
Как очищает? да просто считывает все символы из него! smile.gif поскольку ввод с клавы гораздо медленнее, чем работа ReadKey, то можно быть практически уверенным, что этот цикл очистит буфер. Хотя, есть принципиальная возможность, что сразу после него и до работы того, для чего ты его очищал, в него что-то все же ляжет. Но вероятность невелика smile.gif


--------------------
я - ветер, я северный холодный ветер
я час расставанья, я год возвращенья домой
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #3


Гуру
*****

Группа: Пользователи
Сообщений: 1 117
Пол: Мужской
Реальное имя: Богдан

Репутация: -  11  +


Спасибо. good.gif
Цитата
Тебе нужно точно?

Если знаешь - давай...
Цитата
Находится где-то в области досовской памяти..

Что такое досовская память?

Сообщение отредактировано: Bokul -


--------------------
Лао-Цзы :
Знать много и не выставлять себя знающим есть нравственная высота. Знать мало и выставлять себя знающим есть болезнь. Только понимая эту болезнь, мы можем избавиться от нее.
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #4


Уникум
*******

Группа: Пользователи
Сообщений: 6 823
Пол: Мужской
Реальное имя: Лопáрь (Андрей)

Репутация: -  159  +


> Если знаешь - давай...
Когда-то знал, мог наизусть ответить.. Сейчас - надо рыть Интернет, бумага уже не сохранилась sad.gif У меня была брошюрка в страниц 10, которую я замусолил до безобразия, таская с собой - там было все абсолютно. Извиняюсь за флуд, но давай подождем xds - я уверен, он скажет адрес smile.gif.

> Что такое досовская память?
Ну, область памяти, где DOS хранит свои данные. Там все имеет определенные адреса, которые, слава Богу, не менялись от версии к версии. Это позволяло достаточно надежно использовать сами данные в обход системных вызовов. Само по себе это нехорошо, но иногда давало определенные преимущества - типа скорость, а также контроль самого низкого уровня.


--------------------
я - ветер, я северный холодный ветер
я час расставанья, я год возвращенья домой
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #5


Гуру
*****

Группа: Пользователи
Сообщений: 1 117
Пол: Мужской
Реальное имя: Богдан

Репутация: -  11  +


Цитата
давай подождем xds - я уверен, он скажет адрес smile.gif.

lol.gif
Согласен, будем ждать ходячего справочникаsmile.gif
Цитата
Ну, область памяти, где DOS хранит свои данные. Там все имеет определенные адреса, которые, слава Богу, не менялись от версии к версии. Это позволяло достаточно надежно использовать сами данные в обход системных вызовов. Само по себе это нехорошо, но иногда давало определенные преимущества - типа скорость, а также контроль самого низкого уровня.

Конечно не по теме, но что поделаешь, все-равно ждать приходится, smile.gif : позволяет ли Windows проделывать тоже самое? И что происходит, когда я запускаю прогу, скомпилированную под Dos, на винде (я имею ввиду на уровне памяти)?


--------------------
Лао-Цзы :
Знать много и не выставлять себя знающим есть нравственная высота. Знать мало и выставлять себя знающим есть болезнь. Только понимая эту болезнь, мы можем избавиться от нее.
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #6


Уникум
*******

Группа: Пользователи
Сообщений: 6 823
Пол: Мужской
Реальное имя: Лопáрь (Андрей)

Репутация: -  159  +


Цитата(Bokul @ 12.12.2006 3:47) *

Конечно не по теме, но что поделаешь, все-равно ждать приходится, smile.gif : позволяет ли Windows проделывать тоже самое? И что происходит, когда я запускаю прогу, скомпилированную под Dos, на винде (я имею ввиду на уровне памяти)?

Да, за тему пришлось выйти, к теории Паскаля это имеет весьма малое отношение. Но обнаруживает разницу между задачами, скомпилированными в TP и в FPC.
Для запуска досовской программы Винда запускает виртуальную DOS-машину, которая довольно точно копирует настоящий DOS, включая распределение памяти. Так что твой вопрос (или мой ответ?..) имеет отношение только к тому, что скомпилированно в TP. Но если говорить об очистке буфера клавиатуры, то принцип тот же - тебе надо читать из буфера, пока он не очистится.


--------------------
я - ветер, я северный холодный ветер
я час расставанья, я год возвращенья домой
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #7


N337
****

Группа: Пользователи
Сообщений: 737
Пол: Мужской

Репутация: -  26  +


Разбирайся wink.gif
program Code;

uses
  Crt;

var
  KStart: Word absolute $40:$1A;
    { адрес начала (откуда считывается) очереди данных клавиатуры }
  KEnd: Word absolute $40:$1C;
    { адрес конца (куда записывается) очереди данных клавиатуры }
  KBuf: array[0..15] of Word absolute $40:$1E;
    { собственно, буфер - 16 записей по 2 байта (ASCII-, Scan-код) }

  { - если очередь пуста, то KStart = KEnd }
  { - если очередь переполнена, то KEnd указывает на запись перед KStart }

var
  i, is, ie: Integer;

begin
  ClrScr;
  repeat
    is := (KStart - Ofs(KBuf)) shr 1;
    ie := (KEnd - Ofs(KBuf)) shr 1;
    GotoXY(1, 1);
    Writeln('ASCII':14, ' Scan');
    Writeln;
    for i := 0 to 15 do
      begin
        if i = ie then
          Write('KEnd ->  ')
        else if i = is then
          Write('KStart ->')
        else
          Write('         ');
        Writeln(Lo(KBuf[i]):4, Hi(KBuf[i]):4);
      end;
  until Lo(KBuf[(ie - 1) and $F]) = 27;
end.


--------------------
The idiots are winning.
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #8


Профи
****

Группа: Пользователи
Сообщений: 930
Пол: Мужской

Репутация: -  11  +


Блин, как просто это в досе\виндОсе. Уже даже и не верится. Стабильный размер буфера, никаких событий и загрузки порциями, даже автоповтор эмулировать не надо smile.gif
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #9


Гуру
*****

Группа: Пользователи
Сообщений: 1 117
Пол: Мужской
Реальное имя: Богдан

Репутация: -  11  +


Цитата
Стабильный размер буфера, никаких событий и загрузки порциями, даже автоповтор эмулировать не надо

Чтобы не расценивать твое сообщение как флуд smile.gif , дай, если есть конечно, пару ссылочок по теме для Windows. rolleyes.gif smile.gif


--------------------
Лао-Цзы :
Знать много и не выставлять себя знающим есть нравственная высота. Знать мало и выставлять себя знающим есть болезнь. Только понимая эту болезнь, мы можем избавиться от нее.
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #10


Профи
****

Группа: Пользователи
Сообщений: 930
Пол: Мужской

Репутация: -  11  +


А кто сказал что это виндовс ;) Речь идёт о библиотеке сдл и о настальгии по таким простым методам доступа к клаве в любое время суток smile.gif http://sdl4fp.sourceforge.net/index.html Главная её особенность - она работает в линуксе! Вот с чтением клавы в видеорежиме там очень непросто. И к портам только суперпользователь напрямую обратиться может и ось реально многозадачная. Теоретически SDL можно скомпилить и под виндовс. А практически, почти всё в ней импортируется, а под виндой импорт не работает, чего-то не хватает. Возможно исходники скомпилируются, если в каталог добавить файл SDL.DLL скачанный из ослика. Но это непроверено. Вот работающий пример использования клавы в видеорежиме. Так же получается доступ к мыши, джойстику. Читаются события keydown и keyup, а для клавиш модификаторов ещё и маски.
program demo;

uses 
SDL, SDL_Video, SDL_Events; 

const 
width = 720; 
height = 400; 
colordepth = 32; 

var 
screen: PSDL_Surface; 
image: PSDL_Surface; 
event: PSDL_Event; 
done: Boolean; 
filename: String; 

label 1; 


begin 

SDL_Init(SDL_INIT_VIDEO); 
event := new(PSDL_Event); 
screen := SDL_SetVideoMode(width, height, colordepth, (SDL_FULLSCREEN + SDL_SWSURFACE)); 
if screen = nil then 
begin 
writeLn ('Couldn''t initialize video mode at ', width, 'x', height, 'x', colordepth, 'bpp'); 
halt(1); 
end; 
filename := '0.bmp'; 
image := SDL_loadBMP(@filename[1]); 
if (image = nil) then 
begin 
writeLn('Couldn''t load ' + filename); 
halt(1); 
end; 
if (SDL_BlitSurface(image, nil, screen, nil) < 0) then 
begin 
writeLn('BlitSurface error:' {+ SDL_GetError()}); 
end; 
SDL_updateRect(screen, 0, 0, image^.w, image^.h); 
SDL_freeSurface(image); 
done := FALSE; 
while (done = FALSE) do 
begin 
if (SDL_PollEvent(event) > 0) then 
begin 
CASE event^.eventtype OF 
SDL_KEYDOWN, SDL_MOUSEBUTTONDOWN :done := TRUE; 
end; 
end; 
end; 


SDL_freeSurface(screen); 
SDL_Quit ; 
end.


Сообщение отредактировано: SKVOZNJAK -
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #11


Злостный любитель
*****

Группа: Пользователи
Сообщений: 1 755
Пол: Мужской

Репутация: -  62  +


Цитата(xds @ 12.12.2006 6:03) *

Код

var
  KStart: Word absolute $40:$1A;
    { адрес начала (откуда считывается) очереди данных клавиатуры }
  KEnd: Word absolute $40:$1C;
    { адрес конца (куда записывается) очереди данных клавиатуры }
  KBuf: array[0..15] of Word absolute $40:$1E;
    { собственно, буфер - 16 записей по 2 байта (ASCII-, Scan-код) }

  { - если очередь пуста, то KStart = KEnd }
  { - если очередь переполнена, то KEnd указывает на запись перед KStart }



Ура, одним стандартным модулем меньше в моём списке uses.
Спасибо.


--------------------
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 

 Ответить  Открыть новую тему 
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 



- Текстовая версия 8.04.2025 18:21
500Gb HDD, 6Gb RAM, 2 Cores, 7 EUR в месяц — такие хостинги правда бывают
Связь с администрацией: bu_gen в домене octagram.name