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