Amiga forum / AmigaOS 2.x i starsze / Amiga i przerwania !!!
Czytasz wątek: Amiga i przerwania !!!
-
Amiga i przerwania !!! wysłany: 2009-04-27 20:06
Oto maksymalnie uproszczony przykład podpinania własnej procedury
pod określone przerwanie komputera Amiga
W tym przypadku chodzi o przewanie wywoływane w chwili kiedy
bufor portu serial (RS232) otrzymał nowy bajt danej.
Problem:
Ten przykładowy programik nie działa czemu???
Oto program:
;-------------------------------------------------------
;CPU: MC 68000
;System: Amiga 500 OS v1.3 Kickstart (v34)
;Assembler: DevPac v3.02 (HiSoft)
Exec: equ 4
AddIntServer: equ -168
RemIntServer: equ -174
;Lista przerwań
INTB_TBE = 0
INTB_DSKBLK = 1
INTB_SOFTINT = 2
INTB_PORTS = 3
INTB_COPER = 4
INTB_VERTB = 5
INTB_BLIT = 6
INTB_AUD2 = 7
INTB_AUD0 = 8
INTB_AUD3 = 9
INTB_AUD1 = 10
INTB_RBF = 11
INTB_DSKSYNC = 12
INTB_EXTER = 13
INTB_INTEN = 14
;Teraz podpinamy procedure obsługi przerwania i oczekujemy
;na klawisz 'Esc' po którym usuwamy dodaną procedurę i wychodzimy.
Start: move.l 4,a6
move.l #INTB_RBF,d0
move.l #Interrupt_RBF,a1
jsr AddIntServer(a6)
Wait_Key_Esc: cmp.b #$75,$BFEC01 ;Sprawdzamy stan klawisza 'ESC'
bne.s Wait_Key_Esc
move.l 4,a6
move.l #INTB_RBF,d0
move.l #Interrupt_RBF,a1
jsr RemIntServer(a6)
moveq #0,d0
rts
;Struktura "Interrupt" definująca dodawaną procedurę.
Interrupt_RBF: dc.l 0 ;ln_Succ
dc.l 0 ;ln_Pred
dc.b 2 ;ln_Type - dla Node typu Intterupt
dc.b 0 ;ln_Pri
dc.l Int_RBF_NAME ;ln_Name - adres do nazwy naszej procedury
dc.l 0 ;is_Data
dc.l Int_RBF_CODE ;is_Code - adres do procedury przerwania
Int_RBF_NAME: dc.b 'Test przerwania RS232',0
;Tutaj procedura wykonywana w chwili przyjęcia przerwania.
Int_RBF_CODE: movem.l d0-a6,-(sp)
bchg.b #1,$BFE001 ;Zmieniamy stan diody PowerLED na przeciwny.
movem.l (sp)+,d0-a6
rts ;z takiej systemowej procedury przerwania
;wychodzimy zwykłym rozkazem RTS
;---------------------------------------------------------
- Menu
- Baza wiedzy
- AmigaOS.pl