Ujra nem megy valami.
Meg tudna mutatni nekem valaki pascal assemblerben hogyan kell megvizsgalni,
hogy le van e nyomva a ket shift egyszerre ?
Azt meg tudtam csinalni, hogy egy akarmilyen billentyure kilepjen, de a
ket shifttel nem megy.
Elore is koszonom.
Tisztelettel, Janos
Gabor
Szia!
Az eset nagyon egyszeru. :)
Itt egy pelda:
function ketshift : boolean; assembler;
asm
mov ah,02h
int 16h {SHIFT allapot lekerdezes}
and al,11b
cmp al,11b {Vizsgaljuk AL 0. es 1. bitjet}
jz @lenyomva {Ha mindketto 1, akkor ugras}
xor al,al {Ha nem akkor a fuggveny erteke False}
jz @vege
@lenyomva: mov al,1
@vege:
END;
A fuggveny True erteket ad vissza, ha mindket Shift egyszerre le van nyomva.
A 16h BIOS megszakitas 02h funkciojat hivja meg, majd vizsgaljuk az AL
regiszter 0. es 1. bitjenek allapotat, ami egyenlo a jobb ill. bal Shift
gomb pillanatnyi allapotaval. A vizsgalathoz persze nullaznunk kell a felso
6 bitet egy AND AL,11b utasitassal, majd osszehasonlitjuk 11b-vel. Ha
egyezik akkor a Z jelzobit 1-re valt, ugras, es AL-be 1-et toltunk. Igy a
fuggveny visszateresi erteke True lesz, ellenben False.
Remelem ertheto volt... :)
Udv
Nicholas
Sajnos nincs nálam elérhető közelségben se memory map, se portleírás
és assemblyt és jó, ha két éve használtam utoljára, de azért
megpróbálok két megoldást ajánlani. Az első és bonyolultabb a 0x60
port figyelése a 0x9 megszakításon. Ebben nem is vagyok biztos, hogy
műxik.
A másik: a BIOS fenntart egy címet, ha jól emlékszem 0x0000:040e
címen, ahol a jelenlegi lenyomva tartott speciális billentyűk
kiolvashatóak, így SHIFT, CTRL, ALT... Három winchesterrel régebben
volt egy programom, ami pont az általad említett módon lépett ki,
kicsit cifrázva (jobb shift, bal shift, ctrl, miegymás).
Ha nem sikerül ilyen memóriatérképet szerezned, megpróbálom előszedni
a régi dolgaim, ok? Privátba irj, ha kell a doksi.
pBoy
Function Shift:byte;assembler;
asm
push ds
xor ax,ax
mov ds,ax
mov al,[0417h]
and al,03h
pop ds
end;
Begin
Repeat {Szemleltetes}
Writeln(Shift);
Until 1=2;
End.
{Vege!}
Ezek utan:
shift == 0 ha nincs Shift bill. lenyomva
shift == 1 ha a bal oldali van lenyomva
shift == 2 ha a jobb oldali van lenyomva
shift == 3 ha mindketto le van nyomva
bye...
--
Bojcan Tamas Phone: +36-30-9813-349
E-mail: boj...@buli.net || bta...@rgai.inf.u-szeged.hu
Int 16h, 02 funkcio. Shift-status lekerdezese.
AL-ben kapod a shift-statust, ahol a 0. bit jobb, az 1. bit a bal shift
lenyomott allapotat
jelenti.
Remelem segitettem...
Veres Sandor