Térjünk rá a loaderre:
A programrészek visszafejtéséhez az
INKLAND DZ80 programot használom, egyszerűen kezelhető, először mindig az options-t állítom be, mert így nem kell beírni pontosan az END címet, elég a Startot beírni ide is, a program fájl kiválasztása után automatikusan kitölti, következő mezőket kell kitölteni:
Start: a program betöltési címe
File Start: ide is a Start értéke kerül (ennek állítgatásával tologathatjuk a disassembly kezdését)
End: ide is a program betöltési címe kerüljön, ha a fájlt a beállítások után választjuk ki, aki szeret számolgatni, az beírhatja a betöltött fájl végcímét is

File Hdr: bináris fájl esetén ide mindig 128-at kell beírnunk, a fejlécre nincs szükségünk
A Gun Fright beállításai, már fájl választás után:

Ezek után mehetünk is a disassembly gombra, és megkapjuk a listánkat:
GUNFRIGH.ASMA listát nézegetve, örömmel tapasztaljuk, hogy tele van ROM hívással, ezeket a Firmware.pdf-ből kimazsolázva, ezt a listát kapjuk:
ld hl,(0be7dh) ;AMSDOS számára foglalt terület címe (0A700h)
call 0bcceh ;háttér ROM initializálása
call 0bb00h ;key manager inicializálása
call 0bc0eh ;videómód 0 - 16 szín, 1 - 4 szín, 2 - 2 szín
call 0bc38h ;keret beállítása
call 0bb18h ;billentyűre várakozás
call 0bc77h ;fájl megnyitása
call 0bc83h ;fájl betöltése
call 0bc7ah ;fájl lezárása
A ROM hívások itt találhatók:
FIRMWARE.PDF (458.15 kB - downloaded 478 times.)
A jó hír az, hogy az első három ROM bizergálást /rendszerváltozó használatát el is hanyagolhatjuk, nincs szükségünk rá, a többit pedig egyszerűen helyettesíthetjük majd.
Nézzük meg a betöltőnket, mit is csinál:
Az inicializálások után betölti a háttérképet 4000h-ra (egyelőre még nem a videómemóriába), aztán szépen bemásolja 0c000h-ra (videó memória), majd beállítja a palettát,ezek után jönnek a cheat-ek, a szöveget a kép legalsó sorában jeleníti meg, így a végén újra bemásolja a képet 4000h-ról a videómemóriába, és végezetül betölti 0200h-ra a prugramunkat, majd át is adja a vezérlést 0200h-ra.
0040 2a7dbe ld hl,(0be7dh) ;AMSDOS számára foglalt terület címe (0a700h)
0043 7e ld a,(hl) ;aktuális meghajtó száma (0=A, 1=B)
0044 f5 push af
0045 114000 ld de,0040h ;első használható bájt
0048 21ffab ld hl,0abffh ;utolsó használható bájt
004b 0e07 ld c,07h ;ROM select address
004d cdcebc call 0bcceh ;háttér ROM initializálása
0050 f1 pop af
0051 2a7dbe ld hl,(0be7dh)
0054 77 ld (hl),a
0055 cd00bb call 0bb00h ;key manager inicializálása
0058 af xor a
0059 cd0ebc call 0bc0eh ;videómód 0-16 szín, 1-4 szín, 2-2 szín
005c 010000 ld bc,0000h
005f cd38bc call 0bc38h ;keret fekete
0062 21a201 ld hl,01a2h
0065 cdc900 call 00c9h ;paletta beállítása, színek 01a2h-ról (fekete mind)
0068 110040 ld de,4000h
006b cd6c01 call 016ch ;fájl betöltése (4000h-ra a betöltőkép)
006e 00 nop
006f 00 nop
0070 00 nop
0071 cdda00 call 00dah ;kép másolása 4000h-ról 0c000h
0074 219201 ld hl,0192h
0077 cdc900 call 00c9h ;paletta beállítása, színek 0192h-ról
007a cde600 call 00e6h ;a cheat sor törlése
007d 1195c7 ld de,0c795h ;kiírási cím
0080 21d202 ld hl,02d2h ;szoveg Infinite Lives
0083 cd2401 call 0124h ;cheat szöveg kiírása
0086 cd5301 call 0153h ;billentyűre várás (y/n)
0089 328801 ld (0188h),a
008c 11a7c7 ld de,0c7a7h ;kiírási cím
008f 21e802 ld hl,02e8h ;szöveg Infinite money
0092 cd2401 call 0124h ;cheat szöveg kiírása
0095 cd5301 call 0153h ;billentyűre várás (y/n)
0098 328901 ld (0189h),a
009b cdda00 call 00dah ;kép másolása 4000h-ról 0c000h
009e 110002 ld de,0200h
00a1 cd6c01 call 016ch ;program betöltése 0200h-ra
00a4 00 nop
00a5 00 nop
00a6 00 nop
00a7 3a8801 ld a,(0188h) ;Y, vag N tárolási helye (első cheat)
00aa fe4e cp 4eh
00ac 2809 jr z,00b7h ;ha nincs cheat, akkor ugrás
00ae af xor a
00af 32e60e ld (0ee6h),a
00b2 3ec9 ld a,0c9h
00b4 328930 ld (3089h),a
00b7 3a8901 ld a,(0189h) ;Y, vag N tárolási helye (második cheat)
00ba fe4e cp 4eh
00bc 2808 jr z,00c6h ;ha nincs cheat, akkor ugrás
00be 3ec9 ld a,0c9h
00c0 321d25 ld (251dh),a
00c3 323e25 ld (253eh),a
00c6 c30002 jp 0200h ;program kezdése
00c9 af xor a ;paletta beállítása
00ca 46 ld b,(hl)
00cb 48 ld c,b
00cc 23 inc hl
00cd f5 push af
00ce e5 push hl
00cf cd32bc call 0bc32h ;set ink
00d2 e1 pop hl
00d3 f1 pop af
00d4 3c inc a
00d5 fe10 cp 10h
00d7 c8 ret z
00d8 18f0 jr 00cah
00da 210040 ld hl,4000h ;kép másolása 4000-ről 0c000h-ra
00dd 1100c0 ld de,0c000h
00e0 010040 ld bc,4000h
00e3 edb0 ldir
00e5 c9 ret
00e6 2130f7 ld hl,0f730h ;a cheat sor törlése
...
0103 ed5b8401 ld de,(0184h) ;karakterkiíró rutin
...
011f 0150c0 ld bc,0c050h ;következő karaktersor
0122 09 add hl,bc
0123 c9 ret
0124 ed538601 ld (0186h),de
0128 ed538401 ld (0184h),de
012c 7e ld a,(hl) ;karakterkódók HL-en
012d b7 or a
012e c8 ret z
012f e5 push hl ;karakter kiírása
...
0153 cd18bb call 0bb18h ;billentyűre várakozás
0156 fe59 cp 59h ;Y
0158 c8 ret z
0159 fe79 cp 79h ;y
015b 2809 jr z,0166h
015d fe4e cp 4eh ;N
015f c8 ret z
0160 fe6e cp 6eh ;n
0162 2805 jr z,0169h
0164 18ed jr 0153h
0166 3e59 ld a,59h
0168 c9 ret
0169 3e4e ld a,4eh
016b c9 ret
016c d5 push de ;fájl betöltése, DE tartalmazza a töltési címet
016d 0608 ld b,08h ;fájl hossza
016f 1100c0 ld de,0c000h ;buffer címe
0172 218a01 ld hl,018ah ;fájl név ezen a címen
0175 cd77bc call 0bc77h ;fájl megnyitása
0178 e1 pop hl ;töltési cím
0179 cd83bc call 0bc83h ;fájl betöltése
017c cd7abc call 0bc7ah ;fájl lezárása
017f 219101 ld hl,0191h
0182 34 inc (hl) ;file nevének növelése eggyel GUNFRUG1-->GUNFRIG2
0183 c9 ret
0184 00 nop
0185 00 nop
0186 00 nop
0187 00 nop
0188 3f ccf
0189 3f ccf
018a db "GUNFRIG1" ;file név
0192 db 000d1a0a180f1213 ;paletta színei1
db 0709020b0c030c06
01a2 db 0000000000000000 ;paletta színei2
db 0000000000000000
01b2 0c inc c ;karakterek adatai
…
033f 00 nop
Mivel semmi extrát nem tesz a betöltőnk, ezért úgy döntöttem, hogy innen csak a cheat-eket veszem ki, a többit pedig megoldom saját kútfőből az EP-s betöltőnkben (
START.SRC)
start.src (12.52 kB - downloaded 403 times.)
amely a következőket hajtja végre:
Rögtön az indulás után ráugrik a PRSTART részre, ami az előkészületeket végzi el, és betölti a töltő képernyőnket, azért kellett ezt a részt hátra tenni a kódban, és meghívni az elején ,mert a programunk eredetileg 0200h-ra töltődik ,és felülírná az épp végrehajtás alatt lévő betöltőnket, így már felülírhatja, mert végre lett hajtva, így is a programot először 0300h-ra kellett betölteni, mert 0100h-01ffh helyre nem fért be a maradék kód, és indítás előtt visszamásolni 0300h-ról 0200h-ra.
Nézzük a PRSTART részt:
- border beállítása
- bias beállítása
- soft reset beállítása
- memória ellenőrzés
- videólap lefoglalása az LPT-nek
- videólap lefoglalása a képmemóriának, majd ennek a területnek a törlése
- LPT felépítése, és az LPB-k képmemória címeinek hozzárendelése, megszakítási hely elhelyezése
- betöltő kép betöltése a képmemória területre, majd ennek megjelenítése
- 2 üres RAM szegmens lefoglalása, ami majd az 1-es, és 2-es lapra kerül.
PRSTART utáni folytatás:
- a program betöltése 0300h-ra, majd később lesz 0200h-ra másolva
- cheat bekérése, ezután a kép eltűntetése
- képmemória törlése
- 4-színű mód, és 32x25-ös képernyőméret, és paletta beállítása
- az új képernyőméretnek megfelelő képcímek LPB-khez rendelése
- Dave 0a6h-s regiszterének beállítása a 3 csatornás zaj emulációhoz
- megszakítás tiltása, és a kód 0300h-ról 0200h-ra való másolása
- a játék által használt megszakítási rutin belövése (0038 jp 28dch)
- ugrás a játék kezdetére
Pár dolog már a főprogramból került ide, a megszakítás belövése, a játék képernyőjének beállítása, ennyivel több helyünk lesz garázdálkodni a programban, ezeket a beállításokat csak egyszer hajtja végre a program.