logo elektroda
logo elektroda
X
logo elektroda
REKLAMA
REKLAMA
Adblock/uBlockOrigin/AdGuard mogą powodować znikanie niektórych postów z powodu nowej reguły.

Jak rozwiązać konflikt przerwań IRQ5 i IRQ7 przy użyciu TSR?

13 Gru 2003 18:51 3204 4
REKLAMA
  • #1 435900
    Konto nie istnieje
    Poziom 1  
  • REKLAMA
  • #2 436334
    elektryk
    Poziom 42  
    Posty: 11029
    Pomógł: 439
    Ocena: 241
    A możesz zapodać kody źródłowe?
  • REKLAMA
  • #3 443486
    tzok
    VIP Zasłużony dla elektroda
    Posty: 38812
    Pomógł: 3174
    Ocena: 6531
    Jedyne co Ci mogę popdpowiedzieć to ściągnij sobie SWAG, jest to bardzo obszerna biblioteka kodów zródłowych w Pascalu z wyczrpującymi komentarzami.
    Prawdopodbnie popełniasz błąd w rezerwowaniu pamięci (jest to konieczne dla TSR) i doprowadzasz do tego, że jeden program nadpisuje Ci część kodu drugiego.
    http://www.gdsoft.com/swag/downloads.html
  • REKLAMA
  • #4 446567
    Gavian
    Poziom 14  
    Posty: 83
    Pomógł: 1
    Ocena: 2
    Nie uzywaj przerwania 27h, lepiej jest stosować usluga 31h przerwania 21h.
    Domyślam się ze piszesz to w pascalu. Ja wole asemblera wiec pomoge w asemblerze.
    Z tego co rozumiem masz osobne programy do ustawiania IRQ5 i IRQ7. Spróbuj zrobic to w jedym programie.

    Start:
    jmp instal ;skok do procedury instalacyjnej
    Procedura obsługi IRQ5
    Procedura obsługi IRQ7
    Instal:
    1. zmieniasz wektor przerwania IRQ5.
    2. zmieniasz wektor przerwania IRQ7.
    3. Zostawiasz program w pamieci:
    
    mov ax,3100h
    mov dx,((Koniec-Start+wielkość_nagłowka)/16)+1  ;wielkość danych od poczatku pliku do końca obsługi przerwan wyrażona w paragrafach.
    int 21h


    Wszystko powinno grać.

    Twój błąd może wynikac z tego że zle stosujesz przerwanie INT27h
  • #5 446639
    tzok
    VIP Zasłużony dla elektroda
    Posty: 38812
    Pomógł: 3174
    Ocena: 6531
    W Pascalu możesz to tak napisać:
    program ObslugaPrzewan;
    {$B-,F-,R-,S-,V-}
    {$M 1024,0,0} //Tu rezerwujesz pamięć, jeśli nie wiesz ile to zawsze lepiej za dużo niż za mało
    {$F+}
    procedure ObslIRQ5; interrupt;
    begin
    
       (...)
    
    end;
    
    procedure ObslIRQ7; interrupt;
    begin
    
       (...)
    
    end;
    {$F-}
    begin
       SetIntVec($05, Addr(ObslIRQ5));
       SetIntVec($07, Addr(ObslIRQ7));
       keep(0)
    end.

    Ten program nie będzie "przepuszczał" dalej przerwań. Jeśli miał by to robić, musisz zapamiętywać stary wektor przerwania i wywoływać je programowo z oryginalnym wektorem w procedurze obsługi tego przerwania.
REKLAMA