Przerwania w Action!
Artykuł pod tytułem „Przerwania w Action!” autorstwa Andrzeja Postrzednika opublikowany został w czasopiśmie Bajtek numer 11-12/90 na stronie 8.
W artykule opisano procedury wspomagające i demonstrujące możliwości wywoływania procedur w przerwaniu. Wykorzystano tutaj przerwanie TIMER2.
Z opisu autora:
- Funkcja StartVKT() zwraca adres od którego zaczyna się kod wynikowy procedury podanej jako parametr funkcji.
- Procedura SetTIMER2() włącza przerwanie, trzeba ją wywołać, aby procedura „name” podana jako parametr była wykonywana w wyniku przerwania. Drugi parametr tej procedury to czas pomiędzy kolejnymi wywołaniami procedury „name” (jednostką jest 1/50 sekundy).
- Procedura Again() o której musimy pamiętać przy pisaniu procedury wywoływanej przerwaniem. Ustawia ona zegar TIMCNT2.
- Procedura ResetTIMER2() wyłącza przerwanie TIMER2. Powinna być wywoływana przed zakończeniem programu. Zmiany programu, jego ponowna kompilacja i uruchamianie przy włączonym przerwaniu mogą spowodować zawieszenie komputera.
;PRZERWANIA W ACTION!
;Andrzej Postrzednik
;(c) 1990, Bajtek
MODULE
CARD TIMECOUNT2=538,rptime
; funkcja zwraca adres poczatku procedury 'name’ po kompilacji
CARD FUNC StartVKT(BYTE ARRAY name)
BYTE find,j,size
CARD i,addr
find=0 size=name(0)
FOR i=20000 TO 40000 DO
j=1
WHILE Peek(i+j)=name(j) DO
IF j=size THEN find=1 FI
j==+1
OD
IF find=1 THEN EXIT FI
OD
IF find=0 THEN
Print(„Nie ma procedury „)
PrintE(name) Break()
FI
addr=PeekC(i+j+1)
RETURN(addr)
; procedura wlaczajaca przerwanie
PROC SetTIMER2(BYTE ARRAY name CARD t)
CARD TIMER2VKT=552
rptime=t
TIMER2VKT=StartVKT(name)
TIMECOUNT2=1
RETURN
PROC Again()
TIMECOUNT2=rptime
RETURN
; procedura wylaczajaca przerwanie
PROC ResetTIMER2()
TIMECOUNT2=0
RETURN
MODULE
BYTE ARRAY
melodia=[96 0 81 0 96 0 96 72 81 108 96 0 64 96 0 96 60 64 81 96 81 96 108 128 85 96 0 0 0]
BYTE licznik
PROC Graj()
BYTE glos
glos=melodia(licznik)
Sound(0,glos,10,10)
Sound(1,glos+1,10,10)
licznik==+1
IF licznik=29 THEN licznik=0 FI
Again()
RETURN
PROC Main()
licznik=0
SetTIMER2(„Graj”,10)
WHILE Peek(53279)#6
DO
Print(„czekam na START „)
OD
ResetTIMER2()
RETURN
Linia melodyczna możne wprawić w zakłopotanie – winą tego stanu rzeczy proponuję obarczyć złośliwy chochlik drukarski 🙂