Wywołanie dźwięku ze spakera podczas naciśnięcia klawisza F5 w TSR.

0

Cześć.

Piszę tutaj, bo pewnie rozwiązanie jest banalne, ale ja go nie znalazłem. Poniższy kod kompiluje się w TASM i działa ok. Ale do czasu naciśnięcia żądanego klawisza w DOSBox. Nieważne czy w jakiejś grze czy pod Norton Commanderem czy po wyjściu z niego kiedy widać tylko prompt. Na starcie TSR'a odtwarza się i przechodzi do jego ładowania, ale w tej procce TSR'a dla przerwania 08h nie chce dobrze działać. Dźwięk się zapętla i DOS "wisi".

Czy to dlatego, ze użyto też do obsługi tego przerwania innego zegarowego 1C? Kod bez beep'a z moimi modyfikacjami pochodzi ze starego tutoriala w jednym ze starych Zinów. Prosił bym o przykłady kodu, jak mozna to poprawić żeby po wyemitowaniu Beepa nie bylo ciągłego zawieszenia tylko DOS nadal działal. Docelowo w grze, mam trainer z klawiszem F5, który działa ok, ale chcialbym mieć w przyzłości taki "bajer", że trainer wyemituje jakiś dźwięk z głosniczka żeby wiedzieć choćby czy właczono nieśmietelnośc.

Kod beep'ania wygooglowałem. Chociaż moze są inne metody do zrobienia tego, to proszę o przykłady kodu. Z góry dziękuję za pomoc. Napisałem tutaj, bo więcej osób spojrzy, a w nietuzinkowych tematach jak piszę to mi się jeden furiat wcina zamiast spróbować pomóc :)

TSR_IRQ equ 08h
.model tiny
.code
.386
org 100h

Start:
  jmp  RealStart

OldProc dd 0
MyMarker db 'POWER_DRIVE_TSR_TRAINER_BY_OLESIO'
My_Marker_Length equ $ - offset MyMarker

TSRProc:
        cli
        pushad
        push    es
        push    ds
        mov     ax,0
        mov     es,ax
        mov     di,TSR_IRQ*4
        mov     ax,word ptr es:[di+2]
        push    ax
        mov     es,ax                   ;ES=CS
        pop     ax
        mov     ds,ax                   ;DS=DS
        in      al,60h
        cmp     al,3Fh                  ;F5
        je      LotsOfMoney
        jmp     EndOfTSR
LotsOfMoney:

     ; Setting up timer 2 
     mov     al, 0B6h 
     out     43h, al 

     mov     al, 0D0h 
     out     42h, al 
     mov     al, 11h 
     out     42h, al 

     ; Sound 
     in      al, 61h 
     or      al, 3 
     out     61h, al 

     ; Delay 
     xor     ax, ax 
     mov     es, ax 
     mov     ax, [es:046Ch] 
     mov     cx, 5
.WaitLoop: 
     mov     dx, [es:046Ch] 
     cmp     ax, dx 
     je      .WaitLoop 
     mov     ax, dx 
     dec     cx 
     jnz     .WaitLoop
     in      al, 61h 
     and     al, 0FCh 
     out     61h, al 
EndOfTSR:
        pop     ds
        pop     es
        popad
        sti
        jmp     dword ptr cs:[OldProc]
RealStart:
        mov     ax,3
        int     10h
        mov     ah,9
        mov     dx,offset LogoText
        int     21h
        mov     ax,351ch
        int     21h
        mov     si,offset MyMarker
        mov     di,si
        mov     cx,My_Marker_Length
        cld
        repe    cmpsb
        jne     InstallNow
        mov     dx,word ptr es:[OldProc]
        mov     ax,word ptr es:[OldProc+2]
        mov     ds,ax
        mov     ax,251ch
        int     21h
        mov     ah,49h
        int     21h
        mov     ax,cs
        mov     ds,ax
        mov     ah,9
        mov     dx,offset UninstalledText
        int     21h
        mov     ax,4c02h
        int     21h
InstallNow:
        mov     ax,word ptr ds:[2ch]
        mov     es,ax
        mov     ah,49h
        int     21h
        mov     ax,351ch
        int     21h
        mov     word ptr cs:[OldProc],bx
        mov     word ptr cs:[OldProc+2],es
        mov     ax,251ch
        mov     dx,offset TSRProc
        int     21h
        mov     ah,9
        mov     dx,offset InstalledText
        int     21h
        mov     dx,offset RealStart
        int     27h

LogoText db 13,10,13,10
                db '          ________  _________  ____ _________ __________  ____ ________'
                db 13,10
                db '       E _\    __/_/      \  \/   /_    _   /_\__   /_  \/   /_   /   /_'
                db 13,10
                db '      H  \    /   /   /   /       _/   ____/   _    _/   \   _/__     _/'
                db 13,10
                db '     T   /________\______/___\/___\___/   /_________\___\____\/_______\spot'
                db 13,10,13,10
                db '           Power Drive (C) Rage Software Ltd. money trainer by olesio'
                db 13,10
                db '           Adapted from source code of MagicBoy TSR trainer by beanus'
                db 13,10,'$'
InstalledText   db 13,10
                db '           WHILE GAME PRESS F5 KEY TO GET 10 000 000 OF DOLARS FUNDS!'
                db 13,10
                db '                     Trainer has been installed in memory.',13,10,13,10,'$'
UninstalledText db 13,10
                db '                     Trainer has been REMOVED from memory.',13,10,13,10,'$'
end Start
0

A możesz ten swój problem opisać w zrozumiały sposób? To znaczy tak jak klasycznie opisuje sie bugi:

  • kroki do reprodukcji
  • czego oczekiwałeś
  • co się stało

Bo piszesz tu o grach i god mode, a w rzeczywistości nie ma to przecież dla nas znaczenia ;] Nie potrafie z twojego postu wywnioskować czy kod jest ok ale beep ci nie działa poprawnie, czy w ogóle ten kod ci nie chce działać.

Zastanawia mnie tylko czy interrupt handler jest wołany przez jmp czy przez call, bo robi to dość sporą różnicę w kwestii tego co leży potem na stosie.
Poza tym nie podoba mi się trochę to:

     mov     dx, [es:046Ch] 

Chodziło tu o es:[046Ch] czy to jest jakis specjalny zapis?

0

Ok, chciałem jak najkrócej, ale nieraz może być niezrozumiałe. To teraz się poprawia, wedle sugestii @Shalom'a.

Kroki do reprodukcji:
Skompilować kod do .com TASM'em najlepiej 3.1, bo taki posiadam. Uruchomić skompilowany com pod DOSBox'em, tak aby pokazał się komunikat, że został załadowany. Po czym nacisnąć F5. Sprawdzić efekty.

Czego oczekiwałem:
Po naciśnięciu F5 ma się wykonać słyszalny krótki beep. Po czym DOS oraz załadowany program albo gra, mają działać nadal normalnie. Klawisz można wciskać późnej kolejne razy. Docelowo po naciskaniu F5 poza wyemitowaniem dźwięku mają się wykonywać operacje zapisu w pamięci, które i tak działają, ale bez beep'a.

Co się stało:
Po załadowaniu TSR'a i naciśnięciu F5 dźwiek emitowany jest bez przerwy. DOSBox przestaje reagować na klawiaturę i cokolwiek. Nieważne co jest aktualnie załadowane po wywołaniu TSR'a. Czy to jakaś gra czy to Norton Commander czy normalnie oczekujący na wpisanie poleceń prompt. Zawsze dochodzi do zawieszenia.

Brakuje mi dostatecznej wiedzy na temat przerwań i DOS'a. Opieram się na posiadanych źródłach. Tak że prosił bym o podpowiedź jak rozwiązać mój problem z przykładami kodu. By stało się to czego oczekiwałem.

Natomiast zapisu es:046Ch nie zmieniałem. Był on w oryginalnym źródle beep'a, który wygooglowałem. Pomyślałem, że jest to wymagane. A jak wspomniałem, przy ładowaniu TSR'a beep działał ok, tak że uznałem to za kod, na którym mogę się wzorować.

0

Całkiem możliwe, że beep korzysta z przerwania zegarowego, a twoja procka za dużo mu miesza.
Ustaw przed wywołaniem beepa oryginalny wektor przerwania 1C, a zaraz potem przywroć swój.

0

Tylko pytanie jak to prawidlowo zrobić. Gdyż taka modyfikacja jak poniżej (wklejam kluczowy fragment kodu), nie powoduje zmiany. Dźwiek nadal nie kończy się po chwili i DOSBox po nacisnięciu F5 "wisi", Czyli w sumie bez zmian.

LotsOfMoney:
        mov     dx,word ptr es:[OldProc]
        mov     ax,word ptr es:[OldProc+2]
        mov     ds,ax
        mov     ax,251ch
        int     21h
        mov     ah,49h
        int     21h
 
     ; Setting up timer 2 
     mov     al, 0B6h 
     out     43h, al 
 
     mov     al, 0D0h 
     out     42h, al 
     mov     al, 11h 
     out     42h, al 
 
     ; Sound 
     in      al, 61h 
     or      al, 3 
     out     61h, al 
 
     ; Delay 
     xor     ax, ax 
     mov     es, ax 
     mov     ax, [es:046Ch] 
     mov     cx, 5
.WaitLoop: 
     mov     dx, [es:046Ch] 
     cmp     ax, dx 
     je      .WaitLoop 
     mov     ax, dx 
     dec     cx 
     jnz     .WaitLoop
     in      al, 61h 
     and     al, 0FCh 
     out     61h, al 

        mov     ax,word ptr ds:[2ch]
        mov     es,ax
        mov     ah,49h
        int     21h
        mov     ax,351ch
        int     21h
        mov     word ptr cs:[OldProc],bx
        mov     word ptr cs:[OldProc+2],es
        mov     ax,251ch
        mov     dx,offset TSRProc
        int     21h

EndOfTSR:
        pop     ds
        pop     es
        popad
        sti
        jmp     dword ptr cs:[OldProc]

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