[ASM16]

0

Mam taki problemik:
hop:

call wczytaj_klawisz
;tu jest obsluga wcisnietego klawisza, np wcisnalem
;strzalke w lewo i cos sie tam przesuwa

jmp hop

wczytaj_klawisz proc

push es
mov dx,0
mov es,dx
mov ax,AdrBufKlaw
mov word ptr [es:041ch],ax ;zeby nie przepelnil sie bufor
in al,60h
mov KodKlawisza,al
pop es
ret

wczytaj_klawisz endp


I mam taki problem ze to wszytsko dziala tak szybko ze jak nacisne lewo to klocek przesuwa mi sie od razu o bardzzzzzooo duzo. po prostu jak nacisne ten klawisz to ta procedura zanim go pusze wczyta go kilkadziesiat razy. Mam pytanko jak zrobic zeby klawisz byl odczytywany co okreslony czas np co 0,5 sekundy albo za jakims stalym opoznieniem, probowalem cos robic z przerwaniem 16h ale jakos nie dziala a wstawienie jakiejs petli opozniajacej tez nie jest zbyt dobre bo w zaleznosci od kompa roznie dziala. Ma ktos jakis pomysl?

0

Zastosuj timer... Albo czytaj zegar systemowy, albo przerwanie 1ah -ah=0 , powrót cx : dx - liczba tykniec (18,2 raza/sek), albo jest jeszcze jakis adres pamieci, pod którym masz dokładniejszy timer.

0

Możesz też wykorzystać sposób, aby odczytać klawisz tylko raz. To oznacza, że odczytując klawisz o numerze 4dh czekasz w pętki, aż pojawi się wartość cdh - czyli ta sama z ustawionym bitem 7. To oznacza, że klawisz został zwolniony.

A jak musisz mieć powtarzanie, to przejmij IRQ0 (int 8) i tam zliczaj sobie jakiś licznik (zegar tyka 18.2 / 1s) i po osiągnięciu jakiejś wartości odczytaj port 60h - będziesz miał odczyt klawisza co zadany czas z dużą dokładnością.

ehh... flabra mnie uprzedził ;)

0

Dzieki za pomoc ale tak se mysle nad jednym jak ja pisze w tym asmie 16 bitowym ale niby pod winda bo niby kto ma jescze czystego dosa to czy to przejmowanie przerwan bedzie dzialac w ogóle?
Napisalem to sobie tak:

hop:
;rozne rzeczyw ds segemnt w ktorym jest procedura do podmiany

mov ah,25h
mov al,08h
mov dx,offset liczydlo
int 21h
jmp hop

;a procedura wyglada tak

liczydlo proc

mov ah,2 ;na razie tylko powinno pipnac
mov dl,7
int 21h
mov ax,int8save_seg
mov ds,ax
mov dx,int8save_offset
mov ah,25h
mov al,08h
int 21h
iret
liczydlo endp

gdzie wczesniej na poczatku programu zapamietalem sobie:

mov ah,35h
mov al,8
int 21h
mov int8save_offset,BX
mov int8save_seg,ES

chyba dobrze nie? tyle czy to bedzie dzialalo pod winda w okienku dosowym bo mi na razie nie trybi?

Thx za pomoc

0

Dopóki nie musisz nie przejmuj przerwan... Tak jest bezpieczniej i dla systemu i dla programu. Licznik masz przecież pod int 1ah i dziala dokladnie tak samo... Jakby co to inna funkcja (ah=1, cx: dx) odpowiednio go ustawia.

checktimer proc
  xor ah,ah
  int 1ah
  cmp dx,stalaczasowa ; czy juz czas minął?
  jb  @notyet  ; jesli nie minął
  xor dx,dx ; wyzeruj licznik (lo word)
  xor cx,cx ; cx tak naprawde nie musiz zerowac, bo go nie sprawdzasz
  mov ah,01h ; ustaw licznik
  int 1ah 
  mov al,01h ; zwroc 1 w al
  ret
  @notyet:
  xor al,al ; zwroc 0 w al
  ret
checktimer endp

;...

  xor dx,dx ; na dzien dobry trzeba wyzerowac licznik
  xor cx,cx 
  mov ah,01h 
  int 1ah 

; petla glowna programu

  @keyloop:
  call rob_inne_rzeczy ; zrob inne potrzebne rzeczy w miedzyczasie
  call checktimer ; sprawdz, czy czas minął
  and al,1        ; ? (al and 1)>0
  jz  @keyloop ; jesli nie, to znaczy, ze czas jeszcze nie nadszedl
  call wczytaj_klawisz ; nadszedl czas
  call obrob_klawisze ; zrob cos z odczytanymi klawiszami, przesun obiekty itepe
  jmp @keyloop ; petla glowna

;...

stalaczasowa, to ilosc tykniec podczas ktorych nie jest sprawdzana klawiatura.

// Jest tylko jedno ale... Jesli odpalasz na jednym systemie dos (w jednym okienku konsoli windowsa) 2/wiecej programow zerujacych licznik... Przy róznych stalych czasowych nastepuje masakra. Ale na szczescie malo kto uzywa teraz czystego dosa i zazwyczaj odpala sie jeden program w jednym okienku. No chyba, że to linux. Wtedy trzeba przejmować przerwanie.

0

fragment brzydkiego kodu gdzie sterowanie odbywa sie strzalkami gora i dol:

pozycja MACRO n,m
	mov ah,02h
	mov bh,0
	mov dh,n
	mov dl,m
	int 10h


petla_sterujaca:
	mov ah,10h
	int 16h
	cmp ah,80	;80 - strzalka w dol
	je dol
	cmp ah,72	;72 - strzalka w gore
	je gora
	cmp al,13	;13 - enter koniec
	je kon

dol:
	pozycja y,x
	wyswietl ' ',1
	cmp y,22
	jae przesun
	add y,1
	pozycja y,x
	wyswietl 1ah,1
	jmp petla_sterujaca
przesun:
	mov ah,06h
	mov bh,15
	mov al,1
	mov cl,2
	mov ch,2
	mov dl,30
	mov dh,22
	int 10h
	jmp petla_sterujaca	; krawedz okna - przesun okno w gore o jeden

jest to fragment i ma ncelu jedynie zaprezentowanie bardzo prostej metody obslugi strzalek - ocziwscie przy probie asemblacji najprawdopodobniej wywali kilka bledow (jak to z fragmentami), zalozenia programu byly troszke inne. Moze sie przyda...

//kod programu umieszczaj w znacznikach <asm> - m.M

0

Dzieki wsyztskim za pomoc a szczegolnie flabrze ktorego sposob najbardziej mi pomogl. Mam jeszcze jdno pytanie znacie moze jakies edytory asma16 pod windowsa, np cos co zaznacza skladnie i ma ikone po wcisnieciu ktorej program sie kompiluje?

1 użytkowników online, w tym zalogowanych: 0, gości: 1