Решил даром не флудить.
Что представляет с себя буфер клавиатуры? Где он хранится и каковой его размер?
И как вот этот код
while keypressed do readkey;
repeat
readkey
until not keypressed;
Спасибо.
> Если знаешь - давай...
Когда-то знал, мог наизусть ответить.. Сейчас - надо рыть Интернет, бумага уже не сохранилась У меня была брошюрка в страниц 10, которую я замусолил до безобразия, таская с собой - там было все абсолютно. Извиняюсь за флуд, но давай подождем xds - я уверен, он скажет адрес .
> Что такое досовская память?
Ну, область памяти, где DOS хранит свои данные. Там все имеет определенные адреса, которые, слава Богу, не менялись от версии к версии. Это позволяло достаточно надежно использовать сами данные в обход системных вызовов. Само по себе это нехорошо, но иногда давало определенные преимущества - типа скорость, а также контроль самого низкого уровня.
Разбирайся
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.
Блин, как просто это в досе\виндОсе. Уже даже и не верится. Стабильный размер буфера, никаких событий и загрузки порциями, даже автоповтор эмулировать не надо
А кто сказал что это виндовс ;) Речь идёт о библиотеке сдл и о настальгии по таким простым методам доступа к клаве в любое время суток 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.