Cześć. Kombinowałem długo samodzielnie, ale nie wychodzi, dlatego tworzę ten wątek.

Po raz kolejny problem z TASM'em i DOSBoxem. Tym razem chcę usprawnić kod Loadera, który dostałem od autora strony o grze Prehistorik 2 i przerobiłem pod kątem patchowania gry Titus The Fox. Na odpowiedzi e-mailowe tej osoby trzeba bardzo długo czekać. Dlatego pytam tutaj. I dlatego w Newbie, gdyż więcej osób może przy okazji spojrzeć oraz coś doradzić.

Potrzebne pliki wrzuciłęm w zipie na http://olesio.eu/4p_asm.zip ponieważ nie udało się dołączyć tego do posta. Problem polega na tym, że chciałbym aby kod w pliku 4P_ASM\PROG\2_TEST\bad.asm działał tak samo, jak ten w 4P_ASM\PROG\2_TEST\ok.asm. Dokładny opis poniżej.

Kroki do reprodukcji:
W wolnej chwili proszę pobierzcie archiwum z powyższego linku i rozpakujcie je. Przejdzcie do nowego katalogu i uruchomcie plik test.bat. Pojawi się DOSBox z uruchomionym Nortonem Commanderem, w katalogu 2_TEST. Naciskanie Entera na plikach *.asm powoduje wywołanie batch do ich kompilacji do *.com. Można też nacisnąć F4, jeżeli chcecie edytować pod DOSBoxem i ASMEditem, który jest tam dołączony i skonfigurowany. Można też pod nim kompilować. Z DOSBox'a można na szybko wyjśc naciskając Ctrl+F9. Zobaczcie jak działają skompilowane bad.com oraz ok.com.

Czego oczekuję:
Chodzi o takie poprawienie kodu bad.asm, aby po skompilowaniu go do com i uruchomieniu. Przy zamknięciu gry poprzez Escape, gra wychodziła do NC i wszystko działało ok (tak jak przy ok.asm). A nie mogę rozwiązać tego kodem z ok.asm, ponieważ docelowo chcę mieć uniwersalny kod, który mógłby modyfikować w pamięci miejsca większe niż maksymalna wartość typu WORD. O ile to w ogóle możliwe do osiągnięcia w ten sposób. Dlatego dokonałem takich modyfikacji w bad.asm by w ogóle się kompilował i pozwalał na podstawienie miejsca w pamięci do rejestru, a nie wpisanie ich "na sztywno". Jak również by możliwe było użycie rejestru ecx zamiast cx.

Co się stało:
Oba com'y uruchamiają grę i dokonują zmian w jej pamięci. Jednak po naciśnięciu Escape gra wywołana przez bad.com nie powraca do NC. Tylko jakby przechodzi do prompt DOS'a, który nie reaguje na polecenia. Na przykład ponowne uruchomienie NC poleceniem nc (większość rzeczy w tej kompilacji jest w %PATH%) jest niemożliwe. Prawidłowo działa chyba tylko polecenie exit.

Jeżeli to ogarnę z Waszą pomocą, to będę mieć uniwersalny kod, który na pewno przyda się w przyszłości. Posiadam inny loader, który działa. Ale on wykorzystuje inne przerwanie int 21h z mov ah,51h. I pomimo prób nie umiem go tak przerobić aby zamiast tego używał przekazania CS gry do procedury obsługi jakiegoś przerwania (na przykład 10h). I koniecznie są później odejmowania od normalnie ustalonych miejsc w CS z pomocą debugera DOSBOx'a. Jest on jakby co w tej paczce i uruchamia się przez degug.bat.

Dodam, że liczbę cycles dla DOSBox'a ustawiłem na 7500, gdyż powyżej tej liczby gra głupieje i nawet z loadero-patchem do niej dołaczonym odgrywa dźwięki oraz muzykę na emulowanym PC Speakerze, zamiast Sound Blasterze. Co brzmi fatalnie. Z góry dziękuję za pomoc. I wybaczcie moje tradycyjne rozpisanie się. Chciałem wszystko dobrze opisać, jak tylko potrafię.