Welcome, Guest. Please login or register.


Author Topic: CPC (Read 455410 times)

Offline Lacika

  • EP addict
  • *
  • Posts: 3189
  • Country: hu
    • http://www.ep128.hu
Re: CPC
« Reply #345 on: 2010.July.01. 22:36:03 »
Ahogy így elnézem, nekünk vannak a legszebb és leggyorsabb 8 bites Incentive játékaink  :)
A Spectrum verzió ronda,
C64-en értékelhetetlenül lassú, és ronda
CPC-n meg nem ilyen gyors  :twisted:

Offline Zozosoft

  • Global Moderator
  • EP addict
  • *
  • Posts: 14709
  • Country: hu
    • http://enterprise.iko.hu/
Re: CPC
« Reply #346 on: 2010.July.01. 22:39:52 »
Ahogy így elnézem, nekünk vannak a legszebb és leggyorsabb 8 bites Incentive játékaink  :)
A Spectrum verzió ronda,
C64-en értékelhetetlenül lassú, és ronda
CPC-n meg nem ilyen gyors  :twisted:
Így van! Istvánnak hatalmas  :smt038 :smt038 :smt038 :smt038 :smt038

Offline IstvanV

  • EP addict
  • *
  • Posts: 4822
Re: CPC
« Reply #347 on: 2010.July.02. 01:10:46 »
Kis változtatás: a célzás mód átkapcsolásánál róvidítettem a várakozást (ami már nem kell, mert egyébként is megvárja a SPACE elengedését):
  [ Guests cannot view attachments ]
  [ Guests cannot view attachments ]

Offline IstvanV

  • EP addict
  • *
  • Posts: 4822
Re: CPC
« Reply #348 on: 2010.July.02. 01:31:16 »
Anno egyszer régen elkezdtünk egy ilyet...
Jó lenne, ha a tapasztaltabbak kibõvítenék, mert én csak egy félkész átiratig jutottam el  :oops:

Valamelyik kőnnyen átírható játékról (pl. Cybernoid) lehetne részletes leírást készíteni; CPC-ről nem ritkán egyszerűbb is lehet átírni, mint Spectrumról, az attribútumok hiánya miatt.
Talán hasznát lehetne venni az én átirataimban használt betöltőknek; igaz, ezeknél gyorsabb és kisebb memóriaigényú átiratokat is lehetne készíteni, viszont a használatukkal meglehetősen könnyen és gyorsan lehet átírni sok CPC-s játékot.
A hardverről is le lehetne írni a fontosabb információkat (gyakran használt I/O portok, billentyűzet, színek, stb.).

Offline geco

  • EP addict
  • *
  • Posts: 7069
  • Country: hu
    • Támogató Támogató
Re: CPC
« Reply #349 on: 2010.July.02. 08:52:37 »
Valamelyik kőnnyen átírható játékról (pl. Cybernoid) lehetne részletes leírást készíteni; CPC-ről nem ritkán egyszerűbb is lehet átírni, mint Spectrumról, az attribútumok hiánya miatt.
Pláne ha a konvertálandó színek egy blokkban is vannak :D Az Exolon ilyen volt, csak pár pixelt kellett a kódban megtalálni, gondolom a Cybernoid is.
Talán hasznát lehetne venni az én átirataimban használt betöltőknek; igaz, ezeknél gyorsabb és kisebb memóriaigényú átiratokat is lehetne készíteni, viszont a használatukkal meglehetősen könnyen és gyorsan lehet átírni sok CPC-s játékot.
Tuti, nem néztem ugyan meg, de úgy sejtem, hogy billentyűzetre, és hangra is egy általános rutint írtál, így a programba majdnem csak egy CALL-t kell betenni, meg elé, és mögé egy lapozást, ami belapozza a rutinokat tartalmazó lapot. A kisebb memóriaigényű átiratok csak abban az esetben számítanak szerintem, ha az belefér 64Kb-ba, ahhoz meg már elég sokat kell mókolni, és sok esetben jó, ha a disassemblált kódból egy bárhová fordítható forráskódot gyárt az ember, ami nem kevés szívással jár, legalábbis nálam :D, több nap csak azzal telik el, hogy meglegyen a forrás, és utána meg a hibakeresés (az NS-t is ezért pihentetem még, ott 128Kb-ba kéne beleférnie)
A hardverről is le lehetne írni a fontosabb információkat (gyakran használt I/O portok, billentyűzet, színek, stb.).
Kigyűjtöttem egy documentumba a portok leírását, elkezdem adagolni.

Offline geco

  • EP addict
  • *
  • Posts: 7069
  • Country: hu
    • Támogató Támogató
Re: CPC
« Reply #350 on: 2010.July.02. 09:12:36 »
CPC-n a következő portkiosztás:

Hardware device   official port address   Port bits
                                              b15 b14 b13 b12 b11 b10 b9 b8
Gate Array            &7F               0    1    1    1    1    1    1    1
RAM Management   &7F               0    1    1    1    1    1    1    1
CRTC                   &BC-&BF         1    0    1    1    1    1    r     r
ROM select           &DF                1    1    0    1    1    1    1    1
Printer port           &EF                1    1    1    0    1    1    1    1
PPI                      &F4-&F7          1    1    1    1    0    1    r     r
Expansion Peripherals   &F8-&FB     1    1    1    1    1    0    x    x

Gate Array: paletta színek, keret, képernyő üzemmód beállítása, ROM konfiguráció, megszakításvezérlés, és RAM management a feladatai
CRTC: képernyő beállításáért felelős, sokkal kevésbé rugalmas, mint EP Nick-je, igaz pár extra funkciót tartalmaz
ROM Select: itt lehet megadni, hogy melyik ROM-ot szeretnénk használni, alapból C000-FFFFh tartományban a BASIC, és 0000-3FFFh tartományban a CPC OS ROM-ja helyezkedik el, ennek a portnak a segítségével lehet pl az AMSDOS ROM-ot belapozni a BASIC helyére.
Printer port: számunkra nem fontos játékok átírásához :D
PPI: számomra ennek a működése még mindig rejtély, a lényeg, hogy ezen keresztül megy a billentyűzetkezelés, és a hanggenerálás is, és az 50Hz-es videómegszakítás ellenőrzése is, meg még pár számunkra lényegtelen funkció.
Expansion Peripherals: Floppy Disc controller, és soros port
« Last Edit: 2010.July.02. 09:32:18 by geco »

Offline geco

  • EP addict
  • *
  • Posts: 7069
  • Country: hu
    • Támogató Támogató
Re: CPC
« Reply #351 on: 2010.July.02. 09:40:20 »
Gate Array

A Gate Arrayt a 7Fh porton keresztül vezéreljük, méghozzá úgy, hogy 7fxxh-t küldünk ki a portra, ahol xx felső két bitje határozza meg a Gate array funkciót, erre majd írok példát, mert először furcsa volt az EP-portcímzés után :)
A következő táblában a Gate Array funkciói találhatók:

Bit 7   Bit 6   Function
0       0       Select pen (a paletta egyik elemének, vagy a keretnek a kiválasztása, értéke 0-15 lehet)
0       1       Select colour for selected pen (a kiválasztott paletta elemhez szín hozzárendelése)
1       0       Select screen mode, ROM configuration and interrupt control (képernyő mód, ROM konfiguráció kiválasztása, és megszakításvezérlés )
1       1       Ram Memory Management (note 1)


Select Pen
Itt adhatjuk meg, hogy a paletta egyik színét szeretnénk beállítani, vagy a keretét.
  keret kiválasztása

Bit     Value   Function
7       0       Gate Array function "Pen Selection"
6       0       
5       x       not used
4       1       Select border
3       x       ignored
2       x       ignored
1       x       ignored
0       x       ignored


  paletta egyik elemének kiválasztása

Bit     Value   Function
7       0       Gate Array function "Pen Selection"
6       0       
5       x       not used
4       0       Select pen
3       x       Pen Number
2       x       
1       x       
0       x       


Select Colour
Itt adhatjuk meg, hogy melyik színt szeretnénk a paletta valamelyik eleméhez rendelni, vagy épp a kerethez.

Bit     Value   Function
7       0       Gate Array function "Colour Selection"
6       1       
5       x       not used
4       x       Colour number
3       x       
2       x       
1       x       
0       x       


CPC színek a következő táblázatban láthatók az EP-s megfelelőjükkel kiegészítve ,szerencsére CPC-n az egyszerűség kedvéért megkülönböztetnek hardver színkiosztást, és firmware színkiosztást, a portra mindig a hardver színkiosztás szerinti értékeket kell írni, kiegészítve a 6. bittel, a firmware értékeket a CPC ROM használja.

Firmware Colour  Colour Name    Hardware Colour Quick reference  EP colour
                                                hardware colour
                                                select value             
0              Black            20              54h              00h
1              Blue             4               44h              20h
2              Bright Blue      21              55h              24h
3              Red              28              5Ch              48h
4              Magenta          24              58h              68h
5              Mauve            29              5Dh              6Ch
6              Bright Red       12              4Ch              49h
7              Purple           5               45h              29h
8              Bright Magenta   13              4Dh              6Dh
9              Green            22              56h              90h
10             Cyan             6               46h              0B0h
11             Sky Blue         23              57h              0B4h
12             Yellow           30              5Eh              0D8h
13             White            0               40h              0F8h
14             Pastel Blue      31              5Fh              0FCh
15             Orange           14              4Eh              0D9h
16             Pink             7               47h              0B9h
17             Pastel Magenta   15              4Fh              0FDh
18             Bright Green     18              52h              92h
19             Sea Green        2               42h              32h
20             Bright Cyan      19              53h              0B6h
21             Lime             26              5Ah              0DAh
22             Pastel Green     25              59h              0FAh
23             Pastel Cyan      27              5Bh              0FEh
24             Bright Yellow    10              4Ah              0DBh
25             Pastel Yellow    3               43h              0FBh
26             Bright White     11              4Bh              0FFh

CPC-n pár szín ismétlődik:
hardver szín szerint, 1 White, 8 Purple, 9 Pastel Yellow, 16 Blue, 17 Sea Green

Most kitérnék a port címzésre egy-egy példán bemutatva, a port címét mindig a B regiszter tartalmazza, a kiírandó értéket pedig egy másik regiszter, attól függően, hogy melyik portíró utasítást használják, a legelterjedtebb az OUT (C),C , de bármely OUT (C),x előfordulhat, sőt ha jól emlékszem láttam példát OUT (x),a-ra is.
Most a példák az OUT (C),A -ra következnek:
Keret: 
Code: ZiLOG Z80 Assembler
  1. ld b,7fh
  2. ld a,10h
  3. out (c),a                   ;keret kiválasztása
  4. ld a,44h
  5. out (c),a                   ;kék szín kiválasztása (és ennyi utasítás kellett, hogy a keretet kékre állítsuk.
  6.  
a paletta 4. színének beállítása:
Code: ZiLOG Z80 Assembler
  1. ld b,7fh
  2. ld a,04h
  3. out (c),a                   ;4. elem kiválasztása
  4. ld a,45h
  5. out (c),a                   ;lila szín kiválasztása
  6.  

Select Screen Mode
A 0. és 1. bitek határozzák meg, a képernyő módját, összesen 4 mód közül választhatunk, a negyedik nem is hivatalos. :D

Bit 1          Bit 0          Screen mode
0              0              Mode 0, 160x200 resolution, 16 colours
0              1              Mode 1, 320x200 resolution, 4 colours
1              0              Mode 2, 640x200 resolution, 2 colours
1              1              Mode 3, 160x200 resolution, 4 colours


Rom Configuratiom selection
A 2. határozza meg, hogy az alsó (0000-3fffh terület) ROM engedélyezett/tiltott, a 3. bit pedig a felső (c000-ffffh) ROM engedélyezését/tiltását végzi. Engedélyezett ROM esetén az aktuális területen ROM található, na itt jön egy kis furfang, ha olvasunk a területről akkor a ROM-ból olvas, viszont ha írunk, akkor a területnek megfelelő RAM-ba kerül az adat, nem vész el, tiltás esetén pedig RAM.
A 4. bit segítségével késleltethetjük a megszakítást, 1-esre állítva a Gate Array számlálója nullázódik, ez a számláló felelős a megszakításgenerálásért, nullától 52-ig számol el, utána nullázza, és kezdődik minden elölről, ha a számláló 32 alatt van, akkor megszakításgenerálás elnyomva, ha felette, akkor generál megszakítást a Gate Array.

Bit     Value   Function
7       1       Gate Array function
6       0       
5       x       not used
4       x       Interrupt generation control
3       1       Upper rom area disable
        0       Upper rom area enable
2       1       Lower rom area disable
        0       Lower rom area enable
1       x       Mode selection
0       x       


példa: 4 szín üzemmód kiválasztása, felső és alsó ROM tiltva
Code: ZiLOG Z80 Assembler
  1. ld b,7fh
  2. ld a,8dh                    ;10001101
  3. out (c),a
  4.  
ugyanez a BC regisztert használva:
Code: ZiLOG Z80 Assembler
  1. ld bc,7f8dh         ;10001101
  2. out (c),c
  3.  

RAM Configurations
CPC RAM konfigurációja közel sem olyan rugalmas, mint az EP-é, 64Kb-s blokkok közül választhatunk csak, abból is csek elég limitált számban, összesen 8 RAM kiosztás létezik CPC6128-on, az alsó 3 bit állításával választhatunk közülük.

RAM Expansion     Bits
                   7       6       5       4       3       2       1       0
CPC6128 (note 1)   1       1       -       -       -       s2      s1      s0

a következő táblázatban látható, hogy milyen érték milyen RAM kiosztást takar, a *-gal megjelölt lapok a felső 64Kb-ból vett 16Kb-os blokkok.

CPC6128: 0  1  2  3  0* 1* 2* 3*
         16 16 16 16 16 16 16 16 kb
            64kb        64kb

Configuration "0":
Z80 Memory Range  Sub-block
&0000-&3fff       0
&4000-&7fff       1
&8000-&bfff       2
&c000-&ffff       3
Configuration "1":
Z80 Memory Range  Sub-block
&0000-&3fff       0
&4000-&7fff       1
&8000-&bfff       2
&c000-&ffff       3*
Configuration "2":
Z80 Memory Range  Sub-block
&0000-&3fff       0*
&4000-&7fff       1*
&8000-&bfff       2*
&c000-&ffff       3*
Configuration "3":
Z80 Memory Range  Sub-block
&0000-&3fff       0
&4000-&7fff       3
&8000-&bfff       2
&c000-&ffff       3*
Configuration "4":
Z80 Memory Range  Sub-block
&0000-&3fff       0
&4000-&7fff       0*
&8000-&bfff       2
&c000-&ffff       3
Configuration "5":
Z80 Memory Range  Sub-block
&0000-&3fff       0
&4000-&7fff       1*
&8000-&bfff       2
&c000-&ffff       3
Configuration "6"
Z80 Memory Range  Sub-block
&0000-&3fff       0
&4000-&7fff       2*
&8000-&bfff       2
&c000-&ffff       3
Configuration "7":
Z80 Memory Range  Sub-block
&0000-&3fff       0
&4000-&7fff       3*
&8000-&bfff       2
&c000-&ffff       3
« Last Edit: 2010.July.02. 11:41:57 by geco »

Offline IstvanV

  • EP addict
  • *
  • Posts: 4822
Re: CPC
« Reply #352 on: 2010.July.02. 12:32:32 »
PPI: számomra ennek a működése még mindig rejtély, a lényeg, hogy ezen keresztül megy a billentyűzetkezelés, és a hanggenerálás is, és az 50Hz-es videómegszakítás ellenőrzése is, meg még pár számunkra lényegtelen funkció.

Rövid PPI leírás (az ep128emu forráskódja alapján, az I/O portok emulációja ebben a file-ban található):

A regiszterek:
  - F4xxh: A port adatregiszter (írható és olvasható)
  - F5xxh: B port adatregiszter (írható és olvasható)
  - F6xxh: C port adatregiszter (írható és olvasható)
  - F7xxh: vezérlőregiszter; bár ez elvileg viszonylag bonyolult és sokat tud, de a CPC programok szinte kizárólag 2 lehetséges értéket írnak bele: vagy 82h-t, és akkor az A port kimenet lesz, vagy pedig 92h-t ami az A portot bemenet módba állítja. A B port mindkét esetben bemenet, a C port pedig kimenet (itt külön be lehetne egyébként állítani a módot az alsó és felső 4 bitre, de ezt a CPC programok nem használják). A vezérlőregiszter írása törli (0-ra állítja) az összes port kimeneti értékét (kivéve a C port kimenetének bitenkénti állítását, amikor a felső bit 0., de ezt általában nem használják).

Az egyes portok hardver funkciói:

A port:
  - ez az AY chippel van összekötve, itt lehet a regisztereket kiválasztani, írni, és olvasni

B port:
  - itt két fontos bit van:
    - 7. bit: magnó olvasás
    - 0. bit: VSync állapot; ha 1, akkor a CRTC VSync kimenete aktív. Ez normál esetben a képernyő kezdetétől (0. sor, általában C000h) számított 240. sor elején kapcsol be, és az időtartama 8 sor. A 300 Hz-es megszakítások a 242. sornál, illetve attól számítva minden 52. sorban történnek.
  - a többi bitből állapítható meg például a gép típusa, a bővítő eszközök jelenléte, stb., de ennek általában kevés jelentősége van

C port:
  - 7. és 6. bit: AY regiszter mód választása:
    - C0h: regiszter választás: kiválasztja az A porton megadott AY regisztert (előtte a vezérlőregisztert 82h-ra kell állítani)
    - 80h: regiszter írás: az A port kimenete az AY kiválasztott regiszterébe íródik (előtte a vezérlőregisztert 82h-ra kell állítani)
    - 40h: regiszter olvasás: az A porton beolvassa a kiválasztott AY regisztert (előtte a vezérlőregisztert 92h-ra kell állítani)
    - 00h: nincs funkció; ezt a helyes működéshez mindegyik fenti művelet után ki kell írni, azaz:
        - regiszter írás:
            - vezérlőregiszterbe 82h (ha már nem volt eddig is az)
            - A portra kiírni a regiszter számát
            - C port felső két bitje C0h
            - C port felső két bitje 00h
            - A portra kiírni a regiszter új értékét
            - C port felső két bitje 80h
            - C port felső két bitje 00h
        - regiszter olvasás:
            - vezérlőregiszterbe 82h (ha már nem volt eddig is az)
            - A portra kiírni a regiszter számát
            - C port felső két bitje C0h
            - C port felső két bitje 00h
            - vezérlőregiszterbe 92h
            - C port felső két bitje 40h
            - A portról beolvasni az AY regiszter értékét
            - C port felső két bitje 00h
            - vezérlőregiszterbe 82h
    - 5. bit: magnó kimenet
    - 4. bit: magnó motor bekapcsolása (1 = igen)
    - 0.-3. bit: billentyűzetmátrix sor kiválasztás (csak a 0.-9. sor használt)

A billentyűzetmátrix állapota az AY 14. regiszterén keresztül olvasható (a billentyűzetet olvasó rutinok gyakran könnyen felismerhetők az "LD BC, 0F40EH" utasításról :)), a bitek 0 értéke jelzi az adott billentyű lenyomását (ha egy billentyű sincs lenyomva, akkor az olvasott érték FFh).

Ez a táblázat konvertálja az emulátorban az EP billentyűket CPC-re:

Code: C++
  1. static const uint8_t keyboardConvTable[256] = {
  2.   // N BSLASH B C V X Z LSHIFT
  3.   99, 46, 99, 22, 99, 54, 99, 62, 99, 55, 99, 63, 99, 71, 99, 21,
  4.   // H LOCK G D F S A CTRL
  5.   99, 44, 99, 70, 99, 52, 99, 61, 99, 53, 99, 60, 99, 69, 99, 23,
  6.   // U Q Y R T E W TAB
  7.   99, 42, 99, 67, 99, 43, 99, 50, 99, 51, 99, 58, 99, 59, 99, 68,
  8.   // 7 1 6 4 5 3 2 ESC
  9.   99, 41, 99, 64, 99, 48, 99, 56, 99, 49, 99, 57, 99, 65, 99, 66,
  10.   // F4 F8 F3 F6 F5 F7 F2 F1
  11.   99, 20, 99, 11, 99, 5, 99, 4, 99, 12, 99, 10, 99, 14, 99, 13,
  12.   // 8 9 - 0 ^ ERASE
  13.   99, 40, 99, 99, 99, 33, 99, 25, 99, 32, 99, 24, 99, 79, 99, 99,
  14.   // J K ; L : ]
  15.   99, 45, 99, 99, 99, 37, 99, 28, 99, 36, 99, 29, 99, 19, 99, 99,
  16.   // STOP DOWN RIGHT UP HOLD LEFT ENTER ALT
  17.   99, 3, 99, 2, 99, 1, 99, 0, 99, 15, 99, 8, 99, 18, 99, 7,
  18.   // M DELETE , / . RSHIFT SPACE INSERT
  19.   99, 38, 99, 16, 99, 39, 99, 30, 99, 31, 99, 6, 99, 47, 99, 9,
  20.   // I O @ P [
  21.   99, 35, 99, 99, 99, 34, 99, 26, 99, 27, 99, 17, 99, 99, 99, 99,
  22.   99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99,
  23.   99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99,
  24.   99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99,
  25.   99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99,
  26.   // JOY1R JOY1L JOY1D JOY1U JOY1F
  27.   99, 75, 99, 74, 99, 73, 99, 72, 76, 77, 99, 99, 99, 99, 99, 99,
  28.   // JOY2R JOY2L JOY2D JOY2U JOY2F
  29.   99, 51, 99, 50, 99, 49, 99, 48, 52, 53, 99, 99, 99, 99, 99, 99
  30. };

Itt a CPC billentyű száma = sor * 8 + bit (tehát pl. az F7, ami 10, az a 0. sorban a 2. bit). Egy EP billentyűhöz egyszerre két CPC billentyűt is lehet rendelni, és a 99 azt jelenti, hogy nincs billentyű.
« Last Edit: 2010.July.02. 13:59:41 by IstvanV »

Offline IstvanV

  • EP addict
  • *
  • Posts: 4822
Re: CPC
« Reply #353 on: 2010.July.02. 13:57:44 »
Egy régebbi hozzászólásban található rövid leírás az AY programozásáról (lásd itt).

Néhány általános információ, ha eddig még nem volt leírva:
  - a Z80 órajele 4 MHz
  - minden memória és I/O művelet 4 ciklus egész számú többszöröséhez igazított, függetlenül a memória típusától (a Z80 /WAIT bemenetén olyan jel van, ami csak minden 4. ciklusban 1). Így minden utasítás időtartama 4 ciklus, azaz 1 us egész számú többszöröse (részletes táblázat itt).
  - az AY órajele 1 MHz, így a hanggenerátorok frekvenciája 62500 / N Hz
  - a CRTC órajele (egy karakter időtartama) is 1 MHz. Alapértelmezés szerint egy teljes sor 64 karakter, egy képkocka pedig 312 sor.

A CRTC-ről nagyon röviden:
  - regiszter kiválasztása: a BCxxh portra kell írni a regiszter számát
  - a kiválasztott regiszter a BDxxh porton írható
A leggyakrabban használt regiszterek:
  - 1: képernyő szélessége karakterekben (alapértelmezés szerint 40, de például a Spectrum átiratoknál gyakran 32)
  - 2: vízszintes szinkron pozíció karakterekben (ezt többnyire a szélesség módosításakor a kép középre igazítására használják)
  - 4: teljes magasság (azaz a 312 sor) karakterekben - 1; ennek a használatát az ATF-ben láttam, amikor a képernyő "remeg" a repülőgép sérülésekor
  - 6: képernyő magassága karakterekben (alapértelmezés szerint 25, de például a Spectrum átiratoknál gyakran 24)
  - 7: függőleges szinkron pozíció karakterekben (ezt többnyire a magasság módosításakor a kép középre igazítására használják)
  - 12 (0Ch): video kezdőcím felső byte
  - 13 (0Dh): video kezdőcím alsó byte
A video cím nem közvetlenül a CPC memóriáraérvényes, hanem konvertálni kell (lásd lent). Egyébként a video memória mindig a beépített 64K RAM, a lapozástól függetlenül (mint az EP-n is).

CRTC cím -> CPC memória cím konverzió:

  b15  b14  b13  b12  b11  b10   b9   b8   b7   b6   b5   b4   b3   b2   b1   b0
 MA13 MA12  RA2  RA1  RA0  MA9  MA8  MA7  MA6  MA5  MA4  MA3  MA2  MA1  MA0    x


MAxx = CRTC memória cím, amely a 12.-13. regiszterekben állítható, és minden karakter sor után az 1. regiszterben beállított szélességgel növekszik (így lesz az alapértelmezett 3000h kezdőcímből C000h).
RAx = CRTC sor cím, ez a karakteren belüli rasztersor 0 és 7 között (a karakterek magassága nem csak 8 lehetne, de más értéknek a fix cím konverzió miatt ritkán van értelme)
x = karakteren belüli vízszintes pozíció, amelyet a Gate Array generál (0 vagy 1)

"Alternatív" szín táblázat, amelyet a cpccolor segédprogram hoz létre:

  CPC                   RGB     EP1     EP2     EP3

  00h: White            111     07h     07h     07h
  01h: White            111     07h     07h     07h
  02h: Sea Green        021     F2h     32h     F2h
  03h: Pastel Yellow    221     FBh     3Bh     FBh
  04h: Blue             001     04h     C4h     04h
  05h: Purple           201     CDh     29h     CDh
  06h: Cyan             011     06h     06h     F0h
  07h: Pink             211     4Fh     B9h     4Fh
  08h: Purple           201     CDh     29h     CDh
  09h: Pastel Yellow    221     FBh     3Bh     FBh
  0Ah: Bright Yellow    220     DBh     DBh     DBh
  0Bh: Bright White     222     FFh     FFh     FFh
  0Ch: Bright Red       200     49h     49h     49h
  0Dh: Bright Magenta   202     6Dh     6Dh     6Dh
  0Eh: Orange           210     D9h     D9h     D9h
  0Fh: Pastel Magenta   212     FDh     FDh     FDh
  10h: Blue             001     04h     C4h     04h
  11h: Sea Green        021     F2h     32h     F2h
  12h: Bright Green     020     92h     92h     92h
  13h: Bright Cyan      022     B6h     B6h     B6h
  14h: Black            000     00h     00h     00h
  15h: Bright Blue      002     24h     24h     24h
  16h: Green            010     02h     42h     02h
  17h: Sky Blue         012     66h     2Eh     B4h
  18h: Magenta          101     85h     85h     85h
  19h: Pastel Green     121     B3h     7Ah     B3h
  1Ah: Lime             120     DAh     DAh     DAh
  1Bh: Pastel Cyan      122     FEh     FEh     FEh
  1Ch: Red              100     01h     01h     01h
  1Dh: Mauve            102     6Ch     6Ch     6Ch
  1Eh: Yellow           110     03h     03h     03h
  1Fh: Pastel Blue      112     27h     27h     FCh


Itt az első oszlopban található a hardveres CPC szín kód, az RGB az "ideális" CPC szín (000 = fekete, 222 = fehér), az EP1 pedig a cpccolor által konvertált EP szín alapértelmezett beállításokkal. Az EP2-nél "-chromaerr 1.0" paramétert használtam, így a konvertálásnál nagyobb fontossága van a színnek a világossághoz képest (azonban a színek egymáshoz képesti relatív világossága a gyakorlatban fontos, ezért a játékok valószínűleg jobban néznek ki az EP1 színekkel). Az EP3 színek "-gamma 0.999 0.999 0.999" paramétert használnak, itt csak kisebb eltérések vannak az EP1-hez képest. A konverzió elsősorban a "problémás" színeknél adott különböző eredményeket, ahol nem egyértelmű, hogy egy CPC-s színhez milyen EP szín hasonlít a legjobban.

Itt és itt sok hasznos CPC információ található, és néhány segédprogram is.

UI.: CPC és EP színek összehasonlítása (nagyítható; remélhetőleg mindegyik szín jó :oops:):
  [ Guests cannot view attachments ]
« Last Edit: 2010.July.02. 15:21:52 by IstvanV, Reason: CPC és EP színeket összehasonlító kép »

Offline Zozosoft

  • Global Moderator
  • EP addict
  • *
  • Posts: 14709
  • Country: hu
    • http://enterprise.iko.hu/
Re: CPC
« Reply #354 on: 2010.July.02. 15:52:41 »
  - minden memória és I/O mûvelet 4 ciklus egész számú többszöröséhez igazított, függetlenül a memória típusától
Ennek mi értelme van? Csak videóvárakozást akartak csinálni, de nem vacakoltak a részletekkel, és bevágták mindenhova?

Offline geco

  • EP addict
  • *
  • Posts: 7069
  • Country: hu
    • Támogató Támogató
Re: CPC
« Reply #355 on: 2010.July.02. 15:54:20 »
Ennek mi értelme van? Csak videóvárakozást akartak csinálni, de nem vacakoltak a részletekkel, és bevágták mindenhova?
Ez szerintem azért van, mert a CPC-n bármelyik lap lehet videó lap, mondjuk az I/O-t ez sem magyarázza :D

Offline Attus

  • EP addict
  • *
  • Posts: 1225
  • Country: hu
Re: CPC
« Reply #356 on: 2010.July.02. 16:23:22 »
Én támogatom az ötletet, Zozohoz hasonlóan!
Az tényleg kérdés, manapság hányan foglalkoznak / értenek / emlékeznek a Z80 programozásának "művészetére".
Csatlakozom.
Spectrum és TVC átiratok után lehet, hogy még én is kedvet kapok hozzá, ha majd lesz időm. 
Igaz, a linux manapság eléggé szívja az agyamat :oops:
De a Z80, mint tudjátok továbbra is kedvencem.

Offline IstvanV

  • EP addict
  • *
  • Posts: 4822
Re: CPC
« Reply #357 on: 2010.July.02. 16:39:26 »
Tuti, nem néztem ugyan meg, de úgy sejtem, hogy billentyűzetre, és hangra is egy általános rutint írtál, így a programba majdnem csak egy CALL-t kell betenni, meg elé, és mögé egy lapozást, ami belapozza a rutinokat tartalmazó lapot.

Ennél valamivel bonyolultabb és lassabb :oops: Van egy "loaderCall" rutin, amely az EXOS n hívásokhoz hasonlóan használható, és ezen keresztül hívható az eredeti (EXOS) 0. lapon található betöltő kód.
Hátrányai:
  - 54 byte méretű
  - 259 ciklus tiltott megszakításoknál, 260 ciklus engedélyezett megszakításoknál (ez tartalmazza az összes CALL, JP, és RET utasítás idejét is)
Előnyei:
  - egyszerűen használható:
        CALL  loaderCall
        DEFB  n
    ahol 'n' az EXOS 0. lap első 256 byte-ján tetszőleges cím (a fenti 259/260 ciklus tartalmazza az onnan elugró JP utasítást is, de ez rövid rutinnál el is kerülhető)
  - elmenti és visszaállítja a megszakítások engedélyezését, a hívott rutin futása közben a megszakítások tiltottak (ez a lapozás miatt kell, hogy ne fagyhasson le)
  - belapozza a betöltőt a 0. vagy 2. lapra, visszatéréskor pedig visszalapozza a CPC memóriát (természetesen a "loaderCall" nem lehet ezen a lapon)
  - a hívott rutin számára külön 30 byte-os vermet állít be az EXOS 0. lapon, hogy ne okozhasson lefagyást a CPC verem esetleges kilapozása; RET utasítással vissza lehet térni
  - a jelzőbitek kivételével semmilyen regisztert nem ront el (az eredeti HL-t azonban a "loaderCallHL" változóban tárolja - így azt ott lehet elérni, viszont esetleg megtakaríthatók PUSH HL/POP HL utasítások)
  - a CALL utasítás 2 byte-ján kívül nem használ CPC vermet
Ez valószínűleg elég rossz és pazarló megoldás, de az eddigi átirataimban elfogadható eredményt lehetett elérni ezzel is, és nagyon egyszerűen használható.
A megszakításokhoz is van hasonló rutin a betöltőben, de az kevésbé egységes, és minden átiratban többé-kevésbé eltérő (attól függően, hogy kell-e burkológörbe emuláció és/vagy 300 Hz-es megszakítás, illetve hogyan lehet a legjobban megoldani az eredeti rutinnal való egybeépítést).

A betöltőben mindig megtalálhatók a következők:
  - memóriafoglalás (táblázatban megadható a lefoglalandó CPC szegmensek listája, és hogy ezek közül meylik legyen video memória - de ez többnyire csak a "szabványos" 64K memória, amiből a 3. lap video RAM)
  - LPT generálás (szintén táblázat alapján - tetszőleges méretű, módú, stb., és akár osztott CPC képernyő is egyszerűen létrehozható)
  - billentyűzet emuláció: egy sor olvasása (ezt a gyakorlatban még egyszer sem használtam)
  - billentyűzet emuláció: minden sor olvasása 10 byte-os táblázatba (ez viszont nagyon hasznos; 2 sor módosításával állítható, hogy normál, vagy 1-es komplemens formátumú legyen a táblázat)
  - teljes AY emuláció, amely feltételes fordítással konfigurálható
  - AY regiszter olvasása (ezt még nem használtam)
  - egy AY regiszter írása (ez lassú megoldás, ha a játék sokat hívja)
  - minden AY regiszter írása táblázatból (ez előnyösebb, és szerencsére talán valamivel gyakoribb is)
  - a fenti loaderCall és megszakítás rutin
  - 300 Hz-es megszakítás emulációja a VSync-hez való szinkronizálással (ez kissé lassú, mert minden megszakításnál módosítja az LPT-t; ha nem kell a szinkronizálás - mint pl. az ATF-ben - akkor jobb megoldás fixen beállítani a megszakítást a megfelelő 6 LPB-re)
  - inicializálás, file-ok betöltése, "Press SPACE" kiírása, a játék futásának az előkészítése, stb.
Ezek nem minden játéknál találhatók meg:
  - paletta szín(ek) átdefiniálása; főleg a 4 színű játékok használják, bár kevésbé szerencsés esetben 16 színnél is előfordulhat (pl. ATF)
  - a képernyő kezdőcímének az állítása (Super Hero)
  - csalás menü (Dark Side)
  - file I/O játék közben (Castle Master 1-2, Dark Side)
  - egyéb rutinok, mint például az ATF-ben a képernyő remegése

Quote
A 4. bit segítségével késleltethetjük a megszakítást, 1-esre állítva a Gate Array számlálója nullázódik, ez a számláló felelős a megszakításgenerálásért, nullától 52-ig számol el, utána nullázza, és kezdődik minden elölről, ha a számláló 32 alatt van, akkor megszakításgenerálás elnyomva, ha felette, akkor generál megszakítást a Gate Array.

Pontosan így működik a megszakítás, ha jól tudom:
  - a Gate Array számlálója 0-tól 51-ig fut soronként 1-el növelve, amikor elérné az 52-t, akkor megszakítást generál, és 52 helyett újra 0 lesz a számláló
  - a megszakításkérést az törli, ha a Z80 elfogadja a megszakítást (azaz amikor a megszakítási rutinra ugrik); ilyenkor egyben törlődik a számláló 5. bitje is, hogy ne történhessen újabb megszakítás nagyon rövid időn belül
  - a VSync kezdete után 2 sorral (tehát általában a 242. sornál) ez történik:
    - ha a számláló értéke kisebb, mint 32, akkor csak nullázódik a számláló
    - egyébként a számláló nullázásán kívül megszakításkérés is generálódik
  - a fent említett 4. bit-be 1-et írva nullára állítódik a számláló, és törlődik az esetleges megszakításkérés
A gyakorlatban a lényeg általában csak az, hogy megszakítás van ezknek a soroknak az elején: 34, 86, 138, 190, 242, 294 :)

Quote
sőt ha jól emlékszem láttam példát OUT (x),a-ra is.

Ennek talán akkor van értelme, ha a cím és az érték ugyanaz, például egy szín "pastel blue"-ra állítása ?

Offline IstvanV

  • EP addict
  • *
  • Posts: 4822
Re: CPC
« Reply #358 on: 2010.July.02. 16:44:20 »
Ennek mi értelme van? Csak videóvárakozást akartak csinálni, de nem vacakoltak a részletekkel, és bevágták mindenhova?

Valóban video RAM várakozás, csak spóroltak a hardverrel. Ezért egyszerű fix 1 MHz-es jel (000100010001...) van a Z80 /WAIT bemenetén, ami csak minden 4. 4 MHz-es ciklusban engedélyez memória vagy I/O hozzáférést (a /WAIT működését lásd itt). Természetesen ez így valóban pazarlás, hogy minden memória, és még az I/O is lassú :) Viszont a valóban video RAM nem annyira lassú, mint EP-n.

UI.: az I/O várakoztatásának van értelme, legalábbis a Gate Array esetében, amikor az a video memóriából olvas pixel adatot.
« Last Edit: 2010.July.02. 20:20:12 by IstvanV »

Offline geco

  • EP addict
  • *
  • Posts: 7069
  • Country: hu
    • Támogató Támogató
Re: CPC
« Reply #359 on: 2010.July.03. 10:14:22 »
Ennél valamivel bonyolultabb és lassabb :oops: Van egy "loaderCall" rutin, amely az EXOS n hívásokhoz hasonlóan használható, és ezen keresztül hívható az eredeti (EXOS) 0. lapon található betöltő kód.
Ennek talán akkor van értelme, ha a cím és az érték ugyanaz, például egy szín "pastel blue"-ra állítása ?
Viszont nem kell sok időt fecsérelni, hogy miden helyettesítő rutin be legyen préselve valahová ;) , szerintem ez teljesen jó, könnyen kezelhető megoldás annak is, aki esetleg most kap kedvet az átíráshoz.
Nem tudom, az is lehet, hogy csak álmodtam :)