Enterprise Forever
:HUN => Konvertálás => CPC-ről => Topic started by: geco on 2012.December.03. 16:28:52
-
Nos akkor csapjunk a lovak közé, ha már ennyire sikerült elhúznom az időt :D
Sajnos a Night Hunter okozott némi galibát, mind a 8 RAM szegmenst kihasználja, és erőteljesen lapozza is őket, így ha átírásra került volna a sor, akkor csak bővítős gépen lehetne egyszerűen megvalósítani, ha bele szeretnénk préselni 128Kb-ba, akkor már alapsan bele kéne túrni a lelki világába, és ekkor se 100%, hogy siker koronázza a munkát :(, így tovább kutakodva, rábukkantam a Gunfright-re, igaz létezik már spectrum port, de a CPC verzió mind zenében, mind grafikában felülmúlja azt, igaz sebességben alulmarad.
-
Ha megvan a kiszemelt áldozatunk, akkor első lépésben a DSK image-ét kell szemügyre venni, és a tartalmát kinyerni, ebben segítségünkre lesz a CPCXFS program.
indítsuk is el, a használatáról annyit, hogy érdekes keveréke a DOS parancsoknak, és az FTP-nek.
indítás után a HELP begépelésével kaphatunk kezelési útmutatót, ezt most hagyjuk is, első lépésként nyissuk meg a DSK-t.
open gunfrigh.dsk
Majd a DIR paranccsal kilistázhatjuk a DSK tartalmát ( sajnos előfordul olyan program is, amely nem DATA formátumban van a lemezen, ezek általában a CP/M-es lemezek, a fájlokat trükkösen, az emulátorba töltés után memóriamentéssel nyerhetjük ki, ezek többrészes programok, az eredeti loader módosításával minden fájlt kinyerhetünk)
Jelen esetben 3 file van a lemezen:
Directory of Image: GUNFRIGH.DSK , User 0
Used Users:
0 with 3 files
U Name Size Attr Ent | U Name Size Attr Ent
---------------------------------------+-------------------------------------
0 GUNFRIG1.BIN 16512 R/O + 2 | 0 GUNFRIG2.BIN 39040 R/O + 3
0 GUNFRIGH. 896 R/O 1 |
3 files in 56448 Bytes
(122880 Bytes free, 60416 Bytes allocated, 6 entries of 64)
Ebből első ránézésre az látszik ,hogy nagy valószínűségel van egy 896 bájtos loaderünk, egy 16512 bájtos betöltőképünk, és egy 39040 bájtos főprogramunk.
Az MGET *.* paranccsal le is vadászhatjuk őket a merevlemezünkre:
cpcfs> mget *.*
Getting "0:GUNFRIGH.": 896 Bytes
Getting "0:GUNFRIG1.BIN": 16512 Bytes
Getting "0:GUNFRIG2.BIN": 39040 Bytes
Total: 56448 Bytes, 3 files
Mostmár rendelkezünk az átírni kívánt fájlokkal, ha szerencsénk van, akkor a loader basic, na jelen esetben pont nem, erről a kiterjesztés BAS hiánya árulkodik, ha basic lenne, LOAD"GUNFRIGH paranccsal betölthetnénk a CPC emulátorba, majd kilistázva látszana is, mit csinál.
Ebben az esetben a LOAD parancs MEMORY FULL hibaüzenetbe torkollna, a gépi kódú loadereket minden esetben a RUN paranccsal indítsuk, jelen esetben:
Következő lépés a legszimpatikusabb CPC emulátor kiválasztása (én az István CPC emuját, és a WINCPC-t használom, utóbbit ritkábban)
RUN"GUNFRIGH
Ha ez megtörtént, a program betölt, és gyönyörködhetünk áldozatunkban :D, no de most a betöltő kódjára van szükségünk, itt érdemes pár szót ejteni a CPC fájlformátumokról:
A CPC fájlok 128 bájtos fejléccel kezdődnek, kivéve ha az ASCII fájl (ASCII esetén nincs fejléc, csak az adatot tartalmazza), számunkra fontosabb információk (hexa formátumban, erre a TOTAL Commander viewere tökéletes a 3-as gomb lenyomása után )
01h-0bh a fájl neve, a pont nélkül
12h a fájl típusa (00 basic, 01 protected basic, 02 binary)
15h-16h bináris fájl töltési címe (ha nincs megadva más érték töltésnél, RUN esetén mindig)
1ah-1bh erre a címre ugrik a futás, ha a fájl betöltődött (csak ha RUN-nal lett betöltve)
-
A disket honnan töltsük le? (Csak, azért hogy mindenki ugyan azzal a verzióval próbálkozzon :-) )
-
Térjünk rá a loaderre:
A programrészek visszafejtéséhez az INKLAND DZ80 (http://www.inkland.org.uk/dz80/index.htm) 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 :D
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:
[attachimg=1]
Ezek után mehetünk is a disassembly gombra, és megkapjuk a listánkat:
GUNFRIGH.ASM
A 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:[attach=3]
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)
[attach=2]
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.
-
A disket honnan töltsük le? (Csak, azért hogy mindenki ugyan azzal a verzióval próbálkozzon :-) )
Mondjuk akkor innen: :D
[attach=1]
De ha jól emléxem, akkor a CPCGameReviews (http://cpcgamereviews.com/)-ról töltöttem le.
-
Már megvan a betöltőnk, igaz kicsit előre is haladtunk vele :D Nézzük meg közelebbről a betöltőképünket:
a betöltőből tudjuk, hogy a képünkhöz a következő szoftver paletta rendeltetett:
00h,0dh,1ah,0ah,18h,0fh,12h,13h,07h,09h,02h,0bh,0ch,03h,0ch,06h
Ezt át kell alakítanunk hardver palettává a következő táblázat segítségével, hogy beadagolhassuk a CPCCOLOR-nak (erre a konverzióra csak akkor van szükség, ha a 0BC32h-s ROM hívással állítjuk be a palettát, ha regiszter írással, akkor csak a bit6-ot kell lenullázni, és hexa formában megetetni a CPCCOLOR-ral (0x1f pl )
sft hw hw
hex hex dec
00h --> 54h --> 20
01h --> 44h --> 04,16
02h --> 55h --> 21
03h --> 5ch --> 28
04h --> 58h --> 24
05h --> 5dh --> 29
06h --> 4ch --> 12
07h --> 45h --> 05,08
08h --> 4dh --> 13
09h --> 56h --> 22
0ah --> 46h --> 06
0bh --> 57h --> 23
0ch --> 5eh --> 30
0dh --> 40h --> 00,01
0eh --> 5fh --> 31
0fh --> 4eh --> 14
10h --> 47h --> 07
11h --> 4fh --> 15
12h --> 52h --> 18
13h --> 42h --> 02,17
14h --> 53h --> 19
15h --> 5ah --> 26
16h --> 59h --> 25
17h --> 5bh --> 27
18h --> 4ah --> 10
19h --> 43h --> 03,09
1ah --> 4bh --> 11
A CPCCOLOR segítségével, megkapjuk az EP palettát, a BIAS-t, és a byte konverziós táblát (PIX fájl):
[attach=1]
cpccolor -pixelmapfmt 1 -pixelmap pix 20 00 11 6 10 14 18 02 05 22 21 23 30 28 30 12
CPC palette:
0: 20 (Black ): mapped to 8 (0x00), err = 0.0000
1: 0 (White ): mapped to 15 (0x07), err = 0.1056
2: 11 (Bright White ): mapped to 2 (0xFF), err = 0.0000
3: 6 (Cyan ): mapped to 14 (0x06), err = 0.1055
4: 10 (Bright Yellow ): mapped to 4 (0xDB), err = 0.0000
5: 14 (Orange ): mapped to 5 (0xD9), err = 0.0579
6: 18 (Bright Green ): mapped to 6 (0xB2), err = 0.0994
7: 2 (Sea Green ): mapped to 6 (0xB2), err = 0.0981
8: 5 (Purple ): mapped to 7 (0xCD), err = 0.1143
9: 22 (Green ): mapped to 10 (0x02), err = 0.0734
10: 21 (Bright Blue ): mapped to 3 (0x24), err = 0.0000
11: 23 (Sky Blue ): mapped to 1 (0x66), err = 0.0867
12: 30 (Yellow ): mapped to 11 (0x03), err = 0.0751
13: 28 (Red ): mapped to 9 (0x01), err = 0.0562
14: 30 (Yellow ): mapped to 11 (0x03), err = 0.0751
15: 12 (Bright Red ): mapped to 0 (0x49), err = 0.0000
Enterprise palette: 0x49, 0x66, 0xFF, 0x24, 0xDB, 0xD9, 0xB2, 0xCD
Enterprise bias: 0 (0 to 31) / 0x00 (0 to 0xF8)
Megkaptuk a szükséges információkat a képkonverzióhoz, és a betöltő palettájának feltöltéséhez, a bias értékadásnál meg is adtuk a 00h-t, és a VLPB címke 2. sorában pedig a paletta értékek szerepelnek már, és a képfájl betöltése is elintézve a loaderben, most jön a fájl átalakítása a következő program segítségével:
macro exos n
rst 030h
defb n
endm
org 00f0
db 00,05 ;EXOS header felépítése
dw fillen
db 00,00,00,00,00,00,00,00,00,00,00,00
startpr ld sp,100h
exos 24 ;memóriaallokálás, és belapozás
ld a,c
out (0b1h),a
exos 24
ld a,c
out (0b2h),a
exos 24
ld a,c
out (0b3h),a
xor a ;0-ás csatorna
ld de,pr2 ;fájlnév címe
exos 1 ;fájl megnyitása
ld de,4000h ;töltési cím
ld bc,0080h ;header 128 bájt hosszú
exos 6 ;CPC bin header beolvasása
ld de,4000h ;program töltési címe
ld bc,4000h ;fájl hossza fejléc nélkül
exos 6 ;fájl beolvasása
xor a
exos 3 ;0-ás csatorna lezárása
call convcol ;színkonverzió
xor a ;0-ás csatorna
ld de,pr2a ;fájlnév címe
exos 2 ;fájl létrehozása
ld de,4000h ;mentés kezdési címe
ld bc,4000h ;menteni kívánt bájtok száma
exos 8 ;mentés a 0-ás csatornára
xor a
exos 3 ;0-ás csatorna bezárása
di
end inc a ;keretszínezés jelzés,hogy a konvertálás végetért
out (81h),a
jr end
pr2 db 12,"gunfrig1.bin" ;input fájl hossza, neve
pr2a db 12,"gunfrigh.scr" ;output fájl hossza, neve
convcol ld hl,4000h
ld b,high pixelConvTable
nextpix ld c,(hl)
ld a,(bc)
ld (hl),a
inc hl
bit 7,h
jr z,nextpix
ret
defs 0200h-$
pixelConvTable: ;CPCcolor-ral kinyert konverziós tábla
defb 003h, 056h, 0a9h, 0fch, 006h, 046h, 0ach, 0ech, 009h, 05ch
defb 089h, 0dch, 00ch, 04ch, 08ch, 0cch, 012h, 047h, 0b8h, 0edh
defb 016h, 047h, 0bch, 0edh, 018h, 04dh, 098h, 0cdh, 01ch, 04dh
defb 09ch, 0cdh, 021h, 074h, 08bh, 0deh, 024h, 064h, 08eh, 0ceh
defb 029h, 07ch, 08bh, 0deh, 02ch, 06ch, 08eh, 0ceh, 030h, 065h
defb 09ah, 0cfh, 034h, 065h, 09eh, 0cfh, 038h, 06dh, 09ah, 0cfh
defb 03ch, 06dh, 09eh, 0cfh, 057h, 007h, 0fdh, 0adh, 017h, 042h
defb 0bdh, 0e8h, 05dh, 00dh, 0ddh, 08dh, 01dh, 048h, 09dh, 0c8h
defb 052h, 043h, 0f8h, 0e9h, 016h, 002h, 0bch, 0a8h, 058h, 049h
defb 0d8h, 0c9h, 01ch, 008h, 09ch, 088h, 075h, 025h, 0dfh, 08fh
defb 035h, 060h, 09fh, 0cah, 07dh, 02dh, 0dfh, 08fh, 03dh, 068h
defb 09fh, 0cah, 070h, 061h, 0dah, 0cbh, 034h, 020h, 09eh, 08ah
defb 078h, 069h, 0dah, 0cbh, 03ch, 028h, 09eh, 08ah, 0abh, 0feh
defb 00bh, 05eh, 0aeh, 0eeh, 00eh, 04eh, 02bh, 07eh, 081h, 0d4h
defb 02eh, 06eh, 084h, 0c4h, 0bah, 0efh, 01ah, 04fh, 0beh, 0efh
defb 01eh, 04fh, 03ah, 06fh, 090h, 0c5h, 03eh, 06fh, 094h, 0c5h
defb 0a1h, 0f4h, 083h, 0d6h, 0a4h, 0e4h, 086h, 0c6h, 029h, 07ch
defb 001h, 054h, 02ch, 06ch, 004h, 044h, 0b0h, 0e5h, 092h, 0c7h
defb 0b4h, 0e5h, 096h, 0c7h, 038h, 06dh, 010h, 045h, 03ch, 06dh
defb 014h, 045h, 0ffh, 0afh, 05fh, 00fh, 0bfh, 0eah, 01fh, 04ah
defb 07fh, 02fh, 0d5h, 085h, 03fh, 06ah, 095h, 0c0h, 0fah, 0ebh
defb 05ah, 04bh, 0beh, 0aah, 01eh, 00ah, 07ah, 06bh, 0d0h, 0c1h
defb 03eh, 02ah, 094h, 080h, 0f5h, 0a5h, 0d7h, 087h, 0b5h, 0e0h
defb 097h, 0c2h, 07dh, 02dh, 055h, 005h, 03dh, 068h, 015h, 040h
defb 0f0h, 0e1h, 0d2h, 0c3h, 0b4h, 0a0h, 096h, 082h, 078h, 069h
defb 050h, 041h, 03ch, 028h, 014h, 000h
fillen equ $-startpr
És már meg is van a betöltőképünk, ha gyönyörködni szeretnénk benne, akkor a START.SRC-ben a call prstart után írjuk be a következőt:
loopx jr loopx
Majd fordítsuk le:
SJASM START.SRC START
start.lst -ben nézzük meg, volt-e valami hiba, ha nem, akkor máris indítható a START fájlunk, és a betöltőképernyő megjelenik.
-
Most rátérhetnénk a főprogramra, de ejtsünk pár szót a CPC specialitásairól, és regisztereiről.
Z80A ketyeg benne 4 MHz-en, mivel itt is osztozik a memórián a CPU a grafikáért felelős CRTC-vel ezért a sebesség körülbelül 3,3 MHz-nek felel meg.
CRTC felelős a megjelenítésért, maximum 640x400-as felbontásban (interlace 2 szín).
Gate Array chip felelős mind a 27 színért, a palettabeállításért, keretbeállításért, videómódok beállításáért (3 módot ismer, 2 szín mód, 4 szín mód, és 16 szín mód) , ROM, RAM managementért, és megszakításkezelésért.
8255 PPI felelős az AYchip kezeléséért, magnókezelésért, párhuzamos/nyomtatóport kezeléséért, billentyűzet, és VSYNC kezelésért.
AYchip a zajkeltő eszköz.
Mivel a leírás tömve van táblázatokkal, ézért inkább ide linkelem : [attach=1]
-
Ennyi kitérő után készítsük el a GUNFRIG2.BIN disassembly listáját, ehhez térjünk vissza a jó öreg DZ80-hoz, a program 0200h-ra töltődik, és 0200h-n is kezdődik az első utasítás, ennek megfelelően belőtt opciók után már meg is kaptuk a listát, első lépésben keressük meg az összes OUT és IN utasítást, természetesen lesz benne egy csomó szemét is, a direkt port címcésekkel rendelkező IN/OUT (pl OUT(0FEH),A )utasításokat nagy valószínűséggel el is felejthetjük, de azért nézzük meg, hogy az előtte lévő 1-2 utasítás nem teszi-e gyanússá őket a CPC portkiosztás táblázat összehasonlításával:
Az első találatunk a CRTC, és Gate Array beállításai egy szép ciklusban végrehajtva, nincs semmi gáz, mert az adatblokkot végignézve, az látható, hogy ezek nem okoznak majd fejtörést, sőt a program csak induláskor hívja meg ezt a részt, úgyhogy ennek helyettesítését betehetjük a loaderbe, felszabadítva jópár bájtot a későbbi módosításokhoz.
tehát rögtön a program elején lévő 0204 call 28dch helyettesíthető 3 db 00h-val, majd utána 28dc-295e tartományról jegyezzük meg hogy később ez a terület szabadon használható, kivéve 292c utáni rész, mert az lesz a megszakításunk, mint az a 28f4 utáni részen látszik, a megszakítás beállítását is elhelyezzük a loaderben, a megszakítás rutint módosítani kell 3 dolog miatt is, CPC 300Hz-es megszakítást használ, és mi csak 50Hz-est szeretnénk, mert a program is csak 50Hz-enként végez minden megszakítási műveletet időben eltolva, a 6 300 Hz-es fázis minden 5. 300Hz-es megszakításában zenél, és majd később látjuk, hogy minden 3. után bemásolja a játék képernyőjét a videómemóriába, a másik ok, el kell helyezni a Dave VIDEO megszakítás resetet, hogy ne maradjunk állandó aktív megszakítási állapotban, a 3. pedig az új zenelejátszó meghívása miatt, mert az eredeti regiszterírások helyett csak eltároljuk a regiszter értékeket, amiket a PLAYSND rutin alakít át, és juttatja el a DAVE megfelelő portjaira.
0200 f3 di
0201 31febf ld sp,0bffeh
0204 cddc28 call 28dch
0207 2100fe ld hl,0fe00h
28dc f3 di ;CRTC és színbeállítások
28dd af xor a
28de 320080 ld (8000h),a
28e1 3c inc a
28e2 320280 ld (8002h),a
28e5 210129 ld hl,2901h ;a CRTC és szín beállítások értékei
28e8 4e ld c,(hl)
28e9 23 inc hl
28ea 46 ld b,(hl)
28eb 23 inc hl
28ec 78 ld a,b
28ed b1 or c
28ee 2804 jr z,28f4h
28f0 ed49 out (c),c
28f2 18f4 jr 28e8h
28f4 212d29 ld hl,292dh ;megszakítás beállítása
28f7 223900 ld (0039h),hl
28fa 3ec3 ld a,0c3h
28fc 323800 ld (0038h),a
28ff fb ei
2900 c9 ret
2901 db 01h,0bch,20h,0bdh ;CRTC 1-es regiszterbe 20h video x 32
db 02h,0bch,2ah,0bdh ;CRTC 2-es regiszterbe 2ah
db 06h,0bch,18h,0bdh ;CRTC 6-os regiszterbe 18h video y 24
db 0ch,0bch,30h,0bdh ;CRTC c-es regiszterbe 30h video start 0c0xxh
db 0dh,0bch,00h,0bdh ;CRTC d-es regiszterbe 00h video start 0c000h
db 8dh,7fh ;4 színű képernyő, ROM-ok tiltva
db 00h,7fh,54h,7fh ;ink 0 fekete
db 01h,7fh,4eh,7fh ;ink 1 narancs
db 02h,7fh,4ah,7fh ;ink 2 világos sárga
db 03h,7fh,4ch,7fh ;ink 3 piros
db 10h,7fh,54h,7fh ;border fekete
db 00h,00h ;adatblokk vége
292d f5 push af ;megszakítási rutin
292e c5 push bc
292f 019d7f ld bc,7f9dh ;alsó, felső ROM tiltva, 4 szín mód
2932 ed49 out (c),c
2934 06f5 ld b,0f5h
2936 ed78 in a,(c) ;50 Hz-es megszakítás csekkolása
2938 ed4b66ff ld bc,(0ff66h)
293c 0c inc c
293d 0f rrca
293e 3003 jr nc,2943h
2940 0e00 ld c,00h
2942 04 inc b
2943 ed4366ff ld (0ff66h),bc
2947 79 ld a,c
2948 fe05 cp 05h
294a 200f jr nz,295bh
294c d5 push de
294d e5 push hl
294e dde5 push ix
2950 fde5 push iy
2952 cd0f80 call 800fh
2955 fde1 pop iy
2957 dde1 pop ix
2959 e1 pop hl
295a d1 pop de
295b c1 pop bc
295c f1 pop af
295d fb ei
295e ed4d reti
Módosított rész, a fölösleg kitörlése után, mivel a megszakítási rutin előrekúszott 28dc-re , ezért a megszakítást inicializáló rutinban is ezt a címet kell megadni, a loader már ezt tartalmazza.
dw 4000h+28dch,295fh-28dch ;cserélendő rutin címe, annak hossza
phase 28dch
ad292d push af ;megszakítási rutin, CPC-n alapból 300Hz-enként van
ad292e push bc
;ad292f ld bc,7f9dh ;alsó, felső ROM tiltva, 4 szín mód
;ad2932 out (c),c
;ad2934 ld b,0f5h ;nincs szükség rá, mert EP-n 50Hz-es megszakítás lesz
;ad2936 in a,(c) ;50 Hz-es megszakítás csekkolása
;ad2938 ld bc,(0ff66h)
;ad293c inc c
;ad293d rrca
;ad293e jr nc,2943h
;ad2940 ld c,00h
;ad2942 inc b
;ad2943 ld (0ff66h),bc
;ad2947 ld a,c
;ad2948 cp 05h
;ad294a jr nz,295bh ;csak minden 5-ös érték esetén hajtódik végre az alábbi rész (50 Hz-enként)
ld a,30h ;50Hz-es megszakítás beállítása
out (0b4h),a
ad294c push de
ad294d push hl
ad294e push ix
ad2950 push iy
ad2952 call 800fh
call playsnd ;zenelejátszás, korábban csak a regiszter értékek
ad2955 pop iy ;kerültek eltárolásra
ad2957 pop ix
ad2959 pop hl
ad295a pop de
ad295b pop bc
ad295c pop af
ad295d ei
ad295e ret
defs 295fh-$
dephase
-
Következő találatunk a billentyűzet olvasó kódrész, ez CPC-n jó hosszúra sikerült a bonyolult, és nehézkes PPI-n keresztül történő elérés miatt.
2cc7 e5 push hl ;billentyűzet
2cc8 d5 push de
2cc9 c5 push bc
2cca f3 di
2ccb 010ef4 ld bc,0f40eh ;AY chip 0eh regiszer elhelyezése PPI port A-n
2cce ed49 out (c),c
2cd0 06f6 ld b,0f6h
2cd2 ed78 in a,(c)
2cd4 e6c0 and 0c0h
2cd6 4f ld c,a
2cd7 f6c0 or 0c0h
2cd9 ed79 out (c),a ;PPI port C-re 11000000b ami select PSG register
2cdb ed49 out (c),c ;PPI port C-re 00h ami inactive PSG művelet
2cdd 3e92 ld a,92h ;I/O mód,Group A Mode 0 - Simple I/O,Port A 1-in
2cdf 04 inc b ;PPI control:0f7h
2ce0 ed79 out (c),a ;ez a lényeges infó 92h-ból, és itt beállítva
2ce2 c5 push bc ;kiválasztottuk az 0eh AY regisztert
;innentől olvasható az érték 0eh-ból
2ce3 cbf1 set 6,c ;itt állítja be, hogy olvasás lesz AY portról
2ce5 21052d ld hl,2d05h ;kezdő bill. Érték eltárolási cím
2ce8 1e0a ld e,0ah ;ciklusváltozó 10
2cea 06f6 ld b,0f6h ;PPI port C
2cec ed49 out (c),c ;olvasás AY 0eh portról, mind a tíz bill. sort
2cee 06f4 ld b,0f4h ;PPI port A
2cf0 ed78 in a,(c) ;PPI port A-rol a bill Sor lekérdezése
2cf2 77 ld (hl),a ;érték eltárolása
2cf3 23 inc hl ;tárolási cím növelése
2cf4 0c inc c ;következő billentyűsor
2cf5 1d dec e ;ciklusváltozó csökkentése
2cf6 20f2 jr nz,2ceah ;vizsgálat, hogy elérte-e a változó a 0-t
2cf8 c1 pop bc ;PPI control
2cf9 3e82 ld a,82h ;I/O mód,Group A Mode 0 - Simple I/O,Port A 1-out
2cfb ed79 out (c),a
2cfd 05 dec b ;PPI port C
2cfe ed49 out (c),c ;C=00h, PSG inaktiválása
2d00 fb ei
2d01 c1 pop bc
2d02 d1 pop de
2d03 e1 pop hl
2d04 c9 ret ;billentyűzet vége
No, nézzük meg a helyettesítésünket, egy fokkal rövidebb lesz, pedig pelekerül mind a két joystick lekérdezése is :D Mivel a 2d05-2d0e-s tartományra hivatkozó rész van a billentyűlekérdező blokk mögött, ezért azt is idecsaptam, ne kelljen később, külön negtenni ezt, ebben a részben a CPC bill. Mátrixban kikeressük a megfelelő karaktereket, majd kicseréljük az EP bill. Mátrixa alapján, normál esetben ez lenne azegyszerűbb megoldás, most ez nem sokkal eccerűbb, mint teljesen átírni azt a részt, és betenni a 2 EXT Joy, INT Joy és QAOP Space csekkolását.
dw 4000h+2cc7h,2d8ch-2cc7h
phase 2cc7h
ad2cc7 push hl ;billentyűzet
ad2cc9 push bc
ad2cca di
ad2ce5 ld hl,keyrow0 ;itt tárolja el a billentyűsorok értékeit
ld b,0ah ;ciklusszámláló
keychk ld a,0ah
sub b ;A-B megadja az olvasni kívánt sort
out (0b5h),a
in a,(0b6h) ;joystick lekérdezése
rrca ;joy értéke a Carryben
in a,(0b5h) ;billyentyú lekérdezés
jr c,noext ;ha nem volt joy, akkor ugráa
res 7,a ;ha volt joy, akkor ez a 7-es biten tárolva
noext cpl ;eredetiben nem volt, ezért a flagvizsgálatok
;cseréje később bill ellenőrzéskor
ld (hl),a ;érték tárolása
ad2cf3 inc hl
ad2cf6 djnz keychk ;ciklus
ad2d00 ei
ad2d01 pop bc
ad2d03 pop hl
ad2d04 ret ;billentyűzet vége
extjoy xor a
rl (hl) ;tűz ext joy
rla
inc l
rl (hl) ;fel ext joy
rla
inc l
rl (hl) ;le
rla
inc l
inc l
rl (hl) ;jobb
rla
dec l
rl (hl) ;bal
rla
or c
ld c,a
ret
defs 2d05h-$
keyrow0
ad2d05 db 00h,00h,00h,00h,00h,00h,00h,00h,00h,00h ;a bill értékeinek tárolása
ad2d0f call ad2cc7 ;billentyűzet
ad2d12 ld bc,0000h
ad2d14 push hl
;ad2d15 ld hl,2d0eh ;9. sor joy sora
;ad2d18 ld a,(hl)
;ad2d19 rra ;joy fel
;ad2d1a jr c,2d1eh
;ad2d1c set 3,c
;ad2d1e rra ;joy le
;ad2d1f jr c,2d23h
;ad2d21 set 2,c
;ad2d23 rra ;joy bal
;ad2d24 jr c,2d28h
;ad2d26 set 0,c
;ad2d28 rra ;joy jobb
;ad2d29 jr c,2d2dh
;ad2d2b set 1,c
;ad2d2d rra ;joy tűz 2
;ad2d2e jr nc,2d33h
;ad2d30 rra ;joy tűz 1
;ad2d31 jr c,2d35h
;ad2d33 set 4,c
;ad2d35 dec hl ;8. sor
;ad2d36 bit 3,(hl) ;Q
;ad2d38 jr nz,2d3ch
;ad2d3a set 3,c
;ad2d3c bit 5,(hl) ;A
;ad2d3e jr nz,2d42h
;ad2d40 set 2,c
;ad2d42 dec hl ;7. sor
;ad2d43 dec hl ;6. sor
;ad2d44 bit 7,(hl) ;V
;ad2d46 jr nz,2d4ah
;ad2d48 set 5,c
;ad2d4a dec hl ;5. sor
;ad2d4b bit 7,(hl) ;space
;ad2d4d jr nz,2d51h
;ad2d4f set 4,c
;ad2d51 dec hl ;4. sor
;ad2d52 bit 2,(hl) ;O
;ad2d54 jr nz,2d58h
;ad2d56 set 0,c
;ad2d58 dec hl ;3. sor
;ad2d59 bit 3,(hl) ;P
;ad2d5b jr nz,2d5fh
;ad2d5d set 1,c
Ld a,(keyrow0+7)
rlca
rlca
rl c ;enter
rlca
rlca
rlca
rl c ;fel int joy
rlca
rlca
rl c ;le
rrca
rrca
rl c ;jobb
rrca
rrca
rrca
rl c ;bal
ld a,(keyrow0+8)
rlca
rlca
rl b ;space
ld a,(keyrow0+2)
rrca
rrca
rl b ;Q
ld a,(keyrow0+1)
rlca
rlca
rl b ;A
ld a,(keyrow0+9)
rlca
rlca
rlca
rlca
rl b ;P
rlca
rlca
rl b ;O
ld a,b
or c
ld c,a
ld hl,keyrow0
call extjoy ;ext1
ld l,low keyrow0+5
call extjoy ;ext2
ad2d5f pop hl
ad2d60 push de
ad2d61 ld a,(0fe3dh)
ad2d64 ld e,a
ad2d65 ld a,c
ad2d66 and 03h
ad2d68 cp 03h
ad2d6a jr z,2d8ch
ad2d6c ld b,a
ad2d6d ld a,e
ad2d6e and 0fch
ad2d70 or b
ad2d71 ld e,a
ad2d72 ld a,c
ad2d73 and 0ch
ad2d75 cp 0ch
ad2d77 jr z,2d94h
ad2d79 ld d,a
ad2d7a or b
ad2d7b ld b,a
ad2d7c ld a,e
ad2d7d and 0f3h
ad2d7f or d
ad2d80 ld e,a
ad2d81 ld a,e
ad2d82 ld (0fe3dh),a
ad2d85 pop de
ad2d86 ld a,c
ad2d87 and 10h
ad2d89 or b
ad2d8a ld b,a
ad2d8b ret
defs 2d8ch-$
dephase
Nézzük is meg, hol vannak még Billentyűzetre utaló jelek:
1584 1115fe ld de,0fe15h
1587 3a0d2d ld a,(2d0dh) ;8. sor
158a 2104fe ld hl,0fe04h
158d cb47 bit 0,a ;0. bit "1"
158f 281d jr z,15aeh
1591 3600 ld (hl),00h
1593 23 inc hl
1594 3a0d2d ld a,(2d0dh) ;8. sor
1597 cb4f bit 1,a ;1. bit "2"
1599 2823 jr z,15beh
159b 3600 ld (hl),00h
159d 23 inc hl
159e 3a0c2d ld a,(2d0ch) ;7. sor
15a1 cb4f bit 1,a ;1. bit "3"
15a3 c0 ret nz
27b3 3a0d2d ld a,(2d0dh) ;8. sor
27b6 fefb cp 0fbh ;2. bit ESC
27b8 c0 ret nz
27b9 cdc627 call 27c6h
27bc cdc72c call 2cc7h ;billentyűzet
27bf 3a0d2d ld a,(2d0dh) ;8. sor
27c2 e604 and 04h ;2. bit esc
27c4 20f6 jr nz,27bch
27c6 af xor a
27c7 32dd27 ld (27ddh),a
27ca cdc72c call 2cc7h ;billentyűzet
27cd 3a0d2d ld a,(2d0dh) ;8. sor
27d0 e604 and 04h ;2. bit esc
27d2 28f2 jr z,27c6h
27d4 3add27 ld a,(27ddh)
27d7 3c inc a
27d8 fe04 cp 04h
27da 20eb jr nz,27c7h
27dc c9 ret
Mivel, az EXT Joy értékeit pont a 7. bitre helyeztük be, ezért az ESC használatát mellőznünk kell ,különben a EXT1 bal iránya is az ESC lenyomásával lenne egyenértékű, így kicseréltem STOP-ra, az első rész 1,2,3 gombokra való választását meg csak szimpátia alapján áttettem F1-F3 billentyűkre, és mivel volt hely a STOP lekérdezésénél, ezért le lett cserélve a full billentyűlekérdezés, csak a STOP sorára koncentrálva.
dw 4000h+1584h,15adh-1584h
phase 1584h
ad1584 ld de,0fe15h
ad1587 ld a,(keyrow0+4) ;4. sor (8. sor)
ad158a ld hl,0fe04h
ad158d bit 7,a ;7. bit F1 (0. bit "1")
ad158f jr nz,15aeh
ad1591 ld (hl),00h
ad1593 inc hl
;ad1594 ld a,(2d0dh) ;8. sor
ad1597 bit 6,a ;6. bit F2 (1. bit "2")
ad1599 jr nz,15beh
ad159b ld (hl),00h
ad159d inc hl
;ad159e ld a,(2d0ch) ;7. sor
ad15a1 bit 2,a ;2. bit F3 (1. bit "3")
ad15a3 ret z
ad15a4 ld hl,0fe37h
ad15a7 inc (hl)
ad15a8 ld iy,15f5h
ad15ac jr 15cch
defs 15adh-$
dephase
dw 4000h+27b3h,27ddh-27b3h
phase 27b3h
ad27b3 ld a,(keyrow0+7) ;3. sor (8. sor)
ad27b6 cp 02h ;1. STOP bit (2. bit ESC)
ad27b8 ret nz
ad27b9 call 27c6h
ad27bc ;call ad2cc7 ;billentyűzet
;ad27bf ld a,(2d0dh) ;8. sor
;ad27c2 and 04h ;2. bit esc
ld a,07h ;7. sor
out (0b5h),a
in a,(0b5h)
and 01h ;0. bit STOP
ad27c4 jr nz,ad27bc
ad27c6 xor a
ad27c7 ld (27ddh),a
;ad27ca call ad2cc7 ;billentyűzet
;ad27cd ld a,(2d0dh) ;8. sor
;ad27d0 and 04h ;2. bit esc
Ld a,07h ;7. sor
out (0b5h),a
in a,(0b5h)
and 01h ;0. bit STOP
ad27d2 jr z,ad27c6
ad27d4 ld a,(27ddh)
ad27d7 inc a
ad27d8 cp 04h
ad27da jr nz,ad27c7
ad27dc ret
defs 27ddh-$
dephase
-
És az utolsó fázis, ami az OUT rutinokat illeti, a hangdegenerálás, mivel itt is egymás mögött van az AY regisztereket bizergáló rutin, és az értékeket kigyűjtő rész, ezért ezt is egyben dolgozzuk fel, plusz hozzácsaptam a programban máshol található 6-os, 7-es regiszter értékét eltároló utasítások módisítását, mert ezek az átírás során eredeti helyükről elvándoroltak. Itt meg lehetett volna valósítani, hogy nem tárolom el külön az AYREG helyen az AY regiszter értékeit, hanem egyből a PLAYSND-t helyezem ide, módosított címekkel, de ez a megoldás általánosabb, a legtöbb programban fel lehet használni:
dw 4000h+82a6h,3
ad82a6 ld (ad8c95),a ;ay 6-es regiszter érték eltárolása
dw 4000h+82dch,3
ad82dc ld (ad8c94),a ;ay 7-es regiszter érték eltárolása
dw 4000h+8c4ch,8cc4h-8c4ch
phase 8c4ch
ad8c4c ld hl,8bdbh ;ay 0,1 regiszter
;ad8c4f ld a,00h
;ad8c51 call 8c96h
ld de,ayreg
ldi
ldi
;ad8c54 ld hl,(8bddh) ;ay 2,3 regiszter
;ad8c4f ld a,00h
;ad8c51 call 8c96h
ldi
ldi
;ad8c5c ld hl,(8bdfh) ;ay 4,5 regiszter
;ad8c5f ld a,04h
;ad8c61 call 8c96h
ldi
ldi
;ad8c64 ld a,(8c95h) ;ay 6 regiszter
;ad8c67 ld c,a
;ad8c68 ld a,06h
;ad8c6a call 8ca2h
ld hl,ad8c95
ldi
;ad8c88 ld a,(8c94h) ;ay 7 regiszter
;ad8c8b and 3fh
;ad8c8d ld c,a
;ad8c8e ld a,07h
;ad8c90 call 8ca2h
ld l,low ad8c94
ldi
;ad8c6d ld a,(8bd8h) ;ay 8 regiszter
;ad8c70 ld c,a
;ad8c71 ld a,08h
;ad8c73 call 8ca2h
ld hl,8bd8h
ldi
;ad8c76 ld a,(8bd9h) ;ay 9 regiszter
;ad8c79 ld c,a
;ad8c7a ld a,09h
;ad8c7c call 8ca2h
ldi
;ad8c7f ld a,(8bdah) ;ay a regiszter
;ad8c82 ld c,a
;ad8c83 ld a,0ah
;ad8c85 call 8ca2h
ldi
ad8c93 ret
ad8c94 db 38h ;ay 7-es regiszter érték
ad8c95 db 00h ;ay 6-es regiszter érték
;ad8c96 ld c,l
;ad8c97 ld e,a
;ad8c98 call 8ca2h
;ad8c9b ld a,e
;ad8c9c inc a
;ad8c9d ld c,h
;ad8c9e call 8ca2h
;ad8ca1 ret
;ad8ca2 push bc ;AY regiszter írása, nálunk ez a megszakításból hívva
;ad8ca3 di ;A regiszter, C érték
;ad8ca4 ld b,0f4h
;ad8ca6 out (c),a ;AY chip A regiszer elhelyezése PPI port A-n
;ad8ca8 ld b,0f6h
;ad8caa in a,(c)
;ad8cac or 0c0h
;ad8cae out (c),a ;PPI port C-re 11000000b ami select PSG register
;ad8cb0 and 3fh
;ad8cb2 out (c),a ;PPI port C-re 0xh ami inactive PSG művelet
;ad8cb4 ld b,0f4h
;ad8cb6 out (c),c ;C érték kiírása A AY regiszterre
;ad8cb8 ld b,0f6h
;ad8cba ld c,a
;ad8cbb or 80h ;I/O mód,Group A Mode 0 - Simple I/O,Port A 1-out
;ad8cbd out (c),a
;ad8cbf out (c),c ;C=00h, PSG inaktiválása
;ad8cc1 ei
;ad8cc2 pop bc
;ad8cc3 ret ;
playsnd ld c,9fh ;DAVE regiszterek írása, első felvonás, nem fért be
;ide a teljes, ezért ketté lett bontva
ld hl,(ayreg) ;reg 0,1 (frekvencia A)
ld a,(ayreg+7) ;reg 7
call chfreq
ld hl,(ayreg+2) ;reg 2,3 (frekvencia B)
call chfreq1
ld hl,(ayreg+4) ;reg 4,5 (frekvencia C)
call chfreq1
volvals
ld bc,ayvoltb ;AY volume értékek DAVE megfelelői
ld a,(ayreg+8) ;reg 8 (hangerő A)
add a,c
ld c,a
ld a,(bc)
out (0ach),a
rra
out (0a8h),a
ld a,(ayreg+9) ;reg 9 (hangerő B)
ld c,low ayvoltb
add a,c
ld c,a
ld a,(bc)
out (0a9h),a
out (0adh),a
ld a,(ayreg+0ah) ;reg a (hangerő C)
ld c,low ayvoltb
add a,c
ld c,a
ld a,(bc)
out (0aah),a
rra
out (0aeh),a
ret
ayreg defs 11 ;AYregiszter értékek,mivel envelope nincs,ezért csak 11
defs 8cc4h-$
dephase
Az AY-t utánzó rész második felének pedig a megszakítási rutin utáni részen lehet elegendő helyet találni, a 28dch-295fh részben ad295e ret után:
chfreq1 ld a,b ;reg 7
rrca
chfreq
ld b,a
inc c
if TONE_AND_NOISE_MODE == 0
rrca
jr nc, setToneGenFrequency ; tone generator enabled ?
and 04h
jr z, setNoiseGenFreq ; noise generator enabled ?
endif
if TONE_AND_NOISE_MODE == 1
bit 3, a
jr z, setNoiseGenFreq ; noise generator enabled ?
rrca
jr nc, setToneGenFrequency ; tone generator enabled ?
endif
if TONE_AND_NOISE_MODE > 15
and 09h
jr z, setToneGenAsNoise ; tone + noise generator enabled ?
srl a
jr nc, setToneGenFrequency ; tone generator only ?
jr z, setNoiseGenFreq ; noise generator only ?
endif
xor a ; channel disabled
ld h,a
ld l,a
jr setToneGenFrequency.l3
if TONE_AND_NOISE_MODE > 15
setToneGenAsNoise:
ld a, TONE_AND_NOISE_MODE
defb 0feh ; = CP nn
endif
setToneGenFrequency:
if TONE_AND_NOISE_MODE > 15
xor a
endif
add hl, hl
dec hl
bit 4, h
jr nz, .l2 ; overflow ?
.l1:
if TONE_AND_NOISE_MODE > 15
or h ; * non-zero for tone + noise
ld h,a
endif
.l3: out (c), l
inc c
out (c), h
ret
.l2: ld l, 1
inc h
jr z, .l1
ld hl, 0fffh
jr .l1
setNoiseGenFreq:
ld a, (ayreg+6) ;reg 6
add a,a
add a,a
jr nz, .l1
ld a,04h
.l1: dec a
ld l,a
ld h,30h ;30h
jr setToneGenFrequency.l3
ayvoltb defb 00h,01h,02h,03h,04h,05h,06h,09h
defb 0ch,11h,16h,1ch,24h,2ch,35h,3fh
És akkor most jöhetnek az IN utasítások, az elsőt már el is intéztük egy jópofa törléssel a megszakítási rutinban, mivel nálunk 50Hz-es megszakítás lépett érvénybe, az meg pont jókor :D, ezen kívül van még egy, mielőtt a RAM-ban eltárolt játék képet bemásolná a program a Videómemóriába.
dw 4000h+2c2fh,2c36h-2c2fh
phase 2c2fh
;ad2c2f ld a,(0ff66h) ;várakozás 03h értékre, ez 50Hz-enként következik
;ad2c32 cp 03h
;ad2c34 jr nz,ad2c2f
halt ;mivel a megszakítás engedélyezett, ezért elég elhelyezni egy HALT-ot
defs 2c36h-$
dephase
És elérkeztünk az utolsó fázishoz, amikor a programunkat kis gépünkön is megnézhetjük, természetesen, amíg idáig eljutottam, volt jópár hibaellenőrzés, mert mindig elrontok valamit :D, többször fordítottam be a kis módosító programot, és kerestem, mi a hiba lol. A következő paranccsal be lehet fordítani a módosító programunkat, majd elindítva létrehozza az EP-s GUNFRIGH.PRG fájlt, ezek után már gyönyörködhetünk is benne, ez még nem az igazi, mert 64Kb-ba nem fér bele, és CPC videómemória címzést használ,ezért az LPT is több mammut méretű, de itt is meg lehet állni, a következőkben, ha igény van rá, akkor megszűntetjük a CPC címzést, és bepréseljük a programot 64Kb-ba.
SJASM.EXE GF.SRC A
Majd A indítása az emulátorban, ha a keret csíkoz, akkor végzett is, reset, végül a betöltőnk elindítása.
-
Aki szeretné maga kitöltögetni az átalakító forrást, és szórakozgatni, átalakítani, annak a [attach=1]-t ajánlom, aki a kitöltött verziót szeretné, annak pedig ezt: [attach=2]
-
Mint korábban írtam, a program 0a000h-0b500h-s címen állítja össze az összes fázist, és csak ezután másolja be ennek a területnek a tartalmát a videómemóriába. Most megnéztem, van bőven annyi szabad helyünk, hogy a kirajzolást kétfázisúvá tegyük, ezzel felgyorsítva a futást, így a CPC címzés megszűntetésével talán még EP64-en is elfogadható sebességűvé varázsolható a program.
-
Mint korábban írtam, a program 0a000h-0b500h-s címen állítja össze az összes fázist, és csak ezután másolja be ennek a területnek a tartalmát a videómemóriába. Most megnéztem, van bőven annyi szabad helyünk, hogy a kirajzolást kétfázisúvá tegyük, ezzel felgyorsítva a futást, így a CPC címzés megszűntetésével talán még EP64-en is elfogadható sebességűvé varázsolható a program.
Izgalmas!
-
Mint korábban írtam, a program 0a000h-0b500h-s címen állítja össze az összes fázist, és csak ezután másolja be ennek a területnek a tartalmát a videómemóriába. Most megnéztem, van bőven annyi szabad helyünk, hogy a kirajzolást kétfázisúvá tegyük, ezzel felgyorsítva a futást, így a CPC címzés megszűntetésével talán még EP64-en is elfogadható sebességűvé varázsolható a program.
Ez jól hangzik!
-
a CPC címzés megszűntetésével talán még EP64-en is elfogadható sebességűvé varázsolható a program.
Amit nem egészen értek: fentebb említetted, hogy a CPC sebessége (a közös memória miatt) kb. 3,3 MHz-nek felel meg. Akkor EP64-en miért lassabb egy "sima" (átalakítás nélküli) CPC átirat? EP-n videómemóriából futtatva a programot nem kb. 3,5 MHz-nek megfelelő sebességgel fut?
-
rábukkantam a Gunfright-re, igaz létezik már spectrum port, de a CPC verzió mind zenében, mind grafikában felülmúlja azt, igaz sebességben alulmarad.
Tényleg szebb! Esetleg ezt a narancssárgát valami kevésbé rikítóbb, barnás árnyalatra lehetne cserélni? Meg a citromsárgából is van ennél fakóbb EP-n.
-
Amit nem egészen értek: fentebb említetted, hogy a CPC sebessége (a közös memória miatt) kb. 3,3 MHz-nek felel meg. Akkor EP64-en miért lassabb egy "sima" (átalakítás nélküli) CPC átirat? EP-n videómemóriából futtatva a programot nem kb. 3,5 MHz-nek megfelelő sebességgel fut?
A szöveget, a CPC WIKI-n találtam :D Nekem lassabbnak tűnik EP videómemóriából futtatott progi, gondoljunk csak a Spectrum átiratokra, amelyek az 5B00h utáni részen elég aktív kódot tartalmaznak, azok is eléggé belassulnak a 3,5 MHz-es spectrumhoz képest, de ajd Zozo, vagy István tud erre pontos választ is sztem :)
Ez volt az eredeti:
ProcessorThe entire CPC series is based on the Zilog Z80 (http://en.wikipedia.org/wiki/Zilog_Z80)A processor, clocked at 4 MHz.[13] (http://en.wikipedia.org/wiki/Amstrad_CPC#cite_note-464_Tech_spec-13)
In order to avoid conflicts resulting from the CPU and the video circuits both accessing the shared main memory ("snowing"), CPU memory access is constrained to occur on microsecond boundaries, effectively padding every CPU instruction to a multiple of four CPU cycles. As typical Z80 instructions require three or four CPU cycles, the resulting loss of processing power is minor, reducing the effective clock rate to approximately 3.3 MHz.[14] (http://en.wikipedia.org/wiki/Amstrad_CPC#cite_note-SOFT968-14)
-
Tényleg szebb! Esetleg ezt a narancssárgát valami kevésbé rikítóbb, barnás árnyalatra lehetne cserélni? Meg a citromsárgából is van ennél fakóbb EP-n.
A sárgát már véletlenül benéztem, és a fakót választottam, nekem is jobban teccik úgy :D, és nem a narancssárgát változtattam, hanem a pirosat sötétítettem. Majd a végeredmény láttán lehet változtatni a színeken.
-
Ha kérdés, kérés van, akkor tegyétek fel nyugodtan, igyekszek válaszolni, és ha valami nem szimpi, vagy másképp kellett volna csinálni, mind a konverzió leírásában, mind a rutinokban, szóljatok, módosítok, vagy a következő programnál majd másképp fogom. Most még az a tervem, hogy a CPC címzést is megcsinálom, és közzéteszem.
-
Ha kérdés, kérés van, akkor tegyétek fel nyugodtan, igyekszek válaszolni,
Én sajnos érdemben nem tudok hozzászólni... :(
Csak a rikító narancssárga "szelídítését" tudom kérni. :oops:
-
Én sajnos érdemben nem tudok hozzászólni... :(
Csak a rikító narancssárga "szelídítését" tudom kérni. :oops:
Ok, a végén átszínezzük :D
Jöhetnek a palettaötletek
Most így néz ki:
-
Ok, a végén átszínezzük :D
Jöhetnek a palettaötletek
Most így néz ki:
Narancssárgának 11H vagy 51H?
A sárga tökéletes! Azon csak rontani lehetne.
-
Narancssárgának 11H vagy 51H?
A sárga tökéletes! Azon csak rontani lehetne.
Kell még alakítani rajta, vagy a pirosat lecserélni, vagy a barnát világosítani.
-
Kell még alakítani rajta, vagy a pirosat lecserélni, vagy a barnát világosítani.
Igen, ahol barnával van írva pirosra ott jobb lenne valami kontrasztosabb összeállítás.
-
Igen, ahol barnával van írva pirosra ott jobb lenne valami kontrasztosabb összeállítás.
Világosabb piros kellene a 11H mellé.
-
megnéztem a 0d1h-s barnával is, ez tűnik a legjobbnak, a pirosat leszámítva.
-
megnéztem a 0d1h-s barnával is, ez tűnik a legjobbnak, a pirosat leszámítva.
Ez tényleg jobb. Ehhez valami sötétebb vörös kellene.
-
Azt nem lehetne megcsinálni, hogy a krapek kalapja ne barna, hanem piros legyen? Még azt hiszik, a kalap is fa alapanyagból készült. :D
-
Azt nem lehetne megcsinálni, hogy a krapek kalapja ne barna, hanem piros legyen?
Én személy szerint barna férfikalapot eddig többet láttam, mint pirosat...
A korabeli Vadnyugaton még kevesebb piros kalap lehetett.
Meg ehhez az összes sprite összes fázisát módosítani kellene, ha jól sejtem.
-
Igen, az összes főhős sprite-ot át kéne variálni, és ha jól emléxem, akkor van még kalapos sprite-unk.
Még négy variáció:
-
A piros01h.bmp kifogástalan!
-
A piros01h.bmp kifogástalan!
Nekem teccik az utsó szürke is, lehet beteszem majd választható verzióként a piros mellé.
-
Közben találtam egy bosszantó apróságot, ami kimaradt, miel át lett írva a 300Hz-es időzítés 50Hz-esre, ezért a következő késleltetési rész EP-n túl hosszúra nyúlt:
0a2b 0e0a ld c,0ah ;várakozás
0a2d 76 halt
0a2e 10fd djnz 0a2dh
0a30 0d dec c
0a31 20fa jr nz,0a2dh
A következő kis módosítás után tökéletes:
dw 4000h+0a2bh,0a33h-0a2bh
phase 0a2bh
ad0a2b ld c,02h ;várakozás
ad0a2d halt
ad0a2e djnz ad0a2d
ad0a30 dec c
ad0a31 jr nz,ad0a2d
defs 0a33h-$
dephase
-
Nekem teccik az utsó szürke is, lehet beteszem majd választható verzióként a piros mellé.
Igen, a szürkék között az a legjobb.
-
A piros01h.bmp kifogástalan!
Én is erre szavazok, ez messze viszi a pálmát a többi képhez képest.
-
Ezzel a szürkével nagyon kezd hasonlitani a Vendettára. Meg kéne próbálkozni a színesítéssel.
Nekem a 11H barna tetszett, mert ugye ez vadnyugat és minden fából készült.
Olyat nem lehetne, hogy a játék közben a stop megnyomásával előjönne 256 színű a paletta menü, és kiválaszthatnám melyik tetszik?
-
Nekem teccik az utsó szürke is, lehet beteszem majd választható verzióként a piros mellé.
Éppen ezt akartam javasolni :-)
-
Ezzel a szürkével nagyon kezd hasonlitani a Vendettára. Meg kéne próbálkozni a színesítéssel.
Nekem a 11H barna tetszett, mert ugye ez vadnyugat és minden fából készült.
Olyat nem lehetne, hogy a játék közben a stop megnyomásával előjönne 256 színű a paletta menü, és kiválaszthatnám melyik tetszik?
Nem tudom, majd elválik ,hogy mennyi szabad hely marad a végén, de hasonlóra gondoltam én is, csak az nagyon macerás, 4 funkcióbillentyűvel lehetne fel-le váltogatni a paletta 4 színét. Ha marad elég hely, akkor megoldjuk azt is.
-
Éppen ezt akartam javasolni :-)
Meg is jöttünk :), az jutott még eszembe, hogyha valakinek új paletta kombó jut eszébe, nyugodtan tesztelheti a START.SRC-ben a GAMECOL átírásával, pár palettát be lehet még tenni választhatók közé :D, azon felül, ha sikerül még betolni a palettáról való választást, az a fő extra lenne.
-
Ezt a hülyeséget, hogy : "Olyat nem lehetne, hogy a játék közben a stop megnyomásával előjönne 256 színű a paletta menü, és kiválaszthatnám melyik tetszik?"
Nem is gondoltam komolyan. Most egy C-Assembly szovegkiíró kóddal szenvedek, és átérzem a helyzetet, hogy nehéz már egy kész (pláne Asm) kódba extrákat tenni.
-
Ezt a hülyeséget, hogy : "Olyat nem lehetne, hogy a játék közben a stop megnyomásával előjönne 256 színű a paletta menü, és kiválaszthatnám melyik tetszik?"
Nem is gondoltam komolyan. Most egy C-Assembly szovegkiíró kóddal szenvedek, és átérzem a helyzetet, hogy nehéz már egy kész (pláne Asm) kódba extrákat tenni.
De ha megoldható, akkor benne lesz :D Majd elválik, még úgysincs ilyen program :D
-
De ha megoldható, akkor benne lesz :D Majd elválik, még úgysincs ilyen program :D
Érdekes ötlet, kétségtelen. Lehetne pár funkcióbillentyűn előre definiált színséma (az eredeti CPC-set is be lehet akkor rakni), F8-ra meg a színválasztást valahogy megoldani?
Nagy köszönet ezért az elszántsgágért!
-
Gunfright volt már itt, vagy csak screenshot?
Nehogy lemaradjak valamiről...
-
Gunfright volt már itt, vagy csak screenshot?
Nehogy lemaradjak valamiről...
Még nem :D, arra gondoltam, hogy majd a teljesen átalakított verzió kerül ide, addig meg aki akarja, reprodukálhatja azt a verziót :)
-
elindul, csak sokat kell várni, az eredetiben itt szöveg van, amit Basicből irat ki, ezt is meg akarom változtatni majd. Joy2 tűzgombjára megy tovább.
Kipróbáltam, teljesen ugyanolyan, mint a CPC változat. Bár a hangeffekteket nem értem, mit jeleznek.
Más. Azt nem lehetne megcsinálni, hogy a belső joystick is működhessen külsőként? Nehéz rászokni a numerikus billentyűzetre, sok CPC-s játék meg csak arról megy.
-
Más. Azt nem lehetne megcsinálni, hogy a belső joystick is működhessen külsőként? Nehéz rászokni a numerikus billentyűzetre, sok CPC-s játék meg csak arról megy.
Különösen laptopon, ahol nincs numerikus billentyűzet...
-
Különösen laptopon, ahol nincs numerikus billentyűzet...
Igen, én is a del,ins,pg down,home, insertre szoktam beállítani :lol:
megnézem, de lehet, akkor meg összeakadás lesz a kurzormozgatásban az emulátorban, vagy legyen egy ROM csak a konvertált játékoknak, ahol a külső joy2 mellett a belsőt is figyeli?
A hangok terén észleletem némi eltérést, ezért is gondoltam ,hogy újítani kéne a hang részt.
Az a terv még a hang lecserélése mellett, meg a Lacika által említett nyílprobléma mellett, hogy a kis leírást az elején beteszem még, de azt csak egy betöltött képként, CPC-n Basicből írja ki ,csak idő hiányában lassan mennek a dolgok :oops::
-
megnézem, de lehet, akkor meg összeakadás lesz a kurzormozgatásban az emulátorban
Azt meg lehetne oldani, hogy mondjuk valamelyik Funkció billentyűre felcserélje a külső-belsőt az emulátorban?
vagy legyen egy ROM csak a konvertált játékoknak, ahol a külső joy2 mellett a belsőt is figyeli?
Igen a játékoknak lehetne ilyen ROM.
-
Azt meg lehetne oldani, hogy mondjuk valamelyik Funkció billentyűre felcserélje a külső-belsőt az emulátorban?Igen a játékoknak lehetne ilyen ROM.
Azzal meg az a baj, hogy a CPC-n is vannak funkció billentyűk, így marad a külön ROM :D
-
És még "kívánságlista" a CPC emulátorhoz:
Basic-ben a törlés lehetne az erase billentyűvel?
Esetleg a bal shift is működhetne shiftként? Bár most hangjelzést ad, az is aranyos. :D Csak a játékok betöltésénél jön elő ez a hiány a RUN" parancsnál.
-
És még "kívánságlista" a CPC emulátorhoz:
Basic-ben a törlés lehetne az erase billentyűvel?
Esetleg a bal shift is működhetne shiftként? Bár most hangjelzést ad, az is aranyos. :D Csak a játékok betöltésénél jön elő ez a hiány a RUN" parancsnál.
Ahogy néztem, erase-ként műxik, EP Basicben is a backspac-szel töröltem, és CPCemuban is.
A SHIFT-et majd megnézem, lehet azért hagytam ki, mert duplán kell ellenőrizni.
-
Zene cserélve a ROM-ban, ha ROM ext joy2 lekérés van, akkor int joy + enter betéve, CTRL, és bal SHIFT havítva, először érkezik a Traffic, ha ott nincs változtatnivaló, akkor a CPCemu is.
-
Én passzolok :D
-
Itt a forrás a ROM rutinokat használó CPC programok átírására CPCemu segítségével:
A következő lépéseket hajtja végre:
-Key rate, bias, keret (zöld) beállítása
-Memória ellenőrzés (128k), soft reset beállítása
-2 videólap lefoglalása, egyik LPT-nek, másik Videó memóriának, videó memória törlése
-2 LPT felépítése (CPC 50Hz-enként vált két paletta között, ezek a legtöbb esetben megegyeznek), CPC videó címek eltárolása az LPB-kben, és LPT Nick címének kiszámítása, új LPT aktiválása
-4 memóriaszegmens lefoglalása (OS ROM, RAM0, RAM1, RAM2)
-OS ROM betöltése a ROM-nak lefoglalt memória szegmensbe (4000h-val eltolva)
-számunkra fontos EXOS terület elmentése az OS ROM területre (0030h-005fh-->2b40h-2b6fh), lefoglalt memóriaszegmensek, és egyéb fontos értékek eltárolása az OS ROM megfelelő területein, OS ROM rutinok törlése: Casette init hívás, képernyő inicializálás, és gyártó kiírását kiíró hívás törlése, képernyő törlés kiiktatása, paletta inicializálás kiktatása
-Traffic.prg betöltése 4000h-val eltolva, majd a szöveget tartalmazó kép betöltése
-dave regiszterek 0-ázása,státsusz sor kikapcsolása,6 megszakítási hely elhelyezése az LPT-kben (300Hz-es megszakítás generálás)
-OS ROM inicializáló rész átmásolása egy OS ROM init által érintetlen helyre, majd ugrás oda, szükséges regiszter értékek megadása, ROM init indítása, OS ROM képernyőtörlésének, és palettaírásának visszaállítása, keret beállítás, BC' regiszter beállítás (ezt használja a CPC lapozásra, és videómód beállításra)
-ugrás a játék kezdetére
Program átírásához a következőket kell módosítani:
border equ 02h ;keret beállítása
bias equ 1bh*8 ;bias beállítása
start_prg equ 7a00h ;program kezdési címe
loader_screen equ 0 ;0 ha nincs betöltőkép, 1 ha van
;loader_screen_name equ screen ;betöltőkép neve, a forrás végén módosítandó
loader_screen_address equ 0c000h ;betöltőkép töltési címe
loader_screen_length equ 4000h ;betöltőkép hossza
;prg_file_name equ prg ;program neve, a forrás végén módosítandó
prg_file_address equ 0a00h ;program töltési címe
prg_file_length equ 7d00h ;program hossza
loadend_screen equ 1 ;0 ha nincs vége kép, 1 ha van
;loadend_screen_name equ scrend ;program indítása előtti kép neve
loadend_screen_address equ 0c000h ;betöltési címe
loadend_screen_length equ 4000h ;fájl hossza
-
Az OS ROM init előtti videó mód beállítása a vlpb címke 2 bájtján történik, a paletta pedig a 9. bájttól kezdődően. Keret beállítását a következő sorok végzik:
ld a,02h ;green
out (81h),a
ld (0b7d4h),a ;border
ld (0b7e5h),a ;border'
-
Az ALIEN ATTACK OS664.ROM-ja miért más? Azt látom, hogy az az új ROM-mal nem működik.
-
Az ALIEN ATTACK OS664.ROM-ja miért más? Azt látom, hogy az az új ROM-mal nem működik.
Egy-két dolog más helyre került az új verzióban, ráadásul, az Alien Attack két képernyőmódot használ és ez a CPCemu két LPT-jével lett megoldva, meg lehet kellett más módosításokat is eszközölni benne, már nem emléxem, de arra igen, hogy használt port hívásokat is.
-
módosítottam a programátírás ROM használatával hozzászólásomat, meg a CPCload.src forrást, és az OS664.ROM-ot is lecseréltem