Welcome, Guest. Please login or register.


Author Topic: CPC programok átírása (Read 40295 times)

Offline geco

  • EP addict
  • *
  • Posts: 7082
  • Country: hu
    • Támogató Támogató
CPC programok átírása
« 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.

Offline geco

  • EP addict
  • *
  • Posts: 7082
  • Country: hu
    • Támogató Támogató
Re: CPC programok átírása
« Reply #1 on: 2012.December.03. 16:33:28 »
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)

Offline Zozosoft

  • Global Moderator
  • EP addict
  • *
  • Posts: 14722
  • Country: hu
    • http://enterprise.iko.hu/
Re: CPC programok átírása
« Reply #2 on: 2012.December.03. 20:28:44 »
A disket honnan töltsük le? (Csak, azért hogy mindenki ugyan azzal a verzióval próbálkozzon :-) )

Offline geco

  • EP addict
  • *
  • Posts: 7082
  • Country: hu
    • Támogató Támogató
Re: CPC programok átírása
« Reply #3 on: 2012.December.03. 20:32:18 »
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 :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:

[ Guests cannot view attachments ]

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:

Code: [Select]
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: [ Guests cannot view attachments ]
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.

Code: [Select]
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)

[ Guests cannot view attachments ]

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.
« Last Edit: 2012.December.03. 20:55:09 by geco »

Offline geco

  • EP addict
  • *
  • Posts: 7082
  • Country: hu
    • Támogató Támogató
Re: CPC programok átírása
« Reply #4 on: 2012.December.03. 20:39:41 »
Quote from: Zozosoft
A disket honnan töltsük le? (Csak, azért hogy mindenki ugyan azzal a verzióval próbálkozzon :-) )
Mondjuk akkor innen: :D
[ Guests cannot view attachments ]

De ha jól emléxem, akkor a CPCGameReviews-ról töltöttem le.

Offline geco

  • EP addict
  • *
  • Posts: 7082
  • Country: hu
    • Támogató Támogató
Re: CPC programok átírása
« Reply #5 on: 2012.December.03. 20:52:19 »
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 )
Code: [Select]
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):
[ Guests cannot view attachments ]

cpccolor -pixelmapfmt 1 -pixelmap pix 20 00 11 6 10 14 18 02 05 22 21 23 30 28 30 12

Code: [Select]
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:

Code: [Select]
       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:

Code: [Select]
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.

Offline geco

  • EP addict
  • *
  • Posts: 7082
  • Country: hu
    • Támogató Támogató
Re: CPC programok átírása
« Reply #6 on: 2012.December.04. 10:19:22 »
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 : [ Guests cannot view attachments ]
« Last Edit: 2012.December.04. 10:25:59 by geco »

Offline geco

  • EP addict
  • *
  • Posts: 7082
  • Country: hu
    • Támogató Támogató
Re: CPC programok átírása
« Reply #7 on: 2012.December.04. 10:39:10 »
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.
Code: [Select]
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.

Code: [Select]
       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
« Last Edit: 2012.December.04. 11:01:15 by geco »

Offline geco

  • EP addict
  • *
  • Posts: 7082
  • Country: hu
    • Támogató Támogató
Re: CPC programok átírása
« Reply #8 on: 2012.December.04. 11:01:39 »
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.

Code: [Select]
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.

Code: [Select]
        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:

Code: [Select]
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 

Code: [Select]
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.

Code: [Select]
        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

Code: [Select]
        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

Offline geco

  • EP addict
  • *
  • Posts: 7082
  • Country: hu
    • Támogató Támogató
Re: CPC programok átírása
« Reply #9 on: 2012.December.04. 11:14:48 »
É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:

Code: [Select]
        dw      4000h+82a6h,3
ad82a6  ld      (ad8c95),a            ;ay 6-es regiszter érték eltárolása
Code: [Select]
        dw      4000h+82dch,3
ad82dc  ld      (ad8c94),a            ;ay 7-es regiszter érték eltárolása

Code: [Select]
        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:

Code: [Select]
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.

Code: [Select]
        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.

Offline geco

  • EP addict
  • *
  • Posts: 7082
  • Country: hu
    • Támogató Támogató
Re: CPC programok átírása
« Reply #10 on: 2012.December.04. 11:17:53 »
Aki szeretné maga kitöltögetni az átalakító forrást, és szórakozgatni, átalakítani, annak a [ Guests cannot view attachments ] -t ajánlom, aki a kitöltött verziót szeretné, annak pedig ezt: [ Guests cannot view attachments ]

Offline geco

  • EP addict
  • *
  • Posts: 7082
  • Country: hu
    • Támogató Támogató
Re: CPC programok átírása
« Reply #11 on: 2012.December.04. 14:24:21 »
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.

Offline Zozosoft

  • Global Moderator
  • EP addict
  • *
  • Posts: 14722
  • Country: hu
    • http://enterprise.iko.hu/
Re: CPC programok átírása
« Reply #12 on: 2012.December.04. 14:28:53 »
Quote from: geco
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!

Offline Lacika

  • EP addict
  • *
  • Posts: 3191
  • Country: hu
    • http://www.ep128.hu
Re: CPC programok átírása
« Reply #13 on: 2012.December.04. 14:36:08 »
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!

Offline Lacika

  • EP addict
  • *
  • Posts: 3191
  • Country: hu
    • http://www.ep128.hu
Re: CPC programok átírása
« Reply #14 on: 2012.December.04. 14:45:06 »
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?