Difference between revisions of "A Gate Array programozása (paletta, keretszín, és video mód beállítása, memórialapozás, megszakításkérés törlése)"

From Enterprise Wiki
Jump to: navigation, search
(RAM Configurations)
 
(16 intermediate revisions by the same user not shown)
Line 1: Line 1:
 
A Gate Arrayt a 7Fh porton keresztül vezéreljük, méghozzá úgy, hogy 7fxxh portra yyh-t küldünk ki, ahol yy 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 Gate Arrayt a 7Fh porton keresztül vezéreljük, méghozzá úgy, hogy 7fxxh portra yyh-t küldünk ki, ahol yy 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:
 
A következő táblában a Gate Array funkciói találhatók:
  
Line 25: Line 26:
  
  
'''Select Pen''' - Itt adhatjuk meg, hogy a paletta egyik színét szeretnénk beállítani, vagy a keretét.
+
=== Select Pen ===
 +
 
 +
Itt adhatjuk meg, hogy a paletta egyik színét szeretnénk beállítani, vagy a keretét.
  
 
{| border="1"
 
{| border="1"
! colspan="3" | keret kiválasztása
+
! colspan="3" | Keret kiválasztása
 
|-
 
|-
 
| Bit
 
| Bit
Line 66: Line 69:
 
|}
 
|}
  
 
Paletta egyik elemének kiválasztása
 
  
 
{| border="1"
 
{| border="1"
 +
! colspan="3" | Paletta egyik elemének kiválasztása
 +
|-
 
| Bit
 
| Bit
 
| Value
 
| Value
Line 103: Line 106:
 
|}
 
|}
  
 +
=== Select Colour ===
  
'''Select Colour''' - Itt adhatjuk meg, hogy melyik színt szeretnénk a paletta valamelyik eleméhez rendelni, vagy épp a kerethez.
+
Itt adhatjuk meg, hogy melyik színt szeretnénk a paletta valamelyik eleméhez rendelni, vagy épp a kerethez.
  
 
{| border="1"
 
{| border="1"
Line 140: Line 144:
  
  
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.
+
=== 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.
  
 
{| border="1"
 
{| border="1"
Line 158: Line 164:
 
! style="background-color:#000080; color:#FFFFFF;" | Blue
 
! style="background-color:#000080; color:#FFFFFF;" | Blue
 
| 4 (44h), 16 (50h)
 
| 4 (44h), 16 (50h)
! style="background-color:#000000; color:#FFFFFF;" | 04h
+
! style="background-color:#0000AB; color:#FFFFFF;" | 04h
! style="background-color:#000000; color:#FFFFFF;" | 20h
+
! style="background-color:#000055; color:#FFFFFF;" | 20h
 
|-
 
|-
 
| 2
 
| 2
Line 170: Line 176:
 
! style="background-color:#800000; color:#FFFFFF;" | Red
 
! style="background-color:#800000; color:#FFFFFF;" | Red
 
| 28 (5Ch)
 
| 28 (5Ch)
! style="background-color:#000000; color:#FFFFFF;" | 01h
+
! style="background-color:#920000; color:#FFFFFF;" | 01h
! style="background-color:#000000; color:#FFFFFF;" | 48h
+
! style="background-color:#6E0000; color:#FFFFFF;" | 48h
 
|-
 
|-
 
| 4
 
| 4
 
! style="background-color:#800080; color:#FFFFFF;" | Magenta
 
! style="background-color:#800080; color:#FFFFFF;" | Magenta
 
| 24 (58h)
 
| 24 (58h)
! style="background-color:#000000; color:#FFFFFF;" | 85h
+
! style="background-color:#9225AB; color:#FFFFFF;" | 85h
! style="background-color:#000000; color:#FFFFFF;" | 68h
+
! style="background-color:#6E0055; color:#FFFFFF;" | 68h
 
|-
 
|-
 
| 5
 
| 5
 
! style="background-color:#8000FF; color:#FFFFFF;" | Mauve
 
! style="background-color:#8000FF; color:#FFFFFF;" | Mauve
 
| 29 (5Dh)
 
| 29 (5Dh)
! style="background-color:#000000; color:#FFFFFF;" | 6Ch
+
! style="background-color:#6E00FF; color:#FFFFFF;" | 6Ch
! style="background-color:#000000; color:#FFFFFF;" | 6Ch
+
! style="background-color:#6E00FF; color:#FFFFFF;" | 6Ch
 
|-
 
|-
 
| 6
 
| 6
Line 194: Line 200:
 
! style="background-color:#FF0080; color:#FFFFFF;" | Purple
 
! style="background-color:#FF0080; color:#FFFFFF;" | Purple
 
| 5 (45h), 8 (48h)
 
| 5 (45h), 8 (48h)
! style="background-color:#000000; color:#FFFFFF;" | CDh
+
! style="background-color:#FF25AB; color:#FFFFFF;" | CDh
! style="background-color:#000000; color:#FFFFFF;" | 29h
+
! style="background-color:#DB0055; color:#FFFFFF;" | 29h
 
|-
 
|-
 
| 8
 
| 8
Line 206: Line 212:
 
! style="background-color:#008000; color:#FFFFFF;" | Green
 
! style="background-color:#008000; color:#FFFFFF;" | Green
 
| 22 (56h)
 
| 22 (56h)
! style="background-color:#000000; color:#FFFFFF;" | 02h
+
! style="background-color:#009200; color:#FFFFFF;" | 02h
! style="background-color:#000000; color:#FFFFFF;" | 90h
+
! style="background-color:#006E00; color:#FFFFFF;" | 90h
 
|-
 
|-
 
| 10
 
| 10
 
! style="background-color:#008080; color:#FFFFFF;" | Cyan
 
! style="background-color:#008080; color:#FFFFFF;" | Cyan
 
| 6 (46h)
 
| 6 (46h)
! style="background-color:#000000; color:#FFFFFF;" | 06h
+
! style="background-color:#0092AB; color:#FFFFFF;" | 06h
! style="background-color:#000000; color:#FFFFFF;" | 0B0h
+
! style="background-color:#006E55; color:#FFFFFF;" | 0B0h
 
|-
 
|-
 
| 11
 
| 11
 
! style="background-color:#0080FF; color:#FFFFFF;" | Sky Blue
 
! style="background-color:#0080FF; color:#FFFFFF;" | Sky Blue
 
| 23 (57h)
 
| 23 (57h)
! style="background-color:#0000FF; color:#FFFFFF;" | 66h
+
! style="background-color:#2592FF; color:#FFFFFF;" | 66h
! style="background-color:#0000FF; color:#FFFFFF;" | 0B4h
+
! style="background-color:#006EFF; color:#FFFFFF;" | 0B4h
 
|-
 
|-
 
| 12
 
| 12
 
! style="background-color:#808000; color:#FFFFFF;" | Yellow
 
! style="background-color:#808000; color:#FFFFFF;" | Yellow
 
| 30 (5Eh)
 
| 30 (5Eh)
! style="background-color:#000000; color:#FFFFFF;" | 03h
+
! style="background-color:#929200; color:#FFFFFF;" | 03h
! style="background-color:#000000; color:#FFFFFF;" | 0D8h
+
! style="background-color:#6E6E00; color:#FFFFFF;" | 0D8h
 
|-
 
|-
 
| 13
 
| 13
 
! style="background-color:#808080; color:#FFFFFF;" | White
 
! style="background-color:#808080; color:#FFFFFF;" | White
 
| 0 (40h), 1 (41h)
 
| 0 (40h), 1 (41h)
! style="background-color:#000000; color:#FFFFFF;" | 07h
+
! style="background-color:#9292AB; color:#FFFFFF;" | 07h
! style="background-color:#000000; color:#FFFFFF;" | 0F8h
+
! style="background-color:#6E6E55; color:#FFFFFF;" | 0F8h
 
|-
 
|-
 
| 14
 
| 14
! style="background-color:#8080FF; color:#000000;" | Pastel Blue
+
! style="background-color:#8080FF; color:#FFFFFF;" | Pastel Blue
 
| 31 (5Fh)
 
| 31 (5Fh)
! style="background-color:#000000; color:#000000;" | 27h
+
! style="background-color:#9292FF; color:#FFFFFF;" | 27h
! style="background-color:#000000; color:#000000;" | 0FCh
+
! style="background-color:#6E6EFF; color:#FFFFFF;" | 0FCh
 
|-
 
|-
 
| 15
 
| 15
 
! style="background-color:#FF8000; color:#000000;" | Orange
 
! style="background-color:#FF8000; color:#000000;" | Orange
 
| 14 (4Eh)
 
| 14 (4Eh)
! style="background-color:#FF0000; color:#000000;" | 0D9h
+
! style="background-color:#FF6E00; color:#000000;" | 0D9h
! style="background-color:#FF0000; color:#000000;" | 0D9h
+
! style="background-color:#FF6E00; color:#000000;" | 0D9h
 
|-
 
|-
 
| 16
 
| 16
 
! style="background-color:#FF8080; color:#000000;" | Pink
 
! style="background-color:#FF8080; color:#000000;" | Pink
 
| 7 (47h)
 
| 7 (47h)
! style="background-color:#FF0000; color:#000000;" | 4Fh
+
! style="background-color:#FF92AB; color:#000000;" | 4Fh
! style="background-color:#FF0000; color:#000000;" | 0B9h
+
! style="background-color:#DB6E55; color:#000000;" | 0B9h
 
|-
 
|-
 
| 17
 
| 17
Line 315: Line 321:
 
hardver szín szerint, 1 White, 8 Purple, 9 Pastel Yellow, 16 Blue, 17 Sea Green
 
hardver szín szerint, 1 White, 8 Purple, 9 Pastel Yellow, 16 Blue, 17 Sea Green
  
 +
 +
=== Port címzés ===
  
 
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 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
 
  
ld b,7fh
+
Most a példák az OUT (C), C és OUT (C), A -ra következnek:
ld a,10h
 
out (c),a                  ;keret kiválasztása
 
ld a,44h
 
out (c),a                  ;kék szín kiválasztása (és ennyi utasítás kellett, hogy a keretet kékre állítsuk.
 
 
  
a paletta 4. színének beállítása:
+
Keret:
Code
+
        ld    bc, 7f10h            ; keret kiválasztása
 +
        ld    a, 44h                ; kék szín kiválasztása (és ennyi utasítás kellett, hogy a keretet kékre állítsuk.
 +
        out  (c), c
 +
        out  (c), a
  
ld b,7fh
+
A paletta 4. színének beállítása:
ld a,04h
+
        ld   bc, 7f04h            ; 4. elem kiválasztása
out (c),a                  ;4. elem kiválasztása
+
        ld   a, 45h               ; lila szín kiválasztása
ld a,45h
+
        out  (c), c
out (c),a                   ;lila szín kiválasztása
+
        out   (c), a
 
  
  
Select Screen Mode
+
=== 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. Cheesy
 
  
Bit 1          Bit 0          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.
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
 
  
 +
{| border="1"
 +
| 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
+
=== Rom Configuratiom selection ===
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     
 
  
 +
{| border="1"
 +
| Bit
 +
| Value
 +
| Function
 +
|-
 +
| 7
 +
| 1
 +
! rowspan="2" | Gate Array function
 +
|-
 +
| 6
 +
| 0
 +
|-
 +
| 5
 +
| x
 +
| not used
 +
|-
 +
| 4
 +
| x
 +
| Interrupt generation control
 +
|-
 +
! rowspan="2" | 3
 +
| 1
 +
| Upper rom area disable
 +
|-
 +
| 0
 +
| Upper rom area enable
 +
|-
 +
! rowspan="2" | 2
 +
| 1
 +
| Lower rom area disable
 +
|-
 +
| 0
 +
| Lower rom area enable
 +
|-
 +
| 1
 +
| x
 +
! rowspan="2" | Mode selection
 +
|-
 +
| 0
 +
| x
 +
|}
 +
 +
A 2. bit határozza meg, hogy az alsó (0000-3fffh terület) ROM engedélyezett (bit=0) vagy tiltott (bit=1), 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.
  
példa: 4 szín üzemmód kiválasztása, felső és alsó ROM tiltva
+
===== Példa =====
Code
 
  
ld b,7fh
+
4 szín üzemmód kiválasztása, felső és alsó ROM tiltva:
ld a,8dh                    ;10001101
+
        ld   b, 7fh
out (c),a
+
        ld   a, 8dh                    ; 10001101
+
        out   (c),a
  
ugyanez a BC regisztert használva:
+
Ugyanez a BC regisztert használva:
Code
+
        ld    bc, 7f8dh                ; 10001101
 +
        out  (c),c
  
ld bc,7f8dh        ;10001101
+
==== Megszakítások ====
out (c),c
 
 
  
 +
A 4. bit segítségével késleltethetjük a megszakítást, 1-esre állítva törlődik az esetleges Z80 által még nem elfogadott megszakításkérés, és 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 51-ig számol el, utána 52 helyett nullázza, megszakításkérést generál, és kezdődik minden elölről. A megszakításkérés törlődik, ha a Z80 elfogadja (azaz engedélyezett a megszakítás, és a megszakítási rutinra ugrik), ilyenkor egyben törlődik a számláló 5. bitje is, hogy ne történhessen nagyon rövid időn belül újabb megszakítás. Amikor a CRTC VSync kimenete aktívra vált (ez általában 240 sorral a képernyŐ kezdete/felső keret vége után történik), akkor 2 sor késleltetés után, azaz a "szabványos" képernyőnél a 242. sorban nullázódik a megszakítás számláló, és ha a számláló értéke 32 vagy nagyobb volt, akkor egyben megszakításkérés is generálódik.
 +
Alapértelmezés szerint tehát megszakításkérés van a 34., 86., 138., 190., 242., és 294. sor elején, és az 52 soronkénti megszakítás kb. 300 Hz-es frekvenciának felel meg.
  
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
+
=== RAM Configurations ===
                  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.
+
A 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.
 +
 
 +
{| border="1"
 +
! rowspan="2" | RAM Expansion
 +
! colspan="8" | 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.
 +
 
 +
{| border="1"
 +
! rowspan="3" | CPC6128
 +
| 0
 +
| 1
 +
| 2
 +
| 3
 +
| 0*
 +
| 1*
 +
| 2*
 +
| 3*
 +
! rowspan="3" | kb
 +
|-
 +
| 16
 +
| 16
 +
| 16
 +
| 16
 +
| 16
 +
| 16
 +
| 16
 +
| 16
 +
|-
 +
! colspan="4" | 64kb
 +
! colspan="4" | 64kb
 +
|}
  
CPC6128: 0  1  2  3  0* 1* 2* 3*
 
        16 16 16 16 16 16 16 16 kb
 
            64kb        64kb
 
  
Configuration "0":
+
{| border="1"
Z80 Memory Range Sub-block
+
|
&0000-&3fff       0
+
| Z80 Memory Range
&4000-&7fff       1
+
| Sub-block
&8000-&bfff       2
+
|-
&c000-&ffff       3
+
! rowspan="4" | Configuration "0"
Configuration "1":
+
| &0000-&3fff
Z80 Memory Range  Sub-block
+
| 0
&0000-&3fff       0
+
|-
&4000-&7fff       1
+
| &4000-&7fff
&8000-&bfff       2
+
| 1
&c000-&ffff       3*
+
|-
Configuration "2":
+
| &8000-&bfff
Z80 Memory Range  Sub-block
+
| 2
&0000-&3fff       0*
+
|-
&4000-&7fff       1*
+
| &c000-&ffff
&8000-&bfff       2*
+
| 3
&c000-&ffff       3*
+
|-
Configuration "3":
+
! rowspan="4" | Configuration "1"
Z80 Memory Range  Sub-block
+
| &0000-&3fff
&0000-&3fff       0
+
| 0
&4000-&7fff       3
+
|-
&8000-&bfff       2
+
| &4000-&7fff
&c000-&ffff       3*
+
| 1
Configuration "4":
+
|-
Z80 Memory Range  Sub-block
+
| &8000-&bfff
&0000-&3fff       0
+
| 2
&4000-&7fff       0*
+
|-
&8000-&bfff       2
+
| &c000-&ffff
&c000-&ffff       3
+
| 3*
Configuration "5":
+
|-
Z80 Memory Range  Sub-block
+
! rowspan="4" | Configuration "2"
&0000-&3fff       0
+
| &0000-&3fff
&4000-&7fff       1*
+
| 0*
&8000-&bfff       2
+
|-
&c000-&ffff       3
+
| &4000-&7fff
Configuration "6"
+
| 1*
Z80 Memory Range  Sub-block
+
|-
&0000-&3fff       0
+
| &8000-&bfff
&4000-&7fff       2*
+
| 2*
&8000-&bfff       2
+
|-
&c000-&ffff       3
+
| &c000-&ffff
Configuration "7":
+
| 3*
Z80 Memory Range  Sub-block
+
|-
&0000-&3fff       0
+
! rowspan="4" | Configuration "3"
&4000-&7fff       3*
+
| &0000-&3fff
&8000-&bfff       2
+
| 0
&c000-&ffff       3
+
|-
 +
| &4000-&7fff
 +
| 3
 +
|-
 +
| &8000-&bfff
 +
| 2
 +
|-
 +
| &c000-&ffff
 +
| 3*
 +
|-
 +
! rowspan="4" | Configuration "4"
 +
| &0000-&3fff
 +
| 0
 +
|-
 +
| &4000-&7fff
 +
| 0*
 +
|-
 +
| &8000-&bfff
 +
| 2
 +
|-
 +
| &c000-&ffff
 +
| 3
 +
|-
 +
! rowspan="4" | Configuration "5"
 +
| &0000-&3fff
 +
| 0
 +
|-
 +
| &4000-&7fff
 +
| 1*
 +
|-
 +
| &8000-&bfff
 +
| 2
 +
|-
 +
| &c000-&ffff
 +
| 3
 +
|-
 +
! rowspan="4" | Configuration "6"
 +
| &0000-&3fff
 +
| 0
 +
|-
 +
| &4000-&7fff
 +
| 2*
 +
|-
 +
| &8000-&bfff
 +
| 2
 +
|-
 +
| &c000-&ffff
 +
| 3
 +
|-
 +
! rowspan="4" | Configuration "7"
 +
| &0000-&3fff
 +
| 0
 +
|-
 +
| &4000-&7fff
 +
| 3*
 +
|-
 +
| &8000-&bfff
 +
| 2
 +
|-
 +
| &c000-&ffff
 +
| 3
 +
|}

Latest revision as of 15:41, 5 July 2010

A Gate Arrayt a 7Fh porton keresztül vezéreljük, méghozzá úgy, hogy 7fxxh portra yyh-t küldünk ki, ahol yy 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(s) EP colour 1 EP colour 2
0 Black 20 (54h) 00h 00h
1 Blue 4 (44h), 16 (50h) 04h 20h
2 Bright Blue 21 (55h) 24h 24h
3 Red 28 (5Ch) 01h 48h
4 Magenta 24 (58h) 85h 68h
5 Mauve 29 (5Dh) 6Ch 6Ch
6 Bright Red 12 (4Ch) 49h 49h
7 Purple 5 (45h), 8 (48h) CDh 29h
8 Bright Magenta 13 (4Dh) 6Dh 6Dh
9 Green 22 (56h) 02h 90h
10 Cyan 6 (46h) 06h 0B0h
11 Sky Blue 23 (57h) 66h 0B4h
12 Yellow 30 (5Eh) 03h 0D8h
13 White 0 (40h), 1 (41h) 07h 0F8h
14 Pastel Blue 31 (5Fh) 27h 0FCh
15 Orange 14 (4Eh) 0D9h 0D9h
16 Pink 7 (47h) 4Fh 0B9h
17 Pastel Magenta 15 (4Fh) 0FDh 0FDh
18 Bright Green 18 (52h) 92h 92h
19 Sea Green 2 (42h), 17 (51h) 0F2h 32h
20 Bright Cyan 19 (53h) 0B6h 0B6h
21 Lime 26 (5Ah) 0DAh 0DAh
22 Pastel Green 25 (59h) 0B3h 0FAh
23 Pastel Cyan 27 (5Bh) 0FEh 0FEh
24 Bright Yellow 10 (4Ah) 0DBh 0DBh
25 Pastel Yellow 3 (43h), 9 (49h) 0FBh 0FBh
26 Bright White 11 (4Bh) 0FFh 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


Port címzés

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), C és OUT (C), A -ra következnek:

Keret:

       ld    bc, 7f10h             ; keret kiválasztása
       ld    a, 44h                ; kék szín kiválasztása (és ennyi utasítás kellett, hogy a keretet kékre állítsuk.
       out   (c), c
       out   (c), a

A paletta 4. színének beállítása:

       ld    bc, 7f04h             ; 4. elem kiválasztása
       ld    a, 45h                ; lila szín kiválasztása
       out   (c), c
       out   (c), a


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.

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

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

A 2. bit határozza meg, hogy az alsó (0000-3fffh terület) ROM engedélyezett (bit=0) vagy tiltott (bit=1), 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.

Példa

4 szín üzemmód kiválasztása, felső és alsó ROM tiltva:

       ld    b, 7fh
       ld    a, 8dh                    ; 10001101
       out   (c),a

Ugyanez a BC regisztert használva:

       ld    bc, 7f8dh                 ; 10001101
       out   (c),c

Megszakítások

A 4. bit segítségével késleltethetjük a megszakítást, 1-esre állítva törlődik az esetleges Z80 által még nem elfogadott megszakításkérés, és 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 51-ig számol el, utána 52 helyett nullázza, megszakításkérést generál, és kezdődik minden elölről. A megszakításkérés törlődik, ha a Z80 elfogadja (azaz engedélyezett a megszakítás, és a megszakítási rutinra ugrik), ilyenkor egyben törlődik a számláló 5. bitje is, hogy ne történhessen nagyon rövid időn belül újabb megszakítás. Amikor a CRTC VSync kimenete aktívra vált (ez általában 240 sorral a képernyŐ kezdete/felső keret vége után történik), akkor 2 sor késleltetés után, azaz a "szabványos" képernyőnél a 242. sorban nullázódik a megszakítás számláló, és ha a számláló értéke 32 vagy nagyobb volt, akkor egyben megszakításkérés is generálódik. Alapértelmezés szerint tehát megszakításkérés van a 34., 86., 138., 190., 242., és 294. sor elején, és az 52 soronkénti megszakítás kb. 300 Hz-es frekvenciának felel meg.


RAM Configurations

A 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* kb
16 16 16 16 16 16 16 16
64kb 64kb


Z80 Memory Range Sub-block
Configuration "0" &0000-&3fff 0
&4000-&7fff 1
&8000-&bfff 2
&c000-&ffff 3
Configuration "1" &0000-&3fff 0
&4000-&7fff 1
&8000-&bfff 2
&c000-&ffff 3*
Configuration "2" &0000-&3fff 0*
&4000-&7fff 1*
&8000-&bfff 2*
&c000-&ffff 3*
Configuration "3" &0000-&3fff 0
&4000-&7fff 3
&8000-&bfff 2
&c000-&ffff 3*
Configuration "4" &0000-&3fff 0
&4000-&7fff 0*
&8000-&bfff 2
&c000-&ffff 3
Configuration "5" &0000-&3fff 0
&4000-&7fff 1*
&8000-&bfff 2
&c000-&ffff 3
Configuration "6" &0000-&3fff 0
&4000-&7fff 2*
&8000-&bfff 2
&c000-&ffff 3
Configuration "7" &0000-&3fff 0
&4000-&7fff 3*
&8000-&bfff 2
&c000-&ffff 3