Einen frisch gespeicherten Spielstand laden

Im vorherigen Beitrag beschrieb ich einen Patch, der es erlaubt, einen Spielstand mehrfach zu laden. Dabei äußerte ich die Vermutung, dass man einen frisch gespeicherten Spielstand deshalb nicht laden kann, weil beim Speichern ebenfalls die Identifkationsbytes ins RAM geschrieben werden.

In der Tat ist das auch richtig, folgender Code-Block schreibt die Idenfikationsbytes beim Speichern ins RAM:


3268:0A2E 8BD8 mov bx,ax
3268:0A30 D1E3 shl bx,1
3268:0A32 D1E3 shl bx,1
3268:0A34 8E06D4A3 mov es,[A3D4] ds:[A3D4]=40C2
3268:0A38 8B8602FF mov ax,[bp-00FE] ss:[ACF0]=09F2
3268:0A3C 8BD1 mov dx,cx
3268:0A3E 2689873ABA mov es:[bx-45C6],ax [illegal]
3268:0A43 2689973CBA mov es:[bx-45C4],dx [illegal]
3268:0A48 8E06D2A3 mov es,[A3D2] ds:[A3D2]=4C73
3268:0A4C 26FE068E23 inc byte es:[238E] es:[238E]=0000

Wir wissen damit zwar immer noch nicht, wie die Daten initialisiert werden, aber egal. Analog zu vorher können wir die relevante Zeile (3268:0A38) wie folgt in zwei Befehle ändern:


250000 and ax,0000
90 nop

Wir stellen so also wie vorher sicher, dass AX = 0. In der BMMAIN.EXE (DE, 1.03) müssen wir dazu die Bytes 202904 bis 202907 bearbeiten und 8B8602FF durch 25000090 ersetzen.

Beim Ausführen der modifizierten BMMAIN.EXE und Breakpoint auf 3268:0A34 sehen wir folgendes:


3268:0A34 8E06D4A3 mov es,[A3D4] ds:[A3D4]=40C2
3268:0A38 250000 and ax,0000
3268:0A3B 90 nop
3268:0A3C 8BD1 mov dx,cx

Wir können danach zwar wie erwartet nicht weiterspielen, allerdings können wir jetzt, so wir denn auch die vorherige Modifikation durchgeführt haben, den gerade gespeicherten Spielstand laden und dann weiterspielen – sweet!

Fazit beider Änderungen

  • Ab Offset 205436: 8B86BAFE in 8B000090 ändern
  • Ab Offset 202904: 8B8602FF in 25000090 ändern
This entry was posted in BMP, DE-1.03, General information, Save games, Technical information and tagged , , , , . Bookmark the permalink.

Leave a Reply