<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
		<id>https://oldwiki.cpcwiki.eu/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Longshot</id>
		<title>CPCWiki - THE Amstrad CPC encyclopedia! - User contributions [en]</title>
		<link rel="self" type="application/atom+xml" href="https://oldwiki.cpcwiki.eu/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Longshot"/>
		<link rel="alternate" type="text/html" href="https://oldwiki.cpcwiki.eu/index.php/Special:Contributions/Longshot"/>
		<updated>2026-08-28T05:22:27Z</updated>
		<subtitle>User contributions</subtitle>
		<generator>MediaWiki 1.25.1</generator>

	<entry>
		<id>https://oldwiki.cpcwiki.eu/index.php?title=Programming:Unlocking_ASIC&amp;diff=127000</id>
		<title>Programming:Unlocking ASIC</title>
		<link rel="alternate" type="text/html" href="https://oldwiki.cpcwiki.eu/index.php?title=Programming:Unlocking_ASIC&amp;diff=127000"/>
				<updated>2025-11-21T21:10:06Z</updated>
		
		<summary type="html">&lt;p&gt;Longshot: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;To unlock the [[ASIC]], a 17-byte &amp;quot;unlock&amp;quot; sequence must be sent to the [[CRTC]]'s selection port (&amp;amp;BC00) :&lt;br /&gt;
RQ00, 0, 255, 119, 179, 81, 168, 212, 98, 57, 156, 70, 43, 21, 138, STATE, &amp;lt;ACQ&amp;gt;&lt;br /&gt;
* RQ00 must be different from the value 0.&lt;br /&gt;
* STATE=205 for UNLOCK otherwise another value for LOCK.&lt;br /&gt;
* ACQ represents sending any value if STATE=205 (not needed otherwise).&lt;br /&gt;
&lt;br /&gt;
Note: the ASIC is already unlocked after the STATE phase, before ACQ. So ACQ is actually never needed.&lt;br /&gt;
&lt;br /&gt;
Once the ASIC is unlocked, we get access to a new [[Gate Array]] register called RMR2. It is accessible in the same way as other Gate Array registers.&lt;br /&gt;
&lt;br /&gt;
Locking the ASIC again doesn't disable any of its functionality, it just prevents you changing it. [https://www.cpcwiki.eu/forum/programming/asm-source-code/msg249856/#msg249856 Source]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= BASIC version =&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
10 RESTORE &lt;br /&gt;
20 FOR x=0 TO 16:READ a:OUT &amp;amp;BC00,a:NEXT &lt;br /&gt;
30 DATA 255,0,255,119,179,81,168,212,98,57,156,70,43,21,138,205,238 &lt;br /&gt;
40 PRINT&amp;quot;ASIC unlocked!&amp;quot;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Z80 Assembler version =&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
;; This example shows how to unlock the ASIC&lt;br /&gt;
;;&lt;br /&gt;
;; This example is designed for CPC+ only and will&lt;br /&gt;
;; not work on CPC or KC Compact.&lt;br /&gt;
;;&lt;br /&gt;
;; This example will compile with the MAXAM assembler&lt;br /&gt;
;; or the built-in assembler of WinAPE32.&lt;br /&gt;
&lt;br /&gt;
org &amp;amp;8000&lt;br /&gt;
&lt;br /&gt;
;;--------------------------------------------------&lt;br /&gt;
;; Unlock CPC+ additional features&lt;br /&gt;
&lt;br /&gt;
di&lt;br /&gt;
ld b,&amp;amp;bc&lt;br /&gt;
ld hl,sequence&lt;br /&gt;
ld e,17&lt;br /&gt;
&lt;br /&gt;
.seq &lt;br /&gt;
ld a,(hl)&lt;br /&gt;
out (c),a&lt;br /&gt;
inc hl&lt;br /&gt;
dec e&lt;br /&gt;
jr nz,seq&lt;br /&gt;
&lt;br /&gt;
ei&lt;br /&gt;
ret&lt;br /&gt;
&lt;br /&gt;
;;----------------------------------------------------------&lt;br /&gt;
;; this is the sequence to unlock the ASIC extra features&lt;br /&gt;
.sequence&lt;br /&gt;
defb &amp;amp;ff,&amp;amp;00,&amp;amp;ff,&amp;amp;77,&amp;amp;b3,&amp;amp;51,&amp;amp;a8,&amp;amp;d4,&amp;amp;62,&amp;amp;39,&amp;amp;9c,&amp;amp;46,&amp;amp;2b,&amp;amp;15,&amp;amp;8a,&amp;amp;cd,&amp;amp;ee&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Optimized versions =&lt;br /&gt;
&lt;br /&gt;
The unlocking sequence can be reconstituted from simple bit operations instead of being stored in memory.&lt;br /&gt;
&lt;br /&gt;
== [[Madram]] version ==&lt;br /&gt;
&lt;br /&gt;
It still uses some magic numbers.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
di&lt;br /&gt;
ld bc,#BCFF&lt;br /&gt;
out (c),c&lt;br /&gt;
out (c),0&lt;br /&gt;
ld hl,%1001000011101010&lt;br /&gt;
&lt;br /&gt;
loop:&lt;br /&gt;
out (c),c&lt;br /&gt;
ld a,h:rlca:ld h,l:ld l,a&lt;br /&gt;
srl c&lt;br /&gt;
xor c:and #88:xor c&lt;br /&gt;
ld c,a&lt;br /&gt;
cp #4D&lt;br /&gt;
jr nz,loop&lt;br /&gt;
&lt;br /&gt;
ld a,#CD		; a = #CD for unlock, another value for lock&lt;br /&gt;
out (c),a:out (c),a&lt;br /&gt;
ei&lt;br /&gt;
ret&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== [[Urusergi]] version ==&lt;br /&gt;
&lt;br /&gt;
No magic numbers here.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
di			; v3.1 -&amp;gt; 30 bytes!&lt;br /&gt;
ld bc,#BCFF&lt;br /&gt;
out (c),c&lt;br /&gt;
out (c),0		; db #ED,#71&lt;br /&gt;
ld a,c&lt;br /&gt;
&lt;br /&gt;
loop:&lt;br /&gt;
out (c),a&lt;br /&gt;
ld h,a			; h = 7654 3210&lt;br /&gt;
add hl,hl		; h = 6543 210*&lt;br /&gt;
rra			; a = 7765 4321&lt;br /&gt;
add hl,hl		; h = 5432 10**&lt;br /&gt;
xor h:and #F7:xor h	; a = 7765 1321&lt;br /&gt;
ld l,a			; l = 7765 1321&lt;br /&gt;
ld a,h			; a = 5432 10**&lt;br /&gt;
rla			; a = 4321 0***&lt;br /&gt;
and #88:xor l		; a = (7 xor 4)765 (1 xor 0)321&lt;br /&gt;
cp c&lt;br /&gt;
jr nz,loop&lt;br /&gt;
&lt;br /&gt;
ei&lt;br /&gt;
ret&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== [[Longshot]] version ==&lt;br /&gt;
&lt;br /&gt;
Interleave keys here&lt;br /&gt;
28 bytes - 349 nops&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Asic_Unlock             &lt;br /&gt;
ld de,#533e		; interleave key 32 bits &lt;br /&gt;
ld hl,#849		; interleave key (#841 to lock)&lt;br /&gt;
ld a,#ff&lt;br /&gt;
ld bc,#bcef		; crtc input io address and 1st nibbles&lt;br /&gt;
out (c),a		; RQ00 &amp;lt;&amp;gt;0&lt;br /&gt;
out (c),0		; defb #ed,#71	; Send 00 (out (c),0&lt;br /&gt;
Asic_Unlock_Loop:&lt;br /&gt;
out (c),a		; Send 2 nibbles&lt;br /&gt;
xor h			; Put bit 12 of the key in the bit 4 of A for high nibble&lt;br /&gt;
and c			; erase bit 4 to put key bit instead&lt;br /&gt;
xor h&lt;br /&gt;
adc hl,hl		; Extract left incoming bit of high nibble of interleave key&lt;br /&gt;
ret z			; exit when key is empty (extra value sent to io address)&lt;br /&gt;
ex de,hl		; Switch the interleave key (add hl,hl is good for you) &lt;br /&gt;
rra			; Bit 7 high nibble=Cf and rotate the complete byte&lt;br /&gt;
add hl,hl		; Extract left incoming bit of low nibble of interleave key &lt;br /&gt;
jr Asic_Unlock_Loop	; Send at last 18 values to crtc input io address&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Algorithm ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
def unlock_asic():&lt;br /&gt;
    b, c = 0xBC, 0xFF&lt;br /&gt;
    out(b, c)&lt;br /&gt;
    out(b, 0)&lt;br /&gt;
    a = c&lt;br /&gt;
    &lt;br /&gt;
    while True:&lt;br /&gt;
        out(b, a)&lt;br /&gt;
        # a = (7 xor 4)765 (1 xor 0)321&lt;br /&gt;
        a = ((a &amp;gt;&amp;gt; 1) &amp;amp; 0x77) | ((a ^ (a &amp;lt;&amp;lt; 3)) &amp;amp; 0x80) | (((a &amp;lt;&amp;lt; 2) ^ (a &amp;lt;&amp;lt; 3)) &amp;amp; 0x08)&lt;br /&gt;
        if a == c: break&lt;br /&gt;
&lt;br /&gt;
def out(port, value):&lt;br /&gt;
    print(f&amp;quot;Port: {hex(port)}xx  Out: {hex(value)}&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
unlock_asic()&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Visual representation =&lt;br /&gt;
&lt;br /&gt;
As one may see, the nybbles in the sequence are based on two 4bit shift registers.&lt;br /&gt;
&lt;br /&gt;
[[File:AsicUnlockSequence.png]]&lt;br /&gt;
&lt;br /&gt;
Visual by [[Hwikaa]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Patent =&lt;br /&gt;
For one reason or another, Amstrad has patented the verification mechanism ([[Media:Patent GB2243701A.pdf|GB2243701A]]). The patent seems to focus on ''verifying'' (rather than on ''sending'') the sequence, so its legal use is a bit unclear.&lt;br /&gt;
&lt;br /&gt;
On the [[Original Arnold V Specs]] - Issue 1.5 - 10th April 1990, it is precised at §2.11 &amp;quot;Locking of enhanced features&amp;quot;:&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
it should be noted that unauthorised use of this mechanism may infringe Amstrad's patent.&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
According to [https://patents.google.com/patent/GB2243701A/en Google patents for GB2243701A] the patent was withdrawn on 1994-12-21. This means that this particular patent cannot be enforced.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Category:Programming]]&lt;br /&gt;
[[Category:CPC Plus]]&lt;/div&gt;</summary>
		<author><name>Longshot</name></author>	</entry>

	<entry>
		<id>https://oldwiki.cpcwiki.eu/index.php?title=Programming:Unlocking_ASIC&amp;diff=126999</id>
		<title>Programming:Unlocking ASIC</title>
		<link rel="alternate" type="text/html" href="https://oldwiki.cpcwiki.eu/index.php?title=Programming:Unlocking_ASIC&amp;diff=126999"/>
				<updated>2025-11-21T19:19:29Z</updated>
		
		<summary type="html">&lt;p&gt;Longshot: Another algorithm&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;To unlock the [[ASIC]], a 17-byte &amp;quot;unlock&amp;quot; sequence must be sent to the [[CRTC]]'s selection port (&amp;amp;BC00) :&lt;br /&gt;
RQ00, 0, 255, 119, 179, 81, 168, 212, 98, 57, 156, 70, 43, 21, 138, STATE, &amp;lt;ACQ&amp;gt;&lt;br /&gt;
* RQ00 must be different from the value 0.&lt;br /&gt;
* STATE=205 for UNLOCK otherwise another value for LOCK.&lt;br /&gt;
* ACQ represents sending any value if STATE=205 (not needed otherwise).&lt;br /&gt;
&lt;br /&gt;
Note: the ASIC is already unlocked after the STATE phase, before ACQ. So ACQ is actually never needed.&lt;br /&gt;
&lt;br /&gt;
Once the ASIC is unlocked, we get access to a new [[Gate Array]] register called RMR2. It is accessible in the same way as other Gate Array registers.&lt;br /&gt;
&lt;br /&gt;
Locking the ASIC again doesn't disable any of its functionality, it just prevents you changing it. [https://www.cpcwiki.eu/forum/programming/asm-source-code/msg249856/#msg249856 Source]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= BASIC version =&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
10 RESTORE &lt;br /&gt;
20 FOR x=0 TO 16:READ a:OUT &amp;amp;BC00,a:NEXT &lt;br /&gt;
30 DATA 255,0,255,119,179,81,168,212,98,57,156,70,43,21,138,205,238 &lt;br /&gt;
40 PRINT&amp;quot;ASIC unlocked!&amp;quot;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Z80 Assembler version =&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
;; This example shows how to unlock the ASIC&lt;br /&gt;
;;&lt;br /&gt;
;; This example is designed for CPC+ only and will&lt;br /&gt;
;; not work on CPC or KC Compact.&lt;br /&gt;
;;&lt;br /&gt;
;; This example will compile with the MAXAM assembler&lt;br /&gt;
;; or the built-in assembler of WinAPE32.&lt;br /&gt;
&lt;br /&gt;
org &amp;amp;8000&lt;br /&gt;
&lt;br /&gt;
;;--------------------------------------------------&lt;br /&gt;
;; Unlock CPC+ additional features&lt;br /&gt;
&lt;br /&gt;
di&lt;br /&gt;
ld b,&amp;amp;bc&lt;br /&gt;
ld hl,sequence&lt;br /&gt;
ld e,17&lt;br /&gt;
&lt;br /&gt;
.seq &lt;br /&gt;
ld a,(hl)&lt;br /&gt;
out (c),a&lt;br /&gt;
inc hl&lt;br /&gt;
dec e&lt;br /&gt;
jr nz,seq&lt;br /&gt;
&lt;br /&gt;
ei&lt;br /&gt;
ret&lt;br /&gt;
&lt;br /&gt;
;;----------------------------------------------------------&lt;br /&gt;
;; this is the sequence to unlock the ASIC extra features&lt;br /&gt;
.sequence&lt;br /&gt;
defb &amp;amp;ff,&amp;amp;00,&amp;amp;ff,&amp;amp;77,&amp;amp;b3,&amp;amp;51,&amp;amp;a8,&amp;amp;d4,&amp;amp;62,&amp;amp;39,&amp;amp;9c,&amp;amp;46,&amp;amp;2b,&amp;amp;15,&amp;amp;8a,&amp;amp;cd,&amp;amp;ee&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Optimized versions =&lt;br /&gt;
&lt;br /&gt;
The unlocking sequence can be reconstituted from simple bit operations instead of being stored in memory.&lt;br /&gt;
&lt;br /&gt;
== [[Madram]] version ==&lt;br /&gt;
&lt;br /&gt;
It still uses some magic numbers.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
di&lt;br /&gt;
ld bc,#BCFF&lt;br /&gt;
out (c),c&lt;br /&gt;
out (c),0&lt;br /&gt;
ld hl,%1001000011101010&lt;br /&gt;
&lt;br /&gt;
loop:&lt;br /&gt;
out (c),c&lt;br /&gt;
ld a,h:rlca:ld h,l:ld l,a&lt;br /&gt;
srl c&lt;br /&gt;
xor c:and #88:xor c&lt;br /&gt;
ld c,a&lt;br /&gt;
cp #4D&lt;br /&gt;
jr nz,loop&lt;br /&gt;
&lt;br /&gt;
ld a,#CD		; a = #CD for unlock, another value for lock&lt;br /&gt;
out (c),a:out (c),a&lt;br /&gt;
ei&lt;br /&gt;
ret&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== [[Urusergi]] version ==&lt;br /&gt;
&lt;br /&gt;
No magic numbers here.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
di			; v3.1 -&amp;gt; 30 bytes!&lt;br /&gt;
ld bc,#BCFF&lt;br /&gt;
out (c),c&lt;br /&gt;
out (c),0		; db #ED,#71&lt;br /&gt;
ld a,c&lt;br /&gt;
&lt;br /&gt;
loop:&lt;br /&gt;
out (c),a&lt;br /&gt;
ld h,a			; h = 7654 3210&lt;br /&gt;
add hl,hl		; h = 6543 210*&lt;br /&gt;
rra			; a = 7765 4321&lt;br /&gt;
add hl,hl		; h = 5432 10**&lt;br /&gt;
xor h:and #F7:xor h	; a = 7765 1321&lt;br /&gt;
ld l,a			; l = 7765 1321&lt;br /&gt;
ld a,h			; a = 5432 10**&lt;br /&gt;
rla			; a = 4321 0***&lt;br /&gt;
and #88:xor l		; a = (7 xor 4)765 (1 xor 0)321&lt;br /&gt;
cp c&lt;br /&gt;
jr nz,loop&lt;br /&gt;
&lt;br /&gt;
ei&lt;br /&gt;
ret&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== [[Longshot]] version ==&lt;br /&gt;
&lt;br /&gt;
Interleave keys here&lt;br /&gt;
28 bytes - 349 nops&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Asic_Unlock             &lt;br /&gt;
ld de,#533e		; interleave key 32 bits &lt;br /&gt;
ld hl,#849		; interleave key (#841 to lock)&lt;br /&gt;
ld a,#ff&lt;br /&gt;
ld bc,#bcef		; crtc input io address and 1st nibbles&lt;br /&gt;
out (c),a		; RQ00 &amp;lt;&amp;gt;0&lt;br /&gt;
out (c),0		; defb #ed,#71	; Send 00 (out (c),0&lt;br /&gt;
Asic_Unlock_Loop:&lt;br /&gt;
out (c),a		; Send 2 nibbles&lt;br /&gt;
xor h			; Put bit 12 of the key in the bit 4 of A for high nibble&lt;br /&gt;
and c			; erase bit 4 to put key bit instead&lt;br /&gt;
xor h&lt;br /&gt;
adc hl,hl		; Extract left incoming bit of high nibble of interleave key&lt;br /&gt;
ret z			; exit when key is empty (extra value sent to io address)&lt;br /&gt;
ex de,hl		; Switch the interleave key (add hl,hl is good for you) &lt;br /&gt;
rra			; Bit 7 high nibble=Cf and rotate the complete byte&lt;br /&gt;
add hl,hl		; Extract left incoming bit of low nibble of interleave key &lt;br /&gt;
jr Asic_Unlock_Loop	; Send at last 20 values to crtc input io address&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Algorithm ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
def unlock_asic():&lt;br /&gt;
    b, c = 0xBC, 0xFF&lt;br /&gt;
    out(b, c)&lt;br /&gt;
    out(b, 0)&lt;br /&gt;
    a = c&lt;br /&gt;
    &lt;br /&gt;
    while True:&lt;br /&gt;
        out(b, a)&lt;br /&gt;
        # a = (7 xor 4)765 (1 xor 0)321&lt;br /&gt;
        a = ((a &amp;gt;&amp;gt; 1) &amp;amp; 0x77) | ((a ^ (a &amp;lt;&amp;lt; 3)) &amp;amp; 0x80) | (((a &amp;lt;&amp;lt; 2) ^ (a &amp;lt;&amp;lt; 3)) &amp;amp; 0x08)&lt;br /&gt;
        if a == c: break&lt;br /&gt;
&lt;br /&gt;
def out(port, value):&lt;br /&gt;
    print(f&amp;quot;Port: {hex(port)}xx  Out: {hex(value)}&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
unlock_asic()&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Visual representation =&lt;br /&gt;
&lt;br /&gt;
As one may see, the nybbles in the sequence are based on two 4bit shift registers.&lt;br /&gt;
&lt;br /&gt;
[[File:AsicUnlockSequence.png]]&lt;br /&gt;
&lt;br /&gt;
Visual by [[Hwikaa]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Patent =&lt;br /&gt;
For one reason or another, Amstrad has patented the verification mechanism ([[Media:Patent GB2243701A.pdf|GB2243701A]]). The patent seems to focus on ''verifying'' (rather than on ''sending'') the sequence, so its legal use is a bit unclear.&lt;br /&gt;
&lt;br /&gt;
On the [[Original Arnold V Specs]] - Issue 1.5 - 10th April 1990, it is precised at §2.11 &amp;quot;Locking of enhanced features&amp;quot;:&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
it should be noted that unauthorised use of this mechanism may infringe Amstrad's patent.&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
According to [https://patents.google.com/patent/GB2243701A/en Google patents for GB2243701A] the patent was withdrawn on 1994-12-21. This means that this particular patent cannot be enforced.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Category:Programming]]&lt;br /&gt;
[[Category:CPC Plus]]&lt;/div&gt;</summary>
		<author><name>Longshot</name></author>	</entry>

	<entry>
		<id>https://oldwiki.cpcwiki.eu/index.php?title=Amspirit&amp;diff=126645</id>
		<title>Amspirit</title>
		<link rel="alternate" type="text/html" href="https://oldwiki.cpcwiki.eu/index.php?title=Amspirit&amp;diff=126645"/>
				<updated>2025-07-10T20:32:12Z</updated>
		
		<summary type="html">&lt;p&gt;Longshot: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Amspirit is a highly precise emulator of the Amstrad CPC range (CPC464, CPC664, CPC6128, CPC464+, CPC6128+) and GX4000 console. The project has been started in 2017 and is still in progress. It relies on a lone developer, [[DManu78]].&lt;br /&gt;
The main point of the emulator is it's emulating the CPC at the frequency of 16 MHZ, thus being able to emulate the Gate Array to the cycle level (To the opposite of all other Amstrad CPC emulators, which are more coarse and emulate at a frequency of only 1 MHz). The aim of [[Dmanu78]] is to emulate every little bug or side effect of the real hardware.&lt;br /&gt;
&lt;br /&gt;
Some portions of Amspirit have been developed in conjunction with [[Longshot]] while he was writing his [[Compendium]]. Modified versions of Amspirit have been used to test some theories when writing the document. Even if Longshot didn't took part in Amspirit's development, the emulator benefited from the research for the Compendium, as well as the Compendium from Amspirit.&lt;br /&gt;
&lt;br /&gt;
In 2025 Amspirit is the most accurate Amstrad CPC emulator on the [[Z80]], [[CRTC]] (types 0,1,2,3,4) and [[Gate Array]] or [[Asic]]. [[FDC]], [[AY]] and [[8255 PPI chip|PPI]] were less worked on, by lack of testing tools and documentation. It passes almost every [[The Logon Shaker|Shaker]] tests. This makes it the best choice when one needs a robust test platform when developing Amstrad CPC programs on a PC.&lt;br /&gt;
&lt;br /&gt;
== Links ==&lt;br /&gt;
* [https://www.amspirit.fr/ The Website of Amspirit]&lt;br /&gt;
* [https://forum.system-cfg.com/viewtopic.php?f=24&amp;amp;t=11535 A thread on System-cfg where DManu78 tells about the development process]&lt;br /&gt;
* [https://thecheshirec.at/2023/11/26/fatmag-2-confirme-que-lemulation-crtc-de-amspirit-est-au-top/ A program tries to make people believe Amspirit CRTC Emulation is buggy]&lt;/div&gt;</summary>
		<author><name>Longshot</name></author>	</entry>

	<entry>
		<id>https://oldwiki.cpcwiki.eu/index.php?title=Amspirit&amp;diff=126644</id>
		<title>Amspirit</title>
		<link rel="alternate" type="text/html" href="https://oldwiki.cpcwiki.eu/index.php?title=Amspirit&amp;diff=126644"/>
				<updated>2025-07-10T20:30:22Z</updated>
		
		<summary type="html">&lt;p&gt;Longshot: Crtc 3 emulation available&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Amspirit is a highly precise emulator of the Amstrad CPC range (CPC464, CPC664 and CPC6128). The project has been started in 2017 and is still in progress. It relies on a lone developer, [[DManu78]].&lt;br /&gt;
The main point of the emulator is it's emulating the CPC at the frequency of 16 MHZ, thus being able to emulate the Gate Array to the cycle level (To the opposite of all other Amstrad CPC emulators, which are more coarse and emulate at a frequency of only 1 MHz). The aim of [[Dmanu78]] is to emulate every little bug or side effect of the real hardware.&lt;br /&gt;
&lt;br /&gt;
Some portions of Amspirit have been developed in conjunction with [[Longshot]] while he was writing his [[Compendium]]. Modified versions of Amspirit have been used to test some theories when writing the document. Even if Longshot didn't took part in Amspirit's development, the emulator benefited from the research for the Compendium, as well as the Compendium from Amspirit.&lt;br /&gt;
&lt;br /&gt;
In 2025 Amspirit is the most accurate Amstrad CPC emulator on the [[Z80]], [[CRTC]] (types 0,1,2,3,4) and [[Gate Array]] or [[Asic]]. [[FDC]], [[AY]] and [[8255 PPI chip|PPI]] were less worked on, by lack of testing tools and documentation. It passes almost every [[The Logon Shaker|Shaker]] tests. This makes it the best choice when one needs a robust test platform when developing Amstrad CPC programs on a PC.&lt;br /&gt;
&lt;br /&gt;
== Links ==&lt;br /&gt;
* [https://www.amspirit.fr/ The Website of Amspirit]&lt;br /&gt;
* [https://forum.system-cfg.com/viewtopic.php?f=24&amp;amp;t=11535 A thread on System-cfg where DManu78 tells about the development process]&lt;br /&gt;
* [https://thecheshirec.at/2023/11/26/fatmag-2-confirme-que-lemulation-crtc-de-amspirit-est-au-top/ A program tries to make people believe Amspirit CRTC Emulation is buggy]&lt;/div&gt;</summary>
		<author><name>Longshot</name></author>	</entry>

	<entry>
		<id>https://oldwiki.cpcwiki.eu/index.php?title=Emulators&amp;diff=126601</id>
		<title>Emulators</title>
		<link rel="alternate" type="text/html" href="https://oldwiki.cpcwiki.eu/index.php?title=Emulators&amp;diff=126601"/>
				<updated>2025-07-05T17:07:15Z</updated>
		
		<summary type="html">&lt;p&gt;Longshot: Amspirit new major version&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[https://www.cpcwiki.eu/forum/emulators/which-emulator-s-do-you-use/ Vote for your favorite emulator] Poll on CPCWiki forum&lt;br /&gt;
&lt;br /&gt;
[[Emulator evaluation tools]] Software list for evaluating CPC emulator accuracy&lt;br /&gt;
&lt;br /&gt;
[[Emulator tooling]] UI screenshots of tooling in CPC emulators&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Software Platforms (Full OS independance) =&lt;br /&gt;
&lt;br /&gt;
=== Java Platform  ===&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable sortable&amp;quot;&lt;br /&gt;
! Emulator name&lt;br /&gt;
! External link&lt;br /&gt;
! Current version&lt;br /&gt;
! Latest release&lt;br /&gt;
! Developer tools&lt;br /&gt;
! Amstrad Plus&lt;br /&gt;
! Also emulates&lt;br /&gt;
! License&lt;br /&gt;
|-&lt;br /&gt;
| [[Arnold Jnr|Arnold Jnr]]&lt;br /&gt;
| [https://web.archive.org/web/20160727011826/http://www.arnoldemu.freeserve.co.uk/]&lt;br /&gt;
| &lt;br /&gt;
| Aug 27, 2001&lt;br /&gt;
| ❌&lt;br /&gt;
| ❌&lt;br /&gt;
| -&lt;br /&gt;
| Open source&lt;br /&gt;
|-&lt;br /&gt;
| [[JavaCPC|JavaCPC Desktop]]&lt;br /&gt;
| [https://sourceforge.net/projects/javacpc/] [http://sourceforge.net/projects/javagx4000/ JavaGX4000] [http://sourceforge.net/projects/cpcinajar/ CPCInAJar]&lt;br /&gt;
| 3.0.2&lt;br /&gt;
| Apr 8, 2022&lt;br /&gt;
| ✅&lt;br /&gt;
| ✅&lt;br /&gt;
| [[KC Compact]]&lt;br /&gt;
| Donationware &amp;amp; Open source&lt;br /&gt;
|-&lt;br /&gt;
| [[JEMU|JEMU]]&lt;br /&gt;
| [http://jemu.winape.net/]&lt;br /&gt;
| &lt;br /&gt;
| Feb 19, 2007&lt;br /&gt;
| ❌&lt;br /&gt;
| ❌&lt;br /&gt;
| [[ZX Spectrum]], [[ZX80/81]], [[BBC Micro]], [[VZ-300]]&lt;br /&gt;
| Open source&lt;br /&gt;
|-&lt;br /&gt;
| [[WebCPC|WebCPC]]&lt;br /&gt;
| [http://sourceforge.net/projects/webcpc/] [https://web.archive.org/web/20110903132520/http://java.cpc-live.com/ JavaCPC Applet]&lt;br /&gt;
| r15&lt;br /&gt;
| Dec 31, 2010&lt;br /&gt;
| ❌&lt;br /&gt;
| ❌&lt;br /&gt;
| -&lt;br /&gt;
| Open source&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Note: Java applets have been discontinued and removed in all major web browsers. So JEMU and WebCPC could belong to the &amp;quot;Discontinued OS&amp;quot; part of this article. But with [https://libgdx.com/ libGDX] and a bit of work, they could make their Java emulators work on browsers again.&lt;br /&gt;
&lt;br /&gt;
=== JS / Wasm / Web Platform ===&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable sortable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Emulator name&lt;br /&gt;
! External link&lt;br /&gt;
! Current version&lt;br /&gt;
! Latest release&lt;br /&gt;
! Developer tools&lt;br /&gt;
! Amstrad Plus&lt;br /&gt;
! Also emulates&lt;br /&gt;
! License&lt;br /&gt;
|-&lt;br /&gt;
| [[CPCBox|CPCBox]] &lt;br /&gt;
| [https://www.retroshowcase.gr/cpcbox-master/] [https://web.archive.org/web/20190702084943/http://www.cpcbox.com/] [https://bzhgames.xyz/index.php BZH Games]&lt;br /&gt;
| beta &lt;br /&gt;
| Dec 28, 2013&lt;br /&gt;
| ❌&lt;br /&gt;
| ❌&lt;br /&gt;
| -&lt;br /&gt;
| Freeware&lt;br /&gt;
|-&lt;br /&gt;
| [[CrocoDS|CrocoDS]] &lt;br /&gt;
| [https://crocods.org/web/] [https://github.com/redbug26/crocods Repo]&lt;br /&gt;
| &lt;br /&gt;
| Jun 9, 2020&lt;br /&gt;
| ⚠️&lt;br /&gt;
| ❌&lt;br /&gt;
| -&lt;br /&gt;
| Open source&lt;br /&gt;
|-&lt;br /&gt;
| [[MAME|Emularity (MAME)]] &lt;br /&gt;
| [https://github.com/db48x/emularity] [http://jsmess.textfiles.com/ JSMESS] [https://classicreload.com/platform/amstrad%20cpc Classic Reload]&lt;br /&gt;
[https://archive.org/details/softwarelibrary_cpc Internet Archive CPC Software Library]&lt;br /&gt;
| &lt;br /&gt;
| Jan 27, 2024&lt;br /&gt;
| ❌&lt;br /&gt;
| ✅&lt;br /&gt;
| Tons of vintage computers, game consoles and arcade systems&lt;br /&gt;
| Open source&lt;br /&gt;
|-&lt;br /&gt;
| [[Roland javascript emulator|Roland]] &lt;br /&gt;
| [https://web.archive.org/web/20190308142014/http://roland.retrolandia.net/] [https://www.juegotk.com/emulador-online/2/amstrad-cpc464.html JuegoTk]&lt;br /&gt;
| &lt;br /&gt;
| Sep 24, 2011&lt;br /&gt;
| ❌&lt;br /&gt;
| ❌&lt;br /&gt;
| -&lt;br /&gt;
| Open source&lt;br /&gt;
|-&lt;br /&gt;
| [[Ronald|Ronald]] &lt;br /&gt;
| [https://ronald.int82.dev] [https://github.com/mdm/ronald Repo]&lt;br /&gt;
| &lt;br /&gt;
| Apr 1, 2024&lt;br /&gt;
| ⚠️&lt;br /&gt;
| ❌&lt;br /&gt;
| -&lt;br /&gt;
| Open source&lt;br /&gt;
|-&lt;br /&gt;
| [[RVMplayer|RVMplayer]] &lt;br /&gt;
| [https://www.retrovirtualmachine.org/rvmplayer/] [https://www.amstradcpc.es/doku.php?id=emus Amstrad ESP] [https://amstradpower.es/juega-online/ Juega Online]&lt;br /&gt;
| 0.1.1&lt;br /&gt;
| May 6, 2023&lt;br /&gt;
| ❌&lt;br /&gt;
| ❌&lt;br /&gt;
| [[ZX Spectrum]]&lt;br /&gt;
| Freeware&lt;br /&gt;
|-&lt;br /&gt;
| [[Tiny Emus]]&lt;br /&gt;
| [https://floooh.github.io/tiny8bit/] [https://floooh.github.io/tiny8bit/cpc-ui.html CPC UI] [http://floooh.github.io/virtualkc/ yakc] [http://cpc.novidee.com/ zpz] [https://devilmarkus.de/ WebGL 3d 8-bit] [https://youfiles.herokuapp.com/pcemulator/ PC Classic Games]&lt;br /&gt;
[https://www.sean.co.uk/books/amstrad/index.shtm Sean's CPC Games] [https://online.oldgames.sk/play/cpc Online OldGames] [https://bzhgames.xyz/amstrad.php BZH Games]&lt;br /&gt;
&lt;br /&gt;
[https://acpc.me/index.php?language=eng Arcade Room acpc.me] [https://www.amstradcpcgames.eu/ Amstrad CPC Games]&lt;br /&gt;
| &lt;br /&gt;
| Jan 6, 2025&lt;br /&gt;
| ✅&lt;br /&gt;
| ❌&lt;br /&gt;
| [[KC Compact]], [[ZX Spectrum]], [[VIC-20]], [[Commodore 64]], [[Acorn Atom]], [[KC 85]], [[KC 87]], [[Z9001]], [[Z1013]], [[LC80]]&lt;br /&gt;
| Open source&lt;br /&gt;
|-&lt;br /&gt;
| [[Griffin CPC emulator|Xiragon]]&lt;br /&gt;
| [https://web.archive.org/web/20191027200008/http://xiragon.com/]&lt;br /&gt;
| &lt;br /&gt;
| Nov 28, 2012&lt;br /&gt;
| ❌&lt;br /&gt;
| ❌&lt;br /&gt;
| -&lt;br /&gt;
| Open source&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== [https://docs.libretro.com/start/understanding/ Libretro] (API for emulators) ===&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable sortable&amp;quot;&lt;br /&gt;
! Core name&lt;br /&gt;
! External link&lt;br /&gt;
! Current version&lt;br /&gt;
! Latest release&lt;br /&gt;
! Developer tools&lt;br /&gt;
! Amstrad Plus&lt;br /&gt;
! Also emulates&lt;br /&gt;
! License&lt;br /&gt;
|-&lt;br /&gt;
| [[CaPriCe|libretro-cap32]]&lt;br /&gt;
| [https://github.com/libretro/libretro-cap32]&lt;br /&gt;
| 4.5.4&lt;br /&gt;
| Dec 18, 2023&lt;br /&gt;
| -&lt;br /&gt;
| ✅&lt;br /&gt;
| -&lt;br /&gt;
| Open source&lt;br /&gt;
|-&lt;br /&gt;
| [[CrocoDS|libretro-crocods]]&lt;br /&gt;
| [https://github.com/libretro/libretro-crocods]&lt;br /&gt;
| &lt;br /&gt;
| Oct 16, 2024&lt;br /&gt;
| -&lt;br /&gt;
| ❌&lt;br /&gt;
| -&lt;br /&gt;
| Open source&lt;br /&gt;
|-&lt;br /&gt;
| [[MAME|LRMAME]]&lt;br /&gt;
| [https://github.com/libretro/mame]&lt;br /&gt;
| 0.277&lt;br /&gt;
| Apr 30, 2025&lt;br /&gt;
| -&lt;br /&gt;
| ✅&lt;br /&gt;
| Tons of vintage computers, game consoles and arcade systems&lt;br /&gt;
| Open source&lt;br /&gt;
|-&lt;br /&gt;
| [[SugarBox|SugarLibRetro]]&lt;br /&gt;
| [https://github.com/Tom1975/SugarLibRetro] (wraps independent lib [https://github.com/Tom1975/CPCCore CPCCore])&lt;br /&gt;
| git&lt;br /&gt;
| Jan 10, 2020&lt;br /&gt;
| -&lt;br /&gt;
| ✅&lt;br /&gt;
| -&lt;br /&gt;
| Open source&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Several frontends exist for Libretro: [https://www.emuvr.net/ EmuVR], [https://github.com/leiradel/hackable-console Hackable Console], [https://ludo.libretro.com/ Ludo], [https://github.com/shauninman/MinUI MinUI], [https://www.retroarch.com/ RetroArch], etc...&lt;br /&gt;
&lt;br /&gt;
And several distributions exist based on RetroArch: [https://www.retrobat.org/ RetroBat], [https://www.lakka.tv/ Lakka], [https://retropie.org.uk/ RetroPie], [https://batocera.org/ Batocera], [https://www.recalbox.com/ Recalbox], etc...&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Operating Systems =&lt;br /&gt;
&lt;br /&gt;
=== Desktop ===&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable sortable&amp;quot;&lt;br /&gt;
! Emulator name&lt;br /&gt;
! External link&lt;br /&gt;
! Windows&lt;br /&gt;
! macOS&lt;br /&gt;
! Linux&lt;br /&gt;
! Current version&lt;br /&gt;
! Latest release&lt;br /&gt;
! Developer tools&lt;br /&gt;
! Amstrad Plus&lt;br /&gt;
! Also emulates&lt;br /&gt;
! License&lt;br /&gt;
|-&lt;br /&gt;
| [[ACE_(Emulator)|ACE]]&lt;br /&gt;
| [http://ace.cpcscene.net MorphOS and Haiku] [https://web.libera.chat/#cpc-fr IRC chan] [https://framagit.org/search?search=acepansion Repo]&lt;br /&gt;
| ❌&lt;br /&gt;
| ❌&lt;br /&gt;
| ❌&lt;br /&gt;
| 1.26&lt;br /&gt;
| Jan 1, 2024&lt;br /&gt;
| ✅&lt;br /&gt;
| ✅&lt;br /&gt;
| Dozens of CPC hardware expansions thru plugins&lt;br /&gt;
| Freeware (plugins are Open Source)&lt;br /&gt;
|-&lt;br /&gt;
| [[ACE-DL]]&lt;br /&gt;
| [http://www.roudoudou.com/ACE-DL] [https://discord.gg/rKxFPndHPw Discord] [http://ace.cpcscene.net Based on ACE]&lt;br /&gt;
| ✅&lt;br /&gt;
| ✅&lt;br /&gt;
| ❗&lt;br /&gt;
| MayLeven&lt;br /&gt;
| May 11, 2025&lt;br /&gt;
| ✅&lt;br /&gt;
| ✅&lt;br /&gt;
| -&lt;br /&gt;
| Freeware&lt;br /&gt;
|-&lt;br /&gt;
| [[Amspirit|AMSpiriT]]&lt;br /&gt;
| [https://www.amspirit.fr/] [https://discord.com/invite/g37me8WMW6 Discord] [https://forum.system-cfg.com/viewtopic.php?f=24&amp;amp;t=11535 Forum]&lt;br /&gt;
| ✅&lt;br /&gt;
| ❌&lt;br /&gt;
| ❌&lt;br /&gt;
| v2 rc1&lt;br /&gt;
| Jul 3, 2025&lt;br /&gt;
| ❌&lt;br /&gt;
| ✅&lt;br /&gt;
| -&lt;br /&gt;
| Freeware&lt;br /&gt;
|-&lt;br /&gt;
| [[Arnimedes|Arnimedes]] &lt;br /&gt;
| [http://www.arnimedes.de/]&lt;br /&gt;
| ✅&lt;br /&gt;
| ❌&lt;br /&gt;
| ❌&lt;br /&gt;
| 1.02&lt;br /&gt;
| Jul 7, 2012&lt;br /&gt;
| ❌&lt;br /&gt;
| ❌&lt;br /&gt;
| -&lt;br /&gt;
| Freeware&lt;br /&gt;
|-&lt;br /&gt;
| [[Arnold_(Emulator)|Arnold]] &lt;br /&gt;
| [https://cpcrulez.fr/emulateurs_download-WIN-arnold.htm] [https://www.cpcwiki.eu/forum/emulators/another-version-of-arnold-emulator/ Aeliss fork] [http://www.yasara.org/cpc/ Arnold TNG]&lt;br /&gt;
[https://web.archive.org/web/20191023094109/https://www.bannister.org/software/arnold.htm macOS] [http://hirudov.com/amiga/Arnold.php AmigaOS PPC]&lt;br /&gt;
| ✅&lt;br /&gt;
| ✅&lt;br /&gt;
| 🛠️&lt;br /&gt;
|&lt;br /&gt;
| May 13, 2017&lt;br /&gt;
| ⚠️&lt;br /&gt;
| ✅&lt;br /&gt;
| [[KC Compact]], [[Aleste 520EX]]&lt;br /&gt;
| Open source&lt;br /&gt;
|-&lt;br /&gt;
| [[Caprice Forever]] &lt;br /&gt;
| [http://www.cpc-power.com/cpcarchives/index.php?page=articles&amp;amp;num=73]&lt;br /&gt;
| ✅&lt;br /&gt;
| ❌&lt;br /&gt;
| ❌&lt;br /&gt;
| 25.5&lt;br /&gt;
| May 4, 2025&lt;br /&gt;
| ✅&lt;br /&gt;
| ✅&lt;br /&gt;
| -&lt;br /&gt;
| Open source&lt;br /&gt;
|-&lt;br /&gt;
| [[CaPriCe|Caprice32]] &lt;br /&gt;
| [https://github.com/ColinPitrat/caprice32/releases] [http://sourceforge.net/projects/caprice32/ Old repo] [https://snapcraft.io/caprice32 Linux] [https://code.google.com/archive/p/cpcsdk/ Reloaded]&lt;br /&gt;
[https://github.com/kletellier/cpc4rpi Cpc4Rpi] [https://github.com/KaosOverride/CapriceRPI CapriceRPI] [https://www.arananet.net/cpc-pi/ CPC-PI]&lt;br /&gt;
| ✅&lt;br /&gt;
| ✅&lt;br /&gt;
| ✅&lt;br /&gt;
| 4.6.0&lt;br /&gt;
| Feb 14, 2025&lt;br /&gt;
| ⚠️&lt;br /&gt;
| ✅&lt;br /&gt;
| [http://aleste520.narod.ru/caprice.html Aleste 520EX]&lt;br /&gt;
| Donationware &amp;amp; Open source&lt;br /&gt;
|-&lt;br /&gt;
| [[Clock Signal|Clock Signal]] &lt;br /&gt;
| [https://github.com/TomHarte/CLK/releases] [https://snapcraft.io/clock-signal Linux] [https://snapcraft.io/install/clock-signal/raspbian Raspberry Pi]&lt;br /&gt;
| ❌&lt;br /&gt;
| ✅&lt;br /&gt;
| ✅&lt;br /&gt;
| &lt;br /&gt;
| Mar 20, 2025&lt;br /&gt;
| ❌&lt;br /&gt;
| ❌&lt;br /&gt;
| [[ZX Spectrum]], [[ZX80/81]], [[Enterprise]], [[MSX|MSX 1&amp;amp;2]], [[Oric 1/Atmos|Oric]], [[ColecoVision]], [[Apple II]], [[VIC-20]], [[Atari 2600]], [[Atari ST]], [[Acorn Electron|Electron]], [[Archimedes]], [[Macintosh]], [[Master System]]&lt;br /&gt;
| Donationware &amp;amp; Open source&lt;br /&gt;
|-&lt;br /&gt;
| [[CoPaCabana|CoPaCabana]]&lt;br /&gt;
| [http://copacabana.emuunlim.com/]&lt;br /&gt;
| ✅&lt;br /&gt;
| ❌&lt;br /&gt;
| ❌&lt;br /&gt;
| 0.74&lt;br /&gt;
| Apr 12, 2006&lt;br /&gt;
| ⚠️&lt;br /&gt;
| ❌&lt;br /&gt;
| -&lt;br /&gt;
| Donationware&lt;br /&gt;
|-&lt;br /&gt;
| [[CPC++|CPC++]] &lt;br /&gt;
| [http://bricerive.free.fr/cpc/cpcpp.html]&lt;br /&gt;
| ✅&lt;br /&gt;
| ✅&lt;br /&gt;
| ❗&lt;br /&gt;
| b700&lt;br /&gt;
| May 31, 2015&lt;br /&gt;
| ❌&lt;br /&gt;
| ❌&lt;br /&gt;
| -&lt;br /&gt;
| Freeware&lt;br /&gt;
|-&lt;br /&gt;
| [[cpc4x|cpc4x]] &lt;br /&gt;
| [http://www.ulrich-cordes.de/cpc/english/cpcemu.htm]&lt;br /&gt;
| ❌&lt;br /&gt;
| ❌&lt;br /&gt;
| 🛠️&lt;br /&gt;
| 0.26&lt;br /&gt;
| Dec 11, 2004&lt;br /&gt;
| ❌&lt;br /&gt;
| ❌&lt;br /&gt;
| -&lt;br /&gt;
| Open source&lt;br /&gt;
|-&lt;br /&gt;
| [[CPCEC|CPCEC]] &lt;br /&gt;
| [http://cngsoft.no-ip.org/cpcec.htm] [https://github.com/cpcitor/cpcec Repo] [http://cngsoft.no-ip.org/ CPCE] [https://github.com/AmatCoder/CPCEG CPCEG]&lt;br /&gt;
| ✅&lt;br /&gt;
| 🛠️&lt;br /&gt;
| 🛠️&lt;br /&gt;
| &lt;br /&gt;
| Apr 27, 2025&lt;br /&gt;
| ⚠️&lt;br /&gt;
| ✅&lt;br /&gt;
| [[ZX Spectrum]], [[Commodore 64]], [[MSX|MSX 1&amp;amp;2]]&lt;br /&gt;
| Open source&lt;br /&gt;
|-&lt;br /&gt;
| [[CPCEC|cpcec-gtk]] &lt;br /&gt;
| [https://bitbucket.org/norecess464/cpcec-gtk/]&lt;br /&gt;
| ❌&lt;br /&gt;
| ❌&lt;br /&gt;
| 🛠️&lt;br /&gt;
| &lt;br /&gt;
| Feb 4, 2023&lt;br /&gt;
| ✅&lt;br /&gt;
| ✅&lt;br /&gt;
| -&lt;br /&gt;
| Open source&lt;br /&gt;
|-&lt;br /&gt;
| [[CPCemu|CPCemu]] &lt;br /&gt;
| [http://www.cpc-emu.org/]&lt;br /&gt;
| ✅&lt;br /&gt;
| ✅&lt;br /&gt;
| ✅&lt;br /&gt;
| 3.0.2&lt;br /&gt;
| Apr 24, 2025&lt;br /&gt;
| ✅&lt;br /&gt;
| ❌&lt;br /&gt;
| -&lt;br /&gt;
| Freeware&lt;br /&gt;
|-&lt;br /&gt;
| [[CPCEPower|CPCEPower]] &lt;br /&gt;
| [https://www.cpc-power.com/cpcarchives/index.php?page=articles&amp;amp;num=73]&lt;br /&gt;
| ✅&lt;br /&gt;
| ✅&lt;br /&gt;
| ✅&lt;br /&gt;
| 2105&lt;br /&gt;
| Jun 4, 2021&lt;br /&gt;
| ❌&lt;br /&gt;
| ✅&lt;br /&gt;
| -&lt;br /&gt;
| Donationware&lt;br /&gt;
|-&lt;br /&gt;
| [[CPCSharp|CPCSharp]] &lt;br /&gt;
| [https://github.com/dolbz/CPCSharp/releases/]&lt;br /&gt;
| ✅&lt;br /&gt;
| ✅&lt;br /&gt;
| ❌&lt;br /&gt;
| 1.0.0-beta1&lt;br /&gt;
| Apr 7, 2021&lt;br /&gt;
| ⚠️&lt;br /&gt;
| ❌&lt;br /&gt;
| -&lt;br /&gt;
| Open source&lt;br /&gt;
|-&lt;br /&gt;
| [[CPvC|CPvC]]&lt;br /&gt;
| [https://github.com/alybaek2/cpvc]&lt;br /&gt;
| ✅&lt;br /&gt;
| ❌&lt;br /&gt;
| ❌&lt;br /&gt;
| &lt;br /&gt;
| Sep 30, 2022&lt;br /&gt;
| ❌&lt;br /&gt;
| ❌&lt;br /&gt;
| -&lt;br /&gt;
| Open source&lt;br /&gt;
|-&lt;br /&gt;
| [[CrocoDS|CrocoDS]]&lt;br /&gt;
| [https://crazypiri.eu/crocods/] [https://github.com/redbug26/crocods Repo]&lt;br /&gt;
| ✅&lt;br /&gt;
| ✅&lt;br /&gt;
| ❌&lt;br /&gt;
| 4.0 beta3&lt;br /&gt;
| Dec 10, 2023&lt;br /&gt;
| ⚠️&lt;br /&gt;
| ❌&lt;br /&gt;
| -&lt;br /&gt;
| Open source&lt;br /&gt;
|-&lt;br /&gt;
| [[DSP|DSP]]&lt;br /&gt;
| [https://github.com/leniad/dsp-emulator/]&lt;br /&gt;
| ✅&lt;br /&gt;
| ✅&lt;br /&gt;
| 🛠️&lt;br /&gt;
| 0.24wip1&lt;br /&gt;
| Apr 30, 2025&lt;br /&gt;
| ❌&lt;br /&gt;
| ❌&lt;br /&gt;
| [[ZX Spectrum]], [[Commodore 64]], [[Oric 1/Atmos|Oric]], [[ColecoVision]], [[Game Boy]], [[NES]], [[SG-1000]], [[Master System]], [[Game Gear]], [[Super Cassette Vision]], [[PV-1000]], [[PV-2000]], [[Arcade]]&lt;br /&gt;
| Open source&lt;br /&gt;
|-&lt;br /&gt;
| [[ep128emu|ep128emu]]&lt;br /&gt;
| [https://github.com/istvan-v/ep128emu]&lt;br /&gt;
| ✅&lt;br /&gt;
| 🛠️&lt;br /&gt;
| 🛠️&lt;br /&gt;
| 2.0.11.2&lt;br /&gt;
| Apr 19, 2019&lt;br /&gt;
| ⚠️&lt;br /&gt;
| ❌&lt;br /&gt;
| [[ZX Spectrum]], [[Enterprise]]&lt;br /&gt;
| Donationware &amp;amp; Open source&lt;br /&gt;
|-&lt;br /&gt;
| [[Gemux|Gemux]] &lt;br /&gt;
| [https://www.cpcwiki.eu/forum/emulators/gemux-cpc/]&lt;br /&gt;
| ✅&lt;br /&gt;
| ❌&lt;br /&gt;
| ❗&lt;br /&gt;
| &lt;br /&gt;
| Nov 5, 2024&lt;br /&gt;
| ❌&lt;br /&gt;
| ❌&lt;br /&gt;
| -&lt;br /&gt;
| Freeware&lt;br /&gt;
|-&lt;br /&gt;
| [[MESS|MAME]]&lt;br /&gt;
| [http://mamedev.org] [http://se.os4depot.net/index.php?function=showfile&amp;amp;file=emulation/computer/sdl_mess.lha AmigaOS PPC] [http://fabportnawak.free.fr/mame/ MorphOS] [https://depot.haiku-os.org/#!/pkg/mame Haiku]&lt;br /&gt;
[https://github.com/AntoPISA/MAME_SupportFiles Support Files] [https://auamstrad.es/software/mame-emulador-de-amstrad-cpc/ Tutorial (ES)]&lt;br /&gt;
| ✅&lt;br /&gt;
| ✅&lt;br /&gt;
| ✅&lt;br /&gt;
| 0.277&lt;br /&gt;
| Apr 30, 2025&lt;br /&gt;
| ⚠️&lt;br /&gt;
| ✅&lt;br /&gt;
| Tons of vintage computers, game consoles and arcade systems&lt;br /&gt;
| Open source&lt;br /&gt;
|-&lt;br /&gt;
| [[NO$CPC|NO$CPC]]&lt;br /&gt;
| [http://problemkaputt.de/cpc.htm]&lt;br /&gt;
| ✅&lt;br /&gt;
| ❌&lt;br /&gt;
| ❌&lt;br /&gt;
| 1.8&lt;br /&gt;
| Nov 2, 2000&lt;br /&gt;
| ⚠️&lt;br /&gt;
| ✅&lt;br /&gt;
| -&lt;br /&gt;
| Donationware&lt;br /&gt;
|-&lt;br /&gt;
| [[PC-CPC|PC-CPC]] &lt;br /&gt;
| [http://cpcrulez.fr/emulateurs_download-WIN-PC-CPC.htm] [https://github.com/DemoniakLudo/PC-CPC Repo]&lt;br /&gt;
| ✅&lt;br /&gt;
| ❌&lt;br /&gt;
| ❌&lt;br /&gt;
| 0.1at b29&lt;br /&gt;
| Nov 17, 2011&lt;br /&gt;
| ⚠️&lt;br /&gt;
| ❌&lt;br /&gt;
| -&lt;br /&gt;
| Open source&lt;br /&gt;
|-&lt;br /&gt;
| [[Retro Virtual Machine|Retro Virtual Machine]]&lt;br /&gt;
| [https://www.retrovirtualmachine.org]&lt;br /&gt;
| ✅&lt;br /&gt;
| ✅&lt;br /&gt;
| ✅&lt;br /&gt;
| 2.1.19&lt;br /&gt;
| Dec 9, 2024&lt;br /&gt;
| ❌ Removed&lt;br /&gt;
| ✅&lt;br /&gt;
| [[ZX Spectrum]], [[MSX|MSX 1]], [[ColecoVision]], [[SG-1000]], [[Master System]]&lt;br /&gt;
| Donationware&lt;br /&gt;
|-&lt;br /&gt;
| [[Roland Emulator|Roland]] &lt;br /&gt;
| [https://www.rolandemu.de/en/downloads.html] [https://github.com/raldus/roland Repo]&lt;br /&gt;
| ✅&lt;br /&gt;
| ❌&lt;br /&gt;
| 🛠️&lt;br /&gt;
| 0.70&lt;br /&gt;
| Apr 20, 2017&lt;br /&gt;
| ❌&lt;br /&gt;
| ❌&lt;br /&gt;
| -&lt;br /&gt;
| Open source&lt;br /&gt;
|-&lt;br /&gt;
| [[Ronald|Ronald]] &lt;br /&gt;
| [https://github.com/mdm/ronald]&lt;br /&gt;
| ❌&lt;br /&gt;
| ❌&lt;br /&gt;
| 🛠️&lt;br /&gt;
| &lt;br /&gt;
| Apr 1, 2024&lt;br /&gt;
| ⚠️&lt;br /&gt;
| ❌&lt;br /&gt;
| -&lt;br /&gt;
| Open source&lt;br /&gt;
|-&lt;br /&gt;
| [[SugarBox|SugarBox]]&lt;br /&gt;
| [https://github.com/Tom1975/SugarboxV2] [http://sugarbox.free.fr/ Old site] [https://github.com/Tom1975/SugarPi SugarPi]&lt;br /&gt;
| ✅&lt;br /&gt;
| ✅&lt;br /&gt;
| ✅&lt;br /&gt;
| 2.0.4&lt;br /&gt;
| Nov 24, 2024&lt;br /&gt;
| ⚠️&lt;br /&gt;
| ✅&lt;br /&gt;
| -&lt;br /&gt;
| Open source&lt;br /&gt;
|-&lt;br /&gt;
| [[VirtualCPC|Virtual CPC]] &lt;br /&gt;
| [https://cpcrulez.fr/emulateurs_download-WIN-virtual_cpc.htm] [https://web.archive.org/web/20200112094913/http://users.otenet.gr/~sulfonic/cpc/ Archive] &lt;br /&gt;
| ✅&lt;br /&gt;
| ❌&lt;br /&gt;
| ❌&lt;br /&gt;
| 1.1&lt;br /&gt;
| Aug 8, 2011&lt;br /&gt;
| ⚠️&lt;br /&gt;
| ❌&lt;br /&gt;
| -&lt;br /&gt;
| Freeware&lt;br /&gt;
|-&lt;br /&gt;
| [[WinApe|WinAPE]] &lt;br /&gt;
| [http://www.winape.net/] [https://www-ftp.lip6.fr/pub/amstrad/emulator/CPCWIN10.ZIP CPCwin]&lt;br /&gt;
| ✅&lt;br /&gt;
| ❌&lt;br /&gt;
| ❌&lt;br /&gt;
| 2.0b2&lt;br /&gt;
| Jan 5, 2016&lt;br /&gt;
| ✅&lt;br /&gt;
| ✅&lt;br /&gt;
| -&lt;br /&gt;
| Donationware&lt;br /&gt;
|-&lt;br /&gt;
| [[WinCPC|WinCPC]] / [[MacCPC|MacCPC]]&lt;br /&gt;
| [http://www.wincpc.ch/index.php?topic=projects] [https://web.archive.org/web/20050409133618/http://www.easypoint.ch/vbcpc/ vbCPC]&lt;br /&gt;
| ✅&lt;br /&gt;
| ✅&lt;br /&gt;
| ❌&lt;br /&gt;
| 0.9.2&lt;br /&gt;
| Jan 22, 2010&lt;br /&gt;
| ✅&lt;br /&gt;
| ❌&lt;br /&gt;
| -&lt;br /&gt;
| Freeware&lt;br /&gt;
|-&lt;br /&gt;
| [[XCPC|Xcpc]]&lt;br /&gt;
| [https://www.xcpc-emulator.net/] [https://github.com/ponceto/xcpc-emulator Repo]&lt;br /&gt;
| ❌&lt;br /&gt;
| ❌&lt;br /&gt;
| ✅&lt;br /&gt;
| 0.52.1&lt;br /&gt;
| Sep 8, 2024&lt;br /&gt;
| ❌&lt;br /&gt;
| ❌&lt;br /&gt;
| -&lt;br /&gt;
| Open source&lt;br /&gt;
|-&lt;br /&gt;
| [[XNACPC|XNACPC]]&lt;br /&gt;
| [http://www.gavpugh.com/2011/11/11/xnacpc-xbox-360-amstrad-cpc-emulator-released/] [https://www.gavpugh.com/old-code/ CPC3D]&lt;br /&gt;
| ✅&lt;br /&gt;
| ❌&lt;br /&gt;
| ❌&lt;br /&gt;
| 1.0&lt;br /&gt;
| Nov 11, 2011&lt;br /&gt;
| ❌&lt;br /&gt;
| ❌&lt;br /&gt;
| -&lt;br /&gt;
| Open source&lt;br /&gt;
|-&lt;br /&gt;
| [[ZEsarUX|ZEsarUX]]&lt;br /&gt;
| [https://github.com/chernandezba/zesarux] [https://depot.haiku-os.org/#!/pkg/zesarux Haiku]&lt;br /&gt;
| ✅&lt;br /&gt;
| ✅&lt;br /&gt;
| ✅&lt;br /&gt;
| 12.0&lt;br /&gt;
| Jan 16, 2025&lt;br /&gt;
| ⚠️&lt;br /&gt;
| ❌&lt;br /&gt;
| [[PCW]], [[ZX Spectrum]], [[ZX80/81]], [[MSX|MSX 1]], [[ColecoVision]], [[Spectravideo]], [[Jupiter ACE]], [[Sam Coupe]], [[SG-1000]], [[Master System]], [[Sinclair QL]], [[MK14]], [[Z88]]&lt;br /&gt;
| Donationware &amp;amp; Open source&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Legend: ❗= No Raspberry Pi / ARM build ; 🛠️ = Build it yourself ; ⚠️ = Incomplete tooling&lt;br /&gt;
&lt;br /&gt;
=== Mobile ===&lt;br /&gt;
&lt;br /&gt;
You can use [https://www.retroarch.com/index.php?page=platforms RetroArch] for Amstrad CPC emulation on '''Android and iOS'''. Or you can use these stand-alone CPC emulators:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable sortable&amp;quot;&lt;br /&gt;
! Host system&lt;br /&gt;
! Emulator name&lt;br /&gt;
! External link&lt;br /&gt;
! Current version&lt;br /&gt;
! Latest release&lt;br /&gt;
! Amstrad Plus&lt;br /&gt;
! Also emulates&lt;br /&gt;
! License&lt;br /&gt;
|-&lt;br /&gt;
| Android&lt;br /&gt;
| [[andcpc]]&lt;br /&gt;
| [http://code.google.com/p/andcpc/]&lt;br /&gt;
| 1.5.1&lt;br /&gt;
| Apr 4, 2011&lt;br /&gt;
| ❌&lt;br /&gt;
| -&lt;br /&gt;
| Open source&lt;br /&gt;
|-&lt;br /&gt;
| Android&lt;br /&gt;
| [[Azimuth]]&lt;br /&gt;
| [https://play.google.com/store/apps/details?id=johnidis.azimuth]&lt;br /&gt;
| 1.20&lt;br /&gt;
| Feb 7, 2025&lt;br /&gt;
| ❌&lt;br /&gt;
| -&lt;br /&gt;
| Adware and in-app purchases💲&lt;br /&gt;
|-&lt;br /&gt;
| Android&lt;br /&gt;
| [[CPCDroid]]&lt;br /&gt;
| [https://fmsdevel.wisecoding.es/cpcdroid-amstrad-cpc-on-android-phone-2/]&lt;br /&gt;
| 1.5.1&lt;br /&gt;
| Mar 2, 2011&lt;br /&gt;
| ❌&lt;br /&gt;
| -&lt;br /&gt;
| Open source&lt;br /&gt;
|-&lt;br /&gt;
| Android&lt;br /&gt;
| [[CPCemu|CPCemu]] &lt;br /&gt;
| [https://cpc-emu.org/]&lt;br /&gt;
| 3.0.2&lt;br /&gt;
| Apr 24, 2025&lt;br /&gt;
| ❌&lt;br /&gt;
| -&lt;br /&gt;
| Freeware&lt;br /&gt;
|-&lt;br /&gt;
| Android&lt;br /&gt;
| [[Droid-CPC]]&lt;br /&gt;
| [http://play.google.com/store/apps/details?id=com.kokak.droidcpc]&lt;br /&gt;
| 1.1.01&lt;br /&gt;
| Dec 15, 2016&lt;br /&gt;
| ❌&lt;br /&gt;
| -&lt;br /&gt;
| Commercial💲&lt;br /&gt;
|-&lt;br /&gt;
| Android&lt;br /&gt;
| [[MAME4droid Current]]&lt;br /&gt;
| [http://play.google.com/store/apps/details?id=com.seleuco.mame4d2024] [https://github.com/seleuco/MAME4droid-2024 Repo]&lt;br /&gt;
| 1.24 (0.277)&lt;br /&gt;
| May 2, 2025&lt;br /&gt;
| ✅&lt;br /&gt;
| Tons of vintage computers, game consoles and arcade systems&lt;br /&gt;
| Open source&lt;br /&gt;
|-&lt;br /&gt;
| iOS&lt;br /&gt;
| [[CPCemu|CPCemu]]&lt;br /&gt;
| [http://www.cpc-emu.org/]&lt;br /&gt;
| 3.0.2&lt;br /&gt;
| May 11, 2025&lt;br /&gt;
| ❌&lt;br /&gt;
| -&lt;br /&gt;
| Freeware&lt;br /&gt;
|-&lt;br /&gt;
| iOS&lt;br /&gt;
| [[CrocoDS]]&lt;br /&gt;
| [https://crazypiri.eu/crocods/] [https://github.com/redbug26/crocods-ios Repo]&lt;br /&gt;
| 2.1&lt;br /&gt;
| Jun 21, 2013&lt;br /&gt;
| ❌&lt;br /&gt;
| -&lt;br /&gt;
| Open source&lt;br /&gt;
|-&lt;br /&gt;
| iOS&lt;br /&gt;
| [[MAME4iOS]]&lt;br /&gt;
| [https://github.com/yoshisuga/MAME4iOS]&lt;br /&gt;
| 2022.5&lt;br /&gt;
| Dec 12, 2022&lt;br /&gt;
| ✅&lt;br /&gt;
| Tons of vintage computers, game consoles and arcade systems&lt;br /&gt;
| Open source&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Discontinued OS ===&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable sortable&amp;quot;&lt;br /&gt;
! Host system&lt;br /&gt;
! Emulator name&lt;br /&gt;
! External link&lt;br /&gt;
! Current version&lt;br /&gt;
! Latest release&lt;br /&gt;
! Amstrad Plus&lt;br /&gt;
! Also emulates&lt;br /&gt;
! License&lt;br /&gt;
|-&lt;br /&gt;
| Acorn RISC OS&lt;br /&gt;
| [[!CPC|!CPC]]&lt;br /&gt;
| [https://www-ftp.lip6.fr/pub/amstrad/emulator/CPC0728.ZIP] [http://ftp2.fr.openbsd.org/ftp/pub/amstrad/emulator/CPCS1124.ZIP]&lt;br /&gt;
| &lt;br /&gt;
| Jul 28, 1996&lt;br /&gt;
| ❌&lt;br /&gt;
| -&lt;br /&gt;
| Open source&lt;br /&gt;
|-&lt;br /&gt;
| Acorn RISC OS&lt;br /&gt;
| [[!CPCemu|!CPCemu]]&lt;br /&gt;
| [http://huggers-world.de/mops.html]&lt;br /&gt;
| 1.21&lt;br /&gt;
| Mar 22, 2016&lt;br /&gt;
| ❌&lt;br /&gt;
| -&lt;br /&gt;
| Open source&lt;br /&gt;
|-&lt;br /&gt;
| AmigaOS m68k&lt;br /&gt;
| [[A-CPC|A-CPC]]&lt;br /&gt;
| [https://cpctech.cpcwiki.de/download/a-cpc.lha]&lt;br /&gt;
| 2.0&lt;br /&gt;
| Mar 30, 2002&lt;br /&gt;
| ✅&lt;br /&gt;
| -&lt;br /&gt;
| Open source&lt;br /&gt;
|-&lt;br /&gt;
| AmigaOS m68k&lt;br /&gt;
| [[Ami-cpc|Ami-cpc]]&lt;br /&gt;
| [http://deplanque.chez.com/] [http://deplanque.chez.com/download_fr.html Ami-cpc2]&lt;br /&gt;
| 0.46&lt;br /&gt;
| Jan 21, 1998&lt;br /&gt;
| ❌&lt;br /&gt;
| -&lt;br /&gt;
| Open source&lt;br /&gt;
|-&lt;br /&gt;
| AmigaOS m68k&lt;br /&gt;
| [[CPE|CPE]]&lt;br /&gt;
| [https://cpcrulez.fr/emulateurs_download-AMIGA-CPE.htm]&lt;br /&gt;
| &lt;br /&gt;
| Feb 24, 1995&lt;br /&gt;
| ❌&lt;br /&gt;
| -&lt;br /&gt;
| Open source&lt;br /&gt;
|-&lt;br /&gt;
| AmigaOS m68k&lt;br /&gt;
| [[Emu-CPC|EmuCPC]]&lt;br /&gt;
| [https://cpcrulez.fr/emulateurs_download-AMIGA-emucpc.htm]&lt;br /&gt;
| 0.7&lt;br /&gt;
| Sep 15, 1996&lt;br /&gt;
| ❌&lt;br /&gt;
| -&lt;br /&gt;
| Open source&lt;br /&gt;
|-&lt;br /&gt;
| AROS&lt;br /&gt;
| [[Arnold]] &lt;br /&gt;
| [http://archives.aros-exec.org/?function=showfile&amp;amp;file=emulation/computer/arnold-aros-i386.lha]&lt;br /&gt;
| &lt;br /&gt;
| Oct 24, 2010&lt;br /&gt;
| ✅&lt;br /&gt;
| -&lt;br /&gt;
| Open source&lt;br /&gt;
|-&lt;br /&gt;
| AROS&lt;br /&gt;
| [[Caprice32]] &lt;br /&gt;
| [http://archives.aros-exec.org/?function=showfile&amp;amp;file=emulation/computer/caprice-aros-i386.lha]&lt;br /&gt;
| 4.2.0&lt;br /&gt;
| Oct 23, 2010&lt;br /&gt;
| ❌&lt;br /&gt;
| -&lt;br /&gt;
| Open source&lt;br /&gt;
|-&lt;br /&gt;
| BlackBerry OS&lt;br /&gt;
| [[BB-CPC|BB-CPC]]&lt;br /&gt;
| [http://appworld.blackberry.com/webstore/content/30963891/] (dead link)&lt;br /&gt;
| 1.0.1.3&lt;br /&gt;
| Jul 15, 2013&lt;br /&gt;
| ❌&lt;br /&gt;
| -&lt;br /&gt;
| Commercial💲&lt;br /&gt;
|-&lt;br /&gt;
| Classic Mac OS&lt;br /&gt;
| [[CPCplusplus|CPC++]]&lt;br /&gt;
| [http://bricerive.free.fr/cpc/cpcpp.html]&lt;br /&gt;
| 1.3.2&lt;br /&gt;
| Oct 6, 1997&lt;br /&gt;
| ❌&lt;br /&gt;
| -&lt;br /&gt;
| Shareware💲&lt;br /&gt;
|-&lt;br /&gt;
| DOS&lt;br /&gt;
| [[AdvanceMESS|AdvanceMESS]]&lt;br /&gt;
| [https://www.advancemame.it/readme]&lt;br /&gt;
| 3.9&lt;br /&gt;
| Sep 8, 2018&lt;br /&gt;
| ✅&lt;br /&gt;
| Tons of vintage computers and game consoles&lt;br /&gt;
| Open source&lt;br /&gt;
|-&lt;br /&gt;
| DOS&lt;br /&gt;
| [[Arnimedes|Arnimedes]]&lt;br /&gt;
| [http://www.arnimedes.de/]&lt;br /&gt;
| 0.8a&lt;br /&gt;
| Apr 15, 2000&lt;br /&gt;
| ❌&lt;br /&gt;
| -&lt;br /&gt;
| Freeware&lt;br /&gt;
|-&lt;br /&gt;
| DOS&lt;br /&gt;
| [[Caprice32]] &lt;br /&gt;
| [https://ftp.nvg.ntnu.no/pub/cpc/emulator/msdos/capriced.zip]&lt;br /&gt;
| 1.11&lt;br /&gt;
| Sep 20, 1999&lt;br /&gt;
| ❌&lt;br /&gt;
| -&lt;br /&gt;
| Open source&lt;br /&gt;
|-&lt;br /&gt;
| DOS&lt;br /&gt;
| [[CPC]] &lt;br /&gt;
| [https://www-ftp.lip6.fr/pub/amstrad/emulator/CPC055B.ZIP]&lt;br /&gt;
| 0.55b&lt;br /&gt;
| May 16, 1997&lt;br /&gt;
| ❌&lt;br /&gt;
| -&lt;br /&gt;
| Freeware&lt;br /&gt;
|-&lt;br /&gt;
| DOS&lt;br /&gt;
| [[CPC-em|CPC-em]] &lt;br /&gt;
| [http://cpc-em.emuunlim.com/]&lt;br /&gt;
| 0.4&lt;br /&gt;
| Jul 7, 2004&lt;br /&gt;
| ❌&lt;br /&gt;
| -&lt;br /&gt;
| Open source&lt;br /&gt;
|-&lt;br /&gt;
| DOS&lt;br /&gt;
| [[CPCE|CPCE]]&lt;br /&gt;
| [http://cngsoft.no-ip.org/cpce/]&lt;br /&gt;
| 1.94&lt;br /&gt;
| Jun 2, 2011&lt;br /&gt;
| ❌&lt;br /&gt;
| -&lt;br /&gt;
| Freeware&lt;br /&gt;
|-&lt;br /&gt;
| DOS&lt;br /&gt;
| [[CPCemu|CPCemu]]&lt;br /&gt;
| [http://www.cpc-emu.org/]&lt;br /&gt;
| 1.5&lt;br /&gt;
| Jul 7, 1998&lt;br /&gt;
| ❌&lt;br /&gt;
| -&lt;br /&gt;
| Freeware&lt;br /&gt;
|-&lt;br /&gt;
| DOS&lt;br /&gt;
| [[CPE|CPE]]&lt;br /&gt;
| [https://cpcrulez.fr/emulateurs_download-DOS-CPE.htm]&lt;br /&gt;
| 5.2&lt;br /&gt;
| Apr 21, 1997&lt;br /&gt;
| ❌&lt;br /&gt;
| -&lt;br /&gt;
| Open source&lt;br /&gt;
|-&lt;br /&gt;
| DOS&lt;br /&gt;
| [[NO$CPC|NO$CPC]]&lt;br /&gt;
| [http://problemkaputt.de/cpc.htm]&lt;br /&gt;
| 1.8&lt;br /&gt;
| Nov 2, 2000&lt;br /&gt;
| ✅&lt;br /&gt;
| -&lt;br /&gt;
| Freeware&lt;br /&gt;
|-&lt;br /&gt;
| DOS&lt;br /&gt;
| [[PC-CPC|PC-CPC]] &lt;br /&gt;
| [http://deplanque.chez.com/download_fr.html]&lt;br /&gt;
| &lt;br /&gt;
| Feb 3, 1998&lt;br /&gt;
| ❌&lt;br /&gt;
| -&lt;br /&gt;
| Open source&lt;br /&gt;
|-&lt;br /&gt;
| DOS&lt;br /&gt;
| [[CPCEMU (RWCPC)|RWCPC]]&lt;br /&gt;
| [https://www-ftp.lip6.fr/pub/amstrad/emulator/RWCPC.ZIP]&lt;br /&gt;
| &lt;br /&gt;
| Mar 23, 1995&lt;br /&gt;
| ❌&lt;br /&gt;
| -&lt;br /&gt;
| Freeware&lt;br /&gt;
|-&lt;br /&gt;
| DOS&lt;br /&gt;
| [[SIMCPC|SIMCPC]]&lt;br /&gt;
| [https://www-ftp.lip6.fr/pub/amstrad/emulator/SIMCPC.ZIP]&lt;br /&gt;
| &lt;br /&gt;
| Dec 10, 1989&lt;br /&gt;
| ❌&lt;br /&gt;
| -&lt;br /&gt;
| Shareware💲&lt;br /&gt;
|-&lt;br /&gt;
| DOS&lt;br /&gt;
| [[YAGE|YAGE]]&lt;br /&gt;
| [https://www.zophar.net/cpc/yage.html]&lt;br /&gt;
| 0.91&lt;br /&gt;
| Oct 24, 1998&lt;br /&gt;
| ❌&lt;br /&gt;
| -&lt;br /&gt;
| Freeware&lt;br /&gt;
|-&lt;br /&gt;
| EXOS&lt;br /&gt;
| [[Software CPC Emulator|Software CPC Emulator]]&lt;br /&gt;
| [http://www.ep128.hu/Ep_Util/Prg/Amstrad_CPC_Emulator_13.rar] [http://www.ep128.hu/Ep_Util/Amstrad_CPC_emu.htm]&lt;br /&gt;
| 1.3&lt;br /&gt;
| Jan 11, 2013&lt;br /&gt;
| ❌&lt;br /&gt;
| -&lt;br /&gt;
| Open source&lt;br /&gt;
|-&lt;br /&gt;
| Maemo&lt;br /&gt;
| [[CPCm]]&lt;br /&gt;
| [http://maemo.org/downloads/product/Maemo5/cpcm/]&lt;br /&gt;
| 1.20-1&lt;br /&gt;
| Apr 27, 2010&lt;br /&gt;
| ❌&lt;br /&gt;
| -&lt;br /&gt;
| Open source&lt;br /&gt;
|-&lt;br /&gt;
| MSX-DOS&lt;br /&gt;
| [[EMU6CPC|EMU6CPC]]&lt;br /&gt;
| [http://romu6.blogspot.com/2018/12/emu6cpc-emulador-de-amstrad-cpc-6128.html]&lt;br /&gt;
| &lt;br /&gt;
| Dec 17, 2018&lt;br /&gt;
| ❌&lt;br /&gt;
| -&lt;br /&gt;
| Freeware&lt;br /&gt;
|-&lt;br /&gt;
| OS/2&lt;br /&gt;
| [[SDLMAME|SDLMAME]]&lt;br /&gt;
| [https://ecsoft2.org/sdlmame]&lt;br /&gt;
| 0.170&lt;br /&gt;
| Jan 30, 2016&lt;br /&gt;
| ✅&lt;br /&gt;
| Tons of vintage computers, game consoles and arcade systems&lt;br /&gt;
| Open source&lt;br /&gt;
|-&lt;br /&gt;
| Palm OS&lt;br /&gt;
| [[CaPriCe for Palm OS|CaPriCe for Palm OS]]&lt;br /&gt;
| [http://coste.frederic.free.fr/cpc/cpc_en.htm]&lt;br /&gt;
| 2.8&lt;br /&gt;
| Jun 28, 2011&lt;br /&gt;
| ❌&lt;br /&gt;
| -&lt;br /&gt;
| Open source&lt;br /&gt;
|-&lt;br /&gt;
| Palm OS&lt;br /&gt;
| [[CoPaCabana|CoPaCabana]]&lt;br /&gt;
| [http://copacabana.emuunlim.com/]&lt;br /&gt;
| 0.75&lt;br /&gt;
| Dec 4, 2007&lt;br /&gt;
| ❌&lt;br /&gt;
| -&lt;br /&gt;
| Freeware&lt;br /&gt;
|-&lt;br /&gt;
| Pocket PC&lt;br /&gt;
| [[CaPriCe|PocketCaprice]]&lt;br /&gt;
| [https://web.archive.org/web/20160506010209/http://www.clubic.com/telecharger-fiche44888-pocketcaprice.html]&lt;br /&gt;
| 0.9&lt;br /&gt;
| Aug 19, 2007&lt;br /&gt;
| ❌&lt;br /&gt;
| -&lt;br /&gt;
| Freeware&lt;br /&gt;
|-&lt;br /&gt;
| SunOS&lt;br /&gt;
| [[CPCplusplus|CPC++]]&lt;br /&gt;
| [http://bricerive.free.fr/cpc/cpcpp.html]&lt;br /&gt;
| 1.3.0&lt;br /&gt;
| Feb 22, 1997&lt;br /&gt;
| ❌&lt;br /&gt;
| -&lt;br /&gt;
| Shareware💲&lt;br /&gt;
|-&lt;br /&gt;
| Symbian&lt;br /&gt;
| [[S60-CPC|S60-CPC]]&lt;br /&gt;
| [http://kokak.free.fr/s60cpc.htm]&lt;br /&gt;
| 0.74&lt;br /&gt;
| Feb 21, 2006&lt;br /&gt;
| ❌&lt;br /&gt;
| -&lt;br /&gt;
| Open source&lt;br /&gt;
|-&lt;br /&gt;
| Windows 9x&lt;br /&gt;
| [[CPC-em|CPC-em]] &lt;br /&gt;
| [http://cpc-em.emuunlim.com/]&lt;br /&gt;
| 0.3&lt;br /&gt;
| Jan 22, 2004&lt;br /&gt;
| ❌&lt;br /&gt;
| -&lt;br /&gt;
| Open source&lt;br /&gt;
|-&lt;br /&gt;
| Windows 9x&lt;br /&gt;
| [[MTMW|MTMW]]&lt;br /&gt;
| [https://cpcrulez.fr/emulateurs_download-WIN-MTMW.htm]&lt;br /&gt;
| 1.30B&lt;br /&gt;
| Jan 11, 2000&lt;br /&gt;
| ✅&lt;br /&gt;
| [[ZX Spectrum]], [[ZX80/81]], [[Enterprise]], [[Jupiter ACE]]&lt;br /&gt;
| Freeware&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Other Platforms =&lt;br /&gt;
&lt;br /&gt;
=== Home Consoles ===&lt;br /&gt;
&lt;br /&gt;
You can use [https://www.retroarch.com/index.php?page=platforms RetroArch] for Amstrad CPC emulation on '''Apple TV, Android TV, Nvidia Shield, Steam Link, Xbox One, Xbox Series, PS2, PS Vita TV, GameCube, Wii, Wii U and Switch'''. Or you can use these stand-alone CPC emulators:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable sortable&amp;quot;&lt;br /&gt;
! Host system&lt;br /&gt;
! Emulator name&lt;br /&gt;
! External link&lt;br /&gt;
! Current version&lt;br /&gt;
! Latest release&lt;br /&gt;
! Amstrad Plus&lt;br /&gt;
! Also emulates&lt;br /&gt;
! License&lt;br /&gt;
|-&lt;br /&gt;
| Microsoft XBOX&lt;br /&gt;
| [[Arnold|ArnoldX]]&lt;br /&gt;
| [https://web.archive.org/web/20120705163939/http://forums.xbox-scene.com/index.php?showtopic=711667] [https://cpcrulez.fr/emulateurs_download-XBOX-ARNOLDX.htm]&lt;br /&gt;
| v5&lt;br /&gt;
| Apr 20, 2010&lt;br /&gt;
| ✅&lt;br /&gt;
| -&lt;br /&gt;
| Freeware&lt;br /&gt;
|-&lt;br /&gt;
| Microsoft XBOX&lt;br /&gt;
| [[CoinOPS|CoinOPS (RetroFE)]]&lt;br /&gt;
| [https://web.archive.org/web/20160518183115/https://coinopsproject.freeforums.org/viewtopic.php?f=0&amp;amp;t=1213]&lt;br /&gt;
| 5&lt;br /&gt;
| Oct 18, 2012&lt;br /&gt;
| ❌&lt;br /&gt;
| Tons of vintage computers, game consoles and arcade systems&lt;br /&gt;
| Freeware&lt;br /&gt;
|-&lt;br /&gt;
| Microsoft Xbox 360&lt;br /&gt;
| [[XNACPC|XNACPC]]&lt;br /&gt;
| [http://www.gavpugh.com/2011/11/11/xnacpc-xbox-360-amstrad-cpc-emulator-released/]&lt;br /&gt;
| 1.0&lt;br /&gt;
| Nov 11, 2011&lt;br /&gt;
| ❌&lt;br /&gt;
| -&lt;br /&gt;
| Open source&lt;br /&gt;
|-&lt;br /&gt;
| Nintendo Wii&lt;br /&gt;
| [[Wiituka|Wiituka]]&lt;br /&gt;
| [http://wiituka.dantoine.org/]&lt;br /&gt;
| 0.98.8&lt;br /&gt;
| May 15, 2009&lt;br /&gt;
| ❌&lt;br /&gt;
| -&lt;br /&gt;
| Open source&lt;br /&gt;
|-&lt;br /&gt;
| Sega Dreamcast&lt;br /&gt;
| [[CPCast|CPCast]]&lt;br /&gt;
| [http://www.dcemu.co.uk/vbulletin/showthread.php?t=24100]&lt;br /&gt;
| &lt;br /&gt;
| May 6, 2006&lt;br /&gt;
| ❌&lt;br /&gt;
| -&lt;br /&gt;
| Freeware&lt;br /&gt;
|-&lt;br /&gt;
| Sega Dreamcast&lt;br /&gt;
| [[DreamCPC|DreamCPC]]&lt;br /&gt;
| [https://www.jm1200.fr/index.php?r=2]&lt;br /&gt;
| Alpha 3&lt;br /&gt;
| Oct 16, 2005&lt;br /&gt;
| ❌&lt;br /&gt;
| -&lt;br /&gt;
| Freeware&lt;br /&gt;
|-&lt;br /&gt;
| Sony PS2&lt;br /&gt;
| [[CPC-em|CPC-em]]&lt;br /&gt;
| [https://cpcrulez.fr/emulateurs_download-ps2-CPC-EM.htm]&lt;br /&gt;
| 0.4&lt;br /&gt;
| Dec 22, 2004&lt;br /&gt;
| ❌&lt;br /&gt;
| -&lt;br /&gt;
| Freeware&lt;br /&gt;
|-&lt;br /&gt;
| Sony PS3&lt;br /&gt;
| [[Caprice32|Caprice32]]&lt;br /&gt;
| [https://web.archive.org/web/20171003153204/http://psx-scene.com/forums/content/caprice32-4-1-0-dbg-emulator-ps3-2119/]&lt;br /&gt;
| 4.1.0 DBG&lt;br /&gt;
| Apr 9, 2012&lt;br /&gt;
| ❌&lt;br /&gt;
| -&lt;br /&gt;
| Open source&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Handheld Consoles ===&lt;br /&gt;
&lt;br /&gt;
Note: For Android handheld consoles (Razer Edge, Ayn Odin Pro, Retroid Pocket Flip, GPD XP, ...), see the Mobile/Android section.&lt;br /&gt;
&lt;br /&gt;
You can use [https://www.retroarch.com/index.php?page=platforms RetroArch] for Amstrad CPC emulation on '''PSP, PS Vita, DS, 3DS, Switch, Steam Deck, RetroFW, Miyoo, OpenDingux, [https://muos.dev/systems/computer muOS] and [https://github.com/christianhaitian/arkos/wiki/ArkOS-Emulators-and-Ports-information ArkOS]'''. Or you can use these stand-alone CPC emulators:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable sortable&amp;quot;&lt;br /&gt;
! Host system&lt;br /&gt;
! Emulator name&lt;br /&gt;
! External link&lt;br /&gt;
! Current version&lt;br /&gt;
! Latest release&lt;br /&gt;
! Amstrad Plus&lt;br /&gt;
! Also emulates&lt;br /&gt;
! License&lt;br /&gt;
|-&lt;br /&gt;
| Dingoo A320 / A330&lt;br /&gt;
| [[Pituka|Pituka Dingux]]&lt;br /&gt;
| [http://david.dantoine.org/proyecto/4/]&lt;br /&gt;
| 0.8pre&lt;br /&gt;
| Aug 19, 2010&lt;br /&gt;
| ❌&lt;br /&gt;
| -&lt;br /&gt;
| Open source&lt;br /&gt;
|-&lt;br /&gt;
| Dingoo A320 / A330&lt;br /&gt;
| [[Caprice|Dingux-CAP32]]&lt;br /&gt;
| [http://zx81.zx81.free.fr/serendipity/index.php?/categories/105-Amstrad/]&lt;br /&gt;
| 1.1.2&lt;br /&gt;
| Oct 17, 2009&lt;br /&gt;
| ❌&lt;br /&gt;
| -&lt;br /&gt;
| Open source&lt;br /&gt;
|-&lt;br /&gt;
| GamePark Caanoo&lt;br /&gt;
| [[Caprice|Caanoo-CAP32]]&lt;br /&gt;
| [http://zx81.zx81.free.fr/serendipity/index.php?/categories/165-Amstrad/]&lt;br /&gt;
| 1.1.3&lt;br /&gt;
| Apr 24, 2011&lt;br /&gt;
| ❌&lt;br /&gt;
| -&lt;br /&gt;
| Open source&lt;br /&gt;
|-&lt;br /&gt;
| GamePark GP2x&lt;br /&gt;
| [[Caprice|CapriceGP2x]]&lt;br /&gt;
| [https://web.archive.org/web/20130315195529/http://wiki.gp2x.org/wiki/CapriceGP2x]&lt;br /&gt;
| 0.5&lt;br /&gt;
| Feb 22, 2006&lt;br /&gt;
| ❌&lt;br /&gt;
| -&lt;br /&gt;
| Open source&lt;br /&gt;
|-&lt;br /&gt;
| GamePark GP2x&lt;br /&gt;
| [[Caprice|GP2X-CAP32]]&lt;br /&gt;
| [http://zx81.zx81.free.fr/serendipity/index.php?/categories/42-Amstrad/]&lt;br /&gt;
| 1.5.1&lt;br /&gt;
| Aug 29, 2009&lt;br /&gt;
| ❌&lt;br /&gt;
| -&lt;br /&gt;
| Open source&lt;br /&gt;
|-&lt;br /&gt;
| GamePark GP32&lt;br /&gt;
| [[Pituka|Pituka GP32]]&lt;br /&gt;
| [http://david.dantoine.org/proyecto/4/]&lt;br /&gt;
| 1d&lt;br /&gt;
| May 15, 2010&lt;br /&gt;
| ❌&lt;br /&gt;
| -&lt;br /&gt;
| Open source&lt;br /&gt;
|-&lt;br /&gt;
| GamePark Wiz&lt;br /&gt;
| [[Caprice|Wiz-CAP32]]&lt;br /&gt;
| [http://zx81.zx81.free.fr/serendipity/index.php?/categories/89-Amstrad/]&lt;br /&gt;
| 1.1.0&lt;br /&gt;
| Aug 29, 2009&lt;br /&gt;
| ❌&lt;br /&gt;
| -&lt;br /&gt;
| Open source&lt;br /&gt;
|-&lt;br /&gt;
| GCW Zero&lt;br /&gt;
| [[Caprice|Dingux-CAP32]]&lt;br /&gt;
| [https://github.com/kerheol/dingux-cap32]&lt;br /&gt;
| 1.1.2&lt;br /&gt;
| May 25, 2014&lt;br /&gt;
| ❌&lt;br /&gt;
| -&lt;br /&gt;
| Open source&lt;br /&gt;
|-&lt;br /&gt;
| JXD S5110 / S601 &amp;amp; Yinlips G18&lt;br /&gt;
| [[Caprice|JXD-CAP32]]&lt;br /&gt;
| [http://zx81.zx81.free.fr/serendipity/index.php?/categories/206-Amstrad/]&lt;br /&gt;
| 1.1.1&lt;br /&gt;
| Oct 27, 2012&lt;br /&gt;
| ❌&lt;br /&gt;
| -&lt;br /&gt;
| Open source&lt;br /&gt;
|-&lt;br /&gt;
| Nintendo DS&lt;br /&gt;
| [[AmeDS|AmeDS]] &lt;br /&gt;
| [https://web.archive.org/web/20131021073302/http://www.portabledev.com/pages/ds/jeuxdev.-perso/ameds.php]&lt;br /&gt;
| 4.0&lt;br /&gt;
| Apr 25, 2010&lt;br /&gt;
| ❌&lt;br /&gt;
| -&lt;br /&gt;
| Freeware&lt;br /&gt;
|-&lt;br /&gt;
| Nintendo DS&lt;br /&gt;
| [[CrocoDS|CrocoDS]]&lt;br /&gt;
| [http://www.kyuran.be/blog/2007/11/09/crocods-20-2/] [https://github.com/redbug26/crocods-nds Repo]&lt;br /&gt;
| 2.0&lt;br /&gt;
| Nov 9, 2007&lt;br /&gt;
| ❌&lt;br /&gt;
| -&lt;br /&gt;
| Open source&lt;br /&gt;
|-&lt;br /&gt;
| Nintendo GameBoy Advance&lt;br /&gt;
| [[Mini Amstrad Emulator|Mini Amstrad Emulator]] &lt;br /&gt;
| [https://playeradvance.org/forum/showthread.php?t=765]&lt;br /&gt;
| &lt;br /&gt;
| Dec 26, 2005&lt;br /&gt;
| ❌&lt;br /&gt;
| -&lt;br /&gt;
| Open source&lt;br /&gt;
|-&lt;br /&gt;
| Odroid GO&lt;br /&gt;
| [[CapriceESP32|CapriceESP32]] &lt;br /&gt;
| [https://github.com/grantrismo/CapriceESP32]&lt;br /&gt;
| &lt;br /&gt;
| Dec 3, 2020&lt;br /&gt;
| ❌&lt;br /&gt;
| -&lt;br /&gt;
| Open source&lt;br /&gt;
|-&lt;br /&gt;
| OpenDingux&lt;br /&gt;
| [[CrocoDS|CrocoDS]]&lt;br /&gt;
| [https://crazypiri.eu/crocods/] [https://github.com/redbug26/crocods Repo]&lt;br /&gt;
| &lt;br /&gt;
| Jan 15, 2020&lt;br /&gt;
| ❌&lt;br /&gt;
| -&lt;br /&gt;
| Open source&lt;br /&gt;
|-&lt;br /&gt;
| Pandora&lt;br /&gt;
| [[Caprice|Pandora-CAP32]]&lt;br /&gt;
| [http://zx81.zx81.free.fr/serendipity/index.php?/categories/131-Amstrad/]&lt;br /&gt;
| 1.1.0&lt;br /&gt;
| Jun 27, 2010&lt;br /&gt;
| ❌&lt;br /&gt;
| -&lt;br /&gt;
| Open source&lt;br /&gt;
|-&lt;br /&gt;
| Sony PSP&lt;br /&gt;
| [[Caprice32 PSP]]&lt;br /&gt;
| [http://psp.akop.org/caprice32]&lt;br /&gt;
| 4.2.0.2&lt;br /&gt;
| Nov 28, 2007&lt;br /&gt;
| ❌&lt;br /&gt;
| -&lt;br /&gt;
| Open source&lt;br /&gt;
|-&lt;br /&gt;
| Sony PSP&lt;br /&gt;
| [[CPCPSP|CPCPSP]]&lt;br /&gt;
| [https://web.archive.org/web/20130325143915/http://dl.qj.net/psp/emulators/cpcpsp-v01.html]&lt;br /&gt;
| 0.1&lt;br /&gt;
| Dec 24, 2005&lt;br /&gt;
| ❌&lt;br /&gt;
| -&lt;br /&gt;
| Freeware&lt;br /&gt;
|-&lt;br /&gt;
| Sony PSP&lt;br /&gt;
| [[PSPCAP32|PSPCAP32]]&lt;br /&gt;
| [http://zx81.zx81.free.fr/serendipity/index.php?/categories/3-Amstrad/]&lt;br /&gt;
| 1.5.1&lt;br /&gt;
| Aug 21, 2009&lt;br /&gt;
| ❌&lt;br /&gt;
| -&lt;br /&gt;
| Open source&lt;br /&gt;
|-&lt;br /&gt;
| Trimui Model S&lt;br /&gt;
| [[Arnold|Arnold Trimui]]&lt;br /&gt;
| [https://github.com/liartes/arnold_gcw0]&lt;br /&gt;
| &lt;br /&gt;
| Oct 19, 2021&lt;br /&gt;
| ✅&lt;br /&gt;
| -&lt;br /&gt;
| Open source&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== FPGA ===&lt;br /&gt;
&lt;br /&gt;
*[[CPC TREX|CPC TREX]] [[C-ONE|CPC-One]] TurboCPC core by TobiFlex running on different FPGA boards&lt;br /&gt;
*[http://ralferoo.blogspot.fr/ CPC FPGA] CPC emulation by Ranulf (Ralferoo) Doswell, running on a custom made FPGA board&lt;br /&gt;
*[[FPGAmstrad|FPGAmstrad]] [https://github.com/renaudhelias/CoreAmstrad CoreAmstrad] [https://github.com/mist-devel/mist-board/wiki/CoreDocAmstrad CoreDocAmstrad] Translation by Renaud (Freemac) Hélias of JavaCPC from Java into VHDL for MiST board&lt;br /&gt;
*[https://github.com/sorgelig/Amstrad_MiST CPC for MiST and MiSTer] Started by Alexey (Sorgelig) Melnikov as a port of CoreAmstrad, but every module has been either rewritten or replaced&lt;br /&gt;
*[https://web.archive.org/web/20230330082645/https://intelligenttoasters.blog/cpc2-project-index/ CPC2 Project] CPC emulation running on a Cyclone V FPGA board&lt;br /&gt;
*[https://github.com/ZXMicroJack/amstrad-cpc AmstradCPC core] Based on McLeod's core and running on a ZXTres FPGA board&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Upcoming =&lt;br /&gt;
&lt;br /&gt;
Amstrad CPC support is in the works for [https://github.com/TASEmulators/BizHawk BizHawk] and [https://bostjan-grandovec.si/Content/Pantheon.htm Pantheon].&lt;br /&gt;
&lt;br /&gt;
Pure speculation but it would make sense that [https://web.libretro.com/ RetroArch Online] and [https://ares-emu.net/ Ares] add Amstrad CPC support.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Hardware Replacements =&lt;br /&gt;
&lt;br /&gt;
*[https://youtu.be/DykFhtNbgGk Just CPC4ATX] [https://www.sellmyretro.com/offer/details/60734] [https://memoryfull.net/party.php?id=240 CPC-ITX triple CRTC] CPC clones made from NOS chips&lt;br /&gt;
*[https://github.com/Bread80/CPCModular CPC Modular] Modular Amstrad CPC compatible computer&lt;br /&gt;
*[https://makerworld.com/fr/models/821842#profileId-765034 Amstrad CPC464 mini] [https://github.com/Board-Folk/CPC464-2MINI CPC464-2mini] Miniaturised CPCs&lt;br /&gt;
*[https://hackaday.io/project/187051-the-amstrad-cpc-portable Amstrad CPC Portable] World's first battery-powered portable Amstrad CPC &lt;br /&gt;
*[https://www.tindie.com/search/?q=amstrad+replica+pcb CPC 464/6128 replica PCBs] To be used as a direct replacement to the original PCBs&lt;br /&gt;
*[https://github.com/EremusOne/CPCESP_alpha CPCESP] [https://github.com/rpsubc8/ESP32TinyCPC/ ESP32 TinyCPC] CPC emulators for ESP32 SoC board&lt;br /&gt;
*[https://www.symbos.org/symbosvm.htm SymbOSVM] SymbOS for modern 32/64bit hardware&lt;br /&gt;
&lt;br /&gt;
=== Chips ===&lt;br /&gt;
&lt;br /&gt;
*[https://github.com/MicroCoreLabs/Projects MCLZ8] [https://github.com/rejunity/z80-open-silicon z80-open-silicon] Z80 emulators to be used as drop-in replacement&lt;br /&gt;
*[https://github.com/nukeykt/Nuked-MD-FPGA/blob/main/z80.v Nuked-MD-FPGA] [https://github.com/gdevic/A-Z80 A-Z80] Verilog Z80 implementations reverse engineered from decapped chip&lt;br /&gt;
*[https://github.com/floooh/v6502r Visual Z80 Remix] [https://github.com/gdevic/Z80Explorer Z80 Explorer] Netlist-level ultra accurate Z80 simulators&lt;br /&gt;
*[https://www.cpcwiki.eu/forum/amstrad-cpc-hardware/gate-array-decapped! Forum thread] Reverse engineered Gate Array by Gerald from decapped chips [https://pastebin.com/ZQyL68Hv Ash Evans] [https://github.com/MiSTer-devel/Amstrad_MiSTer/tree/master/rtl/GA40010 Gyorgy Szombathelyi] [https://github.com/codedchip/AMSGateArray AMSGateArray] Subsequent Verilog/VHDL implementations [https://bread80.com/2021/06/03/understanding-the-amstrad-cpc-video-ram-and-gate-array-subsystem/ Signals analysis by Bread80]&lt;br /&gt;
*[https://www.sintech-shop.de/en/retro-commodore-sinclair-atari-etc/amstrad/cpc/hardware Sintech hardware replacements] Gate Array emulator chips and keyboard membranes&lt;br /&gt;
*[https://lotharek.pl/productdetail.php?id=408 AY_FPGA] AY-3-8912 FPGA replacement with few extra features&lt;br /&gt;
*[https://k3pi.chickenkiller.com/dzi/ ASIC and Pre-ASIC] [https://www.cpcwiki.eu/forum/amstrad-cpc-hardware/gate-array-decapped!/msg133264/#msg133264 Gate Array] [https://siliconpr0n.org/map/zilog/z0840008psc-z80cpu/ Z80 CPU] [https://www.seanriddle.com/6845/ HD6845SP CRTC] [http://seanriddledecap.blogspot.com/2023/12/blog-post_31.html AY-3-8912 PSG] [http://seanriddledecap.blogspot.com/2017/01/blog-post_42.html NEC D765 FDC] [https://www.pastraiser.com/pictures/8255/layers/Total.png 8255 PPI] Die shots of decapped CPC chips&lt;br /&gt;
*[https://github.com/veniamin-ilmer/decoding_rom Optically decode the ROM of a decapped chip] [https://github.com/travisgoodspeed/gbrom-tutorial Automate ROM decoding] [https://c128.se/posts/silicon-adventures/ Decap, image and reverse engineer the C128 PLA chip] [https://youtu.be/r8Vq5NV4Ens How I reverse engineer a chip] [https://youtu.be/KohIewYHHMY Looking at silicon] Tutorials&lt;br /&gt;
*[https://thecheshirec.at/2023/11/21/5-multi-crtcs-a-vendre/ Multi-CRTC Board] [https://www.pcbway.com/project/shareproject/multi_crtc_selector_for_amstrad_cpc_464_664_6128_2ca49a09.html Multi-CRTC Selector] Host and select between multiple CRTC chip types in one CPC&lt;br /&gt;
&lt;br /&gt;
=== Floppy drives ===&lt;br /&gt;
&lt;br /&gt;
*[[SDiskEmul]] Floppy-drive emulator released in 2007. Abandoned now. Supports DSK, EDSK disk-images&lt;br /&gt;
*[https://hxc2001.com/floppy_drive_emulator/ HxC Floppy Emulator] Commercial floppy-drive emulator. Supports directly DSK, EDSK, HFE disk-images. IPF, CTRAW, SCP disk-images supported through conversion to HFE disk-image [https://hxc2001.com/docs/gotek-floppy-emulator-hxc-firmware/pages/emulation-from-images.html]&lt;br /&gt;
*[https://github.com/keirf/flashfloppy/ FlashFloppy] Open source floppy-drive emulator for the ubiquitous Gotek hardware. Supports DSK, EDSK, HFE disk-images. Can also be bought already built: [https://www.sellmyretro.com/offer/details/zax-drive-sd-63195 Zax Drive SD] [https://www.micomputer.es/en/gotek/390-3856-emulador-usb-gotek.html Micomputer floppy emulator] [https://pixel.rodrik.ch/gotekcpc Gotek CPC 664/6128] [https://pixel.rodrik.ch/gotekcpcplus Gotek 6128 Plus]&lt;br /&gt;
*[https://github.com/keirf/greaseweazle GreaseWeazle] Open source USB floppy adapter Flux reader/writer&lt;br /&gt;
*[https://www.cbmstuff.com/index.php?route=product/product&amp;amp;product_id=52 SuperCard Pro] Claims to be the most advanced flux level copier/imager/converter system&lt;br /&gt;
*[https://kryoflux.com/ KryoFlux] Proprietary floppy adapter Flux reader/writer&lt;br /&gt;
*[https://cpcrulez.fr/forum/viewtopic.php?f=5&amp;amp;t=100&amp;amp;start=690#p55437 Pauline] FPGA-based floppy-drive dumper and emulator&lt;br /&gt;
*[https://lotharek.pl/productdetail.php?id=376 DriveRDY] Emulates the Ready signal necessary for floppy drives on Amstrad machines&lt;br /&gt;
*[https://cpcrulez.fr/hardware-lecteurs_externe-interface_ddi3_usb_floppy_emulator.htm DDI-3] USB floppy-drive emulator including a real FDC chip, floppy data separator and AMSDOS ROM for CPC464. Current evolution [https://www.sellmyretro.com/offer/details/64558 DDI-6] has also integrated a RAM/ROM box&lt;br /&gt;
*[[M4 Board]] Supports DSK, EDSK images in a limited fashion. Protected disks are not supported&lt;br /&gt;
*[[USIFAC]] [[ULIfAC]] Supports DSK, EDSK images in a limited fashion. Protected disks are not supported&lt;br /&gt;
&lt;br /&gt;
=== Tapes ===&lt;br /&gt;
&lt;br /&gt;
*[https://hobbyretro.com/en/retro/tzxduino TZXduino] [https://ultimatemister.com/product/ultimate-maxduino-pro/ MAXduino] [https://www.cpcwiki.eu/forum/amstrad-cpc-hardware/abatape-my-contribution-to-tape-lovers/ Abatape] Arduino-based tape deck emulator. Supports many formats of tape-images including CDT and TZX&lt;br /&gt;
*[https://youtu.be/j4__v6ojPt0 SVI-CAS] Digital Tape Drive for Playback &amp;amp; Recording. Supports many formats of tape-images including CDT and TZX&lt;br /&gt;
*[https://retrowiki.es/viewtopic.php?t=200032717 TapeRider] TZX/CDT tape-images player for Android&lt;br /&gt;
*[https://chrome.google.com/webstore/detail/tapdancer/fcibbcbgbeioacfcnfgjianglchlcokh tapDancer] [https://web.archive.org/web/20160110003844/http://tapdancer.info/] Chrome and Android app that plays back many formats of tape-images including CDT and TZX&lt;br /&gt;
*[https://pelrun.github.io/PlayUEF/ PlayUEF] [https://pelrun.github.io/PlayUEF/PlayUEF.html Online version including Pelrun's CDT collection] Web-browser based tape deck emulator, supporting CDT/TZX/UEF tape-images&lt;br /&gt;
*[https://cdtplayer.hypha.ws/ Hypha's CDT collection and player] Web-browser based cdt/wav/flac/mp3 player&lt;br /&gt;
&lt;br /&gt;
=== Cartridges ===&lt;br /&gt;
&lt;br /&gt;
*[https://github.com/f1ac0/CPC-plus-cartridge CPC-plus-cartridge] Different PCB designs and code to make a CPC-plus cartridge&lt;br /&gt;
*[https://github.com/zeus074/Amstrad_Multicart Amstrad Multicart] 16-in-1 cartridge for the GX4000 or Amstrad Plus computer&lt;br /&gt;
*[https://cpcrulez.fr/hardware-interface_ROM-gx4000_homebrew_player.htm GX4000 Homebrew Player] [https://cpcrulez.fr/hardware-interface_ROM-gx4000_homebrew_player-32_in_one.htm CPC+ 32-in-one multigames] by Retroelectronik&lt;br /&gt;
*[[CPC_GX4000-Multi_EPROM_Cartridge|Multi-EPROM cartridge]] for CPC+/GX4000&lt;br /&gt;
*[[Multi Cartridge 8 ROMs]] by ETO, for GX4000 / Amstrad Plus&lt;br /&gt;
*[[C4CPC]] Cartridge replacement for the Amstrad Plus range and the GX4000&lt;br /&gt;
*[https://overange.weebly.com/amstrad-gx4000-cpc-464-6128-plus-reflashable-flash-cartridge.html Flash+ cartridge] [https://youtu.be/UDaw-nd4L9c Youtube] Amstrad CPC+ GX4000 reflashable cartridge&lt;br /&gt;
*[https://store.backbit.io/product/backbit-pro/ BackBit Pro] [https://youtu.be/tI2wkelVzyw Tutorial] Universal instant loading cartridge&lt;br /&gt;
*[[Cartridge Emulator]] Part of the [[Amsteam]] online service&lt;br /&gt;
*[[M4 Board]] Supports CPR cartridges, among many other features&lt;br /&gt;
&lt;br /&gt;
=== Printers ===&lt;br /&gt;
&lt;br /&gt;
*[https://www.cpcwiki.eu/forum/amstrad-cpc-hardware/acpcpe-amstrad-cpc-printer-emulator-(diy)/ Amstrad CPC Printer Emulator] [https://github.com/lgv2018/ACPCPE] Arduino-based CPC printer emulator that can output text, markdown or HTML&lt;br /&gt;
*[https://www.retroprinter.com/ Retro-Printer] Plugin module for the Raspberry Pi that makes it possible to connect retro computers to modern USB or network printers&lt;br /&gt;
*[https://github.com/nzeemin/escparser ESCParser] Command-line utility, ESC/P printer emulator that can output PostScript, SVG or PDF&lt;br /&gt;
&lt;br /&gt;
=== Other ===&lt;br /&gt;
&lt;br /&gt;
*[https://simonowen.com/spectrum/lenskey/ LensKey] LensLok copy-protection decoder for Windows&lt;br /&gt;
*[https://github.com/ArcherEG/CPCPS2Firmware CPCPS2 Keyboard Firmware] Emulates the keyboard matrix of Amstrad CPC using modern hardware&lt;br /&gt;
*[https://sindenlightgun.com/ Sinden Lightgun] LCD-compatible lightgun&lt;br /&gt;
*[https://github.com/grzegorz-gr/vga4cpc vga4cpc] VGA output for Amstrad CPC based on Raspberry Pi Pico&lt;br /&gt;
*[https://pixel.rodrik.ch/mp2fj MP2F-J] [https://pixel.rodrik.ch/mp2p MP-2 Plus] Evolution of the [[Amstrad MP1/MP2 modulator|Amstrad MP-2F]] modulator&lt;br /&gt;
*[https://xn--multipli-i1a.fr/minimit/ Minimit] To connect your [[Minitel]] to servers as the PSTN has been retired&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Peripherals supported in emulators =&lt;br /&gt;
&lt;br /&gt;
Note: The [[RSF3]] is mentioned in multiple places in the following list as, besides its native functionalities, it also emulates the [[M4 Board]], the [[Symbiface II]], etc...&lt;br /&gt;
&lt;br /&gt;
=== Mass storage devices ===&lt;br /&gt;
&lt;br /&gt;
*[[Dobbertin Harddisc]] or compatible ([[RSF3]]) is emulated by MAME and CPCemu.&lt;br /&gt;
*[[UIDE Universal IDE adapter cards for Z-80 computers|uIDE]] is emulated by Arnold&lt;br /&gt;
*[[Symbiface II]] IDE/PATA interface or compatible ([[X-Mass]], [https://github.com/salafek/cyboard-for-cpc Cyboard], [[RSF3]]) is emulated by ACE, ACE-DL, Caprice Forever, MAME, WinAPE, WinCPC, Arnold, Virtual CPC&lt;br /&gt;
*[[Albireo]] is partially emulated (mass storage only and no direct sector) by ACE, ACE-DL, Caprice Forever&lt;br /&gt;
*[[M4 Board]] or compatible ([[RSF3]]) is emulated by CPCemu&lt;br /&gt;
*[[Vortex Winchester Drive]], [[IDE8255|Yarek's IDE8255]], [[IDE/8255|RPalmer's IDE/8255]], [[ULIfAC]], [[RSF3|RSF3 native]], [https://hxc2001.com/download/floppy_drive_emulator/SDCard_HxC_Floppy_Emulator_Direct_Access_mode.pdf Gotek direct access mode] are not supported&lt;br /&gt;
&lt;br /&gt;
=== Real Time Clock ===&lt;br /&gt;
&lt;br /&gt;
*[[Dobbertin Smart Watch]] or compatible ([[Dobbertin Smart Watch|DXS RTC]]) is emulated by MAME, WinAPE&lt;br /&gt;
*[[Symbiface II]] RTC or compatible ([https://github.com/salafek/cyboard-for-cpc Cyboard], [[RSF3]]) is emulated by ACE-DL, MAME, WinAPE, WinCPC&lt;br /&gt;
*[[Nova]] is emulated by ACE, ACE-DL&lt;br /&gt;
*[[M4 Board]] NTP is emulated by CPCemu&lt;br /&gt;
*[[Dk'tronics Real Time Clock]], [[RSF3|RSF3 native]], [https://github.com/lambdamikel/LambdaSpeak3 LambdaSpeak RTC] and [[URTC-8 Universal RTC for Z80 computers|uRTC-8]] are not supported&lt;br /&gt;
&lt;br /&gt;
=== Network devices ===&lt;br /&gt;
&lt;br /&gt;
There is a plethora of serial communication devices (using [[RS232]], USB, Modem, Minitel, [[CB radio]], [[Virtual Net 96]], etc...) on Amstrad CPC:&lt;br /&gt;
* [[Amstrad Serial Interface|Amstrad/Pace RS232 Serial Port]] is emulated by MAME&lt;br /&gt;
* Other devices are not supported&lt;br /&gt;
&lt;br /&gt;
Higher-level Ethernet or TCP/IP network devices are less common:&lt;br /&gt;
* [[M4 Board]] Wifi or compatible ([[RSF3]]) is emulated by CPCemu&lt;br /&gt;
* [[CPC-ENet]], [https://github.com/salafek/Net4CPC/ Net4CPC], [[RSF3|RSF3 native]], [https://cpcrulez.fr/forum/viewtopic.php?t=6886 TMTNET], [[FujiNet]] are not supported&lt;br /&gt;
&lt;br /&gt;
=== Audio devices ===&lt;br /&gt;
&lt;br /&gt;
*[[Amstrad SSA-1 Speech Synthesizer|SSA-1 speech synthesizer]] is emulated by ACE, ACE-DL, Caprice Forever, JavaCPC, MAME&lt;br /&gt;
*[[Dk'tronics Speech Synthesizer|Dk'Tronics speech synthesizer]] is emulated by ACE, ACE-DL, Caprice Forever, JavaCPC, MAME&lt;br /&gt;
*[[TMPI speech synthesizer|Techni-Musique speech synthesizer]] is emulated by ACE, ACE-DL, Caprice Forever&lt;br /&gt;
*[[Amdrum]] is emulated by ACE, ACE-DL, JavaCPC, MAME, WinAPE&lt;br /&gt;
*[[Digiblaster]] is emulated by ACE, ACE-DL, Caprice Forever, JavaCPC, MAME, WinAPE, WinCPC, CPCEC, CPCEPower, Virtual CPC&lt;br /&gt;
*[[PlayCity]] is fully emulated by ACE, ACE-DL, MAME, Arnold, SugarBox. It is partially emulated (no CTC) by Caprice Forever, JavaCPC, CPCEC&lt;br /&gt;
*[[Play2CPC]] is partially emulated (no FM and no digidrums) by ACE, ACE-DL&lt;br /&gt;
*[[Willy|Willy OPL3]] is emulated by ACE, ACE-DL&lt;br /&gt;
*[[Willy|Willy MIDI]] is emulated by ACE (software synth emulation on Haiku, MIDI OUT support on MorphOS)&lt;br /&gt;
*[[Music Machine]], [[EMR MIDI Interface]], [https://github.com/lambdamikel/BluePillCPC Ultimate MIDI Board], [[Symbiface 3|Symbiface 3 buzzer]], [[RSF3|RSF3 SID]], [https://github.com/lambdamikel/Speak-SID Speak&amp;amp;SID], [https://github.com/lambdamikel/LambdaSpeak3 LambdaSpeak], [https://youtu.be/kahDREIaOog Amsdap MoonSound], Amsdap SE-One ([https://youtu.be/3xEyNQA6Weg MP3 player] / [https://youtu.be/vvlGBS3nNiY FM radio]), [https://www.amibay.com/threads/cpcradio-fm-radio-receiver-module.2446509/ CPC Radio], [https://www.gitlab.com/doragasu/romba/ Romba], [[CPC Booster]] are not supported&lt;br /&gt;
&lt;br /&gt;
Note: the [[RSF3]] is actually the best soundcard available for Amstrad CPC, supporting Digiblaster [https://youtu.be/rXqbQp9WKJc Source], Amdrum [https://youtu.be/Ken5KxYXv5c Source], EMR MIDI Interface [https://youtu.be/YOjV9AaIVKM Source1] [https://youtu.be/WQdV7UmeuPk Source2], Speech synthesis [https://youtu.be/vb-v98m_g0g Source], SID soundchip [https://youtu.be/_LWbnjvXN4g Source], a lot of music file formats (AAC, MP3, MP4, M4A, WMA, WAV, MID, OGG) [https://youtu.be/4f5lvXV_vWM Source] and even Webradios [https://youtu.be/PeVsdNtsOW4 Source].&lt;br /&gt;
&lt;br /&gt;
=== Graphics devices ===&lt;br /&gt;
&lt;br /&gt;
[https://youtu.be/plQf9_7zPSA AMSDAP V9990] graphics card is supported by CPCemu.&lt;br /&gt;
&lt;br /&gt;
[https://thecheshirec.at/category/8bits/amstrad-cpc/crtc/crtc5/ CRTC Type 5] is not supported.&lt;br /&gt;
&lt;br /&gt;
CPC graphics acquisition devices ([[Dart Scanner for DMP-Printers|Dart Scanner]], [[VIDI digitizer]], [[ARA Video Digitizer|Digitaliseur Ara]]) are not supported.&lt;br /&gt;
&lt;br /&gt;
CPC printers are poorly supported. The only emulators that at least do some print rendering emulation are JavaCPC and Caprice Forever.&lt;br /&gt;
&lt;br /&gt;
=== Input devices ===&lt;br /&gt;
&lt;br /&gt;
Some lightguns / lightpens are emulated by ACE, ACE-DL, Caprice Forever, JavaCPC, CPCEC, CPCEPower, Virtual CPC, PC-CPC, Wiituka.&lt;br /&gt;
&lt;br /&gt;
CPC mouse support is as follows:&lt;br /&gt;
*[[AMX Mouse|AMX mouse (1-bit axis, 3 buttons (CPC) / 2 buttons (CPC+))]] or compatible ([https://imperium.spinpoint.org/ Imperium Solo], [https://github.com/f1ac0/Dual-USB-Controller-adapter-CPC Dual USB Controller], [[Dk'tronics Mouse Interface|Dk'Tronics Genius adapter]], [https://cpcrulez.fr/hardware_montage_8x-geos-mouse_am_joystick-port.htm DIY GEOS adapter], [[Atari-ST mouse adapter]], [[PS2Mouse]], [[Marconi|Marconi Trackerball]]) is emulated by ACE, ACE-DL, Caprice Forever, WinAPE, Arnold, Virtual CPC, CPCemu, Retro Virtual Machine&lt;br /&gt;
*[[Kempston Mouse|Kempston mouse (8-bit axis, 2 buttons)]] is emulated by ACE, ACE-DL, Arnold&lt;br /&gt;
*[[CPC-Mousepack 2.0|Reisware mouse (8-bit axis, 2 buttons)]] is emulated by CPCemu&lt;br /&gt;
*[[Symbiface II|Symbiface II PS/2 mouse (6-bit axis, 5 buttons, scroll wheel)]] or compatible ([https://github.com/salafek/cyboard-for-cpc Cyboard], [[RSF3]]) is emulated by ACE-DL, Caprice Forever, MAME, WinAPE, Arnold, CPCemu&lt;br /&gt;
*[[MultiPlay|MultiPlay Amiga mouse (4-bit axis, 3 buttons)]] is emulated by ACE, ACE-DL, Caprice Forever, JavaCPC, Arnold, Retro Virtual Machine&lt;br /&gt;
*[[Albireo|Albireo USB mouse (8-bit axis, 3 buttons)]], [[RSF3|RSF3 USB native (8-bit axis, 5 buttons, scroll wheel)]], [https://youtu.be/4Rm1psdePbg Imperium Solo USB custom mode (6-bit axis, 3 buttons)] are not supported&lt;br /&gt;
&lt;br /&gt;
=== Hacking devices ===&lt;br /&gt;
&lt;br /&gt;
*[[Multiface II]] is emulated by ACE, ACE-DL, Caprice Forever, JavaCPC, MAME, WinAPE, Arnold&lt;br /&gt;
*[[Hackit|HackIt]] or compatible ([[RSF3]]) is emulated by ACE-DL, Arnold&lt;br /&gt;
*[[Mirage Imager]] is emulated by ACE&lt;br /&gt;
*[[Transtape]] is emulated by MAME&lt;br /&gt;
*[[PDS development system|Programmers Development System]] is emulated by MAME&lt;br /&gt;
*[[Demon Development Cartridge]], [[Action Replay AMX]], [[Disc Wizard]] are not supported&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Rewind feature =&lt;br /&gt;
&lt;br /&gt;
The RetroArch CPC emulator has the most convenient rewind feature: [https://youtu.be/YwilYlSe5LQ Demonstration]. To reverse the game, the user press and hold the rewind button. And at any point, releasing the button makes time goes forward again.&lt;br /&gt;
&lt;br /&gt;
ACE-DL also has a rewind feature, but it is not as good as it could be: [https://youtu.be/wIKGvpnJLUo Demonstration].&lt;br /&gt;
&lt;br /&gt;
One 128KB snapshot per frame allows 10 seconds of rewind with 64MB (128KB * 50 frames * 10 seconds) of memory for the rewind feature. A more efficient method saves only the previous RAM values that are changed between 2 frames, allowing much longer rewinds (even if the CPC is equipped with 4MB RAM expansion) while using less memory, as shown by the GBA emulator [https://youtu.be/Sfc_1NKbiKg SkyEmu].&lt;br /&gt;
&lt;br /&gt;
For step-back debugging, the emulator just needs to store the time when the previous instruction was executed so that he can go back to that instruction. In the same way, emulators can provide access to the previous HBL, IRQ, VBL, etc.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= File format specifications =&lt;br /&gt;
&lt;br /&gt;
*[https://www.cpcwiki.eu/index.php/Format:DSK_disk_image_file_format DSK / EDSK] [https://hxc2001.com/download/floppy_drive_emulator/SDCard_HxC_Floppy_Emulator_HFE_file_format.pdf HFE] [http://info-coach.fr/atari/documents/_mydoc/IPF-Documentation.pdf IPF] [https://www.cpc-power.com/cpcarchives/index.php?page=articles&amp;amp;num=386 CTRAW] [https://www.cbmstuff.com/downloads/scp/scp_image_specs.txt SCP] File formats of disk-image&lt;br /&gt;
*[https://www.cpcwiki.eu/index.php/Format:CDT_tape_image_file_format CDT / TZX] [http://zxds.raxoft.cz/pzx.html PZX] [https://acorn.huininga.nl/pub/unsorted/software/pc/CSW/csw.html CSW] [https://xiph.org/flac/format.html FLAC] [http://soundfile.sapp.org/doc/WaveFormat/ WAV] [http://fileformats.archiveteam.org/wiki/MP3 MP3] File formats of tape-image&lt;br /&gt;
*[https://www.cpcwiki.eu/index.php/Format:CPR_CPC_Plus_cartridge_file_format CPR cartridge] [https://www.cpcwiki.eu/index.php/Format:SNA_snapshot_file_format SNA snapshot] Other file formats used in CPC emulators&lt;br /&gt;
*[https://www.cpcwiki.eu/forum/emulators/javacpc-desktop-available-as-beta!/100/ Official SNR session spec] [https://www.cpcwiki.eu/forum/emulators/playback-format-for-scenes/ Discussion about SNR format] [https://www.cpc-power.com/cpcarchives/index.php?page=articles&amp;amp;num=10 Archive of SNR sessions]&lt;br /&gt;
*[http://leonard.oxg.free.fr/ymformat.html YM] [https://www.cpcwiki.eu/index.php/AYC AYC] [https://www.cpcwiki.eu/index.php/MYM MYM] [https://vgmrips.net/wiki/VGM_Specification VGM] Soundchip logging file formats&lt;br /&gt;
*[https://shaker.logonsystem.eu/sslcsl CSL] Cpc Scripting Language, a macro/scripting system to automate emulators&lt;br /&gt;
*[https://github.com/redbug26/crocods-core/wiki/kcr KCR] Game launching configuration&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Emulation Tools  =&lt;br /&gt;
&lt;br /&gt;
*[http://www.cpcmania.com/news.htm CPCDiskXP] [https://web.archive.org/web/20230602152816/https://cpc-live.com/data/index.php?dir=-tools DiskUtil] [https://github.com/Tom1975/SugarConvDsk SugarConvDsk] [https://github.com/jeromelesaux/dsk DSK] [https://github.com/cpcsdk/idsk iDSK] [https://www.seasip.info/Unix/LibDsk/ Diskette Tools] [https://github.com/cpcitor/dsktools dsktools] [https://github.com/EdouardBERGE/edsktool edsktool] [[ManageDSK|ManageDSK]] [[WriteDSK|WriteDSK]] [https://simonowen.com/samdisk/ SAMdisk] [https://github.com/damieng/DiskImageManager Disk Image Manager] [https://github.com/neuro-sys/sector-cpc sector-cpc] [https://hxc2001.com/download/floppy_drive_emulator/ HxCFloppyEmulator software] [https://github.com/keirf/disk-utilities/ Disk Utilities] [https://github.com/ClaireCheshireCat/dsk-lua dsk-lua] [https://github.com/karmic64/upd765pro upd765pro] [https://github.com/muckypaws/AmstradDSKExplorer Amstrad DSK Explorer] [http://www.shlock.co.uk/Utils/OmniFlop/OmniFlop.htm OmniFlop] [https://github.com/tomas-nestorovic/RIDE RIDE] [https://github.com/cpcsdk/hideur_maikeur Hideur Maikeur] Set of tools about disk-images&lt;br /&gt;
*[http://www.cpcmania.com/news.htm CPCTapeXP] [https://web.archive.org/web/20230602152816/https://cpc-live.com/data/index.php?dir=-tools TapeUtil] [https://github.com/Tom1975/SugarConvTape SugarConvTape] [https://sourceforge.net/projects/cdtmaster/ CDTMaster] [https://cpcrulez.fr/emulateurs_UTIL-CDT-samp2cdt.htm 2CDT/Samp2CDT] [http://cngsoft.no-ip.org/csw2cdt.htm CSW2CDT] [https://cpcrulez.fr/emulateurs_UTIL-CDT-CDT2WAV.htm CDT2WAV] [https://github.com/stripwax/wav2tzx wav2tzx] [https://github.com/raxoft/pzxtools PZXtools] [https://monocrun.com/cpc-tape-to-cdt/ Online Tape to CDT] Set of tools about tape-images&lt;br /&gt;
*[http://www.cpcmania.com/news.htm CPRTools] [https://github.com/reidrac/cpr-tools cpr-tools] [https://github.com/renaudguerin/cpr2bin cpr2bin] [https://problemkaputt.de/no$cart.htm No$cart] [http://amsnet.chez.com/ UniDOS Cartridge Creator] Set of tools about CPR cartridge-images&lt;br /&gt;
*[https://bochs.sourceforge.io/doc/docbook/user/winimage.html WinImage, DiskExplorer, Ultimate Imager] [https://github.com/ProgrammingHobby/CPM_Image-File_Explorer CP/M Image File Explorer] Access and edit hard-drive images&lt;br /&gt;
*[https://colourclash.co.uk/cpc-analyser/ CPC Analyser] [https://imhex.werwolv.net/ ImHex] [https://github.com/cormacj/AmstradCPCRomHacks CPCRomHacks] [https://bitbucket.org/zzarko/runemu/src/main/ RunEmu] Other tools&lt;br /&gt;
*[[WinApe|WinAPE]] [[WinCPC]] [[JavaCPC]] [https://code.google.com/archive/p/cpcsdk/ Caprice Reloaded] [http://www.cpc-power.com/cpcarchives/index.php?page=articles&amp;amp;num=73 Caprice Forever] [[CPCemu]] Emulators with an integrated Z80 Assembler&lt;br /&gt;
&lt;br /&gt;
=== Cross-Platform Development ===&lt;br /&gt;
&lt;br /&gt;
*[https://cpcrulez.fr/coding-crossdev_coding-Java-Z80Assembler.htm Java Z80Assembler] [https://grauw.nl/projects/glass/ Glass] [https://pasmo.speccy.org/ Pasmo] [http://cngsoft.no-ip.org/uz80.htm UZ80] [https://github.com/EdouardBERGE/rasm Rasm] [https://cpcsdk.github.io/rust.cpclib/basm/ BASM] [https://github.com/fragarco/abasm/ ABASM] [https://k1.spdns.de/Develop/Projects/zasm/Distributions/ zasm] [http://www.compilers.de/vasm.html vasm] [https://github.com/z00m128/sjasmplus SjASMPlus] [https://github.com/cpcsdk/cpctools cpctools] [https://github.com/cpcsdk/rust.cpclib cpclib] [https://github.com/cpcsdk/rust.cpclib/tree/master/cpclib-bndbuild bndbuild] [http://julien-nevo.com/disark/ Disark] [https://github.com/santiontanon/mdlz80optimizer MDL] [https://marketplace.visualstudio.com/items?itemName=maziac.asm-code-lens ASM Code Lens] [https://marketplace.visualstudio.com/items?itemName=floooh.vscode-kcide KC IDE] Tools for CPC cross-development in Z80 Assembler&lt;br /&gt;
*[https://sdcc.sourceforge.net SDCC] [https://www.cpcwiki.eu/forum/programming/phrozen-c/msg180715/#msg180715 SDCC vs PhrozenC] [http://www.cpcmania.com/Docs/Programming/SDCC_vs_z88dk_Comparing_size_and_speed.htm  SDCC vs z88dk] [https://z88dk.org/site/ z88dk can be used with SDCC and provides a huge library] [https://ccz80.webcindario.com/ccz80en.html ccz80] [http://norecess.cpcscene.net/phactory.html Phactory] [https://github.com/cpcitor/cpc-dev-tool-chain cpc-dev-tool-chain] [https://lronaldo.github.io/cpctelera/ CPCtelera] [https://github.com/Arnaud6128/wincpctelera WinCPCtelera] Cross-platform CPC development in C&lt;br /&gt;
*[https://github.com/Bread80/Quiche Quiche] [https://lemonspawn.com/turbo-rascal-syntax-error-expected-but-begin/ Turbo Rascal Syntax Error] [https://www.youtube.com/watch?v=NTfnE4kXqt8 CPC demo made with TRSE] [https://www.youtube.com/watch?v=XjnqXiUHekY TRSE CPC tutorial] CPC cross-development in Pascal&lt;br /&gt;
*[https://github.com/KarolS/millfork Millfork] [https://github.com/wiz-lang/wiz Wiz] [https://github.com/davidgiven/cowgol Cowgol] [https://www.mikekohn.net/micro/java_grinder.php Java Grinder] CPC cross-development with other programming languages&lt;br /&gt;
*[https://jonathan-cauldwell.itch.io/multi-platform-arcade-game-designer Multi-Platform Arcade Game Designer] [https://xavisan.itch.io/mpagdgen2 MPAGD Gen2] The most user-friendly Windows tool for creating CPC games&lt;br /&gt;
*[https://vitno.org/2023/09/17/punyinform-a-new-library-for-writing-text-adventures-for-old-computers/ PunyInform] [https://github.com/Utodev/DRC/ DAAD Reborn Compiler] for developing adventure games&lt;br /&gt;
*[https://github.com/danielgaskell/scc SymbOS C Compiler] [http://www.symbos.de/quigs.htm Quigs IDE] SymbOS application development&lt;br /&gt;
*[https://cpcbasic.webcindario.com/CPCBasicEn.html CPC Basic cross-compiler] [https://github.com/benchmarko/CPCBasic CPCBasic Unchained] [https://github.com/benchmarko/LocoBasic LocoBasic] [https://marketplace.visualstudio.com/items?itemName=cebe74.amstrad-basic-helper-vscode Amstrad Basic Helper] [https://github.com/destroyer-dcf/sdkcpc SDKCPC] [https://auamstrad.es/taller/herramientas/ide8bp-portable-para-windows/ IDE 8BP] [https://www.cpcalive.com/cpcalive_en.html CpcAlive] [https://ugbasic.iwashere.eu/ ugBASIC] [https://spotlessmind1975.itch.io/ugbasic-ide ugBASIC IDE] Cross-platform CPC development in BASIC&lt;br /&gt;
*[https://github.com/einar-saukas/ZX0 ZX0] [https://github.com/emmanuel-marty/salvador Salvador] [https://github.com/ClaireCheshireCat/amstrad-cpc-dzx0 ZX0 decompressor in BASIC] [https://www.cpcwiki.eu/forum/programming/new-cruncher-zx0/msg197727/ Comparative study] Compression tools&lt;br /&gt;
&lt;br /&gt;
=== Cross-Platform Art ===&lt;br /&gt;
&lt;br /&gt;
*[https://github.com/EdouardBERGE/convgeneric ConvGeneric] [http://ldeplanque.free.fr/ConvImgCpc/new/ ConvImgCPC] [https://anto80.itch.io/image-to-amstrad-cpc-converter ImgToCpc] [https://github.com/AugustoRuiz/Img2CPC img2cpc] [https://github.com/cpcsdk/rust.cpclib/tree/master/cpclib-imgconverter cpclib-img2cpc] [https://github.com/bignaux/Magick2CPC Magick2CPC] [https://github.com/cpcsdk/gfx2crtc gfx2crtc] [https://www.dadither.com/ DaDither] [https://8bitworkshop.com/dithertron/#sys=cpc.mode0 Online Dithertron] [https://pixsaur.netlify.app/ Pixsaur] [https://github.com/jeromelesaux/martine Martine] [https://www.cpcwiki.eu/forum/applications/splitraster-v3/ Splitraster+] [https://www.pouet.net/prod.php?which=88808 UniPixelViewer] [https://www.youtube.com/watch?v=KBcxPWGmr6Q UniPixelViewer tutorial] Image converters from PC to CPC&lt;br /&gt;
*[http://grafx2.chez.com/ GrafX2] [http://multipaint.kameli.net/ Multipaint] [https://github.com/xmessner/RePAINT RePAINT!] [https://www.octoate.de/2010/09/06/cpcpaint/ CPCPaint] [https://cpcrulez.fr/coding-crossdev_coding-amstrad_cpc_tools_kit.htm Amstrad CPC Tools Kit] [[Retro Game Asset Studio]] [https://cpcrulez.fr/emulateurs_UTIL-GRA-akusprite_editor.htm AkuSprite Editor] [https://github.com/GameDevCodeur/z80Editor Z80Editor] [http://gcajdev.epizy.com/sprite_creator.php Online Sprite Creator] [https://www.aseprite.org/ Aseprite] [https://libresprite.github.io/ LibreSprite] [https://www.mapeditor.org/ Tiled] [https://github.com/Cwiiis/maped/ Maped] [https://logiker.itch.io/amstrad-ascii-exporter Amstrad ASCII Exporter] [https://recoil.sourceforge.net/ RECOIL] Cross-platform CPC graphics art editors and viewers&lt;br /&gt;
*[https://github.com/digital-sound-antiques/vgm-conv vgm-conv] [https://github.com/QuinnPainter/YMtoVGM YMtoVGM] [https://cpcrulez.fr/emulateurs_UTIL-MUSIC-YMCruncher.htm YMcruncher] [https://osdk.org/index.php?page=documentation&amp;amp;subpage=ym2mym Ym2Mym] [https://github.com/EdouardBERGE/wav2ay wav2ay] [https://kichiki.github.io/waon/ WaoN (wav2midi)] [https://cpcrulez.fr/coding-crossdev-music-ym_to_midi.htm YMtoMIDI] Music converters&lt;br /&gt;
*[http://cngsoft.no-ip.org/chipnsfx.htm CHIPNSFX] [https://grimware.org/doku.php/sources/pt3 Vortex Tracker II] [https://github.com/AugustoRuiz/WYZTracker WYZTracker] [https://www.julien-nevo.com/arkostracker/ Arkos Tracker] [https://tildearrow.org/furnace/ Furnace] [https://drsnuggles.github.io/AYSir/ AYSir] [https://aym-js.emaxilde.net AYM.JS] [https://norbertkehrer.github.io/st_player.html Soundtrakker Player in JS] Cross-platform CPC music suites&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Emulators running on the Amstrad CPC =&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable sortable&amp;quot;&lt;br /&gt;
! Emulator name&lt;br /&gt;
! External link&lt;br /&gt;
! Current version&lt;br /&gt;
! Latest release&lt;br /&gt;
! License&lt;br /&gt;
! Emulates&lt;br /&gt;
|-&lt;br /&gt;
| [[Amstrad BBC BASIC]]&lt;br /&gt;
| [https://www.cpc-power.com/index.php?page=detail&amp;amp;num=9862]&lt;br /&gt;
| 2.30&lt;br /&gt;
| Apr 2, 1986&lt;br /&gt;
| Commercial💲&lt;br /&gt;
| [[BBC BASIC]]&lt;br /&gt;
|-&lt;br /&gt;
| [[BASIC 1.1 Fuer CPC464]]&lt;br /&gt;
| [https://www.cpc-power.com/index.php?page=detail&amp;amp;num=4403]&lt;br /&gt;
| &lt;br /&gt;
| Oct 1986&lt;br /&gt;
| Open source&lt;br /&gt;
| [[Locomotive BASIC 1.1]]&lt;br /&gt;
|-&lt;br /&gt;
| [[Brainfuck]]&lt;br /&gt;
| [http://www.symbos.de/appinfo.htm?00067] &lt;br /&gt;
| 1.0&lt;br /&gt;
| Aug 12, 2020&lt;br /&gt;
| Freeware&lt;br /&gt;
| [[Brainfuck]]&lt;br /&gt;
|-&lt;br /&gt;
| [[Chip8 CPC]]&lt;br /&gt;
| [https://www.cpcwiki.eu/forum/games/chip8-emulator-for-amstrad-cpc/] [https://github.com/ajcasado/Chip8_CPC Repo]&lt;br /&gt;
| &lt;br /&gt;
| Nov 12, 2024&lt;br /&gt;
| Open source&lt;br /&gt;
| [[CHIP-8]]&lt;br /&gt;
|-&lt;br /&gt;
| [[CPCZVM]]&lt;br /&gt;
| [https://www.cpcwiki.eu/index.php/Z-Machine]&lt;br /&gt;
| &lt;br /&gt;
| Jul 6, 2019&lt;br /&gt;
| Open source&lt;br /&gt;
| [[Z-Machine]]&lt;br /&gt;
|-&lt;br /&gt;
| [[CPvM]]&lt;br /&gt;
| [http://www.symbos.org/cpvm.htm] [https://github.com/danielgaskell/CPvM Repo]&lt;br /&gt;
| 1.0&lt;br /&gt;
| Apr 17, 2024&lt;br /&gt;
| Open source&lt;br /&gt;
| [[CP/M]]&lt;br /&gt;
|-&lt;br /&gt;
| [[Fuzix OS]]&lt;br /&gt;
| [https://www.cpcwiki.eu/forum/applications/port-of-fuzix-for-the-cpc6128/] [https://github.com/ajcasado/FUZIX Repo]&lt;br /&gt;
| 0.5.1&lt;br /&gt;
| Apr 11, 2025&lt;br /&gt;
| Open source&lt;br /&gt;
| [[POSIX]] (UNIX)&lt;br /&gt;
|-&lt;br /&gt;
| [[Kersten PC Emulator]]&lt;br /&gt;
| [https://cpcrulez.fr/hardware-autres-PC_Emulator.htm]&lt;br /&gt;
| &lt;br /&gt;
| Sep 1986&lt;br /&gt;
| Hardware💲&lt;br /&gt;
| [[IBM PC]]&lt;br /&gt;
|-&lt;br /&gt;
| [[Pac-Man]]&lt;br /&gt;
| [https://www.cpc-power.com/index.php?page=detail&amp;amp;num=7270]&lt;br /&gt;
| 1.1&lt;br /&gt;
| Jun 5, 2014&lt;br /&gt;
| Open source&lt;br /&gt;
| [[Pac-Man arcade|Pac-Man arcade]]&lt;br /&gt;
|-&lt;br /&gt;
| [[PDP-8 Emulator]]&lt;br /&gt;
| [http://www.symbos.org/appinfo.htm?00063]&lt;br /&gt;
| 1.0&lt;br /&gt;
| Jan 14, 2025&lt;br /&gt;
| Open source&lt;br /&gt;
| [[DEC PDP-8]]&lt;br /&gt;
|-&lt;br /&gt;
| [[Phoenix]]&lt;br /&gt;
| [https://norbertkehrer.github.io/phoenix_cpc.html]&lt;br /&gt;
| &lt;br /&gt;
| Jan 6, 2019&lt;br /&gt;
| Freeware&lt;br /&gt;
| [[Phoenix arcade|Phoenix arcade]]&lt;br /&gt;
|-&lt;br /&gt;
| [[Space Invaders|Space Invaders]]&lt;br /&gt;
| [https://www.cpc-power.com/index.php?page=detail&amp;amp;num=13098]&lt;br /&gt;
| 1.02&lt;br /&gt;
| Mar 18, 2017&lt;br /&gt;
| Freeware&lt;br /&gt;
| [[Space Invaders arcade|Space Invaders arcade]]&lt;br /&gt;
|-&lt;br /&gt;
| [[SymbOS Basic]]&lt;br /&gt;
| [http://www.symbos.de/appinfo.htm?00070]&lt;br /&gt;
| 0.1&lt;br /&gt;
| Oct 19, 2021&lt;br /&gt;
| Freeware&lt;br /&gt;
| [[MSX-Basic]]&lt;br /&gt;
|-&lt;br /&gt;
| [[Vezza]]&lt;br /&gt;
| [https://sijnstra.itch.io/vezza] [https://gitlab.com/sijnstra1/vezza Repo]&lt;br /&gt;
| &lt;br /&gt;
| Feb 9, 2025&lt;br /&gt;
| Open source&lt;br /&gt;
| [[Z-Machine]]&lt;br /&gt;
|-&lt;br /&gt;
| [[ZXM]]&lt;br /&gt;
| [https://www.cpc-power.com/index.php?page=detail&amp;amp;num=14208]&lt;br /&gt;
| &lt;br /&gt;
| 1993&lt;br /&gt;
| Freeware&lt;br /&gt;
| [[ZX Spectrum|ZX Spectrum]]&lt;br /&gt;
|-&lt;br /&gt;
| [[Zym]]&lt;br /&gt;
| [http://www.symbos.org/appinfo.htm?00054]&lt;br /&gt;
| 0.9&lt;br /&gt;
| Feb 19, 2022&lt;br /&gt;
| Open source&lt;br /&gt;
| [[Z-Machine]]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
[[Category:Emulator]] [[Category:CrossDev]] [[Category:Emulation Tools]]&lt;/div&gt;</summary>
		<author><name>Longshot</name></author>	</entry>

	<entry>
		<id>https://oldwiki.cpcwiki.eu/index.php?title=Gate_Array&amp;diff=126306</id>
		<title>Gate Array</title>
		<link rel="alternate" type="text/html" href="https://oldwiki.cpcwiki.eu/index.php?title=Gate_Array&amp;diff=126306"/>
				<updated>2025-05-30T11:58:37Z</updated>
		
		<summary type="html">&lt;p&gt;Longshot: correction of an error relating to IC&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[File:Amstrad 40007 Gate Array.png|right|thumb|Amstrad 40007 Gate Array]]&lt;br /&gt;
[[File:Amstrad 40010 Gate Array.png|right|thumb|Amstrad 40010 Gate Array]]&lt;br /&gt;
&lt;br /&gt;
Also designated as Video Gate Array (VGA, not to be confused with the IBM PC compatible graphic card spec).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Introduction  ==&lt;br /&gt;
&lt;br /&gt;
The Gate Array is a specially designed chip exclusively for use in the Amstrad CPC and was designed by Amstrad plc. &lt;br /&gt;
&lt;br /&gt;
In the CPC+ system, the functions of the Gate Array are integrated into a single [[ASIC|ASIC]]. When the ASIC is &amp;quot;locked&amp;quot;, the extra features are not available and the ASIC operates the same as the Gate Array in the CPC allowing programs written for the CPC to work on the Plus without modification. The ASIC must be &amp;quot;un-locked&amp;quot; to access the new features. &lt;br /&gt;
&lt;br /&gt;
In the [[KC Compact]] system, the functions of the Gate Array are &amp;quot;emulated&amp;quot; in TTL chips, [[CIO Overview|CIO]], and its color translation EPROM.&lt;br /&gt;
&lt;br /&gt;
In the &amp;quot;cost-down&amp;quot; version of the CPC6128, the functions of the Gate Array are integrated into an ASIC.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== What does it do? ==&lt;br /&gt;
&lt;br /&gt;
The Gate Array is responsible for the display (colour palette, resolution, horizontal and vertical sync), bus arbitration, DRAM refresh, interrupt generation and memory arrangement. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Bus arbitration ==&lt;br /&gt;
&lt;br /&gt;
The Gate Array arbitrates access to the RAM between the CPU and the video hardware (CRTC and Gate-Array).&lt;br /&gt;
&lt;br /&gt;
Every microsecond: &lt;br /&gt;
* The CRTC generates a memory address using it's MA and RA signal outputs. See the [[CRTC]] wiki page to know how the motherboard wiring transforms these signals into the Video Memory Address (VMA).&lt;br /&gt;
* The Gate Array fetches 2 bytes for each address. /CPU_ADDR is a 1MHz signal. So these 2 bytes are fetched sequentially. They are not interleaved with Z80 access. These bytes are fetched even when the border is on as this is required for DRAM refresh.&lt;br /&gt;
* The video hardware is given priority so that the display is not disrupted.&lt;br /&gt;
&lt;br /&gt;
The Gate-Array generates the &amp;quot;READY&amp;quot; signal which is connected to the &amp;quot;/WAIT&amp;quot; input signal of the CPU. This signal is used to stop the CPU accessing RAM while the video-hardware is accessing it.&lt;br /&gt;
&lt;br /&gt;
In fact, the Gate Array allows the Z80 to access the RAM in only 1 out of every 4 cycles. As a result, all instruction timings are stretched so that they are all multiples of a microsecond (1µs), and this gives an effective CPU clock of 3.3Mhz.&lt;br /&gt;
&lt;br /&gt;
Unlike the ZX Spectrum or the Amiga, where bus arbitration is restricted to the &amp;quot;contended memory&amp;quot; or &amp;quot;chip RAM&amp;quot;, on the CPC it also applies to ROM access and to RAM expansions. So the Z80 always runs at the same speed, regardless of the type of memory being accessed.&lt;br /&gt;
&lt;br /&gt;
Last but not least, bus arbitration also applies to I/O access. And memory access is not aligned with I/O access on Z80.&lt;br /&gt;
&lt;br /&gt;
Note: On Amstrad Plus, the ASIC also has to handle DMA instruction fetch from RAM.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== DRAM refresh ==&lt;br /&gt;
&lt;br /&gt;
On Amstrad CPC, the Gate Array is responsible for the DRAM refresh, instead of using the Z80 built-in DRAM refresh mechanism. The reason is that there can only be 3 DRAM accesses per microsecond on this architecture. Doing DRAM refresh on each M1 cycle as it is done on MSX would bog down the CPU speed on CPC given its bus arbitration scheme.&lt;br /&gt;
&lt;br /&gt;
The Z80 generates a maximum of one request per microsecond. The CPC also requires two memory accesses per microsecond for reading video data.&lt;br /&gt;
&lt;br /&gt;
The CPC specs 4164-20 DRAMs. These require 330nS for a read or write cycle. The CPC also uses the optimised sequential CAS cycles to read the two video data bytes in half a microsecond. [https://www.cpcwiki.eu/forum/amstrad-cpc-hardware/the-cpc-revision-zero-article/msg243769/ Source]&lt;br /&gt;
&lt;br /&gt;
The way to cause the RAM refresh to fail in both a Plus or normal CPC is simply to stop a few bits of the CRTC address changing (ie. never refresh the selected area).&lt;br /&gt;
&lt;br /&gt;
Generally, only the Row address needs to be cycled, so stopping MA0 through MA7 from changing, and stopping the CPU from reading those rows, will cause data to be lost, quite quickly (generally around 4ms). [https://www.cpcwiki.eu/forum/amstrad-cpc-hardware/memory-refresh-plus/ Source]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Interrupt generation ==&lt;br /&gt;
[https://www.grimware.org/doku.php/documentations/devices/gatearraydo=export_xhtml#interrupt.generator Source: Grimware portal (Grim)]&lt;br /&gt;
&lt;br /&gt;
The CPU maskable interrupts are generated by the Gate Array. &lt;br /&gt;
This is done by using a 6bits internal counter and monitoring the HSync and VSync signals produced by the CRTC.&lt;br /&gt;
&lt;br /&gt;
On every falling edge of the HSync signal, the Gate Array will increment the counter by one. When the counter reaches 52, the Gate Array raise the INT signal and reset the counter. With 50Hz PAL CRTC settings (one HSync every 64us) this will produce a 300Hz interrupt rate.&lt;br /&gt;
&lt;br /&gt;
When the CPU acknowledge the interrupt (eg. it is going to jump to the interrupt vector), the Gate Array will reset bit5 of the counter, so the next interrupt can't occur closer than 32 HSync.&lt;br /&gt;
&lt;br /&gt;
When a VSync occurs, the Gate Array will wait for two HSync and:&lt;br /&gt;
&lt;br /&gt;
* If the counter&amp;gt;=32 (bit5=1), then no interrupt request is issued and counter is reset to 0.&lt;br /&gt;
* If the counter&amp;lt;32 (bit5=0), then an interrupt request is issued and counter is reset to 0.&lt;br /&gt;
&lt;br /&gt;
This 2 HSync delay after a VSync is used to let the main program, executed by the CPU, enough time to sense the VSync (for synchronisation with the display, most likely) before an interrupt service routine is eventually executed.&lt;br /&gt;
&lt;br /&gt;
So all the interrupt timings are mostly determined by the CRTC settings. Other than that, the internal interrupt counter can be cleared anytime by software using the Gate Array RMR register.&lt;br /&gt;
&lt;br /&gt;
The falling edge of the HSync trigger the counter, therefore modifying the duration of the HSync with the CRTC Register 3 can delay the interrupt requests by a few microseconds. This can be used to adjust interrupt timings between CPC and Plus machines… &lt;br /&gt;
&lt;br /&gt;
Note: On Amstrad Plus, the interrupt management system is seriously beefed up. See the [[ASIC]] wiki page.&lt;br /&gt;
&lt;br /&gt;
=== Timings ===&lt;br /&gt;
[https://www.grimware.org/doku.php/documentations/devices/gatearraydo=export_xhtml#interrupt.generator Source: Grimware portal (Grim)]&lt;br /&gt;
&lt;br /&gt;
The INT signal (active low) produced by the Gate Array, is a short pulse of 1.4us and starts right after the falling edge of the HSync signal (produced by the CRTC). &lt;br /&gt;
&lt;br /&gt;
=== DI in peace ===&lt;br /&gt;
[https://acpc.me/ACME/FANZINES Source: Amslive No4 (Madram)] &lt;br /&gt;
&lt;br /&gt;
The GA maintains its int request until it is accepted.&lt;br /&gt;
RST #38 occurs not after the EI, but after the instruction following the EI (the Z80 needs time to clean up its act). Even if the int isn't validated by the Z80, IC (interrupt counter) continues on its merry way.&lt;br /&gt;
But after the EI, a test similar to the one seen for the VBL is performed: &lt;br /&gt;
The interrupt is generated anyway, but:&lt;br /&gt;
* If IC &amp;lt; 32, IC is unchanged (the next int will then be produced 21 to 52 lines later).&lt;br /&gt;
* Otherwise bit 5 of IC is set to zero.&lt;br /&gt;
&lt;br /&gt;
== Controlling the Gate Array  ==&lt;br /&gt;
&lt;br /&gt;
The gate array is controlled by I/O. The gate array is selected when bit 15 of the I/O port address is set to &amp;quot;0&amp;quot; and bit 14 of the I/O port address is set to &amp;quot;1&amp;quot;. The values of the other bits are ignored. However, to avoid conflict with other devices in the system, these bits should be set to &amp;quot;1&amp;quot;. &lt;br /&gt;
&lt;br /&gt;
The recommended I/O port address is &amp;amp;7Fxx. &lt;br /&gt;
&lt;br /&gt;
The Gate Array is not connected to the CPU's RD and WR pins, so it cannot detect the bus's I/O direction. If you execute an I/O read operation on the Gate Array I/O address, the Gate Array will read an unpredictable value from the databus which will be in high-impedance state. If the value is a valid Gate Array command, it will be executed, otherwise nothing will happen. [https://www.grimware.org/doku.php/documentations/devices/gatearraydo=export_xhtml Source]&lt;br /&gt;
&lt;br /&gt;
The function to be performed is selected by writing data to the Gate Array, the first bits of the data define the function selected (see table below). It is not possible to read from the Gate Array. &lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!colspan=4| 8bit command&lt;br /&gt;
!rowspan=2| Machine&lt;br /&gt;
!rowspan=2| Register&lt;br /&gt;
!rowspan=2| Description&lt;br /&gt;
!rowspan=2| Chip&lt;br /&gt;
|-&lt;br /&gt;
! 7&lt;br /&gt;
! 6&lt;br /&gt;
! 5&lt;br /&gt;
! 4..0&lt;br /&gt;
|-&lt;br /&gt;
| 0 || 0 || x || style=&amp;quot;text-align: center;&amp;quot; | n || All || PENR || Select a color register || Gate Array&lt;br /&gt;
|-&lt;br /&gt;
| 0 || 1 || x || style=&amp;quot;text-align: center;&amp;quot; | n || All || INKR || Change the value of the currently selected color register || Gate Array&lt;br /&gt;
|-&lt;br /&gt;
| 1 || 0 || 0 || style=&amp;quot;text-align: center;&amp;quot; | n || All || RMR || Control Interrupt counter, ROM mapping and Graphics mode || Gate Array&lt;br /&gt;
|-&lt;br /&gt;
| rowspan=&amp;quot;2&amp;quot;|1 || rowspan=&amp;quot;2&amp;quot;|0 || rowspan=&amp;quot;2&amp;quot;|1 || style=&amp;quot;text-align: center;&amp;quot; rowspan=&amp;quot;2&amp;quot; | n || All || RMR || ''Ghost register'' || Gate Array (CPC) or locked ASIC (Plus)&lt;br /&gt;
|-&lt;br /&gt;
| Plus || RMR2 || ASIC &amp;amp; Advanced ROM mapping || Unlocked ASIC&lt;br /&gt;
|-&lt;br /&gt;
| 1 || 1 ||colspan=2  style=&amp;quot;text-align: center;&amp;quot; | n || All || MMR || RAM memory mapping || PAL (only with 128KB or RAM expansion)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
The MMR register is not available in the Gate Array, but is performed by a device at the same I/O port address location.&lt;br /&gt;
&lt;br /&gt;
In the CPC464, CPC664 and KC compact, MMR is performed in an external memory expansion (e.g. Dk'Tronics 64K RAM Expansion), if this expansion is not present then MMR is not available.&lt;br /&gt;
&lt;br /&gt;
In the CPC6128, MMR is performed by a [[PAL16L8|PAL chip]] located on the main PCB, or an external memory expansion.&lt;br /&gt;
&lt;br /&gt;
In the 464+ and 6128+, MMR is performed by the ASIC or an external memory expansion. Please read the document on RAM management for more information.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Registers ==&lt;br /&gt;
&lt;br /&gt;
Note: The Plus palette capabilities are only accessible through the [[Default I/O Port Summary|ASIC I/O page]]. Registers PENR and INKR are not needed in that case.&lt;br /&gt;
&lt;br /&gt;
=== Register PENR (Select a color register) ===&lt;br /&gt;
&lt;br /&gt;
When bit 7 and bit 6 are set to &amp;quot;0&amp;quot;, the remaining bits determine which pen is to have its colour changed. When bit 4 is set to &amp;quot;0&amp;quot;, bits 3 to 0 define which pen is to be selected. When bit 4 is set to &amp;quot;1&amp;quot;, the value contained in bits 3-0 is ignored and the border is selected. &lt;br /&gt;
&lt;br /&gt;
The pen remains selected until another is chosen. &lt;br /&gt;
&lt;br /&gt;
Each mode has a fixed number of pens. Mode 0 has 16 pens, mode 1 has 4 pens and mode 2 has 2 pens. &lt;br /&gt;
&lt;br /&gt;
==== Summary  ====&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!Bit&lt;br /&gt;
!Value&lt;br /&gt;
!Function&lt;br /&gt;
|-&lt;br /&gt;
| 7 || 0 || rowspan=&amp;quot;2&amp;quot; | Gate Array PENR register&lt;br /&gt;
|-&lt;br /&gt;
| 6 || 0 &lt;br /&gt;
|-&lt;br /&gt;
| 5 || - || not used&lt;br /&gt;
|-&lt;br /&gt;
| 4 || 1 || Select border&lt;br /&gt;
|-&lt;br /&gt;
| 3 || x || rowspan=&amp;quot;4&amp;quot; | Ignored&lt;br /&gt;
|-&lt;br /&gt;
| 2 || x&lt;br /&gt;
|-&lt;br /&gt;
| 1 || x&lt;br /&gt;
|-&lt;br /&gt;
| 0 || x&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!Bit&lt;br /&gt;
!Value&lt;br /&gt;
!Function&lt;br /&gt;
|-&lt;br /&gt;
| 7 || 0 || rowspan=&amp;quot;2&amp;quot; | Gate Array PENR register&lt;br /&gt;
|-&lt;br /&gt;
| 6 || 0&lt;br /&gt;
|-&lt;br /&gt;
| 5 || - || not used&lt;br /&gt;
|-&lt;br /&gt;
| 4 || 0 || Select pen&lt;br /&gt;
|-&lt;br /&gt;
| 3 || x || rowspan=&amp;quot;4&amp;quot; | Pen number&lt;br /&gt;
|-&lt;br /&gt;
| 2 || x&lt;br /&gt;
|-&lt;br /&gt;
| 1 || x&lt;br /&gt;
|-&lt;br /&gt;
| 0 || x&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Register INKR (Change the value of the currently selected color register) ===&lt;br /&gt;
&lt;br /&gt;
Once the pen has been selected its colour can then be changed. Bits 4 to 0 specify the hardware colour number from the hardware colour palette. &lt;br /&gt;
&lt;br /&gt;
Even though there is provision for 32 colours, only 27 are possible. The remaining colours are duplicates of those already in the colour palette. &lt;br /&gt;
&lt;br /&gt;
==== Summary  ====&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!Bit&lt;br /&gt;
!Value&lt;br /&gt;
!Function&lt;br /&gt;
|-&lt;br /&gt;
| 7 || 0 || rowspan=&amp;quot;2&amp;quot; | Gate Array INKR register&lt;br /&gt;
|-&lt;br /&gt;
| 6 || 1&lt;br /&gt;
|-&lt;br /&gt;
| 5 || - || not used&lt;br /&gt;
|-&lt;br /&gt;
| 4 || x || rowspan=&amp;quot;5&amp;quot; | Colour number x&lt;br /&gt;
|-&lt;br /&gt;
| 3 || x &lt;br /&gt;
|-&lt;br /&gt;
| 2 || x &lt;br /&gt;
|-&lt;br /&gt;
| 1 || x&lt;br /&gt;
|-&lt;br /&gt;
| 0 || x&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Register RMR (Control Interrupt counter, ROM mapping and Graphics mode) ===&lt;br /&gt;
&lt;br /&gt;
This is a general purpose register responsible for the [[Video modes|graphics mode]] and the ROM configuration. &lt;br /&gt;
&lt;br /&gt;
==== Graphics mode selection  ====&lt;br /&gt;
&lt;br /&gt;
The function of bits 1 and 0 is to define the screen mode. The settings for bits 1 and 0 and the corresponding screen mode are given in the table below. &lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!Bit 1&lt;br /&gt;
!Bit 0&lt;br /&gt;
!Screen mode&lt;br /&gt;
|-&lt;br /&gt;
| 0 || 0 || Mode 0, 160x200 resolution, 16 colours&lt;br /&gt;
|-&lt;br /&gt;
| 0 || 1 || Mode 1, 320x200 resolution, 4 colours&lt;br /&gt;
|-&lt;br /&gt;
| 1 || 0 || Mode 2, 640x200 resolution, 2 colours&lt;br /&gt;
|-&lt;br /&gt;
| 1 || 1 || Mode 3, 160x200 resolution, 4 colours (undocumented)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
* Mode 3 is not official. From the combinations possible, we can see that 4 modes can be defined, although the Amstrad only has 3. Mode 3 is similar to mode 0, because it has the same resolution, but it is limited to only 4 colours. Mode 3 is not supported by the [[KC Compact]] (which outputs black in Mode 3).&lt;br /&gt;
&lt;br /&gt;
Mode changing is synchronised with HSYNC. If the mode is changed, it will take effect from the next HSYNC.&lt;br /&gt;
&lt;br /&gt;
==== ROM configuration selection  ====&lt;br /&gt;
&lt;br /&gt;
Bit 2 is used to enable or disable the lower ROM area. The lower ROM area occupies memory addresses &amp;amp;amp;0000-&amp;amp;amp;3fff and is used to access the operating system ROM. When the lower ROM area is is enabled, reading from &amp;amp;amp;0000-&amp;amp;amp;3FFF will return data in the ROM. When a value is written to &amp;amp;amp;0000-&amp;amp;amp;3FFF, it will be written to the RAM underneath the ROM. When it is disabled, data read from &amp;amp;amp;0000-&amp;amp;amp;3FFF will return the data in the RAM. &lt;br /&gt;
&lt;br /&gt;
Similarly, bit 3 controls enabling or disabling of the upper ROM area. The upper ROM area occupies memory addressess &amp;amp;amp;C000-&amp;amp;amp;FFFF and is BASIC or any expansion ROMs which may be plugged into a ROM board/box. See the document on [[Upper ROM Bank Number|upper rom selection]] for more details. When the upper ROM area enabled, reading from &amp;amp;amp;c000-&amp;amp;amp;ffff, will return data in the ROM. When data is written to &amp;amp;amp;c000-&amp;amp;amp;FFFF, it will be written to the RAM at the same address as the ROM. When the upper ROM area is disabled, and data is read from &amp;amp;amp;c000-&amp;amp;amp;ffff it will be the data in the RAM. &lt;br /&gt;
&lt;br /&gt;
Bit 4 controls the interrupt generation. It can be used to delay interrupts. See the document on interrupt generation for more information.&lt;br /&gt;
&lt;br /&gt;
==== Summary  ====&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!Bit&lt;br /&gt;
!Value&lt;br /&gt;
!Function&lt;br /&gt;
|-&lt;br /&gt;
| 7 || 1 || rowspan=&amp;quot;2&amp;quot; | Gate Array RMR register&lt;br /&gt;
|-&lt;br /&gt;
| 6 || 0 &lt;br /&gt;
|-&lt;br /&gt;
| 5 || - || ''must be 0 on Plus machines with ASIC unlocked''&lt;br /&gt;
|-&lt;br /&gt;
| 4 || x || Interrupt generation control&lt;br /&gt;
|-&lt;br /&gt;
| 3 || x || 1=Upper ROM area disable, 0=Upper ROM area enable&lt;br /&gt;
|-&lt;br /&gt;
| 2 || x || 1=Lower ROM area disable, 0=Lower ROM area enable&lt;br /&gt;
|-&lt;br /&gt;
| 1 || x || rowspan=&amp;quot;2&amp;quot; | Graphics Mode selection&lt;br /&gt;
|-&lt;br /&gt;
| 0 || x&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Register RMR2 (ASIC &amp;amp; Advanced ROM mapping) ===&lt;br /&gt;
&lt;br /&gt;
This register exists only in Plus or GX4000, and is only accessible when the ASIC is unlocked.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!Bit&lt;br /&gt;
!Value&lt;br /&gt;
!Function&lt;br /&gt;
|-&lt;br /&gt;
| 7 || 1 || rowspan=&amp;quot;3&amp;quot; | Gate Array RMR2 register&lt;br /&gt;
|-&lt;br /&gt;
| 6 || 0&lt;br /&gt;
|-&lt;br /&gt;
| 5 || 1&lt;br /&gt;
|-&lt;br /&gt;
| 4 || x || rowspan=&amp;quot;2&amp;quot; |RMR addressing mode&lt;br /&gt;
|-&lt;br /&gt;
| 3 || x&lt;br /&gt;
|-&lt;br /&gt;
| 2 || x || rowspan=&amp;quot;3&amp;quot; | Physical ROM number (0..7)&lt;br /&gt;
|-&lt;br /&gt;
| 1 || x&lt;br /&gt;
|-&lt;br /&gt;
| 0 || x&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ RMR addressing modes&lt;br /&gt;
!Bit 4&lt;br /&gt;
!Bit 3&lt;br /&gt;
!Lower ROM&lt;br /&gt;
![[ASIC|ASIC I/O page]]&lt;br /&gt;
|-&lt;br /&gt;
|0&lt;br /&gt;
|0&lt;br /&gt;
|&amp;amp;0000-&amp;amp;3FFF&lt;br /&gt;
|Disabled&lt;br /&gt;
|-&lt;br /&gt;
|0&lt;br /&gt;
|1&lt;br /&gt;
|&amp;amp;4000-&amp;amp;7FFF&lt;br /&gt;
|Disabled&lt;br /&gt;
|-&lt;br /&gt;
|1&lt;br /&gt;
|0&lt;br /&gt;
|&amp;amp;8000-&amp;amp;BFFF&lt;br /&gt;
|Disabled&lt;br /&gt;
|-&lt;br /&gt;
|1&lt;br /&gt;
|1&lt;br /&gt;
|&amp;amp;0000-&amp;amp;3FFF&lt;br /&gt;
|&amp;amp;4000-&amp;amp;7FFF&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
The physical ROMs are also accessible as upper ROMs by using the [[Upper ROM Bank Number]] port and the RMR register.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Register MMR (RAM memory mapping) ===&lt;br /&gt;
&lt;br /&gt;
This register exists only in CPCs with 128K RAM (like the CPC 6128), or CPCs equipped with [[Standard Memory Expansions]].&lt;br /&gt;
&lt;br /&gt;
Note: In the CPC 6128, the register is a separate [[PAL16L8|PAL chip]] that assists the Gate Array chip.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!Bit&lt;br /&gt;
!Value&lt;br /&gt;
!Function&lt;br /&gt;
|-&lt;br /&gt;
| 7 || 1 || rowspan=&amp;quot;2&amp;quot; | Gate Array MMR register&lt;br /&gt;
|-&lt;br /&gt;
| 6 || 1 &lt;br /&gt;
|-&lt;br /&gt;
| 5 || x || rowspan=&amp;quot;3&amp;quot; |64K bank number (0..7); always 0 on an unexpanded CPC6128, 0-7 on [[Standard Memory Expansions]]&lt;br /&gt;
|-&lt;br /&gt;
| 4 || x&lt;br /&gt;
|-&lt;br /&gt;
| 3 || x&lt;br /&gt;
|-&lt;br /&gt;
| 2 || x || rowspan=&amp;quot;3&amp;quot; | RAM Config (0..7)&lt;br /&gt;
|-&lt;br /&gt;
| 1 || x&lt;br /&gt;
|-&lt;br /&gt;
| 0 || x&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
The 3bit RAM Config value is used to access the second 64K of the total 128K RAM that is built into the CPC 6128 or the additional 64K-512K of standard memory expansions. These contain up to eight 64K ram banks, which are selected with bit 3-5. A standard CPC 6128 only contains bank 0. Normally the register is set to 0, so that only the first 64K RAM are used (identical to the CPC 464 and 664 models). The register can be used to select between the following eight predefined configurations only:&lt;br /&gt;
&lt;br /&gt;
  -Address-     0      1      2      3      4      5      6      7&lt;br /&gt;
  0000-3FFF   RAM_0  RAM_0  '''RAM_4'''  RAM_0  RAM_0  RAM_0  RAM_0  RAM_0&lt;br /&gt;
  4000-7FFF   RAM_1  RAM_1  '''RAM_5'''  '''RAM_3'''  '''RAM_4'''  '''RAM_5'''  '''RAM_6'''  '''RAM_7'''&lt;br /&gt;
  8000-BFFF   RAM_2  RAM_2  '''RAM_6'''  RAM_2  RAM_2  RAM_2  RAM_2  RAM_2&lt;br /&gt;
  C000-FFFF   RAM_3  '''RAM_7'''  '''RAM_7'''  '''RAM_7'''  RAM_3  RAM_3  RAM_3  RAM_3&lt;br /&gt;
&lt;br /&gt;
The Video RAM is always located in the first 64K, VRAM is in no way affected by this register.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Programming the Gate Array - Examples  ==&lt;br /&gt;
&lt;br /&gt;
Defining the colours, &amp;lt;br&amp;gt;Setting pen 0 to Bright White. &lt;br /&gt;
&amp;lt;pre&amp;gt;LD BC,7F00&amp;amp;nbsp;;Gate Array port&lt;br /&gt;
LD A,%00000000+0&amp;amp;nbsp;;Pen number (and Gate Array function)&lt;br /&gt;
OUT (C),A&amp;amp;nbsp;;Send pen number&lt;br /&gt;
LD A,%01000000+11&amp;amp;nbsp;;Pen colour (and Gate Array function)&lt;br /&gt;
OUT (C),A&amp;amp;nbsp;;Send it&lt;br /&gt;
RET&lt;br /&gt;
&lt;br /&gt;
Setting the mode and ROM configuration, &lt;br /&gt;
Mode 2, upper and lower ROM disabled.&lt;br /&gt;
&lt;br /&gt;
LD BC,7F00&amp;amp;nbsp;;Gate array port&lt;br /&gt;
LD A,%10000000+%00001110&amp;amp;nbsp;;Mode and ROM selection (and Gate Array function)&lt;br /&gt;
OUT (C),A&amp;amp;nbsp;;Send it&lt;br /&gt;
RET&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Misc ===&lt;br /&gt;
&lt;br /&gt;
The hardware colour number is different to the colour range used by the firmware, so a conversion chart is provided for the corresponding firmware/hardware colour values and the corresponding colour name. &lt;br /&gt;
&lt;br /&gt;
=== Note ===&lt;br /&gt;
&lt;br /&gt;
The firmware keeps track of the colours it is using. Every VSYNC (assuming interrupts are enabled) the firmware sets the colours. This enables the user to have flashing colours. If the user selects a new colour using the gate array, the new colour will flash temporarily and then return to its original colour. This is due to the firmware resetting the colour. When using the firmware, use its routines to select the colour, and the colour will remain.&lt;br /&gt;
&lt;br /&gt;
Example: [For whatever reason, this example does NOT refer to the above firmware stuff]&lt;br /&gt;
&amp;lt;pre&amp;gt;ld bc,7f00+1&amp;amp;nbsp;;Gate array function (set pen)&lt;br /&gt;
;and pen number&lt;br /&gt;
out (c),c&lt;br /&gt;
ld bc,7f00&amp;amp;nbsp;;41 &lt;br /&gt;
;Gate array function (set colour)&lt;br /&gt;
;and colour number&lt;br /&gt;
out (c),c&lt;br /&gt;
ret&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Video memory structure ==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!rowspan=2|Graphics Mode&lt;br /&gt;
!colspan=8|VRAM byte&lt;br /&gt;
!colspan=8|Displayed Pixels&lt;br /&gt;
!rowspan=2|Definition&lt;br /&gt;
!rowspan=2|Pixel clock&lt;br /&gt;
!rowspan=2|Default resolution&lt;br /&gt;
|-&lt;br /&gt;
!7&lt;br /&gt;
!6&lt;br /&gt;
!5&lt;br /&gt;
!4&lt;br /&gt;
!3&lt;br /&gt;
!2&lt;br /&gt;
!1&lt;br /&gt;
!0&lt;br /&gt;
!1&lt;br /&gt;
!2&lt;br /&gt;
!3&lt;br /&gt;
!4&lt;br /&gt;
!5&lt;br /&gt;
!6&lt;br /&gt;
!7&lt;br /&gt;
!8&lt;br /&gt;
|-&lt;br /&gt;
|0&lt;br /&gt;
|A0&lt;br /&gt;
|B0&lt;br /&gt;
|A2&lt;br /&gt;
|B2&lt;br /&gt;
|A1&lt;br /&gt;
|B1&lt;br /&gt;
|A3&lt;br /&gt;
|B3&lt;br /&gt;
|colspan=4 style=&amp;quot;text-align: center;&amp;quot;|A&lt;br /&gt;
|colspan=4 style=&amp;quot;text-align: center;&amp;quot;|B&lt;br /&gt;
|2 pixels in 16 colours&lt;br /&gt;
|4 MHz&lt;br /&gt;
|160x200, 20-column text&lt;br /&gt;
|-&lt;br /&gt;
|1&lt;br /&gt;
|A0&lt;br /&gt;
|B0&lt;br /&gt;
|C0&lt;br /&gt;
|D0&lt;br /&gt;
|A1&lt;br /&gt;
|B1&lt;br /&gt;
|C1&lt;br /&gt;
|D1&lt;br /&gt;
|colspan=2 style=&amp;quot;text-align: center;&amp;quot;|A&lt;br /&gt;
|colspan=2 style=&amp;quot;text-align: center;&amp;quot;|B&lt;br /&gt;
|colspan=2 style=&amp;quot;text-align: center;&amp;quot;|C&lt;br /&gt;
|colspan=2 style=&amp;quot;text-align: center;&amp;quot;|D&lt;br /&gt;
|4 pixels in 4 colours&lt;br /&gt;
|8 MHz&lt;br /&gt;
|320x200, 40-column text&lt;br /&gt;
|-&lt;br /&gt;
|2&lt;br /&gt;
|A0&lt;br /&gt;
|B0&lt;br /&gt;
|C0&lt;br /&gt;
|D0&lt;br /&gt;
|E0&lt;br /&gt;
|F0&lt;br /&gt;
|G0&lt;br /&gt;
|H0&lt;br /&gt;
|A&lt;br /&gt;
|B&lt;br /&gt;
|C&lt;br /&gt;
|D&lt;br /&gt;
|E&lt;br /&gt;
|F&lt;br /&gt;
|G&lt;br /&gt;
|H&lt;br /&gt;
|8 pixels in 2 colours&lt;br /&gt;
|16 MHz&lt;br /&gt;
|640x200, 80-column text&lt;br /&gt;
|-&lt;br /&gt;
|3&lt;br /&gt;
|A0&lt;br /&gt;
|B0&lt;br /&gt;
|x&lt;br /&gt;
|x&lt;br /&gt;
|A1&lt;br /&gt;
|B1&lt;br /&gt;
|x&lt;br /&gt;
|x&lt;br /&gt;
|colspan=4 style=&amp;quot;text-align: center;&amp;quot;|A&lt;br /&gt;
|colspan=4 style=&amp;quot;text-align: center;&amp;quot;|B&lt;br /&gt;
|2 pixels in 4 colours&lt;br /&gt;
|4 MHz&lt;br /&gt;
|160x200, 20-column text&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Split rasters ==&lt;br /&gt;
&lt;br /&gt;
On the CPC, split rasters occur halfway (after the 8th mode2 pixel) through the rendering of a CRTC character.&lt;br /&gt;
&lt;br /&gt;
On Amstrad Plus, split rasters occur quarter of the way (after the 4th mode2 pixel) through the rendering of a CRTC character.&lt;br /&gt;
&lt;br /&gt;
To easily make split rasters compatible with both the CPC and the Plus machines, one can use the ASIC soft-scroll control register (SSCR) to finely adjust the horizontal position of the graphics.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Palette R,G,B definitions ==&lt;br /&gt;
&lt;br /&gt;
There are 27 colours which are generated from red, green and blue mixed in different quantities. There are 3 levels of red, 3 levels of green and 3 levels of blue, and these can be thought of as off/no colour, half-on/half-colour, and on/full-colour. &lt;br /&gt;
&lt;br /&gt;
To display a CPC image you will need to use a analogue monitor with a composite sync.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Palette sorted by Firmware Colour Numbers ===&lt;br /&gt;
&lt;br /&gt;
The firmware colour palette is sorted by luminance value.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
|-&lt;br /&gt;
!Firmware Number&lt;br /&gt;
!Hardware Number&lt;br /&gt;
!Colour Name&lt;br /&gt;
!R %&lt;br /&gt;
!G %&lt;br /&gt;
!B %&lt;br /&gt;
!ASIC&lt;br /&gt;
!Colour&lt;br /&gt;
|-&lt;br /&gt;
| 0|| 54h          ||Black          ||  0||  0||  0|| #000||bgcolor=&amp;quot;#000000&amp;quot;|&lt;br /&gt;
|-&lt;br /&gt;
| 1|| 44h (or 50h) ||Blue           ||  0||  0|| 50|| #006||bgcolor=&amp;quot;#000080&amp;quot;|&lt;br /&gt;
|-&lt;br /&gt;
| 2|| 55h          ||Bright Blue    ||  0||  0||100|| #00F||bgcolor=&amp;quot;#0000ff&amp;quot;|&lt;br /&gt;
|-&lt;br /&gt;
| 3|| 5Ch          ||Red            || 50||  0||  0|| #600||bgcolor=&amp;quot;#800000&amp;quot;|&lt;br /&gt;
|-&lt;br /&gt;
| 4|| 58h          ||Magenta        || 50||  0|| 50|| #606||bgcolor=&amp;quot;#800080&amp;quot;|&lt;br /&gt;
|-&lt;br /&gt;
| 5|| 5Dh          ||Mauve          || 50||  0||100|| #60F||bgcolor=&amp;quot;#8000ff&amp;quot;|&lt;br /&gt;
|-&lt;br /&gt;
| 6|| 4Ch          ||Bright Red     ||100||  0||  0|| #F00||bgcolor=&amp;quot;#ff0000&amp;quot;|&lt;br /&gt;
|-&lt;br /&gt;
| 7|| 45h (or 48h) ||Purple         ||100||  0|| 50|| #F06||bgcolor=&amp;quot;#ff0080&amp;quot;|&lt;br /&gt;
|-&lt;br /&gt;
| 8|| 4Dh          ||Bright Magenta ||100||  0||100|| #F0F||bgcolor=&amp;quot;#ff00ff&amp;quot;|&lt;br /&gt;
|-&lt;br /&gt;
| 9|| 56h          ||Green          ||  0|| 50||  0|| #060||bgcolor=&amp;quot;#008000&amp;quot;|&lt;br /&gt;
|-&lt;br /&gt;
|10|| 46h          ||Cyan           ||  0|| 50|| 50|| #066||bgcolor=&amp;quot;#008080&amp;quot;|&lt;br /&gt;
|-&lt;br /&gt;
|11|| 57h          ||Sky Blue       ||  0|| 50||100|| #06F||bgcolor=&amp;quot;#0080ff&amp;quot;|&lt;br /&gt;
|-&lt;br /&gt;
|12|| 5Eh          ||Yellow         || 50|| 50||  0|| #660||bgcolor=&amp;quot;#808000&amp;quot;|&lt;br /&gt;
|-&lt;br /&gt;
|13|| 40h (or 41h) ||White          || 50|| 50|| 50||#666||bgcolor=&amp;quot;#808080&amp;quot;|&lt;br /&gt;
|-&lt;br /&gt;
|14|| 5Fh          ||Pastel Blue    || 50|| 50||100|| #66F||bgcolor=&amp;quot;#8080ff&amp;quot;|&lt;br /&gt;
|-&lt;br /&gt;
|15|| 4Eh          ||Orange         ||100|| 50||  0|| #F60|| bgcolor=&amp;quot;#ff8000&amp;quot;|&lt;br /&gt;
|-&lt;br /&gt;
|16|| 47h          ||Pink           ||100|| 50|| 50|| #F66||bgcolor=&amp;quot;#ff8080&amp;quot;|&lt;br /&gt;
|-&lt;br /&gt;
|17|| 4Fh          ||Pastel Magenta ||100|| 50||100|| #F6F||bgcolor=&amp;quot;#ff80ff&amp;quot;|&lt;br /&gt;
|-&lt;br /&gt;
|18|| 52h          ||Bright Green   ||  0||100||  0|| #0F0||bgcolor=&amp;quot;#00ff00&amp;quot;|&lt;br /&gt;
|-&lt;br /&gt;
|19|| 42h (or 51h) ||Sea Green      ||  0||100|| 50|| #0F6||bgcolor=&amp;quot;#00ff80&amp;quot;|&lt;br /&gt;
|-&lt;br /&gt;
|20|| 53h          ||Bright Cyan    ||  0||100||100|| #0FF||bgcolor=&amp;quot;#00ffff&amp;quot;|&lt;br /&gt;
|-&lt;br /&gt;
|21|| 5Ah          ||Lime           || 50||100||  0|| #6F0||bgcolor=&amp;quot;#80ff00&amp;quot;|&lt;br /&gt;
|-&lt;br /&gt;
|22|| 59h          ||Pastel Green   || 50||100|| 50|| #6F6||bgcolor=&amp;quot;#80ff80&amp;quot;|&lt;br /&gt;
|-&lt;br /&gt;
|23|| 5Bh          ||Pastel Cyan    || 50||100||100|| #6FF||bgcolor=&amp;quot;#80ffff&amp;quot;|&lt;br /&gt;
|-&lt;br /&gt;
|24|| 4Ah          ||Bright Yellow  ||100||100||  0|| #FF0||bgcolor=&amp;quot;#ffff00&amp;quot;|&lt;br /&gt;
|-&lt;br /&gt;
|25|| 43h (or 49h) ||Pastel Yellow  ||100||100|| 50||#FF6||bgcolor=&amp;quot;#ffff80&amp;quot;|&lt;br /&gt;
|-&lt;br /&gt;
|26|| 4Bh          ||Bright White   ||100||100||100|| #FFF||bgcolor=&amp;quot;#ffffff&amp;quot;|&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Note: We can observe that the official Amstrad names of some colours are a bit silly: &amp;quot;red&amp;quot; is in fact brown, &amp;quot;yellow&amp;quot; is in fact khaki and &amp;quot;white&amp;quot; is in fact grey.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Amstrad Colour Names ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;gallery&amp;gt;&lt;br /&gt;
Cpc 6128 master colour chat.jpg|Master colour chart&lt;br /&gt;
Cpc 6128 farbtabelle.jpg|Farbtabelle&lt;br /&gt;
Cpc 6128 palette des couleurs.jpg|Palette des couleurs&lt;br /&gt;
Cpc 6128 tabla de colores.jpg|Tabla de colores&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Palette sorted by Hardware Colour Numbers ===&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!Hardware Number&lt;br /&gt;
!Firmware Number&lt;br /&gt;
!R %&lt;br /&gt;
!G %&lt;br /&gt;
!B %&lt;br /&gt;
!ASIC&lt;br /&gt;
!Colour&lt;br /&gt;
!Colour Name&lt;br /&gt;
!German Name&lt;br /&gt;
!French Name&lt;br /&gt;
!Spanish Name&lt;br /&gt;
|-&lt;br /&gt;
|  0 (40h) || 13   || 50|| 50|| 50|| #666|| bgcolor=&amp;quot;#808080&amp;quot; | || White         || Weiß            || Blanc           || Blanco&lt;br /&gt;
|-&lt;br /&gt;
|  1 (41h) || (13) || 50|| 50|| 50|| #666|| bgcolor=&amp;quot;#808080&amp;quot; | || White         || Weiß            || Blanc           || Blanco&lt;br /&gt;
|-&lt;br /&gt;
|  2 (42h) || 19   ||  0||100|| 50|| #0F6|| bgcolor=&amp;quot;#00ff80&amp;quot; | || Sea Green     || Seegrün         || Vert marin      || Verde marino&lt;br /&gt;
|-&lt;br /&gt;
|  3 (43h) || 25   ||100||100|| 50|| #FF6|| bgcolor=&amp;quot;#ffff80&amp;quot; | || Pastel Yellow || Pastellgelb     || Jaune pastel    || Amarillo pastel&lt;br /&gt;
|-&lt;br /&gt;
|  4 (44h) || 1    ||  0||  0|| 50|| #006|| bgcolor=&amp;quot;#000080&amp;quot; | || Blue          || Blau            || Bleu            || Azul&lt;br /&gt;
|-&lt;br /&gt;
|  5 (45h) || 7    ||100||  0|| 50|| #F06|| bgcolor=&amp;quot;#ff0080&amp;quot; | || Purple        || Purpur          || Pourpre         || Púrpura&lt;br /&gt;
|-&lt;br /&gt;
|  6 (46h) || 10   ||  0|| 50|| 50|| #066|| bgcolor=&amp;quot;#008080&amp;quot; | || Cyan          || Blaugrün        || Turquoise       || Ciano&lt;br /&gt;
|-&lt;br /&gt;
|  7 (47h) || 16   ||100|| 50|| 50|| #F66|| bgcolor=&amp;quot;#ff8080&amp;quot; | || Pink          || Rosa            || Rose            || Rosa&lt;br /&gt;
|-&lt;br /&gt;
|  8 (48h) || (7)  ||100||  0|| 50|| #F06|| bgcolor=&amp;quot;#ff0080&amp;quot; | || Purple        || Purpur          || Pourpre         || Púrpura&lt;br /&gt;
|-&lt;br /&gt;
|  9 (49h) || (25) ||100||100|| 50|| #FF6|| bgcolor=&amp;quot;#ffff80&amp;quot; | || Pastel Yellow || Pastellgelb     || Jaune pastel    || Amarillo pastel&lt;br /&gt;
|-&lt;br /&gt;
| 10 (4Ah) || 24   ||100||100||  0|| #FF0|| bgcolor=&amp;quot;#ffff00&amp;quot; | || Bright Yellow || Hellgelb        || Jaune vif       || Amarillo brillante&lt;br /&gt;
|-&lt;br /&gt;
| 11 (4Bh) || 26   ||100||100||100|| #FFF|| bgcolor=&amp;quot;#ffffff&amp;quot; | || Bright White  || Leuchtendweiß   || Blanc brillant  || Blanco brillante&lt;br /&gt;
|-&lt;br /&gt;
| 12 (4Ch) || 6    ||100||  0||  0|| #F00|| bgcolor=&amp;quot;#ff0000&amp;quot; | || Bright Red    || Hellrot         || Rouge vif       || Rojo brillante&lt;br /&gt;
|-&lt;br /&gt;
| 13 (4Dh) || 8    ||100||  0||100|| #F0F|| bgcolor=&amp;quot;#ff00ff&amp;quot; | || Bright Magenta|| helles Magenta  || Magenta vif     || Magenta brillante&lt;br /&gt;
|-&lt;br /&gt;
| 14 (4Eh) || 15   ||100|| 50||  0|| #F60|| bgcolor=&amp;quot;#ff8000&amp;quot; | || Orange        || Orange          || Orange          || Naranja&lt;br /&gt;
|-&lt;br /&gt;
| 15 (4Fh) || 17   ||100|| 50||100|| #F6F|| bgcolor=&amp;quot;#ff80ff&amp;quot; | || Pastel Magenta|| Pastell-magenta || Magenta pastel  || Magenta pastel&lt;br /&gt;
|-&lt;br /&gt;
| 16 (50h) || (1)  ||  0||  0|| 50|| #006|| bgcolor=&amp;quot;#000080&amp;quot; | || Blue          || Blau            || Bleu            || Azul&lt;br /&gt;
|-&lt;br /&gt;
| 17 (51h) || (19) ||  0||100|| 50|| #0F6|| bgcolor=&amp;quot;#00ff80&amp;quot; | || Sea Green     || Seegrün         || Vert marin      || Verde marino&lt;br /&gt;
|-&lt;br /&gt;
| 18 (52h) || 18   ||  0||100||  0|| #0F0|| bgcolor=&amp;quot;#00ff00&amp;quot; | || Bright Green  || Hellgrün        || Vert vif        || Verde brillante&lt;br /&gt;
|-&lt;br /&gt;
| 19 (53h) || 20   ||  0||100||100|| #0FF|| bgcolor=&amp;quot;#00ffff&amp;quot; | || Bright Cyan   || helles Blaugrün || Turquoise vif   || Ciano brillante&lt;br /&gt;
|-&lt;br /&gt;
| 20 (54h) || 0    ||  0||  0||  0|| #000|| bgcolor=&amp;quot;#000000&amp;quot; | || Black         || Schwarz         || Noir            || Negro&lt;br /&gt;
|-&lt;br /&gt;
| 21 (55h) || 2    ||  0||  0||100|| #00F|| bgcolor=&amp;quot;#0000ff&amp;quot; | || Bright Blue   || Hellblau        || Bleu vif        || Azul brillante&lt;br /&gt;
|-&lt;br /&gt;
| 22 (56h) || 9    ||  0|| 50||  0|| #060|| bgcolor=&amp;quot;#008000&amp;quot; | || Green         || Grün            || Vert            || Verde&lt;br /&gt;
|-&lt;br /&gt;
| 23 (57h) || 11   ||  0|| 50||100|| #06F|| bgcolor=&amp;quot;#0080ff&amp;quot; | || Sky Blue      || Himmelblau      || Bleu ciel       || Azul cielo&lt;br /&gt;
|-&lt;br /&gt;
| 24 (58h) || 4    || 50||  0|| 50|| #606|| bgcolor=&amp;quot;#800080&amp;quot; | || Magenta       || Magenta         || Magenta         || Magenta&lt;br /&gt;
|-&lt;br /&gt;
| 25 (59h) || 22   || 50||100|| 50|| #6F6|| bgcolor=&amp;quot;#80ff80&amp;quot; | || Pastel Green  || Pastellgrün     || Vert pastel     || Verde pastel&lt;br /&gt;
|-&lt;br /&gt;
| 26 (5Ah) || 21   || 50||100||  0|| #6F0|| bgcolor=&amp;quot;#80ff00&amp;quot; | || Lime          || Limonengrün     || Vert citron     || Verde lima&lt;br /&gt;
|-&lt;br /&gt;
| 27 (5Bh) || 23   || 50||100||100|| #6FF|| bgcolor=&amp;quot;#80ffff&amp;quot; | || Pastel Cyan   || Pastell-blaugrün|| Turquoise pastel|| Ciano pastel&lt;br /&gt;
|-&lt;br /&gt;
| 28 (5Ch) || 3    || 50||  0||  0|| #600|| bgcolor=&amp;quot;#800000&amp;quot; | || Red           || Rot             || Rouge           || Rojo&lt;br /&gt;
|-&lt;br /&gt;
| 29 (5Dh) || 5    || 50||  0||100|| #60F|| bgcolor=&amp;quot;#8000ff&amp;quot; | || Mauve         || Hellviolett     || Mauve           || Malva&lt;br /&gt;
|-&lt;br /&gt;
| 30 (5Eh) || 12   || 50|| 50||  0|| #660|| bgcolor=&amp;quot;#808000&amp;quot; | || Yellow        || Gelb            || Jaune           || Amarillo&lt;br /&gt;
|-&lt;br /&gt;
| 31 (5Fh) || 14   || 50|| 50||100|| #66F|| bgcolor=&amp;quot;#8080ff&amp;quot; | || Pastel Blue   || Pastellblau     || Bleu pastel     || Azul pastel&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Intensities ===&lt;br /&gt;
&lt;br /&gt;
The 0%, 50%, and 100% values in the above tables are &amp;quot;should-be&amp;quot; values. However, the real hardware doesn't exactly match that intensities. The actual intensities depend on the luminance mixing (R,G,B tied together via resistors), on chipset (classic CPC, or newer ASIC ones), and on the load applied by external hardware (Monitor, or TV set).&lt;br /&gt;
&lt;br /&gt;
On an actual Amstrad CPC, the half-intensity colour signal is measured to be closer to 40% rather than the expected 50%. This was verified by [[Grim]] and independently confirmed by [[Nocash]]. [https://www.grimware.org/doku.php/documentations/devices/gatearray#inkr Source]&lt;br /&gt;
* [[CPC Palette]] - some more details&lt;br /&gt;
&lt;br /&gt;
This explains why the Amstrad engineers used the following values to adapt the old colour palette to the new 12-bit palette on the Amstrad Plus:&lt;br /&gt;
* 0% became #0&lt;br /&gt;
* 50% became #6. They specifically chose #6 for the 50% value instead of the expected #7 or #8, to better match the real Amstrad CPC palette.&lt;br /&gt;
* 100% became #F&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Green Screen Colours ===&lt;br /&gt;
&lt;br /&gt;
On a green screen, where all colours are shades of unsaturated green, the firmware colours are in order of increasing intensity. Black is darkest green, bright white is brightest green, and firmware colour 13 is a medium green.&lt;br /&gt;
&lt;br /&gt;
The luminance (Y) is not exactly correlated to the actual luminance of colour images broadcast in RGB. Amstrad preferred to propose a completely different image system, not comparable to a conversion to monochrome, which would have limited the number of brightness levels to 21 (for example, colours 9 and 6 would have had the same luminance).&lt;br /&gt;
&lt;br /&gt;
They opted for a table of 27 linear brightness steps. They assigned values of 1 (1kΩ) for blue, 3 (3.3kΩ) for red, and 9 (10kΩ) for green.&lt;br /&gt;
&lt;br /&gt;
==== To calculate the luminance value ====&lt;br /&gt;
&lt;br /&gt;
'''Red''' &lt;br /&gt;
&lt;br /&gt;
*0% =&amp;amp;gt; do not add anything &lt;br /&gt;
*50% =&amp;amp;gt; add 3 &lt;br /&gt;
*100% =&amp;amp;gt; add 6 &lt;br /&gt;
&lt;br /&gt;
'''Green''' &lt;br /&gt;
&lt;br /&gt;
*0% =&amp;amp;gt; do not add anything &lt;br /&gt;
*50% =&amp;amp;gt; add 9 &lt;br /&gt;
*100% =&amp;amp;gt; add 18 &lt;br /&gt;
&lt;br /&gt;
'''Blue''' &lt;br /&gt;
&lt;br /&gt;
*0% =&amp;amp;gt; do not add anything &lt;br /&gt;
*50% =&amp;amp;gt; add 1 &lt;br /&gt;
*100% =&amp;amp;gt; add 2 &lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Pictures ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;gallery&amp;gt;&lt;br /&gt;
Image:40010_am2_metal.jpg|40010 GA Metal Layer&lt;br /&gt;
Image:40010_am2_acid.jpg|40010 GA with Metal Layer removed&lt;br /&gt;
Image:40226_am4_metal.jpg|40226 PreASIC Metal Layer&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[File:Ga.pinout.40007.png]] [[File:Ga.pinout.40008.40010.png]]&lt;br /&gt;
&lt;br /&gt;
Note: Some CPC motherboards can accommodate both types of Gate Array pinouts. [https://thecheshirec.at/2024/10/06/il-existe-une-carte-multi-gate-array-et-cest-amstrad-qui-la-faite/ Source]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== External links ==&lt;br /&gt;
*[https://bread80.com/2021/06/03/understanding-the-amstrad-cpc-video-ram-and-gate-array-subsystem/ Electronic signals analysis of the Gate Array by Bread80]&lt;br /&gt;
* [https://shaker.logonsystem.eu/ACCC1.8-EN.pdf Gate Array documentation in Amstrad CRTC Compendium]&lt;br /&gt;
* [https://www.grimware.org/doku.php/documentations/devices/gatearray Gate Array documentation from Grimware]&lt;br /&gt;
* [http://quasar.cpcscene.net/doku.php?id=assem:gate_array Quasar Gate Array documentation (in french)]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==See also==&lt;br /&gt;
&lt;br /&gt;
*[[Gate Array and ASIC Pin-Outs]]&lt;br /&gt;
*[[PAL16L8]] : for RAM arrangement&lt;br /&gt;
*[[ASIC]] : for Plus users&lt;br /&gt;
&lt;br /&gt;
*[[CRTC]] : the other video stuff&lt;br /&gt;
*[[Synchronising with the CRTC and display]] : technical details on the relationship between Gate Array and CRTC.&lt;br /&gt;
&lt;br /&gt;
*[[Video modes]] : for other informations on colours and pixels.&lt;br /&gt;
&lt;br /&gt;
*[[Media:40010-simplified V03.pdf]] [https://www.cpcwiki.eu/forum/amstrad-cpc-hardware/gate-array-decapped!/msg170713/#msg170713 Forum thread] Gate Array schematics - reverse engineered by Gerald&lt;br /&gt;
&lt;br /&gt;
[[Category:Hardware]][[Category:Programming]][[Category:Datasheet]][[Category:Graphic]][[Category:CPC Internal Components]][[Category:Electronic Component]]&lt;/div&gt;</summary>
		<author><name>Longshot</name></author>	</entry>

	<entry>
		<id>https://oldwiki.cpcwiki.eu/index.php?title=Gate_Array&amp;diff=126305</id>
		<title>Gate Array</title>
		<link rel="alternate" type="text/html" href="https://oldwiki.cpcwiki.eu/index.php?title=Gate_Array&amp;diff=126305"/>
				<updated>2025-05-30T11:18:20Z</updated>
		
		<summary type="html">&lt;p&gt;Longshot: Interruption chapter&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[File:Amstrad 40007 Gate Array.png|right|thumb|Amstrad 40007 Gate Array]]&lt;br /&gt;
[[File:Amstrad 40010 Gate Array.png|right|thumb|Amstrad 40010 Gate Array]]&lt;br /&gt;
&lt;br /&gt;
Also designated as Video Gate Array (VGA, not to be confused with the IBM PC compatible graphic card spec).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Introduction  ==&lt;br /&gt;
&lt;br /&gt;
The Gate Array is a specially designed chip exclusively for use in the Amstrad CPC and was designed by Amstrad plc. &lt;br /&gt;
&lt;br /&gt;
In the CPC+ system, the functions of the Gate Array are integrated into a single [[ASIC|ASIC]]. When the ASIC is &amp;quot;locked&amp;quot;, the extra features are not available and the ASIC operates the same as the Gate Array in the CPC allowing programs written for the CPC to work on the Plus without modification. The ASIC must be &amp;quot;un-locked&amp;quot; to access the new features. &lt;br /&gt;
&lt;br /&gt;
In the [[KC Compact]] system, the functions of the Gate Array are &amp;quot;emulated&amp;quot; in TTL chips, [[CIO Overview|CIO]], and its color translation EPROM.&lt;br /&gt;
&lt;br /&gt;
In the &amp;quot;cost-down&amp;quot; version of the CPC6128, the functions of the Gate Array are integrated into an ASIC.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== What does it do? ==&lt;br /&gt;
&lt;br /&gt;
The Gate Array is responsible for the display (colour palette, resolution, horizontal and vertical sync), bus arbitration, DRAM refresh, interrupt generation and memory arrangement. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Bus arbitration ==&lt;br /&gt;
&lt;br /&gt;
The Gate Array arbitrates access to the RAM between the CPU and the video hardware (CRTC and Gate-Array).&lt;br /&gt;
&lt;br /&gt;
Every microsecond: &lt;br /&gt;
* The CRTC generates a memory address using it's MA and RA signal outputs. See the [[CRTC]] wiki page to know how the motherboard wiring transforms these signals into the Video Memory Address (VMA).&lt;br /&gt;
* The Gate Array fetches 2 bytes for each address. /CPU_ADDR is a 1MHz signal. So these 2 bytes are fetched sequentially. They are not interleaved with Z80 access. These bytes are fetched even when the border is on as this is required for DRAM refresh.&lt;br /&gt;
* The video hardware is given priority so that the display is not disrupted.&lt;br /&gt;
&lt;br /&gt;
The Gate-Array generates the &amp;quot;READY&amp;quot; signal which is connected to the &amp;quot;/WAIT&amp;quot; input signal of the CPU. This signal is used to stop the CPU accessing RAM while the video-hardware is accessing it.&lt;br /&gt;
&lt;br /&gt;
In fact, the Gate Array allows the Z80 to access the RAM in only 1 out of every 4 cycles. As a result, all instruction timings are stretched so that they are all multiples of a microsecond (1µs), and this gives an effective CPU clock of 3.3Mhz.&lt;br /&gt;
&lt;br /&gt;
Unlike the ZX Spectrum or the Amiga, where bus arbitration is restricted to the &amp;quot;contended memory&amp;quot; or &amp;quot;chip RAM&amp;quot;, on the CPC it also applies to ROM access and to RAM expansions. So the Z80 always runs at the same speed, regardless of the type of memory being accessed.&lt;br /&gt;
&lt;br /&gt;
Last but not least, bus arbitration also applies to I/O access. And memory access is not aligned with I/O access on Z80.&lt;br /&gt;
&lt;br /&gt;
Note: On Amstrad Plus, the ASIC also has to handle DMA instruction fetch from RAM.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== DRAM refresh ==&lt;br /&gt;
&lt;br /&gt;
On Amstrad CPC, the Gate Array is responsible for the DRAM refresh, instead of using the Z80 built-in DRAM refresh mechanism. The reason is that there can only be 3 DRAM accesses per microsecond on this architecture. Doing DRAM refresh on each M1 cycle as it is done on MSX would bog down the CPU speed on CPC given its bus arbitration scheme.&lt;br /&gt;
&lt;br /&gt;
The Z80 generates a maximum of one request per microsecond. The CPC also requires two memory accesses per microsecond for reading video data.&lt;br /&gt;
&lt;br /&gt;
The CPC specs 4164-20 DRAMs. These require 330nS for a read or write cycle. The CPC also uses the optimised sequential CAS cycles to read the two video data bytes in half a microsecond. [https://www.cpcwiki.eu/forum/amstrad-cpc-hardware/the-cpc-revision-zero-article/msg243769/ Source]&lt;br /&gt;
&lt;br /&gt;
The way to cause the RAM refresh to fail in both a Plus or normal CPC is simply to stop a few bits of the CRTC address changing (ie. never refresh the selected area).&lt;br /&gt;
&lt;br /&gt;
Generally, only the Row address needs to be cycled, so stopping MA0 through MA7 from changing, and stopping the CPU from reading those rows, will cause data to be lost, quite quickly (generally around 4ms). [https://www.cpcwiki.eu/forum/amstrad-cpc-hardware/memory-refresh-plus/ Source]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Interrupt generation ==&lt;br /&gt;
[https://www.grimware.org/doku.php/documentations/devices/gatearraydo=export_xhtml#interrupt.generator Source: Grimware portal (Grim)]&lt;br /&gt;
&lt;br /&gt;
The CPU maskable interrupts are generated by the Gate Array. &lt;br /&gt;
This is done by using a 6bits internal counter and monitoring the HSync and VSync signals produced by the CRTC.&lt;br /&gt;
&lt;br /&gt;
On every falling edge of the HSync signal, the Gate Array will increment the counter by one. When the counter reaches 52, the Gate Array raise the INT signal and reset the counter. With 50Hz PAL CRTC settings (one HSync every 64us) this will produce a 300Hz interrupt rate.&lt;br /&gt;
&lt;br /&gt;
When the CPU acknowledge the interrupt (eg. it is going to jump to the interrupt vector), the Gate Array will reset bit5 of the counter, so the next interrupt can't occur closer than 32 HSync.&lt;br /&gt;
&lt;br /&gt;
When a VSync occurs, the Gate Array will wait for two HSync and:&lt;br /&gt;
&lt;br /&gt;
* If the counter&amp;gt;=32 (bit5=1), then no interrupt request is issued and counter is reset to 0.&lt;br /&gt;
* If the counter&amp;lt;32 (bit5=0), then an interrupt request is issued and counter is reset to 0.&lt;br /&gt;
&lt;br /&gt;
This 2 HSync delay after a VSync is used to let the main program, executed by the CPU, enough time to sense the VSync (for synchronisation with the display, most likely) before an interrupt service routine is eventually executed.&lt;br /&gt;
&lt;br /&gt;
So all the interrupt timings are mostly determined by the CRTC settings. Other than that, the internal interrupt counter can be cleared anytime by software using the Gate Array RMR register.&lt;br /&gt;
&lt;br /&gt;
The falling edge of the HSync trigger the counter, therefore modifying the duration of the HSync with the CRTC Register 3 can delay the interrupt requests by a few microseconds. This can be used to adjust interrupt timings between CPC and Plus machines… &lt;br /&gt;
&lt;br /&gt;
Note: On Amstrad Plus, the interrupt management system is seriously beefed up. See the [[ASIC]] wiki page.&lt;br /&gt;
&lt;br /&gt;
=== Timings ===&lt;br /&gt;
[https://www.grimware.org/doku.php/documentations/devices/gatearraydo=export_xhtml#interrupt.generator Source: Grimware portal (Grim)]&lt;br /&gt;
&lt;br /&gt;
The INT signal (active low) produced by the Gate Array, is a short pulse of 1.4us and starts right after the falling edge of the HSync signal (produced by the CRTC). &lt;br /&gt;
&lt;br /&gt;
=== DI in peace ===&lt;br /&gt;
[https://acpc.me/ACME/FANZINES Source: Amslive No4 (Madram)] &lt;br /&gt;
&lt;br /&gt;
The GA maintains its int request until it is accepted.&lt;br /&gt;
RST #38 occurs not after the EI, but after the instruction following the EI (the Z80 needs time to clean up its act). Even if the int isn't validated by the Z80, IC (interrupt counter) continues on its merry way.&lt;br /&gt;
But after the EI, a test similar to the one seen for the VBL is performed: &lt;br /&gt;
The interrupt is generated anyway, but:&lt;br /&gt;
* If IC &amp;lt; 32, IC is unchanged (the next int will then be produced 21 to 52 lines later).&lt;br /&gt;
* Otherwise, IC = 0.&lt;br /&gt;
&lt;br /&gt;
== Controlling the Gate Array  ==&lt;br /&gt;
&lt;br /&gt;
The gate array is controlled by I/O. The gate array is selected when bit 15 of the I/O port address is set to &amp;quot;0&amp;quot; and bit 14 of the I/O port address is set to &amp;quot;1&amp;quot;. The values of the other bits are ignored. However, to avoid conflict with other devices in the system, these bits should be set to &amp;quot;1&amp;quot;. &lt;br /&gt;
&lt;br /&gt;
The recommended I/O port address is &amp;amp;7Fxx. &lt;br /&gt;
&lt;br /&gt;
The Gate Array is not connected to the CPU's RD and WR pins, so it cannot detect the bus's I/O direction. If you execute an I/O read operation on the Gate Array I/O address, the Gate Array will read an unpredictable value from the databus which will be in high-impedance state. If the value is a valid Gate Array command, it will be executed, otherwise nothing will happen. [https://www.grimware.org/doku.php/documentations/devices/gatearraydo=export_xhtml Source]&lt;br /&gt;
&lt;br /&gt;
The function to be performed is selected by writing data to the Gate Array, the first bits of the data define the function selected (see table below). It is not possible to read from the Gate Array. &lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!colspan=4| 8bit command&lt;br /&gt;
!rowspan=2| Machine&lt;br /&gt;
!rowspan=2| Register&lt;br /&gt;
!rowspan=2| Description&lt;br /&gt;
!rowspan=2| Chip&lt;br /&gt;
|-&lt;br /&gt;
! 7&lt;br /&gt;
! 6&lt;br /&gt;
! 5&lt;br /&gt;
! 4..0&lt;br /&gt;
|-&lt;br /&gt;
| 0 || 0 || x || style=&amp;quot;text-align: center;&amp;quot; | n || All || PENR || Select a color register || Gate Array&lt;br /&gt;
|-&lt;br /&gt;
| 0 || 1 || x || style=&amp;quot;text-align: center;&amp;quot; | n || All || INKR || Change the value of the currently selected color register || Gate Array&lt;br /&gt;
|-&lt;br /&gt;
| 1 || 0 || 0 || style=&amp;quot;text-align: center;&amp;quot; | n || All || RMR || Control Interrupt counter, ROM mapping and Graphics mode || Gate Array&lt;br /&gt;
|-&lt;br /&gt;
| rowspan=&amp;quot;2&amp;quot;|1 || rowspan=&amp;quot;2&amp;quot;|0 || rowspan=&amp;quot;2&amp;quot;|1 || style=&amp;quot;text-align: center;&amp;quot; rowspan=&amp;quot;2&amp;quot; | n || All || RMR || ''Ghost register'' || Gate Array (CPC) or locked ASIC (Plus)&lt;br /&gt;
|-&lt;br /&gt;
| Plus || RMR2 || ASIC &amp;amp; Advanced ROM mapping || Unlocked ASIC&lt;br /&gt;
|-&lt;br /&gt;
| 1 || 1 ||colspan=2  style=&amp;quot;text-align: center;&amp;quot; | n || All || MMR || RAM memory mapping || PAL (only with 128KB or RAM expansion)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
The MMR register is not available in the Gate Array, but is performed by a device at the same I/O port address location.&lt;br /&gt;
&lt;br /&gt;
In the CPC464, CPC664 and KC compact, MMR is performed in an external memory expansion (e.g. Dk'Tronics 64K RAM Expansion), if this expansion is not present then MMR is not available.&lt;br /&gt;
&lt;br /&gt;
In the CPC6128, MMR is performed by a [[PAL16L8|PAL chip]] located on the main PCB, or an external memory expansion.&lt;br /&gt;
&lt;br /&gt;
In the 464+ and 6128+, MMR is performed by the ASIC or an external memory expansion. Please read the document on RAM management for more information.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Registers ==&lt;br /&gt;
&lt;br /&gt;
Note: The Plus palette capabilities are only accessible through the [[Default I/O Port Summary|ASIC I/O page]]. Registers PENR and INKR are not needed in that case.&lt;br /&gt;
&lt;br /&gt;
=== Register PENR (Select a color register) ===&lt;br /&gt;
&lt;br /&gt;
When bit 7 and bit 6 are set to &amp;quot;0&amp;quot;, the remaining bits determine which pen is to have its colour changed. When bit 4 is set to &amp;quot;0&amp;quot;, bits 3 to 0 define which pen is to be selected. When bit 4 is set to &amp;quot;1&amp;quot;, the value contained in bits 3-0 is ignored and the border is selected. &lt;br /&gt;
&lt;br /&gt;
The pen remains selected until another is chosen. &lt;br /&gt;
&lt;br /&gt;
Each mode has a fixed number of pens. Mode 0 has 16 pens, mode 1 has 4 pens and mode 2 has 2 pens. &lt;br /&gt;
&lt;br /&gt;
==== Summary  ====&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!Bit&lt;br /&gt;
!Value&lt;br /&gt;
!Function&lt;br /&gt;
|-&lt;br /&gt;
| 7 || 0 || rowspan=&amp;quot;2&amp;quot; | Gate Array PENR register&lt;br /&gt;
|-&lt;br /&gt;
| 6 || 0 &lt;br /&gt;
|-&lt;br /&gt;
| 5 || - || not used&lt;br /&gt;
|-&lt;br /&gt;
| 4 || 1 || Select border&lt;br /&gt;
|-&lt;br /&gt;
| 3 || x || rowspan=&amp;quot;4&amp;quot; | Ignored&lt;br /&gt;
|-&lt;br /&gt;
| 2 || x&lt;br /&gt;
|-&lt;br /&gt;
| 1 || x&lt;br /&gt;
|-&lt;br /&gt;
| 0 || x&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!Bit&lt;br /&gt;
!Value&lt;br /&gt;
!Function&lt;br /&gt;
|-&lt;br /&gt;
| 7 || 0 || rowspan=&amp;quot;2&amp;quot; | Gate Array PENR register&lt;br /&gt;
|-&lt;br /&gt;
| 6 || 0&lt;br /&gt;
|-&lt;br /&gt;
| 5 || - || not used&lt;br /&gt;
|-&lt;br /&gt;
| 4 || 0 || Select pen&lt;br /&gt;
|-&lt;br /&gt;
| 3 || x || rowspan=&amp;quot;4&amp;quot; | Pen number&lt;br /&gt;
|-&lt;br /&gt;
| 2 || x&lt;br /&gt;
|-&lt;br /&gt;
| 1 || x&lt;br /&gt;
|-&lt;br /&gt;
| 0 || x&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Register INKR (Change the value of the currently selected color register) ===&lt;br /&gt;
&lt;br /&gt;
Once the pen has been selected its colour can then be changed. Bits 4 to 0 specify the hardware colour number from the hardware colour palette. &lt;br /&gt;
&lt;br /&gt;
Even though there is provision for 32 colours, only 27 are possible. The remaining colours are duplicates of those already in the colour palette. &lt;br /&gt;
&lt;br /&gt;
==== Summary  ====&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!Bit&lt;br /&gt;
!Value&lt;br /&gt;
!Function&lt;br /&gt;
|-&lt;br /&gt;
| 7 || 0 || rowspan=&amp;quot;2&amp;quot; | Gate Array INKR register&lt;br /&gt;
|-&lt;br /&gt;
| 6 || 1&lt;br /&gt;
|-&lt;br /&gt;
| 5 || - || not used&lt;br /&gt;
|-&lt;br /&gt;
| 4 || x || rowspan=&amp;quot;5&amp;quot; | Colour number x&lt;br /&gt;
|-&lt;br /&gt;
| 3 || x &lt;br /&gt;
|-&lt;br /&gt;
| 2 || x &lt;br /&gt;
|-&lt;br /&gt;
| 1 || x&lt;br /&gt;
|-&lt;br /&gt;
| 0 || x&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Register RMR (Control Interrupt counter, ROM mapping and Graphics mode) ===&lt;br /&gt;
&lt;br /&gt;
This is a general purpose register responsible for the [[Video modes|graphics mode]] and the ROM configuration. &lt;br /&gt;
&lt;br /&gt;
==== Graphics mode selection  ====&lt;br /&gt;
&lt;br /&gt;
The function of bits 1 and 0 is to define the screen mode. The settings for bits 1 and 0 and the corresponding screen mode are given in the table below. &lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!Bit 1&lt;br /&gt;
!Bit 0&lt;br /&gt;
!Screen mode&lt;br /&gt;
|-&lt;br /&gt;
| 0 || 0 || Mode 0, 160x200 resolution, 16 colours&lt;br /&gt;
|-&lt;br /&gt;
| 0 || 1 || Mode 1, 320x200 resolution, 4 colours&lt;br /&gt;
|-&lt;br /&gt;
| 1 || 0 || Mode 2, 640x200 resolution, 2 colours&lt;br /&gt;
|-&lt;br /&gt;
| 1 || 1 || Mode 3, 160x200 resolution, 4 colours (undocumented)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
* Mode 3 is not official. From the combinations possible, we can see that 4 modes can be defined, although the Amstrad only has 3. Mode 3 is similar to mode 0, because it has the same resolution, but it is limited to only 4 colours. Mode 3 is not supported by the [[KC Compact]] (which outputs black in Mode 3).&lt;br /&gt;
&lt;br /&gt;
Mode changing is synchronised with HSYNC. If the mode is changed, it will take effect from the next HSYNC.&lt;br /&gt;
&lt;br /&gt;
==== ROM configuration selection  ====&lt;br /&gt;
&lt;br /&gt;
Bit 2 is used to enable or disable the lower ROM area. The lower ROM area occupies memory addresses &amp;amp;amp;0000-&amp;amp;amp;3fff and is used to access the operating system ROM. When the lower ROM area is is enabled, reading from &amp;amp;amp;0000-&amp;amp;amp;3FFF will return data in the ROM. When a value is written to &amp;amp;amp;0000-&amp;amp;amp;3FFF, it will be written to the RAM underneath the ROM. When it is disabled, data read from &amp;amp;amp;0000-&amp;amp;amp;3FFF will return the data in the RAM. &lt;br /&gt;
&lt;br /&gt;
Similarly, bit 3 controls enabling or disabling of the upper ROM area. The upper ROM area occupies memory addressess &amp;amp;amp;C000-&amp;amp;amp;FFFF and is BASIC or any expansion ROMs which may be plugged into a ROM board/box. See the document on [[Upper ROM Bank Number|upper rom selection]] for more details. When the upper ROM area enabled, reading from &amp;amp;amp;c000-&amp;amp;amp;ffff, will return data in the ROM. When data is written to &amp;amp;amp;c000-&amp;amp;amp;FFFF, it will be written to the RAM at the same address as the ROM. When the upper ROM area is disabled, and data is read from &amp;amp;amp;c000-&amp;amp;amp;ffff it will be the data in the RAM. &lt;br /&gt;
&lt;br /&gt;
Bit 4 controls the interrupt generation. It can be used to delay interrupts. See the document on interrupt generation for more information.&lt;br /&gt;
&lt;br /&gt;
==== Summary  ====&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!Bit&lt;br /&gt;
!Value&lt;br /&gt;
!Function&lt;br /&gt;
|-&lt;br /&gt;
| 7 || 1 || rowspan=&amp;quot;2&amp;quot; | Gate Array RMR register&lt;br /&gt;
|-&lt;br /&gt;
| 6 || 0 &lt;br /&gt;
|-&lt;br /&gt;
| 5 || - || ''must be 0 on Plus machines with ASIC unlocked''&lt;br /&gt;
|-&lt;br /&gt;
| 4 || x || Interrupt generation control&lt;br /&gt;
|-&lt;br /&gt;
| 3 || x || 1=Upper ROM area disable, 0=Upper ROM area enable&lt;br /&gt;
|-&lt;br /&gt;
| 2 || x || 1=Lower ROM area disable, 0=Lower ROM area enable&lt;br /&gt;
|-&lt;br /&gt;
| 1 || x || rowspan=&amp;quot;2&amp;quot; | Graphics Mode selection&lt;br /&gt;
|-&lt;br /&gt;
| 0 || x&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Register RMR2 (ASIC &amp;amp; Advanced ROM mapping) ===&lt;br /&gt;
&lt;br /&gt;
This register exists only in Plus or GX4000, and is only accessible when the ASIC is unlocked.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!Bit&lt;br /&gt;
!Value&lt;br /&gt;
!Function&lt;br /&gt;
|-&lt;br /&gt;
| 7 || 1 || rowspan=&amp;quot;3&amp;quot; | Gate Array RMR2 register&lt;br /&gt;
|-&lt;br /&gt;
| 6 || 0&lt;br /&gt;
|-&lt;br /&gt;
| 5 || 1&lt;br /&gt;
|-&lt;br /&gt;
| 4 || x || rowspan=&amp;quot;2&amp;quot; |RMR addressing mode&lt;br /&gt;
|-&lt;br /&gt;
| 3 || x&lt;br /&gt;
|-&lt;br /&gt;
| 2 || x || rowspan=&amp;quot;3&amp;quot; | Physical ROM number (0..7)&lt;br /&gt;
|-&lt;br /&gt;
| 1 || x&lt;br /&gt;
|-&lt;br /&gt;
| 0 || x&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ RMR addressing modes&lt;br /&gt;
!Bit 4&lt;br /&gt;
!Bit 3&lt;br /&gt;
!Lower ROM&lt;br /&gt;
![[ASIC|ASIC I/O page]]&lt;br /&gt;
|-&lt;br /&gt;
|0&lt;br /&gt;
|0&lt;br /&gt;
|&amp;amp;0000-&amp;amp;3FFF&lt;br /&gt;
|Disabled&lt;br /&gt;
|-&lt;br /&gt;
|0&lt;br /&gt;
|1&lt;br /&gt;
|&amp;amp;4000-&amp;amp;7FFF&lt;br /&gt;
|Disabled&lt;br /&gt;
|-&lt;br /&gt;
|1&lt;br /&gt;
|0&lt;br /&gt;
|&amp;amp;8000-&amp;amp;BFFF&lt;br /&gt;
|Disabled&lt;br /&gt;
|-&lt;br /&gt;
|1&lt;br /&gt;
|1&lt;br /&gt;
|&amp;amp;0000-&amp;amp;3FFF&lt;br /&gt;
|&amp;amp;4000-&amp;amp;7FFF&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
The physical ROMs are also accessible as upper ROMs by using the [[Upper ROM Bank Number]] port and the RMR register.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Register MMR (RAM memory mapping) ===&lt;br /&gt;
&lt;br /&gt;
This register exists only in CPCs with 128K RAM (like the CPC 6128), or CPCs equipped with [[Standard Memory Expansions]].&lt;br /&gt;
&lt;br /&gt;
Note: In the CPC 6128, the register is a separate [[PAL16L8|PAL chip]] that assists the Gate Array chip.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!Bit&lt;br /&gt;
!Value&lt;br /&gt;
!Function&lt;br /&gt;
|-&lt;br /&gt;
| 7 || 1 || rowspan=&amp;quot;2&amp;quot; | Gate Array MMR register&lt;br /&gt;
|-&lt;br /&gt;
| 6 || 1 &lt;br /&gt;
|-&lt;br /&gt;
| 5 || x || rowspan=&amp;quot;3&amp;quot; |64K bank number (0..7); always 0 on an unexpanded CPC6128, 0-7 on [[Standard Memory Expansions]]&lt;br /&gt;
|-&lt;br /&gt;
| 4 || x&lt;br /&gt;
|-&lt;br /&gt;
| 3 || x&lt;br /&gt;
|-&lt;br /&gt;
| 2 || x || rowspan=&amp;quot;3&amp;quot; | RAM Config (0..7)&lt;br /&gt;
|-&lt;br /&gt;
| 1 || x&lt;br /&gt;
|-&lt;br /&gt;
| 0 || x&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
The 3bit RAM Config value is used to access the second 64K of the total 128K RAM that is built into the CPC 6128 or the additional 64K-512K of standard memory expansions. These contain up to eight 64K ram banks, which are selected with bit 3-5. A standard CPC 6128 only contains bank 0. Normally the register is set to 0, so that only the first 64K RAM are used (identical to the CPC 464 and 664 models). The register can be used to select between the following eight predefined configurations only:&lt;br /&gt;
&lt;br /&gt;
  -Address-     0      1      2      3      4      5      6      7&lt;br /&gt;
  0000-3FFF   RAM_0  RAM_0  '''RAM_4'''  RAM_0  RAM_0  RAM_0  RAM_0  RAM_0&lt;br /&gt;
  4000-7FFF   RAM_1  RAM_1  '''RAM_5'''  '''RAM_3'''  '''RAM_4'''  '''RAM_5'''  '''RAM_6'''  '''RAM_7'''&lt;br /&gt;
  8000-BFFF   RAM_2  RAM_2  '''RAM_6'''  RAM_2  RAM_2  RAM_2  RAM_2  RAM_2&lt;br /&gt;
  C000-FFFF   RAM_3  '''RAM_7'''  '''RAM_7'''  '''RAM_7'''  RAM_3  RAM_3  RAM_3  RAM_3&lt;br /&gt;
&lt;br /&gt;
The Video RAM is always located in the first 64K, VRAM is in no way affected by this register.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Programming the Gate Array - Examples  ==&lt;br /&gt;
&lt;br /&gt;
Defining the colours, &amp;lt;br&amp;gt;Setting pen 0 to Bright White. &lt;br /&gt;
&amp;lt;pre&amp;gt;LD BC,7F00&amp;amp;nbsp;;Gate Array port&lt;br /&gt;
LD A,%00000000+0&amp;amp;nbsp;;Pen number (and Gate Array function)&lt;br /&gt;
OUT (C),A&amp;amp;nbsp;;Send pen number&lt;br /&gt;
LD A,%01000000+11&amp;amp;nbsp;;Pen colour (and Gate Array function)&lt;br /&gt;
OUT (C),A&amp;amp;nbsp;;Send it&lt;br /&gt;
RET&lt;br /&gt;
&lt;br /&gt;
Setting the mode and ROM configuration, &lt;br /&gt;
Mode 2, upper and lower ROM disabled.&lt;br /&gt;
&lt;br /&gt;
LD BC,7F00&amp;amp;nbsp;;Gate array port&lt;br /&gt;
LD A,%10000000+%00001110&amp;amp;nbsp;;Mode and ROM selection (and Gate Array function)&lt;br /&gt;
OUT (C),A&amp;amp;nbsp;;Send it&lt;br /&gt;
RET&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Misc ===&lt;br /&gt;
&lt;br /&gt;
The hardware colour number is different to the colour range used by the firmware, so a conversion chart is provided for the corresponding firmware/hardware colour values and the corresponding colour name. &lt;br /&gt;
&lt;br /&gt;
=== Note ===&lt;br /&gt;
&lt;br /&gt;
The firmware keeps track of the colours it is using. Every VSYNC (assuming interrupts are enabled) the firmware sets the colours. This enables the user to have flashing colours. If the user selects a new colour using the gate array, the new colour will flash temporarily and then return to its original colour. This is due to the firmware resetting the colour. When using the firmware, use its routines to select the colour, and the colour will remain.&lt;br /&gt;
&lt;br /&gt;
Example: [For whatever reason, this example does NOT refer to the above firmware stuff]&lt;br /&gt;
&amp;lt;pre&amp;gt;ld bc,7f00+1&amp;amp;nbsp;;Gate array function (set pen)&lt;br /&gt;
;and pen number&lt;br /&gt;
out (c),c&lt;br /&gt;
ld bc,7f00&amp;amp;nbsp;;41 &lt;br /&gt;
;Gate array function (set colour)&lt;br /&gt;
;and colour number&lt;br /&gt;
out (c),c&lt;br /&gt;
ret&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Video memory structure ==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!rowspan=2|Graphics Mode&lt;br /&gt;
!colspan=8|VRAM byte&lt;br /&gt;
!colspan=8|Displayed Pixels&lt;br /&gt;
!rowspan=2|Definition&lt;br /&gt;
!rowspan=2|Pixel clock&lt;br /&gt;
!rowspan=2|Default resolution&lt;br /&gt;
|-&lt;br /&gt;
!7&lt;br /&gt;
!6&lt;br /&gt;
!5&lt;br /&gt;
!4&lt;br /&gt;
!3&lt;br /&gt;
!2&lt;br /&gt;
!1&lt;br /&gt;
!0&lt;br /&gt;
!1&lt;br /&gt;
!2&lt;br /&gt;
!3&lt;br /&gt;
!4&lt;br /&gt;
!5&lt;br /&gt;
!6&lt;br /&gt;
!7&lt;br /&gt;
!8&lt;br /&gt;
|-&lt;br /&gt;
|0&lt;br /&gt;
|A0&lt;br /&gt;
|B0&lt;br /&gt;
|A2&lt;br /&gt;
|B2&lt;br /&gt;
|A1&lt;br /&gt;
|B1&lt;br /&gt;
|A3&lt;br /&gt;
|B3&lt;br /&gt;
|colspan=4 style=&amp;quot;text-align: center;&amp;quot;|A&lt;br /&gt;
|colspan=4 style=&amp;quot;text-align: center;&amp;quot;|B&lt;br /&gt;
|2 pixels in 16 colours&lt;br /&gt;
|4 MHz&lt;br /&gt;
|160x200, 20-column text&lt;br /&gt;
|-&lt;br /&gt;
|1&lt;br /&gt;
|A0&lt;br /&gt;
|B0&lt;br /&gt;
|C0&lt;br /&gt;
|D0&lt;br /&gt;
|A1&lt;br /&gt;
|B1&lt;br /&gt;
|C1&lt;br /&gt;
|D1&lt;br /&gt;
|colspan=2 style=&amp;quot;text-align: center;&amp;quot;|A&lt;br /&gt;
|colspan=2 style=&amp;quot;text-align: center;&amp;quot;|B&lt;br /&gt;
|colspan=2 style=&amp;quot;text-align: center;&amp;quot;|C&lt;br /&gt;
|colspan=2 style=&amp;quot;text-align: center;&amp;quot;|D&lt;br /&gt;
|4 pixels in 4 colours&lt;br /&gt;
|8 MHz&lt;br /&gt;
|320x200, 40-column text&lt;br /&gt;
|-&lt;br /&gt;
|2&lt;br /&gt;
|A0&lt;br /&gt;
|B0&lt;br /&gt;
|C0&lt;br /&gt;
|D0&lt;br /&gt;
|E0&lt;br /&gt;
|F0&lt;br /&gt;
|G0&lt;br /&gt;
|H0&lt;br /&gt;
|A&lt;br /&gt;
|B&lt;br /&gt;
|C&lt;br /&gt;
|D&lt;br /&gt;
|E&lt;br /&gt;
|F&lt;br /&gt;
|G&lt;br /&gt;
|H&lt;br /&gt;
|8 pixels in 2 colours&lt;br /&gt;
|16 MHz&lt;br /&gt;
|640x200, 80-column text&lt;br /&gt;
|-&lt;br /&gt;
|3&lt;br /&gt;
|A0&lt;br /&gt;
|B0&lt;br /&gt;
|x&lt;br /&gt;
|x&lt;br /&gt;
|A1&lt;br /&gt;
|B1&lt;br /&gt;
|x&lt;br /&gt;
|x&lt;br /&gt;
|colspan=4 style=&amp;quot;text-align: center;&amp;quot;|A&lt;br /&gt;
|colspan=4 style=&amp;quot;text-align: center;&amp;quot;|B&lt;br /&gt;
|2 pixels in 4 colours&lt;br /&gt;
|4 MHz&lt;br /&gt;
|160x200, 20-column text&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Split rasters ==&lt;br /&gt;
&lt;br /&gt;
On the CPC, split rasters occur halfway (after the 8th mode2 pixel) through the rendering of a CRTC character.&lt;br /&gt;
&lt;br /&gt;
On Amstrad Plus, split rasters occur quarter of the way (after the 4th mode2 pixel) through the rendering of a CRTC character.&lt;br /&gt;
&lt;br /&gt;
To easily make split rasters compatible with both the CPC and the Plus machines, one can use the ASIC soft-scroll control register (SSCR) to finely adjust the horizontal position of the graphics.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Palette R,G,B definitions ==&lt;br /&gt;
&lt;br /&gt;
There are 27 colours which are generated from red, green and blue mixed in different quantities. There are 3 levels of red, 3 levels of green and 3 levels of blue, and these can be thought of as off/no colour, half-on/half-colour, and on/full-colour. &lt;br /&gt;
&lt;br /&gt;
To display a CPC image you will need to use a analogue monitor with a composite sync.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Palette sorted by Firmware Colour Numbers ===&lt;br /&gt;
&lt;br /&gt;
The firmware colour palette is sorted by luminance value.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
|-&lt;br /&gt;
!Firmware Number&lt;br /&gt;
!Hardware Number&lt;br /&gt;
!Colour Name&lt;br /&gt;
!R %&lt;br /&gt;
!G %&lt;br /&gt;
!B %&lt;br /&gt;
!ASIC&lt;br /&gt;
!Colour&lt;br /&gt;
|-&lt;br /&gt;
| 0|| 54h          ||Black          ||  0||  0||  0|| #000||bgcolor=&amp;quot;#000000&amp;quot;|&lt;br /&gt;
|-&lt;br /&gt;
| 1|| 44h (or 50h) ||Blue           ||  0||  0|| 50|| #006||bgcolor=&amp;quot;#000080&amp;quot;|&lt;br /&gt;
|-&lt;br /&gt;
| 2|| 55h          ||Bright Blue    ||  0||  0||100|| #00F||bgcolor=&amp;quot;#0000ff&amp;quot;|&lt;br /&gt;
|-&lt;br /&gt;
| 3|| 5Ch          ||Red            || 50||  0||  0|| #600||bgcolor=&amp;quot;#800000&amp;quot;|&lt;br /&gt;
|-&lt;br /&gt;
| 4|| 58h          ||Magenta        || 50||  0|| 50|| #606||bgcolor=&amp;quot;#800080&amp;quot;|&lt;br /&gt;
|-&lt;br /&gt;
| 5|| 5Dh          ||Mauve          || 50||  0||100|| #60F||bgcolor=&amp;quot;#8000ff&amp;quot;|&lt;br /&gt;
|-&lt;br /&gt;
| 6|| 4Ch          ||Bright Red     ||100||  0||  0|| #F00||bgcolor=&amp;quot;#ff0000&amp;quot;|&lt;br /&gt;
|-&lt;br /&gt;
| 7|| 45h (or 48h) ||Purple         ||100||  0|| 50|| #F06||bgcolor=&amp;quot;#ff0080&amp;quot;|&lt;br /&gt;
|-&lt;br /&gt;
| 8|| 4Dh          ||Bright Magenta ||100||  0||100|| #F0F||bgcolor=&amp;quot;#ff00ff&amp;quot;|&lt;br /&gt;
|-&lt;br /&gt;
| 9|| 56h          ||Green          ||  0|| 50||  0|| #060||bgcolor=&amp;quot;#008000&amp;quot;|&lt;br /&gt;
|-&lt;br /&gt;
|10|| 46h          ||Cyan           ||  0|| 50|| 50|| #066||bgcolor=&amp;quot;#008080&amp;quot;|&lt;br /&gt;
|-&lt;br /&gt;
|11|| 57h          ||Sky Blue       ||  0|| 50||100|| #06F||bgcolor=&amp;quot;#0080ff&amp;quot;|&lt;br /&gt;
|-&lt;br /&gt;
|12|| 5Eh          ||Yellow         || 50|| 50||  0|| #660||bgcolor=&amp;quot;#808000&amp;quot;|&lt;br /&gt;
|-&lt;br /&gt;
|13|| 40h (or 41h) ||White          || 50|| 50|| 50||#666||bgcolor=&amp;quot;#808080&amp;quot;|&lt;br /&gt;
|-&lt;br /&gt;
|14|| 5Fh          ||Pastel Blue    || 50|| 50||100|| #66F||bgcolor=&amp;quot;#8080ff&amp;quot;|&lt;br /&gt;
|-&lt;br /&gt;
|15|| 4Eh          ||Orange         ||100|| 50||  0|| #F60|| bgcolor=&amp;quot;#ff8000&amp;quot;|&lt;br /&gt;
|-&lt;br /&gt;
|16|| 47h          ||Pink           ||100|| 50|| 50|| #F66||bgcolor=&amp;quot;#ff8080&amp;quot;|&lt;br /&gt;
|-&lt;br /&gt;
|17|| 4Fh          ||Pastel Magenta ||100|| 50||100|| #F6F||bgcolor=&amp;quot;#ff80ff&amp;quot;|&lt;br /&gt;
|-&lt;br /&gt;
|18|| 52h          ||Bright Green   ||  0||100||  0|| #0F0||bgcolor=&amp;quot;#00ff00&amp;quot;|&lt;br /&gt;
|-&lt;br /&gt;
|19|| 42h (or 51h) ||Sea Green      ||  0||100|| 50|| #0F6||bgcolor=&amp;quot;#00ff80&amp;quot;|&lt;br /&gt;
|-&lt;br /&gt;
|20|| 53h          ||Bright Cyan    ||  0||100||100|| #0FF||bgcolor=&amp;quot;#00ffff&amp;quot;|&lt;br /&gt;
|-&lt;br /&gt;
|21|| 5Ah          ||Lime           || 50||100||  0|| #6F0||bgcolor=&amp;quot;#80ff00&amp;quot;|&lt;br /&gt;
|-&lt;br /&gt;
|22|| 59h          ||Pastel Green   || 50||100|| 50|| #6F6||bgcolor=&amp;quot;#80ff80&amp;quot;|&lt;br /&gt;
|-&lt;br /&gt;
|23|| 5Bh          ||Pastel Cyan    || 50||100||100|| #6FF||bgcolor=&amp;quot;#80ffff&amp;quot;|&lt;br /&gt;
|-&lt;br /&gt;
|24|| 4Ah          ||Bright Yellow  ||100||100||  0|| #FF0||bgcolor=&amp;quot;#ffff00&amp;quot;|&lt;br /&gt;
|-&lt;br /&gt;
|25|| 43h (or 49h) ||Pastel Yellow  ||100||100|| 50||#FF6||bgcolor=&amp;quot;#ffff80&amp;quot;|&lt;br /&gt;
|-&lt;br /&gt;
|26|| 4Bh          ||Bright White   ||100||100||100|| #FFF||bgcolor=&amp;quot;#ffffff&amp;quot;|&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Note: We can observe that the official Amstrad names of some colours are a bit silly: &amp;quot;red&amp;quot; is in fact brown, &amp;quot;yellow&amp;quot; is in fact khaki and &amp;quot;white&amp;quot; is in fact grey.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Amstrad Colour Names ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;gallery&amp;gt;&lt;br /&gt;
Cpc 6128 master colour chat.jpg|Master colour chart&lt;br /&gt;
Cpc 6128 farbtabelle.jpg|Farbtabelle&lt;br /&gt;
Cpc 6128 palette des couleurs.jpg|Palette des couleurs&lt;br /&gt;
Cpc 6128 tabla de colores.jpg|Tabla de colores&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Palette sorted by Hardware Colour Numbers ===&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!Hardware Number&lt;br /&gt;
!Firmware Number&lt;br /&gt;
!R %&lt;br /&gt;
!G %&lt;br /&gt;
!B %&lt;br /&gt;
!ASIC&lt;br /&gt;
!Colour&lt;br /&gt;
!Colour Name&lt;br /&gt;
!German Name&lt;br /&gt;
!French Name&lt;br /&gt;
!Spanish Name&lt;br /&gt;
|-&lt;br /&gt;
|  0 (40h) || 13   || 50|| 50|| 50|| #666|| bgcolor=&amp;quot;#808080&amp;quot; | || White         || Weiß            || Blanc           || Blanco&lt;br /&gt;
|-&lt;br /&gt;
|  1 (41h) || (13) || 50|| 50|| 50|| #666|| bgcolor=&amp;quot;#808080&amp;quot; | || White         || Weiß            || Blanc           || Blanco&lt;br /&gt;
|-&lt;br /&gt;
|  2 (42h) || 19   ||  0||100|| 50|| #0F6|| bgcolor=&amp;quot;#00ff80&amp;quot; | || Sea Green     || Seegrün         || Vert marin      || Verde marino&lt;br /&gt;
|-&lt;br /&gt;
|  3 (43h) || 25   ||100||100|| 50|| #FF6|| bgcolor=&amp;quot;#ffff80&amp;quot; | || Pastel Yellow || Pastellgelb     || Jaune pastel    || Amarillo pastel&lt;br /&gt;
|-&lt;br /&gt;
|  4 (44h) || 1    ||  0||  0|| 50|| #006|| bgcolor=&amp;quot;#000080&amp;quot; | || Blue          || Blau            || Bleu            || Azul&lt;br /&gt;
|-&lt;br /&gt;
|  5 (45h) || 7    ||100||  0|| 50|| #F06|| bgcolor=&amp;quot;#ff0080&amp;quot; | || Purple        || Purpur          || Pourpre         || Púrpura&lt;br /&gt;
|-&lt;br /&gt;
|  6 (46h) || 10   ||  0|| 50|| 50|| #066|| bgcolor=&amp;quot;#008080&amp;quot; | || Cyan          || Blaugrün        || Turquoise       || Ciano&lt;br /&gt;
|-&lt;br /&gt;
|  7 (47h) || 16   ||100|| 50|| 50|| #F66|| bgcolor=&amp;quot;#ff8080&amp;quot; | || Pink          || Rosa            || Rose            || Rosa&lt;br /&gt;
|-&lt;br /&gt;
|  8 (48h) || (7)  ||100||  0|| 50|| #F06|| bgcolor=&amp;quot;#ff0080&amp;quot; | || Purple        || Purpur          || Pourpre         || Púrpura&lt;br /&gt;
|-&lt;br /&gt;
|  9 (49h) || (25) ||100||100|| 50|| #FF6|| bgcolor=&amp;quot;#ffff80&amp;quot; | || Pastel Yellow || Pastellgelb     || Jaune pastel    || Amarillo pastel&lt;br /&gt;
|-&lt;br /&gt;
| 10 (4Ah) || 24   ||100||100||  0|| #FF0|| bgcolor=&amp;quot;#ffff00&amp;quot; | || Bright Yellow || Hellgelb        || Jaune vif       || Amarillo brillante&lt;br /&gt;
|-&lt;br /&gt;
| 11 (4Bh) || 26   ||100||100||100|| #FFF|| bgcolor=&amp;quot;#ffffff&amp;quot; | || Bright White  || Leuchtendweiß   || Blanc brillant  || Blanco brillante&lt;br /&gt;
|-&lt;br /&gt;
| 12 (4Ch) || 6    ||100||  0||  0|| #F00|| bgcolor=&amp;quot;#ff0000&amp;quot; | || Bright Red    || Hellrot         || Rouge vif       || Rojo brillante&lt;br /&gt;
|-&lt;br /&gt;
| 13 (4Dh) || 8    ||100||  0||100|| #F0F|| bgcolor=&amp;quot;#ff00ff&amp;quot; | || Bright Magenta|| helles Magenta  || Magenta vif     || Magenta brillante&lt;br /&gt;
|-&lt;br /&gt;
| 14 (4Eh) || 15   ||100|| 50||  0|| #F60|| bgcolor=&amp;quot;#ff8000&amp;quot; | || Orange        || Orange          || Orange          || Naranja&lt;br /&gt;
|-&lt;br /&gt;
| 15 (4Fh) || 17   ||100|| 50||100|| #F6F|| bgcolor=&amp;quot;#ff80ff&amp;quot; | || Pastel Magenta|| Pastell-magenta || Magenta pastel  || Magenta pastel&lt;br /&gt;
|-&lt;br /&gt;
| 16 (50h) || (1)  ||  0||  0|| 50|| #006|| bgcolor=&amp;quot;#000080&amp;quot; | || Blue          || Blau            || Bleu            || Azul&lt;br /&gt;
|-&lt;br /&gt;
| 17 (51h) || (19) ||  0||100|| 50|| #0F6|| bgcolor=&amp;quot;#00ff80&amp;quot; | || Sea Green     || Seegrün         || Vert marin      || Verde marino&lt;br /&gt;
|-&lt;br /&gt;
| 18 (52h) || 18   ||  0||100||  0|| #0F0|| bgcolor=&amp;quot;#00ff00&amp;quot; | || Bright Green  || Hellgrün        || Vert vif        || Verde brillante&lt;br /&gt;
|-&lt;br /&gt;
| 19 (53h) || 20   ||  0||100||100|| #0FF|| bgcolor=&amp;quot;#00ffff&amp;quot; | || Bright Cyan   || helles Blaugrün || Turquoise vif   || Ciano brillante&lt;br /&gt;
|-&lt;br /&gt;
| 20 (54h) || 0    ||  0||  0||  0|| #000|| bgcolor=&amp;quot;#000000&amp;quot; | || Black         || Schwarz         || Noir            || Negro&lt;br /&gt;
|-&lt;br /&gt;
| 21 (55h) || 2    ||  0||  0||100|| #00F|| bgcolor=&amp;quot;#0000ff&amp;quot; | || Bright Blue   || Hellblau        || Bleu vif        || Azul brillante&lt;br /&gt;
|-&lt;br /&gt;
| 22 (56h) || 9    ||  0|| 50||  0|| #060|| bgcolor=&amp;quot;#008000&amp;quot; | || Green         || Grün            || Vert            || Verde&lt;br /&gt;
|-&lt;br /&gt;
| 23 (57h) || 11   ||  0|| 50||100|| #06F|| bgcolor=&amp;quot;#0080ff&amp;quot; | || Sky Blue      || Himmelblau      || Bleu ciel       || Azul cielo&lt;br /&gt;
|-&lt;br /&gt;
| 24 (58h) || 4    || 50||  0|| 50|| #606|| bgcolor=&amp;quot;#800080&amp;quot; | || Magenta       || Magenta         || Magenta         || Magenta&lt;br /&gt;
|-&lt;br /&gt;
| 25 (59h) || 22   || 50||100|| 50|| #6F6|| bgcolor=&amp;quot;#80ff80&amp;quot; | || Pastel Green  || Pastellgrün     || Vert pastel     || Verde pastel&lt;br /&gt;
|-&lt;br /&gt;
| 26 (5Ah) || 21   || 50||100||  0|| #6F0|| bgcolor=&amp;quot;#80ff00&amp;quot; | || Lime          || Limonengrün     || Vert citron     || Verde lima&lt;br /&gt;
|-&lt;br /&gt;
| 27 (5Bh) || 23   || 50||100||100|| #6FF|| bgcolor=&amp;quot;#80ffff&amp;quot; | || Pastel Cyan   || Pastell-blaugrün|| Turquoise pastel|| Ciano pastel&lt;br /&gt;
|-&lt;br /&gt;
| 28 (5Ch) || 3    || 50||  0||  0|| #600|| bgcolor=&amp;quot;#800000&amp;quot; | || Red           || Rot             || Rouge           || Rojo&lt;br /&gt;
|-&lt;br /&gt;
| 29 (5Dh) || 5    || 50||  0||100|| #60F|| bgcolor=&amp;quot;#8000ff&amp;quot; | || Mauve         || Hellviolett     || Mauve           || Malva&lt;br /&gt;
|-&lt;br /&gt;
| 30 (5Eh) || 12   || 50|| 50||  0|| #660|| bgcolor=&amp;quot;#808000&amp;quot; | || Yellow        || Gelb            || Jaune           || Amarillo&lt;br /&gt;
|-&lt;br /&gt;
| 31 (5Fh) || 14   || 50|| 50||100|| #66F|| bgcolor=&amp;quot;#8080ff&amp;quot; | || Pastel Blue   || Pastellblau     || Bleu pastel     || Azul pastel&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Intensities ===&lt;br /&gt;
&lt;br /&gt;
The 0%, 50%, and 100% values in the above tables are &amp;quot;should-be&amp;quot; values. However, the real hardware doesn't exactly match that intensities. The actual intensities depend on the luminance mixing (R,G,B tied together via resistors), on chipset (classic CPC, or newer ASIC ones), and on the load applied by external hardware (Monitor, or TV set).&lt;br /&gt;
&lt;br /&gt;
On an actual Amstrad CPC, the half-intensity colour signal is measured to be closer to 40% rather than the expected 50%. This was verified by [[Grim]] and independently confirmed by [[Nocash]]. [https://www.grimware.org/doku.php/documentations/devices/gatearray#inkr Source]&lt;br /&gt;
* [[CPC Palette]] - some more details&lt;br /&gt;
&lt;br /&gt;
This explains why the Amstrad engineers used the following values to adapt the old colour palette to the new 12-bit palette on the Amstrad Plus:&lt;br /&gt;
* 0% became #0&lt;br /&gt;
* 50% became #6. They specifically chose #6 for the 50% value instead of the expected #7 or #8, to better match the real Amstrad CPC palette.&lt;br /&gt;
* 100% became #F&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Green Screen Colours ===&lt;br /&gt;
&lt;br /&gt;
On a green screen, where all colours are shades of unsaturated green, the firmware colours are in order of increasing intensity. Black is darkest green, bright white is brightest green, and firmware colour 13 is a medium green.&lt;br /&gt;
&lt;br /&gt;
The luminance (Y) is not exactly correlated to the actual luminance of colour images broadcast in RGB. Amstrad preferred to propose a completely different image system, not comparable to a conversion to monochrome, which would have limited the number of brightness levels to 21 (for example, colours 9 and 6 would have had the same luminance).&lt;br /&gt;
&lt;br /&gt;
They opted for a table of 27 linear brightness steps. They assigned values of 1 (1kΩ) for blue, 3 (3.3kΩ) for red, and 9 (10kΩ) for green.&lt;br /&gt;
&lt;br /&gt;
==== To calculate the luminance value ====&lt;br /&gt;
&lt;br /&gt;
'''Red''' &lt;br /&gt;
&lt;br /&gt;
*0% =&amp;amp;gt; do not add anything &lt;br /&gt;
*50% =&amp;amp;gt; add 3 &lt;br /&gt;
*100% =&amp;amp;gt; add 6 &lt;br /&gt;
&lt;br /&gt;
'''Green''' &lt;br /&gt;
&lt;br /&gt;
*0% =&amp;amp;gt; do not add anything &lt;br /&gt;
*50% =&amp;amp;gt; add 9 &lt;br /&gt;
*100% =&amp;amp;gt; add 18 &lt;br /&gt;
&lt;br /&gt;
'''Blue''' &lt;br /&gt;
&lt;br /&gt;
*0% =&amp;amp;gt; do not add anything &lt;br /&gt;
*50% =&amp;amp;gt; add 1 &lt;br /&gt;
*100% =&amp;amp;gt; add 2 &lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Pictures ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;gallery&amp;gt;&lt;br /&gt;
Image:40010_am2_metal.jpg|40010 GA Metal Layer&lt;br /&gt;
Image:40010_am2_acid.jpg|40010 GA with Metal Layer removed&lt;br /&gt;
Image:40226_am4_metal.jpg|40226 PreASIC Metal Layer&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[File:Ga.pinout.40007.png]] [[File:Ga.pinout.40008.40010.png]]&lt;br /&gt;
&lt;br /&gt;
Note: Some CPC motherboards can accommodate both types of Gate Array pinouts. [https://thecheshirec.at/2024/10/06/il-existe-une-carte-multi-gate-array-et-cest-amstrad-qui-la-faite/ Source]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== External links ==&lt;br /&gt;
*[https://bread80.com/2021/06/03/understanding-the-amstrad-cpc-video-ram-and-gate-array-subsystem/ Electronic signals analysis of the Gate Array by Bread80]&lt;br /&gt;
* [https://shaker.logonsystem.eu/ACCC1.8-EN.pdf Gate Array documentation in Amstrad CRTC Compendium]&lt;br /&gt;
* [https://www.grimware.org/doku.php/documentations/devices/gatearray Gate Array documentation from Grimware]&lt;br /&gt;
* [http://quasar.cpcscene.net/doku.php?id=assem:gate_array Quasar Gate Array documentation (in french)]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==See also==&lt;br /&gt;
&lt;br /&gt;
*[[Gate Array and ASIC Pin-Outs]]&lt;br /&gt;
*[[PAL16L8]] : for RAM arrangement&lt;br /&gt;
*[[ASIC]] : for Plus users&lt;br /&gt;
&lt;br /&gt;
*[[CRTC]] : the other video stuff&lt;br /&gt;
*[[Synchronising with the CRTC and display]] : technical details on the relationship between Gate Array and CRTC.&lt;br /&gt;
&lt;br /&gt;
*[[Video modes]] : for other informations on colours and pixels.&lt;br /&gt;
&lt;br /&gt;
*[[Media:40010-simplified V03.pdf]] [https://www.cpcwiki.eu/forum/amstrad-cpc-hardware/gate-array-decapped!/msg170713/#msg170713 Forum thread] Gate Array schematics - reverse engineered by Gerald&lt;br /&gt;
&lt;br /&gt;
[[Category:Hardware]][[Category:Programming]][[Category:Datasheet]][[Category:Graphic]][[Category:CPC Internal Components]][[Category:Electronic Component]]&lt;/div&gt;</summary>
		<author><name>Longshot</name></author>	</entry>

	<entry>
		<id>https://oldwiki.cpcwiki.eu/index.php?title=CRTC&amp;diff=126304</id>
		<title>CRTC</title>
		<link rel="alternate" type="text/html" href="https://oldwiki.cpcwiki.eu/index.php?title=CRTC&amp;diff=126304"/>
				<updated>2025-05-29T17:47:10Z</updated>
		
		<summary type="html">&lt;p&gt;Longshot: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[File:CRTC Type 0.jpg|thumb|right|CRTC Type 0 (Hitachi)]]&lt;br /&gt;
[[File:CRTC UMC Type 0.png|thumb|right|CRTC Type 0 (UMC)]]&lt;br /&gt;
[[File:CRTC Type 1.png|thumb|right|CRTC Type 1]]&lt;br /&gt;
[[File:CRTC6845-Type2.jpg|thumb|right|CRTC Type 2]]&lt;br /&gt;
&lt;br /&gt;
The 6845 '''CRTC''' (Cathode Ray Tube Controller) chip was created by Motorola in 1977. It works with the [[Gate Array]] to generate the video signal on the Amstrad CPC.&lt;br /&gt;
&lt;br /&gt;
This chip is also used in the [[BBC Micro]], [[Lynx|Camputers Lynx]], [[EG2000 Colour Genie]], [[Sharp X1]], [[MicroBee]], [[Commodore PET]] and the early graphics cards (MDA, Hercules, CGA, Plantronics Colorplus) for [[IBM PC]]. And it is found in some [https://www.msx.org/wiki/Hitachi_HD6845 MSX1 expansions], providing an 80-column text mode.&lt;br /&gt;
&lt;br /&gt;
It's important to note that the CRTC chip is primarily designed for character-based displays. It explains why, on the Amstrad CPC, the video memory is organized into a grid of characters rather than a purely linear bitmap.&lt;br /&gt;
&lt;br /&gt;
NOTE: This document describes the functionality in terms of the CPC with its separate CRTC and Gate-Array. The Plus has both integrated into the same IC, but could be considered to have two functional blocks, one for CRTC and one for Gate-Array. In this document the term 'Gate-Array' is used, but this also applies to the ASIC.&lt;br /&gt;
&lt;br /&gt;
== Overview ==&lt;br /&gt;
&lt;br /&gt;
The 6845 Cathode Ray Tube Controller (CRTC) is a programmable IC used to generate video displays. This IC is used in a variety of computers including the Amstrad CPC, Amstrad CPC+ and KC Compact. &lt;br /&gt;
&lt;br /&gt;
The CRTC is a simple chip. It is made up of counters and equality operators, tied by simple logic. All the complexity stems from its multiple independent implementations with their subtle differences.&lt;br /&gt;
&lt;br /&gt;
The CRTC was a common part available from many different manufacturers. During the life of the CPC, Amstrad sourced the CRTC from various manufacturers. &lt;br /&gt;
&lt;br /&gt;
All ICs used were based on the same design but have a different implementation. As a result they do not operate identically in all situations. This document highlights these differences. &lt;br /&gt;
&lt;br /&gt;
This table lists the known ICs used, with their part number, manufacturer and type number. &lt;br /&gt;
&lt;br /&gt;
{|{{Prettytable|width: 700px; font-size: 2em;}}&lt;br /&gt;
|''Part number''||''Manufacturer''||''Type number (note 3)''&lt;br /&gt;
|-&lt;br /&gt;
|HD6845S||Hitachi||0&lt;br /&gt;
|-&lt;br /&gt;
|UM6845||UMC||0&lt;br /&gt;
|-&lt;br /&gt;
|UM6845R||UMC||1&lt;br /&gt;
|-&lt;br /&gt;
|MC6845||Motorola||2&lt;br /&gt;
|-&lt;br /&gt;
|AMS40489||Amstrad||3 (note 1)&lt;br /&gt;
|-&lt;br /&gt;
|40226||Amstrad||4 (note 2)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
'''NOTES''' &lt;br /&gt;
&lt;br /&gt;
1. The CRTC functionality is integrated into the CPC+ ASIC. This type exists only in the CPC464+,CPC6128+ and GX4000. &lt;br /&gt;
&lt;br /&gt;
2. This type exists in &amp;quot;cost-down&amp;quot; CPC464 and CPC6128 systems. In the &amp;quot;cost-down&amp;quot; the CRTC functionality is integrated into a single ASIC IC. This ASIC is often refered to as the &amp;quot;Pre-ASIC&amp;quot; because it preceeded the CPC+ ASIC. The CRTC functionality of the Pre-ASIC is almost identical to the CRTC within the ASIC.&lt;br /&gt;
 &lt;br /&gt;
3. In the Amstrad community each 6845 implementation has been assigned a type number. This type identifies a group of implementations which operate in exactly the same way. &lt;br /&gt;
&lt;br /&gt;
As far as I know, the type number system was originally used by demo programmers. &lt;br /&gt;
&lt;br /&gt;
It is possible to detect the 6845 present using software methods, and this is done to: &lt;br /&gt;
&lt;br /&gt;
* warn that the software was not designed for the detected 6845 and may function incorrectly, &lt;br /&gt;
* to adapt the software so that it will run with the detected 6845 &lt;br /&gt;
* In most cases, the type of the detected 6845 is reported. &lt;br /&gt;
&lt;br /&gt;
4. As far as I know, the KC compact used HD6845R only.&lt;br /&gt;
&lt;br /&gt;
== Timings and relating with Z80 instructions count ==&lt;br /&gt;
&lt;br /&gt;
Some informations like : how many Z80 instructions can I fit within a scan line ? Within a screen ? Etc... See http://www.cpcwiki.eu/forum/programming/frame-flyback-and-interrupts/msg25106/#msg25106&lt;br /&gt;
(To be extracted/edited to conform to wiki good practices).&lt;br /&gt;
&lt;br /&gt;
==Programming==&lt;br /&gt;
&lt;br /&gt;
The 6845 is selected when bit 14 of the I/O port address is set to &amp;quot;0&amp;quot;. Bit 9 and 8 of the I/O port address define the function to access. The remaining bits can be any value, but it is adviseable to set these to &amp;quot;1&amp;quot; to avoid conflict with other devices in the system.&lt;br /&gt;
&lt;br /&gt;
The recommended I/O port addresses are:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!I/O port address&lt;br /&gt;
!/CS (A14)&lt;br /&gt;
!R/W (A9)&lt;br /&gt;
!RS (A8)&lt;br /&gt;
!Function&lt;br /&gt;
!Read/Write&lt;br /&gt;
|-&lt;br /&gt;
|&amp;amp;BCxx||0||0||0||Select 6845 register||Write only&lt;br /&gt;
|-&lt;br /&gt;
|&amp;amp;BDxx||0||0||1||Write to selected internal 6845 register||Write only&lt;br /&gt;
|-&lt;br /&gt;
|&amp;amp;BExx||0||1||0||&lt;br /&gt;
* CRTCs 0/2: —&lt;br /&gt;
* CRTC 1: Read Status Register&lt;br /&gt;
* CRTCs 3/4: Read from selected internal 6845 register&lt;br /&gt;
||Read only&lt;br /&gt;
|-&lt;br /&gt;
|&amp;amp;BFxx||0||1||1||Read from selected internal 6845 register||Read only&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
The CRTC is not connected to the CPU's RD and WR pins, so it cannot detect the bus's I/O direction. Therefore, executing an IN instruction to the select or write functions causes the CRTC to write the unpredictable data provided by the high-impedance bus to its registers.&lt;br /&gt;
&lt;br /&gt;
==Addressing==&lt;br /&gt;
&lt;br /&gt;
The VMA of the [[Gate Array]] is constructed from the CRTC MA and RA signals:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!Video Memory Address&lt;br /&gt;
!Signal source&lt;br /&gt;
!Signal name&lt;br /&gt;
|-&lt;br /&gt;
|A15||6845||MA13 &lt;br /&gt;
|-&lt;br /&gt;
|A14||6845||MA12&lt;br /&gt;
|-&lt;br /&gt;
|A13||6845||'''RA2'''&lt;br /&gt;
|-&lt;br /&gt;
|A12||6845||'''RA1'''&lt;br /&gt;
|-&lt;br /&gt;
|A11||6845||'''RA0'''&lt;br /&gt;
|-&lt;br /&gt;
|A10||6845||MA9 &lt;br /&gt;
|-&lt;br /&gt;
|A9||6845||MA8 &lt;br /&gt;
|-&lt;br /&gt;
|A8||6845||MA7 &lt;br /&gt;
|-&lt;br /&gt;
|A7||6845||MA6 &lt;br /&gt;
|-&lt;br /&gt;
|A6||6845||MA5 &lt;br /&gt;
|-&lt;br /&gt;
|A5||6845||MA4 &lt;br /&gt;
|-&lt;br /&gt;
|A4||6845||MA3 &lt;br /&gt;
|-&lt;br /&gt;
|A3||6845||MA2 &lt;br /&gt;
|-&lt;br /&gt;
|A2||6845||MA1 &lt;br /&gt;
|-&lt;br /&gt;
|A1||6845||MA0&lt;br /&gt;
|-&lt;br /&gt;
|A0||Gate-Array||CCLK&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
CRTC generates the address, Gate Array reads the data and converts it to pixels based on its current graphics mode and palette.&lt;br /&gt;
&lt;br /&gt;
CRTC pins RA3, RA4, MA10, MA11 are not connected on CPC.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Overscan bits ===&lt;br /&gt;
&lt;br /&gt;
It is possible to use 32KB screen size (used for [[Programming:Overscan|overscan]]) by setting bits 11 and 10 of Register 12 both to 1. Bits MA11 and MA10 of the address generated by the CRTC are not written on the address bus to access video memory; settings both bits to 1 is the only way to cause a carry to bit MA12 when address pass over the end of current video page to change the memory address to the next video page.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ CRTC Display Start Address&lt;br /&gt;
|-&lt;br /&gt;
! colspan=&amp;quot;8&amp;quot; | Register 12&lt;br /&gt;
! colspan=&amp;quot;8&amp;quot; | Register 13&lt;br /&gt;
|-&lt;br /&gt;
! 15 !! 14 !! 13 !! 12 !! 11 !! 10 !! 9 !! 8&lt;br /&gt;
! 7 !! 6 !! 5 !! 4 !! 3 !! 2 !! 1 !! 0&lt;br /&gt;
|-&lt;br /&gt;
| colspan=&amp;quot;2&amp;quot; | Unused&lt;br /&gt;
| colspan=&amp;quot;2&amp;quot; | Video Page&lt;br /&gt;
| colspan=&amp;quot;2&amp;quot; | Page Size&lt;br /&gt;
| colspan=&amp;quot;10&amp;quot; | Start Address (1024 positions)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| style=&amp;quot;white-space: nowrap;&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;margin-right: 32px&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Bit 13 !! Bit 12 !! Video Page&lt;br /&gt;
|-&lt;br /&gt;
| 0 || 0 || 0000 - 3FFF&lt;br /&gt;
|-&lt;br /&gt;
| 0 || 1 || 4000 - 7FFF&lt;br /&gt;
|-&lt;br /&gt;
| 1 || 0 || 8000 - BFFF&lt;br /&gt;
|-&lt;br /&gt;
| 1 || 1 || C000 - FFFF&lt;br /&gt;
|}&lt;br /&gt;
|&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Bit 11 !! Bit 10 !! Page Size&lt;br /&gt;
|-&lt;br /&gt;
| 0 || 0 || 16KB&lt;br /&gt;
|-&lt;br /&gt;
| 0 || 1 || 16KB&lt;br /&gt;
|-&lt;br /&gt;
| 1 || 0 || 16KB&lt;br /&gt;
|-&lt;br /&gt;
| 1 || 1 || '''32KB'''&lt;br /&gt;
|}&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Coarse hardware scrolling ===&lt;br /&gt;
&lt;br /&gt;
The start address can be manipulated to achieve horizontal and/or vertical hardware scrolling:&lt;br /&gt;
&lt;br /&gt;
*To move right: &amp;lt;code&amp;gt;start_address := start_address + 1&amp;lt;/code&amp;gt;&lt;br /&gt;
*To move left: &amp;lt;code&amp;gt;start_address := start_address - 1&amp;lt;/code&amp;gt;&lt;br /&gt;
*To move down: &amp;lt;code&amp;gt;start_address := start_address + R1&amp;lt;/code&amp;gt;&lt;br /&gt;
*To move up: &amp;lt;code&amp;gt;start_address := start_address - R1&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
However, it is a position in word (16 bits), not in byte. So, the screen will move two bytes at a time horizontally. Also, the precision will be one CRTC character vertically.&lt;br /&gt;
&lt;br /&gt;
The first game that used R12/R13 for both horizontal and vertical hardware scrolling is [https://www.cpc-power.com/index.php?page=detail&amp;amp;num=1839 Roland on the Ropes], released in 1984.&lt;br /&gt;
&lt;br /&gt;
The following BASIC program demonstrates the coarse scrolling by setting the R12 and R13 registers based on keyboard input:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
10 ma%=0&lt;br /&gt;
20 IF INKEY(1)=0 THEN GOSUB 100&lt;br /&gt;
30 IF INKEY(2)=0 THEN GOSUB 300&lt;br /&gt;
40 IF INKEY(8)=0 THEN GOSUB 500&lt;br /&gt;
50 IF INKEY(0)=0 THEN GOSUB 700&lt;br /&gt;
60 GOTO 20&lt;br /&gt;
100 ' right&lt;br /&gt;
110 ma%=ma%+1: GOSUB 900: RETURN&lt;br /&gt;
300 ' down&lt;br /&gt;
310 ma%=ma%+40: GOSUB 900: RETURN&lt;br /&gt;
500 ' left&lt;br /&gt;
510 ma%=ABS(ma%-1): GOSUB 900: RETURN&lt;br /&gt;
700 ' up&lt;br /&gt;
710 ma%=ABS(ma%-40): GOSUB 900: RETURN&lt;br /&gt;
900 ' set R12 and R13&lt;br /&gt;
910 l%=ma% AND 255: h%=&amp;amp;30 OR ((ma%\256) AND 3) :OUT &amp;amp;BC00,13:OUT &amp;amp;BD00,l%: OUT &amp;amp;BC00,12:OUT &amp;amp;BD00,h%&lt;br /&gt;
930 RETURN&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Which looks like the following:&lt;br /&gt;
&lt;br /&gt;
[[File:CRTC-Coarse-scroll.gif]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Advanced hardware scrolling ===&lt;br /&gt;
&lt;br /&gt;
To achieve smoother hardware scrolling, other tricks are required in complement to R12/R13. Usually, R3 is used for smooth horizontal scroll and R5 for smooth vertical scroll.&lt;br /&gt;
&lt;br /&gt;
A good example of smooth hardware multidirectional scrolling game on CPC is [https://www.cpc-power.com/index.php?page=detail&amp;amp;num=2119 Super Cauldron], released in 1993.&lt;br /&gt;
&lt;br /&gt;
Everything you need to know about hardware scrolling on CPC can be found [https://www.cpcwiki.eu/forum/programming/hardware-scrolling-21687/ there].&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Split screen (aka Rupture) ==&lt;br /&gt;
&lt;br /&gt;
While there is usually 1 CRTC frame per screen frame, the screen frame can be divided into multiple CRTC frames of varying proportions.&lt;br /&gt;
&lt;br /&gt;
This is useful for defining different scrolling zones in your screen frame. For example, it was used for hardware parallax scrolling in the game [https://www.cpc-power.com/index.php?page=detail&amp;amp;num=1307 The Living Daylights], released in 1987. [https://www.cpcwiki.eu/forum/programming/the-living-daylights-extra-colours-in-mode-1-rasters-screen-splits/ Source]&lt;br /&gt;
&lt;br /&gt;
And this is basically the bread and butter of innumerable CPC demos.&lt;br /&gt;
&lt;br /&gt;
Some rules of thumb [https://www.cpcwiki.eu/forum/programming/advice-on-split-screen-code/msg242186/ Source]:&lt;br /&gt;
* changes to the screen address have to be done anywhere in the previous split&lt;br /&gt;
* changes to the height of the split have to be done inside the current split (after it has started, in the area of the size of the previous split)&lt;br /&gt;
* changes to screen mode and colours are happening immediately&lt;br /&gt;
&lt;br /&gt;
CRTC registers and screen splitting:&lt;br /&gt;
*reg 0 (63) = x-screenwidth (usually always 63)&lt;br /&gt;
*reg 1 (50) = x-splitwidth (e.g.50)&lt;br /&gt;
*reg 2 (51) = x-splitstart (e.g. 51)&lt;br /&gt;
*reg 3 (08) = x-finestart (maybe use this for half-char scrolling)&lt;br /&gt;
*reg 4 (##) = y-splitheight-1 (set this inside the current split)&lt;br /&gt;
*reg 5 (00) = y-finestart&lt;br /&gt;
*reg 6 (25) = y-max visible splitpart (same like 4)&lt;br /&gt;
*reg 7 (##) = inside last split -&amp;gt; set to 0; inside first split, but after vblank -&amp;gt; set to 255&lt;br /&gt;
*reg 9 (07) = y-lines/char-1&lt;br /&gt;
&lt;br /&gt;
Set this inside the previous split:&lt;br /&gt;
*reg12 (##) = address high (char / 256 + block * 16)&lt;br /&gt;
*reg13 (##) = address low  (char mod 256)&lt;br /&gt;
&lt;br /&gt;
Total height of all splits must be 39.&lt;br /&gt;
&lt;br /&gt;
The [https://www.cpcwiki.eu/forum/programming/interrupt-positions-with-various-sized-screens/ IntPos tool] by Kevin Thacker can help visualize the potential split screen areas.&lt;br /&gt;
&lt;br /&gt;
Note: If all you want is multiple graphics modes in the same frame, you don't need to touch the CRTC at all. More information here: [https://www.cpc-power.com/cpcarchives/index.php?page=articles&amp;amp;num=184 Multi-Mode Graphique (FR)]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== CUDISP (aka CURSOR) ==&lt;br /&gt;
&lt;br /&gt;
CUDISP (Cursor Display) signal defines the hardware cursor.&lt;br /&gt;
&lt;br /&gt;
CRTC pin CUDISP is not connected to the Gate Array, so it has no effect on a barebone CPC or Plus machine.&lt;br /&gt;
&lt;br /&gt;
However, this signal is provided to the [[Connector:Expansion port]]. And it is used by the [[PlayCity]] and [[Play2CPC]] expansions.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== DISPTMG (aka Display Enable) ==&lt;br /&gt;
&lt;br /&gt;
DISPTMG (Display Timing) signal defines the border. When DISPTMG is &amp;quot;0&amp;quot; the border colour is output by the Gate Array to the display.&lt;br /&gt;
&lt;br /&gt;
The border has higher priority than pixels but lower priority than the black colour output when HSYNC/VSYNC are active.&lt;br /&gt;
&lt;br /&gt;
While border is active, all the CRTC counters continue to increment normally and addresses continue to be generated.&lt;br /&gt;
&lt;br /&gt;
The DISPTMG signal is composited from its 3 internal subcomponents: HBORDER (Horizontal), VBORDER (Vertical), SBORDER (Split) by using the NOR function. DISPTMG is &amp;quot;0&amp;quot; if at least one of its subcomponents is &amp;quot;1&amp;quot;. These 3 subcomponents are all independent of each other.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== HBORDER ===&lt;br /&gt;
&lt;br /&gt;
On all CRTCs, HBORDER is disabled when HCC=0 and enabled when HCC=R1.&lt;br /&gt;
&lt;br /&gt;
The exception is for CRTC2 during an HSYNC: the HCC=0 check is skipped, so HBORDER stays on.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== VBORDER ===&lt;br /&gt;
&lt;br /&gt;
On all CRTCs, VBORDER is disabled when VCC=0 and enabled when VCC=R6.&lt;br /&gt;
&lt;br /&gt;
On CRTCs 0/1/2, the condition VCC=R6 is tested on every cycle.&lt;br /&gt;
&lt;br /&gt;
On CRTCs 3/4, the condition VCC=R6 is tested only at each new character line start (when VLC=0 and HCC=0).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== SBORDER ===&lt;br /&gt;
&lt;br /&gt;
Split border is a technique similar to split rasters, except that it is handled by the CRTC instead of the [[Gate Array]].&lt;br /&gt;
&lt;br /&gt;
DISPTMG can be temporarily forced to 0 by using R8 (DISPTMG Skew) on CRTCs 0/3/4, or by setting R6=0 on CRTC 1.&lt;br /&gt;
&lt;br /&gt;
It is not possible to force DISPTMG on CRTC 2.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Border bytes ===&lt;br /&gt;
&lt;br /&gt;
Despite their 1MHz clock speed, CRTCs 0/2 have been observed to change state at a rate equivalent to 2MHz chips by responding to both the rising and falling edges of each clock cycle.&lt;br /&gt;
&lt;br /&gt;
==== Interline border ====&lt;br /&gt;
On CRTCs 0/2, R1&amp;gt;R0 generates one byte (0.5µs) of border at the end of the raster line. On CRTCs 1/3/4, it does not.&lt;br /&gt;
&lt;br /&gt;
To see the border bytes with your own eyes, type this BASIC line after reset:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
BORDER 6:OUT &amp;amp;BC00,6:OUT &amp;amp;BD00,0&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== HSYNC and VSYNC ==&lt;br /&gt;
&lt;br /&gt;
On CPC, HSYNC and VSYNC from the CRTC are passed into the Gate-Array.&lt;br /&gt;
&lt;br /&gt;
When HSYNC is active Gate-Array outputs the palette colour black. If the HSYNC is set to 14 characters then black will be output for 14us.&lt;br /&gt;
&lt;br /&gt;
The HSYNC is modified before being sent to the monitor. It  happens 2us after the HSYNC from the CRTC and lasts 4us when HSYNC length is greater or equal to 6. &lt;br /&gt;
&lt;br /&gt;
If R2=46, and HSYNC width is 14 then monitor hsync starts at 48 and lasts until 51.&lt;br /&gt;
&lt;br /&gt;
On a CPC monitor, the HSYNC is rendered in &amp;quot;absolute black&amp;quot;. It is darker than the black output by the Gate-Array.&lt;br /&gt;
&lt;br /&gt;
The VSYNC is also modified before being sent to the monitor. It happens two lines* after the VSYNC from the CRTC and stay two lines (same cut rule if VSYNC is lower than 4). PAL (50Hz) does need two lines VSYNC_width, and 4us HSYNC_width.&lt;br /&gt;
&lt;br /&gt;
Using CRTC1, VSYNC width value 0 means a value of 16.&lt;br /&gt;
&lt;br /&gt;
== The 6845 Registers ==&lt;br /&gt;
&lt;br /&gt;
The Internal registers of the 6845 are:&lt;br /&gt;
&lt;br /&gt;
{|{{Prettytable|width: 700px; font-size: 2em;}}&lt;br /&gt;
|''Register Index''||''Register Name''||''Range''||''CPC Setting''||''Notes''&lt;br /&gt;
|-&lt;br /&gt;
|0||Horizontal Total||00000000||63||Width of the screen, in characters. Should always be 63 (64 characters). 1 character == 1µs.&lt;br /&gt;
|-&lt;br /&gt;
|1||Horizontal Displayed||00000000||40||Number of characters displayed. Once horizontal character count (HCC) matches this value, DISPTMG is set to 1.&lt;br /&gt;
|-&lt;br /&gt;
|2||Horizontal Sync Position||00000000||46||When to start the HSync signal.&lt;br /&gt;
|-&lt;br /&gt;
|3||Horizontal and Vertical Sync Widths||VVVVHHHH||128+14||HSync pulse width in characters (0 means 16 on some CRTC), should always be more than 8; VSync width in scan-lines. (0 means 16 on some CRTC. Not present on all CRTCs, fixed to 16 lines on these)&lt;br /&gt;
|-&lt;br /&gt;
|4||Vertical Total||x0000000||38||Height of the screen, in characters.&lt;br /&gt;
|-&lt;br /&gt;
|5||Vertical Total Adjust||xxx00000||0||Measured in scanlines, can be used for smooth vertical scrolling on CPC.&lt;br /&gt;
|-&lt;br /&gt;
|6||Vertical Displayed||x0000000||25||Height of displayed screen in characters. Once vertical character count (VCC) matches this value, DISPTMG is set to 1.&lt;br /&gt;
|-&lt;br /&gt;
|7||Vertical Sync position||x0000000||30||When to start the VSync signal, in characters.&lt;br /&gt;
|-&lt;br /&gt;
|8||Interlace and Skew||xxxxxx00||0||00: No interlace; 01: Interlace Sync Raster Scan Mode; 10: No Interlace; 11: Interlace Sync and Video Raster Scan Mode&lt;br /&gt;
|-&lt;br /&gt;
|9||Maximum Raster Address||xxx00000||7||Maximum scan line address on CPC can hold between 0 and 7, higher values' upper bits are ignored&lt;br /&gt;
|-&lt;br /&gt;
|10||Cursor Start Raster||xBP00000||0||Cursor not used on CPC. B = Blink On/Off; P = Blink Period Control (Slow/Fast). Sets first raster row of character that cursor is on to invert.&lt;br /&gt;
|-&lt;br /&gt;
|11||Cursor End Raster||xxx00000||0||Sets last raster row of character that cursor is on to invert&lt;br /&gt;
|-&lt;br /&gt;
|12||Display Start Address (High)||xx000000||48&lt;br /&gt;
|-&lt;br /&gt;
|13||Display Start Address (Low)||00000000||0||Allows you to offset the start of screen memory for hardware scrolling, and if using memory from address &amp;amp;0000 with the firmware.&lt;br /&gt;
|-&lt;br /&gt;
|14||Cursor Address (High)||xx000000||0&lt;br /&gt;
|-&lt;br /&gt;
|15||Cursor Address (Low)||00000000||0&lt;br /&gt;
|-&lt;br /&gt;
|16||Light Pen Address (High)||xx000000||||Read Only&lt;br /&gt;
|-&lt;br /&gt;
|17||Light Pen Address (Low)||00000000||||Read Only&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
registers 18-31 read as 0, on type 0 and 2.&lt;br /&gt;
registers 18-30 read as 0 on type1, register 31 reads as 0x0ff.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Screen size ===&lt;br /&gt;
&lt;br /&gt;
We can calculate the screen size in words by multiplying R1 x R6 x (R9+1). And then multiplying the result by 2 to have the screen size in bytes.&lt;br /&gt;
&lt;br /&gt;
With the default CRTC values, we obtain 40 x 25 x (7+1) x 2 = 16000 bytes.&lt;br /&gt;
&lt;br /&gt;
So we can observe that only part of the 16384 bytes (=16KB) page of VRAM is actually displayed on screen.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== CRTC Differences ==&lt;br /&gt;
&lt;br /&gt;
In this section I will attempt to identify all the differences between each CRTC. &lt;br /&gt;
&lt;br /&gt;
The following tables list the functions that can be accessed for each type: &lt;br /&gt;
&lt;br /&gt;
Type 0&lt;br /&gt;
&lt;br /&gt;
{|{{Prettytable|width: 700px; font-size: 2em;}}&lt;br /&gt;
|''b1''||''b0''||''Function''||''Read/Write'' &lt;br /&gt;
|-&lt;br /&gt;
|0||0||Select internal 6845 register||Write Only &lt;br /&gt;
|-&lt;br /&gt;
|0||1||Write to selected internal 6845 register||Write Only &lt;br /&gt;
|-&lt;br /&gt;
|1||0||-||- &lt;br /&gt;
|-&lt;br /&gt;
|1||1||Read from selected internal 6845 register||Read only &lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Type 1&lt;br /&gt;
&lt;br /&gt;
{|{{Prettytable|width: 700px; font-size: 2em;}}&lt;br /&gt;
|''b1''||''b0''||''Function''||''Read/Write'' &lt;br /&gt;
|-&lt;br /&gt;
|0||0||Select internal 6845 register||Write Only &lt;br /&gt;
|-&lt;br /&gt;
|0||1||Write to selected internal 6845 register||Write Only &lt;br /&gt;
|-&lt;br /&gt;
|1||0||Read Status Register||Read Only &lt;br /&gt;
|-&lt;br /&gt;
|1||1||Read from selected internal 6845 register||Read only &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Type 2&lt;br /&gt;
&lt;br /&gt;
{|{{Prettytable|width: 700px; font-size: 2em;}}&lt;br /&gt;
|''b1''||''b0''||''Function''||''Read/Write'' &lt;br /&gt;
|-&lt;br /&gt;
|0||0||Select internal 6845 register||Write Only &lt;br /&gt;
|-&lt;br /&gt;
|0||1||Write to selected internal 6845 register||Write Only &lt;br /&gt;
|-&lt;br /&gt;
|1||0||-||- &lt;br /&gt;
|-&lt;br /&gt;
|1||1||Read from selected internal 6845 register||Read only &lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Type 3 and 4&lt;br /&gt;
&lt;br /&gt;
{|{{Prettytable|width: 700px; font-size: 2em;}}&lt;br /&gt;
|''b1''||''b0''||''Function''||''Read/Write'' &lt;br /&gt;
|-&lt;br /&gt;
|0||0||Select internal 6845 register||Write Only &lt;br /&gt;
|-&lt;br /&gt;
|0||1||Write to selected internal 6845 register||Write Only &lt;br /&gt;
|-&lt;br /&gt;
|1||0||Read from selected internal 6845 register||Read Only &lt;br /&gt;
|-&lt;br /&gt;
|1||1||Read from selected internal 6845 register||Read only &lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
It is not possible to read from all the internal registers, this table shows the read/write status of each register for each type: &lt;br /&gt;
&lt;br /&gt;
{|{{Prettytable|width: 700px; font-size: 2em;}}&lt;br /&gt;
|rowspan=2|''Register Index''||rowspan=2|''Register Name''||colspan=4|''Type'' &lt;br /&gt;
|-&lt;br /&gt;
|0||1||2||3||4&lt;br /&gt;
|-&lt;br /&gt;
|0||Horizontal Total||Write Only||Write Only||Write Only||(note 2)||(note 3) &lt;br /&gt;
|-&lt;br /&gt;
|1||Horizontal Displayed||Write Only||Write Only||Write Only||(note 2)||(note 3)&lt;br /&gt;
|-&lt;br /&gt;
|2||Horizontal Sync Position||Write Only||Write Only||Write Only||(note 2)||(note 3) &lt;br /&gt;
|-&lt;br /&gt;
|3||Horizontal and Vertical Sync Widths||Write Only||Write Only||Write Only||(note 2)||(note 3) &lt;br /&gt;
|-&lt;br /&gt;
|4||Vertical Total||Write Only||Write Only||Write Only||(note 2)||(note 3) &lt;br /&gt;
|-&lt;br /&gt;
|5||Vertical Total Adjust||Write Only||Write Only||Write Only||(note 2)||(note 3) &lt;br /&gt;
|-&lt;br /&gt;
|6||Vertical Displayed||Write Only||Write Only||Write Only||(note 2)||(note 3)&lt;br /&gt;
|-&lt;br /&gt;
|7||Vertical Sync position||Write Only||Write Only||Write Only||(note 2)||(note 3) &lt;br /&gt;
|-&lt;br /&gt;
|8||Interlace and Skew||Write Only||Write Only||Write Only||(note 2)||(note 3) &lt;br /&gt;
|-&lt;br /&gt;
|9||Maximum Raster Address||Write Only||Write Only||Write Only||(note 2)||(note 3) &lt;br /&gt;
|-&lt;br /&gt;
|10||Cursor Start Raster||Write Only||Write Only||Write Only||(note 2)||(note 3) &lt;br /&gt;
|-&lt;br /&gt;
|11||Cursor End Raster||Write Only||Write Only||Write Only||(note 2)||(note 3) &lt;br /&gt;
|-&lt;br /&gt;
|12||Display Start Address (High)||Read/Write||Write Only||Write Only||Read/Write (note 2)||(note 3) &lt;br /&gt;
|-&lt;br /&gt;
|13||Display Start Address (Low)||Read/Write||Write Only||Write Only||Read/Write (note 2)||(note 3) &lt;br /&gt;
|-&lt;br /&gt;
|14||Cursor Address (High)||Read/Write||Read/Write||Read/Write||Read/Write (note 2)||(note 3)&lt;br /&gt;
|-&lt;br /&gt;
|15||Cursor Address (Low)||Read/Write||Read/Write||Read/Write||Read/Write (note 2)||(note 3)&lt;br /&gt;
|-&lt;br /&gt;
|16||Light Pen Address (High)||Read Only||Read Only||Read Only||Read Only (note 2)||(note 3)&lt;br /&gt;
|-&lt;br /&gt;
|17||Light Pen Address (Low)||Read Only||Read Only||Read Only||Read Only (note 2)||(note 3)&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
'''Notes'''&lt;br /&gt;
&lt;br /&gt;
1. On type 0 and 1, if a Write Only register is read from, &amp;quot;0&amp;quot; is returned. &lt;br /&gt;
&lt;br /&gt;
2. See the document &amp;quot;Extra CPC Plus Hardware Information&amp;quot; for more details.&lt;br /&gt;
&lt;br /&gt;
3. CRTC type 4 is the same as CRTC type 3. The registers also repeat as they do on the type 3.&lt;br /&gt;
&lt;br /&gt;
== Horizontal and Vertical Sync (R3) ==&lt;br /&gt;
&lt;br /&gt;
=== Horizontal and Vertical Sync (R3) ===&lt;br /&gt;
&lt;br /&gt;
Type 0:&lt;br /&gt;
*Bits 7..4 define Vertical Sync Width. If 0 is programmed, this gives 16 lines of VSYNC.&lt;br /&gt;
*Bits 3..0 define Horizontal Sync Width. If 0 is programmed, no HSYNC is generated (and therefore, no interrupts).&lt;br /&gt;
&lt;br /&gt;
Type 1:&lt;br /&gt;
*Bits 7..4 are ignored. Vertical Sync is fixed at 16 lines.&lt;br /&gt;
*Bits 3..0 define Horizontal Sync Width. If 0 is programmed, no HSYNC is generated (and therefore, no interrupts).&lt;br /&gt;
&lt;br /&gt;
Type 2:&lt;br /&gt;
*Bits 7..4 are ignored. Vertical Sync is fixed at 16 lines.&lt;br /&gt;
*Bits 3..0 define Horizontal Sync Width. If 0 is programmed, this gives a HSYNC width of 16.&lt;br /&gt;
&lt;br /&gt;
Types 3/4:&lt;br /&gt;
*Bits 7..4 define Vertical Sync Width. If 0 is programmed, this gives 16 lines of VSYNC.&lt;br /&gt;
*Bits 3..0 define Horizontal Sync Width. If 0 is programmed, this gives a HSYNC width of 16.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Interlace and Skew (R8) ===&lt;br /&gt;
&lt;br /&gt;
Types 0/3/4:&lt;br /&gt;
*Bits 7..6 define the skew (delay) of the CUDISP signal (00 = Non-skew ; 01 = One-character skew ; 10 = Two-character skew ; 11 = Non-output).&lt;br /&gt;
*Bits 5..4 define the skew (delay) of the DISPTMG signal (00 = Non-skew ; 01 = One-character skew ; 10 = Two-character skew ; 11 = Non-output).&lt;br /&gt;
*Bits 3..2 are ignored.&lt;br /&gt;
*Bits 1..0 define the interlace mode (00 = No Interlace ; 01 = Interlace Sync ; 10 = No Interlace ; 11 = Interlace Sync and Video).&lt;br /&gt;
&lt;br /&gt;
Types 1/2:&lt;br /&gt;
*Bits 7..2 are ignored.&lt;br /&gt;
*Bits 1..0 define the interlace mode.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== R31 on Type 1 ===&lt;br /&gt;
&lt;br /&gt;
R31 is described in the UM6845R documentation as &amp;quot;Dummy Register&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Its use is described in the documentation for the Rockwell R6545 in combination with R18, R19 and R8 and the Status Register.&lt;br /&gt;
&lt;br /&gt;
In the UM6845R it appears to have no effect. Reading and writing does nothing. Reading it returns &amp;amp;FF.&lt;br /&gt;
&lt;br /&gt;
R31 doesn't exist on CRTCs 0/2/3/4.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== UM6845R and R12/R13 ==&lt;br /&gt;
&lt;br /&gt;
The UM6845R differs to other CRTC in respect of R12/R13. &lt;br /&gt;
&lt;br /&gt;
When VCC=0, R12/R13 is re-read at the start of each line. R12/R13 can therefore be changed for each scanline when VCC=0. &lt;br /&gt;
&lt;br /&gt;
Just like other CRTCs when RC==(R9-1), the current MA is captured for the next char-line.&lt;br /&gt;
&lt;br /&gt;
In demos to make a display compatible with all CRTCs program R12/R13 when VCC!=0. This will then take effect at the next frame start.&lt;br /&gt;
&lt;br /&gt;
== UM6845R status register ==&lt;br /&gt;
&lt;br /&gt;
The UM6845R has a status register that can be read using port &amp;amp;BExx.&lt;br /&gt;
&lt;br /&gt;
Bit 6 is set to 1 if there is a strobe input to the /LPEN signal. It is cleared to 0 when either R17 or R16 (LPEN address) of the CRTC are read. It signals there is a valid LPEN input. On my CPC (arnoldemu) with UM6845R, it is triggered at power on, R17 and R16 have the values 0 when read.&lt;br /&gt;
&lt;br /&gt;
Bit 5 is set to 1 when CRTC is in &amp;quot;vertical blanking&amp;quot;. Vertical blanking is when the vertical border is active. i.e. VCC&amp;gt;=R6. &lt;br /&gt;
&lt;br /&gt;
It is cleared when the frame is started (VCC=0). It is not directly related to the DISPTMG output (used by the CPC to display the border colour) because that output is a combination of horizontal and vertical blanking.&lt;br /&gt;
This bit will be 0 when pixels are being displayed.&lt;br /&gt;
&lt;br /&gt;
All the other bits read as 0 and don't have any function.&lt;br /&gt;
&lt;br /&gt;
== CRTC Type Detection ==&lt;br /&gt;
&lt;br /&gt;
It is possible to detect the CRTC Type using software methods, and this is done to: &lt;br /&gt;
&lt;br /&gt;
* warn that the software was not designed for the detected 6845 and may function incorrectly&lt;br /&gt;
* to adapt the software so that it will run with the detected 6845 &lt;br /&gt;
* In most cases, the type of the detected 6845 is reported&lt;br /&gt;
&lt;br /&gt;
Detection routine in BASIC:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
10 MODE 1:' Reinitialize screen&lt;br /&gt;
20 OUT &amp;amp;BC00,31:IF INP(&amp;amp;BF00)=255 THEN PRINT&amp;quot;crtc 1&amp;quot;:END&lt;br /&gt;
30 OUT &amp;amp;BC00,12:IF INP(&amp;amp;BF00)=0 THEN PRINT&amp;quot;crtc 2&amp;quot;:END&lt;br /&gt;
40 OUT &amp;amp;BC00,20:IF INP(&amp;amp;BF00)=0 THEN PRINT&amp;quot;crtc 0&amp;quot;:END&lt;br /&gt;
50 PRINT&amp;quot;crtc 3/4&amp;quot;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Distinguishing between CRTCs 3 and 4 can be done by trying to [[Programming:Unlocking ASIC|unlock the ASIC]] or by testing the [[8255|PPI chip]]. On ASIC, if PPI Port B is set as output it will behave the same as input.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== CRTC Timing Diagrams ==&lt;br /&gt;
[[File:CRTC Timing Diagram Rockwell.png]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[File:CRTC timing small.gif]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Block Diagrams ==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!Hitachi&lt;br /&gt;
!UMC&lt;br /&gt;
!Motorola&lt;br /&gt;
|-&lt;br /&gt;
|[[File:CRTC Block Diagram.png|Hitachi]]&lt;br /&gt;
|[[File:UMC CRTC Block Diagram.png|UMC]]&lt;br /&gt;
|[[File:Motorola CRTC Block Diagram.png|Motorola]]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== CRTC-II (aka Type 5) ==&lt;br /&gt;
&lt;br /&gt;
The [[Media:CRTC-5-HD6345.pdf|HD6345 datasheet]] states it is upward-compatible with the HD6845S in pin and software.&lt;br /&gt;
&lt;br /&gt;
This chip was never used by Amstrad. However, some CPC enthusiasts have replaced the original CRTC chip in their CPC with this one.&lt;br /&gt;
&lt;br /&gt;
With this chip, split-screen becomes easy: [https://thecheshirec.at/2024/05/20/des-splitscreens-en-basic-sur-crtc5/ Split-screen in BASIC]. And 3 new graphics modes (160x100x16c, 320x100x4c, 640x100x2c) are available: [https://thecheshirec.at/2024/11/10/trois-nouveaux-modes-video-grace-au-crtc-5/ New graphics modes in BASIC].&lt;br /&gt;
&lt;br /&gt;
This is the cheapest way to upgrade the CPC's graphics capabilities, costing only 1.29€. [https://thecheshirec.at/2024/05/19/des-crtc5-a-129e/ Source]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Datasheets ==&lt;br /&gt;
==== Used by Amstrad ====&lt;br /&gt;
* [[Media:hd6845.hitachi.pdf|HD6845S (Hitachi)]] aka Type 0&lt;br /&gt;
* [[Media:UM6845-UMC.pdf|UM6845 (UMC)]] aka Type 0&lt;br /&gt;
* [[Media:Um6845r.umc.pdf|UM6845R (UMC)]] aka Type 1&lt;br /&gt;
* [[Media:Mc6845.motorola.pdf|MC6845 (Motorola)]] aka Type 2&lt;br /&gt;
* [[Media:CPC_Plus_Asic_Schematic.GIF|AMS40489 (Amstrad)]] aka Type 3 ([[ASIC]])&lt;br /&gt;
* [[AMS40226 (Amstrad)]] aka Type 4 (Pre-ASIC)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Unused clones ====&lt;br /&gt;
* [[CM607P]] a Bulgarian clone made in Pravetz factory. It is used in the [[Aleste 520EX]].&lt;br /&gt;
* [[Media:hd6845.hitachi.pdf|HD6845R]] by Hitachi. According to Kevin Thacker, the [[KC Compact]] used HD6845R only.&lt;br /&gt;
* [[Media:UM6845E-UMC.pdf|UM6845E]] by UMC&lt;br /&gt;
* [[Media:Mc6845.pdf|MC6845-1]] by Motorola&lt;br /&gt;
* [[Media:F6845.pdf|F6845]] by Fairchild&lt;br /&gt;
* [[Media:EF6845P.pdf|EF6845]] by Thomson Semiconductors&lt;br /&gt;
* [[Media:VL6845 VTi.pdf|VL6845]] by VTi&lt;br /&gt;
* [[Media:C6845 CRTC (CAST).pdf|C6845]] by Cast&lt;br /&gt;
* [[Media:MB89321B FUJ.pdf|MB89321B]] by Fujitsu. It is pin-compatible with the 6845&lt;br /&gt;
* [[Media:MB89321A datasheet CRTC.pdf|MB89321A]] by Fujitsu. Enhanced version that adds smooth scroll, screen partitioning, independent scrolling of screen partitions, and other convenient features&lt;br /&gt;
* [[Media:Mos 6545-1 crtc.pdf|MOS 6545]] (MOS, Rockwell, Synertek) is pin-compatible with the 6845. Its differences are found in the R8 register.&lt;br /&gt;
* [https://www.cpcwiki.eu/forum/other-retro/interesting-discussion-about-the-c128-s-cpm-poor-performance/msg223058/#msg223058 MOS 8563] It is an evolution of the 6545/6845 CRTC chip, with blitter abilities to autonomously perform block memory copies within its dedicated video RAM.&lt;br /&gt;
* [https://github.com/hoglet67/BeebFpga/blob/dev/src/common/mc6845.vhd BeebFpga] [https://github.com/MiSTer-devel/Amstrad_MiSTer/blob/master/rtl/UM6845R.v MiSTer] [https://opencores.org/websvn/filedetails?repname=System09&amp;amp;path=%2FSystem09%2Ftrunk%2Frtl%2FVHDL%2Fcrtc6845.vhd OpenCores] Verilog/VHDL implementations of the 6845&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Tools about CRTC ==&lt;br /&gt;
&lt;br /&gt;
* [http://www.cpcwiki.eu/imgs/9/99/Elmar_Krieger-SPECIAL_EFFECTS.dsk  some BASIC tools to detect CRTC types 0-1-2 and show some effects] by [[Elmar Krieger]] (DSK for Emulators)&lt;br /&gt;
* [[File:Shaker26.dsk]] Shaker - Suite of CRTC tests associated with the CPC CRTC compendium (many of them will not work correctly on emulators and that was the purpose of the tests, to help create more compatible emulation)&lt;br /&gt;
* [[File:Shaker addon.dsk]] Shaker Add-On (Pixel 1 Hard Scroll / Vertical Rupture all Crtc)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Links ==&lt;br /&gt;
&lt;br /&gt;
* [http://en.wikipedia.org/wiki/6845 Wikipedia on the CRTC]&lt;br /&gt;
* [[Media:ACCC1.8-EN.pdf]] CPC CRTC Compendium - Latest (04/2024!) document containing in-depth info about CRTC programming on CPC.&lt;br /&gt;
* [[Media:CRTC Compendium Podcast.mp3]] The CRTC Compendium digested in podcast format&lt;br /&gt;
* [http://www.grimware.org/doku.php/documentations/devices/crtc CRTC documentation from Grimware]&lt;br /&gt;
* [http://quasar.cpcscene.net/doku.php?id=assem:crtc Quasar CRTC documentation (in french)]&lt;br /&gt;
* [https://pulkomandy.github.io/shinra.github.io/crtc.html PulkoMandy's table] [https://www.theoddys.com/acorn/the_6845_crtc/6845%20Variants.xlsx Oddy's table] Differences between CRTC types&lt;br /&gt;
* [[Media:Dossier Rupture(Gozeur Paradox).pdf]]&lt;br /&gt;
* [[Media:Dossier CRTC(Ramlaid Mortel).pdf]] Les entrailles du CRTC&lt;br /&gt;
* [https://thecheshirec.at/tag/crtc6845/ Leçons CRTC (CheshireCat)]&lt;br /&gt;
* [https://martin.hinner.info/vga/pal.html PAL video timing specification]&lt;br /&gt;
&lt;br /&gt;
==Related pages==&lt;br /&gt;
&lt;br /&gt;
*[[Gate Array]]&lt;br /&gt;
&lt;br /&gt;
*[[ASIC]]&lt;br /&gt;
&lt;br /&gt;
*[[Video modes]]&lt;br /&gt;
&lt;br /&gt;
*[[Synchronising with the CRTC and display]] : technic and details on the relationship between Gate Array and CRTC.&lt;br /&gt;
&lt;br /&gt;
*[[VIDI digitizer]] This extension contains its own CRTC chip&lt;br /&gt;
&lt;br /&gt;
[[Category:Hardware]] [[Category:CPC Internal Components]] [[Category:Electronic Component]] [[Category:Programming]] [[Category:Datasheet]] [[Category:Graphic]]&lt;/div&gt;</summary>
		<author><name>Longshot</name></author>	</entry>

	<entry>
		<id>https://oldwiki.cpcwiki.eu/index.php?title=CRTC&amp;diff=126281</id>
		<title>CRTC</title>
		<link rel="alternate" type="text/html" href="https://oldwiki.cpcwiki.eu/index.php?title=CRTC&amp;diff=126281"/>
				<updated>2025-05-24T18:48:52Z</updated>
		
		<summary type="html">&lt;p&gt;Longshot: Updated for infringement of copyrighted material protected&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[File:CRTC Type 0.jpg|thumb|right|CRTC Type 0 (Hitachi)]]&lt;br /&gt;
[[File:CRTC UMC Type 0.png|thumb|right|CRTC Type 0 (UMC)]]&lt;br /&gt;
[[File:CRTC Type 1.png|thumb|right|CRTC Type 1]]&lt;br /&gt;
[[File:CRTC6845-Type2.jpg|thumb|right|CRTC Type 2]]&lt;br /&gt;
&lt;br /&gt;
The 6845 '''CRTC''' (Cathode Ray Tube Controller) chip was created by Motorola in 1977. It works with the [[Gate Array]] to generate the video signal on the Amstrad CPC.&lt;br /&gt;
&lt;br /&gt;
This chip is also used in the [[BBC Micro]], [[Lynx|Camputers Lynx]], [[EG2000 Colour Genie]], [[Sharp X1]], [[MicroBee]], [[Commodore PET]] and the early graphics cards (MDA, Hercules, CGA, Plantronics Colorplus) for [[IBM PC]]. And it is found in some [https://www.msx.org/wiki/Hitachi_HD6845 MSX1 expansions], providing an 80-column text mode.&lt;br /&gt;
&lt;br /&gt;
It's important to note that the CRTC chip is primarily designed for character-based displays. It explains why, on the Amstrad CPC, the video memory is organized into a grid of characters rather than a purely linear bitmap.&lt;br /&gt;
&lt;br /&gt;
NOTE: This document describes the functionality in terms of the CPC with its separate CRTC and Gate-Array. The Plus has both integrated into the same IC, but could be considered to have two functional blocks, one for CRTC and one for Gate-Array. In this document the term 'Gate-Array' is used, but this also applies to the ASIC.&lt;br /&gt;
&lt;br /&gt;
== Overview ==&lt;br /&gt;
&lt;br /&gt;
The 6845 Cathode Ray Tube Controller (CRTC) is a programmable IC used to generate video displays. This IC is used in a variety of computers including the Amstrad CPC, Amstrad CPC+ and KC Compact. &lt;br /&gt;
&lt;br /&gt;
The CRTC was a common part available from many different manufacturers. During the life of the CPC, Amstrad sourced the CRTC from various manufacturers. &lt;br /&gt;
&lt;br /&gt;
All ICs used were based on the same design but have a different implementation. As a result they do not operate identically in all situations. This document highlights these differences. &lt;br /&gt;
&lt;br /&gt;
This table lists the known ICs used, with their part number, manufacturer and type number. &lt;br /&gt;
&lt;br /&gt;
{|{{Prettytable|width: 700px; font-size: 2em;}}&lt;br /&gt;
|''Part number''||''Manufacturer''||''Type number (note 3)''&lt;br /&gt;
|-&lt;br /&gt;
|HD6845S||Hitachi||0&lt;br /&gt;
|-&lt;br /&gt;
|UM6845||UMC||0&lt;br /&gt;
|-&lt;br /&gt;
|UM6845R||UMC||1&lt;br /&gt;
|-&lt;br /&gt;
|MC6845||Motorola||2&lt;br /&gt;
|-&lt;br /&gt;
|AMS40489||Amstrad||3 (note 1)&lt;br /&gt;
|-&lt;br /&gt;
|40226||Amstrad||4 (note 2)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
'''NOTES''' &lt;br /&gt;
&lt;br /&gt;
1. The CRTC functionality is integrated into the CPC+ ASIC. This type exists only in the CPC464+,CPC6128+ and GX4000. &lt;br /&gt;
&lt;br /&gt;
2. This type exists in &amp;quot;cost-down&amp;quot; CPC464 and CPC6128 systems. In the &amp;quot;cost-down&amp;quot; the CRTC functionality is integrated into a single ASIC IC. This ASIC is often refered to as the &amp;quot;Pre-ASIC&amp;quot; because it preceeded the CPC+ ASIC. The CRTC functionality of the Pre-ASIC is almost identical to the CRTC within the ASIC.&lt;br /&gt;
 &lt;br /&gt;
3. In the Amstrad community each 6845 implementation has been assigned a type number. This type identifies a group of implementations which operate in exactly the same way. &lt;br /&gt;
&lt;br /&gt;
As far as I know, the type number system was originally used by demo programmers. &lt;br /&gt;
&lt;br /&gt;
It is possible to detect the 6845 present using software methods, and this is done to: &lt;br /&gt;
&lt;br /&gt;
* warn that the software was not designed for the detected 6845 and may function incorrectly, &lt;br /&gt;
* to adapt the software so that it will run with the detected 6845 &lt;br /&gt;
* In most cases, the type of the detected 6845 is reported. &lt;br /&gt;
&lt;br /&gt;
4. As far as I know, the KC compact used HD6845R only.&lt;br /&gt;
&lt;br /&gt;
== Timings and relating with Z80 instructions count ==&lt;br /&gt;
&lt;br /&gt;
Some informations like : how many Z80 instructions can I fit within a scan line ? Within a screen ? Etc... See http://www.cpcwiki.eu/forum/programming/frame-flyback-and-interrupts/msg25106/#msg25106&lt;br /&gt;
(To be extracted/edited to conform to wiki good practices).&lt;br /&gt;
&lt;br /&gt;
==Programming==&lt;br /&gt;
&lt;br /&gt;
The 6845 is selected when bit 14 of the I/O port address is set to &amp;quot;0&amp;quot;. Bit 9 and 8 of the I/O port address define the function to access. The remaining bits can be any value, but it is adviseable to set these to &amp;quot;1&amp;quot; to avoid conflict with other devices in the system.&lt;br /&gt;
&lt;br /&gt;
The recommended I/O port addresses are&lt;br /&gt;
&lt;br /&gt;
{|{{Prettytable|width: 700px; font-size: 2em;}}&lt;br /&gt;
|''I/O port address''||''Function''||''Read/Write''&lt;br /&gt;
|-&lt;br /&gt;
|&amp;amp;BCxx||Select 6845 register||Write only&lt;br /&gt;
|-&lt;br /&gt;
|&amp;amp;BDxx||Write 6845 register data||Write only&lt;br /&gt;
|-&lt;br /&gt;
|&amp;amp;BExx||(note 1)||Read only&lt;br /&gt;
|-&lt;br /&gt;
|&amp;amp;BFxx||(note 1)||Read only&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
'''NOTE'''&lt;br /&gt;
&lt;br /&gt;
1. The function of these I/O ports is dependant on the CRTC type&lt;br /&gt;
 &lt;br /&gt;
2. If you perform an IN instruction to the select or write functions it will write data to the CRTC from the current data on the bus.&lt;br /&gt;
&lt;br /&gt;
==Addressing==&lt;br /&gt;
&lt;br /&gt;
The following table defines the generated memory address from the CRTC and Gate-Array signals. &lt;br /&gt;
&lt;br /&gt;
{|{{Prettytable|width: 700px; font-size: 2em;}}&lt;br /&gt;
|''Memory Address Signal''||''Signal source''||''Signal name''&lt;br /&gt;
|-&lt;br /&gt;
|A15||6845||MA13 &lt;br /&gt;
|-&lt;br /&gt;
|A14||6845||MA12&lt;br /&gt;
|-&lt;br /&gt;
|A13||6845||RA2 &lt;br /&gt;
|-&lt;br /&gt;
|A12||6845||RA1 &lt;br /&gt;
|-&lt;br /&gt;
|A11||6845||RA0 &lt;br /&gt;
|-&lt;br /&gt;
|A10||6845||MA9 &lt;br /&gt;
|-&lt;br /&gt;
|A9||6845||MA8 &lt;br /&gt;
|-&lt;br /&gt;
|A8||6845||MA7 &lt;br /&gt;
|-&lt;br /&gt;
|A7||6845||MA6 &lt;br /&gt;
|-&lt;br /&gt;
|A6||6845||MA5 &lt;br /&gt;
|-&lt;br /&gt;
|A5||6845||MA4 &lt;br /&gt;
|-&lt;br /&gt;
|A4||6845||MA3 &lt;br /&gt;
|-&lt;br /&gt;
|A3||6845||MA2 &lt;br /&gt;
|-&lt;br /&gt;
|A2||6845||MA1 &lt;br /&gt;
|-&lt;br /&gt;
|A1||6845||MA0&lt;br /&gt;
|-&lt;br /&gt;
|A0||Gate-Array||CCLK&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
CRTC generates the address, Gate-Array reads the data and converts it to pixels based on the current mode.&lt;br /&gt;
&lt;br /&gt;
== DISPTMG ==&lt;br /&gt;
&lt;br /&gt;
DISPTMG signal defines the border. When DISPTMG is &amp;quot;1&amp;quot; the border colour is output by the Gate-Array to the display. The DISPTMG can be forced using R8 (DISPTMG Skew) on type 0,3 and 4 or by setting R6=0 on type 1. It is not possible to force the DISPTMG on type 2 or 5.&lt;br /&gt;
&lt;br /&gt;
The border has higher priority than pixels but lower priority than the black colour output when HSYNC/VSYNC are active.&lt;br /&gt;
&lt;br /&gt;
== HSYNC and VSYNC ==&lt;br /&gt;
&lt;br /&gt;
On CPC, HSYNC and VSYNC from the CRTC are passed into the Gate-Array.&lt;br /&gt;
&lt;br /&gt;
When HSYNC is active Gate-Array outputs the palette colour black. If the HSYNC is set to 14 characters then black will be output for 14us.&lt;br /&gt;
&lt;br /&gt;
The HSYNC is modified before being sent to the monitor. It  happens 2us after the HSYNC from the CRTC and lasts 4us when HSYNC length is greater or equal to 6. &lt;br /&gt;
&lt;br /&gt;
If R2=46, and HSYNC width is 14 then monitor hsync starts at 48 and lasts until 51.&lt;br /&gt;
&lt;br /&gt;
On a CPC monitor, the HSYNC is rendered in &amp;quot;absolute black&amp;quot;. It is darker than the black output by the Gate-Array.&lt;br /&gt;
&lt;br /&gt;
The VSYNC is also modified before being sent to the monitor. It happens two lines* after the VSYNC from the CRTC and stay two lines (same cut rule if VSYNC is lower than 4). PAL (50Hz) does need two lines VSYNC_width, and 4us HSYNC_width.&lt;br /&gt;
&lt;br /&gt;
Using CRTC1, VSYNC width value 0 means a value of 16.&lt;br /&gt;
&lt;br /&gt;
== The 6845 Registers ==&lt;br /&gt;
&lt;br /&gt;
The Internal registers of the 6845 are:&lt;br /&gt;
&lt;br /&gt;
{|{{Prettytable|width: 700px; font-size: 2em;}}&lt;br /&gt;
|''Register Index''||''Register Name''||''Range''||''CPC Setting''||''Notes''&lt;br /&gt;
|-&lt;br /&gt;
|0||Horizontal Total||00000000||63||Width of the screen, in characters. Should always be 63 (64 characters). 1 character == 1µs.&lt;br /&gt;
|-&lt;br /&gt;
|1||Horizontal Displayed||00000000||40||Number of characters displayed. Once horizontal character count (HCC) matches this value, DISPTMG is set to 1.&lt;br /&gt;
|-&lt;br /&gt;
|2||Horizontal Sync Position||00000000||46||When to start the HSync signal.&lt;br /&gt;
|-&lt;br /&gt;
|3||Horizontal and Vertical Sync Widths||VVVVHHHH||128+14||HSync pulse width in characters (0 means 16 on some CRTC), should always be more than 8; VSync width in scan-lines. (0 means 16 on some CRTC. Not present on all CRTCs, fixed to 16 lines on these)&lt;br /&gt;
|-&lt;br /&gt;
|4||Vertical Total||x0000000||38||Height of the screen, in characters.&lt;br /&gt;
|-&lt;br /&gt;
|5||Vertical Total Adjust||xxx00000||0||Measured in scanlines, can be used for smooth vertical scrolling on CPC.&lt;br /&gt;
|-&lt;br /&gt;
|6||Vertical Displayed||x0000000||25||Height of displayed screen in characters. Once vertical character count (VCC) matches this value, DISPTMG is set to 1.&lt;br /&gt;
|-&lt;br /&gt;
|7||Vertical Sync position||x0000000||30||When to start the VSync signal, in characters.&lt;br /&gt;
|-&lt;br /&gt;
|8||Interlace and Skew||xxxxxx00||0||00: No interlace; 01: Interlace Sync Raster Scan Mode; 10: No Interlace; 11: Interlace Sync and Video Raster Scan Mode&lt;br /&gt;
|-&lt;br /&gt;
|9||Maximum Raster Address||xxx00000||7||Maximum scan line address on CPC can hold between 0 and 7, higher values' upper bits are ignored&lt;br /&gt;
|-&lt;br /&gt;
|10||Cursor Start Raster||xBP00000||0||Cursor not used on CPC. B = Blink On/Off; P = Blink Period Control (Slow/Fast). Sets first raster row of character that cursor is on to invert.&lt;br /&gt;
|-&lt;br /&gt;
|11||Cursor End Raster||xxx00000||0||Sets last raster row of character that cursor is on to invert&lt;br /&gt;
|-&lt;br /&gt;
|12||Display Start Address (High)||xx000000||48&lt;br /&gt;
|-&lt;br /&gt;
|13||Display Start Address (Low)||00000000||0||Allows you to offset the start of screen memory for hardware scrolling, and if using memory from address &amp;amp;0000 with the firmware.&lt;br /&gt;
|-&lt;br /&gt;
|14||Cursor Address (High)||xx000000||0&lt;br /&gt;
|-&lt;br /&gt;
|15||Cursor Address (Low)||00000000||0&lt;br /&gt;
|-&lt;br /&gt;
|16||Light Pen Address (High)||xx000000||||Read Only&lt;br /&gt;
|-&lt;br /&gt;
|17||Light Pen Address (Low)||00000000||||Read Only&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
registers 18-31 read as 0, on type 0 and 2.&lt;br /&gt;
registers 18-30 read as 0 on type1, register 31 reads as 0x0ff.&lt;br /&gt;
&lt;br /&gt;
Details about Reg. 12 and Reg. 13 specifically:&lt;br /&gt;
&lt;br /&gt;
  .------- REG 12 --------.   .------- REG 13 --------.&lt;br /&gt;
  |                       |   |                       |&lt;br /&gt;
   15 14 13 12 11 10 09 08     07 06 05 04 03 02 01 00&lt;br /&gt;
  .--.--.--.--.--.--.--.--.   .--.--.--.--.--.--.--.--.&lt;br /&gt;
  |X |X |  |  |  |  |  |  |   |  |  |  |  |  |  |  |  |&lt;br /&gt;
  '--'--'--'--'--'--'--'--'   '--'--'--'--'--'--'--'--'&lt;br /&gt;
        '--.--'--.--'---------------.-----------------'&lt;br /&gt;
           |     |                  |&lt;br /&gt;
           |     |                  '------&amp;gt; Offset for setting&lt;br /&gt;
           |     |                           videoram &lt;br /&gt;
           |     |                           (1024 positions)&lt;br /&gt;
           |     |                           Bits 0..9&lt;br /&gt;
           |     |&lt;br /&gt;
           |     '-------------------------&amp;gt; Video Buffer : note (1)&lt;br /&gt;
           |&lt;br /&gt;
           '-------------------------------&amp;gt; Video Page : note (2)&lt;br /&gt;
  note (1)                 note (2)&lt;br /&gt;
  .--.--.--------------.  .--.--.---------------.&lt;br /&gt;
  |11|10| Video Buffer |  |13|12|   Video Page  |&lt;br /&gt;
  |--|--|--------------|  |--|--|---------------|&lt;br /&gt;
  | 0| 0|     16Ko     |  | 0| 0|  0000 - 3FFF  |&lt;br /&gt;
  |--|--|--------------|  |--|--|---------------|&lt;br /&gt;
  | 0| 1|     16Ko     |  | 0| 1|  4000 - 7FFF  |&lt;br /&gt;
  |--|--|--------------|  |--|--|---------------|&lt;br /&gt;
  | 1| 0|     16Ko     |  | 1| 0|  8000 - BFFF  |&lt;br /&gt;
  |--|--|--------------|  |--|--|---------------|&lt;br /&gt;
  | 1| 1|     32Ko     |  | 1| 1|  C000 - FFFF  |&lt;br /&gt;
  '--'--'--------------'  '--'--'---------------'&lt;br /&gt;
&lt;br /&gt;
So, it's possible to use 32KB screen size (used for [[Programming:Overscan|overscan]]) by setting bits 11 and 10 both to 1 (of Register 12). Bits MA11 and MA10 of the address generated by the CRTC are not written on the address bus to access video memory; settings both bits to 1 is the only way to cause a carry to bit MA12 when address pass over the end of current video page to change the memory address to the next video page.&lt;br /&gt;
&lt;br /&gt;
== CRTC Differences ==&lt;br /&gt;
&lt;br /&gt;
In this section I will attempt to identify all the differences between each CRTC. &lt;br /&gt;
&lt;br /&gt;
The following tables list the functions that can be accessed for each type: &lt;br /&gt;
&lt;br /&gt;
Type 0&lt;br /&gt;
&lt;br /&gt;
{|{{Prettytable|width: 700px; font-size: 2em;}}&lt;br /&gt;
|''b1''||''b0''||''Function''||''Read/Write'' &lt;br /&gt;
|-&lt;br /&gt;
|0||0||Select internal 6845 register||Write Only &lt;br /&gt;
|-&lt;br /&gt;
|0||1||Write to selected internal 6845 register||Write Only &lt;br /&gt;
|-&lt;br /&gt;
|1||0||-||- &lt;br /&gt;
|-&lt;br /&gt;
|1||1||Read from selected internal 6845 register||Read only &lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Type 1&lt;br /&gt;
&lt;br /&gt;
{|{{Prettytable|width: 700px; font-size: 2em;}}&lt;br /&gt;
|''b1''||''b0''||''Function''||''Read/Write'' &lt;br /&gt;
|-&lt;br /&gt;
|0||0||Select internal 6845 register||Write Only &lt;br /&gt;
|-&lt;br /&gt;
|0||1||Write to selected internal 6845 register||Write Only &lt;br /&gt;
|-&lt;br /&gt;
|1||0||Read Status Register||Read Only &lt;br /&gt;
|-&lt;br /&gt;
|1||1||Read from selected internal 6845 register||Read only &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Type 2&lt;br /&gt;
&lt;br /&gt;
{|{{Prettytable|width: 700px; font-size: 2em;}}&lt;br /&gt;
|''b1''||''b0''||''Function''||''Read/Write'' &lt;br /&gt;
|-&lt;br /&gt;
|0||0||Select internal 6845 register||Write Only &lt;br /&gt;
|-&lt;br /&gt;
|0||1||Write to selected internal 6845 register||Write Only &lt;br /&gt;
|-&lt;br /&gt;
|1||0||-||- &lt;br /&gt;
|-&lt;br /&gt;
|1||1||Read from selected internal 6845 register||Read only &lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Type 3 and 4&lt;br /&gt;
&lt;br /&gt;
{|{{Prettytable|width: 700px; font-size: 2em;}}&lt;br /&gt;
|''b1''||''b0''||''Function''||''Read/Write'' &lt;br /&gt;
|-&lt;br /&gt;
|0||0||Select internal 6845 register||Write Only &lt;br /&gt;
|-&lt;br /&gt;
|0||1||Write to selected internal 6845 register||Write Only &lt;br /&gt;
|-&lt;br /&gt;
|1||0||Read from selected internal 6845 register||Read Only &lt;br /&gt;
|-&lt;br /&gt;
|1||1||Read from selected internal 6845 register||Read only &lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
It is not possible to read from all the internal registers, this table shows the read/write status of each register for each type: &lt;br /&gt;
&lt;br /&gt;
{|{{Prettytable|width: 700px; font-size: 2em;}}&lt;br /&gt;
|rowspan=2|''Register Index''||rowspan=2|''Register Name''||colspan=4|''Type'' &lt;br /&gt;
|-&lt;br /&gt;
|0||1||2||3||4&lt;br /&gt;
|-&lt;br /&gt;
|0||Horizontal Total||Write Only||Write Only||Write Only||(note 2)||(note 3) &lt;br /&gt;
|-&lt;br /&gt;
|1||Horizontal Displayed||Write Only||Write Only||Write Only||(note 2)||(note 3)&lt;br /&gt;
|-&lt;br /&gt;
|2||Horizontal Sync Position||Write Only||Write Only||Write Only||(note 2)||(note 3) &lt;br /&gt;
|-&lt;br /&gt;
|3||Horizontal and Vertical Sync Widths||Write Only||Write Only||Write Only||(note 2)||(note 3) &lt;br /&gt;
|-&lt;br /&gt;
|4||Vertical Total||Write Only||Write Only||Write Only||(note 2)||(note 3) &lt;br /&gt;
|-&lt;br /&gt;
|5||Vertical Total Adjust||Write Only||Write Only||Write Only||(note 2)||(note 3) &lt;br /&gt;
|-&lt;br /&gt;
|6||Vertical Displayed||Write Only||Write Only||Write Only||(note 2)||(note 3)&lt;br /&gt;
|-&lt;br /&gt;
|7||Vertical Sync position||Write Only||Write Only||Write Only||(note 2)||(note 3) &lt;br /&gt;
|-&lt;br /&gt;
|8||Interlace and Skew||Write Only||Write Only||Write Only||(note 2)||(note 3) &lt;br /&gt;
|-&lt;br /&gt;
|9||Maximum Raster Address||Write Only||Write Only||Write Only||(note 2)||(note 3) &lt;br /&gt;
|-&lt;br /&gt;
|10||Cursor Start Raster||Write Only||Write Only||Write Only||(note 2)||(note 3) &lt;br /&gt;
|-&lt;br /&gt;
|11||Cursor End Raster||Write Only||Write Only||Write Only||(note 2)||(note 3) &lt;br /&gt;
|-&lt;br /&gt;
|12||Display Start Address (High)||Read/Write||Write Only||Write Only||Read/Write (note 2)||(note 3) &lt;br /&gt;
|-&lt;br /&gt;
|13||Display Start Address (Low)||Read/Write||Write Only||Write Only||Read/Write (note 2)||(note 3) &lt;br /&gt;
|-&lt;br /&gt;
|14||Cursor Address (High)||Read/Write||Read/Write||Read/Write||Read/Write (note 2)||(note 3)&lt;br /&gt;
|-&lt;br /&gt;
|15||Cursor Address (Low)||Read/Write||Read/Write||Read/Write||Read/Write (note 2)||(note 3)&lt;br /&gt;
|-&lt;br /&gt;
|16||Light Pen Address (High)||Read Only||Read Only||Read Only||Read Only (note 2)||(note 3)&lt;br /&gt;
|-&lt;br /&gt;
|17||Light Pen Address (Low)||Read Only||Read Only||Read Only||Read Only (note 2)||(note 3)&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
'''Notes'''&lt;br /&gt;
&lt;br /&gt;
1. On type 0 and 1, if a Write Only register is read from, &amp;quot;0&amp;quot; is returned. &lt;br /&gt;
&lt;br /&gt;
2. See the document &amp;quot;Extra CPC Plus Hardware Information&amp;quot; for more details.&lt;br /&gt;
&lt;br /&gt;
3. CRTC type 4 is the same as CRTC type 3. The registers also repeat as they do on the type 3.&lt;br /&gt;
&lt;br /&gt;
== Horizontal and Vertical Sync (R3) ==&lt;br /&gt;
&lt;br /&gt;
UM6845:&lt;br /&gt;
&lt;br /&gt;
Bits 7..4 define Vertical Sync Width. If 0 is programmed this gives 16 lines of VSYNC.&lt;br /&gt;
Bits 3..0 define Horizontal Sync Width. If 0 is programmed no HSYNC is generated.&lt;br /&gt;
&lt;br /&gt;
UM6845R:&lt;br /&gt;
&lt;br /&gt;
Bits 7..4 are ignored. Vertical Sync is fixed at 16 lines.&lt;br /&gt;
Bits 3..0 define Horizontal Sync Width. If 0 is programmed no HSYNC is generated.&lt;br /&gt;
&lt;br /&gt;
MC6845:&lt;br /&gt;
&lt;br /&gt;
Bits 7..4 are ignored. Vertical Sync is fixed at 16 lines.&lt;br /&gt;
Bits 3..0 define Horizontal Sync Width. If 0 is programmed this gives a HSYNC width of 16.&lt;br /&gt;
&lt;br /&gt;
Pre-ASIC/ASIC:&lt;br /&gt;
&lt;br /&gt;
Bits 7..4 define Vertical Sync Width. If 0 is programmed this gives 16 lines of VSYNC.&lt;br /&gt;
Bits 3..0 define Horizontal Sync Width. If 0 is programmed this gives a HSYNC width of 16.&lt;br /&gt;
&lt;br /&gt;
== UM6845R and R31 ==&lt;br /&gt;
&lt;br /&gt;
R31 is described in the UM6845R documentation as &amp;quot;Dummy Register&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Its use is described in the documentation for the Rockwell R6545 in combination with R18, R19 and R8 and the Status Register.&lt;br /&gt;
&lt;br /&gt;
In the UM6845R it appears to have no effect. Reading and writing does nothing. Reading it returns 0x0ff.&lt;br /&gt;
&lt;br /&gt;
R31 doesn't exist on types 0,2,3.&lt;br /&gt;
&lt;br /&gt;
== UM6845R and R12/R13 ==&lt;br /&gt;
&lt;br /&gt;
The UM6845R differs to other CRTC in respect of R12/R13. &lt;br /&gt;
&lt;br /&gt;
When VCC=0, R12/R13 is re-read at the start of each line. R12/R13 can therefore be changed for each scanline when VCC=0. &lt;br /&gt;
&lt;br /&gt;
Just like other CRTCs when RC==(R9-1), the current MA is captured for the next char-line.&lt;br /&gt;
&lt;br /&gt;
In demos to make a display compatible with all CRTCs program R12/R13 when VCC!=0. This will then take effect at the next frame start.&lt;br /&gt;
&lt;br /&gt;
== UM6845R status register ==&lt;br /&gt;
&lt;br /&gt;
The UM6845R has a status register that can be read using port &amp;amp;BExx.&lt;br /&gt;
&lt;br /&gt;
Bit 6 is set to 1 if there is a strobe input to the /LPEN signal. It is cleared to 0 when either R17 or R16 (LPEN address) of the CRTC are read. It signals there is a valid LPEN input. On my CPC (arnoldemu) with UM6845R, it is triggered at power on, R17 and R16 have the values 0 when read.&lt;br /&gt;
&lt;br /&gt;
Bit 5 is set to 1 when CRTC is in &amp;quot;vertical blanking&amp;quot;. Vertical blanking is when the vertical border is active. i.e. VCC&amp;gt;=R6. &lt;br /&gt;
&lt;br /&gt;
It is cleared when the frame is started (VCC=0). It is not directly related to the DISPTMG output (used by the CPC to display the border colour) because that output is a combination of horizontal and vertical blanking.&lt;br /&gt;
This bit will be 0 when pixels are being displayed.&lt;br /&gt;
&lt;br /&gt;
All the other bits read as 0 and don't have any function.&lt;br /&gt;
&lt;br /&gt;
==== Used by Amstrad ====&lt;br /&gt;
* [[Media:hd6845.hitachi.pdf|HD6845S (Hitachi)]] aka Type 0&lt;br /&gt;
* [[Media:UM6845-UMC.pdf|UM6845 (UMC)]] aka Type 0&lt;br /&gt;
* [[Media:Um6845r.umc.pdf|UM6845R (UMC)]] aka Type 1&lt;br /&gt;
* [[Media:Mc6845.motorola.pdf|MC6845 (Motorola)]] aka Type 2&lt;br /&gt;
* [[Media:CPC_Plus_Asic_Schematic.GIF|AMS40489 (Amstrad)]] aka Type 3 ([[ASIC]])&lt;br /&gt;
* [[AMS40226 (Amstrad)]] aka Type 4 (Pre-ASIC)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Unused clones ====&lt;br /&gt;
* [[CM607P]] a Bulgarian clone made in Pravetz factory. It is used in the [[Aleste 520EX]].&lt;br /&gt;
* [[Media:hd6845.hitachi.pdf|HD6845R]] by Hitachi. According to Kevin Thacker, the [[KC Compact]] used HD6845R only.&lt;br /&gt;
* [[Media:UM6845E-UMC.pdf|UM6845E]] by UMC&lt;br /&gt;
* [[Media:Mc6845.pdf|MC6845-1]] by Motorola&lt;br /&gt;
* [[Media:F6845.pdf|F6845]] by Fairchild&lt;br /&gt;
* [[Media:EF6845P.pdf|EF6845]] by Thomson Semiconductors&lt;br /&gt;
* [[Media:VL6845 VTi.pdf|VL6845]] by VTi&lt;br /&gt;
* [[Media:C6845 CRTC (CAST).pdf|C6845]] by Cast&lt;br /&gt;
* [[Media:MB89321B FUJ.pdf|MB89321B]] by Fujitsu. It is pin-compatible with the 6845&lt;br /&gt;
* [[Media:MB89321A datasheet CRTC.pdf|MB89321A]] by Fujitsu. Enhanced version that adds smooth scroll, screen partitioning, independent scrolling of screen partitions, and other convenient features&lt;br /&gt;
* [[Media:Mos 6545-1 crtc.pdf|MOS 6545]] (MOS, Rockwell, Synertek) is pin-compatible with the 6845. Its differences are found in the R8 register.&lt;br /&gt;
* [https://www.cpcwiki.eu/forum/other-retro/interesting-discussion-about-the-c128-s-cpm-poor-performance/msg223058/#msg223058 MOS 8563] It is an evolution of the 6545/6845 CRTC chip, with blitter abilities to autonomously perform block memory copies within its dedicated video RAM.&lt;br /&gt;
* [https://github.com/hoglet67/BeebFpga/blob/dev/src/common/mc6845.vhd BeebFpga] [https://github.com/MiSTer-devel/Amstrad_MiSTer/blob/master/rtl/UM6845R.v MiSTer] [https://opencores.org/websvn/filedetails?repname=System09&amp;amp;path=%2FSystem09%2Ftrunk%2Frtl%2FVHDL%2Fcrtc6845.vhd OpenCores] Verilog/VHDL implementations of the 6845&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Tools about CRTC ==&lt;br /&gt;
&lt;br /&gt;
* [http://www.cpcwiki.eu/imgs/9/99/Elmar_Krieger-SPECIAL_EFFECTS.dsk  some BASIC tools to detect CRTC types 0-1-2 and show some effects] by [[Elmar Krieger]] (DSK for Emulators)&lt;br /&gt;
* [[File:Shaker26.dsk]] Shaker - Suite of CRTC tests associated with the CPC CRTC compendium (many of them will not work correctly on emulators and that was the purpose of the tests, to help create more compatible emulation)&lt;br /&gt;
* [[File:Shaker addon.dsk]] Shaker Add-On (Pixel 1 Hard Scroll / Vertical Rupture all Crtc)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Links ==&lt;br /&gt;
&lt;br /&gt;
* [http://en.wikipedia.org/wiki/6845 Wikipedia on the CRTC]&lt;br /&gt;
* [[Media:ACCC1.8-EN.pdf]] CPC CRTC Compendium - Latest (04/2024!) document containing in-depth info about CRTC programming on CPC.&lt;br /&gt;
* [[Media:CRTC Compendium Podcast.mp3]] The CRTC Compendium digested in podcast format&lt;br /&gt;
* [http://www.grimware.org/doku.php/documentations/devices/crtc CRTC documentation from Grimware]&lt;br /&gt;
* [http://quasar.cpcscene.net/doku.php?id=assem:crtc Quasar CRTC documentation (in french)]&lt;br /&gt;
* [https://pulkomandy.github.io/shinra.github.io/crtc.html PulkoMandy's table] [https://www.theoddys.com/acorn/the_6845_crtc/6845%20Variants.xlsx Oddy's table] Differences between CRTC types&lt;br /&gt;
* [[Media:Dossier Rupture(Gozeur Paradox).pdf]]&lt;br /&gt;
* [[Media:Dossier CRTC(Ramlaid Mortel).pdf]] Les entrailles du CRTC&lt;br /&gt;
* [https://thecheshirec.at/tag/crtc6845/ Leçons CRTC (CheshireCat)]&lt;br /&gt;
* [https://martin.hinner.info/vga/pal.html PAL video timing specification]&lt;br /&gt;
&lt;br /&gt;
==Related pages==&lt;br /&gt;
&lt;br /&gt;
*[[Gate Array]]&lt;br /&gt;
&lt;br /&gt;
*[[ASIC]]&lt;br /&gt;
&lt;br /&gt;
*[[Video modes]]&lt;br /&gt;
&lt;br /&gt;
*[[Synchronising with the CRTC and display]] : technic and details on the relationship between Gate Array and CRTC.&lt;br /&gt;
&lt;br /&gt;
*[[VIDI digitizer]] This extension contains its own CRTC chip&lt;br /&gt;
&lt;br /&gt;
[[Category:Hardware]] [[Category:CPC Internal Components]] [[Category:Electronic Component]] [[Category:Programming]] [[Category:Datasheet]] [[Category:Graphic]]&lt;/div&gt;</summary>
		<author><name>Longshot</name></author>	</entry>

	<entry>
		<id>https://oldwiki.cpcwiki.eu/index.php?title=Gate_Array&amp;diff=126279</id>
		<title>Gate Array</title>
		<link rel="alternate" type="text/html" href="https://oldwiki.cpcwiki.eu/index.php?title=Gate_Array&amp;diff=126279"/>
				<updated>2025-05-24T12:17:06Z</updated>
		
		<summary type="html">&lt;p&gt;Longshot: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[File:Amstrad 40007 Gate Array.png|right|thumb|Amstrad 40007 Gate Array]]&lt;br /&gt;
[[File:Amstrad 40010 Gate Array.png|right|thumb|Amstrad 40010 Gate Array]]&lt;br /&gt;
&lt;br /&gt;
Also designated as Video Gate Array (VGA, not to be confused with the IBM PC compatible graphic card spec).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Introduction  ==&lt;br /&gt;
&lt;br /&gt;
The Gate Array is a specially designed chip exclusively for use in the Amstrad CPC and was designed by Amstrad plc. &lt;br /&gt;
&lt;br /&gt;
In the CPC+ system, the functions of the Gate Array are integrated into a single [[ASIC|ASIC]]. When the ASIC is &amp;quot;locked&amp;quot;, the extra features are not available and the ASIC operates the same as the Gate Array in the CPC allowing programs written for the CPC to work on the Plus without modification. The ASIC must be &amp;quot;un-locked&amp;quot; to access the new features. &lt;br /&gt;
&lt;br /&gt;
In the [[KC Compact]] system, the functions of the Gate Array are &amp;quot;emulated&amp;quot; in TTL chips, [[CIO Overview|CIO]], and its color translation EPROM.&lt;br /&gt;
&lt;br /&gt;
In the &amp;quot;cost-down&amp;quot; version of the CPC6128, the functions of the Gate Array are integrated into an ASIC.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== What does it do? ==&lt;br /&gt;
&lt;br /&gt;
The Gate Array is responsible for the display (colour palette, resolution, horizontal and vertical sync), bus arbitration, DRAM refresh, interrupt generation and memory arrangement. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Bus arbitration ==&lt;br /&gt;
&lt;br /&gt;
The Gate Array arbitrates access to the RAM between the CPU and the video hardware (CRTC and Gate-Array).&lt;br /&gt;
&lt;br /&gt;
Every microsecond: &lt;br /&gt;
* The CRTC generates a memory address using it's MA and RA signal outputs. See the [[CRTC]] wiki page to know how the motherboard wiring transforms these signals into the Video Memory Address (VMA).&lt;br /&gt;
* The Gate Array fetches 2 bytes for each address. /CPU_ADDR is a 1MHz signal. So these 2 bytes are fetched sequentially. They are not interleaved with Z80 access. These bytes are fetched even when the border is on as this is required for DRAM refresh.&lt;br /&gt;
* The video hardware is given priority so that the display is not disrupted.&lt;br /&gt;
&lt;br /&gt;
The Gate-Array generates the &amp;quot;READY&amp;quot; signal which is connected to the &amp;quot;/WAIT&amp;quot; input signal of the CPU. This signal is used to stop the CPU accessing RAM while the video-hardware is accessing it.&lt;br /&gt;
&lt;br /&gt;
In fact, the Gate Array allows the Z80 to access the RAM in only 1 out of every 4 cycles. As a result, all instruction timings are stretched so that they are all multiples of a microsecond (1µs), and this gives an effective CPU clock of 3.3Mhz.&lt;br /&gt;
&lt;br /&gt;
Unlike the ZX Spectrum or the Amiga, where bus arbitration is restricted to the &amp;quot;contended memory&amp;quot; or &amp;quot;chip RAM&amp;quot;, on the CPC it also applies to ROM access and to RAM expansions. So the Z80 always runs at the same speed, regardless of the type of memory being accessed.&lt;br /&gt;
&lt;br /&gt;
Last but not least, bus arbitration also applies to I/O access. And memory access is not aligned with I/O access on Z80.&lt;br /&gt;
&lt;br /&gt;
Note: On Amstrad Plus, the ASIC also has to handle DMA instruction fetch from RAM.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== DRAM refresh ==&lt;br /&gt;
&lt;br /&gt;
On Amstrad CPC, the Gate Array is responsible for the DRAM refresh, instead of using the Z80 built-in DRAM refresh mechanism. The reason is that there can only be 3 DRAM accesses per microsecond on this architecture. Doing DRAM refresh on each M1 cycle as it is done on MSX would bog down the CPU speed on CPC given its bus arbitration scheme.&lt;br /&gt;
&lt;br /&gt;
The Z80 generates a maximum of one request per microsecond. The CPC also requires two memory accesses per microsecond for reading video data.&lt;br /&gt;
&lt;br /&gt;
The CPC specs 4164-20 DRAMs. These require 330nS for a read or write cycle. The CPC also uses the optimised sequential CAS cycles to read the two video data bytes in half a microsecond. [https://www.cpcwiki.eu/forum/amstrad-cpc-hardware/the-cpc-revision-zero-article/msg243769/ Source]&lt;br /&gt;
&lt;br /&gt;
The way to cause the RAM refresh to fail in both a Plus or normal CPC is simply to stop a few bits of the CRTC address changing (ie. never refresh the selected area).&lt;br /&gt;
&lt;br /&gt;
Generally, only the Row address needs to be cycled, so stopping MA0 through MA7 from changing, and stopping the CPU from reading those rows, will cause data to be lost, quite quickly (generally around 4ms). [https://www.cpcwiki.eu/forum/amstrad-cpc-hardware/memory-refresh-plus/ Source]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Controlling the Gate Array  ==&lt;br /&gt;
&lt;br /&gt;
The gate array is controlled by I/O. The gate array is selected when bit 15 of the I/O port address is set to &amp;quot;0&amp;quot; and bit 14 of the I/O port address is set to &amp;quot;1&amp;quot;. The values of the other bits are ignored. However, to avoid conflict with other devices in the system, these bits should be set to &amp;quot;1&amp;quot;. &lt;br /&gt;
&lt;br /&gt;
The recommended I/O port address is &amp;amp;7Fxx. &lt;br /&gt;
&lt;br /&gt;
The Gate Array is not connected to the CPU's RD and WR pins, so it cannot detect the bus's I/O direction. If you execute an I/O read operation on the Gate Array I/O address, the Gate Array will read an unpredictable value from the databus which will be in high-impedance state. If the value is a valid Gate Array command, it will be executed, otherwise nothing will happen. [https://www.grimware.org/doku.php/documentations/devices/gatearraydo=export_xhtml Source]&lt;br /&gt;
&lt;br /&gt;
The function to be performed is selected by writing data to the Gate Array, the first bits of the data define the function selected (see table below). It is not possible to read from the Gate Array. &lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!colspan=4| 8bit command&lt;br /&gt;
!rowspan=2| Machine&lt;br /&gt;
!rowspan=2| Register&lt;br /&gt;
!rowspan=2| Description&lt;br /&gt;
!rowspan=2| Chip&lt;br /&gt;
|-&lt;br /&gt;
! 7&lt;br /&gt;
! 6&lt;br /&gt;
! 5&lt;br /&gt;
! 4..0&lt;br /&gt;
|-&lt;br /&gt;
| 0 || 0 || x || style=&amp;quot;text-align: center;&amp;quot; | n || All || PENR || Select a color register || Gate Array&lt;br /&gt;
|-&lt;br /&gt;
| 0 || 1 || x || style=&amp;quot;text-align: center;&amp;quot; | n || All || INKR || Change the value of the currently selected color register || Gate Array&lt;br /&gt;
|-&lt;br /&gt;
| 1 || 0 || 0 || style=&amp;quot;text-align: center;&amp;quot; | n || All || RMR || Control Interrupt counter, ROM mapping and Graphics mode || Gate Array&lt;br /&gt;
|-&lt;br /&gt;
| rowspan=&amp;quot;2&amp;quot;|1 || rowspan=&amp;quot;2&amp;quot;|0 || rowspan=&amp;quot;2&amp;quot;|1 || style=&amp;quot;text-align: center;&amp;quot; rowspan=&amp;quot;2&amp;quot; | n || All || RMR || ''Ghost register'' || Gate Array (CPC) or locked ASIC (Plus)&lt;br /&gt;
|-&lt;br /&gt;
| Plus || RMR2 || ASIC &amp;amp; Advanced ROM mapping || Unlocked ASIC&lt;br /&gt;
|-&lt;br /&gt;
| 1 || 1 ||colspan=2  style=&amp;quot;text-align: center;&amp;quot; | n || All || MMR || RAM memory mapping || PAL (only with 128KB or RAM expansion)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
The MMR register is not available in the Gate Array, but is performed by a device at the same I/O port address location.&lt;br /&gt;
&lt;br /&gt;
In the CPC464, CPC664 and KC compact, MMR is performed in an external memory expansion (e.g. Dk'Tronics 64K RAM Expansion), if this expansion is not present then MMR is not available.&lt;br /&gt;
&lt;br /&gt;
In the CPC6128, MMR is performed by a [[PAL16L8|PAL chip]] located on the main PCB, or an external memory expansion.&lt;br /&gt;
&lt;br /&gt;
In the 464+ and 6128+, MMR is performed by the ASIC or an external memory expansion. Please read the document on RAM management for more information.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Registers ==&lt;br /&gt;
&lt;br /&gt;
Note: The Plus palette capabilities are only accessible through the [[Default I/O Port Summary|ASIC I/O page]]. Registers PENR and INKR are not needed in that case.&lt;br /&gt;
&lt;br /&gt;
=== Register PENR (Select a color register) ===&lt;br /&gt;
&lt;br /&gt;
When bit 7 and bit 6 are set to &amp;quot;0&amp;quot;, the remaining bits determine which pen is to have its colour changed. When bit 4 is set to &amp;quot;0&amp;quot;, bits 3 to 0 define which pen is to be selected. When bit 4 is set to &amp;quot;1&amp;quot;, the value contained in bits 3-0 is ignored and the border is selected. &lt;br /&gt;
&lt;br /&gt;
The pen remains selected until another is chosen. &lt;br /&gt;
&lt;br /&gt;
Each mode has a fixed number of pens. Mode 0 has 16 pens, mode 1 has 4 pens and mode 2 has 2 pens. &lt;br /&gt;
&lt;br /&gt;
==== Summary  ====&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!Bit&lt;br /&gt;
!Value&lt;br /&gt;
!Function&lt;br /&gt;
|-&lt;br /&gt;
| 7 || 0 || rowspan=&amp;quot;2&amp;quot; | Gate Array PENR register&lt;br /&gt;
|-&lt;br /&gt;
| 6 || 0 &lt;br /&gt;
|-&lt;br /&gt;
| 5 || - || not used&lt;br /&gt;
|-&lt;br /&gt;
| 4 || 1 || Select border&lt;br /&gt;
|-&lt;br /&gt;
| 3 || x || rowspan=&amp;quot;4&amp;quot; | Ignored&lt;br /&gt;
|-&lt;br /&gt;
| 2 || x&lt;br /&gt;
|-&lt;br /&gt;
| 1 || x&lt;br /&gt;
|-&lt;br /&gt;
| 0 || x&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!Bit&lt;br /&gt;
!Value&lt;br /&gt;
!Function&lt;br /&gt;
|-&lt;br /&gt;
| 7 || 0 || rowspan=&amp;quot;2&amp;quot; | Gate Array PENR register&lt;br /&gt;
|-&lt;br /&gt;
| 6 || 0&lt;br /&gt;
|-&lt;br /&gt;
| 5 || - || not used&lt;br /&gt;
|-&lt;br /&gt;
| 4 || 0 || Select pen&lt;br /&gt;
|-&lt;br /&gt;
| 3 || x || rowspan=&amp;quot;4&amp;quot; | Pen number&lt;br /&gt;
|-&lt;br /&gt;
| 2 || x&lt;br /&gt;
|-&lt;br /&gt;
| 1 || x&lt;br /&gt;
|-&lt;br /&gt;
| 0 || x&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Register INKR (Change the value of the currently selected color register) ===&lt;br /&gt;
&lt;br /&gt;
Once the pen has been selected its colour can then be changed. Bits 4 to 0 specify the hardware colour number from the hardware colour palette. &lt;br /&gt;
&lt;br /&gt;
Even though there is provision for 32 colours, only 27 are possible. The remaining colours are duplicates of those already in the colour palette. &lt;br /&gt;
&lt;br /&gt;
==== Summary  ====&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!Bit&lt;br /&gt;
!Value&lt;br /&gt;
!Function&lt;br /&gt;
|-&lt;br /&gt;
| 7 || 0 || rowspan=&amp;quot;2&amp;quot; | Gate Array INKR register&lt;br /&gt;
|-&lt;br /&gt;
| 6 || 1&lt;br /&gt;
|-&lt;br /&gt;
| 5 || - || not used&lt;br /&gt;
|-&lt;br /&gt;
| 4 || x || rowspan=&amp;quot;5&amp;quot; | Colour number x&lt;br /&gt;
|-&lt;br /&gt;
| 3 || x &lt;br /&gt;
|-&lt;br /&gt;
| 2 || x &lt;br /&gt;
|-&lt;br /&gt;
| 1 || x&lt;br /&gt;
|-&lt;br /&gt;
| 0 || x&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Register RMR (Control Interrupt counter, ROM mapping and Graphics mode) ===&lt;br /&gt;
&lt;br /&gt;
This is a general purpose register responsible for the [[Video modes|graphics mode]] and the ROM configuration. &lt;br /&gt;
&lt;br /&gt;
==== Graphics mode selection  ====&lt;br /&gt;
&lt;br /&gt;
The function of bits 1 and 0 is to define the screen mode. The settings for bits 1 and 0 and the corresponding screen mode are given in the table below. &lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!Bit 1&lt;br /&gt;
!Bit 0&lt;br /&gt;
!Screen mode&lt;br /&gt;
|-&lt;br /&gt;
| 0 || 0 || Mode 0, 160x200 resolution, 16 colours&lt;br /&gt;
|-&lt;br /&gt;
| 0 || 1 || Mode 1, 320x200 resolution, 4 colours&lt;br /&gt;
|-&lt;br /&gt;
| 1 || 0 || Mode 2, 640x200 resolution, 2 colours&lt;br /&gt;
|-&lt;br /&gt;
| 1 || 1 || Mode 3, 160x200 resolution, 4 colours (undocumented)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
* Mode 3 is not official. From the combinations possible, we can see that 4 modes can be defined, although the Amstrad only has 3. Mode 3 is similar to mode 0, because it has the same resolution, but it is limited to only 4 colours. Mode 3 is not supported by the [[KC Compact]] (which outputs black in Mode 3).&lt;br /&gt;
&lt;br /&gt;
Mode changing is synchronised with HSYNC. If the mode is changed, it will take effect from the next HSYNC.&lt;br /&gt;
&lt;br /&gt;
==== ROM configuration selection  ====&lt;br /&gt;
&lt;br /&gt;
Bit 2 is used to enable or disable the lower ROM area. The lower ROM area occupies memory addresses &amp;amp;amp;0000-&amp;amp;amp;3fff and is used to access the operating system ROM. When the lower ROM area is is enabled, reading from &amp;amp;amp;0000-&amp;amp;amp;3FFF will return data in the ROM. When a value is written to &amp;amp;amp;0000-&amp;amp;amp;3FFF, it will be written to the RAM underneath the ROM. When it is disabled, data read from &amp;amp;amp;0000-&amp;amp;amp;3FFF will return the data in the RAM. &lt;br /&gt;
&lt;br /&gt;
Similarly, bit 3 controls enabling or disabling of the upper ROM area. The upper ROM area occupies memory addressess &amp;amp;amp;C000-&amp;amp;amp;FFFF and is BASIC or any expansion ROMs which may be plugged into a ROM board/box. See the document on [[Upper ROM Bank Number|upper rom selection]] for more details. When the upper ROM area enabled, reading from &amp;amp;amp;c000-&amp;amp;amp;ffff, will return data in the ROM. When data is written to &amp;amp;amp;c000-&amp;amp;amp;FFFF, it will be written to the RAM at the same address as the ROM. When the upper ROM area is disabled, and data is read from &amp;amp;amp;c000-&amp;amp;amp;ffff it will be the data in the RAM. &lt;br /&gt;
&lt;br /&gt;
Bit 4 controls the interrupt generation. It can be used to delay interrupts. See the document on interrupt generation for more information.&lt;br /&gt;
&lt;br /&gt;
==== Summary  ====&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!Bit&lt;br /&gt;
!Value&lt;br /&gt;
!Function&lt;br /&gt;
|-&lt;br /&gt;
| 7 || 1 || rowspan=&amp;quot;2&amp;quot; | Gate Array RMR register&lt;br /&gt;
|-&lt;br /&gt;
| 6 || 0 &lt;br /&gt;
|-&lt;br /&gt;
| 5 || - || ''must be 0 on Plus machines with ASIC unlocked''&lt;br /&gt;
|-&lt;br /&gt;
| 4 || x || Interrupt generation control&lt;br /&gt;
|-&lt;br /&gt;
| 3 || x || 1=Upper ROM area disable, 0=Upper ROM area enable&lt;br /&gt;
|-&lt;br /&gt;
| 2 || x || 1=Lower ROM area disable, 0=Lower ROM area enable&lt;br /&gt;
|-&lt;br /&gt;
| 1 || x || rowspan=&amp;quot;2&amp;quot; | Graphics Mode selection&lt;br /&gt;
|-&lt;br /&gt;
| 0 || x&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Register RMR2 (ASIC &amp;amp; Advanced ROM mapping) ===&lt;br /&gt;
&lt;br /&gt;
This register exists only in Plus or GX4000, and is only accessible when the ASIC is unlocked.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!Bit&lt;br /&gt;
!Value&lt;br /&gt;
!Function&lt;br /&gt;
|-&lt;br /&gt;
| 7 || 1 || rowspan=&amp;quot;3&amp;quot; | Gate Array RMR2 register&lt;br /&gt;
|-&lt;br /&gt;
| 6 || 0&lt;br /&gt;
|-&lt;br /&gt;
| 5 || 1&lt;br /&gt;
|-&lt;br /&gt;
| 4 || x || rowspan=&amp;quot;2&amp;quot; |RMR addressing mode&lt;br /&gt;
|-&lt;br /&gt;
| 3 || x&lt;br /&gt;
|-&lt;br /&gt;
| 2 || x || rowspan=&amp;quot;3&amp;quot; | Physical ROM number (0..7)&lt;br /&gt;
|-&lt;br /&gt;
| 1 || x&lt;br /&gt;
|-&lt;br /&gt;
| 0 || x&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ RMR addressing modes&lt;br /&gt;
!Bit 4&lt;br /&gt;
!Bit 3&lt;br /&gt;
!Lower ROM&lt;br /&gt;
![[ASIC|ASIC I/O page]]&lt;br /&gt;
|-&lt;br /&gt;
|0&lt;br /&gt;
|0&lt;br /&gt;
|&amp;amp;0000-&amp;amp;3FFF&lt;br /&gt;
|Disabled&lt;br /&gt;
|-&lt;br /&gt;
|0&lt;br /&gt;
|1&lt;br /&gt;
|&amp;amp;4000-&amp;amp;7FFF&lt;br /&gt;
|Disabled&lt;br /&gt;
|-&lt;br /&gt;
|1&lt;br /&gt;
|0&lt;br /&gt;
|&amp;amp;8000-&amp;amp;BFFF&lt;br /&gt;
|Disabled&lt;br /&gt;
|-&lt;br /&gt;
|1&lt;br /&gt;
|1&lt;br /&gt;
|&amp;amp;0000-&amp;amp;3FFF&lt;br /&gt;
|&amp;amp;4000-&amp;amp;7FFF&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
The physical ROMs are also accessible as upper ROMs by using the [[Upper ROM Bank Number]] port and the RMR register.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Register MMR (RAM memory mapping) ===&lt;br /&gt;
&lt;br /&gt;
This register exists only in CPCs with 128K RAM (like the CPC 6128), or CPCs equipped with [[Standard Memory Expansions]].&lt;br /&gt;
&lt;br /&gt;
Note: In the CPC 6128, the register is a separate [[PAL16L8|PAL chip]] that assists the Gate Array chip.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!Bit&lt;br /&gt;
!Value&lt;br /&gt;
!Function&lt;br /&gt;
|-&lt;br /&gt;
| 7 || 1 || rowspan=&amp;quot;2&amp;quot; | Gate Array MMR register&lt;br /&gt;
|-&lt;br /&gt;
| 6 || 1 &lt;br /&gt;
|-&lt;br /&gt;
| 5 || x || rowspan=&amp;quot;3&amp;quot; |64K bank number (0..7); always 0 on an unexpanded CPC6128, 0-7 on [[Standard Memory Expansions]]&lt;br /&gt;
|-&lt;br /&gt;
| 4 || x&lt;br /&gt;
|-&lt;br /&gt;
| 3 || x&lt;br /&gt;
|-&lt;br /&gt;
| 2 || x || rowspan=&amp;quot;3&amp;quot; | RAM Config (0..7)&lt;br /&gt;
|-&lt;br /&gt;
| 1 || x&lt;br /&gt;
|-&lt;br /&gt;
| 0 || x&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
The 3bit RAM Config value is used to access the second 64K of the total 128K RAM that is built into the CPC 6128 or the additional 64K-512K of standard memory expansions. These contain up to eight 64K ram banks, which are selected with bit 3-5. A standard CPC 6128 only contains bank 0. Normally the register is set to 0, so that only the first 64K RAM are used (identical to the CPC 464 and 664 models). The register can be used to select between the following eight predefined configurations only:&lt;br /&gt;
&lt;br /&gt;
  -Address-     0      1      2      3      4      5      6      7&lt;br /&gt;
  0000-3FFF   RAM_0  RAM_0  '''RAM_4'''  RAM_0  RAM_0  RAM_0  RAM_0  RAM_0&lt;br /&gt;
  4000-7FFF   RAM_1  RAM_1  '''RAM_5'''  '''RAM_3'''  '''RAM_4'''  '''RAM_5'''  '''RAM_6'''  '''RAM_7'''&lt;br /&gt;
  8000-BFFF   RAM_2  RAM_2  '''RAM_6'''  RAM_2  RAM_2  RAM_2  RAM_2  RAM_2&lt;br /&gt;
  C000-FFFF   RAM_3  '''RAM_7'''  '''RAM_7'''  '''RAM_7'''  RAM_3  RAM_3  RAM_3  RAM_3&lt;br /&gt;
&lt;br /&gt;
The Video RAM is always located in the first 64K, VRAM is in no way affected by this register.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Programming the Gate Array - Examples  ==&lt;br /&gt;
&lt;br /&gt;
Defining the colours, &amp;lt;br&amp;gt;Setting pen 0 to Bright White. &lt;br /&gt;
&amp;lt;pre&amp;gt;LD BC,7F00&amp;amp;nbsp;;Gate Array port&lt;br /&gt;
LD A,%00000000+0&amp;amp;nbsp;;Pen number (and Gate Array function)&lt;br /&gt;
OUT (C),A&amp;amp;nbsp;;Send pen number&lt;br /&gt;
LD A,%01000000+11&amp;amp;nbsp;;Pen colour (and Gate Array function)&lt;br /&gt;
OUT (C),A&amp;amp;nbsp;;Send it&lt;br /&gt;
RET&lt;br /&gt;
&lt;br /&gt;
Setting the mode and ROM configuration, &lt;br /&gt;
Mode 2, upper and lower ROM disabled.&lt;br /&gt;
&lt;br /&gt;
LD BC,7F00&amp;amp;nbsp;;Gate array port&lt;br /&gt;
LD A,%10000000+%00001110&amp;amp;nbsp;;Mode and ROM selection (and Gate Array function)&lt;br /&gt;
OUT (C),A&amp;amp;nbsp;;Send it&lt;br /&gt;
RET&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Misc ===&lt;br /&gt;
&lt;br /&gt;
The hardware colour number is different to the colour range used by the firmware, so a conversion chart is provided for the corresponding firmware/hardware colour values and the corresponding colour name. &lt;br /&gt;
&lt;br /&gt;
=== Note ===&lt;br /&gt;
&lt;br /&gt;
The firmware keeps track of the colours it is using. Every VSYNC (assuming interrupts are enabled) the firmware sets the colours. This enables the user to have flashing colours. If the user selects a new colour using the gate array, the new colour will flash temporarily and then return to its original colour. This is due to the firmware resetting the colour. When using the firmware, use its routines to select the colour, and the colour will remain.&lt;br /&gt;
&lt;br /&gt;
Example: [For whatever reason, this example does NOT refer to the above firmware stuff]&lt;br /&gt;
&amp;lt;pre&amp;gt;ld bc,7f00+1&amp;amp;nbsp;;Gate array function (set pen)&lt;br /&gt;
;and pen number&lt;br /&gt;
out (c),c&lt;br /&gt;
ld bc,7f00&amp;amp;nbsp;;41 &lt;br /&gt;
;Gate array function (set colour)&lt;br /&gt;
;and colour number&lt;br /&gt;
out (c),c&lt;br /&gt;
ret&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Video memory structure ==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!rowspan=2|Graphics Mode&lt;br /&gt;
!colspan=8|VRAM byte&lt;br /&gt;
!colspan=8|Displayed Pixels&lt;br /&gt;
!rowspan=2|Definition&lt;br /&gt;
!rowspan=2|Pixel clock&lt;br /&gt;
!rowspan=2|Default resolution&lt;br /&gt;
|-&lt;br /&gt;
!7&lt;br /&gt;
!6&lt;br /&gt;
!5&lt;br /&gt;
!4&lt;br /&gt;
!3&lt;br /&gt;
!2&lt;br /&gt;
!1&lt;br /&gt;
!0&lt;br /&gt;
!1&lt;br /&gt;
!2&lt;br /&gt;
!3&lt;br /&gt;
!4&lt;br /&gt;
!5&lt;br /&gt;
!6&lt;br /&gt;
!7&lt;br /&gt;
!8&lt;br /&gt;
|-&lt;br /&gt;
|0&lt;br /&gt;
|A0&lt;br /&gt;
|B0&lt;br /&gt;
|A2&lt;br /&gt;
|B2&lt;br /&gt;
|A1&lt;br /&gt;
|B1&lt;br /&gt;
|A3&lt;br /&gt;
|B3&lt;br /&gt;
|colspan=4 style=&amp;quot;text-align: center;&amp;quot;|A&lt;br /&gt;
|colspan=4 style=&amp;quot;text-align: center;&amp;quot;|B&lt;br /&gt;
|2 pixels in 16 colours&lt;br /&gt;
|4 MHz&lt;br /&gt;
|160x200, 20-column text&lt;br /&gt;
|-&lt;br /&gt;
|1&lt;br /&gt;
|A0&lt;br /&gt;
|B0&lt;br /&gt;
|C0&lt;br /&gt;
|D0&lt;br /&gt;
|A1&lt;br /&gt;
|B1&lt;br /&gt;
|C1&lt;br /&gt;
|D1&lt;br /&gt;
|colspan=2 style=&amp;quot;text-align: center;&amp;quot;|A&lt;br /&gt;
|colspan=2 style=&amp;quot;text-align: center;&amp;quot;|B&lt;br /&gt;
|colspan=2 style=&amp;quot;text-align: center;&amp;quot;|C&lt;br /&gt;
|colspan=2 style=&amp;quot;text-align: center;&amp;quot;|D&lt;br /&gt;
|4 pixels in 4 colours&lt;br /&gt;
|8 MHz&lt;br /&gt;
|320x200, 40-column text&lt;br /&gt;
|-&lt;br /&gt;
|2&lt;br /&gt;
|A0&lt;br /&gt;
|B0&lt;br /&gt;
|C0&lt;br /&gt;
|D0&lt;br /&gt;
|E0&lt;br /&gt;
|F0&lt;br /&gt;
|G0&lt;br /&gt;
|H0&lt;br /&gt;
|A&lt;br /&gt;
|B&lt;br /&gt;
|C&lt;br /&gt;
|D&lt;br /&gt;
|E&lt;br /&gt;
|F&lt;br /&gt;
|G&lt;br /&gt;
|H&lt;br /&gt;
|8 pixels in 2 colours&lt;br /&gt;
|16 MHz&lt;br /&gt;
|640x200, 80-column text&lt;br /&gt;
|-&lt;br /&gt;
|3&lt;br /&gt;
|A0&lt;br /&gt;
|B0&lt;br /&gt;
|x&lt;br /&gt;
|x&lt;br /&gt;
|A1&lt;br /&gt;
|B1&lt;br /&gt;
|x&lt;br /&gt;
|x&lt;br /&gt;
|colspan=4 style=&amp;quot;text-align: center;&amp;quot;|A&lt;br /&gt;
|colspan=4 style=&amp;quot;text-align: center;&amp;quot;|B&lt;br /&gt;
|2 pixels in 4 colours&lt;br /&gt;
|4 MHz&lt;br /&gt;
|160x200, 20-column text&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Split rasters ==&lt;br /&gt;
&lt;br /&gt;
On the CPC, split rasters occur halfway (after the 8th mode2 pixel) through the rendering of a CRTC character.&lt;br /&gt;
&lt;br /&gt;
On Amstrad Plus, split rasters occur quarter of the way (after the 4th mode2 pixel) through the rendering of a CRTC character.&lt;br /&gt;
&lt;br /&gt;
To easily make split rasters compatible with both the CPC and the Plus machines, one can use the ASIC soft-scroll control register (SSCR) to finely adjust the horizontal position of the graphics.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Palette R,G,B definitions ==&lt;br /&gt;
&lt;br /&gt;
There are 27 colours which are generated from red, green and blue mixed in different quantities. There are 3 levels of red, 3 levels of green and 3 levels of blue, and these can be thought of as off/no colour, half-on/half-colour, and on/full-colour. &lt;br /&gt;
&lt;br /&gt;
To display a CPC image you will need to use a analogue monitor with a composite sync.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Palette sorted by Firmware Colour Numbers ===&lt;br /&gt;
&lt;br /&gt;
The firmware colour palette is sorted by luminance value.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
|-&lt;br /&gt;
!Firmware Number&lt;br /&gt;
!Hardware Number&lt;br /&gt;
!Colour Name&lt;br /&gt;
!R %&lt;br /&gt;
!G %&lt;br /&gt;
!B %&lt;br /&gt;
!ASIC&lt;br /&gt;
!Colour&lt;br /&gt;
|-&lt;br /&gt;
| 0|| 54h          ||Black          ||  0||  0||  0|| #000||bgcolor=&amp;quot;#000000&amp;quot;|&lt;br /&gt;
|-&lt;br /&gt;
| 1|| 44h (or 50h) ||Blue           ||  0||  0|| 50|| #006||bgcolor=&amp;quot;#000080&amp;quot;|&lt;br /&gt;
|-&lt;br /&gt;
| 2|| 55h          ||Bright Blue    ||  0||  0||100|| #00F||bgcolor=&amp;quot;#0000ff&amp;quot;|&lt;br /&gt;
|-&lt;br /&gt;
| 3|| 5Ch          ||Red            || 50||  0||  0|| #600||bgcolor=&amp;quot;#800000&amp;quot;|&lt;br /&gt;
|-&lt;br /&gt;
| 4|| 58h          ||Magenta        || 50||  0|| 50|| #606||bgcolor=&amp;quot;#800080&amp;quot;|&lt;br /&gt;
|-&lt;br /&gt;
| 5|| 5Dh          ||Mauve          || 50||  0||100|| #60F||bgcolor=&amp;quot;#8000ff&amp;quot;|&lt;br /&gt;
|-&lt;br /&gt;
| 6|| 4Ch          ||Bright Red     ||100||  0||  0|| #F00||bgcolor=&amp;quot;#ff0000&amp;quot;|&lt;br /&gt;
|-&lt;br /&gt;
| 7|| 45h (or 48h) ||Purple         ||100||  0|| 50|| #F06||bgcolor=&amp;quot;#ff0080&amp;quot;|&lt;br /&gt;
|-&lt;br /&gt;
| 8|| 4Dh          ||Bright Magenta ||100||  0||100|| #F0F||bgcolor=&amp;quot;#ff00ff&amp;quot;|&lt;br /&gt;
|-&lt;br /&gt;
| 9|| 56h          ||Green          ||  0|| 50||  0|| #060||bgcolor=&amp;quot;#008000&amp;quot;|&lt;br /&gt;
|-&lt;br /&gt;
|10|| 46h          ||Cyan           ||  0|| 50|| 50|| #066||bgcolor=&amp;quot;#008080&amp;quot;|&lt;br /&gt;
|-&lt;br /&gt;
|11|| 57h          ||Sky Blue       ||  0|| 50||100|| #06F||bgcolor=&amp;quot;#0080ff&amp;quot;|&lt;br /&gt;
|-&lt;br /&gt;
|12|| 5Eh          ||Yellow         || 50|| 50||  0|| #660||bgcolor=&amp;quot;#808000&amp;quot;|&lt;br /&gt;
|-&lt;br /&gt;
|13|| 40h (or 41h) ||White          || 50|| 50|| 50||#666||bgcolor=&amp;quot;#808080&amp;quot;|&lt;br /&gt;
|-&lt;br /&gt;
|14|| 5Fh          ||Pastel Blue    || 50|| 50||100|| #66F||bgcolor=&amp;quot;#8080ff&amp;quot;|&lt;br /&gt;
|-&lt;br /&gt;
|15|| 4Eh          ||Orange         ||100|| 50||  0|| #F60|| bgcolor=&amp;quot;#ff8000&amp;quot;|&lt;br /&gt;
|-&lt;br /&gt;
|16|| 47h          ||Pink           ||100|| 50|| 50|| #F66||bgcolor=&amp;quot;#ff8080&amp;quot;|&lt;br /&gt;
|-&lt;br /&gt;
|17|| 4Fh          ||Pastel Magenta ||100|| 50||100|| #F6F||bgcolor=&amp;quot;#ff80ff&amp;quot;|&lt;br /&gt;
|-&lt;br /&gt;
|18|| 52h          ||Bright Green   ||  0||100||  0|| #0F0||bgcolor=&amp;quot;#00ff00&amp;quot;|&lt;br /&gt;
|-&lt;br /&gt;
|19|| 42h (or 51h) ||Sea Green      ||  0||100|| 50|| #0F6||bgcolor=&amp;quot;#00ff80&amp;quot;|&lt;br /&gt;
|-&lt;br /&gt;
|20|| 53h          ||Bright Cyan    ||  0||100||100|| #0FF||bgcolor=&amp;quot;#00ffff&amp;quot;|&lt;br /&gt;
|-&lt;br /&gt;
|21|| 5Ah          ||Lime           || 50||100||  0|| #6F0||bgcolor=&amp;quot;#80ff00&amp;quot;|&lt;br /&gt;
|-&lt;br /&gt;
|22|| 59h          ||Pastel Green   || 50||100|| 50|| #6F6||bgcolor=&amp;quot;#80ff80&amp;quot;|&lt;br /&gt;
|-&lt;br /&gt;
|23|| 5Bh          ||Pastel Cyan    || 50||100||100|| #6FF||bgcolor=&amp;quot;#80ffff&amp;quot;|&lt;br /&gt;
|-&lt;br /&gt;
|24|| 4Ah          ||Bright Yellow  ||100||100||  0|| #FF0||bgcolor=&amp;quot;#ffff00&amp;quot;|&lt;br /&gt;
|-&lt;br /&gt;
|25|| 43h (or 49h) ||Pastel Yellow  ||100||100|| 50||#FF6||bgcolor=&amp;quot;#ffff80&amp;quot;|&lt;br /&gt;
|-&lt;br /&gt;
|26|| 4Bh          ||Bright White   ||100||100||100|| #FFF||bgcolor=&amp;quot;#ffffff&amp;quot;|&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Note: We can observe that the official Amstrad names of some colours are a bit silly: &amp;quot;red&amp;quot; is in fact brown, &amp;quot;yellow&amp;quot; is in fact khaki and &amp;quot;white&amp;quot; is in fact grey.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Amstrad Colour Names ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;gallery&amp;gt;&lt;br /&gt;
Cpc 6128 master colour chat.jpg|Master colour chart&lt;br /&gt;
Cpc 6128 farbtabelle.jpg|Farbtabelle&lt;br /&gt;
Cpc 6128 palette des couleurs.jpg|Palette des couleurs&lt;br /&gt;
Cpc 6128 tabla de colores.jpg|Tabla de colores&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Palette sorted by Hardware Colour Numbers ===&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!Hardware Number&lt;br /&gt;
!Firmware Number&lt;br /&gt;
!R %&lt;br /&gt;
!G %&lt;br /&gt;
!B %&lt;br /&gt;
!ASIC&lt;br /&gt;
!Colour&lt;br /&gt;
!Colour Name&lt;br /&gt;
!German Name&lt;br /&gt;
!French Name&lt;br /&gt;
!Spanish Name&lt;br /&gt;
|-&lt;br /&gt;
|  0 (40h) || 13   || 50|| 50|| 50|| #666|| bgcolor=&amp;quot;#808080&amp;quot; | || White         || Weiß            || Blanc           || Blanco&lt;br /&gt;
|-&lt;br /&gt;
|  1 (41h) || (13) || 50|| 50|| 50|| #666|| bgcolor=&amp;quot;#808080&amp;quot; | || White         || Weiß            || Blanc           || Blanco&lt;br /&gt;
|-&lt;br /&gt;
|  2 (42h) || 19   ||  0||100|| 50|| #0F6|| bgcolor=&amp;quot;#00ff80&amp;quot; | || Sea Green     || Seegrün         || Vert marin      || Verde marino&lt;br /&gt;
|-&lt;br /&gt;
|  3 (43h) || 25   ||100||100|| 50|| #FF6|| bgcolor=&amp;quot;#ffff80&amp;quot; | || Pastel Yellow || Pastellgelb     || Jaune pastel    || Amarillo pastel&lt;br /&gt;
|-&lt;br /&gt;
|  4 (44h) || 1    ||  0||  0|| 50|| #006|| bgcolor=&amp;quot;#000080&amp;quot; | || Blue          || Blau            || Bleu            || Azul&lt;br /&gt;
|-&lt;br /&gt;
|  5 (45h) || 7    ||100||  0|| 50|| #F06|| bgcolor=&amp;quot;#ff0080&amp;quot; | || Purple        || Purpur          || Pourpre         || Púrpura&lt;br /&gt;
|-&lt;br /&gt;
|  6 (46h) || 10   ||  0|| 50|| 50|| #066|| bgcolor=&amp;quot;#008080&amp;quot; | || Cyan          || Blaugrün        || Turquoise       || Ciano&lt;br /&gt;
|-&lt;br /&gt;
|  7 (47h) || 16   ||100|| 50|| 50|| #F66|| bgcolor=&amp;quot;#ff8080&amp;quot; | || Pink          || Rosa            || Rose            || Rosa&lt;br /&gt;
|-&lt;br /&gt;
|  8 (48h) || (7)  ||100||  0|| 50|| #F06|| bgcolor=&amp;quot;#ff0080&amp;quot; | || Purple        || Purpur          || Pourpre         || Púrpura&lt;br /&gt;
|-&lt;br /&gt;
|  9 (49h) || (25) ||100||100|| 50|| #FF6|| bgcolor=&amp;quot;#ffff80&amp;quot; | || Pastel Yellow || Pastellgelb     || Jaune pastel    || Amarillo pastel&lt;br /&gt;
|-&lt;br /&gt;
| 10 (4Ah) || 24   ||100||100||  0|| #FF0|| bgcolor=&amp;quot;#ffff00&amp;quot; | || Bright Yellow || Hellgelb        || Jaune vif       || Amarillo brillante&lt;br /&gt;
|-&lt;br /&gt;
| 11 (4Bh) || 26   ||100||100||100|| #FFF|| bgcolor=&amp;quot;#ffffff&amp;quot; | || Bright White  || Leuchtendweiß   || Blanc brillant  || Blanco brillante&lt;br /&gt;
|-&lt;br /&gt;
| 12 (4Ch) || 6    ||100||  0||  0|| #F00|| bgcolor=&amp;quot;#ff0000&amp;quot; | || Bright Red    || Hellrot         || Rouge vif       || Rojo brillante&lt;br /&gt;
|-&lt;br /&gt;
| 13 (4Dh) || 8    ||100||  0||100|| #F0F|| bgcolor=&amp;quot;#ff00ff&amp;quot; | || Bright Magenta|| helles Magenta  || Magenta vif     || Magenta brillante&lt;br /&gt;
|-&lt;br /&gt;
| 14 (4Eh) || 15   ||100|| 50||  0|| #F60|| bgcolor=&amp;quot;#ff8000&amp;quot; | || Orange        || Orange          || Orange          || Naranja&lt;br /&gt;
|-&lt;br /&gt;
| 15 (4Fh) || 17   ||100|| 50||100|| #F6F|| bgcolor=&amp;quot;#ff80ff&amp;quot; | || Pastel Magenta|| Pastell-magenta || Magenta pastel  || Magenta pastel&lt;br /&gt;
|-&lt;br /&gt;
| 16 (50h) || (1)  ||  0||  0|| 50|| #006|| bgcolor=&amp;quot;#000080&amp;quot; | || Blue          || Blau            || Bleu            || Azul&lt;br /&gt;
|-&lt;br /&gt;
| 17 (51h) || (19) ||  0||100|| 50|| #0F6|| bgcolor=&amp;quot;#00ff80&amp;quot; | || Sea Green     || Seegrün         || Vert marin      || Verde marino&lt;br /&gt;
|-&lt;br /&gt;
| 18 (52h) || 18   ||  0||100||  0|| #0F0|| bgcolor=&amp;quot;#00ff00&amp;quot; | || Bright Green  || Hellgrün        || Vert vif        || Verde brillante&lt;br /&gt;
|-&lt;br /&gt;
| 19 (53h) || 20   ||  0||100||100|| #0FF|| bgcolor=&amp;quot;#00ffff&amp;quot; | || Bright Cyan   || helles Blaugrün || Turquoise vif   || Ciano brillante&lt;br /&gt;
|-&lt;br /&gt;
| 20 (54h) || 0    ||  0||  0||  0|| #000|| bgcolor=&amp;quot;#000000&amp;quot; | || Black         || Schwarz         || Noir            || Negro&lt;br /&gt;
|-&lt;br /&gt;
| 21 (55h) || 2    ||  0||  0||100|| #00F|| bgcolor=&amp;quot;#0000ff&amp;quot; | || Bright Blue   || Hellblau        || Bleu vif        || Azul brillante&lt;br /&gt;
|-&lt;br /&gt;
| 22 (56h) || 9    ||  0|| 50||  0|| #060|| bgcolor=&amp;quot;#008000&amp;quot; | || Green         || Grün            || Vert            || Verde&lt;br /&gt;
|-&lt;br /&gt;
| 23 (57h) || 11   ||  0|| 50||100|| #06F|| bgcolor=&amp;quot;#0080ff&amp;quot; | || Sky Blue      || Himmelblau      || Bleu ciel       || Azul cielo&lt;br /&gt;
|-&lt;br /&gt;
| 24 (58h) || 4    || 50||  0|| 50|| #606|| bgcolor=&amp;quot;#800080&amp;quot; | || Magenta       || Magenta         || Magenta         || Magenta&lt;br /&gt;
|-&lt;br /&gt;
| 25 (59h) || 22   || 50||100|| 50|| #6F6|| bgcolor=&amp;quot;#80ff80&amp;quot; | || Pastel Green  || Pastellgrün     || Vert pastel     || Verde pastel&lt;br /&gt;
|-&lt;br /&gt;
| 26 (5Ah) || 21   || 50||100||  0|| #6F0|| bgcolor=&amp;quot;#80ff00&amp;quot; | || Lime          || Limonengrün     || Vert citron     || Verde lima&lt;br /&gt;
|-&lt;br /&gt;
| 27 (5Bh) || 23   || 50||100||100|| #6FF|| bgcolor=&amp;quot;#80ffff&amp;quot; | || Pastel Cyan   || Pastell-blaugrün|| Turquoise pastel|| Ciano pastel&lt;br /&gt;
|-&lt;br /&gt;
| 28 (5Ch) || 3    || 50||  0||  0|| #600|| bgcolor=&amp;quot;#800000&amp;quot; | || Red           || Rot             || Rouge           || Rojo&lt;br /&gt;
|-&lt;br /&gt;
| 29 (5Dh) || 5    || 50||  0||100|| #60F|| bgcolor=&amp;quot;#8000ff&amp;quot; | || Mauve         || Hellviolett     || Mauve           || Malva&lt;br /&gt;
|-&lt;br /&gt;
| 30 (5Eh) || 12   || 50|| 50||  0|| #660|| bgcolor=&amp;quot;#808000&amp;quot; | || Yellow        || Gelb            || Jaune           || Amarillo&lt;br /&gt;
|-&lt;br /&gt;
| 31 (5Fh) || 14   || 50|| 50||100|| #66F|| bgcolor=&amp;quot;#8080ff&amp;quot; | || Pastel Blue   || Pastellblau     || Bleu pastel     || Azul pastel&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Intensities ===&lt;br /&gt;
&lt;br /&gt;
The 0%, 50%, and 100% values in the above tables are &amp;quot;should-be&amp;quot; values. However, the real hardware doesn't exactly match that intensities. The actual intensities depend on the luminance mixing (R,G,B tied together via resistors), on chipset (classic CPC, or newer ASIC ones), and on the load applied by external hardware (Monitor, or TV set).&lt;br /&gt;
&lt;br /&gt;
On an actual Amstrad CPC, the half-intensity colour signal is measured to be closer to 40% rather than the expected 50%. This was verified by [[Grim]] and independently confirmed by [[Nocash]]. [https://www.grimware.org/doku.php/documentations/devices/gatearray#inkr Source]&lt;br /&gt;
* [[CPC Palette]] - some more details&lt;br /&gt;
&lt;br /&gt;
This explains why the Amstrad engineers used the following values to adapt the old colour palette to the new 12-bit palette on the Amstrad Plus:&lt;br /&gt;
* 0% became #0&lt;br /&gt;
* 50% became #6. They specifically chose #6 for the 50% value instead of the expected #7 or #8, to better match the real Amstrad CPC palette.&lt;br /&gt;
* 100% became #F&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Green Screen Colours ===&lt;br /&gt;
&lt;br /&gt;
On a green screen, where all colours are shades of unsaturated green, the firmware colours are in order of increasing intensity. Black is darkest green, bright white is brightest green, and firmware colour 13 is a medium green.&lt;br /&gt;
&lt;br /&gt;
The luminance (Y) is not exactly correlated to the actual luminance of colour images broadcast in RGB. Amstrad preferred to propose a completely different image system, not comparable to a conversion to monochrome, which would have limited the number of brightness levels to 21 (for example, colours 9 and 6 would have had the same luminance).&lt;br /&gt;
&lt;br /&gt;
They opted for a table of 27 linear brightness steps. They assigned values of 1 (1kΩ) for blue, 3 (3.3kΩ) for red, and 9 (10kΩ) for green.&lt;br /&gt;
&lt;br /&gt;
==== To calculate the luminance value ====&lt;br /&gt;
&lt;br /&gt;
'''Red''' &lt;br /&gt;
&lt;br /&gt;
*0% =&amp;amp;gt; do not add anything &lt;br /&gt;
*50% =&amp;amp;gt; add 3 &lt;br /&gt;
*100% =&amp;amp;gt; add 6 &lt;br /&gt;
&lt;br /&gt;
'''Green''' &lt;br /&gt;
&lt;br /&gt;
*0% =&amp;amp;gt; do not add anything &lt;br /&gt;
*50% =&amp;amp;gt; add 9 &lt;br /&gt;
*100% =&amp;amp;gt; add 18 &lt;br /&gt;
&lt;br /&gt;
'''Blue''' &lt;br /&gt;
&lt;br /&gt;
*0% =&amp;amp;gt; do not add anything &lt;br /&gt;
*50% =&amp;amp;gt; add 1 &lt;br /&gt;
*100% =&amp;amp;gt; add 2 &lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Pictures ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;gallery&amp;gt;&lt;br /&gt;
Image:40010_am2_metal.jpg|40010 GA Metal Layer&lt;br /&gt;
Image:40010_am2_acid.jpg|40010 GA with Metal Layer removed&lt;br /&gt;
Image:40226_am4_metal.jpg|40226 PreASIC Metal Layer&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[File:Ga.pinout.40007.png]] [[File:Ga.pinout.40008.40010.png]]&lt;br /&gt;
&lt;br /&gt;
Note: Some CPC motherboards can accommodate both types of Gate Array pinouts. [https://thecheshirec.at/2024/10/06/il-existe-une-carte-multi-gate-array-et-cest-amstrad-qui-la-faite/ Source]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== External links ==&lt;br /&gt;
*[https://bread80.com/2021/06/03/understanding-the-amstrad-cpc-video-ram-and-gate-array-subsystem/ Electronic signals analysis of the Gate Array by Bread80]&lt;br /&gt;
* [https://shaker.logonsystem.eu/ACCC1.8-EN.pdf Gate Array documentation in Amstrad CRTC Compendium]&lt;br /&gt;
* [https://www.grimware.org/doku.php/documentations/devices/gatearray Gate Array documentation from Grimware]&lt;br /&gt;
* [http://quasar.cpcscene.net/doku.php?id=assem:gate_array Quasar Gate Array documentation (in french)]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==See also==&lt;br /&gt;
&lt;br /&gt;
*[[Gate Array and ASIC Pin-Outs]]&lt;br /&gt;
*[[PAL16L8]] : for RAM arrangement&lt;br /&gt;
*[[ASIC]] : for Plus users&lt;br /&gt;
&lt;br /&gt;
*[[CRTC]] : the other video stuff&lt;br /&gt;
*[[Synchronising with the CRTC and display]] : technical details on the relationship between Gate Array and CRTC.&lt;br /&gt;
&lt;br /&gt;
*[[Video modes]] : for other informations on colours and pixels.&lt;br /&gt;
&lt;br /&gt;
*[[Media:40010-simplified V03.pdf]] [https://www.cpcwiki.eu/forum/amstrad-cpc-hardware/gate-array-decapped!/msg170713/#msg170713 Forum thread] Gate Array schematics - reverse engineered by Gerald&lt;br /&gt;
&lt;br /&gt;
[[Category:Hardware]][[Category:Programming]][[Category:Datasheet]][[Category:Graphic]][[Category:CPC Internal Components]][[Category:Electronic Component]]&lt;/div&gt;</summary>
		<author><name>Longshot</name></author>	</entry>

	<entry>
		<id>https://oldwiki.cpcwiki.eu/index.php?title=Longshot&amp;diff=126278</id>
		<title>Longshot</title>
		<link rel="alternate" type="text/html" href="https://oldwiki.cpcwiki.eu/index.php?title=Longshot&amp;diff=126278"/>
				<updated>2025-05-24T12:13:55Z</updated>
		
		<summary type="html">&lt;p&gt;Longshot: flowstate, gege, jb, phi2x et j'en passe de bruz tu vas avoir des problèmes si tu continues à troller ici&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Image:Longshot1996.jpg|thumb|Longshot 1996]]&lt;br /&gt;
&lt;br /&gt;
'''Longshot''' was a demo coder, founder and leader of the famous [[Logon System]] demo group. A pseudonym for Serge Querné, he was initially based in southern France but later moved to Paris.&lt;br /&gt;
&lt;br /&gt;
== Biography ==&lt;br /&gt;
&lt;br /&gt;
Initially going under the pseudonym 'Logon 1' (the name Logon he explained in a scrolltext as &amp;quot;a Belgian idea&amp;quot;), he released a series of single-part demos, each of them showcasing a new technique he had learned ‒ or, in many cases, discovered. These included raster bars, overscan, and split modes in the earliest productions. The first demo was coded while he was working at [http://fr.wikipedia.org/wiki/Ubisoft Ubi Soft]'s &amp;quot;castle&amp;quot; headquarters. Though some of these demos seem fairly simple in retrospect, at the time, Serge's demo-coding skill was only equalled by perhaps [[Fefesse]] and [[NWC]].&lt;br /&gt;
&lt;br /&gt;
A stepchange came with the [[Longshot Demo]], the first in which he adopted his new pseudonym. This included hardware splitting and combined more effects on screen at once. [[Revolog]] (or Revolution) followed in a similar vein but was a level more accomplished again. At the same time, Longshot participated in the [[Amazing Demo]] with [[Naminu]] and [[P007]] of [[Malibu Crackers]].&lt;br /&gt;
&lt;br /&gt;
[[Naminu]] would soon become one of the members of the new, expanded [[Logon System]]. The &amp;quot;supergroup&amp;quot;'s first release was the stunning [[The Demo]], where Longshot contributed three parts but, perhaps more significantly, oversaw the polished, coherent design that was unlike any CPC megademo previously released.&lt;br /&gt;
&lt;br /&gt;
The [[Euromeeting Demo]] would turn out to be his last demo release, but a further innovation was the [[B-ASIC]] utility which enabled Plus programmers to use the new features of their machines from BASIC. Longshot went on to the PC in turn, but has recently participated in French CPC forums such as [http://phenixinformatique.free.fr/ Phenix Informatique] once again. His [http://www.logonsystem.fr/ homepage] contains screenshots from the Logon era, a brief history, and downloads of his personal disc collection.&lt;br /&gt;
&lt;br /&gt;
Though most respected for his coding skills and innovations, Serge's main achievement was perhaps the creation and fostering of the Logon System supergroup, the like of which has not been seen since.&lt;br /&gt;
&lt;br /&gt;
Longshot has written technical articles in some columns of the French magazine [[Amstrad Cent Pour Cent]].&lt;br /&gt;
&lt;br /&gt;
== Demos ==&lt;br /&gt;
&lt;br /&gt;
* [[Logon Demo 1]]&lt;br /&gt;
* [[Logon Demo 2]]&lt;br /&gt;
* [[Logon Demo 3]]&lt;br /&gt;
* [[Logon Demo 5]]&lt;br /&gt;
* [[Longshot Demo]]&lt;br /&gt;
* [[Revolog]]&lt;br /&gt;
* [[Amazing Demo]]&lt;br /&gt;
* [[The Demo]]&lt;br /&gt;
* [[Euromeeting Demo]]&lt;br /&gt;
* [[DSC 4]]&lt;br /&gt;
&lt;br /&gt;
== Other productions ==&lt;br /&gt;
&lt;br /&gt;
* [[Atlantis]] &lt;br /&gt;
* [[B-ASIC]]&lt;br /&gt;
* [[AntiMultiface]]&lt;br /&gt;
* [[MagicDOS]]&lt;br /&gt;
&lt;br /&gt;
== Groups ==&lt;br /&gt;
&lt;br /&gt;
* [[Logon System]]&lt;br /&gt;
&lt;br /&gt;
== Links ==&lt;br /&gt;
&lt;br /&gt;
* [http://www.logonsystem.eu/ Longshot's homepage]&lt;br /&gt;
* [http://norecess.cpcscene.net/interview-longshot.html Interview with Longshot by NoRecess]&lt;br /&gt;
&lt;br /&gt;
[[Category:CPC scene members]]&lt;/div&gt;</summary>
		<author><name>Longshot</name></author>	</entry>

	<entry>
		<id>https://oldwiki.cpcwiki.eu/index.php?title=Longshot&amp;diff=126274</id>
		<title>Longshot</title>
		<link rel="alternate" type="text/html" href="https://oldwiki.cpcwiki.eu/index.php?title=Longshot&amp;diff=126274"/>
				<updated>2025-05-24T08:40:02Z</updated>
		
		<summary type="html">&lt;p&gt;Longshot: deleted as a malicious troll&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Image:Longshot1996.jpg|thumb|Longshot 1996]]&lt;br /&gt;
&lt;br /&gt;
'''Longshot''' was a demo coder, founder and leader of the famous [[Logon System]] demo group. A pseudonym for Serge Querné, he was initially based in southern France but later moved to Paris.&lt;br /&gt;
&lt;br /&gt;
== Biography ==&lt;br /&gt;
&lt;br /&gt;
Initially going under the pseudonym 'Logon 1' (the name Logon he explained in a scrolltext as &amp;quot;a Belgian idea&amp;quot;), he released a series of single-part demos, each of them showcasing a new technique he had learned ‒ or, in many cases, discovered. These included raster bars, overscan, and split modes in the earliest productions. The first demo was coded while he was working at [http://fr.wikipedia.org/wiki/Ubisoft Ubi Soft]'s &amp;quot;castle&amp;quot; headquarters. Though some of these demos seem fairly simple in retrospect, at the time, Serge's demo-coding skill was only equalled by perhaps [[Fefesse]] and [[NWC]].&lt;br /&gt;
&lt;br /&gt;
A stepchange came with the [[Longshot Demo]], the first in which he adopted his new pseudonym. This included hardware splitting and combined more effects on screen at once. [[Revolog]] (or Revolution) followed in a similar vein but was a level more accomplished again. At the same time, Longshot participated in the [[Amazing Demo]] with [[Naminu]] and [[P007]] of [[Malibu Crackers]].&lt;br /&gt;
&lt;br /&gt;
[[Naminu]] would soon become one of the members of the new, expanded [[Logon System]]. The &amp;quot;supergroup&amp;quot;'s first release was the stunning [[The Demo]], where Longshot contributed three parts but, perhaps more significantly, oversaw the polished, coherent design that was unlike any CPC megademo previously released.&lt;br /&gt;
&lt;br /&gt;
The [[Euromeeting Demo]] would turn out to be his last demo release, but a further innovation was the [[B-ASIC]] utility which enabled Plus programmers to use the new features of their machines from BASIC. Longshot went on to the PC in turn, but has recently participated in French CPC forums such as [http://phenixinformatique.free.fr/ Phenix Informatique] once again. His [http://www.logonsystem.fr/ homepage] contains screenshots from the Logon era, a brief history, and downloads of his personal disc collection.&lt;br /&gt;
&lt;br /&gt;
Though most respected for his coding skills and innovations, Serge's main achievement was perhaps the creation and fostering of the Logon System supergroup, the like of which has not been seen since.&lt;br /&gt;
&lt;br /&gt;
Longshot has written technical articles in some columns of the French magazine [[Amstrad Cent Pour Cent]].&lt;br /&gt;
&lt;br /&gt;
== Demos ==&lt;br /&gt;
&lt;br /&gt;
* [[Logon Demo 1]]&lt;br /&gt;
* [[Logon Demo 2]]&lt;br /&gt;
* [[Logon Demo 3]]&lt;br /&gt;
* [[Logon Demo 5]]&lt;br /&gt;
* [[Longshot Demo]]&lt;br /&gt;
* [[Revolog]]&lt;br /&gt;
* [[Amazing Demo]]&lt;br /&gt;
* [[The Demo]]&lt;br /&gt;
* [[Euromeeting Demo]]&lt;br /&gt;
* [[DSC 4]]&lt;br /&gt;
&lt;br /&gt;
== Other productions ==&lt;br /&gt;
&lt;br /&gt;
* [[Atlantis]] &lt;br /&gt;
* [[B-ASIC]]&lt;br /&gt;
* [[AntiMultiface]]&lt;br /&gt;
* [[MagicDOS]]&lt;br /&gt;
&lt;br /&gt;
== Groups ==&lt;br /&gt;
&lt;br /&gt;
* [[Logon System]]&lt;br /&gt;
&lt;br /&gt;
== Links ==&lt;br /&gt;
&lt;br /&gt;
* [http://www.logonsystem.eu/ Longshot's homepage]&lt;br /&gt;
* [http://norecess.cpcscene.net/interview-longshot.html Interview with Longshot by NoRecess]&lt;br /&gt;
&lt;br /&gt;
[[Category:CPC scene members]]&lt;/div&gt;</summary>
		<author><name>Longshot</name></author>	</entry>

	<entry>
		<id>https://oldwiki.cpcwiki.eu/index.php?title=Gate_Array&amp;diff=126273</id>
		<title>Gate Array</title>
		<link rel="alternate" type="text/html" href="https://oldwiki.cpcwiki.eu/index.php?title=Gate_Array&amp;diff=126273"/>
				<updated>2025-05-24T08:37:02Z</updated>
		
		<summary type="html">&lt;p&gt;Longshot: Deleted for infringement of copyrighted material protected under the CC BY-NC-ND 4.0 license&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[File:Amstrad 40007 Gate Array.png|right|thumb|Amstrad 40007 Gate Array]]&lt;br /&gt;
[[File:Amstrad 40010 Gate Array.png|right|thumb|Amstrad 40010 Gate Array]]&lt;br /&gt;
&lt;br /&gt;
Also designated as Video Gate Array (VGA, not to be confused with the IBM PC compatible graphic card spec).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Introduction  ==&lt;br /&gt;
&lt;br /&gt;
The Gate Array is a specially designed chip exclusively for use in the Amstrad CPC and was designed by Amstrad plc. &lt;br /&gt;
&lt;br /&gt;
In the CPC+ system, the functions of the Gate Array are integrated into a single [[ASIC|ASIC]]. When the ASIC is &amp;quot;locked&amp;quot;, the extra features are not available and the ASIC operates the same as the Gate Array in the CPC allowing programs written for the CPC to work on the Plus without modification. The ASIC must be &amp;quot;un-locked&amp;quot; to access the new features. &lt;br /&gt;
&lt;br /&gt;
In the [[KC Compact]] system, the functions of the Gate Array are &amp;quot;emulated&amp;quot; in TTL chips, [[CIO Overview|CIO]], and its color translation EPROM.&lt;br /&gt;
&lt;br /&gt;
In the &amp;quot;cost-down&amp;quot; version of the CPC6128, the functions of the Gate Array are integrated into an ASIC.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== What does it do? ==&lt;br /&gt;
&lt;br /&gt;
The Gate Array is responsible for the display (colour palette, resolution, horizontal and vertical sync), bus arbitration, DRAM refresh, interrupt generation and memory arrangement. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Bus arbitration ==&lt;br /&gt;
&lt;br /&gt;
The Gate Array arbitrates access to the RAM between the CPU and the video hardware (CRTC and Gate-Array).&lt;br /&gt;
&lt;br /&gt;
Every microsecond: &lt;br /&gt;
* The CRTC generates a memory address using it's MA and RA signal outputs. See the [[CRTC]] wiki page to know how the motherboard wiring transforms these signals into the Video Memory Address (VMA).&lt;br /&gt;
* The Gate Array fetches 2 bytes for each address. /CPU_ADDR is a 1MHz signal. So these 2 bytes are fetched sequentially. They are not interleaved with Z80 access. These bytes are fetched even when the border is on as this is required for DRAM refresh.&lt;br /&gt;
* The video hardware is given priority so that the display is not disrupted.&lt;br /&gt;
&lt;br /&gt;
The Gate-Array generates the &amp;quot;READY&amp;quot; signal which is connected to the &amp;quot;/WAIT&amp;quot; input signal of the CPU. This signal is used to stop the CPU accessing RAM while the video-hardware is accessing it.&lt;br /&gt;
&lt;br /&gt;
In fact, the Gate Array allows the Z80 to access the RAM in only 1 out of every 4 cycles. As a result, all instruction timings are stretched so that they are all multiples of a microsecond (1µs), and this gives an effective CPU clock of 3.3Mhz.&lt;br /&gt;
&lt;br /&gt;
Unlike the ZX Spectrum or the Amiga, where bus arbitration is restricted to the &amp;quot;contended memory&amp;quot; or &amp;quot;chip RAM&amp;quot;, on the CPC it also applies to ROM access and to RAM expansions. So the Z80 always runs at the same speed, regardless of the type of memory being accessed.&lt;br /&gt;
&lt;br /&gt;
Last but not least, bus arbitration also applies to I/O access. And memory access is not aligned with I/O access on Z80.&lt;br /&gt;
&lt;br /&gt;
Note: On Amstrad Plus, the ASIC also has to handle DMA instruction fetch from RAM.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== DRAM refresh ==&lt;br /&gt;
&lt;br /&gt;
On Amstrad CPC, the Gate Array is responsible for the DRAM refresh, instead of using the Z80 built-in DRAM refresh mechanism. The reason is that there can only be 3 DRAM accesses per microsecond on this architecture. Doing DRAM refresh on each M1 cycle as it is done on MSX would bog down the CPU speed on CPC given its bus arbitration scheme.&lt;br /&gt;
&lt;br /&gt;
The Z80 generates a maximum of one request per microsecond. The CPC also requires two memory accesses per microsecond for reading video data.&lt;br /&gt;
&lt;br /&gt;
The CPC specs 4164-20 DRAMs. These require 330nS for a read or write cycle. The CPC also uses the optimised sequential CAS cycles to read the two video data bytes in half a microsecond. [https://www.cpcwiki.eu/forum/amstrad-cpc-hardware/the-cpc-revision-zero-article/msg243769/ Source]&lt;br /&gt;
&lt;br /&gt;
The way to cause the RAM refresh to fail in both a Plus or normal CPC is simply to stop a few bits of the CRTC address changing (ie. never refresh the selected area).&lt;br /&gt;
&lt;br /&gt;
Generally, only the Row address needs to be cycled, so stopping MA0 through MA7 from changing, and stopping the CPU from reading those rows, will cause data to be lost, quite quickly (generally around 4ms). [https://www.cpcwiki.eu/forum/amstrad-cpc-hardware/memory-refresh-plus/ Source]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Controlling the Gate Array  ==&lt;br /&gt;
&lt;br /&gt;
The gate array is controlled by I/O. The gate array is selected when bit 15 of the I/O port address is set to &amp;quot;0&amp;quot; and bit 14 of the I/O port address is set to &amp;quot;1&amp;quot;. The values of the other bits are ignored. However, to avoid conflict with other devices in the system, these bits should be set to &amp;quot;1&amp;quot;. &lt;br /&gt;
&lt;br /&gt;
The recommended I/O port address is &amp;amp;7Fxx. &lt;br /&gt;
&lt;br /&gt;
The Gate Array is not connected to the CPU's RD and WR pins, so it cannot detect the bus's I/O direction. If you execute an I/O read operation on the Gate Array I/O address, the Gate Array will read an unpredictable value from the databus which will be in high-impedance state. If the value is a valid Gate Array command, it will be executed, otherwise nothing will happen. [https://www.grimware.org/doku.php/documentations/devices/gatearraydo=export_xhtml Source]&lt;br /&gt;
&lt;br /&gt;
The function to be performed is selected by writing data to the Gate Array, the first bits of the data define the function selected (see table below). It is not possible to read from the Gate Array. &lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!colspan=4| 8bit command&lt;br /&gt;
!rowspan=2| Machine&lt;br /&gt;
!rowspan=2| Register&lt;br /&gt;
!rowspan=2| Description&lt;br /&gt;
!rowspan=2| Chip&lt;br /&gt;
|-&lt;br /&gt;
! 7&lt;br /&gt;
! 6&lt;br /&gt;
! 5&lt;br /&gt;
! 4..0&lt;br /&gt;
|-&lt;br /&gt;
| 0 || 0 || x || style=&amp;quot;text-align: center;&amp;quot; | n || All || PENR || Select a color register || Gate Array&lt;br /&gt;
|-&lt;br /&gt;
| 0 || 1 || x || style=&amp;quot;text-align: center;&amp;quot; | n || All || INKR || Change the value of the currently selected color register || Gate Array&lt;br /&gt;
|-&lt;br /&gt;
| 1 || 0 || 0 || style=&amp;quot;text-align: center;&amp;quot; | n || All || RMR || Control Interrupt counter, ROM mapping and Graphics mode || Gate Array&lt;br /&gt;
|-&lt;br /&gt;
| rowspan=&amp;quot;2&amp;quot;|1 || rowspan=&amp;quot;2&amp;quot;|0 || rowspan=&amp;quot;2&amp;quot;|1 || style=&amp;quot;text-align: center;&amp;quot; rowspan=&amp;quot;2&amp;quot; | n || All || RMR || ''Ghost register'' || Gate Array (CPC) or locked ASIC (Plus)&lt;br /&gt;
|-&lt;br /&gt;
| Plus || RMR2 || ASIC &amp;amp; Advanced ROM mapping || Unlocked ASIC&lt;br /&gt;
|-&lt;br /&gt;
| 1 || 1 ||colspan=2  style=&amp;quot;text-align: center;&amp;quot; | n || All || MMR || RAM memory mapping || PAL (only with 128KB or RAM expansion)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
The MMR register is not available in the Gate Array, but is performed by a device at the same I/O port address location.&lt;br /&gt;
&lt;br /&gt;
In the CPC464, CPC664 and KC compact, MMR is performed in an external memory expansion (e.g. Dk'Tronics 64K RAM Expansion), if this expansion is not present then MMR is not available.&lt;br /&gt;
&lt;br /&gt;
In the CPC6128, MMR is performed by a [[PAL16L8|PAL chip]] located on the main PCB, or an external memory expansion.&lt;br /&gt;
&lt;br /&gt;
In the 464+ and 6128+, MMR is performed by the ASIC or an external memory expansion. Please read the document on RAM management for more information.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Registers ==&lt;br /&gt;
&lt;br /&gt;
Note: The Plus palette capabilities are only accessible through the [[Default I/O Port Summary|ASIC I/O page]]. Registers PENR and INKR are not needed in that case.&lt;br /&gt;
&lt;br /&gt;
=== Register PENR (Select a color register) ===&lt;br /&gt;
&lt;br /&gt;
When bit 7 and bit 6 are set to &amp;quot;0&amp;quot;, the remaining bits determine which pen is to have its colour changed. When bit 4 is set to &amp;quot;0&amp;quot;, bits 3 to 0 define which pen is to be selected. When bit 4 is set to &amp;quot;1&amp;quot;, the value contained in bits 3-0 is ignored and the border is selected. &lt;br /&gt;
&lt;br /&gt;
The pen remains selected until another is chosen. &lt;br /&gt;
&lt;br /&gt;
Each mode has a fixed number of pens. Mode 0 has 16 pens, mode 1 has 4 pens and mode 2 has 2 pens. &lt;br /&gt;
&lt;br /&gt;
==== Summary  ====&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!Bit&lt;br /&gt;
!Value&lt;br /&gt;
!Function&lt;br /&gt;
|-&lt;br /&gt;
| 7 || 0 || rowspan=&amp;quot;2&amp;quot; | Gate Array PENR register&lt;br /&gt;
|-&lt;br /&gt;
| 6 || 0 &lt;br /&gt;
|-&lt;br /&gt;
| 5 || - || not used&lt;br /&gt;
|-&lt;br /&gt;
| 4 || 1 || Select border&lt;br /&gt;
|-&lt;br /&gt;
| 3 || x || rowspan=&amp;quot;4&amp;quot; | Ignored&lt;br /&gt;
|-&lt;br /&gt;
| 2 || x&lt;br /&gt;
|-&lt;br /&gt;
| 1 || x&lt;br /&gt;
|-&lt;br /&gt;
| 0 || x&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!Bit&lt;br /&gt;
!Value&lt;br /&gt;
!Function&lt;br /&gt;
|-&lt;br /&gt;
| 7 || 0 || rowspan=&amp;quot;2&amp;quot; | Gate Array PENR register&lt;br /&gt;
|-&lt;br /&gt;
| 6 || 0&lt;br /&gt;
|-&lt;br /&gt;
| 5 || - || not used&lt;br /&gt;
|-&lt;br /&gt;
| 4 || 0 || Select pen&lt;br /&gt;
|-&lt;br /&gt;
| 3 || x || rowspan=&amp;quot;4&amp;quot; | Pen number&lt;br /&gt;
|-&lt;br /&gt;
| 2 || x&lt;br /&gt;
|-&lt;br /&gt;
| 1 || x&lt;br /&gt;
|-&lt;br /&gt;
| 0 || x&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Register INKR (Change the value of the currently selected color register) ===&lt;br /&gt;
&lt;br /&gt;
Once the pen has been selected its colour can then be changed. Bits 4 to 0 specify the hardware colour number from the hardware colour palette. &lt;br /&gt;
&lt;br /&gt;
Even though there is provision for 32 colours, only 27 are possible. The remaining colours are duplicates of those already in the colour palette. &lt;br /&gt;
&lt;br /&gt;
==== Summary  ====&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!Bit&lt;br /&gt;
!Value&lt;br /&gt;
!Function&lt;br /&gt;
|-&lt;br /&gt;
| 7 || 0 || rowspan=&amp;quot;2&amp;quot; | Gate Array INKR register&lt;br /&gt;
|-&lt;br /&gt;
| 6 || 1&lt;br /&gt;
|-&lt;br /&gt;
| 5 || - || not used&lt;br /&gt;
|-&lt;br /&gt;
| 4 || x || rowspan=&amp;quot;5&amp;quot; | Colour number x&lt;br /&gt;
|-&lt;br /&gt;
| 3 || x &lt;br /&gt;
|-&lt;br /&gt;
| 2 || x &lt;br /&gt;
|-&lt;br /&gt;
| 1 || x&lt;br /&gt;
|-&lt;br /&gt;
| 0 || x&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Register RMR (Control Interrupt counter, ROM mapping and Graphics mode) ===&lt;br /&gt;
&lt;br /&gt;
This is a general purpose register responsible for the [[Video modes|graphics mode]] and the ROM configuration. &lt;br /&gt;
&lt;br /&gt;
==== Graphics mode selection  ====&lt;br /&gt;
&lt;br /&gt;
The function of bits 1 and 0 is to define the screen mode. The settings for bits 1 and 0 and the corresponding screen mode are given in the table below. &lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!Bit 1&lt;br /&gt;
!Bit 0&lt;br /&gt;
!Screen mode&lt;br /&gt;
|-&lt;br /&gt;
| 0 || 0 || Mode 0, 160x200 resolution, 16 colours&lt;br /&gt;
|-&lt;br /&gt;
| 0 || 1 || Mode 1, 320x200 resolution, 4 colours&lt;br /&gt;
|-&lt;br /&gt;
| 1 || 0 || Mode 2, 640x200 resolution, 2 colours&lt;br /&gt;
|-&lt;br /&gt;
| 1 || 1 || Mode 3, 160x200 resolution, 4 colours (undocumented)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
* Mode 3 is not official. From the combinations possible, we can see that 4 modes can be defined, although the Amstrad only has 3. Mode 3 is similar to mode 0, because it has the same resolution, but it is limited to only 4 colours. Mode 3 is not supported by the [[KC Compact]] (which outputs black in Mode 3).&lt;br /&gt;
&lt;br /&gt;
Mode changing is synchronised with HSYNC. If the mode is changed, it will take effect from the next HSYNC.&lt;br /&gt;
&lt;br /&gt;
==== ROM configuration selection  ====&lt;br /&gt;
&lt;br /&gt;
Bit 2 is used to enable or disable the lower ROM area. The lower ROM area occupies memory addresses &amp;amp;amp;0000-&amp;amp;amp;3fff and is used to access the operating system ROM. When the lower ROM area is is enabled, reading from &amp;amp;amp;0000-&amp;amp;amp;3FFF will return data in the ROM. When a value is written to &amp;amp;amp;0000-&amp;amp;amp;3FFF, it will be written to the RAM underneath the ROM. When it is disabled, data read from &amp;amp;amp;0000-&amp;amp;amp;3FFF will return the data in the RAM. &lt;br /&gt;
&lt;br /&gt;
Similarly, bit 3 controls enabling or disabling of the upper ROM area. The upper ROM area occupies memory addressess &amp;amp;amp;C000-&amp;amp;amp;FFFF and is BASIC or any expansion ROMs which may be plugged into a ROM board/box. See the document on [[Upper ROM Bank Number|upper rom selection]] for more details. When the upper ROM area enabled, reading from &amp;amp;amp;c000-&amp;amp;amp;ffff, will return data in the ROM. When data is written to &amp;amp;amp;c000-&amp;amp;amp;FFFF, it will be written to the RAM at the same address as the ROM. When the upper ROM area is disabled, and data is read from &amp;amp;amp;c000-&amp;amp;amp;ffff it will be the data in the RAM. &lt;br /&gt;
&lt;br /&gt;
Bit 4 controls the interrupt generation. It can be used to delay interrupts. See the document on interrupt generation for more information.&lt;br /&gt;
&lt;br /&gt;
==== Summary  ====&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!Bit&lt;br /&gt;
!Value&lt;br /&gt;
!Function&lt;br /&gt;
|-&lt;br /&gt;
| 7 || 1 || rowspan=&amp;quot;2&amp;quot; | Gate Array RMR register&lt;br /&gt;
|-&lt;br /&gt;
| 6 || 0 &lt;br /&gt;
|-&lt;br /&gt;
| 5 || - || ''must be 0 on Plus machines with ASIC unlocked''&lt;br /&gt;
|-&lt;br /&gt;
| 4 || x || Interrupt generation control&lt;br /&gt;
|-&lt;br /&gt;
| 3 || x || 1=Upper ROM area disable, 0=Upper ROM area enable&lt;br /&gt;
|-&lt;br /&gt;
| 2 || x || 1=Lower ROM area disable, 0=Lower ROM area enable&lt;br /&gt;
|-&lt;br /&gt;
| 1 || x || rowspan=&amp;quot;2&amp;quot; | Graphics Mode selection&lt;br /&gt;
|-&lt;br /&gt;
| 0 || x&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Register RMR2 (ASIC &amp;amp; Advanced ROM mapping) ===&lt;br /&gt;
&lt;br /&gt;
This register exists only in Plus or GX4000, and is only accessible when the ASIC is unlocked.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!Bit&lt;br /&gt;
!Value&lt;br /&gt;
!Function&lt;br /&gt;
|-&lt;br /&gt;
| 7 || 1 || rowspan=&amp;quot;3&amp;quot; | Gate Array RMR2 register&lt;br /&gt;
|-&lt;br /&gt;
| 6 || 0&lt;br /&gt;
|-&lt;br /&gt;
| 5 || 1&lt;br /&gt;
|-&lt;br /&gt;
| 4 || x || rowspan=&amp;quot;2&amp;quot; |RMR addressing mode&lt;br /&gt;
|-&lt;br /&gt;
| 3 || x&lt;br /&gt;
|-&lt;br /&gt;
| 2 || x || rowspan=&amp;quot;3&amp;quot; | Physical ROM number (0..7)&lt;br /&gt;
|-&lt;br /&gt;
| 1 || x&lt;br /&gt;
|-&lt;br /&gt;
| 0 || x&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ RMR addressing modes&lt;br /&gt;
!Bit 4&lt;br /&gt;
!Bit 3&lt;br /&gt;
!Lower ROM&lt;br /&gt;
![[ASIC|ASIC I/O page]]&lt;br /&gt;
|-&lt;br /&gt;
|0&lt;br /&gt;
|0&lt;br /&gt;
|&amp;amp;0000-&amp;amp;3FFF&lt;br /&gt;
|Disabled&lt;br /&gt;
|-&lt;br /&gt;
|0&lt;br /&gt;
|1&lt;br /&gt;
|&amp;amp;4000-&amp;amp;7FFF&lt;br /&gt;
|Disabled&lt;br /&gt;
|-&lt;br /&gt;
|1&lt;br /&gt;
|0&lt;br /&gt;
|&amp;amp;8000-&amp;amp;BFFF&lt;br /&gt;
|Disabled&lt;br /&gt;
|-&lt;br /&gt;
|1&lt;br /&gt;
|1&lt;br /&gt;
|&amp;amp;0000-&amp;amp;3FFF&lt;br /&gt;
|&amp;amp;4000-&amp;amp;7FFF&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
The physical ROMs are also accessible as upper ROMs by using the [[Upper ROM Bank Number]] port and the RMR register.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Register MMR (RAM memory mapping) ===&lt;br /&gt;
&lt;br /&gt;
This register exists only in CPCs with 128K RAM (like the CPC 6128), or CPCs equipped with [[Standard Memory Expansions]].&lt;br /&gt;
&lt;br /&gt;
Note: In the CPC 6128, the register is a separate [[PAL16L8|PAL chip]] that assists the Gate Array chip.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!Bit&lt;br /&gt;
!Value&lt;br /&gt;
!Function&lt;br /&gt;
|-&lt;br /&gt;
| 7 || 1 || rowspan=&amp;quot;2&amp;quot; | Gate Array MMR register&lt;br /&gt;
|-&lt;br /&gt;
| 6 || 1 &lt;br /&gt;
|-&lt;br /&gt;
| 5 || x || rowspan=&amp;quot;3&amp;quot; |64K bank number (0..7); always 0 on an unexpanded CPC6128, 0-7 on [[Standard Memory Expansions]]&lt;br /&gt;
|-&lt;br /&gt;
| 4 || x&lt;br /&gt;
|-&lt;br /&gt;
| 3 || x&lt;br /&gt;
|-&lt;br /&gt;
| 2 || x || rowspan=&amp;quot;3&amp;quot; | RAM Config (0..7)&lt;br /&gt;
|-&lt;br /&gt;
| 1 || x&lt;br /&gt;
|-&lt;br /&gt;
| 0 || x&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
The 3bit RAM Config value is used to access the second 64K of the total 128K RAM that is built into the CPC 6128 or the additional 64K-512K of standard memory expansions. These contain up to eight 64K ram banks, which are selected with bit 3-5. A standard CPC 6128 only contains bank 0. Normally the register is set to 0, so that only the first 64K RAM are used (identical to the CPC 464 and 664 models). The register can be used to select between the following eight predefined configurations only:&lt;br /&gt;
&lt;br /&gt;
  -Address-     0      1      2      3      4      5      6      7&lt;br /&gt;
  0000-3FFF   RAM_0  RAM_0  '''RAM_4'''  RAM_0  RAM_0  RAM_0  RAM_0  RAM_0&lt;br /&gt;
  4000-7FFF   RAM_1  RAM_1  '''RAM_5'''  '''RAM_3'''  '''RAM_4'''  '''RAM_5'''  '''RAM_6'''  '''RAM_7'''&lt;br /&gt;
  8000-BFFF   RAM_2  RAM_2  '''RAM_6'''  RAM_2  RAM_2  RAM_2  RAM_2  RAM_2&lt;br /&gt;
  C000-FFFF   RAM_3  '''RAM_7'''  '''RAM_7'''  '''RAM_7'''  RAM_3  RAM_3  RAM_3  RAM_3&lt;br /&gt;
&lt;br /&gt;
The Video RAM is always located in the first 64K, VRAM is in no way affected by this register.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Programming the Gate Array - Examples  ==&lt;br /&gt;
&lt;br /&gt;
Defining the colours, &amp;lt;br&amp;gt;Setting pen 0 to Bright White. &lt;br /&gt;
&amp;lt;pre&amp;gt;LD BC,7F00&amp;amp;nbsp;;Gate Array port&lt;br /&gt;
LD A,%00000000+0&amp;amp;nbsp;;Pen number (and Gate Array function)&lt;br /&gt;
OUT (C),A&amp;amp;nbsp;;Send pen number&lt;br /&gt;
LD A,%01000000+11&amp;amp;nbsp;;Pen colour (and Gate Array function)&lt;br /&gt;
OUT (C),A&amp;amp;nbsp;;Send it&lt;br /&gt;
RET&lt;br /&gt;
&lt;br /&gt;
Setting the mode and ROM configuration, &lt;br /&gt;
Mode 2, upper and lower ROM disabled.&lt;br /&gt;
&lt;br /&gt;
LD BC,7F00&amp;amp;nbsp;;Gate array port&lt;br /&gt;
LD A,%10000000+%00001110&amp;amp;nbsp;;Mode and ROM selection (and Gate Array function)&lt;br /&gt;
OUT (C),A&amp;amp;nbsp;;Send it&lt;br /&gt;
RET&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Misc ===&lt;br /&gt;
&lt;br /&gt;
The hardware colour number is different to the colour range used by the firmware, so a conversion chart is provided for the corresponding firmware/hardware colour values and the corresponding colour name. &lt;br /&gt;
&lt;br /&gt;
=== Note ===&lt;br /&gt;
&lt;br /&gt;
The firmware keeps track of the colours it is using. Every VSYNC (assuming interrupts are enabled) the firmware sets the colours. This enables the user to have flashing colours. If the user selects a new colour using the gate array, the new colour will flash temporarily and then return to its original colour. This is due to the firmware resetting the colour. When using the firmware, use its routines to select the colour, and the colour will remain.&lt;br /&gt;
&lt;br /&gt;
Example: [For whatever reason, this example does NOT refer to the above firmware stuff]&lt;br /&gt;
&amp;lt;pre&amp;gt;ld bc,7f00+1&amp;amp;nbsp;;Gate array function (set pen)&lt;br /&gt;
;and pen number&lt;br /&gt;
out (c),c&lt;br /&gt;
ld bc,7f00&amp;amp;nbsp;;41 &lt;br /&gt;
;Gate array function (set colour)&lt;br /&gt;
;and colour number&lt;br /&gt;
out (c),c&lt;br /&gt;
ret&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Video memory structure ==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!rowspan=2|Graphics Mode&lt;br /&gt;
!colspan=8|VRAM byte&lt;br /&gt;
!colspan=8|Displayed Pixels&lt;br /&gt;
!rowspan=2|Definition&lt;br /&gt;
!rowspan=2|Pixel clock&lt;br /&gt;
!rowspan=2|Default resolution&lt;br /&gt;
|-&lt;br /&gt;
!7&lt;br /&gt;
!6&lt;br /&gt;
!5&lt;br /&gt;
!4&lt;br /&gt;
!3&lt;br /&gt;
!2&lt;br /&gt;
!1&lt;br /&gt;
!0&lt;br /&gt;
!1&lt;br /&gt;
!2&lt;br /&gt;
!3&lt;br /&gt;
!4&lt;br /&gt;
!5&lt;br /&gt;
!6&lt;br /&gt;
!7&lt;br /&gt;
!8&lt;br /&gt;
|-&lt;br /&gt;
|0&lt;br /&gt;
|A0&lt;br /&gt;
|B0&lt;br /&gt;
|A2&lt;br /&gt;
|B2&lt;br /&gt;
|A1&lt;br /&gt;
|B1&lt;br /&gt;
|A3&lt;br /&gt;
|B3&lt;br /&gt;
|colspan=4 style=&amp;quot;text-align: center;&amp;quot;|A&lt;br /&gt;
|colspan=4 style=&amp;quot;text-align: center;&amp;quot;|B&lt;br /&gt;
|2 pixels in 16 colours&lt;br /&gt;
|4 MHz&lt;br /&gt;
|160x200, 20-column text&lt;br /&gt;
|-&lt;br /&gt;
|1&lt;br /&gt;
|A0&lt;br /&gt;
|B0&lt;br /&gt;
|C0&lt;br /&gt;
|D0&lt;br /&gt;
|A1&lt;br /&gt;
|B1&lt;br /&gt;
|C1&lt;br /&gt;
|D1&lt;br /&gt;
|colspan=2 style=&amp;quot;text-align: center;&amp;quot;|A&lt;br /&gt;
|colspan=2 style=&amp;quot;text-align: center;&amp;quot;|B&lt;br /&gt;
|colspan=2 style=&amp;quot;text-align: center;&amp;quot;|C&lt;br /&gt;
|colspan=2 style=&amp;quot;text-align: center;&amp;quot;|D&lt;br /&gt;
|4 pixels in 4 colours&lt;br /&gt;
|8 MHz&lt;br /&gt;
|320x200, 40-column text&lt;br /&gt;
|-&lt;br /&gt;
|2&lt;br /&gt;
|A0&lt;br /&gt;
|B0&lt;br /&gt;
|C0&lt;br /&gt;
|D0&lt;br /&gt;
|E0&lt;br /&gt;
|F0&lt;br /&gt;
|G0&lt;br /&gt;
|H0&lt;br /&gt;
|A&lt;br /&gt;
|B&lt;br /&gt;
|C&lt;br /&gt;
|D&lt;br /&gt;
|E&lt;br /&gt;
|F&lt;br /&gt;
|G&lt;br /&gt;
|H&lt;br /&gt;
|8 pixels in 2 colours&lt;br /&gt;
|16 MHz&lt;br /&gt;
|640x200, 80-column text&lt;br /&gt;
|-&lt;br /&gt;
|3&lt;br /&gt;
|A0&lt;br /&gt;
|B0&lt;br /&gt;
|x&lt;br /&gt;
|x&lt;br /&gt;
|A1&lt;br /&gt;
|B1&lt;br /&gt;
|x&lt;br /&gt;
|x&lt;br /&gt;
|colspan=4 style=&amp;quot;text-align: center;&amp;quot;|A&lt;br /&gt;
|colspan=4 style=&amp;quot;text-align: center;&amp;quot;|B&lt;br /&gt;
|2 pixels in 4 colours&lt;br /&gt;
|4 MHz&lt;br /&gt;
|160x200, 20-column text&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Split rasters ==&lt;br /&gt;
&lt;br /&gt;
On the CPC, split rasters occur halfway (after the 8th mode2 pixel) through the rendering of a CRTC character.&lt;br /&gt;
&lt;br /&gt;
On Amstrad Plus, split rasters occur quarter of the way (after the 4th mode2 pixel) through the rendering of a CRTC character.&lt;br /&gt;
&lt;br /&gt;
To easily make split rasters compatible with both the CPC and the Plus machines, one can use the ASIC soft-scroll control register (SSCR) to finely adjust the horizontal position of the graphics.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Palette R,G,B definitions ==&lt;br /&gt;
&lt;br /&gt;
There are 27 colours which are generated from red, green and blue mixed in different quantities. There are 3 levels of red, 3 levels of green and 3 levels of blue, and these can be thought of as off/no colour, half-on/half-colour, and on/full-colour. &lt;br /&gt;
&lt;br /&gt;
To display a CPC image you will need to use a analogue monitor with a composite sync.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Palette sorted by Firmware Colour Numbers ===&lt;br /&gt;
&lt;br /&gt;
The firmware colour palette is sorted by luminance value.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
|-&lt;br /&gt;
!Firmware Number&lt;br /&gt;
!Hardware Number&lt;br /&gt;
!Colour Name&lt;br /&gt;
!R %&lt;br /&gt;
!G %&lt;br /&gt;
!B %&lt;br /&gt;
!ASIC&lt;br /&gt;
!Colour&lt;br /&gt;
|-&lt;br /&gt;
| 0|| 54h          ||Black          ||  0||  0||  0|| #000||bgcolor=&amp;quot;#000000&amp;quot;|&lt;br /&gt;
|-&lt;br /&gt;
| 1|| 44h (or 50h) ||Blue           ||  0||  0|| 50|| #006||bgcolor=&amp;quot;#000080&amp;quot;|&lt;br /&gt;
|-&lt;br /&gt;
| 2|| 55h          ||Bright Blue    ||  0||  0||100|| #00F||bgcolor=&amp;quot;#0000ff&amp;quot;|&lt;br /&gt;
|-&lt;br /&gt;
| 3|| 5Ch          ||Red            || 50||  0||  0|| #600||bgcolor=&amp;quot;#800000&amp;quot;|&lt;br /&gt;
|-&lt;br /&gt;
| 4|| 58h          ||Magenta        || 50||  0|| 50|| #606||bgcolor=&amp;quot;#800080&amp;quot;|&lt;br /&gt;
|-&lt;br /&gt;
| 5|| 5Dh          ||Mauve          || 50||  0||100|| #60F||bgcolor=&amp;quot;#8000ff&amp;quot;|&lt;br /&gt;
|-&lt;br /&gt;
| 6|| 4Ch          ||Bright Red     ||100||  0||  0|| #F00||bgcolor=&amp;quot;#ff0000&amp;quot;|&lt;br /&gt;
|-&lt;br /&gt;
| 7|| 45h (or 48h) ||Purple         ||100||  0|| 50|| #F06||bgcolor=&amp;quot;#ff0080&amp;quot;|&lt;br /&gt;
|-&lt;br /&gt;
| 8|| 4Dh          ||Bright Magenta ||100||  0||100|| #F0F||bgcolor=&amp;quot;#ff00ff&amp;quot;|&lt;br /&gt;
|-&lt;br /&gt;
| 9|| 56h          ||Green          ||  0|| 50||  0|| #060||bgcolor=&amp;quot;#008000&amp;quot;|&lt;br /&gt;
|-&lt;br /&gt;
|10|| 46h          ||Cyan           ||  0|| 50|| 50|| #066||bgcolor=&amp;quot;#008080&amp;quot;|&lt;br /&gt;
|-&lt;br /&gt;
|11|| 57h          ||Sky Blue       ||  0|| 50||100|| #06F||bgcolor=&amp;quot;#0080ff&amp;quot;|&lt;br /&gt;
|-&lt;br /&gt;
|12|| 5Eh          ||Yellow         || 50|| 50||  0|| #660||bgcolor=&amp;quot;#808000&amp;quot;|&lt;br /&gt;
|-&lt;br /&gt;
|13|| 40h (or 41h) ||White          || 50|| 50|| 50||#666||bgcolor=&amp;quot;#808080&amp;quot;|&lt;br /&gt;
|-&lt;br /&gt;
|14|| 5Fh          ||Pastel Blue    || 50|| 50||100|| #66F||bgcolor=&amp;quot;#8080ff&amp;quot;|&lt;br /&gt;
|-&lt;br /&gt;
|15|| 4Eh          ||Orange         ||100|| 50||  0|| #F60|| bgcolor=&amp;quot;#ff8000&amp;quot;|&lt;br /&gt;
|-&lt;br /&gt;
|16|| 47h          ||Pink           ||100|| 50|| 50|| #F66||bgcolor=&amp;quot;#ff8080&amp;quot;|&lt;br /&gt;
|-&lt;br /&gt;
|17|| 4Fh          ||Pastel Magenta ||100|| 50||100|| #F6F||bgcolor=&amp;quot;#ff80ff&amp;quot;|&lt;br /&gt;
|-&lt;br /&gt;
|18|| 52h          ||Bright Green   ||  0||100||  0|| #0F0||bgcolor=&amp;quot;#00ff00&amp;quot;|&lt;br /&gt;
|-&lt;br /&gt;
|19|| 42h (or 51h) ||Sea Green      ||  0||100|| 50|| #0F6||bgcolor=&amp;quot;#00ff80&amp;quot;|&lt;br /&gt;
|-&lt;br /&gt;
|20|| 53h          ||Bright Cyan    ||  0||100||100|| #0FF||bgcolor=&amp;quot;#00ffff&amp;quot;|&lt;br /&gt;
|-&lt;br /&gt;
|21|| 5Ah          ||Lime           || 50||100||  0|| #6F0||bgcolor=&amp;quot;#80ff00&amp;quot;|&lt;br /&gt;
|-&lt;br /&gt;
|22|| 59h          ||Pastel Green   || 50||100|| 50|| #6F6||bgcolor=&amp;quot;#80ff80&amp;quot;|&lt;br /&gt;
|-&lt;br /&gt;
|23|| 5Bh          ||Pastel Cyan    || 50||100||100|| #6FF||bgcolor=&amp;quot;#80ffff&amp;quot;|&lt;br /&gt;
|-&lt;br /&gt;
|24|| 4Ah          ||Bright Yellow  ||100||100||  0|| #FF0||bgcolor=&amp;quot;#ffff00&amp;quot;|&lt;br /&gt;
|-&lt;br /&gt;
|25|| 43h (or 49h) ||Pastel Yellow  ||100||100|| 50||#FF6||bgcolor=&amp;quot;#ffff80&amp;quot;|&lt;br /&gt;
|-&lt;br /&gt;
|26|| 4Bh          ||Bright White   ||100||100||100|| #FFF||bgcolor=&amp;quot;#ffffff&amp;quot;|&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Note: We can observe that the official Amstrad names of some colours are a bit silly: &amp;quot;red&amp;quot; is in fact brown, &amp;quot;yellow&amp;quot; is in fact khaki and &amp;quot;white&amp;quot; is in fact grey.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Amstrad Colour Names ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;gallery&amp;gt;&lt;br /&gt;
Cpc 6128 master colour chat.jpg|Master colour chart&lt;br /&gt;
Cpc 6128 farbtabelle.jpg|Farbtabelle&lt;br /&gt;
Cpc 6128 palette des couleurs.jpg|Palette des couleurs&lt;br /&gt;
Cpc 6128 tabla de colores.jpg|Tabla de colores&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Palette sorted by Hardware Colour Numbers ===&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!Hardware Number&lt;br /&gt;
!Firmware Number&lt;br /&gt;
!R %&lt;br /&gt;
!G %&lt;br /&gt;
!B %&lt;br /&gt;
!ASIC&lt;br /&gt;
!Colour&lt;br /&gt;
!Colour Name&lt;br /&gt;
!German Name&lt;br /&gt;
!French Name&lt;br /&gt;
!Spanish Name&lt;br /&gt;
|-&lt;br /&gt;
|  0 (40h) || 13   || 50|| 50|| 50|| #666|| bgcolor=&amp;quot;#808080&amp;quot; | || White         || Weiß            || Blanc           || Blanco&lt;br /&gt;
|-&lt;br /&gt;
|  1 (41h) || (13) || 50|| 50|| 50|| #666|| bgcolor=&amp;quot;#808080&amp;quot; | || White         || Weiß            || Blanc           || Blanco&lt;br /&gt;
|-&lt;br /&gt;
|  2 (42h) || 19   ||  0||100|| 50|| #0F6|| bgcolor=&amp;quot;#00ff80&amp;quot; | || Sea Green     || Seegrün         || Vert marin      || Verde marino&lt;br /&gt;
|-&lt;br /&gt;
|  3 (43h) || 25   ||100||100|| 50|| #FF6|| bgcolor=&amp;quot;#ffff80&amp;quot; | || Pastel Yellow || Pastellgelb     || Jaune pastel    || Amarillo pastel&lt;br /&gt;
|-&lt;br /&gt;
|  4 (44h) || 1    ||  0||  0|| 50|| #006|| bgcolor=&amp;quot;#000080&amp;quot; | || Blue          || Blau            || Bleu            || Azul&lt;br /&gt;
|-&lt;br /&gt;
|  5 (45h) || 7    ||100||  0|| 50|| #F06|| bgcolor=&amp;quot;#ff0080&amp;quot; | || Purple        || Purpur          || Pourpre         || Púrpura&lt;br /&gt;
|-&lt;br /&gt;
|  6 (46h) || 10   ||  0|| 50|| 50|| #066|| bgcolor=&amp;quot;#008080&amp;quot; | || Cyan          || Blaugrün        || Turquoise       || Ciano&lt;br /&gt;
|-&lt;br /&gt;
|  7 (47h) || 16   ||100|| 50|| 50|| #F66|| bgcolor=&amp;quot;#ff8080&amp;quot; | || Pink          || Rosa            || Rose            || Rosa&lt;br /&gt;
|-&lt;br /&gt;
|  8 (48h) || (7)  ||100||  0|| 50|| #F06|| bgcolor=&amp;quot;#ff0080&amp;quot; | || Purple        || Purpur          || Pourpre         || Púrpura&lt;br /&gt;
|-&lt;br /&gt;
|  9 (49h) || (25) ||100||100|| 50|| #FF6|| bgcolor=&amp;quot;#ffff80&amp;quot; | || Pastel Yellow || Pastellgelb     || Jaune pastel    || Amarillo pastel&lt;br /&gt;
|-&lt;br /&gt;
| 10 (4Ah) || 24   ||100||100||  0|| #FF0|| bgcolor=&amp;quot;#ffff00&amp;quot; | || Bright Yellow || Hellgelb        || Jaune vif       || Amarillo brillante&lt;br /&gt;
|-&lt;br /&gt;
| 11 (4Bh) || 26   ||100||100||100|| #FFF|| bgcolor=&amp;quot;#ffffff&amp;quot; | || Bright White  || Leuchtendweiß   || Blanc brillant  || Blanco brillante&lt;br /&gt;
|-&lt;br /&gt;
| 12 (4Ch) || 6    ||100||  0||  0|| #F00|| bgcolor=&amp;quot;#ff0000&amp;quot; | || Bright Red    || Hellrot         || Rouge vif       || Rojo brillante&lt;br /&gt;
|-&lt;br /&gt;
| 13 (4Dh) || 8    ||100||  0||100|| #F0F|| bgcolor=&amp;quot;#ff00ff&amp;quot; | || Bright Magenta|| helles Magenta  || Magenta vif     || Magenta brillante&lt;br /&gt;
|-&lt;br /&gt;
| 14 (4Eh) || 15   ||100|| 50||  0|| #F60|| bgcolor=&amp;quot;#ff8000&amp;quot; | || Orange        || Orange          || Orange          || Naranja&lt;br /&gt;
|-&lt;br /&gt;
| 15 (4Fh) || 17   ||100|| 50||100|| #F6F|| bgcolor=&amp;quot;#ff80ff&amp;quot; | || Pastel Magenta|| Pastell-magenta || Magenta pastel  || Magenta pastel&lt;br /&gt;
|-&lt;br /&gt;
| 16 (50h) || (1)  ||  0||  0|| 50|| #006|| bgcolor=&amp;quot;#000080&amp;quot; | || Blue          || Blau            || Bleu            || Azul&lt;br /&gt;
|-&lt;br /&gt;
| 17 (51h) || (19) ||  0||100|| 50|| #0F6|| bgcolor=&amp;quot;#00ff80&amp;quot; | || Sea Green     || Seegrün         || Vert marin      || Verde marino&lt;br /&gt;
|-&lt;br /&gt;
| 18 (52h) || 18   ||  0||100||  0|| #0F0|| bgcolor=&amp;quot;#00ff00&amp;quot; | || Bright Green  || Hellgrün        || Vert vif        || Verde brillante&lt;br /&gt;
|-&lt;br /&gt;
| 19 (53h) || 20   ||  0||100||100|| #0FF|| bgcolor=&amp;quot;#00ffff&amp;quot; | || Bright Cyan   || helles Blaugrün || Turquoise vif   || Ciano brillante&lt;br /&gt;
|-&lt;br /&gt;
| 20 (54h) || 0    ||  0||  0||  0|| #000|| bgcolor=&amp;quot;#000000&amp;quot; | || Black         || Schwarz         || Noir            || Negro&lt;br /&gt;
|-&lt;br /&gt;
| 21 (55h) || 2    ||  0||  0||100|| #00F|| bgcolor=&amp;quot;#0000ff&amp;quot; | || Bright Blue   || Hellblau        || Bleu vif        || Azul brillante&lt;br /&gt;
|-&lt;br /&gt;
| 22 (56h) || 9    ||  0|| 50||  0|| #060|| bgcolor=&amp;quot;#008000&amp;quot; | || Green         || Grün            || Vert            || Verde&lt;br /&gt;
|-&lt;br /&gt;
| 23 (57h) || 11   ||  0|| 50||100|| #06F|| bgcolor=&amp;quot;#0080ff&amp;quot; | || Sky Blue      || Himmelblau      || Bleu ciel       || Azul cielo&lt;br /&gt;
|-&lt;br /&gt;
| 24 (58h) || 4    || 50||  0|| 50|| #606|| bgcolor=&amp;quot;#800080&amp;quot; | || Magenta       || Magenta         || Magenta         || Magenta&lt;br /&gt;
|-&lt;br /&gt;
| 25 (59h) || 22   || 50||100|| 50|| #6F6|| bgcolor=&amp;quot;#80ff80&amp;quot; | || Pastel Green  || Pastellgrün     || Vert pastel     || Verde pastel&lt;br /&gt;
|-&lt;br /&gt;
| 26 (5Ah) || 21   || 50||100||  0|| #6F0|| bgcolor=&amp;quot;#80ff00&amp;quot; | || Lime          || Limonengrün     || Vert citron     || Verde lima&lt;br /&gt;
|-&lt;br /&gt;
| 27 (5Bh) || 23   || 50||100||100|| #6FF|| bgcolor=&amp;quot;#80ffff&amp;quot; | || Pastel Cyan   || Pastell-blaugrün|| Turquoise pastel|| Ciano pastel&lt;br /&gt;
|-&lt;br /&gt;
| 28 (5Ch) || 3    || 50||  0||  0|| #600|| bgcolor=&amp;quot;#800000&amp;quot; | || Red           || Rot             || Rouge           || Rojo&lt;br /&gt;
|-&lt;br /&gt;
| 29 (5Dh) || 5    || 50||  0||100|| #60F|| bgcolor=&amp;quot;#8000ff&amp;quot; | || Mauve         || Hellviolett     || Mauve           || Malva&lt;br /&gt;
|-&lt;br /&gt;
| 30 (5Eh) || 12   || 50|| 50||  0|| #660|| bgcolor=&amp;quot;#808000&amp;quot; | || Yellow        || Gelb            || Jaune           || Amarillo&lt;br /&gt;
|-&lt;br /&gt;
| 31 (5Fh) || 14   || 50|| 50||100|| #66F|| bgcolor=&amp;quot;#8080ff&amp;quot; | || Pastel Blue   || Pastellblau     || Bleu pastel     || Azul pastel&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Intensities ===&lt;br /&gt;
&lt;br /&gt;
The 0%, 50%, and 100% values in the above tables are &amp;quot;should-be&amp;quot; values. However, the real hardware doesn't exactly match that intensities. The actual intensities depend on the luminance mixing (R,G,B tied together via resistors), on chipset (classic CPC, or newer ASIC ones), and on the load applied by external hardware (Monitor, or TV set).&lt;br /&gt;
&lt;br /&gt;
On an actual Amstrad CPC, the half-intensity colour signal is measured to be closer to 40% rather than the expected 50%. This was verified by [[Grim]] and independently confirmed by [[Nocash]]. [https://www.grimware.org/doku.php/documentations/devices/gatearray#inkr Source]&lt;br /&gt;
* [[CPC Palette]] - some more details&lt;br /&gt;
&lt;br /&gt;
This explains why the Amstrad engineers used the following values to adapt the old colour palette to the new 12-bit palette on the Amstrad Plus:&lt;br /&gt;
* 0% became #0&lt;br /&gt;
* 50% became #6. They specifically chose #6 for the 50% value instead of the expected #7 or #8, to better match the real Amstrad CPC palette.&lt;br /&gt;
* 100% became #F&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Green Screen Colours ===&lt;br /&gt;
&lt;br /&gt;
On a green screen, where all colours are shades of unsaturated green, the firmware colours are in order of increasing intensity. Black is darkest green, bright white is brightest green, and firmware colour 13 is a medium green.&lt;br /&gt;
&lt;br /&gt;
The luminance (Y) is not exactly correlated to the actual luminance of colour images broadcast in RGB. Amstrad preferred to propose a completely different image system, not comparable to a conversion to monochrome, which would have limited the number of brightness levels to 21 (for example, colours 9 and 6 would have had the same luminance).&lt;br /&gt;
&lt;br /&gt;
They opted for a table of 27 linear brightness steps. They assigned values of 1 (1kΩ) for blue, 3 (3.3kΩ) for red, and 9 (10kΩ) for green.&lt;br /&gt;
&lt;br /&gt;
==== To calculate the luminance value ====&lt;br /&gt;
&lt;br /&gt;
'''Red''' &lt;br /&gt;
&lt;br /&gt;
*0% =&amp;amp;gt; do not add anything &lt;br /&gt;
*50% =&amp;amp;gt; add 3 &lt;br /&gt;
*100% =&amp;amp;gt; add 6 &lt;br /&gt;
&lt;br /&gt;
'''Green''' &lt;br /&gt;
&lt;br /&gt;
*0% =&amp;amp;gt; do not add anything &lt;br /&gt;
*50% =&amp;amp;gt; add 9 &lt;br /&gt;
*100% =&amp;amp;gt; add 18 &lt;br /&gt;
&lt;br /&gt;
'''Blue''' &lt;br /&gt;
&lt;br /&gt;
*0% =&amp;amp;gt; do not add anything &lt;br /&gt;
*50% =&amp;amp;gt; add 1 &lt;br /&gt;
*100% =&amp;amp;gt; add 2 &lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Pictures ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;gallery&amp;gt;&lt;br /&gt;
Image:40010_am2_metal.jpg|40010 GA Metal Layer&lt;br /&gt;
Image:40010_am2_acid.jpg|40010 GA with Metal Layer removed&lt;br /&gt;
Image:40226_am4_metal.jpg|40226 PreASIC Metal Layer&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[File:Ga.pinout.40007.png]] [[File:Ga.pinout.40008.40010.png]]&lt;br /&gt;
&lt;br /&gt;
Note: Some CPC motherboards can accommodate both types of Gate Array pinouts. [https://thecheshirec.at/2024/10/06/il-existe-une-carte-multi-gate-array-et-cest-amstrad-qui-la-faite/ Source]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== External links ==&lt;br /&gt;
*[https://bread80.com/2021/06/03/understanding-the-amstrad-cpc-video-ram-and-gate-array-subsystem/ Electronic signals analysis of the Gate Array by Bread80]&lt;br /&gt;
* [https://shaker.logonsystem.eu/ACCC1.8-EN.pdf Gate Array documentation in Amstrad CRTC Compendium]&lt;br /&gt;
* [https://www.grimware.org/doku.php/documentations/devices/gatearray Gate Array documentation from Grimware]&lt;br /&gt;
* [http://quasar.cpcscene.net/doku.php?id=assem:gate_array Quasar Gate Array documentation (in french)]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==See also==&lt;br /&gt;
&lt;br /&gt;
*[[Gate Array and ASIC Pin-Outs]]&lt;br /&gt;
*[[PAL16L8]] : for RAM arrangement&lt;br /&gt;
*[[ASIC]] : for Plus users&lt;br /&gt;
&lt;br /&gt;
*[[CRTC]] : the other video stuff&lt;br /&gt;
*[[Synchronising with the CRTC and display]] : technical details on the relationship between Gate Array and CRTC.&lt;br /&gt;
&lt;br /&gt;
*[[Video modes]] : for other informations on colours and pixels.&lt;br /&gt;
&lt;br /&gt;
*[[Media:40010-simplified V03.pdf]] [https://www.cpcwiki.eu/forum/amstrad-cpc-hardware/gate-array-decapped!/msg170713/#msg170713 Forum thread] Gate Array schematics - reverse engineered by Gerald&lt;br /&gt;
&lt;br /&gt;
[[Category:Hardware]][[Category:Programming]][[Category:Datasheet]][[Category:Graphic]][[Category:CPC Internal Components]][[Category:Electronic Component]]&lt;/div&gt;</summary>
		<author><name>Longshot</name></author>	</entry>

	<entry>
		<id>https://oldwiki.cpcwiki.eu/index.php?title=Gate_Array&amp;diff=126228</id>
		<title>Gate Array</title>
		<link rel="alternate" type="text/html" href="https://oldwiki.cpcwiki.eu/index.php?title=Gate_Array&amp;diff=126228"/>
				<updated>2025-05-21T18:09:13Z</updated>
		
		<summary type="html">&lt;p&gt;Longshot: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[File:Amstrad 40007 Gate Array.png|right|thumb|Amstrad 40007 Gate Array]]&lt;br /&gt;
[[File:Amstrad 40010 Gate Array.png|right|thumb|Amstrad 40010 Gate Array]]&lt;br /&gt;
&lt;br /&gt;
Also designated as Video Gate Array (VGA, not to be confused with the IBM PC compatible graphic card spec).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Introduction  ==&lt;br /&gt;
&lt;br /&gt;
The Gate Array is a specially designed chip exclusively for use in the Amstrad CPC and was designed by Amstrad plc. &lt;br /&gt;
&lt;br /&gt;
In the CPC+ system, the functions of the Gate Array are integrated into a single [[ASIC|ASIC]]. When the ASIC is &amp;quot;locked&amp;quot;, the extra features are not available and the ASIC operates the same as the Gate Array in the CPC allowing programs written for the CPC to work on the Plus without modification. The ASIC must be &amp;quot;un-locked&amp;quot; to access the new features. &lt;br /&gt;
&lt;br /&gt;
In the [[KC Compact]] system, the functions of the Gate Array are &amp;quot;emulated&amp;quot; in TTL chips, [[CIO Overview|CIO]], and its color translation EPROM.&lt;br /&gt;
&lt;br /&gt;
In the &amp;quot;cost-down&amp;quot; version of the CPC6128, the functions of the Gate Array are integrated into an ASIC.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== What does it do? ==&lt;br /&gt;
&lt;br /&gt;
The Gate Array is responsible for the display (colour palette, resolution, horizontal and vertical sync), bus arbitration, DRAM refresh, interrupt generation and memory arrangement. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Bus arbitration ==&lt;br /&gt;
&lt;br /&gt;
The Gate Array arbitrates access to the RAM between the CPU and the video hardware (CRTC and Gate-Array).&lt;br /&gt;
&lt;br /&gt;
Every microsecond: &lt;br /&gt;
* The CRTC generates a memory address using it's MA and RA signal outputs. See the [[CRTC]] wiki page to know how the motherboard wiring transforms these signals into the Video Memory Address (VMA).&lt;br /&gt;
* The Gate Array fetches 2 bytes for each address. /CPU_ADDR is a 1MHz signal. So these 2 bytes are fetched sequentially. They are not interleaved with Z80 access. These bytes are fetched even when the border is on as this is required for DRAM refresh.&lt;br /&gt;
* The video hardware is given priority so that the display is not disrupted.&lt;br /&gt;
&lt;br /&gt;
The Gate-Array generates the &amp;quot;READY&amp;quot; signal which is connected to the &amp;quot;/WAIT&amp;quot; input signal of the CPU. This signal is used to stop the CPU accessing RAM while the video-hardware is accessing it.&lt;br /&gt;
&lt;br /&gt;
In fact, the Gate Array allows the Z80 to access the RAM in only 1 out of every 4 cycles. As a result, all instruction timings are stretched so that they are all multiples of a microsecond (1µs), and this gives an effective CPU clock of 3.3Mhz.&lt;br /&gt;
&lt;br /&gt;
Unlike the ZX Spectrum or the Amiga, where bus arbitration is restricted to the &amp;quot;contended memory&amp;quot; or &amp;quot;chip RAM&amp;quot;, on the CPC it also applies to ROM access and to RAM expansions. So the Z80 always runs at the same speed, regardless of the type of memory being accessed.&lt;br /&gt;
&lt;br /&gt;
Last but not least, bus arbitration also applies to I/O access. And memory access is not aligned with I/O access on Z80.&lt;br /&gt;
&lt;br /&gt;
Note: On Amstrad Plus, the ASIC also has to handle DMA instruction fetch from RAM.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== DRAM refresh ==&lt;br /&gt;
&lt;br /&gt;
On Amstrad CPC, the Gate Array is responsible for the DRAM refresh, instead of using the Z80 built-in DRAM refresh mechanism. The reason is that there can only be 3 DRAM accesses per microsecond on this architecture. Doing DRAM refresh on each M1 cycle as it is done on MSX would bog down the CPU speed on CPC given its bus arbitration scheme.&lt;br /&gt;
&lt;br /&gt;
The Z80 generates a maximum of one request per microsecond. The CPC also requires two memory accesses per microsecond for reading video data.&lt;br /&gt;
&lt;br /&gt;
The CPC specs 4164-20 DRAMs. These require 330nS for a read or write cycle. The CPC also uses the optimised sequential CAS cycles to read the two video data bytes in half a microsecond. [https://www.cpcwiki.eu/forum/amstrad-cpc-hardware/the-cpc-revision-zero-article/msg243769/ Source]&lt;br /&gt;
&lt;br /&gt;
The way to cause the RAM refresh to fail in both a Plus or normal CPC is simply to stop a few bits of the CRTC address changing (ie. never refresh the selected area).&lt;br /&gt;
&lt;br /&gt;
Generally, only the Row address needs to be cycled, so stopping MA0 through MA7 from changing, and stopping the CPU from reading those rows, will cause data to be lost, quite quickly (generally around 4ms). [https://www.cpcwiki.eu/forum/amstrad-cpc-hardware/memory-refresh-plus/ Source]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Interrupt generation ==&lt;br /&gt;
* '''This section relies largely on a single source and is suspected of infringing copyright protected under the [https://creativecommons.org/licenses/by-nc-nd/4.0/legalcode CC BY-NC-ND 4.0 license].''' Readers are encouraged to refer directly to the original source material for accurate information. &lt;br /&gt;
** ''Original source material under copyright: [https://shaker.logonsystem.eu/ACCC1.8-EN.pdf  The Amstrad CPC CRTC Compendium]''&lt;br /&gt;
** ''Author: Serge Querné (Longshot)''&lt;br /&gt;
&lt;br /&gt;
Interrupts on the CPC are created by the Gate Array based on settings from the CRTC. The Gate Array has an internal counter R52 (the R is for Raster) that counts from 0 to 51, incrementing after each HSYNC signal.&lt;br /&gt;
&lt;br /&gt;
On all CRTCs, R52 interrupts always start 1µs after the end of an HSYNC. But on CRTCs 3/4, HSYNCs occur 1µs later than on CRTCs 0/1/2. Which means that on CRTCs 3/4, interrupts start 1µs later than on CRTCs 0/1/2. This can be adjusted by using the CRTC register 3.&lt;br /&gt;
&lt;br /&gt;
R52 will return to 0 and the Gate Array will send an interrupt request on any of these conditions:&lt;br /&gt;
* When it exceeds 51&lt;br /&gt;
* By setting bit4 of the RMR register of the Gate Array to 1&lt;br /&gt;
* At the end of the 2nd HSYNC after the start of the VSYNC&lt;br /&gt;
&lt;br /&gt;
When the Gate Array sends an interrupt request:&lt;br /&gt;
*If the interrupts were authorized at the time of the request, then bit5 of R52 is cleared (but R52 was reset to 0 anyway) and the interrupt takes place&lt;br /&gt;
*If interrupts are not authorized, then the R52 counter continues to increment and the interrupt remains armed (the Gate Array then maintains its INT signal). When interrupts are enabled (using the EI instruction), bit5 of R52 is cleared and the interrupt takes place. This happens only '''after the instruction that follows EI''' as this Z80 instruction has a 1-instruction delay.&lt;br /&gt;
&lt;br /&gt;
Note: On Amstrad Plus, the interrupt management system is seriously beefed up. See the [[ASIC]] wiki page.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== CSYNC signal ==&lt;br /&gt;
* '''This section relies largely on a single source and is suspected of infringing copyright protected under the [https://creativecommons.org/licenses/by-nc-nd/4.0/legalcode CC BY-NC-ND 4.0 license].''' Readers are encouraged to refer directly to the original source material for accurate information. &lt;br /&gt;
** ''Original source material under copyright: [https://shaker.logonsystem.eu/ACCC1.8-EN.pdf  The Amstrad CPC CRTC Compendium]''&lt;br /&gt;
** ''Author: Serge Querné (Longshot)''&lt;br /&gt;
&lt;br /&gt;
The HSYNC and VSYNC signals are received from the [[CRTC]]. These signals are then modified by the Gate Array to C-HSYNC and C-VSYNC and merged into a single CSYNC signal that will be sent to the display.&lt;br /&gt;
&lt;br /&gt;
When CRTC HSYNC is active, the Gate Array immediately outputs the palette colour black. If the HSYNC is set to 14 characters then black will be output for 14µs.&lt;br /&gt;
&lt;br /&gt;
If a graphics mode change is pending, the HSYNC pulse width needs to be at least 2µs for Gate Array to change the graphics mode.&lt;br /&gt;
&lt;br /&gt;
C-HSYNC begins 2µs after activation of the CRTC HSYNC and stays a maximum of 4µs (signal is cut short if HSYNC width is greater than 6).&lt;br /&gt;
&lt;br /&gt;
For example, if CRTC R2=46, and CRTC HSYNC width is 14 chars then C-HSYNC starts at 48 and lasts only until 51 included.&lt;br /&gt;
&lt;br /&gt;
On Gate Array, even if the duration of the CRTC VSYNC is reduced to 2 µseconds, the Gate Array will always output black for 26 lines with 4 lines of C-VSYNC to the monitor. While on ASIC/Pre-ASIC, the CRTC VSYNC must be active as long as the C-VSYNC signal is sent to the monitor.&lt;br /&gt;
&lt;br /&gt;
The Gate Array (and ASIC/Pre-ASIC) uses 2 internal counters to create its CSYNC signal:&lt;br /&gt;
* H06 counts the number of CRTC characters processed during an HSYNC. H06 is incremented by the Gate Array for each CRTC character when CRTC HSYNC is active. The Gate Array activates the C-HSYNC signal when H06 reaches 2, and changes its graphics mode if a change was pending. It deactivates this signal when H06 reaches 6.&lt;br /&gt;
* V26 counts the number of HSYNCs occuring during a VSYNC. V26 is incremented by the Gate Array when the CRTC signals an end of HSYNC. The Gate Array activates the C-VSYNC signal when V26 reaches 2 (and if VSYNC is active on ASIC/Pre-ASIC). It deactivates this signal when V26 reaches 6. After the 26th line has been processed, the Gate Array stops outputting the palette colour black.&lt;br /&gt;
&lt;br /&gt;
If CRTC VSYNC is activated again while V26 is still in progress, then V26 is reset to 0 and starts counting up again the HSYNC pulses.&lt;br /&gt;
&lt;br /&gt;
The HSYNC signal from the CRTC is 0 when inactive and 1 when active. Same for VSYNC.&lt;br /&gt;
&lt;br /&gt;
C-HSYNC and C-VSYNC are composited using the XNOR function. The resulting CSYNC signal produced by the Gate Array is 1 when inactive and 0 when active.&lt;br /&gt;
&lt;br /&gt;
On a CPC monitor, the CSYNC is rendered in &amp;quot;absolute black&amp;quot;. It is darker than the palette colour black output by the Gate Array. The electron beam is basically turned off. Turning up the brightness level won't make it any brighter.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Controlling the Gate Array  ==&lt;br /&gt;
&lt;br /&gt;
The gate array is controlled by I/O. The gate array is selected when bit 15 of the I/O port address is set to &amp;quot;0&amp;quot; and bit 14 of the I/O port address is set to &amp;quot;1&amp;quot;. The values of the other bits are ignored. However, to avoid conflict with other devices in the system, these bits should be set to &amp;quot;1&amp;quot;. &lt;br /&gt;
&lt;br /&gt;
The recommended I/O port address is &amp;amp;7Fxx. &lt;br /&gt;
&lt;br /&gt;
The Gate Array is not connected to the CPU's RD and WR pins, so it cannot detect the bus's I/O direction. If you execute an I/O read operation on the Gate Array I/O address, the Gate Array will read an unpredictable value from the databus which will be in high-impedance state. If the value is a valid Gate Array command, it will be executed, otherwise nothing will happen. [https://www.grimware.org/doku.php/documentations/devices/gatearraydo=export_xhtml Source]&lt;br /&gt;
&lt;br /&gt;
The function to be performed is selected by writing data to the Gate Array, the first bits of the data define the function selected (see table below). It is not possible to read from the Gate Array. &lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!colspan=4| 8bit command&lt;br /&gt;
!rowspan=2| Machine&lt;br /&gt;
!rowspan=2| Register&lt;br /&gt;
!rowspan=2| Description&lt;br /&gt;
!rowspan=2| Chip&lt;br /&gt;
|-&lt;br /&gt;
! 7&lt;br /&gt;
! 6&lt;br /&gt;
! 5&lt;br /&gt;
! 4..0&lt;br /&gt;
|-&lt;br /&gt;
| 0 || 0 || x || style=&amp;quot;text-align: center;&amp;quot; | n || All || PENR || Select a color register || Gate Array&lt;br /&gt;
|-&lt;br /&gt;
| 0 || 1 || x || style=&amp;quot;text-align: center;&amp;quot; | n || All || INKR || Change the value of the currently selected color register || Gate Array&lt;br /&gt;
|-&lt;br /&gt;
| 1 || 0 || 0 || style=&amp;quot;text-align: center;&amp;quot; | n || All || RMR || Control Interrupt counter, ROM mapping and Graphics mode || Gate Array&lt;br /&gt;
|-&lt;br /&gt;
| rowspan=&amp;quot;2&amp;quot;|1 || rowspan=&amp;quot;2&amp;quot;|0 || rowspan=&amp;quot;2&amp;quot;|1 || style=&amp;quot;text-align: center;&amp;quot; rowspan=&amp;quot;2&amp;quot; | n || All || RMR || ''Ghost register'' || Gate Array (CPC) or locked ASIC (Plus)&lt;br /&gt;
|-&lt;br /&gt;
| Plus || RMR2 || ASIC &amp;amp; Advanced ROM mapping || Unlocked ASIC&lt;br /&gt;
|-&lt;br /&gt;
| 1 || 1 ||colspan=2  style=&amp;quot;text-align: center;&amp;quot; | n || All || MMR || RAM memory mapping || PAL (only with 128KB or RAM expansion)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
The MMR register is not available in the Gate Array, but is performed by a device at the same I/O port address location.&lt;br /&gt;
&lt;br /&gt;
In the CPC464, CPC664 and KC compact, MMR is performed in an external memory expansion (e.g. Dk'Tronics 64K RAM Expansion), if this expansion is not present then MMR is not available.&lt;br /&gt;
&lt;br /&gt;
In the CPC6128, MMR is performed by a [[PAL16L8|PAL chip]] located on the main PCB, or an external memory expansion.&lt;br /&gt;
&lt;br /&gt;
In the 464+ and 6128+, MMR is performed by the ASIC or an external memory expansion. Please read the document on RAM management for more information.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Registers ==&lt;br /&gt;
&lt;br /&gt;
Note: The Plus palette capabilities are only accessible through the [[Default I/O Port Summary|ASIC I/O page]]. Registers PENR and INKR are not needed in that case.&lt;br /&gt;
&lt;br /&gt;
=== Register PENR (Select a color register) ===&lt;br /&gt;
&lt;br /&gt;
When bit 7 and bit 6 are set to &amp;quot;0&amp;quot;, the remaining bits determine which pen is to have its colour changed. When bit 4 is set to &amp;quot;0&amp;quot;, bits 3 to 0 define which pen is to be selected. When bit 4 is set to &amp;quot;1&amp;quot;, the value contained in bits 3-0 is ignored and the border is selected. &lt;br /&gt;
&lt;br /&gt;
The pen remains selected until another is chosen. &lt;br /&gt;
&lt;br /&gt;
Each mode has a fixed number of pens. Mode 0 has 16 pens, mode 1 has 4 pens and mode 2 has 2 pens. &lt;br /&gt;
&lt;br /&gt;
==== Summary  ====&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!Bit&lt;br /&gt;
!Value&lt;br /&gt;
!Function&lt;br /&gt;
|-&lt;br /&gt;
| 7 || 0 || rowspan=&amp;quot;2&amp;quot; | Gate Array PENR register&lt;br /&gt;
|-&lt;br /&gt;
| 6 || 0 &lt;br /&gt;
|-&lt;br /&gt;
| 5 || - || not used&lt;br /&gt;
|-&lt;br /&gt;
| 4 || 1 || Select border&lt;br /&gt;
|-&lt;br /&gt;
| 3 || x || rowspan=&amp;quot;4&amp;quot; | Ignored&lt;br /&gt;
|-&lt;br /&gt;
| 2 || x&lt;br /&gt;
|-&lt;br /&gt;
| 1 || x&lt;br /&gt;
|-&lt;br /&gt;
| 0 || x&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!Bit&lt;br /&gt;
!Value&lt;br /&gt;
!Function&lt;br /&gt;
|-&lt;br /&gt;
| 7 || 0 || rowspan=&amp;quot;2&amp;quot; | Gate Array PENR register&lt;br /&gt;
|-&lt;br /&gt;
| 6 || 0&lt;br /&gt;
|-&lt;br /&gt;
| 5 || - || not used&lt;br /&gt;
|-&lt;br /&gt;
| 4 || 0 || Select pen&lt;br /&gt;
|-&lt;br /&gt;
| 3 || x || rowspan=&amp;quot;4&amp;quot; | Pen number&lt;br /&gt;
|-&lt;br /&gt;
| 2 || x&lt;br /&gt;
|-&lt;br /&gt;
| 1 || x&lt;br /&gt;
|-&lt;br /&gt;
| 0 || x&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Register INKR (Change the value of the currently selected color register) ===&lt;br /&gt;
&lt;br /&gt;
Once the pen has been selected its colour can then be changed. Bits 4 to 0 specify the hardware colour number from the hardware colour palette. &lt;br /&gt;
&lt;br /&gt;
Even though there is provision for 32 colours, only 27 are possible. The remaining colours are duplicates of those already in the colour palette. &lt;br /&gt;
&lt;br /&gt;
==== Summary  ====&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!Bit&lt;br /&gt;
!Value&lt;br /&gt;
!Function&lt;br /&gt;
|-&lt;br /&gt;
| 7 || 0 || rowspan=&amp;quot;2&amp;quot; | Gate Array INKR register&lt;br /&gt;
|-&lt;br /&gt;
| 6 || 1&lt;br /&gt;
|-&lt;br /&gt;
| 5 || - || not used&lt;br /&gt;
|-&lt;br /&gt;
| 4 || x || rowspan=&amp;quot;5&amp;quot; | Colour number x&lt;br /&gt;
|-&lt;br /&gt;
| 3 || x &lt;br /&gt;
|-&lt;br /&gt;
| 2 || x &lt;br /&gt;
|-&lt;br /&gt;
| 1 || x&lt;br /&gt;
|-&lt;br /&gt;
| 0 || x&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Register RMR (Control Interrupt counter, ROM mapping and Graphics mode) ===&lt;br /&gt;
&lt;br /&gt;
This is a general purpose register responsible for the [[Video modes|graphics mode]] and the ROM configuration. &lt;br /&gt;
&lt;br /&gt;
==== Graphics mode selection  ====&lt;br /&gt;
&lt;br /&gt;
The function of bits 1 and 0 is to define the screen mode. The settings for bits 1 and 0 and the corresponding screen mode are given in the table below. &lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!Bit 1&lt;br /&gt;
!Bit 0&lt;br /&gt;
!Screen mode&lt;br /&gt;
|-&lt;br /&gt;
| 0 || 0 || Mode 0, 160x200 resolution, 16 colours&lt;br /&gt;
|-&lt;br /&gt;
| 0 || 1 || Mode 1, 320x200 resolution, 4 colours&lt;br /&gt;
|-&lt;br /&gt;
| 1 || 0 || Mode 2, 640x200 resolution, 2 colours&lt;br /&gt;
|-&lt;br /&gt;
| 1 || 1 || Mode 3, 160x200 resolution, 4 colours (undocumented)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
* Mode 3 is not official. From the combinations possible, we can see that 4 modes can be defined, although the Amstrad only has 3. Mode 3 is similar to mode 0, because it has the same resolution, but it is limited to only 4 colours. Mode 3 is not supported by the [[KC Compact]] (which outputs black in Mode 3).&lt;br /&gt;
&lt;br /&gt;
Mode changing is synchronised with HSYNC. If the mode is changed, it will take effect from the next HSYNC.&lt;br /&gt;
&lt;br /&gt;
==== ROM configuration selection  ====&lt;br /&gt;
&lt;br /&gt;
Bit 2 is used to enable or disable the lower ROM area. The lower ROM area occupies memory addresses &amp;amp;amp;0000-&amp;amp;amp;3fff and is used to access the operating system ROM. When the lower ROM area is is enabled, reading from &amp;amp;amp;0000-&amp;amp;amp;3FFF will return data in the ROM. When a value is written to &amp;amp;amp;0000-&amp;amp;amp;3FFF, it will be written to the RAM underneath the ROM. When it is disabled, data read from &amp;amp;amp;0000-&amp;amp;amp;3FFF will return the data in the RAM. &lt;br /&gt;
&lt;br /&gt;
Similarly, bit 3 controls enabling or disabling of the upper ROM area. The upper ROM area occupies memory addressess &amp;amp;amp;C000-&amp;amp;amp;FFFF and is BASIC or any expansion ROMs which may be plugged into a ROM board/box. See the document on [[Upper ROM Bank Number|upper rom selection]] for more details. When the upper ROM area enabled, reading from &amp;amp;amp;c000-&amp;amp;amp;ffff, will return data in the ROM. When data is written to &amp;amp;amp;c000-&amp;amp;amp;FFFF, it will be written to the RAM at the same address as the ROM. When the upper ROM area is disabled, and data is read from &amp;amp;amp;c000-&amp;amp;amp;ffff it will be the data in the RAM. &lt;br /&gt;
&lt;br /&gt;
Bit 4 controls the interrupt generation. It can be used to delay interrupts. See the document on interrupt generation for more information.&lt;br /&gt;
&lt;br /&gt;
==== Summary  ====&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!Bit&lt;br /&gt;
!Value&lt;br /&gt;
!Function&lt;br /&gt;
|-&lt;br /&gt;
| 7 || 1 || rowspan=&amp;quot;2&amp;quot; | Gate Array RMR register&lt;br /&gt;
|-&lt;br /&gt;
| 6 || 0 &lt;br /&gt;
|-&lt;br /&gt;
| 5 || - || ''must be 0 on Plus machines with ASIC unlocked''&lt;br /&gt;
|-&lt;br /&gt;
| 4 || x || Interrupt generation control&lt;br /&gt;
|-&lt;br /&gt;
| 3 || x || 1=Upper ROM area disable, 0=Upper ROM area enable&lt;br /&gt;
|-&lt;br /&gt;
| 2 || x || 1=Lower ROM area disable, 0=Lower ROM area enable&lt;br /&gt;
|-&lt;br /&gt;
| 1 || x || rowspan=&amp;quot;2&amp;quot; | Graphics Mode selection&lt;br /&gt;
|-&lt;br /&gt;
| 0 || x&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Register RMR2 (ASIC &amp;amp; Advanced ROM mapping) ===&lt;br /&gt;
&lt;br /&gt;
This register exists only in Plus or GX4000, and is only accessible when the ASIC is unlocked.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!Bit&lt;br /&gt;
!Value&lt;br /&gt;
!Function&lt;br /&gt;
|-&lt;br /&gt;
| 7 || 1 || rowspan=&amp;quot;3&amp;quot; | Gate Array RMR2 register&lt;br /&gt;
|-&lt;br /&gt;
| 6 || 0&lt;br /&gt;
|-&lt;br /&gt;
| 5 || 1&lt;br /&gt;
|-&lt;br /&gt;
| 4 || x || rowspan=&amp;quot;2&amp;quot; |RMR addressing mode&lt;br /&gt;
|-&lt;br /&gt;
| 3 || x&lt;br /&gt;
|-&lt;br /&gt;
| 2 || x || rowspan=&amp;quot;3&amp;quot; | Physical ROM number (0..7)&lt;br /&gt;
|-&lt;br /&gt;
| 1 || x&lt;br /&gt;
|-&lt;br /&gt;
| 0 || x&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ RMR addressing modes&lt;br /&gt;
!Bit 4&lt;br /&gt;
!Bit 3&lt;br /&gt;
!Lower ROM&lt;br /&gt;
![[ASIC|ASIC I/O page]]&lt;br /&gt;
|-&lt;br /&gt;
|0&lt;br /&gt;
|0&lt;br /&gt;
|&amp;amp;0000-&amp;amp;3FFF&lt;br /&gt;
|Disabled&lt;br /&gt;
|-&lt;br /&gt;
|0&lt;br /&gt;
|1&lt;br /&gt;
|&amp;amp;4000-&amp;amp;7FFF&lt;br /&gt;
|Disabled&lt;br /&gt;
|-&lt;br /&gt;
|1&lt;br /&gt;
|0&lt;br /&gt;
|&amp;amp;8000-&amp;amp;BFFF&lt;br /&gt;
|Disabled&lt;br /&gt;
|-&lt;br /&gt;
|1&lt;br /&gt;
|1&lt;br /&gt;
|&amp;amp;0000-&amp;amp;3FFF&lt;br /&gt;
|&amp;amp;4000-&amp;amp;7FFF&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
The physical ROMs are also accessible as upper ROMs by using the [[Upper ROM Bank Number]] port and the RMR register.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Register MMR (RAM memory mapping) ===&lt;br /&gt;
&lt;br /&gt;
This register exists only in CPCs with 128K RAM (like the CPC 6128), or CPCs equipped with [[Standard Memory Expansions]].&lt;br /&gt;
&lt;br /&gt;
Note: In the CPC 6128, the register is a separate [[PAL16L8|PAL chip]] that assists the Gate Array chip.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!Bit&lt;br /&gt;
!Value&lt;br /&gt;
!Function&lt;br /&gt;
|-&lt;br /&gt;
| 7 || 1 || rowspan=&amp;quot;2&amp;quot; | Gate Array MMR register&lt;br /&gt;
|-&lt;br /&gt;
| 6 || 1 &lt;br /&gt;
|-&lt;br /&gt;
| 5 || x || rowspan=&amp;quot;3&amp;quot; |64K bank number (0..7); always 0 on an unexpanded CPC6128, 0-7 on [[Standard Memory Expansions]]&lt;br /&gt;
|-&lt;br /&gt;
| 4 || x&lt;br /&gt;
|-&lt;br /&gt;
| 3 || x&lt;br /&gt;
|-&lt;br /&gt;
| 2 || x || rowspan=&amp;quot;3&amp;quot; | RAM Config (0..7)&lt;br /&gt;
|-&lt;br /&gt;
| 1 || x&lt;br /&gt;
|-&lt;br /&gt;
| 0 || x&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
The 3bit RAM Config value is used to access the second 64K of the total 128K RAM that is built into the CPC 6128 or the additional 64K-512K of standard memory expansions. These contain up to eight 64K ram banks, which are selected with bit 3-5. A standard CPC 6128 only contains bank 0. Normally the register is set to 0, so that only the first 64K RAM are used (identical to the CPC 464 and 664 models). The register can be used to select between the following eight predefined configurations only:&lt;br /&gt;
&lt;br /&gt;
  -Address-     0      1      2      3      4      5      6      7&lt;br /&gt;
  0000-3FFF   RAM_0  RAM_0  '''RAM_4'''  RAM_0  RAM_0  RAM_0  RAM_0  RAM_0&lt;br /&gt;
  4000-7FFF   RAM_1  RAM_1  '''RAM_5'''  '''RAM_3'''  '''RAM_4'''  '''RAM_5'''  '''RAM_6'''  '''RAM_7'''&lt;br /&gt;
  8000-BFFF   RAM_2  RAM_2  '''RAM_6'''  RAM_2  RAM_2  RAM_2  RAM_2  RAM_2&lt;br /&gt;
  C000-FFFF   RAM_3  '''RAM_7'''  '''RAM_7'''  '''RAM_7'''  RAM_3  RAM_3  RAM_3  RAM_3&lt;br /&gt;
&lt;br /&gt;
The Video RAM is always located in the first 64K, VRAM is in no way affected by this register.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Programming the Gate Array - Examples  ==&lt;br /&gt;
&lt;br /&gt;
Defining the colours, &amp;lt;br&amp;gt;Setting pen 0 to Bright White. &lt;br /&gt;
&amp;lt;pre&amp;gt;LD BC,7F00&amp;amp;nbsp;;Gate Array port&lt;br /&gt;
LD A,%00000000+0&amp;amp;nbsp;;Pen number (and Gate Array function)&lt;br /&gt;
OUT (C),A&amp;amp;nbsp;;Send pen number&lt;br /&gt;
LD A,%01000000+11&amp;amp;nbsp;;Pen colour (and Gate Array function)&lt;br /&gt;
OUT (C),A&amp;amp;nbsp;;Send it&lt;br /&gt;
RET&lt;br /&gt;
&lt;br /&gt;
Setting the mode and ROM configuration, &lt;br /&gt;
Mode 2, upper and lower ROM disabled.&lt;br /&gt;
&lt;br /&gt;
LD BC,7F00&amp;amp;nbsp;;Gate array port&lt;br /&gt;
LD A,%10000000+%00001110&amp;amp;nbsp;;Mode and ROM selection (and Gate Array function)&lt;br /&gt;
OUT (C),A&amp;amp;nbsp;;Send it&lt;br /&gt;
RET&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Misc ===&lt;br /&gt;
&lt;br /&gt;
The hardware colour number is different to the colour range used by the firmware, so a conversion chart is provided for the corresponding firmware/hardware colour values and the corresponding colour name. &lt;br /&gt;
&lt;br /&gt;
=== Note ===&lt;br /&gt;
&lt;br /&gt;
The firmware keeps track of the colours it is using. Every VSYNC (assuming interrupts are enabled) the firmware sets the colours. This enables the user to have flashing colours. If the user selects a new colour using the gate array, the new colour will flash temporarily and then return to its original colour. This is due to the firmware resetting the colour. When using the firmware, use its routines to select the colour, and the colour will remain.&lt;br /&gt;
&lt;br /&gt;
Example: [For whatever reason, this example does NOT refer to the above firmware stuff]&lt;br /&gt;
&amp;lt;pre&amp;gt;ld bc,7f00+1&amp;amp;nbsp;;Gate array function (set pen)&lt;br /&gt;
;and pen number&lt;br /&gt;
out (c),c&lt;br /&gt;
ld bc,7f00&amp;amp;nbsp;;41 &lt;br /&gt;
;Gate array function (set colour)&lt;br /&gt;
;and colour number&lt;br /&gt;
out (c),c&lt;br /&gt;
ret&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Video memory structure ==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!rowspan=2|Graphics Mode&lt;br /&gt;
!colspan=8|VRAM byte&lt;br /&gt;
!colspan=8|Displayed Pixels&lt;br /&gt;
!rowspan=2|Definition&lt;br /&gt;
!rowspan=2|Pixel clock&lt;br /&gt;
!rowspan=2|Default resolution&lt;br /&gt;
|-&lt;br /&gt;
!7&lt;br /&gt;
!6&lt;br /&gt;
!5&lt;br /&gt;
!4&lt;br /&gt;
!3&lt;br /&gt;
!2&lt;br /&gt;
!1&lt;br /&gt;
!0&lt;br /&gt;
!1&lt;br /&gt;
!2&lt;br /&gt;
!3&lt;br /&gt;
!4&lt;br /&gt;
!5&lt;br /&gt;
!6&lt;br /&gt;
!7&lt;br /&gt;
!8&lt;br /&gt;
|-&lt;br /&gt;
|0&lt;br /&gt;
|A0&lt;br /&gt;
|B0&lt;br /&gt;
|A2&lt;br /&gt;
|B2&lt;br /&gt;
|A1&lt;br /&gt;
|B1&lt;br /&gt;
|A3&lt;br /&gt;
|B3&lt;br /&gt;
|colspan=4 style=&amp;quot;text-align: center;&amp;quot;|A&lt;br /&gt;
|colspan=4 style=&amp;quot;text-align: center;&amp;quot;|B&lt;br /&gt;
|2 pixels in 16 colours&lt;br /&gt;
|4 MHz&lt;br /&gt;
|160x200, 20-column text&lt;br /&gt;
|-&lt;br /&gt;
|1&lt;br /&gt;
|A0&lt;br /&gt;
|B0&lt;br /&gt;
|C0&lt;br /&gt;
|D0&lt;br /&gt;
|A1&lt;br /&gt;
|B1&lt;br /&gt;
|C1&lt;br /&gt;
|D1&lt;br /&gt;
|colspan=2 style=&amp;quot;text-align: center;&amp;quot;|A&lt;br /&gt;
|colspan=2 style=&amp;quot;text-align: center;&amp;quot;|B&lt;br /&gt;
|colspan=2 style=&amp;quot;text-align: center;&amp;quot;|C&lt;br /&gt;
|colspan=2 style=&amp;quot;text-align: center;&amp;quot;|D&lt;br /&gt;
|4 pixels in 4 colours&lt;br /&gt;
|8 MHz&lt;br /&gt;
|320x200, 40-column text&lt;br /&gt;
|-&lt;br /&gt;
|2&lt;br /&gt;
|A0&lt;br /&gt;
|B0&lt;br /&gt;
|C0&lt;br /&gt;
|D0&lt;br /&gt;
|E0&lt;br /&gt;
|F0&lt;br /&gt;
|G0&lt;br /&gt;
|H0&lt;br /&gt;
|A&lt;br /&gt;
|B&lt;br /&gt;
|C&lt;br /&gt;
|D&lt;br /&gt;
|E&lt;br /&gt;
|F&lt;br /&gt;
|G&lt;br /&gt;
|H&lt;br /&gt;
|8 pixels in 2 colours&lt;br /&gt;
|16 MHz&lt;br /&gt;
|640x200, 80-column text&lt;br /&gt;
|-&lt;br /&gt;
|3&lt;br /&gt;
|A0&lt;br /&gt;
|B0&lt;br /&gt;
|x&lt;br /&gt;
|x&lt;br /&gt;
|A1&lt;br /&gt;
|B1&lt;br /&gt;
|x&lt;br /&gt;
|x&lt;br /&gt;
|colspan=4 style=&amp;quot;text-align: center;&amp;quot;|A&lt;br /&gt;
|colspan=4 style=&amp;quot;text-align: center;&amp;quot;|B&lt;br /&gt;
|2 pixels in 4 colours&lt;br /&gt;
|4 MHz&lt;br /&gt;
|160x200, 20-column text&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Split rasters ==&lt;br /&gt;
&lt;br /&gt;
On the CPC, split rasters occur halfway (after the 8th mode2 pixel) through the rendering of a CRTC character.&lt;br /&gt;
&lt;br /&gt;
On Amstrad Plus, split rasters occur quarter of the way (after the 4th mode2 pixel) through the rendering of a CRTC character.&lt;br /&gt;
&lt;br /&gt;
To easily make split rasters compatible with both the CPC and the Plus machines, one can use the ASIC soft-scroll control register (SSCR) to finely adjust the horizontal position of the graphics.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Palette R,G,B definitions ==&lt;br /&gt;
&lt;br /&gt;
There are 27 colours which are generated from red, green and blue mixed in different quantities. There are 3 levels of red, 3 levels of green and 3 levels of blue, and these can be thought of as off/no colour, half-on/half-colour, and on/full-colour. &lt;br /&gt;
&lt;br /&gt;
To display a CPC image you will need to use a analogue monitor with a composite sync.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Palette sorted by Firmware Colour Numbers ===&lt;br /&gt;
&lt;br /&gt;
The firmware colour palette is sorted by luminance value.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
|-&lt;br /&gt;
!Firmware Number&lt;br /&gt;
!Hardware Number&lt;br /&gt;
!Colour Name&lt;br /&gt;
!R %&lt;br /&gt;
!G %&lt;br /&gt;
!B %&lt;br /&gt;
!ASIC&lt;br /&gt;
!Colour&lt;br /&gt;
|-&lt;br /&gt;
| 0|| 54h          ||Black          ||  0||  0||  0|| #000||bgcolor=&amp;quot;#000000&amp;quot;|&lt;br /&gt;
|-&lt;br /&gt;
| 1|| 44h (or 50h) ||Blue           ||  0||  0|| 50|| #006||bgcolor=&amp;quot;#000080&amp;quot;|&lt;br /&gt;
|-&lt;br /&gt;
| 2|| 55h          ||Bright Blue    ||  0||  0||100|| #00F||bgcolor=&amp;quot;#0000ff&amp;quot;|&lt;br /&gt;
|-&lt;br /&gt;
| 3|| 5Ch          ||Red            || 50||  0||  0|| #600||bgcolor=&amp;quot;#800000&amp;quot;|&lt;br /&gt;
|-&lt;br /&gt;
| 4|| 58h          ||Magenta        || 50||  0|| 50|| #606||bgcolor=&amp;quot;#800080&amp;quot;|&lt;br /&gt;
|-&lt;br /&gt;
| 5|| 5Dh          ||Mauve          || 50||  0||100|| #60F||bgcolor=&amp;quot;#8000ff&amp;quot;|&lt;br /&gt;
|-&lt;br /&gt;
| 6|| 4Ch          ||Bright Red     ||100||  0||  0|| #F00||bgcolor=&amp;quot;#ff0000&amp;quot;|&lt;br /&gt;
|-&lt;br /&gt;
| 7|| 45h (or 48h) ||Purple         ||100||  0|| 50|| #F06||bgcolor=&amp;quot;#ff0080&amp;quot;|&lt;br /&gt;
|-&lt;br /&gt;
| 8|| 4Dh          ||Bright Magenta ||100||  0||100|| #F0F||bgcolor=&amp;quot;#ff00ff&amp;quot;|&lt;br /&gt;
|-&lt;br /&gt;
| 9|| 56h          ||Green          ||  0|| 50||  0|| #060||bgcolor=&amp;quot;#008000&amp;quot;|&lt;br /&gt;
|-&lt;br /&gt;
|10|| 46h          ||Cyan           ||  0|| 50|| 50|| #066||bgcolor=&amp;quot;#008080&amp;quot;|&lt;br /&gt;
|-&lt;br /&gt;
|11|| 57h          ||Sky Blue       ||  0|| 50||100|| #06F||bgcolor=&amp;quot;#0080ff&amp;quot;|&lt;br /&gt;
|-&lt;br /&gt;
|12|| 5Eh          ||Yellow         || 50|| 50||  0|| #660||bgcolor=&amp;quot;#808000&amp;quot;|&lt;br /&gt;
|-&lt;br /&gt;
|13|| 40h (or 41h) ||White          || 50|| 50|| 50||#666||bgcolor=&amp;quot;#808080&amp;quot;|&lt;br /&gt;
|-&lt;br /&gt;
|14|| 5Fh          ||Pastel Blue    || 50|| 50||100|| #66F||bgcolor=&amp;quot;#8080ff&amp;quot;|&lt;br /&gt;
|-&lt;br /&gt;
|15|| 4Eh          ||Orange         ||100|| 50||  0|| #F60|| bgcolor=&amp;quot;#ff8000&amp;quot;|&lt;br /&gt;
|-&lt;br /&gt;
|16|| 47h          ||Pink           ||100|| 50|| 50|| #F66||bgcolor=&amp;quot;#ff8080&amp;quot;|&lt;br /&gt;
|-&lt;br /&gt;
|17|| 4Fh          ||Pastel Magenta ||100|| 50||100|| #F6F||bgcolor=&amp;quot;#ff80ff&amp;quot;|&lt;br /&gt;
|-&lt;br /&gt;
|18|| 52h          ||Bright Green   ||  0||100||  0|| #0F0||bgcolor=&amp;quot;#00ff00&amp;quot;|&lt;br /&gt;
|-&lt;br /&gt;
|19|| 42h (or 51h) ||Sea Green      ||  0||100|| 50|| #0F6||bgcolor=&amp;quot;#00ff80&amp;quot;|&lt;br /&gt;
|-&lt;br /&gt;
|20|| 53h          ||Bright Cyan    ||  0||100||100|| #0FF||bgcolor=&amp;quot;#00ffff&amp;quot;|&lt;br /&gt;
|-&lt;br /&gt;
|21|| 5Ah          ||Lime           || 50||100||  0|| #6F0||bgcolor=&amp;quot;#80ff00&amp;quot;|&lt;br /&gt;
|-&lt;br /&gt;
|22|| 59h          ||Pastel Green   || 50||100|| 50|| #6F6||bgcolor=&amp;quot;#80ff80&amp;quot;|&lt;br /&gt;
|-&lt;br /&gt;
|23|| 5Bh          ||Pastel Cyan    || 50||100||100|| #6FF||bgcolor=&amp;quot;#80ffff&amp;quot;|&lt;br /&gt;
|-&lt;br /&gt;
|24|| 4Ah          ||Bright Yellow  ||100||100||  0|| #FF0||bgcolor=&amp;quot;#ffff00&amp;quot;|&lt;br /&gt;
|-&lt;br /&gt;
|25|| 43h (or 49h) ||Pastel Yellow  ||100||100|| 50||#FF6||bgcolor=&amp;quot;#ffff80&amp;quot;|&lt;br /&gt;
|-&lt;br /&gt;
|26|| 4Bh          ||Bright White   ||100||100||100|| #FFF||bgcolor=&amp;quot;#ffffff&amp;quot;|&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Note: We can observe that the official Amstrad names of some colours are a bit silly: &amp;quot;red&amp;quot; is in fact brown, &amp;quot;yellow&amp;quot; is in fact khaki and &amp;quot;white&amp;quot; is in fact grey.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Amstrad Colour Names ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;gallery&amp;gt;&lt;br /&gt;
Cpc 6128 master colour chat.jpg|Master colour chart&lt;br /&gt;
Cpc 6128 farbtabelle.jpg|Farbtabelle&lt;br /&gt;
Cpc 6128 palette des couleurs.jpg|Palette des couleurs&lt;br /&gt;
Cpc 6128 tabla de colores.jpg|Tabla de colores&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Palette sorted by Hardware Colour Numbers ===&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!Hardware Number&lt;br /&gt;
!Firmware Number&lt;br /&gt;
!R %&lt;br /&gt;
!G %&lt;br /&gt;
!B %&lt;br /&gt;
!ASIC&lt;br /&gt;
!Colour&lt;br /&gt;
!Colour Name&lt;br /&gt;
!German Name&lt;br /&gt;
!French Name&lt;br /&gt;
!Spanish Name&lt;br /&gt;
|-&lt;br /&gt;
|  0 (40h) || 13   || 50|| 50|| 50|| #666|| bgcolor=&amp;quot;#808080&amp;quot; | || White         || Weiß            || Blanc           || Blanco&lt;br /&gt;
|-&lt;br /&gt;
|  1 (41h) || (13) || 50|| 50|| 50|| #666|| bgcolor=&amp;quot;#808080&amp;quot; | || White         || Weiß            || Blanc           || Blanco&lt;br /&gt;
|-&lt;br /&gt;
|  2 (42h) || 19   ||  0||100|| 50|| #0F6|| bgcolor=&amp;quot;#00ff80&amp;quot; | || Sea Green     || Seegrün         || Vert marin      || Verde marino&lt;br /&gt;
|-&lt;br /&gt;
|  3 (43h) || 25   ||100||100|| 50|| #FF6|| bgcolor=&amp;quot;#ffff80&amp;quot; | || Pastel Yellow || Pastellgelb     || Jaune pastel    || Amarillo pastel&lt;br /&gt;
|-&lt;br /&gt;
|  4 (44h) || 1    ||  0||  0|| 50|| #006|| bgcolor=&amp;quot;#000080&amp;quot; | || Blue          || Blau            || Bleu            || Azul&lt;br /&gt;
|-&lt;br /&gt;
|  5 (45h) || 7    ||100||  0|| 50|| #F06|| bgcolor=&amp;quot;#ff0080&amp;quot; | || Purple        || Purpur          || Pourpre         || Púrpura&lt;br /&gt;
|-&lt;br /&gt;
|  6 (46h) || 10   ||  0|| 50|| 50|| #066|| bgcolor=&amp;quot;#008080&amp;quot; | || Cyan          || Blaugrün        || Turquoise       || Ciano&lt;br /&gt;
|-&lt;br /&gt;
|  7 (47h) || 16   ||100|| 50|| 50|| #F66|| bgcolor=&amp;quot;#ff8080&amp;quot; | || Pink          || Rosa            || Rose            || Rosa&lt;br /&gt;
|-&lt;br /&gt;
|  8 (48h) || (7)  ||100||  0|| 50|| #F06|| bgcolor=&amp;quot;#ff0080&amp;quot; | || Purple        || Purpur          || Pourpre         || Púrpura&lt;br /&gt;
|-&lt;br /&gt;
|  9 (49h) || (25) ||100||100|| 50|| #FF6|| bgcolor=&amp;quot;#ffff80&amp;quot; | || Pastel Yellow || Pastellgelb     || Jaune pastel    || Amarillo pastel&lt;br /&gt;
|-&lt;br /&gt;
| 10 (4Ah) || 24   ||100||100||  0|| #FF0|| bgcolor=&amp;quot;#ffff00&amp;quot; | || Bright Yellow || Hellgelb        || Jaune vif       || Amarillo brillante&lt;br /&gt;
|-&lt;br /&gt;
| 11 (4Bh) || 26   ||100||100||100|| #FFF|| bgcolor=&amp;quot;#ffffff&amp;quot; | || Bright White  || Leuchtendweiß   || Blanc brillant  || Blanco brillante&lt;br /&gt;
|-&lt;br /&gt;
| 12 (4Ch) || 6    ||100||  0||  0|| #F00|| bgcolor=&amp;quot;#ff0000&amp;quot; | || Bright Red    || Hellrot         || Rouge vif       || Rojo brillante&lt;br /&gt;
|-&lt;br /&gt;
| 13 (4Dh) || 8    ||100||  0||100|| #F0F|| bgcolor=&amp;quot;#ff00ff&amp;quot; | || Bright Magenta|| helles Magenta  || Magenta vif     || Magenta brillante&lt;br /&gt;
|-&lt;br /&gt;
| 14 (4Eh) || 15   ||100|| 50||  0|| #F60|| bgcolor=&amp;quot;#ff8000&amp;quot; | || Orange        || Orange          || Orange          || Naranja&lt;br /&gt;
|-&lt;br /&gt;
| 15 (4Fh) || 17   ||100|| 50||100|| #F6F|| bgcolor=&amp;quot;#ff80ff&amp;quot; | || Pastel Magenta|| Pastell-magenta || Magenta pastel  || Magenta pastel&lt;br /&gt;
|-&lt;br /&gt;
| 16 (50h) || (1)  ||  0||  0|| 50|| #006|| bgcolor=&amp;quot;#000080&amp;quot; | || Blue          || Blau            || Bleu            || Azul&lt;br /&gt;
|-&lt;br /&gt;
| 17 (51h) || (19) ||  0||100|| 50|| #0F6|| bgcolor=&amp;quot;#00ff80&amp;quot; | || Sea Green     || Seegrün         || Vert marin      || Verde marino&lt;br /&gt;
|-&lt;br /&gt;
| 18 (52h) || 18   ||  0||100||  0|| #0F0|| bgcolor=&amp;quot;#00ff00&amp;quot; | || Bright Green  || Hellgrün        || Vert vif        || Verde brillante&lt;br /&gt;
|-&lt;br /&gt;
| 19 (53h) || 20   ||  0||100||100|| #0FF|| bgcolor=&amp;quot;#00ffff&amp;quot; | || Bright Cyan   || helles Blaugrün || Turquoise vif   || Ciano brillante&lt;br /&gt;
|-&lt;br /&gt;
| 20 (54h) || 0    ||  0||  0||  0|| #000|| bgcolor=&amp;quot;#000000&amp;quot; | || Black         || Schwarz         || Noir            || Negro&lt;br /&gt;
|-&lt;br /&gt;
| 21 (55h) || 2    ||  0||  0||100|| #00F|| bgcolor=&amp;quot;#0000ff&amp;quot; | || Bright Blue   || Hellblau        || Bleu vif        || Azul brillante&lt;br /&gt;
|-&lt;br /&gt;
| 22 (56h) || 9    ||  0|| 50||  0|| #060|| bgcolor=&amp;quot;#008000&amp;quot; | || Green         || Grün            || Vert            || Verde&lt;br /&gt;
|-&lt;br /&gt;
| 23 (57h) || 11   ||  0|| 50||100|| #06F|| bgcolor=&amp;quot;#0080ff&amp;quot; | || Sky Blue      || Himmelblau      || Bleu ciel       || Azul cielo&lt;br /&gt;
|-&lt;br /&gt;
| 24 (58h) || 4    || 50||  0|| 50|| #606|| bgcolor=&amp;quot;#800080&amp;quot; | || Magenta       || Magenta         || Magenta         || Magenta&lt;br /&gt;
|-&lt;br /&gt;
| 25 (59h) || 22   || 50||100|| 50|| #6F6|| bgcolor=&amp;quot;#80ff80&amp;quot; | || Pastel Green  || Pastellgrün     || Vert pastel     || Verde pastel&lt;br /&gt;
|-&lt;br /&gt;
| 26 (5Ah) || 21   || 50||100||  0|| #6F0|| bgcolor=&amp;quot;#80ff00&amp;quot; | || Lime          || Limonengrün     || Vert citron     || Verde lima&lt;br /&gt;
|-&lt;br /&gt;
| 27 (5Bh) || 23   || 50||100||100|| #6FF|| bgcolor=&amp;quot;#80ffff&amp;quot; | || Pastel Cyan   || Pastell-blaugrün|| Turquoise pastel|| Ciano pastel&lt;br /&gt;
|-&lt;br /&gt;
| 28 (5Ch) || 3    || 50||  0||  0|| #600|| bgcolor=&amp;quot;#800000&amp;quot; | || Red           || Rot             || Rouge           || Rojo&lt;br /&gt;
|-&lt;br /&gt;
| 29 (5Dh) || 5    || 50||  0||100|| #60F|| bgcolor=&amp;quot;#8000ff&amp;quot; | || Mauve         || Hellviolett     || Mauve           || Malva&lt;br /&gt;
|-&lt;br /&gt;
| 30 (5Eh) || 12   || 50|| 50||  0|| #660|| bgcolor=&amp;quot;#808000&amp;quot; | || Yellow        || Gelb            || Jaune           || Amarillo&lt;br /&gt;
|-&lt;br /&gt;
| 31 (5Fh) || 14   || 50|| 50||100|| #66F|| bgcolor=&amp;quot;#8080ff&amp;quot; | || Pastel Blue   || Pastellblau     || Bleu pastel     || Azul pastel&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Intensities ===&lt;br /&gt;
&lt;br /&gt;
The 0%, 50%, and 100% values in the above tables are &amp;quot;should-be&amp;quot; values. However, the real hardware doesn't exactly match that intensities. The actual intensities depend on the luminance mixing (R,G,B tied together via resistors), on chipset (classic CPC, or newer ASIC ones), and on the load applied by external hardware (Monitor, or TV set).&lt;br /&gt;
&lt;br /&gt;
On an actual Amstrad CPC, the half-intensity colour signal is measured to be closer to 40% rather than the expected 50%. This was verified by [[Grim]] and independently confirmed by [[Nocash]]. [https://www.grimware.org/doku.php/documentations/devices/gatearray#inkr Source]&lt;br /&gt;
* [[CPC Palette]] - some more details&lt;br /&gt;
&lt;br /&gt;
This explains why the Amstrad engineers used the following values to adapt the old colour palette to the new 12-bit palette on the Amstrad Plus:&lt;br /&gt;
* 0% became #0&lt;br /&gt;
* 50% became #6. They specifically chose #6 for the 50% value instead of the expected #7 or #8, to better match the real Amstrad CPC palette.&lt;br /&gt;
* 100% became #F&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Green Screen Colours ===&lt;br /&gt;
&lt;br /&gt;
On a green screen, where all colours are shades of unsaturated green, the firmware colours are in order of increasing intensity. Black is darkest green, bright white is brightest green, and firmware colour 13 is a medium green.&lt;br /&gt;
&lt;br /&gt;
The luminance (Y) is not exactly correlated to the actual luminance of colour images broadcast in RGB. Amstrad preferred to propose a completely different image system, not comparable to a conversion to monochrome, which would have limited the number of brightness levels to 21 (for example, colours 9 and 6 would have had the same luminance).&lt;br /&gt;
&lt;br /&gt;
They opted for a table of 27 linear brightness steps. They assigned values of 1 (1kΩ) for blue, 3 (3.3kΩ) for red, and 9 (10kΩ) for green.&lt;br /&gt;
&lt;br /&gt;
==== To calculate the luminance value ====&lt;br /&gt;
&lt;br /&gt;
'''Red''' &lt;br /&gt;
&lt;br /&gt;
*0% =&amp;amp;gt; do not add anything &lt;br /&gt;
*50% =&amp;amp;gt; add 3 &lt;br /&gt;
*100% =&amp;amp;gt; add 6 &lt;br /&gt;
&lt;br /&gt;
'''Green''' &lt;br /&gt;
&lt;br /&gt;
*0% =&amp;amp;gt; do not add anything &lt;br /&gt;
*50% =&amp;amp;gt; add 9 &lt;br /&gt;
*100% =&amp;amp;gt; add 18 &lt;br /&gt;
&lt;br /&gt;
'''Blue''' &lt;br /&gt;
&lt;br /&gt;
*0% =&amp;amp;gt; do not add anything &lt;br /&gt;
*50% =&amp;amp;gt; add 1 &lt;br /&gt;
*100% =&amp;amp;gt; add 2 &lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Pictures ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;gallery&amp;gt;&lt;br /&gt;
Image:40010_am2_metal.jpg|40010 GA Metal Layer&lt;br /&gt;
Image:40010_am2_acid.jpg|40010 GA with Metal Layer removed&lt;br /&gt;
Image:40226_am4_metal.jpg|40226 PreASIC Metal Layer&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[File:Ga.pinout.40007.png]] [[File:Ga.pinout.40008.40010.png]]&lt;br /&gt;
&lt;br /&gt;
Note: Some CPC motherboards can accommodate both types of Gate Array pinouts. [https://thecheshirec.at/2024/10/06/il-existe-une-carte-multi-gate-array-et-cest-amstrad-qui-la-faite/ Source]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== External links ==&lt;br /&gt;
*[https://bread80.com/2021/06/03/understanding-the-amstrad-cpc-video-ram-and-gate-array-subsystem/ Electronic signals analysis of the Gate Array by Bread80]&lt;br /&gt;
* [https://shaker.logonsystem.eu/ACCC1.8-EN.pdf Gate Array documentation in Amstrad CRTC Compendium]&lt;br /&gt;
* [https://www.grimware.org/doku.php/documentations/devices/gatearray Gate Array documentation from Grimware]&lt;br /&gt;
* [http://quasar.cpcscene.net/doku.php?id=assem:gate_array Quasar Gate Array documentation (in french)]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==See also==&lt;br /&gt;
&lt;br /&gt;
*[[Gate Array and ASIC Pin-Outs]]&lt;br /&gt;
*[[PAL16L8]] : for RAM arrangement&lt;br /&gt;
*[[ASIC]] : for Plus users&lt;br /&gt;
&lt;br /&gt;
*[[CRTC]] : the other video stuff&lt;br /&gt;
*[[Synchronising with the CRTC and display]] : technical details on the relationship between Gate Array and CRTC.&lt;br /&gt;
&lt;br /&gt;
*[[Video modes]] : for other informations on colours and pixels.&lt;br /&gt;
&lt;br /&gt;
*[[Media:40010-simplified V03.pdf]] [https://www.cpcwiki.eu/forum/amstrad-cpc-hardware/gate-array-decapped!/msg170713/#msg170713 Forum thread] Gate Array schematics - reverse engineered by Gerald&lt;br /&gt;
&lt;br /&gt;
[[Category:Hardware]][[Category:Programming]][[Category:Datasheet]][[Category:Graphic]][[Category:CPC Internal Components]][[Category:Electronic Component]]&lt;/div&gt;</summary>
		<author><name>Longshot</name></author>	</entry>

	<entry>
		<id>https://oldwiki.cpcwiki.eu/index.php?title=Gate_Array&amp;diff=126227</id>
		<title>Gate Array</title>
		<link rel="alternate" type="text/html" href="https://oldwiki.cpcwiki.eu/index.php?title=Gate_Array&amp;diff=126227"/>
				<updated>2025-05-21T18:07:06Z</updated>
		
		<summary type="html">&lt;p&gt;Longshot: Added information on citation issues&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[File:Amstrad 40007 Gate Array.png|right|thumb|Amstrad 40007 Gate Array]]&lt;br /&gt;
[[File:Amstrad 40010 Gate Array.png|right|thumb|Amstrad 40010 Gate Array]]&lt;br /&gt;
&lt;br /&gt;
Also designated as Video Gate Array (VGA, not to be confused with the IBM PC compatible graphic card spec).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Introduction  ==&lt;br /&gt;
&lt;br /&gt;
The Gate Array is a specially designed chip exclusively for use in the Amstrad CPC and was designed by Amstrad plc. &lt;br /&gt;
&lt;br /&gt;
In the CPC+ system, the functions of the Gate Array are integrated into a single [[ASIC|ASIC]]. When the ASIC is &amp;quot;locked&amp;quot;, the extra features are not available and the ASIC operates the same as the Gate Array in the CPC allowing programs written for the CPC to work on the Plus without modification. The ASIC must be &amp;quot;un-locked&amp;quot; to access the new features. &lt;br /&gt;
&lt;br /&gt;
In the [[KC Compact]] system, the functions of the Gate Array are &amp;quot;emulated&amp;quot; in TTL chips, [[CIO Overview|CIO]], and its color translation EPROM.&lt;br /&gt;
&lt;br /&gt;
In the &amp;quot;cost-down&amp;quot; version of the CPC6128, the functions of the Gate Array are integrated into an ASIC.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== What does it do? ==&lt;br /&gt;
&lt;br /&gt;
The Gate Array is responsible for the display (colour palette, resolution, horizontal and vertical sync), bus arbitration, DRAM refresh, interrupt generation and memory arrangement. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Bus arbitration ==&lt;br /&gt;
&lt;br /&gt;
The Gate Array arbitrates access to the RAM between the CPU and the video hardware (CRTC and Gate-Array).&lt;br /&gt;
&lt;br /&gt;
Every microsecond: &lt;br /&gt;
* The CRTC generates a memory address using it's MA and RA signal outputs. See the [[CRTC]] wiki page to know how the motherboard wiring transforms these signals into the Video Memory Address (VMA).&lt;br /&gt;
* The Gate Array fetches 2 bytes for each address. /CPU_ADDR is a 1MHz signal. So these 2 bytes are fetched sequentially. They are not interleaved with Z80 access. These bytes are fetched even when the border is on as this is required for DRAM refresh.&lt;br /&gt;
* The video hardware is given priority so that the display is not disrupted.&lt;br /&gt;
&lt;br /&gt;
The Gate-Array generates the &amp;quot;READY&amp;quot; signal which is connected to the &amp;quot;/WAIT&amp;quot; input signal of the CPU. This signal is used to stop the CPU accessing RAM while the video-hardware is accessing it.&lt;br /&gt;
&lt;br /&gt;
In fact, the Gate Array allows the Z80 to access the RAM in only 1 out of every 4 cycles. As a result, all instruction timings are stretched so that they are all multiples of a microsecond (1µs), and this gives an effective CPU clock of 3.3Mhz.&lt;br /&gt;
&lt;br /&gt;
Unlike the ZX Spectrum or the Amiga, where bus arbitration is restricted to the &amp;quot;contended memory&amp;quot; or &amp;quot;chip RAM&amp;quot;, on the CPC it also applies to ROM access and to RAM expansions. So the Z80 always runs at the same speed, regardless of the type of memory being accessed.&lt;br /&gt;
&lt;br /&gt;
Last but not least, bus arbitration also applies to I/O access. And memory access is not aligned with I/O access on Z80.&lt;br /&gt;
&lt;br /&gt;
Note: On Amstrad Plus, the ASIC also has to handle DMA instruction fetch from RAM.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== DRAM refresh ==&lt;br /&gt;
&lt;br /&gt;
On Amstrad CPC, the Gate Array is responsible for the DRAM refresh, instead of using the Z80 built-in DRAM refresh mechanism. The reason is that there can only be 3 DRAM accesses per microsecond on this architecture. Doing DRAM refresh on each M1 cycle as it is done on MSX would bog down the CPU speed on CPC given its bus arbitration scheme.&lt;br /&gt;
&lt;br /&gt;
The Z80 generates a maximum of one request per microsecond. The CPC also requires two memory accesses per microsecond for reading video data.&lt;br /&gt;
&lt;br /&gt;
The CPC specs 4164-20 DRAMs. These require 330nS for a read or write cycle. The CPC also uses the optimised sequential CAS cycles to read the two video data bytes in half a microsecond. [https://www.cpcwiki.eu/forum/amstrad-cpc-hardware/the-cpc-revision-zero-article/msg243769/ Source]&lt;br /&gt;
&lt;br /&gt;
The way to cause the RAM refresh to fail in both a Plus or normal CPC is simply to stop a few bits of the CRTC address changing (ie. never refresh the selected area).&lt;br /&gt;
&lt;br /&gt;
Generally, only the Row address needs to be cycled, so stopping MA0 through MA7 from changing, and stopping the CPU from reading those rows, will cause data to be lost, quite quickly (generally around 4ms). [https://www.cpcwiki.eu/forum/amstrad-cpc-hardware/memory-refresh-plus/ Source]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Interrupt generation ==&lt;br /&gt;
* '''This section relies largely on a single source and is suspected of infringing copyright protected under the [https://creativecommons.org/licenses/by-nc-nd/4.0/legalcode CC BY-NC-ND 4.0 license].''' Readers are encouraged to refer directly to the original source material for accurate information. &lt;br /&gt;
** ''Original source material under copyright: [https://shaker.logonsystem.eu/ACCC1.8-EN.pdf  The Amstrad CPC CRTC Compendium]''&lt;br /&gt;
** ''Author: Serge Querné (Longshot)''&lt;br /&gt;
&lt;br /&gt;
Interrupts on the CPC are created by the Gate Array based on settings from the CRTC. The Gate Array has an internal counter R52 (the R is for Raster) that counts from 0 to 51, incrementing after each HSYNC signal.&lt;br /&gt;
&lt;br /&gt;
On all CRTCs, R52 interrupts always start 1µs after the end of an HSYNC. But on CRTCs 3/4, HSYNCs occur 1µs later than on CRTCs 0/1/2. Which means that on CRTCs 3/4, interrupts start 1µs later than on CRTCs 0/1/2. This can be adjusted by using the CRTC register 3.&lt;br /&gt;
&lt;br /&gt;
R52 will return to 0 and the Gate Array will send an interrupt request on any of these conditions:&lt;br /&gt;
* When it exceeds 51&lt;br /&gt;
* By setting bit4 of the RMR register of the Gate Array to 1&lt;br /&gt;
* At the end of the 2nd HSYNC after the start of the VSYNC&lt;br /&gt;
&lt;br /&gt;
When the Gate Array sends an interrupt request:&lt;br /&gt;
*If the interrupts were authorized at the time of the request, then bit5 of R52 is cleared (but R52 was reset to 0 anyway) and the interrupt takes place&lt;br /&gt;
*If interrupts are not authorized, then the R52 counter continues to increment and the interrupt remains armed (the Gate Array then maintains its INT signal). When interrupts are enabled (using the EI instruction), bit5 of R52 is cleared and the interrupt takes place. This happens only '''after the instruction that follows EI''' as this Z80 instruction has a 1-instruction delay.&lt;br /&gt;
&lt;br /&gt;
[https://shaker.logonsystem.eu/ACCC1.8-EN.pdf Source]&lt;br /&gt;
&lt;br /&gt;
Note: On Amstrad Plus, the interrupt management system is seriously beefed up. See the [[ASIC]] wiki page.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== CSYNC signal ==&lt;br /&gt;
* '''This section relies largely on a single source and is suspected of infringing copyright protected under the [https://creativecommons.org/licenses/by-nc-nd/4.0/legalcode CC BY-NC-ND 4.0 license].''' Readers are encouraged to refer directly to the original source material for accurate information. &lt;br /&gt;
** ''Original source material under copyright: [https://shaker.logonsystem.eu/ACCC1.8-EN.pdf  The Amstrad CPC CRTC Compendium]''&lt;br /&gt;
** ''Author: Serge Querné (Longshot)''&lt;br /&gt;
&lt;br /&gt;
The HSYNC and VSYNC signals are received from the [[CRTC]]. These signals are then modified by the Gate Array to C-HSYNC and C-VSYNC and merged into a single CSYNC signal that will be sent to the display.&lt;br /&gt;
&lt;br /&gt;
When CRTC HSYNC is active, the Gate Array immediately outputs the palette colour black. If the HSYNC is set to 14 characters then black will be output for 14µs.&lt;br /&gt;
&lt;br /&gt;
If a graphics mode change is pending, the HSYNC pulse width needs to be at least 2µs for Gate Array to change the graphics mode.&lt;br /&gt;
&lt;br /&gt;
C-HSYNC begins 2µs after activation of the CRTC HSYNC and stays a maximum of 4µs (signal is cut short if HSYNC width is greater than 6).&lt;br /&gt;
&lt;br /&gt;
For example, if CRTC R2=46, and CRTC HSYNC width is 14 chars then C-HSYNC starts at 48 and lasts only until 51 included.&lt;br /&gt;
&lt;br /&gt;
On Gate Array, even if the duration of the CRTC VSYNC is reduced to 2 µseconds, the Gate Array will always output black for 26 lines with 4 lines of C-VSYNC to the monitor. While on ASIC/Pre-ASIC, the CRTC VSYNC must be active as long as the C-VSYNC signal is sent to the monitor.&lt;br /&gt;
&lt;br /&gt;
The Gate Array (and ASIC/Pre-ASIC) uses 2 internal counters to create its CSYNC signal:&lt;br /&gt;
* H06 counts the number of CRTC characters processed during an HSYNC. H06 is incremented by the Gate Array for each CRTC character when CRTC HSYNC is active. The Gate Array activates the C-HSYNC signal when H06 reaches 2, and changes its graphics mode if a change was pending. It deactivates this signal when H06 reaches 6.&lt;br /&gt;
* V26 counts the number of HSYNCs occuring during a VSYNC. V26 is incremented by the Gate Array when the CRTC signals an end of HSYNC. The Gate Array activates the C-VSYNC signal when V26 reaches 2 (and if VSYNC is active on ASIC/Pre-ASIC). It deactivates this signal when V26 reaches 6. After the 26th line has been processed, the Gate Array stops outputting the palette colour black.&lt;br /&gt;
&lt;br /&gt;
If CRTC VSYNC is activated again while V26 is still in progress, then V26 is reset to 0 and starts counting up again the HSYNC pulses.&lt;br /&gt;
&lt;br /&gt;
The HSYNC signal from the CRTC is 0 when inactive and 1 when active. Same for VSYNC.&lt;br /&gt;
&lt;br /&gt;
C-HSYNC and C-VSYNC are composited using the XNOR function. The resulting CSYNC signal produced by the Gate Array is 1 when inactive and 0 when active.&lt;br /&gt;
&lt;br /&gt;
On a CPC monitor, the CSYNC is rendered in &amp;quot;absolute black&amp;quot;. It is darker than the palette colour black output by the Gate Array. The electron beam is basically turned off. Turning up the brightness level won't make it any brighter.&lt;br /&gt;
&lt;br /&gt;
[https://shaker.logonsystem.eu/ACCC1.8-EN.pdf Source]&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Controlling the Gate Array  ==&lt;br /&gt;
&lt;br /&gt;
The gate array is controlled by I/O. The gate array is selected when bit 15 of the I/O port address is set to &amp;quot;0&amp;quot; and bit 14 of the I/O port address is set to &amp;quot;1&amp;quot;. The values of the other bits are ignored. However, to avoid conflict with other devices in the system, these bits should be set to &amp;quot;1&amp;quot;. &lt;br /&gt;
&lt;br /&gt;
The recommended I/O port address is &amp;amp;7Fxx. &lt;br /&gt;
&lt;br /&gt;
The Gate Array is not connected to the CPU's RD and WR pins, so it cannot detect the bus's I/O direction. If you execute an I/O read operation on the Gate Array I/O address, the Gate Array will read an unpredictable value from the databus which will be in high-impedance state. If the value is a valid Gate Array command, it will be executed, otherwise nothing will happen. [https://www.grimware.org/doku.php/documentations/devices/gatearraydo=export_xhtml Source]&lt;br /&gt;
&lt;br /&gt;
The function to be performed is selected by writing data to the Gate Array, the first bits of the data define the function selected (see table below). It is not possible to read from the Gate Array. &lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!colspan=4| 8bit command&lt;br /&gt;
!rowspan=2| Machine&lt;br /&gt;
!rowspan=2| Register&lt;br /&gt;
!rowspan=2| Description&lt;br /&gt;
!rowspan=2| Chip&lt;br /&gt;
|-&lt;br /&gt;
! 7&lt;br /&gt;
! 6&lt;br /&gt;
! 5&lt;br /&gt;
! 4..0&lt;br /&gt;
|-&lt;br /&gt;
| 0 || 0 || x || style=&amp;quot;text-align: center;&amp;quot; | n || All || PENR || Select a color register || Gate Array&lt;br /&gt;
|-&lt;br /&gt;
| 0 || 1 || x || style=&amp;quot;text-align: center;&amp;quot; | n || All || INKR || Change the value of the currently selected color register || Gate Array&lt;br /&gt;
|-&lt;br /&gt;
| 1 || 0 || 0 || style=&amp;quot;text-align: center;&amp;quot; | n || All || RMR || Control Interrupt counter, ROM mapping and Graphics mode || Gate Array&lt;br /&gt;
|-&lt;br /&gt;
| rowspan=&amp;quot;2&amp;quot;|1 || rowspan=&amp;quot;2&amp;quot;|0 || rowspan=&amp;quot;2&amp;quot;|1 || style=&amp;quot;text-align: center;&amp;quot; rowspan=&amp;quot;2&amp;quot; | n || All || RMR || ''Ghost register'' || Gate Array (CPC) or locked ASIC (Plus)&lt;br /&gt;
|-&lt;br /&gt;
| Plus || RMR2 || ASIC &amp;amp; Advanced ROM mapping || Unlocked ASIC&lt;br /&gt;
|-&lt;br /&gt;
| 1 || 1 ||colspan=2  style=&amp;quot;text-align: center;&amp;quot; | n || All || MMR || RAM memory mapping || PAL (only with 128KB or RAM expansion)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
The MMR register is not available in the Gate Array, but is performed by a device at the same I/O port address location.&lt;br /&gt;
&lt;br /&gt;
In the CPC464, CPC664 and KC compact, MMR is performed in an external memory expansion (e.g. Dk'Tronics 64K RAM Expansion), if this expansion is not present then MMR is not available.&lt;br /&gt;
&lt;br /&gt;
In the CPC6128, MMR is performed by a [[PAL16L8|PAL chip]] located on the main PCB, or an external memory expansion.&lt;br /&gt;
&lt;br /&gt;
In the 464+ and 6128+, MMR is performed by the ASIC or an external memory expansion. Please read the document on RAM management for more information.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Registers ==&lt;br /&gt;
&lt;br /&gt;
Note: The Plus palette capabilities are only accessible through the [[Default I/O Port Summary|ASIC I/O page]]. Registers PENR and INKR are not needed in that case.&lt;br /&gt;
&lt;br /&gt;
=== Register PENR (Select a color register) ===&lt;br /&gt;
&lt;br /&gt;
When bit 7 and bit 6 are set to &amp;quot;0&amp;quot;, the remaining bits determine which pen is to have its colour changed. When bit 4 is set to &amp;quot;0&amp;quot;, bits 3 to 0 define which pen is to be selected. When bit 4 is set to &amp;quot;1&amp;quot;, the value contained in bits 3-0 is ignored and the border is selected. &lt;br /&gt;
&lt;br /&gt;
The pen remains selected until another is chosen. &lt;br /&gt;
&lt;br /&gt;
Each mode has a fixed number of pens. Mode 0 has 16 pens, mode 1 has 4 pens and mode 2 has 2 pens. &lt;br /&gt;
&lt;br /&gt;
==== Summary  ====&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!Bit&lt;br /&gt;
!Value&lt;br /&gt;
!Function&lt;br /&gt;
|-&lt;br /&gt;
| 7 || 0 || rowspan=&amp;quot;2&amp;quot; | Gate Array PENR register&lt;br /&gt;
|-&lt;br /&gt;
| 6 || 0 &lt;br /&gt;
|-&lt;br /&gt;
| 5 || - || not used&lt;br /&gt;
|-&lt;br /&gt;
| 4 || 1 || Select border&lt;br /&gt;
|-&lt;br /&gt;
| 3 || x || rowspan=&amp;quot;4&amp;quot; | Ignored&lt;br /&gt;
|-&lt;br /&gt;
| 2 || x&lt;br /&gt;
|-&lt;br /&gt;
| 1 || x&lt;br /&gt;
|-&lt;br /&gt;
| 0 || x&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!Bit&lt;br /&gt;
!Value&lt;br /&gt;
!Function&lt;br /&gt;
|-&lt;br /&gt;
| 7 || 0 || rowspan=&amp;quot;2&amp;quot; | Gate Array PENR register&lt;br /&gt;
|-&lt;br /&gt;
| 6 || 0&lt;br /&gt;
|-&lt;br /&gt;
| 5 || - || not used&lt;br /&gt;
|-&lt;br /&gt;
| 4 || 0 || Select pen&lt;br /&gt;
|-&lt;br /&gt;
| 3 || x || rowspan=&amp;quot;4&amp;quot; | Pen number&lt;br /&gt;
|-&lt;br /&gt;
| 2 || x&lt;br /&gt;
|-&lt;br /&gt;
| 1 || x&lt;br /&gt;
|-&lt;br /&gt;
| 0 || x&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Register INKR (Change the value of the currently selected color register) ===&lt;br /&gt;
&lt;br /&gt;
Once the pen has been selected its colour can then be changed. Bits 4 to 0 specify the hardware colour number from the hardware colour palette. &lt;br /&gt;
&lt;br /&gt;
Even though there is provision for 32 colours, only 27 are possible. The remaining colours are duplicates of those already in the colour palette. &lt;br /&gt;
&lt;br /&gt;
==== Summary  ====&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!Bit&lt;br /&gt;
!Value&lt;br /&gt;
!Function&lt;br /&gt;
|-&lt;br /&gt;
| 7 || 0 || rowspan=&amp;quot;2&amp;quot; | Gate Array INKR register&lt;br /&gt;
|-&lt;br /&gt;
| 6 || 1&lt;br /&gt;
|-&lt;br /&gt;
| 5 || - || not used&lt;br /&gt;
|-&lt;br /&gt;
| 4 || x || rowspan=&amp;quot;5&amp;quot; | Colour number x&lt;br /&gt;
|-&lt;br /&gt;
| 3 || x &lt;br /&gt;
|-&lt;br /&gt;
| 2 || x &lt;br /&gt;
|-&lt;br /&gt;
| 1 || x&lt;br /&gt;
|-&lt;br /&gt;
| 0 || x&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Register RMR (Control Interrupt counter, ROM mapping and Graphics mode) ===&lt;br /&gt;
&lt;br /&gt;
This is a general purpose register responsible for the [[Video modes|graphics mode]] and the ROM configuration. &lt;br /&gt;
&lt;br /&gt;
==== Graphics mode selection  ====&lt;br /&gt;
&lt;br /&gt;
The function of bits 1 and 0 is to define the screen mode. The settings for bits 1 and 0 and the corresponding screen mode are given in the table below. &lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!Bit 1&lt;br /&gt;
!Bit 0&lt;br /&gt;
!Screen mode&lt;br /&gt;
|-&lt;br /&gt;
| 0 || 0 || Mode 0, 160x200 resolution, 16 colours&lt;br /&gt;
|-&lt;br /&gt;
| 0 || 1 || Mode 1, 320x200 resolution, 4 colours&lt;br /&gt;
|-&lt;br /&gt;
| 1 || 0 || Mode 2, 640x200 resolution, 2 colours&lt;br /&gt;
|-&lt;br /&gt;
| 1 || 1 || Mode 3, 160x200 resolution, 4 colours (undocumented)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
* Mode 3 is not official. From the combinations possible, we can see that 4 modes can be defined, although the Amstrad only has 3. Mode 3 is similar to mode 0, because it has the same resolution, but it is limited to only 4 colours. Mode 3 is not supported by the [[KC Compact]] (which outputs black in Mode 3).&lt;br /&gt;
&lt;br /&gt;
Mode changing is synchronised with HSYNC. If the mode is changed, it will take effect from the next HSYNC.&lt;br /&gt;
&lt;br /&gt;
==== ROM configuration selection  ====&lt;br /&gt;
&lt;br /&gt;
Bit 2 is used to enable or disable the lower ROM area. The lower ROM area occupies memory addresses &amp;amp;amp;0000-&amp;amp;amp;3fff and is used to access the operating system ROM. When the lower ROM area is is enabled, reading from &amp;amp;amp;0000-&amp;amp;amp;3FFF will return data in the ROM. When a value is written to &amp;amp;amp;0000-&amp;amp;amp;3FFF, it will be written to the RAM underneath the ROM. When it is disabled, data read from &amp;amp;amp;0000-&amp;amp;amp;3FFF will return the data in the RAM. &lt;br /&gt;
&lt;br /&gt;
Similarly, bit 3 controls enabling or disabling of the upper ROM area. The upper ROM area occupies memory addressess &amp;amp;amp;C000-&amp;amp;amp;FFFF and is BASIC or any expansion ROMs which may be plugged into a ROM board/box. See the document on [[Upper ROM Bank Number|upper rom selection]] for more details. When the upper ROM area enabled, reading from &amp;amp;amp;c000-&amp;amp;amp;ffff, will return data in the ROM. When data is written to &amp;amp;amp;c000-&amp;amp;amp;FFFF, it will be written to the RAM at the same address as the ROM. When the upper ROM area is disabled, and data is read from &amp;amp;amp;c000-&amp;amp;amp;ffff it will be the data in the RAM. &lt;br /&gt;
&lt;br /&gt;
Bit 4 controls the interrupt generation. It can be used to delay interrupts. See the document on interrupt generation for more information.&lt;br /&gt;
&lt;br /&gt;
==== Summary  ====&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!Bit&lt;br /&gt;
!Value&lt;br /&gt;
!Function&lt;br /&gt;
|-&lt;br /&gt;
| 7 || 1 || rowspan=&amp;quot;2&amp;quot; | Gate Array RMR register&lt;br /&gt;
|-&lt;br /&gt;
| 6 || 0 &lt;br /&gt;
|-&lt;br /&gt;
| 5 || - || ''must be 0 on Plus machines with ASIC unlocked''&lt;br /&gt;
|-&lt;br /&gt;
| 4 || x || Interrupt generation control&lt;br /&gt;
|-&lt;br /&gt;
| 3 || x || 1=Upper ROM area disable, 0=Upper ROM area enable&lt;br /&gt;
|-&lt;br /&gt;
| 2 || x || 1=Lower ROM area disable, 0=Lower ROM area enable&lt;br /&gt;
|-&lt;br /&gt;
| 1 || x || rowspan=&amp;quot;2&amp;quot; | Graphics Mode selection&lt;br /&gt;
|-&lt;br /&gt;
| 0 || x&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Register RMR2 (ASIC &amp;amp; Advanced ROM mapping) ===&lt;br /&gt;
&lt;br /&gt;
This register exists only in Plus or GX4000, and is only accessible when the ASIC is unlocked.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!Bit&lt;br /&gt;
!Value&lt;br /&gt;
!Function&lt;br /&gt;
|-&lt;br /&gt;
| 7 || 1 || rowspan=&amp;quot;3&amp;quot; | Gate Array RMR2 register&lt;br /&gt;
|-&lt;br /&gt;
| 6 || 0&lt;br /&gt;
|-&lt;br /&gt;
| 5 || 1&lt;br /&gt;
|-&lt;br /&gt;
| 4 || x || rowspan=&amp;quot;2&amp;quot; |RMR addressing mode&lt;br /&gt;
|-&lt;br /&gt;
| 3 || x&lt;br /&gt;
|-&lt;br /&gt;
| 2 || x || rowspan=&amp;quot;3&amp;quot; | Physical ROM number (0..7)&lt;br /&gt;
|-&lt;br /&gt;
| 1 || x&lt;br /&gt;
|-&lt;br /&gt;
| 0 || x&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ RMR addressing modes&lt;br /&gt;
!Bit 4&lt;br /&gt;
!Bit 3&lt;br /&gt;
!Lower ROM&lt;br /&gt;
![[ASIC|ASIC I/O page]]&lt;br /&gt;
|-&lt;br /&gt;
|0&lt;br /&gt;
|0&lt;br /&gt;
|&amp;amp;0000-&amp;amp;3FFF&lt;br /&gt;
|Disabled&lt;br /&gt;
|-&lt;br /&gt;
|0&lt;br /&gt;
|1&lt;br /&gt;
|&amp;amp;4000-&amp;amp;7FFF&lt;br /&gt;
|Disabled&lt;br /&gt;
|-&lt;br /&gt;
|1&lt;br /&gt;
|0&lt;br /&gt;
|&amp;amp;8000-&amp;amp;BFFF&lt;br /&gt;
|Disabled&lt;br /&gt;
|-&lt;br /&gt;
|1&lt;br /&gt;
|1&lt;br /&gt;
|&amp;amp;0000-&amp;amp;3FFF&lt;br /&gt;
|&amp;amp;4000-&amp;amp;7FFF&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
The physical ROMs are also accessible as upper ROMs by using the [[Upper ROM Bank Number]] port and the RMR register.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Register MMR (RAM memory mapping) ===&lt;br /&gt;
&lt;br /&gt;
This register exists only in CPCs with 128K RAM (like the CPC 6128), or CPCs equipped with [[Standard Memory Expansions]].&lt;br /&gt;
&lt;br /&gt;
Note: In the CPC 6128, the register is a separate [[PAL16L8|PAL chip]] that assists the Gate Array chip.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!Bit&lt;br /&gt;
!Value&lt;br /&gt;
!Function&lt;br /&gt;
|-&lt;br /&gt;
| 7 || 1 || rowspan=&amp;quot;2&amp;quot; | Gate Array MMR register&lt;br /&gt;
|-&lt;br /&gt;
| 6 || 1 &lt;br /&gt;
|-&lt;br /&gt;
| 5 || x || rowspan=&amp;quot;3&amp;quot; |64K bank number (0..7); always 0 on an unexpanded CPC6128, 0-7 on [[Standard Memory Expansions]]&lt;br /&gt;
|-&lt;br /&gt;
| 4 || x&lt;br /&gt;
|-&lt;br /&gt;
| 3 || x&lt;br /&gt;
|-&lt;br /&gt;
| 2 || x || rowspan=&amp;quot;3&amp;quot; | RAM Config (0..7)&lt;br /&gt;
|-&lt;br /&gt;
| 1 || x&lt;br /&gt;
|-&lt;br /&gt;
| 0 || x&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
The 3bit RAM Config value is used to access the second 64K of the total 128K RAM that is built into the CPC 6128 or the additional 64K-512K of standard memory expansions. These contain up to eight 64K ram banks, which are selected with bit 3-5. A standard CPC 6128 only contains bank 0. Normally the register is set to 0, so that only the first 64K RAM are used (identical to the CPC 464 and 664 models). The register can be used to select between the following eight predefined configurations only:&lt;br /&gt;
&lt;br /&gt;
  -Address-     0      1      2      3      4      5      6      7&lt;br /&gt;
  0000-3FFF   RAM_0  RAM_0  '''RAM_4'''  RAM_0  RAM_0  RAM_0  RAM_0  RAM_0&lt;br /&gt;
  4000-7FFF   RAM_1  RAM_1  '''RAM_5'''  '''RAM_3'''  '''RAM_4'''  '''RAM_5'''  '''RAM_6'''  '''RAM_7'''&lt;br /&gt;
  8000-BFFF   RAM_2  RAM_2  '''RAM_6'''  RAM_2  RAM_2  RAM_2  RAM_2  RAM_2&lt;br /&gt;
  C000-FFFF   RAM_3  '''RAM_7'''  '''RAM_7'''  '''RAM_7'''  RAM_3  RAM_3  RAM_3  RAM_3&lt;br /&gt;
&lt;br /&gt;
The Video RAM is always located in the first 64K, VRAM is in no way affected by this register.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Programming the Gate Array - Examples  ==&lt;br /&gt;
&lt;br /&gt;
Defining the colours, &amp;lt;br&amp;gt;Setting pen 0 to Bright White. &lt;br /&gt;
&amp;lt;pre&amp;gt;LD BC,7F00&amp;amp;nbsp;;Gate Array port&lt;br /&gt;
LD A,%00000000+0&amp;amp;nbsp;;Pen number (and Gate Array function)&lt;br /&gt;
OUT (C),A&amp;amp;nbsp;;Send pen number&lt;br /&gt;
LD A,%01000000+11&amp;amp;nbsp;;Pen colour (and Gate Array function)&lt;br /&gt;
OUT (C),A&amp;amp;nbsp;;Send it&lt;br /&gt;
RET&lt;br /&gt;
&lt;br /&gt;
Setting the mode and ROM configuration, &lt;br /&gt;
Mode 2, upper and lower ROM disabled.&lt;br /&gt;
&lt;br /&gt;
LD BC,7F00&amp;amp;nbsp;;Gate array port&lt;br /&gt;
LD A,%10000000+%00001110&amp;amp;nbsp;;Mode and ROM selection (and Gate Array function)&lt;br /&gt;
OUT (C),A&amp;amp;nbsp;;Send it&lt;br /&gt;
RET&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Misc ===&lt;br /&gt;
&lt;br /&gt;
The hardware colour number is different to the colour range used by the firmware, so a conversion chart is provided for the corresponding firmware/hardware colour values and the corresponding colour name. &lt;br /&gt;
&lt;br /&gt;
=== Note ===&lt;br /&gt;
&lt;br /&gt;
The firmware keeps track of the colours it is using. Every VSYNC (assuming interrupts are enabled) the firmware sets the colours. This enables the user to have flashing colours. If the user selects a new colour using the gate array, the new colour will flash temporarily and then return to its original colour. This is due to the firmware resetting the colour. When using the firmware, use its routines to select the colour, and the colour will remain.&lt;br /&gt;
&lt;br /&gt;
Example: [For whatever reason, this example does NOT refer to the above firmware stuff]&lt;br /&gt;
&amp;lt;pre&amp;gt;ld bc,7f00+1&amp;amp;nbsp;;Gate array function (set pen)&lt;br /&gt;
;and pen number&lt;br /&gt;
out (c),c&lt;br /&gt;
ld bc,7f00&amp;amp;nbsp;;41 &lt;br /&gt;
;Gate array function (set colour)&lt;br /&gt;
;and colour number&lt;br /&gt;
out (c),c&lt;br /&gt;
ret&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Video memory structure ==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!rowspan=2|Graphics Mode&lt;br /&gt;
!colspan=8|VRAM byte&lt;br /&gt;
!colspan=8|Displayed Pixels&lt;br /&gt;
!rowspan=2|Definition&lt;br /&gt;
!rowspan=2|Pixel clock&lt;br /&gt;
!rowspan=2|Default resolution&lt;br /&gt;
|-&lt;br /&gt;
!7&lt;br /&gt;
!6&lt;br /&gt;
!5&lt;br /&gt;
!4&lt;br /&gt;
!3&lt;br /&gt;
!2&lt;br /&gt;
!1&lt;br /&gt;
!0&lt;br /&gt;
!1&lt;br /&gt;
!2&lt;br /&gt;
!3&lt;br /&gt;
!4&lt;br /&gt;
!5&lt;br /&gt;
!6&lt;br /&gt;
!7&lt;br /&gt;
!8&lt;br /&gt;
|-&lt;br /&gt;
|0&lt;br /&gt;
|A0&lt;br /&gt;
|B0&lt;br /&gt;
|A2&lt;br /&gt;
|B2&lt;br /&gt;
|A1&lt;br /&gt;
|B1&lt;br /&gt;
|A3&lt;br /&gt;
|B3&lt;br /&gt;
|colspan=4 style=&amp;quot;text-align: center;&amp;quot;|A&lt;br /&gt;
|colspan=4 style=&amp;quot;text-align: center;&amp;quot;|B&lt;br /&gt;
|2 pixels in 16 colours&lt;br /&gt;
|4 MHz&lt;br /&gt;
|160x200, 20-column text&lt;br /&gt;
|-&lt;br /&gt;
|1&lt;br /&gt;
|A0&lt;br /&gt;
|B0&lt;br /&gt;
|C0&lt;br /&gt;
|D0&lt;br /&gt;
|A1&lt;br /&gt;
|B1&lt;br /&gt;
|C1&lt;br /&gt;
|D1&lt;br /&gt;
|colspan=2 style=&amp;quot;text-align: center;&amp;quot;|A&lt;br /&gt;
|colspan=2 style=&amp;quot;text-align: center;&amp;quot;|B&lt;br /&gt;
|colspan=2 style=&amp;quot;text-align: center;&amp;quot;|C&lt;br /&gt;
|colspan=2 style=&amp;quot;text-align: center;&amp;quot;|D&lt;br /&gt;
|4 pixels in 4 colours&lt;br /&gt;
|8 MHz&lt;br /&gt;
|320x200, 40-column text&lt;br /&gt;
|-&lt;br /&gt;
|2&lt;br /&gt;
|A0&lt;br /&gt;
|B0&lt;br /&gt;
|C0&lt;br /&gt;
|D0&lt;br /&gt;
|E0&lt;br /&gt;
|F0&lt;br /&gt;
|G0&lt;br /&gt;
|H0&lt;br /&gt;
|A&lt;br /&gt;
|B&lt;br /&gt;
|C&lt;br /&gt;
|D&lt;br /&gt;
|E&lt;br /&gt;
|F&lt;br /&gt;
|G&lt;br /&gt;
|H&lt;br /&gt;
|8 pixels in 2 colours&lt;br /&gt;
|16 MHz&lt;br /&gt;
|640x200, 80-column text&lt;br /&gt;
|-&lt;br /&gt;
|3&lt;br /&gt;
|A0&lt;br /&gt;
|B0&lt;br /&gt;
|x&lt;br /&gt;
|x&lt;br /&gt;
|A1&lt;br /&gt;
|B1&lt;br /&gt;
|x&lt;br /&gt;
|x&lt;br /&gt;
|colspan=4 style=&amp;quot;text-align: center;&amp;quot;|A&lt;br /&gt;
|colspan=4 style=&amp;quot;text-align: center;&amp;quot;|B&lt;br /&gt;
|2 pixels in 4 colours&lt;br /&gt;
|4 MHz&lt;br /&gt;
|160x200, 20-column text&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Split rasters ==&lt;br /&gt;
&lt;br /&gt;
On the CPC, split rasters occur halfway (after the 8th mode2 pixel) through the rendering of a CRTC character.&lt;br /&gt;
&lt;br /&gt;
On Amstrad Plus, split rasters occur quarter of the way (after the 4th mode2 pixel) through the rendering of a CRTC character.&lt;br /&gt;
&lt;br /&gt;
To easily make split rasters compatible with both the CPC and the Plus machines, one can use the ASIC soft-scroll control register (SSCR) to finely adjust the horizontal position of the graphics.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Palette R,G,B definitions ==&lt;br /&gt;
&lt;br /&gt;
There are 27 colours which are generated from red, green and blue mixed in different quantities. There are 3 levels of red, 3 levels of green and 3 levels of blue, and these can be thought of as off/no colour, half-on/half-colour, and on/full-colour. &lt;br /&gt;
&lt;br /&gt;
To display a CPC image you will need to use a analogue monitor with a composite sync.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Palette sorted by Firmware Colour Numbers ===&lt;br /&gt;
&lt;br /&gt;
The firmware colour palette is sorted by luminance value.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
|-&lt;br /&gt;
!Firmware Number&lt;br /&gt;
!Hardware Number&lt;br /&gt;
!Colour Name&lt;br /&gt;
!R %&lt;br /&gt;
!G %&lt;br /&gt;
!B %&lt;br /&gt;
!ASIC&lt;br /&gt;
!Colour&lt;br /&gt;
|-&lt;br /&gt;
| 0|| 54h          ||Black          ||  0||  0||  0|| #000||bgcolor=&amp;quot;#000000&amp;quot;|&lt;br /&gt;
|-&lt;br /&gt;
| 1|| 44h (or 50h) ||Blue           ||  0||  0|| 50|| #006||bgcolor=&amp;quot;#000080&amp;quot;|&lt;br /&gt;
|-&lt;br /&gt;
| 2|| 55h          ||Bright Blue    ||  0||  0||100|| #00F||bgcolor=&amp;quot;#0000ff&amp;quot;|&lt;br /&gt;
|-&lt;br /&gt;
| 3|| 5Ch          ||Red            || 50||  0||  0|| #600||bgcolor=&amp;quot;#800000&amp;quot;|&lt;br /&gt;
|-&lt;br /&gt;
| 4|| 58h          ||Magenta        || 50||  0|| 50|| #606||bgcolor=&amp;quot;#800080&amp;quot;|&lt;br /&gt;
|-&lt;br /&gt;
| 5|| 5Dh          ||Mauve          || 50||  0||100|| #60F||bgcolor=&amp;quot;#8000ff&amp;quot;|&lt;br /&gt;
|-&lt;br /&gt;
| 6|| 4Ch          ||Bright Red     ||100||  0||  0|| #F00||bgcolor=&amp;quot;#ff0000&amp;quot;|&lt;br /&gt;
|-&lt;br /&gt;
| 7|| 45h (or 48h) ||Purple         ||100||  0|| 50|| #F06||bgcolor=&amp;quot;#ff0080&amp;quot;|&lt;br /&gt;
|-&lt;br /&gt;
| 8|| 4Dh          ||Bright Magenta ||100||  0||100|| #F0F||bgcolor=&amp;quot;#ff00ff&amp;quot;|&lt;br /&gt;
|-&lt;br /&gt;
| 9|| 56h          ||Green          ||  0|| 50||  0|| #060||bgcolor=&amp;quot;#008000&amp;quot;|&lt;br /&gt;
|-&lt;br /&gt;
|10|| 46h          ||Cyan           ||  0|| 50|| 50|| #066||bgcolor=&amp;quot;#008080&amp;quot;|&lt;br /&gt;
|-&lt;br /&gt;
|11|| 57h          ||Sky Blue       ||  0|| 50||100|| #06F||bgcolor=&amp;quot;#0080ff&amp;quot;|&lt;br /&gt;
|-&lt;br /&gt;
|12|| 5Eh          ||Yellow         || 50|| 50||  0|| #660||bgcolor=&amp;quot;#808000&amp;quot;|&lt;br /&gt;
|-&lt;br /&gt;
|13|| 40h (or 41h) ||White          || 50|| 50|| 50||#666||bgcolor=&amp;quot;#808080&amp;quot;|&lt;br /&gt;
|-&lt;br /&gt;
|14|| 5Fh          ||Pastel Blue    || 50|| 50||100|| #66F||bgcolor=&amp;quot;#8080ff&amp;quot;|&lt;br /&gt;
|-&lt;br /&gt;
|15|| 4Eh          ||Orange         ||100|| 50||  0|| #F60|| bgcolor=&amp;quot;#ff8000&amp;quot;|&lt;br /&gt;
|-&lt;br /&gt;
|16|| 47h          ||Pink           ||100|| 50|| 50|| #F66||bgcolor=&amp;quot;#ff8080&amp;quot;|&lt;br /&gt;
|-&lt;br /&gt;
|17|| 4Fh          ||Pastel Magenta ||100|| 50||100|| #F6F||bgcolor=&amp;quot;#ff80ff&amp;quot;|&lt;br /&gt;
|-&lt;br /&gt;
|18|| 52h          ||Bright Green   ||  0||100||  0|| #0F0||bgcolor=&amp;quot;#00ff00&amp;quot;|&lt;br /&gt;
|-&lt;br /&gt;
|19|| 42h (or 51h) ||Sea Green      ||  0||100|| 50|| #0F6||bgcolor=&amp;quot;#00ff80&amp;quot;|&lt;br /&gt;
|-&lt;br /&gt;
|20|| 53h          ||Bright Cyan    ||  0||100||100|| #0FF||bgcolor=&amp;quot;#00ffff&amp;quot;|&lt;br /&gt;
|-&lt;br /&gt;
|21|| 5Ah          ||Lime           || 50||100||  0|| #6F0||bgcolor=&amp;quot;#80ff00&amp;quot;|&lt;br /&gt;
|-&lt;br /&gt;
|22|| 59h          ||Pastel Green   || 50||100|| 50|| #6F6||bgcolor=&amp;quot;#80ff80&amp;quot;|&lt;br /&gt;
|-&lt;br /&gt;
|23|| 5Bh          ||Pastel Cyan    || 50||100||100|| #6FF||bgcolor=&amp;quot;#80ffff&amp;quot;|&lt;br /&gt;
|-&lt;br /&gt;
|24|| 4Ah          ||Bright Yellow  ||100||100||  0|| #FF0||bgcolor=&amp;quot;#ffff00&amp;quot;|&lt;br /&gt;
|-&lt;br /&gt;
|25|| 43h (or 49h) ||Pastel Yellow  ||100||100|| 50||#FF6||bgcolor=&amp;quot;#ffff80&amp;quot;|&lt;br /&gt;
|-&lt;br /&gt;
|26|| 4Bh          ||Bright White   ||100||100||100|| #FFF||bgcolor=&amp;quot;#ffffff&amp;quot;|&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Note: We can observe that the official Amstrad names of some colours are a bit silly: &amp;quot;red&amp;quot; is in fact brown, &amp;quot;yellow&amp;quot; is in fact khaki and &amp;quot;white&amp;quot; is in fact grey.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Amstrad Colour Names ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;gallery&amp;gt;&lt;br /&gt;
Cpc 6128 master colour chat.jpg|Master colour chart&lt;br /&gt;
Cpc 6128 farbtabelle.jpg|Farbtabelle&lt;br /&gt;
Cpc 6128 palette des couleurs.jpg|Palette des couleurs&lt;br /&gt;
Cpc 6128 tabla de colores.jpg|Tabla de colores&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Palette sorted by Hardware Colour Numbers ===&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!Hardware Number&lt;br /&gt;
!Firmware Number&lt;br /&gt;
!R %&lt;br /&gt;
!G %&lt;br /&gt;
!B %&lt;br /&gt;
!ASIC&lt;br /&gt;
!Colour&lt;br /&gt;
!Colour Name&lt;br /&gt;
!German Name&lt;br /&gt;
!French Name&lt;br /&gt;
!Spanish Name&lt;br /&gt;
|-&lt;br /&gt;
|  0 (40h) || 13   || 50|| 50|| 50|| #666|| bgcolor=&amp;quot;#808080&amp;quot; | || White         || Weiß            || Blanc           || Blanco&lt;br /&gt;
|-&lt;br /&gt;
|  1 (41h) || (13) || 50|| 50|| 50|| #666|| bgcolor=&amp;quot;#808080&amp;quot; | || White         || Weiß            || Blanc           || Blanco&lt;br /&gt;
|-&lt;br /&gt;
|  2 (42h) || 19   ||  0||100|| 50|| #0F6|| bgcolor=&amp;quot;#00ff80&amp;quot; | || Sea Green     || Seegrün         || Vert marin      || Verde marino&lt;br /&gt;
|-&lt;br /&gt;
|  3 (43h) || 25   ||100||100|| 50|| #FF6|| bgcolor=&amp;quot;#ffff80&amp;quot; | || Pastel Yellow || Pastellgelb     || Jaune pastel    || Amarillo pastel&lt;br /&gt;
|-&lt;br /&gt;
|  4 (44h) || 1    ||  0||  0|| 50|| #006|| bgcolor=&amp;quot;#000080&amp;quot; | || Blue          || Blau            || Bleu            || Azul&lt;br /&gt;
|-&lt;br /&gt;
|  5 (45h) || 7    ||100||  0|| 50|| #F06|| bgcolor=&amp;quot;#ff0080&amp;quot; | || Purple        || Purpur          || Pourpre         || Púrpura&lt;br /&gt;
|-&lt;br /&gt;
|  6 (46h) || 10   ||  0|| 50|| 50|| #066|| bgcolor=&amp;quot;#008080&amp;quot; | || Cyan          || Blaugrün        || Turquoise       || Ciano&lt;br /&gt;
|-&lt;br /&gt;
|  7 (47h) || 16   ||100|| 50|| 50|| #F66|| bgcolor=&amp;quot;#ff8080&amp;quot; | || Pink          || Rosa            || Rose            || Rosa&lt;br /&gt;
|-&lt;br /&gt;
|  8 (48h) || (7)  ||100||  0|| 50|| #F06|| bgcolor=&amp;quot;#ff0080&amp;quot; | || Purple        || Purpur          || Pourpre         || Púrpura&lt;br /&gt;
|-&lt;br /&gt;
|  9 (49h) || (25) ||100||100|| 50|| #FF6|| bgcolor=&amp;quot;#ffff80&amp;quot; | || Pastel Yellow || Pastellgelb     || Jaune pastel    || Amarillo pastel&lt;br /&gt;
|-&lt;br /&gt;
| 10 (4Ah) || 24   ||100||100||  0|| #FF0|| bgcolor=&amp;quot;#ffff00&amp;quot; | || Bright Yellow || Hellgelb        || Jaune vif       || Amarillo brillante&lt;br /&gt;
|-&lt;br /&gt;
| 11 (4Bh) || 26   ||100||100||100|| #FFF|| bgcolor=&amp;quot;#ffffff&amp;quot; | || Bright White  || Leuchtendweiß   || Blanc brillant  || Blanco brillante&lt;br /&gt;
|-&lt;br /&gt;
| 12 (4Ch) || 6    ||100||  0||  0|| #F00|| bgcolor=&amp;quot;#ff0000&amp;quot; | || Bright Red    || Hellrot         || Rouge vif       || Rojo brillante&lt;br /&gt;
|-&lt;br /&gt;
| 13 (4Dh) || 8    ||100||  0||100|| #F0F|| bgcolor=&amp;quot;#ff00ff&amp;quot; | || Bright Magenta|| helles Magenta  || Magenta vif     || Magenta brillante&lt;br /&gt;
|-&lt;br /&gt;
| 14 (4Eh) || 15   ||100|| 50||  0|| #F60|| bgcolor=&amp;quot;#ff8000&amp;quot; | || Orange        || Orange          || Orange          || Naranja&lt;br /&gt;
|-&lt;br /&gt;
| 15 (4Fh) || 17   ||100|| 50||100|| #F6F|| bgcolor=&amp;quot;#ff80ff&amp;quot; | || Pastel Magenta|| Pastell-magenta || Magenta pastel  || Magenta pastel&lt;br /&gt;
|-&lt;br /&gt;
| 16 (50h) || (1)  ||  0||  0|| 50|| #006|| bgcolor=&amp;quot;#000080&amp;quot; | || Blue          || Blau            || Bleu            || Azul&lt;br /&gt;
|-&lt;br /&gt;
| 17 (51h) || (19) ||  0||100|| 50|| #0F6|| bgcolor=&amp;quot;#00ff80&amp;quot; | || Sea Green     || Seegrün         || Vert marin      || Verde marino&lt;br /&gt;
|-&lt;br /&gt;
| 18 (52h) || 18   ||  0||100||  0|| #0F0|| bgcolor=&amp;quot;#00ff00&amp;quot; | || Bright Green  || Hellgrün        || Vert vif        || Verde brillante&lt;br /&gt;
|-&lt;br /&gt;
| 19 (53h) || 20   ||  0||100||100|| #0FF|| bgcolor=&amp;quot;#00ffff&amp;quot; | || Bright Cyan   || helles Blaugrün || Turquoise vif   || Ciano brillante&lt;br /&gt;
|-&lt;br /&gt;
| 20 (54h) || 0    ||  0||  0||  0|| #000|| bgcolor=&amp;quot;#000000&amp;quot; | || Black         || Schwarz         || Noir            || Negro&lt;br /&gt;
|-&lt;br /&gt;
| 21 (55h) || 2    ||  0||  0||100|| #00F|| bgcolor=&amp;quot;#0000ff&amp;quot; | || Bright Blue   || Hellblau        || Bleu vif        || Azul brillante&lt;br /&gt;
|-&lt;br /&gt;
| 22 (56h) || 9    ||  0|| 50||  0|| #060|| bgcolor=&amp;quot;#008000&amp;quot; | || Green         || Grün            || Vert            || Verde&lt;br /&gt;
|-&lt;br /&gt;
| 23 (57h) || 11   ||  0|| 50||100|| #06F|| bgcolor=&amp;quot;#0080ff&amp;quot; | || Sky Blue      || Himmelblau      || Bleu ciel       || Azul cielo&lt;br /&gt;
|-&lt;br /&gt;
| 24 (58h) || 4    || 50||  0|| 50|| #606|| bgcolor=&amp;quot;#800080&amp;quot; | || Magenta       || Magenta         || Magenta         || Magenta&lt;br /&gt;
|-&lt;br /&gt;
| 25 (59h) || 22   || 50||100|| 50|| #6F6|| bgcolor=&amp;quot;#80ff80&amp;quot; | || Pastel Green  || Pastellgrün     || Vert pastel     || Verde pastel&lt;br /&gt;
|-&lt;br /&gt;
| 26 (5Ah) || 21   || 50||100||  0|| #6F0|| bgcolor=&amp;quot;#80ff00&amp;quot; | || Lime          || Limonengrün     || Vert citron     || Verde lima&lt;br /&gt;
|-&lt;br /&gt;
| 27 (5Bh) || 23   || 50||100||100|| #6FF|| bgcolor=&amp;quot;#80ffff&amp;quot; | || Pastel Cyan   || Pastell-blaugrün|| Turquoise pastel|| Ciano pastel&lt;br /&gt;
|-&lt;br /&gt;
| 28 (5Ch) || 3    || 50||  0||  0|| #600|| bgcolor=&amp;quot;#800000&amp;quot; | || Red           || Rot             || Rouge           || Rojo&lt;br /&gt;
|-&lt;br /&gt;
| 29 (5Dh) || 5    || 50||  0||100|| #60F|| bgcolor=&amp;quot;#8000ff&amp;quot; | || Mauve         || Hellviolett     || Mauve           || Malva&lt;br /&gt;
|-&lt;br /&gt;
| 30 (5Eh) || 12   || 50|| 50||  0|| #660|| bgcolor=&amp;quot;#808000&amp;quot; | || Yellow        || Gelb            || Jaune           || Amarillo&lt;br /&gt;
|-&lt;br /&gt;
| 31 (5Fh) || 14   || 50|| 50||100|| #66F|| bgcolor=&amp;quot;#8080ff&amp;quot; | || Pastel Blue   || Pastellblau     || Bleu pastel     || Azul pastel&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Intensities ===&lt;br /&gt;
&lt;br /&gt;
The 0%, 50%, and 100% values in the above tables are &amp;quot;should-be&amp;quot; values. However, the real hardware doesn't exactly match that intensities. The actual intensities depend on the luminance mixing (R,G,B tied together via resistors), on chipset (classic CPC, or newer ASIC ones), and on the load applied by external hardware (Monitor, or TV set).&lt;br /&gt;
&lt;br /&gt;
On an actual Amstrad CPC, the half-intensity colour signal is measured to be closer to 40% rather than the expected 50%. This was verified by [[Grim]] and independently confirmed by [[Nocash]]. [https://www.grimware.org/doku.php/documentations/devices/gatearray#inkr Source]&lt;br /&gt;
* [[CPC Palette]] - some more details&lt;br /&gt;
&lt;br /&gt;
This explains why the Amstrad engineers used the following values to adapt the old colour palette to the new 12-bit palette on the Amstrad Plus:&lt;br /&gt;
* 0% became #0&lt;br /&gt;
* 50% became #6. They specifically chose #6 for the 50% value instead of the expected #7 or #8, to better match the real Amstrad CPC palette.&lt;br /&gt;
* 100% became #F&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Green Screen Colours ===&lt;br /&gt;
&lt;br /&gt;
On a green screen, where all colours are shades of unsaturated green, the firmware colours are in order of increasing intensity. Black is darkest green, bright white is brightest green, and firmware colour 13 is a medium green.&lt;br /&gt;
&lt;br /&gt;
The luminance (Y) is not exactly correlated to the actual luminance of colour images broadcast in RGB. Amstrad preferred to propose a completely different image system, not comparable to a conversion to monochrome, which would have limited the number of brightness levels to 21 (for example, colours 9 and 6 would have had the same luminance).&lt;br /&gt;
&lt;br /&gt;
They opted for a table of 27 linear brightness steps. They assigned values of 1 (1kΩ) for blue, 3 (3.3kΩ) for red, and 9 (10kΩ) for green.&lt;br /&gt;
&lt;br /&gt;
==== To calculate the luminance value ====&lt;br /&gt;
&lt;br /&gt;
'''Red''' &lt;br /&gt;
&lt;br /&gt;
*0% =&amp;amp;gt; do not add anything &lt;br /&gt;
*50% =&amp;amp;gt; add 3 &lt;br /&gt;
*100% =&amp;amp;gt; add 6 &lt;br /&gt;
&lt;br /&gt;
'''Green''' &lt;br /&gt;
&lt;br /&gt;
*0% =&amp;amp;gt; do not add anything &lt;br /&gt;
*50% =&amp;amp;gt; add 9 &lt;br /&gt;
*100% =&amp;amp;gt; add 18 &lt;br /&gt;
&lt;br /&gt;
'''Blue''' &lt;br /&gt;
&lt;br /&gt;
*0% =&amp;amp;gt; do not add anything &lt;br /&gt;
*50% =&amp;amp;gt; add 1 &lt;br /&gt;
*100% =&amp;amp;gt; add 2 &lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Pictures ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;gallery&amp;gt;&lt;br /&gt;
Image:40010_am2_metal.jpg|40010 GA Metal Layer&lt;br /&gt;
Image:40010_am2_acid.jpg|40010 GA with Metal Layer removed&lt;br /&gt;
Image:40226_am4_metal.jpg|40226 PreASIC Metal Layer&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[File:Ga.pinout.40007.png]] [[File:Ga.pinout.40008.40010.png]]&lt;br /&gt;
&lt;br /&gt;
Note: Some CPC motherboards can accommodate both types of Gate Array pinouts. [https://thecheshirec.at/2024/10/06/il-existe-une-carte-multi-gate-array-et-cest-amstrad-qui-la-faite/ Source]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== External links ==&lt;br /&gt;
*[https://bread80.com/2021/06/03/understanding-the-amstrad-cpc-video-ram-and-gate-array-subsystem/ Electronic signals analysis of the Gate Array by Bread80]&lt;br /&gt;
* [https://shaker.logonsystem.eu/ACCC1.8-EN.pdf Gate Array documentation in Amstrad CRTC Compendium]&lt;br /&gt;
* [https://www.grimware.org/doku.php/documentations/devices/gatearray Gate Array documentation from Grimware]&lt;br /&gt;
* [http://quasar.cpcscene.net/doku.php?id=assem:gate_array Quasar Gate Array documentation (in french)]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==See also==&lt;br /&gt;
&lt;br /&gt;
*[[Gate Array and ASIC Pin-Outs]]&lt;br /&gt;
*[[PAL16L8]] : for RAM arrangement&lt;br /&gt;
*[[ASIC]] : for Plus users&lt;br /&gt;
&lt;br /&gt;
*[[CRTC]] : the other video stuff&lt;br /&gt;
*[[Synchronising with the CRTC and display]] : technical details on the relationship between Gate Array and CRTC.&lt;br /&gt;
&lt;br /&gt;
*[[Video modes]] : for other informations on colours and pixels.&lt;br /&gt;
&lt;br /&gt;
*[[Media:40010-simplified V03.pdf]] [https://www.cpcwiki.eu/forum/amstrad-cpc-hardware/gate-array-decapped!/msg170713/#msg170713 Forum thread] Gate Array schematics - reverse engineered by Gerald&lt;br /&gt;
&lt;br /&gt;
[[Category:Hardware]][[Category:Programming]][[Category:Datasheet]][[Category:Graphic]][[Category:CPC Internal Components]][[Category:Electronic Component]]&lt;/div&gt;</summary>
		<author><name>Longshot</name></author>	</entry>

	<entry>
		<id>https://oldwiki.cpcwiki.eu/index.php?title=CRTC&amp;diff=126226</id>
		<title>CRTC</title>
		<link rel="alternate" type="text/html" href="https://oldwiki.cpcwiki.eu/index.php?title=CRTC&amp;diff=126226"/>
				<updated>2025-05-21T18:02:47Z</updated>
		
		<summary type="html">&lt;p&gt;Longshot: Added information on citation issues&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[File:CRTC Type 0.jpg|thumb|right|CRTC Type 0 (Hitachi)]]&lt;br /&gt;
[[File:CRTC UMC Type 0.png|thumb|right|CRTC Type 0 (UMC)]]&lt;br /&gt;
[[File:CRTC Type 1.png|thumb|right|CRTC Type 1]]&lt;br /&gt;
[[File:CRTC6845-Type2.jpg|thumb|right|CRTC Type 2]]&lt;br /&gt;
&lt;br /&gt;
The 6845 '''CRTC''' (Cathode Ray Tube Controller) chip was created by Motorola in 1977. It works with the [[Gate Array]] to generate the video signal on the Amstrad CPC.&lt;br /&gt;
&lt;br /&gt;
This chip is also used in the [[BBC Micro]], [[Lynx|Camputers Lynx]], [[EG2000 Colour Genie]], [[Sharp X1]], [[MicroBee]], [[Commodore PET]] and the early graphics cards (MDA, Hercules, CGA, Plantronics Colorplus) for [[IBM PC]]. And it is found in some [https://www.msx.org/wiki/Hitachi_HD6845 MSX1 expansions], providing an 80-column text mode.&lt;br /&gt;
&lt;br /&gt;
It's important to note that the CRTC chip is primarily designed for character-based displays. It explains why, on the Amstrad CPC, the video memory is organized into a grid of characters rather than a purely linear bitmap.&lt;br /&gt;
&lt;br /&gt;
NOTES: &lt;br /&gt;
* This document describes the functionality in terms of the CPC with its separate CRTC and Gate-Array. The Plus has both integrated into the same IC, but could be considered to have two functional blocks, one for CRTC and one for Gate-Array. In this document the term 'Gate-Array' is used, but this also applies to the ASIC.&lt;br /&gt;
* '''This article relies largely on a single source and is suspected of infringing copyright protected under the [https://creativecommons.org/licenses/by-nc-nd/4.0/legalcode CC BY-NC-ND 4.0 license].''' Readers are encouraged to refer directly to the original source material for accurate information. &lt;br /&gt;
** ''Original source material under copyright: [https://shaker.logonsystem.eu/ACCC1.8-EN.pdf  The Amstrad CPC CRTC Compendium]''&lt;br /&gt;
** ''Author: Serge Querné (Longshot)''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Overview ==&lt;br /&gt;
&lt;br /&gt;
The 6845 Cathode Ray Tube Controller (CRTC) is a programmable IC used to generate video displays. This IC is used in a variety of computers including the Amstrad CPC, Amstrad Plus and KC Compact. &lt;br /&gt;
&lt;br /&gt;
The CRTC is a simple chip. It is made up of counters and equality operators, tied by simple logic. All the complexity stems from its multiple independent implementations with their subtle differences.&lt;br /&gt;
&lt;br /&gt;
The CRTC was a common part available from many different manufacturers. During the life of the CPC, Amstrad sourced the CRTC from various manufacturers. &lt;br /&gt;
&lt;br /&gt;
All ICs used were based on the same design but have a different implementation. As a result they do not operate identically in all situations. This document highlights these differences. &lt;br /&gt;
&lt;br /&gt;
This table lists the known ICs used, with their part number, manufacturer and type number. &lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!Part number&lt;br /&gt;
!Manufacturer&lt;br /&gt;
!Type number (note 3)&lt;br /&gt;
|-&lt;br /&gt;
|HD6845S||Hitachi||0&lt;br /&gt;
|-&lt;br /&gt;
|UM6845||UMC||0&lt;br /&gt;
|-&lt;br /&gt;
|UM6845R||UMC||1&lt;br /&gt;
|-&lt;br /&gt;
|MC6845||Motorola||2&lt;br /&gt;
|-&lt;br /&gt;
|AMS40489||Amstrad||3 (note 1)&lt;br /&gt;
|-&lt;br /&gt;
|AMS40226||Amstrad||4 (note 2)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
'''NOTES''' &lt;br /&gt;
&lt;br /&gt;
1. The CRTC functionality is integrated into the CPC+ ASIC. This type exists only in the 464 Plus, 6128 Plus and GX4000. &lt;br /&gt;
&lt;br /&gt;
2. This type exists in &amp;quot;cost-down&amp;quot; CPC464 and CPC6128 systems. In the &amp;quot;cost-down&amp;quot; the CRTC functionality is integrated into a single ASIC IC. This ASIC is often refered to as the &amp;quot;Pre-ASIC&amp;quot; because it preceeded the CPC+ ASIC. The CRTC functionality of the Pre-ASIC is almost identical to the CRTC within the ASIC.&lt;br /&gt;
 &lt;br /&gt;
3. In the Amstrad community each 6845 implementation has been assigned a type number. This type identifies a group of implementations which operate in exactly the same way. The type number system was originally used by demo programmers. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Programming==&lt;br /&gt;
&lt;br /&gt;
The 6845 is selected when bit 14 of the I/O port address is set to &amp;quot;0&amp;quot;. Bit 9 and 8 of the I/O port address define the function to access. The remaining bits can be any value, but it is adviseable to set these to &amp;quot;1&amp;quot; to avoid conflict with other devices in the system.&lt;br /&gt;
&lt;br /&gt;
The recommended I/O port addresses are:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!I/O port address&lt;br /&gt;
!/CS (A14)&lt;br /&gt;
!R/W (A9)&lt;br /&gt;
!RS (A8)&lt;br /&gt;
!Function&lt;br /&gt;
!Read/Write&lt;br /&gt;
|-&lt;br /&gt;
|&amp;amp;BCxx||0||0||0||Select 6845 register||Write only&lt;br /&gt;
|-&lt;br /&gt;
|&amp;amp;BDxx||0||0||1||Write to selected internal 6845 register||Write only&lt;br /&gt;
|-&lt;br /&gt;
|&amp;amp;BExx||0||1||0||&lt;br /&gt;
* CRTCs 0/2: —&lt;br /&gt;
* CRTC 1: Read Status Register&lt;br /&gt;
* CRTCs 3/4: Read from selected internal 6845 register&lt;br /&gt;
||Read only&lt;br /&gt;
|-&lt;br /&gt;
|&amp;amp;BFxx||0||1||1||Read from selected internal 6845 register||Read only&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
The CRTC is not connected to the CPU's RD and WR pins, so it cannot detect the bus's I/O direction. Therefore, executing an IN instruction to the select or write functions causes the CRTC to write the unpredictable data provided by the high-impedance bus to its registers.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Z80 I/O access timings ===&lt;br /&gt;
&lt;br /&gt;
The clock provided to the CRTC by the ASIC/Pre-ASIC is phase-shifted compared to the one provided by the Gate Array.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+&lt;br /&gt;
! Instructions !! Duration !! I/O CRTCs 0/1/2 !! I/O CRTCs 3/4&lt;br /&gt;
|-&lt;br /&gt;
| OUT (C),r8 || 4 µsec || '''3rd µsec''' || 4th µsec&lt;br /&gt;
|-&lt;br /&gt;
| OUT (C),0 || 4 µsec || '''3rd µsec''' || 4th µsec&lt;br /&gt;
|-&lt;br /&gt;
| OUT (n),A || 3 µsec || 3rd µsec || 3rd µsec&lt;br /&gt;
|-&lt;br /&gt;
| OUTI || 5 µsec || 5th µsec || 5th µsec&lt;br /&gt;
|-&lt;br /&gt;
| OUTD || 5 µsec || 5th µsec || 5th µsec&lt;br /&gt;
|-&lt;br /&gt;
| IN r8,(C) || 4 µsec || 4th µsec || 4th µsec&lt;br /&gt;
|-&lt;br /&gt;
| INI || 5 µsec || '''4th µsec''' || '''4th µsec'''&lt;br /&gt;
|-&lt;br /&gt;
| IND || 5 µsec || '''4th µsec''' || '''4th µsec'''&lt;br /&gt;
|-&lt;br /&gt;
| IN A,(n) || 3 µsec || 3rd µsec || 3rd µsec&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Video Memory Address (VMA)==&lt;br /&gt;
&lt;br /&gt;
The VMA of the [[Gate Array]] is constructed from the CRTC MA and RA signals:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!Video Memory Address&lt;br /&gt;
!Signal source&lt;br /&gt;
!Signal name&lt;br /&gt;
|-&lt;br /&gt;
|A15||6845||MA13 &lt;br /&gt;
|-&lt;br /&gt;
|A14||6845||MA12&lt;br /&gt;
|-&lt;br /&gt;
|A13||6845||'''RA2'''&lt;br /&gt;
|-&lt;br /&gt;
|A12||6845||'''RA1'''&lt;br /&gt;
|-&lt;br /&gt;
|A11||6845||'''RA0'''&lt;br /&gt;
|-&lt;br /&gt;
|A10||6845||MA9 &lt;br /&gt;
|-&lt;br /&gt;
|A9||6845||MA8 &lt;br /&gt;
|-&lt;br /&gt;
|A8||6845||MA7 &lt;br /&gt;
|-&lt;br /&gt;
|A7||6845||MA6 &lt;br /&gt;
|-&lt;br /&gt;
|A6||6845||MA5 &lt;br /&gt;
|-&lt;br /&gt;
|A5||6845||MA4 &lt;br /&gt;
|-&lt;br /&gt;
|A4||6845||MA3 &lt;br /&gt;
|-&lt;br /&gt;
|A3||6845||MA2 &lt;br /&gt;
|-&lt;br /&gt;
|A2||6845||MA1 &lt;br /&gt;
|-&lt;br /&gt;
|A1||6845||MA0&lt;br /&gt;
|-&lt;br /&gt;
|A0||Gate-Array||CCLK&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
CRTC generates the address, Gate Array reads the data and converts it to pixels based on its current graphics mode and palette.&lt;br /&gt;
&lt;br /&gt;
CRTC pins RA3, RA4, MA10, MA11 are not connected on CPC.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Overscan bits ===&lt;br /&gt;
&lt;br /&gt;
It is possible to use 32KB screen size (used for [[Programming:Overscan|overscan]]) by setting bits 11 and 10 of Register 12 both to 1. Bits MA11 and MA10 of the address generated by the CRTC are not written on the address bus to access video memory; settings both bits to 1 is the only way to cause a carry to bit MA12 when address pass over the end of current video page to change the memory address to the next video page.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ CRTC Display Start Address&lt;br /&gt;
|-&lt;br /&gt;
! colspan=&amp;quot;8&amp;quot; | Register 12&lt;br /&gt;
! colspan=&amp;quot;8&amp;quot; | Register 13&lt;br /&gt;
|-&lt;br /&gt;
! 15 !! 14 !! 13 !! 12 !! 11 !! 10 !! 9 !! 8&lt;br /&gt;
! 7 !! 6 !! 5 !! 4 !! 3 !! 2 !! 1 !! 0&lt;br /&gt;
|-&lt;br /&gt;
| colspan=&amp;quot;2&amp;quot; | Unused&lt;br /&gt;
| colspan=&amp;quot;2&amp;quot; | Video Page&lt;br /&gt;
| colspan=&amp;quot;2&amp;quot; | Page Size&lt;br /&gt;
| colspan=&amp;quot;10&amp;quot; | Start Address (1024 positions)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| style=&amp;quot;white-space: nowrap;&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;margin-right: 32px&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Bit 13 !! Bit 12 !! Video Page&lt;br /&gt;
|-&lt;br /&gt;
| 0 || 0 || 0000 - 3FFF&lt;br /&gt;
|-&lt;br /&gt;
| 0 || 1 || 4000 - 7FFF&lt;br /&gt;
|-&lt;br /&gt;
| 1 || 0 || 8000 - BFFF&lt;br /&gt;
|-&lt;br /&gt;
| 1 || 1 || C000 - FFFF&lt;br /&gt;
|}&lt;br /&gt;
|&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Bit 11 !! Bit 10 !! Page Size&lt;br /&gt;
|-&lt;br /&gt;
| 0 || 0 || 16KB&lt;br /&gt;
|-&lt;br /&gt;
| 0 || 1 || 16KB&lt;br /&gt;
|-&lt;br /&gt;
| 1 || 0 || 16KB&lt;br /&gt;
|-&lt;br /&gt;
| 1 || 1 || '''32KB'''&lt;br /&gt;
|}&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Coarse hardware scrolling ===&lt;br /&gt;
&lt;br /&gt;
The start address can be manipulated to achieve horizontal and/or vertical hardware scrolling:&lt;br /&gt;
&lt;br /&gt;
*To move right: &amp;lt;code&amp;gt;start_address := start_address + 1&amp;lt;/code&amp;gt;&lt;br /&gt;
*To move left: &amp;lt;code&amp;gt;start_address := start_address - 1&amp;lt;/code&amp;gt;&lt;br /&gt;
*To move down: &amp;lt;code&amp;gt;start_address := start_address + R1&amp;lt;/code&amp;gt;&lt;br /&gt;
*To move up: &amp;lt;code&amp;gt;start_address := start_address - R1&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
However, it is a position in word (16 bits), not in byte. So, the screen will move two bytes at a time horizontally. Also, the precision will be one CRTC character vertically.&lt;br /&gt;
&lt;br /&gt;
The first game that used R12/R13 for both horizontal and vertical hardware scrolling is [https://www.cpc-power.com/index.php?page=detail&amp;amp;num=1839 Roland on the Ropes], released in 1984.&lt;br /&gt;
&lt;br /&gt;
The following BASIC program demonstrates the coarse scrolling by setting the R12 and R13 registers based on keyboard input:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
10 ma%=0&lt;br /&gt;
20 IF INKEY(1)=0 THEN GOSUB 100&lt;br /&gt;
30 IF INKEY(2)=0 THEN GOSUB 300&lt;br /&gt;
40 IF INKEY(8)=0 THEN GOSUB 500&lt;br /&gt;
50 IF INKEY(0)=0 THEN GOSUB 700&lt;br /&gt;
60 GOTO 20&lt;br /&gt;
100 ' right&lt;br /&gt;
110 ma%=ma%+1: GOSUB 900: RETURN&lt;br /&gt;
300 ' down&lt;br /&gt;
310 ma%=ma%+40: GOSUB 900: RETURN&lt;br /&gt;
500 ' left&lt;br /&gt;
510 ma%=ABS(ma%-1): GOSUB 900: RETURN&lt;br /&gt;
700 ' up&lt;br /&gt;
710 ma%=ABS(ma%-40): GOSUB 900: RETURN&lt;br /&gt;
900 ' set R12 and R13&lt;br /&gt;
910 l%=ma% AND 255: h%=&amp;amp;30 OR ((ma%\256) AND 3) :OUT &amp;amp;BC00,13:OUT &amp;amp;BD00,l%: OUT &amp;amp;BC00,12:OUT &amp;amp;BD00,h%&lt;br /&gt;
930 RETURN&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Which looks like the following:&lt;br /&gt;
&lt;br /&gt;
[[File:CRTC-Coarse-scroll.gif]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Advanced hardware scrolling ===&lt;br /&gt;
&lt;br /&gt;
To achieve smoother hardware scrolling, other tricks are required in complement to R12/R13. Usually, R3 is used for smooth horizontal scroll and R5 for smooth vertical scroll.&lt;br /&gt;
&lt;br /&gt;
A good example of smooth hardware multidirectional scrolling game on CPC is [https://www.cpc-power.com/index.php?page=detail&amp;amp;num=2119 Super Cauldron], released in 1993.&lt;br /&gt;
&lt;br /&gt;
Everything you need to know about hardware scrolling on CPC can be found [https://www.cpcwiki.eu/forum/programming/hardware-scrolling-21687/ there].&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Split screen (aka Rupture) ==&lt;br /&gt;
&lt;br /&gt;
While there is usually 1 CRTC frame per screen frame, the screen frame can be divided into multiple CRTC frames of varying proportions.&lt;br /&gt;
&lt;br /&gt;
This is useful for defining different scrolling zones in your screen frame. For example, it was used for hardware parallax scrolling in the game [https://www.cpc-power.com/index.php?page=detail&amp;amp;num=1307 The Living Daylights], released in 1987. [https://www.cpcwiki.eu/forum/programming/the-living-daylights-extra-colours-in-mode-1-rasters-screen-splits/ Source]&lt;br /&gt;
&lt;br /&gt;
And this is basically the bread and butter of innumerable CPC demos.&lt;br /&gt;
&lt;br /&gt;
Some rules of thumb [https://www.cpcwiki.eu/forum/programming/advice-on-split-screen-code/msg242186/ Source]:&lt;br /&gt;
* changes to the screen address have to be done anywhere in the previous split&lt;br /&gt;
* changes to the height of the split have to be done inside the current split (after it has started, in the area of the size of the previous split)&lt;br /&gt;
* changes to screen mode and colours are happening immediately&lt;br /&gt;
&lt;br /&gt;
CRTC registers and screen splitting:&lt;br /&gt;
*reg 0 (63) = x-screenwidth (usually always 63)&lt;br /&gt;
*reg 1 (50) = x-splitwidth (e.g.50)&lt;br /&gt;
*reg 2 (51) = x-splitstart (e.g. 51)&lt;br /&gt;
*reg 3 (08) = x-finestart (maybe use this for half-char scrolling)&lt;br /&gt;
*reg 4 (##) = y-splitheight-1 (set this inside the current split)&lt;br /&gt;
*reg 5 (00) = y-finestart&lt;br /&gt;
*reg 6 (25) = y-max visible splitpart (same like 4)&lt;br /&gt;
*reg 7 (##) = inside last split -&amp;gt; set to 0; inside first split, but after vblank -&amp;gt; set to 255&lt;br /&gt;
*reg 9 (07) = y-lines/char-1&lt;br /&gt;
&lt;br /&gt;
Set this inside the previous split:&lt;br /&gt;
*reg12 (##) = address high (char / 256 + block * 16)&lt;br /&gt;
*reg13 (##) = address low  (char mod 256)&lt;br /&gt;
&lt;br /&gt;
Total height of all splits must be 39.&lt;br /&gt;
&lt;br /&gt;
The [https://www.cpcwiki.eu/forum/programming/interrupt-positions-with-various-sized-screens/ IntPos tool] by Kevin Thacker can help visualize the potential split screen areas.&lt;br /&gt;
&lt;br /&gt;
Note: If all you want is multiple graphics modes in the same frame, you don't need to touch the CRTC at all. More information here: [https://www.cpc-power.com/cpcarchives/index.php?page=articles&amp;amp;num=184 Multi-Mode Graphique (FR)]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== CUDISP (aka CURSOR) ==&lt;br /&gt;
&lt;br /&gt;
CUDISP (Cursor Display) signal defines the hardware cursor.&lt;br /&gt;
&lt;br /&gt;
CRTC pin CUDISP is not connected to the Gate Array, so it has no effect on a barebone CPC or Plus machine.&lt;br /&gt;
&lt;br /&gt;
However, this signal is provided to the [[Connector:Expansion port]]. And it is used by the [[PlayCity]] and [[Play2CPC]] expansions.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== DISPTMG (aka Display Enable) ==&lt;br /&gt;
&lt;br /&gt;
DISPTMG (Display Timing) signal defines the border. When DISPTMG is &amp;quot;0&amp;quot; the border colour is output by the Gate Array to the display.&lt;br /&gt;
&lt;br /&gt;
The border has higher priority than pixels but lower priority than the black colour output when HSYNC/VSYNC are active.&lt;br /&gt;
&lt;br /&gt;
While border is active, all the CRTC counters continue to increment normally and addresses continue to be generated.&lt;br /&gt;
&lt;br /&gt;
The DISPTMG signal is composited from its 3 internal subcomponents: HBORDER (Horizontal), VBORDER (Vertical), SBORDER (Split) by using the NOR function. DISPTMG is &amp;quot;0&amp;quot; if at least one of its subcomponents is &amp;quot;1&amp;quot;. These 3 subcomponents are all independent of each other.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== HBORDER ===&lt;br /&gt;
&lt;br /&gt;
On all CRTCs, HBORDER is disabled when HCC=0 and enabled when HCC=R1.&lt;br /&gt;
&lt;br /&gt;
The exception is for CRTC2 during an HSYNC: the HCC=0 check is skipped, so HBORDER stays on.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== VBORDER ===&lt;br /&gt;
&lt;br /&gt;
On all CRTCs, VBORDER is disabled when VCC=0 and enabled when VCC=R6.&lt;br /&gt;
&lt;br /&gt;
On CRTCs 0/1/2, the condition VCC=R6 is tested on every cycle.&lt;br /&gt;
&lt;br /&gt;
On CRTCs 3/4, the condition VCC=R6 is tested only at each new character line start (when VLC=0 and HCC=0).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== SBORDER ===&lt;br /&gt;
&lt;br /&gt;
Split border is a technique similar to split rasters, except that it is handled by the CRTC instead of the [[Gate Array]].&lt;br /&gt;
&lt;br /&gt;
DISPTMG can be temporarily forced to 0 by using R8 (DISPTMG Skew) on CRTCs 0/3/4, or by setting R6=0 on CRTC 1.&lt;br /&gt;
&lt;br /&gt;
It is not possible to force DISPTMG on CRTC 2.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Border bytes ===&lt;br /&gt;
&lt;br /&gt;
Despite their 1MHz clock speed, CRTCs 0/2 have been observed to change state at a rate equivalent to 2MHz chips by responding to both the rising and falling edges of each clock cycle.&lt;br /&gt;
&lt;br /&gt;
==== Interline border ====&lt;br /&gt;
On CRTCs 0/2, R1&amp;gt;R0 generates one byte (0.5µs) of border at the end of the raster line. On CRTCs 1/3/4, it does not.&lt;br /&gt;
&lt;br /&gt;
If border skew is used, the border byte will skew and change into a full character-width border instead.&lt;br /&gt;
&lt;br /&gt;
==== Border conflict ====&lt;br /&gt;
If R1=0 and HCC=0, we expect HBORDER to activate as HCC=R1 and we also expect HBORDER to deactivate as HCC=0. In this situation, all CRTCs activate HBORDER.&lt;br /&gt;
&lt;br /&gt;
If R6=0 and VCC=0, we expect VBORDER to activate as VCC=R6 and we also expect VBORDER to deactivate as VCC=0. In this situation, all CRTCs activate VBORDER. On CRTC 1, even SBORDER is activated. But on CRTCs 0/2, the first raster line shows an alternation of bytes of VBORDER and displayable characters.&lt;br /&gt;
&lt;br /&gt;
To see the border bytes with your own eyes, type this BASIC line after reset:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
BORDER 6:OUT &amp;amp;BC00,6:OUT &amp;amp;BD00,0&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== HSYNC ==&lt;br /&gt;
&lt;br /&gt;
The HSYNC signal from the CRTC is not directly connected to the display. It is passed to the [[Gate Array]] for further modification. See its wiki page.&lt;br /&gt;
&lt;br /&gt;
While HSYNC is active, all the CRTC counters continue to increment normally and addresses continue to be generated.&lt;br /&gt;
&lt;br /&gt;
On all CRTCs, while an HSYNC is ongoing, the condition HCC=R2 is ignored. So we cannot trigger a new HSYNC during an HSYNC.&lt;br /&gt;
&lt;br /&gt;
=== Contiguous HSYNCs ===&lt;br /&gt;
&lt;br /&gt;
On CRTC 0, two HSYNCs cannot be contiguous. They are always separated by at least 1 CRTC character. What happens is that when HSC=R3 and HCC=R2, the condition HSC=R3 takes precedence over the condition HCC=R2 and HSYNC is stopped.&lt;br /&gt;
&lt;br /&gt;
On CRTCs 1/2/3/4, HSYNCs can be contiguous.&lt;br /&gt;
&lt;br /&gt;
=== Signal delay ===&lt;br /&gt;
&lt;br /&gt;
On all CRTCs, there is a 1µs delay in display between when the CRTC provides a video pointer, and when the Gate Array displays the corresponding 16-bit character.&lt;br /&gt;
&lt;br /&gt;
But on CRTCs 0/1/2, there is no delay for HSYNC. On CRTCs 3/4, the Amstrad engineers fixed the issue by adding a 1µs delay for the HSYNC signal to match the display signal. &lt;br /&gt;
&lt;br /&gt;
So now we have a bigger issue: on CRTCs 3/4, HSYNC occurs 1µs later than on CRTCs 0/1/2. Interrupts being dependent on HSYNC, this is a serious compatibility issue for time-sensitive code. It also explains why the CTM monitor has to be calibrated differently on CRTCs 3/4. Fortunately, the issue is easy to fix, by adjusting the HSYNC width with CRTC register 3.&lt;br /&gt;
&lt;br /&gt;
=== Discolouration effect ===&lt;br /&gt;
&lt;br /&gt;
On CRT monitors from other brands, a colour calibration can happen just after the C-HSYNC pulse.&lt;br /&gt;
&lt;br /&gt;
So even when a fully valid C-HSYNC pulse of 4µs is emitted, an HSYNC shorter than usual combined with a coloured border can induce a discolouration effect on those monitors.&lt;br /&gt;
&lt;br /&gt;
=== Screen wobbling and Fine horizontal hardware scroll ===&lt;br /&gt;
&lt;br /&gt;
These effects use invalid HSYNC signals, which are poorly supported by modern displays. However, these effects were used in commercial-era CPC games, so it's fine if you choose to use them.&lt;br /&gt;
&lt;br /&gt;
When R2 increases by 1, the screen is shifted to the left by 16 mode2 pixels.&lt;br /&gt;
&lt;br /&gt;
When R2 decreases by 1, the screen is shifted to the right by 16 mode2 pixels.&lt;br /&gt;
&lt;br /&gt;
When R3l increases by 1 (and if &amp;lt;6), the screen is shifted to the left by 8 mode2 pixels.&lt;br /&gt;
&lt;br /&gt;
When R3l decreases by 1 (and if &amp;gt;2), the screen is shifted to the right by 8 mode2 pixels.&lt;br /&gt;
&lt;br /&gt;
The shift is not instantaneous but follows a logarithmic attenuation across several raster lines. This property can be used to get even finer horizontal control by modifying R2/R3 on each raster line.&lt;br /&gt;
&lt;br /&gt;
[[Longshot]] has demonstrated [https://youtu.be/1q7RQykZoKY horizontal hardware scroll] with one-pixel precision in mode1 on all CRTCs. However, because you have to synchronize with each line, it takes a lot of CPU time if it's done in fullscreen (272 lines).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== VSYNC ==&lt;br /&gt;
&lt;br /&gt;
The VSYNC signal from the CRTC is not directly connected to the display. It is passed to the [[Gate Array]] for further modification. See its wiki page.&lt;br /&gt;
&lt;br /&gt;
While VSYNC is active, all the CRTC counters continue to increment normally and addresses continue to be generated.&lt;br /&gt;
&lt;br /&gt;
On all CRTCs, while a VSYNC is ongoing, the condition VCC=R7 is ignored. So we cannot trigger a new VSYNC during a VSYNC. &lt;br /&gt;
&lt;br /&gt;
On CRTCs 0/1/2, the sole condition to trigger a VSYNC is that VCC=R7. While on CRTCs 3/4, it is necessary to have VCC=R7 and HCC=0 and VLC=0 to trigger a VSYNC.&lt;br /&gt;
&lt;br /&gt;
=== Blocked VSYNC ===&lt;br /&gt;
&lt;br /&gt;
On CRTC 0, if R7 is modified with the value of VCC when HCC&amp;lt;2, we are in blocked VSYNC. Then, the VSYNC can no longer occur on VCC=R7 until an unblocking condition is produced (VCC or R7 update). Source: §16.4 &amp;quot;Conditions to consider&amp;quot; of the CRTC Compendium&lt;br /&gt;
&lt;br /&gt;
=== Ghost VSYNC ===&lt;br /&gt;
&lt;br /&gt;
On CRTC 2, if a VSYNC is triggered during an HSYNC, the CRTC produces a ghost VSYNC. The CRTC then counts the lines as if a VSYNC were taking place by preventing a new VSYNC from occurring, but without the VSYNC pin being enabled.&lt;br /&gt;
&lt;br /&gt;
=== PPI VSYNC ===&lt;br /&gt;
&lt;br /&gt;
The VSYNC pin of the CRTC is directly connected to bit0 of port B of the PPI. There is no delay involved.&lt;br /&gt;
&lt;br /&gt;
On Amstrad CPC (not Plus!), it is also possible to reverse the direction of PPI port B to output a &amp;quot;fake&amp;quot; VSYNC signal directly from the PPI to the Gate Array.&lt;br /&gt;
&lt;br /&gt;
As an exception, the Ghost VSYNC of CRTC 2 overpowers the Fake VSYNC.&lt;br /&gt;
&lt;br /&gt;
=== Subpixel vertical hardware scroll ===&lt;br /&gt;
&lt;br /&gt;
By tuning very precisely when the VSYNC signal is sent to the monitor,  Longshot has demonstrated [https://youtu.be/bSjRU6Wye00 vertical hardware scroll] with a precision of 1/128th of a pixel. Furthermore, subpixel vertical scrolling consumes very little CPU.&lt;br /&gt;
&lt;br /&gt;
=== Mid-VSYNC ===&lt;br /&gt;
&lt;br /&gt;
On all CRTCs, in both interlace modes, a mid-VSYNC is generated when VCC=R7 on the even field. The VSYNC pulse starts in the middle of the raster line, at HCC=R0/2.&lt;br /&gt;
&lt;br /&gt;
As an exception, on CRTCs 3/4, if R7=0 then mid-VSYNC will instead occur on the odd field. Source: §19.7 &amp;quot;Mid-VSYNC&amp;quot; of the CRTC Compendium.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Interlace modes ==&lt;br /&gt;
&lt;br /&gt;
Note: Some details about the CRTC interlace implementations are missing in this article. Consider it as an introduction to the topic.&lt;br /&gt;
&lt;br /&gt;
[[File:CRTC Interlace modes.png]]&lt;br /&gt;
&lt;br /&gt;
For a CRTC character line with n raster lines, R9 must be set to n-1 on all CRTCs, regardless of the interlace settings. The exception is for CRTCs 0/3/4 in IVM mode, where R9 must be set to n-2.&lt;br /&gt;
&lt;br /&gt;
=== Interlace sync mode (ISM) ===&lt;br /&gt;
&lt;br /&gt;
In this mode, the same information is painted in both fields to enhance readability. Reprogramming the CRTC is not necessary.&lt;br /&gt;
&lt;br /&gt;
=== Interlace sync and video mode (IVM) ===&lt;br /&gt;
&lt;br /&gt;
In this mode, alternating lines are displayed in the even and odd field to double the resolution.&lt;br /&gt;
&lt;br /&gt;
On the even field, the CRTC displays the lines for which VLC is even. On the odd field, the CRTC displays the lines for which VLC is odd.&lt;br /&gt;
&lt;br /&gt;
It is necessary to reprogram the CRTC as if we were building a frame of 624 lines.&lt;br /&gt;
&lt;br /&gt;
CRTC 2 is the exception: R4, R5, R6, R7 do not need to be reprogrammed as it considers each character line to be a double character line.&lt;br /&gt;
&lt;br /&gt;
=== Interlace adjustment line ===&lt;br /&gt;
&lt;br /&gt;
On all CRTCs, in both interlace modes, an additional line (the 625th line) is added automatically by the CRTC at the end of the even field. This line is added after the lines of the vertical adjustment mode.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== CRTC registers ==&lt;br /&gt;
&lt;br /&gt;
The Internal registers of the 6845 are:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!rowspan=2|Register Index&lt;br /&gt;
!rowspan=2|Register Name&lt;br /&gt;
!colspan=3|Read/Write&lt;br /&gt;
!rowspan=2|Range&lt;br /&gt;
!rowspan=2|CPC Setting&lt;br /&gt;
!rowspan=2|Notes&lt;br /&gt;
|-&lt;br /&gt;
!CRTC 0&lt;br /&gt;
!CRTCs 1/2&lt;br /&gt;
!CRTCs 3/4&lt;br /&gt;
|-&lt;br /&gt;
|0||Horizontal Total (-1)||colspan=3 style=&amp;quot;text-align: center;&amp;quot;|Write||00000000||63||Width of the screen, in characters. Should always be 63 (64 characters). 1 character == 1μs.&lt;br /&gt;
|-&lt;br /&gt;
|1||Horizontal Displayed||colspan=3 style=&amp;quot;text-align: center;&amp;quot;|Write||00000000||40||Number of characters displayed. Once horizontal character count (HCC) matches this value, DISPTMG is set to 1.&lt;br /&gt;
|-&lt;br /&gt;
|2||Horizontal Sync Position||colspan=3 style=&amp;quot;text-align: center;&amp;quot;|Write||00000000||46||When to start the HSync signal.&lt;br /&gt;
|-&lt;br /&gt;
|3||Horizontal and Vertical Sync Widths||colspan=3 style=&amp;quot;text-align: center;&amp;quot;|Write||VVVVHHHH||128+14||VSync width in scan-lines (Not present on all CRTCs, fixed to 16 lines on these) ; HSync pulse width in characters.&lt;br /&gt;
|-&lt;br /&gt;
|4||Vertical Total (-1)||colspan=3 style=&amp;quot;text-align: center;&amp;quot;|Write||x0000000||38||Height of the screen, in characters.&lt;br /&gt;
|-&lt;br /&gt;
|5||Vertical Total Adjust||colspan=3 style=&amp;quot;text-align: center;&amp;quot;|Write||xxx00000||0||Measured in scanlines, can be used for smooth vertical scrolling on CPC.&lt;br /&gt;
|-&lt;br /&gt;
|6||Vertical Displayed||colspan=3 style=&amp;quot;text-align: center;&amp;quot;|Write||x0000000||25||Height of displayed screen in characters. Once vertical character count (VCC) matches this value, DISPTMG is set to 1.&lt;br /&gt;
|-&lt;br /&gt;
|7||Vertical Sync Position||colspan=3 style=&amp;quot;text-align: center;&amp;quot;|Write||x0000000||30||When to start the VSync signal, in characters.&lt;br /&gt;
|-&lt;br /&gt;
|8||Interlace and Skew||colspan=3 style=&amp;quot;text-align: center;&amp;quot;|Write||CCDDxxII||0||CC: Cursor Skew (Only in CRTCs 0, 3 and 4). DD: Display Skew (Only in CRTCs 0, 3 and 4). II: Interlace Mode.&lt;br /&gt;
|-&lt;br /&gt;
|9||Maximum Raster Address (aka Number of Scan Lines) (-1)||colspan=3 style=&amp;quot;text-align: center;&amp;quot;|Write||xxx00000||7||Maximum scan line address on CPC can hold between 0 and 7, higher values' upper bits are ignored.&lt;br /&gt;
|-&lt;br /&gt;
|10||Cursor Start Raster||style=&amp;quot;text-align: center;&amp;quot;|Write||style=&amp;quot;text-align: center;&amp;quot;|Write||Read/Write||xBP00000||0||B = Blink On/Off; P = Blink Period Control (16 or 32 frames). Sets first raster row of character that cursor is on to invert.&lt;br /&gt;
|-&lt;br /&gt;
|11||Cursor End Raster||style=&amp;quot;text-align: center;&amp;quot;|Write||style=&amp;quot;text-align: center;&amp;quot;|Write||Read/Write||xxx00000||0||Sets last raster row of character that cursor is on to invert.&lt;br /&gt;
|-&lt;br /&gt;
|12||Display Start Address (High)||Read/Write||style=&amp;quot;text-align: center;&amp;quot;|Write||Read/Write||xx000000||48||On Amstrad Plus, bit7 of the printer port is controlled by bit3 of CRTC R12 (ie. bit11 of Display Start Address).&lt;br /&gt;
|-&lt;br /&gt;
|13||Display Start Address (Low)||Read/Write||style=&amp;quot;text-align: center;&amp;quot;|Write||Read/Write||00000000||0||Allows you to offset the start of screen memory for hardware scrolling, and if using memory from address &amp;amp;0000 with the firmware.&lt;br /&gt;
|-&lt;br /&gt;
|14||Cursor Address (High)||colspan=3 style=&amp;quot;text-align: center;&amp;quot;|Read/Write||xx000000||0||&lt;br /&gt;
|-&lt;br /&gt;
|15||Cursor Address (Low)||colspan=3 style=&amp;quot;text-align: center;&amp;quot;|Read/Write||00000000||0||&lt;br /&gt;
|-&lt;br /&gt;
|16||Light Pen Address (High)||colspan=3 style=&amp;quot;text-align: center;&amp;quot;|Read||xx000000||||On CRTC1, bit6 of Status register goes to 0 when R16 is read.&lt;br /&gt;
|-&lt;br /&gt;
|17||Light Pen Address (Low)||colspan=3 style=&amp;quot;text-align: center;&amp;quot;|Read||00000000||||On CRTC1, bit6 of Status register goes to 0 when R17 is read.&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Screen size ===&lt;br /&gt;
&lt;br /&gt;
We can calculate the screen size in words by multiplying R1 x R6 x (R9+1). And then multiplying the result by 2 to have the screen size in bytes.&lt;br /&gt;
&lt;br /&gt;
With the default CRTC values, we obtain 40 x 25 x (7+1) x 2 = 16000 bytes.&lt;br /&gt;
&lt;br /&gt;
So we can observe that only part of the 16384 bytes (=16KB) page of VRAM is actually displayed on screen.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Register access ===&lt;br /&gt;
&lt;br /&gt;
On CRTCs 0/1/2, if a Write Only register is read from, &amp;quot;0&amp;quot; is returned. The register accessing scheme on CRTCs 3/4 makes it impossible to happen.&lt;br /&gt;
&lt;br /&gt;
On all CRTCs, only the 5 least significant bits of the selected register number are considered to write to a register. The other bits are ignored.&lt;br /&gt;
&lt;br /&gt;
On CRTCs 0/1/2, only the 5 least significant bits of the selected register number are considered to read a register:&lt;br /&gt;
* On CRTCs 0/2, registers 18-31 read as 0&lt;br /&gt;
* On CRTC 1, registers 18-30 read as 0, register 31 reads as &amp;amp;FF&lt;br /&gt;
&lt;br /&gt;
On CRTCs 3/4, only the 3 least significant bits of the selected register number are considered to read a register, according to the following table:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!Nb&lt;br /&gt;
!Register&lt;br /&gt;
!Definition&lt;br /&gt;
|-&lt;br /&gt;
|0||R16||Light Pen Address (High)&lt;br /&gt;
|-&lt;br /&gt;
|1||R17||Light Pen Address (Low)&lt;br /&gt;
|-&lt;br /&gt;
|2||R10||Cursor Start Raster&lt;br /&gt;
|-&lt;br /&gt;
|3||R11||Cursor End Raster&lt;br /&gt;
|-&lt;br /&gt;
|4||R12||Display Start Address (High)&lt;br /&gt;
|-&lt;br /&gt;
|5||R13||Display Start Address (Low)&lt;br /&gt;
|-&lt;br /&gt;
|6||R14||Cursor Address (High)&lt;br /&gt;
|-&lt;br /&gt;
|7||R15||Cursor Address (Low)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== CRTC register differences ==&lt;br /&gt;
&lt;br /&gt;
CRTC types 3 and 4 are identical in every way, except for the unlocking mechanism, split screen, hardware soft scroll and 8-bit printer port functionalities specific to the [[ASIC]].&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== R10/R11 on ASIC/Pre-ASIC  ===&lt;br /&gt;
&lt;br /&gt;
The cursor raster registers R10/R11 act as status registers when read on CRTCs 3/4. They behave as normal cursor raster registers upon write.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! R10 - Bit number&lt;br /&gt;
! Bit value&lt;br /&gt;
! Event&lt;br /&gt;
|-&lt;br /&gt;
|0&lt;br /&gt;
|1&lt;br /&gt;
|C0=R0&lt;br /&gt;
|-&lt;br /&gt;
|1&lt;br /&gt;
|0&lt;br /&gt;
|C0=R0/2&lt;br /&gt;
|-&lt;br /&gt;
|2&lt;br /&gt;
|0&lt;br /&gt;
|C0=R1-1 (if R0&amp;gt;=R1)&lt;br /&gt;
|-&lt;br /&gt;
|3&lt;br /&gt;
|0&lt;br /&gt;
|C0=R2&lt;br /&gt;
|-&lt;br /&gt;
|4&lt;br /&gt;
|0&lt;br /&gt;
|C0=R2+R3&lt;br /&gt;
|-&lt;br /&gt;
|5&lt;br /&gt;
|0&lt;br /&gt;
1&lt;br /&gt;
|R3h&amp;gt;0 : C0=0..R0 on the line R3h from Vsync (C4=R7)&lt;br /&gt;
R3h=0 : C0=0..R0 over 15 lines from Vsync (C4=R7)&lt;br /&gt;
|-&lt;br /&gt;
|6&lt;br /&gt;
|1&lt;br /&gt;
|Always 1&lt;br /&gt;
|-&lt;br /&gt;
|7&lt;br /&gt;
|0&lt;br /&gt;
0&lt;br /&gt;
|C0=0..R0-1 : VMA.Lsb=0xFF&lt;br /&gt;
C0=R0 : VMA'.Lsb=0x00 (same cond if C0=R0=0)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! R11 - Bit number&lt;br /&gt;
! Bit value&lt;br /&gt;
! Event&lt;br /&gt;
|-&lt;br /&gt;
|0&lt;br /&gt;
|0&lt;br /&gt;
|C4=R4 and C9=R9 and C0=R0 : Last char of screen&lt;br /&gt;
|-&lt;br /&gt;
|1&lt;br /&gt;
|0&lt;br /&gt;
|C4=R6-1 and C9=R9 and C0=R0 : Last char displayed&lt;br /&gt;
|-&lt;br /&gt;
|2&lt;br /&gt;
|0&lt;br /&gt;
|C4=R7-1 and C9=R9 and C0=R0 : Last char before Vsync&lt;br /&gt;
|-&lt;br /&gt;
|3&lt;br /&gt;
|0/1&lt;br /&gt;
|Timer 16 CRTC frames&lt;br /&gt;
|-&lt;br /&gt;
|4&lt;br /&gt;
|1&lt;br /&gt;
|Always 1&lt;br /&gt;
|-&lt;br /&gt;
|5&lt;br /&gt;
|0&lt;br /&gt;
|C9=R9 : C0=0 to R0&lt;br /&gt;
|-&lt;br /&gt;
|6&lt;br /&gt;
|0&lt;br /&gt;
|Always 0&lt;br /&gt;
|-&lt;br /&gt;
|7&lt;br /&gt;
|1&lt;br /&gt;
|(C9=R9 and C0=R0) or (C9=0 and C0=0 to R0-1)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Horizontal and Vertical Sync (R3) ===&lt;br /&gt;
&lt;br /&gt;
Type 0:&lt;br /&gt;
*Bits 7..4 define Vertical Sync Width. If 0 is programmed, this gives 16 lines of VSYNC.&lt;br /&gt;
*Bits 3..0 define Horizontal Sync Width. If 0 is programmed, no HSYNC is generated (and therefore, no interrupts).&lt;br /&gt;
&lt;br /&gt;
Type 1:&lt;br /&gt;
*Bits 7..4 are ignored. Vertical Sync is fixed at 16 lines.&lt;br /&gt;
*Bits 3..0 define Horizontal Sync Width. If 0 is programmed, no HSYNC is generated (and therefore, no interrupts).&lt;br /&gt;
&lt;br /&gt;
Type 2:&lt;br /&gt;
*Bits 7..4 are ignored. Vertical Sync is fixed at 16 lines.&lt;br /&gt;
*Bits 3..0 define Horizontal Sync Width. If 0 is programmed, this gives a HSYNC width of 16.&lt;br /&gt;
&lt;br /&gt;
Types 3/4:&lt;br /&gt;
*Bits 7..4 define Vertical Sync Width. If 0 is programmed, this gives 16 lines of VSYNC.&lt;br /&gt;
*Bits 3..0 define Horizontal Sync Width. If 0 is programmed, this gives a HSYNC width of 16.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Interlace and Skew (R8) ===&lt;br /&gt;
&lt;br /&gt;
Types 0/3/4:&lt;br /&gt;
*Bits 7..6 define the skew (delay) of the CUDISP signal (00 = Non-skew ; 01 = One-character skew ; 10 = Two-character skew ; 11 = Non-output).&lt;br /&gt;
*Bits 5..4 define the skew (delay) of the DISPTMG signal (00 = Non-skew ; 01 = One-character skew ; 10 = Two-character skew ; 11 = Non-output).&lt;br /&gt;
*Bits 3..2 are ignored.&lt;br /&gt;
*Bits 1..0 define the interlace mode (00 = No Interlace ; 01 = Interlace Sync ; 10 = No Interlace ; 11 = Interlace Sync and Video).&lt;br /&gt;
&lt;br /&gt;
Types 1/2:&lt;br /&gt;
*Bits 7..2 are ignored.&lt;br /&gt;
*Bits 1..0 define the interlace mode.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== R31 on Type 1 ===&lt;br /&gt;
&lt;br /&gt;
R31 is described in the UM6845R documentation as &amp;quot;Dummy Register&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Its use is described in the documentation for the Rockwell R6545 in combination with R18, R19 and R8 and the Status Register.&lt;br /&gt;
&lt;br /&gt;
In the UM6845R it appears to have no effect. Reading and writing does nothing. Reading it returns &amp;amp;FF.&lt;br /&gt;
&lt;br /&gt;
R31 doesn't exist on CRTCs 0/2/3/4.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Status register on Type 1 ===&lt;br /&gt;
&lt;br /&gt;
The UM6845R has a status register that can be read using port &amp;amp;BExx.&lt;br /&gt;
&lt;br /&gt;
Bit 6 is set to 1 if there is a strobe input to the /LPEN signal. It is cleared to 0 when either R17 or R16 (LPEN address) of the CRTC are read. It signals there is a valid LPEN input. On Kevin Thacker's CPC with UM6845R, it is triggered at power on, R17 and R16 have the values 0 when read.&lt;br /&gt;
&lt;br /&gt;
Bit 5 is set to 1 when CRTC is in &amp;quot;vertical blanking&amp;quot;. Vertical blanking is when the vertical border is active. i.e. VCC&amp;gt;=R6. &lt;br /&gt;
&lt;br /&gt;
It is cleared when the frame is started (VCC=0). It is not directly related to the DISPTMG output (used by the CPC to display the border colour) because that output is a combination of horizontal and vertical blanking.&lt;br /&gt;
This bit will be 0 when pixels are being displayed.&lt;br /&gt;
&lt;br /&gt;
All the other bits read as 0 and don't have any function.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== CRTC Type Detection ==&lt;br /&gt;
&lt;br /&gt;
It is possible to detect the CRTC Type using software methods, and this is done to: &lt;br /&gt;
&lt;br /&gt;
* warn that the software was not designed for the detected 6845 and may function incorrectly&lt;br /&gt;
* to adapt the software so that it will run with the detected 6845 &lt;br /&gt;
* In most cases, the type of the detected 6845 is reported&lt;br /&gt;
&lt;br /&gt;
Detection routine in BASIC:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
10 MODE 1:' Reinitialize screen&lt;br /&gt;
20 OUT &amp;amp;BC00,31:IF INP(&amp;amp;BF00)=255 THEN PRINT&amp;quot;crtc 1&amp;quot;:END&lt;br /&gt;
30 OUT &amp;amp;BC00,12:IF INP(&amp;amp;BF00)=0 THEN PRINT&amp;quot;crtc 2&amp;quot;:END&lt;br /&gt;
40 OUT &amp;amp;BC00,20:IF INP(&amp;amp;BF00)=0 THEN PRINT&amp;quot;crtc 0&amp;quot;:END&lt;br /&gt;
50 PRINT&amp;quot;crtc 3/4&amp;quot;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Distinguishing between CRTCs 3 and 4 can be done by trying to [[Programming:Unlocking ASIC|unlock the ASIC]] or by testing the [[8255|PPI chip]]. On ASIC, if PPI Port B is set as output it will behave the same as input.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== CRTC Timing Diagrams ==&lt;br /&gt;
[[File:CRTC Timing Diagram Rockwell.png]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[File:CRTC timing small.gif]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Internal Counters ==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Counter name&lt;br /&gt;
! Abbr&lt;br /&gt;
! Alternate name&lt;br /&gt;
! Compared with&lt;br /&gt;
! Comment&lt;br /&gt;
|-&lt;br /&gt;
|Horizontal Character Counter&lt;br /&gt;
|HCC&lt;br /&gt;
|C0&lt;br /&gt;
|R0, R1, R2&lt;br /&gt;
| Increments on every clock cycle&lt;br /&gt;
|-&lt;br /&gt;
|Horizontal Sync Counter&lt;br /&gt;
|HSC&lt;br /&gt;
|C3l&lt;br /&gt;
|R3l&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|Vertical Character Counter&lt;br /&gt;
|VCC&lt;br /&gt;
|C4&lt;br /&gt;
|R4, R6, R7&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|Vertical Sync Counter&lt;br /&gt;
|VSC&lt;br /&gt;
|C3h&lt;br /&gt;
|R3h&lt;br /&gt;
|R3h is fixed to 0 on CRTCs 1/2. This gives 16 lines of VSYNC&lt;br /&gt;
|-&lt;br /&gt;
|Vertical Line Counter&lt;br /&gt;
|VLC&lt;br /&gt;
|C9&lt;br /&gt;
|R9, R10, R11&lt;br /&gt;
|If not in IVM mode, this counter is exposed on CRTC pins RA0..RA4&lt;br /&gt;
|-&lt;br /&gt;
|Vertical Total Adjust Counter&lt;br /&gt;
|VTAC&lt;br /&gt;
|C5&lt;br /&gt;
|R5&lt;br /&gt;
|This counter does not exist on CRTCs 0/3/4. C9 is reused instead&lt;br /&gt;
|-&lt;br /&gt;
|Frame Counter&lt;br /&gt;
|FC&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|Used to alternate frames in interlace and for CRTC cursor blinking&lt;br /&gt;
|-&lt;br /&gt;
|Memory Address&lt;br /&gt;
|MA&lt;br /&gt;
|&lt;br /&gt;
|R14/R15&lt;br /&gt;
|This counter is exposed on CRTC pins MA0..MA13&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
When IVM mode is activated, VLC continues to increment normally. However, RA is not identical to VLC anymore. Instead, VLC is considered shifted left by 1 bit, and bit0 represents the parity of the field (even/odd).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== CRTC counter differences ==&lt;br /&gt;
&lt;br /&gt;
=== MA buffering ===&lt;br /&gt;
&lt;br /&gt;
No matter its type, the CRTC never buffers any of its counters, except for the video pointer MA. The buffer MA' is needed because MA has to be reloaded at the beginning of every raster line.&lt;br /&gt;
&lt;br /&gt;
At the end of the display of the last raster line of each character line (ie. when HCC=R1 and VLC=R9), MA' captures the current value of MA.&lt;br /&gt;
&lt;br /&gt;
CRTC 2 is the exception: at the end of the display of the last raster line of the frame, MA' captures R12/R13 instead of MA.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== MA reload ===&lt;br /&gt;
&lt;br /&gt;
On CRTCs 0/3/4, at the beginning of the first raster line of the frame, MA and MA' are loaded with R12/R13. Otherwise, MA is loaded with MA'.&lt;br /&gt;
&lt;br /&gt;
On CRTC 2, at the beginning of every raster line of the frame (including the first one), MA is loaded with MA'.&lt;br /&gt;
&lt;br /&gt;
On CRTC 1, at the beginning of every raster line of the first character line of the frame (ie. when VCC=0), MA is loaded with R12/R13 instead of MA'. '''This is a major source of incompatibility if the programmer does not take care.''' In demos and games, to be compatible with all CRTCs, program R12/R13 only when VCC≠0. This will then take effect at the next CRTC frame start.&lt;br /&gt;
&lt;br /&gt;
==== Rupture For Dummies (R5 bug) ====&lt;br /&gt;
&lt;br /&gt;
CRTC 1 has a bug that occurs when R5 is updated with a non-zero value when HCC=R0 and VLC≠R9, but only when R5 was previously 0. This changes the MA update source to R12/R13 instead of MA'. The CRTC then loads R12/R13 into MA at the beginning of every scanline, regardless of the VCC value.&lt;br /&gt;
&lt;br /&gt;
This R5 bug also messes with the frame parity management. However, it is possible to fix the parity of the frame by activating/deactivating the IVM interlace mode.&lt;br /&gt;
&lt;br /&gt;
The vertical adjustment operates normally after the RFD is triggered. If vertical adjustment is not needed, R5 can be reset at any time after the RFD is activated.&lt;br /&gt;
&lt;br /&gt;
This effect is used in the [https://www.cpc-power.com/index.php?page=detail&amp;amp;num=19308 DSC4 demo].&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== VSC (C3h) overflow ===&lt;br /&gt;
&lt;br /&gt;
During a VSYNC on CRTCs 0/3/4, if VSYNC Width (R3h) is changed with a value less than the current VSC, then VSC overflows and will count up to its maximum value (15) before looping back and counting up again until it reaches the new value of R3h.&lt;br /&gt;
&lt;br /&gt;
On CRTCs 1/2, the VSYNC width is fixed to 16 characters. It is not possible to modify it. Therefore, VSC cannot be overflowed.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== HSC (C3l) overflow ===&lt;br /&gt;
&lt;br /&gt;
During an HSYNC, if HSYNC Width (R3l) is changed with a value less than the current HSC, then HSC overflows and will count up to its maximum value (15) before looping back and counting up again until it reaches the new value of R3l.&lt;br /&gt;
&lt;br /&gt;
The only exception is for CRTC 1 with a value of 0, which immediately cancels the current HSYNC.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== VCC (C4) overflow ===&lt;br /&gt;
&lt;br /&gt;
On all CRTCs, if Vertical Total (R4) is changed with a value less than VCC, then:&lt;br /&gt;
* if this update was done when VCC &amp;lt; R4, then VCC overflows and will count up to its maximum value (127) before looping back and counting up again until it reaches the new value of R4&lt;br /&gt;
* if this update was done when VCC = R4, the current character line was already decided to be the last one of the current frame. No update to R4 will make the CRTC change its mind for the current frame&lt;br /&gt;
&lt;br /&gt;
The only exception when VCC = R4 is for CRTC 1 with a value of 0, which will cause VCC to overflow.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== HCC (C0) overflow ===&lt;br /&gt;
&lt;br /&gt;
If Horizontal Total (R0) is changed with a value less than the current HCC, then:&lt;br /&gt;
* on CRTCs 0/1/2, HCC overflows and will count up to its maximum value (255) before looping back and counting up again until it reaches the new value of R0&lt;br /&gt;
* on CRTCs 3/4, the current line is considered finished and HCC is immediately reset to 0 on the next line&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== VLC (C9) overflow ===&lt;br /&gt;
&lt;br /&gt;
If Number of Scan Lines (R9) is changed with a value less than the current VLC, then:&lt;br /&gt;
* on CRTCs 0/1/2, VLC overflows and will count up to its maximum value (31) before looping back and counting up again until it reaches the new value of R9&lt;br /&gt;
* on CRTCs 3/4, the current line is considered the last one of this CRTC character and VLC will reset to 0 on the next line&lt;br /&gt;
&lt;br /&gt;
As an exception, on CRTCs 0/2, if VLC is modified during the last frame line, then the updated value will not be considered for the current frame.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== VTAC (C5/C9) overflow ===&lt;br /&gt;
&lt;br /&gt;
During vertical adjustment mode, if Vertical Total Adjust (R5) is changed with a value less than the current VTAC, then:&lt;br /&gt;
* on CRTCs 0/1/2, VTAC overflows and will count up to its maximum value (31) before looping back and counting up again until it reaches the new value of R5&lt;br /&gt;
* on CRTCs 3/4, the current line is considered the last one of the current frame and vertical adjustment will end&lt;br /&gt;
&lt;br /&gt;
As an exception, on CRTCs 0/2, if VTAC is modified during the last frame line, then the updated value will not be considered for the current frame.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Vertical Adjustment mode ===&lt;br /&gt;
&lt;br /&gt;
On CRTCs 3/4, this mode does not increment VCC, so VCC remains equal to R4.&lt;br /&gt;
&lt;br /&gt;
On CRTC 0, this mode increments VCC, causing it to exceed R4, but this increment occurs only once.&lt;br /&gt;
&lt;br /&gt;
On CRTCs 1/2, this mode increments VCC, causing it to exceed R4, and this increment can happen multiple times depending on the values of R5 and R9.&lt;br /&gt;
&lt;br /&gt;
Also, only CRTCs 1/2 have a dedicated C5 counter. On CRTCs 0/3/4, during Vertical Adjustment, C9 has to fullfil the VTAC role which means that it cannot fullfil its VLC role. This impacts address generation as R9 is not considered anymore.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Counter freezes ===&lt;br /&gt;
&lt;br /&gt;
On CRTCs 1/2/3/4, R0 accepts all values without causing any problems for counters.&lt;br /&gt;
&lt;br /&gt;
On CRTC 0:&lt;br /&gt;
* Setting R0 to 0 will cause numerous issues that stem from the fact that VLC is frozen. As HCC never reaches 1, the logic that increments VLC is never triggered.&lt;br /&gt;
* The logic that triggers vertical adjustment is broken if R0&amp;lt;2.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Block Diagrams ==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!Hitachi&lt;br /&gt;
!UMC&lt;br /&gt;
!Motorola&lt;br /&gt;
|-&lt;br /&gt;
|[[File:CRTC Block Diagram.png|Hitachi]]&lt;br /&gt;
|[[File:UMC CRTC Block Diagram.png|UMC]]&lt;br /&gt;
|[[File:Motorola CRTC Block Diagram.png|Motorola]]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== CRTC-II (aka Type 5) ==&lt;br /&gt;
&lt;br /&gt;
The [[Media:CRTC-5-HD6345.pdf|HD6345 datasheet]] states it is upward-compatible with the HD6845S in pin and software.&lt;br /&gt;
&lt;br /&gt;
This chip was never used by Amstrad. However, some CPC enthusiasts have replaced the original CRTC chip in their CPC with this one.&lt;br /&gt;
&lt;br /&gt;
With this chip, split-screen becomes easy: [https://thecheshirec.at/2024/05/20/des-splitscreens-en-basic-sur-crtc5/ Split-screen in BASIC]. And 3 new graphics modes (160x100x16c, 320x100x4c, 640x100x2c) are available: [https://thecheshirec.at/2024/11/10/trois-nouveaux-modes-video-grace-au-crtc-5/ New graphics modes in BASIC].&lt;br /&gt;
&lt;br /&gt;
This is the cheapest way to upgrade the CPC's graphics capabilities, costing only 1.29€. [https://thecheshirec.at/2024/05/19/des-crtc5-a-129e/ Source]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Datasheets ==&lt;br /&gt;
&lt;br /&gt;
==== Used by Amstrad ====&lt;br /&gt;
* [[Media:hd6845.hitachi.pdf|HD6845S (Hitachi)]] aka Type 0&lt;br /&gt;
* [[Media:UM6845-UMC.pdf|UM6845 (UMC)]] aka Type 0&lt;br /&gt;
* [[Media:Um6845r.umc.pdf|UM6845R (UMC)]] aka Type 1&lt;br /&gt;
* [[Media:Mc6845.motorola.pdf|MC6845 (Motorola)]] aka Type 2&lt;br /&gt;
* [[Media:CPC_Plus_Asic_Schematic.GIF|AMS40489 (Amstrad)]] aka Type 3 ([[ASIC]])&lt;br /&gt;
* [[AMS40226 (Amstrad)]] aka Type 4 (Pre-ASIC)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Unused clones ====&lt;br /&gt;
* [[CM607P]] a Bulgarian clone made in Pravetz factory. It is used in the [[Aleste 520EX]].&lt;br /&gt;
* [[Media:hd6845.hitachi.pdf|HD6845R]] by Hitachi. According to Kevin Thacker, the [[KC Compact]] used HD6845R only.&lt;br /&gt;
* [[Media:UM6845E-UMC.pdf|UM6845E]] by UMC&lt;br /&gt;
* [[Media:Mc6845.pdf|MC6845-1]] by Motorola&lt;br /&gt;
* [[Media:F6845.pdf|F6845]] by Fairchild&lt;br /&gt;
* [[Media:EF6845P.pdf|EF6845]] by Thomson Semiconductors&lt;br /&gt;
* [[Media:VL6845 VTi.pdf|VL6845]] by VTi&lt;br /&gt;
* [[Media:C6845 CRTC (CAST).pdf|C6845]] by Cast&lt;br /&gt;
* [[Media:MB89321B FUJ.pdf|MB89321B]] by Fujitsu. It is pin-compatible with the 6845&lt;br /&gt;
* [[Media:MB89321A datasheet CRTC.pdf|MB89321A]] by Fujitsu. Enhanced version that adds smooth scroll, screen partitioning, independent scrolling of screen partitions, and other convenient features&lt;br /&gt;
* [[Media:Mos 6545-1 crtc.pdf|MOS 6545]] (MOS, Rockwell, Synertek) is pin-compatible with the 6845. Its differences are found in the R8 register.&lt;br /&gt;
* [https://www.cpcwiki.eu/forum/other-retro/interesting-discussion-about-the-c128-s-cpm-poor-performance/msg223058/#msg223058 MOS 8563] It is an evolution of the 6545/6845 CRTC chip, with blitter abilities to autonomously perform block memory copies within its dedicated video RAM.&lt;br /&gt;
* [https://github.com/hoglet67/BeebFpga/blob/dev/src/common/mc6845.vhd BeebFpga] [https://github.com/MiSTer-devel/Amstrad_MiSTer/blob/master/rtl/UM6845R.v MiSTer] [https://opencores.org/websvn/filedetails?repname=System09&amp;amp;path=%2FSystem09%2Ftrunk%2Frtl%2FVHDL%2Fcrtc6845.vhd OpenCores] Verilog/VHDL implementations of the 6845&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Tools about CRTC ==&lt;br /&gt;
&lt;br /&gt;
* [http://www.cpcwiki.eu/imgs/9/99/Elmar_Krieger-SPECIAL_EFFECTS.dsk  some BASIC tools to detect CRTC types 0-1-2 and show some effects] by [[Elmar Krieger]] (DSK for Emulators)&lt;br /&gt;
* [[File:Shaker26.dsk]] Shaker - Suite of CRTC tests associated with the CPC CRTC compendium (many of them will not work correctly on emulators and that was the purpose of the tests, to help create more compatible emulation)&lt;br /&gt;
* [[File:Shaker addon.dsk]] Shaker Add-On (Pixel 1 Hard Scroll / Vertical Rupture all Crtc)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Links ==&lt;br /&gt;
&lt;br /&gt;
* [http://en.wikipedia.org/wiki/6845 Wikipedia on the CRTC]&lt;br /&gt;
* [[Media:ACCC1.8-EN.pdf]] CPC CRTC Compendium - Latest (04/2024!) document containing in-depth info about CRTC programming on CPC.&lt;br /&gt;
* [[Media:CRTC Compendium Podcast.mp3]] The CRTC Compendium digested in podcast format&lt;br /&gt;
* [http://www.grimware.org/doku.php/documentations/devices/crtc CRTC documentation from Grimware]&lt;br /&gt;
* [http://quasar.cpcscene.net/doku.php?id=assem:crtc Quasar CRTC documentation (in french)]&lt;br /&gt;
* [https://pulkomandy.github.io/shinra.github.io/crtc.html PulkoMandy's table] [https://www.theoddys.com/acorn/the_6845_crtc/6845%20Variants.xlsx Oddy's table] Differences between CRTC types&lt;br /&gt;
* [[Media:Dossier Rupture(Gozeur Paradox).pdf]]&lt;br /&gt;
* [[Media:Dossier CRTC(Ramlaid Mortel).pdf]] Les entrailles du CRTC&lt;br /&gt;
* [https://thecheshirec.at/tag/crtc6845/ Leçons CRTC (CheshireCat)]&lt;br /&gt;
* [https://martin.hinner.info/vga/pal.html PAL video timing specification]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Related pages==&lt;br /&gt;
&lt;br /&gt;
*[[Gate Array]]&lt;br /&gt;
&lt;br /&gt;
*[[ASIC]]&lt;br /&gt;
&lt;br /&gt;
*[[Video modes]]&lt;br /&gt;
&lt;br /&gt;
*[[Synchronising with the CRTC and display]] : technic and details on the relationship between Gate Array and CRTC.&lt;br /&gt;
&lt;br /&gt;
*[[VIDI digitizer]] This extension contains its own CRTC chip&lt;br /&gt;
&lt;br /&gt;
[[Category:Hardware]] [[Category:CPC Internal Components]] [[Category:Electronic Component]] [[Category:Programming]] [[Category:Datasheet]] [[Category:Graphic]]&lt;/div&gt;</summary>
		<author><name>Longshot</name></author>	</entry>

	<entry>
		<id>https://oldwiki.cpcwiki.eu/index.php?title=Gate_Array&amp;diff=126056</id>
		<title>Gate Array</title>
		<link rel="alternate" type="text/html" href="https://oldwiki.cpcwiki.eu/index.php?title=Gate_Array&amp;diff=126056"/>
				<updated>2025-05-18T22:07:15Z</updated>
		
		<summary type="html">&lt;p&gt;Longshot: /* External links */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[File:Amstrad 40007 Gate Array.png|right|thumb|Amstrad 40007 Gate Array]]&lt;br /&gt;
[[File:Amstrad 40010 Gate Array.png|right|thumb|Amstrad 40010 Gate Array]]&lt;br /&gt;
&lt;br /&gt;
Also designated as Video Gate Array (VGA, not to be confused with the IBM PC compatible graphic card spec).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Introduction  ==&lt;br /&gt;
&lt;br /&gt;
The Gate Array is a specially designed chip exclusively for use in the Amstrad CPC and was designed by Amstrad plc. &lt;br /&gt;
&lt;br /&gt;
In the CPC+ system, the functions of the Gate Array are integrated into a single [[ASIC|ASIC]]. When the ASIC is &amp;quot;locked&amp;quot;, the extra features are not available and the ASIC operates the same as the Gate Array in the CPC allowing programs written for the CPC to work on the Plus without modification. The ASIC must be &amp;quot;un-locked&amp;quot; to access the new features. &lt;br /&gt;
&lt;br /&gt;
In the [[KC Compact]] system, the functions of the Gate Array are &amp;quot;emulated&amp;quot; in TTL chips, [[CIO Overview|CIO]], and its color translation EPROM.&lt;br /&gt;
&lt;br /&gt;
In the &amp;quot;cost-down&amp;quot; version of the CPC6128, the functions of the Gate Array are integrated into an ASIC.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== What does it do? ==&lt;br /&gt;
&lt;br /&gt;
The Gate Array is responsible for the display (colour palette, resolution, horizontal and vertical sync), bus arbitration, DRAM refresh, interrupt generation and memory arrangement. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Bus arbitration ==&lt;br /&gt;
&lt;br /&gt;
The Gate Array arbitrates access to the RAM between the CPU and the video hardware (CRTC and Gate-Array).&lt;br /&gt;
&lt;br /&gt;
Every microsecond: &lt;br /&gt;
* The CRTC generates a memory address using it's MA and RA signal outputs. See the [[CRTC]] wiki page to know how the motherboard wiring transforms these signals into the Video Memory Address (VMA).&lt;br /&gt;
* The Gate Array fetches 2 bytes for each address. /CPU_ADDR is a 1MHz signal. So these 2 bytes are fetched sequentially. They are not interleaved with Z80 access. These bytes are fetched even when the border is on as this is required for DRAM refresh.&lt;br /&gt;
* The video hardware is given priority so that the display is not disrupted.&lt;br /&gt;
&lt;br /&gt;
The Gate-Array generates the &amp;quot;READY&amp;quot; signal which is connected to the &amp;quot;/WAIT&amp;quot; input signal of the CPU. This signal is used to stop the CPU accessing RAM while the video-hardware is accessing it.&lt;br /&gt;
&lt;br /&gt;
In fact, the Gate Array allows the Z80 to access the RAM in only 1 out of every 4 cycles. As a result, all instruction timings are stretched so that they are all multiples of a microsecond (1µs), and this gives an effective CPU clock of 3.3Mhz.&lt;br /&gt;
&lt;br /&gt;
Unlike the ZX Spectrum or the Amiga, where bus arbitration is restricted to the &amp;quot;contended memory&amp;quot; or &amp;quot;chip RAM&amp;quot;, on the CPC it also applies to ROM access and to RAM expansions. So the Z80 always runs at the same speed, regardless of the type of memory being accessed.&lt;br /&gt;
&lt;br /&gt;
Last but not least, bus arbitration also applies to I/O access. And memory access is not aligned with I/O access on Z80.&lt;br /&gt;
&lt;br /&gt;
Note: On Amstrad Plus, the ASIC also has to handle DMA instruction fetch from RAM.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== DRAM refresh ==&lt;br /&gt;
&lt;br /&gt;
On Amstrad CPC, the Gate Array is responsible for the DRAM refresh, instead of using the Z80 built-in DRAM refresh mechanism. The reason is that there can only be 3 DRAM accesses per microsecond on this architecture. Doing DRAM refresh on each M1 cycle as it is done on MSX would bog down the CPU speed on CPC given its bus arbitration scheme.&lt;br /&gt;
&lt;br /&gt;
The Z80 generates a maximum of one request per microsecond. The CPC also requires two memory accesses per microsecond for reading video data.&lt;br /&gt;
&lt;br /&gt;
The CPC specs 4164-20 DRAMs. These require 330nS for a read or write cycle. The CPC also uses the optimised sequential CAS cycles to read the two video data bytes in half a microsecond. [https://www.cpcwiki.eu/forum/amstrad-cpc-hardware/the-cpc-revision-zero-article/msg243769/ Source]&lt;br /&gt;
&lt;br /&gt;
The way to cause the RAM refresh to fail in both a Plus or normal CPC is simply to stop a few bits of the CRTC address changing (ie. never refresh the selected area).&lt;br /&gt;
&lt;br /&gt;
Generally, only the Row address needs to be cycled, so stopping MA0 through MA7 from changing, and stopping the CPU from reading those rows, will cause data to be lost, quite quickly (generally around 4ms). [https://www.cpcwiki.eu/forum/amstrad-cpc-hardware/memory-refresh-plus/ Source]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Interrupt generation ==&lt;br /&gt;
&lt;br /&gt;
Interrupts on the CPC are created by the Gate Array based on settings from the CRTC. The Gate Array has an internal counter R52 (the R is for Raster) that counts from 0 to 51, incrementing after each HSYNC signal.&lt;br /&gt;
&lt;br /&gt;
On all CRTCs, R52 interrupts always start 1µs after the end of an HSYNC. But on CRTCs 3/4, HSYNCs occur 1µs later than on CRTCs 0/1/2. Which means that on CRTCs 3/4, interrupts start 1µs later than on CRTCs 0/1/2. This can be adjusted by using the CRTC register 3.&lt;br /&gt;
&lt;br /&gt;
R52 will return to 0 and the Gate Array will send an interrupt request on any of these conditions:&lt;br /&gt;
* When it exceeds 51&lt;br /&gt;
* By setting bit4 of the RMR register of the Gate Array to 1&lt;br /&gt;
* At the end of the 2nd HSYNC after the start of the VSYNC&lt;br /&gt;
&lt;br /&gt;
When the Gate Array sends an interrupt request:&lt;br /&gt;
*If the interrupts were authorized at the time of the request, then bit5 of R52 is cleared (but R52 was reset to 0 anyway) and the interrupt takes place&lt;br /&gt;
*If interrupts are not authorized, then the R52 counter continues to increment and the interrupt remains armed (the Gate Array then maintains its INT signal). When interrupts are enabled (using the EI instruction), bit5 of R52 is cleared and the interrupt takes place. This happens only '''after the instruction that follows EI''' as this Z80 instruction has a 1-instruction delay.&lt;br /&gt;
&lt;br /&gt;
[https://shaker.logonsystem.eu/ACCC1.8-EN.pdf Source]&lt;br /&gt;
&lt;br /&gt;
Note: On Amstrad Plus, the interrupt management system is seriously beefed up. See the [[ASIC]] wiki page.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== CSYNC signal ==&lt;br /&gt;
&lt;br /&gt;
The HSYNC and VSYNC signals are received from the [[CRTC]]. These signals are then modified by the Gate Array to C-HSYNC and C-VSYNC and merged into a single CSYNC signal that will be sent to the display.&lt;br /&gt;
&lt;br /&gt;
When CRTC HSYNC is active, the Gate Array immediately outputs the palette colour black. If the HSYNC is set to 14 characters then black will be output for 14µs.&lt;br /&gt;
&lt;br /&gt;
If a graphics mode change is pending, the HSYNC pulse width needs to be at least 2µs for Gate Array to change the graphics mode.&lt;br /&gt;
&lt;br /&gt;
C-HSYNC begins 2µs after activation of the CRTC HSYNC and stays a maximum of 4µs (signal is cut short if HSYNC width is greater than 6).&lt;br /&gt;
&lt;br /&gt;
For example, if CRTC R2=46, and CRTC HSYNC width is 14 chars then C-HSYNC starts at 48 and lasts only until 51 included.&lt;br /&gt;
&lt;br /&gt;
On Gate Array, even if the duration of the CRTC VSYNC is reduced to 2 µseconds, the Gate Array will always output black for 26 lines with 4 lines of C-VSYNC to the monitor. While on ASIC/Pre-ASIC, the CRTC VSYNC must be active as long as the C-VSYNC signal is sent to the monitor.&lt;br /&gt;
&lt;br /&gt;
The Gate Array (and ASIC/Pre-ASIC) uses 2 internal counters to create its CSYNC signal:&lt;br /&gt;
* H06 counts the number of CRTC characters processed during an HSYNC. H06 is incremented by the Gate Array for each CRTC character when CRTC HSYNC is active. The Gate Array activates the C-HSYNC signal when H06 reaches 2, and changes its graphics mode if a change was pending. It deactivates this signal when H06 reaches 6.&lt;br /&gt;
* V26 counts the number of HSYNCs occuring during a VSYNC. V26 is incremented by the Gate Array when the CRTC signals an end of HSYNC. The Gate Array activates the C-VSYNC signal when V26 reaches 2 (and if VSYNC is active on ASIC/Pre-ASIC). It deactivates this signal when V26 reaches 6. After the 26th line has been processed, the Gate Array stops outputting the palette colour black.&lt;br /&gt;
&lt;br /&gt;
If CRTC VSYNC is activated again while V26 is still in progress, then V26 is reset to 0 and starts counting up again the HSYNC pulses.&lt;br /&gt;
&lt;br /&gt;
The HSYNC signal from the CRTC is 0 when inactive and 1 when active. Same for VSYNC.&lt;br /&gt;
&lt;br /&gt;
C-HSYNC and C-VSYNC are composited using the XNOR function. The resulting CSYNC signal produced by the Gate Array is 1 when inactive and 0 when active.&lt;br /&gt;
&lt;br /&gt;
On a CPC monitor, the CSYNC is rendered in &amp;quot;absolute black&amp;quot;. It is darker than the palette colour black output by the Gate Array. The electron beam is basically turned off. Turning up the brightness level won't make it any brighter.&lt;br /&gt;
&lt;br /&gt;
[https://shaker.logonsystem.eu/ACCC1.8-EN.pdf Source]&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Controlling the Gate Array  ==&lt;br /&gt;
&lt;br /&gt;
The gate array is controlled by I/O. The gate array is selected when bit 15 of the I/O port address is set to &amp;quot;0&amp;quot; and bit 14 of the I/O port address is set to &amp;quot;1&amp;quot;. The values of the other bits are ignored. However, to avoid conflict with other devices in the system, these bits should be set to &amp;quot;1&amp;quot;. &lt;br /&gt;
&lt;br /&gt;
The recommended I/O port address is &amp;amp;7Fxx. &lt;br /&gt;
&lt;br /&gt;
The Gate Array is not connected to the CPU's RD and WR pins, so it cannot detect the bus's I/O direction. If you execute an I/O read operation on the Gate Array I/O address, the Gate Array will read an unpredictable value from the databus which will be in high-impedance state. If the value is a valid Gate Array command, it will be executed, otherwise nothing will happen. [https://www.grimware.org/doku.php/documentations/devices/gatearraydo=export_xhtml Source]&lt;br /&gt;
&lt;br /&gt;
The function to be performed is selected by writing data to the Gate Array, the first bits of the data define the function selected (see table below). It is not possible to read from the Gate Array. &lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!colspan=4| 8bit command&lt;br /&gt;
!rowspan=2| Machine&lt;br /&gt;
!rowspan=2| Register&lt;br /&gt;
!rowspan=2| Description&lt;br /&gt;
!rowspan=2| Chip&lt;br /&gt;
|-&lt;br /&gt;
! 7&lt;br /&gt;
! 6&lt;br /&gt;
! 5&lt;br /&gt;
! 4..0&lt;br /&gt;
|-&lt;br /&gt;
| 0 || 0 || x || style=&amp;quot;text-align: center;&amp;quot; | n || All || PENR || Select a color register || Gate Array&lt;br /&gt;
|-&lt;br /&gt;
| 0 || 1 || x || style=&amp;quot;text-align: center;&amp;quot; | n || All || INKR || Change the value of the currently selected color register || Gate Array&lt;br /&gt;
|-&lt;br /&gt;
| 1 || 0 || 0 || style=&amp;quot;text-align: center;&amp;quot; | n || All || RMR || Control Interrupt counter, ROM mapping and Graphics mode || Gate Array&lt;br /&gt;
|-&lt;br /&gt;
| rowspan=&amp;quot;2&amp;quot;|1 || rowspan=&amp;quot;2&amp;quot;|0 || rowspan=&amp;quot;2&amp;quot;|1 || style=&amp;quot;text-align: center;&amp;quot; rowspan=&amp;quot;2&amp;quot; | n || All || RMR || ''Ghost register'' || Gate Array (CPC) or locked ASIC (Plus)&lt;br /&gt;
|-&lt;br /&gt;
| Plus || RMR2 || ASIC &amp;amp; Advanced ROM mapping || Unlocked ASIC&lt;br /&gt;
|-&lt;br /&gt;
| 1 || 1 ||colspan=2  style=&amp;quot;text-align: center;&amp;quot; | n || All || MMR || RAM memory mapping || PAL (only with 128KB or RAM expansion)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
The MMR register is not available in the Gate Array, but is performed by a device at the same I/O port address location.&lt;br /&gt;
&lt;br /&gt;
In the CPC464, CPC664 and KC compact, MMR is performed in an external memory expansion (e.g. Dk'Tronics 64K RAM Expansion), if this expansion is not present then MMR is not available.&lt;br /&gt;
&lt;br /&gt;
In the CPC6128, MMR is performed by a [[PAL16L8|PAL chip]] located on the main PCB, or an external memory expansion.&lt;br /&gt;
&lt;br /&gt;
In the 464+ and 6128+, MMR is performed by the ASIC or an external memory expansion. Please read the document on RAM management for more information.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Registers ==&lt;br /&gt;
&lt;br /&gt;
Note: The Plus palette capabilities are only accessible through the [[Default I/O Port Summary|ASIC I/O page]]. Registers PENR and INKR are not needed in that case.&lt;br /&gt;
&lt;br /&gt;
=== Register PENR (Select a color register) ===&lt;br /&gt;
&lt;br /&gt;
When bit 7 and bit 6 are set to &amp;quot;0&amp;quot;, the remaining bits determine which pen is to have its colour changed. When bit 4 is set to &amp;quot;0&amp;quot;, bits 3 to 0 define which pen is to be selected. When bit 4 is set to &amp;quot;1&amp;quot;, the value contained in bits 3-0 is ignored and the border is selected. &lt;br /&gt;
&lt;br /&gt;
The pen remains selected until another is chosen. &lt;br /&gt;
&lt;br /&gt;
Each mode has a fixed number of pens. Mode 0 has 16 pens, mode 1 has 4 pens and mode 2 has 2 pens. &lt;br /&gt;
&lt;br /&gt;
==== Summary  ====&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!Bit&lt;br /&gt;
!Value&lt;br /&gt;
!Function&lt;br /&gt;
|-&lt;br /&gt;
| 7 || 0 || rowspan=&amp;quot;2&amp;quot; | Gate Array PENR register&lt;br /&gt;
|-&lt;br /&gt;
| 6 || 0 &lt;br /&gt;
|-&lt;br /&gt;
| 5 || - || not used&lt;br /&gt;
|-&lt;br /&gt;
| 4 || 1 || Select border&lt;br /&gt;
|-&lt;br /&gt;
| 3 || x || rowspan=&amp;quot;4&amp;quot; | Ignored&lt;br /&gt;
|-&lt;br /&gt;
| 2 || x&lt;br /&gt;
|-&lt;br /&gt;
| 1 || x&lt;br /&gt;
|-&lt;br /&gt;
| 0 || x&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!Bit&lt;br /&gt;
!Value&lt;br /&gt;
!Function&lt;br /&gt;
|-&lt;br /&gt;
| 7 || 0 || rowspan=&amp;quot;2&amp;quot; | Gate Array PENR register&lt;br /&gt;
|-&lt;br /&gt;
| 6 || 0&lt;br /&gt;
|-&lt;br /&gt;
| 5 || - || not used&lt;br /&gt;
|-&lt;br /&gt;
| 4 || 0 || Select pen&lt;br /&gt;
|-&lt;br /&gt;
| 3 || x || rowspan=&amp;quot;4&amp;quot; | Pen number&lt;br /&gt;
|-&lt;br /&gt;
| 2 || x&lt;br /&gt;
|-&lt;br /&gt;
| 1 || x&lt;br /&gt;
|-&lt;br /&gt;
| 0 || x&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Register INKR (Change the value of the currently selected color register) ===&lt;br /&gt;
&lt;br /&gt;
Once the pen has been selected its colour can then be changed. Bits 4 to 0 specify the hardware colour number from the hardware colour palette. &lt;br /&gt;
&lt;br /&gt;
Even though there is provision for 32 colours, only 27 are possible. The remaining colours are duplicates of those already in the colour palette. &lt;br /&gt;
&lt;br /&gt;
==== Summary  ====&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!Bit&lt;br /&gt;
!Value&lt;br /&gt;
!Function&lt;br /&gt;
|-&lt;br /&gt;
| 7 || 0 || rowspan=&amp;quot;2&amp;quot; | Gate Array INKR register&lt;br /&gt;
|-&lt;br /&gt;
| 6 || 1&lt;br /&gt;
|-&lt;br /&gt;
| 5 || - || not used&lt;br /&gt;
|-&lt;br /&gt;
| 4 || x || rowspan=&amp;quot;5&amp;quot; | Colour number x&lt;br /&gt;
|-&lt;br /&gt;
| 3 || x &lt;br /&gt;
|-&lt;br /&gt;
| 2 || x &lt;br /&gt;
|-&lt;br /&gt;
| 1 || x&lt;br /&gt;
|-&lt;br /&gt;
| 0 || x&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Register RMR (Control Interrupt counter, ROM mapping and Graphics mode) ===&lt;br /&gt;
&lt;br /&gt;
This is a general purpose register responsible for the [[Video modes|graphics mode]] and the ROM configuration. &lt;br /&gt;
&lt;br /&gt;
==== Graphics mode selection  ====&lt;br /&gt;
&lt;br /&gt;
The function of bits 1 and 0 is to define the screen mode. The settings for bits 1 and 0 and the corresponding screen mode are given in the table below. &lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!Bit 1&lt;br /&gt;
!Bit 0&lt;br /&gt;
!Screen mode&lt;br /&gt;
|-&lt;br /&gt;
| 0 || 0 || Mode 0, 160x200 resolution, 16 colours&lt;br /&gt;
|-&lt;br /&gt;
| 0 || 1 || Mode 1, 320x200 resolution, 4 colours&lt;br /&gt;
|-&lt;br /&gt;
| 1 || 0 || Mode 2, 640x200 resolution, 2 colours&lt;br /&gt;
|-&lt;br /&gt;
| 1 || 1 || Mode 3, 160x200 resolution, 4 colours (undocumented)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
* Mode 3 is not official. From the combinations possible, we can see that 4 modes can be defined, although the Amstrad only has 3. Mode 3 is similar to mode 0, because it has the same resolution, but it is limited to only 4 colours. Mode 3 is not supported by the [[KC Compact]] (which outputs black in Mode 3).&lt;br /&gt;
&lt;br /&gt;
Mode changing is synchronised with HSYNC. If the mode is changed, it will take effect from the next HSYNC.&lt;br /&gt;
&lt;br /&gt;
==== ROM configuration selection  ====&lt;br /&gt;
&lt;br /&gt;
Bit 2 is used to enable or disable the lower ROM area. The lower ROM area occupies memory addresses &amp;amp;amp;0000-&amp;amp;amp;3fff and is used to access the operating system ROM. When the lower ROM area is is enabled, reading from &amp;amp;amp;0000-&amp;amp;amp;3FFF will return data in the ROM. When a value is written to &amp;amp;amp;0000-&amp;amp;amp;3FFF, it will be written to the RAM underneath the ROM. When it is disabled, data read from &amp;amp;amp;0000-&amp;amp;amp;3FFF will return the data in the RAM. &lt;br /&gt;
&lt;br /&gt;
Similarly, bit 3 controls enabling or disabling of the upper ROM area. The upper ROM area occupies memory addressess &amp;amp;amp;C000-&amp;amp;amp;FFFF and is BASIC or any expansion ROMs which may be plugged into a ROM board/box. See the document on [[Upper ROM Bank Number|upper rom selection]] for more details. When the upper ROM area enabled, reading from &amp;amp;amp;c000-&amp;amp;amp;ffff, will return data in the ROM. When data is written to &amp;amp;amp;c000-&amp;amp;amp;FFFF, it will be written to the RAM at the same address as the ROM. When the upper ROM area is disabled, and data is read from &amp;amp;amp;c000-&amp;amp;amp;ffff it will be the data in the RAM. &lt;br /&gt;
&lt;br /&gt;
Bit 4 controls the interrupt generation. It can be used to delay interrupts. See the document on interrupt generation for more information.&lt;br /&gt;
&lt;br /&gt;
==== Summary  ====&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!Bit&lt;br /&gt;
!Value&lt;br /&gt;
!Function&lt;br /&gt;
|-&lt;br /&gt;
| 7 || 1 || rowspan=&amp;quot;2&amp;quot; | Gate Array RMR register&lt;br /&gt;
|-&lt;br /&gt;
| 6 || 0 &lt;br /&gt;
|-&lt;br /&gt;
| 5 || - || ''must be 0 on Plus machines with ASIC unlocked''&lt;br /&gt;
|-&lt;br /&gt;
| 4 || x || Interrupt generation control&lt;br /&gt;
|-&lt;br /&gt;
| 3 || x || 1=Upper ROM area disable, 0=Upper ROM area enable&lt;br /&gt;
|-&lt;br /&gt;
| 2 || x || 1=Lower ROM area disable, 0=Lower ROM area enable&lt;br /&gt;
|-&lt;br /&gt;
| 1 || x || rowspan=&amp;quot;2&amp;quot; | Graphics Mode selection&lt;br /&gt;
|-&lt;br /&gt;
| 0 || x&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Register RMR2 (ASIC &amp;amp; Advanced ROM mapping) ===&lt;br /&gt;
&lt;br /&gt;
This register exists only in Plus or GX4000, and is only accessible when the ASIC is unlocked.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!Bit&lt;br /&gt;
!Value&lt;br /&gt;
!Function&lt;br /&gt;
|-&lt;br /&gt;
| 7 || 1 || rowspan=&amp;quot;3&amp;quot; | Gate Array RMR2 register&lt;br /&gt;
|-&lt;br /&gt;
| 6 || 0&lt;br /&gt;
|-&lt;br /&gt;
| 5 || 1&lt;br /&gt;
|-&lt;br /&gt;
| 4 || x || rowspan=&amp;quot;2&amp;quot; |RMR addressing mode&lt;br /&gt;
|-&lt;br /&gt;
| 3 || x&lt;br /&gt;
|-&lt;br /&gt;
| 2 || x || rowspan=&amp;quot;3&amp;quot; | Physical ROM number (0..7)&lt;br /&gt;
|-&lt;br /&gt;
| 1 || x&lt;br /&gt;
|-&lt;br /&gt;
| 0 || x&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ RMR addressing modes&lt;br /&gt;
!Bit 4&lt;br /&gt;
!Bit 3&lt;br /&gt;
!Lower ROM&lt;br /&gt;
![[ASIC|ASIC I/O page]]&lt;br /&gt;
|-&lt;br /&gt;
|0&lt;br /&gt;
|0&lt;br /&gt;
|&amp;amp;0000-&amp;amp;3FFF&lt;br /&gt;
|Disabled&lt;br /&gt;
|-&lt;br /&gt;
|0&lt;br /&gt;
|1&lt;br /&gt;
|&amp;amp;4000-&amp;amp;7FFF&lt;br /&gt;
|Disabled&lt;br /&gt;
|-&lt;br /&gt;
|1&lt;br /&gt;
|0&lt;br /&gt;
|&amp;amp;8000-&amp;amp;BFFF&lt;br /&gt;
|Disabled&lt;br /&gt;
|-&lt;br /&gt;
|1&lt;br /&gt;
|1&lt;br /&gt;
|&amp;amp;0000-&amp;amp;3FFF&lt;br /&gt;
|&amp;amp;4000-&amp;amp;7FFF&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
The physical ROMs are also accessible as upper ROMs by using the [[Upper ROM Bank Number]] port and the RMR register.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Register MMR (RAM memory mapping) ===&lt;br /&gt;
&lt;br /&gt;
This register exists only in CPCs with 128K RAM (like the CPC 6128), or CPCs equipped with [[Standard Memory Expansions]].&lt;br /&gt;
&lt;br /&gt;
Note: In the CPC 6128, the register is a separate [[PAL16L8|PAL chip]] that assists the Gate Array chip.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!Bit&lt;br /&gt;
!Value&lt;br /&gt;
!Function&lt;br /&gt;
|-&lt;br /&gt;
| 7 || 1 || rowspan=&amp;quot;2&amp;quot; | Gate Array MMR register&lt;br /&gt;
|-&lt;br /&gt;
| 6 || 1 &lt;br /&gt;
|-&lt;br /&gt;
| 5 || x || rowspan=&amp;quot;3&amp;quot; |64K bank number (0..7); always 0 on an unexpanded CPC6128, 0-7 on [[Standard Memory Expansions]]&lt;br /&gt;
|-&lt;br /&gt;
| 4 || x&lt;br /&gt;
|-&lt;br /&gt;
| 3 || x&lt;br /&gt;
|-&lt;br /&gt;
| 2 || x || rowspan=&amp;quot;3&amp;quot; | RAM Config (0..7)&lt;br /&gt;
|-&lt;br /&gt;
| 1 || x&lt;br /&gt;
|-&lt;br /&gt;
| 0 || x&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
The 3bit RAM Config value is used to access the second 64K of the total 128K RAM that is built into the CPC 6128 or the additional 64K-512K of standard memory expansions. These contain up to eight 64K ram banks, which are selected with bit 3-5. A standard CPC 6128 only contains bank 0. Normally the register is set to 0, so that only the first 64K RAM are used (identical to the CPC 464 and 664 models). The register can be used to select between the following eight predefined configurations only:&lt;br /&gt;
&lt;br /&gt;
  -Address-     0      1      2      3      4      5      6      7&lt;br /&gt;
  0000-3FFF   RAM_0  RAM_0  '''RAM_4'''  RAM_0  RAM_0  RAM_0  RAM_0  RAM_0&lt;br /&gt;
  4000-7FFF   RAM_1  RAM_1  '''RAM_5'''  '''RAM_3'''  '''RAM_4'''  '''RAM_5'''  '''RAM_6'''  '''RAM_7'''&lt;br /&gt;
  8000-BFFF   RAM_2  RAM_2  '''RAM_6'''  RAM_2  RAM_2  RAM_2  RAM_2  RAM_2&lt;br /&gt;
  C000-FFFF   RAM_3  '''RAM_7'''  '''RAM_7'''  '''RAM_7'''  RAM_3  RAM_3  RAM_3  RAM_3&lt;br /&gt;
&lt;br /&gt;
The Video RAM is always located in the first 64K, VRAM is in no way affected by this register.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Programming the Gate Array - Examples  ==&lt;br /&gt;
&lt;br /&gt;
Defining the colours, &amp;lt;br&amp;gt;Setting pen 0 to Bright White. &lt;br /&gt;
&amp;lt;pre&amp;gt;LD BC,7F00&amp;amp;nbsp;;Gate Array port&lt;br /&gt;
LD A,%00000000+0&amp;amp;nbsp;;Pen number (and Gate Array function)&lt;br /&gt;
OUT (C),A&amp;amp;nbsp;;Send pen number&lt;br /&gt;
LD A,%01000000+11&amp;amp;nbsp;;Pen colour (and Gate Array function)&lt;br /&gt;
OUT (C),A&amp;amp;nbsp;;Send it&lt;br /&gt;
RET&lt;br /&gt;
&lt;br /&gt;
Setting the mode and ROM configuration, &lt;br /&gt;
Mode 2, upper and lower ROM disabled.&lt;br /&gt;
&lt;br /&gt;
LD BC,7F00&amp;amp;nbsp;;Gate array port&lt;br /&gt;
LD A,%10000000+%00001110&amp;amp;nbsp;;Mode and ROM selection (and Gate Array function)&lt;br /&gt;
OUT (C),A&amp;amp;nbsp;;Send it&lt;br /&gt;
RET&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Misc ===&lt;br /&gt;
&lt;br /&gt;
The hardware colour number is different to the colour range used by the firmware, so a conversion chart is provided for the corresponding firmware/hardware colour values and the corresponding colour name. &lt;br /&gt;
&lt;br /&gt;
=== Note ===&lt;br /&gt;
&lt;br /&gt;
The firmware keeps track of the colours it is using. Every VSYNC (assuming interrupts are enabled) the firmware sets the colours. This enables the user to have flashing colours. If the user selects a new colour using the gate array, the new colour will flash temporarily and then return to its original colour. This is due to the firmware resetting the colour. When using the firmware, use its routines to select the colour, and the colour will remain.&lt;br /&gt;
&lt;br /&gt;
Example: [For whatever reason, this example does NOT refer to the above firmware stuff]&lt;br /&gt;
&amp;lt;pre&amp;gt;ld bc,7f00+1&amp;amp;nbsp;;Gate array function (set pen)&lt;br /&gt;
;and pen number&lt;br /&gt;
out (c),c&lt;br /&gt;
ld bc,7f00&amp;amp;nbsp;;41 &lt;br /&gt;
;Gate array function (set colour)&lt;br /&gt;
;and colour number&lt;br /&gt;
out (c),c&lt;br /&gt;
ret&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Video memory structure ==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!rowspan=2|Graphics Mode&lt;br /&gt;
!colspan=8|VRAM byte&lt;br /&gt;
!colspan=8|Displayed Pixels&lt;br /&gt;
!rowspan=2|Definition&lt;br /&gt;
!rowspan=2|Pixel clock&lt;br /&gt;
!rowspan=2|Default resolution&lt;br /&gt;
|-&lt;br /&gt;
!7&lt;br /&gt;
!6&lt;br /&gt;
!5&lt;br /&gt;
!4&lt;br /&gt;
!3&lt;br /&gt;
!2&lt;br /&gt;
!1&lt;br /&gt;
!0&lt;br /&gt;
!1&lt;br /&gt;
!2&lt;br /&gt;
!3&lt;br /&gt;
!4&lt;br /&gt;
!5&lt;br /&gt;
!6&lt;br /&gt;
!7&lt;br /&gt;
!8&lt;br /&gt;
|-&lt;br /&gt;
|0&lt;br /&gt;
|A0&lt;br /&gt;
|B0&lt;br /&gt;
|A2&lt;br /&gt;
|B2&lt;br /&gt;
|A1&lt;br /&gt;
|B1&lt;br /&gt;
|A3&lt;br /&gt;
|B3&lt;br /&gt;
|colspan=4 style=&amp;quot;text-align: center;&amp;quot;|A&lt;br /&gt;
|colspan=4 style=&amp;quot;text-align: center;&amp;quot;|B&lt;br /&gt;
|2 pixels in 16 colours&lt;br /&gt;
|4 MHz&lt;br /&gt;
|160x200, 20-column text&lt;br /&gt;
|-&lt;br /&gt;
|1&lt;br /&gt;
|A0&lt;br /&gt;
|B0&lt;br /&gt;
|C0&lt;br /&gt;
|D0&lt;br /&gt;
|A1&lt;br /&gt;
|B1&lt;br /&gt;
|C1&lt;br /&gt;
|D1&lt;br /&gt;
|colspan=2 style=&amp;quot;text-align: center;&amp;quot;|A&lt;br /&gt;
|colspan=2 style=&amp;quot;text-align: center;&amp;quot;|B&lt;br /&gt;
|colspan=2 style=&amp;quot;text-align: center;&amp;quot;|C&lt;br /&gt;
|colspan=2 style=&amp;quot;text-align: center;&amp;quot;|D&lt;br /&gt;
|4 pixels in 4 colours&lt;br /&gt;
|8 MHz&lt;br /&gt;
|320x200, 40-column text&lt;br /&gt;
|-&lt;br /&gt;
|2&lt;br /&gt;
|A0&lt;br /&gt;
|B0&lt;br /&gt;
|C0&lt;br /&gt;
|D0&lt;br /&gt;
|E0&lt;br /&gt;
|F0&lt;br /&gt;
|G0&lt;br /&gt;
|H0&lt;br /&gt;
|A&lt;br /&gt;
|B&lt;br /&gt;
|C&lt;br /&gt;
|D&lt;br /&gt;
|E&lt;br /&gt;
|F&lt;br /&gt;
|G&lt;br /&gt;
|H&lt;br /&gt;
|8 pixels in 2 colours&lt;br /&gt;
|16 MHz&lt;br /&gt;
|640x200, 80-column text&lt;br /&gt;
|-&lt;br /&gt;
|3&lt;br /&gt;
|A0&lt;br /&gt;
|B0&lt;br /&gt;
|x&lt;br /&gt;
|x&lt;br /&gt;
|A1&lt;br /&gt;
|B1&lt;br /&gt;
|x&lt;br /&gt;
|x&lt;br /&gt;
|colspan=4 style=&amp;quot;text-align: center;&amp;quot;|A&lt;br /&gt;
|colspan=4 style=&amp;quot;text-align: center;&amp;quot;|B&lt;br /&gt;
|2 pixels in 4 colours&lt;br /&gt;
|4 MHz&lt;br /&gt;
|160x200, 20-column text&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Split rasters ==&lt;br /&gt;
&lt;br /&gt;
On the CPC, split rasters occur halfway (after the 8th mode2 pixel) through the rendering of a CRTC character.&lt;br /&gt;
&lt;br /&gt;
On Amstrad Plus, split rasters occur quarter of the way (after the 4th mode2 pixel) through the rendering of a CRTC character.&lt;br /&gt;
&lt;br /&gt;
To easily make split rasters compatible with both the CPC and the Plus machines, one can use the ASIC soft-scroll control register (SSCR) to finely adjust the horizontal position of the graphics.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Palette R,G,B definitions ==&lt;br /&gt;
&lt;br /&gt;
There are 27 colours which are generated from red, green and blue mixed in different quantities. There are 3 levels of red, 3 levels of green and 3 levels of blue, and these can be thought of as off/no colour, half-on/half-colour, and on/full-colour. &lt;br /&gt;
&lt;br /&gt;
To display a CPC image you will need to use a analogue monitor with a composite sync.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Palette sorted by Firmware Colour Numbers ===&lt;br /&gt;
&lt;br /&gt;
The firmware colour palette is sorted by luminance value.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
|-&lt;br /&gt;
!Firmware Number&lt;br /&gt;
!Hardware Number&lt;br /&gt;
!Colour Name&lt;br /&gt;
!R %&lt;br /&gt;
!G %&lt;br /&gt;
!B %&lt;br /&gt;
!ASIC&lt;br /&gt;
!Colour&lt;br /&gt;
|-&lt;br /&gt;
| 0|| 54h          ||Black          ||  0||  0||  0|| #000||bgcolor=&amp;quot;#000000&amp;quot;|&lt;br /&gt;
|-&lt;br /&gt;
| 1|| 44h (or 50h) ||Blue           ||  0||  0|| 50|| #006||bgcolor=&amp;quot;#000080&amp;quot;|&lt;br /&gt;
|-&lt;br /&gt;
| 2|| 55h          ||Bright Blue    ||  0||  0||100|| #00F||bgcolor=&amp;quot;#0000ff&amp;quot;|&lt;br /&gt;
|-&lt;br /&gt;
| 3|| 5Ch          ||Red            || 50||  0||  0|| #600||bgcolor=&amp;quot;#800000&amp;quot;|&lt;br /&gt;
|-&lt;br /&gt;
| 4|| 58h          ||Magenta        || 50||  0|| 50|| #606||bgcolor=&amp;quot;#800080&amp;quot;|&lt;br /&gt;
|-&lt;br /&gt;
| 5|| 5Dh          ||Mauve          || 50||  0||100|| #60F||bgcolor=&amp;quot;#8000ff&amp;quot;|&lt;br /&gt;
|-&lt;br /&gt;
| 6|| 4Ch          ||Bright Red     ||100||  0||  0|| #F00||bgcolor=&amp;quot;#ff0000&amp;quot;|&lt;br /&gt;
|-&lt;br /&gt;
| 7|| 45h (or 48h) ||Purple         ||100||  0|| 50|| #F06||bgcolor=&amp;quot;#ff0080&amp;quot;|&lt;br /&gt;
|-&lt;br /&gt;
| 8|| 4Dh          ||Bright Magenta ||100||  0||100|| #F0F||bgcolor=&amp;quot;#ff00ff&amp;quot;|&lt;br /&gt;
|-&lt;br /&gt;
| 9|| 56h          ||Green          ||  0|| 50||  0|| #060||bgcolor=&amp;quot;#008000&amp;quot;|&lt;br /&gt;
|-&lt;br /&gt;
|10|| 46h          ||Cyan           ||  0|| 50|| 50|| #066||bgcolor=&amp;quot;#008080&amp;quot;|&lt;br /&gt;
|-&lt;br /&gt;
|11|| 57h          ||Sky Blue       ||  0|| 50||100|| #06F||bgcolor=&amp;quot;#0080ff&amp;quot;|&lt;br /&gt;
|-&lt;br /&gt;
|12|| 5Eh          ||Yellow         || 50|| 50||  0|| #660||bgcolor=&amp;quot;#808000&amp;quot;|&lt;br /&gt;
|-&lt;br /&gt;
|13|| 40h (or 41h) ||White          || 50|| 50|| 50||#666||bgcolor=&amp;quot;#808080&amp;quot;|&lt;br /&gt;
|-&lt;br /&gt;
|14|| 5Fh          ||Pastel Blue    || 50|| 50||100|| #66F||bgcolor=&amp;quot;#8080ff&amp;quot;|&lt;br /&gt;
|-&lt;br /&gt;
|15|| 4Eh          ||Orange         ||100|| 50||  0|| #F60|| bgcolor=&amp;quot;#ff8000&amp;quot;|&lt;br /&gt;
|-&lt;br /&gt;
|16|| 47h          ||Pink           ||100|| 50|| 50|| #F66||bgcolor=&amp;quot;#ff8080&amp;quot;|&lt;br /&gt;
|-&lt;br /&gt;
|17|| 4Fh          ||Pastel Magenta ||100|| 50||100|| #F6F||bgcolor=&amp;quot;#ff80ff&amp;quot;|&lt;br /&gt;
|-&lt;br /&gt;
|18|| 52h          ||Bright Green   ||  0||100||  0|| #0F0||bgcolor=&amp;quot;#00ff00&amp;quot;|&lt;br /&gt;
|-&lt;br /&gt;
|19|| 42h (or 51h) ||Sea Green      ||  0||100|| 50|| #0F6||bgcolor=&amp;quot;#00ff80&amp;quot;|&lt;br /&gt;
|-&lt;br /&gt;
|20|| 53h          ||Bright Cyan    ||  0||100||100|| #0FF||bgcolor=&amp;quot;#00ffff&amp;quot;|&lt;br /&gt;
|-&lt;br /&gt;
|21|| 5Ah          ||Lime           || 50||100||  0|| #6F0||bgcolor=&amp;quot;#80ff00&amp;quot;|&lt;br /&gt;
|-&lt;br /&gt;
|22|| 59h          ||Pastel Green   || 50||100|| 50|| #6F6||bgcolor=&amp;quot;#80ff80&amp;quot;|&lt;br /&gt;
|-&lt;br /&gt;
|23|| 5Bh          ||Pastel Cyan    || 50||100||100|| #6FF||bgcolor=&amp;quot;#80ffff&amp;quot;|&lt;br /&gt;
|-&lt;br /&gt;
|24|| 4Ah          ||Bright Yellow  ||100||100||  0|| #FF0||bgcolor=&amp;quot;#ffff00&amp;quot;|&lt;br /&gt;
|-&lt;br /&gt;
|25|| 43h (or 49h) ||Pastel Yellow  ||100||100|| 50||#FF6||bgcolor=&amp;quot;#ffff80&amp;quot;|&lt;br /&gt;
|-&lt;br /&gt;
|26|| 4Bh          ||Bright White   ||100||100||100|| #FFF||bgcolor=&amp;quot;#ffffff&amp;quot;|&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Note: We can observe that the official Amstrad names of some colours are a bit silly: &amp;quot;red&amp;quot; is in fact brown, &amp;quot;yellow&amp;quot; is in fact khaki and &amp;quot;white&amp;quot; is in fact grey.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Amstrad Colour Names ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;gallery&amp;gt;&lt;br /&gt;
Cpc 6128 master colour chat.jpg|Master colour chart&lt;br /&gt;
Cpc 6128 farbtabelle.jpg|Farbtabelle&lt;br /&gt;
Cpc 6128 palette des couleurs.jpg|Palette des couleurs&lt;br /&gt;
Cpc 6128 tabla de colores.jpg|Tabla de colores&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Palette sorted by Hardware Colour Numbers ===&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!Hardware Number&lt;br /&gt;
!Firmware Number&lt;br /&gt;
!R %&lt;br /&gt;
!G %&lt;br /&gt;
!B %&lt;br /&gt;
!ASIC&lt;br /&gt;
!Colour&lt;br /&gt;
!Colour Name&lt;br /&gt;
!German Name&lt;br /&gt;
!French Name&lt;br /&gt;
!Spanish Name&lt;br /&gt;
|-&lt;br /&gt;
|  0 (40h) || 13   || 50|| 50|| 50|| #666|| bgcolor=&amp;quot;#808080&amp;quot; | || White         || Weiß            || Blanc           || Blanco&lt;br /&gt;
|-&lt;br /&gt;
|  1 (41h) || (13) || 50|| 50|| 50|| #666|| bgcolor=&amp;quot;#808080&amp;quot; | || White         || Weiß            || Blanc           || Blanco&lt;br /&gt;
|-&lt;br /&gt;
|  2 (42h) || 19   ||  0||100|| 50|| #0F6|| bgcolor=&amp;quot;#00ff80&amp;quot; | || Sea Green     || Seegrün         || Vert marin      || Verde marino&lt;br /&gt;
|-&lt;br /&gt;
|  3 (43h) || 25   ||100||100|| 50|| #FF6|| bgcolor=&amp;quot;#ffff80&amp;quot; | || Pastel Yellow || Pastellgelb     || Jaune pastel    || Amarillo pastel&lt;br /&gt;
|-&lt;br /&gt;
|  4 (44h) || 1    ||  0||  0|| 50|| #006|| bgcolor=&amp;quot;#000080&amp;quot; | || Blue          || Blau            || Bleu            || Azul&lt;br /&gt;
|-&lt;br /&gt;
|  5 (45h) || 7    ||100||  0|| 50|| #F06|| bgcolor=&amp;quot;#ff0080&amp;quot; | || Purple        || Purpur          || Pourpre         || Púrpura&lt;br /&gt;
|-&lt;br /&gt;
|  6 (46h) || 10   ||  0|| 50|| 50|| #066|| bgcolor=&amp;quot;#008080&amp;quot; | || Cyan          || Blaugrün        || Turquoise       || Ciano&lt;br /&gt;
|-&lt;br /&gt;
|  7 (47h) || 16   ||100|| 50|| 50|| #F66|| bgcolor=&amp;quot;#ff8080&amp;quot; | || Pink          || Rosa            || Rose            || Rosa&lt;br /&gt;
|-&lt;br /&gt;
|  8 (48h) || (7)  ||100||  0|| 50|| #F06|| bgcolor=&amp;quot;#ff0080&amp;quot; | || Purple        || Purpur          || Pourpre         || Púrpura&lt;br /&gt;
|-&lt;br /&gt;
|  9 (49h) || (25) ||100||100|| 50|| #FF6|| bgcolor=&amp;quot;#ffff80&amp;quot; | || Pastel Yellow || Pastellgelb     || Jaune pastel    || Amarillo pastel&lt;br /&gt;
|-&lt;br /&gt;
| 10 (4Ah) || 24   ||100||100||  0|| #FF0|| bgcolor=&amp;quot;#ffff00&amp;quot; | || Bright Yellow || Hellgelb        || Jaune vif       || Amarillo brillante&lt;br /&gt;
|-&lt;br /&gt;
| 11 (4Bh) || 26   ||100||100||100|| #FFF|| bgcolor=&amp;quot;#ffffff&amp;quot; | || Bright White  || Leuchtendweiß   || Blanc brillant  || Blanco brillante&lt;br /&gt;
|-&lt;br /&gt;
| 12 (4Ch) || 6    ||100||  0||  0|| #F00|| bgcolor=&amp;quot;#ff0000&amp;quot; | || Bright Red    || Hellrot         || Rouge vif       || Rojo brillante&lt;br /&gt;
|-&lt;br /&gt;
| 13 (4Dh) || 8    ||100||  0||100|| #F0F|| bgcolor=&amp;quot;#ff00ff&amp;quot; | || Bright Magenta|| helles Magenta  || Magenta vif     || Magenta brillante&lt;br /&gt;
|-&lt;br /&gt;
| 14 (4Eh) || 15   ||100|| 50||  0|| #F60|| bgcolor=&amp;quot;#ff8000&amp;quot; | || Orange        || Orange          || Orange          || Naranja&lt;br /&gt;
|-&lt;br /&gt;
| 15 (4Fh) || 17   ||100|| 50||100|| #F6F|| bgcolor=&amp;quot;#ff80ff&amp;quot; | || Pastel Magenta|| Pastell-magenta || Magenta pastel  || Magenta pastel&lt;br /&gt;
|-&lt;br /&gt;
| 16 (50h) || (1)  ||  0||  0|| 50|| #006|| bgcolor=&amp;quot;#000080&amp;quot; | || Blue          || Blau            || Bleu            || Azul&lt;br /&gt;
|-&lt;br /&gt;
| 17 (51h) || (19) ||  0||100|| 50|| #0F6|| bgcolor=&amp;quot;#00ff80&amp;quot; | || Sea Green     || Seegrün         || Vert marin      || Verde marino&lt;br /&gt;
|-&lt;br /&gt;
| 18 (52h) || 18   ||  0||100||  0|| #0F0|| bgcolor=&amp;quot;#00ff00&amp;quot; | || Bright Green  || Hellgrün        || Vert vif        || Verde brillante&lt;br /&gt;
|-&lt;br /&gt;
| 19 (53h) || 20   ||  0||100||100|| #0FF|| bgcolor=&amp;quot;#00ffff&amp;quot; | || Bright Cyan   || helles Blaugrün || Turquoise vif   || Ciano brillante&lt;br /&gt;
|-&lt;br /&gt;
| 20 (54h) || 0    ||  0||  0||  0|| #000|| bgcolor=&amp;quot;#000000&amp;quot; | || Black         || Schwarz         || Noir            || Negro&lt;br /&gt;
|-&lt;br /&gt;
| 21 (55h) || 2    ||  0||  0||100|| #00F|| bgcolor=&amp;quot;#0000ff&amp;quot; | || Bright Blue   || Hellblau        || Bleu vif        || Azul brillante&lt;br /&gt;
|-&lt;br /&gt;
| 22 (56h) || 9    ||  0|| 50||  0|| #060|| bgcolor=&amp;quot;#008000&amp;quot; | || Green         || Grün            || Vert            || Verde&lt;br /&gt;
|-&lt;br /&gt;
| 23 (57h) || 11   ||  0|| 50||100|| #06F|| bgcolor=&amp;quot;#0080ff&amp;quot; | || Sky Blue      || Himmelblau      || Bleu ciel       || Azul cielo&lt;br /&gt;
|-&lt;br /&gt;
| 24 (58h) || 4    || 50||  0|| 50|| #606|| bgcolor=&amp;quot;#800080&amp;quot; | || Magenta       || Magenta         || Magenta         || Magenta&lt;br /&gt;
|-&lt;br /&gt;
| 25 (59h) || 22   || 50||100|| 50|| #6F6|| bgcolor=&amp;quot;#80ff80&amp;quot; | || Pastel Green  || Pastellgrün     || Vert pastel     || Verde pastel&lt;br /&gt;
|-&lt;br /&gt;
| 26 (5Ah) || 21   || 50||100||  0|| #6F0|| bgcolor=&amp;quot;#80ff00&amp;quot; | || Lime          || Limonengrün     || Vert citron     || Verde lima&lt;br /&gt;
|-&lt;br /&gt;
| 27 (5Bh) || 23   || 50||100||100|| #6FF|| bgcolor=&amp;quot;#80ffff&amp;quot; | || Pastel Cyan   || Pastell-blaugrün|| Turquoise pastel|| Ciano pastel&lt;br /&gt;
|-&lt;br /&gt;
| 28 (5Ch) || 3    || 50||  0||  0|| #600|| bgcolor=&amp;quot;#800000&amp;quot; | || Red           || Rot             || Rouge           || Rojo&lt;br /&gt;
|-&lt;br /&gt;
| 29 (5Dh) || 5    || 50||  0||100|| #60F|| bgcolor=&amp;quot;#8000ff&amp;quot; | || Mauve         || Hellviolett     || Mauve           || Malva&lt;br /&gt;
|-&lt;br /&gt;
| 30 (5Eh) || 12   || 50|| 50||  0|| #660|| bgcolor=&amp;quot;#808000&amp;quot; | || Yellow        || Gelb            || Jaune           || Amarillo&lt;br /&gt;
|-&lt;br /&gt;
| 31 (5Fh) || 14   || 50|| 50||100|| #66F|| bgcolor=&amp;quot;#8080ff&amp;quot; | || Pastel Blue   || Pastellblau     || Bleu pastel     || Azul pastel&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Intensities ===&lt;br /&gt;
&lt;br /&gt;
The 0%, 50%, and 100% values in the above tables are &amp;quot;should-be&amp;quot; values. However, the real hardware doesn't exactly match that intensities. The actual intensities depend on the luminance mixing (R,G,B tied together via resistors), on chipset (classic CPC, or newer ASIC ones), and on the load applied by external hardware (Monitor, or TV set).&lt;br /&gt;
&lt;br /&gt;
On an actual Amstrad CPC, the half-intensity colour signal is measured to be closer to 40% rather than the expected 50%. This was verified by [[Grim]] and independently confirmed by [[Nocash]]. [https://www.grimware.org/doku.php/documentations/devices/gatearray#inkr Source]&lt;br /&gt;
* [[CPC Palette]] - some more details&lt;br /&gt;
&lt;br /&gt;
This explains why the Amstrad engineers used the following values to adapt the old colour palette to the new 12-bit palette on the Amstrad Plus:&lt;br /&gt;
* 0% became #0&lt;br /&gt;
* 50% became #6. They specifically chose #6 for the 50% value instead of the expected #7 or #8, to better match the real Amstrad CPC palette.&lt;br /&gt;
* 100% became #F&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Green Screen Colours ===&lt;br /&gt;
&lt;br /&gt;
On a green screen, where all colours are shades of unsaturated green, the firmware colours are in order of increasing intensity. Black is darkest green, bright white is brightest green, and firmware colour 13 is a medium green.&lt;br /&gt;
&lt;br /&gt;
The luminance (Y) is not exactly correlated to the actual luminance of colour images broadcast in RGB. Amstrad preferred to propose a completely different image system, not comparable to a conversion to monochrome, which would have limited the number of brightness levels to 21 (for example, colours 9 and 6 would have had the same luminance).&lt;br /&gt;
&lt;br /&gt;
They opted for a table of 27 linear brightness steps. They assigned values of 1 (1kΩ) for blue, 3 (3.3kΩ) for red, and 9 (10kΩ) for green.&lt;br /&gt;
&lt;br /&gt;
==== To calculate the luminance value ====&lt;br /&gt;
&lt;br /&gt;
'''Red''' &lt;br /&gt;
&lt;br /&gt;
*0% =&amp;amp;gt; do not add anything &lt;br /&gt;
*50% =&amp;amp;gt; add 3 &lt;br /&gt;
*100% =&amp;amp;gt; add 6 &lt;br /&gt;
&lt;br /&gt;
'''Green''' &lt;br /&gt;
&lt;br /&gt;
*0% =&amp;amp;gt; do not add anything &lt;br /&gt;
*50% =&amp;amp;gt; add 9 &lt;br /&gt;
*100% =&amp;amp;gt; add 18 &lt;br /&gt;
&lt;br /&gt;
'''Blue''' &lt;br /&gt;
&lt;br /&gt;
*0% =&amp;amp;gt; do not add anything &lt;br /&gt;
*50% =&amp;amp;gt; add 1 &lt;br /&gt;
*100% =&amp;amp;gt; add 2 &lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Pictures ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;gallery&amp;gt;&lt;br /&gt;
Image:40010_am2_metal.jpg|40010 GA Metal Layer&lt;br /&gt;
Image:40010_am2_acid.jpg|40010 GA with Metal Layer removed&lt;br /&gt;
Image:40226_am4_metal.jpg|40226 PreASIC Metal Layer&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[File:Ga.pinout.40007.png]] [[File:Ga.pinout.40008.40010.png]]&lt;br /&gt;
&lt;br /&gt;
Note: Some CPC motherboards can accommodate both types of Gate Array pinouts. [https://thecheshirec.at/2024/10/06/il-existe-une-carte-multi-gate-array-et-cest-amstrad-qui-la-faite/ Source]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== External links ==&lt;br /&gt;
*[https://bread80.com/2021/06/03/understanding-the-amstrad-cpc-video-ram-and-gate-array-subsystem/ Electronic signals analysis of the Gate Array by Bread80]&lt;br /&gt;
* [https://shaker.logonsystem.eu/ACCC1.8-EN.pdf Gate Array documentation in Amstrad CRTC Compendium]&lt;br /&gt;
* [https://www.grimware.org/doku.php/documentations/devices/gatearray Gate Array documentation from Grimware]&lt;br /&gt;
* [http://quasar.cpcscene.net/doku.php?id=assem:gate_array Quasar Gate Array documentation (in french)]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==See also==&lt;br /&gt;
&lt;br /&gt;
*[[Gate Array and ASIC Pin-Outs]]&lt;br /&gt;
*[[PAL16L8]] : for RAM arrangement&lt;br /&gt;
*[[ASIC]] : for Plus users&lt;br /&gt;
&lt;br /&gt;
*[[CRTC]] : the other video stuff&lt;br /&gt;
*[[Synchronising with the CRTC and display]] : technical details on the relationship between Gate Array and CRTC.&lt;br /&gt;
&lt;br /&gt;
*[[Video modes]] : for other informations on colours and pixels.&lt;br /&gt;
&lt;br /&gt;
*[[Media:40010-simplified V03.pdf]] [https://www.cpcwiki.eu/forum/amstrad-cpc-hardware/gate-array-decapped!/msg170713/#msg170713 Forum thread] Gate Array schematics - reverse engineered by Gerald&lt;br /&gt;
&lt;br /&gt;
[[Category:Hardware]][[Category:Programming]][[Category:Datasheet]][[Category:Graphic]][[Category:CPC Internal Components]][[Category:Electronic Component]]&lt;/div&gt;</summary>
		<author><name>Longshot</name></author>	</entry>

	<entry>
		<id>https://oldwiki.cpcwiki.eu/index.php?title=CRTC&amp;diff=126045</id>
		<title>CRTC</title>
		<link rel="alternate" type="text/html" href="https://oldwiki.cpcwiki.eu/index.php?title=CRTC&amp;diff=126045"/>
				<updated>2025-05-18T20:03:26Z</updated>
		
		<summary type="html">&lt;p&gt;Longshot: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[File:CRTC6845-Type2.jpg|thumb|right|CRTC Type 2]]&lt;br /&gt;
&lt;br /&gt;
The 6845 '''CRTC''' (Cathode Ray Tube Controller) chip was created by Motorola in 1977. It works with the [[Gate Array]] to generate the video signal on the Amstrad CPC.&lt;br /&gt;
&lt;br /&gt;
This chip is also used in the [[BBC Micro]], [[Lynx|Camputers Lynx]], [[EG2000 Colour Genie]], [[Sharp X1]], [[MicroBee]], [[Commodore PET]] and the early graphics cards (MDA, Hercules, CGA, Plantronics Colorplus) for [[IBM PC]]. And it is found in some [https://www.msx.org/wiki/Hitachi_HD6845 MSX1 expansions], providing an 80-column text mode.&lt;br /&gt;
&lt;br /&gt;
It's important to note that the CRTC chip is primarily designed for character-based displays. It explains why, on the Amstrad CPC, the video memory is organized into a grid of characters rather than a purely linear bitmap.&lt;br /&gt;
&lt;br /&gt;
NOTES: &lt;br /&gt;
* This document describes the functionality in terms of the CPC with its separate CRTC and Gate-Array. The Plus has both integrated into the same IC, but could be considered to have two functional blocks, one for CRTC and one for Gate-Array. In this document the term 'Gate-Array' is used, but this also applies to the ASIC.&lt;br /&gt;
* Much information has been drawn from the [https://shaker.logonsystem.eu/ CRTC Compendium] documentation. For more details, timing diagrams, code examples, coding tips, and more, refer to that documentation.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Overview ==&lt;br /&gt;
&lt;br /&gt;
The 6845 Cathode Ray Tube Controller (CRTC) is a programmable IC used to generate video displays. This IC is used in a variety of computers including the Amstrad CPC, Amstrad Plus and KC Compact. &lt;br /&gt;
&lt;br /&gt;
The CRTC is a simple chip. It is made up of counters and equality operators, tied by simple logic. All the complexity stems from its multiple independent implementations with their subtle differences.&lt;br /&gt;
&lt;br /&gt;
The CRTC was a common part available from many different manufacturers. During the life of the CPC, Amstrad sourced the CRTC from various manufacturers. &lt;br /&gt;
&lt;br /&gt;
All ICs used were based on the same design but have a different implementation. As a result they do not operate identically in all situations. This document highlights these differences. &lt;br /&gt;
&lt;br /&gt;
This table lists the known ICs used, with their part number, manufacturer and type number. &lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!Part number&lt;br /&gt;
!Manufacturer&lt;br /&gt;
!Type number (note 3)&lt;br /&gt;
|-&lt;br /&gt;
|HD6845S||Hitachi||0&lt;br /&gt;
|-&lt;br /&gt;
|UM6845||UMC||0&lt;br /&gt;
|-&lt;br /&gt;
|UM6845R||UMC||1&lt;br /&gt;
|-&lt;br /&gt;
|MC6845||Motorola||2&lt;br /&gt;
|-&lt;br /&gt;
|AMS40489||Amstrad||3 (note 1)&lt;br /&gt;
|-&lt;br /&gt;
|AMS40226||Amstrad||4 (note 2)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
'''NOTES''' &lt;br /&gt;
&lt;br /&gt;
1. The CRTC functionality is integrated into the CPC+ ASIC. This type exists only in the 464 Plus, 6128 Plus and GX4000. &lt;br /&gt;
&lt;br /&gt;
2. This type exists in &amp;quot;cost-down&amp;quot; CPC464 and CPC6128 systems. In the &amp;quot;cost-down&amp;quot; the CRTC functionality is integrated into a single ASIC IC. This ASIC is often refered to as the &amp;quot;Pre-ASIC&amp;quot; because it preceeded the CPC+ ASIC. The CRTC functionality of the Pre-ASIC is almost identical to the CRTC within the ASIC.&lt;br /&gt;
 &lt;br /&gt;
3. In the Amstrad community each 6845 implementation has been assigned a type number. This type identifies a group of implementations which operate in exactly the same way. The type number system was originally used by demo programmers. &lt;br /&gt;
&lt;br /&gt;
It is possible to detect the 6845 present using software methods, and this is done to: &lt;br /&gt;
&lt;br /&gt;
* warn that the software was not designed for the detected 6845 and may function incorrectly&lt;br /&gt;
* to adapt the software so that it will run with the detected 6845 &lt;br /&gt;
* In most cases, the type of the detected 6845 is reported&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Programming==&lt;br /&gt;
&lt;br /&gt;
The 6845 is selected when bit 14 of the I/O port address is set to &amp;quot;0&amp;quot;. Bit 9 and 8 of the I/O port address define the function to access. The remaining bits can be any value, but it is adviseable to set these to &amp;quot;1&amp;quot; to avoid conflict with other devices in the system.&lt;br /&gt;
&lt;br /&gt;
The recommended I/O port addresses are:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!I/O port address&lt;br /&gt;
!/CS (A14)&lt;br /&gt;
!R/W (A9)&lt;br /&gt;
!RS (A8)&lt;br /&gt;
!Function&lt;br /&gt;
!Read/Write&lt;br /&gt;
|-&lt;br /&gt;
|&amp;amp;BCxx||0||0||0||Select 6845 register||Write only&lt;br /&gt;
|-&lt;br /&gt;
|&amp;amp;BDxx||0||0||1||Write to selected internal 6845 register||Write only&lt;br /&gt;
|-&lt;br /&gt;
|&amp;amp;BExx||0||1||0||&lt;br /&gt;
* CRTCs 0/2: —&lt;br /&gt;
* CRTC 1: Read Status Register&lt;br /&gt;
* CRTCs 3/4: Read from selected internal 6845 register&lt;br /&gt;
||Read only&lt;br /&gt;
|-&lt;br /&gt;
|&amp;amp;BFxx||0||1||1||Read from selected internal 6845 register||Read only&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
The CRTC is not connected to the CPU's RD and WR pins, so it cannot detect the bus's I/O direction. Therefore, executing an IN instruction to the select or write functions causes the CRTC to write the unpredictable data provided by the high-impedance bus to its registers.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Z80 I/O access timings ===&lt;br /&gt;
&lt;br /&gt;
The clock provided to the CRTC by the ASIC/Pre-ASIC is phase-shifted compared to the one provided by the Gate Array.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+&lt;br /&gt;
! Instructions !! Duration !! I/O CRTCs 0/1/2 !! I/O CRTCs 3/4&lt;br /&gt;
|-&lt;br /&gt;
| OUT (C),r8 || 4 µsec || '''3rd µsec''' || 4th µsec&lt;br /&gt;
|-&lt;br /&gt;
| OUT (C),0 || 4 µsec || '''3rd µsec''' || 4th µsec&lt;br /&gt;
|-&lt;br /&gt;
| OUT (n),A || 3 µsec || 3rd µsec || 3rd µsec&lt;br /&gt;
|-&lt;br /&gt;
| OUTI || 5 µsec || 5th µsec || 5th µsec&lt;br /&gt;
|-&lt;br /&gt;
| OUTD || 5 µsec || 5th µsec || 5th µsec&lt;br /&gt;
|-&lt;br /&gt;
| IN r8,(C) || 4 µsec || 4th µsec || 4th µsec&lt;br /&gt;
|-&lt;br /&gt;
| INI || 5 µsec || '''4th µsec''' || '''4th µsec'''&lt;br /&gt;
|-&lt;br /&gt;
| IND || 5 µsec || '''4th µsec''' || '''4th µsec'''&lt;br /&gt;
|-&lt;br /&gt;
| IN A,(n) || 3 µsec || 3rd µsec || 3rd µsec&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Video Memory Address (VMA)==&lt;br /&gt;
&lt;br /&gt;
The VMA of the [[Gate Array]] is constructed from the CRTC MA and RA signals:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!Video Memory Address&lt;br /&gt;
!Signal source&lt;br /&gt;
!Signal name&lt;br /&gt;
|-&lt;br /&gt;
|A15||6845||MA13 &lt;br /&gt;
|-&lt;br /&gt;
|A14||6845||MA12&lt;br /&gt;
|-&lt;br /&gt;
|A13||6845||'''RA2'''&lt;br /&gt;
|-&lt;br /&gt;
|A12||6845||'''RA1'''&lt;br /&gt;
|-&lt;br /&gt;
|A11||6845||'''RA0'''&lt;br /&gt;
|-&lt;br /&gt;
|A10||6845||MA9 &lt;br /&gt;
|-&lt;br /&gt;
|A9||6845||MA8 &lt;br /&gt;
|-&lt;br /&gt;
|A8||6845||MA7 &lt;br /&gt;
|-&lt;br /&gt;
|A7||6845||MA6 &lt;br /&gt;
|-&lt;br /&gt;
|A6||6845||MA5 &lt;br /&gt;
|-&lt;br /&gt;
|A5||6845||MA4 &lt;br /&gt;
|-&lt;br /&gt;
|A4||6845||MA3 &lt;br /&gt;
|-&lt;br /&gt;
|A3||6845||MA2 &lt;br /&gt;
|-&lt;br /&gt;
|A2||6845||MA1 &lt;br /&gt;
|-&lt;br /&gt;
|A1||6845||MA0&lt;br /&gt;
|-&lt;br /&gt;
|A0||Gate-Array||CCLK&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
CRTC generates the address, Gate Array reads the data and converts it to pixels based on its current graphics mode and palette.&lt;br /&gt;
&lt;br /&gt;
CRTC pins RA3, RA4, MA10, MA11 are not connected on CPC.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Overscan bits ===&lt;br /&gt;
&lt;br /&gt;
It is possible to use 32KB screen size (used for [[Programming:Overscan|overscan]]) by setting bits 11 and 10 of Register 12 both to 1. Bits MA11 and MA10 of the address generated by the CRTC are not written on the address bus to access video memory; settings both bits to 1 is the only way to cause a carry to bit MA12 when address pass over the end of current video page to change the memory address to the next video page.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ CRTC Display Start Address&lt;br /&gt;
|-&lt;br /&gt;
! colspan=&amp;quot;8&amp;quot; | Register 12&lt;br /&gt;
! colspan=&amp;quot;8&amp;quot; | Register 13&lt;br /&gt;
|-&lt;br /&gt;
! 15 !! 14 !! 13 !! 12 !! 11 !! 10 !! 9 !! 8&lt;br /&gt;
! 7 !! 6 !! 5 !! 4 !! 3 !! 2 !! 1 !! 0&lt;br /&gt;
|-&lt;br /&gt;
| colspan=&amp;quot;2&amp;quot; | Unused&lt;br /&gt;
| colspan=&amp;quot;2&amp;quot; | Video Page&lt;br /&gt;
| colspan=&amp;quot;2&amp;quot; | Page Size&lt;br /&gt;
| colspan=&amp;quot;10&amp;quot; | Start Address (1024 positions)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| style=&amp;quot;white-space: nowrap;&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;margin-right: 32px&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Bit 13 !! Bit 12 !! Video Page&lt;br /&gt;
|-&lt;br /&gt;
| 0 || 0 || 0000 - 3FFF&lt;br /&gt;
|-&lt;br /&gt;
| 0 || 1 || 4000 - 7FFF&lt;br /&gt;
|-&lt;br /&gt;
| 1 || 0 || 8000 - BFFF&lt;br /&gt;
|-&lt;br /&gt;
| 1 || 1 || C000 - FFFF&lt;br /&gt;
|}&lt;br /&gt;
|&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Bit 11 !! Bit 10 !! Page Size&lt;br /&gt;
|-&lt;br /&gt;
| 0 || 0 || 16KB&lt;br /&gt;
|-&lt;br /&gt;
| 0 || 1 || 16KB&lt;br /&gt;
|-&lt;br /&gt;
| 1 || 0 || 16KB&lt;br /&gt;
|-&lt;br /&gt;
| 1 || 1 || '''32KB'''&lt;br /&gt;
|}&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Coarse hardware scrolling ===&lt;br /&gt;
&lt;br /&gt;
The start address can be manipulated to achieve horizontal and/or vertical hardware scrolling:&lt;br /&gt;
&lt;br /&gt;
*To move right: &amp;lt;code&amp;gt;start_address := start_address + 1&amp;lt;/code&amp;gt;&lt;br /&gt;
*To move left: &amp;lt;code&amp;gt;start_address := start_address - 1&amp;lt;/code&amp;gt;&lt;br /&gt;
*To move down: &amp;lt;code&amp;gt;start_address := start_address + R1&amp;lt;/code&amp;gt;&lt;br /&gt;
*To move up: &amp;lt;code&amp;gt;start_address := start_address - R1&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
However, it is a position in word (16 bits), not in byte. So, the screen will move two bytes at a time horizontally. Also, the precision will be one CRTC character vertically.&lt;br /&gt;
&lt;br /&gt;
The first game that used R12/R13 for both horizontal and vertical hardware scrolling is [https://www.cpc-power.com/index.php?page=detail&amp;amp;num=1839 Roland on the Ropes], released in 1984.&lt;br /&gt;
&lt;br /&gt;
The following BASIC program demonstrates the coarse scrolling by setting the R12 and R13 registers based on keyboard input:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
10 ma%=0&lt;br /&gt;
20 IF INKEY(1)=0 THEN GOSUB 100&lt;br /&gt;
30 IF INKEY(2)=0 THEN GOSUB 300&lt;br /&gt;
40 IF INKEY(8)=0 THEN GOSUB 500&lt;br /&gt;
50 IF INKEY(0)=0 THEN GOSUB 700&lt;br /&gt;
60 GOTO 20&lt;br /&gt;
100 ' right&lt;br /&gt;
110 ma%=ma%+1: GOSUB 900: RETURN&lt;br /&gt;
300 ' down&lt;br /&gt;
310 ma%=ma%+40: GOSUB 900: RETURN&lt;br /&gt;
500 ' left&lt;br /&gt;
510 ma%=ABS(ma%-1): GOSUB 900: RETURN&lt;br /&gt;
700 ' up&lt;br /&gt;
710 ma%=ABS(ma%-40): GOSUB 900: RETURN&lt;br /&gt;
900 ' set R12 and R13&lt;br /&gt;
910 l%=ma% AND 255: h%=&amp;amp;30 OR ((ma%\256) AND 3) :OUT &amp;amp;BC00,13:OUT &amp;amp;BD00,l%: OUT &amp;amp;BC00,12:OUT &amp;amp;BD00,h%&lt;br /&gt;
930 RETURN&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Which looks like the following:&lt;br /&gt;
&lt;br /&gt;
[[File:CRTC-Coarse-scroll.gif]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Advanced hardware scrolling ===&lt;br /&gt;
&lt;br /&gt;
To achieve smoother hardware scrolling, other tricks are required in complement to R12/R13. Usually, R3 is used for smooth horizontal scroll and R5 for smooth vertical scroll.&lt;br /&gt;
&lt;br /&gt;
A good example of smooth hardware multidirectional scrolling game on CPC is [https://www.cpc-power.com/index.php?page=detail&amp;amp;num=2119 Super Cauldron], released in 1993.&lt;br /&gt;
&lt;br /&gt;
Everything you need to know about hardware scrolling on CPC can be found [https://www.cpcwiki.eu/forum/programming/hardware-scrolling-21687/ there].&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Split screen (aka Rupture) ==&lt;br /&gt;
&lt;br /&gt;
While there is usually 1 CRTC frame per screen frame, the screen frame can be divided into multiple CRTC frames of varying proportions.&lt;br /&gt;
&lt;br /&gt;
This is useful for defining different scrolling zones in your screen frame. For example, it was used for hardware parallax scrolling in the game [https://www.cpc-power.com/index.php?page=detail&amp;amp;num=1307 The Living Daylights], released in 1987. [https://www.cpcwiki.eu/forum/programming/the-living-daylights-extra-colours-in-mode-1-rasters-screen-splits/ Source]&lt;br /&gt;
&lt;br /&gt;
And this is basically the bread and butter of innumerable CPC demos.&lt;br /&gt;
&lt;br /&gt;
Some rules of thumb [https://www.cpcwiki.eu/forum/programming/advice-on-split-screen-code/msg242186/ Source]:&lt;br /&gt;
* changes to the screen address have to be done anywhere in the previous split&lt;br /&gt;
* changes to the height of the split have to be done inside the current split (after it has started, in the area of the size of the previous split)&lt;br /&gt;
* changes to screen mode and colours are happening immediately&lt;br /&gt;
&lt;br /&gt;
CRTC registers and screen splitting:&lt;br /&gt;
*reg 0 (63) = x-screenwidth (usually always 63)&lt;br /&gt;
*reg 1 (50) = x-splitwidth (e.g.50)&lt;br /&gt;
*reg 2 (51) = x-splitstart (e.g. 51)&lt;br /&gt;
*reg 3 (08) = x-finestart (maybe use this for half-char scrolling)&lt;br /&gt;
*reg 4 (##) = y-splitheight-1 (set this inside the current split)&lt;br /&gt;
*reg 5 (00) = y-finestart&lt;br /&gt;
*reg 6 (25) = y-max visible splitpart (same like 4)&lt;br /&gt;
*reg 7 (##) = inside last split -&amp;gt; set to 0; inside first split, but after vblank -&amp;gt; set to 255&lt;br /&gt;
*reg 9 (07) = y-lines/char-1&lt;br /&gt;
&lt;br /&gt;
Set this inside the previous split:&lt;br /&gt;
*reg12 (##) = address high (char / 256 + block * 16)&lt;br /&gt;
*reg13 (##) = address low  (char mod 256)&lt;br /&gt;
&lt;br /&gt;
Total height of all splits must be 39.&lt;br /&gt;
&lt;br /&gt;
The [https://www.cpcwiki.eu/forum/programming/interrupt-positions-with-various-sized-screens/ IntPos tool] by Kevin Thacker can help visualize the potential split screen areas.&lt;br /&gt;
&lt;br /&gt;
Note: If all you want is multiple graphics modes in the same frame, you don't need to touch the CRTC at all. More information here: [https://www.cpc-power.com/cpcarchives/index.php?page=articles&amp;amp;num=184 Multi-Mode Graphique (FR)]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== CUDISP (aka CURSOR) ==&lt;br /&gt;
&lt;br /&gt;
CUDISP (Cursor Display) signal defines the hardware cursor.&lt;br /&gt;
&lt;br /&gt;
CRTC pin CUDISP is not connected to the Gate Array, so it has no effect on a barebone CPC or Plus machine.&lt;br /&gt;
&lt;br /&gt;
However, this signal is provided to the [[Connector:Expansion port]]. And it is used by the [[PlayCity]] and [[Play2CPC]] expansions.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== DISPTMG (aka Display Enable) ==&lt;br /&gt;
&lt;br /&gt;
DISPTMG (Display Timing) signal defines the border. When DISPTMG is &amp;quot;0&amp;quot; the border colour is output by the Gate Array to the display.&lt;br /&gt;
&lt;br /&gt;
The border has higher priority than pixels but lower priority than the black colour output when HSYNC/VSYNC are active.&lt;br /&gt;
&lt;br /&gt;
While border is active, all the CRTC counters continue to increment normally and addresses continue to be generated.&lt;br /&gt;
&lt;br /&gt;
The DISPTMG signal is composited from its 3 internal subcomponents: HBORDER (Horizontal), VBORDER (Vertical), SBORDER (Split) by using the NOR function. DISPTMG is &amp;quot;0&amp;quot; if at least one of its subcomponents is &amp;quot;1&amp;quot;. These 3 subcomponents are all independent of each other.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== HBORDER ===&lt;br /&gt;
&lt;br /&gt;
On all CRTCs, HBORDER is disabled when HCC=0 and enabled when HCC=R1.&lt;br /&gt;
&lt;br /&gt;
The exception is for CRTC2 during an HSYNC: the HCC=0 check is skipped, so HBORDER stays on.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== VBORDER ===&lt;br /&gt;
&lt;br /&gt;
On all CRTCs, VBORDER is disabled when VCC=0 and enabled when VCC=R6.&lt;br /&gt;
&lt;br /&gt;
On CRTCs 0/1/2, the condition VCC=R6 is tested on every cycle.&lt;br /&gt;
&lt;br /&gt;
On CRTCs 3/4, the condition VCC=R6 is tested only at each new character line start (when VLC=0 and HCC=0).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== SBORDER ===&lt;br /&gt;
&lt;br /&gt;
Split border is a technique similar to split rasters, except that it is handled by the CRTC instead of the [[Gate Array]].&lt;br /&gt;
&lt;br /&gt;
DISPTMG can be temporarily forced to 0 by using R8 (DISPTMG Skew) on CRTCs 0/3/4, or by setting R6=0 on CRTC 1.&lt;br /&gt;
&lt;br /&gt;
It is not possible to force DISPTMG on CRTC 2.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Border bytes ===&lt;br /&gt;
&lt;br /&gt;
Despite their 1MHz clock speed, CRTCs 0/2 have been observed to change state at a rate equivalent to 2MHz chips by responding to both the rising and falling edges of each clock cycle.&lt;br /&gt;
&lt;br /&gt;
==== Interline border ====&lt;br /&gt;
On CRTCs 0/2, R1&amp;gt;R0 generates one byte (0.5µs) of border at the end of the raster line. On CRTCs 1/3/4, it does not.&lt;br /&gt;
&lt;br /&gt;
If border skew is used, the border byte will skew and change into a full character-width border instead.&lt;br /&gt;
&lt;br /&gt;
==== Border conflict ====&lt;br /&gt;
If R1=0 and HCC=0, we expect HBORDER to activate as HCC=R1 and we also expect HBORDER to deactivate as HCC=0. In this situation, all CRTCs activate HBORDER.&lt;br /&gt;
&lt;br /&gt;
If R6=0 and VCC=0, we expect VBORDER to activate as VCC=R6 and we also expect VBORDER to deactivate as VCC=0. In this situation, all CRTCs activate VBORDER. On CRTC 1, even SBORDER is activated. But on CRTCs 0/2, the first raster line shows an alternation of bytes of VBORDER and displayable characters.&lt;br /&gt;
&lt;br /&gt;
To see the border bytes with your own eyes, type this BASIC line after reset:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
BORDER 6:OUT &amp;amp;BC00,6:OUT &amp;amp;BD00,0&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== HSYNC ==&lt;br /&gt;
&lt;br /&gt;
The HSYNC signal from the CRTC is not directly connected to the display. It is passed to the [[Gate Array]] for further modification. See its wiki page.&lt;br /&gt;
&lt;br /&gt;
While HSYNC is active, all the CRTC counters continue to increment normally and addresses continue to be generated.&lt;br /&gt;
&lt;br /&gt;
On all CRTCs, while an HSYNC is ongoing, the condition HCC=R2 is ignored. So we cannot trigger a new HSYNC during an HSYNC.&lt;br /&gt;
&lt;br /&gt;
=== Contiguous HSYNCs ===&lt;br /&gt;
&lt;br /&gt;
On CRTC 0, two HSYNCs cannot be contiguous. They are always separated by at least 1 CRTC character. What happens is that when HSC=R3 and HCC=R2, the condition HSC=R3 takes precedence over the condition HCC=R2 and HSYNC is stopped.&lt;br /&gt;
&lt;br /&gt;
On CRTCs 1/2/3/4, HSYNCs can be contiguous.&lt;br /&gt;
&lt;br /&gt;
=== Signal delay ===&lt;br /&gt;
&lt;br /&gt;
On all CRTCs, there is a 1µs delay in display between when the CRTC provides a video pointer, and when the Gate Array displays the corresponding 16-bit character.&lt;br /&gt;
&lt;br /&gt;
But on CRTCs 0/1/2, there is no delay for HSYNC. On CRTCs 3/4, the Amstrad engineers fixed the issue by adding a 1µs delay for the HSYNC signal to match the display signal. &lt;br /&gt;
&lt;br /&gt;
So now we have a bigger issue: on CRTCs 3/4, HSYNC occurs 1µs later than on CRTCs 0/1/2. Interrupts being dependent on HSYNC, this is a serious compatibility issue for time-sensitive code. It also explains why the CTM monitor has to be calibrated differently on CRTCs 3/4. Fortunately, the issue is easy to fix, by adjusting the HSYNC width with CRTC register 3.&lt;br /&gt;
&lt;br /&gt;
=== Discolouration effect ===&lt;br /&gt;
&lt;br /&gt;
On CRT monitors from other brands, a colour calibration can happen just after the C-HSYNC pulse.&lt;br /&gt;
&lt;br /&gt;
So even when a fully valid C-HSYNC pulse of 4µs is emitted, an HSYNC shorter than usual combined with a coloured border can induce a discolouration effect on those monitors.&lt;br /&gt;
&lt;br /&gt;
=== Screen wobbling and Fine horizontal hardware scroll ===&lt;br /&gt;
&lt;br /&gt;
These effects use invalid HSYNC signals, which are poorly supported by modern displays. However, these effects were used in commercial-era CPC games, so it's fine if you choose to use them.&lt;br /&gt;
&lt;br /&gt;
When R2 increases by 1, the screen is shifted to the left by 16 mode2 pixels.&lt;br /&gt;
&lt;br /&gt;
When R2 decreases by 1, the screen is shifted to the right by 16 mode2 pixels.&lt;br /&gt;
&lt;br /&gt;
When R3l increases by 1 (and if &amp;lt;6), the screen is shifted to the left by 8 mode2 pixels.&lt;br /&gt;
&lt;br /&gt;
When R3l decreases by 1 (and if &amp;gt;2), the screen is shifted to the right by 8 mode2 pixels.&lt;br /&gt;
&lt;br /&gt;
The shift is not instantaneous but follows a logarithmic attenuation across several raster lines. This property can be used to get even finer horizontal control by modifying R2/R3 on each raster line.&lt;br /&gt;
&lt;br /&gt;
[[Longshot]] has demonstrated [https://youtu.be/1q7RQykZoKY horizontal hardware scroll] with one-pixel precision in mode1 on all CRTCs. However, because you have to synchronize with each line, it takes a lot of CPU time if it's done in fullscreen (272 lines).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== VSYNC ==&lt;br /&gt;
&lt;br /&gt;
The VSYNC signal from the CRTC is not directly connected to the display. It is passed to the [[Gate Array]] for further modification. See its wiki page.&lt;br /&gt;
&lt;br /&gt;
While VSYNC is active, all the CRTC counters continue to increment normally and addresses continue to be generated.&lt;br /&gt;
&lt;br /&gt;
On all CRTCs, while a VSYNC is ongoing, the condition VCC=R7 is ignored. So we cannot trigger a new VSYNC during a VSYNC. &lt;br /&gt;
&lt;br /&gt;
On CRTCs 0/1/2, the sole condition to trigger a VSYNC is that VCC=R7. While on CRTCs 3/4, it is necessary to have VCC=R7 and HCC=0 and VLC=0 to trigger a VSYNC.&lt;br /&gt;
&lt;br /&gt;
=== Blocked VSYNC ===&lt;br /&gt;
&lt;br /&gt;
On CRTC 0, if R7 is modified with the value of VCC when HCC&amp;lt;2, we are in blocked VSYNC. Then, the VSYNC can no longer occur on VCC=R7 until an unblocking condition is produced (VCC or R7 update). Source: §16.4 &amp;quot;Conditions to consider&amp;quot; of the CRTC Compendium&lt;br /&gt;
&lt;br /&gt;
=== Ghost VSYNC ===&lt;br /&gt;
&lt;br /&gt;
On CRTC 2, if a VSYNC is triggered during an HSYNC, the CRTC produces a ghost VSYNC. The CRTC then counts the lines as if a VSYNC were taking place by preventing a new VSYNC from occurring, but without the VSYNC pin being enabled.&lt;br /&gt;
&lt;br /&gt;
=== PPI VSYNC ===&lt;br /&gt;
&lt;br /&gt;
The VSYNC pin of the CRTC is directly connected to bit0 of port B of the PPI. There is no delay involved.&lt;br /&gt;
&lt;br /&gt;
On Amstrad CPC (not Plus!), it is also possible to reverse the direction of PPI port B to output a &amp;quot;fake&amp;quot; VSYNC signal directly from the PPI to the Gate Array.&lt;br /&gt;
&lt;br /&gt;
As an exception, the Ghost VSYNC of CRTC 2 overpowers the Fake VSYNC.&lt;br /&gt;
&lt;br /&gt;
=== Subpixel vertical hardware scroll ===&lt;br /&gt;
&lt;br /&gt;
By tuning very precisely when the VSYNC signal is sent to the monitor,  Longshot has demonstrated [https://youtu.be/bSjRU6Wye00 vertical hardware scroll] with a precision of 1/128th of a pixel. Furthermore, subpixel vertical scrolling consumes very little CPU.&lt;br /&gt;
&lt;br /&gt;
=== Mid-VSYNC ===&lt;br /&gt;
&lt;br /&gt;
On all CRTCs, in both interlace modes, a mid-VSYNC is generated when VCC=R7 on the even field. The VSYNC pulse starts in the middle of the raster line, at HCC=R0/2.&lt;br /&gt;
&lt;br /&gt;
As an exception, on CRTCs 3/4, if R7=0 then mid-VSYNC will instead occur on the odd field. Source: §19.7 &amp;quot;Mid-VSYNC&amp;quot; of the CRTC Compendium.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Interlace modes ==&lt;br /&gt;
&lt;br /&gt;
Note: Some details about the CRTC interlace implementations are missing in this article. Consider it as an introduction to the topic.&lt;br /&gt;
&lt;br /&gt;
[[File:CRTC Interlace modes.png]]&lt;br /&gt;
&lt;br /&gt;
For a CRTC character line with n raster lines, R9 must be set to n-1 on all CRTCs, regardless of the interlace settings. The exception is for CRTCs 0/3/4 in IVM mode, where R9 must be set to n-2.&lt;br /&gt;
&lt;br /&gt;
=== Interlace sync mode (ISM) ===&lt;br /&gt;
&lt;br /&gt;
In this mode, the same information is painted in both fields to enhance readability. Reprogramming the CRTC is not necessary.&lt;br /&gt;
&lt;br /&gt;
=== Interlace sync and video mode (IVM) ===&lt;br /&gt;
&lt;br /&gt;
In this mode, alternating lines are displayed in the even and odd field to double the resolution.&lt;br /&gt;
&lt;br /&gt;
On the even field, the CRTC displays the lines for which VLC is even. On the odd field, the CRTC displays the lines for which VLC is odd.&lt;br /&gt;
&lt;br /&gt;
It is necessary to reprogram the CRTC as if we were building a frame of 624 lines.&lt;br /&gt;
&lt;br /&gt;
CRTC 2 is the exception: R4, R5, R6, R7 do not need to be reprogrammed as it considers each character line to be a double character line.&lt;br /&gt;
&lt;br /&gt;
=== Interlace adjustment line ===&lt;br /&gt;
&lt;br /&gt;
On all CRTCs, in both interlace modes, an additional line (the 625th line) is added automatically by the CRTC at the end of the even field. This line is added after the lines of the vertical adjustment mode.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== CRTC registers ==&lt;br /&gt;
&lt;br /&gt;
The Internal registers of the 6845 are:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!rowspan=2|Register Index&lt;br /&gt;
!rowspan=2|Register Name&lt;br /&gt;
!colspan=3|Read/Write&lt;br /&gt;
!rowspan=2|Range&lt;br /&gt;
!rowspan=2|CPC Setting&lt;br /&gt;
!rowspan=2|Notes&lt;br /&gt;
|-&lt;br /&gt;
!CRTC 0&lt;br /&gt;
!CRTCs 1/2&lt;br /&gt;
!CRTCs 3/4&lt;br /&gt;
|-&lt;br /&gt;
|0||Horizontal Total (-1)||colspan=3 style=&amp;quot;text-align: center;&amp;quot;|Write||00000000||63||Width of the screen, in characters. Should always be 63 (64 characters). 1 character == 1μs.&lt;br /&gt;
|-&lt;br /&gt;
|1||Horizontal Displayed||colspan=3 style=&amp;quot;text-align: center;&amp;quot;|Write||00000000||40||Number of characters displayed. Once horizontal character count (HCC) matches this value, DISPTMG is set to 1.&lt;br /&gt;
|-&lt;br /&gt;
|2||Horizontal Sync Position||colspan=3 style=&amp;quot;text-align: center;&amp;quot;|Write||00000000||46||When to start the HSync signal.&lt;br /&gt;
|-&lt;br /&gt;
|3||Horizontal and Vertical Sync Widths||colspan=3 style=&amp;quot;text-align: center;&amp;quot;|Write||VVVVHHHH||128+14||VSync width in scan-lines (Not present on all CRTCs, fixed to 16 lines on these) ; HSync pulse width in characters.&lt;br /&gt;
|-&lt;br /&gt;
|4||Vertical Total (-1)||colspan=3 style=&amp;quot;text-align: center;&amp;quot;|Write||x0000000||38||Height of the screen, in characters.&lt;br /&gt;
|-&lt;br /&gt;
|5||Vertical Total Adjust||colspan=3 style=&amp;quot;text-align: center;&amp;quot;|Write||xxx00000||0||Measured in scanlines, can be used for smooth vertical scrolling on CPC.&lt;br /&gt;
|-&lt;br /&gt;
|6||Vertical Displayed||colspan=3 style=&amp;quot;text-align: center;&amp;quot;|Write||x0000000||25||Height of displayed screen in characters. Once vertical character count (VCC) matches this value, DISPTMG is set to 1.&lt;br /&gt;
|-&lt;br /&gt;
|7||Vertical Sync Position||colspan=3 style=&amp;quot;text-align: center;&amp;quot;|Write||x0000000||30||When to start the VSync signal, in characters.&lt;br /&gt;
|-&lt;br /&gt;
|8||Interlace and Skew||colspan=3 style=&amp;quot;text-align: center;&amp;quot;|Write||CCDDxxII||0||CC: Cursor Skew (Only in CRTCs 0, 3 and 4). DD: Display Skew (Only in CRTCs 0, 3 and 4). II: Interlace Mode.&lt;br /&gt;
|-&lt;br /&gt;
|9||Maximum Raster Address (aka Number of Scan Lines) (-1)||colspan=3 style=&amp;quot;text-align: center;&amp;quot;|Write||xxx00000||7||Maximum scan line address on CPC can hold between 0 and 7, higher values' upper bits are ignored.&lt;br /&gt;
|-&lt;br /&gt;
|10||Cursor Start Raster||style=&amp;quot;text-align: center;&amp;quot;|Write||style=&amp;quot;text-align: center;&amp;quot;|Write||Read/Write||xBP00000||0||B = Blink On/Off; P = Blink Period Control (16 or 32 frames). Sets first raster row of character that cursor is on to invert.&lt;br /&gt;
|-&lt;br /&gt;
|11||Cursor End Raster||style=&amp;quot;text-align: center;&amp;quot;|Write||style=&amp;quot;text-align: center;&amp;quot;|Write||Read/Write||xxx00000||0||Sets last raster row of character that cursor is on to invert.&lt;br /&gt;
|-&lt;br /&gt;
|12||Display Start Address (High)||Read/Write||style=&amp;quot;text-align: center;&amp;quot;|Write||Read/Write||xx000000||48||On Amstrad Plus, bit7 of the printer port is controlled by bit3 of CRTC R12 (ie. bit11 of Display Start Address).&lt;br /&gt;
|-&lt;br /&gt;
|13||Display Start Address (Low)||Read/Write||style=&amp;quot;text-align: center;&amp;quot;|Write||Read/Write||00000000||0||Allows you to offset the start of screen memory for hardware scrolling, and if using memory from address &amp;amp;0000 with the firmware.&lt;br /&gt;
|-&lt;br /&gt;
|14||Cursor Address (High)||colspan=3 style=&amp;quot;text-align: center;&amp;quot;|Read/Write||xx000000||0||&lt;br /&gt;
|-&lt;br /&gt;
|15||Cursor Address (Low)||colspan=3 style=&amp;quot;text-align: center;&amp;quot;|Read/Write||00000000||0||&lt;br /&gt;
|-&lt;br /&gt;
|16||Light Pen Address (High)||colspan=3 style=&amp;quot;text-align: center;&amp;quot;|Read||xx000000||||On CRTC1, bit6 of Status register goes to 0 when R16 is read.&lt;br /&gt;
|-&lt;br /&gt;
|17||Light Pen Address (Low)||colspan=3 style=&amp;quot;text-align: center;&amp;quot;|Read||00000000||||On CRTC1, bit6 of Status register goes to 0 when R17 is read.&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Screen size ===&lt;br /&gt;
&lt;br /&gt;
We can calculate the screen size in words by multiplying R1 x R6 x (R9+1). And then multiplying the result by 2 to have the screen size in bytes.&lt;br /&gt;
&lt;br /&gt;
With the default CRTC values, we obtain 40 x 25 x (7+1) x 2 = 16000 bytes.&lt;br /&gt;
&lt;br /&gt;
So we can observe that only part of the 16384 bytes (=16KB) page of VRAM is actually displayed on screen.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Register access ===&lt;br /&gt;
&lt;br /&gt;
On CRTCs 0/1/2, if a Write Only register is read from, &amp;quot;0&amp;quot; is returned. The register accessing scheme on CRTCs 3/4 makes it impossible to happen.&lt;br /&gt;
&lt;br /&gt;
On all CRTCs, only the 5 least significant bits of the selected register number are considered to write to a register. The other bits are ignored.&lt;br /&gt;
&lt;br /&gt;
On CRTCs 0/1/2, only the 5 least significant bits of the selected register number are considered to read a register:&lt;br /&gt;
* On CRTCs 0/2, registers 18-31 read as 0&lt;br /&gt;
* On CRTC 1, registers 18-30 read as 0, register 31 reads as &amp;amp;FF&lt;br /&gt;
&lt;br /&gt;
On CRTCs 3/4, only the 3 least significant bits of the selected register number are considered to read a register, according to the following table:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!Nb&lt;br /&gt;
!Register&lt;br /&gt;
!Definition&lt;br /&gt;
|-&lt;br /&gt;
|0||R16||Light Pen Address (High)&lt;br /&gt;
|-&lt;br /&gt;
|1||R17||Light Pen Address (Low)&lt;br /&gt;
|-&lt;br /&gt;
|2||R10||Cursor Start Raster&lt;br /&gt;
|-&lt;br /&gt;
|3||R11||Cursor End Raster&lt;br /&gt;
|-&lt;br /&gt;
|4||R12||Display Start Address (High)&lt;br /&gt;
|-&lt;br /&gt;
|5||R13||Display Start Address (Low)&lt;br /&gt;
|-&lt;br /&gt;
|6||R14||Cursor Address (High)&lt;br /&gt;
|-&lt;br /&gt;
|7||R15||Cursor Address (Low)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== CRTC register differences ==&lt;br /&gt;
&lt;br /&gt;
CRTC types 3 and 4 are identical in every way, except for the unlocking mechanism, split screen, hardware soft scroll and 8-bit printer port functionalities specific to the [[ASIC]].&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== R10/R11 on ASIC/Pre-ASIC  ===&lt;br /&gt;
&lt;br /&gt;
The cursor raster registers R10/R11 act as status registers when read on CRTCs 3/4. They behave as normal cursor raster registers upon write.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! R10 - Bit number&lt;br /&gt;
! Bit value&lt;br /&gt;
! Event&lt;br /&gt;
|-&lt;br /&gt;
|0&lt;br /&gt;
|1&lt;br /&gt;
|C0=R0&lt;br /&gt;
|-&lt;br /&gt;
|1&lt;br /&gt;
|0&lt;br /&gt;
|C0=R0/2&lt;br /&gt;
|-&lt;br /&gt;
|2&lt;br /&gt;
|0&lt;br /&gt;
|C0=R1-1 (if R0&amp;gt;=R1)&lt;br /&gt;
|-&lt;br /&gt;
|3&lt;br /&gt;
|0&lt;br /&gt;
|C0=R2&lt;br /&gt;
|-&lt;br /&gt;
|4&lt;br /&gt;
|0&lt;br /&gt;
|C0=R2+R3&lt;br /&gt;
|-&lt;br /&gt;
|5&lt;br /&gt;
|0&lt;br /&gt;
1&lt;br /&gt;
|R3h&amp;gt;0 : C0=0..R0 on the line R3h from Vsync (C4=R7)&lt;br /&gt;
R3h=0 : C0=0..R0 over 15 lines from Vsync (C4=R7)&lt;br /&gt;
|-&lt;br /&gt;
|6&lt;br /&gt;
|1&lt;br /&gt;
|Always 1&lt;br /&gt;
|-&lt;br /&gt;
|7&lt;br /&gt;
|0&lt;br /&gt;
0&lt;br /&gt;
|C0=0..R0-1 : VMA.Lsb=0xFF&lt;br /&gt;
C0=R0 : VMA'.Lsb=0x00 (same cond if C0=R0=0)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! R11 - Bit number&lt;br /&gt;
! Bit value&lt;br /&gt;
! Event&lt;br /&gt;
|-&lt;br /&gt;
|0&lt;br /&gt;
|0&lt;br /&gt;
|C4=R4 and C9=R9 and C0=R0 : Last char of screen&lt;br /&gt;
|-&lt;br /&gt;
|1&lt;br /&gt;
|0&lt;br /&gt;
|C4=R6-1 and C9=R9 and C0=R0 : Last char displayed&lt;br /&gt;
|-&lt;br /&gt;
|2&lt;br /&gt;
|0&lt;br /&gt;
|C4=R7-1 and C9=R9 and C0=R0 : Last char before Vsync&lt;br /&gt;
|-&lt;br /&gt;
|3&lt;br /&gt;
|0/1&lt;br /&gt;
|Timer 16 CRTC frames&lt;br /&gt;
|-&lt;br /&gt;
|4&lt;br /&gt;
|1&lt;br /&gt;
|Always 1&lt;br /&gt;
|-&lt;br /&gt;
|5&lt;br /&gt;
|0&lt;br /&gt;
|C9=R9 : C0=0 to R0&lt;br /&gt;
|-&lt;br /&gt;
|6&lt;br /&gt;
|0&lt;br /&gt;
|Always 0&lt;br /&gt;
|-&lt;br /&gt;
|7&lt;br /&gt;
|1&lt;br /&gt;
|(C9=R9 and C0=R0) or (C9=0 and C0=0 to R0-1)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Horizontal and Vertical Sync (R3) ===&lt;br /&gt;
&lt;br /&gt;
Type 0:&lt;br /&gt;
*Bits 7..4 define Vertical Sync Width. If 0 is programmed, this gives 16 lines of VSYNC.&lt;br /&gt;
*Bits 3..0 define Horizontal Sync Width. If 0 is programmed, no HSYNC is generated (and therefore, no interrupts).&lt;br /&gt;
&lt;br /&gt;
Type 1:&lt;br /&gt;
*Bits 7..4 are ignored. Vertical Sync is fixed at 16 lines.&lt;br /&gt;
*Bits 3..0 define Horizontal Sync Width. If 0 is programmed, no HSYNC is generated (and therefore, no interrupts).&lt;br /&gt;
&lt;br /&gt;
Type 2:&lt;br /&gt;
*Bits 7..4 are ignored. Vertical Sync is fixed at 16 lines.&lt;br /&gt;
*Bits 3..0 define Horizontal Sync Width. If 0 is programmed, this gives a HSYNC width of 16.&lt;br /&gt;
&lt;br /&gt;
Types 3/4:&lt;br /&gt;
*Bits 7..4 define Vertical Sync Width. If 0 is programmed, this gives 16 lines of VSYNC.&lt;br /&gt;
*Bits 3..0 define Horizontal Sync Width. If 0 is programmed, this gives a HSYNC width of 16.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Interlace and Skew (R8) ===&lt;br /&gt;
&lt;br /&gt;
Types 0/3/4:&lt;br /&gt;
*Bits 7..6 define the skew (delay) of the CUDISP signal (00 = Non-skew ; 01 = One-character skew ; 10 = Two-character skew ; 11 = Non-output).&lt;br /&gt;
*Bits 5..4 define the skew (delay) of the DISPTMG signal (00 = Non-skew ; 01 = One-character skew ; 10 = Two-character skew ; 11 = Non-output).&lt;br /&gt;
*Bits 3..2 are ignored.&lt;br /&gt;
*Bits 1..0 define the interlace mode (00 = No Interlace ; 01 = Interlace Sync ; 10 = No Interlace ; 11 = Interlace Sync and Video).&lt;br /&gt;
&lt;br /&gt;
Types 1/2:&lt;br /&gt;
*Bits 7..2 are ignored.&lt;br /&gt;
*Bits 1..0 define the interlace mode.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== R31 on Type 1 ===&lt;br /&gt;
&lt;br /&gt;
R31 is described in the UM6845R documentation as &amp;quot;Dummy Register&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Its use is described in the documentation for the Rockwell R6545 in combination with R18, R19 and R8 and the Status Register.&lt;br /&gt;
&lt;br /&gt;
In the UM6845R it appears to have no effect. Reading and writing does nothing. Reading it returns &amp;amp;FF.&lt;br /&gt;
&lt;br /&gt;
R31 doesn't exist on CRTCs 0/2/3/4.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Status register on Type 1 ===&lt;br /&gt;
&lt;br /&gt;
The UM6845R has a status register that can be read using port &amp;amp;BExx.&lt;br /&gt;
&lt;br /&gt;
Bit 6 is set to 1 if there is a strobe input to the /LPEN signal. It is cleared to 0 when either R17 or R16 (LPEN address) of the CRTC are read. It signals there is a valid LPEN input. On Kevin Thacker's CPC with UM6845R, it is triggered at power on, R17 and R16 have the values 0 when read.&lt;br /&gt;
&lt;br /&gt;
Bit 5 is set to 1 when CRTC is in &amp;quot;vertical blanking&amp;quot;. Vertical blanking is when the vertical border is active. i.e. VCC&amp;gt;=R6. &lt;br /&gt;
&lt;br /&gt;
It is cleared when the frame is started (VCC=0). It is not directly related to the DISPTMG output (used by the CPC to display the border colour) because that output is a combination of horizontal and vertical blanking.&lt;br /&gt;
This bit will be 0 when pixels are being displayed.&lt;br /&gt;
&lt;br /&gt;
All the other bits read as 0 and don't have any function.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== CRTC Type Detection ==&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
10 MODE 1:' Reinitialize screen&lt;br /&gt;
20 OUT &amp;amp;BC00,31:IF INP(&amp;amp;BF00)=255 THEN PRINT&amp;quot;crtc 1&amp;quot;:END&lt;br /&gt;
30 OUT &amp;amp;BC00,12:IF INP(&amp;amp;BF00)=0 THEN PRINT&amp;quot;crtc 2&amp;quot;:END&lt;br /&gt;
40 OUT &amp;amp;BC00,20:IF INP(&amp;amp;BF00)=0 THEN PRINT&amp;quot;crtc 0&amp;quot;:END&lt;br /&gt;
50 PRINT&amp;quot;crtc 3/4&amp;quot;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Distinguishing between CRTCs 3 and 4 can be done by trying to [[Programming:Unlocking ASIC|unlock the ASIC]] or by testing the [[8255|PPI chip]]. On ASIC, if PPI Port B is set as output it will behave the same as input.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== CRTC Timing Diagrams ==&lt;br /&gt;
[[File:CRTC Timing Diagram Rockwell.png]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[File:CRTC timing small.gif]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Internal Counters ==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Counter name&lt;br /&gt;
! Abbr&lt;br /&gt;
! Alternate name&lt;br /&gt;
! Compared with&lt;br /&gt;
! Comment&lt;br /&gt;
|-&lt;br /&gt;
|Horizontal Character Counter&lt;br /&gt;
|HCC&lt;br /&gt;
|C0&lt;br /&gt;
|R0, R1, R2&lt;br /&gt;
| Increments on every clock cycle&lt;br /&gt;
|-&lt;br /&gt;
|Horizontal Sync Counter&lt;br /&gt;
|HSC&lt;br /&gt;
|C3l&lt;br /&gt;
|R3l&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|Vertical Character Counter&lt;br /&gt;
|VCC&lt;br /&gt;
|C4&lt;br /&gt;
|R4, R6, R7&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|Vertical Sync Counter&lt;br /&gt;
|VSC&lt;br /&gt;
|C3h&lt;br /&gt;
|R3h&lt;br /&gt;
|R3h is fixed to 0 on CRTCs 1/2. This gives 16 lines of VSYNC&lt;br /&gt;
|-&lt;br /&gt;
|Vertical Line Counter&lt;br /&gt;
|VLC&lt;br /&gt;
|C9&lt;br /&gt;
|R9, R10, R11&lt;br /&gt;
|If not in IVM mode, this counter is exposed on CRTC pins RA0..RA4&lt;br /&gt;
|-&lt;br /&gt;
|Vertical Total Adjust Counter&lt;br /&gt;
|VTAC&lt;br /&gt;
|C5&lt;br /&gt;
|R5&lt;br /&gt;
|This counter does not exist on CRTCs 0/3/4. C9 is reused instead&lt;br /&gt;
|-&lt;br /&gt;
|Frame Counter&lt;br /&gt;
|FC&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|Used to alternate frames in interlace and for CRTC cursor blinking&lt;br /&gt;
|-&lt;br /&gt;
|Memory Address&lt;br /&gt;
|MA&lt;br /&gt;
|&lt;br /&gt;
|R14/R15&lt;br /&gt;
|This counter is exposed on CRTC pins MA0..MA13&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
When IVM mode is activated, VLC continues to increment normally. However, RA is not identical to VLC anymore. Instead, VLC is considered shifted left by 1 bit, and bit0 represents the parity of the field (even/odd).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== CRTC counter differences ==&lt;br /&gt;
&lt;br /&gt;
=== MA buffering ===&lt;br /&gt;
&lt;br /&gt;
No matter its type, the CRTC never buffers any of its counters, except for the video pointer MA. The buffer MA' is needed because MA has to be reloaded at the beginning of every raster line.&lt;br /&gt;
&lt;br /&gt;
At the end of the display of the last raster line of each character line (ie. when HCC=R1 and VLC=R9), MA' captures the current value of MA.&lt;br /&gt;
&lt;br /&gt;
CRTC 2 is the exception: at the end of the display of the last raster line of the frame, MA' captures R12/R13 instead of MA.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== MA reload ===&lt;br /&gt;
&lt;br /&gt;
On CRTCs 0/3/4, at the beginning of the first raster line of the frame, MA and MA' are loaded with R12/R13. Otherwise, MA is loaded with MA'.&lt;br /&gt;
&lt;br /&gt;
On CRTC 2, at the beginning of every raster line of the frame (including the first one), MA is loaded with MA'.&lt;br /&gt;
&lt;br /&gt;
On CRTC 1, at the beginning of every raster line of the first character line of the frame (ie. when VCC=0), MA is loaded with R12/R13 instead of MA'. '''This is a major source of incompatibility if the programmer does not take care.''' In demos and games, to be compatible with all CRTCs, program R12/R13 only when VCC≠0. This will then take effect at the next CRTC frame start.&lt;br /&gt;
&lt;br /&gt;
==== Rupture For Dummies (R5 bug) ====&lt;br /&gt;
&lt;br /&gt;
CRTC 1 has a bug that occurs when R5 is updated with a non-zero value when HCC=R0 and VLC≠R9, but only when R5 was previously 0. This changes the MA update source to R12/R13 instead of MA'. The CRTC then loads R12/R13 into MA at the beginning of every scanline, regardless of the VCC value.&lt;br /&gt;
&lt;br /&gt;
This R5 bug also messes with the frame parity management. However, it is possible to fix the parity of the frame by activating/deactivating the IVM interlace mode.&lt;br /&gt;
&lt;br /&gt;
The vertical adjustment operates normally after the RFD is triggered. If vertical adjustment is not needed, R5 can be reset at any time after the RFD is activated.&lt;br /&gt;
&lt;br /&gt;
This effect is used in the [https://www.cpc-power.com/index.php?page=detail&amp;amp;num=19308 DSC4 demo].&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== VSC (C3h) overflow ===&lt;br /&gt;
&lt;br /&gt;
During a VSYNC on CRTCs 0/3/4, if VSYNC Width (R3h) is changed with a value less than the current VSC, then VSC overflows and will count up to its maximum value (15) before looping back and counting up again until it reaches the new value of R3h.&lt;br /&gt;
&lt;br /&gt;
On CRTCs 1/2, the VSYNC width is fixed to 16 characters. It is not possible to modify it. Therefore, VSC cannot be overflowed.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== HSC (C3l) overflow ===&lt;br /&gt;
&lt;br /&gt;
During an HSYNC, if HSYNC Width (R3l) is changed with a value less than the current HSC, then HSC overflows and will count up to its maximum value (15) before looping back and counting up again until it reaches the new value of R3l.&lt;br /&gt;
&lt;br /&gt;
The only exception is for CRTC 1 with a value of 0, which immediately cancels the current HSYNC.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== VCC (C4) overflow ===&lt;br /&gt;
&lt;br /&gt;
On all CRTCs, if Vertical Total (R4) is changed with a value less than VCC, then:&lt;br /&gt;
* if this update was done when VCC &amp;lt; R4, then VCC overflows and will count up to its maximum value (127) before looping back and counting up again until it reaches the new value of R4&lt;br /&gt;
* if this update was done when VCC = R4, the current character line was already decided to be the last one of the current frame. No update to R4 will make the CRTC change its mind for the current frame&lt;br /&gt;
&lt;br /&gt;
The only exception when VCC = R4 is for CRTC 1 with a value of 0, which will cause VCC to overflow.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== HCC (C0) overflow ===&lt;br /&gt;
&lt;br /&gt;
If Horizontal Total (R0) is changed with a value less than the current HCC, then:&lt;br /&gt;
* on CRTCs 0/1/2, HCC overflows and will count up to its maximum value (255) before looping back and counting up again until it reaches the new value of R0&lt;br /&gt;
* on CRTCs 3/4, the current line is considered finished and HCC is immediately reset to 0 on the next line&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== VLC (C9) overflow ===&lt;br /&gt;
&lt;br /&gt;
If Number of Scan Lines (R9) is changed with a value less than the current VLC, then:&lt;br /&gt;
* on CRTCs 0/1/2, VLC overflows and will count up to its maximum value (31) before looping back and counting up again until it reaches the new value of R9&lt;br /&gt;
* on CRTCs 3/4, the current line is considered the last one of this CRTC character and VLC will reset to 0 on the next line&lt;br /&gt;
&lt;br /&gt;
As an exception, on CRTCs 0/2, if VLC is modified during the last frame line, then the updated value will not be considered for the current frame.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== VTAC (C5/C9) overflow ===&lt;br /&gt;
&lt;br /&gt;
During vertical adjustment mode, if Vertical Total Adjust (R5) is changed with a value less than the current VTAC, then:&lt;br /&gt;
* on CRTCs 0/1/2, VTAC overflows and will count up to its maximum value (31) before looping back and counting up again until it reaches the new value of R5&lt;br /&gt;
* on CRTCs 3/4, the current line is considered the last one of the current frame and vertical adjustment will end&lt;br /&gt;
&lt;br /&gt;
As an exception, on CRTCs 0/2, if VTAC is modified during the last frame line, then the updated value will not be considered for the current frame.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Vertical Adjustment mode ===&lt;br /&gt;
&lt;br /&gt;
On CRTCs 3/4, this mode does not increment VCC, so VCC remains equal to R4.&lt;br /&gt;
&lt;br /&gt;
On CRTC 0, this mode increments VCC, causing it to exceed R4, but this increment occurs only once.&lt;br /&gt;
&lt;br /&gt;
On CRTCs 1/2, this mode increments VCC, causing it to exceed R4, and this increment can happen multiple times depending on the values of R5 and R9.&lt;br /&gt;
&lt;br /&gt;
Also, only CRTCs 1/2 have a dedicated C5 counter. On CRTCs 0/3/4, during Vertical Adjustment, C9 has to fullfil the VTAC role which means that it cannot fullfil its VLC role. This impacts address generation as R9 is not considered anymore.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Counter freezes ===&lt;br /&gt;
&lt;br /&gt;
On CRTCs 1/2/3/4, R0 accepts all values without causing any problems for counters.&lt;br /&gt;
&lt;br /&gt;
On CRTC 0:&lt;br /&gt;
* Setting R0 to 0 will cause numerous issues that stem from the fact that VLC is frozen. As HCC never reaches 1, the logic that increments VLC is never triggered.&lt;br /&gt;
* The logic that triggers vertical adjustment is broken if R0&amp;lt;2.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Block Diagrams ==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!Hitachi&lt;br /&gt;
!UMC&lt;br /&gt;
!Motorola&lt;br /&gt;
|-&lt;br /&gt;
|[[File:CRTC Block Diagram.png|Hitachi]]&lt;br /&gt;
|[[File:UMC CRTC Block Diagram.png|UMC]]&lt;br /&gt;
|[[File:Motorola CRTC Block Diagram.png|Motorola]]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== CRTC-II (aka Type 5) ==&lt;br /&gt;
&lt;br /&gt;
The [[Media:CRTC-5-HD6345.pdf|HD6345 datasheet]] states it is upward-compatible with the HD6845S in pin and software.&lt;br /&gt;
&lt;br /&gt;
This chip was never used by Amstrad. However, some CPC enthusiasts have replaced the original CRTC chip in their CPC with this one.&lt;br /&gt;
&lt;br /&gt;
With this chip, split-screen becomes easy: [https://thecheshirec.at/2024/05/20/des-splitscreens-en-basic-sur-crtc5/ Split-screen in BASIC]. And 3 new graphics modes (160x100x16c, 320x100x4c, 640x100x2c) are available: [https://thecheshirec.at/2024/11/10/trois-nouveaux-modes-video-grace-au-crtc-5/ New graphics modes in BASIC].&lt;br /&gt;
&lt;br /&gt;
This is the cheapest way to upgrade the CPC's graphics capabilities, costing only 1.29€. [https://thecheshirec.at/2024/05/19/des-crtc5-a-129e/ Source]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Datasheets ==&lt;br /&gt;
&lt;br /&gt;
==== Used by Amstrad ====&lt;br /&gt;
* [[Media:hd6845.hitachi.pdf|HD6845S (Hitachi)]] aka Type 0&lt;br /&gt;
* [[Media:UM6845-UMC.pdf|UM6845 (UMC)]] aka Type 0&lt;br /&gt;
* [[Media:Um6845r.umc.pdf|UM6845R (UMC)]] aka Type 1&lt;br /&gt;
* [[Media:Mc6845.motorola.pdf|MC6845 (Motorola)]] aka Type 2&lt;br /&gt;
* [[Media:CPC_Plus_Asic_Schematic.GIF|AMS40489 (Amstrad)]] aka Type 3 ([[ASIC]])&lt;br /&gt;
* [[AMS40226 (Amstrad)]] aka Type 4 (Pre-ASIC)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Unused clones ====&lt;br /&gt;
* [[CM607P]] a Bulgarian clone made in Pravetz factory. It is used in the [[Aleste 520EX]].&lt;br /&gt;
* [[Media:hd6845.hitachi.pdf|HD6845R]] by Hitachi. According to Kevin Thacker, the [[KC Compact]] used HD6845R only.&lt;br /&gt;
* [[Media:UM6845E-UMC.pdf|UM6845E]] by UMC&lt;br /&gt;
* [[Media:Mc6845.pdf|MC6845-1]] by Motorola&lt;br /&gt;
* [[Media:F6845.pdf|F6845]] by Fairchild&lt;br /&gt;
* [[Media:EF6845P.pdf|EF6845]] by Thomson Semiconductors&lt;br /&gt;
* [[Media:VL6845 VTi.pdf|VL6845]] by VTi&lt;br /&gt;
* [[Media:C6845 CRTC (CAST).pdf|C6845]] by Cast&lt;br /&gt;
* [[Media:MB89321B FUJ.pdf|MB89321B]] by Fujitsu. It is pin-compatible with the 6845&lt;br /&gt;
* [[Media:MB89321A datasheet CRTC.pdf|MB89321A]] by Fujitsu. Enhanced version that adds smooth scroll, screen partitioning, independent scrolling of screen partitions, and other convenient features&lt;br /&gt;
* [[Media:Mos 6545-1 crtc.pdf|MOS 6545]] (MOS, Rockwell, Synertek) is pin-compatible with the 6845. Its differences are found in the R8 register.&lt;br /&gt;
* [https://www.cpcwiki.eu/forum/other-retro/interesting-discussion-about-the-c128-s-cpm-poor-performance/msg223058/#msg223058 MOS 8563] It is an evolution of the 6545/6845 CRTC chip, with blitter abilities to autonomously perform block memory copies within its dedicated video RAM.&lt;br /&gt;
* [https://github.com/hoglet67/BeebFpga/blob/dev/src/common/mc6845.vhd BeebFpga] [https://github.com/MiSTer-devel/Amstrad_MiSTer/blob/master/rtl/UM6845R.v MiSTer] [https://opencores.org/websvn/filedetails?repname=System09&amp;amp;path=%2FSystem09%2Ftrunk%2Frtl%2FVHDL%2Fcrtc6845.vhd OpenCores] Verilog/VHDL implementations of the 6845&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Tools about CRTC ==&lt;br /&gt;
&lt;br /&gt;
* [http://www.cpcwiki.eu/imgs/9/99/Elmar_Krieger-SPECIAL_EFFECTS.dsk  some BASIC tools to detect CRTC types 0-1-2 and show some effects] by [[Elmar Krieger]] (DSK for Emulators)&lt;br /&gt;
* [[File:Shaker26.dsk]] Shaker - Suite of CRTC tests associated with the CPC CRTC compendium (many of them will not work correctly on emulators and that was the purpose of the tests, to help create more compatible emulation)&lt;br /&gt;
* [[File:Shaker addon.dsk]] Shaker Add-On (Pixel 1 Hard Scroll / Vertical Rupture all Crtc)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Links ==&lt;br /&gt;
&lt;br /&gt;
* [http://en.wikipedia.org/wiki/6845 Wikipedia on the CRTC]&lt;br /&gt;
* [[Media:ACCC1.8-EN.pdf]] CPC CRTC Compendium - Latest (04/2024!) document containing in-depth info about CRTC programming on CPC.&lt;br /&gt;
* [http://www.grimware.org/doku.php/documentations/devices/crtc CRTC documentation from Grimware]&lt;br /&gt;
* [http://quasar.cpcscene.net/doku.php?id=assem:crtc Quasar CRTC documentation (in french)]&lt;br /&gt;
* [https://pulkomandy.github.io/shinra.github.io/crtc.html PulkoMandy's table] [https://www.theoddys.com/acorn/the_6845_crtc/6845%20Variants.xlsx Oddy's table] Differences between CRTC types&lt;br /&gt;
* [[Media:Dossier Rupture(Gozeur Paradox).pdf]]&lt;br /&gt;
* [[Media:Dossier CRTC(Ramlaid Mortel).pdf]] Les entrailles du CRTC&lt;br /&gt;
* [https://thecheshirec.at/tag/crtc6845/ Leçons CRTC (CheshireCat)]&lt;br /&gt;
* [[Media:CRTC Compendium Podcast.mp3]] The CRTC Compendium digested in podcast format&lt;br /&gt;
* [https://martin.hinner.info/vga/pal.html PAL video timing specification]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Related pages==&lt;br /&gt;
&lt;br /&gt;
*[[Gate Array]]&lt;br /&gt;
&lt;br /&gt;
*[[ASIC]]&lt;br /&gt;
&lt;br /&gt;
*[[Video modes]]&lt;br /&gt;
&lt;br /&gt;
*[[Synchronising with the CRTC and display]] : technic and details on the relationship between Gate Array and CRTC.&lt;br /&gt;
&lt;br /&gt;
*[[VIDI digitizer]] This extension contains its own CRTC chip&lt;br /&gt;
&lt;br /&gt;
[[Category:Hardware]] [[Category:CPC Internal Components]] [[Category:Electronic Component]] [[Category:Programming]] [[Category:Datasheet]] [[Category:Graphic]]&lt;/div&gt;</summary>
		<author><name>Longshot</name></author>	</entry>

	<entry>
		<id>https://oldwiki.cpcwiki.eu/index.php?title=CRTC&amp;diff=126044</id>
		<title>CRTC</title>
		<link rel="alternate" type="text/html" href="https://oldwiki.cpcwiki.eu/index.php?title=CRTC&amp;diff=126044"/>
				<updated>2025-05-18T19:50:31Z</updated>
		
		<summary type="html">&lt;p&gt;Longshot: /* Links */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[File:CRTC6845-Type2.jpg|thumb|right|CRTC Type 2]]&lt;br /&gt;
&lt;br /&gt;
The 6845 '''CRTC''' (Cathode Ray Tube Controller) chip was created by Motorola in 1977. It works with the [[Gate Array]] to generate the video signal on the Amstrad CPC.&lt;br /&gt;
&lt;br /&gt;
This chip is also used in the [[BBC Micro]], [[Lynx|Camputers Lynx]], [[EG2000 Colour Genie]], [[Sharp X1]], [[MicroBee]], [[Commodore PET]] and the early graphics cards (MDA, Hercules, CGA, Plantronics Colorplus) for [[IBM PC]]. And it is found in some [https://www.msx.org/wiki/Hitachi_HD6845 MSX1 expansions], providing an 80-column text mode.&lt;br /&gt;
&lt;br /&gt;
It's important to note that the CRTC chip is primarily designed for character-based displays. It explains why, on the Amstrad CPC, the video memory is organized into a grid of characters rather than a purely linear bitmap.&lt;br /&gt;
&lt;br /&gt;
NOTES: &lt;br /&gt;
* This document describes the functionality in terms of the CPC with its separate CRTC and Gate-Array. The Plus has both integrated into the same IC, but could be considered to have two functional blocks, one for CRTC and one for Gate-Array. In this document the term 'Gate-Array' is used, but this also applies to the ASIC.&lt;br /&gt;
* Much information has been drawn from the [https://shaker.logonsystem.eu/ CRTC Compendium] documentation, condensed and rearranged for clarity. For details, timing diagrams, code examples, coding tips, and more, refer to that documentation.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Overview ==&lt;br /&gt;
&lt;br /&gt;
The 6845 Cathode Ray Tube Controller (CRTC) is a programmable IC used to generate video displays. This IC is used in a variety of computers including the Amstrad CPC, Amstrad Plus and KC Compact. &lt;br /&gt;
&lt;br /&gt;
The CRTC is a simple chip. It is made up of counters and equality operators, tied by simple logic. All the complexity stems from its multiple independent implementations with their subtle differences.&lt;br /&gt;
&lt;br /&gt;
The CRTC was a common part available from many different manufacturers. During the life of the CPC, Amstrad sourced the CRTC from various manufacturers. &lt;br /&gt;
&lt;br /&gt;
All ICs used were based on the same design but have a different implementation. As a result they do not operate identically in all situations. This document highlights these differences. &lt;br /&gt;
&lt;br /&gt;
This table lists the known ICs used, with their part number, manufacturer and type number. &lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!Part number&lt;br /&gt;
!Manufacturer&lt;br /&gt;
!Type number (note 3)&lt;br /&gt;
|-&lt;br /&gt;
|HD6845S||Hitachi||0&lt;br /&gt;
|-&lt;br /&gt;
|UM6845||UMC||0&lt;br /&gt;
|-&lt;br /&gt;
|UM6845R||UMC||1&lt;br /&gt;
|-&lt;br /&gt;
|MC6845||Motorola||2&lt;br /&gt;
|-&lt;br /&gt;
|AMS40489||Amstrad||3 (note 1)&lt;br /&gt;
|-&lt;br /&gt;
|AMS40226||Amstrad||4 (note 2)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
'''NOTES''' &lt;br /&gt;
&lt;br /&gt;
1. The CRTC functionality is integrated into the CPC+ ASIC. This type exists only in the 464 Plus, 6128 Plus and GX4000. &lt;br /&gt;
&lt;br /&gt;
2. This type exists in &amp;quot;cost-down&amp;quot; CPC464 and CPC6128 systems. In the &amp;quot;cost-down&amp;quot; the CRTC functionality is integrated into a single ASIC IC. This ASIC is often refered to as the &amp;quot;Pre-ASIC&amp;quot; because it preceeded the CPC+ ASIC. The CRTC functionality of the Pre-ASIC is almost identical to the CRTC within the ASIC.&lt;br /&gt;
 &lt;br /&gt;
3. In the Amstrad community each 6845 implementation has been assigned a type number. This type identifies a group of implementations which operate in exactly the same way. The type number system was originally used by demo programmers. &lt;br /&gt;
&lt;br /&gt;
It is possible to detect the 6845 present using software methods, and this is done to: &lt;br /&gt;
&lt;br /&gt;
* warn that the software was not designed for the detected 6845 and may function incorrectly&lt;br /&gt;
* to adapt the software so that it will run with the detected 6845 &lt;br /&gt;
* In most cases, the type of the detected 6845 is reported&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Programming==&lt;br /&gt;
&lt;br /&gt;
The 6845 is selected when bit 14 of the I/O port address is set to &amp;quot;0&amp;quot;. Bit 9 and 8 of the I/O port address define the function to access. The remaining bits can be any value, but it is adviseable to set these to &amp;quot;1&amp;quot; to avoid conflict with other devices in the system.&lt;br /&gt;
&lt;br /&gt;
The recommended I/O port addresses are:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!I/O port address&lt;br /&gt;
!/CS (A14)&lt;br /&gt;
!R/W (A9)&lt;br /&gt;
!RS (A8)&lt;br /&gt;
!Function&lt;br /&gt;
!Read/Write&lt;br /&gt;
|-&lt;br /&gt;
|&amp;amp;BCxx||0||0||0||Select 6845 register||Write only&lt;br /&gt;
|-&lt;br /&gt;
|&amp;amp;BDxx||0||0||1||Write to selected internal 6845 register||Write only&lt;br /&gt;
|-&lt;br /&gt;
|&amp;amp;BExx||0||1||0||&lt;br /&gt;
* CRTCs 0/2: —&lt;br /&gt;
* CRTC 1: Read Status Register&lt;br /&gt;
* CRTCs 3/4: Read from selected internal 6845 register&lt;br /&gt;
||Read only&lt;br /&gt;
|-&lt;br /&gt;
|&amp;amp;BFxx||0||1||1||Read from selected internal 6845 register||Read only&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
The CRTC is not connected to the CPU's RD and WR pins, so it cannot detect the bus's I/O direction. Therefore, executing an IN instruction to the select or write functions causes the CRTC to write the unpredictable data provided by the high-impedance bus to its registers.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Z80 I/O access timings ===&lt;br /&gt;
&lt;br /&gt;
The clock provided to the CRTC by the ASIC/Pre-ASIC is phase-shifted compared to the one provided by the Gate Array.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+&lt;br /&gt;
! Instructions !! Duration !! I/O CRTCs 0/1/2 !! I/O CRTCs 3/4&lt;br /&gt;
|-&lt;br /&gt;
| OUT (C),r8 || 4 µsec || '''3rd µsec''' || 4th µsec&lt;br /&gt;
|-&lt;br /&gt;
| OUT (C),0 || 4 µsec || '''3rd µsec''' || 4th µsec&lt;br /&gt;
|-&lt;br /&gt;
| OUT (n),A || 3 µsec || 3rd µsec || 3rd µsec&lt;br /&gt;
|-&lt;br /&gt;
| OUTI || 5 µsec || 5th µsec || 5th µsec&lt;br /&gt;
|-&lt;br /&gt;
| OUTD || 5 µsec || 5th µsec || 5th µsec&lt;br /&gt;
|-&lt;br /&gt;
| IN r8,(C) || 4 µsec || 4th µsec || 4th µsec&lt;br /&gt;
|-&lt;br /&gt;
| INI || 5 µsec || '''4th µsec''' || '''4th µsec'''&lt;br /&gt;
|-&lt;br /&gt;
| IND || 5 µsec || '''4th µsec''' || '''4th µsec'''&lt;br /&gt;
|-&lt;br /&gt;
| IN A,(n) || 3 µsec || 3rd µsec || 3rd µsec&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Video Memory Address (VMA)==&lt;br /&gt;
&lt;br /&gt;
The VMA of the [[Gate Array]] is constructed from the CRTC MA and RA signals:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!Video Memory Address&lt;br /&gt;
!Signal source&lt;br /&gt;
!Signal name&lt;br /&gt;
|-&lt;br /&gt;
|A15||6845||MA13 &lt;br /&gt;
|-&lt;br /&gt;
|A14||6845||MA12&lt;br /&gt;
|-&lt;br /&gt;
|A13||6845||'''RA2'''&lt;br /&gt;
|-&lt;br /&gt;
|A12||6845||'''RA1'''&lt;br /&gt;
|-&lt;br /&gt;
|A11||6845||'''RA0'''&lt;br /&gt;
|-&lt;br /&gt;
|A10||6845||MA9 &lt;br /&gt;
|-&lt;br /&gt;
|A9||6845||MA8 &lt;br /&gt;
|-&lt;br /&gt;
|A8||6845||MA7 &lt;br /&gt;
|-&lt;br /&gt;
|A7||6845||MA6 &lt;br /&gt;
|-&lt;br /&gt;
|A6||6845||MA5 &lt;br /&gt;
|-&lt;br /&gt;
|A5||6845||MA4 &lt;br /&gt;
|-&lt;br /&gt;
|A4||6845||MA3 &lt;br /&gt;
|-&lt;br /&gt;
|A3||6845||MA2 &lt;br /&gt;
|-&lt;br /&gt;
|A2||6845||MA1 &lt;br /&gt;
|-&lt;br /&gt;
|A1||6845||MA0&lt;br /&gt;
|-&lt;br /&gt;
|A0||Gate-Array||CCLK&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
CRTC generates the address, Gate Array reads the data and converts it to pixels based on its current graphics mode and palette.&lt;br /&gt;
&lt;br /&gt;
CRTC pins RA3, RA4, MA10, MA11 are not connected on CPC.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Overscan bits ===&lt;br /&gt;
&lt;br /&gt;
It is possible to use 32KB screen size (used for [[Programming:Overscan|overscan]]) by setting bits 11 and 10 of Register 12 both to 1. Bits MA11 and MA10 of the address generated by the CRTC are not written on the address bus to access video memory; settings both bits to 1 is the only way to cause a carry to bit MA12 when address pass over the end of current video page to change the memory address to the next video page.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ CRTC Display Start Address&lt;br /&gt;
|-&lt;br /&gt;
! colspan=&amp;quot;8&amp;quot; | Register 12&lt;br /&gt;
! colspan=&amp;quot;8&amp;quot; | Register 13&lt;br /&gt;
|-&lt;br /&gt;
! 15 !! 14 !! 13 !! 12 !! 11 !! 10 !! 9 !! 8&lt;br /&gt;
! 7 !! 6 !! 5 !! 4 !! 3 !! 2 !! 1 !! 0&lt;br /&gt;
|-&lt;br /&gt;
| colspan=&amp;quot;2&amp;quot; | Unused&lt;br /&gt;
| colspan=&amp;quot;2&amp;quot; | Video Page&lt;br /&gt;
| colspan=&amp;quot;2&amp;quot; | Page Size&lt;br /&gt;
| colspan=&amp;quot;10&amp;quot; | Start Address (1024 positions)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| style=&amp;quot;white-space: nowrap;&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;margin-right: 32px&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Bit 13 !! Bit 12 !! Video Page&lt;br /&gt;
|-&lt;br /&gt;
| 0 || 0 || 0000 - 3FFF&lt;br /&gt;
|-&lt;br /&gt;
| 0 || 1 || 4000 - 7FFF&lt;br /&gt;
|-&lt;br /&gt;
| 1 || 0 || 8000 - BFFF&lt;br /&gt;
|-&lt;br /&gt;
| 1 || 1 || C000 - FFFF&lt;br /&gt;
|}&lt;br /&gt;
|&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Bit 11 !! Bit 10 !! Page Size&lt;br /&gt;
|-&lt;br /&gt;
| 0 || 0 || 16KB&lt;br /&gt;
|-&lt;br /&gt;
| 0 || 1 || 16KB&lt;br /&gt;
|-&lt;br /&gt;
| 1 || 0 || 16KB&lt;br /&gt;
|-&lt;br /&gt;
| 1 || 1 || '''32KB'''&lt;br /&gt;
|}&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Coarse hardware scrolling ===&lt;br /&gt;
&lt;br /&gt;
The start address can be manipulated to achieve horizontal and/or vertical hardware scrolling:&lt;br /&gt;
&lt;br /&gt;
*To move right: &amp;lt;code&amp;gt;start_address := start_address + 1&amp;lt;/code&amp;gt;&lt;br /&gt;
*To move left: &amp;lt;code&amp;gt;start_address := start_address - 1&amp;lt;/code&amp;gt;&lt;br /&gt;
*To move down: &amp;lt;code&amp;gt;start_address := start_address + R1&amp;lt;/code&amp;gt;&lt;br /&gt;
*To move up: &amp;lt;code&amp;gt;start_address := start_address - R1&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
However, it is a position in word (16 bits), not in byte. So, the screen will move two bytes at a time horizontally. Also, the precision will be one CRTC character vertically.&lt;br /&gt;
&lt;br /&gt;
The first game that used R12/R13 for both horizontal and vertical hardware scrolling is [https://www.cpc-power.com/index.php?page=detail&amp;amp;num=1839 Roland on the Ropes], released in 1984.&lt;br /&gt;
&lt;br /&gt;
The following BASIC program demonstrates the coarse scrolling by setting the R12 and R13 registers based on keyboard input:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
10 ma%=0&lt;br /&gt;
20 IF INKEY(1)=0 THEN GOSUB 100&lt;br /&gt;
30 IF INKEY(2)=0 THEN GOSUB 300&lt;br /&gt;
40 IF INKEY(8)=0 THEN GOSUB 500&lt;br /&gt;
50 IF INKEY(0)=0 THEN GOSUB 700&lt;br /&gt;
60 GOTO 20&lt;br /&gt;
100 ' right&lt;br /&gt;
110 ma%=ma%+1: GOSUB 900: RETURN&lt;br /&gt;
300 ' down&lt;br /&gt;
310 ma%=ma%+40: GOSUB 900: RETURN&lt;br /&gt;
500 ' left&lt;br /&gt;
510 ma%=ABS(ma%-1): GOSUB 900: RETURN&lt;br /&gt;
700 ' up&lt;br /&gt;
710 ma%=ABS(ma%-40): GOSUB 900: RETURN&lt;br /&gt;
900 ' set R12 and R13&lt;br /&gt;
910 l%=ma% AND 255: h%=&amp;amp;30 OR ((ma%\256) AND 3) :OUT &amp;amp;BC00,13:OUT &amp;amp;BD00,l%: OUT &amp;amp;BC00,12:OUT &amp;amp;BD00,h%&lt;br /&gt;
930 RETURN&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Which looks like the following:&lt;br /&gt;
&lt;br /&gt;
[[File:CRTC-Coarse-scroll.gif]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Advanced hardware scrolling ===&lt;br /&gt;
&lt;br /&gt;
To achieve smoother hardware scrolling, other tricks are required in complement to R12/R13. Usually, R3 is used for smooth horizontal scroll and R5 for smooth vertical scroll.&lt;br /&gt;
&lt;br /&gt;
A good example of smooth hardware multidirectional scrolling game on CPC is [https://www.cpc-power.com/index.php?page=detail&amp;amp;num=2119 Super Cauldron], released in 1993.&lt;br /&gt;
&lt;br /&gt;
Everything you need to know about hardware scrolling on CPC can be found [https://www.cpcwiki.eu/forum/programming/hardware-scrolling-21687/ there].&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Split screen (aka Rupture) ==&lt;br /&gt;
&lt;br /&gt;
While there is usually 1 CRTC frame per screen frame, the screen frame can be divided into multiple CRTC frames of varying proportions.&lt;br /&gt;
&lt;br /&gt;
This is useful for defining different scrolling zones in your screen frame. For example, it was used for hardware parallax scrolling in the game [https://www.cpc-power.com/index.php?page=detail&amp;amp;num=1307 The Living Daylights], released in 1987. [https://www.cpcwiki.eu/forum/programming/the-living-daylights-extra-colours-in-mode-1-rasters-screen-splits/ Source]&lt;br /&gt;
&lt;br /&gt;
And this is basically the bread and butter of innumerable CPC demos.&lt;br /&gt;
&lt;br /&gt;
Some rules of thumb [https://www.cpcwiki.eu/forum/programming/advice-on-split-screen-code/msg242186/ Source]:&lt;br /&gt;
* changes to the screen address have to be done anywhere in the previous split&lt;br /&gt;
* changes to the height of the split have to be done inside the current split (after it has started, in the area of the size of the previous split)&lt;br /&gt;
* changes to screen mode and colours are happening immediately&lt;br /&gt;
&lt;br /&gt;
CRTC registers and screen splitting:&lt;br /&gt;
*reg 0 (63) = x-screenwidth (usually always 63)&lt;br /&gt;
*reg 1 (50) = x-splitwidth (e.g.50)&lt;br /&gt;
*reg 2 (51) = x-splitstart (e.g. 51)&lt;br /&gt;
*reg 3 (08) = x-finestart (maybe use this for half-char scrolling)&lt;br /&gt;
*reg 4 (##) = y-splitheight-1 (set this inside the current split)&lt;br /&gt;
*reg 5 (00) = y-finestart&lt;br /&gt;
*reg 6 (25) = y-max visible splitpart (same like 4)&lt;br /&gt;
*reg 7 (##) = inside last split -&amp;gt; set to 0; inside first split, but after vblank -&amp;gt; set to 255&lt;br /&gt;
*reg 9 (07) = y-lines/char-1&lt;br /&gt;
&lt;br /&gt;
Set this inside the previous split:&lt;br /&gt;
*reg12 (##) = address high (char / 256 + block * 16)&lt;br /&gt;
*reg13 (##) = address low  (char mod 256)&lt;br /&gt;
&lt;br /&gt;
Total height of all splits must be 39.&lt;br /&gt;
&lt;br /&gt;
The [https://www.cpcwiki.eu/forum/programming/interrupt-positions-with-various-sized-screens/ IntPos tool] by Kevin Thacker can help visualize the potential split screen areas.&lt;br /&gt;
&lt;br /&gt;
Note: If all you want is multiple graphics modes in the same frame, you don't need to touch the CRTC at all. More information here: [https://www.cpc-power.com/cpcarchives/index.php?page=articles&amp;amp;num=184 Multi-Mode Graphique (FR)]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== CUDISP (aka CURSOR) ==&lt;br /&gt;
&lt;br /&gt;
CUDISP (Cursor Display) signal defines the hardware cursor.&lt;br /&gt;
&lt;br /&gt;
CRTC pin CUDISP is not connected to the Gate Array, so it has no effect on a barebone CPC or Plus machine.&lt;br /&gt;
&lt;br /&gt;
However, this signal is provided to the [[Connector:Expansion port]]. And it is used by the [[PlayCity]] and [[Play2CPC]] expansions.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== DISPTMG (aka Display Enable) ==&lt;br /&gt;
&lt;br /&gt;
DISPTMG (Display Timing) signal defines the border. When DISPTMG is &amp;quot;0&amp;quot; the border colour is output by the Gate Array to the display.&lt;br /&gt;
&lt;br /&gt;
The border has higher priority than pixels but lower priority than the black colour output when HSYNC/VSYNC are active.&lt;br /&gt;
&lt;br /&gt;
While border is active, all the CRTC counters continue to increment normally and addresses continue to be generated.&lt;br /&gt;
&lt;br /&gt;
The DISPTMG signal is composited from its 3 internal subcomponents: HBORDER (Horizontal), VBORDER (Vertical), SBORDER (Split) by using the NOR function. DISPTMG is &amp;quot;0&amp;quot; if at least one of its subcomponents is &amp;quot;1&amp;quot;. These 3 subcomponents are all independent of each other.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== HBORDER ===&lt;br /&gt;
&lt;br /&gt;
On all CRTCs, HBORDER is disabled when HCC=0 and enabled when HCC=R1.&lt;br /&gt;
&lt;br /&gt;
The exception is for CRTC2 during an HSYNC: the HCC=0 check is skipped, so HBORDER stays on.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== VBORDER ===&lt;br /&gt;
&lt;br /&gt;
On all CRTCs, VBORDER is disabled when VCC=0 and enabled when VCC=R6.&lt;br /&gt;
&lt;br /&gt;
On CRTCs 0/1/2, the condition VCC=R6 is tested on every cycle.&lt;br /&gt;
&lt;br /&gt;
On CRTCs 3/4, the condition VCC=R6 is tested only at each new character line start (when VLC=0 and HCC=0).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== SBORDER ===&lt;br /&gt;
&lt;br /&gt;
Split border is a technique similar to split rasters, except that it is handled by the CRTC instead of the [[Gate Array]].&lt;br /&gt;
&lt;br /&gt;
DISPTMG can be temporarily forced to 0 by using R8 (DISPTMG Skew) on CRTCs 0/3/4, or by setting R6=0 on CRTC 1.&lt;br /&gt;
&lt;br /&gt;
It is not possible to force DISPTMG on CRTC 2.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Border bytes ===&lt;br /&gt;
&lt;br /&gt;
Despite their 1MHz clock speed, CRTCs 0/2 have been observed to change state at a rate equivalent to 2MHz chips by responding to both the rising and falling edges of each clock cycle.&lt;br /&gt;
&lt;br /&gt;
==== Interline border ====&lt;br /&gt;
On CRTCs 0/2, R1&amp;gt;R0 generates one byte (0.5µs) of border at the end of the raster line. On CRTCs 1/3/4, it does not.&lt;br /&gt;
&lt;br /&gt;
If border skew is used, the border byte will skew and change into a full character-width border instead.&lt;br /&gt;
&lt;br /&gt;
==== Border conflict ====&lt;br /&gt;
If R1=0 and HCC=0, we expect HBORDER to activate as HCC=R1 and we also expect HBORDER to deactivate as HCC=0. In this situation, all CRTCs activate HBORDER.&lt;br /&gt;
&lt;br /&gt;
If R6=0 and VCC=0, we expect VBORDER to activate as VCC=R6 and we also expect VBORDER to deactivate as VCC=0. In this situation, all CRTCs activate VBORDER. On CRTC 1, even SBORDER is activated. But on CRTCs 0/2, the first raster line shows an alternation of bytes of VBORDER and displayable characters.&lt;br /&gt;
&lt;br /&gt;
To see the border bytes with your own eyes, type this BASIC line after reset:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
BORDER 6:OUT &amp;amp;BC00,6:OUT &amp;amp;BD00,0&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== HSYNC ==&lt;br /&gt;
&lt;br /&gt;
The HSYNC signal from the CRTC is not directly connected to the display. It is passed to the [[Gate Array]] for further modification. See its wiki page.&lt;br /&gt;
&lt;br /&gt;
While HSYNC is active, all the CRTC counters continue to increment normally and addresses continue to be generated.&lt;br /&gt;
&lt;br /&gt;
On all CRTCs, while an HSYNC is ongoing, the condition HCC=R2 is ignored. So we cannot trigger a new HSYNC during an HSYNC.&lt;br /&gt;
&lt;br /&gt;
=== Contiguous HSYNCs ===&lt;br /&gt;
&lt;br /&gt;
On CRTC 0, two HSYNCs cannot be contiguous. They are always separated by at least 1 CRTC character. What happens is that when HSC=R3 and HCC=R2, the condition HSC=R3 takes precedence over the condition HCC=R2 and HSYNC is stopped.&lt;br /&gt;
&lt;br /&gt;
On CRTCs 1/2/3/4, HSYNCs can be contiguous.&lt;br /&gt;
&lt;br /&gt;
=== Signal delay ===&lt;br /&gt;
&lt;br /&gt;
On all CRTCs, there is a 1µs delay in display between when the CRTC provides a video pointer, and when the Gate Array displays the corresponding 16-bit character.&lt;br /&gt;
&lt;br /&gt;
But on CRTCs 0/1/2, there is no delay for HSYNC. On CRTCs 3/4, the Amstrad engineers fixed the issue by adding a 1µs delay for the HSYNC signal to match the display signal. &lt;br /&gt;
&lt;br /&gt;
So now we have a bigger issue: on CRTCs 3/4, HSYNC occurs 1µs later than on CRTCs 0/1/2. Interrupts being dependent on HSYNC, this is a serious compatibility issue for time-sensitive code. It also explains why the CTM monitor has to be calibrated differently on CRTCs 3/4. Fortunately, the issue is easy to fix, by adjusting the HSYNC width with CRTC register 3.&lt;br /&gt;
&lt;br /&gt;
=== Discolouration effect ===&lt;br /&gt;
&lt;br /&gt;
On CRT monitors from other brands, a colour calibration can happen just after the C-HSYNC pulse.&lt;br /&gt;
&lt;br /&gt;
So even when a fully valid C-HSYNC pulse of 4µs is emitted, an HSYNC shorter than usual combined with a coloured border can induce a discolouration effect on those monitors.&lt;br /&gt;
&lt;br /&gt;
=== Screen wobbling and Fine horizontal hardware scroll ===&lt;br /&gt;
&lt;br /&gt;
These effects use invalid HSYNC signals, which are poorly supported by modern displays. However, these effects were used in commercial-era CPC games, so it's fine if you choose to use them.&lt;br /&gt;
&lt;br /&gt;
When R2 increases by 1, the screen is shifted to the left by 16 mode2 pixels.&lt;br /&gt;
&lt;br /&gt;
When R2 decreases by 1, the screen is shifted to the right by 16 mode2 pixels.&lt;br /&gt;
&lt;br /&gt;
When R3l increases by 1 (and if &amp;lt;6), the screen is shifted to the left by 8 mode2 pixels.&lt;br /&gt;
&lt;br /&gt;
When R3l decreases by 1 (and if &amp;gt;2), the screen is shifted to the right by 8 mode2 pixels.&lt;br /&gt;
&lt;br /&gt;
The shift is not instantaneous but follows a logarithmic attenuation across several raster lines. This property can be used to get even finer horizontal control by modifying R2/R3 on each raster line.&lt;br /&gt;
&lt;br /&gt;
[[Longshot]] has demonstrated [https://youtu.be/1q7RQykZoKY horizontal hardware scroll] with one-pixel precision in mode1 on all CRTCs. However, because you have to synchronize with each line, it takes a lot of CPU time if it's done in fullscreen (272 lines).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== VSYNC ==&lt;br /&gt;
&lt;br /&gt;
The VSYNC signal from the CRTC is not directly connected to the display. It is passed to the [[Gate Array]] for further modification. See its wiki page.&lt;br /&gt;
&lt;br /&gt;
While VSYNC is active, all the CRTC counters continue to increment normally and addresses continue to be generated.&lt;br /&gt;
&lt;br /&gt;
On all CRTCs, while a VSYNC is ongoing, the condition VCC=R7 is ignored. So we cannot trigger a new VSYNC during a VSYNC. &lt;br /&gt;
&lt;br /&gt;
On CRTCs 0/1/2, the sole condition to trigger a VSYNC is that VCC=R7. While on CRTCs 3/4, it is necessary to have VCC=R7 and HCC=0 and VLC=0 to trigger a VSYNC.&lt;br /&gt;
&lt;br /&gt;
=== Blocked VSYNC ===&lt;br /&gt;
&lt;br /&gt;
On CRTC 0, if R7 is modified with the value of VCC when HCC&amp;lt;2, we are in blocked VSYNC. Then, the VSYNC can no longer occur on VCC=R7 until an unblocking condition is produced (VCC or R7 update). Source: §16.4 &amp;quot;Conditions to consider&amp;quot; of the CRTC Compendium&lt;br /&gt;
&lt;br /&gt;
=== Ghost VSYNC ===&lt;br /&gt;
&lt;br /&gt;
On CRTC 2, if a VSYNC is triggered during an HSYNC, the CRTC produces a ghost VSYNC. The CRTC then counts the lines as if a VSYNC were taking place by preventing a new VSYNC from occurring, but without the VSYNC pin being enabled.&lt;br /&gt;
&lt;br /&gt;
=== PPI VSYNC ===&lt;br /&gt;
&lt;br /&gt;
The VSYNC pin of the CRTC is directly connected to bit0 of port B of the PPI. There is no delay involved.&lt;br /&gt;
&lt;br /&gt;
On Amstrad CPC (not Plus!), it is also possible to reverse the direction of PPI port B to output a &amp;quot;fake&amp;quot; VSYNC signal directly from the PPI to the Gate Array.&lt;br /&gt;
&lt;br /&gt;
As an exception, the Ghost VSYNC of CRTC 2 overpowers the Fake VSYNC.&lt;br /&gt;
&lt;br /&gt;
=== Subpixel vertical hardware scroll ===&lt;br /&gt;
&lt;br /&gt;
By tuning very precisely when the VSYNC signal is sent to the monitor,  Longshot has demonstrated [https://youtu.be/bSjRU6Wye00 vertical hardware scroll] with a precision of 1/128th of a pixel. Furthermore, subpixel vertical scrolling consumes very little CPU.&lt;br /&gt;
&lt;br /&gt;
=== Mid-VSYNC ===&lt;br /&gt;
&lt;br /&gt;
On all CRTCs, in both interlace modes, a mid-VSYNC is generated when VCC=R7 on the even field. The VSYNC pulse starts in the middle of the raster line, at HCC=R0/2.&lt;br /&gt;
&lt;br /&gt;
As an exception, on CRTCs 3/4, if R7=0 then mid-VSYNC will instead occur on the odd field. Source: §19.7 &amp;quot;Mid-VSYNC&amp;quot; of the CRTC Compendium.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Interlace modes ==&lt;br /&gt;
&lt;br /&gt;
Note: Some details about the CRTC interlace implementations are missing in this article. Consider it as an introduction to the topic.&lt;br /&gt;
&lt;br /&gt;
[[File:CRTC Interlace modes.png]]&lt;br /&gt;
&lt;br /&gt;
For a CRTC character line with n raster lines, R9 must be set to n-1 on all CRTCs, regardless of the interlace settings. The exception is for CRTCs 0/3/4 in IVM mode, where R9 must be set to n-2.&lt;br /&gt;
&lt;br /&gt;
=== Interlace sync mode (ISM) ===&lt;br /&gt;
&lt;br /&gt;
In this mode, the same information is painted in both fields to enhance readability. Reprogramming the CRTC is not necessary.&lt;br /&gt;
&lt;br /&gt;
=== Interlace sync and video mode (IVM) ===&lt;br /&gt;
&lt;br /&gt;
In this mode, alternating lines are displayed in the even and odd field to double the resolution.&lt;br /&gt;
&lt;br /&gt;
On the even field, the CRTC displays the lines for which VLC is even. On the odd field, the CRTC displays the lines for which VLC is odd.&lt;br /&gt;
&lt;br /&gt;
It is necessary to reprogram the CRTC as if we were building a frame of 624 lines.&lt;br /&gt;
&lt;br /&gt;
CRTC 2 is the exception: R4, R5, R6, R7 do not need to be reprogrammed as it considers each character line to be a double character line.&lt;br /&gt;
&lt;br /&gt;
=== Interlace adjustment line ===&lt;br /&gt;
&lt;br /&gt;
On all CRTCs, in both interlace modes, an additional line (the 625th line) is added automatically by the CRTC at the end of the even field. This line is added after the lines of the vertical adjustment mode.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== CRTC registers ==&lt;br /&gt;
&lt;br /&gt;
The Internal registers of the 6845 are:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!rowspan=2|Register Index&lt;br /&gt;
!rowspan=2|Register Name&lt;br /&gt;
!colspan=3|Read/Write&lt;br /&gt;
!rowspan=2|Range&lt;br /&gt;
!rowspan=2|CPC Setting&lt;br /&gt;
!rowspan=2|Notes&lt;br /&gt;
|-&lt;br /&gt;
!CRTC 0&lt;br /&gt;
!CRTCs 1/2&lt;br /&gt;
!CRTCs 3/4&lt;br /&gt;
|-&lt;br /&gt;
|0||Horizontal Total (-1)||colspan=3 style=&amp;quot;text-align: center;&amp;quot;|Write||00000000||63||Width of the screen, in characters. Should always be 63 (64 characters). 1 character == 1μs.&lt;br /&gt;
|-&lt;br /&gt;
|1||Horizontal Displayed||colspan=3 style=&amp;quot;text-align: center;&amp;quot;|Write||00000000||40||Number of characters displayed. Once horizontal character count (HCC) matches this value, DISPTMG is set to 1.&lt;br /&gt;
|-&lt;br /&gt;
|2||Horizontal Sync Position||colspan=3 style=&amp;quot;text-align: center;&amp;quot;|Write||00000000||46||When to start the HSync signal.&lt;br /&gt;
|-&lt;br /&gt;
|3||Horizontal and Vertical Sync Widths||colspan=3 style=&amp;quot;text-align: center;&amp;quot;|Write||VVVVHHHH||128+14||VSync width in scan-lines (Not present on all CRTCs, fixed to 16 lines on these) ; HSync pulse width in characters.&lt;br /&gt;
|-&lt;br /&gt;
|4||Vertical Total (-1)||colspan=3 style=&amp;quot;text-align: center;&amp;quot;|Write||x0000000||38||Height of the screen, in characters.&lt;br /&gt;
|-&lt;br /&gt;
|5||Vertical Total Adjust||colspan=3 style=&amp;quot;text-align: center;&amp;quot;|Write||xxx00000||0||Measured in scanlines, can be used for smooth vertical scrolling on CPC.&lt;br /&gt;
|-&lt;br /&gt;
|6||Vertical Displayed||colspan=3 style=&amp;quot;text-align: center;&amp;quot;|Write||x0000000||25||Height of displayed screen in characters. Once vertical character count (VCC) matches this value, DISPTMG is set to 1.&lt;br /&gt;
|-&lt;br /&gt;
|7||Vertical Sync Position||colspan=3 style=&amp;quot;text-align: center;&amp;quot;|Write||x0000000||30||When to start the VSync signal, in characters.&lt;br /&gt;
|-&lt;br /&gt;
|8||Interlace and Skew||colspan=3 style=&amp;quot;text-align: center;&amp;quot;|Write||CCDDxxII||0||CC: Cursor Skew (Only in CRTCs 0, 3 and 4). DD: Display Skew (Only in CRTCs 0, 3 and 4). II: Interlace Mode.&lt;br /&gt;
|-&lt;br /&gt;
|9||Maximum Raster Address (aka Number of Scan Lines) (-1)||colspan=3 style=&amp;quot;text-align: center;&amp;quot;|Write||xxx00000||7||Maximum scan line address on CPC can hold between 0 and 7, higher values' upper bits are ignored.&lt;br /&gt;
|-&lt;br /&gt;
|10||Cursor Start Raster||style=&amp;quot;text-align: center;&amp;quot;|Write||style=&amp;quot;text-align: center;&amp;quot;|Write||Read/Write||xBP00000||0||B = Blink On/Off; P = Blink Period Control (16 or 32 frames). Sets first raster row of character that cursor is on to invert.&lt;br /&gt;
|-&lt;br /&gt;
|11||Cursor End Raster||style=&amp;quot;text-align: center;&amp;quot;|Write||style=&amp;quot;text-align: center;&amp;quot;|Write||Read/Write||xxx00000||0||Sets last raster row of character that cursor is on to invert.&lt;br /&gt;
|-&lt;br /&gt;
|12||Display Start Address (High)||Read/Write||style=&amp;quot;text-align: center;&amp;quot;|Write||Read/Write||xx000000||48||On Amstrad Plus, bit7 of the printer port is controlled by bit3 of CRTC R12 (ie. bit11 of Display Start Address).&lt;br /&gt;
|-&lt;br /&gt;
|13||Display Start Address (Low)||Read/Write||style=&amp;quot;text-align: center;&amp;quot;|Write||Read/Write||00000000||0||Allows you to offset the start of screen memory for hardware scrolling, and if using memory from address &amp;amp;0000 with the firmware.&lt;br /&gt;
|-&lt;br /&gt;
|14||Cursor Address (High)||colspan=3 style=&amp;quot;text-align: center;&amp;quot;|Read/Write||xx000000||0||&lt;br /&gt;
|-&lt;br /&gt;
|15||Cursor Address (Low)||colspan=3 style=&amp;quot;text-align: center;&amp;quot;|Read/Write||00000000||0||&lt;br /&gt;
|-&lt;br /&gt;
|16||Light Pen Address (High)||colspan=3 style=&amp;quot;text-align: center;&amp;quot;|Read||xx000000||||On CRTC1, bit6 of Status register goes to 0 when R16 is read.&lt;br /&gt;
|-&lt;br /&gt;
|17||Light Pen Address (Low)||colspan=3 style=&amp;quot;text-align: center;&amp;quot;|Read||00000000||||On CRTC1, bit6 of Status register goes to 0 when R17 is read.&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Screen size ===&lt;br /&gt;
&lt;br /&gt;
We can calculate the screen size in words by multiplying R1 x R6 x (R9+1). And then multiplying the result by 2 to have the screen size in bytes.&lt;br /&gt;
&lt;br /&gt;
With the default CRTC values, we obtain 40 x 25 x (7+1) x 2 = 16000 bytes.&lt;br /&gt;
&lt;br /&gt;
So we can observe that only part of the 16384 bytes (=16KB) page of VRAM is actually displayed on screen.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Register access ===&lt;br /&gt;
&lt;br /&gt;
On CRTCs 0/1/2, if a Write Only register is read from, &amp;quot;0&amp;quot; is returned. The register accessing scheme on CRTCs 3/4 makes it impossible to happen.&lt;br /&gt;
&lt;br /&gt;
On all CRTCs, only the 5 least significant bits of the selected register number are considered to write to a register. The other bits are ignored.&lt;br /&gt;
&lt;br /&gt;
On CRTCs 0/1/2, only the 5 least significant bits of the selected register number are considered to read a register:&lt;br /&gt;
* On CRTCs 0/2, registers 18-31 read as 0&lt;br /&gt;
* On CRTC 1, registers 18-30 read as 0, register 31 reads as &amp;amp;FF&lt;br /&gt;
&lt;br /&gt;
On CRTCs 3/4, only the 3 least significant bits of the selected register number are considered to read a register, according to the following table:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!Nb&lt;br /&gt;
!Register&lt;br /&gt;
!Definition&lt;br /&gt;
|-&lt;br /&gt;
|0||R16||Light Pen Address (High)&lt;br /&gt;
|-&lt;br /&gt;
|1||R17||Light Pen Address (Low)&lt;br /&gt;
|-&lt;br /&gt;
|2||R10||Cursor Start Raster&lt;br /&gt;
|-&lt;br /&gt;
|3||R11||Cursor End Raster&lt;br /&gt;
|-&lt;br /&gt;
|4||R12||Display Start Address (High)&lt;br /&gt;
|-&lt;br /&gt;
|5||R13||Display Start Address (Low)&lt;br /&gt;
|-&lt;br /&gt;
|6||R14||Cursor Address (High)&lt;br /&gt;
|-&lt;br /&gt;
|7||R15||Cursor Address (Low)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== CRTC register differences ==&lt;br /&gt;
&lt;br /&gt;
CRTC types 3 and 4 are identical in every way, except for the unlocking mechanism, split screen, hardware soft scroll and 8-bit printer port functionalities specific to the [[ASIC]].&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== R10/R11 on ASIC/Pre-ASIC  ===&lt;br /&gt;
&lt;br /&gt;
The cursor raster registers R10/R11 act as status registers when read on CRTCs 3/4. They behave as normal cursor raster registers upon write.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! R10 - Bit number&lt;br /&gt;
! Bit value&lt;br /&gt;
! Event&lt;br /&gt;
|-&lt;br /&gt;
|0&lt;br /&gt;
|1&lt;br /&gt;
|C0=R0&lt;br /&gt;
|-&lt;br /&gt;
|1&lt;br /&gt;
|0&lt;br /&gt;
|C0=R0/2&lt;br /&gt;
|-&lt;br /&gt;
|2&lt;br /&gt;
|0&lt;br /&gt;
|C0=R1-1 (if R0&amp;gt;=R1)&lt;br /&gt;
|-&lt;br /&gt;
|3&lt;br /&gt;
|0&lt;br /&gt;
|C0=R2&lt;br /&gt;
|-&lt;br /&gt;
|4&lt;br /&gt;
|0&lt;br /&gt;
|C0=R2+R3&lt;br /&gt;
|-&lt;br /&gt;
|5&lt;br /&gt;
|0&lt;br /&gt;
1&lt;br /&gt;
|R3h&amp;gt;0 : C0=0..R0 on the line R3h from Vsync (C4=R7)&lt;br /&gt;
R3h=0 : C0=0..R0 over 15 lines from Vsync (C4=R7)&lt;br /&gt;
|-&lt;br /&gt;
|6&lt;br /&gt;
|1&lt;br /&gt;
|Always 1&lt;br /&gt;
|-&lt;br /&gt;
|7&lt;br /&gt;
|0&lt;br /&gt;
0&lt;br /&gt;
|C0=0..R0-1 : VMA.Lsb=0xFF&lt;br /&gt;
C0=R0 : VMA'.Lsb=0x00 (same cond if C0=R0=0)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! R11 - Bit number&lt;br /&gt;
! Bit value&lt;br /&gt;
! Event&lt;br /&gt;
|-&lt;br /&gt;
|0&lt;br /&gt;
|0&lt;br /&gt;
|C4=R4 and C9=R9 and C0=R0 : Last char of screen&lt;br /&gt;
|-&lt;br /&gt;
|1&lt;br /&gt;
|0&lt;br /&gt;
|C4=R6-1 and C9=R9 and C0=R0 : Last char displayed&lt;br /&gt;
|-&lt;br /&gt;
|2&lt;br /&gt;
|0&lt;br /&gt;
|C4=R7-1 and C9=R9 and C0=R0 : Last char before Vsync&lt;br /&gt;
|-&lt;br /&gt;
|3&lt;br /&gt;
|0/1&lt;br /&gt;
|Timer 16 CRTC frames&lt;br /&gt;
|-&lt;br /&gt;
|4&lt;br /&gt;
|1&lt;br /&gt;
|Always 1&lt;br /&gt;
|-&lt;br /&gt;
|5&lt;br /&gt;
|0&lt;br /&gt;
|C9=R9 : C0=0 to R0&lt;br /&gt;
|-&lt;br /&gt;
|6&lt;br /&gt;
|0&lt;br /&gt;
|Always 0&lt;br /&gt;
|-&lt;br /&gt;
|7&lt;br /&gt;
|1&lt;br /&gt;
|(C9=R9 and C0=R0) or (C9=0 and C0=0 to R0-1)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Horizontal and Vertical Sync (R3) ===&lt;br /&gt;
&lt;br /&gt;
Type 0:&lt;br /&gt;
*Bits 7..4 define Vertical Sync Width. If 0 is programmed, this gives 16 lines of VSYNC.&lt;br /&gt;
*Bits 3..0 define Horizontal Sync Width. If 0 is programmed, no HSYNC is generated (and therefore, no interrupts).&lt;br /&gt;
&lt;br /&gt;
Type 1:&lt;br /&gt;
*Bits 7..4 are ignored. Vertical Sync is fixed at 16 lines.&lt;br /&gt;
*Bits 3..0 define Horizontal Sync Width. If 0 is programmed, no HSYNC is generated (and therefore, no interrupts).&lt;br /&gt;
&lt;br /&gt;
Type 2:&lt;br /&gt;
*Bits 7..4 are ignored. Vertical Sync is fixed at 16 lines.&lt;br /&gt;
*Bits 3..0 define Horizontal Sync Width. If 0 is programmed, this gives a HSYNC width of 16.&lt;br /&gt;
&lt;br /&gt;
Types 3/4:&lt;br /&gt;
*Bits 7..4 define Vertical Sync Width. If 0 is programmed, this gives 16 lines of VSYNC.&lt;br /&gt;
*Bits 3..0 define Horizontal Sync Width. If 0 is programmed, this gives a HSYNC width of 16.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Interlace and Skew (R8) ===&lt;br /&gt;
&lt;br /&gt;
Types 0/3/4:&lt;br /&gt;
*Bits 7..6 define the skew (delay) of the CUDISP signal (00 = Non-skew ; 01 = One-character skew ; 10 = Two-character skew ; 11 = Non-output).&lt;br /&gt;
*Bits 5..4 define the skew (delay) of the DISPTMG signal (00 = Non-skew ; 01 = One-character skew ; 10 = Two-character skew ; 11 = Non-output).&lt;br /&gt;
*Bits 3..2 are ignored.&lt;br /&gt;
*Bits 1..0 define the interlace mode (00 = No Interlace ; 01 = Interlace Sync ; 10 = No Interlace ; 11 = Interlace Sync and Video).&lt;br /&gt;
&lt;br /&gt;
Types 1/2:&lt;br /&gt;
*Bits 7..2 are ignored.&lt;br /&gt;
*Bits 1..0 define the interlace mode.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== R31 on Type 1 ===&lt;br /&gt;
&lt;br /&gt;
R31 is described in the UM6845R documentation as &amp;quot;Dummy Register&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Its use is described in the documentation for the Rockwell R6545 in combination with R18, R19 and R8 and the Status Register.&lt;br /&gt;
&lt;br /&gt;
In the UM6845R it appears to have no effect. Reading and writing does nothing. Reading it returns &amp;amp;FF.&lt;br /&gt;
&lt;br /&gt;
R31 doesn't exist on CRTCs 0/2/3/4.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Status register on Type 1 ===&lt;br /&gt;
&lt;br /&gt;
The UM6845R has a status register that can be read using port &amp;amp;BExx.&lt;br /&gt;
&lt;br /&gt;
Bit 6 is set to 1 if there is a strobe input to the /LPEN signal. It is cleared to 0 when either R17 or R16 (LPEN address) of the CRTC are read. It signals there is a valid LPEN input. On Kevin Thacker's CPC with UM6845R, it is triggered at power on, R17 and R16 have the values 0 when read.&lt;br /&gt;
&lt;br /&gt;
Bit 5 is set to 1 when CRTC is in &amp;quot;vertical blanking&amp;quot;. Vertical blanking is when the vertical border is active. i.e. VCC&amp;gt;=R6. &lt;br /&gt;
&lt;br /&gt;
It is cleared when the frame is started (VCC=0). It is not directly related to the DISPTMG output (used by the CPC to display the border colour) because that output is a combination of horizontal and vertical blanking.&lt;br /&gt;
This bit will be 0 when pixels are being displayed.&lt;br /&gt;
&lt;br /&gt;
All the other bits read as 0 and don't have any function.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== CRTC Type Detection ==&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
10 MODE 1:' Reinitialize screen&lt;br /&gt;
20 OUT &amp;amp;BC00,31:IF INP(&amp;amp;BF00)=255 THEN PRINT&amp;quot;crtc 1&amp;quot;:END&lt;br /&gt;
30 OUT &amp;amp;BC00,12:IF INP(&amp;amp;BF00)=0 THEN PRINT&amp;quot;crtc 2&amp;quot;:END&lt;br /&gt;
40 OUT &amp;amp;BC00,20:IF INP(&amp;amp;BF00)=0 THEN PRINT&amp;quot;crtc 0&amp;quot;:END&lt;br /&gt;
50 PRINT&amp;quot;crtc 3/4&amp;quot;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Distinguishing between CRTCs 3 and 4 can be done by trying to [[Programming:Unlocking ASIC|unlock the ASIC]] or by testing the [[8255|PPI chip]]. On ASIC, if PPI Port B is set as output it will behave the same as input.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== CRTC Timing Diagrams ==&lt;br /&gt;
[[File:CRTC Timing Diagram Rockwell.png]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[File:CRTC timing small.gif]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Internal Counters ==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Counter name&lt;br /&gt;
! Abbr&lt;br /&gt;
! Alternate name&lt;br /&gt;
! Compared with&lt;br /&gt;
! Comment&lt;br /&gt;
|-&lt;br /&gt;
|Horizontal Character Counter&lt;br /&gt;
|HCC&lt;br /&gt;
|C0&lt;br /&gt;
|R0, R1, R2&lt;br /&gt;
| Increments on every clock cycle&lt;br /&gt;
|-&lt;br /&gt;
|Horizontal Sync Counter&lt;br /&gt;
|HSC&lt;br /&gt;
|C3l&lt;br /&gt;
|R3l&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|Vertical Character Counter&lt;br /&gt;
|VCC&lt;br /&gt;
|C4&lt;br /&gt;
|R4, R6, R7&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|Vertical Sync Counter&lt;br /&gt;
|VSC&lt;br /&gt;
|C3h&lt;br /&gt;
|R3h&lt;br /&gt;
|R3h is fixed to 0 on CRTCs 1/2. This gives 16 lines of VSYNC&lt;br /&gt;
|-&lt;br /&gt;
|Vertical Line Counter&lt;br /&gt;
|VLC&lt;br /&gt;
|C9&lt;br /&gt;
|R9, R10, R11&lt;br /&gt;
|If not in IVM mode, this counter is exposed on CRTC pins RA0..RA4&lt;br /&gt;
|-&lt;br /&gt;
|Vertical Total Adjust Counter&lt;br /&gt;
|VTAC&lt;br /&gt;
|C5&lt;br /&gt;
|R5&lt;br /&gt;
|This counter does not exist on CRTCs 0/3/4. C9 is reused instead&lt;br /&gt;
|-&lt;br /&gt;
|Frame Counter&lt;br /&gt;
|FC&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|Used to alternate frames in interlace and for CRTC cursor blinking&lt;br /&gt;
|-&lt;br /&gt;
|Memory Address&lt;br /&gt;
|MA&lt;br /&gt;
|&lt;br /&gt;
|R14/R15&lt;br /&gt;
|This counter is exposed on CRTC pins MA0..MA13&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
When IVM mode is activated, VLC continues to increment normally. However, RA is not identical to VLC anymore. Instead, VLC is considered shifted left by 1 bit, and bit0 represents the parity of the field (even/odd).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== CRTC counter differences ==&lt;br /&gt;
&lt;br /&gt;
=== MA buffering ===&lt;br /&gt;
&lt;br /&gt;
No matter its type, the CRTC never buffers any of its counters, except for the video pointer MA. The buffer MA' is needed because MA has to be reloaded at the beginning of every raster line.&lt;br /&gt;
&lt;br /&gt;
At the end of the display of the last raster line of each character line (ie. when HCC=R1 and VLC=R9), MA' captures the current value of MA.&lt;br /&gt;
&lt;br /&gt;
CRTC 2 is the exception: at the end of the display of the last raster line of the frame, MA' captures R12/R13 instead of MA.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== MA reload ===&lt;br /&gt;
&lt;br /&gt;
On CRTCs 0/3/4, at the beginning of the first raster line of the frame, MA and MA' are loaded with R12/R13. Otherwise, MA is loaded with MA'.&lt;br /&gt;
&lt;br /&gt;
On CRTC 2, at the beginning of every raster line of the frame (including the first one), MA is loaded with MA'.&lt;br /&gt;
&lt;br /&gt;
On CRTC 1, at the beginning of every raster line of the first character line of the frame (ie. when VCC=0), MA is loaded with R12/R13 instead of MA'. '''This is a major source of incompatibility if the programmer does not take care.''' In demos and games, to be compatible with all CRTCs, program R12/R13 only when VCC≠0. This will then take effect at the next CRTC frame start.&lt;br /&gt;
&lt;br /&gt;
==== Rupture For Dummies (R5 bug) ====&lt;br /&gt;
&lt;br /&gt;
CRTC 1 has a bug that occurs when R5 is updated with a non-zero value when HCC=R0 and VLC≠R9, but only when R5 was previously 0. This changes the MA update source to R12/R13 instead of MA'. The CRTC then loads R12/R13 into MA at the beginning of every scanline, regardless of the VCC value.&lt;br /&gt;
&lt;br /&gt;
This R5 bug also messes with the frame parity management. However, it is possible to fix the parity of the frame by activating/deactivating the IVM interlace mode.&lt;br /&gt;
&lt;br /&gt;
The vertical adjustment operates normally after the RFD is triggered. If vertical adjustment is not needed, R5 can be reset at any time after the RFD is activated.&lt;br /&gt;
&lt;br /&gt;
This effect is used in the [https://www.cpc-power.com/index.php?page=detail&amp;amp;num=19308 DSC4 demo].&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== VSC (C3h) overflow ===&lt;br /&gt;
&lt;br /&gt;
During a VSYNC on CRTCs 0/3/4, if VSYNC Width (R3h) is changed with a value less than the current VSC, then VSC overflows and will count up to its maximum value (15) before looping back and counting up again until it reaches the new value of R3h.&lt;br /&gt;
&lt;br /&gt;
On CRTCs 1/2, the VSYNC width is fixed to 16 characters. It is not possible to modify it. Therefore, VSC cannot be overflowed.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== HSC (C3l) overflow ===&lt;br /&gt;
&lt;br /&gt;
During an HSYNC, if HSYNC Width (R3l) is changed with a value less than the current HSC, then HSC overflows and will count up to its maximum value (15) before looping back and counting up again until it reaches the new value of R3l.&lt;br /&gt;
&lt;br /&gt;
The only exception is for CRTC 1 with a value of 0, which immediately cancels the current HSYNC.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== VCC (C4) overflow ===&lt;br /&gt;
&lt;br /&gt;
On all CRTCs, if Vertical Total (R4) is changed with a value less than VCC, then:&lt;br /&gt;
* if this update was done when VCC &amp;lt; R4, then VCC overflows and will count up to its maximum value (127) before looping back and counting up again until it reaches the new value of R4&lt;br /&gt;
* if this update was done when VCC = R4, the current character line was already decided to be the last one of the current frame. No update to R4 will make the CRTC change its mind for the current frame&lt;br /&gt;
&lt;br /&gt;
The only exception when VCC = R4 is for CRTC 1 with a value of 0, which will cause VCC to overflow.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== HCC (C0) overflow ===&lt;br /&gt;
&lt;br /&gt;
If Horizontal Total (R0) is changed with a value less than the current HCC, then:&lt;br /&gt;
* on CRTCs 0/1/2, HCC overflows and will count up to its maximum value (255) before looping back and counting up again until it reaches the new value of R0&lt;br /&gt;
* on CRTCs 3/4, the current line is considered finished and HCC is immediately reset to 0 on the next line&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== VLC (C9) overflow ===&lt;br /&gt;
&lt;br /&gt;
If Number of Scan Lines (R9) is changed with a value less than the current VLC, then:&lt;br /&gt;
* on CRTCs 0/1/2, VLC overflows and will count up to its maximum value (31) before looping back and counting up again until it reaches the new value of R9&lt;br /&gt;
* on CRTCs 3/4, the current line is considered the last one of this CRTC character and VLC will reset to 0 on the next line&lt;br /&gt;
&lt;br /&gt;
As an exception, on CRTCs 0/2, if VLC is modified during the last frame line, then the updated value will not be considered for the current frame.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== VTAC (C5/C9) overflow ===&lt;br /&gt;
&lt;br /&gt;
During vertical adjustment mode, if Vertical Total Adjust (R5) is changed with a value less than the current VTAC, then:&lt;br /&gt;
* on CRTCs 0/1/2, VTAC overflows and will count up to its maximum value (31) before looping back and counting up again until it reaches the new value of R5&lt;br /&gt;
* on CRTCs 3/4, the current line is considered the last one of the current frame and vertical adjustment will end&lt;br /&gt;
&lt;br /&gt;
As an exception, on CRTCs 0/2, if VTAC is modified during the last frame line, then the updated value will not be considered for the current frame.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Vertical Adjustment mode ===&lt;br /&gt;
&lt;br /&gt;
On CRTCs 3/4, this mode does not increment VCC, so VCC remains equal to R4.&lt;br /&gt;
&lt;br /&gt;
On CRTC 0, this mode increments VCC, causing it to exceed R4, but this increment occurs only once.&lt;br /&gt;
&lt;br /&gt;
On CRTCs 1/2, this mode increments VCC, causing it to exceed R4, and this increment can happen multiple times depending on the values of R5 and R9.&lt;br /&gt;
&lt;br /&gt;
Also, only CRTCs 1/2 have a dedicated C5 counter. On CRTCs 0/3/4, during Vertical Adjustment, C9 has to fullfil the VTAC role which means that it cannot fullfil its VLC role. This impacts address generation as R9 is not considered anymore.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Counter freezes ===&lt;br /&gt;
&lt;br /&gt;
On CRTCs 1/2/3/4, R0 accepts all values without causing any problems for counters.&lt;br /&gt;
&lt;br /&gt;
On CRTC 0:&lt;br /&gt;
* Setting R0 to 0 will cause numerous issues that stem from the fact that VLC is frozen. As HCC never reaches 1, the logic that increments VLC is never triggered.&lt;br /&gt;
* The logic that triggers vertical adjustment is broken if R0&amp;lt;2.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Block Diagrams ==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!Hitachi&lt;br /&gt;
!UMC&lt;br /&gt;
!Motorola&lt;br /&gt;
|-&lt;br /&gt;
|[[File:CRTC Block Diagram.png|Hitachi]]&lt;br /&gt;
|[[File:UMC CRTC Block Diagram.png|UMC]]&lt;br /&gt;
|[[File:Motorola CRTC Block Diagram.png|Motorola]]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== CRTC-II (aka Type 5) ==&lt;br /&gt;
&lt;br /&gt;
The [[Media:CRTC-5-HD6345.pdf|HD6345 datasheet]] states it is upward-compatible with the HD6845S in pin and software.&lt;br /&gt;
&lt;br /&gt;
This chip was never used by Amstrad. However, some CPC enthusiasts have replaced the original CRTC chip in their CPC with this one.&lt;br /&gt;
&lt;br /&gt;
With this chip, split-screen becomes easy: [https://thecheshirec.at/2024/05/20/des-splitscreens-en-basic-sur-crtc5/ Split-screen in BASIC]. And 3 new graphics modes (160x100x16c, 320x100x4c, 640x100x2c) are available: [https://thecheshirec.at/2024/11/10/trois-nouveaux-modes-video-grace-au-crtc-5/ New graphics modes in BASIC].&lt;br /&gt;
&lt;br /&gt;
This is the cheapest way to upgrade the CPC's graphics capabilities, costing only 1.29€. [https://thecheshirec.at/2024/05/19/des-crtc5-a-129e/ Source]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Datasheets ==&lt;br /&gt;
&lt;br /&gt;
==== Used by Amstrad ====&lt;br /&gt;
* [[Media:hd6845.hitachi.pdf|HD6845S (Hitachi)]] aka Type 0&lt;br /&gt;
* [[Media:UM6845-UMC.pdf|UM6845 (UMC)]] aka Type 0&lt;br /&gt;
* [[Media:Um6845r.umc.pdf|UM6845R (UMC)]] aka Type 1&lt;br /&gt;
* [[Media:Mc6845.motorola.pdf|MC6845 (Motorola)]] aka Type 2&lt;br /&gt;
* [[Media:CPC_Plus_Asic_Schematic.GIF|AMS40489 (Amstrad)]] aka Type 3 ([[ASIC]])&lt;br /&gt;
* [[AMS40226 (Amstrad)]] aka Type 4 (Pre-ASIC)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Unused clones ====&lt;br /&gt;
* [[CM607P]] a Bulgarian clone made in Pravetz factory. It is used in the [[Aleste 520EX]].&lt;br /&gt;
* [[Media:hd6845.hitachi.pdf|HD6845R]] by Hitachi. According to Kevin Thacker, the [[KC Compact]] used HD6845R only.&lt;br /&gt;
* [[Media:UM6845E-UMC.pdf|UM6845E]] by UMC&lt;br /&gt;
* [[Media:Mc6845.pdf|MC6845-1]] by Motorola&lt;br /&gt;
* [[Media:F6845.pdf|F6845]] by Fairchild&lt;br /&gt;
* [[Media:EF6845P.pdf|EF6845]] by Thomson Semiconductors&lt;br /&gt;
* [[Media:VL6845 VTi.pdf|VL6845]] by VTi&lt;br /&gt;
* [[Media:C6845 CRTC (CAST).pdf|C6845]] by Cast&lt;br /&gt;
* [[Media:MB89321B FUJ.pdf|MB89321B]] by Fujitsu. It is pin-compatible with the 6845&lt;br /&gt;
* [[Media:MB89321A datasheet CRTC.pdf|MB89321A]] by Fujitsu. Enhanced version that adds smooth scroll, screen partitioning, independent scrolling of screen partitions, and other convenient features&lt;br /&gt;
* [[Media:Mos 6545-1 crtc.pdf|MOS 6545]] (MOS, Rockwell, Synertek) is pin-compatible with the 6845. Its differences are found in the R8 register.&lt;br /&gt;
* [https://www.cpcwiki.eu/forum/other-retro/interesting-discussion-about-the-c128-s-cpm-poor-performance/msg223058/#msg223058 MOS 8563] It is an evolution of the 6545/6845 CRTC chip, with blitter abilities to autonomously perform block memory copies within its dedicated video RAM.&lt;br /&gt;
* [https://github.com/hoglet67/BeebFpga/blob/dev/src/common/mc6845.vhd BeebFpga] [https://github.com/MiSTer-devel/Amstrad_MiSTer/blob/master/rtl/UM6845R.v MiSTer] [https://opencores.org/websvn/filedetails?repname=System09&amp;amp;path=%2FSystem09%2Ftrunk%2Frtl%2FVHDL%2Fcrtc6845.vhd OpenCores] Verilog/VHDL implementations of the 6845&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Tools about CRTC ==&lt;br /&gt;
&lt;br /&gt;
* [http://www.cpcwiki.eu/imgs/9/99/Elmar_Krieger-SPECIAL_EFFECTS.dsk  some BASIC tools to detect CRTC types 0-1-2 and show some effects] by [[Elmar Krieger]] (DSK for Emulators)&lt;br /&gt;
* [[File:Shaker26.dsk]] Shaker - Suite of CRTC tests associated with the CPC CRTC compendium (many of them will not work correctly on emulators and that was the purpose of the tests, to help create more compatible emulation)&lt;br /&gt;
* [[File:Shaker addon.dsk]] Shaker Add-On (Pixel 1 Hard Scroll / Vertical Rupture all Crtc)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Links ==&lt;br /&gt;
&lt;br /&gt;
* [http://en.wikipedia.org/wiki/6845 Wikipedia on the CRTC]&lt;br /&gt;
* [[Media:ACCC1.8-EN.pdf]] CPC CRTC Compendium - Latest (04/2024!) document containing in-depth info about CRTC programming on CPC.&lt;br /&gt;
* [http://www.grimware.org/doku.php/documentations/devices/crtc CRTC documentation from Grimware]&lt;br /&gt;
* [http://quasar.cpcscene.net/doku.php?id=assem:crtc Quasar CRTC documentation (in french)]&lt;br /&gt;
* [https://pulkomandy.github.io/shinra.github.io/crtc.html PulkoMandy's table] [https://www.theoddys.com/acorn/the_6845_crtc/6845%20Variants.xlsx Oddy's table] Differences between CRTC types&lt;br /&gt;
* [[Media:Dossier Rupture(Gozeur Paradox).pdf]]&lt;br /&gt;
* [[Media:Dossier CRTC(Ramlaid Mortel).pdf]] Les entrailles du CRTC&lt;br /&gt;
* [https://thecheshirec.at/tag/crtc6845/ Leçons CRTC (CheshireCat)]&lt;br /&gt;
* [[Media:CRTC Compendium Podcast.mp3]] The CRTC Compendium digested in podcast format&lt;br /&gt;
* [https://martin.hinner.info/vga/pal.html PAL video timing specification]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Related pages==&lt;br /&gt;
&lt;br /&gt;
*[[Gate Array]]&lt;br /&gt;
&lt;br /&gt;
*[[ASIC]]&lt;br /&gt;
&lt;br /&gt;
*[[Video modes]]&lt;br /&gt;
&lt;br /&gt;
*[[Synchronising with the CRTC and display]] : technic and details on the relationship between Gate Array and CRTC.&lt;br /&gt;
&lt;br /&gt;
*[[VIDI digitizer]] This extension contains its own CRTC chip&lt;br /&gt;
&lt;br /&gt;
[[Category:Hardware]] [[Category:CPC Internal Components]] [[Category:Electronic Component]] [[Category:Programming]] [[Category:Datasheet]] [[Category:Graphic]]&lt;/div&gt;</summary>
		<author><name>Longshot</name></author>	</entry>

	<entry>
		<id>https://oldwiki.cpcwiki.eu/index.php?title=CRTC&amp;diff=126043</id>
		<title>CRTC</title>
		<link rel="alternate" type="text/html" href="https://oldwiki.cpcwiki.eu/index.php?title=CRTC&amp;diff=126043"/>
				<updated>2025-05-18T19:46:47Z</updated>
		
		<summary type="html">&lt;p&gt;Longshot: /* Rupture For Dummies (R5 bug) */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[File:CRTC6845-Type2.jpg|thumb|right|CRTC Type 2]]&lt;br /&gt;
&lt;br /&gt;
The 6845 '''CRTC''' (Cathode Ray Tube Controller) chip was created by Motorola in 1977. It works with the [[Gate Array]] to generate the video signal on the Amstrad CPC.&lt;br /&gt;
&lt;br /&gt;
This chip is also used in the [[BBC Micro]], [[Lynx|Camputers Lynx]], [[EG2000 Colour Genie]], [[Sharp X1]], [[MicroBee]], [[Commodore PET]] and the early graphics cards (MDA, Hercules, CGA, Plantronics Colorplus) for [[IBM PC]]. And it is found in some [https://www.msx.org/wiki/Hitachi_HD6845 MSX1 expansions], providing an 80-column text mode.&lt;br /&gt;
&lt;br /&gt;
It's important to note that the CRTC chip is primarily designed for character-based displays. It explains why, on the Amstrad CPC, the video memory is organized into a grid of characters rather than a purely linear bitmap.&lt;br /&gt;
&lt;br /&gt;
NOTES: &lt;br /&gt;
* This document describes the functionality in terms of the CPC with its separate CRTC and Gate-Array. The Plus has both integrated into the same IC, but could be considered to have two functional blocks, one for CRTC and one for Gate-Array. In this document the term 'Gate-Array' is used, but this also applies to the ASIC.&lt;br /&gt;
* Much information has been drawn from the [https://shaker.logonsystem.eu/ CRTC Compendium] documentation, condensed and rearranged for clarity. For details, timing diagrams, code examples, coding tips, and more, refer to that documentation.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Overview ==&lt;br /&gt;
&lt;br /&gt;
The 6845 Cathode Ray Tube Controller (CRTC) is a programmable IC used to generate video displays. This IC is used in a variety of computers including the Amstrad CPC, Amstrad Plus and KC Compact. &lt;br /&gt;
&lt;br /&gt;
The CRTC is a simple chip. It is made up of counters and equality operators, tied by simple logic. All the complexity stems from its multiple independent implementations with their subtle differences.&lt;br /&gt;
&lt;br /&gt;
The CRTC was a common part available from many different manufacturers. During the life of the CPC, Amstrad sourced the CRTC from various manufacturers. &lt;br /&gt;
&lt;br /&gt;
All ICs used were based on the same design but have a different implementation. As a result they do not operate identically in all situations. This document highlights these differences. &lt;br /&gt;
&lt;br /&gt;
This table lists the known ICs used, with their part number, manufacturer and type number. &lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!Part number&lt;br /&gt;
!Manufacturer&lt;br /&gt;
!Type number (note 3)&lt;br /&gt;
|-&lt;br /&gt;
|HD6845S||Hitachi||0&lt;br /&gt;
|-&lt;br /&gt;
|UM6845||UMC||0&lt;br /&gt;
|-&lt;br /&gt;
|UM6845R||UMC||1&lt;br /&gt;
|-&lt;br /&gt;
|MC6845||Motorola||2&lt;br /&gt;
|-&lt;br /&gt;
|AMS40489||Amstrad||3 (note 1)&lt;br /&gt;
|-&lt;br /&gt;
|AMS40226||Amstrad||4 (note 2)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
'''NOTES''' &lt;br /&gt;
&lt;br /&gt;
1. The CRTC functionality is integrated into the CPC+ ASIC. This type exists only in the 464 Plus, 6128 Plus and GX4000. &lt;br /&gt;
&lt;br /&gt;
2. This type exists in &amp;quot;cost-down&amp;quot; CPC464 and CPC6128 systems. In the &amp;quot;cost-down&amp;quot; the CRTC functionality is integrated into a single ASIC IC. This ASIC is often refered to as the &amp;quot;Pre-ASIC&amp;quot; because it preceeded the CPC+ ASIC. The CRTC functionality of the Pre-ASIC is almost identical to the CRTC within the ASIC.&lt;br /&gt;
 &lt;br /&gt;
3. In the Amstrad community each 6845 implementation has been assigned a type number. This type identifies a group of implementations which operate in exactly the same way. The type number system was originally used by demo programmers. &lt;br /&gt;
&lt;br /&gt;
It is possible to detect the 6845 present using software methods, and this is done to: &lt;br /&gt;
&lt;br /&gt;
* warn that the software was not designed for the detected 6845 and may function incorrectly&lt;br /&gt;
* to adapt the software so that it will run with the detected 6845 &lt;br /&gt;
* In most cases, the type of the detected 6845 is reported&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Programming==&lt;br /&gt;
&lt;br /&gt;
The 6845 is selected when bit 14 of the I/O port address is set to &amp;quot;0&amp;quot;. Bit 9 and 8 of the I/O port address define the function to access. The remaining bits can be any value, but it is adviseable to set these to &amp;quot;1&amp;quot; to avoid conflict with other devices in the system.&lt;br /&gt;
&lt;br /&gt;
The recommended I/O port addresses are:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!I/O port address&lt;br /&gt;
!/CS (A14)&lt;br /&gt;
!R/W (A9)&lt;br /&gt;
!RS (A8)&lt;br /&gt;
!Function&lt;br /&gt;
!Read/Write&lt;br /&gt;
|-&lt;br /&gt;
|&amp;amp;BCxx||0||0||0||Select 6845 register||Write only&lt;br /&gt;
|-&lt;br /&gt;
|&amp;amp;BDxx||0||0||1||Write to selected internal 6845 register||Write only&lt;br /&gt;
|-&lt;br /&gt;
|&amp;amp;BExx||0||1||0||&lt;br /&gt;
* CRTCs 0/2: —&lt;br /&gt;
* CRTC 1: Read Status Register&lt;br /&gt;
* CRTCs 3/4: Read from selected internal 6845 register&lt;br /&gt;
||Read only&lt;br /&gt;
|-&lt;br /&gt;
|&amp;amp;BFxx||0||1||1||Read from selected internal 6845 register||Read only&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
The CRTC is not connected to the CPU's RD and WR pins, so it cannot detect the bus's I/O direction. Therefore, executing an IN instruction to the select or write functions causes the CRTC to write the unpredictable data provided by the high-impedance bus to its registers.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Z80 I/O access timings ===&lt;br /&gt;
&lt;br /&gt;
The clock provided to the CRTC by the ASIC/Pre-ASIC is phase-shifted compared to the one provided by the Gate Array.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+&lt;br /&gt;
! Instructions !! Duration !! I/O CRTCs 0/1/2 !! I/O CRTCs 3/4&lt;br /&gt;
|-&lt;br /&gt;
| OUT (C),r8 || 4 µsec || '''3rd µsec''' || 4th µsec&lt;br /&gt;
|-&lt;br /&gt;
| OUT (C),0 || 4 µsec || '''3rd µsec''' || 4th µsec&lt;br /&gt;
|-&lt;br /&gt;
| OUT (n),A || 3 µsec || 3rd µsec || 3rd µsec&lt;br /&gt;
|-&lt;br /&gt;
| OUTI || 5 µsec || 5th µsec || 5th µsec&lt;br /&gt;
|-&lt;br /&gt;
| OUTD || 5 µsec || 5th µsec || 5th µsec&lt;br /&gt;
|-&lt;br /&gt;
| IN r8,(C) || 4 µsec || 4th µsec || 4th µsec&lt;br /&gt;
|-&lt;br /&gt;
| INI || 5 µsec || '''4th µsec''' || '''4th µsec'''&lt;br /&gt;
|-&lt;br /&gt;
| IND || 5 µsec || '''4th µsec''' || '''4th µsec'''&lt;br /&gt;
|-&lt;br /&gt;
| IN A,(n) || 3 µsec || 3rd µsec || 3rd µsec&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Video Memory Address (VMA)==&lt;br /&gt;
&lt;br /&gt;
The VMA of the [[Gate Array]] is constructed from the CRTC MA and RA signals:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!Video Memory Address&lt;br /&gt;
!Signal source&lt;br /&gt;
!Signal name&lt;br /&gt;
|-&lt;br /&gt;
|A15||6845||MA13 &lt;br /&gt;
|-&lt;br /&gt;
|A14||6845||MA12&lt;br /&gt;
|-&lt;br /&gt;
|A13||6845||'''RA2'''&lt;br /&gt;
|-&lt;br /&gt;
|A12||6845||'''RA1'''&lt;br /&gt;
|-&lt;br /&gt;
|A11||6845||'''RA0'''&lt;br /&gt;
|-&lt;br /&gt;
|A10||6845||MA9 &lt;br /&gt;
|-&lt;br /&gt;
|A9||6845||MA8 &lt;br /&gt;
|-&lt;br /&gt;
|A8||6845||MA7 &lt;br /&gt;
|-&lt;br /&gt;
|A7||6845||MA6 &lt;br /&gt;
|-&lt;br /&gt;
|A6||6845||MA5 &lt;br /&gt;
|-&lt;br /&gt;
|A5||6845||MA4 &lt;br /&gt;
|-&lt;br /&gt;
|A4||6845||MA3 &lt;br /&gt;
|-&lt;br /&gt;
|A3||6845||MA2 &lt;br /&gt;
|-&lt;br /&gt;
|A2||6845||MA1 &lt;br /&gt;
|-&lt;br /&gt;
|A1||6845||MA0&lt;br /&gt;
|-&lt;br /&gt;
|A0||Gate-Array||CCLK&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
CRTC generates the address, Gate Array reads the data and converts it to pixels based on its current graphics mode and palette.&lt;br /&gt;
&lt;br /&gt;
CRTC pins RA3, RA4, MA10, MA11 are not connected on CPC.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Overscan bits ===&lt;br /&gt;
&lt;br /&gt;
It is possible to use 32KB screen size (used for [[Programming:Overscan|overscan]]) by setting bits 11 and 10 of Register 12 both to 1. Bits MA11 and MA10 of the address generated by the CRTC are not written on the address bus to access video memory; settings both bits to 1 is the only way to cause a carry to bit MA12 when address pass over the end of current video page to change the memory address to the next video page.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ CRTC Display Start Address&lt;br /&gt;
|-&lt;br /&gt;
! colspan=&amp;quot;8&amp;quot; | Register 12&lt;br /&gt;
! colspan=&amp;quot;8&amp;quot; | Register 13&lt;br /&gt;
|-&lt;br /&gt;
! 15 !! 14 !! 13 !! 12 !! 11 !! 10 !! 9 !! 8&lt;br /&gt;
! 7 !! 6 !! 5 !! 4 !! 3 !! 2 !! 1 !! 0&lt;br /&gt;
|-&lt;br /&gt;
| colspan=&amp;quot;2&amp;quot; | Unused&lt;br /&gt;
| colspan=&amp;quot;2&amp;quot; | Video Page&lt;br /&gt;
| colspan=&amp;quot;2&amp;quot; | Page Size&lt;br /&gt;
| colspan=&amp;quot;10&amp;quot; | Start Address (1024 positions)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| style=&amp;quot;white-space: nowrap;&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;margin-right: 32px&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Bit 13 !! Bit 12 !! Video Page&lt;br /&gt;
|-&lt;br /&gt;
| 0 || 0 || 0000 - 3FFF&lt;br /&gt;
|-&lt;br /&gt;
| 0 || 1 || 4000 - 7FFF&lt;br /&gt;
|-&lt;br /&gt;
| 1 || 0 || 8000 - BFFF&lt;br /&gt;
|-&lt;br /&gt;
| 1 || 1 || C000 - FFFF&lt;br /&gt;
|}&lt;br /&gt;
|&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Bit 11 !! Bit 10 !! Page Size&lt;br /&gt;
|-&lt;br /&gt;
| 0 || 0 || 16KB&lt;br /&gt;
|-&lt;br /&gt;
| 0 || 1 || 16KB&lt;br /&gt;
|-&lt;br /&gt;
| 1 || 0 || 16KB&lt;br /&gt;
|-&lt;br /&gt;
| 1 || 1 || '''32KB'''&lt;br /&gt;
|}&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Coarse hardware scrolling ===&lt;br /&gt;
&lt;br /&gt;
The start address can be manipulated to achieve horizontal and/or vertical hardware scrolling:&lt;br /&gt;
&lt;br /&gt;
*To move right: &amp;lt;code&amp;gt;start_address := start_address + 1&amp;lt;/code&amp;gt;&lt;br /&gt;
*To move left: &amp;lt;code&amp;gt;start_address := start_address - 1&amp;lt;/code&amp;gt;&lt;br /&gt;
*To move down: &amp;lt;code&amp;gt;start_address := start_address + R1&amp;lt;/code&amp;gt;&lt;br /&gt;
*To move up: &amp;lt;code&amp;gt;start_address := start_address - R1&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
However, it is a position in word (16 bits), not in byte. So, the screen will move two bytes at a time horizontally. Also, the precision will be one CRTC character vertically.&lt;br /&gt;
&lt;br /&gt;
The first game that used R12/R13 for both horizontal and vertical hardware scrolling is [https://www.cpc-power.com/index.php?page=detail&amp;amp;num=1839 Roland on the Ropes], released in 1984.&lt;br /&gt;
&lt;br /&gt;
The following BASIC program demonstrates the coarse scrolling by setting the R12 and R13 registers based on keyboard input:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
10 ma%=0&lt;br /&gt;
20 IF INKEY(1)=0 THEN GOSUB 100&lt;br /&gt;
30 IF INKEY(2)=0 THEN GOSUB 300&lt;br /&gt;
40 IF INKEY(8)=0 THEN GOSUB 500&lt;br /&gt;
50 IF INKEY(0)=0 THEN GOSUB 700&lt;br /&gt;
60 GOTO 20&lt;br /&gt;
100 ' right&lt;br /&gt;
110 ma%=ma%+1: GOSUB 900: RETURN&lt;br /&gt;
300 ' down&lt;br /&gt;
310 ma%=ma%+40: GOSUB 900: RETURN&lt;br /&gt;
500 ' left&lt;br /&gt;
510 ma%=ABS(ma%-1): GOSUB 900: RETURN&lt;br /&gt;
700 ' up&lt;br /&gt;
710 ma%=ABS(ma%-40): GOSUB 900: RETURN&lt;br /&gt;
900 ' set R12 and R13&lt;br /&gt;
910 l%=ma% AND 255: h%=&amp;amp;30 OR ((ma%\256) AND 3) :OUT &amp;amp;BC00,13:OUT &amp;amp;BD00,l%: OUT &amp;amp;BC00,12:OUT &amp;amp;BD00,h%&lt;br /&gt;
930 RETURN&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Which looks like the following:&lt;br /&gt;
&lt;br /&gt;
[[File:CRTC-Coarse-scroll.gif]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Advanced hardware scrolling ===&lt;br /&gt;
&lt;br /&gt;
To achieve smoother hardware scrolling, other tricks are required in complement to R12/R13. Usually, R3 is used for smooth horizontal scroll and R5 for smooth vertical scroll.&lt;br /&gt;
&lt;br /&gt;
A good example of smooth hardware multidirectional scrolling game on CPC is [https://www.cpc-power.com/index.php?page=detail&amp;amp;num=2119 Super Cauldron], released in 1993.&lt;br /&gt;
&lt;br /&gt;
Everything you need to know about hardware scrolling on CPC can be found [https://www.cpcwiki.eu/forum/programming/hardware-scrolling-21687/ there].&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Split screen (aka Rupture) ==&lt;br /&gt;
&lt;br /&gt;
While there is usually 1 CRTC frame per screen frame, the screen frame can be divided into multiple CRTC frames of varying proportions.&lt;br /&gt;
&lt;br /&gt;
This is useful for defining different scrolling zones in your screen frame. For example, it was used for hardware parallax scrolling in the game [https://www.cpc-power.com/index.php?page=detail&amp;amp;num=1307 The Living Daylights], released in 1987. [https://www.cpcwiki.eu/forum/programming/the-living-daylights-extra-colours-in-mode-1-rasters-screen-splits/ Source]&lt;br /&gt;
&lt;br /&gt;
And this is basically the bread and butter of innumerable CPC demos.&lt;br /&gt;
&lt;br /&gt;
Some rules of thumb [https://www.cpcwiki.eu/forum/programming/advice-on-split-screen-code/msg242186/ Source]:&lt;br /&gt;
* changes to the screen address have to be done anywhere in the previous split&lt;br /&gt;
* changes to the height of the split have to be done inside the current split (after it has started, in the area of the size of the previous split)&lt;br /&gt;
* changes to screen mode and colours are happening immediately&lt;br /&gt;
&lt;br /&gt;
CRTC registers and screen splitting:&lt;br /&gt;
*reg 0 (63) = x-screenwidth (usually always 63)&lt;br /&gt;
*reg 1 (50) = x-splitwidth (e.g.50)&lt;br /&gt;
*reg 2 (51) = x-splitstart (e.g. 51)&lt;br /&gt;
*reg 3 (08) = x-finestart (maybe use this for half-char scrolling)&lt;br /&gt;
*reg 4 (##) = y-splitheight-1 (set this inside the current split)&lt;br /&gt;
*reg 5 (00) = y-finestart&lt;br /&gt;
*reg 6 (25) = y-max visible splitpart (same like 4)&lt;br /&gt;
*reg 7 (##) = inside last split -&amp;gt; set to 0; inside first split, but after vblank -&amp;gt; set to 255&lt;br /&gt;
*reg 9 (07) = y-lines/char-1&lt;br /&gt;
&lt;br /&gt;
Set this inside the previous split:&lt;br /&gt;
*reg12 (##) = address high (char / 256 + block * 16)&lt;br /&gt;
*reg13 (##) = address low  (char mod 256)&lt;br /&gt;
&lt;br /&gt;
Total height of all splits must be 39.&lt;br /&gt;
&lt;br /&gt;
The [https://www.cpcwiki.eu/forum/programming/interrupt-positions-with-various-sized-screens/ IntPos tool] by Kevin Thacker can help visualize the potential split screen areas.&lt;br /&gt;
&lt;br /&gt;
Note: If all you want is multiple graphics modes in the same frame, you don't need to touch the CRTC at all. More information here: [https://www.cpc-power.com/cpcarchives/index.php?page=articles&amp;amp;num=184 Multi-Mode Graphique (FR)]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== CUDISP (aka CURSOR) ==&lt;br /&gt;
&lt;br /&gt;
CUDISP (Cursor Display) signal defines the hardware cursor.&lt;br /&gt;
&lt;br /&gt;
CRTC pin CUDISP is not connected to the Gate Array, so it has no effect on a barebone CPC or Plus machine.&lt;br /&gt;
&lt;br /&gt;
However, this signal is provided to the [[Connector:Expansion port]]. And it is used by the [[PlayCity]] and [[Play2CPC]] expansions.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== DISPTMG (aka Display Enable) ==&lt;br /&gt;
&lt;br /&gt;
DISPTMG (Display Timing) signal defines the border. When DISPTMG is &amp;quot;0&amp;quot; the border colour is output by the Gate Array to the display.&lt;br /&gt;
&lt;br /&gt;
The border has higher priority than pixels but lower priority than the black colour output when HSYNC/VSYNC are active.&lt;br /&gt;
&lt;br /&gt;
While border is active, all the CRTC counters continue to increment normally and addresses continue to be generated.&lt;br /&gt;
&lt;br /&gt;
The DISPTMG signal is composited from its 3 internal subcomponents: HBORDER (Horizontal), VBORDER (Vertical), SBORDER (Split) by using the NOR function. DISPTMG is &amp;quot;0&amp;quot; if at least one of its subcomponents is &amp;quot;1&amp;quot;. These 3 subcomponents are all independent of each other.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== HBORDER ===&lt;br /&gt;
&lt;br /&gt;
On all CRTCs, HBORDER is disabled when HCC=0 and enabled when HCC=R1.&lt;br /&gt;
&lt;br /&gt;
The exception is for CRTC2 during an HSYNC: the HCC=0 check is skipped, so HBORDER stays on.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== VBORDER ===&lt;br /&gt;
&lt;br /&gt;
On all CRTCs, VBORDER is disabled when VCC=0 and enabled when VCC=R6.&lt;br /&gt;
&lt;br /&gt;
On CRTCs 0/1/2, the condition VCC=R6 is tested on every cycle.&lt;br /&gt;
&lt;br /&gt;
On CRTCs 3/4, the condition VCC=R6 is tested only at each new character line start (when VLC=0 and HCC=0).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== SBORDER ===&lt;br /&gt;
&lt;br /&gt;
Split border is a technique similar to split rasters, except that it is handled by the CRTC instead of the [[Gate Array]].&lt;br /&gt;
&lt;br /&gt;
DISPTMG can be temporarily forced to 0 by using R8 (DISPTMG Skew) on CRTCs 0/3/4, or by setting R6=0 on CRTC 1.&lt;br /&gt;
&lt;br /&gt;
It is not possible to force DISPTMG on CRTC 2.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Border bytes ===&lt;br /&gt;
&lt;br /&gt;
Despite their 1MHz clock speed, CRTCs 0/2 have been observed to change state at a rate equivalent to 2MHz chips by responding to both the rising and falling edges of each clock cycle.&lt;br /&gt;
&lt;br /&gt;
==== Interline border ====&lt;br /&gt;
On CRTCs 0/2, R1&amp;gt;R0 generates one byte (0.5µs) of border at the end of the raster line. On CRTCs 1/3/4, it does not.&lt;br /&gt;
&lt;br /&gt;
If border skew is used, the border byte will skew and change into a full character-width border instead.&lt;br /&gt;
&lt;br /&gt;
==== Border conflict ====&lt;br /&gt;
If R1=0 and HCC=0, we expect HBORDER to activate as HCC=R1 and we also expect HBORDER to deactivate as HCC=0. In this situation, all CRTCs activate HBORDER.&lt;br /&gt;
&lt;br /&gt;
If R6=0 and VCC=0, we expect VBORDER to activate as VCC=R6 and we also expect VBORDER to deactivate as VCC=0. In this situation, all CRTCs activate VBORDER. On CRTC 1, even SBORDER is activated. But on CRTCs 0/2, the first raster line shows an alternation of bytes of VBORDER and displayable characters.&lt;br /&gt;
&lt;br /&gt;
To see the border bytes with your own eyes, type this BASIC line after reset:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
BORDER 6:OUT &amp;amp;BC00,6:OUT &amp;amp;BD00,0&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== HSYNC ==&lt;br /&gt;
&lt;br /&gt;
The HSYNC signal from the CRTC is not directly connected to the display. It is passed to the [[Gate Array]] for further modification. See its wiki page.&lt;br /&gt;
&lt;br /&gt;
While HSYNC is active, all the CRTC counters continue to increment normally and addresses continue to be generated.&lt;br /&gt;
&lt;br /&gt;
On all CRTCs, while an HSYNC is ongoing, the condition HCC=R2 is ignored. So we cannot trigger a new HSYNC during an HSYNC.&lt;br /&gt;
&lt;br /&gt;
=== Contiguous HSYNCs ===&lt;br /&gt;
&lt;br /&gt;
On CRTC 0, two HSYNCs cannot be contiguous. They are always separated by at least 1 CRTC character. What happens is that when HSC=R3 and HCC=R2, the condition HSC=R3 takes precedence over the condition HCC=R2 and HSYNC is stopped.&lt;br /&gt;
&lt;br /&gt;
On CRTCs 1/2/3/4, HSYNCs can be contiguous.&lt;br /&gt;
&lt;br /&gt;
=== Signal delay ===&lt;br /&gt;
&lt;br /&gt;
On all CRTCs, there is a 1µs delay in display between when the CRTC provides a video pointer, and when the Gate Array displays the corresponding 16-bit character.&lt;br /&gt;
&lt;br /&gt;
But on CRTCs 0/1/2, there is no delay for HSYNC. On CRTCs 3/4, the Amstrad engineers fixed the issue by adding a 1µs delay for the HSYNC signal to match the display signal. &lt;br /&gt;
&lt;br /&gt;
So now we have a bigger issue: on CRTCs 3/4, HSYNC occurs 1µs later than on CRTCs 0/1/2. Interrupts being dependent on HSYNC, this is a serious compatibility issue for time-sensitive code. It also explains why the CTM monitor has to be calibrated differently on CRTCs 3/4. Fortunately, the issue is easy to fix, by adjusting the HSYNC width with CRTC register 3.&lt;br /&gt;
&lt;br /&gt;
=== Discolouration effect ===&lt;br /&gt;
&lt;br /&gt;
On CRT monitors from other brands, a colour calibration can happen just after the C-HSYNC pulse.&lt;br /&gt;
&lt;br /&gt;
So even when a fully valid C-HSYNC pulse of 4µs is emitted, an HSYNC shorter than usual combined with a coloured border can induce a discolouration effect on those monitors.&lt;br /&gt;
&lt;br /&gt;
=== Screen wobbling and Fine horizontal hardware scroll ===&lt;br /&gt;
&lt;br /&gt;
These effects use invalid HSYNC signals, which are poorly supported by modern displays. However, these effects were used in commercial-era CPC games, so it's fine if you choose to use them.&lt;br /&gt;
&lt;br /&gt;
When R2 increases by 1, the screen is shifted to the left by 16 mode2 pixels.&lt;br /&gt;
&lt;br /&gt;
When R2 decreases by 1, the screen is shifted to the right by 16 mode2 pixels.&lt;br /&gt;
&lt;br /&gt;
When R3l increases by 1 (and if &amp;lt;6), the screen is shifted to the left by 8 mode2 pixels.&lt;br /&gt;
&lt;br /&gt;
When R3l decreases by 1 (and if &amp;gt;2), the screen is shifted to the right by 8 mode2 pixels.&lt;br /&gt;
&lt;br /&gt;
The shift is not instantaneous but follows a logarithmic attenuation across several raster lines. This property can be used to get even finer horizontal control by modifying R2/R3 on each raster line.&lt;br /&gt;
&lt;br /&gt;
[[Longshot]] has demonstrated [https://youtu.be/1q7RQykZoKY horizontal hardware scroll] with one-pixel precision in mode1 on all CRTCs. However, because you have to synchronize with each line, it takes a lot of CPU time if it's done in fullscreen (272 lines).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== VSYNC ==&lt;br /&gt;
&lt;br /&gt;
The VSYNC signal from the CRTC is not directly connected to the display. It is passed to the [[Gate Array]] for further modification. See its wiki page.&lt;br /&gt;
&lt;br /&gt;
While VSYNC is active, all the CRTC counters continue to increment normally and addresses continue to be generated.&lt;br /&gt;
&lt;br /&gt;
On all CRTCs, while a VSYNC is ongoing, the condition VCC=R7 is ignored. So we cannot trigger a new VSYNC during a VSYNC. &lt;br /&gt;
&lt;br /&gt;
On CRTCs 0/1/2, the sole condition to trigger a VSYNC is that VCC=R7. While on CRTCs 3/4, it is necessary to have VCC=R7 and HCC=0 and VLC=0 to trigger a VSYNC.&lt;br /&gt;
&lt;br /&gt;
=== Blocked VSYNC ===&lt;br /&gt;
&lt;br /&gt;
On CRTC 0, if R7 is modified with the value of VCC when HCC&amp;lt;2, we are in blocked VSYNC. Then, the VSYNC can no longer occur on VCC=R7 until an unblocking condition is produced (VCC or R7 update). Source: §16.4 &amp;quot;Conditions to consider&amp;quot; of the CRTC Compendium&lt;br /&gt;
&lt;br /&gt;
=== Ghost VSYNC ===&lt;br /&gt;
&lt;br /&gt;
On CRTC 2, if a VSYNC is triggered during an HSYNC, the CRTC produces a ghost VSYNC. The CRTC then counts the lines as if a VSYNC were taking place by preventing a new VSYNC from occurring, but without the VSYNC pin being enabled.&lt;br /&gt;
&lt;br /&gt;
=== PPI VSYNC ===&lt;br /&gt;
&lt;br /&gt;
The VSYNC pin of the CRTC is directly connected to bit0 of port B of the PPI. There is no delay involved.&lt;br /&gt;
&lt;br /&gt;
On Amstrad CPC (not Plus!), it is also possible to reverse the direction of PPI port B to output a &amp;quot;fake&amp;quot; VSYNC signal directly from the PPI to the Gate Array.&lt;br /&gt;
&lt;br /&gt;
As an exception, the Ghost VSYNC of CRTC 2 overpowers the Fake VSYNC.&lt;br /&gt;
&lt;br /&gt;
=== Subpixel vertical hardware scroll ===&lt;br /&gt;
&lt;br /&gt;
By tuning very precisely when the VSYNC signal is sent to the monitor,  Longshot has demonstrated [https://youtu.be/bSjRU6Wye00 vertical hardware scroll] with a precision of 1/128th of a pixel. Furthermore, subpixel vertical scrolling consumes very little CPU.&lt;br /&gt;
&lt;br /&gt;
=== Mid-VSYNC ===&lt;br /&gt;
&lt;br /&gt;
On all CRTCs, in both interlace modes, a mid-VSYNC is generated when VCC=R7 on the even field. The VSYNC pulse starts in the middle of the raster line, at HCC=R0/2.&lt;br /&gt;
&lt;br /&gt;
As an exception, on CRTCs 3/4, if R7=0 then mid-VSYNC will instead occur on the odd field. Source: §19.7 &amp;quot;Mid-VSYNC&amp;quot; of the CRTC Compendium.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Interlace modes ==&lt;br /&gt;
&lt;br /&gt;
Note: Some details about the CRTC interlace implementations are missing in this article. Consider it as an introduction to the topic.&lt;br /&gt;
&lt;br /&gt;
[[File:CRTC Interlace modes.png]]&lt;br /&gt;
&lt;br /&gt;
For a CRTC character line with n raster lines, R9 must be set to n-1 on all CRTCs, regardless of the interlace settings. The exception is for CRTCs 0/3/4 in IVM mode, where R9 must be set to n-2.&lt;br /&gt;
&lt;br /&gt;
=== Interlace sync mode (ISM) ===&lt;br /&gt;
&lt;br /&gt;
In this mode, the same information is painted in both fields to enhance readability. Reprogramming the CRTC is not necessary.&lt;br /&gt;
&lt;br /&gt;
=== Interlace sync and video mode (IVM) ===&lt;br /&gt;
&lt;br /&gt;
In this mode, alternating lines are displayed in the even and odd field to double the resolution.&lt;br /&gt;
&lt;br /&gt;
On the even field, the CRTC displays the lines for which VLC is even. On the odd field, the CRTC displays the lines for which VLC is odd.&lt;br /&gt;
&lt;br /&gt;
It is necessary to reprogram the CRTC as if we were building a frame of 624 lines.&lt;br /&gt;
&lt;br /&gt;
CRTC 2 is the exception: R4, R5, R6, R7 do not need to be reprogrammed as it considers each character line to be a double character line.&lt;br /&gt;
&lt;br /&gt;
=== Interlace adjustment line ===&lt;br /&gt;
&lt;br /&gt;
On all CRTCs, in both interlace modes, an additional line (the 625th line) is added automatically by the CRTC at the end of the even field. This line is added after the lines of the vertical adjustment mode.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== CRTC registers ==&lt;br /&gt;
&lt;br /&gt;
The Internal registers of the 6845 are:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!rowspan=2|Register Index&lt;br /&gt;
!rowspan=2|Register Name&lt;br /&gt;
!colspan=3|Read/Write&lt;br /&gt;
!rowspan=2|Range&lt;br /&gt;
!rowspan=2|CPC Setting&lt;br /&gt;
!rowspan=2|Notes&lt;br /&gt;
|-&lt;br /&gt;
!CRTC 0&lt;br /&gt;
!CRTCs 1/2&lt;br /&gt;
!CRTCs 3/4&lt;br /&gt;
|-&lt;br /&gt;
|0||Horizontal Total (-1)||colspan=3 style=&amp;quot;text-align: center;&amp;quot;|Write||00000000||63||Width of the screen, in characters. Should always be 63 (64 characters). 1 character == 1μs.&lt;br /&gt;
|-&lt;br /&gt;
|1||Horizontal Displayed||colspan=3 style=&amp;quot;text-align: center;&amp;quot;|Write||00000000||40||Number of characters displayed. Once horizontal character count (HCC) matches this value, DISPTMG is set to 1.&lt;br /&gt;
|-&lt;br /&gt;
|2||Horizontal Sync Position||colspan=3 style=&amp;quot;text-align: center;&amp;quot;|Write||00000000||46||When to start the HSync signal.&lt;br /&gt;
|-&lt;br /&gt;
|3||Horizontal and Vertical Sync Widths||colspan=3 style=&amp;quot;text-align: center;&amp;quot;|Write||VVVVHHHH||128+14||VSync width in scan-lines (Not present on all CRTCs, fixed to 16 lines on these) ; HSync pulse width in characters.&lt;br /&gt;
|-&lt;br /&gt;
|4||Vertical Total (-1)||colspan=3 style=&amp;quot;text-align: center;&amp;quot;|Write||x0000000||38||Height of the screen, in characters.&lt;br /&gt;
|-&lt;br /&gt;
|5||Vertical Total Adjust||colspan=3 style=&amp;quot;text-align: center;&amp;quot;|Write||xxx00000||0||Measured in scanlines, can be used for smooth vertical scrolling on CPC.&lt;br /&gt;
|-&lt;br /&gt;
|6||Vertical Displayed||colspan=3 style=&amp;quot;text-align: center;&amp;quot;|Write||x0000000||25||Height of displayed screen in characters. Once vertical character count (VCC) matches this value, DISPTMG is set to 1.&lt;br /&gt;
|-&lt;br /&gt;
|7||Vertical Sync Position||colspan=3 style=&amp;quot;text-align: center;&amp;quot;|Write||x0000000||30||When to start the VSync signal, in characters.&lt;br /&gt;
|-&lt;br /&gt;
|8||Interlace and Skew||colspan=3 style=&amp;quot;text-align: center;&amp;quot;|Write||CCDDxxII||0||CC: Cursor Skew (Only in CRTCs 0, 3 and 4). DD: Display Skew (Only in CRTCs 0, 3 and 4). II: Interlace Mode.&lt;br /&gt;
|-&lt;br /&gt;
|9||Maximum Raster Address (aka Number of Scan Lines) (-1)||colspan=3 style=&amp;quot;text-align: center;&amp;quot;|Write||xxx00000||7||Maximum scan line address on CPC can hold between 0 and 7, higher values' upper bits are ignored.&lt;br /&gt;
|-&lt;br /&gt;
|10||Cursor Start Raster||style=&amp;quot;text-align: center;&amp;quot;|Write||style=&amp;quot;text-align: center;&amp;quot;|Write||Read/Write||xBP00000||0||B = Blink On/Off; P = Blink Period Control (16 or 32 frames). Sets first raster row of character that cursor is on to invert.&lt;br /&gt;
|-&lt;br /&gt;
|11||Cursor End Raster||style=&amp;quot;text-align: center;&amp;quot;|Write||style=&amp;quot;text-align: center;&amp;quot;|Write||Read/Write||xxx00000||0||Sets last raster row of character that cursor is on to invert.&lt;br /&gt;
|-&lt;br /&gt;
|12||Display Start Address (High)||Read/Write||style=&amp;quot;text-align: center;&amp;quot;|Write||Read/Write||xx000000||48||On Amstrad Plus, bit7 of the printer port is controlled by bit3 of CRTC R12 (ie. bit11 of Display Start Address).&lt;br /&gt;
|-&lt;br /&gt;
|13||Display Start Address (Low)||Read/Write||style=&amp;quot;text-align: center;&amp;quot;|Write||Read/Write||00000000||0||Allows you to offset the start of screen memory for hardware scrolling, and if using memory from address &amp;amp;0000 with the firmware.&lt;br /&gt;
|-&lt;br /&gt;
|14||Cursor Address (High)||colspan=3 style=&amp;quot;text-align: center;&amp;quot;|Read/Write||xx000000||0||&lt;br /&gt;
|-&lt;br /&gt;
|15||Cursor Address (Low)||colspan=3 style=&amp;quot;text-align: center;&amp;quot;|Read/Write||00000000||0||&lt;br /&gt;
|-&lt;br /&gt;
|16||Light Pen Address (High)||colspan=3 style=&amp;quot;text-align: center;&amp;quot;|Read||xx000000||||On CRTC1, bit6 of Status register goes to 0 when R16 is read.&lt;br /&gt;
|-&lt;br /&gt;
|17||Light Pen Address (Low)||colspan=3 style=&amp;quot;text-align: center;&amp;quot;|Read||00000000||||On CRTC1, bit6 of Status register goes to 0 when R17 is read.&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Screen size ===&lt;br /&gt;
&lt;br /&gt;
We can calculate the screen size in words by multiplying R1 x R6 x (R9+1). And then multiplying the result by 2 to have the screen size in bytes.&lt;br /&gt;
&lt;br /&gt;
With the default CRTC values, we obtain 40 x 25 x (7+1) x 2 = 16000 bytes.&lt;br /&gt;
&lt;br /&gt;
So we can observe that only part of the 16384 bytes (=16KB) page of VRAM is actually displayed on screen.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Register access ===&lt;br /&gt;
&lt;br /&gt;
On CRTCs 0/1/2, if a Write Only register is read from, &amp;quot;0&amp;quot; is returned. The register accessing scheme on CRTCs 3/4 makes it impossible to happen.&lt;br /&gt;
&lt;br /&gt;
On all CRTCs, only the 5 least significant bits of the selected register number are considered to write to a register. The other bits are ignored.&lt;br /&gt;
&lt;br /&gt;
On CRTCs 0/1/2, only the 5 least significant bits of the selected register number are considered to read a register:&lt;br /&gt;
* On CRTCs 0/2, registers 18-31 read as 0&lt;br /&gt;
* On CRTC 1, registers 18-30 read as 0, register 31 reads as &amp;amp;FF&lt;br /&gt;
&lt;br /&gt;
On CRTCs 3/4, only the 3 least significant bits of the selected register number are considered to read a register, according to the following table:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!Nb&lt;br /&gt;
!Register&lt;br /&gt;
!Definition&lt;br /&gt;
|-&lt;br /&gt;
|0||R16||Light Pen Address (High)&lt;br /&gt;
|-&lt;br /&gt;
|1||R17||Light Pen Address (Low)&lt;br /&gt;
|-&lt;br /&gt;
|2||R10||Cursor Start Raster&lt;br /&gt;
|-&lt;br /&gt;
|3||R11||Cursor End Raster&lt;br /&gt;
|-&lt;br /&gt;
|4||R12||Display Start Address (High)&lt;br /&gt;
|-&lt;br /&gt;
|5||R13||Display Start Address (Low)&lt;br /&gt;
|-&lt;br /&gt;
|6||R14||Cursor Address (High)&lt;br /&gt;
|-&lt;br /&gt;
|7||R15||Cursor Address (Low)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== CRTC register differences ==&lt;br /&gt;
&lt;br /&gt;
CRTC types 3 and 4 are identical in every way, except for the unlocking mechanism, split screen, hardware soft scroll and 8-bit printer port functionalities specific to the [[ASIC]].&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== R10/R11 on ASIC/Pre-ASIC  ===&lt;br /&gt;
&lt;br /&gt;
The cursor raster registers R10/R11 act as status registers when read on CRTCs 3/4. They behave as normal cursor raster registers upon write.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! R10 - Bit number&lt;br /&gt;
! Bit value&lt;br /&gt;
! Event&lt;br /&gt;
|-&lt;br /&gt;
|0&lt;br /&gt;
|1&lt;br /&gt;
|C0=R0&lt;br /&gt;
|-&lt;br /&gt;
|1&lt;br /&gt;
|0&lt;br /&gt;
|C0=R0/2&lt;br /&gt;
|-&lt;br /&gt;
|2&lt;br /&gt;
|0&lt;br /&gt;
|C0=R1-1 (if R0&amp;gt;=R1)&lt;br /&gt;
|-&lt;br /&gt;
|3&lt;br /&gt;
|0&lt;br /&gt;
|C0=R2&lt;br /&gt;
|-&lt;br /&gt;
|4&lt;br /&gt;
|0&lt;br /&gt;
|C0=R2+R3&lt;br /&gt;
|-&lt;br /&gt;
|5&lt;br /&gt;
|0&lt;br /&gt;
1&lt;br /&gt;
|R3h&amp;gt;0 : C0=0..R0 on the line R3h from Vsync (C4=R7)&lt;br /&gt;
R3h=0 : C0=0..R0 over 15 lines from Vsync (C4=R7)&lt;br /&gt;
|-&lt;br /&gt;
|6&lt;br /&gt;
|1&lt;br /&gt;
|Always 1&lt;br /&gt;
|-&lt;br /&gt;
|7&lt;br /&gt;
|0&lt;br /&gt;
0&lt;br /&gt;
|C0=0..R0-1 : VMA.Lsb=0xFF&lt;br /&gt;
C0=R0 : VMA'.Lsb=0x00 (same cond if C0=R0=0)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! R11 - Bit number&lt;br /&gt;
! Bit value&lt;br /&gt;
! Event&lt;br /&gt;
|-&lt;br /&gt;
|0&lt;br /&gt;
|0&lt;br /&gt;
|C4=R4 and C9=R9 and C0=R0 : Last char of screen&lt;br /&gt;
|-&lt;br /&gt;
|1&lt;br /&gt;
|0&lt;br /&gt;
|C4=R6-1 and C9=R9 and C0=R0 : Last char displayed&lt;br /&gt;
|-&lt;br /&gt;
|2&lt;br /&gt;
|0&lt;br /&gt;
|C4=R7-1 and C9=R9 and C0=R0 : Last char before Vsync&lt;br /&gt;
|-&lt;br /&gt;
|3&lt;br /&gt;
|0/1&lt;br /&gt;
|Timer 16 CRTC frames&lt;br /&gt;
|-&lt;br /&gt;
|4&lt;br /&gt;
|1&lt;br /&gt;
|Always 1&lt;br /&gt;
|-&lt;br /&gt;
|5&lt;br /&gt;
|0&lt;br /&gt;
|C9=R9 : C0=0 to R0&lt;br /&gt;
|-&lt;br /&gt;
|6&lt;br /&gt;
|0&lt;br /&gt;
|Always 0&lt;br /&gt;
|-&lt;br /&gt;
|7&lt;br /&gt;
|1&lt;br /&gt;
|(C9=R9 and C0=R0) or (C9=0 and C0=0 to R0-1)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Horizontal and Vertical Sync (R3) ===&lt;br /&gt;
&lt;br /&gt;
Type 0:&lt;br /&gt;
*Bits 7..4 define Vertical Sync Width. If 0 is programmed, this gives 16 lines of VSYNC.&lt;br /&gt;
*Bits 3..0 define Horizontal Sync Width. If 0 is programmed, no HSYNC is generated (and therefore, no interrupts).&lt;br /&gt;
&lt;br /&gt;
Type 1:&lt;br /&gt;
*Bits 7..4 are ignored. Vertical Sync is fixed at 16 lines.&lt;br /&gt;
*Bits 3..0 define Horizontal Sync Width. If 0 is programmed, no HSYNC is generated (and therefore, no interrupts).&lt;br /&gt;
&lt;br /&gt;
Type 2:&lt;br /&gt;
*Bits 7..4 are ignored. Vertical Sync is fixed at 16 lines.&lt;br /&gt;
*Bits 3..0 define Horizontal Sync Width. If 0 is programmed, this gives a HSYNC width of 16.&lt;br /&gt;
&lt;br /&gt;
Types 3/4:&lt;br /&gt;
*Bits 7..4 define Vertical Sync Width. If 0 is programmed, this gives 16 lines of VSYNC.&lt;br /&gt;
*Bits 3..0 define Horizontal Sync Width. If 0 is programmed, this gives a HSYNC width of 16.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Interlace and Skew (R8) ===&lt;br /&gt;
&lt;br /&gt;
Types 0/3/4:&lt;br /&gt;
*Bits 7..6 define the skew (delay) of the CUDISP signal (00 = Non-skew ; 01 = One-character skew ; 10 = Two-character skew ; 11 = Non-output).&lt;br /&gt;
*Bits 5..4 define the skew (delay) of the DISPTMG signal (00 = Non-skew ; 01 = One-character skew ; 10 = Two-character skew ; 11 = Non-output).&lt;br /&gt;
*Bits 3..2 are ignored.&lt;br /&gt;
*Bits 1..0 define the interlace mode (00 = No Interlace ; 01 = Interlace Sync ; 10 = No Interlace ; 11 = Interlace Sync and Video).&lt;br /&gt;
&lt;br /&gt;
Types 1/2:&lt;br /&gt;
*Bits 7..2 are ignored.&lt;br /&gt;
*Bits 1..0 define the interlace mode.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== R31 on Type 1 ===&lt;br /&gt;
&lt;br /&gt;
R31 is described in the UM6845R documentation as &amp;quot;Dummy Register&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Its use is described in the documentation for the Rockwell R6545 in combination with R18, R19 and R8 and the Status Register.&lt;br /&gt;
&lt;br /&gt;
In the UM6845R it appears to have no effect. Reading and writing does nothing. Reading it returns &amp;amp;FF.&lt;br /&gt;
&lt;br /&gt;
R31 doesn't exist on CRTCs 0/2/3/4.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Status register on Type 1 ===&lt;br /&gt;
&lt;br /&gt;
The UM6845R has a status register that can be read using port &amp;amp;BExx.&lt;br /&gt;
&lt;br /&gt;
Bit 6 is set to 1 if there is a strobe input to the /LPEN signal. It is cleared to 0 when either R17 or R16 (LPEN address) of the CRTC are read. It signals there is a valid LPEN input. On Kevin Thacker's CPC with UM6845R, it is triggered at power on, R17 and R16 have the values 0 when read.&lt;br /&gt;
&lt;br /&gt;
Bit 5 is set to 1 when CRTC is in &amp;quot;vertical blanking&amp;quot;. Vertical blanking is when the vertical border is active. i.e. VCC&amp;gt;=R6. &lt;br /&gt;
&lt;br /&gt;
It is cleared when the frame is started (VCC=0). It is not directly related to the DISPTMG output (used by the CPC to display the border colour) because that output is a combination of horizontal and vertical blanking.&lt;br /&gt;
This bit will be 0 when pixels are being displayed.&lt;br /&gt;
&lt;br /&gt;
All the other bits read as 0 and don't have any function.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== CRTC Type Detection ==&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
10 MODE 1:' Reinitialize screen&lt;br /&gt;
20 OUT &amp;amp;BC00,31:IF INP(&amp;amp;BF00)=255 THEN PRINT&amp;quot;crtc 1&amp;quot;:END&lt;br /&gt;
30 OUT &amp;amp;BC00,12:IF INP(&amp;amp;BF00)=0 THEN PRINT&amp;quot;crtc 2&amp;quot;:END&lt;br /&gt;
40 OUT &amp;amp;BC00,20:IF INP(&amp;amp;BF00)=0 THEN PRINT&amp;quot;crtc 0&amp;quot;:END&lt;br /&gt;
50 PRINT&amp;quot;crtc 3/4&amp;quot;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Distinguishing between CRTCs 3 and 4 can be done by trying to [[Programming:Unlocking ASIC|unlock the ASIC]] or by testing the [[8255|PPI chip]]. On ASIC, if PPI Port B is set as output it will behave the same as input.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== CRTC Timing Diagrams ==&lt;br /&gt;
[[File:CRTC Timing Diagram Rockwell.png]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[File:CRTC timing small.gif]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Internal Counters ==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Counter name&lt;br /&gt;
! Abbr&lt;br /&gt;
! Alternate name&lt;br /&gt;
! Compared with&lt;br /&gt;
! Comment&lt;br /&gt;
|-&lt;br /&gt;
|Horizontal Character Counter&lt;br /&gt;
|HCC&lt;br /&gt;
|C0&lt;br /&gt;
|R0, R1, R2&lt;br /&gt;
| Increments on every clock cycle&lt;br /&gt;
|-&lt;br /&gt;
|Horizontal Sync Counter&lt;br /&gt;
|HSC&lt;br /&gt;
|C3l&lt;br /&gt;
|R3l&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|Vertical Character Counter&lt;br /&gt;
|VCC&lt;br /&gt;
|C4&lt;br /&gt;
|R4, R6, R7&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|Vertical Sync Counter&lt;br /&gt;
|VSC&lt;br /&gt;
|C3h&lt;br /&gt;
|R3h&lt;br /&gt;
|R3h is fixed to 0 on CRTCs 1/2. This gives 16 lines of VSYNC&lt;br /&gt;
|-&lt;br /&gt;
|Vertical Line Counter&lt;br /&gt;
|VLC&lt;br /&gt;
|C9&lt;br /&gt;
|R9, R10, R11&lt;br /&gt;
|If not in IVM mode, this counter is exposed on CRTC pins RA0..RA4&lt;br /&gt;
|-&lt;br /&gt;
|Vertical Total Adjust Counter&lt;br /&gt;
|VTAC&lt;br /&gt;
|C5&lt;br /&gt;
|R5&lt;br /&gt;
|This counter does not exist on CRTCs 0/3/4. C9 is reused instead&lt;br /&gt;
|-&lt;br /&gt;
|Frame Counter&lt;br /&gt;
|FC&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|Used to alternate frames in interlace and for CRTC cursor blinking&lt;br /&gt;
|-&lt;br /&gt;
|Memory Address&lt;br /&gt;
|MA&lt;br /&gt;
|&lt;br /&gt;
|R14/R15&lt;br /&gt;
|This counter is exposed on CRTC pins MA0..MA13&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
When IVM mode is activated, VLC continues to increment normally. However, RA is not identical to VLC anymore. Instead, VLC is considered shifted left by 1 bit, and bit0 represents the parity of the field (even/odd).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== CRTC counter differences ==&lt;br /&gt;
&lt;br /&gt;
=== MA buffering ===&lt;br /&gt;
&lt;br /&gt;
No matter its type, the CRTC never buffers any of its counters, except for the video pointer MA. The buffer MA' is needed because MA has to be reloaded at the beginning of every raster line.&lt;br /&gt;
&lt;br /&gt;
At the end of the display of the last raster line of each character line (ie. when HCC=R1 and VLC=R9), MA' captures the current value of MA.&lt;br /&gt;
&lt;br /&gt;
CRTC 2 is the exception: at the end of the display of the last raster line of the frame, MA' captures R12/R13 instead of MA.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== MA reload ===&lt;br /&gt;
&lt;br /&gt;
On CRTCs 0/3/4, at the beginning of the first raster line of the frame, MA and MA' are loaded with R12/R13. Otherwise, MA is loaded with MA'.&lt;br /&gt;
&lt;br /&gt;
On CRTC 2, at the beginning of every raster line of the frame (including the first one), MA is loaded with MA'.&lt;br /&gt;
&lt;br /&gt;
On CRTC 1, at the beginning of every raster line of the first character line of the frame (ie. when VCC=0), MA is loaded with R12/R13 instead of MA'. '''This is a major source of incompatibility if the programmer does not take care.''' In demos and games, to be compatible with all CRTCs, program R12/R13 only when VCC≠0. This will then take effect at the next CRTC frame start.&lt;br /&gt;
&lt;br /&gt;
==== Rupture For Dummies (R5 bug) ====&lt;br /&gt;
&lt;br /&gt;
CRTC 1 has a bug that occurs when R5 is updated with a non-zero value when HCC=R0 and VLC≠R9, but only when R5 was previously 0. This changes the MA update source to R12/R13 instead of MA'. The CRTC then loads R12/R13 into MA at the beginning of every scanline, regardless of the VCC value.&lt;br /&gt;
&lt;br /&gt;
This R5 bug also messes with the frame parity management. However, it is possible to fix the parity of the frame by activating/deactivating the IVM interlace mode.&lt;br /&gt;
&lt;br /&gt;
The vertical adjustment operates normally after the RFD is triggered. If vertical adjustment is not needed, R5 can be reset at any time after the RFD is activated.&lt;br /&gt;
&lt;br /&gt;
This effect is used in the [https://www.cpc-power.com/index.php?page=detail&amp;amp;num=19308 DSC4 demo].&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== VSC (C3h) overflow ===&lt;br /&gt;
&lt;br /&gt;
During a VSYNC on CRTCs 0/3/4, if VSYNC Width (R3h) is changed with a value less than the current VSC, then VSC overflows and will count up to its maximum value (15) before looping back and counting up again until it reaches the new value of R3h.&lt;br /&gt;
&lt;br /&gt;
On CRTCs 1/2, the VSYNC width is fixed to 16 characters. It is not possible to modify it. Therefore, VSC cannot be overflowed.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== HSC (C3l) overflow ===&lt;br /&gt;
&lt;br /&gt;
During an HSYNC, if HSYNC Width (R3l) is changed with a value less than the current HSC, then HSC overflows and will count up to its maximum value (15) before looping back and counting up again until it reaches the new value of R3l.&lt;br /&gt;
&lt;br /&gt;
The only exception is for CRTC 1 with a value of 0, which immediately cancels the current HSYNC.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== VCC (C4) overflow ===&lt;br /&gt;
&lt;br /&gt;
On all CRTCs, if Vertical Total (R4) is changed with a value less than VCC, then:&lt;br /&gt;
* if this update was done when VCC &amp;lt; R4, then VCC overflows and will count up to its maximum value (127) before looping back and counting up again until it reaches the new value of R4&lt;br /&gt;
* if this update was done when VCC = R4, the current character line was already decided to be the last one of the current frame. No update to R4 will make the CRTC change its mind for the current frame&lt;br /&gt;
&lt;br /&gt;
The only exception when VCC = R4 is for CRTC 1 with a value of 0, which will cause VCC to overflow.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== HCC (C0) overflow ===&lt;br /&gt;
&lt;br /&gt;
If Horizontal Total (R0) is changed with a value less than the current HCC, then:&lt;br /&gt;
* on CRTCs 0/1/2, HCC overflows and will count up to its maximum value (255) before looping back and counting up again until it reaches the new value of R0&lt;br /&gt;
* on CRTCs 3/4, the current line is considered finished and HCC is immediately reset to 0 on the next line&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== VLC (C9) overflow ===&lt;br /&gt;
&lt;br /&gt;
If Number of Scan Lines (R9) is changed with a value less than the current VLC, then:&lt;br /&gt;
* on CRTCs 0/1/2, VLC overflows and will count up to its maximum value (31) before looping back and counting up again until it reaches the new value of R9&lt;br /&gt;
* on CRTCs 3/4, the current line is considered the last one of this CRTC character and VLC will reset to 0 on the next line&lt;br /&gt;
&lt;br /&gt;
As an exception, on CRTCs 0/2, if VLC is modified during the last frame line, then the updated value will not be considered for the current frame.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== VTAC (C5/C9) overflow ===&lt;br /&gt;
&lt;br /&gt;
During vertical adjustment mode, if Vertical Total Adjust (R5) is changed with a value less than the current VTAC, then:&lt;br /&gt;
* on CRTCs 0/1/2, VTAC overflows and will count up to its maximum value (31) before looping back and counting up again until it reaches the new value of R5&lt;br /&gt;
* on CRTCs 3/4, the current line is considered the last one of the current frame and vertical adjustment will end&lt;br /&gt;
&lt;br /&gt;
As an exception, on CRTCs 0/2, if VTAC is modified during the last frame line, then the updated value will not be considered for the current frame.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Vertical Adjustment mode ===&lt;br /&gt;
&lt;br /&gt;
On CRTCs 3/4, this mode does not increment VCC, so VCC remains equal to R4.&lt;br /&gt;
&lt;br /&gt;
On CRTC 0, this mode increments VCC, causing it to exceed R4, but this increment occurs only once.&lt;br /&gt;
&lt;br /&gt;
On CRTCs 1/2, this mode increments VCC, causing it to exceed R4, and this increment can happen multiple times depending on the values of R5 and R9.&lt;br /&gt;
&lt;br /&gt;
Also, only CRTCs 1/2 have a dedicated C5 counter. On CRTCs 0/3/4, during Vertical Adjustment, C9 has to fullfil the VTAC role which means that it cannot fullfil its VLC role. This impacts address generation as R9 is not considered anymore.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Counter freezes ===&lt;br /&gt;
&lt;br /&gt;
On CRTCs 1/2/3/4, R0 accepts all values without causing any problems for counters.&lt;br /&gt;
&lt;br /&gt;
On CRTC 0:&lt;br /&gt;
* Setting R0 to 0 will cause numerous issues that stem from the fact that VLC is frozen. As HCC never reaches 1, the logic that increments VLC is never triggered.&lt;br /&gt;
* The logic that triggers vertical adjustment is broken if R0&amp;lt;2.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Block Diagrams ==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!Hitachi&lt;br /&gt;
!UMC&lt;br /&gt;
!Motorola&lt;br /&gt;
|-&lt;br /&gt;
|[[File:CRTC Block Diagram.png|Hitachi]]&lt;br /&gt;
|[[File:UMC CRTC Block Diagram.png|UMC]]&lt;br /&gt;
|[[File:Motorola CRTC Block Diagram.png|Motorola]]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== CRTC-II (aka Type 5) ==&lt;br /&gt;
&lt;br /&gt;
The [[Media:CRTC-5-HD6345.pdf|HD6345 datasheet]] states it is upward-compatible with the HD6845S in pin and software.&lt;br /&gt;
&lt;br /&gt;
This chip was never used by Amstrad. However, some CPC enthusiasts have replaced the original CRTC chip in their CPC with this one.&lt;br /&gt;
&lt;br /&gt;
With this chip, split-screen becomes easy: [https://thecheshirec.at/2024/05/20/des-splitscreens-en-basic-sur-crtc5/ Split-screen in BASIC]. And 3 new graphics modes (160x100x16c, 320x100x4c, 640x100x2c) are available: [https://thecheshirec.at/2024/11/10/trois-nouveaux-modes-video-grace-au-crtc-5/ New graphics modes in BASIC].&lt;br /&gt;
&lt;br /&gt;
This is the cheapest way to upgrade the CPC's graphics capabilities, costing only 1.29€. [https://thecheshirec.at/2024/05/19/des-crtc5-a-129e/ Source]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Datasheets ==&lt;br /&gt;
&lt;br /&gt;
==== Used by Amstrad ====&lt;br /&gt;
* [[Media:hd6845.hitachi.pdf|HD6845S (Hitachi)]] aka Type 0&lt;br /&gt;
* [[Media:UM6845-UMC.pdf|UM6845 (UMC)]] aka Type 0&lt;br /&gt;
* [[Media:Um6845r.umc.pdf|UM6845R (UMC)]] aka Type 1&lt;br /&gt;
* [[Media:Mc6845.motorola.pdf|MC6845 (Motorola)]] aka Type 2&lt;br /&gt;
* [[Media:CPC_Plus_Asic_Schematic.GIF|AMS40489 (Amstrad)]] aka Type 3 ([[ASIC]])&lt;br /&gt;
* [[AMS40226 (Amstrad)]] aka Type 4 (Pre-ASIC)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Unused clones ====&lt;br /&gt;
* [[CM607P]] a Bulgarian clone made in Pravetz factory. It is used in the [[Aleste 520EX]].&lt;br /&gt;
* [[Media:hd6845.hitachi.pdf|HD6845R]] by Hitachi. According to Kevin Thacker, the [[KC Compact]] used HD6845R only.&lt;br /&gt;
* [[Media:UM6845E-UMC.pdf|UM6845E]] by UMC&lt;br /&gt;
* [[Media:Mc6845.pdf|MC6845-1]] by Motorola&lt;br /&gt;
* [[Media:F6845.pdf|F6845]] by Fairchild&lt;br /&gt;
* [[Media:EF6845P.pdf|EF6845]] by Thomson Semiconductors&lt;br /&gt;
* [[Media:VL6845 VTi.pdf|VL6845]] by VTi&lt;br /&gt;
* [[Media:C6845 CRTC (CAST).pdf|C6845]] by Cast&lt;br /&gt;
* [[Media:MB89321B FUJ.pdf|MB89321B]] by Fujitsu. It is pin-compatible with the 6845&lt;br /&gt;
* [[Media:MB89321A datasheet CRTC.pdf|MB89321A]] by Fujitsu. Enhanced version that adds smooth scroll, screen partitioning, independent scrolling of screen partitions, and other convenient features&lt;br /&gt;
* [[Media:Mos 6545-1 crtc.pdf|MOS 6545]] (MOS, Rockwell, Synertek) is pin-compatible with the 6845. Its differences are found in the R8 register.&lt;br /&gt;
* [https://www.cpcwiki.eu/forum/other-retro/interesting-discussion-about-the-c128-s-cpm-poor-performance/msg223058/#msg223058 MOS 8563] It is an evolution of the 6545/6845 CRTC chip, with blitter abilities to autonomously perform block memory copies within its dedicated video RAM.&lt;br /&gt;
* [https://github.com/hoglet67/BeebFpga/blob/dev/src/common/mc6845.vhd BeebFpga] [https://github.com/MiSTer-devel/Amstrad_MiSTer/blob/master/rtl/UM6845R.v MiSTer] [https://opencores.org/websvn/filedetails?repname=System09&amp;amp;path=%2FSystem09%2Ftrunk%2Frtl%2FVHDL%2Fcrtc6845.vhd OpenCores] Verilog/VHDL implementations of the 6845&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Tools about CRTC ==&lt;br /&gt;
&lt;br /&gt;
* [http://www.cpcwiki.eu/imgs/9/99/Elmar_Krieger-SPECIAL_EFFECTS.dsk  some BASIC tools to detect CRTC types 0-1-2 and show some effects] by [[Elmar Krieger]] (DSK for Emulators)&lt;br /&gt;
* [[File:Shaker26.dsk]] Shaker - Suite of CRTC tests associated with the CPC CRTC compendium (many of them will not work correctly on emulators and that was the purpose of the tests, to help create more compatible emulation)&lt;br /&gt;
* [[File:Shaker addon.dsk]] Shaker Add-On (Pixel 1 Hard Scroll / Vertical Rupture all Crtc)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Links ==&lt;br /&gt;
&lt;br /&gt;
* [http://en.wikipedia.org/wiki/6845 Wikipedia on the CRTC]&lt;br /&gt;
* [http://www.grimware.org/doku.php/documentations/devices/crtc CRTC documentation from Grimware]&lt;br /&gt;
* [http://quasar.cpcscene.net/doku.php?id=assem:crtc Quasar CRTC documentation (in french)]&lt;br /&gt;
* [https://pulkomandy.github.io/shinra.github.io/crtc.html PulkoMandy's table] [https://www.theoddys.com/acorn/the_6845_crtc/6845%20Variants.xlsx Oddy's table] Differences between CRTC types&lt;br /&gt;
* [[Media:Dossier Rupture(Gozeur Paradox).pdf]]&lt;br /&gt;
* [[Media:Dossier CRTC(Ramlaid Mortel).pdf]] Les entrailles du CRTC&lt;br /&gt;
* [https://thecheshirec.at/tag/crtc6845/ Leçons CRTC (CheshireCat)]&lt;br /&gt;
* [[Media:ACCC1.8-EN.pdf]] [[Media:ACCC1.8-FR.pdf]] CPC CRTC Compendium - Latest (04/2024!) document containing in-depth info about CRTC programming on CPC.&lt;br /&gt;
* [[Media:CRTC Compendium Podcast.mp3]] The CRTC Compendium digested in podcast format&lt;br /&gt;
* [https://martin.hinner.info/vga/pal.html PAL video timing specification]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Related pages==&lt;br /&gt;
&lt;br /&gt;
*[[Gate Array]]&lt;br /&gt;
&lt;br /&gt;
*[[ASIC]]&lt;br /&gt;
&lt;br /&gt;
*[[Video modes]]&lt;br /&gt;
&lt;br /&gt;
*[[Synchronising with the CRTC and display]] : technic and details on the relationship between Gate Array and CRTC.&lt;br /&gt;
&lt;br /&gt;
*[[VIDI digitizer]] This extension contains its own CRTC chip&lt;br /&gt;
&lt;br /&gt;
[[Category:Hardware]] [[Category:CPC Internal Components]] [[Category:Electronic Component]] [[Category:Programming]] [[Category:Datasheet]] [[Category:Graphic]]&lt;/div&gt;</summary>
		<author><name>Longshot</name></author>	</entry>

	<entry>
		<id>https://oldwiki.cpcwiki.eu/index.php?title=Gate_Array&amp;diff=126042</id>
		<title>Gate Array</title>
		<link rel="alternate" type="text/html" href="https://oldwiki.cpcwiki.eu/index.php?title=Gate_Array&amp;diff=126042"/>
				<updated>2025-05-18T19:20:30Z</updated>
		
		<summary type="html">&lt;p&gt;Longshot: /* CSYNC signal */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[File:Amstrad 40010 Gate Array.png|right|thumb|Amstrad 40010 Gate Array]]&lt;br /&gt;
&lt;br /&gt;
Also designated as Video Gate Array (VGA, not to be confused with the IBM PC compatible graphic card spec).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Introduction  ==&lt;br /&gt;
&lt;br /&gt;
The Gate Array is a specially designed chip exclusively for use in the Amstrad CPC and was designed by Amstrad plc. &lt;br /&gt;
&lt;br /&gt;
In the CPC+ system, the functions of the Gate Array are integrated into a single [[ASIC|ASIC]]. When the ASIC is &amp;quot;locked&amp;quot;, the extra features are not available and the ASIC operates the same as the Gate Array in the CPC allowing programs written for the CPC to work on the Plus without modification. The ASIC must be &amp;quot;un-locked&amp;quot; to access the new features. &lt;br /&gt;
&lt;br /&gt;
In the [[KC Compact]] system, the functions of the Gate Array are &amp;quot;emulated&amp;quot; in TTL chips, [[CIO Overview|CIO]], and its color translation EPROM.&lt;br /&gt;
&lt;br /&gt;
In the &amp;quot;cost-down&amp;quot; version of the CPC6128, the functions of the Gate Array are integrated into an ASIC.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== What does it do? ==&lt;br /&gt;
&lt;br /&gt;
The Gate Array is responsible for the display (colour palette, resolution, horizontal and vertical sync), bus arbitration, DRAM refresh, interrupt generation and memory arrangement. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Bus arbitration ==&lt;br /&gt;
&lt;br /&gt;
The Gate Array arbitrates access to the RAM between the CPU and the video hardware (CRTC and Gate-Array).&lt;br /&gt;
&lt;br /&gt;
Every microsecond: &lt;br /&gt;
* The CRTC generates a memory address using it's MA and RA signal outputs. See the [[CRTC]] wiki page to know how the motherboard wiring transforms these signals into the Video Memory Address (VMA).&lt;br /&gt;
* The Gate Array fetches 2 bytes for each address. /CPU_ADDR is a 1MHz signal. So these 2 bytes are fetched sequentially. They are not interleaved with Z80 access. These bytes are fetched even when the border is on as this is required for DRAM refresh.&lt;br /&gt;
* The video hardware is given priority so that the display is not disrupted.&lt;br /&gt;
&lt;br /&gt;
The Gate-Array generates the &amp;quot;READY&amp;quot; signal which is connected to the &amp;quot;/WAIT&amp;quot; input signal of the CPU. This signal is used to stop the CPU accessing RAM while the video-hardware is accessing it.&lt;br /&gt;
&lt;br /&gt;
In fact, the Gate Array allows the Z80 to access the RAM in only 1 out of every 4 cycles. As a result, all instruction timings are stretched so that they are all multiples of a microsecond (1µs), and this gives an effective CPU clock of 3.3Mhz.&lt;br /&gt;
&lt;br /&gt;
Unlike the ZX Spectrum or the Amiga, where bus arbitration is restricted to the &amp;quot;contended memory&amp;quot; or &amp;quot;chip RAM&amp;quot;, on the CPC it also applies to ROM access and to RAM expansions. So the Z80 always runs at the same speed, regardless of the type of memory being accessed.&lt;br /&gt;
&lt;br /&gt;
Last but not least, bus arbitration also applies to I/O access. And memory access is not aligned with I/O access on Z80.&lt;br /&gt;
&lt;br /&gt;
Note: On Amstrad Plus, the ASIC also has to handle DMA instruction fetch from RAM.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== DRAM refresh ==&lt;br /&gt;
&lt;br /&gt;
On Amstrad CPC, the Gate Array is responsible for the DRAM refresh, instead of using the Z80 built-in DRAM refresh mechanism. The reason is that there can only be 3 DRAM accesses per microsecond on this architecture. Doing DRAM refresh on each M1 cycle as it is done on MSX would bog down the CPU speed on CPC given its bus arbitration scheme.&lt;br /&gt;
&lt;br /&gt;
The Z80 generates a maximum of one request per microsecond. The CPC also requires two memory accesses per microsecond for reading video data.&lt;br /&gt;
&lt;br /&gt;
The CPC specs 4164-20 DRAMs. These require 330nS for a read or write cycle. The CPC also uses the optimised sequential CAS cycles to read the two video data bytes in half a microsecond. [https://www.cpcwiki.eu/forum/amstrad-cpc-hardware/the-cpc-revision-zero-article/msg243769/ Source]&lt;br /&gt;
&lt;br /&gt;
The way to cause the RAM refresh to fail in both a Plus or normal CPC is simply to stop a few bits of the CRTC address changing (ie. never refresh the selected area).&lt;br /&gt;
&lt;br /&gt;
Generally, only the Row address needs to be cycled, so stopping MA0 through MA7 from changing, and stopping the CPU from reading those rows, will cause data to be lost, quite quickly (generally around 4ms). [https://www.cpcwiki.eu/forum/amstrad-cpc-hardware/memory-refresh-plus/ Source]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Interrupt generation ==&lt;br /&gt;
&lt;br /&gt;
Interrupts on the CPC are created by the Gate Array based on settings from the CRTC. The Gate Array has an internal counter R52 (the R is for Raster) that counts from 0 to 51, incrementing after each HSYNC signal.&lt;br /&gt;
&lt;br /&gt;
On all CRTCs, R52 interrupts always start 1µs after the end of an HSYNC. But on CRTCs 3/4, HSYNCs occur 1µs later than on CRTCs 0/1/2. Which means that on CRTCs 3/4, interrupts start 1µs later than on CRTCs 0/1/2. This can be adjusted by using the CRTC register 3.&lt;br /&gt;
&lt;br /&gt;
R52 will return to 0 and the Gate Array will send an interrupt request on any of these conditions:&lt;br /&gt;
* When it exceeds 51&lt;br /&gt;
* By setting bit4 of the RMR register of the Gate Array to 1&lt;br /&gt;
* At the end of the 2nd HSYNC after the start of the VSYNC&lt;br /&gt;
&lt;br /&gt;
When the Gate Array sends an interrupt request:&lt;br /&gt;
*If the interrupts were authorized at the time of the request, then bit5 of R52 is cleared (but R52 was reset to 0 anyway) and the interrupt takes place&lt;br /&gt;
*If interrupts are not authorized, then the R52 counter continues to increment and the interrupt remains armed (the Gate Array then maintains its INT signal). When interrupts are enabled (using the EI instruction), bit5 of R52 is cleared and the interrupt takes place. This happens only '''after the instruction that follows EI''' as this Z80 instruction has a 1-instruction delay.&lt;br /&gt;
&lt;br /&gt;
[https://shaker.logonsystem.eu/ACCC1.8-EN.pdf Source]&lt;br /&gt;
&lt;br /&gt;
Note: On Amstrad Plus, the interrupt management system is seriously beefed up. See the [[ASIC]] wiki page.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== CSYNC signal ==&lt;br /&gt;
&lt;br /&gt;
The HSYNC and VSYNC signals are received from the [[CRTC]]. These signals are then modified by the Gate Array to C-HSYNC and C-VSYNC and merged into a single CSYNC signal that will be sent to the display.&lt;br /&gt;
&lt;br /&gt;
When CRTC HSYNC is active, the Gate Array immediately outputs the palette colour black. If the HSYNC is set to 14 characters then black will be output for 14µs.&lt;br /&gt;
&lt;br /&gt;
If a graphics mode change is pending, the HSYNC pulse width needs to be at least 2µs for Gate Array to change the graphics mode.&lt;br /&gt;
&lt;br /&gt;
C-HSYNC begins 2µs after activation of the CRTC HSYNC and stays a maximum of 4µs (signal is cut short if HSYNC width is greater than 6).&lt;br /&gt;
&lt;br /&gt;
For example, if CRTC R2=46, and CRTC HSYNC width is 14 chars then C-HSYNC starts at 48 and lasts only until 51 included.&lt;br /&gt;
&lt;br /&gt;
On Gate Array, even if the duration of the CRTC VSYNC is reduced to 2 µseconds, the Gate Array will always output black for 26 lines with 4 lines of C-VSYNC to the monitor. While on ASIC/Pre-ASIC, the CRTC VSYNC must be active as long as the C-VSYNC signal is sent to the monitor.&lt;br /&gt;
&lt;br /&gt;
The Gate Array (and ASIC/Pre-ASIC) uses 2 internal counters to create its CSYNC signal:&lt;br /&gt;
* H06 counts the number of CRTC characters processed during an HSYNC. H06 is incremented by the Gate Array for each CRTC character when CRTC HSYNC is active. The Gate Array activates the C-HSYNC signal when H06 reaches 2, and changes its graphics mode if a change was pending. It deactivates this signal when H06 reaches 6.&lt;br /&gt;
* V26 counts the number of HSYNCs occuring during a VSYNC. V26 is incremented by the Gate Array when the CRTC signals an end of HSYNC. The Gate Array activates the C-VSYNC signal when V26 reaches 2 (and if VSYNC is active on ASIC/Pre-ASIC). It deactivates this signal when V26 reaches 6. After the 26th line has been processed, the Gate Array stops outputting the palette colour black.&lt;br /&gt;
&lt;br /&gt;
If CRTC VSYNC is activated again while V26 is still in progress, then V26 is reset to 0 and starts counting up again the HSYNC pulses.&lt;br /&gt;
&lt;br /&gt;
The HSYNC signal from the CRTC is 0 when inactive and 1 when active. Same for VSYNC.&lt;br /&gt;
&lt;br /&gt;
C-HSYNC and C-VSYNC are composited using the XNOR function. The resulting CSYNC signal produced by the Gate Array is 1 when inactive and 0 when active.&lt;br /&gt;
&lt;br /&gt;
On a CPC monitor, the CSYNC is rendered in &amp;quot;absolute black&amp;quot;. It is darker than the palette colour black output by the Gate Array. The electron beam is basically turned off. Turning up the brightness level won't make it any brighter.&lt;br /&gt;
&lt;br /&gt;
[https://shaker.logonsystem.eu/ACCC1.8-EN.pdf Source]&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Controlling the Gate Array  ==&lt;br /&gt;
&lt;br /&gt;
The gate array is controlled by I/O. The gate array is selected when bit 15 of the I/O port address is set to &amp;quot;0&amp;quot; and bit 14 of the I/O port address is set to &amp;quot;1&amp;quot;. The values of the other bits are ignored. However, to avoid conflict with other devices in the system, these bits should be set to &amp;quot;1&amp;quot;. &lt;br /&gt;
&lt;br /&gt;
The recommended I/O port address is &amp;amp;7Fxx. &lt;br /&gt;
&lt;br /&gt;
The Gate Array is not connected to the CPU's RD and WR pins, so it cannot detect the bus's I/O direction. If you execute an I/O read operation on the Gate Array I/O address, the Gate Array will read an unpredictable value from the databus which will be in high-impedance state. If the value is a valid Gate Array command, it will be executed, otherwise nothing will happen. [https://www.grimware.org/doku.php/documentations/devices/gatearraydo=export_xhtml Source]&lt;br /&gt;
&lt;br /&gt;
The function to be performed is selected by writing data to the Gate Array, the first bits of the data define the function selected (see table below). It is not possible to read from the Gate Array. &lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!colspan=4| 8bit command&lt;br /&gt;
!rowspan=2| Machine&lt;br /&gt;
!rowspan=2| Register&lt;br /&gt;
!rowspan=2| Description&lt;br /&gt;
!rowspan=2| Chip&lt;br /&gt;
|-&lt;br /&gt;
! 7&lt;br /&gt;
! 6&lt;br /&gt;
! 5&lt;br /&gt;
! 4..0&lt;br /&gt;
|-&lt;br /&gt;
| 0 || 0 || x || style=&amp;quot;text-align: center;&amp;quot; | n || All || PENR || Select a color register || Gate Array&lt;br /&gt;
|-&lt;br /&gt;
| 0 || 1 || x || style=&amp;quot;text-align: center;&amp;quot; | n || All || INKR || Change the value of the currently selected color register || Gate Array&lt;br /&gt;
|-&lt;br /&gt;
| 1 || 0 || 0 || style=&amp;quot;text-align: center;&amp;quot; | n || All || RMR || Control Interrupt counter, ROM mapping and Graphics mode || Gate Array&lt;br /&gt;
|-&lt;br /&gt;
| rowspan=&amp;quot;2&amp;quot;|1 || rowspan=&amp;quot;2&amp;quot;|0 || rowspan=&amp;quot;2&amp;quot;|1 || style=&amp;quot;text-align: center;&amp;quot; rowspan=&amp;quot;2&amp;quot; | n || All || RMR || ''Ghost register'' || Gate Array (CPC) or locked ASIC (Plus)&lt;br /&gt;
|-&lt;br /&gt;
| Plus || RMR2 || ASIC &amp;amp; Advanced ROM mapping || Unlocked ASIC&lt;br /&gt;
|-&lt;br /&gt;
| 1 || 1 ||colspan=2  style=&amp;quot;text-align: center;&amp;quot; | n || All || MMR || RAM memory mapping || PAL (only with 128KB or RAM expansion)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
The MMR register is not available in the Gate Array, but is performed by a device at the same I/O port address location.&lt;br /&gt;
&lt;br /&gt;
In the CPC464, CPC664 and KC compact, MMR is performed in an external memory expansion (e.g. Dk'Tronics 64K RAM Expansion), if this expansion is not present then MMR is not available.&lt;br /&gt;
&lt;br /&gt;
In the CPC6128, MMR is performed by a [[PAL16L8|PAL chip]] located on the main PCB, or an external memory expansion.&lt;br /&gt;
&lt;br /&gt;
In the 464+ and 6128+, MMR is performed by the ASIC or an external memory expansion. Please read the document on RAM management for more information.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Registers ==&lt;br /&gt;
&lt;br /&gt;
Note: The Plus palette capabilities are only accessible through the [[Default I/O Port Summary|ASIC I/O page]]. Registers PENR and INKR are not needed in that case.&lt;br /&gt;
&lt;br /&gt;
=== Register PENR (Select a color register) ===&lt;br /&gt;
&lt;br /&gt;
When bit 7 and bit 6 are set to &amp;quot;0&amp;quot;, the remaining bits determine which pen is to have its colour changed. When bit 4 is set to &amp;quot;0&amp;quot;, bits 3 to 0 define which pen is to be selected. When bit 4 is set to &amp;quot;1&amp;quot;, the value contained in bits 3-0 is ignored and the border is selected. &lt;br /&gt;
&lt;br /&gt;
The pen remains selected until another is chosen. &lt;br /&gt;
&lt;br /&gt;
Each mode has a fixed number of pens. Mode 0 has 16 pens, mode 1 has 4 pens and mode 2 has 2 pens. &lt;br /&gt;
&lt;br /&gt;
==== Summary  ====&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!Bit&lt;br /&gt;
!Value&lt;br /&gt;
!Function&lt;br /&gt;
|-&lt;br /&gt;
| 7 || 0 || rowspan=&amp;quot;2&amp;quot; | Gate Array PENR register&lt;br /&gt;
|-&lt;br /&gt;
| 6 || 0 &lt;br /&gt;
|-&lt;br /&gt;
| 5 || - || not used&lt;br /&gt;
|-&lt;br /&gt;
| 4 || 1 || Select border&lt;br /&gt;
|-&lt;br /&gt;
| 3 || x || rowspan=&amp;quot;4&amp;quot; | Ignored&lt;br /&gt;
|-&lt;br /&gt;
| 2 || x&lt;br /&gt;
|-&lt;br /&gt;
| 1 || x&lt;br /&gt;
|-&lt;br /&gt;
| 0 || x&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!Bit&lt;br /&gt;
!Value&lt;br /&gt;
!Function&lt;br /&gt;
|-&lt;br /&gt;
| 7 || 0 || rowspan=&amp;quot;2&amp;quot; | Gate Array PENR register&lt;br /&gt;
|-&lt;br /&gt;
| 6 || 0&lt;br /&gt;
|-&lt;br /&gt;
| 5 || - || not used&lt;br /&gt;
|-&lt;br /&gt;
| 4 || 0 || Select pen&lt;br /&gt;
|-&lt;br /&gt;
| 3 || x || rowspan=&amp;quot;4&amp;quot; | Pen number&lt;br /&gt;
|-&lt;br /&gt;
| 2 || x&lt;br /&gt;
|-&lt;br /&gt;
| 1 || x&lt;br /&gt;
|-&lt;br /&gt;
| 0 || x&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Register INKR (Change the value of the currently selected color register) ===&lt;br /&gt;
&lt;br /&gt;
Once the pen has been selected its colour can then be changed. Bits 4 to 0 specify the hardware colour number from the hardware colour palette. &lt;br /&gt;
&lt;br /&gt;
Even though there is provision for 32 colours, only 27 are possible. The remaining colours are duplicates of those already in the colour palette. &lt;br /&gt;
&lt;br /&gt;
==== Summary  ====&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!Bit&lt;br /&gt;
!Value&lt;br /&gt;
!Function&lt;br /&gt;
|-&lt;br /&gt;
| 7 || 0 || rowspan=&amp;quot;2&amp;quot; | Gate Array INKR register&lt;br /&gt;
|-&lt;br /&gt;
| 6 || 1&lt;br /&gt;
|-&lt;br /&gt;
| 5 || - || not used&lt;br /&gt;
|-&lt;br /&gt;
| 4 || x || rowspan=&amp;quot;5&amp;quot; | Colour number x&lt;br /&gt;
|-&lt;br /&gt;
| 3 || x &lt;br /&gt;
|-&lt;br /&gt;
| 2 || x &lt;br /&gt;
|-&lt;br /&gt;
| 1 || x&lt;br /&gt;
|-&lt;br /&gt;
| 0 || x&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Register RMR (Control Interrupt counter, ROM mapping and Graphics mode) ===&lt;br /&gt;
&lt;br /&gt;
This is a general purpose register responsible for the [[Video modes|graphics mode]] and the ROM configuration. &lt;br /&gt;
&lt;br /&gt;
==== Graphics mode selection  ====&lt;br /&gt;
&lt;br /&gt;
The function of bits 1 and 0 is to define the screen mode. The settings for bits 1 and 0 and the corresponding screen mode are given in the table below. &lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!Bit 1&lt;br /&gt;
!Bit 0&lt;br /&gt;
!Screen mode&lt;br /&gt;
|-&lt;br /&gt;
| 0 || 0 || Mode 0, 160x200 resolution, 16 colours&lt;br /&gt;
|-&lt;br /&gt;
| 0 || 1 || Mode 1, 320x200 resolution, 4 colours&lt;br /&gt;
|-&lt;br /&gt;
| 1 || 0 || Mode 2, 640x200 resolution, 2 colours&lt;br /&gt;
|-&lt;br /&gt;
| 1 || 1 || Mode 3, 160x200 resolution, 4 colours (undocumented)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
* Mode 3 is not official. From the combinations possible, we can see that 4 modes can be defined, although the Amstrad only has 3. Mode 3 is similar to mode 0, because it has the same resolution, but it is limited to only 4 colours. Mode 3 is not supported by the [[KC Compact]] (which outputs black in Mode 3).&lt;br /&gt;
&lt;br /&gt;
Mode changing is synchronised with HSYNC. If the mode is changed, it will take effect from the next HSYNC.&lt;br /&gt;
&lt;br /&gt;
==== ROM configuration selection  ====&lt;br /&gt;
&lt;br /&gt;
Bit 2 is used to enable or disable the lower ROM area. The lower ROM area occupies memory addresses &amp;amp;amp;0000-&amp;amp;amp;3fff and is used to access the operating system ROM. When the lower ROM area is is enabled, reading from &amp;amp;amp;0000-&amp;amp;amp;3FFF will return data in the ROM. When a value is written to &amp;amp;amp;0000-&amp;amp;amp;3FFF, it will be written to the RAM underneath the ROM. When it is disabled, data read from &amp;amp;amp;0000-&amp;amp;amp;3FFF will return the data in the RAM. &lt;br /&gt;
&lt;br /&gt;
Similarly, bit 3 controls enabling or disabling of the upper ROM area. The upper ROM area occupies memory addressess &amp;amp;amp;C000-&amp;amp;amp;FFFF and is BASIC or any expansion ROMs which may be plugged into a ROM board/box. See the document on [[Upper ROM Bank Number|upper rom selection]] for more details. When the upper ROM area enabled, reading from &amp;amp;amp;c000-&amp;amp;amp;ffff, will return data in the ROM. When data is written to &amp;amp;amp;c000-&amp;amp;amp;FFFF, it will be written to the RAM at the same address as the ROM. When the upper ROM area is disabled, and data is read from &amp;amp;amp;c000-&amp;amp;amp;ffff it will be the data in the RAM. &lt;br /&gt;
&lt;br /&gt;
Bit 4 controls the interrupt generation. It can be used to delay interrupts. See the document on interrupt generation for more information.&lt;br /&gt;
&lt;br /&gt;
==== Summary  ====&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!Bit&lt;br /&gt;
!Value&lt;br /&gt;
!Function&lt;br /&gt;
|-&lt;br /&gt;
| 7 || 1 || rowspan=&amp;quot;2&amp;quot; | Gate Array RMR register&lt;br /&gt;
|-&lt;br /&gt;
| 6 || 0 &lt;br /&gt;
|-&lt;br /&gt;
| 5 || - || ''must be 0 on Plus machines with ASIC unlocked''&lt;br /&gt;
|-&lt;br /&gt;
| 4 || x || Interrupt generation control&lt;br /&gt;
|-&lt;br /&gt;
| 3 || x || 1=Upper ROM area disable, 0=Upper ROM area enable&lt;br /&gt;
|-&lt;br /&gt;
| 2 || x || 1=Lower ROM area disable, 0=Lower ROM area enable&lt;br /&gt;
|-&lt;br /&gt;
| 1 || x || rowspan=&amp;quot;2&amp;quot; | Graphics Mode selection&lt;br /&gt;
|-&lt;br /&gt;
| 0 || x&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Register RMR2 (ASIC &amp;amp; Advanced ROM mapping) ===&lt;br /&gt;
&lt;br /&gt;
This register exists only in Plus or GX4000, and is only accessible when the ASIC is unlocked.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!Bit&lt;br /&gt;
!Value&lt;br /&gt;
!Function&lt;br /&gt;
|-&lt;br /&gt;
| 7 || 1 || rowspan=&amp;quot;3&amp;quot; | Gate Array RMR2 register&lt;br /&gt;
|-&lt;br /&gt;
| 6 || 0&lt;br /&gt;
|-&lt;br /&gt;
| 5 || 1&lt;br /&gt;
|-&lt;br /&gt;
| 4 || x || rowspan=&amp;quot;2&amp;quot; |RMR addressing mode&lt;br /&gt;
|-&lt;br /&gt;
| 3 || x&lt;br /&gt;
|-&lt;br /&gt;
| 2 || x || rowspan=&amp;quot;3&amp;quot; | Physical ROM number (0..7)&lt;br /&gt;
|-&lt;br /&gt;
| 1 || x&lt;br /&gt;
|-&lt;br /&gt;
| 0 || x&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ RMR addressing modes&lt;br /&gt;
!Bit 4&lt;br /&gt;
!Bit 3&lt;br /&gt;
!Lower ROM&lt;br /&gt;
![[ASIC|ASIC I/O page]]&lt;br /&gt;
|-&lt;br /&gt;
|0&lt;br /&gt;
|0&lt;br /&gt;
|&amp;amp;0000-&amp;amp;3FFF&lt;br /&gt;
|Disabled&lt;br /&gt;
|-&lt;br /&gt;
|0&lt;br /&gt;
|1&lt;br /&gt;
|&amp;amp;4000-&amp;amp;7FFF&lt;br /&gt;
|Disabled&lt;br /&gt;
|-&lt;br /&gt;
|1&lt;br /&gt;
|0&lt;br /&gt;
|&amp;amp;8000-&amp;amp;BFFF&lt;br /&gt;
|Disabled&lt;br /&gt;
|-&lt;br /&gt;
|1&lt;br /&gt;
|1&lt;br /&gt;
|&amp;amp;0000-&amp;amp;3FFF&lt;br /&gt;
|&amp;amp;4000-&amp;amp;7FFF&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
The physical ROMs are also accessible as upper ROMs by using the [[Upper ROM Bank Number]] port and the RMR register.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Register MMR (RAM memory mapping) ===&lt;br /&gt;
&lt;br /&gt;
This register exists only in CPCs with 128K RAM (like the CPC 6128), or CPCs equipped with [[Standard Memory Expansions]].&lt;br /&gt;
&lt;br /&gt;
Note: In the CPC 6128, the register is a separate [[PAL16L8|PAL chip]] that assists the Gate Array chip.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!Bit&lt;br /&gt;
!Value&lt;br /&gt;
!Function&lt;br /&gt;
|-&lt;br /&gt;
| 7 || 1 || rowspan=&amp;quot;2&amp;quot; | Gate Array MMR register&lt;br /&gt;
|-&lt;br /&gt;
| 6 || 1 &lt;br /&gt;
|-&lt;br /&gt;
| 5 || x || rowspan=&amp;quot;3&amp;quot; |64K bank number (0..7); always 0 on an unexpanded CPC6128, 0-7 on [[Standard Memory Expansions]]&lt;br /&gt;
|-&lt;br /&gt;
| 4 || x&lt;br /&gt;
|-&lt;br /&gt;
| 3 || x&lt;br /&gt;
|-&lt;br /&gt;
| 2 || x || rowspan=&amp;quot;3&amp;quot; | RAM Config (0..7)&lt;br /&gt;
|-&lt;br /&gt;
| 1 || x&lt;br /&gt;
|-&lt;br /&gt;
| 0 || x&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
The 3bit RAM Config value is used to access the second 64K of the total 128K RAM that is built into the CPC 6128 or the additional 64K-512K of standard memory expansions. These contain up to eight 64K ram banks, which are selected with bit 3-5. A standard CPC 6128 only contains bank 0. Normally the register is set to 0, so that only the first 64K RAM are used (identical to the CPC 464 and 664 models). The register can be used to select between the following eight predefined configurations only:&lt;br /&gt;
&lt;br /&gt;
  -Address-     0      1      2      3      4      5      6      7&lt;br /&gt;
  0000-3FFF   RAM_0  RAM_0  '''RAM_4'''  RAM_0  RAM_0  RAM_0  RAM_0  RAM_0&lt;br /&gt;
  4000-7FFF   RAM_1  RAM_1  '''RAM_5'''  '''RAM_3'''  '''RAM_4'''  '''RAM_5'''  '''RAM_6'''  '''RAM_7'''&lt;br /&gt;
  8000-BFFF   RAM_2  RAM_2  '''RAM_6'''  RAM_2  RAM_2  RAM_2  RAM_2  RAM_2&lt;br /&gt;
  C000-FFFF   RAM_3  '''RAM_7'''  '''RAM_7'''  '''RAM_7'''  RAM_3  RAM_3  RAM_3  RAM_3&lt;br /&gt;
&lt;br /&gt;
The Video RAM is always located in the first 64K, VRAM is in no way affected by this register.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Programming the Gate Array - Examples  ==&lt;br /&gt;
&lt;br /&gt;
Defining the colours, &amp;lt;br&amp;gt;Setting pen 0 to Bright White. &lt;br /&gt;
&amp;lt;pre&amp;gt;LD BC,7F00&amp;amp;nbsp;;Gate Array port&lt;br /&gt;
LD A,%00000000+0&amp;amp;nbsp;;Pen number (and Gate Array function)&lt;br /&gt;
OUT (C),A&amp;amp;nbsp;;Send pen number&lt;br /&gt;
LD A,%01000000+11&amp;amp;nbsp;;Pen colour (and Gate Array function)&lt;br /&gt;
OUT (C),A&amp;amp;nbsp;;Send it&lt;br /&gt;
RET&lt;br /&gt;
&lt;br /&gt;
Setting the mode and ROM configuration, &lt;br /&gt;
Mode 2, upper and lower ROM disabled.&lt;br /&gt;
&lt;br /&gt;
LD BC,7F00&amp;amp;nbsp;;Gate array port&lt;br /&gt;
LD A,%10000000+%00001110&amp;amp;nbsp;;Mode and ROM selection (and Gate Array function)&lt;br /&gt;
OUT (C),A&amp;amp;nbsp;;Send it&lt;br /&gt;
RET&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Misc ===&lt;br /&gt;
&lt;br /&gt;
The hardware colour number is different to the colour range used by the firmware, so a conversion chart is provided for the corresponding firmware/hardware colour values and the corresponding colour name. &lt;br /&gt;
&lt;br /&gt;
=== Note ===&lt;br /&gt;
&lt;br /&gt;
The firmware keeps track of the colours it is using. Every VSYNC (assuming interrupts are enabled) the firmware sets the colours. This enables the user to have flashing colours. If the user selects a new colour using the gate array, the new colour will flash temporarily and then return to its original colour. This is due to the firmware resetting the colour. When using the firmware, use its routines to select the colour, and the colour will remain.&lt;br /&gt;
&lt;br /&gt;
Example: [For whatever reason, this example does NOT refer to the above firmware stuff]&lt;br /&gt;
&amp;lt;pre&amp;gt;ld bc,7f00+1&amp;amp;nbsp;;Gate array function (set pen)&lt;br /&gt;
;and pen number&lt;br /&gt;
out (c),c&lt;br /&gt;
ld bc,7f00&amp;amp;nbsp;;41 &lt;br /&gt;
;Gate array function (set colour)&lt;br /&gt;
;and colour number&lt;br /&gt;
out (c),c&lt;br /&gt;
ret&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Video memory structure ==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!rowspan=2|Graphics Mode&lt;br /&gt;
!colspan=8|VRAM byte&lt;br /&gt;
!colspan=8|Displayed Pixels&lt;br /&gt;
!rowspan=2|Definition&lt;br /&gt;
!rowspan=2|Pixel clock&lt;br /&gt;
!rowspan=2|Default resolution&lt;br /&gt;
|-&lt;br /&gt;
!7&lt;br /&gt;
!6&lt;br /&gt;
!5&lt;br /&gt;
!4&lt;br /&gt;
!3&lt;br /&gt;
!2&lt;br /&gt;
!1&lt;br /&gt;
!0&lt;br /&gt;
!1&lt;br /&gt;
!2&lt;br /&gt;
!3&lt;br /&gt;
!4&lt;br /&gt;
!5&lt;br /&gt;
!6&lt;br /&gt;
!7&lt;br /&gt;
!8&lt;br /&gt;
|-&lt;br /&gt;
|0&lt;br /&gt;
|A0&lt;br /&gt;
|B0&lt;br /&gt;
|A2&lt;br /&gt;
|B2&lt;br /&gt;
|A1&lt;br /&gt;
|B1&lt;br /&gt;
|A3&lt;br /&gt;
|B3&lt;br /&gt;
|colspan=4 style=&amp;quot;text-align: center;&amp;quot;|A&lt;br /&gt;
|colspan=4 style=&amp;quot;text-align: center;&amp;quot;|B&lt;br /&gt;
|2 pixels in 16 colours&lt;br /&gt;
|4 MHz&lt;br /&gt;
|160x200, 20-column text&lt;br /&gt;
|-&lt;br /&gt;
|1&lt;br /&gt;
|A0&lt;br /&gt;
|B0&lt;br /&gt;
|C0&lt;br /&gt;
|D0&lt;br /&gt;
|A1&lt;br /&gt;
|B1&lt;br /&gt;
|C1&lt;br /&gt;
|D1&lt;br /&gt;
|colspan=2 style=&amp;quot;text-align: center;&amp;quot;|A&lt;br /&gt;
|colspan=2 style=&amp;quot;text-align: center;&amp;quot;|B&lt;br /&gt;
|colspan=2 style=&amp;quot;text-align: center;&amp;quot;|C&lt;br /&gt;
|colspan=2 style=&amp;quot;text-align: center;&amp;quot;|D&lt;br /&gt;
|4 pixels in 4 colours&lt;br /&gt;
|8 MHz&lt;br /&gt;
|320x200, 40-column text&lt;br /&gt;
|-&lt;br /&gt;
|2&lt;br /&gt;
|A0&lt;br /&gt;
|B0&lt;br /&gt;
|C0&lt;br /&gt;
|D0&lt;br /&gt;
|E0&lt;br /&gt;
|F0&lt;br /&gt;
|G0&lt;br /&gt;
|H0&lt;br /&gt;
|A&lt;br /&gt;
|B&lt;br /&gt;
|C&lt;br /&gt;
|D&lt;br /&gt;
|E&lt;br /&gt;
|F&lt;br /&gt;
|G&lt;br /&gt;
|H&lt;br /&gt;
|8 pixels in 2 colours&lt;br /&gt;
|16 MHz&lt;br /&gt;
|640x200, 80-column text&lt;br /&gt;
|-&lt;br /&gt;
|3&lt;br /&gt;
|A0&lt;br /&gt;
|B0&lt;br /&gt;
|x&lt;br /&gt;
|x&lt;br /&gt;
|A1&lt;br /&gt;
|B1&lt;br /&gt;
|x&lt;br /&gt;
|x&lt;br /&gt;
|colspan=4 style=&amp;quot;text-align: center;&amp;quot;|A&lt;br /&gt;
|colspan=4 style=&amp;quot;text-align: center;&amp;quot;|B&lt;br /&gt;
|2 pixels in 4 colours&lt;br /&gt;
|4 MHz&lt;br /&gt;
|160x200, 20-column text&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Split rasters ==&lt;br /&gt;
&lt;br /&gt;
On the CPC, split rasters occur halfway (after the 8th mode2 pixel) through the rendering of a CRTC character.&lt;br /&gt;
&lt;br /&gt;
On Amstrad Plus, split rasters occur quarter of the way (after the 4th mode2 pixel) through the rendering of a CRTC character.&lt;br /&gt;
&lt;br /&gt;
To easily make split rasters compatible with both the CPC and the Plus machines, one can use the ASIC soft-scroll control register (SSCR) to finely adjust the horizontal position of the graphics.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Palette R,G,B definitions ==&lt;br /&gt;
&lt;br /&gt;
There are 27 colours which are generated from red, green and blue mixed in different quantities. There are 3 levels of red, 3 levels of green and 3 levels of blue, and these can be thought of as off/no colour, half-on/half-colour, and on/full-colour. &lt;br /&gt;
&lt;br /&gt;
To display a CPC image you will need to use a analogue monitor with a composite sync.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Palette sorted by Firmware Colour Numbers ===&lt;br /&gt;
&lt;br /&gt;
The firmware colour palette is sorted by luminance value.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
|-&lt;br /&gt;
!Firmware Number&lt;br /&gt;
!Hardware Number&lt;br /&gt;
!Colour Name&lt;br /&gt;
!R %&lt;br /&gt;
!G %&lt;br /&gt;
!B %&lt;br /&gt;
!ASIC&lt;br /&gt;
!Colour&lt;br /&gt;
|-&lt;br /&gt;
| 0|| 54h          ||Black          ||  0||  0||  0|| #000||bgcolor=&amp;quot;#000000&amp;quot;|&lt;br /&gt;
|-&lt;br /&gt;
| 1|| 44h (or 50h) ||Blue           ||  0||  0|| 50|| #006||bgcolor=&amp;quot;#000080&amp;quot;|&lt;br /&gt;
|-&lt;br /&gt;
| 2|| 55h          ||Bright Blue    ||  0||  0||100|| #00F||bgcolor=&amp;quot;#0000ff&amp;quot;|&lt;br /&gt;
|-&lt;br /&gt;
| 3|| 5Ch          ||Red            || 50||  0||  0|| #600||bgcolor=&amp;quot;#800000&amp;quot;|&lt;br /&gt;
|-&lt;br /&gt;
| 4|| 58h          ||Magenta        || 50||  0|| 50|| #606||bgcolor=&amp;quot;#800080&amp;quot;|&lt;br /&gt;
|-&lt;br /&gt;
| 5|| 5Dh          ||Mauve          || 50||  0||100|| #60F||bgcolor=&amp;quot;#8000ff&amp;quot;|&lt;br /&gt;
|-&lt;br /&gt;
| 6|| 4Ch          ||Bright Red     ||100||  0||  0|| #F00||bgcolor=&amp;quot;#ff0000&amp;quot;|&lt;br /&gt;
|-&lt;br /&gt;
| 7|| 45h (or 48h) ||Purple         ||100||  0|| 50|| #F06||bgcolor=&amp;quot;#ff0080&amp;quot;|&lt;br /&gt;
|-&lt;br /&gt;
| 8|| 4Dh          ||Bright Magenta ||100||  0||100|| #F0F||bgcolor=&amp;quot;#ff00ff&amp;quot;|&lt;br /&gt;
|-&lt;br /&gt;
| 9|| 56h          ||Green          ||  0|| 50||  0|| #060||bgcolor=&amp;quot;#008000&amp;quot;|&lt;br /&gt;
|-&lt;br /&gt;
|10|| 46h          ||Cyan           ||  0|| 50|| 50|| #066||bgcolor=&amp;quot;#008080&amp;quot;|&lt;br /&gt;
|-&lt;br /&gt;
|11|| 57h          ||Sky Blue       ||  0|| 50||100|| #06F||bgcolor=&amp;quot;#0080ff&amp;quot;|&lt;br /&gt;
|-&lt;br /&gt;
|12|| 5Eh          ||Yellow         || 50|| 50||  0|| #660||bgcolor=&amp;quot;#808000&amp;quot;|&lt;br /&gt;
|-&lt;br /&gt;
|13|| 40h (or 41h) ||White          || 50|| 50|| 50||#666||bgcolor=&amp;quot;#808080&amp;quot;|&lt;br /&gt;
|-&lt;br /&gt;
|14|| 5Fh          ||Pastel Blue    || 50|| 50||100|| #66F||bgcolor=&amp;quot;#8080ff&amp;quot;|&lt;br /&gt;
|-&lt;br /&gt;
|15|| 4Eh          ||Orange         ||100|| 50||  0|| #F60|| bgcolor=&amp;quot;#ff8000&amp;quot;|&lt;br /&gt;
|-&lt;br /&gt;
|16|| 47h          ||Pink           ||100|| 50|| 50|| #F66||bgcolor=&amp;quot;#ff8080&amp;quot;|&lt;br /&gt;
|-&lt;br /&gt;
|17|| 4Fh          ||Pastel Magenta ||100|| 50||100|| #F6F||bgcolor=&amp;quot;#ff80ff&amp;quot;|&lt;br /&gt;
|-&lt;br /&gt;
|18|| 52h          ||Bright Green   ||  0||100||  0|| #0F0||bgcolor=&amp;quot;#00ff00&amp;quot;|&lt;br /&gt;
|-&lt;br /&gt;
|19|| 42h (or 51h) ||Sea Green      ||  0||100|| 50|| #0F6||bgcolor=&amp;quot;#00ff80&amp;quot;|&lt;br /&gt;
|-&lt;br /&gt;
|20|| 53h          ||Bright Cyan    ||  0||100||100|| #0FF||bgcolor=&amp;quot;#00ffff&amp;quot;|&lt;br /&gt;
|-&lt;br /&gt;
|21|| 5Ah          ||Lime           || 50||100||  0|| #6F0||bgcolor=&amp;quot;#80ff00&amp;quot;|&lt;br /&gt;
|-&lt;br /&gt;
|22|| 59h          ||Pastel Green   || 50||100|| 50|| #6F6||bgcolor=&amp;quot;#80ff80&amp;quot;|&lt;br /&gt;
|-&lt;br /&gt;
|23|| 5Bh          ||Pastel Cyan    || 50||100||100|| #6FF||bgcolor=&amp;quot;#80ffff&amp;quot;|&lt;br /&gt;
|-&lt;br /&gt;
|24|| 4Ah          ||Bright Yellow  ||100||100||  0|| #FF0||bgcolor=&amp;quot;#ffff00&amp;quot;|&lt;br /&gt;
|-&lt;br /&gt;
|25|| 43h (or 49h) ||Pastel Yellow  ||100||100|| 50||#FF6||bgcolor=&amp;quot;#ffff80&amp;quot;|&lt;br /&gt;
|-&lt;br /&gt;
|26|| 4Bh          ||Bright White   ||100||100||100|| #FFF||bgcolor=&amp;quot;#ffffff&amp;quot;|&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Note: We can observe that the official Amstrad names of some colours are a bit silly: &amp;quot;red&amp;quot; is in fact brown, &amp;quot;yellow&amp;quot; is in fact khaki and &amp;quot;white&amp;quot; is in fact grey.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Amstrad Colour Names ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;gallery&amp;gt;&lt;br /&gt;
Cpc 6128 master colour chat.jpg|Master colour chart&lt;br /&gt;
Cpc 6128 farbtabelle.jpg|Farbtabelle&lt;br /&gt;
Cpc 6128 palette des couleurs.jpg|Palette des couleurs&lt;br /&gt;
Cpc 6128 tabla de colores.jpg|Tabla de colores&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Palette sorted by Hardware Colour Numbers ===&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!Hardware Number&lt;br /&gt;
!Firmware Number&lt;br /&gt;
!R %&lt;br /&gt;
!G %&lt;br /&gt;
!B %&lt;br /&gt;
!ASIC&lt;br /&gt;
!Colour&lt;br /&gt;
!Colour Name&lt;br /&gt;
!German Name&lt;br /&gt;
!French Name&lt;br /&gt;
!Spanish Name&lt;br /&gt;
|-&lt;br /&gt;
|  0 (40h) || 13   || 50|| 50|| 50|| #666|| bgcolor=&amp;quot;#808080&amp;quot; | || White         || Weiß            || Blanc           || Blanco&lt;br /&gt;
|-&lt;br /&gt;
|  1 (41h) || (13) || 50|| 50|| 50|| #666|| bgcolor=&amp;quot;#808080&amp;quot; | || White         || Weiß            || Blanc           || Blanco&lt;br /&gt;
|-&lt;br /&gt;
|  2 (42h) || 19   ||  0||100|| 50|| #0F6|| bgcolor=&amp;quot;#00ff80&amp;quot; | || Sea Green     || Seegrün         || Vert marin      || Verde marino&lt;br /&gt;
|-&lt;br /&gt;
|  3 (43h) || 25   ||100||100|| 50|| #FF6|| bgcolor=&amp;quot;#ffff80&amp;quot; | || Pastel Yellow || Pastellgelb     || Jaune pastel    || Amarillo pastel&lt;br /&gt;
|-&lt;br /&gt;
|  4 (44h) || 1    ||  0||  0|| 50|| #006|| bgcolor=&amp;quot;#000080&amp;quot; | || Blue          || Blau            || Bleu            || Azul&lt;br /&gt;
|-&lt;br /&gt;
|  5 (45h) || 7    ||100||  0|| 50|| #F06|| bgcolor=&amp;quot;#ff0080&amp;quot; | || Purple        || Purpur          || Pourpre         || Púrpura&lt;br /&gt;
|-&lt;br /&gt;
|  6 (46h) || 10   ||  0|| 50|| 50|| #066|| bgcolor=&amp;quot;#008080&amp;quot; | || Cyan          || Blaugrün        || Turquoise       || Ciano&lt;br /&gt;
|-&lt;br /&gt;
|  7 (47h) || 16   ||100|| 50|| 50|| #F66|| bgcolor=&amp;quot;#ff8080&amp;quot; | || Pink          || Rosa            || Rose            || Rosa&lt;br /&gt;
|-&lt;br /&gt;
|  8 (48h) || (7)  ||100||  0|| 50|| #F06|| bgcolor=&amp;quot;#ff0080&amp;quot; | || Purple        || Purpur          || Pourpre         || Púrpura&lt;br /&gt;
|-&lt;br /&gt;
|  9 (49h) || (25) ||100||100|| 50|| #FF6|| bgcolor=&amp;quot;#ffff80&amp;quot; | || Pastel Yellow || Pastellgelb     || Jaune pastel    || Amarillo pastel&lt;br /&gt;
|-&lt;br /&gt;
| 10 (4Ah) || 24   ||100||100||  0|| #FF0|| bgcolor=&amp;quot;#ffff00&amp;quot; | || Bright Yellow || Hellgelb        || Jaune vif       || Amarillo brillante&lt;br /&gt;
|-&lt;br /&gt;
| 11 (4Bh) || 26   ||100||100||100|| #FFF|| bgcolor=&amp;quot;#ffffff&amp;quot; | || Bright White  || Leuchtendweiß   || Blanc brillant  || Blanco brillante&lt;br /&gt;
|-&lt;br /&gt;
| 12 (4Ch) || 6    ||100||  0||  0|| #F00|| bgcolor=&amp;quot;#ff0000&amp;quot; | || Bright Red    || Hellrot         || Rouge vif       || Rojo brillante&lt;br /&gt;
|-&lt;br /&gt;
| 13 (4Dh) || 8    ||100||  0||100|| #F0F|| bgcolor=&amp;quot;#ff00ff&amp;quot; | || Bright Magenta|| helles Magenta  || Magenta vif     || Magenta brillante&lt;br /&gt;
|-&lt;br /&gt;
| 14 (4Eh) || 15   ||100|| 50||  0|| #F60|| bgcolor=&amp;quot;#ff8000&amp;quot; | || Orange        || Orange          || Orange          || Naranja&lt;br /&gt;
|-&lt;br /&gt;
| 15 (4Fh) || 17   ||100|| 50||100|| #F6F|| bgcolor=&amp;quot;#ff80ff&amp;quot; | || Pastel Magenta|| Pastell-magenta || Magenta pastel  || Magenta pastel&lt;br /&gt;
|-&lt;br /&gt;
| 16 (50h) || (1)  ||  0||  0|| 50|| #006|| bgcolor=&amp;quot;#000080&amp;quot; | || Blue          || Blau            || Bleu            || Azul&lt;br /&gt;
|-&lt;br /&gt;
| 17 (51h) || (19) ||  0||100|| 50|| #0F6|| bgcolor=&amp;quot;#00ff80&amp;quot; | || Sea Green     || Seegrün         || Vert marin      || Verde marino&lt;br /&gt;
|-&lt;br /&gt;
| 18 (52h) || 18   ||  0||100||  0|| #0F0|| bgcolor=&amp;quot;#00ff00&amp;quot; | || Bright Green  || Hellgrün        || Vert vif        || Verde brillante&lt;br /&gt;
|-&lt;br /&gt;
| 19 (53h) || 20   ||  0||100||100|| #0FF|| bgcolor=&amp;quot;#00ffff&amp;quot; | || Bright Cyan   || helles Blaugrün || Turquoise vif   || Ciano brillante&lt;br /&gt;
|-&lt;br /&gt;
| 20 (54h) || 0    ||  0||  0||  0|| #000|| bgcolor=&amp;quot;#000000&amp;quot; | || Black         || Schwarz         || Noir            || Negro&lt;br /&gt;
|-&lt;br /&gt;
| 21 (55h) || 2    ||  0||  0||100|| #00F|| bgcolor=&amp;quot;#0000ff&amp;quot; | || Bright Blue   || Hellblau        || Bleu vif        || Azul brillante&lt;br /&gt;
|-&lt;br /&gt;
| 22 (56h) || 9    ||  0|| 50||  0|| #060|| bgcolor=&amp;quot;#008000&amp;quot; | || Green         || Grün            || Vert            || Verde&lt;br /&gt;
|-&lt;br /&gt;
| 23 (57h) || 11   ||  0|| 50||100|| #06F|| bgcolor=&amp;quot;#0080ff&amp;quot; | || Sky Blue      || Himmelblau      || Bleu ciel       || Azul cielo&lt;br /&gt;
|-&lt;br /&gt;
| 24 (58h) || 4    || 50||  0|| 50|| #606|| bgcolor=&amp;quot;#800080&amp;quot; | || Magenta       || Magenta         || Magenta         || Magenta&lt;br /&gt;
|-&lt;br /&gt;
| 25 (59h) || 22   || 50||100|| 50|| #6F6|| bgcolor=&amp;quot;#80ff80&amp;quot; | || Pastel Green  || Pastellgrün     || Vert pastel     || Verde pastel&lt;br /&gt;
|-&lt;br /&gt;
| 26 (5Ah) || 21   || 50||100||  0|| #6F0|| bgcolor=&amp;quot;#80ff00&amp;quot; | || Lime          || Limonengrün     || Vert citron     || Verde lima&lt;br /&gt;
|-&lt;br /&gt;
| 27 (5Bh) || 23   || 50||100||100|| #6FF|| bgcolor=&amp;quot;#80ffff&amp;quot; | || Pastel Cyan   || Pastell-blaugrün|| Turquoise pastel|| Ciano pastel&lt;br /&gt;
|-&lt;br /&gt;
| 28 (5Ch) || 3    || 50||  0||  0|| #600|| bgcolor=&amp;quot;#800000&amp;quot; | || Red           || Rot             || Rouge           || Rojo&lt;br /&gt;
|-&lt;br /&gt;
| 29 (5Dh) || 5    || 50||  0||100|| #60F|| bgcolor=&amp;quot;#8000ff&amp;quot; | || Mauve         || Hellviolett     || Mauve           || Malva&lt;br /&gt;
|-&lt;br /&gt;
| 30 (5Eh) || 12   || 50|| 50||  0|| #660|| bgcolor=&amp;quot;#808000&amp;quot; | || Yellow        || Gelb            || Jaune           || Amarillo&lt;br /&gt;
|-&lt;br /&gt;
| 31 (5Fh) || 14   || 50|| 50||100|| #66F|| bgcolor=&amp;quot;#8080ff&amp;quot; | || Pastel Blue   || Pastellblau     || Bleu pastel     || Azul pastel&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Intensities ===&lt;br /&gt;
&lt;br /&gt;
The 0%, 50%, and 100% values in the above tables are &amp;quot;should-be&amp;quot; values. However, the real hardware doesn't exactly match that intensities. The actual intensities depend on the luminance mixing (R,G,B tied together via resistors), on chipset (classic CPC, or newer ASIC ones), and on the load applied by external hardware (Monitor, or TV set).&lt;br /&gt;
&lt;br /&gt;
On an actual Amstrad CPC, the half-intensity colour signal is measured to be closer to 40% rather than the expected 50%. This was verified by [[Grim]] and independently confirmed by [[Nocash]]. [https://www.grimware.org/doku.php/documentations/devices/gatearray#inkr Source]&lt;br /&gt;
* [[CPC Palette]] - some more details&lt;br /&gt;
&lt;br /&gt;
This explains why the Amstrad engineers used the following values to adapt the old colour palette to the new 12-bit palette on the Amstrad Plus:&lt;br /&gt;
* 0% became #0&lt;br /&gt;
* 50% became #6. They specifically chose #6 for the 50% value instead of the expected #7 or #8, to better match the real Amstrad CPC palette.&lt;br /&gt;
* 100% became #F&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Green Screen Colours ===&lt;br /&gt;
&lt;br /&gt;
On a green screen, where all colours are shades of unsaturated green, the firmware colours are in order of increasing intensity. Black is darkest green, bright white is brightest green, and firmware colour 13 is a medium green.&lt;br /&gt;
&lt;br /&gt;
The luminance (Y) is not exactly correlated to the actual luminance of colour images broadcast in RGB. Amstrad preferred to propose a completely different image system, not comparable to a conversion to monochrome, which would have limited the number of brightness levels to 21 (for example, colours 9 and 6 would have had the same luminance).&lt;br /&gt;
&lt;br /&gt;
They opted for a table of 27 linear brightness steps. They assigned values of 1 (1kΩ) for blue, 3 (3.3kΩ) for red, and 9 (10kΩ) for green.&lt;br /&gt;
&lt;br /&gt;
==== To calculate the luminance value ====&lt;br /&gt;
&lt;br /&gt;
'''Red''' &lt;br /&gt;
&lt;br /&gt;
*0% =&amp;amp;gt; do not add anything &lt;br /&gt;
*50% =&amp;amp;gt; add 3 &lt;br /&gt;
*100% =&amp;amp;gt; add 6 &lt;br /&gt;
&lt;br /&gt;
'''Green''' &lt;br /&gt;
&lt;br /&gt;
*0% =&amp;amp;gt; do not add anything &lt;br /&gt;
*50% =&amp;amp;gt; add 9 &lt;br /&gt;
*100% =&amp;amp;gt; add 18 &lt;br /&gt;
&lt;br /&gt;
'''Blue''' &lt;br /&gt;
&lt;br /&gt;
*0% =&amp;amp;gt; do not add anything &lt;br /&gt;
*50% =&amp;amp;gt; add 1 &lt;br /&gt;
*100% =&amp;amp;gt; add 2 &lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Pictures ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;gallery&amp;gt;&lt;br /&gt;
Image:40010_am2_metal.jpg|40010 GA Metal Layer&lt;br /&gt;
Image:40010_am2_acid.jpg|40010 GA with Metal Layer removed&lt;br /&gt;
Image:40226_am4_metal.jpg|40226 PreASIC Metal Layer&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[File:Ga.pinout.40007.png]] [[File:Ga.pinout.40008.40010.png]]&lt;br /&gt;
&lt;br /&gt;
Note: Some CPC motherboards can accommodate both types of Gate Array pinouts. [https://thecheshirec.at/2024/10/06/il-existe-une-carte-multi-gate-array-et-cest-amstrad-qui-la-faite/ Source]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== External links ==&lt;br /&gt;
*[https://bread80.com/2021/06/03/understanding-the-amstrad-cpc-video-ram-and-gate-array-subsystem/ Electronic signals analysis of the Gate Array by Bread80]&lt;br /&gt;
* [https://www.grimware.org/doku.php/documentations/devices/gatearray Gate Array documentation from Grimware]&lt;br /&gt;
* [http://quasar.cpcscene.net/doku.php?id=assem:gate_array Quasar Gate Array documentation (in french)]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==See also==&lt;br /&gt;
&lt;br /&gt;
*[[Gate Array and ASIC Pin-Outs]]&lt;br /&gt;
*[[PAL16L8]] : for RAM arrangement&lt;br /&gt;
*[[ASIC]] : for Plus users&lt;br /&gt;
&lt;br /&gt;
*[[CRTC]] : the other video stuff&lt;br /&gt;
*[[Synchronising with the CRTC and display]] : technical details on the relationship between Gate Array and CRTC.&lt;br /&gt;
&lt;br /&gt;
*[[Video modes]] : for other informations on colours and pixels.&lt;br /&gt;
&lt;br /&gt;
*[[Media:40010-simplified V03.pdf]] [https://www.cpcwiki.eu/forum/amstrad-cpc-hardware/gate-array-decapped!/msg170713/#msg170713 Forum thread] Gate Array schematics - reverse engineered by Gerald&lt;br /&gt;
&lt;br /&gt;
[[Category:Hardware]][[Category:Programming]][[Category:Datasheet]][[Category:Graphic]][[Category:CPC Internal Components]][[Category:Electronic Component]]&lt;/div&gt;</summary>
		<author><name>Longshot</name></author>	</entry>

	<entry>
		<id>https://oldwiki.cpcwiki.eu/index.php?title=Gate_Array&amp;diff=126041</id>
		<title>Gate Array</title>
		<link rel="alternate" type="text/html" href="https://oldwiki.cpcwiki.eu/index.php?title=Gate_Array&amp;diff=126041"/>
				<updated>2025-05-18T19:19:45Z</updated>
		
		<summary type="html">&lt;p&gt;Longshot: /* Interrupt generation */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[File:Amstrad 40010 Gate Array.png|right|thumb|Amstrad 40010 Gate Array]]&lt;br /&gt;
&lt;br /&gt;
Also designated as Video Gate Array (VGA, not to be confused with the IBM PC compatible graphic card spec).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Introduction  ==&lt;br /&gt;
&lt;br /&gt;
The Gate Array is a specially designed chip exclusively for use in the Amstrad CPC and was designed by Amstrad plc. &lt;br /&gt;
&lt;br /&gt;
In the CPC+ system, the functions of the Gate Array are integrated into a single [[ASIC|ASIC]]. When the ASIC is &amp;quot;locked&amp;quot;, the extra features are not available and the ASIC operates the same as the Gate Array in the CPC allowing programs written for the CPC to work on the Plus without modification. The ASIC must be &amp;quot;un-locked&amp;quot; to access the new features. &lt;br /&gt;
&lt;br /&gt;
In the [[KC Compact]] system, the functions of the Gate Array are &amp;quot;emulated&amp;quot; in TTL chips, [[CIO Overview|CIO]], and its color translation EPROM.&lt;br /&gt;
&lt;br /&gt;
In the &amp;quot;cost-down&amp;quot; version of the CPC6128, the functions of the Gate Array are integrated into an ASIC.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== What does it do? ==&lt;br /&gt;
&lt;br /&gt;
The Gate Array is responsible for the display (colour palette, resolution, horizontal and vertical sync), bus arbitration, DRAM refresh, interrupt generation and memory arrangement. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Bus arbitration ==&lt;br /&gt;
&lt;br /&gt;
The Gate Array arbitrates access to the RAM between the CPU and the video hardware (CRTC and Gate-Array).&lt;br /&gt;
&lt;br /&gt;
Every microsecond: &lt;br /&gt;
* The CRTC generates a memory address using it's MA and RA signal outputs. See the [[CRTC]] wiki page to know how the motherboard wiring transforms these signals into the Video Memory Address (VMA).&lt;br /&gt;
* The Gate Array fetches 2 bytes for each address. /CPU_ADDR is a 1MHz signal. So these 2 bytes are fetched sequentially. They are not interleaved with Z80 access. These bytes are fetched even when the border is on as this is required for DRAM refresh.&lt;br /&gt;
* The video hardware is given priority so that the display is not disrupted.&lt;br /&gt;
&lt;br /&gt;
The Gate-Array generates the &amp;quot;READY&amp;quot; signal which is connected to the &amp;quot;/WAIT&amp;quot; input signal of the CPU. This signal is used to stop the CPU accessing RAM while the video-hardware is accessing it.&lt;br /&gt;
&lt;br /&gt;
In fact, the Gate Array allows the Z80 to access the RAM in only 1 out of every 4 cycles. As a result, all instruction timings are stretched so that they are all multiples of a microsecond (1µs), and this gives an effective CPU clock of 3.3Mhz.&lt;br /&gt;
&lt;br /&gt;
Unlike the ZX Spectrum or the Amiga, where bus arbitration is restricted to the &amp;quot;contended memory&amp;quot; or &amp;quot;chip RAM&amp;quot;, on the CPC it also applies to ROM access and to RAM expansions. So the Z80 always runs at the same speed, regardless of the type of memory being accessed.&lt;br /&gt;
&lt;br /&gt;
Last but not least, bus arbitration also applies to I/O access. And memory access is not aligned with I/O access on Z80.&lt;br /&gt;
&lt;br /&gt;
Note: On Amstrad Plus, the ASIC also has to handle DMA instruction fetch from RAM.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== DRAM refresh ==&lt;br /&gt;
&lt;br /&gt;
On Amstrad CPC, the Gate Array is responsible for the DRAM refresh, instead of using the Z80 built-in DRAM refresh mechanism. The reason is that there can only be 3 DRAM accesses per microsecond on this architecture. Doing DRAM refresh on each M1 cycle as it is done on MSX would bog down the CPU speed on CPC given its bus arbitration scheme.&lt;br /&gt;
&lt;br /&gt;
The Z80 generates a maximum of one request per microsecond. The CPC also requires two memory accesses per microsecond for reading video data.&lt;br /&gt;
&lt;br /&gt;
The CPC specs 4164-20 DRAMs. These require 330nS for a read or write cycle. The CPC also uses the optimised sequential CAS cycles to read the two video data bytes in half a microsecond. [https://www.cpcwiki.eu/forum/amstrad-cpc-hardware/the-cpc-revision-zero-article/msg243769/ Source]&lt;br /&gt;
&lt;br /&gt;
The way to cause the RAM refresh to fail in both a Plus or normal CPC is simply to stop a few bits of the CRTC address changing (ie. never refresh the selected area).&lt;br /&gt;
&lt;br /&gt;
Generally, only the Row address needs to be cycled, so stopping MA0 through MA7 from changing, and stopping the CPU from reading those rows, will cause data to be lost, quite quickly (generally around 4ms). [https://www.cpcwiki.eu/forum/amstrad-cpc-hardware/memory-refresh-plus/ Source]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Interrupt generation ==&lt;br /&gt;
&lt;br /&gt;
Interrupts on the CPC are created by the Gate Array based on settings from the CRTC. The Gate Array has an internal counter R52 (the R is for Raster) that counts from 0 to 51, incrementing after each HSYNC signal.&lt;br /&gt;
&lt;br /&gt;
On all CRTCs, R52 interrupts always start 1µs after the end of an HSYNC. But on CRTCs 3/4, HSYNCs occur 1µs later than on CRTCs 0/1/2. Which means that on CRTCs 3/4, interrupts start 1µs later than on CRTCs 0/1/2. This can be adjusted by using the CRTC register 3.&lt;br /&gt;
&lt;br /&gt;
R52 will return to 0 and the Gate Array will send an interrupt request on any of these conditions:&lt;br /&gt;
* When it exceeds 51&lt;br /&gt;
* By setting bit4 of the RMR register of the Gate Array to 1&lt;br /&gt;
* At the end of the 2nd HSYNC after the start of the VSYNC&lt;br /&gt;
&lt;br /&gt;
When the Gate Array sends an interrupt request:&lt;br /&gt;
*If the interrupts were authorized at the time of the request, then bit5 of R52 is cleared (but R52 was reset to 0 anyway) and the interrupt takes place&lt;br /&gt;
*If interrupts are not authorized, then the R52 counter continues to increment and the interrupt remains armed (the Gate Array then maintains its INT signal). When interrupts are enabled (using the EI instruction), bit5 of R52 is cleared and the interrupt takes place. This happens only '''after the instruction that follows EI''' as this Z80 instruction has a 1-instruction delay.&lt;br /&gt;
&lt;br /&gt;
[https://shaker.logonsystem.eu/ACCC1.8-EN.pdf Source]&lt;br /&gt;
&lt;br /&gt;
Note: On Amstrad Plus, the interrupt management system is seriously beefed up. See the [[ASIC]] wiki page.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== CSYNC signal ==&lt;br /&gt;
&lt;br /&gt;
The HSYNC and VSYNC signals are received from the [[CRTC]]. These signals are then modified by the Gate Array to C-HSYNC and C-VSYNC and merged into a single CSYNC signal that will be sent to the display.&lt;br /&gt;
&lt;br /&gt;
When CRTC HSYNC is active, the Gate Array immediately outputs the palette colour black. If the HSYNC is set to 14 characters then black will be output for 14µs.&lt;br /&gt;
&lt;br /&gt;
If a graphics mode change is pending, the HSYNC pulse width needs to be at least 2µs for Gate Array to change the graphics mode.&lt;br /&gt;
&lt;br /&gt;
C-HSYNC begins 2µs after activation of the CRTC HSYNC and stays a maximum of 4µs (signal is cut short if HSYNC width is greater than 6).&lt;br /&gt;
&lt;br /&gt;
For example, if CRTC R2=46, and CRTC HSYNC width is 14 chars then C-HSYNC starts at 48 and lasts only until 51 included.&lt;br /&gt;
&lt;br /&gt;
On Gate Array, even if the duration of the CRTC VSYNC is reduced to 2 µseconds, the Gate Array will always output black for 26 lines with 4 lines of C-VSYNC to the monitor. While on ASIC/Pre-ASIC, the CRTC VSYNC must be active as long as the C-VSYNC signal is sent to the monitor.&lt;br /&gt;
&lt;br /&gt;
The Gate Array (and ASIC/Pre-ASIC) uses 2 internal counters to create its CSYNC signal:&lt;br /&gt;
* H06 counts the number of CRTC characters processed during an HSYNC. H06 is incremented by the Gate Array for each CRTC character when CRTC HSYNC is active. The Gate Array activates the C-HSYNC signal when H06 reaches 2, and changes its graphics mode if a change was pending. It deactivates this signal when H06 reaches 6.&lt;br /&gt;
* V26 counts the number of HSYNCs occuring during a VSYNC. V26 is incremented by the Gate Array when the CRTC signals an end of HSYNC. The Gate Array activates the C-VSYNC signal when V26 reaches 2 (and if VSYNC is active on ASIC/Pre-ASIC). It deactivates this signal when V26 reaches 6. After the 26th line has been processed, the Gate Array stops outputting the palette colour black.&lt;br /&gt;
&lt;br /&gt;
If CRTC VSYNC is activated again while V26 is still in progress, then V26 is reset to 0 and starts counting up again the HSYNC pulses.&lt;br /&gt;
&lt;br /&gt;
The HSYNC signal from the CRTC is 0 when inactive and 1 when active. Same for VSYNC.&lt;br /&gt;
&lt;br /&gt;
C-HSYNC and C-VSYNC are composited using the XNOR function. The resulting CSYNC signal produced by the Gate Array is 1 when inactive and 0 when active.&lt;br /&gt;
&lt;br /&gt;
On a CPC monitor, the CSYNC is rendered in &amp;quot;absolute black&amp;quot;. It is darker than the palette colour black output by the Gate Array. The electron beam is basically turned off. Turning up the brightness level won't make it any brighter.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Controlling the Gate Array  ==&lt;br /&gt;
&lt;br /&gt;
The gate array is controlled by I/O. The gate array is selected when bit 15 of the I/O port address is set to &amp;quot;0&amp;quot; and bit 14 of the I/O port address is set to &amp;quot;1&amp;quot;. The values of the other bits are ignored. However, to avoid conflict with other devices in the system, these bits should be set to &amp;quot;1&amp;quot;. &lt;br /&gt;
&lt;br /&gt;
The recommended I/O port address is &amp;amp;7Fxx. &lt;br /&gt;
&lt;br /&gt;
The Gate Array is not connected to the CPU's RD and WR pins, so it cannot detect the bus's I/O direction. If you execute an I/O read operation on the Gate Array I/O address, the Gate Array will read an unpredictable value from the databus which will be in high-impedance state. If the value is a valid Gate Array command, it will be executed, otherwise nothing will happen. [https://www.grimware.org/doku.php/documentations/devices/gatearraydo=export_xhtml Source]&lt;br /&gt;
&lt;br /&gt;
The function to be performed is selected by writing data to the Gate Array, the first bits of the data define the function selected (see table below). It is not possible to read from the Gate Array. &lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!colspan=4| 8bit command&lt;br /&gt;
!rowspan=2| Machine&lt;br /&gt;
!rowspan=2| Register&lt;br /&gt;
!rowspan=2| Description&lt;br /&gt;
!rowspan=2| Chip&lt;br /&gt;
|-&lt;br /&gt;
! 7&lt;br /&gt;
! 6&lt;br /&gt;
! 5&lt;br /&gt;
! 4..0&lt;br /&gt;
|-&lt;br /&gt;
| 0 || 0 || x || style=&amp;quot;text-align: center;&amp;quot; | n || All || PENR || Select a color register || Gate Array&lt;br /&gt;
|-&lt;br /&gt;
| 0 || 1 || x || style=&amp;quot;text-align: center;&amp;quot; | n || All || INKR || Change the value of the currently selected color register || Gate Array&lt;br /&gt;
|-&lt;br /&gt;
| 1 || 0 || 0 || style=&amp;quot;text-align: center;&amp;quot; | n || All || RMR || Control Interrupt counter, ROM mapping and Graphics mode || Gate Array&lt;br /&gt;
|-&lt;br /&gt;
| rowspan=&amp;quot;2&amp;quot;|1 || rowspan=&amp;quot;2&amp;quot;|0 || rowspan=&amp;quot;2&amp;quot;|1 || style=&amp;quot;text-align: center;&amp;quot; rowspan=&amp;quot;2&amp;quot; | n || All || RMR || ''Ghost register'' || Gate Array (CPC) or locked ASIC (Plus)&lt;br /&gt;
|-&lt;br /&gt;
| Plus || RMR2 || ASIC &amp;amp; Advanced ROM mapping || Unlocked ASIC&lt;br /&gt;
|-&lt;br /&gt;
| 1 || 1 ||colspan=2  style=&amp;quot;text-align: center;&amp;quot; | n || All || MMR || RAM memory mapping || PAL (only with 128KB or RAM expansion)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
The MMR register is not available in the Gate Array, but is performed by a device at the same I/O port address location.&lt;br /&gt;
&lt;br /&gt;
In the CPC464, CPC664 and KC compact, MMR is performed in an external memory expansion (e.g. Dk'Tronics 64K RAM Expansion), if this expansion is not present then MMR is not available.&lt;br /&gt;
&lt;br /&gt;
In the CPC6128, MMR is performed by a [[PAL16L8|PAL chip]] located on the main PCB, or an external memory expansion.&lt;br /&gt;
&lt;br /&gt;
In the 464+ and 6128+, MMR is performed by the ASIC or an external memory expansion. Please read the document on RAM management for more information.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Registers ==&lt;br /&gt;
&lt;br /&gt;
Note: The Plus palette capabilities are only accessible through the [[Default I/O Port Summary|ASIC I/O page]]. Registers PENR and INKR are not needed in that case.&lt;br /&gt;
&lt;br /&gt;
=== Register PENR (Select a color register) ===&lt;br /&gt;
&lt;br /&gt;
When bit 7 and bit 6 are set to &amp;quot;0&amp;quot;, the remaining bits determine which pen is to have its colour changed. When bit 4 is set to &amp;quot;0&amp;quot;, bits 3 to 0 define which pen is to be selected. When bit 4 is set to &amp;quot;1&amp;quot;, the value contained in bits 3-0 is ignored and the border is selected. &lt;br /&gt;
&lt;br /&gt;
The pen remains selected until another is chosen. &lt;br /&gt;
&lt;br /&gt;
Each mode has a fixed number of pens. Mode 0 has 16 pens, mode 1 has 4 pens and mode 2 has 2 pens. &lt;br /&gt;
&lt;br /&gt;
==== Summary  ====&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!Bit&lt;br /&gt;
!Value&lt;br /&gt;
!Function&lt;br /&gt;
|-&lt;br /&gt;
| 7 || 0 || rowspan=&amp;quot;2&amp;quot; | Gate Array PENR register&lt;br /&gt;
|-&lt;br /&gt;
| 6 || 0 &lt;br /&gt;
|-&lt;br /&gt;
| 5 || - || not used&lt;br /&gt;
|-&lt;br /&gt;
| 4 || 1 || Select border&lt;br /&gt;
|-&lt;br /&gt;
| 3 || x || rowspan=&amp;quot;4&amp;quot; | Ignored&lt;br /&gt;
|-&lt;br /&gt;
| 2 || x&lt;br /&gt;
|-&lt;br /&gt;
| 1 || x&lt;br /&gt;
|-&lt;br /&gt;
| 0 || x&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!Bit&lt;br /&gt;
!Value&lt;br /&gt;
!Function&lt;br /&gt;
|-&lt;br /&gt;
| 7 || 0 || rowspan=&amp;quot;2&amp;quot; | Gate Array PENR register&lt;br /&gt;
|-&lt;br /&gt;
| 6 || 0&lt;br /&gt;
|-&lt;br /&gt;
| 5 || - || not used&lt;br /&gt;
|-&lt;br /&gt;
| 4 || 0 || Select pen&lt;br /&gt;
|-&lt;br /&gt;
| 3 || x || rowspan=&amp;quot;4&amp;quot; | Pen number&lt;br /&gt;
|-&lt;br /&gt;
| 2 || x&lt;br /&gt;
|-&lt;br /&gt;
| 1 || x&lt;br /&gt;
|-&lt;br /&gt;
| 0 || x&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Register INKR (Change the value of the currently selected color register) ===&lt;br /&gt;
&lt;br /&gt;
Once the pen has been selected its colour can then be changed. Bits 4 to 0 specify the hardware colour number from the hardware colour palette. &lt;br /&gt;
&lt;br /&gt;
Even though there is provision for 32 colours, only 27 are possible. The remaining colours are duplicates of those already in the colour palette. &lt;br /&gt;
&lt;br /&gt;
==== Summary  ====&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!Bit&lt;br /&gt;
!Value&lt;br /&gt;
!Function&lt;br /&gt;
|-&lt;br /&gt;
| 7 || 0 || rowspan=&amp;quot;2&amp;quot; | Gate Array INKR register&lt;br /&gt;
|-&lt;br /&gt;
| 6 || 1&lt;br /&gt;
|-&lt;br /&gt;
| 5 || - || not used&lt;br /&gt;
|-&lt;br /&gt;
| 4 || x || rowspan=&amp;quot;5&amp;quot; | Colour number x&lt;br /&gt;
|-&lt;br /&gt;
| 3 || x &lt;br /&gt;
|-&lt;br /&gt;
| 2 || x &lt;br /&gt;
|-&lt;br /&gt;
| 1 || x&lt;br /&gt;
|-&lt;br /&gt;
| 0 || x&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Register RMR (Control Interrupt counter, ROM mapping and Graphics mode) ===&lt;br /&gt;
&lt;br /&gt;
This is a general purpose register responsible for the [[Video modes|graphics mode]] and the ROM configuration. &lt;br /&gt;
&lt;br /&gt;
==== Graphics mode selection  ====&lt;br /&gt;
&lt;br /&gt;
The function of bits 1 and 0 is to define the screen mode. The settings for bits 1 and 0 and the corresponding screen mode are given in the table below. &lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!Bit 1&lt;br /&gt;
!Bit 0&lt;br /&gt;
!Screen mode&lt;br /&gt;
|-&lt;br /&gt;
| 0 || 0 || Mode 0, 160x200 resolution, 16 colours&lt;br /&gt;
|-&lt;br /&gt;
| 0 || 1 || Mode 1, 320x200 resolution, 4 colours&lt;br /&gt;
|-&lt;br /&gt;
| 1 || 0 || Mode 2, 640x200 resolution, 2 colours&lt;br /&gt;
|-&lt;br /&gt;
| 1 || 1 || Mode 3, 160x200 resolution, 4 colours (undocumented)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
* Mode 3 is not official. From the combinations possible, we can see that 4 modes can be defined, although the Amstrad only has 3. Mode 3 is similar to mode 0, because it has the same resolution, but it is limited to only 4 colours. Mode 3 is not supported by the [[KC Compact]] (which outputs black in Mode 3).&lt;br /&gt;
&lt;br /&gt;
Mode changing is synchronised with HSYNC. If the mode is changed, it will take effect from the next HSYNC.&lt;br /&gt;
&lt;br /&gt;
==== ROM configuration selection  ====&lt;br /&gt;
&lt;br /&gt;
Bit 2 is used to enable or disable the lower ROM area. The lower ROM area occupies memory addresses &amp;amp;amp;0000-&amp;amp;amp;3fff and is used to access the operating system ROM. When the lower ROM area is is enabled, reading from &amp;amp;amp;0000-&amp;amp;amp;3FFF will return data in the ROM. When a value is written to &amp;amp;amp;0000-&amp;amp;amp;3FFF, it will be written to the RAM underneath the ROM. When it is disabled, data read from &amp;amp;amp;0000-&amp;amp;amp;3FFF will return the data in the RAM. &lt;br /&gt;
&lt;br /&gt;
Similarly, bit 3 controls enabling or disabling of the upper ROM area. The upper ROM area occupies memory addressess &amp;amp;amp;C000-&amp;amp;amp;FFFF and is BASIC or any expansion ROMs which may be plugged into a ROM board/box. See the document on [[Upper ROM Bank Number|upper rom selection]] for more details. When the upper ROM area enabled, reading from &amp;amp;amp;c000-&amp;amp;amp;ffff, will return data in the ROM. When data is written to &amp;amp;amp;c000-&amp;amp;amp;FFFF, it will be written to the RAM at the same address as the ROM. When the upper ROM area is disabled, and data is read from &amp;amp;amp;c000-&amp;amp;amp;ffff it will be the data in the RAM. &lt;br /&gt;
&lt;br /&gt;
Bit 4 controls the interrupt generation. It can be used to delay interrupts. See the document on interrupt generation for more information.&lt;br /&gt;
&lt;br /&gt;
==== Summary  ====&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!Bit&lt;br /&gt;
!Value&lt;br /&gt;
!Function&lt;br /&gt;
|-&lt;br /&gt;
| 7 || 1 || rowspan=&amp;quot;2&amp;quot; | Gate Array RMR register&lt;br /&gt;
|-&lt;br /&gt;
| 6 || 0 &lt;br /&gt;
|-&lt;br /&gt;
| 5 || - || ''must be 0 on Plus machines with ASIC unlocked''&lt;br /&gt;
|-&lt;br /&gt;
| 4 || x || Interrupt generation control&lt;br /&gt;
|-&lt;br /&gt;
| 3 || x || 1=Upper ROM area disable, 0=Upper ROM area enable&lt;br /&gt;
|-&lt;br /&gt;
| 2 || x || 1=Lower ROM area disable, 0=Lower ROM area enable&lt;br /&gt;
|-&lt;br /&gt;
| 1 || x || rowspan=&amp;quot;2&amp;quot; | Graphics Mode selection&lt;br /&gt;
|-&lt;br /&gt;
| 0 || x&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Register RMR2 (ASIC &amp;amp; Advanced ROM mapping) ===&lt;br /&gt;
&lt;br /&gt;
This register exists only in Plus or GX4000, and is only accessible when the ASIC is unlocked.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!Bit&lt;br /&gt;
!Value&lt;br /&gt;
!Function&lt;br /&gt;
|-&lt;br /&gt;
| 7 || 1 || rowspan=&amp;quot;3&amp;quot; | Gate Array RMR2 register&lt;br /&gt;
|-&lt;br /&gt;
| 6 || 0&lt;br /&gt;
|-&lt;br /&gt;
| 5 || 1&lt;br /&gt;
|-&lt;br /&gt;
| 4 || x || rowspan=&amp;quot;2&amp;quot; |RMR addressing mode&lt;br /&gt;
|-&lt;br /&gt;
| 3 || x&lt;br /&gt;
|-&lt;br /&gt;
| 2 || x || rowspan=&amp;quot;3&amp;quot; | Physical ROM number (0..7)&lt;br /&gt;
|-&lt;br /&gt;
| 1 || x&lt;br /&gt;
|-&lt;br /&gt;
| 0 || x&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ RMR addressing modes&lt;br /&gt;
!Bit 4&lt;br /&gt;
!Bit 3&lt;br /&gt;
!Lower ROM&lt;br /&gt;
![[ASIC|ASIC I/O page]]&lt;br /&gt;
|-&lt;br /&gt;
|0&lt;br /&gt;
|0&lt;br /&gt;
|&amp;amp;0000-&amp;amp;3FFF&lt;br /&gt;
|Disabled&lt;br /&gt;
|-&lt;br /&gt;
|0&lt;br /&gt;
|1&lt;br /&gt;
|&amp;amp;4000-&amp;amp;7FFF&lt;br /&gt;
|Disabled&lt;br /&gt;
|-&lt;br /&gt;
|1&lt;br /&gt;
|0&lt;br /&gt;
|&amp;amp;8000-&amp;amp;BFFF&lt;br /&gt;
|Disabled&lt;br /&gt;
|-&lt;br /&gt;
|1&lt;br /&gt;
|1&lt;br /&gt;
|&amp;amp;0000-&amp;amp;3FFF&lt;br /&gt;
|&amp;amp;4000-&amp;amp;7FFF&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
The physical ROMs are also accessible as upper ROMs by using the [[Upper ROM Bank Number]] port and the RMR register.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Register MMR (RAM memory mapping) ===&lt;br /&gt;
&lt;br /&gt;
This register exists only in CPCs with 128K RAM (like the CPC 6128), or CPCs equipped with [[Standard Memory Expansions]].&lt;br /&gt;
&lt;br /&gt;
Note: In the CPC 6128, the register is a separate [[PAL16L8|PAL chip]] that assists the Gate Array chip.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!Bit&lt;br /&gt;
!Value&lt;br /&gt;
!Function&lt;br /&gt;
|-&lt;br /&gt;
| 7 || 1 || rowspan=&amp;quot;2&amp;quot; | Gate Array MMR register&lt;br /&gt;
|-&lt;br /&gt;
| 6 || 1 &lt;br /&gt;
|-&lt;br /&gt;
| 5 || x || rowspan=&amp;quot;3&amp;quot; |64K bank number (0..7); always 0 on an unexpanded CPC6128, 0-7 on [[Standard Memory Expansions]]&lt;br /&gt;
|-&lt;br /&gt;
| 4 || x&lt;br /&gt;
|-&lt;br /&gt;
| 3 || x&lt;br /&gt;
|-&lt;br /&gt;
| 2 || x || rowspan=&amp;quot;3&amp;quot; | RAM Config (0..7)&lt;br /&gt;
|-&lt;br /&gt;
| 1 || x&lt;br /&gt;
|-&lt;br /&gt;
| 0 || x&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
The 3bit RAM Config value is used to access the second 64K of the total 128K RAM that is built into the CPC 6128 or the additional 64K-512K of standard memory expansions. These contain up to eight 64K ram banks, which are selected with bit 3-5. A standard CPC 6128 only contains bank 0. Normally the register is set to 0, so that only the first 64K RAM are used (identical to the CPC 464 and 664 models). The register can be used to select between the following eight predefined configurations only:&lt;br /&gt;
&lt;br /&gt;
  -Address-     0      1      2      3      4      5      6      7&lt;br /&gt;
  0000-3FFF   RAM_0  RAM_0  '''RAM_4'''  RAM_0  RAM_0  RAM_0  RAM_0  RAM_0&lt;br /&gt;
  4000-7FFF   RAM_1  RAM_1  '''RAM_5'''  '''RAM_3'''  '''RAM_4'''  '''RAM_5'''  '''RAM_6'''  '''RAM_7'''&lt;br /&gt;
  8000-BFFF   RAM_2  RAM_2  '''RAM_6'''  RAM_2  RAM_2  RAM_2  RAM_2  RAM_2&lt;br /&gt;
  C000-FFFF   RAM_3  '''RAM_7'''  '''RAM_7'''  '''RAM_7'''  RAM_3  RAM_3  RAM_3  RAM_3&lt;br /&gt;
&lt;br /&gt;
The Video RAM is always located in the first 64K, VRAM is in no way affected by this register.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Programming the Gate Array - Examples  ==&lt;br /&gt;
&lt;br /&gt;
Defining the colours, &amp;lt;br&amp;gt;Setting pen 0 to Bright White. &lt;br /&gt;
&amp;lt;pre&amp;gt;LD BC,7F00&amp;amp;nbsp;;Gate Array port&lt;br /&gt;
LD A,%00000000+0&amp;amp;nbsp;;Pen number (and Gate Array function)&lt;br /&gt;
OUT (C),A&amp;amp;nbsp;;Send pen number&lt;br /&gt;
LD A,%01000000+11&amp;amp;nbsp;;Pen colour (and Gate Array function)&lt;br /&gt;
OUT (C),A&amp;amp;nbsp;;Send it&lt;br /&gt;
RET&lt;br /&gt;
&lt;br /&gt;
Setting the mode and ROM configuration, &lt;br /&gt;
Mode 2, upper and lower ROM disabled.&lt;br /&gt;
&lt;br /&gt;
LD BC,7F00&amp;amp;nbsp;;Gate array port&lt;br /&gt;
LD A,%10000000+%00001110&amp;amp;nbsp;;Mode and ROM selection (and Gate Array function)&lt;br /&gt;
OUT (C),A&amp;amp;nbsp;;Send it&lt;br /&gt;
RET&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Misc ===&lt;br /&gt;
&lt;br /&gt;
The hardware colour number is different to the colour range used by the firmware, so a conversion chart is provided for the corresponding firmware/hardware colour values and the corresponding colour name. &lt;br /&gt;
&lt;br /&gt;
=== Note ===&lt;br /&gt;
&lt;br /&gt;
The firmware keeps track of the colours it is using. Every VSYNC (assuming interrupts are enabled) the firmware sets the colours. This enables the user to have flashing colours. If the user selects a new colour using the gate array, the new colour will flash temporarily and then return to its original colour. This is due to the firmware resetting the colour. When using the firmware, use its routines to select the colour, and the colour will remain.&lt;br /&gt;
&lt;br /&gt;
Example: [For whatever reason, this example does NOT refer to the above firmware stuff]&lt;br /&gt;
&amp;lt;pre&amp;gt;ld bc,7f00+1&amp;amp;nbsp;;Gate array function (set pen)&lt;br /&gt;
;and pen number&lt;br /&gt;
out (c),c&lt;br /&gt;
ld bc,7f00&amp;amp;nbsp;;41 &lt;br /&gt;
;Gate array function (set colour)&lt;br /&gt;
;and colour number&lt;br /&gt;
out (c),c&lt;br /&gt;
ret&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Video memory structure ==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!rowspan=2|Graphics Mode&lt;br /&gt;
!colspan=8|VRAM byte&lt;br /&gt;
!colspan=8|Displayed Pixels&lt;br /&gt;
!rowspan=2|Definition&lt;br /&gt;
!rowspan=2|Pixel clock&lt;br /&gt;
!rowspan=2|Default resolution&lt;br /&gt;
|-&lt;br /&gt;
!7&lt;br /&gt;
!6&lt;br /&gt;
!5&lt;br /&gt;
!4&lt;br /&gt;
!3&lt;br /&gt;
!2&lt;br /&gt;
!1&lt;br /&gt;
!0&lt;br /&gt;
!1&lt;br /&gt;
!2&lt;br /&gt;
!3&lt;br /&gt;
!4&lt;br /&gt;
!5&lt;br /&gt;
!6&lt;br /&gt;
!7&lt;br /&gt;
!8&lt;br /&gt;
|-&lt;br /&gt;
|0&lt;br /&gt;
|A0&lt;br /&gt;
|B0&lt;br /&gt;
|A2&lt;br /&gt;
|B2&lt;br /&gt;
|A1&lt;br /&gt;
|B1&lt;br /&gt;
|A3&lt;br /&gt;
|B3&lt;br /&gt;
|colspan=4 style=&amp;quot;text-align: center;&amp;quot;|A&lt;br /&gt;
|colspan=4 style=&amp;quot;text-align: center;&amp;quot;|B&lt;br /&gt;
|2 pixels in 16 colours&lt;br /&gt;
|4 MHz&lt;br /&gt;
|160x200, 20-column text&lt;br /&gt;
|-&lt;br /&gt;
|1&lt;br /&gt;
|A0&lt;br /&gt;
|B0&lt;br /&gt;
|C0&lt;br /&gt;
|D0&lt;br /&gt;
|A1&lt;br /&gt;
|B1&lt;br /&gt;
|C1&lt;br /&gt;
|D1&lt;br /&gt;
|colspan=2 style=&amp;quot;text-align: center;&amp;quot;|A&lt;br /&gt;
|colspan=2 style=&amp;quot;text-align: center;&amp;quot;|B&lt;br /&gt;
|colspan=2 style=&amp;quot;text-align: center;&amp;quot;|C&lt;br /&gt;
|colspan=2 style=&amp;quot;text-align: center;&amp;quot;|D&lt;br /&gt;
|4 pixels in 4 colours&lt;br /&gt;
|8 MHz&lt;br /&gt;
|320x200, 40-column text&lt;br /&gt;
|-&lt;br /&gt;
|2&lt;br /&gt;
|A0&lt;br /&gt;
|B0&lt;br /&gt;
|C0&lt;br /&gt;
|D0&lt;br /&gt;
|E0&lt;br /&gt;
|F0&lt;br /&gt;
|G0&lt;br /&gt;
|H0&lt;br /&gt;
|A&lt;br /&gt;
|B&lt;br /&gt;
|C&lt;br /&gt;
|D&lt;br /&gt;
|E&lt;br /&gt;
|F&lt;br /&gt;
|G&lt;br /&gt;
|H&lt;br /&gt;
|8 pixels in 2 colours&lt;br /&gt;
|16 MHz&lt;br /&gt;
|640x200, 80-column text&lt;br /&gt;
|-&lt;br /&gt;
|3&lt;br /&gt;
|A0&lt;br /&gt;
|B0&lt;br /&gt;
|x&lt;br /&gt;
|x&lt;br /&gt;
|A1&lt;br /&gt;
|B1&lt;br /&gt;
|x&lt;br /&gt;
|x&lt;br /&gt;
|colspan=4 style=&amp;quot;text-align: center;&amp;quot;|A&lt;br /&gt;
|colspan=4 style=&amp;quot;text-align: center;&amp;quot;|B&lt;br /&gt;
|2 pixels in 4 colours&lt;br /&gt;
|4 MHz&lt;br /&gt;
|160x200, 20-column text&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Split rasters ==&lt;br /&gt;
&lt;br /&gt;
On the CPC, split rasters occur halfway (after the 8th mode2 pixel) through the rendering of a CRTC character.&lt;br /&gt;
&lt;br /&gt;
On Amstrad Plus, split rasters occur quarter of the way (after the 4th mode2 pixel) through the rendering of a CRTC character.&lt;br /&gt;
&lt;br /&gt;
To easily make split rasters compatible with both the CPC and the Plus machines, one can use the ASIC soft-scroll control register (SSCR) to finely adjust the horizontal position of the graphics.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Palette R,G,B definitions ==&lt;br /&gt;
&lt;br /&gt;
There are 27 colours which are generated from red, green and blue mixed in different quantities. There are 3 levels of red, 3 levels of green and 3 levels of blue, and these can be thought of as off/no colour, half-on/half-colour, and on/full-colour. &lt;br /&gt;
&lt;br /&gt;
To display a CPC image you will need to use a analogue monitor with a composite sync.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Palette sorted by Firmware Colour Numbers ===&lt;br /&gt;
&lt;br /&gt;
The firmware colour palette is sorted by luminance value.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
|-&lt;br /&gt;
!Firmware Number&lt;br /&gt;
!Hardware Number&lt;br /&gt;
!Colour Name&lt;br /&gt;
!R %&lt;br /&gt;
!G %&lt;br /&gt;
!B %&lt;br /&gt;
!ASIC&lt;br /&gt;
!Colour&lt;br /&gt;
|-&lt;br /&gt;
| 0|| 54h          ||Black          ||  0||  0||  0|| #000||bgcolor=&amp;quot;#000000&amp;quot;|&lt;br /&gt;
|-&lt;br /&gt;
| 1|| 44h (or 50h) ||Blue           ||  0||  0|| 50|| #006||bgcolor=&amp;quot;#000080&amp;quot;|&lt;br /&gt;
|-&lt;br /&gt;
| 2|| 55h          ||Bright Blue    ||  0||  0||100|| #00F||bgcolor=&amp;quot;#0000ff&amp;quot;|&lt;br /&gt;
|-&lt;br /&gt;
| 3|| 5Ch          ||Red            || 50||  0||  0|| #600||bgcolor=&amp;quot;#800000&amp;quot;|&lt;br /&gt;
|-&lt;br /&gt;
| 4|| 58h          ||Magenta        || 50||  0|| 50|| #606||bgcolor=&amp;quot;#800080&amp;quot;|&lt;br /&gt;
|-&lt;br /&gt;
| 5|| 5Dh          ||Mauve          || 50||  0||100|| #60F||bgcolor=&amp;quot;#8000ff&amp;quot;|&lt;br /&gt;
|-&lt;br /&gt;
| 6|| 4Ch          ||Bright Red     ||100||  0||  0|| #F00||bgcolor=&amp;quot;#ff0000&amp;quot;|&lt;br /&gt;
|-&lt;br /&gt;
| 7|| 45h (or 48h) ||Purple         ||100||  0|| 50|| #F06||bgcolor=&amp;quot;#ff0080&amp;quot;|&lt;br /&gt;
|-&lt;br /&gt;
| 8|| 4Dh          ||Bright Magenta ||100||  0||100|| #F0F||bgcolor=&amp;quot;#ff00ff&amp;quot;|&lt;br /&gt;
|-&lt;br /&gt;
| 9|| 56h          ||Green          ||  0|| 50||  0|| #060||bgcolor=&amp;quot;#008000&amp;quot;|&lt;br /&gt;
|-&lt;br /&gt;
|10|| 46h          ||Cyan           ||  0|| 50|| 50|| #066||bgcolor=&amp;quot;#008080&amp;quot;|&lt;br /&gt;
|-&lt;br /&gt;
|11|| 57h          ||Sky Blue       ||  0|| 50||100|| #06F||bgcolor=&amp;quot;#0080ff&amp;quot;|&lt;br /&gt;
|-&lt;br /&gt;
|12|| 5Eh          ||Yellow         || 50|| 50||  0|| #660||bgcolor=&amp;quot;#808000&amp;quot;|&lt;br /&gt;
|-&lt;br /&gt;
|13|| 40h (or 41h) ||White          || 50|| 50|| 50||#666||bgcolor=&amp;quot;#808080&amp;quot;|&lt;br /&gt;
|-&lt;br /&gt;
|14|| 5Fh          ||Pastel Blue    || 50|| 50||100|| #66F||bgcolor=&amp;quot;#8080ff&amp;quot;|&lt;br /&gt;
|-&lt;br /&gt;
|15|| 4Eh          ||Orange         ||100|| 50||  0|| #F60|| bgcolor=&amp;quot;#ff8000&amp;quot;|&lt;br /&gt;
|-&lt;br /&gt;
|16|| 47h          ||Pink           ||100|| 50|| 50|| #F66||bgcolor=&amp;quot;#ff8080&amp;quot;|&lt;br /&gt;
|-&lt;br /&gt;
|17|| 4Fh          ||Pastel Magenta ||100|| 50||100|| #F6F||bgcolor=&amp;quot;#ff80ff&amp;quot;|&lt;br /&gt;
|-&lt;br /&gt;
|18|| 52h          ||Bright Green   ||  0||100||  0|| #0F0||bgcolor=&amp;quot;#00ff00&amp;quot;|&lt;br /&gt;
|-&lt;br /&gt;
|19|| 42h (or 51h) ||Sea Green      ||  0||100|| 50|| #0F6||bgcolor=&amp;quot;#00ff80&amp;quot;|&lt;br /&gt;
|-&lt;br /&gt;
|20|| 53h          ||Bright Cyan    ||  0||100||100|| #0FF||bgcolor=&amp;quot;#00ffff&amp;quot;|&lt;br /&gt;
|-&lt;br /&gt;
|21|| 5Ah          ||Lime           || 50||100||  0|| #6F0||bgcolor=&amp;quot;#80ff00&amp;quot;|&lt;br /&gt;
|-&lt;br /&gt;
|22|| 59h          ||Pastel Green   || 50||100|| 50|| #6F6||bgcolor=&amp;quot;#80ff80&amp;quot;|&lt;br /&gt;
|-&lt;br /&gt;
|23|| 5Bh          ||Pastel Cyan    || 50||100||100|| #6FF||bgcolor=&amp;quot;#80ffff&amp;quot;|&lt;br /&gt;
|-&lt;br /&gt;
|24|| 4Ah          ||Bright Yellow  ||100||100||  0|| #FF0||bgcolor=&amp;quot;#ffff00&amp;quot;|&lt;br /&gt;
|-&lt;br /&gt;
|25|| 43h (or 49h) ||Pastel Yellow  ||100||100|| 50||#FF6||bgcolor=&amp;quot;#ffff80&amp;quot;|&lt;br /&gt;
|-&lt;br /&gt;
|26|| 4Bh          ||Bright White   ||100||100||100|| #FFF||bgcolor=&amp;quot;#ffffff&amp;quot;|&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Note: We can observe that the official Amstrad names of some colours are a bit silly: &amp;quot;red&amp;quot; is in fact brown, &amp;quot;yellow&amp;quot; is in fact khaki and &amp;quot;white&amp;quot; is in fact grey.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Amstrad Colour Names ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;gallery&amp;gt;&lt;br /&gt;
Cpc 6128 master colour chat.jpg|Master colour chart&lt;br /&gt;
Cpc 6128 farbtabelle.jpg|Farbtabelle&lt;br /&gt;
Cpc 6128 palette des couleurs.jpg|Palette des couleurs&lt;br /&gt;
Cpc 6128 tabla de colores.jpg|Tabla de colores&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Palette sorted by Hardware Colour Numbers ===&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!Hardware Number&lt;br /&gt;
!Firmware Number&lt;br /&gt;
!R %&lt;br /&gt;
!G %&lt;br /&gt;
!B %&lt;br /&gt;
!ASIC&lt;br /&gt;
!Colour&lt;br /&gt;
!Colour Name&lt;br /&gt;
!German Name&lt;br /&gt;
!French Name&lt;br /&gt;
!Spanish Name&lt;br /&gt;
|-&lt;br /&gt;
|  0 (40h) || 13   || 50|| 50|| 50|| #666|| bgcolor=&amp;quot;#808080&amp;quot; | || White         || Weiß            || Blanc           || Blanco&lt;br /&gt;
|-&lt;br /&gt;
|  1 (41h) || (13) || 50|| 50|| 50|| #666|| bgcolor=&amp;quot;#808080&amp;quot; | || White         || Weiß            || Blanc           || Blanco&lt;br /&gt;
|-&lt;br /&gt;
|  2 (42h) || 19   ||  0||100|| 50|| #0F6|| bgcolor=&amp;quot;#00ff80&amp;quot; | || Sea Green     || Seegrün         || Vert marin      || Verde marino&lt;br /&gt;
|-&lt;br /&gt;
|  3 (43h) || 25   ||100||100|| 50|| #FF6|| bgcolor=&amp;quot;#ffff80&amp;quot; | || Pastel Yellow || Pastellgelb     || Jaune pastel    || Amarillo pastel&lt;br /&gt;
|-&lt;br /&gt;
|  4 (44h) || 1    ||  0||  0|| 50|| #006|| bgcolor=&amp;quot;#000080&amp;quot; | || Blue          || Blau            || Bleu            || Azul&lt;br /&gt;
|-&lt;br /&gt;
|  5 (45h) || 7    ||100||  0|| 50|| #F06|| bgcolor=&amp;quot;#ff0080&amp;quot; | || Purple        || Purpur          || Pourpre         || Púrpura&lt;br /&gt;
|-&lt;br /&gt;
|  6 (46h) || 10   ||  0|| 50|| 50|| #066|| bgcolor=&amp;quot;#008080&amp;quot; | || Cyan          || Blaugrün        || Turquoise       || Ciano&lt;br /&gt;
|-&lt;br /&gt;
|  7 (47h) || 16   ||100|| 50|| 50|| #F66|| bgcolor=&amp;quot;#ff8080&amp;quot; | || Pink          || Rosa            || Rose            || Rosa&lt;br /&gt;
|-&lt;br /&gt;
|  8 (48h) || (7)  ||100||  0|| 50|| #F06|| bgcolor=&amp;quot;#ff0080&amp;quot; | || Purple        || Purpur          || Pourpre         || Púrpura&lt;br /&gt;
|-&lt;br /&gt;
|  9 (49h) || (25) ||100||100|| 50|| #FF6|| bgcolor=&amp;quot;#ffff80&amp;quot; | || Pastel Yellow || Pastellgelb     || Jaune pastel    || Amarillo pastel&lt;br /&gt;
|-&lt;br /&gt;
| 10 (4Ah) || 24   ||100||100||  0|| #FF0|| bgcolor=&amp;quot;#ffff00&amp;quot; | || Bright Yellow || Hellgelb        || Jaune vif       || Amarillo brillante&lt;br /&gt;
|-&lt;br /&gt;
| 11 (4Bh) || 26   ||100||100||100|| #FFF|| bgcolor=&amp;quot;#ffffff&amp;quot; | || Bright White  || Leuchtendweiß   || Blanc brillant  || Blanco brillante&lt;br /&gt;
|-&lt;br /&gt;
| 12 (4Ch) || 6    ||100||  0||  0|| #F00|| bgcolor=&amp;quot;#ff0000&amp;quot; | || Bright Red    || Hellrot         || Rouge vif       || Rojo brillante&lt;br /&gt;
|-&lt;br /&gt;
| 13 (4Dh) || 8    ||100||  0||100|| #F0F|| bgcolor=&amp;quot;#ff00ff&amp;quot; | || Bright Magenta|| helles Magenta  || Magenta vif     || Magenta brillante&lt;br /&gt;
|-&lt;br /&gt;
| 14 (4Eh) || 15   ||100|| 50||  0|| #F60|| bgcolor=&amp;quot;#ff8000&amp;quot; | || Orange        || Orange          || Orange          || Naranja&lt;br /&gt;
|-&lt;br /&gt;
| 15 (4Fh) || 17   ||100|| 50||100|| #F6F|| bgcolor=&amp;quot;#ff80ff&amp;quot; | || Pastel Magenta|| Pastell-magenta || Magenta pastel  || Magenta pastel&lt;br /&gt;
|-&lt;br /&gt;
| 16 (50h) || (1)  ||  0||  0|| 50|| #006|| bgcolor=&amp;quot;#000080&amp;quot; | || Blue          || Blau            || Bleu            || Azul&lt;br /&gt;
|-&lt;br /&gt;
| 17 (51h) || (19) ||  0||100|| 50|| #0F6|| bgcolor=&amp;quot;#00ff80&amp;quot; | || Sea Green     || Seegrün         || Vert marin      || Verde marino&lt;br /&gt;
|-&lt;br /&gt;
| 18 (52h) || 18   ||  0||100||  0|| #0F0|| bgcolor=&amp;quot;#00ff00&amp;quot; | || Bright Green  || Hellgrün        || Vert vif        || Verde brillante&lt;br /&gt;
|-&lt;br /&gt;
| 19 (53h) || 20   ||  0||100||100|| #0FF|| bgcolor=&amp;quot;#00ffff&amp;quot; | || Bright Cyan   || helles Blaugrün || Turquoise vif   || Ciano brillante&lt;br /&gt;
|-&lt;br /&gt;
| 20 (54h) || 0    ||  0||  0||  0|| #000|| bgcolor=&amp;quot;#000000&amp;quot; | || Black         || Schwarz         || Noir            || Negro&lt;br /&gt;
|-&lt;br /&gt;
| 21 (55h) || 2    ||  0||  0||100|| #00F|| bgcolor=&amp;quot;#0000ff&amp;quot; | || Bright Blue   || Hellblau        || Bleu vif        || Azul brillante&lt;br /&gt;
|-&lt;br /&gt;
| 22 (56h) || 9    ||  0|| 50||  0|| #060|| bgcolor=&amp;quot;#008000&amp;quot; | || Green         || Grün            || Vert            || Verde&lt;br /&gt;
|-&lt;br /&gt;
| 23 (57h) || 11   ||  0|| 50||100|| #06F|| bgcolor=&amp;quot;#0080ff&amp;quot; | || Sky Blue      || Himmelblau      || Bleu ciel       || Azul cielo&lt;br /&gt;
|-&lt;br /&gt;
| 24 (58h) || 4    || 50||  0|| 50|| #606|| bgcolor=&amp;quot;#800080&amp;quot; | || Magenta       || Magenta         || Magenta         || Magenta&lt;br /&gt;
|-&lt;br /&gt;
| 25 (59h) || 22   || 50||100|| 50|| #6F6|| bgcolor=&amp;quot;#80ff80&amp;quot; | || Pastel Green  || Pastellgrün     || Vert pastel     || Verde pastel&lt;br /&gt;
|-&lt;br /&gt;
| 26 (5Ah) || 21   || 50||100||  0|| #6F0|| bgcolor=&amp;quot;#80ff00&amp;quot; | || Lime          || Limonengrün     || Vert citron     || Verde lima&lt;br /&gt;
|-&lt;br /&gt;
| 27 (5Bh) || 23   || 50||100||100|| #6FF|| bgcolor=&amp;quot;#80ffff&amp;quot; | || Pastel Cyan   || Pastell-blaugrün|| Turquoise pastel|| Ciano pastel&lt;br /&gt;
|-&lt;br /&gt;
| 28 (5Ch) || 3    || 50||  0||  0|| #600|| bgcolor=&amp;quot;#800000&amp;quot; | || Red           || Rot             || Rouge           || Rojo&lt;br /&gt;
|-&lt;br /&gt;
| 29 (5Dh) || 5    || 50||  0||100|| #60F|| bgcolor=&amp;quot;#8000ff&amp;quot; | || Mauve         || Hellviolett     || Mauve           || Malva&lt;br /&gt;
|-&lt;br /&gt;
| 30 (5Eh) || 12   || 50|| 50||  0|| #660|| bgcolor=&amp;quot;#808000&amp;quot; | || Yellow        || Gelb            || Jaune           || Amarillo&lt;br /&gt;
|-&lt;br /&gt;
| 31 (5Fh) || 14   || 50|| 50||100|| #66F|| bgcolor=&amp;quot;#8080ff&amp;quot; | || Pastel Blue   || Pastellblau     || Bleu pastel     || Azul pastel&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Intensities ===&lt;br /&gt;
&lt;br /&gt;
The 0%, 50%, and 100% values in the above tables are &amp;quot;should-be&amp;quot; values. However, the real hardware doesn't exactly match that intensities. The actual intensities depend on the luminance mixing (R,G,B tied together via resistors), on chipset (classic CPC, or newer ASIC ones), and on the load applied by external hardware (Monitor, or TV set).&lt;br /&gt;
&lt;br /&gt;
On an actual Amstrad CPC, the half-intensity colour signal is measured to be closer to 40% rather than the expected 50%. This was verified by [[Grim]] and independently confirmed by [[Nocash]]. [https://www.grimware.org/doku.php/documentations/devices/gatearray#inkr Source]&lt;br /&gt;
* [[CPC Palette]] - some more details&lt;br /&gt;
&lt;br /&gt;
This explains why the Amstrad engineers used the following values to adapt the old colour palette to the new 12-bit palette on the Amstrad Plus:&lt;br /&gt;
* 0% became #0&lt;br /&gt;
* 50% became #6. They specifically chose #6 for the 50% value instead of the expected #7 or #8, to better match the real Amstrad CPC palette.&lt;br /&gt;
* 100% became #F&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Green Screen Colours ===&lt;br /&gt;
&lt;br /&gt;
On a green screen, where all colours are shades of unsaturated green, the firmware colours are in order of increasing intensity. Black is darkest green, bright white is brightest green, and firmware colour 13 is a medium green.&lt;br /&gt;
&lt;br /&gt;
The luminance (Y) is not exactly correlated to the actual luminance of colour images broadcast in RGB. Amstrad preferred to propose a completely different image system, not comparable to a conversion to monochrome, which would have limited the number of brightness levels to 21 (for example, colours 9 and 6 would have had the same luminance).&lt;br /&gt;
&lt;br /&gt;
They opted for a table of 27 linear brightness steps. They assigned values of 1 (1kΩ) for blue, 3 (3.3kΩ) for red, and 9 (10kΩ) for green.&lt;br /&gt;
&lt;br /&gt;
==== To calculate the luminance value ====&lt;br /&gt;
&lt;br /&gt;
'''Red''' &lt;br /&gt;
&lt;br /&gt;
*0% =&amp;amp;gt; do not add anything &lt;br /&gt;
*50% =&amp;amp;gt; add 3 &lt;br /&gt;
*100% =&amp;amp;gt; add 6 &lt;br /&gt;
&lt;br /&gt;
'''Green''' &lt;br /&gt;
&lt;br /&gt;
*0% =&amp;amp;gt; do not add anything &lt;br /&gt;
*50% =&amp;amp;gt; add 9 &lt;br /&gt;
*100% =&amp;amp;gt; add 18 &lt;br /&gt;
&lt;br /&gt;
'''Blue''' &lt;br /&gt;
&lt;br /&gt;
*0% =&amp;amp;gt; do not add anything &lt;br /&gt;
*50% =&amp;amp;gt; add 1 &lt;br /&gt;
*100% =&amp;amp;gt; add 2 &lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Pictures ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;gallery&amp;gt;&lt;br /&gt;
Image:40010_am2_metal.jpg|40010 GA Metal Layer&lt;br /&gt;
Image:40010_am2_acid.jpg|40010 GA with Metal Layer removed&lt;br /&gt;
Image:40226_am4_metal.jpg|40226 PreASIC Metal Layer&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[File:Ga.pinout.40007.png]] [[File:Ga.pinout.40008.40010.png]]&lt;br /&gt;
&lt;br /&gt;
Note: Some CPC motherboards can accommodate both types of Gate Array pinouts. [https://thecheshirec.at/2024/10/06/il-existe-une-carte-multi-gate-array-et-cest-amstrad-qui-la-faite/ Source]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== External links ==&lt;br /&gt;
*[https://bread80.com/2021/06/03/understanding-the-amstrad-cpc-video-ram-and-gate-array-subsystem/ Electronic signals analysis of the Gate Array by Bread80]&lt;br /&gt;
* [https://www.grimware.org/doku.php/documentations/devices/gatearray Gate Array documentation from Grimware]&lt;br /&gt;
* [http://quasar.cpcscene.net/doku.php?id=assem:gate_array Quasar Gate Array documentation (in french)]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==See also==&lt;br /&gt;
&lt;br /&gt;
*[[Gate Array and ASIC Pin-Outs]]&lt;br /&gt;
*[[PAL16L8]] : for RAM arrangement&lt;br /&gt;
*[[ASIC]] : for Plus users&lt;br /&gt;
&lt;br /&gt;
*[[CRTC]] : the other video stuff&lt;br /&gt;
*[[Synchronising with the CRTC and display]] : technical details on the relationship between Gate Array and CRTC.&lt;br /&gt;
&lt;br /&gt;
*[[Video modes]] : for other informations on colours and pixels.&lt;br /&gt;
&lt;br /&gt;
*[[Media:40010-simplified V03.pdf]] [https://www.cpcwiki.eu/forum/amstrad-cpc-hardware/gate-array-decapped!/msg170713/#msg170713 Forum thread] Gate Array schematics - reverse engineered by Gerald&lt;br /&gt;
&lt;br /&gt;
[[Category:Hardware]][[Category:Programming]][[Category:Datasheet]][[Category:Graphic]][[Category:CPC Internal Components]][[Category:Electronic Component]]&lt;/div&gt;</summary>
		<author><name>Longshot</name></author>	</entry>

	<entry>
		<id>https://oldwiki.cpcwiki.eu/index.php?title=PAL16L8&amp;diff=116170</id>
		<title>PAL16L8</title>
		<link rel="alternate" type="text/html" href="https://oldwiki.cpcwiki.eu/index.php?title=PAL16L8&amp;diff=116170"/>
				<updated>2024-05-31T14:45:49Z</updated>
		
		<summary type="html">&lt;p&gt;Longshot: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;The CPC6128 second bank of 64K RAM is controlled by a PAL 16L8 chip. It has the Amstrad part number 40031.&lt;br /&gt;
&lt;br /&gt;
On the CPC 6128 schematic, it is top centre: [http://www.cpcwiki.eu/imgs/4/4a/CPC6128_Schematic.png CPC6128 Schematic] however the X inputs aren't distinguished.&lt;br /&gt;
&lt;br /&gt;
== Fixed version (Gerald) ==&lt;br /&gt;
Original version from Porchy suffer from a bad handling of the RAMDIS signal. This cause screen artefact when accessing an external extension RAM like XMEM.&lt;br /&gt;
&lt;br /&gt;
 A14OUT     = !(  !A14&lt;br /&gt;
              #   !A15 &amp;amp; !Q0 &amp;amp; Q2 );&lt;br /&gt;
 &lt;br /&gt;
 A15OUT     = !(  !A15 &amp;amp; !A14&lt;br /&gt;
              #   !A15 &amp;amp; !Q1&lt;br /&gt;
              #   !A15 &amp;amp; !Q0 &amp;amp; !Q2 );&lt;br /&gt;
 &lt;br /&gt;
 Q0     = (  D7ANDD6 &amp;amp; nRESET &amp;amp; D0 &amp;amp; !A15 &amp;amp; !nIOWR&lt;br /&gt;
          #   !D7ANDD6 &amp;amp; nRESET &amp;amp; Q0&lt;br /&gt;
          #   nRESET &amp;amp; A15 &amp;amp; Q0&lt;br /&gt;
          #   nRESET &amp;amp; nIOWR &amp;amp; Q0 );&lt;br /&gt;
 &lt;br /&gt;
 Q1     = (  D7ANDD6 &amp;amp; nRESET &amp;amp; D1 &amp;amp; !A15 &amp;amp; !nIOWR&lt;br /&gt;
          #   !D7ANDD6 &amp;amp; nRESET &amp;amp; Q1&lt;br /&gt;
          #   nRESET &amp;amp; A15 &amp;amp; Q1&lt;br /&gt;
          #   nRESET &amp;amp; nIOWR &amp;amp; Q1 );&lt;br /&gt;
 &lt;br /&gt;
 Q2     = (  D7ANDD6 &amp;amp; nRESET &amp;amp; D2 &amp;amp; !A15 &amp;amp; !nIOWR&lt;br /&gt;
          #   !D7ANDD6 &amp;amp; nRESET &amp;amp; Q2&lt;br /&gt;
          #   nRESET &amp;amp; A15 &amp;amp; Q2&lt;br /&gt;
          #   nRESET &amp;amp; nIOWR &amp;amp; Q2 );&lt;br /&gt;
 &lt;br /&gt;
 nCAS0     = (  nCAS&lt;br /&gt;
             #   RAMDIS &amp;amp; !nCPU &amp;amp; nCAS0&lt;br /&gt;
             #   !A15 &amp;amp; A14 &amp;amp; !nCPU &amp;amp; Q2 &amp;amp; nCAS0&lt;br /&gt;
             #   A15 &amp;amp; A14 &amp;amp; !nCPU &amp;amp; Q0 &amp;amp; !Q2 &amp;amp; nCAS0&lt;br /&gt;
             #   !nCPU &amp;amp; !Q0 &amp;amp; Q1 &amp;amp; !Q2 &amp;amp; nCAS0&lt;br /&gt;
             #   !nCAS1 );&lt;br /&gt;
 &lt;br /&gt;
 nCAS1     = !(  !RAMDIS &amp;amp; !nCAS &amp;amp; !A15 &amp;amp; A14 &amp;amp; !nCPU &amp;amp; Q2 &amp;amp; nCAS0&lt;br /&gt;
             #   !RAMDIS &amp;amp; !nCAS &amp;amp; A15 &amp;amp; A14 &amp;amp; !nCPU &amp;amp; Q0 &amp;amp; !Q2 &amp;amp; nCAS0&lt;br /&gt;
             #   !RAMDIS &amp;amp; !nCAS &amp;amp; !nCPU &amp;amp; !Q0 &amp;amp; Q1 &amp;amp; !Q2 &amp;amp; nCAS0&lt;br /&gt;
             #   !nCAS &amp;amp; !A15 &amp;amp; A14 &amp;amp; Q2 &amp;amp; nCAS0 &amp;amp; !nCAS1&lt;br /&gt;
             #   !nCAS &amp;amp; A15 &amp;amp; A14 &amp;amp; Q0 &amp;amp; !Q2 &amp;amp; nCAS0 &amp;amp; !nCAS1&lt;br /&gt;
             #   !nCAS &amp;amp; !Q0 &amp;amp; Q1 &amp;amp; !Q2 &amp;amp; nCAS0 &amp;amp; !nCAS1 );&lt;br /&gt;
&lt;br /&gt;
[[File:CPC6128.JED]] : Fixed version of  Amstrad 40031 GAL replacement&lt;br /&gt;
&lt;br /&gt;
[[File:CPC6128.hex]] : Fixed version of  Amstrad 40031 GAL replacement, Hex Intel version.&lt;br /&gt;
&lt;br /&gt;
== Initial replacement equation (Porchy) ==&lt;br /&gt;
&lt;br /&gt;
The following equations were worked out by Porchy (member on CPCWiki Forum). These can be used to program replacements:&lt;br /&gt;
&lt;br /&gt;
 A15OUT = (!X2 &amp;amp; !X1 &amp;amp; A14&lt;br /&gt;
      # !X3 &amp;amp; !X2 &amp;amp; A14&lt;br /&gt;
      # A15); &lt;br /&gt;
 &lt;br /&gt;
 !X1 = (!A15 &amp;amp; D7ANDD6 &amp;amp; RESET &amp;amp; !IOWR &amp;amp; D0&lt;br /&gt;
      # !X1 &amp;amp; RESET &amp;amp; IOWR&lt;br /&gt;
      # !X1 &amp;amp; !D7ANDD6 &amp;amp; RESET&lt;br /&gt;
      # !X1 &amp;amp; A15 &amp;amp; RESET);&lt;br /&gt;
 &lt;br /&gt;
 !X2 = (!A15 &amp;amp; D7ANDD6 &amp;amp; RESET &amp;amp; !IOWR &amp;amp; D1&lt;br /&gt;
      # !X2 &amp;amp; RESET &amp;amp; IOWR&lt;br /&gt;
      # !X2 &amp;amp; !D7ANDD6 &amp;amp; RESET&lt;br /&gt;
      # !X2 &amp;amp; A15 &amp;amp; RESET);&lt;br /&gt;
 &lt;br /&gt;
 !X3 = (!A15 &amp;amp; D7ANDD6 &amp;amp; RESET &amp;amp; !IOWR &amp;amp; D2&lt;br /&gt;
      # !X3 &amp;amp; RESET &amp;amp; IOWR&lt;br /&gt;
      # !X3 &amp;amp; !D7ANDD6 &amp;amp; RESET&lt;br /&gt;
      # !X3 &amp;amp; A15 &amp;amp; RESET);&lt;br /&gt;
 &lt;br /&gt;
 !CAS1 = (X3 &amp;amp; !X1 &amp;amp; A15 &amp;amp; A14 &amp;amp; !NCAS &amp;amp; !RAMDIS &amp;amp; !CPU &amp;amp; CAS0&lt;br /&gt;
      # !X3 &amp;amp; !A15 &amp;amp; A14 &amp;amp; !NCAS &amp;amp; !RAMDIS &amp;amp; !CPU &amp;amp; CAS0&lt;br /&gt;
      # X3 &amp;amp; !X2 &amp;amp; X1 &amp;amp; !NCAS &amp;amp; !RAMDIS &amp;amp; !CPU &amp;amp; CAS0&lt;br /&gt;
      # !NCAS &amp;amp; CAS0 &amp;amp; !CAS1);&lt;br /&gt;
 &lt;br /&gt;
 !CAS0 = (X3 &amp;amp; X2 &amp;amp; X1 &amp;amp; !NCAS &amp;amp; !RAMDIS &amp;amp; CAS1&lt;br /&gt;
      # X3 &amp;amp; !X1 &amp;amp; !A15 &amp;amp; !NCAS &amp;amp; !RAMDIS &amp;amp; CAS1&lt;br /&gt;
      # !X3 &amp;amp; A15 &amp;amp; !NCAS &amp;amp; !RAMDIS &amp;amp; CAS1&lt;br /&gt;
      # !X1 &amp;amp; !A14 &amp;amp; !NCAS &amp;amp; !RAMDIS &amp;amp; CAS1&lt;br /&gt;
      # !X3 &amp;amp; !A14 &amp;amp; !NCAS &amp;amp; !RAMDIS &amp;amp; CAS1&lt;br /&gt;
      # !NCAS &amp;amp; !RAMDIS &amp;amp; CPU &amp;amp; CAS1&lt;br /&gt;
      # !NCAS &amp;amp; !CAS0 &amp;amp; CAS1);&lt;br /&gt;
 &lt;br /&gt;
 A14OUT = (A15 &amp;amp; A14&lt;br /&gt;
      # !X1 &amp;amp; A14&lt;br /&gt;
      # X3 &amp;amp; A14);&lt;br /&gt;
&lt;br /&gt;
[[File:Amstrad6128.jed]] Original JED File posted on CPCWiki Forum&lt;br /&gt;
&lt;br /&gt;
== PAL MMR register ==&lt;br /&gt;
This register controls how the extended RAM is banked into the CPU address space. It doesn't affect the video display at all as the Gate Array can only access the Base 64k page of RAM.&lt;br /&gt;
&lt;br /&gt;
{|{{Prettytable|width: 700px; font-size: 2em;}}&lt;br /&gt;
|colspan=2|'''MMR'''||colspan=3|'''64K page'''||'''S'''||colspan=2|'''MM'''||colspan=4 style=&amp;quot;text-align: center;&amp;quot;|'''CPU Memory Mapping'''&lt;br /&gt;
|-&lt;br /&gt;
|'''7'''&lt;br /&gt;
|'''6'''&lt;br /&gt;
|'''5'''&lt;br /&gt;
|'''4'''&lt;br /&gt;
|'''3'''&lt;br /&gt;
|'''2'''&lt;br /&gt;
|'''1'''&lt;br /&gt;
|'''0'''&lt;br /&gt;
|style=&amp;quot;text-align: center;&amp;quot;|'''&amp;amp;0000-&amp;amp;3fff'''&lt;br /&gt;
|style=&amp;quot;text-align: center;&amp;quot;|'''&amp;amp;4000-&amp;amp;7fff'''&lt;br /&gt;
|style=&amp;quot;text-align: center;&amp;quot;|'''&amp;amp;8000-&amp;amp;bfff'''&lt;br /&gt;
|style=&amp;quot;text-align: center;&amp;quot;|'''&amp;amp;c000-&amp;amp;ffff'''&lt;br /&gt;
|-&lt;br /&gt;
|1&lt;br /&gt;
|1&lt;br /&gt;
|colspan=3 style=&amp;quot;text-align: center;&amp;quot;|x&lt;br /&gt;
|0&lt;br /&gt;
|0&lt;br /&gt;
|0&lt;br /&gt;
|Base 64k / Bank 0&lt;br /&gt;
|Base 64k / Bank 1&lt;br /&gt;
|Base 64k / Bank 2&lt;br /&gt;
|Base 64k / Bank 3&lt;br /&gt;
|-&lt;br /&gt;
|1&lt;br /&gt;
|1&lt;br /&gt;
|colspan=3 style=&amp;quot;text-align: center;&amp;quot;|p&lt;br /&gt;
|0&lt;br /&gt;
|0&lt;br /&gt;
|1&lt;br /&gt;
|Base 64k / Bank 0&lt;br /&gt;
|Base 64k / Bank 1&lt;br /&gt;
|Base 64k / Bank 2&lt;br /&gt;
|'''Page p / Bank 3'''&lt;br /&gt;
|-&lt;br /&gt;
|1&lt;br /&gt;
|1&lt;br /&gt;
|colspan=3 style=&amp;quot;text-align: center;&amp;quot;|p&lt;br /&gt;
|0&lt;br /&gt;
|1&lt;br /&gt;
|0&lt;br /&gt;
|'''Page p / Bank 0'''&lt;br /&gt;
|'''Page p / Bank 1'''&lt;br /&gt;
|'''Page p / Bank 2'''&lt;br /&gt;
|'''Page p / Bank 3'''&lt;br /&gt;
|-&lt;br /&gt;
|1&lt;br /&gt;
|1&lt;br /&gt;
|colspan=3 style=&amp;quot;text-align: center;&amp;quot;|p&lt;br /&gt;
|0&lt;br /&gt;
|1&lt;br /&gt;
|1&lt;br /&gt;
|Base 64k / Bank 0&lt;br /&gt;
|'''Base 64k / Bank 3'''&lt;br /&gt;
|Base 64k / Bank 2&lt;br /&gt;
|'''Page p / Bank 3'''&lt;br /&gt;
|-&lt;br /&gt;
|1&lt;br /&gt;
|1&lt;br /&gt;
|colspan=3 style=&amp;quot;text-align: center;&amp;quot;|p&lt;br /&gt;
|1&lt;br /&gt;
|colspan=2 style=&amp;quot;text-align: center;&amp;quot;|b&lt;br /&gt;
|Base 64k / Bank 0&lt;br /&gt;
|'''Page p / Bank b'''&lt;br /&gt;
|Base 64k / Bank 2&lt;br /&gt;
|Base 64k / Bank 3&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== PAL I/O port ==&lt;br /&gt;
&lt;br /&gt;
Note that no settings are stored in the Gate Array regarding register 3, but the PAL and Gate Array share an I/O port address.&lt;br /&gt;
&lt;br /&gt;
Bit14 of the PAL selection address can be at 0 or 1 on CPCs equipped with CRTCs 3, 4. &lt;br /&gt;
It must be at 1 on CRTCs 0, 1 and 2 (The result is not guaranteed).&lt;br /&gt;
&lt;br /&gt;
For compatibility reasons, it is strongly advised to always set bit14 to 1 to select PAL.&lt;br /&gt;
&lt;br /&gt;
== PAL Type Detection ==&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
10 OUT &amp;amp;7F00,&amp;amp;C0:POKE &amp;amp;4000,&amp;amp;C0&lt;br /&gt;
20 OUT &amp;amp;7F00,&amp;amp;C7:POKE &amp;amp;4000,&amp;amp;C7:OUT &amp;amp;7F00,&amp;amp;C0&lt;br /&gt;
30 IF PEEK(&amp;amp;4000)=&amp;amp;C7 THEN PRINT&amp;quot;PAL chip absent/inactive&amp;quot;:END&lt;br /&gt;
40 OUT &amp;amp;3FFF,&amp;amp;C7&lt;br /&gt;
50 IF PEEK(&amp;amp;4000)=&amp;amp;C7 THEN PRINT&amp;quot;PAL I/O layout Bit 14=0 PAL Select&amp;quot;:END&lt;br /&gt;
60 IF PEEK(&amp;amp;4000)=&amp;amp;C0 THEN PRINT&amp;quot;PAL I/O layout Bit 14=0 PAL not selected&amp;quot;:END&lt;br /&gt;
70 PRINT&amp;quot;Error!&amp;quot;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== See also ==&lt;br /&gt;
&lt;br /&gt;
*CPC 464/664 cannot deal with A14/A15 for Base 64k page like the 6128 does. So external RAM expansions differ in their behaviour regarding &amp;amp;C3 mode. See [https://www.cpcwiki.eu/forum/amstrad-cpc-hardware/464-preasic-c3-ram-configuration-and-rom-7/ Discussion on the forum] and [https://www.cpcwiki.eu/forum/amstrad-cpc-hardware/dk%27tronics-ram-c3-selection-464/ Another discussion]&lt;br /&gt;
&lt;br /&gt;
*[[Gate Array and ASIC Pin-Outs]]&lt;br /&gt;
&lt;br /&gt;
*[[Standard Memory Expansions]]&lt;br /&gt;
&lt;br /&gt;
[[Category:Hardware]] [[Category:CPC Internal Components]] [[Category:Programming]] [[Category:Datasheet]]&lt;/div&gt;</summary>
		<author><name>Longshot</name></author>	</entry>

	<entry>
		<id>https://oldwiki.cpcwiki.eu/index.php?title=Longshot&amp;diff=113412</id>
		<title>Longshot</title>
		<link rel="alternate" type="text/html" href="https://oldwiki.cpcwiki.eu/index.php?title=Longshot&amp;diff=113412"/>
				<updated>2023-12-06T17:16:08Z</updated>
		
		<summary type="html">&lt;p&gt;Longshot: update url logonsystem portal&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Image:Longshot1996.jpg|thumb|Longshot 1996]]&lt;br /&gt;
&lt;br /&gt;
'''Longshot''' was a demo coder, founder and leader of the famous [[Logon System]] demo group. A pseudonym for Serge Querné, he was initially based in southern France but later moved to Paris.&lt;br /&gt;
&lt;br /&gt;
== Biography ==&lt;br /&gt;
&lt;br /&gt;
Initially going under the pseudonym 'Logon 1' (the name Logon he explained in a scrolltext as &amp;quot;a Belgian idea&amp;quot;), he released a series of single-part demos, each of them showcasing a new technique he had learned ‒ or, in many cases, discovered. These included raster bars, overscan, and split modes in the earliest productions. The first demo was coded while he was working at [http://fr.wikipedia.org/wiki/Ubisoft Ubi Soft]'s &amp;quot;castle&amp;quot; headquarters. Though some of these demos seem fairly simple in retrospect, at the time, Serge's demo-coding skill was only equalled by perhaps [[Fefesse]] and [[NWC]].&lt;br /&gt;
&lt;br /&gt;
A stepchange came with the [[Longshot Demo]], the first in which he adopted his new pseudonym. This included hardware splitting and combined more effects on screen at once. [[Revolog]] (or Revolution) followed in a similar vein but was a level more accomplished again. At the same time, Longshot participated in the [[Amazing Demo]] with [[Naminu]] and [[P007]] of [[Malibu Crackers]].&lt;br /&gt;
&lt;br /&gt;
[[Naminu]] would soon become one of the members of the new, expanded [[Logon System]]. The &amp;quot;supergroup&amp;quot;'s first release was the stunning [[The Demo]], where Longshot contributed three parts but, perhaps more significantly, oversaw the polished, coherent design that was unlike any CPC megademo previously released.&lt;br /&gt;
&lt;br /&gt;
The [[Euromeeting Demo]] would turn out to be his last demo release, but a further innovation was the [[B-ASIC]] utility which enabled Plus programmers to use the new features of their machines from BASIC. Longshot went on to the PC in turn, but has recently participated in French CPC forums such as [http://phenixinformatique.free.fr/ Phenix Informatique] once again. His [http://www.logonsystem.fr/ homepage] contains screenshots from the Logon era, a brief history, and downloads of his personal disc collection.&lt;br /&gt;
&lt;br /&gt;
Though most respected for his coding skills and innovations, Serge's main achievement was perhaps the creation and fostering of the Logon System supergroup, the like of which has not been seen since.&lt;br /&gt;
&lt;br /&gt;
Longshot has written technical articles in some columns of the French magazine [[Amstrad Cent Pour Cent]].&lt;br /&gt;
&lt;br /&gt;
== Demos ==&lt;br /&gt;
&lt;br /&gt;
* [[Logon Demo 1]]&lt;br /&gt;
* [[Logon Demo 2]]&lt;br /&gt;
* [[Logon Demo 3]]&lt;br /&gt;
* [[Logon Demo 5]]&lt;br /&gt;
* [[Longshot Demo]]&lt;br /&gt;
* [[Revolog]]&lt;br /&gt;
* [[Amazing Demo]]&lt;br /&gt;
* [[The Demo]]&lt;br /&gt;
* [[Euromeeting Demo]]&lt;br /&gt;
&lt;br /&gt;
== Other productions ==&lt;br /&gt;
&lt;br /&gt;
* [[Atlantis]] &lt;br /&gt;
* [[B-ASIC]]&lt;br /&gt;
* [[AntiMultiface]]&lt;br /&gt;
* [[MagicDOS]]&lt;br /&gt;
&lt;br /&gt;
== Groups ==&lt;br /&gt;
&lt;br /&gt;
* [[Logon System]]&lt;br /&gt;
&lt;br /&gt;
== Links ==&lt;br /&gt;
&lt;br /&gt;
* [http://www.logonsystem.eu/ Longshot's homepage]&lt;br /&gt;
* [http://norecess.cpcscene.net/interview-longshot.html Interview with Longshot by NoRecess]&lt;br /&gt;
&lt;br /&gt;
[[Category:CPC scene members]]&lt;/div&gt;</summary>
		<author><name>Longshot</name></author>	</entry>

	<entry>
		<id>https://oldwiki.cpcwiki.eu/index.php?title=Emulator_IDs&amp;diff=113031</id>
		<title>Emulator IDs</title>
		<link rel="alternate" type="text/html" href="https://oldwiki.cpcwiki.eu/index.php?title=Emulator_IDs&amp;diff=113031"/>
				<updated>2023-11-08T22:12:16Z</updated>
		
		<summary type="html">&lt;p&gt;Longshot: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Some CPC emulators use Port &amp;amp;amp;FEFE to provide a method to identify a specific CPC emulator. CPC programs could use this ID to detect an emulator and change some of their behaviour (e.g. changing graphic effechts which will not work on an emulator or using special emulator-specific features). Reading from this port returns the Emulator-ID or &amp;amp;amp;FF on the real CPC and on emulators which do not provide this feature. &lt;br /&gt;
&lt;br /&gt;
== List of known Emulator-IDs  ==&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
- #78: Amspirit&lt;br /&gt;
- #88: VirtualCPC&lt;br /&gt;
- #99: WinCPC&lt;br /&gt;
- #A0: JavaCPC&lt;br /&gt;
- #AA: PC-CPC&lt;br /&gt;
- #C0: C-One Normal&lt;br /&gt;
- #C1: C-One Turbo&lt;br /&gt;
- #C2: TREX Normal&lt;br /&gt;
- #C3: TREX Turbo&lt;br /&gt;
- #CE: CPCE&lt;br /&gt;
- #FF: Caprice, WinApe, MESS or a real CPC&lt;br /&gt;
&amp;lt;/pre&amp;gt; &lt;br /&gt;
&amp;lt;b&amp;gt;NOTE: It should be noted that the value #FF is just valid on a bare CPC (not plus!) and any extensions connected can change this!&amp;lt;/b&amp;gt;&lt;br /&gt;
[[Category:Emulator]] [[Category:Programming]]&lt;/div&gt;</summary>
		<author><name>Longshot</name></author>	</entry>

	<entry>
		<id>https://oldwiki.cpcwiki.eu/index.php?title=Emulators&amp;diff=112686</id>
		<title>Emulators</title>
		<link rel="alternate" type="text/html" href="https://oldwiki.cpcwiki.eu/index.php?title=Emulators&amp;diff=112686"/>
				<updated>2023-09-20T11:22:29Z</updated>
		
		<summary type="html">&lt;p&gt;Longshot: /* Desktop */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Vote for your favorite emulator =&lt;br /&gt;
&lt;br /&gt;
[https://www.cpcwiki.eu/forum/emulators/which-emulator-s-do-you-use/ There is a poll on CPCWiki forum]&lt;br /&gt;
&lt;br /&gt;
= Software Platforms (Full OS independance) =&lt;br /&gt;
&lt;br /&gt;
== Java Platform  ==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable sortable&amp;quot;&lt;br /&gt;
! Emulator name&lt;br /&gt;
! External link&lt;br /&gt;
! Current version&lt;br /&gt;
! Latest release&lt;br /&gt;
! Developer tools&lt;br /&gt;
! Amstrad Plus&lt;br /&gt;
! Also emulates&lt;br /&gt;
! License&lt;br /&gt;
|-&lt;br /&gt;
| [[Arnold Jnr|Arnold Jnr]]&lt;br /&gt;
| [https://web.archive.org/web/20160727011826/http://www.arnoldemu.freeserve.co.uk/]&lt;br /&gt;
| &lt;br /&gt;
| Aug 27, 2001&lt;br /&gt;
| ❌&lt;br /&gt;
| ❌&lt;br /&gt;
| -&lt;br /&gt;
| Open source&lt;br /&gt;
|-&lt;br /&gt;
| [[JavaCPC|JavaCPC Desktop]]&lt;br /&gt;
| [https://sourceforge.net/projects/javacpc/] [http://sourceforge.net/projects/javagx4000/ JavaGX4000] [http://sourceforge.net/projects/cpcinajar/ CPCInAJar]&lt;br /&gt;
| 3.0.2&lt;br /&gt;
| Apr 8, 2022&lt;br /&gt;
| ✅&lt;br /&gt;
| ✅&lt;br /&gt;
| [[KC Compact]]&lt;br /&gt;
| Donationware &amp;amp; Open source&lt;br /&gt;
|-&lt;br /&gt;
| [[JEMU|JEMU]]&lt;br /&gt;
| [http://jemu.winape.net/]&lt;br /&gt;
| &lt;br /&gt;
| Feb 19, 2007&lt;br /&gt;
| ❌&lt;br /&gt;
| ❌&lt;br /&gt;
| [[BBC Micro]], [[ZX Spectrum]], [[ZX80/81]], [[VZ-300]]&lt;br /&gt;
| Open source&lt;br /&gt;
|-&lt;br /&gt;
| [[WebCPC|WebCPC]]&lt;br /&gt;
| [http://sourceforge.net/projects/webcpc/] [https://web.archive.org/web/20110903132520/http://java.cpc-live.com/ JavaCPC Applet]&lt;br /&gt;
| r15&lt;br /&gt;
| Dec 31, 2010&lt;br /&gt;
| ❌&lt;br /&gt;
| ❌&lt;br /&gt;
| -&lt;br /&gt;
| Open source&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== JS / Wasm / Web Platform ==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable sortable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Emulator name&lt;br /&gt;
! External link&lt;br /&gt;
! Current version&lt;br /&gt;
! Latest release&lt;br /&gt;
! Developer tools&lt;br /&gt;
! Amstrad Plus&lt;br /&gt;
! Also emulates&lt;br /&gt;
! License&lt;br /&gt;
|-&lt;br /&gt;
| [[CPCBox|CPCBox]] &lt;br /&gt;
| [https://web.archive.org/web/20190702084943/http://www.cpcbox.com/] [https://bzhgames.xyz/index.php BZH Games]&lt;br /&gt;
| beta &lt;br /&gt;
| Dec 28, 2013&lt;br /&gt;
| ❌&lt;br /&gt;
| ❌&lt;br /&gt;
| -&lt;br /&gt;
| Freeware&lt;br /&gt;
|-&lt;br /&gt;
| [[CrocoDS|CrocoDS]] &lt;br /&gt;
| [http://crocods.org/web/]&lt;br /&gt;
| &lt;br /&gt;
| May 13, 2020&lt;br /&gt;
| ⚠️&lt;br /&gt;
| ❌&lt;br /&gt;
| -&lt;br /&gt;
| Freeware&lt;br /&gt;
|-&lt;br /&gt;
| [[MAME|Emularity (MAME)]] &lt;br /&gt;
| [https://github.com/db48x/emularity] [http://jsmess.textfiles.com/ JSMESS]&lt;br /&gt;
[https://archive.org/details/softwarelibrary_cpc_games CPC Games] [https://archive.org/details/softwarelibrary_cpc_demos CPC Demos] on Internet Archive&lt;br /&gt;
| &lt;br /&gt;
| Jul 15, 2023&lt;br /&gt;
| ❌&lt;br /&gt;
| ✅&lt;br /&gt;
| Lots of other computer systems&lt;br /&gt;
| Open source&lt;br /&gt;
|-&lt;br /&gt;
| [[Roland javascript emulator|Roland]] &lt;br /&gt;
| [https://web.archive.org/web/20190308142014/http://roland.retrolandia.net/]&lt;br /&gt;
| &lt;br /&gt;
| Sep 24, 2011&lt;br /&gt;
| ❌&lt;br /&gt;
| ❌&lt;br /&gt;
| -&lt;br /&gt;
| Open source&lt;br /&gt;
|-&lt;br /&gt;
| [[Ronald|Ronald]] &lt;br /&gt;
| [https://github.com/mdm/ronald]&lt;br /&gt;
| &lt;br /&gt;
| May 10, 2023&lt;br /&gt;
| ⚠️&lt;br /&gt;
| ❌&lt;br /&gt;
| -&lt;br /&gt;
| Open source&lt;br /&gt;
|-&lt;br /&gt;
| [[RVMplayer|RVMplayer]] &lt;br /&gt;
| [https://www.retrovirtualmachine.org/rvmplayer/]&lt;br /&gt;
| 0.1.1&lt;br /&gt;
| Apr 29, 2023&lt;br /&gt;
| ❌&lt;br /&gt;
| ❌&lt;br /&gt;
| [[ZX Spectrum]]&lt;br /&gt;
| Freeware&lt;br /&gt;
|-&lt;br /&gt;
| [[Tiny Emus]]&lt;br /&gt;
| [https://floooh.github.io/tiny8bit/] [https://floooh.github.io/tiny8bit/cpc-ui.html] [http://floooh.github.io/virtualkc/ yakc]&lt;br /&gt;
[https://devilmarkus.de/ WebGL 3d 8-bit] [https://www.amstradcpcgames.eu/ Amstrad CPC Games] [http://cpc.novidee.com/ zpz]&lt;br /&gt;
| &lt;br /&gt;
| Dec 15, 2021&lt;br /&gt;
| ✅&lt;br /&gt;
| ❌&lt;br /&gt;
| [[KC Compact]], [[ZX Spectrum]], [[VIC-20]], [[Commodore 64]], [[Acorn Atom]], [[KC 85]], [[KC 87]], [[Z9001]], [[Z1013]], [[LC80]]&lt;br /&gt;
| Open source&lt;br /&gt;
|-&lt;br /&gt;
| [[Griffin CPC emulator|Xiragon]]&lt;br /&gt;
| [https://web.archive.org/web/20191027200008/http://xiragon.com/]&lt;br /&gt;
| &lt;br /&gt;
| Nov 28, 2012&lt;br /&gt;
| ❌&lt;br /&gt;
| ❌&lt;br /&gt;
| -&lt;br /&gt;
| Open source&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== LibRetro (API for emulators) ==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable sortable&amp;quot;&lt;br /&gt;
! Emulator name&lt;br /&gt;
! Type&lt;br /&gt;
! External link&lt;br /&gt;
! Current version&lt;br /&gt;
! Latest release&lt;br /&gt;
! Developer tools&lt;br /&gt;
! Amstrad Plus&lt;br /&gt;
! Also emulates&lt;br /&gt;
! License&lt;br /&gt;
|-&lt;br /&gt;
| [[libretro-cap32]]&lt;br /&gt;
| Emulation core&lt;br /&gt;
| [https://github.com/libretro/libretro-cap32]&lt;br /&gt;
| 4.5.3&lt;br /&gt;
| Mar 16, 2022&lt;br /&gt;
| ❌&lt;br /&gt;
| ✅&lt;br /&gt;
| -&lt;br /&gt;
| Open source&lt;br /&gt;
|-&lt;br /&gt;
| [[libretro-crocods]]&lt;br /&gt;
| Emulation core&lt;br /&gt;
| [https://github.com/libretro/libretro-crocods]&lt;br /&gt;
| 0.1&lt;br /&gt;
| Feb 28, 2017&lt;br /&gt;
| ❌&lt;br /&gt;
| ❌&lt;br /&gt;
| -&lt;br /&gt;
| Open source&lt;br /&gt;
|-&lt;br /&gt;
| [[MAME|MESS 2015]]&lt;br /&gt;
| Emulation core&lt;br /&gt;
| [https://docs.libretro.com/meta/core-list/]&lt;br /&gt;
| 0.160&lt;br /&gt;
| circa 2015&lt;br /&gt;
| ❌&lt;br /&gt;
| ✅&lt;br /&gt;
| [[KC Compact]], [[Aleste 520EX]] &amp;amp; lots of other computer systems&lt;br /&gt;
| Open source&lt;br /&gt;
|-&lt;br /&gt;
| [[SugarLibRetro]]&lt;br /&gt;
| Emulation core&lt;br /&gt;
| [https://github.com/Tom1975/SugarLibRetro] (wraps independent lib [https://github.com/Tom1975/CPCCore CPCCore])&lt;br /&gt;
| git&lt;br /&gt;
| Jan 10, 2020&lt;br /&gt;
| ❌&lt;br /&gt;
| ✅&lt;br /&gt;
| -&lt;br /&gt;
| Open source&lt;br /&gt;
|-&lt;br /&gt;
| [[EmuVR]]&lt;br /&gt;
| Frontend&lt;br /&gt;
| [https://www.emuvr.net/]&lt;br /&gt;
| &lt;br /&gt;
| Dec 25, 2022&lt;br /&gt;
| ❌&lt;br /&gt;
| -&lt;br /&gt;
| Depends on emulation cores&lt;br /&gt;
| Donationware&lt;br /&gt;
|-&lt;br /&gt;
| [[Hackable Console]]&lt;br /&gt;
| Frontend&lt;br /&gt;
| [https://github.com/leiradel/hackable-console]&lt;br /&gt;
| &lt;br /&gt;
| Mar 27, 2022&lt;br /&gt;
| ✅&lt;br /&gt;
| -&lt;br /&gt;
| Depends on emulation cores&lt;br /&gt;
| Open source&lt;br /&gt;
|-&lt;br /&gt;
| [[RetroArch]]&lt;br /&gt;
| Frontend&lt;br /&gt;
| [https://www.retroarch.com/]&lt;br /&gt;
| 1.15.0&lt;br /&gt;
| Mar 11, 2023&lt;br /&gt;
| ❌&lt;br /&gt;
| -&lt;br /&gt;
| Depends on emulation cores&lt;br /&gt;
| Donationware &amp;amp; Open source&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
= Current Operating Systems =&lt;br /&gt;
&lt;br /&gt;
== Desktop ==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable sortable&amp;quot;&lt;br /&gt;
! Emulator name&lt;br /&gt;
! External link&lt;br /&gt;
! Windows&lt;br /&gt;
! macOS&lt;br /&gt;
! Linux&lt;br /&gt;
! Current version&lt;br /&gt;
! Latest release&lt;br /&gt;
! Developer tools&lt;br /&gt;
! Amstrad Plus&lt;br /&gt;
! Also emulates&lt;br /&gt;
! License&lt;br /&gt;
|-&lt;br /&gt;
| [[ACE|AceHacked]]&lt;br /&gt;
| [http://www.roudoudou.com/AceHacked/] [https://www.cpcwiki.eu/forum/emulators/ace-cpc-emulator-only-amiga-makes-it-possible/msg231201/] [https://www.youtube.com/watch?v=MJSFP7Hx3io wip] [https://www.youtube.com/watch?v=5zYVtGMWPVs wip2]&lt;br /&gt;
| ⚠️&lt;br /&gt;
| ⚠️&lt;br /&gt;
| ⚠️&lt;br /&gt;
| &lt;br /&gt;
| Sep 19, 2023&lt;br /&gt;
| ✅&lt;br /&gt;
| ✅&lt;br /&gt;
| -&lt;br /&gt;
| ❌ Unreleased&lt;br /&gt;
|-&lt;br /&gt;
| [[AMSpiriT|AMSpiriT]]&lt;br /&gt;
| [https://www.amspirit.fr/] [https://forum.system-cfg.com/viewtopic.php?f=24&amp;amp;t=11535]&lt;br /&gt;
| ✅&lt;br /&gt;
| ❌&lt;br /&gt;
| ❌&lt;br /&gt;
| 0.863b&lt;br /&gt;
| May 13, 2023&lt;br /&gt;
| ❌ Unreleased&lt;br /&gt;
| ❌&lt;br /&gt;
| -&lt;br /&gt;
| Freeware&lt;br /&gt;
|-&lt;br /&gt;
| [[Arnimedes|Arnimedes]] &lt;br /&gt;
| [http://www.arnimedes.de/]&lt;br /&gt;
| ✅&lt;br /&gt;
| ❌&lt;br /&gt;
| ❌&lt;br /&gt;
| 1.02&lt;br /&gt;
| Jul 7, 2012&lt;br /&gt;
| ❌&lt;br /&gt;
| ❌&lt;br /&gt;
| -&lt;br /&gt;
| Freeware&lt;br /&gt;
|-&lt;br /&gt;
| [[Arnold_(Emulator)|Arnold]] &lt;br /&gt;
| [http://www.cpcwiki.eu/forum/emulators/arnold-wip/msg144749/#msg144749] [https://www.cpcwiki.eu/forum/emulators/another-version-of-arnold-emulator/ Aeliss fork] [http://www.yasara.org/cpc/ Arnold TNG] [https://web.archive.org/web/20191023094109/https://www.bannister.org/software/arnold.htm]&lt;br /&gt;
| ✅&lt;br /&gt;
| ⚠️&lt;br /&gt;
| ⚠️&lt;br /&gt;
| [http://www.cpcwiki.eu/imgs/d/dd/Arnoldwip_src.tar.bz2 WIP]&lt;br /&gt;
| May 13, 2017&lt;br /&gt;
| ⚠️&lt;br /&gt;
| ✅&lt;br /&gt;
| [[KC Compact]], [[Aleste 520EX]]&lt;br /&gt;
| Open source&lt;br /&gt;
|-&lt;br /&gt;
| [[CaPriCe|Caprice32]] &lt;br /&gt;
| [https://github.com/ColinPitrat/caprice32/releases] [http://sourceforge.net/projects/caprice32/] [https://snapcraft.io/caprice32] [http://aleste520.narod.ru/caprice.html Caprice32-Aleste]&lt;br /&gt;
| ✅&lt;br /&gt;
| ✅&lt;br /&gt;
| ✅&lt;br /&gt;
| 4.6.0&lt;br /&gt;
| Oct 8, 2022&lt;br /&gt;
| ⚠️&lt;br /&gt;
| ✅&lt;br /&gt;
| -&lt;br /&gt;
| Donationware &amp;amp; Open source&lt;br /&gt;
|-&lt;br /&gt;
| [[Caprice Forever]] &lt;br /&gt;
| [http://www.cpc-power.com/cpcarchives/index.php?page=articles&amp;amp;num=73]&lt;br /&gt;
| ✅&lt;br /&gt;
| ❌&lt;br /&gt;
| ❌&lt;br /&gt;
| 23.7&lt;br /&gt;
| Jul 10, 2023&lt;br /&gt;
| ✅&lt;br /&gt;
| ✅&lt;br /&gt;
| -&lt;br /&gt;
| Freeware&lt;br /&gt;
|-&lt;br /&gt;
| [[Caprice Reloaded]]&lt;br /&gt;
| [https://code.google.com/archive/p/cpcsdk/] [https://web.archive.org/web/20121203193335/https://aur.archlinux.org/packages.php?ID=38856]&lt;br /&gt;
| ✅&lt;br /&gt;
| ❌&lt;br /&gt;
| ⚠️&lt;br /&gt;
| r533&lt;br /&gt;
| Sep 25, 2011&lt;br /&gt;
| ✅&lt;br /&gt;
| ❌&lt;br /&gt;
| -&lt;br /&gt;
| Open source&lt;br /&gt;
|-&lt;br /&gt;
| [[Clock Signal|Clock Signal]] &lt;br /&gt;
| [https://github.com/TomHarte/CLK/releases] [https://snapcraft.io/clock-signal]&lt;br /&gt;
| ❌&lt;br /&gt;
| ✅&lt;br /&gt;
| ✅&lt;br /&gt;
| &lt;br /&gt;
| Sep 10, 2023&lt;br /&gt;
| ❌&lt;br /&gt;
| ❌&lt;br /&gt;
| [[ZX Spectrum]], [[Enterprise]], [[MSX]], [[ColecoVision]], [[Acorn Electron]], [[Apple II]], [[Oric 1/Atmos|Oric]], [[VIC-20]], [[ZX80/81]], [[Atari 2600]], [[Atari ST]], [[Macintosh]]&lt;br /&gt;
| Donationware &amp;amp; Open source&lt;br /&gt;
|-&lt;br /&gt;
| [[CoPaCabana|CoPaCabana]]&lt;br /&gt;
| [http://copacabana.emuunlim.com/]&lt;br /&gt;
| ✅&lt;br /&gt;
| ❌&lt;br /&gt;
| ❌&lt;br /&gt;
| 0.74&lt;br /&gt;
| Apr 12, 2006&lt;br /&gt;
| ⚠️&lt;br /&gt;
| ❌&lt;br /&gt;
| -&lt;br /&gt;
| Donationware&lt;br /&gt;
|-&lt;br /&gt;
| [[CPC++|CPC++]] &lt;br /&gt;
| [http://bricerive.free.fr/cpc/cpcpp.html]&lt;br /&gt;
| ✅&lt;br /&gt;
| ✅&lt;br /&gt;
| ⚠️&lt;br /&gt;
| b700&lt;br /&gt;
| May 31, 2015&lt;br /&gt;
| ❌&lt;br /&gt;
| ❌&lt;br /&gt;
| -&lt;br /&gt;
| Freeware&lt;br /&gt;
|-&lt;br /&gt;
| [[cpc4x|cpc4x]] &lt;br /&gt;
| [http://www.ulrich-cordes.de/cpc/english/cpcemu.htm]&lt;br /&gt;
| ❌&lt;br /&gt;
| ❌&lt;br /&gt;
| ⚠️&lt;br /&gt;
| 0.26&lt;br /&gt;
| Dec 11, 2004&lt;br /&gt;
| ❌&lt;br /&gt;
| ❌&lt;br /&gt;
| -&lt;br /&gt;
| Open source&lt;br /&gt;
|-&lt;br /&gt;
| [[CPCEC|CPCEC]] &lt;br /&gt;
| [http://cngsoft.no-ip.org/cpcec.htm] [https://github.com/cpcitor/cpcec] [http://cngsoft.no-ip.org/ CPCE] [https://github.com/AmatCoder/CPCEG CPCEG]&lt;br /&gt;
| ✅&lt;br /&gt;
| ❌&lt;br /&gt;
| ⚠️&lt;br /&gt;
| &lt;br /&gt;
| Aug 6, 2022&lt;br /&gt;
| ⚠️&lt;br /&gt;
| ✅&lt;br /&gt;
| [[ZX Spectrum]], [[Commodore 64]], [https://www.youtube.com/watch?v=5LwCy0gRAEc MSX (unreleased)]&lt;br /&gt;
| Open source&lt;br /&gt;
|-&lt;br /&gt;
| [[CPCEC|cpcec-gtk]] &lt;br /&gt;
| [https://bitbucket.org/norecess464/cpcec-gtk/]&lt;br /&gt;
| ❌&lt;br /&gt;
| ❌&lt;br /&gt;
| ✅&lt;br /&gt;
| &lt;br /&gt;
| Feb 4, 2023&lt;br /&gt;
| ✅&lt;br /&gt;
| ✅&lt;br /&gt;
| -&lt;br /&gt;
| Open source&lt;br /&gt;
|-&lt;br /&gt;
| [[CPCemu|CPCemu]] &lt;br /&gt;
| [http://www.cpc-emu.org/]&lt;br /&gt;
| ✅&lt;br /&gt;
| ✅&lt;br /&gt;
| ✅&lt;br /&gt;
| 2.5&lt;br /&gt;
| Aug 13, 2022&lt;br /&gt;
| ⚠️&lt;br /&gt;
| ❌&lt;br /&gt;
| -&lt;br /&gt;
| Freeware&lt;br /&gt;
|-&lt;br /&gt;
| [[CPCEPower|CPCEPower]] &lt;br /&gt;
| [https://www.cpc-power.com/cpcarchives/index.php?page=articles&amp;amp;num=73]&lt;br /&gt;
| ✅&lt;br /&gt;
| ✅&lt;br /&gt;
| ✅&lt;br /&gt;
| 2105&lt;br /&gt;
| Jun 4, 2021&lt;br /&gt;
| ❌&lt;br /&gt;
| ✅&lt;br /&gt;
| -&lt;br /&gt;
| Freeware&lt;br /&gt;
|-&lt;br /&gt;
| [[CPCSharp|CPCSharp]] &lt;br /&gt;
| [https://github.com/dolbz/CPCSharp/releases/]&lt;br /&gt;
| ✅&lt;br /&gt;
| ✅&lt;br /&gt;
| ❌&lt;br /&gt;
| 1.0.0-beta1&lt;br /&gt;
| Apr 7, 2021&lt;br /&gt;
| ⚠️&lt;br /&gt;
| ❌&lt;br /&gt;
| -&lt;br /&gt;
| Open source&lt;br /&gt;
|-&lt;br /&gt;
| [[CPvC|CPvC]]&lt;br /&gt;
| [https://github.com/alybaek2/cpvc]&lt;br /&gt;
| ✅&lt;br /&gt;
| ❌&lt;br /&gt;
| ❌&lt;br /&gt;
| &lt;br /&gt;
| Oct 7, 2020&lt;br /&gt;
| ❌&lt;br /&gt;
| ❌&lt;br /&gt;
| -&lt;br /&gt;
| Open source&lt;br /&gt;
|-&lt;br /&gt;
| [[DSP|DSP]]&lt;br /&gt;
| [https://github.com/leniad/dsp-emulator/]&lt;br /&gt;
| ✅&lt;br /&gt;
| ⚠️&lt;br /&gt;
| ⚠️&lt;br /&gt;
| 0.22wip5&lt;br /&gt;
| Aug 22, 2023&lt;br /&gt;
| ❌&lt;br /&gt;
| ❌&lt;br /&gt;
| [[ZX Spectrum]], [[Commodore 64]], [[ColecoVision]], [[Game Boy]], [[NES]], [[SG-1000]], [[Master System]], [[Game Gear]], [[Super Cassette Vision]], [[PV-1000]], [[PV-2000]], [[Arcade]]&lt;br /&gt;
| Open source&lt;br /&gt;
|-&lt;br /&gt;
| [[ep128emu|ep128emu]]&lt;br /&gt;
| [https://github.com/istvan-v/ep128emu]&lt;br /&gt;
| ✅&lt;br /&gt;
| ⚠️&lt;br /&gt;
| ⚠️&lt;br /&gt;
| 2.0.11.2&lt;br /&gt;
| Apr 19, 2019&lt;br /&gt;
| ⚠️&lt;br /&gt;
| ❌&lt;br /&gt;
| [[ZX Spectrum]], [[Enterprise]]&lt;br /&gt;
| Donationware &amp;amp; Open source&lt;br /&gt;
|-&lt;br /&gt;
| [[MacCPC|MacCPC]]&lt;br /&gt;
| [http://www.wincpc.ch/index.php?topic=projects-maccpc]&lt;br /&gt;
| ❌&lt;br /&gt;
| ✅&lt;br /&gt;
| ❌&lt;br /&gt;
| 0.9.2&lt;br /&gt;
| Jan 22, 2010&lt;br /&gt;
| ✅&lt;br /&gt;
| ❌&lt;br /&gt;
| -&lt;br /&gt;
| Freeware&lt;br /&gt;
|-&lt;br /&gt;
| [[MESS|MAME]]&lt;br /&gt;
| [http://mamedev.org/release.html] [http://wiki.mamedev.org/index.php/SDL_Supported_Platforms] [http://sdlmame.lngn.net/]&lt;br /&gt;
| ✅&lt;br /&gt;
| ✅&lt;br /&gt;
| ✅&lt;br /&gt;
| 0.258&lt;br /&gt;
| Aug 30, 2023&lt;br /&gt;
| ⚠️&lt;br /&gt;
| ✅&lt;br /&gt;
| [[KC Compact]], [[Aleste 520EX]] &amp;amp; lots of other computer systems&lt;br /&gt;
| Open source&lt;br /&gt;
|-&lt;br /&gt;
| [[NO$CPC|NO$CPC]]&lt;br /&gt;
| [http://problemkaputt.de/cpc.htm]&lt;br /&gt;
| ✅&lt;br /&gt;
| ❌&lt;br /&gt;
| ❌&lt;br /&gt;
| 1.8&lt;br /&gt;
| Nov 2, 2000&lt;br /&gt;
| ⚠️&lt;br /&gt;
| ✅&lt;br /&gt;
| -&lt;br /&gt;
| Freeware&lt;br /&gt;
|-&lt;br /&gt;
| [[PC-CPC|PC-CPC]] &lt;br /&gt;
| [http://cpcrulez.fr/emulateurs_download-WIN-PC-CPC.htm] [https://github.com/DemoniakLudo/PC-CPC]&lt;br /&gt;
| ✅&lt;br /&gt;
| ❌&lt;br /&gt;
| ❌&lt;br /&gt;
| 0.1at b29&lt;br /&gt;
| Nov 17, 2011&lt;br /&gt;
| ⚠️&lt;br /&gt;
| ❌&lt;br /&gt;
| -&lt;br /&gt;
| Open source&lt;br /&gt;
|-&lt;br /&gt;
| [[Retro Virtual Machine|Retro Virtual Machine]]&lt;br /&gt;
| [https://www.retrovirtualmachine.org]&lt;br /&gt;
| ✅&lt;br /&gt;
| ✅&lt;br /&gt;
| ✅&lt;br /&gt;
| 2.1.8&lt;br /&gt;
| Sep 1, 2023&lt;br /&gt;
| ❌ Removed&lt;br /&gt;
| ✅&lt;br /&gt;
| [[ZX Spectrum]], [[MSX|MSX 1]], [[ColecoVision]], [[SG-1000]], [[Master System]]&lt;br /&gt;
| Donationware&lt;br /&gt;
|-&lt;br /&gt;
| [[Roland Emulator|Roland]] &lt;br /&gt;
| [https://www.rolandemu.de/en/downloads.html]/[https://github.com/raldus/roland GitHub]&lt;br /&gt;
| ✅&lt;br /&gt;
| ❌&lt;br /&gt;
| ✅&lt;br /&gt;
| 0.70&lt;br /&gt;
| Apr 20, 2017&lt;br /&gt;
| ❌&lt;br /&gt;
| ❌&lt;br /&gt;
| -&lt;br /&gt;
| Open source&lt;br /&gt;
|-&lt;br /&gt;
| [[Ronald|Ronald]] &lt;br /&gt;
| [https://github.com/mdm/ronald]&lt;br /&gt;
| ❌&lt;br /&gt;
| ❌&lt;br /&gt;
| ⚠️&lt;br /&gt;
| &lt;br /&gt;
| May 10, 2023&lt;br /&gt;
| ⚠️&lt;br /&gt;
| ❌&lt;br /&gt;
| -&lt;br /&gt;
| Open source&lt;br /&gt;
|-&lt;br /&gt;
| [[SugarBox|SugarBox]]&lt;br /&gt;
| [http://sugarbox.free.fr/] [https://github.com/Tom1975/SugarboxV2]&lt;br /&gt;
| ✅&lt;br /&gt;
| ✅&lt;br /&gt;
| ✅&lt;br /&gt;
| 2.0.1&lt;br /&gt;
| May 26, 2023&lt;br /&gt;
| ⚠️&lt;br /&gt;
| ✅&lt;br /&gt;
| -&lt;br /&gt;
| Open-Source&lt;br /&gt;
|-&lt;br /&gt;
| [[VirtualCPC|Virtual CPC]] &lt;br /&gt;
| [https://web.archive.org/web/20200112094913/http://users.otenet.gr/~sulfonic/cpc/] [https://cpcrulez.fr/emulateurs_download-WIN-virtual_cpc.htm]&lt;br /&gt;
| ✅&lt;br /&gt;
| ❌&lt;br /&gt;
| ❌&lt;br /&gt;
| 1.1&lt;br /&gt;
| Aug 8, 2011&lt;br /&gt;
| ⚠️&lt;br /&gt;
| ❌&lt;br /&gt;
| -&lt;br /&gt;
| Freeware&lt;br /&gt;
|-&lt;br /&gt;
| [[WinApe|WinAPE]] &lt;br /&gt;
| [http://www.winape.net/] [https://www-ftp.lip6.fr/pub/amstrad/emulator/CPCWIN10.ZIP CPCwin]&lt;br /&gt;
| ✅&lt;br /&gt;
| ❌&lt;br /&gt;
| ❌&lt;br /&gt;
| 2.0b2&lt;br /&gt;
| Jan 5, 2016&lt;br /&gt;
| ✅&lt;br /&gt;
| ✅&lt;br /&gt;
| -&lt;br /&gt;
| Donationware&lt;br /&gt;
|-&lt;br /&gt;
| [[WinCPC|WinCPC]] &lt;br /&gt;
| [http://www.wincpc.ch/index.php?topic=projects-wincpc] [https://web.archive.org/web/20050409133618/http://www.easypoint.ch/vbcpc/ vbCPC]&lt;br /&gt;
| ✅&lt;br /&gt;
| ❌&lt;br /&gt;
| ❌&lt;br /&gt;
| 0.9.26&lt;br /&gt;
| Feb 1, 2007&lt;br /&gt;
| ✅&lt;br /&gt;
| ❌&lt;br /&gt;
| -&lt;br /&gt;
| Freeware&lt;br /&gt;
|-&lt;br /&gt;
| [[XCPC|Xcpc]]&lt;br /&gt;
| [https://www.xcpc-emulator.net/]&lt;br /&gt;
| ❌&lt;br /&gt;
| ❌&lt;br /&gt;
| ✅&lt;br /&gt;
| 0.38.1&lt;br /&gt;
| Apr 8, 2023&lt;br /&gt;
| ❌&lt;br /&gt;
| ❌&lt;br /&gt;
| -&lt;br /&gt;
| Open source&lt;br /&gt;
|-&lt;br /&gt;
| [[XNACPC|XNACPC]]&lt;br /&gt;
| [http://www.gavpugh.com/2011/11/11/xnacpc-xbox-360-amstrad-cpc-emulator-released/] [https://www.gavpugh.com/old-code/ CPC3D]&lt;br /&gt;
| ✅&lt;br /&gt;
| ❌&lt;br /&gt;
| ❌&lt;br /&gt;
| 1.0&lt;br /&gt;
| Nov 11, 2011&lt;br /&gt;
| ❌&lt;br /&gt;
| ❌&lt;br /&gt;
| -&lt;br /&gt;
| Open source&lt;br /&gt;
|-&lt;br /&gt;
| [[YACE|YACE]]&lt;br /&gt;
| [http://www.youtube.com/watch?v=uxQkljwc0i4]&lt;br /&gt;
| ❌&lt;br /&gt;
| ❌&lt;br /&gt;
| ⚠️&lt;br /&gt;
| &lt;br /&gt;
| Nov 12, 2014&lt;br /&gt;
| ✅&lt;br /&gt;
| ❌&lt;br /&gt;
| -&lt;br /&gt;
| ❌ Unreleased&lt;br /&gt;
|-&lt;br /&gt;
| [[ZEsarUX|ZEsarUX]]&lt;br /&gt;
| [https://github.com/chernandezba/zesarux]&lt;br /&gt;
| ✅&lt;br /&gt;
| ✅&lt;br /&gt;
| ✅&lt;br /&gt;
| X&lt;br /&gt;
| Sep 8, 2023&lt;br /&gt;
| ⚠️&lt;br /&gt;
| ❌&lt;br /&gt;
| [[PCW]], [[ZX Spectrum]], [[ZX80/81]], [[MSX|MSX 1]], [[ColecoVision]], [[Spectravideo]], [[Jupiter ACE]], [[Sam Coupe]], [[SG-1000]], [[Master System]], [[Sinclair QL]], [[MK14]], [[Z88]]&lt;br /&gt;
| Donationware &amp;amp; Open source&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Alternative OS ==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable sortable&amp;quot;&lt;br /&gt;
! Host system&lt;br /&gt;
! Emulator name&lt;br /&gt;
! External link&lt;br /&gt;
! Current version&lt;br /&gt;
! Latest release&lt;br /&gt;
! Developer tools&lt;br /&gt;
! Amstrad Plus&lt;br /&gt;
! Also emulates&lt;br /&gt;
! License&lt;br /&gt;
|-&lt;br /&gt;
| AmigaOS PPC&lt;br /&gt;
| [[Arnold|Arnold]]&lt;br /&gt;
| [http://hirudov.com/amiga/Arnold.php]&lt;br /&gt;
| 1.15&lt;br /&gt;
| Dec 17, 2012&lt;br /&gt;
| ❌&lt;br /&gt;
| ✅&lt;br /&gt;
| [[KC Compact]]&lt;br /&gt;
| Open source&lt;br /&gt;
|-&lt;br /&gt;
| AmigaOS PPC&lt;br /&gt;
| [[MESS|SDLMESS]]&lt;br /&gt;
| [http://se.os4depot.net/index.php?function=showfile&amp;amp;file=emulation/computer/sdl_mess.lha]&lt;br /&gt;
| 0.146u4&lt;br /&gt;
| Aug 19, 2012&lt;br /&gt;
| ⚠️&lt;br /&gt;
| ✅&lt;br /&gt;
| [[KC Compact]], [[Aleste 520EX]] &amp;amp; lots of other computer systems&lt;br /&gt;
| Open source&lt;br /&gt;
|-&lt;br /&gt;
| Haiku&lt;br /&gt;
| [[ACE_(Emulator)|ACE]]&lt;br /&gt;
| [http://www.cpcwiki.eu/forum/emulators/ace-for-haiku/] [http://ace.cpcscene.net/]&lt;br /&gt;
| 1.25.0&lt;br /&gt;
| Feb 18, 2023&lt;br /&gt;
| ✅&lt;br /&gt;
| ✅&lt;br /&gt;
| -&lt;br /&gt;
| Freeware&lt;br /&gt;
|-&lt;br /&gt;
| Haiku&lt;br /&gt;
| [[AdvanceMAME|AdvanceMAME]]&lt;br /&gt;
| [https://depot.haiku-os.org/#!/pkg/advancemame_x86]&lt;br /&gt;
| 3.9-1&lt;br /&gt;
| Feb 3, 2020&lt;br /&gt;
| ⚠️&lt;br /&gt;
| ✅&lt;br /&gt;
| [[KC Compact]], [[Aleste 520EX]] &amp;amp; lots of other computer systems&lt;br /&gt;
| Open source&lt;br /&gt;
|-&lt;br /&gt;
| MorphOS&lt;br /&gt;
| [[ACE_(Emulator)|ACE]]&lt;br /&gt;
| [http://ace.cpcscene.net/]&lt;br /&gt;
| 1.25&lt;br /&gt;
| September 8, 2022&lt;br /&gt;
| ✅&lt;br /&gt;
| ✅&lt;br /&gt;
| -&lt;br /&gt;
| Freeware&lt;br /&gt;
|-&lt;br /&gt;
| MorphOS&lt;br /&gt;
| [[MESS|MESS]]&lt;br /&gt;
| [http://fabportnawak.free.fr/mame/]&lt;br /&gt;
| 0.113&lt;br /&gt;
| Nov 1, 2007&lt;br /&gt;
| ⚠️&lt;br /&gt;
| ✅&lt;br /&gt;
| [[KC Compact]], [[Aleste 520EX]] &amp;amp; lots of other computer systems&lt;br /&gt;
| Open source&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Mobile ==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable sortable&amp;quot;&lt;br /&gt;
! Host system&lt;br /&gt;
! Emulator name&lt;br /&gt;
! External link&lt;br /&gt;
! Current version&lt;br /&gt;
! Latest release&lt;br /&gt;
! Amstrad Plus&lt;br /&gt;
! Also emulates&lt;br /&gt;
! License&lt;br /&gt;
|-&lt;br /&gt;
| Android&lt;br /&gt;
| [[andcpc]]&lt;br /&gt;
| [http://code.google.com/p/andcpc/]&lt;br /&gt;
| 1.5.1&lt;br /&gt;
| Apr 4, 2011&lt;br /&gt;
| ❌&lt;br /&gt;
| -&lt;br /&gt;
| Open source&lt;br /&gt;
|-&lt;br /&gt;
| Android&lt;br /&gt;
| [[Azimuth]]&lt;br /&gt;
| [https://play.google.com/store/apps/details?id=johnidis.azimuth]&lt;br /&gt;
| 1.11&lt;br /&gt;
| Aug 22, 2023&lt;br /&gt;
| ❌&lt;br /&gt;
| -&lt;br /&gt;
| Adware and in-app purchases💲&lt;br /&gt;
|-&lt;br /&gt;
| Android&lt;br /&gt;
| [[CPCDroid]]&lt;br /&gt;
| [https://fmsdevel.wisecoding.es/cpcdroid-amstrad-cpc-on-android-phone-2/]&lt;br /&gt;
| 1.5.1&lt;br /&gt;
| Mar 2, 2011&lt;br /&gt;
| ❌&lt;br /&gt;
| -&lt;br /&gt;
| Open source&lt;br /&gt;
|-&lt;br /&gt;
| Android&lt;br /&gt;
| [[CPCemu|CPCemu]] &lt;br /&gt;
| [https://play.google.com/store/apps/details?id=com.loritznet.softwarecreations.cpcemu]&lt;br /&gt;
| 2.5&lt;br /&gt;
| Aug 14, 2022&lt;br /&gt;
| ❌&lt;br /&gt;
| -&lt;br /&gt;
| Freeware&lt;br /&gt;
|-&lt;br /&gt;
| Android&lt;br /&gt;
| [[Droid-CPC]]&lt;br /&gt;
| [http://play.google.com/store/apps/details?id=com.kokak.droidcpc]&lt;br /&gt;
| 1.1.01&lt;br /&gt;
| Dec 15, 2016&lt;br /&gt;
| ❌&lt;br /&gt;
| -&lt;br /&gt;
| Commercial💲&lt;br /&gt;
|-&lt;br /&gt;
| iOS&lt;br /&gt;
| [[CPCemu|CPCemu]]&lt;br /&gt;
| [http://www.cpc-emu.org/]&lt;br /&gt;
| 2.5&lt;br /&gt;
| Aug 13, 2022&lt;br /&gt;
| ❌&lt;br /&gt;
| -&lt;br /&gt;
| Software available on request&lt;br /&gt;
|-&lt;br /&gt;
| iOS&lt;br /&gt;
| [[CrocoDS]]&lt;br /&gt;
| [https://github.com/redbug26/crocods-ios]&lt;br /&gt;
| 2.1&lt;br /&gt;
| Jun 21, 2013&lt;br /&gt;
| ❌&lt;br /&gt;
| -&lt;br /&gt;
| Open source&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
= Discontinued Operating Systems =&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable sortable&amp;quot;&lt;br /&gt;
! Host system&lt;br /&gt;
! Emulator name&lt;br /&gt;
! External link&lt;br /&gt;
! Current version&lt;br /&gt;
! Latest release&lt;br /&gt;
! Amstrad Plus&lt;br /&gt;
! Also emulates&lt;br /&gt;
! License&lt;br /&gt;
|-&lt;br /&gt;
| Acorn RISC OS&lt;br /&gt;
| [[!CPC|!CPC]]&lt;br /&gt;
| [https://www-ftp.lip6.fr/pub/amstrad/emulator/CPC0728.ZIP] [http://ftp2.fr.openbsd.org/ftp/pub/amstrad/emulator/CPCS1124.ZIP]&lt;br /&gt;
| &lt;br /&gt;
| Jul 28, 1996&lt;br /&gt;
| ❌&lt;br /&gt;
| -&lt;br /&gt;
| Open source&lt;br /&gt;
|-&lt;br /&gt;
| Acorn RISC OS&lt;br /&gt;
| [[!CPCemu|!CPCemu]]&lt;br /&gt;
| [http://huggers-world.de/mops.html]&lt;br /&gt;
| 1.21&lt;br /&gt;
| Mar 22, 2016&lt;br /&gt;
| ❌&lt;br /&gt;
| -&lt;br /&gt;
| Open source&lt;br /&gt;
|-&lt;br /&gt;
| AmigaOS m68k&lt;br /&gt;
| [[A-CPC|A-CPC]]&lt;br /&gt;
| [https://cpctech.cpcwiki.de/download/a-cpc.lha]&lt;br /&gt;
| 2.0&lt;br /&gt;
| Mar 30, 2002&lt;br /&gt;
| ✅&lt;br /&gt;
| -&lt;br /&gt;
| Open source&lt;br /&gt;
|-&lt;br /&gt;
| AmigaOS m68k&lt;br /&gt;
| [[Ami-cpc|Ami-cpc]]&lt;br /&gt;
| [http://deplanque.chez.com/] [http://deplanque.chez.com/download_fr.html Ami-cpc2]&lt;br /&gt;
| 0.46&lt;br /&gt;
| Jan 21, 1998&lt;br /&gt;
| ❌&lt;br /&gt;
| -&lt;br /&gt;
| Open source&lt;br /&gt;
|-&lt;br /&gt;
| AmigaOS m68k&lt;br /&gt;
| [[CPE|CPE]]&lt;br /&gt;
| [https://cpcrulez.fr/emulateurs_download-AMIGA-CPE.htm]&lt;br /&gt;
| &lt;br /&gt;
| Feb 24, 1995&lt;br /&gt;
| ❌&lt;br /&gt;
| -&lt;br /&gt;
| Open source&lt;br /&gt;
|-&lt;br /&gt;
| AmigaOS m68k&lt;br /&gt;
| [[Emu-CPC|EmuCPC]]&lt;br /&gt;
| [https://cpcrulez.fr/emulateurs_download-AMIGA-emucpc.htm]&lt;br /&gt;
| 0.7&lt;br /&gt;
| Sep 15, 1996&lt;br /&gt;
| ❌&lt;br /&gt;
| -&lt;br /&gt;
| Open source&lt;br /&gt;
|-&lt;br /&gt;
| BlackBerry OS&lt;br /&gt;
| [[BB-CPC|BB-CPC]]&lt;br /&gt;
| [http://appworld.blackberry.com/webstore/content/30963891/] (dead link)&lt;br /&gt;
| 1.0.1.3&lt;br /&gt;
| Jul 15, 2013&lt;br /&gt;
| ❌&lt;br /&gt;
| -&lt;br /&gt;
| Commercial💲&lt;br /&gt;
|-&lt;br /&gt;
| Classic Mac OS&lt;br /&gt;
| [[CPCplusplus|CPC++]]&lt;br /&gt;
| [http://bricerive.free.fr/cpc/cpcpp.html]&lt;br /&gt;
| 1.3.2&lt;br /&gt;
| Oct 6, 1997&lt;br /&gt;
| ❌&lt;br /&gt;
| -&lt;br /&gt;
| Shareware💲&lt;br /&gt;
|-&lt;br /&gt;
| DOS&lt;br /&gt;
| [[AdvanceMESS|AdvanceMESS]]&lt;br /&gt;
| [https://www.advancemame.it/readme]&lt;br /&gt;
| 3.9&lt;br /&gt;
| Sep 8, 2018&lt;br /&gt;
| ✅&lt;br /&gt;
| [[KC Compact]], [[Aleste 520EX]] &amp;amp; lots of other computer systems&lt;br /&gt;
| Open source&lt;br /&gt;
|-&lt;br /&gt;
| DOS&lt;br /&gt;
| [[Arnimedes|Arnimedes]]&lt;br /&gt;
| [http://www.arnimedes.de/]&lt;br /&gt;
| 0.8a&lt;br /&gt;
| Apr 15, 2000&lt;br /&gt;
| ❌&lt;br /&gt;
| -&lt;br /&gt;
| Freeware&lt;br /&gt;
|-&lt;br /&gt;
| DOS&lt;br /&gt;
| [[Caprice32]] &lt;br /&gt;
| [https://ftp.nvg.ntnu.no/pub/cpc/emulator/msdos/capriced.zip]&lt;br /&gt;
| 1.11&lt;br /&gt;
| Sep 20, 1999&lt;br /&gt;
| ❌&lt;br /&gt;
| -&lt;br /&gt;
| Open source&lt;br /&gt;
|-&lt;br /&gt;
| DOS&lt;br /&gt;
| [[CPC]] &lt;br /&gt;
| [https://www-ftp.lip6.fr/pub/amstrad/emulator/CPC055B.ZIP]&lt;br /&gt;
| 0.55b&lt;br /&gt;
| May 16, 1997&lt;br /&gt;
| ❌&lt;br /&gt;
| -&lt;br /&gt;
| Freeware&lt;br /&gt;
|-&lt;br /&gt;
| DOS&lt;br /&gt;
| [[CPC-em|CPC-em]] &lt;br /&gt;
| [http://cpc-em.emuunlim.com/]&lt;br /&gt;
| 0.4&lt;br /&gt;
| Jul 7, 2004&lt;br /&gt;
| ❌&lt;br /&gt;
| -&lt;br /&gt;
| Open source&lt;br /&gt;
|-&lt;br /&gt;
| DOS&lt;br /&gt;
| [[CPCE|CPCE]]&lt;br /&gt;
| [http://cngsoft.no-ip.org/cpce/]&lt;br /&gt;
| 1.94&lt;br /&gt;
| Jun 2, 2011&lt;br /&gt;
| ❌&lt;br /&gt;
| -&lt;br /&gt;
| Freeware&lt;br /&gt;
|-&lt;br /&gt;
| DOS&lt;br /&gt;
| [[CPCemu|CPCemu]]&lt;br /&gt;
| [http://www.cpc-emu.org/]&lt;br /&gt;
| 1.5&lt;br /&gt;
| Jul 7, 1998&lt;br /&gt;
| ❌&lt;br /&gt;
| -&lt;br /&gt;
| Freeware&lt;br /&gt;
|-&lt;br /&gt;
| DOS&lt;br /&gt;
| [[CPE|CPE]]&lt;br /&gt;
| [https://cpcrulez.fr/emulateurs_download-DOS-CPE.htm]&lt;br /&gt;
| 5.2&lt;br /&gt;
| Apr 21, 1997&lt;br /&gt;
| ❌&lt;br /&gt;
| -&lt;br /&gt;
| Open source&lt;br /&gt;
|-&lt;br /&gt;
| DOS&lt;br /&gt;
| [[NO$CPC|NO$CPC]]&lt;br /&gt;
| [http://problemkaputt.de/cpc.htm]&lt;br /&gt;
| 1.8&lt;br /&gt;
| Nov 2, 2000&lt;br /&gt;
| ✅&lt;br /&gt;
| -&lt;br /&gt;
| Freeware&lt;br /&gt;
|-&lt;br /&gt;
| DOS&lt;br /&gt;
| [[PC-CPC|PC-CPC]] &lt;br /&gt;
| [http://deplanque.chez.com/download_fr.html]&lt;br /&gt;
| &lt;br /&gt;
| Feb 3, 1998&lt;br /&gt;
| ❌&lt;br /&gt;
| -&lt;br /&gt;
| Open source&lt;br /&gt;
|-&lt;br /&gt;
| DOS&lt;br /&gt;
| [[CPCEMU (RWCPC)|RWCPC]]&lt;br /&gt;
| [https://www-ftp.lip6.fr/pub/amstrad/emulator/RWCPC.ZIP]&lt;br /&gt;
| &lt;br /&gt;
| Mar 23, 1995&lt;br /&gt;
| ❌&lt;br /&gt;
| -&lt;br /&gt;
| Freeware&lt;br /&gt;
|-&lt;br /&gt;
| DOS&lt;br /&gt;
| [[SIMCPC|SIMCPC]]&lt;br /&gt;
| [https://www-ftp.lip6.fr/pub/amstrad/emulator/SIMCPC.ZIP]&lt;br /&gt;
| &lt;br /&gt;
| Dec 10, 1989&lt;br /&gt;
| ❌&lt;br /&gt;
| -&lt;br /&gt;
| Shareware💲&lt;br /&gt;
|-&lt;br /&gt;
| DOS&lt;br /&gt;
| [[YAGE|YAGE]]&lt;br /&gt;
| [https://www.zophar.net/cpc/yage.html]&lt;br /&gt;
| 0.91&lt;br /&gt;
| Oct 24, 1998&lt;br /&gt;
| ❌&lt;br /&gt;
| -&lt;br /&gt;
| Freeware&lt;br /&gt;
|-&lt;br /&gt;
| EXOS&lt;br /&gt;
| [[Software CPC Emulator|Software CPC Emulator]]&lt;br /&gt;
| [http://www.ep128.hu/Ep_Util/Prg/Amstrad_CPC_Emulator_13.rar] [http://www.ep128.hu/Ep_Util/Amstrad_CPC_emu.htm]&lt;br /&gt;
| 1.3&lt;br /&gt;
| Jan 11, 2013&lt;br /&gt;
| ❌&lt;br /&gt;
| -&lt;br /&gt;
| Open source&lt;br /&gt;
|-&lt;br /&gt;
| Maemo&lt;br /&gt;
| [[CPCm]]&lt;br /&gt;
| [http://maemo.org/downloads/product/Maemo5/cpcm/]&lt;br /&gt;
| 1.20-1&lt;br /&gt;
| Apr 27, 2010&lt;br /&gt;
| ❌&lt;br /&gt;
| -&lt;br /&gt;
| Open source&lt;br /&gt;
|-&lt;br /&gt;
| MSX-DOS&lt;br /&gt;
| [[EMU6CPC|EMU6CPC]]&lt;br /&gt;
| [http://romu6.blogspot.com/2018/12/emu6cpc-emulador-de-amstrad-cpc-6128.html]&lt;br /&gt;
| &lt;br /&gt;
| Dec 17, 2018&lt;br /&gt;
| ❌&lt;br /&gt;
| -&lt;br /&gt;
| Freeware&lt;br /&gt;
|-&lt;br /&gt;
| Palm OS&lt;br /&gt;
| [[CaPriCe for Palm OS|CaPriCe for Palm OS]]&lt;br /&gt;
| [https://web.archive.org/web/20230127143354/https://coste.frederic.free.fr/cpc/cpc_en.htm]&lt;br /&gt;
| 2.8&lt;br /&gt;
| Jun 28, 2011&lt;br /&gt;
| ❌&lt;br /&gt;
| -&lt;br /&gt;
| Open source&lt;br /&gt;
|-&lt;br /&gt;
| Palm OS&lt;br /&gt;
| [[CoPaCabana|CoPaCabana]]&lt;br /&gt;
| [http://copacabana.emuunlim.com/]&lt;br /&gt;
| 0.75&lt;br /&gt;
| Dec 4, 2007&lt;br /&gt;
| ❌&lt;br /&gt;
| -&lt;br /&gt;
| Freeware&lt;br /&gt;
|-&lt;br /&gt;
| Pocket PC&lt;br /&gt;
| [[CaPriCe|PocketCaprice]]&lt;br /&gt;
| [https://web.archive.org/web/20160506010209/http://www.clubic.com/telecharger-fiche44888-pocketcaprice.html]&lt;br /&gt;
| 0.9&lt;br /&gt;
| Aug 19, 2007&lt;br /&gt;
| ❌&lt;br /&gt;
| -&lt;br /&gt;
| Freeware&lt;br /&gt;
|-&lt;br /&gt;
| SunOS&lt;br /&gt;
| [[CPCplusplus|CPC++]]&lt;br /&gt;
| [http://bricerive.free.fr/cpc/cpcpp.html]&lt;br /&gt;
| 1.3.0&lt;br /&gt;
| Feb 22, 1997&lt;br /&gt;
| ❌&lt;br /&gt;
| -&lt;br /&gt;
| Shareware💲&lt;br /&gt;
|-&lt;br /&gt;
| Symbian&lt;br /&gt;
| [[S60-CPC|S60-CPC]]&lt;br /&gt;
| [http://kokak.free.fr/s60cpc.htm]&lt;br /&gt;
| 0.74&lt;br /&gt;
| Feb 21, 2006&lt;br /&gt;
| ❌&lt;br /&gt;
| -&lt;br /&gt;
| Open source&lt;br /&gt;
|-&lt;br /&gt;
| Windows 9x&lt;br /&gt;
| [[CPC-em|CPC-em]] &lt;br /&gt;
| [http://cpc-em.emuunlim.com/]&lt;br /&gt;
| 0.3&lt;br /&gt;
| Jan 22, 2004&lt;br /&gt;
| ❌&lt;br /&gt;
| -&lt;br /&gt;
| Open source&lt;br /&gt;
|-&lt;br /&gt;
| Windows 9x&lt;br /&gt;
| [[MTMW|MTMW]]&lt;br /&gt;
| [https://cpcrulez.fr/emulateurs_download-WIN-MTMW.htm]&lt;br /&gt;
| 1.30B&lt;br /&gt;
| Jan 11, 2000&lt;br /&gt;
| ✅&lt;br /&gt;
| [[ZX Spectrum]], [[ZX80/81]], [[Enterprise]], [[Jupiter ACE]]&lt;br /&gt;
| Freeware&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
= Home Consoles =&lt;br /&gt;
&lt;br /&gt;
You can use [https://www.retroarch.com/index.php?page=platforms RetroArch] for Amstrad CPC emulation on '''Apple TV, Android TV, Nvidia Shield, Xbox One, Xbox Series, PS2, GameCube, Wii, Wii U and Switch'''. Or you can use these stand-alone CPC emulators:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable sortable&amp;quot;&lt;br /&gt;
! Host system&lt;br /&gt;
! Emulator name&lt;br /&gt;
! External link&lt;br /&gt;
! Current version&lt;br /&gt;
! Latest release&lt;br /&gt;
! Amstrad Plus&lt;br /&gt;
! Also emulates&lt;br /&gt;
! License&lt;br /&gt;
|-&lt;br /&gt;
| Microsoft XBOX&lt;br /&gt;
| [[Arnold|ArnoldX]]&lt;br /&gt;
| [https://web.archive.org/web/20120705163939/http://forums.xbox-scene.com/index.php?showtopic=711667] [https://cpcrulez.fr/emulateurs_download-XBOX-ARNOLDX.htm]&lt;br /&gt;
| v5&lt;br /&gt;
| Apr 20, 2010&lt;br /&gt;
| ✅&lt;br /&gt;
| -&lt;br /&gt;
| Freeware&lt;br /&gt;
|-&lt;br /&gt;
| Microsoft XBOX&lt;br /&gt;
| [[CoinOPS|CoinOPS (RetroFE)]]&lt;br /&gt;
| [https://web.archive.org/web/20160518183115/https://coinopsproject.freeforums.org/viewtopic.php?f=0&amp;amp;t=1213]&lt;br /&gt;
| 5&lt;br /&gt;
| Oct 18, 2012&lt;br /&gt;
| ❌&lt;br /&gt;
| Lots of other computer systems&lt;br /&gt;
| Freeware&lt;br /&gt;
|-&lt;br /&gt;
| Microsoft Xbox 360&lt;br /&gt;
| [[XNACPC|XNACPC]]&lt;br /&gt;
| [http://www.gavpugh.com/2011/11/11/xnacpc-xbox-360-amstrad-cpc-emulator-released/]&lt;br /&gt;
| 1.0&lt;br /&gt;
| Nov 11, 2011&lt;br /&gt;
| ❌&lt;br /&gt;
| -&lt;br /&gt;
| Open source&lt;br /&gt;
|-&lt;br /&gt;
| Nintendo Wii&lt;br /&gt;
| [[Wiituka|Wiituka]]&lt;br /&gt;
| [http://wiituka.dantoine.org/]&lt;br /&gt;
| 0.98.8&lt;br /&gt;
| May 15, 2009&lt;br /&gt;
| ❌&lt;br /&gt;
| -&lt;br /&gt;
| Open source&lt;br /&gt;
|-&lt;br /&gt;
| Sega Dreamcast&lt;br /&gt;
| [[CPCast|CPCast]]&lt;br /&gt;
| [http://www.dcemu.co.uk/vbulletin/showthread.php?t=24100]&lt;br /&gt;
| &lt;br /&gt;
| May 6, 2006&lt;br /&gt;
| ❌&lt;br /&gt;
| -&lt;br /&gt;
| Freeware&lt;br /&gt;
|-&lt;br /&gt;
| Sega Dreamcast&lt;br /&gt;
| [[DreamCPC|DreamCPC]]&lt;br /&gt;
| [https://www.jm1200.fr/index.php?r=2]&lt;br /&gt;
| Alpha 3&lt;br /&gt;
| Oct 16, 2005&lt;br /&gt;
| ❌&lt;br /&gt;
| -&lt;br /&gt;
| Freeware&lt;br /&gt;
|-&lt;br /&gt;
| Sony PS2&lt;br /&gt;
| [[CPC-em|CPC-em]]&lt;br /&gt;
| [https://cpcrulez.fr/emulateurs_download-ps2-CPC-EM.htm]&lt;br /&gt;
| 0.4&lt;br /&gt;
| Dec 22, 2004&lt;br /&gt;
| ❌&lt;br /&gt;
| -&lt;br /&gt;
| Freeware&lt;br /&gt;
|-&lt;br /&gt;
| Sony PS3&lt;br /&gt;
| [[Caprice32|Caprice32]]&lt;br /&gt;
| [https://web.archive.org/web/20171003153204/http://psx-scene.com/forums/content/caprice32-4-1-0-dbg-emulator-ps3-2119/]&lt;br /&gt;
| 4.1.0 DBG&lt;br /&gt;
| Apr 9, 2012&lt;br /&gt;
| ❌&lt;br /&gt;
| -&lt;br /&gt;
| Open source&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
= Handheld Consoles =&lt;br /&gt;
&lt;br /&gt;
Note: Android-based handheld consoles (Razer Edge, Ayn Odin Pro, Retroid Pocket Flip, GPD XP, ...) will work with stand-alone Android CPC emulators or with RetroArch, same as an Android phone.&lt;br /&gt;
&lt;br /&gt;
You can use [https://www.retroarch.com/index.php?page=platforms RetroArch] for Amstrad CPC emulation on '''PSP, PS Vita, DS, 3DS, Switch, Steam Deck, RetroFW, Miyoo and OpenDingux'''. Or you can use these stand-alone CPC emulators:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable sortable&amp;quot;&lt;br /&gt;
! Host system&lt;br /&gt;
! Emulator name&lt;br /&gt;
! External link&lt;br /&gt;
! Current version&lt;br /&gt;
! Latest release&lt;br /&gt;
! Amstrad Plus&lt;br /&gt;
! Also emulates&lt;br /&gt;
! License&lt;br /&gt;
|-&lt;br /&gt;
| Anbernic RG350&lt;br /&gt;
| [[CrocoDS|CrocoDS]]&lt;br /&gt;
| [https://crazypiri.eu/crocods/]&lt;br /&gt;
| &lt;br /&gt;
| Jan 15, 2020&lt;br /&gt;
| ❌&lt;br /&gt;
| -&lt;br /&gt;
| Freeware&lt;br /&gt;
|-&lt;br /&gt;
| Dingoo A320 / A330&lt;br /&gt;
| [[Pituka|Pituka Dingux]]&lt;br /&gt;
| [http://david.dantoine.org/proyecto/4/]&lt;br /&gt;
| 0.8pre&lt;br /&gt;
| Aug 19, 2010&lt;br /&gt;
| ❌&lt;br /&gt;
| -&lt;br /&gt;
| Open source&lt;br /&gt;
|-&lt;br /&gt;
| Dingoo A320 / A330&lt;br /&gt;
| [[Caprice|Dingux-CAP32]]&lt;br /&gt;
| [http://zx81.zx81.free.fr/serendipity/index.php?/categories/105-Amstrad/]&lt;br /&gt;
| 1.1.2&lt;br /&gt;
| Oct 17, 2009&lt;br /&gt;
| ❌&lt;br /&gt;
| -&lt;br /&gt;
| Open source&lt;br /&gt;
|-&lt;br /&gt;
| GamePark Caanoo&lt;br /&gt;
| [[Caprice|Caanoo-CAP32]]&lt;br /&gt;
| [http://zx81.zx81.free.fr/serendipity/index.php?/categories/165-Amstrad/]&lt;br /&gt;
| 1.1.3&lt;br /&gt;
| Apr 24, 2011&lt;br /&gt;
| ❌&lt;br /&gt;
| -&lt;br /&gt;
| Open source&lt;br /&gt;
|-&lt;br /&gt;
| GamePark GP2x&lt;br /&gt;
| [[Caprice|CapriceGP2x]]&lt;br /&gt;
| [https://web.archive.org/web/20130315195529/http://wiki.gp2x.org/wiki/CapriceGP2x]&lt;br /&gt;
| 0.5&lt;br /&gt;
| Feb 22, 2006&lt;br /&gt;
| ❌&lt;br /&gt;
| -&lt;br /&gt;
| Open source&lt;br /&gt;
|-&lt;br /&gt;
| GamePark GP2x&lt;br /&gt;
| [[Caprice|GP2X-CAP32]]&lt;br /&gt;
| [http://zx81.zx81.free.fr/serendipity/index.php?/categories/42-Amstrad/]&lt;br /&gt;
| 1.5.1&lt;br /&gt;
| Aug 29, 2009&lt;br /&gt;
| ❌&lt;br /&gt;
| -&lt;br /&gt;
| Open source&lt;br /&gt;
|-&lt;br /&gt;
| GamePark GP32&lt;br /&gt;
| [[Pituka|Pituka GP32]]&lt;br /&gt;
| [http://david.dantoine.org/proyecto/4/]&lt;br /&gt;
| 1d&lt;br /&gt;
| May 15, 2010&lt;br /&gt;
| ❌&lt;br /&gt;
| -&lt;br /&gt;
| Open source&lt;br /&gt;
|-&lt;br /&gt;
| GamePark Wiz&lt;br /&gt;
| [[Caprice|Wiz-CAP32]]&lt;br /&gt;
| [http://zx81.zx81.free.fr/serendipity/index.php?/categories/89-Amstrad/]&lt;br /&gt;
| 1.1.0&lt;br /&gt;
| Aug 29, 2009&lt;br /&gt;
| ❌&lt;br /&gt;
| -&lt;br /&gt;
| Open source&lt;br /&gt;
|-&lt;br /&gt;
| GCW Zero&lt;br /&gt;
| [[Caprice|Dingux-CAP32]]&lt;br /&gt;
| [https://github.com/kerheol/dingux-cap32]&lt;br /&gt;
| 1.1.2&lt;br /&gt;
| May 25, 2014&lt;br /&gt;
| ❌&lt;br /&gt;
| -&lt;br /&gt;
| Open source&lt;br /&gt;
|-&lt;br /&gt;
| JXD S5110 / S601 &amp;amp; Yinlips G18&lt;br /&gt;
| [[Caprice|JXD-CAP32]]&lt;br /&gt;
| [http://zx81.zx81.free.fr/serendipity/index.php?/categories/206-Amstrad/]&lt;br /&gt;
| 1.1.1&lt;br /&gt;
| Oct 27, 2012&lt;br /&gt;
| ❌&lt;br /&gt;
| -&lt;br /&gt;
| Open source&lt;br /&gt;
|-&lt;br /&gt;
| Nintendo DS&lt;br /&gt;
| [[AmeDS|AmeDS]] &lt;br /&gt;
| [https://web.archive.org/web/20131021073302/http://www.portabledev.com/pages/ds/jeuxdev.-perso/ameds.php]&lt;br /&gt;
| 4.0&lt;br /&gt;
| Apr 25, 2010&lt;br /&gt;
| ❌&lt;br /&gt;
| -&lt;br /&gt;
| Freeware&lt;br /&gt;
|-&lt;br /&gt;
| Nintendo DS&lt;br /&gt;
| [[CrocoDS|CrocoDS]]&lt;br /&gt;
| [http://www.kyuran.be/blog/2007/11/09/crocods-20-2/]&lt;br /&gt;
| 2.0&lt;br /&gt;
| Nov 9, 2007&lt;br /&gt;
| ❌&lt;br /&gt;
| -&lt;br /&gt;
| Freeware&lt;br /&gt;
|-&lt;br /&gt;
| Nintendo GameBoy Advance&lt;br /&gt;
| [[Mini Amstrad Emulator|Mini Amstrad Emulator]] &lt;br /&gt;
| [https://playeradvance.org/forum/showthread.php?t=765]&lt;br /&gt;
| &lt;br /&gt;
| Dec 26, 2005&lt;br /&gt;
| ❌&lt;br /&gt;
| -&lt;br /&gt;
| Open source&lt;br /&gt;
|-&lt;br /&gt;
| Odroid GO&lt;br /&gt;
| [[CapriceESP32|CapriceESP32]] &lt;br /&gt;
| [https://github.com/grantrismo/CapriceESP32]&lt;br /&gt;
| &lt;br /&gt;
| Dec 3, 2020&lt;br /&gt;
| ❌&lt;br /&gt;
| -&lt;br /&gt;
| Open source&lt;br /&gt;
|-&lt;br /&gt;
| Pandora&lt;br /&gt;
| [[Caprice|Pandora-CAP32]]&lt;br /&gt;
| [http://zx81.zx81.free.fr/serendipity/index.php?/categories/131-Amstrad/]&lt;br /&gt;
| 1.1.0&lt;br /&gt;
| Jun 27, 2010&lt;br /&gt;
| ❌&lt;br /&gt;
| -&lt;br /&gt;
| Open source&lt;br /&gt;
|-&lt;br /&gt;
| Sony PSP&lt;br /&gt;
| [[Caprice32 PSP]]&lt;br /&gt;
| [http://psp.akop.org/caprice32]&lt;br /&gt;
| 4.2.0.2&lt;br /&gt;
| Nov 28, 2007&lt;br /&gt;
| ❌&lt;br /&gt;
| -&lt;br /&gt;
| Open source&lt;br /&gt;
|-&lt;br /&gt;
| Sony PSP&lt;br /&gt;
| [[CPCPSP|CPCPSP]]&lt;br /&gt;
| [https://web.archive.org/web/20130325143915/http://dl.qj.net/psp/emulators/cpcpsp-v01.html]&lt;br /&gt;
| 0.1&lt;br /&gt;
| Dec 24, 2005&lt;br /&gt;
| ❌&lt;br /&gt;
| -&lt;br /&gt;
| Freeware&lt;br /&gt;
|-&lt;br /&gt;
| Sony PSP&lt;br /&gt;
| [[PSPCAP32|PSPCAP32]]&lt;br /&gt;
| [http://zx81.zx81.free.fr/serendipity/index.php?/categories/3-Amstrad/]&lt;br /&gt;
| 1.5.1&lt;br /&gt;
| Aug 21, 2009&lt;br /&gt;
| ❌&lt;br /&gt;
| -&lt;br /&gt;
| Open source&lt;br /&gt;
|-&lt;br /&gt;
| Trimui Model S&lt;br /&gt;
| [[Arnold|Arnold Trimui]]&lt;br /&gt;
| [https://github.com/liartes/arnold_gcw0]&lt;br /&gt;
| &lt;br /&gt;
| Oct 19, 2021&lt;br /&gt;
| ✅&lt;br /&gt;
| -&lt;br /&gt;
| Open source&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
= Single-Board Computers / Raspberry Pi =&lt;br /&gt;
&lt;br /&gt;
[https://www.libretro.com/index.php/powered-by-libretro/ LibRetro / RetroArch] is used as the foundation of [https://www.lakka.tv/ Lakka], [https://wiki.recalbox.com/en/advanced-usage/retroarch Recalbox], [https://batocera.org/ Batocera] and [https://retropie.org.uk/ RetroPie] alternative OSes for the Raspberry Pi and other SBC.&lt;br /&gt;
But you can also use [https://www.retroarch.com/index.php?page=platforms RetroArch] for Amstrad CPC emulation on a stock Raspberry Pi OS. Or you can use these stand-alone CPC emulators:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable sortable&amp;quot;&lt;br /&gt;
! Emulator name&lt;br /&gt;
! External link&lt;br /&gt;
! Current version&lt;br /&gt;
! Latest release&lt;br /&gt;
! Amstrad Plus&lt;br /&gt;
! Also emulates&lt;br /&gt;
! License&lt;br /&gt;
|-&lt;br /&gt;
| [[CPC4Rpi|#CPC4Rpi]]&lt;br /&gt;
| [https://web.archive.org/web/20150321200308/http://store.raspberrypi.com/projects/cpc4rpi]&lt;br /&gt;
| 1.1&lt;br /&gt;
| Dec 19, 2013&lt;br /&gt;
| ❌&lt;br /&gt;
| -&lt;br /&gt;
| Commercial💲&lt;br /&gt;
|-&lt;br /&gt;
| [[CapriceRPI|CapriceRPI]]&lt;br /&gt;
| [https://github.com/KaosOverride/CapriceRPI]&lt;br /&gt;
| 1.3d&lt;br /&gt;
| Feb 28, 2016&lt;br /&gt;
| ❌&lt;br /&gt;
| -&lt;br /&gt;
| Open source&lt;br /&gt;
|-&lt;br /&gt;
| [[Clock Signal|Clock Signal]] &lt;br /&gt;
| [https://snapcraft.io/install/clock-signal/raspbian]&lt;br /&gt;
| &lt;br /&gt;
| May 15, 2023&lt;br /&gt;
| ❌&lt;br /&gt;
| [[ZX Spectrum]], [[Enterprise]], [[MSX]], [[ColecoVision]], [[Acorn Electron]], [[Apple II]], [[Oric 1/Atmos|Oric]], [[VIC-20]], [[ZX80/81]], [[Atari 2600]], [[Atari ST]], [[Macintosh]]&lt;br /&gt;
| Donationware &amp;amp; Open source&lt;br /&gt;
|-&lt;br /&gt;
| [[CPCEPower|CPCEPower]] &lt;br /&gt;
| [https://www.cpc-power.com/cpcarchives/index.php?page=articles&amp;amp;num=73]&lt;br /&gt;
| 2105&lt;br /&gt;
| Jun 4, 2021&lt;br /&gt;
| ✅&lt;br /&gt;
| -&lt;br /&gt;
| Freeware&lt;br /&gt;
|-&lt;br /&gt;
| [[MESS|MAME]]&lt;br /&gt;
| [https://stickfreaks.com/mame/]&lt;br /&gt;
| 0.258&lt;br /&gt;
| Aug 30, 2023&lt;br /&gt;
| ✅&lt;br /&gt;
| [[KC Compact]], [[Aleste 520EX]] &amp;amp; lots of other computer systems&lt;br /&gt;
| Open source&lt;br /&gt;
|-&lt;br /&gt;
| [[SugarPi|SugarPi]]&lt;br /&gt;
| [https://github.com/Tom1975/SugarPi]&lt;br /&gt;
| 1.2.0&lt;br /&gt;
| Feb 3, 2021&lt;br /&gt;
| ✅&lt;br /&gt;
| -&lt;br /&gt;
| Open source&lt;br /&gt;
|-&lt;br /&gt;
| [[ZEsarUX|ZEsarUX]]&lt;br /&gt;
| [https://github.com/chernandezba/zesarux]&lt;br /&gt;
| X&lt;br /&gt;
| Sep 8, 2023&lt;br /&gt;
| ❌&lt;br /&gt;
| [[PCW]], [[ZX Spectrum]], [[ZX80/81]], [[MSX|MSX 1]], [[ColecoVision]], [[Spectravideo]], [[Jupiter ACE]], [[Sam Coupe]], [[SG-1000]], [[Master System]], [[Sinclair QL]], [[MK14]], [[Z88]]&lt;br /&gt;
| Donationware &amp;amp; Open source&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
= Hardware =&lt;br /&gt;
&lt;br /&gt;
*[[CPC TREX|CPC TREX]] [[C-ONE|CPC-ONE]] TurboCPC core running on a FPGA board&lt;br /&gt;
*[http://ralferoo.blogspot.fr/ CPC FPGA] CPC emulation running on a custom made FPGA board&lt;br /&gt;
*[[FPGAmstrad|FPGAmstrad]] [https://github.com/renaudhelias/CoreAmstrad CoreAmstrad] [https://github.com/mist-devel/mist-board/wiki/CoreDocAmstrad CoreDocAmstrad] [https://github.com/mist-devel/mist-binaries/tree/master/cores/amstrad_alt CPC for MIST and MISTer] Translation of JavaCPC from Java into VHDL on a MiST board&lt;br /&gt;
*[https://intelligenttoasters.blog/cpc2-project-index/ CPC2 Project] CPC emulation running on a Cyclone V FPGA board&lt;br /&gt;
*[https://github.com/rpsubc8/ESP32TinyCPC/ ESP32 TinyCPC] Port from CPC-em emulator to TTGO VGA32 v1.x board with ESP32&lt;br /&gt;
*[[SDiskEmul]] Floppy-drive emulator released in 2007. Abandoned now. Supports DSK, EDSK disk-images&lt;br /&gt;
*[https://hxc2001.com/floppy_drive_emulator/ HxC Floppy Emulator] Commercial floppy-drive emulator. Supports HFE, DSK, EDSK, IPF disk-images&lt;br /&gt;
*[https://github.com/keirf/flashfloppy/ FlashFloppy] Open source floppy-drive emulator for the ubiquitous Gotek hardware. Supports HFE, DSK, EDSK disk-images&lt;br /&gt;
&lt;br /&gt;
= Mass-storage, RTC and network dilemma =&lt;br /&gt;
Multiple mass-storage, RTC and network solutions already exist for the Amstrad CPC. We can put them in 3 categories:&lt;br /&gt;
*'''Historical''': The [[Vortex Winchester Drive]] and the [[Dobbertin Harddisc|Dobbertin HD20]] with [[Dobbertin Smart Watch]] were sold during the commercial lifetime of the CPC. But these solutions are clumsy today with their very small capacity, their CP/M filesystem and their non-standard hard-drives and interface.&lt;br /&gt;
*'''Historically-plausible''': The [[Symbiface II]] or [[X-Mass]] with [[Nova]] NVRAM/RTC are using the IDE/PATA interface created in 1986 for mass-storage access. However, the IDE interface was introduced on the CPC way after its commercial lifetime, the Symbiface II being released in 2006. The whole IDE/PATA sector access and FAT filesystem dance the CPC has to perform here is not necessary with more modern solutions. On the positive side, this isolation of the filesystem guarantees that the CPC software and the CPC emulator cannot inadvertently do wrong on the host filesystem, as the operations are limited to modifying the contents of the virtual hard-drive file. A direct file view on the host side can also make trouble if the CPC assumes it is the sole owner of the filesystem and doesn't accept that we change files and folders behind his back. The [https://www.cpcwiki.eu/forum/amstrad-cpc-hardware/cyboard-for-amstrad-cpc-yet-another-hardware-project/ Cyboard] is a Symbiface II clone that adds Ethernet support at a TCP/UDP level. The [https://github.com/salafek/Net4CPC Net4CPC] is the Ethernet part of the Cyboard provided without the Symbiface II. &lt;br /&gt;
*'''Modern''': [[Albireo]], [[ULIfAC]], [[Symbiface 3]] and [[M4 Board]] as they give the CPC a direct file view of the mass-storage instead of a sectors view. These solutions are well suited to provide network too, as HTTP and FTP are file access protocols. The Symbiface 3 and the M4 Board provide a NetAPI to access the Internet unlike the Albireo and the ULIfAC. The Symbiface 3 also emulates other peripherals (Dobbertin HD20, SSA-1 speech synthesizer, Digiblaster and AmDrum soundcards) but it is going overboard with its embedded MP3 player.&lt;br /&gt;
&lt;br /&gt;
Emulator support is as follows:&lt;br /&gt;
*Dobbertin HD20 with Dobbertin SmartWatch is emulated by MAME&lt;br /&gt;
*Symbiface II or X-Mass IDE/PATA is emulated by ACE, Caprice Forever, MAME, WinAPE, WinCPC, Arnold, Virtual CPC&lt;br /&gt;
*Albireo is emulated by ACE, Caprice Forever&lt;br /&gt;
*M4 Board is emulated by CPCemu&lt;br /&gt;
*Vortex, Net4CPC, ULIfAC and Symbiface 3 are not supported by emulators&lt;br /&gt;
&lt;br /&gt;
= CPC cartridge slot =&lt;br /&gt;
Emulator support for a CPC cartridge slot is as follows:&lt;br /&gt;
*[[Dandanator]] brings a non-standard physical cartridge port and a very exotic non-standard memory mapper that spies on Z80 instructions. It is emulated by ACE, Retro Virtual Machine, CPCEC, ZEsarUX&lt;br /&gt;
*[[Plus2CPC]] and [[Play2CPC]] bring a standard physical Plus cartridge port to the CPC. They are not supported by emulators&lt;br /&gt;
*[[M4 Board]] simulates a standard Plus cartridge port on the CPC and handles standard CPR files. M4 Board is emulated by CPCemu&lt;br /&gt;
&lt;br /&gt;
Why is the Dandanator winning over standard Plus cartridge solutions like the Plus2CPC? It's because some CPC games (The Sword of Ianna, Los Amores de Brunilda, ...) are released exclusively for it. So emulators are then forced to support it.&lt;br /&gt;
&lt;br /&gt;
The situation would be different if those games were converted to standard CPR format by the community.&lt;br /&gt;
&lt;br /&gt;
= Audio devices =&lt;br /&gt;
Emulator support is as follows:&lt;br /&gt;
*[[Amstrad SSA-1 Speech Synthesizer|SSA-1 speech synthesizer]] is emulated by ACE, JavaCPC, MAME&lt;br /&gt;
*[[Dk'tronics Speech Synthesizer|Dk'Tronics speech synthesizer]] is emulated by ACE, JavaCPC, MAME&lt;br /&gt;
*[[TMPI speech synthesizer]] is emulated by ACE, Caprice Forever&lt;br /&gt;
*[[Amdrum|AmDrum]] is emulated by ACE, JavaCPC, MAME, WinAPE&lt;br /&gt;
*[[Digiblaster]] is emulated by ACE, JavaCPC, MAME, WinAPE, Caprice Forever, CPCEC, WinCPC, Virtual CPC&lt;br /&gt;
*[[PlayCity]] is fully emulated by ACE, MAME, Arnold, SugarBox. The audio part of [[PlayCity]] is emulated by JavaCPC, Caprice Forever, CPCEC&lt;br /&gt;
*[[Play2CPC]] is an amputated PlayCity, with no CTC chip and only one soundchip instead of two, but otherwise compatible with the PlayCity&lt;br /&gt;
*[[Willy|OPL3 (Willy)]] is emulated by ACE&lt;br /&gt;
*[https://github.com/lambdamikel/Speak-SID Speak&amp;amp;SID], [https://github.com/lambdamikel/LambdaSpeak3 LambdaSpeak], [[Willy|General MIDI (Willy)]], [https://www.cpcwiki.eu/forum/amstrad-cpc-hardware/amsdap-amstrad-msx-adapter-connecting-any-msx-io-hardware-to-the-cpc/ SE-One (Amsdap)] and [https://en.wikipedia.org/wiki/Moonsound Moonsound (Amsdap)] are not supported by emulators&lt;br /&gt;
&lt;br /&gt;
= Emulator accuracy checking tools =&lt;br /&gt;
== Quick evaluation==&lt;br /&gt;
*[https://www.cpc-power.com/index.php?page=detail&amp;amp;num=7529 From Scratch demo] with reference images: [[Media:Fromscratch1.png]] [[Media:Fromscratch2.png]]&lt;br /&gt;
*[https://www.cpc-power.com/index.php?page=detail&amp;amp;num=7737 Camembert 4 demo] with reference images: [[Media:Camembert-real.jpg]] [[Media:Camembert 4 Pixel Precise.jpg]]&lt;br /&gt;
&lt;br /&gt;
== Z80 CPU ==&lt;br /&gt;
*[https://cpcrulez.fr/applications_util-zexall.htm ZEXALL] and [https://cpcrulez.fr/applications_util-zexdoc.htm ZEXDOC] Z80 CPU instruction set exercisers&lt;br /&gt;
*[https://www.cpc-power.com/index.php?page=detail&amp;amp;num=12883 Z80 Full Test] [https://www.cpc-power.com/index.php?page=detail&amp;amp;num=12881 Z80 Doc Test] [https://www.cpc-power.com/index.php?page=detail&amp;amp;num=12882 Z80 Flags Test] [https://www.cpc-power.com/index.php?page=detail&amp;amp;num=12880 Z80 Doc Flags Test] [https://www.cpc-power.com/index.php?page=detail&amp;amp;num=12884 Z80 MEMPTR Test] [https://www.cpc-power.com/index.php?page=detail&amp;amp;num=12879 Z80 CCF Test]&lt;br /&gt;
*[https://www.cpc-power.com/index.php?page=detail&amp;amp;num=298 Arkanoid] [https://www.cpc-power.com/index.php?page=detail&amp;amp;num=1299 Light Corridor] Z80 IM2 usage, Z80 useless instruction prefixes&lt;br /&gt;
*[https://wikiti.brandonw.net/?title=Z80_Instruction_Set Z80 instruction set] [https://zx-pk.ru/attachment.php?attachmentid=2989&amp;amp;d=1143656567 Z80 MEMPTR (aka WZ) internal register] [https://github.com/hoglet67/Z80Decoder/wiki/Undocumented-Flags Even weirder Z80 behaviour] [https://zxe.io/software/Z80/documentation/latest/Thanks.html To get to the bottom of it] How the Z80 behaves&lt;br /&gt;
*[https://floooh.github.io/2021/12/06/z80-instruction-timing.html Z80 T-state timings] [https://baltazarstudios.com/zilog-z80-undocumented-behavior/ Other source about T-state timings] Ultra accurate timing behaviour&lt;br /&gt;
&lt;br /&gt;
== Diagnostics ==&lt;br /&gt;
*[https://www.cpc-power.com/index.php?page=detail&amp;amp;num=5113 Official Amstrad CPC hardware diagnostics] [https://www.cpc-power.com/index.php?page=detail&amp;amp;num=17932 Non-official Amstrad Diagnostics v1.3a]&lt;br /&gt;
*[https://www.cpc-power.com/index.php?page=detail&amp;amp;num=6987 RAM Expansion Test] [https://www.cpc-power.com/index.php?page=detail&amp;amp;num=14833 MemTest] [https://www.cpc-power.com/index.php?page=detail&amp;amp;num=14834 RAM Test CRTC4] [https://www.cpc-power.com/index.php?page=detail&amp;amp;num=13386 Testprogram For All ERAM] [https://www.cpc-power.com/index.php?page=detail&amp;amp;num=19185 Xenon 2] [https://www.cpc-power.com/index.php?page=detail&amp;amp;num=12188 Take On Me] RAM testers&lt;br /&gt;
*[https://www.cpcwiki.eu/forum/emulators/amstrad-cpc-'acid'-test/ &amp;quot;Acid&amp;quot; test suite] [https://cpctech.cpcwiki.de/download/test.zip] [http://ace.cpcscene.net/tests:arnold_test_suite Tests results in ACE] [https://www.cpc-power.com/index.php?page=detail&amp;amp;num=17738 PPI tests] Chips tests by arnoldemu&lt;br /&gt;
*[http://www.winape.net/downloads.jsp Plus Test] [https://www.cpc-power.com/index.php?page=detail&amp;amp;num=15242] CPC and CPC+ Emulator test suite (including Instruction and Interrupt timing tests)&lt;br /&gt;
&lt;br /&gt;
== Amstrad Plus ==&lt;br /&gt;
*[https://www.cpc-power.com/index.php?page=detail&amp;amp;num=9627 Plus diagnostics cartridge] Official Amstrad diagnostics&lt;br /&gt;
*[[File:Roudoudou CPR tests.zip]] [https://www.cpcwiki.eu/forum/emulators/amstrad-cpc-'acid'-test/75/] Amstrad Plus tests by Roudoudou&lt;br /&gt;
*[https://www.cpc-power.com/index.php?page=detail&amp;amp;num=18998 4096k Tester] [https://www.cpc-power.com/index.php?page=detail&amp;amp;num=3575 No Exit] Amstrad Plus palette, Floating bus problem&lt;br /&gt;
*[https://www.cpc-power.com/index.php?page=detail&amp;amp;num=8874 6128 Plus Dma] [https://cpcrulez.fr/demostestDO_fairy-breakpoint_2010.htm Fairy] [https://soundtrackerdma.cpcscene.net/doku.php?id=en:download Soundtracker DMA] To test DMA and to compare the PSG output with the output from a real Amstrad Plus&lt;br /&gt;
*[https://www.cpc-power.com/index.php?page=detail&amp;amp;num=7401 Black Sabbath] [https://www.cpc-power.com/index.php?page=detail&amp;amp;num=7532 X-Mas 2008] [https://www.cpc-power.com/index.php?page=detail&amp;amp;num=9169 Funerapolis] [https://www.cpc-power.com/index.php?page=detail&amp;amp;num=7935 Sappy] [https://www.pouet.net/prod.php?which=95133 USS Cygnus 192] To test hardware sprites emulation&lt;br /&gt;
&lt;br /&gt;
== Graphics ==&lt;br /&gt;
*[http://www.logonsystem.eu/html/downloadlogon.htm Amstrad CPC CRTC Compendium with Shaker tool] [https://shaker.logonsystem.eu/ Shakerland Portal] Ultra accurate CRTC documentation and its associated CPC testing tool&lt;br /&gt;
*[https://www.cpc-power.com/index.php?page=detail&amp;amp;num=8524 Equalizor] [https://forum.system-cfg.com/viewtopic.php?p=229698#p229698 Revolog] [https://forum.system-cfg.com/viewtopic.php?f=24&amp;amp;t=11535&amp;amp;start=285 Technical explanation] Unpredictable behaviour of the real Amstrad CPC chips (ie. outside the realm of emulation)&lt;br /&gt;
*[https://www.cpc-power.com/index.php?page=detail&amp;amp;num=10401 Test CRTC type v3.0] [https://www.planetemu.net/rom/amstrad-cpc-applications-dsk/crtc-editor-v5-1-1994-brain-of-chaos CRTC editor] [https://www.cpc-power.com/index.php?page=detail&amp;amp;num=15280 CRTC software] CRTC tools&lt;br /&gt;
*[https://cpcrulez.fr/coding_src-demo-smooth_crtc_register_3_scrolling_test.htm Smooth CRTC Register 3 scrolling test] [https://www.cpc-power.com/index.php?page=detail&amp;amp;num=6883 Edge Grinder] CRTC Register 3 horizontal scrolling trick [https://www.cpc-power.com/index.php?page=detail&amp;amp;num=99 Mission Genocide] CRTC hardware vertical scrolling&lt;br /&gt;
*[https://www.cpc-power.com/index.php?page=detail&amp;amp;num=12906 HSYNC test] [https://www.cpc-power.com/index.php?page=database&amp;amp;lemot=Rupture%20verticale HSYNC-based demo effects] Handling invalid CRTC HSYNC [https://www.cpc-power.com/index.php?page=detail&amp;amp;num=9211 Backtro] [https://www.cpc-power.com/index.php?page=detail&amp;amp;num=8041 Other World 3] CRTC effects&lt;br /&gt;
*[https://www.cpc-power.com/index.php?page=detail&amp;amp;num=12905 &amp;quot;Mode 5&amp;quot; Viewer] [https://www.cpc-power.com/index.php?page=detail&amp;amp;num=16466 Split-Rasters Test CRTC1] [https://www.cpc-power.com/index.php?page=detail&amp;amp;num=15519 Les split-rasters] [https://www.cpc-power.com/index.php?page=detail&amp;amp;num=7543 Odyssey] [https://www.cpc-power.com/index.php?page=detail&amp;amp;num=15101 Onescreen Colonies] [https://www.cpc-power.com/index.php?page=detail&amp;amp;num=13359 Imperial Mahjong] [https://www.cpcwiki.eu/forum/programming/mode-3/ Mode 3 Test] Split-rasters, multi-mode effects&lt;br /&gt;
*[https://www.cpc-power.com/index.php?page=detail&amp;amp;num=16027 Mire] [https://www.cpc-power.com/index.php?page=detail&amp;amp;num=14259 Test interlace color] [https://www.cpc-power.com/index.php?page=detail&amp;amp;num=13139 Perfect Pix Paint] [https://www.cpc-power.com/index.php?page=detail&amp;amp;num=7826 Climax-G] [https://www.cpc-power.com/index.php?page=detail&amp;amp;num=8307 4 Sins] [https://www.cpc-power.com/index.php?page=detail&amp;amp;num=7897 Twinblast] [https://www.cpc-power.com/index.php?page=detail&amp;amp;num=8081 MCS 6] [https://www.cpc-power.com/index.php?page=detail&amp;amp;num=2224 Thunder Blade] [https://www.cpc-power.com/index.php?page=detail&amp;amp;num=2318 Turrican] To test the VDU&lt;br /&gt;
&lt;br /&gt;
== Peripherals ==&lt;br /&gt;
*[https://www.cpc-power.com/index.php?page=detail&amp;amp;num=3825 Magnum Light Phaser] [https://www.cpc-power.com/index.php?page=detail&amp;amp;num=3583 SkeetShoot for Trojan Phazer] [https://www.cpc-power.com/index.php?page=detail&amp;amp;num=3992 Dk'Tronics Light Pen] [https://www.cpc-power.com/index.php?page=detail&amp;amp;num=4955 Light Pen Mark II] To test lightguns and lightpens connected to expansion port&lt;br /&gt;
*[https://www.cpc-power.com/index.php?page=detail&amp;amp;num=1825 West Phaser] [https://www.cpc-power.com/index.php?page=detail&amp;amp;num=5325 Gunstick] [https://www.cpc-power.com/index.php?page=detail&amp;amp;num=4303 Trojan LP-1] To test lightguns and lightpens connected to joystick port&lt;br /&gt;
*[https://www.cpc-power.com/index.php?page=detail&amp;amp;num=4725 Amstrad SSA-1] [https://www.cpc-power.com/index.php?page=detail&amp;amp;num=4724 Dk'Tronics] [https://www.cpc-power.com/index.php?page=detail&amp;amp;num=4660 TMPI] To test speech synthesizers emulation&lt;br /&gt;
*[https://www.cpc-power.com/index.php?page=database&amp;amp;lemot=AmDrum AmDrum] [https://www.cpc-power.com/index.php?page=database&amp;amp;lemot=Digitracker Digitracker] [[File:DigiTracker Amdrum.zip]] [https://www.cpcwiki.eu/forum/applications/prodatrons-digitrackker-1-4-now-vor-lambdaspeak-amdrum-in-8-bit-mode!/] To test [[Amdrum|AmDrum]] and [[Digiblaster]] soundcards emulation&lt;br /&gt;
*[https://www.cpc-power.com/index.php?page=detail&amp;amp;num=4012 Advanced OCP Art Studio] To test [[AMX Mouse|AMX]] and [[Kempston Mouse|Kempston mouse]] emulation&lt;br /&gt;
*[[UniDOS]] [[SymbOS]] [[HDCPM]] To test mass-storage and RTC emulation&lt;br /&gt;
*[http://theswordofianna.retroworks.es/ The Sword of Ianna] [http://retroworks.es/php/game_en.php?id=11 Los Amores de Brunilda] [http://www.dandare.es/Proyectos_Dandare/Descargas.html MojonTwins romset] To test the [[Dandanator]] emulation&lt;br /&gt;
&lt;br /&gt;
== Copy-protection ==&lt;br /&gt;
*[https://cpctech.cpcwiki.de/download/fdctest.zip FDC test suite] [https://cpctech.cpcwiki.de/download/drivetest.zip Disk drive tests] [https://cpctech.cpcwiki.de/download/cdttst.zip CDT/TZX test suite for emulators] Set of tests by arnoldemu&lt;br /&gt;
*[https://www.cpc-power.com/index.php?page=detail&amp;amp;num=15518 DskTest] [https://cpcrulez.fr/applications_disc-dlfrsilver_dump_tool_test_suite.htm Dlfrsilver Dump Tool Test Suite] [[ParaDOS]] [https://www.cpc-power.com/index.php?page=detail&amp;amp;num=6117 Discology] [https://www.cpc-power.com/index.php?page=detail&amp;amp;num=6118 Discology plus] [https://www.cpc-power.com/index.php?page=detail&amp;amp;num=4179 Hercule II] [https://www.cpc-power.com/index.php?page=detail&amp;amp;num=7542 Midline Process] To test FDC emulation&lt;br /&gt;
*[https://cpcrulez.fr/demostestDM_fatmag_01.htm FatMag] The HFE trackload version is designed as a very rigorous test of the FDC emulation [https://www.cpc-power.com/index.php?page=detail&amp;amp;num=17853 Open Tower Defense] Emulator detection through a FDC test&lt;br /&gt;
*[https://www.cpc-power.com/index.php?page=detail&amp;amp;num=1501 Le Nécromancien] [https://www.cpc-power.com/index.php?page=detail&amp;amp;num=839 E.X.I.T] [https://www.cpc-power.com/index.php?page=detail&amp;amp;num=1005 Basun] [https://www.cpc-power.com/index.php?page=detail&amp;amp;num=2195 Tensions] [https://www.cpc-power.com/index.php?page=detail&amp;amp;num=1589 Pacific] [https://www.cpc-power.com/index.php?page=detail&amp;amp;num=1784 Wild Streets] [https://www.cpc-power.com/index.php?page=detail&amp;amp;num=1958 Skyx]  Some copy-protected disk-images&lt;br /&gt;
*[https://www.cpc-power.com/cpcarchives/index.php?page=articles&amp;amp;cat=12 Protection schemes documented] [https://simonowen.com/samdisk/sys_cpc/ Copy-protection in EDSK images] [https://forum.system-cfg.com/viewtopic.php?p=195705#p195705 Implementation in SugarBox emulator] [https://64nops.wordpress.com/2021/07/04/a-la-decouverte-du-fdc/ FDC blog articles (in french)] Technical explanations&lt;br /&gt;
&lt;br /&gt;
= File format specifications =&lt;br /&gt;
&lt;br /&gt;
*[https://www.cpcwiki.eu/index.php/Format:DSK_disk_image_file_format DSK / EDSK] [https://hxc2001.com/download/floppy_drive_emulator/SDCard_HxC_Floppy_Emulator_HFE_file_format.pdf HFE] File formats of disk-image&lt;br /&gt;
*[http://soundfile.sapp.org/doc/WaveFormat/ WAV PCM] [https://acorn.huininga.nl/pub/unsorted/software/pc/CSW/csw.html CSW] [https://www.cpcwiki.eu/index.php/Format:CDT_tape_image_file_format CDT / TZX] File formats of tape-image&lt;br /&gt;
*[https://www.cpcwiki.eu/index.php/Format:CPR_CPC_Plus_cartridge_file_format CPR cartridge] [https://www.cpcwiki.eu/index.php/Format:SNA_snapshot_file_format SNA snapshot] [https://www.cpcwiki.eu/forum/emulators/javacpc-desktop-available-as-beta!/100/ SNR session] Other file formats used in CPC emulators&lt;br /&gt;
*[https://www.cpc-power.com/cpcarchives/index.php?page=articles&amp;amp;num=10 Archive of SNR sessions]&lt;br /&gt;
*[https://en.wikipedia.org/wiki/IMG_(file_format) IMG] [https://web.archive.org/web/20120202144328/http://download.microsoft.com/download/f/f/e/ffef50a5-07dd-4cf8-aaa3-442c0673a029/Virtual%20Hard%20Disk%20Format%20Spec_10_18_06.doc VHD] File formats of flat hard-drive image&lt;br /&gt;
&lt;br /&gt;
= Emulation Tools  =&lt;br /&gt;
&lt;br /&gt;
*[http://www.cpcmania.com/news.htm CPCDiskXP] [https://github.com/jeromelesaux/dsk DSK] [https://github.com/cpcsdk/idsk iDSK] [[Dsktools|Dsktools]] [[ManageDSK|ManageDSK]] [[WriteDSK|WriteDSK]] [https://simonowen.com/samdisk/ SAMdisk] [https://github.com/Tom1975/SugarConvDsk SugarConvDsk] [https://web.archive.org/web/20230602152816/https://cpc-live.com/data/index.php?dir=-tools DiskUtil] [https://hxc2001.com/download/floppy_drive_emulator/ HxCFloppyEmulator software] [https://github.com/damieng/DiskImageManager Disk Image Manager] [https://github.com/neuro-sys/sector-cpc sector-cpc] Set of tools about disk-images&lt;br /&gt;
*[http://www.cpcmania.com/news.htm CPCTapeXP] [https://sourceforge.net/projects/cdtmaster/ CDTMaster] [https://cpctech.cpcwiki.de/download/2cdt.zip 2CDT] [http://cngsoft.no-ip.org/csw2cdt.htm CSW2CDT] [https://cpcrulez.fr/emulateurs_UTIL-CDT-CDT2WAV.htm CDT2WAV] [https://github.com/Tom1975/SugarConvTape SugarConvTape] [https://web.archive.org/web/20230602152816/https://cpc-live.com/data/index.php?dir=-tools TapeUtil] [https://github.com/shred/tzxtools tzxtools] Set of tools about tape-images&lt;br /&gt;
*[http://www.cpcmania.com/news.htm CPRTools] Edit Amstrad Plus CPR cartridge-images&lt;br /&gt;
*[https://bochs.sourceforge.io/doc/docbook/user/winimage.html WinImage, DiskExplorer, Mtools] [https://www.fysnet.net/ultimate/index.htm Ultimate Imager] [https://github.com/ProgrammingHobby/CPM_Image-File_Explorer CP/M Image File Explorer] Access and edit IMG hard-drive images. No need of tools for VHD images with FAT filesystem, they are supported directly in Windows Explorer: it works the same way as ISO files&lt;br /&gt;
*[[CPCGamesCD-CPCLoader|CPCGamesCD-CPCLoader]] CDROM containing a navigable database with all the games of the Amstrad CPC&lt;br /&gt;
*[https://colourclash.co.uk/cpc-analyser/ CPC Analyser] Help reverse engineer Amstrad CPC games&lt;br /&gt;
*[[Emulator tooling]] UI screenshots of tooling in CPC emulators&lt;br /&gt;
*[[WinApe|WinAPE]] [[WinCPC]] [[JavaCPC]] [https://code.google.com/archive/p/cpcsdk/ Caprice Reloaded] [http://www.cpc-power.com/cpcarchives/index.php?page=articles&amp;amp;num=73 Caprice Forever] Emulators with an integrated Z80 Assembler&lt;br /&gt;
*[https://cpcrulez.fr/coding-crossdev_coding-Java-Z80Assembler.htm Java Z80Assembler] [https://pasmo.speccy.org/ Pasmo] [http://cngsoft.no-ip.org/uz80.htm UZ80] [https://github.com/EdouardBERGE/rasm Rasm] [https://cpcsdk.github.io/rust.cpclib/basm/ BASM] [https://github.com/z00m128/sjasmplus SjASMPlus] [https://github.com/cpcsdk/cpctools cpctools] [http://julien-nevo.com/disark/ Disark] Tools for CPC cross-development in Z80 Assembler&lt;br /&gt;
*[https://ccz80.webcindario.com/ccz80en.html ccz80] [https://sdcc.sourceforge.net SDCC] [https://www.cpcwiki.eu/forum/programming/phrozen-c/msg180715/#msg180715 SDCC vs PhrozenC] [http://www.cpcmania.com/Docs/Programming/SDCC_vs_z88dk_Comparing_size_and_speed.htm  SDCC vs z88dk] [http://norecess.cpcscene.net/phactory.html Phactory] [https://github.com/cpcitor/cpc-dev-tool-chain cpc-dev-tool-chain] [https://lronaldo.github.io/cpctelera/ CPCtelera] Cross-platform CPC development in C&lt;br /&gt;
*[https://lemonspawn.com/turbo-rascal-syntax-error-expected-but-begin/ Turbo Rascal Syntax Error] [https://www.youtube.com/watch?v=NTfnE4kXqt8 CPC demo made with TRSE] [https://www.youtube.com/watch?v=XjnqXiUHekY TRSE CPC tutorial] A complete suite (IDE, compiler, resource editor) for developing CPC games/demos in Pascal&lt;br /&gt;
*[https://cpcbasic.webcindario.com/CPCBasicEn.html CPC Basic] [https://github.com/benchmarko/CPCBasic CPCBasic Unchained] [https://www.cpcalive.com/cpcalive_en.html CpcAlive] [https://ugbasic.iwashere.eu/ ugBASIC] Cross-platform CPC development in BASIC&lt;br /&gt;
*[https://github.com/jjaranda13/8BP 8BP] [https://www.cpc-power.com/index.php?page=detail&amp;amp;num=16035 CPC games made with 8BP] [[Laser Basic]] [[Laser BASIC Compiler]] [https://www.cpc-power.com/index.php?page=detail&amp;amp;num=7100 CPC game made with Laser Basic] [[Sprites Alive]] [https://www.youtube.com/watch?v=X53XF0txftQ CPC game made with Sprites Alive] [[B-ASIC]] [https://www.cpc-power.com/index.php?page=detail&amp;amp;num=4380 CPC+ game made with B-ASIC] Useful CPC tools to beef up the BASIC language&lt;br /&gt;
*[http://ldeplanque.free.fr/ConvImgCpc/new/ ConvImgCPC] [https://www.dadither.com/ DaDither] [https://github.com/jeromelesaux/martine Martine] [https://www.cpcwiki.eu/forum/applications/splitraster-v3/ Splitraster+] [https://www.pouet.net/prod.php?which=88808 UniPixelViewer] [https://www.youtube.com/watch?v=KBcxPWGmr6Q UniPixelViewer tutorial] Image converters from PC to CPC&lt;br /&gt;
*[http://grafx2.chez.com/ GrafX2] [http://multipaint.kameli.net/ Multipaint] [[Retro Game Asset Studio]] Cross-platform CPC pixel art editors&lt;br /&gt;
*[http://cngsoft.no-ip.org/chipnsfx.htm CHIPNSFX] [https://www.julien-nevo.com/arkostracker/ Arkos Tracker 2] [https://github.com/AugustoRuiz/WYZTracker WYZTracker] Cross-platform CPC music creation suites&lt;br /&gt;
&lt;br /&gt;
= Emulator Detection =&lt;br /&gt;
&lt;br /&gt;
If you want to promote usage of real CPC computers, you can detect CPC emulators by:&lt;br /&gt;
*Checking if the memory is initialized with zeroes, as real machines have random memory values at boot&lt;br /&gt;
*Focusing on the minute details in emulated Z80, CRTC, and PPI chips. They are most often wrong in emulators&lt;br /&gt;
*Examining the FDC chip. It is only replicated more or less superficially in all emulators because the internals of the chip are still unknown&lt;br /&gt;
&lt;br /&gt;
Combining these methods will definitely get you a 100% success rate in detecting emulators, even the toughest ones.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;gallery&amp;gt;&lt;br /&gt;
Emulator undetected.png|Emulator undetected&lt;br /&gt;
Emulator detected.png|Emulator detected&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
&lt;br /&gt;
There is also this initiative for emulators who willingly want to be detected: [[Emulator_IDs|Emulator IDs]]&lt;br /&gt;
&lt;br /&gt;
= Emulators running on the Amstrad CPC =&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable sortable&amp;quot;&lt;br /&gt;
! Emulator name&lt;br /&gt;
! External link&lt;br /&gt;
! Current version&lt;br /&gt;
! Latest release&lt;br /&gt;
! License&lt;br /&gt;
! Emulates&lt;br /&gt;
|-&lt;br /&gt;
| [[CPCZVM|CPCZVM]]&lt;br /&gt;
| [https://www.cpcwiki.eu/index.php/Z-Machine]&lt;br /&gt;
| &lt;br /&gt;
| Jul 6, 2019&lt;br /&gt;
| Open source&lt;br /&gt;
| [[Z-Machine]]&lt;br /&gt;
|-&lt;br /&gt;
| [[Pac-Man|Pac-Man]]&lt;br /&gt;
| [http://www.cpcwiki.eu/forum/games/speed-up-patch-for-pac-man-emulator-for-cpc-by-syx-toto/msg81222/#msg81222]&lt;br /&gt;
| 1.1&lt;br /&gt;
| Jun 5, 2014&lt;br /&gt;
| Open source&lt;br /&gt;
| [[Pac-Man arcade|Pac-Man arcade]]&lt;br /&gt;
|-&lt;br /&gt;
| [[Phoenix|Phoenix]]&lt;br /&gt;
| [https://norbertkehrer.github.io/phoenix_cpc.html]&lt;br /&gt;
| &lt;br /&gt;
| Jan 6, 2019&lt;br /&gt;
| Freeware&lt;br /&gt;
| [[Phoenix arcade|Phoenix arcade]]&lt;br /&gt;
|-&lt;br /&gt;
| [[Space Invaders|Space Invaders]]&lt;br /&gt;
| [http://www.cpcwiki.eu/forum/games/space-invaders-arcade-emulator-for-amstrad-cpc/]&lt;br /&gt;
| 1.0&lt;br /&gt;
| Jun 11, 2016&lt;br /&gt;
| Freeware&lt;br /&gt;
| [[Space Invaders arcade|Space Invaders arcade]]&lt;br /&gt;
|-&lt;br /&gt;
| [[ZXM|ZXM]]&lt;br /&gt;
| [https://cpcrulez.fr/applications_util-ZXm.htm]&lt;br /&gt;
| &lt;br /&gt;
| 1993&lt;br /&gt;
| Freeware&lt;br /&gt;
| [[ZX Spectrum|ZX Spectrum]]&lt;br /&gt;
|-&lt;br /&gt;
| [[Zym|Zym]]&lt;br /&gt;
| [http://www.symbos.org/appinfo.htm?00054]&lt;br /&gt;
| 0.9&lt;br /&gt;
| Feb 19, 2022&lt;br /&gt;
| Open source&lt;br /&gt;
| [[Z-Machine]]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
[[Category:Emulator| ]]&lt;/div&gt;</summary>
		<author><name>Longshot</name></author>	</entry>

	<entry>
		<id>https://oldwiki.cpcwiki.eu/index.php?title=Logon_System&amp;diff=111127</id>
		<title>Logon System</title>
		<link rel="alternate" type="text/html" href="https://oldwiki.cpcwiki.eu/index.php?title=Logon_System&amp;diff=111127"/>
				<updated>2023-07-24T08:44:38Z</updated>
		
		<summary type="html">&lt;p&gt;Longshot: /* Links */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Image:LogonTeam1990.jpg|thumb|Logon System 1990 Amstrad Expo]]&lt;br /&gt;
[[Image:LogonSystem2006.jpg|thumb|Logon System. 22 Sept 2006]]&lt;br /&gt;
[[Image:Booth2018 01137.jpg|thumb|Logon System at [[Revision]] 2018.]]&lt;br /&gt;
'''Logon System''' is a French demo group which is very famous due to really great demos and new techniques the coders at Logon use. While [[The Demo]] was for a very long time the best megademo ever released on the CPC, [[Overflow]]'s demo III was one of the most extreme hardware demo ever produced.&lt;br /&gt;
&lt;br /&gt;
== History ==&lt;br /&gt;
&lt;br /&gt;
* Members of the group regularly wrote articles published in the French Magazine [[Amstrad Cent Pour Cent]] during its later life.&lt;br /&gt;
&lt;br /&gt;
* During the 2010s decade, [[Overflow]] still wears the mantle of '''Logon System''''s legacy, sometimes competing successfully at demoparties or trying to be a legend again with goodies to match his ambition.&lt;br /&gt;
&lt;br /&gt;
== Historical Members ==&lt;br /&gt;
* [[Digit]]&lt;br /&gt;
* [[Eros]]&lt;br /&gt;
* [[Fred Crazy]]&lt;br /&gt;
* [[Longshot]]&lt;br /&gt;
* [[Overflow]]&lt;br /&gt;
* [[Pict]]&lt;br /&gt;
* [[Slash]]&lt;br /&gt;
* [[Brad]]&lt;br /&gt;
* [[Naminu]]&lt;br /&gt;
* [[Rubi]]&lt;br /&gt;
&lt;br /&gt;
== Releases ==&lt;br /&gt;
&lt;br /&gt;
=== 2010s ===&lt;br /&gt;
&lt;br /&gt;
* 2017 : [[Eerie Forest]] (PLUS/GX4000)&lt;br /&gt;
* 2017 : [[Logon's run - 3D meets the aging bits]] (CPC6128)&lt;br /&gt;
* 2015 : [http://www.pouet.net/prod.php?which=65232 '''iO'''] (MSX)&lt;br /&gt;
* 2012 : [[Yet Another Plasma!]] (CPC 4k intro)&lt;br /&gt;
&lt;br /&gt;
=== 2000s ===&lt;br /&gt;
&lt;br /&gt;
=== 1990s ===&lt;br /&gt;
&lt;br /&gt;
=== 1980s ===&lt;br /&gt;
&lt;br /&gt;
== Links ==&lt;br /&gt;
&lt;br /&gt;
* [http://www.pouet.net/groups.php?which=483 POUËT's page on Logon System]&lt;br /&gt;
&lt;br /&gt;
* [https://demozoo.org/groups/46351/ Demozoo's page on Logon system]&lt;br /&gt;
&lt;br /&gt;
[[Category:Scene group]]&lt;/div&gt;</summary>
		<author><name>Longshot</name></author>	</entry>

	<entry>
		<id>https://oldwiki.cpcwiki.eu/index.php?title=Programming_methods_used_in_games&amp;diff=109390</id>
		<title>Programming methods used in games</title>
		<link rel="alternate" type="text/html" href="https://oldwiki.cpcwiki.eu/index.php?title=Programming_methods_used_in_games&amp;diff=109390"/>
				<updated>2022-12-03T09:48:12Z</updated>
		
		<summary type="html">&lt;p&gt;Longshot: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;This section describes specific programming methods which are used in games and the games that use them.&lt;br /&gt;
&lt;br /&gt;
=== Sampled Sound ===&lt;br /&gt;
&lt;br /&gt;
Sampled music:&lt;br /&gt;
* Prehistorik 2&lt;br /&gt;
* Xyphoes Fantasy&lt;br /&gt;
&lt;br /&gt;
The sampled speech is often stored as 4-bit values with 2 values packed into each byte. Each value is sent to one of the AY volume registers at a fixed rate.&lt;br /&gt;
&lt;br /&gt;
Sampled speech:&lt;br /&gt;
* Chase HQ &lt;br /&gt;
* Bad Dudes vs Dragon Ninja&lt;br /&gt;
* Robocop&lt;br /&gt;
&lt;br /&gt;
=== Rasters ===&lt;br /&gt;
&lt;br /&gt;
[[Rasters]] is a colour changing effect.&lt;br /&gt;
&lt;br /&gt;
Examples:&lt;br /&gt;
&lt;br /&gt;
Zynaps.&lt;br /&gt;
&lt;br /&gt;
=== Hardware Double Buffer  ===&lt;br /&gt;
&lt;br /&gt;
Most good CPC games use the hardware double buffer technique in order to display sprites and/or to scroll the play area smoothly. &lt;br /&gt;
&lt;br /&gt;
In particular, two memory areas (instead of one) are reserved for the screen ram. &lt;br /&gt;
&lt;br /&gt;
In each frame, one of the two screens is displayed while the other is not visible but is drawn to. After the draw is done, the screens are exchanged using the hardware, so that the previously invisible one is now visible and the previously visible one is invisible.&lt;br /&gt;
&lt;br /&gt;
The exchange is done using the hardware specifically by changing the screen-offset, Reg 12 and 13 of the [[CRTC|CRTC]]). &lt;br /&gt;
&lt;br /&gt;
This process is repeated. &lt;br /&gt;
&lt;br /&gt;
The big advantage of this technique is that we can use a whole frame (or more) machine-time for our code (with no problems that arise when we alter screen ram at the same time the electron beam displays it on the monitor such as tearing or flickering). &lt;br /&gt;
&lt;br /&gt;
However, page flipping eats up a lot of memory area (which is crucial especially for 64Kb machines). This explains why a lot of games can have small game-areas&amp;amp;nbsp;!&lt;br /&gt;
&lt;br /&gt;
For example:&lt;br /&gt;
Pac-Man Emulator&lt;br /&gt;
&lt;br /&gt;
=== Scrolling ===&lt;br /&gt;
&lt;br /&gt;
The following types of scroll are used:&lt;br /&gt;
&lt;br /&gt;
1. The player controls a character on the screen. When the character is moved the screen scrolls but the character remains in the same position on the screen. If they get to the edge of the map, they may walk up to the sides of the screen. If they walk back the other way when they reach a particular point on the screen it starts to scroll again and they remain in the same position.&lt;br /&gt;
&lt;br /&gt;
2. The player controls a character on the screen. When the character is moved towards the edges of the screen, the scroll moves a whole screen in width or height. The character is now on the opposite side. e.g. the character moves left, the screen scrolls by a whole screen width, the character is now on the right. The screen only scrolls when they get close to the sides.&lt;br /&gt;
&lt;br /&gt;
3. The screen always scrolls. The player controls a character who is either static or moves freely around the screen.&lt;br /&gt;
&lt;br /&gt;
=== Parallax/Multi Layer Scroll===&lt;br /&gt;
&lt;br /&gt;
Parallax or Multi Layer Scroll is an effect where there are 2 layers of tiles which scroll, one has priority over the other and often they move at different scroll rates.&lt;br /&gt;
&lt;br /&gt;
For example, the following games have parallax or multi layer scroll:&lt;br /&gt;
&lt;br /&gt;
* Wizard Willy&lt;br /&gt;
* Teenage Mutant Hero Turtles&lt;br /&gt;
* Astro Marine Corps (AMC)&lt;br /&gt;
* Turrican I and II&lt;br /&gt;
* Shadow Dancer &lt;br /&gt;
&lt;br /&gt;
==== Software Scrolling ====&lt;br /&gt;
&lt;br /&gt;
The screen is scrolled using the CPU only. This can be done by moving the data on the screen, or re-drawing it in a different position to give the illusion of scrolling.&lt;br /&gt;
&lt;br /&gt;
Examples:&lt;br /&gt;
&lt;br /&gt;
* Robocop&lt;br /&gt;
* Batman the Movie.&lt;br /&gt;
&lt;br /&gt;
==== Hardware Scrolling  ====&lt;br /&gt;
&lt;br /&gt;
Hardware scrolling is performed by changing the CRTC registers R12 and R13 to define the start address of the screen. The display is automatically wrapped at 16K, so continuous incrementation of these values will scroll the screen and wrap around. The code must then update the display for new graphics. &lt;br /&gt;
&lt;br /&gt;
The scrolling is in CRTC character sizes. &lt;br /&gt;
* 1 CRTC char horizontally is 2 bytes of RAM at a time which corresponds to 4 mode 0 pixels, 8 mode 1 pixels or 16 mode 2 pixels.&lt;br /&gt;
* The height of a CRTC char is defined by CRTC Register 9 (Max Raster), which is normally set to 7. Resulting in 8 scanlines per character.&lt;br /&gt;
&lt;br /&gt;
Horizontal scrolling can be made smoother by using R3 (Hsync Width), in addition to using R12 and R13 and makes the scrolling effectively half a CRTC char (therefore 2 mode 0 pixels, 4 mode 1 pixels or 8 mode 2 pixels). This can be done by changing the HSYNC width values between 5 and 6. The movement is an effect of how the monitor handles the HSYNC. This effect works well on Amstrad monitors, doesn't work on modern TFT screens and produces a black and white image on a MP-2 modulator because of the adjusted HSYNC timing. &lt;br /&gt;
&lt;br /&gt;
Vertical scrolling can be made smoother by using R5 (Vertical Adjust). This works on all monitors.&lt;br /&gt;
&lt;br /&gt;
More recent games (e.g. Prehistorik 2, Super Cauldron) use the rupture technique when doing vertical scroll to ensure the display is a constant number of scan lines in height, and so the refresh rate is always the same. &lt;br /&gt;
&lt;br /&gt;
Older games adjust R5 and don't use rupture (e.g. LED Storm, Legend of Kage), the time for a frame therefore varies by up to 7 extra scan-lines. This means the VSYNC to the monitor also varies in position by up to 7 extra scan-lines, and the stability of the image is then dependent on how the monitor handles the VSYNC. &lt;br /&gt;
&lt;br /&gt;
If the game uses a status panel, there are 2 ways to handle this.&lt;br /&gt;
# Redraw the panel when the screen is scrolled to compensate for it.&lt;br /&gt;
# Use rupture technique, the panel is in a different part of RAM and will not be affected by the scroll.&lt;br /&gt;
&lt;br /&gt;
This following is an incomplete list of games using hardware scrolling. From this list it can be seen that hardware scrolling has been used from 1984 :&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;FCK__ShowTableBorders&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| ''Title'' &lt;br /&gt;
| ''Year'' &lt;br /&gt;
| ''Vertical'' &lt;br /&gt;
| ''Horizontal'' &lt;br /&gt;
| ''R3'' &lt;br /&gt;
| ''R5'' &lt;br /&gt;
| ''Confirmed''&lt;br /&gt;
|-&lt;br /&gt;
| [[3D Stunt Rider]] &lt;br /&gt;
| 1985&lt;br /&gt;
| No &lt;br /&gt;
| Yes &lt;br /&gt;
| No&lt;br /&gt;
| No&lt;br /&gt;
| Yes&lt;br /&gt;
|-&lt;br /&gt;
| [[Action Force]] &lt;br /&gt;
| 1988 &lt;br /&gt;
| No &lt;br /&gt;
| Yes &lt;br /&gt;
| No &lt;br /&gt;
| No &lt;br /&gt;
| Yes&lt;br /&gt;
|-&lt;br /&gt;
| [[The Amazing Shrinking Man|Amazing Shrinking Man (The)]] &lt;br /&gt;
| 1986 &lt;br /&gt;
| Yes &lt;br /&gt;
| Yes &lt;br /&gt;
| No&lt;br /&gt;
| No &lt;br /&gt;
| Yes&lt;br /&gt;
|-&lt;br /&gt;
| [[Anarchy]] &lt;br /&gt;
| 1988 &lt;br /&gt;
| No &lt;br /&gt;
| Yes &lt;br /&gt;
| No &lt;br /&gt;
| No&lt;br /&gt;
|-&lt;br /&gt;
| [[Axys: The Last Battle]] &lt;br /&gt;
| 1991 &lt;br /&gt;
| Yes &lt;br /&gt;
| No &lt;br /&gt;
| No &lt;br /&gt;
| Yes &lt;br /&gt;
| Yes&lt;br /&gt;
|-&lt;br /&gt;
| [[BMX Kidz]] &lt;br /&gt;
| 1988 &lt;br /&gt;
| No&lt;br /&gt;
| Yes &lt;br /&gt;
| No &lt;br /&gt;
| No&lt;br /&gt;
| Yes&lt;br /&gt;
|-&lt;br /&gt;
| [[Bob Morane Science Fiction]] &lt;br /&gt;
| 1987 &lt;br /&gt;
| Yes &lt;br /&gt;
| Yes &lt;br /&gt;
| No &lt;br /&gt;
| No&lt;br /&gt;
|-&lt;br /&gt;
| [[Boulder Dash]] &lt;br /&gt;
| 1984&lt;br /&gt;
| Yes &lt;br /&gt;
| Yes &lt;br /&gt;
| No&lt;br /&gt;
| No&lt;br /&gt;
| Yes&lt;br /&gt;
|-&lt;br /&gt;
| [[Builderland]] &lt;br /&gt;
| 1991 &lt;br /&gt;
| No &lt;br /&gt;
| Yes &lt;br /&gt;
| No &lt;br /&gt;
| No&lt;br /&gt;
|-&lt;br /&gt;
| [[Canadair]] &lt;br /&gt;
| 1987&lt;br /&gt;
| No &lt;br /&gt;
| Yes &lt;br /&gt;
| No&lt;br /&gt;
| No&lt;br /&gt;
| Yes&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
| [[Cessna Over Moscow]] &lt;br /&gt;
| 1987&lt;br /&gt;
| No &lt;br /&gt;
| Yes &lt;br /&gt;
| No&lt;br /&gt;
| No&lt;br /&gt;
| Yes&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
| [[Cyborgs]] &lt;br /&gt;
| 1991 &lt;br /&gt;
| Yes&lt;br /&gt;
| Yes &lt;br /&gt;
| Yes &lt;br /&gt;
| Yes&lt;br /&gt;
| Yes&lt;br /&gt;
|-&lt;br /&gt;
| [[DJ Puff's Volcanic Eruption]] &lt;br /&gt;
| 1992&lt;br /&gt;
| Yes&lt;br /&gt;
| Yes &lt;br /&gt;
| No &lt;br /&gt;
| No&lt;br /&gt;
| No&lt;br /&gt;
|-&lt;br /&gt;
| [[Doctor Who and the Mines of Terror]] &lt;br /&gt;
| 1986 &lt;br /&gt;
| Yes&lt;br /&gt;
| Yes &lt;br /&gt;
| No &lt;br /&gt;
| No&lt;br /&gt;
| Yes&lt;br /&gt;
|-&lt;br /&gt;
| [[Edge Grinder]] &lt;br /&gt;
| 2011&lt;br /&gt;
| No &lt;br /&gt;
| Yes&lt;br /&gt;
| Yes &lt;br /&gt;
| No&lt;br /&gt;
| Yes&lt;br /&gt;
|-&lt;br /&gt;
| [[Energy Warrior]] &lt;br /&gt;
| 1987 &lt;br /&gt;
| No &lt;br /&gt;
| Yes &lt;br /&gt;
| No &lt;br /&gt;
| No &lt;br /&gt;
| Yes&lt;br /&gt;
|-&lt;br /&gt;
| [[FlySpy]] &lt;br /&gt;
| 1986 &lt;br /&gt;
| Yes &lt;br /&gt;
| Yes &lt;br /&gt;
| No &lt;br /&gt;
| No&lt;br /&gt;
|-&lt;br /&gt;
| [[Fusion 2]] &lt;br /&gt;
| 1988 &lt;br /&gt;
| No &lt;br /&gt;
| Yes &lt;br /&gt;
| No &lt;br /&gt;
| No&lt;br /&gt;
| Yes&lt;br /&gt;
|-&lt;br /&gt;
| [[Glen Hoddle Soccer]] &lt;br /&gt;
| 1985&lt;br /&gt;
| No &lt;br /&gt;
| Yes &lt;br /&gt;
| No&lt;br /&gt;
| No&lt;br /&gt;
| Yes&lt;br /&gt;
|-&lt;br /&gt;
| [[Gothic]] &lt;br /&gt;
| 1988 &lt;br /&gt;
| Yes &lt;br /&gt;
| Yes &lt;br /&gt;
| No &lt;br /&gt;
| Yes&lt;br /&gt;
|-&lt;br /&gt;
| [[Ghosts 'n' Goblins]] &lt;br /&gt;
| 1986 &lt;br /&gt;
| No &lt;br /&gt;
| Yes &lt;br /&gt;
| Yes&lt;br /&gt;
| No&lt;br /&gt;
| Yes&lt;br /&gt;
|-&lt;br /&gt;
| [[Ghouls 'n' Ghosts]] &lt;br /&gt;
| 1989 &lt;br /&gt;
| No &lt;br /&gt;
| Yes &lt;br /&gt;
| No &lt;br /&gt;
| No&lt;br /&gt;
| Yes&lt;br /&gt;
|-&lt;br /&gt;
| [[Into The Eagle's Nest]] &lt;br /&gt;
| 1987 &lt;br /&gt;
| Yes&lt;br /&gt;
| Yes &lt;br /&gt;
| No &lt;br /&gt;
| No&lt;br /&gt;
| Yes&lt;br /&gt;
|-&lt;br /&gt;
| [[Jinks]] &lt;br /&gt;
| 1988 &lt;br /&gt;
| No &lt;br /&gt;
| Yes &lt;br /&gt;
| Yes &lt;br /&gt;
| No &lt;br /&gt;
| Yes&lt;br /&gt;
|-&lt;br /&gt;
| [[Killer Cobra]] &lt;br /&gt;
| 1987 &lt;br /&gt;
| No &lt;br /&gt;
| Yes &lt;br /&gt;
| Yes &lt;br /&gt;
| No &lt;br /&gt;
| Yes&lt;br /&gt;
|-&lt;br /&gt;
| [[Led Storm]] &lt;br /&gt;
| 1988 &lt;br /&gt;
| Yes &lt;br /&gt;
| No &lt;br /&gt;
| No &lt;br /&gt;
| Yes &lt;br /&gt;
| Yes&lt;br /&gt;
|-&lt;br /&gt;
| [[Legend of Kage]] &lt;br /&gt;
| 1986 &lt;br /&gt;
| Yes &lt;br /&gt;
| Yes &lt;br /&gt;
| Yes &lt;br /&gt;
| Yes&lt;br /&gt;
| Yes&lt;br /&gt;
|-&lt;br /&gt;
| [[Leviathan]] &lt;br /&gt;
| 1987 &lt;br /&gt;
| Diagonal &lt;br /&gt;
| scroll! &lt;br /&gt;
| No &lt;br /&gt;
| No &lt;br /&gt;
| Yes&lt;br /&gt;
|-&lt;br /&gt;
| [[Le 5eme Axe]] &lt;br /&gt;
| 1985 &lt;br /&gt;
| Yes &lt;br /&gt;
| Yes &lt;br /&gt;
| No &lt;br /&gt;
| No&lt;br /&gt;
| Yes&lt;br /&gt;
|-&lt;br /&gt;
| [[Mission Genocide]] &lt;br /&gt;
| 1987 &lt;br /&gt;
| Yes &lt;br /&gt;
| No &lt;br /&gt;
| No &lt;br /&gt;
| Yes &lt;br /&gt;
| Yes&lt;br /&gt;
|-&lt;br /&gt;
| [[Monty Python's Flying Circus]] &lt;br /&gt;
| 1990 &lt;br /&gt;
| Yes &lt;br /&gt;
| Yes &lt;br /&gt;
| No &lt;br /&gt;
| No &lt;br /&gt;
| Yes&lt;br /&gt;
|-&lt;br /&gt;
| [[Octoplex]] &lt;br /&gt;
| 1989 &lt;br /&gt;
| Yes &lt;br /&gt;
| Yes &lt;br /&gt;
| No &lt;br /&gt;
| Yes(?) &lt;br /&gt;
| Yes&lt;br /&gt;
|-&lt;br /&gt;
| [[Out of This World]] &lt;br /&gt;
| 1987 &lt;br /&gt;
| No &lt;br /&gt;
| Yes &lt;br /&gt;
| Yes &lt;br /&gt;
| No &lt;br /&gt;
| Yes&lt;br /&gt;
|-&lt;br /&gt;
| [[Paraplane]] &lt;br /&gt;
| 1992 &lt;br /&gt;
| Yes &lt;br /&gt;
| Yes &lt;br /&gt;
| No &lt;br /&gt;
| No&lt;br /&gt;
|-&lt;br /&gt;
| [[Plate-Forme]] &lt;br /&gt;
| 1988 &lt;br /&gt;
| No&lt;br /&gt;
| Yes &lt;br /&gt;
| No &lt;br /&gt;
| No&lt;br /&gt;
| Yes&lt;br /&gt;
|-&lt;br /&gt;
| [[Prehistorik 2]] &lt;br /&gt;
| 1992 &lt;br /&gt;
| Yes &lt;br /&gt;
| Yes &lt;br /&gt;
| Yes &lt;br /&gt;
| Yes &lt;br /&gt;
| Yes&lt;br /&gt;
|-&lt;br /&gt;
| [[Profanation]] &lt;br /&gt;
| 1987 &lt;br /&gt;
| Yes&lt;br /&gt;
| Yes &lt;br /&gt;
| Yes &lt;br /&gt;
| Yes&lt;br /&gt;
| Yes&lt;br /&gt;
|-&lt;br /&gt;
| [[Prohibition]] &lt;br /&gt;
| 1987 &lt;br /&gt;
| Yes &lt;br /&gt;
| Yes &lt;br /&gt;
| No &lt;br /&gt;
| No&lt;br /&gt;
| Yes&lt;br /&gt;
|-&lt;br /&gt;
| [[Rastan]] &lt;br /&gt;
| 1987&lt;br /&gt;
| Yes &lt;br /&gt;
| Yes &lt;br /&gt;
| No &lt;br /&gt;
| No&lt;br /&gt;
| Yes&lt;br /&gt;
|-&lt;br /&gt;
| [[Realm!]] &lt;br /&gt;
| 1987 &lt;br /&gt;
| Yes &lt;br /&gt;
| Yes &lt;br /&gt;
| No &lt;br /&gt;
| No &lt;br /&gt;
|-&lt;br /&gt;
| [[Rick Dangerous 2]] &lt;br /&gt;
| 1990 &lt;br /&gt;
| No &lt;br /&gt;
| Yes &lt;br /&gt;
| No &lt;br /&gt;
| No&lt;br /&gt;
|-&lt;br /&gt;
| [[Rig Attack]] &lt;br /&gt;
| 1985&lt;br /&gt;
| No &lt;br /&gt;
| Yes &lt;br /&gt;
| No&lt;br /&gt;
| No&lt;br /&gt;
| Yes&lt;br /&gt;
|-&lt;br /&gt;
| [[Rockford]] &lt;br /&gt;
| 1988&lt;br /&gt;
| Yes &lt;br /&gt;
| Yes &lt;br /&gt;
| No &lt;br /&gt;
| No&lt;br /&gt;
| Yes&lt;br /&gt;
|-&lt;br /&gt;
| [[Roland on the Ropes]] &lt;br /&gt;
| 1984 &lt;br /&gt;
| Yes &lt;br /&gt;
| Yes &lt;br /&gt;
| No &lt;br /&gt;
| No&lt;br /&gt;
|-&lt;br /&gt;
| [[The Sentinel|Sentinel (The)]] &lt;br /&gt;
| 1987 &lt;br /&gt;
| Yes &lt;br /&gt;
| Yes &lt;br /&gt;
| No &lt;br /&gt;
| No &lt;br /&gt;
| Yes&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
| [[Star Sabre]] &lt;br /&gt;
| 2007&lt;br /&gt;
| No &lt;br /&gt;
| Yes&lt;br /&gt;
| No &lt;br /&gt;
| No&lt;br /&gt;
| Yes&lt;br /&gt;
|-&lt;br /&gt;
| [[The Return of the Jedi|Return of the Jedi (The)]] &lt;br /&gt;
| 1989 &lt;br /&gt;
| Diagonal &lt;br /&gt;
| scroll! &lt;br /&gt;
| No &lt;br /&gt;
| No &lt;br /&gt;
| Yes&lt;br /&gt;
|-&lt;br /&gt;
| [[Thing on a Spring]] &lt;br /&gt;
| 1986 &lt;br /&gt;
| No &lt;br /&gt;
| Yes &lt;br /&gt;
| Yes &lt;br /&gt;
| No&lt;br /&gt;
| Yes&lt;br /&gt;
|-&lt;br /&gt;
| [[Skate Ball]] &lt;br /&gt;
| 1989 &lt;br /&gt;
| No &lt;br /&gt;
| Yes &lt;br /&gt;
| No &lt;br /&gt;
| No &lt;br /&gt;
| Yes&lt;br /&gt;
|-&lt;br /&gt;
| [[Skateboard Kidz]] &lt;br /&gt;
| 1988&lt;br /&gt;
| Yes &lt;br /&gt;
| No &lt;br /&gt;
| No &lt;br /&gt;
| Yes &lt;br /&gt;
| Yes&lt;br /&gt;
|-&lt;br /&gt;
| [[Skate Rock]] &lt;br /&gt;
| 1987 &lt;br /&gt;
| No &lt;br /&gt;
| Yes &lt;br /&gt;
| No &lt;br /&gt;
| No &lt;br /&gt;
| Yes&lt;br /&gt;
|-&lt;br /&gt;
| [[Skate Wars]] &lt;br /&gt;
| 1990 &lt;br /&gt;
| No &lt;br /&gt;
| Yes &lt;br /&gt;
| No &lt;br /&gt;
| Yes &lt;br /&gt;
| Yes&lt;br /&gt;
|-&lt;br /&gt;
| [[Sly Spy Secret Agent]] &lt;br /&gt;
| 1990 &lt;br /&gt;
| Yes &lt;br /&gt;
| Yes &lt;br /&gt;
| No &lt;br /&gt;
| No &lt;br /&gt;
| Yes&lt;br /&gt;
|-&lt;br /&gt;
| [[Star Avenger]] &lt;br /&gt;
| 1984 &lt;br /&gt;
| No &lt;br /&gt;
| Yes &lt;br /&gt;
| No &lt;br /&gt;
| No&lt;br /&gt;
|-&lt;br /&gt;
| [[Star Sabre]] &lt;br /&gt;
| 2007&lt;br /&gt;
| No &lt;br /&gt;
| Yes &lt;br /&gt;
| No &lt;br /&gt;
| Yes&lt;br /&gt;
| Yes&lt;br /&gt;
|-&lt;br /&gt;
| [[Street Machine]] &lt;br /&gt;
| 1986 &lt;br /&gt;
| Yes&lt;br /&gt;
| Yes &lt;br /&gt;
| No &lt;br /&gt;
| No&lt;br /&gt;
| Yes&lt;br /&gt;
|-&lt;br /&gt;
| [[Striker in the Crypts of Trogan]] &lt;br /&gt;
| 1992 &lt;br /&gt;
| Yes &lt;br /&gt;
| Yes &lt;br /&gt;
| No &lt;br /&gt;
| No&lt;br /&gt;
|-&lt;br /&gt;
| [[Super Cauldron]] &lt;br /&gt;
| 1992 &lt;br /&gt;
| Yes &lt;br /&gt;
| Yes &lt;br /&gt;
| Yes &lt;br /&gt;
| Yes &lt;br /&gt;
| Yes&lt;br /&gt;
|-&lt;br /&gt;
| [[Titan]] &lt;br /&gt;
| 1988 &lt;br /&gt;
| Yes &lt;br /&gt;
| Yes &lt;br /&gt;
| No &lt;br /&gt;
| No&lt;br /&gt;
|-&lt;br /&gt;
| [[T.L.L. - Tornado Low Level|Tornado Low Level]] &lt;br /&gt;
| 1985 &lt;br /&gt;
| Yes &lt;br /&gt;
| Yes &lt;br /&gt;
| No &lt;br /&gt;
| No&lt;br /&gt;
| Yes&lt;br /&gt;
|-&lt;br /&gt;
| [[Top Level]]&lt;br /&gt;
|  &lt;br /&gt;
| Yes&lt;br /&gt;
| No &lt;br /&gt;
| No &lt;br /&gt;
| No&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
| [[Twin World]] &lt;br /&gt;
| 1990&lt;br /&gt;
| Yes &lt;br /&gt;
| No&lt;br /&gt;
| No &lt;br /&gt;
| No&lt;br /&gt;
| Yes&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
| [[Ultima Ratio]] &lt;br /&gt;
| 1987 &lt;br /&gt;
| Yes &lt;br /&gt;
| No &lt;br /&gt;
| No &lt;br /&gt;
| No&lt;br /&gt;
| Yes&lt;br /&gt;
|-&lt;br /&gt;
| [[Unitrax]] &lt;br /&gt;
| 1987 &lt;br /&gt;
| Yes &lt;br /&gt;
| Yes &lt;br /&gt;
| No &lt;br /&gt;
| No&lt;br /&gt;
| Yes&lt;br /&gt;
|-&lt;br /&gt;
| [[Vector Ball]] &lt;br /&gt;
| 1988 &lt;br /&gt;
| Diagonal &lt;br /&gt;
| scroll! &lt;br /&gt;
| No &lt;br /&gt;
| No &lt;br /&gt;
| Yes&lt;br /&gt;
|-&lt;br /&gt;
| [[Vikings (The)]] &lt;br /&gt;
| 1986 &lt;br /&gt;
| Yes&lt;br /&gt;
| Yes&lt;br /&gt;
| No &lt;br /&gt;
| No &lt;br /&gt;
| Yes&lt;br /&gt;
|-&lt;br /&gt;
| [[Warhawk]] &lt;br /&gt;
| 1987 &lt;br /&gt;
| Yes &lt;br /&gt;
| No &lt;br /&gt;
| No &lt;br /&gt;
| Yes &lt;br /&gt;
| Yes&lt;br /&gt;
|-&lt;br /&gt;
| [[Wonderboy]] &lt;br /&gt;
| 1987 &lt;br /&gt;
| No &lt;br /&gt;
| Yes &lt;br /&gt;
| No &lt;br /&gt;
| No &lt;br /&gt;
| Yes&lt;br /&gt;
|-&lt;br /&gt;
| [[Xeno]] &lt;br /&gt;
| 1986 &lt;br /&gt;
| No &lt;br /&gt;
| Yes &lt;br /&gt;
| No &lt;br /&gt;
| No &lt;br /&gt;
| Yes&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Rupture (or splitscreen)  ===&lt;br /&gt;
&lt;br /&gt;
A CRTC programming technique used to split the screen into more than one block vertically. &lt;br /&gt;
&lt;br /&gt;
The sizes of each block are defined using CRTC register R4. Vsync is turned off in all but one block (by setting CRTC R7 to a value larger than R4).&lt;br /&gt;
The start address of each block can be changed using CRTC registers R12 and R13.&lt;br /&gt;
&lt;br /&gt;
This allows each block to reference different ram or to hardware scroll one block while another is static.&lt;br /&gt;
&lt;br /&gt;
This method requires careful timing for the CRTC register updates, it also needs testing on all CRTC because there are differences of when each will accept and use the values programmed. However, the result can be made to work on all with more simple ruptures. Care must also be taken to ensure the timings are setup for a 50Hz screen.&lt;br /&gt;
&lt;br /&gt;
It is worth noting that some monitors are more tolerant to longer or shorter frames so the result may appear correctly on them and not on others.&lt;br /&gt;
In addition some games may have been programmed and tested on only 1 CRTC type so may not work on others.&lt;br /&gt;
&lt;br /&gt;
Wonderboy sets R4 every frame to the same value - reason unknown. But it doesn't use Rupture, because if this code is removed it works fine.&lt;br /&gt;
&lt;br /&gt;
This is a an incomplete list of games that use this technique, but according to this list the earliest games used this technique was 1987:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;FCK__ShowTableBorders&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| ''Title'' &lt;br /&gt;
| ''Year'' &lt;br /&gt;
| ''Confirmed''&lt;br /&gt;
|-&lt;br /&gt;
| [[007 The Living  Daylights|007 The Living  Daylights]] &lt;br /&gt;
| 1987 &lt;br /&gt;
| Yes&lt;br /&gt;
|-&lt;br /&gt;
| [[Action Force|Action Force]] &lt;br /&gt;
| 1988 &lt;br /&gt;
| Yes&lt;br /&gt;
|-&lt;br /&gt;
| [[Axys: The Last Battle|Axys]] &lt;br /&gt;
| 1991 &lt;br /&gt;
| Yes&lt;br /&gt;
|-&lt;br /&gt;
| [[Dynamic Duo|Dynamic Duo]] &lt;br /&gt;
| 1988&lt;br /&gt;
| &lt;br /&gt;
|-&lt;br /&gt;
| [[DJ Puff's Volcanic Eruption]] &lt;br /&gt;
| 1992&lt;br /&gt;
| Yes&lt;br /&gt;
|-&lt;br /&gt;
| [[Energy Warrior|Energy Warrior]] &lt;br /&gt;
| 1987&lt;br /&gt;
| Yes&lt;br /&gt;
|-&lt;br /&gt;
| [[Enlightenment: Druid 2|Enlightenment: Druid 2]] &lt;br /&gt;
| 1988&lt;br /&gt;
| &lt;br /&gt;
|-&lt;br /&gt;
| [[European 5-A-Side]] &lt;br /&gt;
| 1988&lt;br /&gt;
| &lt;br /&gt;
|-&lt;br /&gt;
| [[F1 Tornado Simulator]] &lt;br /&gt;
| 1991&lt;br /&gt;
| No&lt;br /&gt;
|-&lt;br /&gt;
| [[Grell and Falla|Grell and Falla]] &lt;br /&gt;
| 1992&lt;br /&gt;
| &lt;br /&gt;
|-&lt;br /&gt;
| [[Mission Genocide|Mission Genocide]] &lt;br /&gt;
| 1987 &lt;br /&gt;
| Yes&lt;br /&gt;
|-&lt;br /&gt;
| [[Octoplex|Octoplex]] &lt;br /&gt;
| 1989 &lt;br /&gt;
| Yes&lt;br /&gt;
|-&lt;br /&gt;
| [[Para Academy]] &lt;br /&gt;
| 1990&lt;br /&gt;
| No&lt;br /&gt;
|-&lt;br /&gt;
| [[Prehistorik 2|Prehistorik 2]] &lt;br /&gt;
| 1992 &lt;br /&gt;
| Yes&lt;br /&gt;
|-&lt;br /&gt;
| [[Q10 Tank Buster]] &lt;br /&gt;
| 1991&lt;br /&gt;
| Yes&lt;br /&gt;
|-&lt;br /&gt;
| [[Rastan]] &lt;br /&gt;
| 1987&lt;br /&gt;
| Yes &lt;br /&gt;
|-&lt;br /&gt;
| [[Rockford]] &lt;br /&gt;
| 1988&lt;br /&gt;
| Yes &lt;br /&gt;
|-&lt;br /&gt;
| [[Santa's Christmas Capers]] &lt;br /&gt;
| 1990&lt;br /&gt;
| Yes&lt;br /&gt;
|-&lt;br /&gt;
| [[Skate Ball|Skate Ball]] &lt;br /&gt;
| 1989 &lt;br /&gt;
| Yes&lt;br /&gt;
|-&lt;br /&gt;
| [[Skatewars|Skatewars]] &lt;br /&gt;
| 1989 &lt;br /&gt;
| &lt;br /&gt;
|-&lt;br /&gt;
| [[Skateboard Kidz|Skateboard Kidz]]&lt;br /&gt;
| 1988&lt;br /&gt;
| Yes&lt;br /&gt;
|-&lt;br /&gt;
| [[Snowstrike|Snowstrike]] &lt;br /&gt;
| 1990&lt;br /&gt;
| &lt;br /&gt;
|-&lt;br /&gt;
| [[Storm Warrior|Storm Warrior]] &lt;br /&gt;
| 1989&lt;br /&gt;
| Yes&lt;br /&gt;
|-&lt;br /&gt;
| [[Super Cauldron|Super Cauldron]] &lt;br /&gt;
| 1992 &lt;br /&gt;
| Yes&lt;br /&gt;
|-&lt;br /&gt;
| [[Turrican|Turrican]] &lt;br /&gt;
| 1990 &lt;br /&gt;
| Yes&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
| [[Twin World (Ubi Soft)|Twin World (Ubi Soft)]] &lt;br /&gt;
| 1990 &lt;br /&gt;
| Yes&lt;br /&gt;
|-&lt;br /&gt;
| [[Usagi Yojimbo|Usagi Yojimbo]] &lt;br /&gt;
| 1988&lt;br /&gt;
| Yes&lt;br /&gt;
|-&lt;br /&gt;
| [[Warhawk|Warhawk]] &lt;br /&gt;
| 1987 &lt;br /&gt;
| Yes&lt;br /&gt;
|-&lt;br /&gt;
| [[Xyphoes Fantasy|Xyphoes Fantasy]] &lt;br /&gt;
| 1991&lt;br /&gt;
| Yes&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==Firmware==&lt;br /&gt;
&lt;br /&gt;
The following games are known to use firmware functions. This probably explains why they are poor. If the programmer had used the hardware directly they would have lots more cycles free which they could have used to make the game better.&lt;br /&gt;
&lt;br /&gt;
This list is not exhaustive.&lt;br /&gt;
&lt;br /&gt;
*[[Xevious]]&lt;br /&gt;
&lt;br /&gt;
[[Category:Programming]]&lt;/div&gt;</summary>
		<author><name>Longshot</name></author>	</entry>

	<entry>
		<id>https://oldwiki.cpcwiki.eu/index.php?title=Emulators&amp;diff=109315</id>
		<title>Emulators</title>
		<link rel="alternate" type="text/html" href="https://oldwiki.cpcwiki.eu/index.php?title=Emulators&amp;diff=109315"/>
				<updated>2022-10-25T09:33:21Z</updated>
		
		<summary type="html">&lt;p&gt;Longshot: /* Windows */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Operating Systems  =&lt;br /&gt;
&lt;br /&gt;
== Acorn RISC OS  ==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable sortable&amp;quot; style=&amp;quot;width:100%&amp;quot;&lt;br /&gt;
! Name&lt;br /&gt;
! Actual version&lt;br /&gt;
! Last release&lt;br /&gt;
! Emulated systems&lt;br /&gt;
! License&lt;br /&gt;
! Link&lt;br /&gt;
|-&lt;br /&gt;
| [[!CPC|!CPC]]&lt;br /&gt;
| &lt;br /&gt;
| Jul 28, 1996&lt;br /&gt;
| [[CPC old generation|CPC range]]&lt;br /&gt;
| Freeware&lt;br /&gt;
| [ftp://ftp.lip6.fr/pub/amstrad/emulator/CPC0728.ZIP]&lt;br /&gt;
|-&lt;br /&gt;
| [[!CPCemu|!CPCemu]]&lt;br /&gt;
| 1.21&lt;br /&gt;
| Mar 22, 2016&lt;br /&gt;
| [[CPC old generation|CPC range]]&lt;br /&gt;
| Freeware&lt;br /&gt;
| [http://www.huggers-world.de/files/cpcemu121.zip]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== AmigaOS  ==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable sortable&amp;quot; style=&amp;quot;width:100%&amp;quot;&lt;br /&gt;
! Name&lt;br /&gt;
! Actual version&lt;br /&gt;
! Last release&lt;br /&gt;
! Emulated systems&lt;br /&gt;
! License&lt;br /&gt;
! Link&lt;br /&gt;
|-&lt;br /&gt;
| [[A-CPC|A-CPC]]&lt;br /&gt;
| 2.0&lt;br /&gt;
| Apr, 2002&lt;br /&gt;
| [[CPC old generation|CPC range]], [[Plus|Plus range]]&lt;br /&gt;
| Open source&lt;br /&gt;
| [http://cpctech.cpc-live.com/download/a-cpc.lha]&lt;br /&gt;
|-&lt;br /&gt;
| [[Ami-CPC|Ami-CPC]]&lt;br /&gt;
| 0.46&lt;br /&gt;
| Jan 21, 1998&lt;br /&gt;
| [[CPC old generation|CPC range]]&lt;br /&gt;
| Open source&lt;br /&gt;
| [http://deplanque.chez.com/ami-cpc.lha]&lt;br /&gt;
|-&lt;br /&gt;
| [[Arnold|Arnold]]&lt;br /&gt;
| 1.15&lt;br /&gt;
| Dec 17, 2012&lt;br /&gt;
| [[CPC old generation|CPC range]], [[Plus|Plus range]], [[KC Compact]]&lt;br /&gt;
| Open source&lt;br /&gt;
| [http://hirudov.com/amiga/Arnold.php]&lt;br /&gt;
|-&lt;br /&gt;
| [[CPE|CPE]]&lt;br /&gt;
| &lt;br /&gt;
| Feb 24, 1995&lt;br /&gt;
| [[CPC old generation|CPC range]]&lt;br /&gt;
| Open source&lt;br /&gt;
| [ftp://ftp.lip6.fr/pub/amstrad/emulator/ACPE_NEW.LHA]&lt;br /&gt;
|-&lt;br /&gt;
| [[Emu-CPC|Emu-CPC]]&lt;br /&gt;
| 0.7&lt;br /&gt;
| Sep 15, 1996&lt;br /&gt;
| [[CPC old generation|CPC range]]&lt;br /&gt;
| Freeware&lt;br /&gt;
| [ftp://ftp.lip6.fr/pub/amstrad/emulator/EMUCPC07.LZX]&lt;br /&gt;
|-&lt;br /&gt;
| [[MESS|SDLMESS]]&lt;br /&gt;
| 0.146u4&lt;br /&gt;
| Aug 19, 2012&lt;br /&gt;
| [[CPC old generation|CPC range]], [[Plus|Plus range]], [[KC Compact]], [[Aleste 520EX]] &amp;amp; lots of other computer systems&lt;br /&gt;
| Open source&lt;br /&gt;
| [http://se.os4depot.net/index.php?function=showfile&amp;amp;file=emulation/computer/sdl_mess.lha]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== AMSDOS ==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable sortable&amp;quot; style=&amp;quot;width:100%&amp;quot;&lt;br /&gt;
! Name&lt;br /&gt;
! Actual version&lt;br /&gt;
! Last release&lt;br /&gt;
! Emulated systems&lt;br /&gt;
! License&lt;br /&gt;
! Link&lt;br /&gt;
|-&lt;br /&gt;
| [[Pac-Man|Pac-Man]]&lt;br /&gt;
| 1.1&lt;br /&gt;
| Jun 5, 2014&lt;br /&gt;
| [[Pac-Man arcade|Pac-Man arcade]]&lt;br /&gt;
| Open source&lt;br /&gt;
| [http://www.cpcwiki.eu/forum/games/speed-up-patch-for-pac-man-emulator-for-cpc-by-syx-toto/msg81222/#msg81222]&lt;br /&gt;
|-&lt;br /&gt;
| [[Space Invaders|Space Invaders]]&lt;br /&gt;
| 1.0&lt;br /&gt;
| Jun 11, 2016&lt;br /&gt;
| [[Space Invaders arcade|Space Invaders arcade]]&lt;br /&gt;
| Freeware&lt;br /&gt;
| [http://www.cpcwiki.eu/forum/games/space-invaders-arcade-emulator-for-amstrad-cpc/]&lt;br /&gt;
|-&lt;br /&gt;
| [[ZXM|ZXM]]&lt;br /&gt;
| &lt;br /&gt;
| 1993&lt;br /&gt;
| [[ZX Spectrum|ZX Spectrum]]&lt;br /&gt;
| Freeware&lt;br /&gt;
| [ftp://ftp.nvg.ntnu.no/pub/cpc/misc/zxm.zip]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== DOS  ==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable sortable&amp;quot; style=&amp;quot;width:100%&amp;quot;&lt;br /&gt;
! Name&lt;br /&gt;
! Actual version&lt;br /&gt;
! Last release&lt;br /&gt;
! Emulated systems&lt;br /&gt;
! License&lt;br /&gt;
! Link&lt;br /&gt;
|-&lt;br /&gt;
| [[Arnimedes|Arnimedes]] &lt;br /&gt;
| 0.8a&lt;br /&gt;
| Apr 15, 2000&lt;br /&gt;
| [[CPC old generation|CPC range]]&lt;br /&gt;
| Freeware&lt;br /&gt;
| [http://www.arnimedes.de/]&lt;br /&gt;
|-&lt;br /&gt;
| [[CPCE|CPCE]] &lt;br /&gt;
| 1.94&lt;br /&gt;
| Jun 2, 2011&lt;br /&gt;
| [[CPC old generation|CPC range]]&lt;br /&gt;
| Freeware&lt;br /&gt;
| [http://cngsoft.no-ip.org/cpce/]&lt;br /&gt;
|-&lt;br /&gt;
| [[CPCemu|CPCemu]] &lt;br /&gt;
| 1.5&lt;br /&gt;
| Jul 7, 1998&lt;br /&gt;
| [[CPC old generation|CPC range]]&lt;br /&gt;
| Freeware&lt;br /&gt;
| [http://www.cpc-emu.org/]&lt;br /&gt;
|-&lt;br /&gt;
| [[NO$CPC|NO$CPC]]&lt;br /&gt;
| 1.8&lt;br /&gt;
| Nov 2, 2000&lt;br /&gt;
| [[CPC old generation|CPC range]], [[Plus|Plus range]]&lt;br /&gt;
| Freeware&lt;br /&gt;
| [http://problemkaputt.de/cpc.htm]&lt;br /&gt;
|-&lt;br /&gt;
| [[CPCEMU (RWCPC)|RWCPC]]&lt;br /&gt;
| &lt;br /&gt;
| Mar 23, 1995&lt;br /&gt;
| [[CPC old generation|CPC range]]&lt;br /&gt;
| Freeware&lt;br /&gt;
| [ftp://ftp.lip6.fr/pub/amstrad/emulator/RWCPC.ZIP]&lt;br /&gt;
|-&lt;br /&gt;
| [[SIMCPC|SIMCPC]]&lt;br /&gt;
| &lt;br /&gt;
| 1990&lt;br /&gt;
| [[CPC old generation|CPC range]]&lt;br /&gt;
| Shareware&lt;br /&gt;
| [ftp://ftp.lip6.fr/pub/amstrad/emulator/SIMCPC.ZIP]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== EXOS ==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable sortable&amp;quot; style=&amp;quot;width:100%&amp;quot;&lt;br /&gt;
! Name&lt;br /&gt;
! Actual version&lt;br /&gt;
! Last release&lt;br /&gt;
! Emulated systems&lt;br /&gt;
! License&lt;br /&gt;
! Link&lt;br /&gt;
|-&lt;br /&gt;
| [[Software CPC Emulator|Software CPC Emulator]] &lt;br /&gt;
| 1.3&lt;br /&gt;
| Jan 11, 2013&lt;br /&gt;
| [[CPC old generation|CPC range]]&lt;br /&gt;
| Open source&lt;br /&gt;
| [http://www.ep128.hu/Ep_Util/Prg/Amstrad_CPC_Emulator_13.rar]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Haiku  ==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable sortable&amp;quot; style=&amp;quot;width:100%&amp;quot;&lt;br /&gt;
! Name&lt;br /&gt;
! Actual version&lt;br /&gt;
! Last release&lt;br /&gt;
! Emulated systems&lt;br /&gt;
! License&lt;br /&gt;
! Link&lt;br /&gt;
|-&lt;br /&gt;
| [[ACE_(Emulator)|ACE]]&lt;br /&gt;
| 1.14.0&lt;br /&gt;
| Jun 20, 2020&lt;br /&gt;
| [[CPC old generation|CPC range]], [[Plus|Plus range]]&lt;br /&gt;
| Freeware&lt;br /&gt;
| [http://www.cpcwiki.eu/forum/emulators/ace-for-haiku/] [http://ace.cpcscene.net/]&lt;br /&gt;
|-&lt;br /&gt;
| [[AdvanceMAME|AdvanceMAME]]&lt;br /&gt;
| 3.9-1&lt;br /&gt;
| Feb 3, 2020&lt;br /&gt;
| [[CPC old generation|CPC range]], [[Plus|Plus range]], [[KC Compact]], [[Aleste 520EX]] &amp;amp; lots of other computer systems&lt;br /&gt;
| Open source&lt;br /&gt;
| [https://depot.haiku-os.org/#!/pkg/advancemame_x86]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Java / JVM  ==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable sortable&amp;quot; style=&amp;quot;width:100%&amp;quot;&lt;br /&gt;
! Name&lt;br /&gt;
! Actual version&lt;br /&gt;
! Last release&lt;br /&gt;
! Emulated systems&lt;br /&gt;
! License&lt;br /&gt;
! Link&lt;br /&gt;
|-&lt;br /&gt;
| [[Arnold Jnr|Arnold Jnr]]&lt;br /&gt;
| &lt;br /&gt;
| Aug 27, 2001&lt;br /&gt;
| [[CPC old generation|CPC range]]&lt;br /&gt;
| Open source&lt;br /&gt;
| [http://www.arnoldemu.freeserve.co.uk/]&lt;br /&gt;
|-&lt;br /&gt;
| [[CPCInAJar|CPCInAJar]]&lt;br /&gt;
|&lt;br /&gt;
| Mar 16, 2011&lt;br /&gt;
| [[CPC old generation|CPC range]]&lt;br /&gt;
| Open source&lt;br /&gt;
| [http://sourceforge.net/projects/cpcinajar/]&lt;br /&gt;
|-&lt;br /&gt;
| [[JavaCPC|JavaCPC Desktop]]&lt;br /&gt;
| 2.9.7&lt;br /&gt;
| Sep 21, 2018&lt;br /&gt;
| [[CPC old generation|CPC range]], [[KC Compact]]&lt;br /&gt;
| Donationware&lt;br /&gt;
| [https://sourceforge.net/projects/javacpc/]&lt;br /&gt;
|-&lt;br /&gt;
| [[JavaCPC|JavaCPC Applet]]&lt;br /&gt;
| &lt;br /&gt;
| Jul 10, 2012&lt;br /&gt;
| [[CPC old generation|CPC range]], [[Plus|Plus range]]&lt;br /&gt;
| Donationware&lt;br /&gt;
| [http://java.cpc-live.com/] (dead link)&lt;br /&gt;
|-&lt;br /&gt;
| [[JavaGX4000|JavaGX4000]]&lt;br /&gt;
| &lt;br /&gt;
| Sep 7, 2018&lt;br /&gt;
| [[CPC old generation|CPC range]], [[Plus|Plus range]]&lt;br /&gt;
| Open source&lt;br /&gt;
| [http://sourceforge.net/projects/javagx4000/]&lt;br /&gt;
|-&lt;br /&gt;
| [[JEMU|JEMU]]&lt;br /&gt;
| &lt;br /&gt;
| Feb 19, 2007&lt;br /&gt;
| [[CPC old generation|CPC range]], [[BBC Micro]], [[VZ-300]], [[ZX Spectrum]], [[ZX80/81]]&lt;br /&gt;
| Open source&lt;br /&gt;
| [http://jemu.winape.net/]&lt;br /&gt;
|-&lt;br /&gt;
| [[JKCEMU|JKCEMU]]&lt;br /&gt;
| 0.9.7&lt;br /&gt;
| Mar 30, 2017&lt;br /&gt;
| [[KC Compact]] &amp;amp; other computers from East Germany&lt;br /&gt;
| Open source&lt;br /&gt;
| [http://www.jens-mueller.org/jkcemu/kccompact.html]&lt;br /&gt;
|-&lt;br /&gt;
| [[WebCPC|WebCPC]]&lt;br /&gt;
| r15&lt;br /&gt;
| Dec 31, 2010&lt;br /&gt;
| [[CPC old generation|CPC range]]&lt;br /&gt;
| Open source&lt;br /&gt;
| [http://sourceforge.net/projects/webcpc/]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== JavaScript / HTML5  ==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable sortable&amp;quot; style=&amp;quot;width:100%&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Name &lt;br /&gt;
! Actual version &lt;br /&gt;
! Last release &lt;br /&gt;
! Emulated systems &lt;br /&gt;
! License &lt;br /&gt;
! Link&lt;br /&gt;
|-&lt;br /&gt;
| [[CPCBox|CPCBox]] &lt;br /&gt;
| beta &lt;br /&gt;
| Dec 28, 2013&lt;br /&gt;
| [[CPC old generation|CPC range]] &lt;br /&gt;
| Freeware &lt;br /&gt;
| [https://web.archive.org/web/20190702084943/http://www.cpcbox.com/] [https://bzhgames.xyz/index.php BZH Games]&lt;br /&gt;
|-&lt;br /&gt;
| [[CrocoDS|CrocoDS]] &lt;br /&gt;
| &lt;br /&gt;
| May 13, 2020&lt;br /&gt;
| [[CPC old generation|CPC range]] &lt;br /&gt;
| Freeware &lt;br /&gt;
| [http://crocods.org/web/]&lt;br /&gt;
|-&lt;br /&gt;
| [[JSMESS]] &lt;br /&gt;
| 0.153&lt;br /&gt;
| Oct 29, 2014&lt;br /&gt;
| [[CPC old generation|CPC range]] &amp;amp; lots of other computer systems&lt;br /&gt;
| Open source&lt;br /&gt;
| [http://jsmess.textfiles.com/]&lt;br /&gt;
|-&lt;br /&gt;
| [[Roland javascript emulator|Roland]] &lt;br /&gt;
| &lt;br /&gt;
| Sep 24, 2011 &lt;br /&gt;
| [[CPC old generation|CPC range]] &lt;br /&gt;
| Open source &lt;br /&gt;
| [http://roland.retrolandia.net/]&lt;br /&gt;
|-&lt;br /&gt;
| [[Tiny Emus]]&lt;br /&gt;
| &lt;br /&gt;
| Dec 31, 2018&lt;br /&gt;
| [[CPC old generation|CPC range]], [[ZX Spectrum]], [[VIC-20]], [[Commodore 64]], [[Acorn Atom]], [[KC Compact]], [[KC 85]], [[KC 87]], [[Z9001]], [[Z1013]]&lt;br /&gt;
| Open source&lt;br /&gt;
| [https://floooh.github.io/tiny8bit/] [http://cpc.devilmarkus.de/ JavaCPC-Games]&lt;br /&gt;
|-&lt;br /&gt;
| [[Griffin CPC emulator|Xiragon]]&lt;br /&gt;
| &lt;br /&gt;
| Nov 28, 2012&lt;br /&gt;
| [[CPC old generation|CPC range]]&lt;br /&gt;
| Open source&lt;br /&gt;
| [http://xiragon.com/]&lt;br /&gt;
|-&lt;br /&gt;
| [[YAKC|Yet another KC emulator]]&lt;br /&gt;
| &lt;br /&gt;
| Apr 17, 2017&lt;br /&gt;
| [[CPC old generation|CPC range]], [[ZX Spectrum]], [[Commodore 64]], [[Acorn Atom]], [[KC Compact]], [[KC 85]], [[KC 87]], [[Z9001]], [[Z1013]], [[HC900]]&lt;br /&gt;
| Open source&lt;br /&gt;
| [http://floooh.github.io/virtualkc/]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== macOS ==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable sortable&amp;quot; style=&amp;quot;width:100%&amp;quot;&lt;br /&gt;
! Name&lt;br /&gt;
! Actual version&lt;br /&gt;
! Last release&lt;br /&gt;
! Emulated systems&lt;br /&gt;
! License&lt;br /&gt;
! Link&lt;br /&gt;
|-&lt;br /&gt;
| [[Arnold_(Emulator)|Arnold]] &lt;br /&gt;
| 1.7.9&lt;br /&gt;
| Mar 10, 2018&lt;br /&gt;
| [[CPC old generation|CPC range]], [[Plus|Plus range]], [[KC Compact]]&lt;br /&gt;
| Open source&lt;br /&gt;
| [https://www.bannister.org/software/arnold.htm]&lt;br /&gt;
|-&lt;br /&gt;
| [[Clock Signal|Clock Signal]] &lt;br /&gt;
| &lt;br /&gt;
| Aug 2, 2020&lt;br /&gt;
| [[CPC old generation|CPC range]], [[Acorn Electron]], [[Apple II]], [[Oric 1/Atmos]], [[VIC-20]], [[ZX80/81]], [[Atari 2600]], [[Atari ST]], [[Macintosh]], [[MSX|MSX 1]], [[ColecoVision]]&lt;br /&gt;
| Open source&lt;br /&gt;
| [https://github.com/TomHarte/CLK/releases]&lt;br /&gt;
|-&lt;br /&gt;
| [[CPCplusplus|CPC++]]&lt;br /&gt;
| 2.0.0&lt;br /&gt;
| Jan 14, 2003&lt;br /&gt;
| [[CPC old generation|CPC range]]&lt;br /&gt;
| Shareware&lt;br /&gt;
| [http://bricerive.free.fr/cpc/cpcpp.html]&lt;br /&gt;
|-&lt;br /&gt;
| [[CPCSharp|CPCSharp]] &lt;br /&gt;
| 1.0.0-beta1&lt;br /&gt;
| Apr 7, 2021&lt;br /&gt;
| [[CPC old generation|CPC range]]&lt;br /&gt;
| Open source&lt;br /&gt;
| [https://github.com/dolbz/CPCSharp/releases/]&lt;br /&gt;
|-&lt;br /&gt;
| [[DSP|DSP]]&lt;br /&gt;
| 0.18&lt;br /&gt;
| Dec 31, 2017&lt;br /&gt;
| [[CPC old generation|CPC range]], [[ZX Spectrum]], [[Game Boy]], [[Nintendo NES]], [[Sega Master System]], [[ColecoVision]], [[Arcade]]&lt;br /&gt;
| Open source&lt;br /&gt;
| [https://github.com/leniad/dsp-emulator/]&lt;br /&gt;
|-&lt;br /&gt;
| [[MacCPC|MacCPC]]&lt;br /&gt;
| 0.9.2&lt;br /&gt;
| Jan 22, 2010&lt;br /&gt;
| [[CPC old generation|CPC range]]&lt;br /&gt;
| Freeware&lt;br /&gt;
| [http://www.wincpc.ch/index.php?topic=projects-maccpc]&lt;br /&gt;
|-&lt;br /&gt;
| [[Retro Virtual Machine|Retro Virtual Machine]]&lt;br /&gt;
| 2.0 BETA-1 R7&lt;br /&gt;
| Jul 10, 2019&lt;br /&gt;
| [[CPC old generation|CPC range]], [[ZX Spectrum]]&lt;br /&gt;
| Donationware&lt;br /&gt;
| [https://www.retrovirtualmachine.org]&lt;br /&gt;
|-&lt;br /&gt;
| [[MESS|SDLMAME]]&lt;br /&gt;
| 0.201&lt;br /&gt;
| Aug 29, 2018&lt;br /&gt;
| [[CPC old generation|CPC range]], [[Plus|Plus range]], [[KC Compact]], [[Aleste 520EX]] &amp;amp; lots of other computer systems&lt;br /&gt;
| Open source&lt;br /&gt;
| [http://sdlmame.lngn.net/]&lt;br /&gt;
|-&lt;br /&gt;
| [[ZEsarUX|ZEsarUX]]&lt;br /&gt;
| 9.0&lt;br /&gt;
| Aug 19, 2020&lt;br /&gt;
| [[CPC old generation|CPC range]], [[ZX Spectrum]], [[ZX80/81]], [[Jupiter ACE]], [[Sam Coupe]], [[Sinclair QL]], [[MSX 1]], [[ColecoVision]], [[SG-1000]]&lt;br /&gt;
| Donationware &amp;amp; Open source&lt;br /&gt;
| [https://github.com/chernandezba/zesarux]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== MorphOS  ==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable sortable&amp;quot; style=&amp;quot;width:100%&amp;quot;&lt;br /&gt;
! Name&lt;br /&gt;
! Actual version&lt;br /&gt;
! Last release&lt;br /&gt;
! Emulated systems&lt;br /&gt;
! License&lt;br /&gt;
! Link&lt;br /&gt;
|-&lt;br /&gt;
| [[ACE_(Emulator)|ACE]]&lt;br /&gt;
| 1.25&lt;br /&gt;
| September 8, 2022&lt;br /&gt;
| [[CPC old generation|CPC range]], [[Plus|Plus range]]&lt;br /&gt;
| Freeware&lt;br /&gt;
| [http://ace.cpcscene.net/]&lt;br /&gt;
|-&lt;br /&gt;
| [[MESS|MESS]]&lt;br /&gt;
| 0.113&lt;br /&gt;
| Nov 1, 2007&lt;br /&gt;
| [[CPC old generation|CPC range]], [[Plus|Plus range]], [[KC Compact]], [[Aleste 520EX]] &amp;amp; lots of other computer systems&lt;br /&gt;
| Open source&lt;br /&gt;
| [http://fabportnawak.free.fr/mame/]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== MSX2 ==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable sortable&amp;quot; style=&amp;quot;width:100%&amp;quot;&lt;br /&gt;
! Name&lt;br /&gt;
! Actual version&lt;br /&gt;
! Last release&lt;br /&gt;
! Emulated systems&lt;br /&gt;
! License&lt;br /&gt;
! Link&lt;br /&gt;
|-&lt;br /&gt;
| [[EMU6CPC|EMU6CPC]]&lt;br /&gt;
| &lt;br /&gt;
| Dec 17, 2018&lt;br /&gt;
| [[CPC old generation|CPC range]]&lt;br /&gt;
| Freeware&lt;br /&gt;
| [http://romu6.blogspot.com/2018/12/emu6cpc-emulador-de-amstrad-cpc-6128.html]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Unix / Linux  ==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable sortable&amp;quot; style=&amp;quot;width:100%&amp;quot;&lt;br /&gt;
! Name&lt;br /&gt;
! Actual version&lt;br /&gt;
! Last release&lt;br /&gt;
! Emulated systems&lt;br /&gt;
! License&lt;br /&gt;
! Link&lt;br /&gt;
|-&lt;br /&gt;
| [[Arnold_(Emulator)|Arnold]] &lt;br /&gt;
| &lt;br /&gt;
| Jan 20, 2016&lt;br /&gt;
| [[CPC old generation|CPC range]], [[Plus|Plus range]], [[KC Compact]], [[Aleste 520EX]]&lt;br /&gt;
| Open source&lt;br /&gt;
| [http://www.cpcwiki.eu/forum/emulators/arnold-wip/msg118124/]&lt;br /&gt;
|-&lt;br /&gt;
| [[CaPriCe|CaPriCe32]] &lt;br /&gt;
| 4.4.0&lt;br /&gt;
| Mar 26, 2017&lt;br /&gt;
| [[CPC old generation|CPC range]], [[Plus|Plus range]]&lt;br /&gt;
| Donationware &amp;amp; Open source&lt;br /&gt;
| [https://github.com/ColinPitrat/caprice32]&lt;br /&gt;
|-&lt;br /&gt;
| [[Caprice Reloaded]]&lt;br /&gt;
| r377&lt;br /&gt;
| Jul 13, 2010&lt;br /&gt;
| [[CPC old generation|CPC range]]&lt;br /&gt;
| Open source&lt;br /&gt;
| [http://aur.archlinux.org/packages.php?ID=38856]&lt;br /&gt;
|-&lt;br /&gt;
| [[Clock Signal|Clock Signal]] &lt;br /&gt;
| &lt;br /&gt;
| Aug 2, 2020&lt;br /&gt;
| [[CPC old generation|CPC range]], [[Acorn Electron]], [[Apple II]], [[Oric 1/Atmos]], [[VIC-20]], [[ZX80/81]], [[Atari 2600]], [[Atari ST]], [[Macintosh]], [[MSX|MSX 1]], [[ColecoVision]]&lt;br /&gt;
| Open source&lt;br /&gt;
| [https://github.com/TomHarte/CLK/releases]&lt;br /&gt;
|-&lt;br /&gt;
| [[CPCplusplus|CPC++]]&lt;br /&gt;
| 1.5.0&lt;br /&gt;
| &lt;br /&gt;
| [[CPC old generation|CPC range]]&lt;br /&gt;
| Shareware&lt;br /&gt;
| [http://bricerive.free.fr/cpc/cpcpp.html]&lt;br /&gt;
|-&lt;br /&gt;
| [[cpc4x|cpc4x]] &lt;br /&gt;
| 0.26&lt;br /&gt;
| Dec 11, 2004&lt;br /&gt;
| [[CPC old generation|CPC range]]&lt;br /&gt;
| Open source&lt;br /&gt;
| [http://www.ulrich-cordes.de/cpc/english/cpcemu.htm]&lt;br /&gt;
|-&lt;br /&gt;
| [[CPCemu|CPCemu]] &lt;br /&gt;
| 2.0&lt;br /&gt;
| Jan 7, 2021&lt;br /&gt;
| [[CPC old generation|CPC range]]&lt;br /&gt;
| Freeware&lt;br /&gt;
| [http://www.cpc-emu.org/]&lt;br /&gt;
|-&lt;br /&gt;
| [[DSP|DSP]]&lt;br /&gt;
| 0.18&lt;br /&gt;
| Dec 31, 2017&lt;br /&gt;
| [[CPC old generation|CPC range]], [[ZX Spectrum]], [[Game Boy]], [[Nintendo NES]], [[Sega Master System]], [[ColecoVision]], [[Arcade]]&lt;br /&gt;
| Open source&lt;br /&gt;
| [https://github.com/leniad/dsp-emulator/]&lt;br /&gt;
|-&lt;br /&gt;
| [[ep128emu|ep128emu]]&lt;br /&gt;
| 2.0.11&lt;br /&gt;
| Jan 20, 2017&lt;br /&gt;
| [[CPC old generation|CPC range]], [[ZX Spectrum]], [[Enterprise]]&lt;br /&gt;
| Donationware &amp;amp; Open source&lt;br /&gt;
| [http://sourceforge.net/projects/ep128emu/]&lt;br /&gt;
|-&lt;br /&gt;
| [[MESS|MAME]]&lt;br /&gt;
| 0.227&lt;br /&gt;
| Dec 30, 2020&lt;br /&gt;
| [[CPC old generation|CPC range]], [[Plus|Plus range]], [[KC Compact]], [[Aleste 520EX]] &amp;amp; lots of other computer systems&lt;br /&gt;
| Open source&lt;br /&gt;
| [http://wiki.mamedev.org/index.php/SDL_Supported_Platforms]&lt;br /&gt;
|-&lt;br /&gt;
| [[Retro Virtual Machine|Retro Virtual Machine]]&lt;br /&gt;
| 2.0 BETA-1 R7&lt;br /&gt;
| Jul 10, 2019&lt;br /&gt;
| [[CPC old generation|CPC range]], [[ZX Spectrum]]&lt;br /&gt;
| Donationware&lt;br /&gt;
| [https://www.retrovirtualmachine.org]&lt;br /&gt;
|-&lt;br /&gt;
| [[Roland Emulator|Roland]] &lt;br /&gt;
| 0.70&lt;br /&gt;
| Apr 20, 2017&lt;br /&gt;
| [[CPC old generation|CPC range]]&lt;br /&gt;
| Open source&lt;br /&gt;
| [https://www.rolandemu.de/index.html]&lt;br /&gt;
|-&lt;br /&gt;
| [[Ronald|Ronald]] &lt;br /&gt;
| &lt;br /&gt;
| Sep 5, 2021&lt;br /&gt;
| [[CPC old generation|CPC range]]&lt;br /&gt;
| Open source&lt;br /&gt;
| [https://github.com/mdm/ronald]&lt;br /&gt;
|-&lt;br /&gt;
| [[SugarBox|SugarBox]]&lt;br /&gt;
| 0.29&lt;br /&gt;
| Jan 22, 2018&lt;br /&gt;
| [[CPC old generation|CPC range]], [[Plus|Plus range]]&lt;br /&gt;
| Open-Source&lt;br /&gt;
| [http://sugarbox.free.fr/] [https://github.com/Tom1975/SugarboxV2]&lt;br /&gt;
|-&lt;br /&gt;
| [[XCPC|Xcpc]]&lt;br /&gt;
| 0.37.0&lt;br /&gt;
| May 2, 2021&lt;br /&gt;
| [[CPC old generation|CPC range]]&lt;br /&gt;
| Open source&lt;br /&gt;
| [https://www.xcpc-emulator.net/]&lt;br /&gt;
|-&lt;br /&gt;
| [[YACE|YACE]]&lt;br /&gt;
| Unreleased?&lt;br /&gt;
| Nov 12, 2014&lt;br /&gt;
| [[CPC old generation|CPC range]]&lt;br /&gt;
| Unreleased?&lt;br /&gt;
| [http://www.youtube.com/watch?v=uxQkljwc0i4]&lt;br /&gt;
|-&lt;br /&gt;
| [[ZEsarUX|ZEsarUX]]&lt;br /&gt;
| 9.1&lt;br /&gt;
| Nov 26, 2020&lt;br /&gt;
| [[CPC old generation|CPC range]], [[ZX Spectrum]], [[ZX80/81]], [[Jupiter ACE]], [[Sam Coupe]], [[Sinclair QL]], [[MSX 1]], [[ColecoVision]], [[SG-1000]]&lt;br /&gt;
| Open source&lt;br /&gt;
| [https://github.com/chernandezba/zesarux]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Windows  ==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable sortable&amp;quot; style=&amp;quot;width:100%&amp;quot;&lt;br /&gt;
! Name&lt;br /&gt;
! Actual version&lt;br /&gt;
! Last release&lt;br /&gt;
! Emulated systems&lt;br /&gt;
! License&lt;br /&gt;
! Link&lt;br /&gt;
|-&lt;br /&gt;
| [[AMSpiriT|AMSpiriT]]&lt;br /&gt;
| 0.704b&lt;br /&gt;
| Oct 20, 2022&lt;br /&gt;
| [[CPC old generation|CPC range]]&lt;br /&gt;
| Freeware&lt;br /&gt;
| [https://forum.system-cfg.com/viewtopic.php?f=24&amp;amp;t=11535]&lt;br /&gt;
|-&lt;br /&gt;
| [[Arnimedes|Arnimedes]] &lt;br /&gt;
| 1.02&lt;br /&gt;
| Jul 7, 2012&lt;br /&gt;
| [[CPC old generation|CPC range]]&lt;br /&gt;
| Freeware&lt;br /&gt;
| [http://www.arnimedes.de/]&lt;br /&gt;
|-&lt;br /&gt;
| [[Arnold_(Emulator)|Arnold]] &lt;br /&gt;
| [http://www.cpcwiki.eu/imgs/d/dd/Arnoldwip_src.tar.bz2 WIP]&lt;br /&gt;
| May 13, 2017&lt;br /&gt;
| [[CPC old generation|CPC range]], [[Plus|Plus range]], [[KC Compact]], [[Aleste 520EX]]&lt;br /&gt;
| Open source&lt;br /&gt;
| [http://www.cpcwiki.eu/forum/emulators/arnold-wip/msg144749/#msg144749] [https://www.cpcwiki.eu/forum/emulators/another-version-of-arnold-emulator/ Aeliss fork]&lt;br /&gt;
|-&lt;br /&gt;
| [[CaPriCe|CaPriCe]] &lt;br /&gt;
| 4.2.0&lt;br /&gt;
| May 14, 2005&lt;br /&gt;
| [[CPC old generation|CPC range]]&lt;br /&gt;
| Open source&lt;br /&gt;
| [http://sourceforge.net/projects/caprice32/]&lt;br /&gt;
|-&lt;br /&gt;
| [[CaPriCe|CaPriCe 32]] &lt;br /&gt;
| 4.5.0&lt;br /&gt;
| Dec 27, 2018&lt;br /&gt;
| [[CPC old generation|CPC range]], [[Plus|Plus range]]&lt;br /&gt;
| Donationware &amp;amp; Open source&lt;br /&gt;
| [https://github.com/ColinPitrat/caprice32]&lt;br /&gt;
|-&lt;br /&gt;
| [[Caprice Forever]] &lt;br /&gt;
| 20.10&lt;br /&gt;
| Jul 14, 2020&lt;br /&gt;
| [[CPC old generation|CPC range]]&lt;br /&gt;
| Freeware&lt;br /&gt;
| [http://www.cpc-power.com/cpcarchives/index.php?page=articles&amp;amp;num=73]&lt;br /&gt;
|-&lt;br /&gt;
| [[Caprice Reloaded]]&lt;br /&gt;
| r533&lt;br /&gt;
| Sep 25, 2011&lt;br /&gt;
| [[CPC old generation|CPC range]]&lt;br /&gt;
| Open source&lt;br /&gt;
| [http://code.google.com/p/cpcsdk/]&lt;br /&gt;
|-&lt;br /&gt;
| [[Caprice32-Aleste|Caprice32-Aleste]] &lt;br /&gt;
| 4.1.0&lt;br /&gt;
| Nov 14, 2007&lt;br /&gt;
| [[Aleste 520EX|Aleste 520EX]]&lt;br /&gt;
| Open source&lt;br /&gt;
| [http://aleste520.narod.ru/caprice.html]&lt;br /&gt;
|-&lt;br /&gt;
| [[CoPaCabana|CoPaCabana]]&lt;br /&gt;
| 0.74&lt;br /&gt;
| Apr 12, 2006&lt;br /&gt;
| [[CPC old generation|CPC range]]&lt;br /&gt;
| Freeware&lt;br /&gt;
| [http://copacabana.emuunlim.com/]&lt;br /&gt;
|-&lt;br /&gt;
| [[CPC-em|CPC-em]] &lt;br /&gt;
| 0.4&lt;br /&gt;
| Jul 7, 2004&lt;br /&gt;
| [[CPC old generation|CPC range]]&lt;br /&gt;
| Open source&lt;br /&gt;
| [http://cpc-em.emuunlim.com/]&lt;br /&gt;
|-&lt;br /&gt;
| [[CPC++|CPC++]] &lt;br /&gt;
| b700&lt;br /&gt;
| Mar 26, 2014&lt;br /&gt;
| [[CPC old generation|CPC range]]&lt;br /&gt;
| Freeware&lt;br /&gt;
| [http://cpcrulez.fr/emulateurs_download-WIN-CPC_plus_plus.htm]&lt;br /&gt;
|-&lt;br /&gt;
| [[CPC3D/CPC32]] &lt;br /&gt;
| 0.3&lt;br /&gt;
| Feb 8, 2003&lt;br /&gt;
| [[CPC old generation|CPC range]]&lt;br /&gt;
| Freeware&lt;br /&gt;
| [http://www.angelfire.com/retro2/cpc3d/]&lt;br /&gt;
|-&lt;br /&gt;
| [[CPCE|CPCE]] &lt;br /&gt;
| 1.94&lt;br /&gt;
| Jun 2, 2011&lt;br /&gt;
| [[CPC old generation|CPC range]]&lt;br /&gt;
| Freeware&lt;br /&gt;
| [http://cngsoft.no-ip.org/cpce/]&lt;br /&gt;
|-&lt;br /&gt;
| [[CPCEC|CPCEC]] &lt;br /&gt;
| 20200622&lt;br /&gt;
| Jun 6, 2020&lt;br /&gt;
| [[CPC old generation|CPC range]], [[Plus|Plus range]]&lt;br /&gt;
| Open source&lt;br /&gt;
| [http://cngsoft.no-ip.org/cpcec.htm]&lt;br /&gt;
|-&lt;br /&gt;
| [[CPCemu|CPCemu]] &lt;br /&gt;
| 2.0&lt;br /&gt;
| Jan 7, 2021&lt;br /&gt;
| [[CPC old generation|CPC range]]&lt;br /&gt;
| Freeware&lt;br /&gt;
| [http://www.cpc-emu.org/]&lt;br /&gt;
|-&lt;br /&gt;
| [[CPCEmuPower|CPCEmuPower]] &lt;br /&gt;
| 2005&lt;br /&gt;
| May 31, 2020&lt;br /&gt;
| [[CPC old generation|CPC range]], [[Plus|Plus range]]&lt;br /&gt;
| Freeware&lt;br /&gt;
| [https://www.cpcwiki.eu/forum/emulators/cpcepower-v2005/]&lt;br /&gt;
|-&lt;br /&gt;
| [[CPCSharp|CPCSharp]] &lt;br /&gt;
| 1.0.0-beta1&lt;br /&gt;
| Apr 7, 2021&lt;br /&gt;
| [[CPC old generation|CPC range]]&lt;br /&gt;
| Open source&lt;br /&gt;
| [https://github.com/dolbz/CPCSharp/releases/]&lt;br /&gt;
|-&lt;br /&gt;
| [[CPCwin|CPCwin]] &lt;br /&gt;
| 1.0&lt;br /&gt;
| Dec 4, 1997&lt;br /&gt;
| [[CPC old generation|CPC range]]&lt;br /&gt;
| Freeware&lt;br /&gt;
| [ftp://ftp.lip6.fr/pub/amstrad/emulator/CPCWIN10.ZIP]&lt;br /&gt;
|-&lt;br /&gt;
| [[CPE|CPE]]&lt;br /&gt;
| 5.2&lt;br /&gt;
| Apr 21, 1997&lt;br /&gt;
| [[CPC old generation|CPC range]]&lt;br /&gt;
| Freeware&lt;br /&gt;
| [ftp://ftp.lip6.fr/pub/amstrad/emulator/CPE52.ZIP]&lt;br /&gt;
|-&lt;br /&gt;
| [[CPvC|CPvC]]&lt;br /&gt;
| &lt;br /&gt;
| Oct 7, 2020&lt;br /&gt;
| [[CPC old generation|CPC range]]&lt;br /&gt;
| Open source&lt;br /&gt;
| [https://github.com/alybaek2/cpvc]&lt;br /&gt;
|-&lt;br /&gt;
| [[DSP|DSP]]&lt;br /&gt;
| 0.18&lt;br /&gt;
| Dec 31, 2017&lt;br /&gt;
| [[CPC old generation|CPC range]], [[ZX Spectrum]], [[Game Boy]], [[Nintendo NES]], [[Sega Master System]], [[ColecoVision]], [[Arcade]]&lt;br /&gt;
| Open source&lt;br /&gt;
| [https://github.com/leniad/dsp-emulator/]&lt;br /&gt;
|-&lt;br /&gt;
| [[ep128emu|ep128emu]]&lt;br /&gt;
| 2.0.11&lt;br /&gt;
| Jan 20, 2017&lt;br /&gt;
| [[CPC old generation|CPC range]], [[ZX Spectrum]], [[Enterprise]]&lt;br /&gt;
| Donationware &amp;amp; Open source&lt;br /&gt;
| [http://sourceforge.net/projects/ep128emu/]&lt;br /&gt;
|-&lt;br /&gt;
| [[MESS|MAME]]&lt;br /&gt;
| 0.201&lt;br /&gt;
| Aug 30, 2018&lt;br /&gt;
| [[CPC old generation|CPC range]], [[Plus|Plus range]], [[KC Compact]], [[Aleste 520EX]] &amp;amp; lots of other computer systems&lt;br /&gt;
| Open source&lt;br /&gt;
| [http://mamedev.org/release.html]&lt;br /&gt;
|-&lt;br /&gt;
| [[MTMW|MTMW]]&lt;br /&gt;
| 1.30B&lt;br /&gt;
| Jan 11, 2000&lt;br /&gt;
| [[CPC old generation|CPC range]], [[Plus|Plus range]], [[ZX Spectrum]], [[ZX80/81]], [[Jupiter ACE]], [[Enterprise]]&lt;br /&gt;
| Freeware&lt;br /&gt;
| [ftp://ftp.lip6.fr/pub/amstrad/emulator/MTMW130B.ZIP]&lt;br /&gt;
|-&lt;br /&gt;
| [[NO$CPC|NO$CPC]]&lt;br /&gt;
| 1.8&lt;br /&gt;
| Nov 2, 2000&lt;br /&gt;
| [[CPC old generation|CPC range]], [[Plus|Plus range]]&lt;br /&gt;
| Freeware&lt;br /&gt;
| [http://problemkaputt.de/cpc.htm]&lt;br /&gt;
|-&lt;br /&gt;
| [[PC-CPC|PC-CPC]] &lt;br /&gt;
| 0.1at b29&lt;br /&gt;
| Nov 17, 2011&lt;br /&gt;
| [[CPC old generation|CPC range]]&lt;br /&gt;
| Freeware&lt;br /&gt;
| [http://cpcrulez.fr/emulateurs_download-WIN-PC-CPC.htm]&lt;br /&gt;
|-&lt;br /&gt;
| [[Retro Virtual Machine|Retro Virtual Machine]]&lt;br /&gt;
| 2.0 BETA-1 R7&lt;br /&gt;
| Jul 10, 2019&lt;br /&gt;
| [[CPC old generation|CPC range]], [[ZX Spectrum]]&lt;br /&gt;
| Donationware&lt;br /&gt;
| [https://www.retrovirtualmachine.org]&lt;br /&gt;
|-&lt;br /&gt;
| [[Roland Emulator|Roland]] &lt;br /&gt;
| 0.70&lt;br /&gt;
| Apr 20, 2017&lt;br /&gt;
| [[CPC old generation|CPC range]]&lt;br /&gt;
| Open source&lt;br /&gt;
| [https://www.rolandemu.de/en/downloads.html]/[https://github.com/raldus/roland GitHub]&lt;br /&gt;
|-&lt;br /&gt;
| [[SugarBox|SugarBox]]&lt;br /&gt;
| 0.29&lt;br /&gt;
| Jan 22, 2018&lt;br /&gt;
| [[CPC old generation|CPC range]], [[Plus|Plus range]]&lt;br /&gt;
| Open-Source&lt;br /&gt;
| [http://sugarbox.free.fr/] [https://github.com/Tom1975/SugarboxV2]&lt;br /&gt;
|-&lt;br /&gt;
| [[vbCPC|vbCPC]] &lt;br /&gt;
| 1.06&lt;br /&gt;
| Apr 7, 2005&lt;br /&gt;
| [[CPC old generation|CPC range]]&lt;br /&gt;
| Freeware&lt;br /&gt;
| [http://www.emu-france.com/news/9609-ordi-vbcpc-v1-0-6/]&lt;br /&gt;
|-&lt;br /&gt;
| [[VirtualCPC|Virtual CPC]] &lt;br /&gt;
| 1.1&lt;br /&gt;
| Aug 8, 2011&lt;br /&gt;
| [[CPC old generation|CPC range]]&lt;br /&gt;
| Freeware&lt;br /&gt;
| [http://users.otenet.gr/~sulfonic/cpc/]&lt;br /&gt;
|-&lt;br /&gt;
| [[WinApe|WinAPE]] &lt;br /&gt;
| 2.0b2&lt;br /&gt;
| Jan 5, 2016&lt;br /&gt;
| [[CPC old generation|CPC range]], [[Plus|Plus range]]&lt;br /&gt;
| Donationware&lt;br /&gt;
| [http://www.winape.net/]&lt;br /&gt;
|-&lt;br /&gt;
| [[WinCPC|WinCPC]] &lt;br /&gt;
| 0.9.26&lt;br /&gt;
| Feb 1, 2007&lt;br /&gt;
| [[CPC old generation|CPC range]]&lt;br /&gt;
| Freeware&lt;br /&gt;
| [http://www.wincpc.ch/index.php?topic=projects-wincpc]&lt;br /&gt;
|-&lt;br /&gt;
| [[XNACPC|XNACPC]]&lt;br /&gt;
| 1.0&lt;br /&gt;
| Nov 11, 2011&lt;br /&gt;
| [[CPC old generation|CPC range]]&lt;br /&gt;
| Open source&lt;br /&gt;
| [http://www.gavpugh.com/2011/11/11/xnacpc-xbox-360-amstrad-cpc-emulator-released/]&lt;br /&gt;
|-&lt;br /&gt;
| [[Yage|Yage]]&lt;br /&gt;
| 0.91&lt;br /&gt;
| Oct 24, 1998&lt;br /&gt;
| [[CPC old generation|CPC range]]&lt;br /&gt;
| Freeware&lt;br /&gt;
| [ftp://ftp.lip6.fr/pub/amstrad/emulator/YAGE091.ZIP]&lt;br /&gt;
|-&lt;br /&gt;
| [[ZEsarUX|ZEsarUX]]&lt;br /&gt;
| 9.0&lt;br /&gt;
| Aug 19, 2020&lt;br /&gt;
| [[CPC old generation|CPC range]], [[ZX Spectrum]], [[ZX80/81]], [[Jupiter ACE]], [[Sam Coupe]], [[Sinclair QL]], [[MSX 1]], [[ColecoVision]], [[SG-1000]]&lt;br /&gt;
| Donationware &amp;amp; Open source&lt;br /&gt;
| [https://github.com/chernandezba/zesarux]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Emulation Core ==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable sortable&amp;quot; style=&amp;quot;width:100%&amp;quot;&lt;br /&gt;
! Name&lt;br /&gt;
! Actual version&lt;br /&gt;
! Last release&lt;br /&gt;
! Emulated systems&lt;br /&gt;
! License&lt;br /&gt;
! Link&lt;br /&gt;
|-&lt;br /&gt;
| libretro-cap32 (for RetroArch)&lt;br /&gt;
| 1.2.2&lt;br /&gt;
| Jul 19, 2015&lt;br /&gt;
| [[CPC old generation|CPC range]]&lt;br /&gt;
| Open source&lt;br /&gt;
| [https://github.com/libretro/libretro-cap32]&lt;br /&gt;
|-&lt;br /&gt;
| libretro-crocods (for RetroArch)&lt;br /&gt;
| 0.1&lt;br /&gt;
| Feb 28, 2017&lt;br /&gt;
| [[CPC old generation|CPC range]]&lt;br /&gt;
| Open source&lt;br /&gt;
| [https://github.com/libretro/libretro-crocods]&lt;br /&gt;
|-&lt;br /&gt;
| SugarLibRetro (for RetroArch)&lt;br /&gt;
| git&lt;br /&gt;
| -&lt;br /&gt;
| [[CPC old generation|CPC range]]&lt;br /&gt;
| Open source&lt;br /&gt;
| [https://github.com/Tom1975/SugarLibRetro] (wraps independent lib https://github.com/Tom1975/CPCCore)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
= Home Consoles =&lt;br /&gt;
&lt;br /&gt;
== Microsoft XBOX  ==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable sortable&amp;quot; style=&amp;quot;width:100%&amp;quot;&lt;br /&gt;
! Name&lt;br /&gt;
! Actual version&lt;br /&gt;
! Last release&lt;br /&gt;
! Emulated systems&lt;br /&gt;
! License&lt;br /&gt;
! Link&lt;br /&gt;
|-&lt;br /&gt;
| [[Arnold|ArnoldX]]&lt;br /&gt;
| v5&lt;br /&gt;
| Apr 20, 2010&lt;br /&gt;
| [[CPC old generation|CPC range]], [[Plus|Plus range]]&lt;br /&gt;
| &lt;br /&gt;
| [http://forums.xbox-scene.com/index.php?showtopic=711667]&lt;br /&gt;
|-&lt;br /&gt;
| [[CoinOPS|CoinOPS]]&lt;br /&gt;
| 5&lt;br /&gt;
| Oct 18, 2012&lt;br /&gt;
| [[CPC old generation|CPC range]] &amp;amp; lots of other computer systems&lt;br /&gt;
| &lt;br /&gt;
| [http://coinopsproject.freeforums.org/viewtopic.php?f=0&amp;amp;t=1213]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Microsoft Xbox 360  ==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable sortable&amp;quot; style=&amp;quot;width:100%&amp;quot;&lt;br /&gt;
! Name&lt;br /&gt;
! Actual version&lt;br /&gt;
! Last release&lt;br /&gt;
! Emulated systems&lt;br /&gt;
! License&lt;br /&gt;
! Link&lt;br /&gt;
|-&lt;br /&gt;
| [[XNACPC|XNACPC]]&lt;br /&gt;
| 1.0&lt;br /&gt;
| Nov 11, 2011&lt;br /&gt;
| [[CPC old generation|CPC range]]&lt;br /&gt;
| Open source&lt;br /&gt;
| [http://www.gavpugh.com/2011/11/11/xnacpc-xbox-360-amstrad-cpc-emulator-released/]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Nintendo Wii ==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable sortable&amp;quot; style=&amp;quot;width:100%&amp;quot;&lt;br /&gt;
! Name&lt;br /&gt;
! Actual version&lt;br /&gt;
! Last release&lt;br /&gt;
! Emulated systems&lt;br /&gt;
! License&lt;br /&gt;
! Link&lt;br /&gt;
|-&lt;br /&gt;
| [[Wiituka|Wiituka]]&lt;br /&gt;
| 0.98.8&lt;br /&gt;
| May 15, 2009&lt;br /&gt;
| [[CPC old generation|CPC range]]&lt;br /&gt;
| Open source&lt;br /&gt;
| [http://wiituka.dantoine.org/]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Sega Dreamcast  ==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable sortable&amp;quot; style=&amp;quot;width:100%&amp;quot;&lt;br /&gt;
! Name&lt;br /&gt;
! Actual version&lt;br /&gt;
! Last release&lt;br /&gt;
! Emulated systems&lt;br /&gt;
! License&lt;br /&gt;
! Link&lt;br /&gt;
|-&lt;br /&gt;
| [[CPCast|CPCast]]&lt;br /&gt;
| &lt;br /&gt;
| May 6, 2006&lt;br /&gt;
| [[CPC old generation|CPC range]]&lt;br /&gt;
| Freeware&lt;br /&gt;
| [http://www.dcemu.co.uk/vbulletin/showthread.php?t=24100]&lt;br /&gt;
|-&lt;br /&gt;
| [[DreamCPC|DreamCPC]]&lt;br /&gt;
| Alpha 3&lt;br /&gt;
| Oct 16, 2005&lt;br /&gt;
| [[CPC old generation|CPC range]]&lt;br /&gt;
| Freeware&lt;br /&gt;
| [http://jm1200.free.fr/index.php?r=2]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Sony PS2 ==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable sortable&amp;quot; style=&amp;quot;width:100%&amp;quot;&lt;br /&gt;
! Name&lt;br /&gt;
! Actual version&lt;br /&gt;
! Last release&lt;br /&gt;
! Emulated systems&lt;br /&gt;
! License&lt;br /&gt;
! Link&lt;br /&gt;
|-&lt;br /&gt;
| [[PCPC|PCPC]]&lt;br /&gt;
| &lt;br /&gt;
| Dec 22, 2004&lt;br /&gt;
| [[CPC old generation|CPC range]]&lt;br /&gt;
| Open source&lt;br /&gt;
| [http://ps2emu.dcemu.co.uk/pcpc.shtml]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Sony PS3 ==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable sortable&amp;quot; style=&amp;quot;width:100%&amp;quot;&lt;br /&gt;
! Name&lt;br /&gt;
! Actual version&lt;br /&gt;
! Last release&lt;br /&gt;
! Emulated systems&lt;br /&gt;
! License&lt;br /&gt;
! Link&lt;br /&gt;
|-&lt;br /&gt;
| [[Caprice32|Caprice32]]&lt;br /&gt;
| 4.1.0 DBG&lt;br /&gt;
| Apr 9, 2012&lt;br /&gt;
| [[CPC old generation|CPC range]]&lt;br /&gt;
| Open source&lt;br /&gt;
| [http://psx-scene.com/forums/content/caprice32-4-1-0-dbg-emulator-ps3-2119/]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
= Handheld Consoles  =&lt;br /&gt;
&lt;br /&gt;
== Dingoo A320 / A330 ==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable sortable&amp;quot; style=&amp;quot;width:100%&amp;quot;&lt;br /&gt;
! Name&lt;br /&gt;
! Actual version&lt;br /&gt;
! Last release&lt;br /&gt;
! Emulated systems&lt;br /&gt;
! License&lt;br /&gt;
! Link&lt;br /&gt;
|-&lt;br /&gt;
| [[Pituka|Pituka (Dingux)]]&lt;br /&gt;
| 0.8pre&lt;br /&gt;
| Aug 19, 2010&lt;br /&gt;
| [[CPC old generation|CPC range]]&lt;br /&gt;
| Open source&lt;br /&gt;
| [http://david.dantoine.org/proyecto/4/]&lt;br /&gt;
|-&lt;br /&gt;
| [[Caprice|Dingux-CAP32]]&lt;br /&gt;
| 1.1.2&lt;br /&gt;
| Oct 17, 2009&lt;br /&gt;
| [[CPC old generation|CPC range]]&lt;br /&gt;
| Open source&lt;br /&gt;
| [http://zx81.zx81.free.fr/serendipity/index.php?/categories/105-Amstrad/]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== GamePark GP32 / GP2X / Wiz / Caanoo ==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable sortable&amp;quot; style=&amp;quot;width:100%&amp;quot;&lt;br /&gt;
! Name&lt;br /&gt;
! Actual version&lt;br /&gt;
! Last release&lt;br /&gt;
! Emulated systems&lt;br /&gt;
! License&lt;br /&gt;
! Link&lt;br /&gt;
|-&lt;br /&gt;
| [[Pituka|Pituka (GP32)]]&lt;br /&gt;
| 1d&lt;br /&gt;
| May 15, 2010&lt;br /&gt;
| [[CPC old generation|CPC range]]&lt;br /&gt;
| Open source&lt;br /&gt;
| [http://david.dantoine.org/proyecto/4/]&lt;br /&gt;
|-&lt;br /&gt;
| [[Caprice|CapriceGP2x]]&lt;br /&gt;
| 0.5&lt;br /&gt;
| Feb 22, 2006&lt;br /&gt;
| [[CPC old generation|CPC range]]&lt;br /&gt;
| Open source&lt;br /&gt;
| [http://wiki.gp2x.org/wiki/CapriceGP2x]&lt;br /&gt;
|-&lt;br /&gt;
| [[Caprice|GP2X-CAP32]]&lt;br /&gt;
| 1.5.1&lt;br /&gt;
| Aug 29, 2009&lt;br /&gt;
| [[CPC old generation|CPC range]]&lt;br /&gt;
| Open source&lt;br /&gt;
| [http://zx81.zx81.free.fr/serendipity/index.php?/categories/42-Amstrad/]&lt;br /&gt;
|-&lt;br /&gt;
| [[Caprice|Wiz-CAP32]]&lt;br /&gt;
| 1.1.0&lt;br /&gt;
| Aug 29, 2009&lt;br /&gt;
| [[CPC old generation|CPC range]]&lt;br /&gt;
| Open source&lt;br /&gt;
| [http://zx81.zx81.free.fr/serendipity/index.php?/categories/89-Amstrad/]&lt;br /&gt;
|-&lt;br /&gt;
| [[Caprice|Caanoo-CAP32]]&lt;br /&gt;
| 1.1.3&lt;br /&gt;
| Apr 24, 2011&lt;br /&gt;
| [[CPC old generation|CPC range]]&lt;br /&gt;
| Open source&lt;br /&gt;
| [http://zx81.zx81.free.fr/serendipity/index.php?/categories/165-Amstrad/]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== GCW Zero ==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable sortable&amp;quot; style=&amp;quot;width:100%&amp;quot;&lt;br /&gt;
! Name&lt;br /&gt;
! Actual version&lt;br /&gt;
! Last release&lt;br /&gt;
! Emulated systems&lt;br /&gt;
! License&lt;br /&gt;
! Link&lt;br /&gt;
|-&lt;br /&gt;
| [[Caprice|Dingux-CAP32]]&lt;br /&gt;
| 1.1.2&lt;br /&gt;
| May 25, 2014&lt;br /&gt;
| [[CPC old generation|CPC range]]&lt;br /&gt;
| Open source&lt;br /&gt;
| [http://boards.dingoonity.org/gcw-releases/caprice32-%28amstrad-cpc%29/]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== JXD S5110 / S601 &amp;amp; Yinlips G18 ==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable sortable&amp;quot; style=&amp;quot;width:100%&amp;quot;&lt;br /&gt;
! Name&lt;br /&gt;
! Actual version&lt;br /&gt;
! Last release&lt;br /&gt;
! Emulated systems&lt;br /&gt;
! License&lt;br /&gt;
! Link&lt;br /&gt;
|-&lt;br /&gt;
| [[Caprice|JXD-CAP32]]&lt;br /&gt;
| 1.1.1&lt;br /&gt;
| Oct 27, 2012&lt;br /&gt;
| [[CPC old generation|CPC range]]&lt;br /&gt;
| Open source&lt;br /&gt;
| [http://zx81.zx81.free.fr/serendipity/index.php?/categories/206-Amstrad/]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Nintendo DS  ==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable sortable&amp;quot; style=&amp;quot;width:100%&amp;quot;&lt;br /&gt;
! Name&lt;br /&gt;
! Actual version&lt;br /&gt;
! Last release&lt;br /&gt;
! Emulated systems&lt;br /&gt;
! License&lt;br /&gt;
! Link&lt;br /&gt;
|-&lt;br /&gt;
| [[AmeDS|AmeDS]] &lt;br /&gt;
| 4.0&lt;br /&gt;
| Apr 25, 2010&lt;br /&gt;
| [[CPC old generation|CPC range]]&lt;br /&gt;
| Freeware&lt;br /&gt;
| [http://www.portabledev.com/pages/ds/jeuxdev.-perso/ameds.php]&lt;br /&gt;
|-&lt;br /&gt;
| [[CrocoDS|CrocoDS]]&lt;br /&gt;
| 2.0&lt;br /&gt;
| Nov 9, 2007&lt;br /&gt;
| [[CPC old generation|CPC range]]&lt;br /&gt;
| Freeware&lt;br /&gt;
| [http://www.kyuran.be/blog/2007/11/09/crocods-20-2/]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Odroid GO  ==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable sortable&amp;quot; style=&amp;quot;width:100%&amp;quot;&lt;br /&gt;
! Name&lt;br /&gt;
! Actual version&lt;br /&gt;
! Last release&lt;br /&gt;
! Emulated systems&lt;br /&gt;
! License&lt;br /&gt;
! Link&lt;br /&gt;
|-&lt;br /&gt;
| [[CapriceESP32|CapriceESP32]] &lt;br /&gt;
| &lt;br /&gt;
| Dec 3, 2020&lt;br /&gt;
| [[CPC old generation|CPC range]]&lt;br /&gt;
| Open source&lt;br /&gt;
| [https://github.com/grantrismo/CapriceESP32]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Pandora ==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable sortable&amp;quot; style=&amp;quot;width:100%&amp;quot;&lt;br /&gt;
! Name&lt;br /&gt;
! Actual version&lt;br /&gt;
! Last release&lt;br /&gt;
! Emulated systems&lt;br /&gt;
! License&lt;br /&gt;
! Link&lt;br /&gt;
|-&lt;br /&gt;
| [[Caprice|Pandora-CAP32]]&lt;br /&gt;
| 1.1.0&lt;br /&gt;
| Jun 27, 2010&lt;br /&gt;
| [[CPC old generation|CPC range]]&lt;br /&gt;
| Open source&lt;br /&gt;
| [http://zx81.zx81.free.fr/serendipity/index.php?/categories/131-Amstrad/]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Sony PSP  ==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable sortable&amp;quot; style=&amp;quot;width:100%&amp;quot;&lt;br /&gt;
! Name&lt;br /&gt;
! Actual version&lt;br /&gt;
! Last release&lt;br /&gt;
! Emulated systems&lt;br /&gt;
! License&lt;br /&gt;
! Link&lt;br /&gt;
|-&lt;br /&gt;
| [[Caprice32 PSP]]&lt;br /&gt;
| 4.2.0.2&lt;br /&gt;
| Nov 28, 2007&lt;br /&gt;
| [[CPC old generation|CPC range]]&lt;br /&gt;
| Open source&lt;br /&gt;
| [http://psp.akop.org/caprice32]&lt;br /&gt;
|-&lt;br /&gt;
| [[CPCPSP|CPCPSP]]&lt;br /&gt;
| 0.1&lt;br /&gt;
| Dec 24, 2005&lt;br /&gt;
| [[CPC old generation|CPC range]]&lt;br /&gt;
| Freeware&lt;br /&gt;
| [http://dl.qj.net/psp/emulators/cpcpsp-v01.html]&lt;br /&gt;
|-&lt;br /&gt;
| [[PSPCAP32|PSPCAP32]]&lt;br /&gt;
| 1.5.1&lt;br /&gt;
| Aug 21, 2009&lt;br /&gt;
| [[CPC old generation|CPC range]]&lt;br /&gt;
| Open source&lt;br /&gt;
| [http://zx81.zx81.free.fr/serendipity/index.php?/categories/3-Amstrad/]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
= Smartphones / PDA / SoC =&lt;br /&gt;
&lt;br /&gt;
== Android  ==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable sortable&amp;quot; style=&amp;quot;width:100%&amp;quot;&lt;br /&gt;
! Name&lt;br /&gt;
! Actual version&lt;br /&gt;
! Last release&lt;br /&gt;
! Emulated systems&lt;br /&gt;
! License&lt;br /&gt;
! Link&lt;br /&gt;
|-&lt;br /&gt;
| [[andcpc]]&lt;br /&gt;
| 1.5.1&lt;br /&gt;
| Apr 4, 2011&lt;br /&gt;
| [[CPC old generation|CPC range]]&lt;br /&gt;
| Open source&lt;br /&gt;
| [http://code.google.com/p/andcpc/]&lt;br /&gt;
|-&lt;br /&gt;
| [[CPCDroid]]&lt;br /&gt;
| 1.5.1&lt;br /&gt;
| Mar 2, 2011&lt;br /&gt;
| [[CPC old generation|CPC range]]&lt;br /&gt;
| Open source&lt;br /&gt;
| [http://fmsdevel.wisecoding.es/blog/cpcdroid---2011-03-02]&lt;br /&gt;
|-&lt;br /&gt;
| [[CPCemu|CPCemu]] &lt;br /&gt;
| 2.0&lt;br /&gt;
| Jan 7, 2021&lt;br /&gt;
| [[CPC old generation|CPC range]]&lt;br /&gt;
| Freeware&lt;br /&gt;
| [http://www.cpc-emu.org/]&lt;br /&gt;
|-&lt;br /&gt;
| [[Droid-CPC]]&lt;br /&gt;
| 1.1.01&lt;br /&gt;
| Dec 15, 2016&lt;br /&gt;
| [[CPC old generation|CPC range]]&lt;br /&gt;
| Commercial&lt;br /&gt;
| [http://play.google.com/store/apps/details?id=com.kokak.droidcpc]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== BlackBerry  ==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable sortable&amp;quot; style=&amp;quot;width:100%&amp;quot;&lt;br /&gt;
! Name&lt;br /&gt;
! Actual version&lt;br /&gt;
! Last release&lt;br /&gt;
! Emulated systems&lt;br /&gt;
! License&lt;br /&gt;
! Link&lt;br /&gt;
|-&lt;br /&gt;
| [[BB-CPC|BB-CPC]]&lt;br /&gt;
| 1.0.1.3&lt;br /&gt;
| Jul 15, 2013&lt;br /&gt;
| [[CPC old generation|CPC range]]&lt;br /&gt;
| Commercial&lt;br /&gt;
| [http://appworld.blackberry.com/webstore/content/30963891/]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== iOS  ==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable sortable&amp;quot; style=&amp;quot;width:100%&amp;quot;&lt;br /&gt;
! Name&lt;br /&gt;
! Actual version&lt;br /&gt;
! Last release&lt;br /&gt;
! Emulated systems&lt;br /&gt;
! License&lt;br /&gt;
! Link&lt;br /&gt;
|-&lt;br /&gt;
| [[CrocoDS]]&lt;br /&gt;
| 2.1&lt;br /&gt;
| Jun 21, 2013&lt;br /&gt;
| [[CPC old generation|CPC range]]&lt;br /&gt;
| Open source&lt;br /&gt;
| [http://github.com/redbug26/crocods]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Maemo  ==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable sortable&amp;quot; style=&amp;quot;width:100%&amp;quot;&lt;br /&gt;
! Name&lt;br /&gt;
! Actual version&lt;br /&gt;
! Last release&lt;br /&gt;
! Emulated systems&lt;br /&gt;
! License&lt;br /&gt;
! Link&lt;br /&gt;
|-&lt;br /&gt;
| [[CPCm]]&lt;br /&gt;
| 1.20-1&lt;br /&gt;
| Apr 27, 2010&lt;br /&gt;
| [[CPC old generation|CPC range]]&lt;br /&gt;
| Open source&lt;br /&gt;
| [http://maemo.org/downloads/product/Maemo5/cpcm/]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Palm OS  ==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable sortable&amp;quot; style=&amp;quot;width:100%&amp;quot;&lt;br /&gt;
! Name&lt;br /&gt;
! Actual version&lt;br /&gt;
! Last release&lt;br /&gt;
! Emulated systems&lt;br /&gt;
! License&lt;br /&gt;
! Link&lt;br /&gt;
|-&lt;br /&gt;
| [[CaPriCe for Palm OS|CaPriCe for Palm OS]]&lt;br /&gt;
| 2.8&lt;br /&gt;
| Jun 28, 2011&lt;br /&gt;
| [[CPC old generation|CPC range]]&lt;br /&gt;
| Open source&lt;br /&gt;
| [http://frederic.coste.pagesperso-orange.fr/cpc/cpc_en.htm]&lt;br /&gt;
|-&lt;br /&gt;
| [[CoPaCabana|CoPaCabana]]&lt;br /&gt;
| 0.75&lt;br /&gt;
| Dec 4, 2007&lt;br /&gt;
| [[CPC old generation|CPC range]]&lt;br /&gt;
| Freeware&lt;br /&gt;
| [http://copacabana.emuunlim.com/]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Pocket PC  ==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable sortable&amp;quot; style=&amp;quot;width:100%&amp;quot;&lt;br /&gt;
! Name&lt;br /&gt;
! Actual version&lt;br /&gt;
! Last release&lt;br /&gt;
! Emulated systems&lt;br /&gt;
! License&lt;br /&gt;
! Link&lt;br /&gt;
|-&lt;br /&gt;
| [[CaPriCe|PocketCaprice]]&lt;br /&gt;
| 0.9&lt;br /&gt;
| Aug 19, 2007&lt;br /&gt;
| [[CPC old generation|CPC range]]&lt;br /&gt;
| Freeware&lt;br /&gt;
| [http://www.clubic.com/telecharger-fiche44888-pocketcaprice.html]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Raspberry Pi ==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable sortable&amp;quot; style=&amp;quot;width:100%&amp;quot;&lt;br /&gt;
! Name&lt;br /&gt;
! Actual version&lt;br /&gt;
! Last release&lt;br /&gt;
! Emulated systems&lt;br /&gt;
! License&lt;br /&gt;
! Link&lt;br /&gt;
|-&lt;br /&gt;
| [[CPC4Rpi|#CPC4Rpi]]&lt;br /&gt;
| 1.1&lt;br /&gt;
| Dec 19, 2013&lt;br /&gt;
| [[CPC old generation|CPC range]]&lt;br /&gt;
| Open source&lt;br /&gt;
| [https://www.raspberrypi.org/forums/viewtopic.php?f=78&amp;amp;t=63820]&lt;br /&gt;
|-&lt;br /&gt;
| [[CapriceRPI|CapriceRPI]]&lt;br /&gt;
| 1.3&lt;br /&gt;
| Feb 28, 2016&lt;br /&gt;
| [[CPC old generation|CPC range]]&lt;br /&gt;
| Open source&lt;br /&gt;
| [https://github.com/KaosOverride/CapriceRPI]&lt;br /&gt;
|-&lt;br /&gt;
| [[ZEsarUX|ZEsarUX]]&lt;br /&gt;
| 9.0&lt;br /&gt;
| Aug 19, 2020&lt;br /&gt;
| [[CPC old generation|CPC range]], [[ZX Spectrum]], [[ZX80/81]], [[Jupiter ACE]], [[Sam Coupe]], [[Sinclair QL]], [[MSX 1]], [[ColecoVision]], [[SG-1000]]&lt;br /&gt;
| Open source&lt;br /&gt;
| [https://github.com/chernandezba/zesarux]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Symbian  ==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable sortable&amp;quot; style=&amp;quot;width:100%&amp;quot;&lt;br /&gt;
! Name&lt;br /&gt;
! Actual version&lt;br /&gt;
! Last release&lt;br /&gt;
! Emulated systems&lt;br /&gt;
! License&lt;br /&gt;
! Link&lt;br /&gt;
|-&lt;br /&gt;
| [[S60-CPC|S60-CPC]]&lt;br /&gt;
| 0.74&lt;br /&gt;
| Feb 21, 2006&lt;br /&gt;
| [[CPC old generation|CPC range]]&lt;br /&gt;
| Open source&lt;br /&gt;
| [http://kokak.free.fr/s60cpc.htm]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
= Hardware =&lt;br /&gt;
&lt;br /&gt;
*[[CPC TREX|CPC TREX]] TurboCPC core running on a terasIC T-Rex C1 FPGA board&lt;br /&gt;
*[[C-ONE|CPC-ONE]] TurboCPC core running on the C-One FPGA board&lt;br /&gt;
*[http://ralferoo.blogspot.fr/ CPC FPGA] CPC emulation running on a custom made FPGA board&lt;br /&gt;
*[[FPGAmstrad|FPGAmstrad]] CPC emulation running on a NEXYS2 FPGA board&lt;br /&gt;
*[http://github.com/mist-devel/mist-board/wiki MIST board] FPGA board implementing Amstrad CPC and various other 8-bit and 16-bit computers&lt;br /&gt;
&lt;br /&gt;
= Emulation Tools  =&lt;br /&gt;
&lt;br /&gt;
*[[ConvImgCPC|ConvImgCPC]] &lt;br /&gt;
*[[CPCDiskXP|CPCDiskXP]] &lt;br /&gt;
*[[CPCGamesCD-CPCLoader|CPCGamesCD-CPCLoader]] &lt;br /&gt;
*[[CPCTapeXP|CPCTapeXP]] &lt;br /&gt;
*[[CPRTools|CPRTools]] &lt;br /&gt;
*[[Dsktools|Dsktools]] &lt;br /&gt;
*[[ManageDSK|ManageDSK]] &lt;br /&gt;
*[[WriteDSK|WriteDSK]]&lt;br /&gt;
&lt;br /&gt;
= Emulator Detection =&lt;br /&gt;
&lt;br /&gt;
*[[Emulator_IDs|Emulator IDs]]&lt;br /&gt;
&lt;br /&gt;
[[Category:Emulator| ]]&lt;/div&gt;</summary>
		<author><name>Longshot</name></author>	</entry>

	<entry>
		<id>https://oldwiki.cpcwiki.eu/index.php?title=Emulators&amp;diff=109314</id>
		<title>Emulators</title>
		<link rel="alternate" type="text/html" href="https://oldwiki.cpcwiki.eu/index.php?title=Emulators&amp;diff=109314"/>
				<updated>2022-10-25T09:32:32Z</updated>
		
		<summary type="html">&lt;p&gt;Longshot: /* Windows */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Operating Systems  =&lt;br /&gt;
&lt;br /&gt;
== Acorn RISC OS  ==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable sortable&amp;quot; style=&amp;quot;width:100%&amp;quot;&lt;br /&gt;
! Name&lt;br /&gt;
! Actual version&lt;br /&gt;
! Last release&lt;br /&gt;
! Emulated systems&lt;br /&gt;
! License&lt;br /&gt;
! Link&lt;br /&gt;
|-&lt;br /&gt;
| [[!CPC|!CPC]]&lt;br /&gt;
| &lt;br /&gt;
| Jul 28, 1996&lt;br /&gt;
| [[CPC old generation|CPC range]]&lt;br /&gt;
| Freeware&lt;br /&gt;
| [ftp://ftp.lip6.fr/pub/amstrad/emulator/CPC0728.ZIP]&lt;br /&gt;
|-&lt;br /&gt;
| [[!CPCemu|!CPCemu]]&lt;br /&gt;
| 1.21&lt;br /&gt;
| Mar 22, 2016&lt;br /&gt;
| [[CPC old generation|CPC range]]&lt;br /&gt;
| Freeware&lt;br /&gt;
| [http://www.huggers-world.de/files/cpcemu121.zip]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== AmigaOS  ==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable sortable&amp;quot; style=&amp;quot;width:100%&amp;quot;&lt;br /&gt;
! Name&lt;br /&gt;
! Actual version&lt;br /&gt;
! Last release&lt;br /&gt;
! Emulated systems&lt;br /&gt;
! License&lt;br /&gt;
! Link&lt;br /&gt;
|-&lt;br /&gt;
| [[A-CPC|A-CPC]]&lt;br /&gt;
| 2.0&lt;br /&gt;
| Apr, 2002&lt;br /&gt;
| [[CPC old generation|CPC range]], [[Plus|Plus range]]&lt;br /&gt;
| Open source&lt;br /&gt;
| [http://cpctech.cpc-live.com/download/a-cpc.lha]&lt;br /&gt;
|-&lt;br /&gt;
| [[Ami-CPC|Ami-CPC]]&lt;br /&gt;
| 0.46&lt;br /&gt;
| Jan 21, 1998&lt;br /&gt;
| [[CPC old generation|CPC range]]&lt;br /&gt;
| Open source&lt;br /&gt;
| [http://deplanque.chez.com/ami-cpc.lha]&lt;br /&gt;
|-&lt;br /&gt;
| [[Arnold|Arnold]]&lt;br /&gt;
| 1.15&lt;br /&gt;
| Dec 17, 2012&lt;br /&gt;
| [[CPC old generation|CPC range]], [[Plus|Plus range]], [[KC Compact]]&lt;br /&gt;
| Open source&lt;br /&gt;
| [http://hirudov.com/amiga/Arnold.php]&lt;br /&gt;
|-&lt;br /&gt;
| [[CPE|CPE]]&lt;br /&gt;
| &lt;br /&gt;
| Feb 24, 1995&lt;br /&gt;
| [[CPC old generation|CPC range]]&lt;br /&gt;
| Open source&lt;br /&gt;
| [ftp://ftp.lip6.fr/pub/amstrad/emulator/ACPE_NEW.LHA]&lt;br /&gt;
|-&lt;br /&gt;
| [[Emu-CPC|Emu-CPC]]&lt;br /&gt;
| 0.7&lt;br /&gt;
| Sep 15, 1996&lt;br /&gt;
| [[CPC old generation|CPC range]]&lt;br /&gt;
| Freeware&lt;br /&gt;
| [ftp://ftp.lip6.fr/pub/amstrad/emulator/EMUCPC07.LZX]&lt;br /&gt;
|-&lt;br /&gt;
| [[MESS|SDLMESS]]&lt;br /&gt;
| 0.146u4&lt;br /&gt;
| Aug 19, 2012&lt;br /&gt;
| [[CPC old generation|CPC range]], [[Plus|Plus range]], [[KC Compact]], [[Aleste 520EX]] &amp;amp; lots of other computer systems&lt;br /&gt;
| Open source&lt;br /&gt;
| [http://se.os4depot.net/index.php?function=showfile&amp;amp;file=emulation/computer/sdl_mess.lha]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== AMSDOS ==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable sortable&amp;quot; style=&amp;quot;width:100%&amp;quot;&lt;br /&gt;
! Name&lt;br /&gt;
! Actual version&lt;br /&gt;
! Last release&lt;br /&gt;
! Emulated systems&lt;br /&gt;
! License&lt;br /&gt;
! Link&lt;br /&gt;
|-&lt;br /&gt;
| [[Pac-Man|Pac-Man]]&lt;br /&gt;
| 1.1&lt;br /&gt;
| Jun 5, 2014&lt;br /&gt;
| [[Pac-Man arcade|Pac-Man arcade]]&lt;br /&gt;
| Open source&lt;br /&gt;
| [http://www.cpcwiki.eu/forum/games/speed-up-patch-for-pac-man-emulator-for-cpc-by-syx-toto/msg81222/#msg81222]&lt;br /&gt;
|-&lt;br /&gt;
| [[Space Invaders|Space Invaders]]&lt;br /&gt;
| 1.0&lt;br /&gt;
| Jun 11, 2016&lt;br /&gt;
| [[Space Invaders arcade|Space Invaders arcade]]&lt;br /&gt;
| Freeware&lt;br /&gt;
| [http://www.cpcwiki.eu/forum/games/space-invaders-arcade-emulator-for-amstrad-cpc/]&lt;br /&gt;
|-&lt;br /&gt;
| [[ZXM|ZXM]]&lt;br /&gt;
| &lt;br /&gt;
| 1993&lt;br /&gt;
| [[ZX Spectrum|ZX Spectrum]]&lt;br /&gt;
| Freeware&lt;br /&gt;
| [ftp://ftp.nvg.ntnu.no/pub/cpc/misc/zxm.zip]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== DOS  ==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable sortable&amp;quot; style=&amp;quot;width:100%&amp;quot;&lt;br /&gt;
! Name&lt;br /&gt;
! Actual version&lt;br /&gt;
! Last release&lt;br /&gt;
! Emulated systems&lt;br /&gt;
! License&lt;br /&gt;
! Link&lt;br /&gt;
|-&lt;br /&gt;
| [[Arnimedes|Arnimedes]] &lt;br /&gt;
| 0.8a&lt;br /&gt;
| Apr 15, 2000&lt;br /&gt;
| [[CPC old generation|CPC range]]&lt;br /&gt;
| Freeware&lt;br /&gt;
| [http://www.arnimedes.de/]&lt;br /&gt;
|-&lt;br /&gt;
| [[CPCE|CPCE]] &lt;br /&gt;
| 1.94&lt;br /&gt;
| Jun 2, 2011&lt;br /&gt;
| [[CPC old generation|CPC range]]&lt;br /&gt;
| Freeware&lt;br /&gt;
| [http://cngsoft.no-ip.org/cpce/]&lt;br /&gt;
|-&lt;br /&gt;
| [[CPCemu|CPCemu]] &lt;br /&gt;
| 1.5&lt;br /&gt;
| Jul 7, 1998&lt;br /&gt;
| [[CPC old generation|CPC range]]&lt;br /&gt;
| Freeware&lt;br /&gt;
| [http://www.cpc-emu.org/]&lt;br /&gt;
|-&lt;br /&gt;
| [[NO$CPC|NO$CPC]]&lt;br /&gt;
| 1.8&lt;br /&gt;
| Nov 2, 2000&lt;br /&gt;
| [[CPC old generation|CPC range]], [[Plus|Plus range]]&lt;br /&gt;
| Freeware&lt;br /&gt;
| [http://problemkaputt.de/cpc.htm]&lt;br /&gt;
|-&lt;br /&gt;
| [[CPCEMU (RWCPC)|RWCPC]]&lt;br /&gt;
| &lt;br /&gt;
| Mar 23, 1995&lt;br /&gt;
| [[CPC old generation|CPC range]]&lt;br /&gt;
| Freeware&lt;br /&gt;
| [ftp://ftp.lip6.fr/pub/amstrad/emulator/RWCPC.ZIP]&lt;br /&gt;
|-&lt;br /&gt;
| [[SIMCPC|SIMCPC]]&lt;br /&gt;
| &lt;br /&gt;
| 1990&lt;br /&gt;
| [[CPC old generation|CPC range]]&lt;br /&gt;
| Shareware&lt;br /&gt;
| [ftp://ftp.lip6.fr/pub/amstrad/emulator/SIMCPC.ZIP]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== EXOS ==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable sortable&amp;quot; style=&amp;quot;width:100%&amp;quot;&lt;br /&gt;
! Name&lt;br /&gt;
! Actual version&lt;br /&gt;
! Last release&lt;br /&gt;
! Emulated systems&lt;br /&gt;
! License&lt;br /&gt;
! Link&lt;br /&gt;
|-&lt;br /&gt;
| [[Software CPC Emulator|Software CPC Emulator]] &lt;br /&gt;
| 1.3&lt;br /&gt;
| Jan 11, 2013&lt;br /&gt;
| [[CPC old generation|CPC range]]&lt;br /&gt;
| Open source&lt;br /&gt;
| [http://www.ep128.hu/Ep_Util/Prg/Amstrad_CPC_Emulator_13.rar]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Haiku  ==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable sortable&amp;quot; style=&amp;quot;width:100%&amp;quot;&lt;br /&gt;
! Name&lt;br /&gt;
! Actual version&lt;br /&gt;
! Last release&lt;br /&gt;
! Emulated systems&lt;br /&gt;
! License&lt;br /&gt;
! Link&lt;br /&gt;
|-&lt;br /&gt;
| [[ACE_(Emulator)|ACE]]&lt;br /&gt;
| 1.14.0&lt;br /&gt;
| Jun 20, 2020&lt;br /&gt;
| [[CPC old generation|CPC range]], [[Plus|Plus range]]&lt;br /&gt;
| Freeware&lt;br /&gt;
| [http://www.cpcwiki.eu/forum/emulators/ace-for-haiku/] [http://ace.cpcscene.net/]&lt;br /&gt;
|-&lt;br /&gt;
| [[AdvanceMAME|AdvanceMAME]]&lt;br /&gt;
| 3.9-1&lt;br /&gt;
| Feb 3, 2020&lt;br /&gt;
| [[CPC old generation|CPC range]], [[Plus|Plus range]], [[KC Compact]], [[Aleste 520EX]] &amp;amp; lots of other computer systems&lt;br /&gt;
| Open source&lt;br /&gt;
| [https://depot.haiku-os.org/#!/pkg/advancemame_x86]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Java / JVM  ==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable sortable&amp;quot; style=&amp;quot;width:100%&amp;quot;&lt;br /&gt;
! Name&lt;br /&gt;
! Actual version&lt;br /&gt;
! Last release&lt;br /&gt;
! Emulated systems&lt;br /&gt;
! License&lt;br /&gt;
! Link&lt;br /&gt;
|-&lt;br /&gt;
| [[Arnold Jnr|Arnold Jnr]]&lt;br /&gt;
| &lt;br /&gt;
| Aug 27, 2001&lt;br /&gt;
| [[CPC old generation|CPC range]]&lt;br /&gt;
| Open source&lt;br /&gt;
| [http://www.arnoldemu.freeserve.co.uk/]&lt;br /&gt;
|-&lt;br /&gt;
| [[CPCInAJar|CPCInAJar]]&lt;br /&gt;
|&lt;br /&gt;
| Mar 16, 2011&lt;br /&gt;
| [[CPC old generation|CPC range]]&lt;br /&gt;
| Open source&lt;br /&gt;
| [http://sourceforge.net/projects/cpcinajar/]&lt;br /&gt;
|-&lt;br /&gt;
| [[JavaCPC|JavaCPC Desktop]]&lt;br /&gt;
| 2.9.7&lt;br /&gt;
| Sep 21, 2018&lt;br /&gt;
| [[CPC old generation|CPC range]], [[KC Compact]]&lt;br /&gt;
| Donationware&lt;br /&gt;
| [https://sourceforge.net/projects/javacpc/]&lt;br /&gt;
|-&lt;br /&gt;
| [[JavaCPC|JavaCPC Applet]]&lt;br /&gt;
| &lt;br /&gt;
| Jul 10, 2012&lt;br /&gt;
| [[CPC old generation|CPC range]], [[Plus|Plus range]]&lt;br /&gt;
| Donationware&lt;br /&gt;
| [http://java.cpc-live.com/] (dead link)&lt;br /&gt;
|-&lt;br /&gt;
| [[JavaGX4000|JavaGX4000]]&lt;br /&gt;
| &lt;br /&gt;
| Sep 7, 2018&lt;br /&gt;
| [[CPC old generation|CPC range]], [[Plus|Plus range]]&lt;br /&gt;
| Open source&lt;br /&gt;
| [http://sourceforge.net/projects/javagx4000/]&lt;br /&gt;
|-&lt;br /&gt;
| [[JEMU|JEMU]]&lt;br /&gt;
| &lt;br /&gt;
| Feb 19, 2007&lt;br /&gt;
| [[CPC old generation|CPC range]], [[BBC Micro]], [[VZ-300]], [[ZX Spectrum]], [[ZX80/81]]&lt;br /&gt;
| Open source&lt;br /&gt;
| [http://jemu.winape.net/]&lt;br /&gt;
|-&lt;br /&gt;
| [[JKCEMU|JKCEMU]]&lt;br /&gt;
| 0.9.7&lt;br /&gt;
| Mar 30, 2017&lt;br /&gt;
| [[KC Compact]] &amp;amp; other computers from East Germany&lt;br /&gt;
| Open source&lt;br /&gt;
| [http://www.jens-mueller.org/jkcemu/kccompact.html]&lt;br /&gt;
|-&lt;br /&gt;
| [[WebCPC|WebCPC]]&lt;br /&gt;
| r15&lt;br /&gt;
| Dec 31, 2010&lt;br /&gt;
| [[CPC old generation|CPC range]]&lt;br /&gt;
| Open source&lt;br /&gt;
| [http://sourceforge.net/projects/webcpc/]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== JavaScript / HTML5  ==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable sortable&amp;quot; style=&amp;quot;width:100%&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Name &lt;br /&gt;
! Actual version &lt;br /&gt;
! Last release &lt;br /&gt;
! Emulated systems &lt;br /&gt;
! License &lt;br /&gt;
! Link&lt;br /&gt;
|-&lt;br /&gt;
| [[CPCBox|CPCBox]] &lt;br /&gt;
| beta &lt;br /&gt;
| Dec 28, 2013&lt;br /&gt;
| [[CPC old generation|CPC range]] &lt;br /&gt;
| Freeware &lt;br /&gt;
| [https://web.archive.org/web/20190702084943/http://www.cpcbox.com/] [https://bzhgames.xyz/index.php BZH Games]&lt;br /&gt;
|-&lt;br /&gt;
| [[CrocoDS|CrocoDS]] &lt;br /&gt;
| &lt;br /&gt;
| May 13, 2020&lt;br /&gt;
| [[CPC old generation|CPC range]] &lt;br /&gt;
| Freeware &lt;br /&gt;
| [http://crocods.org/web/]&lt;br /&gt;
|-&lt;br /&gt;
| [[JSMESS]] &lt;br /&gt;
| 0.153&lt;br /&gt;
| Oct 29, 2014&lt;br /&gt;
| [[CPC old generation|CPC range]] &amp;amp; lots of other computer systems&lt;br /&gt;
| Open source&lt;br /&gt;
| [http://jsmess.textfiles.com/]&lt;br /&gt;
|-&lt;br /&gt;
| [[Roland javascript emulator|Roland]] &lt;br /&gt;
| &lt;br /&gt;
| Sep 24, 2011 &lt;br /&gt;
| [[CPC old generation|CPC range]] &lt;br /&gt;
| Open source &lt;br /&gt;
| [http://roland.retrolandia.net/]&lt;br /&gt;
|-&lt;br /&gt;
| [[Tiny Emus]]&lt;br /&gt;
| &lt;br /&gt;
| Dec 31, 2018&lt;br /&gt;
| [[CPC old generation|CPC range]], [[ZX Spectrum]], [[VIC-20]], [[Commodore 64]], [[Acorn Atom]], [[KC Compact]], [[KC 85]], [[KC 87]], [[Z9001]], [[Z1013]]&lt;br /&gt;
| Open source&lt;br /&gt;
| [https://floooh.github.io/tiny8bit/] [http://cpc.devilmarkus.de/ JavaCPC-Games]&lt;br /&gt;
|-&lt;br /&gt;
| [[Griffin CPC emulator|Xiragon]]&lt;br /&gt;
| &lt;br /&gt;
| Nov 28, 2012&lt;br /&gt;
| [[CPC old generation|CPC range]]&lt;br /&gt;
| Open source&lt;br /&gt;
| [http://xiragon.com/]&lt;br /&gt;
|-&lt;br /&gt;
| [[YAKC|Yet another KC emulator]]&lt;br /&gt;
| &lt;br /&gt;
| Apr 17, 2017&lt;br /&gt;
| [[CPC old generation|CPC range]], [[ZX Spectrum]], [[Commodore 64]], [[Acorn Atom]], [[KC Compact]], [[KC 85]], [[KC 87]], [[Z9001]], [[Z1013]], [[HC900]]&lt;br /&gt;
| Open source&lt;br /&gt;
| [http://floooh.github.io/virtualkc/]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== macOS ==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable sortable&amp;quot; style=&amp;quot;width:100%&amp;quot;&lt;br /&gt;
! Name&lt;br /&gt;
! Actual version&lt;br /&gt;
! Last release&lt;br /&gt;
! Emulated systems&lt;br /&gt;
! License&lt;br /&gt;
! Link&lt;br /&gt;
|-&lt;br /&gt;
| [[Arnold_(Emulator)|Arnold]] &lt;br /&gt;
| 1.7.9&lt;br /&gt;
| Mar 10, 2018&lt;br /&gt;
| [[CPC old generation|CPC range]], [[Plus|Plus range]], [[KC Compact]]&lt;br /&gt;
| Open source&lt;br /&gt;
| [https://www.bannister.org/software/arnold.htm]&lt;br /&gt;
|-&lt;br /&gt;
| [[Clock Signal|Clock Signal]] &lt;br /&gt;
| &lt;br /&gt;
| Aug 2, 2020&lt;br /&gt;
| [[CPC old generation|CPC range]], [[Acorn Electron]], [[Apple II]], [[Oric 1/Atmos]], [[VIC-20]], [[ZX80/81]], [[Atari 2600]], [[Atari ST]], [[Macintosh]], [[MSX|MSX 1]], [[ColecoVision]]&lt;br /&gt;
| Open source&lt;br /&gt;
| [https://github.com/TomHarte/CLK/releases]&lt;br /&gt;
|-&lt;br /&gt;
| [[CPCplusplus|CPC++]]&lt;br /&gt;
| 2.0.0&lt;br /&gt;
| Jan 14, 2003&lt;br /&gt;
| [[CPC old generation|CPC range]]&lt;br /&gt;
| Shareware&lt;br /&gt;
| [http://bricerive.free.fr/cpc/cpcpp.html]&lt;br /&gt;
|-&lt;br /&gt;
| [[CPCSharp|CPCSharp]] &lt;br /&gt;
| 1.0.0-beta1&lt;br /&gt;
| Apr 7, 2021&lt;br /&gt;
| [[CPC old generation|CPC range]]&lt;br /&gt;
| Open source&lt;br /&gt;
| [https://github.com/dolbz/CPCSharp/releases/]&lt;br /&gt;
|-&lt;br /&gt;
| [[DSP|DSP]]&lt;br /&gt;
| 0.18&lt;br /&gt;
| Dec 31, 2017&lt;br /&gt;
| [[CPC old generation|CPC range]], [[ZX Spectrum]], [[Game Boy]], [[Nintendo NES]], [[Sega Master System]], [[ColecoVision]], [[Arcade]]&lt;br /&gt;
| Open source&lt;br /&gt;
| [https://github.com/leniad/dsp-emulator/]&lt;br /&gt;
|-&lt;br /&gt;
| [[MacCPC|MacCPC]]&lt;br /&gt;
| 0.9.2&lt;br /&gt;
| Jan 22, 2010&lt;br /&gt;
| [[CPC old generation|CPC range]]&lt;br /&gt;
| Freeware&lt;br /&gt;
| [http://www.wincpc.ch/index.php?topic=projects-maccpc]&lt;br /&gt;
|-&lt;br /&gt;
| [[Retro Virtual Machine|Retro Virtual Machine]]&lt;br /&gt;
| 2.0 BETA-1 R7&lt;br /&gt;
| Jul 10, 2019&lt;br /&gt;
| [[CPC old generation|CPC range]], [[ZX Spectrum]]&lt;br /&gt;
| Donationware&lt;br /&gt;
| [https://www.retrovirtualmachine.org]&lt;br /&gt;
|-&lt;br /&gt;
| [[MESS|SDLMAME]]&lt;br /&gt;
| 0.201&lt;br /&gt;
| Aug 29, 2018&lt;br /&gt;
| [[CPC old generation|CPC range]], [[Plus|Plus range]], [[KC Compact]], [[Aleste 520EX]] &amp;amp; lots of other computer systems&lt;br /&gt;
| Open source&lt;br /&gt;
| [http://sdlmame.lngn.net/]&lt;br /&gt;
|-&lt;br /&gt;
| [[ZEsarUX|ZEsarUX]]&lt;br /&gt;
| 9.0&lt;br /&gt;
| Aug 19, 2020&lt;br /&gt;
| [[CPC old generation|CPC range]], [[ZX Spectrum]], [[ZX80/81]], [[Jupiter ACE]], [[Sam Coupe]], [[Sinclair QL]], [[MSX 1]], [[ColecoVision]], [[SG-1000]]&lt;br /&gt;
| Donationware &amp;amp; Open source&lt;br /&gt;
| [https://github.com/chernandezba/zesarux]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== MorphOS  ==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable sortable&amp;quot; style=&amp;quot;width:100%&amp;quot;&lt;br /&gt;
! Name&lt;br /&gt;
! Actual version&lt;br /&gt;
! Last release&lt;br /&gt;
! Emulated systems&lt;br /&gt;
! License&lt;br /&gt;
! Link&lt;br /&gt;
|-&lt;br /&gt;
| [[ACE_(Emulator)|ACE]]&lt;br /&gt;
| 1.25&lt;br /&gt;
| September 8, 2022&lt;br /&gt;
| [[CPC old generation|CPC range]], [[Plus|Plus range]]&lt;br /&gt;
| Freeware&lt;br /&gt;
| [http://ace.cpcscene.net/]&lt;br /&gt;
|-&lt;br /&gt;
| [[MESS|MESS]]&lt;br /&gt;
| 0.113&lt;br /&gt;
| Nov 1, 2007&lt;br /&gt;
| [[CPC old generation|CPC range]], [[Plus|Plus range]], [[KC Compact]], [[Aleste 520EX]] &amp;amp; lots of other computer systems&lt;br /&gt;
| Open source&lt;br /&gt;
| [http://fabportnawak.free.fr/mame/]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== MSX2 ==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable sortable&amp;quot; style=&amp;quot;width:100%&amp;quot;&lt;br /&gt;
! Name&lt;br /&gt;
! Actual version&lt;br /&gt;
! Last release&lt;br /&gt;
! Emulated systems&lt;br /&gt;
! License&lt;br /&gt;
! Link&lt;br /&gt;
|-&lt;br /&gt;
| [[EMU6CPC|EMU6CPC]]&lt;br /&gt;
| &lt;br /&gt;
| Dec 17, 2018&lt;br /&gt;
| [[CPC old generation|CPC range]]&lt;br /&gt;
| Freeware&lt;br /&gt;
| [http://romu6.blogspot.com/2018/12/emu6cpc-emulador-de-amstrad-cpc-6128.html]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Unix / Linux  ==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable sortable&amp;quot; style=&amp;quot;width:100%&amp;quot;&lt;br /&gt;
! Name&lt;br /&gt;
! Actual version&lt;br /&gt;
! Last release&lt;br /&gt;
! Emulated systems&lt;br /&gt;
! License&lt;br /&gt;
! Link&lt;br /&gt;
|-&lt;br /&gt;
| [[Arnold_(Emulator)|Arnold]] &lt;br /&gt;
| &lt;br /&gt;
| Jan 20, 2016&lt;br /&gt;
| [[CPC old generation|CPC range]], [[Plus|Plus range]], [[KC Compact]], [[Aleste 520EX]]&lt;br /&gt;
| Open source&lt;br /&gt;
| [http://www.cpcwiki.eu/forum/emulators/arnold-wip/msg118124/]&lt;br /&gt;
|-&lt;br /&gt;
| [[CaPriCe|CaPriCe32]] &lt;br /&gt;
| 4.4.0&lt;br /&gt;
| Mar 26, 2017&lt;br /&gt;
| [[CPC old generation|CPC range]], [[Plus|Plus range]]&lt;br /&gt;
| Donationware &amp;amp; Open source&lt;br /&gt;
| [https://github.com/ColinPitrat/caprice32]&lt;br /&gt;
|-&lt;br /&gt;
| [[Caprice Reloaded]]&lt;br /&gt;
| r377&lt;br /&gt;
| Jul 13, 2010&lt;br /&gt;
| [[CPC old generation|CPC range]]&lt;br /&gt;
| Open source&lt;br /&gt;
| [http://aur.archlinux.org/packages.php?ID=38856]&lt;br /&gt;
|-&lt;br /&gt;
| [[Clock Signal|Clock Signal]] &lt;br /&gt;
| &lt;br /&gt;
| Aug 2, 2020&lt;br /&gt;
| [[CPC old generation|CPC range]], [[Acorn Electron]], [[Apple II]], [[Oric 1/Atmos]], [[VIC-20]], [[ZX80/81]], [[Atari 2600]], [[Atari ST]], [[Macintosh]], [[MSX|MSX 1]], [[ColecoVision]]&lt;br /&gt;
| Open source&lt;br /&gt;
| [https://github.com/TomHarte/CLK/releases]&lt;br /&gt;
|-&lt;br /&gt;
| [[CPCplusplus|CPC++]]&lt;br /&gt;
| 1.5.0&lt;br /&gt;
| &lt;br /&gt;
| [[CPC old generation|CPC range]]&lt;br /&gt;
| Shareware&lt;br /&gt;
| [http://bricerive.free.fr/cpc/cpcpp.html]&lt;br /&gt;
|-&lt;br /&gt;
| [[cpc4x|cpc4x]] &lt;br /&gt;
| 0.26&lt;br /&gt;
| Dec 11, 2004&lt;br /&gt;
| [[CPC old generation|CPC range]]&lt;br /&gt;
| Open source&lt;br /&gt;
| [http://www.ulrich-cordes.de/cpc/english/cpcemu.htm]&lt;br /&gt;
|-&lt;br /&gt;
| [[CPCemu|CPCemu]] &lt;br /&gt;
| 2.0&lt;br /&gt;
| Jan 7, 2021&lt;br /&gt;
| [[CPC old generation|CPC range]]&lt;br /&gt;
| Freeware&lt;br /&gt;
| [http://www.cpc-emu.org/]&lt;br /&gt;
|-&lt;br /&gt;
| [[DSP|DSP]]&lt;br /&gt;
| 0.18&lt;br /&gt;
| Dec 31, 2017&lt;br /&gt;
| [[CPC old generation|CPC range]], [[ZX Spectrum]], [[Game Boy]], [[Nintendo NES]], [[Sega Master System]], [[ColecoVision]], [[Arcade]]&lt;br /&gt;
| Open source&lt;br /&gt;
| [https://github.com/leniad/dsp-emulator/]&lt;br /&gt;
|-&lt;br /&gt;
| [[ep128emu|ep128emu]]&lt;br /&gt;
| 2.0.11&lt;br /&gt;
| Jan 20, 2017&lt;br /&gt;
| [[CPC old generation|CPC range]], [[ZX Spectrum]], [[Enterprise]]&lt;br /&gt;
| Donationware &amp;amp; Open source&lt;br /&gt;
| [http://sourceforge.net/projects/ep128emu/]&lt;br /&gt;
|-&lt;br /&gt;
| [[MESS|MAME]]&lt;br /&gt;
| 0.227&lt;br /&gt;
| Dec 30, 2020&lt;br /&gt;
| [[CPC old generation|CPC range]], [[Plus|Plus range]], [[KC Compact]], [[Aleste 520EX]] &amp;amp; lots of other computer systems&lt;br /&gt;
| Open source&lt;br /&gt;
| [http://wiki.mamedev.org/index.php/SDL_Supported_Platforms]&lt;br /&gt;
|-&lt;br /&gt;
| [[Retro Virtual Machine|Retro Virtual Machine]]&lt;br /&gt;
| 2.0 BETA-1 R7&lt;br /&gt;
| Jul 10, 2019&lt;br /&gt;
| [[CPC old generation|CPC range]], [[ZX Spectrum]]&lt;br /&gt;
| Donationware&lt;br /&gt;
| [https://www.retrovirtualmachine.org]&lt;br /&gt;
|-&lt;br /&gt;
| [[Roland Emulator|Roland]] &lt;br /&gt;
| 0.70&lt;br /&gt;
| Apr 20, 2017&lt;br /&gt;
| [[CPC old generation|CPC range]]&lt;br /&gt;
| Open source&lt;br /&gt;
| [https://www.rolandemu.de/index.html]&lt;br /&gt;
|-&lt;br /&gt;
| [[Ronald|Ronald]] &lt;br /&gt;
| &lt;br /&gt;
| Sep 5, 2021&lt;br /&gt;
| [[CPC old generation|CPC range]]&lt;br /&gt;
| Open source&lt;br /&gt;
| [https://github.com/mdm/ronald]&lt;br /&gt;
|-&lt;br /&gt;
| [[SugarBox|SugarBox]]&lt;br /&gt;
| 0.29&lt;br /&gt;
| Jan 22, 2018&lt;br /&gt;
| [[CPC old generation|CPC range]], [[Plus|Plus range]]&lt;br /&gt;
| Open-Source&lt;br /&gt;
| [http://sugarbox.free.fr/] [https://github.com/Tom1975/SugarboxV2]&lt;br /&gt;
|-&lt;br /&gt;
| [[XCPC|Xcpc]]&lt;br /&gt;
| 0.37.0&lt;br /&gt;
| May 2, 2021&lt;br /&gt;
| [[CPC old generation|CPC range]]&lt;br /&gt;
| Open source&lt;br /&gt;
| [https://www.xcpc-emulator.net/]&lt;br /&gt;
|-&lt;br /&gt;
| [[YACE|YACE]]&lt;br /&gt;
| Unreleased?&lt;br /&gt;
| Nov 12, 2014&lt;br /&gt;
| [[CPC old generation|CPC range]]&lt;br /&gt;
| Unreleased?&lt;br /&gt;
| [http://www.youtube.com/watch?v=uxQkljwc0i4]&lt;br /&gt;
|-&lt;br /&gt;
| [[ZEsarUX|ZEsarUX]]&lt;br /&gt;
| 9.1&lt;br /&gt;
| Nov 26, 2020&lt;br /&gt;
| [[CPC old generation|CPC range]], [[ZX Spectrum]], [[ZX80/81]], [[Jupiter ACE]], [[Sam Coupe]], [[Sinclair QL]], [[MSX 1]], [[ColecoVision]], [[SG-1000]]&lt;br /&gt;
| Open source&lt;br /&gt;
| [https://github.com/chernandezba/zesarux]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Windows  ==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable sortable&amp;quot; style=&amp;quot;width:100%&amp;quot;&lt;br /&gt;
! Name&lt;br /&gt;
! Actual version&lt;br /&gt;
! Last release&lt;br /&gt;
! Emulated systems&lt;br /&gt;
! License&lt;br /&gt;
! Link&lt;br /&gt;
|-&lt;br /&gt;
| [[AMSpiriT|AMSpiriT]]&lt;br /&gt;
[https://www.cpcwiki.eu/forum/emulators/amspirit-a-new-cpc-emulator-for-windows/]&lt;br /&gt;
| 0.704b&lt;br /&gt;
| Oct 20, 2022&lt;br /&gt;
| [[CPC old generation|CPC range]]&lt;br /&gt;
| Freeware&lt;br /&gt;
| [https://forum.system-cfg.com/viewtopic.php?f=24&amp;amp;t=11535]&lt;br /&gt;
|-&lt;br /&gt;
| [[Arnimedes|Arnimedes]] &lt;br /&gt;
| 1.02&lt;br /&gt;
| Jul 7, 2012&lt;br /&gt;
| [[CPC old generation|CPC range]]&lt;br /&gt;
| Freeware&lt;br /&gt;
| [http://www.arnimedes.de/]&lt;br /&gt;
|-&lt;br /&gt;
| [[Arnold_(Emulator)|Arnold]] &lt;br /&gt;
| [http://www.cpcwiki.eu/imgs/d/dd/Arnoldwip_src.tar.bz2 WIP]&lt;br /&gt;
| May 13, 2017&lt;br /&gt;
| [[CPC old generation|CPC range]], [[Plus|Plus range]], [[KC Compact]], [[Aleste 520EX]]&lt;br /&gt;
| Open source&lt;br /&gt;
| [http://www.cpcwiki.eu/forum/emulators/arnold-wip/msg144749/#msg144749] [https://www.cpcwiki.eu/forum/emulators/another-version-of-arnold-emulator/ Aeliss fork]&lt;br /&gt;
|-&lt;br /&gt;
| [[CaPriCe|CaPriCe]] &lt;br /&gt;
| 4.2.0&lt;br /&gt;
| May 14, 2005&lt;br /&gt;
| [[CPC old generation|CPC range]]&lt;br /&gt;
| Open source&lt;br /&gt;
| [http://sourceforge.net/projects/caprice32/]&lt;br /&gt;
|-&lt;br /&gt;
| [[CaPriCe|CaPriCe 32]] &lt;br /&gt;
| 4.5.0&lt;br /&gt;
| Dec 27, 2018&lt;br /&gt;
| [[CPC old generation|CPC range]], [[Plus|Plus range]]&lt;br /&gt;
| Donationware &amp;amp; Open source&lt;br /&gt;
| [https://github.com/ColinPitrat/caprice32]&lt;br /&gt;
|-&lt;br /&gt;
| [[Caprice Forever]] &lt;br /&gt;
| 20.10&lt;br /&gt;
| Jul 14, 2020&lt;br /&gt;
| [[CPC old generation|CPC range]]&lt;br /&gt;
| Freeware&lt;br /&gt;
| [http://www.cpc-power.com/cpcarchives/index.php?page=articles&amp;amp;num=73]&lt;br /&gt;
|-&lt;br /&gt;
| [[Caprice Reloaded]]&lt;br /&gt;
| r533&lt;br /&gt;
| Sep 25, 2011&lt;br /&gt;
| [[CPC old generation|CPC range]]&lt;br /&gt;
| Open source&lt;br /&gt;
| [http://code.google.com/p/cpcsdk/]&lt;br /&gt;
|-&lt;br /&gt;
| [[Caprice32-Aleste|Caprice32-Aleste]] &lt;br /&gt;
| 4.1.0&lt;br /&gt;
| Nov 14, 2007&lt;br /&gt;
| [[Aleste 520EX|Aleste 520EX]]&lt;br /&gt;
| Open source&lt;br /&gt;
| [http://aleste520.narod.ru/caprice.html]&lt;br /&gt;
|-&lt;br /&gt;
| [[CoPaCabana|CoPaCabana]]&lt;br /&gt;
| 0.74&lt;br /&gt;
| Apr 12, 2006&lt;br /&gt;
| [[CPC old generation|CPC range]]&lt;br /&gt;
| Freeware&lt;br /&gt;
| [http://copacabana.emuunlim.com/]&lt;br /&gt;
|-&lt;br /&gt;
| [[CPC-em|CPC-em]] &lt;br /&gt;
| 0.4&lt;br /&gt;
| Jul 7, 2004&lt;br /&gt;
| [[CPC old generation|CPC range]]&lt;br /&gt;
| Open source&lt;br /&gt;
| [http://cpc-em.emuunlim.com/]&lt;br /&gt;
|-&lt;br /&gt;
| [[CPC++|CPC++]] &lt;br /&gt;
| b700&lt;br /&gt;
| Mar 26, 2014&lt;br /&gt;
| [[CPC old generation|CPC range]]&lt;br /&gt;
| Freeware&lt;br /&gt;
| [http://cpcrulez.fr/emulateurs_download-WIN-CPC_plus_plus.htm]&lt;br /&gt;
|-&lt;br /&gt;
| [[CPC3D/CPC32]] &lt;br /&gt;
| 0.3&lt;br /&gt;
| Feb 8, 2003&lt;br /&gt;
| [[CPC old generation|CPC range]]&lt;br /&gt;
| Freeware&lt;br /&gt;
| [http://www.angelfire.com/retro2/cpc3d/]&lt;br /&gt;
|-&lt;br /&gt;
| [[CPCE|CPCE]] &lt;br /&gt;
| 1.94&lt;br /&gt;
| Jun 2, 2011&lt;br /&gt;
| [[CPC old generation|CPC range]]&lt;br /&gt;
| Freeware&lt;br /&gt;
| [http://cngsoft.no-ip.org/cpce/]&lt;br /&gt;
|-&lt;br /&gt;
| [[CPCEC|CPCEC]] &lt;br /&gt;
| 20200622&lt;br /&gt;
| Jun 6, 2020&lt;br /&gt;
| [[CPC old generation|CPC range]], [[Plus|Plus range]]&lt;br /&gt;
| Open source&lt;br /&gt;
| [http://cngsoft.no-ip.org/cpcec.htm]&lt;br /&gt;
|-&lt;br /&gt;
| [[CPCemu|CPCemu]] &lt;br /&gt;
| 2.0&lt;br /&gt;
| Jan 7, 2021&lt;br /&gt;
| [[CPC old generation|CPC range]]&lt;br /&gt;
| Freeware&lt;br /&gt;
| [http://www.cpc-emu.org/]&lt;br /&gt;
|-&lt;br /&gt;
| [[CPCEmuPower|CPCEmuPower]] &lt;br /&gt;
| 2005&lt;br /&gt;
| May 31, 2020&lt;br /&gt;
| [[CPC old generation|CPC range]], [[Plus|Plus range]]&lt;br /&gt;
| Freeware&lt;br /&gt;
| [https://www.cpcwiki.eu/forum/emulators/cpcepower-v2005/]&lt;br /&gt;
|-&lt;br /&gt;
| [[CPCSharp|CPCSharp]] &lt;br /&gt;
| 1.0.0-beta1&lt;br /&gt;
| Apr 7, 2021&lt;br /&gt;
| [[CPC old generation|CPC range]]&lt;br /&gt;
| Open source&lt;br /&gt;
| [https://github.com/dolbz/CPCSharp/releases/]&lt;br /&gt;
|-&lt;br /&gt;
| [[CPCwin|CPCwin]] &lt;br /&gt;
| 1.0&lt;br /&gt;
| Dec 4, 1997&lt;br /&gt;
| [[CPC old generation|CPC range]]&lt;br /&gt;
| Freeware&lt;br /&gt;
| [ftp://ftp.lip6.fr/pub/amstrad/emulator/CPCWIN10.ZIP]&lt;br /&gt;
|-&lt;br /&gt;
| [[CPE|CPE]]&lt;br /&gt;
| 5.2&lt;br /&gt;
| Apr 21, 1997&lt;br /&gt;
| [[CPC old generation|CPC range]]&lt;br /&gt;
| Freeware&lt;br /&gt;
| [ftp://ftp.lip6.fr/pub/amstrad/emulator/CPE52.ZIP]&lt;br /&gt;
|-&lt;br /&gt;
| [[CPvC|CPvC]]&lt;br /&gt;
| &lt;br /&gt;
| Oct 7, 2020&lt;br /&gt;
| [[CPC old generation|CPC range]]&lt;br /&gt;
| Open source&lt;br /&gt;
| [https://github.com/alybaek2/cpvc]&lt;br /&gt;
|-&lt;br /&gt;
| [[DSP|DSP]]&lt;br /&gt;
| 0.18&lt;br /&gt;
| Dec 31, 2017&lt;br /&gt;
| [[CPC old generation|CPC range]], [[ZX Spectrum]], [[Game Boy]], [[Nintendo NES]], [[Sega Master System]], [[ColecoVision]], [[Arcade]]&lt;br /&gt;
| Open source&lt;br /&gt;
| [https://github.com/leniad/dsp-emulator/]&lt;br /&gt;
|-&lt;br /&gt;
| [[ep128emu|ep128emu]]&lt;br /&gt;
| 2.0.11&lt;br /&gt;
| Jan 20, 2017&lt;br /&gt;
| [[CPC old generation|CPC range]], [[ZX Spectrum]], [[Enterprise]]&lt;br /&gt;
| Donationware &amp;amp; Open source&lt;br /&gt;
| [http://sourceforge.net/projects/ep128emu/]&lt;br /&gt;
|-&lt;br /&gt;
| [[MESS|MAME]]&lt;br /&gt;
| 0.201&lt;br /&gt;
| Aug 30, 2018&lt;br /&gt;
| [[CPC old generation|CPC range]], [[Plus|Plus range]], [[KC Compact]], [[Aleste 520EX]] &amp;amp; lots of other computer systems&lt;br /&gt;
| Open source&lt;br /&gt;
| [http://mamedev.org/release.html]&lt;br /&gt;
|-&lt;br /&gt;
| [[MTMW|MTMW]]&lt;br /&gt;
| 1.30B&lt;br /&gt;
| Jan 11, 2000&lt;br /&gt;
| [[CPC old generation|CPC range]], [[Plus|Plus range]], [[ZX Spectrum]], [[ZX80/81]], [[Jupiter ACE]], [[Enterprise]]&lt;br /&gt;
| Freeware&lt;br /&gt;
| [ftp://ftp.lip6.fr/pub/amstrad/emulator/MTMW130B.ZIP]&lt;br /&gt;
|-&lt;br /&gt;
| [[NO$CPC|NO$CPC]]&lt;br /&gt;
| 1.8&lt;br /&gt;
| Nov 2, 2000&lt;br /&gt;
| [[CPC old generation|CPC range]], [[Plus|Plus range]]&lt;br /&gt;
| Freeware&lt;br /&gt;
| [http://problemkaputt.de/cpc.htm]&lt;br /&gt;
|-&lt;br /&gt;
| [[PC-CPC|PC-CPC]] &lt;br /&gt;
| 0.1at b29&lt;br /&gt;
| Nov 17, 2011&lt;br /&gt;
| [[CPC old generation|CPC range]]&lt;br /&gt;
| Freeware&lt;br /&gt;
| [http://cpcrulez.fr/emulateurs_download-WIN-PC-CPC.htm]&lt;br /&gt;
|-&lt;br /&gt;
| [[Retro Virtual Machine|Retro Virtual Machine]]&lt;br /&gt;
| 2.0 BETA-1 R7&lt;br /&gt;
| Jul 10, 2019&lt;br /&gt;
| [[CPC old generation|CPC range]], [[ZX Spectrum]]&lt;br /&gt;
| Donationware&lt;br /&gt;
| [https://www.retrovirtualmachine.org]&lt;br /&gt;
|-&lt;br /&gt;
| [[Roland Emulator|Roland]] &lt;br /&gt;
| 0.70&lt;br /&gt;
| Apr 20, 2017&lt;br /&gt;
| [[CPC old generation|CPC range]]&lt;br /&gt;
| Open source&lt;br /&gt;
| [https://www.rolandemu.de/en/downloads.html]/[https://github.com/raldus/roland GitHub]&lt;br /&gt;
|-&lt;br /&gt;
| [[SugarBox|SugarBox]]&lt;br /&gt;
| 0.29&lt;br /&gt;
| Jan 22, 2018&lt;br /&gt;
| [[CPC old generation|CPC range]], [[Plus|Plus range]]&lt;br /&gt;
| Open-Source&lt;br /&gt;
| [http://sugarbox.free.fr/] [https://github.com/Tom1975/SugarboxV2]&lt;br /&gt;
|-&lt;br /&gt;
| [[vbCPC|vbCPC]] &lt;br /&gt;
| 1.06&lt;br /&gt;
| Apr 7, 2005&lt;br /&gt;
| [[CPC old generation|CPC range]]&lt;br /&gt;
| Freeware&lt;br /&gt;
| [http://www.emu-france.com/news/9609-ordi-vbcpc-v1-0-6/]&lt;br /&gt;
|-&lt;br /&gt;
| [[VirtualCPC|Virtual CPC]] &lt;br /&gt;
| 1.1&lt;br /&gt;
| Aug 8, 2011&lt;br /&gt;
| [[CPC old generation|CPC range]]&lt;br /&gt;
| Freeware&lt;br /&gt;
| [http://users.otenet.gr/~sulfonic/cpc/]&lt;br /&gt;
|-&lt;br /&gt;
| [[WinApe|WinAPE]] &lt;br /&gt;
| 2.0b2&lt;br /&gt;
| Jan 5, 2016&lt;br /&gt;
| [[CPC old generation|CPC range]], [[Plus|Plus range]]&lt;br /&gt;
| Donationware&lt;br /&gt;
| [http://www.winape.net/]&lt;br /&gt;
|-&lt;br /&gt;
| [[WinCPC|WinCPC]] &lt;br /&gt;
| 0.9.26&lt;br /&gt;
| Feb 1, 2007&lt;br /&gt;
| [[CPC old generation|CPC range]]&lt;br /&gt;
| Freeware&lt;br /&gt;
| [http://www.wincpc.ch/index.php?topic=projects-wincpc]&lt;br /&gt;
|-&lt;br /&gt;
| [[XNACPC|XNACPC]]&lt;br /&gt;
| 1.0&lt;br /&gt;
| Nov 11, 2011&lt;br /&gt;
| [[CPC old generation|CPC range]]&lt;br /&gt;
| Open source&lt;br /&gt;
| [http://www.gavpugh.com/2011/11/11/xnacpc-xbox-360-amstrad-cpc-emulator-released/]&lt;br /&gt;
|-&lt;br /&gt;
| [[Yage|Yage]]&lt;br /&gt;
| 0.91&lt;br /&gt;
| Oct 24, 1998&lt;br /&gt;
| [[CPC old generation|CPC range]]&lt;br /&gt;
| Freeware&lt;br /&gt;
| [ftp://ftp.lip6.fr/pub/amstrad/emulator/YAGE091.ZIP]&lt;br /&gt;
|-&lt;br /&gt;
| [[ZEsarUX|ZEsarUX]]&lt;br /&gt;
| 9.0&lt;br /&gt;
| Aug 19, 2020&lt;br /&gt;
| [[CPC old generation|CPC range]], [[ZX Spectrum]], [[ZX80/81]], [[Jupiter ACE]], [[Sam Coupe]], [[Sinclair QL]], [[MSX 1]], [[ColecoVision]], [[SG-1000]]&lt;br /&gt;
| Donationware &amp;amp; Open source&lt;br /&gt;
| [https://github.com/chernandezba/zesarux]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Emulation Core ==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable sortable&amp;quot; style=&amp;quot;width:100%&amp;quot;&lt;br /&gt;
! Name&lt;br /&gt;
! Actual version&lt;br /&gt;
! Last release&lt;br /&gt;
! Emulated systems&lt;br /&gt;
! License&lt;br /&gt;
! Link&lt;br /&gt;
|-&lt;br /&gt;
| libretro-cap32 (for RetroArch)&lt;br /&gt;
| 1.2.2&lt;br /&gt;
| Jul 19, 2015&lt;br /&gt;
| [[CPC old generation|CPC range]]&lt;br /&gt;
| Open source&lt;br /&gt;
| [https://github.com/libretro/libretro-cap32]&lt;br /&gt;
|-&lt;br /&gt;
| libretro-crocods (for RetroArch)&lt;br /&gt;
| 0.1&lt;br /&gt;
| Feb 28, 2017&lt;br /&gt;
| [[CPC old generation|CPC range]]&lt;br /&gt;
| Open source&lt;br /&gt;
| [https://github.com/libretro/libretro-crocods]&lt;br /&gt;
|-&lt;br /&gt;
| SugarLibRetro (for RetroArch)&lt;br /&gt;
| git&lt;br /&gt;
| -&lt;br /&gt;
| [[CPC old generation|CPC range]]&lt;br /&gt;
| Open source&lt;br /&gt;
| [https://github.com/Tom1975/SugarLibRetro] (wraps independent lib https://github.com/Tom1975/CPCCore)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
= Home Consoles =&lt;br /&gt;
&lt;br /&gt;
== Microsoft XBOX  ==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable sortable&amp;quot; style=&amp;quot;width:100%&amp;quot;&lt;br /&gt;
! Name&lt;br /&gt;
! Actual version&lt;br /&gt;
! Last release&lt;br /&gt;
! Emulated systems&lt;br /&gt;
! License&lt;br /&gt;
! Link&lt;br /&gt;
|-&lt;br /&gt;
| [[Arnold|ArnoldX]]&lt;br /&gt;
| v5&lt;br /&gt;
| Apr 20, 2010&lt;br /&gt;
| [[CPC old generation|CPC range]], [[Plus|Plus range]]&lt;br /&gt;
| &lt;br /&gt;
| [http://forums.xbox-scene.com/index.php?showtopic=711667]&lt;br /&gt;
|-&lt;br /&gt;
| [[CoinOPS|CoinOPS]]&lt;br /&gt;
| 5&lt;br /&gt;
| Oct 18, 2012&lt;br /&gt;
| [[CPC old generation|CPC range]] &amp;amp; lots of other computer systems&lt;br /&gt;
| &lt;br /&gt;
| [http://coinopsproject.freeforums.org/viewtopic.php?f=0&amp;amp;t=1213]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Microsoft Xbox 360  ==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable sortable&amp;quot; style=&amp;quot;width:100%&amp;quot;&lt;br /&gt;
! Name&lt;br /&gt;
! Actual version&lt;br /&gt;
! Last release&lt;br /&gt;
! Emulated systems&lt;br /&gt;
! License&lt;br /&gt;
! Link&lt;br /&gt;
|-&lt;br /&gt;
| [[XNACPC|XNACPC]]&lt;br /&gt;
| 1.0&lt;br /&gt;
| Nov 11, 2011&lt;br /&gt;
| [[CPC old generation|CPC range]]&lt;br /&gt;
| Open source&lt;br /&gt;
| [http://www.gavpugh.com/2011/11/11/xnacpc-xbox-360-amstrad-cpc-emulator-released/]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Nintendo Wii ==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable sortable&amp;quot; style=&amp;quot;width:100%&amp;quot;&lt;br /&gt;
! Name&lt;br /&gt;
! Actual version&lt;br /&gt;
! Last release&lt;br /&gt;
! Emulated systems&lt;br /&gt;
! License&lt;br /&gt;
! Link&lt;br /&gt;
|-&lt;br /&gt;
| [[Wiituka|Wiituka]]&lt;br /&gt;
| 0.98.8&lt;br /&gt;
| May 15, 2009&lt;br /&gt;
| [[CPC old generation|CPC range]]&lt;br /&gt;
| Open source&lt;br /&gt;
| [http://wiituka.dantoine.org/]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Sega Dreamcast  ==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable sortable&amp;quot; style=&amp;quot;width:100%&amp;quot;&lt;br /&gt;
! Name&lt;br /&gt;
! Actual version&lt;br /&gt;
! Last release&lt;br /&gt;
! Emulated systems&lt;br /&gt;
! License&lt;br /&gt;
! Link&lt;br /&gt;
|-&lt;br /&gt;
| [[CPCast|CPCast]]&lt;br /&gt;
| &lt;br /&gt;
| May 6, 2006&lt;br /&gt;
| [[CPC old generation|CPC range]]&lt;br /&gt;
| Freeware&lt;br /&gt;
| [http://www.dcemu.co.uk/vbulletin/showthread.php?t=24100]&lt;br /&gt;
|-&lt;br /&gt;
| [[DreamCPC|DreamCPC]]&lt;br /&gt;
| Alpha 3&lt;br /&gt;
| Oct 16, 2005&lt;br /&gt;
| [[CPC old generation|CPC range]]&lt;br /&gt;
| Freeware&lt;br /&gt;
| [http://jm1200.free.fr/index.php?r=2]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Sony PS2 ==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable sortable&amp;quot; style=&amp;quot;width:100%&amp;quot;&lt;br /&gt;
! Name&lt;br /&gt;
! Actual version&lt;br /&gt;
! Last release&lt;br /&gt;
! Emulated systems&lt;br /&gt;
! License&lt;br /&gt;
! Link&lt;br /&gt;
|-&lt;br /&gt;
| [[PCPC|PCPC]]&lt;br /&gt;
| &lt;br /&gt;
| Dec 22, 2004&lt;br /&gt;
| [[CPC old generation|CPC range]]&lt;br /&gt;
| Open source&lt;br /&gt;
| [http://ps2emu.dcemu.co.uk/pcpc.shtml]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Sony PS3 ==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable sortable&amp;quot; style=&amp;quot;width:100%&amp;quot;&lt;br /&gt;
! Name&lt;br /&gt;
! Actual version&lt;br /&gt;
! Last release&lt;br /&gt;
! Emulated systems&lt;br /&gt;
! License&lt;br /&gt;
! Link&lt;br /&gt;
|-&lt;br /&gt;
| [[Caprice32|Caprice32]]&lt;br /&gt;
| 4.1.0 DBG&lt;br /&gt;
| Apr 9, 2012&lt;br /&gt;
| [[CPC old generation|CPC range]]&lt;br /&gt;
| Open source&lt;br /&gt;
| [http://psx-scene.com/forums/content/caprice32-4-1-0-dbg-emulator-ps3-2119/]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
= Handheld Consoles  =&lt;br /&gt;
&lt;br /&gt;
== Dingoo A320 / A330 ==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable sortable&amp;quot; style=&amp;quot;width:100%&amp;quot;&lt;br /&gt;
! Name&lt;br /&gt;
! Actual version&lt;br /&gt;
! Last release&lt;br /&gt;
! Emulated systems&lt;br /&gt;
! License&lt;br /&gt;
! Link&lt;br /&gt;
|-&lt;br /&gt;
| [[Pituka|Pituka (Dingux)]]&lt;br /&gt;
| 0.8pre&lt;br /&gt;
| Aug 19, 2010&lt;br /&gt;
| [[CPC old generation|CPC range]]&lt;br /&gt;
| Open source&lt;br /&gt;
| [http://david.dantoine.org/proyecto/4/]&lt;br /&gt;
|-&lt;br /&gt;
| [[Caprice|Dingux-CAP32]]&lt;br /&gt;
| 1.1.2&lt;br /&gt;
| Oct 17, 2009&lt;br /&gt;
| [[CPC old generation|CPC range]]&lt;br /&gt;
| Open source&lt;br /&gt;
| [http://zx81.zx81.free.fr/serendipity/index.php?/categories/105-Amstrad/]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== GamePark GP32 / GP2X / Wiz / Caanoo ==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable sortable&amp;quot; style=&amp;quot;width:100%&amp;quot;&lt;br /&gt;
! Name&lt;br /&gt;
! Actual version&lt;br /&gt;
! Last release&lt;br /&gt;
! Emulated systems&lt;br /&gt;
! License&lt;br /&gt;
! Link&lt;br /&gt;
|-&lt;br /&gt;
| [[Pituka|Pituka (GP32)]]&lt;br /&gt;
| 1d&lt;br /&gt;
| May 15, 2010&lt;br /&gt;
| [[CPC old generation|CPC range]]&lt;br /&gt;
| Open source&lt;br /&gt;
| [http://david.dantoine.org/proyecto/4/]&lt;br /&gt;
|-&lt;br /&gt;
| [[Caprice|CapriceGP2x]]&lt;br /&gt;
| 0.5&lt;br /&gt;
| Feb 22, 2006&lt;br /&gt;
| [[CPC old generation|CPC range]]&lt;br /&gt;
| Open source&lt;br /&gt;
| [http://wiki.gp2x.org/wiki/CapriceGP2x]&lt;br /&gt;
|-&lt;br /&gt;
| [[Caprice|GP2X-CAP32]]&lt;br /&gt;
| 1.5.1&lt;br /&gt;
| Aug 29, 2009&lt;br /&gt;
| [[CPC old generation|CPC range]]&lt;br /&gt;
| Open source&lt;br /&gt;
| [http://zx81.zx81.free.fr/serendipity/index.php?/categories/42-Amstrad/]&lt;br /&gt;
|-&lt;br /&gt;
| [[Caprice|Wiz-CAP32]]&lt;br /&gt;
| 1.1.0&lt;br /&gt;
| Aug 29, 2009&lt;br /&gt;
| [[CPC old generation|CPC range]]&lt;br /&gt;
| Open source&lt;br /&gt;
| [http://zx81.zx81.free.fr/serendipity/index.php?/categories/89-Amstrad/]&lt;br /&gt;
|-&lt;br /&gt;
| [[Caprice|Caanoo-CAP32]]&lt;br /&gt;
| 1.1.3&lt;br /&gt;
| Apr 24, 2011&lt;br /&gt;
| [[CPC old generation|CPC range]]&lt;br /&gt;
| Open source&lt;br /&gt;
| [http://zx81.zx81.free.fr/serendipity/index.php?/categories/165-Amstrad/]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== GCW Zero ==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable sortable&amp;quot; style=&amp;quot;width:100%&amp;quot;&lt;br /&gt;
! Name&lt;br /&gt;
! Actual version&lt;br /&gt;
! Last release&lt;br /&gt;
! Emulated systems&lt;br /&gt;
! License&lt;br /&gt;
! Link&lt;br /&gt;
|-&lt;br /&gt;
| [[Caprice|Dingux-CAP32]]&lt;br /&gt;
| 1.1.2&lt;br /&gt;
| May 25, 2014&lt;br /&gt;
| [[CPC old generation|CPC range]]&lt;br /&gt;
| Open source&lt;br /&gt;
| [http://boards.dingoonity.org/gcw-releases/caprice32-%28amstrad-cpc%29/]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== JXD S5110 / S601 &amp;amp; Yinlips G18 ==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable sortable&amp;quot; style=&amp;quot;width:100%&amp;quot;&lt;br /&gt;
! Name&lt;br /&gt;
! Actual version&lt;br /&gt;
! Last release&lt;br /&gt;
! Emulated systems&lt;br /&gt;
! License&lt;br /&gt;
! Link&lt;br /&gt;
|-&lt;br /&gt;
| [[Caprice|JXD-CAP32]]&lt;br /&gt;
| 1.1.1&lt;br /&gt;
| Oct 27, 2012&lt;br /&gt;
| [[CPC old generation|CPC range]]&lt;br /&gt;
| Open source&lt;br /&gt;
| [http://zx81.zx81.free.fr/serendipity/index.php?/categories/206-Amstrad/]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Nintendo DS  ==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable sortable&amp;quot; style=&amp;quot;width:100%&amp;quot;&lt;br /&gt;
! Name&lt;br /&gt;
! Actual version&lt;br /&gt;
! Last release&lt;br /&gt;
! Emulated systems&lt;br /&gt;
! License&lt;br /&gt;
! Link&lt;br /&gt;
|-&lt;br /&gt;
| [[AmeDS|AmeDS]] &lt;br /&gt;
| 4.0&lt;br /&gt;
| Apr 25, 2010&lt;br /&gt;
| [[CPC old generation|CPC range]]&lt;br /&gt;
| Freeware&lt;br /&gt;
| [http://www.portabledev.com/pages/ds/jeuxdev.-perso/ameds.php]&lt;br /&gt;
|-&lt;br /&gt;
| [[CrocoDS|CrocoDS]]&lt;br /&gt;
| 2.0&lt;br /&gt;
| Nov 9, 2007&lt;br /&gt;
| [[CPC old generation|CPC range]]&lt;br /&gt;
| Freeware&lt;br /&gt;
| [http://www.kyuran.be/blog/2007/11/09/crocods-20-2/]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Odroid GO  ==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable sortable&amp;quot; style=&amp;quot;width:100%&amp;quot;&lt;br /&gt;
! Name&lt;br /&gt;
! Actual version&lt;br /&gt;
! Last release&lt;br /&gt;
! Emulated systems&lt;br /&gt;
! License&lt;br /&gt;
! Link&lt;br /&gt;
|-&lt;br /&gt;
| [[CapriceESP32|CapriceESP32]] &lt;br /&gt;
| &lt;br /&gt;
| Dec 3, 2020&lt;br /&gt;
| [[CPC old generation|CPC range]]&lt;br /&gt;
| Open source&lt;br /&gt;
| [https://github.com/grantrismo/CapriceESP32]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Pandora ==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable sortable&amp;quot; style=&amp;quot;width:100%&amp;quot;&lt;br /&gt;
! Name&lt;br /&gt;
! Actual version&lt;br /&gt;
! Last release&lt;br /&gt;
! Emulated systems&lt;br /&gt;
! License&lt;br /&gt;
! Link&lt;br /&gt;
|-&lt;br /&gt;
| [[Caprice|Pandora-CAP32]]&lt;br /&gt;
| 1.1.0&lt;br /&gt;
| Jun 27, 2010&lt;br /&gt;
| [[CPC old generation|CPC range]]&lt;br /&gt;
| Open source&lt;br /&gt;
| [http://zx81.zx81.free.fr/serendipity/index.php?/categories/131-Amstrad/]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Sony PSP  ==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable sortable&amp;quot; style=&amp;quot;width:100%&amp;quot;&lt;br /&gt;
! Name&lt;br /&gt;
! Actual version&lt;br /&gt;
! Last release&lt;br /&gt;
! Emulated systems&lt;br /&gt;
! License&lt;br /&gt;
! Link&lt;br /&gt;
|-&lt;br /&gt;
| [[Caprice32 PSP]]&lt;br /&gt;
| 4.2.0.2&lt;br /&gt;
| Nov 28, 2007&lt;br /&gt;
| [[CPC old generation|CPC range]]&lt;br /&gt;
| Open source&lt;br /&gt;
| [http://psp.akop.org/caprice32]&lt;br /&gt;
|-&lt;br /&gt;
| [[CPCPSP|CPCPSP]]&lt;br /&gt;
| 0.1&lt;br /&gt;
| Dec 24, 2005&lt;br /&gt;
| [[CPC old generation|CPC range]]&lt;br /&gt;
| Freeware&lt;br /&gt;
| [http://dl.qj.net/psp/emulators/cpcpsp-v01.html]&lt;br /&gt;
|-&lt;br /&gt;
| [[PSPCAP32|PSPCAP32]]&lt;br /&gt;
| 1.5.1&lt;br /&gt;
| Aug 21, 2009&lt;br /&gt;
| [[CPC old generation|CPC range]]&lt;br /&gt;
| Open source&lt;br /&gt;
| [http://zx81.zx81.free.fr/serendipity/index.php?/categories/3-Amstrad/]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
= Smartphones / PDA / SoC =&lt;br /&gt;
&lt;br /&gt;
== Android  ==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable sortable&amp;quot; style=&amp;quot;width:100%&amp;quot;&lt;br /&gt;
! Name&lt;br /&gt;
! Actual version&lt;br /&gt;
! Last release&lt;br /&gt;
! Emulated systems&lt;br /&gt;
! License&lt;br /&gt;
! Link&lt;br /&gt;
|-&lt;br /&gt;
| [[andcpc]]&lt;br /&gt;
| 1.5.1&lt;br /&gt;
| Apr 4, 2011&lt;br /&gt;
| [[CPC old generation|CPC range]]&lt;br /&gt;
| Open source&lt;br /&gt;
| [http://code.google.com/p/andcpc/]&lt;br /&gt;
|-&lt;br /&gt;
| [[CPCDroid]]&lt;br /&gt;
| 1.5.1&lt;br /&gt;
| Mar 2, 2011&lt;br /&gt;
| [[CPC old generation|CPC range]]&lt;br /&gt;
| Open source&lt;br /&gt;
| [http://fmsdevel.wisecoding.es/blog/cpcdroid---2011-03-02]&lt;br /&gt;
|-&lt;br /&gt;
| [[CPCemu|CPCemu]] &lt;br /&gt;
| 2.0&lt;br /&gt;
| Jan 7, 2021&lt;br /&gt;
| [[CPC old generation|CPC range]]&lt;br /&gt;
| Freeware&lt;br /&gt;
| [http://www.cpc-emu.org/]&lt;br /&gt;
|-&lt;br /&gt;
| [[Droid-CPC]]&lt;br /&gt;
| 1.1.01&lt;br /&gt;
| Dec 15, 2016&lt;br /&gt;
| [[CPC old generation|CPC range]]&lt;br /&gt;
| Commercial&lt;br /&gt;
| [http://play.google.com/store/apps/details?id=com.kokak.droidcpc]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== BlackBerry  ==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable sortable&amp;quot; style=&amp;quot;width:100%&amp;quot;&lt;br /&gt;
! Name&lt;br /&gt;
! Actual version&lt;br /&gt;
! Last release&lt;br /&gt;
! Emulated systems&lt;br /&gt;
! License&lt;br /&gt;
! Link&lt;br /&gt;
|-&lt;br /&gt;
| [[BB-CPC|BB-CPC]]&lt;br /&gt;
| 1.0.1.3&lt;br /&gt;
| Jul 15, 2013&lt;br /&gt;
| [[CPC old generation|CPC range]]&lt;br /&gt;
| Commercial&lt;br /&gt;
| [http://appworld.blackberry.com/webstore/content/30963891/]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== iOS  ==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable sortable&amp;quot; style=&amp;quot;width:100%&amp;quot;&lt;br /&gt;
! Name&lt;br /&gt;
! Actual version&lt;br /&gt;
! Last release&lt;br /&gt;
! Emulated systems&lt;br /&gt;
! License&lt;br /&gt;
! Link&lt;br /&gt;
|-&lt;br /&gt;
| [[CrocoDS]]&lt;br /&gt;
| 2.1&lt;br /&gt;
| Jun 21, 2013&lt;br /&gt;
| [[CPC old generation|CPC range]]&lt;br /&gt;
| Open source&lt;br /&gt;
| [http://github.com/redbug26/crocods]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Maemo  ==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable sortable&amp;quot; style=&amp;quot;width:100%&amp;quot;&lt;br /&gt;
! Name&lt;br /&gt;
! Actual version&lt;br /&gt;
! Last release&lt;br /&gt;
! Emulated systems&lt;br /&gt;
! License&lt;br /&gt;
! Link&lt;br /&gt;
|-&lt;br /&gt;
| [[CPCm]]&lt;br /&gt;
| 1.20-1&lt;br /&gt;
| Apr 27, 2010&lt;br /&gt;
| [[CPC old generation|CPC range]]&lt;br /&gt;
| Open source&lt;br /&gt;
| [http://maemo.org/downloads/product/Maemo5/cpcm/]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Palm OS  ==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable sortable&amp;quot; style=&amp;quot;width:100%&amp;quot;&lt;br /&gt;
! Name&lt;br /&gt;
! Actual version&lt;br /&gt;
! Last release&lt;br /&gt;
! Emulated systems&lt;br /&gt;
! License&lt;br /&gt;
! Link&lt;br /&gt;
|-&lt;br /&gt;
| [[CaPriCe for Palm OS|CaPriCe for Palm OS]]&lt;br /&gt;
| 2.8&lt;br /&gt;
| Jun 28, 2011&lt;br /&gt;
| [[CPC old generation|CPC range]]&lt;br /&gt;
| Open source&lt;br /&gt;
| [http://frederic.coste.pagesperso-orange.fr/cpc/cpc_en.htm]&lt;br /&gt;
|-&lt;br /&gt;
| [[CoPaCabana|CoPaCabana]]&lt;br /&gt;
| 0.75&lt;br /&gt;
| Dec 4, 2007&lt;br /&gt;
| [[CPC old generation|CPC range]]&lt;br /&gt;
| Freeware&lt;br /&gt;
| [http://copacabana.emuunlim.com/]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Pocket PC  ==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable sortable&amp;quot; style=&amp;quot;width:100%&amp;quot;&lt;br /&gt;
! Name&lt;br /&gt;
! Actual version&lt;br /&gt;
! Last release&lt;br /&gt;
! Emulated systems&lt;br /&gt;
! License&lt;br /&gt;
! Link&lt;br /&gt;
|-&lt;br /&gt;
| [[CaPriCe|PocketCaprice]]&lt;br /&gt;
| 0.9&lt;br /&gt;
| Aug 19, 2007&lt;br /&gt;
| [[CPC old generation|CPC range]]&lt;br /&gt;
| Freeware&lt;br /&gt;
| [http://www.clubic.com/telecharger-fiche44888-pocketcaprice.html]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Raspberry Pi ==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable sortable&amp;quot; style=&amp;quot;width:100%&amp;quot;&lt;br /&gt;
! Name&lt;br /&gt;
! Actual version&lt;br /&gt;
! Last release&lt;br /&gt;
! Emulated systems&lt;br /&gt;
! License&lt;br /&gt;
! Link&lt;br /&gt;
|-&lt;br /&gt;
| [[CPC4Rpi|#CPC4Rpi]]&lt;br /&gt;
| 1.1&lt;br /&gt;
| Dec 19, 2013&lt;br /&gt;
| [[CPC old generation|CPC range]]&lt;br /&gt;
| Open source&lt;br /&gt;
| [https://www.raspberrypi.org/forums/viewtopic.php?f=78&amp;amp;t=63820]&lt;br /&gt;
|-&lt;br /&gt;
| [[CapriceRPI|CapriceRPI]]&lt;br /&gt;
| 1.3&lt;br /&gt;
| Feb 28, 2016&lt;br /&gt;
| [[CPC old generation|CPC range]]&lt;br /&gt;
| Open source&lt;br /&gt;
| [https://github.com/KaosOverride/CapriceRPI]&lt;br /&gt;
|-&lt;br /&gt;
| [[ZEsarUX|ZEsarUX]]&lt;br /&gt;
| 9.0&lt;br /&gt;
| Aug 19, 2020&lt;br /&gt;
| [[CPC old generation|CPC range]], [[ZX Spectrum]], [[ZX80/81]], [[Jupiter ACE]], [[Sam Coupe]], [[Sinclair QL]], [[MSX 1]], [[ColecoVision]], [[SG-1000]]&lt;br /&gt;
| Open source&lt;br /&gt;
| [https://github.com/chernandezba/zesarux]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Symbian  ==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable sortable&amp;quot; style=&amp;quot;width:100%&amp;quot;&lt;br /&gt;
! Name&lt;br /&gt;
! Actual version&lt;br /&gt;
! Last release&lt;br /&gt;
! Emulated systems&lt;br /&gt;
! License&lt;br /&gt;
! Link&lt;br /&gt;
|-&lt;br /&gt;
| [[S60-CPC|S60-CPC]]&lt;br /&gt;
| 0.74&lt;br /&gt;
| Feb 21, 2006&lt;br /&gt;
| [[CPC old generation|CPC range]]&lt;br /&gt;
| Open source&lt;br /&gt;
| [http://kokak.free.fr/s60cpc.htm]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
= Hardware =&lt;br /&gt;
&lt;br /&gt;
*[[CPC TREX|CPC TREX]] TurboCPC core running on a terasIC T-Rex C1 FPGA board&lt;br /&gt;
*[[C-ONE|CPC-ONE]] TurboCPC core running on the C-One FPGA board&lt;br /&gt;
*[http://ralferoo.blogspot.fr/ CPC FPGA] CPC emulation running on a custom made FPGA board&lt;br /&gt;
*[[FPGAmstrad|FPGAmstrad]] CPC emulation running on a NEXYS2 FPGA board&lt;br /&gt;
*[http://github.com/mist-devel/mist-board/wiki MIST board] FPGA board implementing Amstrad CPC and various other 8-bit and 16-bit computers&lt;br /&gt;
&lt;br /&gt;
= Emulation Tools  =&lt;br /&gt;
&lt;br /&gt;
*[[ConvImgCPC|ConvImgCPC]] &lt;br /&gt;
*[[CPCDiskXP|CPCDiskXP]] &lt;br /&gt;
*[[CPCGamesCD-CPCLoader|CPCGamesCD-CPCLoader]] &lt;br /&gt;
*[[CPCTapeXP|CPCTapeXP]] &lt;br /&gt;
*[[CPRTools|CPRTools]] &lt;br /&gt;
*[[Dsktools|Dsktools]] &lt;br /&gt;
*[[ManageDSK|ManageDSK]] &lt;br /&gt;
*[[WriteDSK|WriteDSK]]&lt;br /&gt;
&lt;br /&gt;
= Emulator Detection =&lt;br /&gt;
&lt;br /&gt;
*[[Emulator_IDs|Emulator IDs]]&lt;br /&gt;
&lt;br /&gt;
[[Category:Emulator| ]]&lt;/div&gt;</summary>
		<author><name>Longshot</name></author>	</entry>

	<entry>
		<id>https://oldwiki.cpcwiki.eu/index.php?title=CRTC&amp;diff=109061</id>
		<title>CRTC</title>
		<link rel="alternate" type="text/html" href="https://oldwiki.cpcwiki.eu/index.php?title=CRTC&amp;diff=109061"/>
				<updated>2022-07-29T18:02:31Z</updated>
		
		<summary type="html">&lt;p&gt;Longshot: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;* ''This is an article about the &amp;quot;Cathode Ray Tube Controller&amp;quot; hardware unit of the Amstrad CPC. For the cpc scene member see [[ChaRleyTroniC]]''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
The '''CRTC''' (Cathode Ray Tube Controller) helps to generate the video signal of the Amstrad CPC.&lt;br /&gt;
&lt;br /&gt;
NOTE: This document describes the functionality in terms of the CPC with its separate CRTC and Gate-Array. The Plus has both integrated into the same IC, but could be considered to have two functional blocks, one for CRTC and one for Gate-Array. In this document the term 'Gate-Array' is used, but this also applies to the ASIC.&lt;br /&gt;
&lt;br /&gt;
== Overview ==&lt;br /&gt;
&lt;br /&gt;
The 6845 Cathode Ray Tube Controller (CRTC) is a programmable IC used to generate video displays. This IC is used in a variety of computers including the Amstrad CPC, Amstrad CPC+ and KC Compact. &lt;br /&gt;
&lt;br /&gt;
The CRTC was a common part available from many different manufacturers. During the life of the CPC, Amstrad sourced the CRTC from various manufacturers. &lt;br /&gt;
&lt;br /&gt;
All ICs used were based on the same design but have a different implementation. As a result they do not operate identically in all situations. This document highlights these differences. &lt;br /&gt;
&lt;br /&gt;
This table lists the known ICs used, with their part number, manufacturer and type number. &lt;br /&gt;
&lt;br /&gt;
{|{{Prettytable|width: 700px; font-size: 2em;}}&lt;br /&gt;
|''Part number''||''Manufacturer''||''Type number (note 3)''&lt;br /&gt;
|-&lt;br /&gt;
|HD6845S||Hitachi||0&lt;br /&gt;
|-&lt;br /&gt;
|UM6845||UMC||0&lt;br /&gt;
|-&lt;br /&gt;
|UM6845R||UMC||1&lt;br /&gt;
|-&lt;br /&gt;
|MC6845||Motorola||2&lt;br /&gt;
|-&lt;br /&gt;
|AMS40489||Amstrad||3 (note 1)&lt;br /&gt;
|-&lt;br /&gt;
|40226||Amstrad||4 (note 2)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
'''NOTES''' &lt;br /&gt;
&lt;br /&gt;
1. The CRTC functionality is integrated into the CPC+ ASIC. This type exists only in the CPC464+,CPC6128+ and GX4000. &lt;br /&gt;
&lt;br /&gt;
2. This type exists in &amp;quot;cost-down&amp;quot; CPC464 and CPC6128 systems. In the &amp;quot;cost-down&amp;quot; the CRTC functionality is integrated into a single ASIC IC. This ASIC is often refered to as the &amp;quot;Pre-ASIC&amp;quot; because it preceeded the CPC+ ASIC. The CRTC functionality of the Pre-ASIC is almost identical to the CRTC within the ASIC.&lt;br /&gt;
 &lt;br /&gt;
3. In the Amstrad community each 6845 implementation has been assigned a type number. This type identifies a group of implementations which operate in exactly the same way. &lt;br /&gt;
&lt;br /&gt;
As far as I know, the type number system was originally used by demo programmers. &lt;br /&gt;
&lt;br /&gt;
It is possible to detect the 6845 present using software methods, and this is done to: &lt;br /&gt;
&lt;br /&gt;
* warn that the software was not designed for the detected 6845 and may function incorrectly, &lt;br /&gt;
* to adapt the software so that it will run with the detected 6845 &lt;br /&gt;
* In most cases, the type of the detected 6845 is reported. &lt;br /&gt;
&lt;br /&gt;
4. As far as I know, the KC compact used HD6845R only.&lt;br /&gt;
&lt;br /&gt;
== Timings and relating with Z80 instructions count ==&lt;br /&gt;
&lt;br /&gt;
Some informations like : how many Z80 instructions can I fit within a scan line ? Within a screen ? Etc... See http://www.cpcwiki.eu/forum/programming/frame-flyback-and-interrupts/msg25106/#msg25106&lt;br /&gt;
(To be extracted/edited to conform to wiki good practices).&lt;br /&gt;
&lt;br /&gt;
==Programming==&lt;br /&gt;
&lt;br /&gt;
The 6845 is selected when bit 14 of the I/O port address is set to &amp;quot;0&amp;quot;. Bit 9 and 8 of the I/O port address define the function to access. The remaining bits can be any value, but it is adviseable to set these to &amp;quot;1&amp;quot; to avoid conflict with other devices in the system.&lt;br /&gt;
&lt;br /&gt;
The recommended I/O port addresses are&lt;br /&gt;
&lt;br /&gt;
{|{{Prettytable|width: 700px; font-size: 2em;}}&lt;br /&gt;
|''I/O port address''||''Function''||''Read/Write''&lt;br /&gt;
|-&lt;br /&gt;
|&amp;amp;BCxx||Select 6845 register||Write only&lt;br /&gt;
|-&lt;br /&gt;
|&amp;amp;BDxx||Write 6845 register data||Write only&lt;br /&gt;
|-&lt;br /&gt;
|&amp;amp;BExx||(note 1)||Read only&lt;br /&gt;
|-&lt;br /&gt;
|&amp;amp;BFxx||(note 1)||Read only&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
'''NOTE'''&lt;br /&gt;
&lt;br /&gt;
1. The function of these I/O ports is dependant on the CRTC type&lt;br /&gt;
 &lt;br /&gt;
2. If you perform an IN instruction to the select or write functions it will write data to the CRTC from the current data on the bus.&lt;br /&gt;
&lt;br /&gt;
==Addressing==&lt;br /&gt;
&lt;br /&gt;
The following table defines the generated memory address from the CRTC and Gate-Array signals. &lt;br /&gt;
&lt;br /&gt;
{|{{Prettytable|width: 700px; font-size: 2em;}}&lt;br /&gt;
|''Memory Address Signal''||''Signal source''||''Signal name''&lt;br /&gt;
|-&lt;br /&gt;
|A15||6845||MA13 &lt;br /&gt;
|-&lt;br /&gt;
|A14||6845||MA12&lt;br /&gt;
|-&lt;br /&gt;
|A13||6845||RA2 &lt;br /&gt;
|-&lt;br /&gt;
|A12||6845||RA1 &lt;br /&gt;
|-&lt;br /&gt;
|A11||6845||RA0 &lt;br /&gt;
|-&lt;br /&gt;
|A10||6845||MA9 &lt;br /&gt;
|-&lt;br /&gt;
|A9||6845||MA8 &lt;br /&gt;
|-&lt;br /&gt;
|A8||6845||MA7 &lt;br /&gt;
|-&lt;br /&gt;
|A7||6845||MA6 &lt;br /&gt;
|-&lt;br /&gt;
|A6||6845||MA5 &lt;br /&gt;
|-&lt;br /&gt;
|A5||6845||MA4 &lt;br /&gt;
|-&lt;br /&gt;
|A4||6845||MA3 &lt;br /&gt;
|-&lt;br /&gt;
|A3||6845||MA2 &lt;br /&gt;
|-&lt;br /&gt;
|A2||6845||MA1 &lt;br /&gt;
|-&lt;br /&gt;
|A1||6845||MA0&lt;br /&gt;
|-&lt;br /&gt;
|A0||Gate-Array||CCLK&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
CRTC generates the address, Gate-Array reads the data and converts it to pixels based on the current mode.&lt;br /&gt;
&lt;br /&gt;
== DISPTMG ==&lt;br /&gt;
&lt;br /&gt;
DISPTMG signal defines the border. When DISPTMG is &amp;quot;1&amp;quot; the border colour is output by the Gate-Array to the display. The DISPTMG can be forced using R8 (DISPTMG Skew) on type 0,3 and 4 or by setting R6=0 on type 1. It is not possible to force the DISPTMG on type 2 or 5.&lt;br /&gt;
&lt;br /&gt;
The border has higher priority than pixels but lower priority than the black colour output when HSYNC/VSYNC are active.&lt;br /&gt;
&lt;br /&gt;
== HSYNC and VSYNC ==&lt;br /&gt;
&lt;br /&gt;
On CPC, HSYNC and VSYNC from the CRTC are passed into the Gate-Array.&lt;br /&gt;
&lt;br /&gt;
When HSYNC is active Gate-Array outputs the palette colour black. If the HSYNC is set to 14 characters then black will be output for 14us.&lt;br /&gt;
&lt;br /&gt;
The HSYNC is modified before being sent to the monitor. It  happens 2us after the HSYNC from the CRTC and lasts 4us when HSYNC length is greater or equal to 6. &lt;br /&gt;
&lt;br /&gt;
If R2=46, and HSYNC width is 14 then monitor hsync starts at 48 and lasts until 51.&lt;br /&gt;
&lt;br /&gt;
On a CPC monitor, the HSYNC is rendered in &amp;quot;absolute black&amp;quot;. It is darker than the black output by the Gate-Array.&lt;br /&gt;
&lt;br /&gt;
The VSYNC is also modified before being sent to the monitor. It happens two lines* after the VSYNC from the CRTC and stay two lines (same cut rule if VSYNC is lower than 4). PAL (50Hz) does need two lines VSYNC_width, and 4us HSYNC_width.&lt;br /&gt;
&lt;br /&gt;
Using CRTC1, VSYNC width value 0 means a value of 16.&lt;br /&gt;
&lt;br /&gt;
== The 6845 Registers ==&lt;br /&gt;
&lt;br /&gt;
The Internal registers of the 6845 are:&lt;br /&gt;
&lt;br /&gt;
{|{{Prettytable|width: 700px; font-size: 2em;}}&lt;br /&gt;
|''Register Index''||''Register Name''||''Range''||''CPC Setting''||''Notes''&lt;br /&gt;
|-&lt;br /&gt;
|0||Horizontal Total||00000000||63||Width of the screen, in characters. Should always be 63 (64 characters). 1 character == 1μs.&lt;br /&gt;
|-&lt;br /&gt;
|1||Horizontal Displayed||00000000||40||Number of characters displayed. Once horizontal character count (HCC) matches this value, DISPTMG is set to 1.&lt;br /&gt;
|-&lt;br /&gt;
|2||Horizontal Sync Position||00000000||46||When to start the HSync signal.&lt;br /&gt;
|-&lt;br /&gt;
|3||Horizontal and Vertical Sync Widths||VVVVHHHH||128+14||HSync pulse width in characters (0 means 16 on some CRTC), should always be more than 8; VSync width in scan-lines. (0 means 16 on some CRTC. Not present on all CRTCs, fixed to 16 lines on these)&lt;br /&gt;
|-&lt;br /&gt;
|4||Vertical Total||x0000000||38||Height of the screen, in characters.&lt;br /&gt;
|-&lt;br /&gt;
|5||Vertical Total Adjust||xxx00000||0||Measured in scanlines, can be used for smooth vertical scrolling on CPC.&lt;br /&gt;
|-&lt;br /&gt;
|6||Vertical Displayed||x0000000||25||Height of displayed screen in characters. Once vertical character count (VCC) matches this value, DISPTMG is set to 1.&lt;br /&gt;
|-&lt;br /&gt;
|7||Vertical Sync position||x0000000||30||When to start the VSync signal, in characters.&lt;br /&gt;
|-&lt;br /&gt;
|8||Interlace and Skew||xxxxxx00||0||00: No interlace; 01: Interlace Sync Raster Scan Mode; 10: No Interlace; 11: Interlace Sync and Video Raster Scan Mode&lt;br /&gt;
|-&lt;br /&gt;
|9||Maximum Raster Address||xxx00000||7||Maximum scan line address on CPC can hold between 0 and 7, higher values' upper bits are ignored&lt;br /&gt;
|-&lt;br /&gt;
|10||Cursor Start Raster||xBP00000||0||Cursor not used on CPC. B = Blink On/Off; P = Blink Period Control (Slow/Fast). Sets first raster row of character that cursor is on to invert.&lt;br /&gt;
|-&lt;br /&gt;
|11||Cursor End Raster||xxx00000||0||Sets last raster row of character that cursor is on to invert&lt;br /&gt;
|-&lt;br /&gt;
|12||Display Start Address (High)||xx000000||48&lt;br /&gt;
|-&lt;br /&gt;
|13||Display Start Address (Low)||00000000||0||Allows you to offset the start of screen memory for hardware scrolling, and if using memory from address &amp;amp;0000 with the firmware.&lt;br /&gt;
|-&lt;br /&gt;
|14||Cursor Address (High)||xx000000||0&lt;br /&gt;
|-&lt;br /&gt;
|15||Cursor Address (Low)||00000000||0&lt;br /&gt;
|-&lt;br /&gt;
|16||Light Pen Address (High)||xx000000||||Read Only&lt;br /&gt;
|-&lt;br /&gt;
|17||Light Pen Address (Low)||00000000||||Read Only&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
registers 18-31 read as 0, on type 0 and 2.&lt;br /&gt;
registers 18-30 read as 0 on type1, register 31 reads as 0x0ff.&lt;br /&gt;
&lt;br /&gt;
Details about Reg. 12 and Reg. 13 specifically:&lt;br /&gt;
&lt;br /&gt;
  .------- REG 12 --------.   .------- REG 13 --------.&lt;br /&gt;
  |                       |   |                       |&lt;br /&gt;
   15 14 13 12 11 10 09 08     07 06 05 04 03 02 01 00&lt;br /&gt;
  .--.--.--.--.--.--.--.--.   .--.--.--.--.--.--.--.--.&lt;br /&gt;
  |X |X |  |  |  |  |  |  |   |  |  |  |  |  |  |  |  |&lt;br /&gt;
  '--'--'--'--'--'--'--'--'   '--'--'--'--'--'--'--'--'&lt;br /&gt;
        '--.--'--.--'---------------.-----------------'&lt;br /&gt;
           |     |                  |&lt;br /&gt;
           |     |                  '------&amp;gt; Offset for setting&lt;br /&gt;
           |     |                           videoram &lt;br /&gt;
           |     |                           (1024 positions)&lt;br /&gt;
           |     |                           Bits 0..9&lt;br /&gt;
           |     |&lt;br /&gt;
           |     '-------------------------&amp;gt; Video Buffer : note (1)&lt;br /&gt;
           |&lt;br /&gt;
           '-------------------------------&amp;gt; Video Page : note (2)&lt;br /&gt;
  note (1)                 note (2)&lt;br /&gt;
  .--.--.--------------.  .--.--.---------------.&lt;br /&gt;
  |11|10| Video Buffer |  |13|12|   Video Page  |&lt;br /&gt;
  |--|--|--------------|  |--|--|---------------|&lt;br /&gt;
  | 0| 0|     16Ko     |  | 0| 0|  0000 - 3FFF  |&lt;br /&gt;
  |--|--|--------------|  |--|--|---------------|&lt;br /&gt;
  | 0| 1|     16Ko     |  | 0| 1|  4000 - 7FFF  |&lt;br /&gt;
  |--|--|--------------|  |--|--|---------------|&lt;br /&gt;
  | 1| 0|     16Ko     |  | 1| 0|  8000 - BFFF  |&lt;br /&gt;
  |--|--|--------------|  |--|--|---------------|&lt;br /&gt;
  | 1| 1|     32Ko     |  | 1| 1|  C000 - FFFF  |&lt;br /&gt;
  '--'--'--------------'  '--'--'---------------'&lt;br /&gt;
&lt;br /&gt;
So, it's possible to use 32KB screen size (used for [[Programming:Overscan|overscan]]) by setting bits 11 and 10 both to 1 (of Register 12). Bits MA11 and MA10 of the address generated by the CRTC are not written on the address bus to access video memory; settings both bits to 1 is the only way to cause a carry to bit MA12 when address pass over the end of current video page to change the memory address to the next video page.&lt;br /&gt;
&lt;br /&gt;
== CRTC Differences ==&lt;br /&gt;
&lt;br /&gt;
In this section I will attempt to identify all the differences between each CRTC. &lt;br /&gt;
&lt;br /&gt;
The following tables list the functions that can be accessed for each type: &lt;br /&gt;
&lt;br /&gt;
Type 0&lt;br /&gt;
&lt;br /&gt;
{|{{Prettytable|width: 700px; font-size: 2em;}}&lt;br /&gt;
|''b1''||''b0''||''Function''||''Read/Write'' &lt;br /&gt;
|-&lt;br /&gt;
|0||0||Select internal 6845 register||Write Only &lt;br /&gt;
|-&lt;br /&gt;
|0||1||Write to selected internal 6845 register||Write Only &lt;br /&gt;
|-&lt;br /&gt;
|1||0||-||- &lt;br /&gt;
|-&lt;br /&gt;
|1||1||Read from selected internal 6845 register||Read only &lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Type 1&lt;br /&gt;
&lt;br /&gt;
{|{{Prettytable|width: 700px; font-size: 2em;}}&lt;br /&gt;
|''b1''||''b0''||''Function''||''Read/Write'' &lt;br /&gt;
|-&lt;br /&gt;
|0||0||Select internal 6845 register||Write Only &lt;br /&gt;
|-&lt;br /&gt;
|0||1||Write to selected internal 6845 register||Write Only &lt;br /&gt;
|-&lt;br /&gt;
|1||0||Read Status Register||Read Only &lt;br /&gt;
|-&lt;br /&gt;
|1||1||Read from selected internal 6845 register||Read only &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Type 2&lt;br /&gt;
&lt;br /&gt;
{|{{Prettytable|width: 700px; font-size: 2em;}}&lt;br /&gt;
|''b1''||''b0''||''Function''||''Read/Write'' &lt;br /&gt;
|-&lt;br /&gt;
|0||0||Select internal 6845 register||Write Only &lt;br /&gt;
|-&lt;br /&gt;
|0||1||Write to selected internal 6845 register||Write Only &lt;br /&gt;
|-&lt;br /&gt;
|1||0||-||- &lt;br /&gt;
|-&lt;br /&gt;
|1||1||Read from selected internal 6845 register||Read only &lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Type 3 and 4&lt;br /&gt;
&lt;br /&gt;
{|{{Prettytable|width: 700px; font-size: 2em;}}&lt;br /&gt;
|''b1''||''b0''||''Function''||''Read/Write'' &lt;br /&gt;
|-&lt;br /&gt;
|0||0||Select internal 6845 register||Write Only &lt;br /&gt;
|-&lt;br /&gt;
|0||1||Write to selected internal 6845 register||Write Only &lt;br /&gt;
|-&lt;br /&gt;
|1||0||Read from selected internal 6845 register||Read Only &lt;br /&gt;
|-&lt;br /&gt;
|1||1||Read from selected internal 6845 register||Read only &lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
It is not possible to read from all the internal registers, this table shows the read/write status of each register for each type: &lt;br /&gt;
&lt;br /&gt;
{|{{Prettytable|width: 700px; font-size: 2em;}}&lt;br /&gt;
|rowspan=2|''Register Index''||rowspan=2|''Register Name''||colspan=4|''Type'' &lt;br /&gt;
|-&lt;br /&gt;
|0||1||2||3||4&lt;br /&gt;
|-&lt;br /&gt;
|0||Horizontal Total||Write Only||Write Only||Write Only||(note 2)||(note 3) &lt;br /&gt;
|-&lt;br /&gt;
|1||Horizontal Displayed||Write Only||Write Only||Write Only||(note 2)||(note 3)&lt;br /&gt;
|-&lt;br /&gt;
|2||Horizontal Sync Position||Write Only||Write Only||Write Only||(note 2)||(note 3) &lt;br /&gt;
|-&lt;br /&gt;
|3||Horizontal and Vertical Sync Widths||Write Only||Write Only||Write Only||(note 2)||(note 3) &lt;br /&gt;
|-&lt;br /&gt;
|4||Vertical Total||Write Only||Write Only||Write Only||(note 2)||(note 3) &lt;br /&gt;
|-&lt;br /&gt;
|5||Vertical Total Adjust||Write Only||Write Only||Write Only||(note 2)||(note 3) &lt;br /&gt;
|-&lt;br /&gt;
|6||Vertical Displayed||Write Only||Write Only||Write Only||(note 2)||(note 3)&lt;br /&gt;
|-&lt;br /&gt;
|7||Vertical Sync position||Write Only||Write Only||Write Only||(note 2)||(note 3) &lt;br /&gt;
|-&lt;br /&gt;
|8||Interlace and Skew||Write Only||Write Only||Write Only||(note 2)||(note 3) &lt;br /&gt;
|-&lt;br /&gt;
|9||Maximum Raster Address||Write Only||Write Only||Write Only||(note 2)||(note 3) &lt;br /&gt;
|-&lt;br /&gt;
|10||Cursor Start Raster||Write Only||Write Only||Write Only||(note 2)||(note 3) &lt;br /&gt;
|-&lt;br /&gt;
|11||Cursor End Raster||Write Only||Write Only||Write Only||(note 2)||(note 3) &lt;br /&gt;
|-&lt;br /&gt;
|12||Display Start Address (High)||Read/Write||Write Only||Write Only||Read/Write (note 2)||(note 3) &lt;br /&gt;
|-&lt;br /&gt;
|13||Display Start Address (Low)||Read/Write||Write Only||Write Only||Read/Write (note 2)||(note 3) &lt;br /&gt;
|-&lt;br /&gt;
|14||Cursor Address (High)||Read/Write||Read/Write||Read/Write||Read/Write (note 2)||(note 3)&lt;br /&gt;
|-&lt;br /&gt;
|15||Cursor Address (Low)||Read/Write||Read/Write||Read/Write||Read/Write (note 2)||(note 3)&lt;br /&gt;
|-&lt;br /&gt;
|16||Light Pen Address (High)||Read Only||Read Only||Read Only||Read Only (note 2)||(note 3)&lt;br /&gt;
|-&lt;br /&gt;
|17||Light Pen Address (Low)||Read Only||Read Only||Read Only||Read Only (note 2)||(note 3)&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
'''Notes'''&lt;br /&gt;
&lt;br /&gt;
1. On type 0 and 1, if a Write Only register is read from, &amp;quot;0&amp;quot; is returned. &lt;br /&gt;
&lt;br /&gt;
2. See the document &amp;quot;Extra CPC Plus Hardware Information&amp;quot; for more details.&lt;br /&gt;
&lt;br /&gt;
3. CRTC type 4 is the same as CRTC type 3. The registers also repeat as they do on the type 3.&lt;br /&gt;
&lt;br /&gt;
== Horizontal and Vertical Sync (R3) ==&lt;br /&gt;
&lt;br /&gt;
UM6845:&lt;br /&gt;
&lt;br /&gt;
Bits 7..4 define Vertical Sync Width. If 0 is programmed this gives 16 lines of VSYNC.&lt;br /&gt;
Bits 3..0 define Horizontal Sync Width. If 0 is programmed no HSYNC is generated.&lt;br /&gt;
&lt;br /&gt;
UM6845R:&lt;br /&gt;
&lt;br /&gt;
Bits 7..4 are ignored. Vertical Sync is fixed at 16 lines.&lt;br /&gt;
Bits 3..0 define Horizontal Sync Width. If 0 is programmed no HSYNC is generated.&lt;br /&gt;
&lt;br /&gt;
MC6845:&lt;br /&gt;
&lt;br /&gt;
Bits 7..4 are ignored. Vertical Sync is fixed at 16 lines.&lt;br /&gt;
Bits 3..0 define Horizontal Sync Width. If 0 is programmed this gives a HSYNC width of 16.&lt;br /&gt;
&lt;br /&gt;
Pre-ASIC/ASIC:&lt;br /&gt;
&lt;br /&gt;
Bits 7..4 define Vertical Sync Width. If 0 is programmed this gives 16 lines of VSYNC.&lt;br /&gt;
Bits 3..0 define Horizontal Sync Width. If 0 is programmed this gives a HSYNC width of 16.&lt;br /&gt;
&lt;br /&gt;
== UM6845R and R31 ==&lt;br /&gt;
&lt;br /&gt;
R31 is described in the UM6845R documentation as &amp;quot;Dummy Register&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Its use is described in the documentation for the Rockwell R6545 in combination with R18, R19 and R8 and the Status Register.&lt;br /&gt;
&lt;br /&gt;
In the UM6845R it appears to have no effect. Reading and writing does nothing. Reading it returns 0x0ff.&lt;br /&gt;
&lt;br /&gt;
R31 doesn't exist on types 0,2,3.&lt;br /&gt;
&lt;br /&gt;
== UM6845R and R12/R13 ==&lt;br /&gt;
&lt;br /&gt;
The UM6845R differs to other CRTC in respect of R12/R13. &lt;br /&gt;
&lt;br /&gt;
When VCC=0, R12/R13 is re-read at the start of each line. R12/R13 can therefore be changed for each scanline when VCC=0. &lt;br /&gt;
&lt;br /&gt;
Just like other CRTCs when RC==(R9-1), the current MA is captured for the next char-line.&lt;br /&gt;
&lt;br /&gt;
In demos to make a display compatible with all CRTCs program R12/R13 when VCC!=0. This will then take effect at the next frame start.&lt;br /&gt;
&lt;br /&gt;
== UM6845R status register ==&lt;br /&gt;
&lt;br /&gt;
The UM6845R has a status register that can be read using port &amp;amp;BExx.&lt;br /&gt;
&lt;br /&gt;
Bit 6 is set to 1 if there is a strobe input to the /LPEN signal. It is cleared to 0 when either R17 or R16 (LPEN address) of the CRTC are read. It signals there is a valid LPEN input. On my CPC (arnoldemu) with UM6845R, it is triggered at power on, R17 and R16 have the values 0 when read.&lt;br /&gt;
&lt;br /&gt;
Bit 5 is set to 1 when CRTC is in &amp;quot;vertical blanking&amp;quot;. Vertical blanking is when the vertical border is active. i.e. VCC&amp;gt;=R6. &lt;br /&gt;
&lt;br /&gt;
It is cleared when the frame is started (VCC=0). It is not directly related to the DISPTMG output (used by the CPC to display the border colour) because that output is a combination of horizontal and vertical blanking.&lt;br /&gt;
This bit will be 0 when pixels are being displayed.&lt;br /&gt;
&lt;br /&gt;
All the other bits read as 0 and don't have any function.&lt;br /&gt;
&lt;br /&gt;
== Datasheets ==&lt;br /&gt;
&lt;br /&gt;
* [[Media:hd6845.hitachi.pdf|HD6845S (Hitachi) (aka type 0)]]&lt;br /&gt;
* [[Media:Um6845.umc.pdf|UM6845 (UMC)  (aka type 0)]]&lt;br /&gt;
* [[Media:Um6845r.umc.pdf|UM6845R (UMC)  (aka type 1)]]&lt;br /&gt;
* [[Media:Mc6845.motorola.pdf|MC6845 (Motorola) (aka type 2)]]&lt;br /&gt;
&lt;br /&gt;
* [[VHDL implementation of the 6845]]&lt;br /&gt;
&lt;br /&gt;
== Clones ==&lt;br /&gt;
* [CM607P   a Bulgarian clone made in Pravetz factory]&lt;br /&gt;
* [EF6845P  by Thomson Semiconductors]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Tools about CRTC ==&lt;br /&gt;
&lt;br /&gt;
*  [http://www.cpcwiki.eu/imgs/9/99/Elmar_Krieger-SPECIAL_EFFECTS.dsk  some BASIC tools to detect CRTC types 0-1-2 and show some effects - by [[Elmar Krieger]] ]     (DSK for Emulators)&lt;br /&gt;
&lt;br /&gt;
== Links ==&lt;br /&gt;
&lt;br /&gt;
* [http://en.wikipedia.org/wiki/6845 Wikipedia on the CRTC]&lt;br /&gt;
* [http://www.grimware.org/doku.php/documentations/devices/crtc CRTCs on grimware]&lt;br /&gt;
* [http://logonsystem.fr/down/ACCC1.2-EN.pdf   Amstrad Cpc Crtc Compendium]     Latest (2022!!) document containing  in-depth info about CRTC programming on CPC.&lt;br /&gt;
&lt;br /&gt;
==Related pages==&lt;br /&gt;
&lt;br /&gt;
*[[Gate Array]]&lt;br /&gt;
&lt;br /&gt;
*[[ASIC]]&lt;br /&gt;
&lt;br /&gt;
*[[Video modes]]&lt;br /&gt;
&lt;br /&gt;
*[[Synchronising with the CRTC and display]] : technic and details on the relationship between Gate Array and CRTC.&lt;br /&gt;
&lt;br /&gt;
[[Category:Hardware]] [[Category:CPC Internal Components]] [[Category:Programming]] [[Category:Datasheet]] [[Category:Graphic]]&lt;/div&gt;</summary>
		<author><name>Longshot</name></author>	</entry>

	<entry>
		<id>https://oldwiki.cpcwiki.eu/index.php?title=File:Booth2018_01137.jpg&amp;diff=101939</id>
		<title>File:Booth2018 01137.jpg</title>
		<link rel="alternate" type="text/html" href="https://oldwiki.cpcwiki.eu/index.php?title=File:Booth2018_01137.jpg&amp;diff=101939"/>
				<updated>2018-06-16T12:36:42Z</updated>
		
		<summary type="html">&lt;p&gt;Longshot: Longshot uploaded a new version of File:Booth2018 01137.jpg&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Legendaries [[Longshot]] and [[Overflow]] at [[Revision]] 2018, showing [[Logon System]] is somehat alive and well.&lt;/div&gt;</summary>
		<author><name>Longshot</name></author>	</entry>

	<entry>
		<id>https://oldwiki.cpcwiki.eu/index.php?title=File:Booth2018_01137.jpg&amp;diff=101938</id>
		<title>File:Booth2018 01137.jpg</title>
		<link rel="alternate" type="text/html" href="https://oldwiki.cpcwiki.eu/index.php?title=File:Booth2018_01137.jpg&amp;diff=101938"/>
				<updated>2018-06-16T12:35:25Z</updated>
		
		<summary type="html">&lt;p&gt;Longshot: Longshot uploaded a new version of File:Booth2018 01137.jpg&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Legendaries [[Longshot]] and [[Overflow]] at [[Revision]] 2018, showing [[Logon System]] is somehat alive and well.&lt;/div&gt;</summary>
		<author><name>Longshot</name></author>	</entry>

	<entry>
		<id>https://oldwiki.cpcwiki.eu/index.php?title=File:Booth2018_01137.jpg&amp;diff=101937</id>
		<title>File:Booth2018 01137.jpg</title>
		<link rel="alternate" type="text/html" href="https://oldwiki.cpcwiki.eu/index.php?title=File:Booth2018_01137.jpg&amp;diff=101937"/>
				<updated>2018-06-16T12:29:33Z</updated>
		
		<summary type="html">&lt;p&gt;Longshot: Longshot uploaded a new version of File:Booth2018 01137.jpg&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Legendaries [[Longshot]] and [[Overflow]] at [[Revision]] 2018, showing [[Logon System]] is somehat alive and well.&lt;/div&gt;</summary>
		<author><name>Longshot</name></author>	</entry>

	<entry>
		<id>https://oldwiki.cpcwiki.eu/index.php?title=Logon_System&amp;diff=101092</id>
		<title>Logon System</title>
		<link rel="alternate" type="text/html" href="https://oldwiki.cpcwiki.eu/index.php?title=Logon_System&amp;diff=101092"/>
				<updated>2018-03-04T00:10:18Z</updated>
		
		<summary type="html">&lt;p&gt;Longshot: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Image:LogonTeam1990.jpg|thumb|Logon System 1990 Amstrad Expo]]&lt;br /&gt;
[[Image:LogonSystem2006.jpg|thumb|Logon System. 22 Sept 2006]]&lt;br /&gt;
'''Logon System''' is a French demo group which is very famous due to really great demos and new techniques the coders at Logon use. While [[The Demo]] was for a very long time the best megademo ever released on the CPC, [[Overflow]]'s demo III was one of the most extreme hardware demo ever produced.&lt;br /&gt;
&lt;br /&gt;
== Members ==&lt;br /&gt;
* [[Digit]]&lt;br /&gt;
* [[Eros]]&lt;br /&gt;
* [[Fred Crazy]]&lt;br /&gt;
* [[Longshot]]&lt;br /&gt;
* [[Overflow]]&lt;br /&gt;
* [[Pict]]&lt;br /&gt;
* [[Slash]]&lt;br /&gt;
* [[Brad]]&lt;br /&gt;
* [[Naminu]]&lt;br /&gt;
* [[Rubi]]&lt;br /&gt;
&lt;br /&gt;
[[Category:Scene group]]&lt;/div&gt;</summary>
		<author><name>Longshot</name></author>	</entry>

	<entry>
		<id>https://oldwiki.cpcwiki.eu/index.php?title=Logon_System&amp;diff=101091</id>
		<title>Logon System</title>
		<link rel="alternate" type="text/html" href="https://oldwiki.cpcwiki.eu/index.php?title=Logon_System&amp;diff=101091"/>
				<updated>2018-03-04T00:09:00Z</updated>
		
		<summary type="html">&lt;p&gt;Longshot: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Image:LogonTeam1990.jpg|thumb|Logon System 1990 Amstrad Expo]]&lt;br /&gt;
[[Image:LogonSystem2006.jpg|thumb|Logon System. 22 Sept 2006]]&lt;br /&gt;
'''Logon System''' is a french demo group which is very famous due to really great demos and new techniques the coders at Logon used. While [[The Demo]] was for a very long time the best megademo ever released on the CPC, [[Overflow]]'s demo III was one of the most extreme hardware demo ever produced.&lt;br /&gt;
&lt;br /&gt;
== Members ==&lt;br /&gt;
* [[Digit]]&lt;br /&gt;
* [[Eros]]&lt;br /&gt;
* [[Fred Crazy]]&lt;br /&gt;
* [[Longshot]]&lt;br /&gt;
* [[Overflow]]&lt;br /&gt;
* [[Pict]]&lt;br /&gt;
* [[Slash]]&lt;br /&gt;
* [[Brad]]&lt;br /&gt;
* [[Naminu]]&lt;br /&gt;
* [[Rubi]]&lt;br /&gt;
&lt;br /&gt;
[[Category:Scene group]]&lt;/div&gt;</summary>
		<author><name>Longshot</name></author>	</entry>

	<entry>
		<id>https://oldwiki.cpcwiki.eu/index.php?title=AFC_Expo_1&amp;diff=101090</id>
		<title>AFC Expo 1</title>
		<link rel="alternate" type="text/html" href="https://oldwiki.cpcwiki.eu/index.php?title=AFC_Expo_1&amp;diff=101090"/>
				<updated>2018-03-04T00:04:16Z</updated>
		
		<summary type="html">&lt;p&gt;Longshot: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;'''AFC meeting 1''' was the first meeting of [[AFC]] association&lt;br /&gt;
Meeting was organised the 9.10th May 1992 near Paris&lt;br /&gt;
&lt;br /&gt;
== Participants ==&lt;br /&gt;
* [[ZALKO]]&lt;br /&gt;
* [[Gouss]]&lt;br /&gt;
* [[Chany]]&lt;br /&gt;
* [[TwoMag]]&lt;br /&gt;
* [[CJC]] (CCC)&lt;br /&gt;
* [[Steph]] (FREEWARE)&lt;br /&gt;
* [[LBC]](FANATIC)&lt;br /&gt;
* [[MOAH]] (ANEKHOU)&lt;br /&gt;
* [[Cobra]]&lt;br /&gt;
* [[UDOL]] (THE OTHER WORLD)&lt;br /&gt;
* [[Madram]] (THE OTHER WORLD)&lt;br /&gt;
* [[SYNDROME]]&lt;br /&gt;
* [[GREES]]&lt;br /&gt;
* [[MADE]] (DISC FULL)&lt;br /&gt;
* [[NEOFYT]]&lt;br /&gt;
* [[TOM&amp;amp;JERRY]]&lt;br /&gt;
* [[WILD AST SYSTEM]]&lt;br /&gt;
* [[ENO]] (AST SYSTEM)&lt;br /&gt;
* [[Cyril Houzé]] (KOD, SOS FANZINE)&lt;br /&gt;
* [[Cedric QUETIER]] (KOD)&lt;br /&gt;
* [[Fred Crazy]]&lt;br /&gt;
* [[Longshot]]&lt;br /&gt;
* [[Newsky]]&lt;br /&gt;
* [[Xor]]&lt;br /&gt;
* [[Niki]] (EUREKA)&lt;br /&gt;
&lt;br /&gt;
== Photos ==&lt;br /&gt;
&amp;lt;gallery caption=&amp;quot;Articles&amp;quot;&amp;gt;&lt;br /&gt;
Image:AFC0101.jpg&lt;br /&gt;
Image:AFC0102.jpg&lt;br /&gt;
Image:AFC0103.jpg&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Category:CPC events]]&lt;br /&gt;
[[Category:Stub]]&lt;/div&gt;</summary>
		<author><name>Longshot</name></author>	</entry>

	<entry>
		<id>https://oldwiki.cpcwiki.eu/index.php?title=AFC_Expo_1&amp;diff=101075</id>
		<title>AFC Expo 1</title>
		<link rel="alternate" type="text/html" href="https://oldwiki.cpcwiki.eu/index.php?title=AFC_Expo_1&amp;diff=101075"/>
				<updated>2018-03-03T21:34:17Z</updated>
		
		<summary type="html">&lt;p&gt;Longshot: /* Participants */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;'''AFC meeting 1''' was the first meeting of [[AFC]] association&lt;br /&gt;
Meeting was organised the 9.10th May 1992 near Paris&lt;br /&gt;
&lt;br /&gt;
== Participants ==&lt;br /&gt;
* [[Gouss]]&lt;br /&gt;
* [[Chany]]&lt;br /&gt;
* [[TwoMag]]&lt;br /&gt;
* [[CJC]] (CCC)&lt;br /&gt;
* [[Steph]] (FREEWARE)&lt;br /&gt;
* [[LBC]](FANATIC)&lt;br /&gt;
* [[MOAH]] (ANEKHOU)&lt;br /&gt;
* [[Cobra]]&lt;br /&gt;
* [[UDOL]] (THE OTHER WORLD)&lt;br /&gt;
* [[Madram]] (THE OTHER WORLD)&lt;br /&gt;
* [[SYNDROME]]&lt;br /&gt;
* [[GREES]]&lt;br /&gt;
* [[MADE]] (DISC FULL)&lt;br /&gt;
* [[NEOFYT]]&lt;br /&gt;
* [[TOM&amp;amp;JERRY]]&lt;br /&gt;
* [[WILD AST SYSTEM]]&lt;br /&gt;
* [[ENO]] (AST SYSTEM)&lt;br /&gt;
* [[Cyril Houzé]] (KOD, SOS FANZINE)&lt;br /&gt;
* [[Cedric QUETIER]] (KOD)&lt;br /&gt;
* [[Fred Crazy]]&lt;br /&gt;
* [[Longshot]]&lt;br /&gt;
* [[Newsky]]&lt;br /&gt;
* [[Xor]]&lt;br /&gt;
* [[Niki]] (EUREKA)&lt;br /&gt;
&lt;br /&gt;
== Photos ==&lt;br /&gt;
&amp;lt;gallery caption=&amp;quot;Articles&amp;quot;&amp;gt;&lt;br /&gt;
Image:AFC0101.jpg&lt;br /&gt;
Image:AFC0102.jpg&lt;br /&gt;
Image:AFC0103.jpg&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Category:CPC events]]&lt;br /&gt;
[[Category:Stub]]&lt;/div&gt;</summary>
		<author><name>Longshot</name></author>	</entry>

	<entry>
		<id>https://oldwiki.cpcwiki.eu/index.php?title=AFC_Expo_1&amp;diff=101074</id>
		<title>AFC Expo 1</title>
		<link rel="alternate" type="text/html" href="https://oldwiki.cpcwiki.eu/index.php?title=AFC_Expo_1&amp;diff=101074"/>
				<updated>2018-03-03T21:32:17Z</updated>
		
		<summary type="html">&lt;p&gt;Longshot: /* Participants */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;'''AFC meeting 1''' was the first meeting of [[AFC]] association&lt;br /&gt;
Meeting was organised the 9.10th May 1992 near Paris&lt;br /&gt;
&lt;br /&gt;
== Participants ==&lt;br /&gt;
* [[Gouss]]&lt;br /&gt;
* [[Chany]]&lt;br /&gt;
* [[TwoMag]]&lt;br /&gt;
* [[CJC]] (CCC)&lt;br /&gt;
* [[Steph]] (FREEWARE)&lt;br /&gt;
* [[LBC]](FANATIC)&lt;br /&gt;
* [[MOAH]] (ANEKHOU)&lt;br /&gt;
* [[Cobra]]&lt;br /&gt;
* [[UDOL]] (THE OTHER WORLD)&lt;br /&gt;
* [[MADRAM]] (THE OTHER WORLD)&lt;br /&gt;
* [[SYNDROME]]&lt;br /&gt;
* [[GREES]]&lt;br /&gt;
* [[MADE]] (DISC FULL)&lt;br /&gt;
* [[NEOFYT]]&lt;br /&gt;
* [[TOM&amp;amp;JERRY]]&lt;br /&gt;
* [[NEW SKY]]&lt;br /&gt;
* [[WILD AST SYSTEM]]&lt;br /&gt;
* [[ENO]] (AST SYSTEM)&lt;br /&gt;
* [[KOD]] (SOS FANZINE)&lt;br /&gt;
* [[Cedric QUETIER]] (KOD)&lt;br /&gt;
* [[Fred Crazy]]&lt;br /&gt;
* [[Longshot]]&lt;br /&gt;
* [[Madram]]&lt;br /&gt;
* [[Newsky]]&lt;br /&gt;
* [[Xor]]&lt;br /&gt;
&lt;br /&gt;
... to complete&lt;br /&gt;
&lt;br /&gt;
== Photos ==&lt;br /&gt;
&amp;lt;gallery caption=&amp;quot;Articles&amp;quot;&amp;gt;&lt;br /&gt;
Image:AFC0101.jpg&lt;br /&gt;
Image:AFC0102.jpg&lt;br /&gt;
Image:AFC0103.jpg&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Category:CPC events]]&lt;br /&gt;
[[Category:Stub]]&lt;/div&gt;</summary>
		<author><name>Longshot</name></author>	</entry>

	<entry>
		<id>https://oldwiki.cpcwiki.eu/index.php?title=Euromeeting_0&amp;diff=101073</id>
		<title>Euromeeting 0</title>
		<link rel="alternate" type="text/html" href="https://oldwiki.cpcwiki.eu/index.php?title=Euromeeting_0&amp;diff=101073"/>
				<updated>2018-03-03T21:24:57Z</updated>
		
		<summary type="html">&lt;p&gt;Longshot: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;14-16 April 1990&lt;br /&gt;
&lt;br /&gt;
This meeting was organised by [[Logon System]] in the Stains's town, 10 km at north of Paris.&lt;br /&gt;
Lot of people were there and it was the first time that the french cpc scene meet the german one. &lt;br /&gt;
&lt;br /&gt;
== Participants ==&lt;br /&gt;
* [[Cristal]]&lt;br /&gt;
* [[Digit]]&lt;br /&gt;
* [[Famous Cach]]&lt;br /&gt;
* [[Fred Crazy]]&lt;br /&gt;
* [[Longshot]]&lt;br /&gt;
* [[Naminu]]&lt;br /&gt;
* [[Pict]]&lt;br /&gt;
* [[Rubi]]&lt;br /&gt;
* [[Slash]]&lt;br /&gt;
* [[Syntax Error]]&lt;br /&gt;
* [[Thriller]]&lt;br /&gt;
* [[Xor]]&lt;br /&gt;
&lt;br /&gt;
More...&lt;br /&gt;
&lt;br /&gt;
[[Category:CPC events]]&lt;br /&gt;
[[Category:Stub]]&lt;/div&gt;</summary>
		<author><name>Longshot</name></author>	</entry>

	<entry>
		<id>https://oldwiki.cpcwiki.eu/index.php?title=Technical_documentation&amp;diff=24323</id>
		<title>Technical documentation</title>
		<link rel="alternate" type="text/html" href="https://oldwiki.cpcwiki.eu/index.php?title=Technical_documentation&amp;diff=24323"/>
				<updated>2008-06-30T22:50:02Z</updated>
		
		<summary type="html">&lt;p&gt;Longshot: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== BASIC / Firmware / CP/M ==&lt;br /&gt;
&lt;br /&gt;
* [[Technical information about Locomotive BASIC]]&lt;br /&gt;
&lt;br /&gt;
== Built-in connectors: pinout ==&lt;br /&gt;
&lt;br /&gt;
* [[Connector:2nd disc drive (CPC664, CPC6128, CPC6128+)|2nd disc drive (CPC664, CPC6128, CPC6128+)]]&lt;br /&gt;
* [[Connector:Analogue joystick (CPC Plus only)|Analogue joystick (CPC Plus only)]]&lt;br /&gt;
* [[Connector:Aux socket (CPC Plus only)|Aux socket (CPC Plus only)]]&lt;br /&gt;
* [[Connector:Cassette recorder|Cassette recorder]]&lt;br /&gt;
* [[Connector:Digital joystick|Digital joystick]]&lt;br /&gt;
* [[Connector:Expansion port|Expansion port]]&lt;br /&gt;
* [[Connector:Floppy|Floppy]]&lt;br /&gt;
* [[Connector:Monitor|Monitor]]&lt;br /&gt;
* [[Connector:Printer port|Printer port]]&lt;br /&gt;
* [[Connector:Stereo sound|Stereo sound]]&lt;br /&gt;
* [[Connector:Tape|Tape]]&lt;br /&gt;
&lt;br /&gt;
== Hardware extensions ==&lt;br /&gt;
&lt;br /&gt;
* [[Programming:CPC Booster|CPC Booster]]&lt;br /&gt;
* [[Programming:SYMBiFACE II|SYMBiFACE II]]&lt;br /&gt;
&lt;br /&gt;
== How to's ==&lt;br /&gt;
&lt;br /&gt;
* [[Changing the drive belt]]&lt;br /&gt;
* [[A guide to running software on a real Amstrad CPC/CPC Plus computer|A Guide to running software on a real CPC!]]&lt;br /&gt;
* [[Modify PC floppy drives|Modify PC floppy drives to work on a CPC]]&lt;br /&gt;
* [[Transfering Alkatraz protected tapes and most games!]]&lt;br /&gt;
* [[Willem Programmer]] - how to program eproms using the Willem eprom programmer.&lt;br /&gt;
* [[Guide on how to connect a 3.5&amp;quot; drive to a CPC6128/664]]&lt;br /&gt;
&lt;br /&gt;
== Internal components ==&lt;br /&gt;
&lt;br /&gt;
* [[8255]] - PIO - I/O controller&lt;br /&gt;
* [[Arnold V specs|Arnold_V_specs]] - Arnold V (CPC+) Technical Specification&lt;br /&gt;
* [[AY-3-8912]] - Sound chip / keyboard controller&lt;br /&gt;
* [[Cassette data information]] - Information about the cassette storage system&lt;br /&gt;
* [[CRTC]] - Video chip&lt;br /&gt;
* [[Gate Array]] - Custom chip (frequency generation, colors, bank switching)&lt;br /&gt;
* [[I/O Port Summary]] - map of all known I/O ports of the CPC&lt;br /&gt;
* [[Power Supply for CPC and CPC plus]]&lt;br /&gt;
* [[Serial interface]] - how to use the DART and 8253 chips of an Amstrad-compatible serial interface&lt;br /&gt;
&lt;br /&gt;
== Service Manuals ==&lt;br /&gt;
&lt;br /&gt;
* [http://www.cpcwiki.eu/manuals/Amstrad%20CPC%20464%20Service%20Manual.en.rar Amstrad CPC 464 Service Manual]&lt;br /&gt;
* [http://www.cpcwiki.eu/manuals/Amstrad%20CPC%20664%20Service%20Manual.en.rar Amstrad CPC 664 Service Manual]&lt;br /&gt;
* [http://www.cpcwiki.eu/manuals/Amstrad%20CPC%206128%20Service%20Manual.en.rar Amstrad CPC 6128 Service Manual]&lt;br /&gt;
* [http://www.cpcwiki.eu/manuals/DDI-1%20FD-1%20Service%20Manual.en.rar Amstrad DDI-1 FD-1 Service Manual]&lt;br /&gt;
* [http://www.cpcwiki.eu/manuals/Amstrad%20PCW%208256-8512%20Service%20Manual.en.rar Amstrad PCW 8256-8512 Service Manual]&lt;br /&gt;
* [http://www.cpcwiki.eu/manuals/CPC464-6128-GT65-CTM644-MP3-CT11%20Amendment%20Service%20Manual.en.rar Amstrad CPC464-6128-GT65-CTM644-MP3-CT11 Amendment Service Manual]&lt;br /&gt;
* [http://logon.system.free.fr/down/Service%20Manual%20Amstrad%20Plus.zip Amstrad 464PLUS-6128PLUS-GX4000-MM12-CM14 Service Manual]&lt;br /&gt;
&lt;br /&gt;
== Specifications ==&lt;br /&gt;
&lt;br /&gt;
* [[Disc format|Disc formats]]&lt;br /&gt;
* [[List of file formats]]&lt;br /&gt;
* [[Format:SGX (SymbOS graphic files)|SGX (SymbOS graphic files)]]&lt;br /&gt;
* [[Format:VID (SymbOS video files)|VID (SymbOS video files)]]&lt;br /&gt;
&lt;br /&gt;
[[Category:Hardware]] [[Category:Manual]]&lt;/div&gt;</summary>
		<author><name>Longshot</name></author>	</entry>

	<entry>
		<id>https://oldwiki.cpcwiki.eu/index.php?title=Demogroups&amp;diff=24322</id>
		<title>Demogroups</title>
		<link rel="alternate" type="text/html" href="https://oldwiki.cpcwiki.eu/index.php?title=Demogroups&amp;diff=24322"/>
				<updated>2008-06-30T22:43:15Z</updated>
		
		<summary type="html">&lt;p&gt;Longshot: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;''For an overview of the CPC scene members, you can have a look at the''&lt;br /&gt;
&lt;br /&gt;
* [[CPC scene members|List of CPC scene members]]&lt;br /&gt;
* [http://www.cpcwiki.eu/index.php/Category:CPC_scene_members Category of CPC scene members]&lt;br /&gt;
&lt;br /&gt;
''You can also check the [http://www.cpcwiki.eu/index.php/Category:Demos Demos category] for productions/releases.''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;This is a list of the CPC scene '''demo groups''', which have been or are still active.&lt;br /&gt;
&lt;br /&gt;
== France ==&lt;br /&gt;
&lt;br /&gt;
* [[5KB]]&lt;br /&gt;
* [[Arkos]] ([http://www.arkos.cpcscene.com Arkos homepage])&lt;br /&gt;
* [[AST System]]&lt;br /&gt;
* [[BCAV]]&lt;br /&gt;
* [[Contrast]]&lt;br /&gt;
* [[Da Boxon Team]]&lt;br /&gt;
* [[Fefesse]]&lt;br /&gt;
* [[Futur's]] ([http://www.futurs.cpcscene.com Futur's homepage])&lt;br /&gt;
* [[GPA]] ([http://tj.gpa.free.fr Tom et Jerry's homepage])&lt;br /&gt;
* [[Hard'OS]] ([http://bdciron.cpcscene.com BDC Iron's homepage])&lt;br /&gt;
* [[Impact CPC]] ([http://impact.cpcscene.com Impact's forum])&lt;br /&gt;
* [[Kill or die]]&lt;br /&gt;
* [[Krad'os Crack'ers]]&lt;br /&gt;
* [[Logon System]] ([http://logon.system.free.fr Logon System's website])&lt;br /&gt;
* [[Malibu Crackers]]&lt;br /&gt;
* [[Mortel]]&lt;br /&gt;
* [[NPS]] (for Nul Part System) ([http://nulpartsystem.free.fr NPS homepage])&lt;br /&gt;
* [[Overlanders]]&lt;br /&gt;
* [[Paradox]]&lt;br /&gt;
* [[Rebels]]&lt;br /&gt;
* [[Revival]]&lt;br /&gt;
* [[Les Sucres en Morceaux]] ([http://scampin.chez-alice.fr/cpc Sucres en Morceaux homepage])&lt;br /&gt;
* [[Static]]&lt;br /&gt;
* [[The Addams Fanz]] ([http://tafcpc.free.fr TAF homepage])&lt;br /&gt;
&lt;br /&gt;
== Germany ==&lt;br /&gt;
&lt;br /&gt;
* [[ALC]]&lt;br /&gt;
* [[Armaxess]]&lt;br /&gt;
* [[BENG!]] (also international)&lt;br /&gt;
* [[Benediction]]&lt;br /&gt;
* [[Bollaware]]&lt;br /&gt;
* [[Cadjo Clan]]&lt;br /&gt;
* [[CBS]]&lt;br /&gt;
* [[CGS]]&lt;br /&gt;
* [[Commotion]]&lt;br /&gt;
* [[CRT]]&lt;br /&gt;
* [[Exodus]]&lt;br /&gt;
* [[Frankenteam]]&lt;br /&gt;
* [[FutureSoft]]&lt;br /&gt;
* [[GCS]]&lt;br /&gt;
* [[GOS]]&lt;br /&gt;
* [[HJT]]&lt;br /&gt;
* [[Inicron]]&lt;br /&gt;
* [[KKB]]&lt;br /&gt;
* [[Merlyn]]&lt;br /&gt;
* [[MOPS]]&lt;br /&gt;
* [[Necron]]&lt;br /&gt;
* [[PDW]]&lt;br /&gt;
* [[POW]]&lt;br /&gt;
* [[The Rejects]]&lt;br /&gt;
* [[SCUG]]&lt;br /&gt;
* [[SymbiosiS]]&lt;br /&gt;
* [[TCT]]&lt;br /&gt;
* [[TGS]]&lt;br /&gt;
* [[Wizcat]]&lt;br /&gt;
&lt;br /&gt;
== Greece ==&lt;br /&gt;
&lt;br /&gt;
* [[Dirty Minds]]&lt;br /&gt;
* [[Chaos]] [http://www.geocities.com/chaoscpc/ Chaos Homepage]&lt;br /&gt;
&lt;br /&gt;
== Ireland ==&lt;br /&gt;
&lt;br /&gt;
* [[The Firm]]&lt;br /&gt;
&lt;br /&gt;
== Netherlands ==&lt;br /&gt;
&lt;br /&gt;
* [[Dragonbreed Wetware]]&lt;br /&gt;
&lt;br /&gt;
== Spain ==&lt;br /&gt;
&lt;br /&gt;
* [[Zona Neutra]] ([http://www.zonan.org Zona Neutra website])&lt;br /&gt;
* [[ESP Soft]] ([http://www.amstrad.es/espsoft Esp Soft website])&lt;br /&gt;
&lt;br /&gt;
== Switzerland ==&lt;br /&gt;
&lt;br /&gt;
* [[UNiX]]&lt;br /&gt;
&lt;br /&gt;
== United Kingdom ==&lt;br /&gt;
&lt;br /&gt;
* [[Bitmap Vandals]]&lt;br /&gt;
* [[Conspiracy]]&lt;br /&gt;
* [[Discovery]]&lt;br /&gt;
* [[Donut System]]&lt;br /&gt;
* [[Lords of Justice]]&lt;br /&gt;
* [[STS]]&lt;br /&gt;
* [[Systeme D]]&lt;br /&gt;
* [[The Underground]]&lt;br /&gt;
* [[Wendos PDS/Wendos Interactive]]&lt;br /&gt;
&lt;br /&gt;
and many, many more...&lt;br /&gt;
&lt;br /&gt;
[[Category:Scene_group]]&lt;/div&gt;</summary>
		<author><name>Longshot</name></author>	</entry>

	<entry>
		<id>https://oldwiki.cpcwiki.eu/index.php?title=Demogroups&amp;diff=24321</id>
		<title>Demogroups</title>
		<link rel="alternate" type="text/html" href="https://oldwiki.cpcwiki.eu/index.php?title=Demogroups&amp;diff=24321"/>
				<updated>2008-06-30T22:39:50Z</updated>
		
		<summary type="html">&lt;p&gt;Longshot: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;''For an overview of the CPC scene members, you can have a look at the''&lt;br /&gt;
&lt;br /&gt;
* &amp;amp;lt;a href=&amp;quot;CPC scene members&amp;quot;&amp;amp;gt;List of CPC scene members&amp;amp;lt;/a&amp;amp;gt;&lt;br /&gt;
* &amp;amp;lt;a href=&amp;quot;http://www.cpcwiki.eu/index.php/Category:CPC_scene_members&amp;quot;&amp;amp;gt;Category of CPC scene members&amp;amp;lt;/a&amp;amp;gt;&lt;br /&gt;
&lt;br /&gt;
''You can also check the &amp;amp;lt;a href=&amp;quot;http://www.cpcwiki.eu/index.php/Category:Demos&amp;quot;&amp;amp;gt;Demos category&amp;amp;lt;/a&amp;amp;gt; for productions/releases.''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;This is a list of the CPC scene '''demo groups''', which have been or are still active.&lt;br /&gt;
&lt;br /&gt;
== France ==&lt;br /&gt;
&lt;br /&gt;
* &lt;br /&gt;
* [[5KB]]&amp;amp;nbsp;&lt;br /&gt;
* &lt;br /&gt;
* &lt;br /&gt;
* [[&lt;br /&gt;
* Arkos]] (&amp;amp;lt;a href=&amp;quot;http://www.arkos.cpcscene.com&amp;quot;&amp;amp;gt;Arkos homepage&amp;amp;lt;/a&amp;amp;gt;)&lt;br /&gt;
* &lt;br /&gt;
* [[&lt;br /&gt;
* AST System]]&lt;br /&gt;
* &lt;br /&gt;
* [[BCAV]]&lt;br /&gt;
* &lt;br /&gt;
* &amp;amp;lt;a href=&amp;quot;Contrast&amp;quot;&amp;amp;gt;Contrast&amp;amp;lt;/a&amp;amp;gt;&lt;br /&gt;
* &amp;amp;lt;a href=&amp;quot;Da Boxon Team&amp;quot;&amp;amp;gt;Da Boxon Team&amp;amp;lt;/a&amp;amp;gt;&lt;br /&gt;
* &amp;amp;lt;a href=&amp;quot;Fefesse&amp;quot;&amp;amp;gt;Fefesse&amp;amp;lt;/a&amp;amp;gt;&lt;br /&gt;
* &amp;amp;lt;a href=&amp;quot;Futur's&amp;quot;&amp;amp;gt;Futur's&amp;amp;lt;/a&amp;amp;gt; (&amp;amp;lt;a href=&amp;quot;http://www.futurs.cpcscene.com&amp;quot;&amp;amp;gt;Futur's homepage&amp;amp;lt;/a&amp;amp;gt;)&lt;br /&gt;
* &amp;amp;lt;a href=&amp;quot;GPA&amp;quot;&amp;amp;gt;GPA&amp;amp;lt;/a&amp;amp;gt; (&amp;amp;lt;a href=&amp;quot;http://tj.gpa.free.fr&amp;quot;&amp;amp;gt;Tom et Jerry's homepage&amp;amp;lt;/a&amp;amp;gt;)&lt;br /&gt;
* &amp;amp;lt;a href=&amp;quot;Hard'OS&amp;quot;&amp;amp;gt;Hard'OS&amp;amp;lt;/a&amp;amp;gt; (&amp;amp;lt;a href=&amp;quot;http://bdciron.cpcscene.com&amp;quot;&amp;amp;gt;BDC Iron's homepage&amp;amp;lt;/a&amp;amp;gt;)&lt;br /&gt;
* &amp;amp;lt;a href=&amp;quot;Impact CPC&amp;quot;&amp;amp;gt;Impact CPC&amp;amp;lt;/a&amp;amp;gt; (&amp;amp;lt;a href=&amp;quot;http://impact.cpcscene.com&amp;quot;&amp;amp;gt;Impact's forum&amp;amp;lt;/a&amp;amp;gt;)&lt;br /&gt;
* &amp;amp;lt;a href=&amp;quot;Kill or die&amp;quot;&amp;amp;gt;Kill or die&amp;amp;lt;/a&amp;amp;gt;&lt;br /&gt;
* &amp;amp;lt;a href=&amp;quot;Krad'os Crack'ers&amp;quot;&amp;amp;gt;Krad'os Crack'ers&amp;amp;lt;/a&amp;amp;gt;&lt;br /&gt;
* &amp;amp;lt;a href=&amp;quot;Logon System&amp;quot;&amp;amp;gt;Logon System&amp;amp;lt;/a&amp;amp;gt; (&amp;amp;lt;a href=&amp;quot;http://logon.system.free.fr&amp;quot;&amp;amp;gt;Logon System's homepage&amp;amp;lt;/a&amp;amp;gt;)&lt;br /&gt;
* &amp;amp;lt;a href=&amp;quot;Malibu Crackers&amp;quot;&amp;amp;gt;Malibu Crackers&amp;amp;lt;/a&amp;amp;gt;&lt;br /&gt;
* &amp;amp;lt;a href=&amp;quot;Mortel&amp;quot;&amp;amp;gt;Mortel&amp;amp;lt;/a&amp;amp;gt;&lt;br /&gt;
* &amp;amp;lt;a href=&amp;quot;NPS&amp;quot;&amp;amp;gt;NPS&amp;amp;lt;/a&amp;amp;gt; (for Nul Part System) (&amp;amp;lt;a href=&amp;quot;http://nulpartsystem.free.fr&amp;quot;&amp;amp;gt;NPS homepage&amp;amp;lt;/a&amp;amp;gt;)&lt;br /&gt;
* &amp;amp;lt;a href=&amp;quot;Overlanders&amp;quot;&amp;amp;gt;Overlanders&amp;amp;lt;/a&amp;amp;gt;&lt;br /&gt;
* &amp;amp;lt;a href=&amp;quot;Paradox&amp;quot;&amp;amp;gt;Paradox&amp;amp;lt;/a&amp;amp;gt;&lt;br /&gt;
* &amp;amp;lt;a href=&amp;quot;Rebels&amp;quot;&amp;amp;gt;Rebels&amp;amp;lt;/a&amp;amp;gt;&lt;br /&gt;
* &amp;amp;lt;a href=&amp;quot;Revival&amp;quot;&amp;amp;gt;Revival&amp;amp;lt;/a&amp;amp;gt;&lt;br /&gt;
* &amp;amp;lt;a href=&amp;quot;Les Sucres en Morceaux&amp;quot;&amp;amp;gt;Les Sucres en Morceaux&amp;amp;lt;/a&amp;amp;gt; (&amp;amp;lt;a href=&amp;quot;http://scampin.chez-alice.fr/cpc&amp;quot;&amp;amp;gt;Sucres en Morceaux homepage&amp;amp;lt;/a&amp;amp;gt;)&lt;br /&gt;
* &amp;amp;lt;a href=&amp;quot;Static&amp;quot;&amp;amp;gt;Static&amp;amp;lt;/a&amp;amp;gt;&lt;br /&gt;
* &amp;amp;lt;a href=&amp;quot;The Addams Fanz&amp;quot;&amp;amp;gt;The Addams Fanz&amp;amp;lt;/a&amp;amp;gt; (&amp;amp;lt;a href=&amp;quot;http://tafcpc.free.fr&amp;quot;&amp;amp;gt;TAF homepage&amp;amp;lt;/a&amp;amp;gt;)&lt;br /&gt;
&lt;br /&gt;
== Germany ==&lt;br /&gt;
&lt;br /&gt;
* &amp;amp;lt;a href=&amp;quot;ALC&amp;quot;&amp;amp;gt;ALC&amp;amp;lt;/a&amp;amp;gt;&lt;br /&gt;
* &amp;amp;lt;a href=&amp;quot;Armaxess&amp;quot;&amp;amp;gt;Armaxess&amp;amp;lt;/a&amp;amp;gt;&lt;br /&gt;
* &amp;amp;lt;a href=&amp;quot;BENG!&amp;quot;&amp;amp;gt;BENG!&amp;amp;lt;/a&amp;amp;gt; (also international)&lt;br /&gt;
* &amp;amp;lt;a href=&amp;quot;Benediction&amp;quot;&amp;amp;gt;Benediction&amp;amp;lt;/a&amp;amp;gt;&lt;br /&gt;
* &amp;amp;lt;a href=&amp;quot;Bollaware&amp;quot;&amp;amp;gt;Bollaware&amp;amp;lt;/a&amp;amp;gt;&lt;br /&gt;
* &amp;amp;lt;a href=&amp;quot;Cadjo Clan&amp;quot;&amp;amp;gt;Cadjo Clan&amp;amp;lt;/a&amp;amp;gt;&lt;br /&gt;
* &amp;amp;lt;a href=&amp;quot;CBS&amp;quot;&amp;amp;gt;CBS&amp;amp;lt;/a&amp;amp;gt;&lt;br /&gt;
* &amp;amp;lt;a href=&amp;quot;CGS&amp;quot;&amp;amp;gt;CGS&amp;amp;lt;/a&amp;amp;gt;&lt;br /&gt;
* &amp;amp;lt;a href=&amp;quot;Commotion&amp;quot;&amp;amp;gt;Commotion&amp;amp;lt;/a&amp;amp;gt;&lt;br /&gt;
* &amp;amp;lt;a href=&amp;quot;CRT&amp;quot;&amp;amp;gt;CRT&amp;amp;lt;/a&amp;amp;gt;&lt;br /&gt;
* &amp;amp;lt;a href=&amp;quot;Exodus&amp;quot;&amp;amp;gt;Exodus&amp;amp;lt;/a&amp;amp;gt;&lt;br /&gt;
* &amp;amp;lt;a href=&amp;quot;Frankenteam&amp;quot;&amp;amp;gt;Frankenteam&amp;amp;lt;/a&amp;amp;gt;&lt;br /&gt;
* &amp;amp;lt;a href=&amp;quot;FutureSoft&amp;quot;&amp;amp;gt;FutureSoft&amp;amp;lt;/a&amp;amp;gt;&lt;br /&gt;
* &amp;amp;lt;a href=&amp;quot;GCS&amp;quot;&amp;amp;gt;GCS&amp;amp;lt;/a&amp;amp;gt;&lt;br /&gt;
* &amp;amp;lt;a href=&amp;quot;GOS&amp;quot;&amp;amp;gt;GOS&amp;amp;lt;/a&amp;amp;gt;&lt;br /&gt;
* &amp;amp;lt;a href=&amp;quot;HJT&amp;quot;&amp;amp;gt;HJT&amp;amp;lt;/a&amp;amp;gt;&lt;br /&gt;
* &amp;amp;lt;a href=&amp;quot;Inicron&amp;quot;&amp;amp;gt;Inicron&amp;amp;lt;/a&amp;amp;gt;&lt;br /&gt;
* &amp;amp;lt;a href=&amp;quot;KKB&amp;quot;&amp;amp;gt;KKB&amp;amp;lt;/a&amp;amp;gt;&lt;br /&gt;
* &amp;amp;lt;a href=&amp;quot;Merlyn&amp;quot;&amp;amp;gt;Merlyn&amp;amp;lt;/a&amp;amp;gt;&lt;br /&gt;
* &amp;amp;lt;a href=&amp;quot;MOPS&amp;quot;&amp;amp;gt;MOPS&amp;amp;lt;/a&amp;amp;gt;&lt;br /&gt;
* &amp;amp;lt;a href=&amp;quot;Necron&amp;quot;&amp;amp;gt;Necron&amp;amp;lt;/a&amp;amp;gt;&lt;br /&gt;
* &amp;amp;lt;a href=&amp;quot;PDW&amp;quot;&amp;amp;gt;PDW&amp;amp;lt;/a&amp;amp;gt;&lt;br /&gt;
* &amp;amp;lt;a href=&amp;quot;POW&amp;quot;&amp;amp;gt;POW&amp;amp;lt;/a&amp;amp;gt;&lt;br /&gt;
* &amp;amp;lt;a href=&amp;quot;The Rejects&amp;quot;&amp;amp;gt;The Rejects&amp;amp;lt;/a&amp;amp;gt;&lt;br /&gt;
* &amp;amp;lt;a href=&amp;quot;SCUG&amp;quot;&amp;amp;gt;SCUG&amp;amp;lt;/a&amp;amp;gt;&lt;br /&gt;
* &amp;amp;lt;a href=&amp;quot;SymbiosiS&amp;quot;&amp;amp;gt;SymbiosiS&amp;amp;lt;/a&amp;amp;gt;&lt;br /&gt;
* &amp;amp;lt;a href=&amp;quot;TCT&amp;quot;&amp;amp;gt;TCT&amp;amp;lt;/a&amp;amp;gt;&lt;br /&gt;
* &amp;amp;lt;a href=&amp;quot;TGS&amp;quot;&amp;amp;gt;TGS&amp;amp;lt;/a&amp;amp;gt;&lt;br /&gt;
* &amp;amp;lt;a href=&amp;quot;Wizcat&amp;quot;&amp;amp;gt;Wizcat&amp;amp;lt;/a&amp;amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Greece ==&lt;br /&gt;
&lt;br /&gt;
* &amp;amp;lt;a href=&amp;quot;Dirty Minds&amp;quot;&amp;amp;gt;Dirty Minds&amp;amp;lt;/a&amp;amp;gt;&lt;br /&gt;
* &amp;amp;lt;a href=&amp;quot;Chaos&amp;quot;&amp;amp;gt;Chaos&amp;amp;lt;/a&amp;amp;gt; &amp;amp;lt;a href=&amp;quot;http://www.geocities.com/chaoscpc/&amp;quot;&amp;amp;gt;Chaos Homepage&amp;amp;lt;/a&amp;amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Ireland ==&lt;br /&gt;
&lt;br /&gt;
* &amp;amp;lt;a href=&amp;quot;The Firm&amp;quot;&amp;amp;gt;The Firm&amp;amp;lt;/a&amp;amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Netherlands ==&lt;br /&gt;
&lt;br /&gt;
* &amp;amp;lt;a href=&amp;quot;Dragonbreed Wetware&amp;quot;&amp;amp;gt;Dragonbreed Wetware&amp;amp;lt;/a&amp;amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Spain ==&lt;br /&gt;
&lt;br /&gt;
* &amp;amp;lt;a href=&amp;quot;Zona Neutra&amp;quot;&amp;amp;gt;Zona Neutra&amp;amp;lt;/a&amp;amp;gt; (&amp;amp;lt;a href=&amp;quot;http://www.zonan.org&amp;quot;&amp;amp;gt;Zona Neutra website&amp;amp;lt;/a&amp;amp;gt;)&lt;br /&gt;
* &amp;amp;lt;a href=&amp;quot;ESP Soft&amp;quot;&amp;amp;gt;ESP Soft&amp;amp;lt;/a&amp;amp;gt; (&amp;amp;lt;a href=&amp;quot;http://www.amstrad.es/espsoft&amp;quot;&amp;amp;gt;Esp Soft website&amp;amp;lt;/a&amp;amp;gt;)&lt;br /&gt;
&lt;br /&gt;
== Switzerland ==&lt;br /&gt;
&lt;br /&gt;
* &amp;amp;lt;a href=&amp;quot;UNiX&amp;quot;&amp;amp;gt;UNiX&amp;amp;lt;/a&amp;amp;gt;&lt;br /&gt;
&lt;br /&gt;
== United Kingdom ==&lt;br /&gt;
&lt;br /&gt;
* &amp;amp;lt;a href=&amp;quot;Bitmap Vandals&amp;quot;&amp;amp;gt;Bitmap Vandals&amp;amp;lt;/a&amp;amp;gt;&lt;br /&gt;
* &amp;amp;lt;a href=&amp;quot;Conspiracy&amp;quot;&amp;amp;gt;Conspiracy&amp;amp;lt;/a&amp;amp;gt;&lt;br /&gt;
* &amp;amp;lt;a href=&amp;quot;Discovery&amp;quot;&amp;amp;gt;Discovery&amp;amp;lt;/a&amp;amp;gt;&lt;br /&gt;
* &amp;amp;lt;a href=&amp;quot;Donut System&amp;quot;&amp;amp;gt;Donut System&amp;amp;lt;/a&amp;amp;gt;&lt;br /&gt;
* &amp;amp;lt;a href=&amp;quot;Lords of Justice&amp;quot;&amp;amp;gt;Lords of Justice&amp;amp;lt;/a&amp;amp;gt;&lt;br /&gt;
* &amp;amp;lt;a href=&amp;quot;STS&amp;quot;&amp;amp;gt;STS&amp;amp;lt;/a&amp;amp;gt;&lt;br /&gt;
* &amp;amp;lt;a href=&amp;quot;Systeme D&amp;quot;&amp;amp;gt;Systeme D&amp;amp;lt;/a&amp;amp;gt;&lt;br /&gt;
* &amp;amp;lt;a href=&amp;quot;The Underground&amp;quot;&amp;amp;gt;The Underground&amp;amp;lt;/a&amp;amp;gt;&lt;br /&gt;
* &amp;amp;lt;a href=&amp;quot;Wendos PDS/Wendos Interactive&amp;quot;&amp;amp;gt;Wendos PDS/Wendos Interactive&amp;amp;lt;/a&amp;amp;gt;&lt;br /&gt;
&lt;br /&gt;
and many, many more...&lt;br /&gt;
&lt;br /&gt;
&amp;amp;lt;a href=&amp;quot;Category:Scene_group&amp;quot;&amp;amp;gt;Category:Scene_group&amp;amp;lt;/a&amp;amp;gt;&lt;/div&gt;</summary>
		<author><name>Longshot</name></author>	</entry>

	<entry>
		<id>https://oldwiki.cpcwiki.eu/index.php?title=Demogroups&amp;diff=24320</id>
		<title>Demogroups</title>
		<link rel="alternate" type="text/html" href="https://oldwiki.cpcwiki.eu/index.php?title=Demogroups&amp;diff=24320"/>
				<updated>2008-06-30T22:28:06Z</updated>
		
		<summary type="html">&lt;p&gt;Longshot: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;p&amp;gt;&amp;lt;i&amp;gt;For an overview of the CPC scene members, you can have a look at the&amp;lt;/i&amp;gt;&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;ul&amp;gt;&amp;lt;li&amp;gt; &amp;lt;a href=&amp;quot;CPC scene members&amp;quot;&amp;gt;List of CPC scene members&amp;lt;/a&amp;gt;&lt;br /&gt;
&amp;lt;/li&amp;gt;&amp;lt;li&amp;gt; &amp;lt;a href=&amp;quot;http://www.cpcwiki.eu/index.php/Category:CPC_scene_members&amp;quot;&amp;gt;Category of CPC scene members&amp;lt;/a&amp;gt;&lt;br /&gt;
&amp;lt;/li&amp;gt;&amp;lt;/ul&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;i&amp;gt;You can also check the &amp;lt;a href=&amp;quot;http://www.cpcwiki.eu/index.php/Category:Demos&amp;quot;&amp;gt;Demos category&amp;lt;/a&amp;gt; for productions/releases.&amp;lt;/i&amp;gt;&lt;br /&gt;
&amp;lt;/p&amp;gt;&amp;lt;p&amp;gt;&amp;lt;br /&amp;gt; This is a list of the CPC scene &amp;lt;b&amp;gt;demo groups&amp;lt;/b&amp;gt;, which have been or are still active.&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;h2&amp;gt; France &amp;lt;/h2&amp;gt;&lt;br /&gt;
&amp;lt;ul&amp;gt;&amp;lt;li&amp;gt; &amp;lt;a href=&amp;quot;5KB&amp;quot;&amp;gt;5KB&amp;lt;/a&amp;gt;&lt;br /&gt;
&amp;lt;/li&amp;gt;&amp;lt;li&amp;gt; &amp;lt;a href=&amp;quot;Arkos&amp;quot;&amp;gt;Arkos&amp;lt;/a&amp;gt; (&amp;lt;a href=&amp;quot;http://www.arkos.cpcscene.com&amp;quot;&amp;gt;Arkos homepage&amp;lt;/a&amp;gt;)&lt;br /&gt;
&amp;lt;/li&amp;gt;&amp;lt;li&amp;gt; &amp;lt;a href=&amp;quot;AST System&amp;quot;&amp;gt;AST System&amp;lt;/a&amp;gt;&lt;br /&gt;
&amp;lt;/li&amp;gt;&amp;lt;li&amp;gt; &amp;lt;a href=&amp;quot;BCAV&amp;quot;&amp;gt;BCAV&amp;lt;/a&amp;gt;&lt;br /&gt;
&amp;lt;/li&amp;gt;&amp;lt;li&amp;gt; &amp;lt;a href=&amp;quot;Contrast&amp;quot;&amp;gt;Contrast&amp;lt;/a&amp;gt;&lt;br /&gt;
&amp;lt;/li&amp;gt;&amp;lt;li&amp;gt; &amp;lt;a href=&amp;quot;Da Boxon Team&amp;quot;&amp;gt;Da Boxon Team&amp;lt;/a&amp;gt;&lt;br /&gt;
&amp;lt;/li&amp;gt;&amp;lt;li&amp;gt; &amp;lt;a href=&amp;quot;Fefesse&amp;quot;&amp;gt;Fefesse&amp;lt;/a&amp;gt;&lt;br /&gt;
&amp;lt;/li&amp;gt;&amp;lt;li&amp;gt; &amp;lt;a href=&amp;quot;Futur's&amp;quot;&amp;gt;Futur's&amp;lt;/a&amp;gt; (&amp;lt;a href=&amp;quot;http://www.futurs.cpcscene.com&amp;quot;&amp;gt;Futur's homepage&amp;lt;/a&amp;gt;)&lt;br /&gt;
&amp;lt;/li&amp;gt;&amp;lt;li&amp;gt; &amp;lt;a href=&amp;quot;GPA&amp;quot;&amp;gt;GPA&amp;lt;/a&amp;gt; (&amp;lt;a href=&amp;quot;http://tj.gpa.free.fr&amp;quot;&amp;gt;Tom et Jerry's homepage&amp;lt;/a&amp;gt;)&lt;br /&gt;
&amp;lt;/li&amp;gt;&amp;lt;li&amp;gt; &amp;lt;a href=&amp;quot;Hard'OS&amp;quot;&amp;gt;Hard'OS&amp;lt;/a&amp;gt; (&amp;lt;a href=&amp;quot;http://bdciron.cpcscene.com&amp;quot;&amp;gt;BDC Iron's homepage&amp;lt;/a&amp;gt;)&lt;br /&gt;
&amp;lt;/li&amp;gt;&amp;lt;li&amp;gt; &amp;lt;a href=&amp;quot;Impact CPC&amp;quot;&amp;gt;Impact CPC&amp;lt;/a&amp;gt; (&amp;lt;a href=&amp;quot;http://impact.cpcscene.com&amp;quot;&amp;gt;Impact's forum&amp;lt;/a&amp;gt;)&lt;br /&gt;
&amp;lt;/li&amp;gt;&amp;lt;li&amp;gt; &amp;lt;a href=&amp;quot;Kill or die&amp;quot;&amp;gt;Kill or die&amp;lt;/a&amp;gt;&lt;br /&gt;
&amp;lt;/li&amp;gt;&amp;lt;li&amp;gt; &amp;lt;a href=&amp;quot;Krad'os Crack'ers&amp;quot;&amp;gt;Krad'os Crack'ers&amp;lt;/a&amp;gt;&lt;br /&gt;
&amp;lt;/li&amp;gt;&amp;lt;li&amp;gt; &amp;lt;a href=&amp;quot;Logon System&amp;quot;&amp;gt;Logon System&amp;lt;/a&amp;gt; (&amp;lt;a href=&amp;quot;http://logon.system.free.fr&amp;quot;&amp;gt;Logon System's homepage&amp;lt;/a&amp;gt;)&lt;br /&gt;
&amp;lt;/li&amp;gt;&amp;lt;li&amp;gt; &amp;lt;a href=&amp;quot;Malibu Crackers&amp;quot;&amp;gt;Malibu Crackers&amp;lt;/a&amp;gt;&lt;br /&gt;
&amp;lt;/li&amp;gt;&amp;lt;li&amp;gt; &amp;lt;a href=&amp;quot;Mortel&amp;quot;&amp;gt;Mortel&amp;lt;/a&amp;gt;&lt;br /&gt;
&amp;lt;/li&amp;gt;&amp;lt;li&amp;gt; &amp;lt;a href=&amp;quot;NPS&amp;quot;&amp;gt;NPS&amp;lt;/a&amp;gt; (for Nul Part System) (&amp;lt;a href=&amp;quot;http://nulpartsystem.free.fr&amp;quot;&amp;gt;NPS homepage&amp;lt;/a&amp;gt;)&lt;br /&gt;
&amp;lt;/li&amp;gt;&amp;lt;li&amp;gt; &amp;lt;a href=&amp;quot;Overlanders&amp;quot;&amp;gt;Overlanders&amp;lt;/a&amp;gt;&lt;br /&gt;
&amp;lt;/li&amp;gt;&amp;lt;li&amp;gt; &amp;lt;a href=&amp;quot;Paradox&amp;quot;&amp;gt;Paradox&amp;lt;/a&amp;gt;&lt;br /&gt;
&amp;lt;/li&amp;gt;&amp;lt;li&amp;gt; &amp;lt;a href=&amp;quot;Rebels&amp;quot;&amp;gt;Rebels&amp;lt;/a&amp;gt;&lt;br /&gt;
&amp;lt;/li&amp;gt;&amp;lt;li&amp;gt; &amp;lt;a href=&amp;quot;Revival&amp;quot;&amp;gt;Revival&amp;lt;/a&amp;gt;&lt;br /&gt;
&amp;lt;/li&amp;gt;&amp;lt;li&amp;gt; &amp;lt;a href=&amp;quot;Les Sucres en Morceaux&amp;quot;&amp;gt;Les Sucres en Morceaux&amp;lt;/a&amp;gt; (&amp;lt;a href=&amp;quot;http://scampin.chez-alice.fr/cpc&amp;quot;&amp;gt;Sucres en Morceaux homepage&amp;lt;/a&amp;gt;)&lt;br /&gt;
&amp;lt;/li&amp;gt;&amp;lt;li&amp;gt; &amp;lt;a href=&amp;quot;Static&amp;quot;&amp;gt;Static&amp;lt;/a&amp;gt;&lt;br /&gt;
&amp;lt;/li&amp;gt;&amp;lt;li&amp;gt; &amp;lt;a href=&amp;quot;The Addams Fanz&amp;quot;&amp;gt;The Addams Fanz&amp;lt;/a&amp;gt; (&amp;lt;a href=&amp;quot;http://tafcpc.free.fr&amp;quot;&amp;gt;TAF homepage&amp;lt;/a&amp;gt;)&lt;br /&gt;
&amp;lt;/li&amp;gt;&amp;lt;/ul&amp;gt;&lt;br /&gt;
&amp;lt;h2&amp;gt; Germany &amp;lt;/h2&amp;gt;&lt;br /&gt;
&amp;lt;ul&amp;gt;&amp;lt;li&amp;gt; &amp;lt;a href=&amp;quot;ALC&amp;quot;&amp;gt;ALC&amp;lt;/a&amp;gt;&lt;br /&gt;
&amp;lt;/li&amp;gt;&amp;lt;li&amp;gt; &amp;lt;a href=&amp;quot;Armaxess&amp;quot;&amp;gt;Armaxess&amp;lt;/a&amp;gt;&lt;br /&gt;
&amp;lt;/li&amp;gt;&amp;lt;li&amp;gt; &amp;lt;a href=&amp;quot;BENG!&amp;quot;&amp;gt;BENG!&amp;lt;/a&amp;gt; (also international)&lt;br /&gt;
&amp;lt;/li&amp;gt;&amp;lt;li&amp;gt; &amp;lt;a href=&amp;quot;Benediction&amp;quot;&amp;gt;Benediction&amp;lt;/a&amp;gt;&lt;br /&gt;
&amp;lt;/li&amp;gt;&amp;lt;li&amp;gt; &amp;lt;a href=&amp;quot;Bollaware&amp;quot;&amp;gt;Bollaware&amp;lt;/a&amp;gt;&lt;br /&gt;
&amp;lt;/li&amp;gt;&amp;lt;li&amp;gt; &amp;lt;a href=&amp;quot;Cadjo Clan&amp;quot;&amp;gt;Cadjo Clan&amp;lt;/a&amp;gt;&lt;br /&gt;
&amp;lt;/li&amp;gt;&amp;lt;li&amp;gt; &amp;lt;a href=&amp;quot;CBS&amp;quot;&amp;gt;CBS&amp;lt;/a&amp;gt;&lt;br /&gt;
&amp;lt;/li&amp;gt;&amp;lt;li&amp;gt; &amp;lt;a href=&amp;quot;CGS&amp;quot;&amp;gt;CGS&amp;lt;/a&amp;gt;&lt;br /&gt;
&amp;lt;/li&amp;gt;&amp;lt;li&amp;gt; &amp;lt;a href=&amp;quot;Commotion&amp;quot;&amp;gt;Commotion&amp;lt;/a&amp;gt;&lt;br /&gt;
&amp;lt;/li&amp;gt;&amp;lt;li&amp;gt; &amp;lt;a href=&amp;quot;CRT&amp;quot;&amp;gt;CRT&amp;lt;/a&amp;gt;&lt;br /&gt;
&amp;lt;/li&amp;gt;&amp;lt;li&amp;gt; &amp;lt;a href=&amp;quot;Exodus&amp;quot;&amp;gt;Exodus&amp;lt;/a&amp;gt;&lt;br /&gt;
&amp;lt;/li&amp;gt;&amp;lt;li&amp;gt; &amp;lt;a href=&amp;quot;Frankenteam&amp;quot;&amp;gt;Frankenteam&amp;lt;/a&amp;gt;&lt;br /&gt;
&amp;lt;/li&amp;gt;&amp;lt;li&amp;gt; &amp;lt;a href=&amp;quot;FutureSoft&amp;quot;&amp;gt;FutureSoft&amp;lt;/a&amp;gt;&lt;br /&gt;
&amp;lt;/li&amp;gt;&amp;lt;li&amp;gt; &amp;lt;a href=&amp;quot;GCS&amp;quot;&amp;gt;GCS&amp;lt;/a&amp;gt;&lt;br /&gt;
&amp;lt;/li&amp;gt;&amp;lt;li&amp;gt; &amp;lt;a href=&amp;quot;GOS&amp;quot;&amp;gt;GOS&amp;lt;/a&amp;gt;&lt;br /&gt;
&amp;lt;/li&amp;gt;&amp;lt;li&amp;gt; &amp;lt;a href=&amp;quot;HJT&amp;quot;&amp;gt;HJT&amp;lt;/a&amp;gt;&lt;br /&gt;
&amp;lt;/li&amp;gt;&amp;lt;li&amp;gt; &amp;lt;a href=&amp;quot;Inicron&amp;quot;&amp;gt;Inicron&amp;lt;/a&amp;gt;&lt;br /&gt;
&amp;lt;/li&amp;gt;&amp;lt;li&amp;gt; &amp;lt;a href=&amp;quot;KKB&amp;quot;&amp;gt;KKB&amp;lt;/a&amp;gt;&lt;br /&gt;
&amp;lt;/li&amp;gt;&amp;lt;li&amp;gt; &amp;lt;a href=&amp;quot;Merlyn&amp;quot;&amp;gt;Merlyn&amp;lt;/a&amp;gt;&lt;br /&gt;
&amp;lt;/li&amp;gt;&amp;lt;li&amp;gt; &amp;lt;a href=&amp;quot;MOPS&amp;quot;&amp;gt;MOPS&amp;lt;/a&amp;gt;&lt;br /&gt;
&amp;lt;/li&amp;gt;&amp;lt;li&amp;gt; &amp;lt;a href=&amp;quot;Necron&amp;quot;&amp;gt;Necron&amp;lt;/a&amp;gt;&lt;br /&gt;
&amp;lt;/li&amp;gt;&amp;lt;li&amp;gt; &amp;lt;a href=&amp;quot;PDW&amp;quot;&amp;gt;PDW&amp;lt;/a&amp;gt;&lt;br /&gt;
&amp;lt;/li&amp;gt;&amp;lt;li&amp;gt; &amp;lt;a href=&amp;quot;POW&amp;quot;&amp;gt;POW&amp;lt;/a&amp;gt;&lt;br /&gt;
&amp;lt;/li&amp;gt;&amp;lt;li&amp;gt; &amp;lt;a href=&amp;quot;The Rejects&amp;quot;&amp;gt;The Rejects&amp;lt;/a&amp;gt;&lt;br /&gt;
&amp;lt;/li&amp;gt;&amp;lt;li&amp;gt; &amp;lt;a href=&amp;quot;SCUG&amp;quot;&amp;gt;SCUG&amp;lt;/a&amp;gt;&lt;br /&gt;
&amp;lt;/li&amp;gt;&amp;lt;li&amp;gt; &amp;lt;a href=&amp;quot;SymbiosiS&amp;quot;&amp;gt;SymbiosiS&amp;lt;/a&amp;gt;&lt;br /&gt;
&amp;lt;/li&amp;gt;&amp;lt;li&amp;gt; &amp;lt;a href=&amp;quot;TCT&amp;quot;&amp;gt;TCT&amp;lt;/a&amp;gt;&lt;br /&gt;
&amp;lt;/li&amp;gt;&amp;lt;li&amp;gt; &amp;lt;a href=&amp;quot;TGS&amp;quot;&amp;gt;TGS&amp;lt;/a&amp;gt;&lt;br /&gt;
&amp;lt;/li&amp;gt;&amp;lt;li&amp;gt; &amp;lt;a href=&amp;quot;Wizcat&amp;quot;&amp;gt;Wizcat&amp;lt;/a&amp;gt;&lt;br /&gt;
&amp;lt;/li&amp;gt;&amp;lt;/ul&amp;gt;&lt;br /&gt;
&amp;lt;h2&amp;gt; Greece &amp;lt;/h2&amp;gt;&lt;br /&gt;
&amp;lt;ul&amp;gt;&amp;lt;li&amp;gt; &amp;lt;a href=&amp;quot;Dirty Minds&amp;quot;&amp;gt;Dirty Minds&amp;lt;/a&amp;gt;&lt;br /&gt;
&amp;lt;/li&amp;gt;&amp;lt;li&amp;gt; &amp;lt;a href=&amp;quot;Chaos&amp;quot;&amp;gt;Chaos&amp;lt;/a&amp;gt; &amp;lt;a href=&amp;quot;http://www.geocities.com/chaoscpc/&amp;quot;&amp;gt;Chaos Homepage&amp;lt;/a&amp;gt;&lt;br /&gt;
&amp;lt;/li&amp;gt;&amp;lt;/ul&amp;gt;&lt;br /&gt;
&amp;lt;h2&amp;gt; Ireland &amp;lt;/h2&amp;gt;&lt;br /&gt;
&amp;lt;ul&amp;gt;&amp;lt;li&amp;gt; &amp;lt;a href=&amp;quot;The Firm&amp;quot;&amp;gt;The Firm&amp;lt;/a&amp;gt;&lt;br /&gt;
&amp;lt;/li&amp;gt;&amp;lt;/ul&amp;gt;&lt;br /&gt;
&amp;lt;h2&amp;gt; Netherlands &amp;lt;/h2&amp;gt;&lt;br /&gt;
&amp;lt;ul&amp;gt;&amp;lt;li&amp;gt; &amp;lt;a href=&amp;quot;Dragonbreed Wetware&amp;quot;&amp;gt;Dragonbreed Wetware&amp;lt;/a&amp;gt;&lt;br /&gt;
&amp;lt;/li&amp;gt;&amp;lt;/ul&amp;gt;&lt;br /&gt;
&amp;lt;h2&amp;gt; Spain &amp;lt;/h2&amp;gt;&lt;br /&gt;
&amp;lt;ul&amp;gt;&amp;lt;li&amp;gt; &amp;lt;a href=&amp;quot;Zona Neutra&amp;quot;&amp;gt;Zona Neutra&amp;lt;/a&amp;gt; (&amp;lt;a href=&amp;quot;http://www.zonan.org&amp;quot;&amp;gt;Zona Neutra website&amp;lt;/a&amp;gt;)&lt;br /&gt;
&amp;lt;/li&amp;gt;&amp;lt;li&amp;gt; &amp;lt;a href=&amp;quot;ESP Soft&amp;quot;&amp;gt;ESP Soft&amp;lt;/a&amp;gt; (&amp;lt;a href=&amp;quot;http://www.amstrad.es/espsoft&amp;quot;&amp;gt;Esp Soft website&amp;lt;/a&amp;gt;)&lt;br /&gt;
&amp;lt;/li&amp;gt;&amp;lt;/ul&amp;gt;&lt;br /&gt;
&amp;lt;h2&amp;gt; Switzerland &amp;lt;/h2&amp;gt;&lt;br /&gt;
&amp;lt;ul&amp;gt;&amp;lt;li&amp;gt; &amp;lt;a href=&amp;quot;UNiX&amp;quot;&amp;gt;UNiX&amp;lt;/a&amp;gt;&lt;br /&gt;
&amp;lt;/li&amp;gt;&amp;lt;/ul&amp;gt;&lt;br /&gt;
&amp;lt;h2&amp;gt; United Kingdom &amp;lt;/h2&amp;gt;&lt;br /&gt;
&amp;lt;ul&amp;gt;&amp;lt;li&amp;gt; &amp;lt;a href=&amp;quot;Bitmap Vandals&amp;quot;&amp;gt;Bitmap Vandals&amp;lt;/a&amp;gt;&lt;br /&gt;
&amp;lt;/li&amp;gt;&amp;lt;li&amp;gt; &amp;lt;a href=&amp;quot;Conspiracy&amp;quot;&amp;gt;Conspiracy&amp;lt;/a&amp;gt;&lt;br /&gt;
&amp;lt;/li&amp;gt;&amp;lt;li&amp;gt; &amp;lt;a href=&amp;quot;Discovery&amp;quot;&amp;gt;Discovery&amp;lt;/a&amp;gt;&lt;br /&gt;
&amp;lt;/li&amp;gt;&amp;lt;li&amp;gt; &amp;lt;a href=&amp;quot;Donut System&amp;quot;&amp;gt;Donut System&amp;lt;/a&amp;gt;&lt;br /&gt;
&amp;lt;/li&amp;gt;&amp;lt;li&amp;gt; &amp;lt;a href=&amp;quot;Lords of Justice&amp;quot;&amp;gt;Lords of Justice&amp;lt;/a&amp;gt;&lt;br /&gt;
&amp;lt;/li&amp;gt;&amp;lt;li&amp;gt; &amp;lt;a href=&amp;quot;STS&amp;quot;&amp;gt;STS&amp;lt;/a&amp;gt;&lt;br /&gt;
&amp;lt;/li&amp;gt;&amp;lt;li&amp;gt; &amp;lt;a href=&amp;quot;Systeme D&amp;quot;&amp;gt;Systeme D&amp;lt;/a&amp;gt;&lt;br /&gt;
&amp;lt;/li&amp;gt;&amp;lt;li&amp;gt; &amp;lt;a href=&amp;quot;The Underground&amp;quot;&amp;gt;The Underground&amp;lt;/a&amp;gt;&lt;br /&gt;
&amp;lt;/li&amp;gt;&amp;lt;li&amp;gt; &amp;lt;a href=&amp;quot;Wendos PDS/Wendos Interactive&amp;quot;&amp;gt;Wendos PDS/Wendos Interactive&amp;lt;/a&amp;gt;&lt;br /&gt;
&amp;lt;/li&amp;gt;&amp;lt;/ul&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;and many, many more...&lt;br /&gt;
&amp;lt;/p&amp;gt;&amp;lt;a href=&amp;quot;Category:Scene_group&amp;quot;&amp;gt;Category:Scene_group&amp;lt;/a&amp;gt;&lt;/div&gt;</summary>
		<author><name>Longshot</name></author>	</entry>

	<entry>
		<id>https://oldwiki.cpcwiki.eu/index.php?title=Zebigboss&amp;diff=21345</id>
		<title>Zebigboss</title>
		<link rel="alternate" type="text/html" href="https://oldwiki.cpcwiki.eu/index.php?title=Zebigboss&amp;diff=21345"/>
				<updated>2008-02-07T17:40:34Z</updated>
		
		<summary type="html">&lt;p&gt;Longshot: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;'''Zebigboss''' (Jean-Philippe Parmentier) was a graphist of the [[Krad'os Crack'ers]] Cpc Demo team. It was a famous graphist and he was working both for many Amiga and Cpc demogroups.&lt;br /&gt;
&lt;br /&gt;
== Releases ==&lt;br /&gt;
&lt;br /&gt;
* [[The Demo]]&lt;br /&gt;
* [[S&amp;amp;KOH]]&lt;br /&gt;
&lt;br /&gt;
== Groups ==&lt;br /&gt;
&lt;br /&gt;
* [[Krad'os Crack'ers]]&lt;br /&gt;
&lt;br /&gt;
[[Category:CPC_scene_members]]&lt;/div&gt;</summary>
		<author><name>Longshot</name></author>	</entry>

	<entry>
		<id>https://oldwiki.cpcwiki.eu/index.php?title=Zebigboss&amp;diff=21344</id>
		<title>Zebigboss</title>
		<link rel="alternate" type="text/html" href="https://oldwiki.cpcwiki.eu/index.php?title=Zebigboss&amp;diff=21344"/>
				<updated>2008-02-07T17:38:46Z</updated>
		
		<summary type="html">&lt;p&gt;Longshot: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;'''Zebigboss''' (Jean-Philippe Parmentier) was a graphist of the [[Krad'os Crack'ers]] Cpc Demo team. It was a famous graphist and he was working both for many Amiga and Cpc demogroups.&lt;br /&gt;
&lt;br /&gt;
== Releases ==&lt;br /&gt;
&lt;br /&gt;
* [[The Demo]]&lt;br /&gt;
* [[S&amp;amp;Koh]]&lt;br /&gt;
== Groups ==&lt;br /&gt;
&lt;br /&gt;
* [[Krad'os Crack'ers]]&lt;br /&gt;
&lt;br /&gt;
[[Category:CPC_scene_members]]&lt;/div&gt;</summary>
		<author><name>Longshot</name></author>	</entry>

	<entry>
		<id>https://oldwiki.cpcwiki.eu/index.php?title=Programming:Keyboard_scanning&amp;diff=20175</id>
		<title>Programming:Keyboard scanning</title>
		<link rel="alternate" type="text/html" href="https://oldwiki.cpcwiki.eu/index.php?title=Programming:Keyboard_scanning&amp;diff=20175"/>
				<updated>2007-11-27T09:07:02Z</updated>
		
		<summary type="html">&lt;p&gt;Longshot: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Hardware scancode table ==&lt;br /&gt;
{|{{Prettytable|width: 700px; font-size: 2em;}}&lt;br /&gt;
|'''Bit:&amp;lt;br&amp;gt;Line''' || '''7''' || '''6''' || '''5''' || '''4''' || '''3''' || '''2''' || '''1''' || '''0'''&lt;br /&gt;
|-&lt;br /&gt;
|'''&amp;amp;40''' || F Dot || ENTER || F3 || F6 || F9 || CURDOWN || CURRIGHT || CURUP&lt;br /&gt;
|-&lt;br /&gt;
|'''&amp;amp;41''' || F0 || F2 || F1 || F5 || F8 || F7 || COPY || CURLEFT&lt;br /&gt;
|-&lt;br /&gt;
|'''&amp;amp;42''' || CONTROL || \  || SHIFT || F4 || ] || RETURN || [ || CLR&lt;br /&gt;
|-&lt;br /&gt;
|'''&amp;amp;43''' || . || / || : || ; || P || @ || - || ^&lt;br /&gt;
|-&lt;br /&gt;
|'''&amp;amp;44''' || , || M || K || L || I || O || 9 || 0&lt;br /&gt;
|-&lt;br /&gt;
|'''&amp;amp;45''' || SPACE || N || J || H || Y || U || 7 || 8&lt;br /&gt;
|-&lt;br /&gt;
|'''&amp;amp;46''' || V || B || F || G || T || R || 5 || 6&lt;br /&gt;
|-&lt;br /&gt;
|'''&amp;amp;47''' || X || C || D || S || W || E || 3 || 4&lt;br /&gt;
|-&lt;br /&gt;
|'''&amp;amp;48''' || Z || CAPSLOCK || A || TAB || Q || ESC || 2 || 1&lt;br /&gt;
|-&lt;br /&gt;
|'''&amp;amp;49''' || DEL || - || - || - || - || - || - || -&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== One line scanning routine ==&lt;br /&gt;
&lt;br /&gt;
This is a routine which scans one line of the keyboard directly. It is approximately 8% faster then the firmware routine and doesn't enable interrupts.&lt;br /&gt;
&lt;br /&gt;
'''Input:''' A = ''line (&amp;amp;amp;40 - &amp;amp;amp;49)''&lt;br /&gt;
&lt;br /&gt;
'''Output:''' A = ''hardware keyboard value''&lt;br /&gt;
&lt;br /&gt;
'''Destroyed:''' BC&lt;br /&gt;
&amp;lt;pre&amp;gt;LD A,kbdline ; from 0 to 9 with bdir/bc1=01&lt;br /&gt;
LD BC,#F782 ; PPI port A out /C out &lt;br /&gt;
OUT (C),C &lt;br /&gt;
LD BC,#F40E ; Select Ay reg 14 on ppi port A &lt;br /&gt;
OUT (C),C &lt;br /&gt;
LD BC,#F6CO ; This value is an AY index (R14) &lt;br /&gt;
OUT (C),C &lt;br /&gt;
OUT (C),0 ; Validate!!&lt;br /&gt;
LD BC,#F792 ; PPI port A in/C out &lt;br /&gt;
OUT (C),C &lt;br /&gt;
DEC B &lt;br /&gt;
OUT (C),A ; Send KbdLine on reg 14 AY through ppi port A&lt;br /&gt;
LD B,#F4 ; Read ppi port A &lt;br /&gt;
IN A,(C) ; e.g. AY R14 (AY port A) &lt;br /&gt;
LD BC,#F782 ; PPI port A out / C out &lt;br /&gt;
OUT (C),C &lt;br /&gt;
DEC B ; Reset PPI Write &lt;br /&gt;
OUT (C),0&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Now check for the value from the table e.g. with''''bit x,A''''and a condition e.g.''''jp z,xxxx''''or''''call z,xxxx''''&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Please note:&lt;br /&gt;
&lt;br /&gt;
* Bit = 0: Key is pressed&lt;br /&gt;
* Bit = 1: Key is not pressed&lt;br /&gt;
&lt;br /&gt;
== Complete keyboard scanning routine ==&lt;br /&gt;
&lt;br /&gt;
This routine scans the complete keyboard and writes all key status bits in a map.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
keymap  ds 10  ;map with 10*8 = 80 key status bits (bit=0 key is pressed)&lt;br /&gt;
&lt;br /&gt;
keyscan di              ;1 ##%%## C P C   VERSION ##%%##&lt;br /&gt;
        ld hl,keymap    ;3&lt;br /&gt;
        ld bc,#f782     ;3&lt;br /&gt;
        out (c),c       ;4&lt;br /&gt;
        ld bc,#f40e     ;3&lt;br /&gt;
        ld e,b          ;1&lt;br /&gt;
        out (c),c       ;4&lt;br /&gt;
        ld bc,#f6c0     ;3&lt;br /&gt;
        ld d,b          ;1&lt;br /&gt;
        out (c),c       ;4&lt;br /&gt;
        ld c,0          ;2&lt;br /&gt;
        out (c),c       ;4&lt;br /&gt;
        ld bc,#f792     ;3&lt;br /&gt;
        out (c),c       ;4&lt;br /&gt;
        ld a,#40        ;2&lt;br /&gt;
        ld c,#4a        ;2 44&lt;br /&gt;
loop    ld b,d          ;1&lt;br /&gt;
        out (c),a       ;4 select line&lt;br /&gt;
        ld b,e          ;1&lt;br /&gt;
        ini             ;5 read bits and write into KEYMAP&lt;br /&gt;
        inc a           ;1&lt;br /&gt;
        cp c            ;1&lt;br /&gt;
        jr c,loop       ;2/3 9*16+1*15=159&lt;br /&gt;
        ld bc,#f782     ;3&lt;br /&gt;
        out (c),c       ;4&lt;br /&gt;
        ei              ;1 8 =211 microseconds&lt;br /&gt;
        ret&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Category:Programming]]&lt;/div&gt;</summary>
		<author><name>Longshot</name></author>	</entry>

	<entry>
		<id>https://oldwiki.cpcwiki.eu/index.php?title=B-ASIC&amp;diff=16774</id>
		<title>B-ASIC</title>
		<link rel="alternate" type="text/html" href="https://oldwiki.cpcwiki.eu/index.php?title=B-ASIC&amp;diff=16774"/>
				<updated>2007-06-19T07:57:28Z</updated>
		
		<summary type="html">&lt;p&gt;Longshot: Instructions for 3.4&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;'''B-Asic''' is a set of RSX commands allowing to use the Amstrad CPC Plus features from [[BASIC]]. It was written by [[Longshot]] of [[Logon System]].&lt;br /&gt;
&lt;br /&gt;
== Introduction ==&lt;br /&gt;
'''B-ASIC''' is a set of RSX instructions to manage the extra features of the '''CPC +'''&lt;br /&gt;
&lt;br /&gt;
RSX instruction signify that each instruction is prefixed by a special char : | on english keyboard and &amp;quot;ù&amp;quot; on french azerty keyboard&lt;br /&gt;
&lt;br /&gt;
Since release 3.0 B-ASIC runs only on CPC range with 128 Kb memory &lt;br /&gt;
&lt;br /&gt;
Main instructions can manage colours and sprites, providing an extra bank of '''128 sprites''' for a total of '''144 sprites''' (since version 3.4)&lt;br /&gt;
&lt;br /&gt;
'''B-ASIC doesn't take any byte of the CPC locomotive Basic memory.''' &lt;br /&gt;
(The RSX definition and code for locomative basic are not declared in main memory )&lt;br /&gt;
The whole interruption system and RSX managment is modified when B-Asic start. &lt;br /&gt;
&lt;br /&gt;
From a technical point of view, the code of the program BASIC using B-ASIC is copied in a bank, because one bank is always open for the system to store the BASIC code. &lt;br /&gt;
So, there are two video pages availables for the user. &lt;br /&gt;
&lt;br /&gt;
A set of new powerful instructions will come in future versions.&lt;br /&gt;
&lt;br /&gt;
== Historics ==&lt;br /&gt;
* V1.1 ??/04/1991 Published in Amstrad Cent pour Cent (A100%) magazine N°38 (may/june 1991) New instructions INKF, INKS, BORDERP, INKFRVB, INKSRVB, BORDERRVB&lt;br /&gt;
* V1.2 ??/05/1991 Published in A100% N°39 (july/aug 1991)New instructions  SPRON,SPROFF,SPRZOOM,SPRXY,SPRTDEF,SPRTON,SPRTOFF, SPRSWAP,SPRPLOT,SPRCOPY,SPRTURNX,SPRTURNY,SPRFILL&lt;br /&gt;
* V1.3 ??/08/1991 Published in A100% N°40 (sept/oct 1991)- Corrected bug with  MODE instruction with some roms- Corrected bug on prg  &amp;gt; 16k- Update instructions SPRTDEF, SPRTON, SPRTOFF- New instructions SPRTORAM, RAMTOSPR, SPRSAVE, SPRLOAD- New instructions RETARDX, RETARDY, MASQUE, SPLIT&lt;br /&gt;
* V1.4 ??/??/1992 Published in A100% N°42 ()- B-Asic runs in banks (without RSX managment).&lt;br /&gt;
* V2.1 ??/??/1992 - New temporary version with RSX system deviation&lt;br /&gt;
* V3.1 ??/??/1992 - 2nd vidéo page. Corrected little bugs.- New instructions POKEASIC, POKEVR, DEFORGXY, DEFORGSPR - New instructions SPRCATCH, INKCOPY,SPRLINK, SPRUNLINK, ERALINK&lt;br /&gt;
* V3.2 25/02/2006 - Corrected a bug in table calculation (interrupt function)- Corrected a bug in locomotive firmware (ei before real end interrupt)&lt;br /&gt;
* V3.3 27/02/2006 - Corrected bug : Basic code copied in banque 5 at B-Asic boot (it was a problem for progr bigger than 16 kb) since 3.1- New instruction SPRWHERE&lt;br /&gt;
* V3.4 24/05/2007 - Corrected bug in SPRWHERE (variable setting between 4000 and 7FFF)- Update instruction SPRCOPY (now accepting sprites number from 0 to 143). Sprites 0 to 15 are real sprites. Now there are 128 sprites instead of 64 in previous version :  64 sprites FAST and 64 sprites SLOW (sprites access for sprites 80 to 143 are slowest than FAST sprites access). These additionnal sprites does not take more space than with 64 in the previous release.- New instruction DOKE,address, 16bitsvalue- Removing instructions RAMTOSPR and SPRTORAM, which are now unuseful. (replaced by SPRCOPY)- New instruction SPRTSTEP,n1,…,nx to play the sprite-way step by step (user action).- New instruction DEFKBDSPR to link one or two super-sprites with keyboard (or joystick) keys (automatic or user activable).- Update instruction CATCH : New name SPRCATCH- New instruction SPRCOLL to manage (automatically or user-activable) collisions for up to 8 super-sprites.- Some optimisations&lt;br /&gt;
&lt;br /&gt;
== Starting B-Asic ==&lt;br /&gt;
To use B-Asic, it's very easy. You need only two things :&lt;br /&gt;
Get the file named '''B-ASIC.BIN'''&lt;br /&gt;
Insert as first line in your basic program the following line :&lt;br /&gt;
&lt;br /&gt;
'''10 IF PEEK(&amp;amp;BC0E)&amp;lt;&amp;gt;&amp;amp;CD THEN OUT &amp;amp;7F00,&amp;amp;C1 :LOAD &amp;quot;B-ASIC.BIN &amp;quot;,&amp;amp;C000 :CALL &amp;amp;C000'''&lt;br /&gt;
&lt;br /&gt;
== Instructions ==&lt;br /&gt;
----&lt;br /&gt;
=== Colours Instructions Set ===&lt;br /&gt;
----&lt;br /&gt;
'''INKF,pen,colour'''&lt;br /&gt;
* pen=[0..15] colour=[0..4095]&lt;br /&gt;
* Modify colour of a pen&lt;br /&gt;
* Example : INKF,0,2303&lt;br /&gt;
----&lt;br /&gt;
'''INKFRVB,pen,red,green,blue'''&lt;br /&gt;
* pen=[0..15] red=[0..15] green=[0..15] blue=[0..15]&lt;br /&gt;
* Modify colour for a pen using colour elementaries components&lt;br /&gt;
* Example : FOR I=0 TO 15:INKFRVB,0,I,0,0:NEXT I&lt;br /&gt;
----&lt;br /&gt;
'''BORDERP,colour'''&lt;br /&gt;
* colour=[0..4095]&lt;br /&gt;
* Modify border's colour.&lt;br /&gt;
* Example : BORDERP,543&lt;br /&gt;
----&lt;br /&gt;
'''BORDERRVB,red,green,blue'''&lt;br /&gt;
* red=[0..15] green=[0..15] blue=[0..15]&lt;br /&gt;
* Modify border colour using colour elementaries components&lt;br /&gt;
* Example : FOR I=0 TO 15:BORDERRVB,0,0,0,I:NEXT I&lt;br /&gt;
----&lt;br /&gt;
'''INKS,pen,colour'''&lt;br /&gt;
* pen=[1..15] colour=[0..4095]&lt;br /&gt;
* Modify colour of an hardware sprite pen&lt;br /&gt;
* Note : The pen 0 cannot be modified. It's the transparent colour.&lt;br /&gt;
* Example : INKS,1,3456&lt;br /&gt;
----&lt;br /&gt;
'''INKSRVB,pen,red,green,blue'''&lt;br /&gt;
* pen=[1..15] red=[0..15] green=[0..15] blue=[0..15]&lt;br /&gt;
* Modify colour for an hardware sprite pen using colour elementaries components&lt;br /&gt;
* Note : The pen 0 cannot be modified. It's the transparent colour.&lt;br /&gt;
* Example : FOR I=0 TO 15:INKFRVB,0,I,0,0:NEXT I&lt;br /&gt;
----&lt;br /&gt;
'''INKCOPY'''&lt;br /&gt;
* Copy the whole colour screen palette to sprite palette.&lt;br /&gt;
----&lt;br /&gt;
=== Sprites Instructions Set ===&lt;br /&gt;
----&lt;br /&gt;
'''SPROFF,SpriteNumber'''&lt;br /&gt;
* SpriteNumber=[0..15]&lt;br /&gt;
* Sprite display is disactivated for specified sprite.&lt;br /&gt;
* Example : SPROFF,3  &lt;br /&gt;
----&lt;br /&gt;
'''SPRON,SpriteNumber'''&lt;br /&gt;
* SpriteNumber=[0..15]&lt;br /&gt;
* Sprite display is activated for specified sprite.&lt;br /&gt;
* Example : SPRON,3  &lt;br /&gt;
----&lt;br /&gt;
'''SPRZOOM,SpriteNumber,XZoom,YZoom'''&lt;br /&gt;
* SpriteNumber=[0..15] XZoom=[0..3] YZoom=[0..3]&lt;br /&gt;
* Define sprite zoom for specified sprite.&lt;br /&gt;
* If XZoom or YZoom is zeroed, sprite is not displayed&lt;br /&gt;
* Zoom value of 1 is no magnify.&lt;br /&gt;
* Note : Sprite must be activated by SPRON instruction to be displayed on screen&lt;br /&gt;
* Example : SPRZOOM,2,2,1 define the sprite 2 magnification to 2x horiz. and 1x vertically&lt;br /&gt;
----&lt;br /&gt;
'''SPRXY,SpriteNumber,XPos,YPos'''&lt;br /&gt;
* SpriteNumber=[0..15] XPos=[-256..767] YZoom=[-256..255]&lt;br /&gt;
* Define sprite position on screen according a mode 2 definition&lt;br /&gt;
* Note : Sprite must be activated by SPRON instruction to be displayed on screen&lt;br /&gt;
* Example : SPRXY,2,100,80 define sprite 2 position at 100,80 coordinates&lt;br /&gt;
----&lt;br /&gt;
'''SPRTDEF,SpriteNumber,Address,DurationPer,WaitingPer'''&lt;br /&gt;
* SpriteNumber=[0..15] Address=[0..65535] DurationPer=[0..65535] WaitingPer=[0..65535]&lt;br /&gt;
* Periods are defined by period of 0,02 second (e.g. 50 = 1 second) &lt;br /&gt;
* Define a path for the specified sprite.&lt;br /&gt;
* The path is defined by screen positions, given by a set of x,y coordinates defined in memory.&lt;br /&gt;
* Each coordinate is defined on 2 bytes (4 bytes for a screen position) in the memory&lt;br /&gt;
* The coordinate must be stored on a little endian method, e.g. the less significant byte in first and the most significant byte in second position in memory. &lt;br /&gt;
* You can use the instruction DOKE to do that easily (example : |DOKE address, x : |DOKE address+2,y : address=address+4)&lt;br /&gt;
* The last x coordinate must take the value F0F0 (hexa) to indicate the path end definition (|DOKE address,&amp;amp;F0F0)&lt;br /&gt;
* DurationPer indicates the time while the sprite will run on the path (at the last position the path start again at the fist position). &lt;br /&gt;
* If DurationPer is zeroed, so the duration is infinite.&lt;br /&gt;
* WaitingPer indicate the start period which occurs when the path will be activated (see SPRTON and SPRTOFF instructions). Note : A same path can be used by one or more sprites. Example : SPRTDEF,3,&amp;amp;3000,0,100 to define for sprite 3 a path defined in &amp;amp;3000 with an infinite loop of the path after 2 seconds of start delay after SPRTON,3 instruction.&lt;br /&gt;
----&lt;br /&gt;
'''SPRTON,SprNb1,SprNb2,...,SprNbx'''&lt;br /&gt;
* SprNbx=[O..15]&lt;br /&gt;
* Start the path simultanously for the specified sprites.&lt;br /&gt;
* Note : An undefined path for the sprite may occur an erratic behaviour of the sprite started.&lt;br /&gt;
* Example : SPRTON,1,5,7  start the path for sprites 1, 5 and 7 simultaneously&lt;br /&gt;
----&lt;br /&gt;
'''SPRTOFF,SprNb1,SprNb2,...,SprNbx'''&lt;br /&gt;
* SprNbx=[0..15]&lt;br /&gt;
* Stop the path simultaneously for the specified sprites &lt;br /&gt;
* Example : SPRTOFF,1,7 stop the path for sprites 1 and 7 simultanously&lt;br /&gt;
----&lt;br /&gt;
'''SPRTSTEP,SprNb1,SprNb2,...,SprNbx'''&lt;br /&gt;
* SprNbx=[0..15] &lt;br /&gt;
* Execute the path step by step for the specified sprites. &lt;br /&gt;
* Note : An undefined path for the sprite may occur an erratic behaviour of the sprite started. &lt;br /&gt;
* Example : SPRTSTEP,1,5,7 plays one path step (defined with SPRTDEF) for sprites 1, 5 and 7 simultaneously &lt;br /&gt;
----&lt;br /&gt;
'''SPRSWAP,SpriteNumber1,SpriteNumber2'''&lt;br /&gt;
* SpriteNumberx=[0..15]&lt;br /&gt;
* Exchange the sprite content of two sprites.&lt;br /&gt;
* Note : If SpriteNumber1=SpriteNumber2 it results just a waste of time.&lt;br /&gt;
* Example : SPRSWAP,1,5 exchange the graphics data of sprites 1 and 5&lt;br /&gt;
----&lt;br /&gt;
'''SPRPLOT,SpriteNumber,XPos,YPos,SpritePen'''&lt;br /&gt;
* SpriteNumber=[0..15] XPos=[0..15] YPos=[0..15] SpritePen=[0..15]&lt;br /&gt;
* Plot a pixel in the specified sprite at specified coordinates&lt;br /&gt;
* Note : SpritePen=0 means the transparent pen for sprite&lt;br /&gt;
* Example : SPRPLOT,3,10,9,4 plot a pixel pen 4 at coordinates 10,9 of sprite 3&lt;br /&gt;
----&lt;br /&gt;
'''SPRCOPY,SpriteOrg,SpriteDst'''&lt;br /&gt;
* SpriteOrg=[0..143], SpriteDst=[0..143] &lt;br /&gt;
* Copy the content of SpriteOrg to SpriteDst. &lt;br /&gt;
	Sprites number	Definition&lt;br /&gt;
	0 to 15		Real sprites&lt;br /&gt;
	16 to 79	Ram Fast sprites&lt;br /&gt;
	80 to 143	Ram Slow sprites&lt;br /&gt;
* Example : SPRCOPY,1,81 copy the content of sprite 1 (asic) to sprite 81 (ram slow)&lt;br /&gt;
----&lt;br /&gt;
'''SPRTURNX,SpriteNumber'''&lt;br /&gt;
* SpriteNumber=[0..15]&lt;br /&gt;
* Flip the sprite specified on horizontal axis&lt;br /&gt;
* Example : SPRTURNX,1&lt;br /&gt;
----&lt;br /&gt;
'''SPRTURNY,SpriteNumber'''&lt;br /&gt;
* SpriteNumber=[0..15]&lt;br /&gt;
* Flip the sprite specified on vertical axis&lt;br /&gt;
* Example : SPRTURNY,1&lt;br /&gt;
----&lt;br /&gt;
'''SPRFILL,SpriteNumber,SpritePen'''&lt;br /&gt;
* SpriteNumber=[0..15] SpritePen=[0..15]&lt;br /&gt;
* Fill the specified sprite with the specified pen&lt;br /&gt;
* Note : SpritePen=0 means the transparent pen for sprite&lt;br /&gt;
* Example : SPRFILL,1,12 fill the sprite 1 with pen 12&lt;br /&gt;
----&lt;br /&gt;
'''SPRCATCH,SpriteNumber,XPos,YPos'''&lt;br /&gt;
* SpriteNumber=[0..15] XPos=[0..143] YPos=[0..183]&lt;br /&gt;
* Get a sprite from mode 0 screen at specified coordinates (coordinates top/left).&lt;br /&gt;
* Note : This instruction runs only in graphic mode 0&lt;br /&gt;
* Example : CATCH,3,120,100 catch the pixels from 120,100 to 135,115 in sprite 3&lt;br /&gt;
----&lt;br /&gt;
'''SPRWHERE,SpriteNumber,@varx%,@vary%'''&lt;br /&gt;
* SpriteNumber=[0..15] varx=Name of x variable vary=Name of y variable&lt;br /&gt;
* Get the x,y coordinates of the specified sprite&lt;br /&gt;
* Important note : varx and vary must be defined first like integer (declaration in basic with '%') and&lt;br /&gt;
* they must be given to the instruction &amp;quot;by address&amp;quot; ('@' before the variable name). The * declaration must&lt;br /&gt;
* be respected to avoid unpredictibles results.&lt;br /&gt;
* Example : 10 VARX%=0: VARY%=0 : SPRWHERE,1,@VARX%,@VARY%: PRINT VARX%,VARY%&lt;br /&gt;
----&lt;br /&gt;
'''SPRSAVE,[SpriteNumber,] BlocNumber, Filename'''&lt;br /&gt;
* SpriteNumber=[0..15] BlocNumber=[0..4] Filename=Name of file in Amsdos standard &lt;br /&gt;
* Save a sprite or a set of 32 sprites (defined as one Block) to disk &lt;br /&gt;
* B-Asic can store 128 sprites definitions more than the usal sprites contained in asic ram. &lt;br /&gt;
* These 128 sprites are organised as 4 sets of 32 sprites named &amp;quot;Block&amp;quot;.  Each block contains 16 fast sprites and 16 slow sprites &lt;br /&gt;
Block &amp;amp; sprites number	Fast Sprites	Slow Sprites&lt;br /&gt;
1 - 0 to 15		16 to 31	80 to 95&lt;br /&gt;
2 - 0 to 15		32 to 47	96 to 111&lt;br /&gt;
3 - 0 to 15		48 to 63	112 to 127&lt;br /&gt;
4 - 0 to 15		64 to 79	128 to 143&lt;br /&gt;
* Bloc 0 is used for the 16 &amp;quot;real&amp;quot; asic sprites. &lt;br /&gt;
* If  SpriteNumber is not precised in the instruction, so a complete block is saved &lt;br /&gt;
* If  SpriteNumber is precised, only two sprites (fast and the slow sprite associated) for the block is saved &lt;br /&gt;
* Example : SPRSAVE,3,2,&amp;quot;SPR3BLK1.BIN&amp;quot; save the sprite fast and slow number 3 of the Bloc 2 (e.g. sprite 35 and sprite 99) in the file named &amp;quot;SPR3BLK1.BIN&amp;quot; &lt;br /&gt;
* Example : SPRSAVE,0,&amp;quot;SPRASIC.BIN&amp;quot; save the content of block 0 (e.g. 16 asic sprites) &lt;br /&gt;
----&lt;br /&gt;
'''SPRLOAD,[SpriteNumber,] BlocNumber, Filename'''&lt;br /&gt;
* SpriteNumber=[0..15] BlocNumber=[0..4] Filename=Name of file in Amsdos standard &lt;br /&gt;
* Load a sprite or a set of 32 sprites (defined as one Block) from disk &lt;br /&gt;
* B-Asic can store 128 sprites definitions more than the usal sprite contained in asic ram. &lt;br /&gt;
* These 128 sprites are organised as 4 sets of 32 sprites named &amp;quot;Block&amp;quot;. &lt;br /&gt;
Block &amp;amp; sprites number	Fast Sprites	Slow Sprites&lt;br /&gt;
1 - 0 to 15		16 to 31	80 to 95&lt;br /&gt;
2 - 0 to 15		32 to 47	96 to 111&lt;br /&gt;
3 - 0 to 15		48 to 63	112 to 127&lt;br /&gt;
4 - 0 to 15		64 to 79	128 to 143&lt;br /&gt;
* Bloc 0 is used for the 16 &amp;quot;real&amp;quot; asic sprites. &lt;br /&gt;
* If  SpriteNumber is not precised in the instruction, so a complete block is loaded &lt;br /&gt;
* If  SpriteNumber is precised, only the specified sprite of the block is loaded &lt;br /&gt;
* Note : If the file specified has an invalid size, an error is displayed &lt;br /&gt;
* Example : SPRLOAD,3,2,&amp;quot;SPR3BLK1.BIN&amp;quot; load the fast and slow sprites 3 of the Bloc 2 (e.g. sprites 35 and 99) from the file &amp;quot;SPR3BLK1.BIN&amp;quot; &lt;br /&gt;
* Example : SPRLOAD,3,&amp;quot;RAAHHHHH.SPR&amp;quot; load the block 3 (e.g. sprites 48 to 63 and sprites 112 to 127) from file &amp;quot;RAAHHHHH.SPR&amp;quot; &lt;br /&gt;
----&lt;br /&gt;
'''SPRLINK,SpriteNumber1,SpriteNumber2,Xrel,Yrel'''&lt;br /&gt;
* SpriteNumberx=[0..15] XRel=[-256..767] YRel=[-256..255]&lt;br /&gt;
* Link a sprite (2) to another sprite (1) with a relative position.&lt;br /&gt;
* That means if sprite (1) is moved, then sprite (2) is moved too.&lt;br /&gt;
* So if sprite 1 is moved in X1,Y1 then the sprite 2 will be moved automatically in X1+Xrel,Y1+Yrel&lt;br /&gt;
* It's possible to link all the sprites in all combinations to create one or more &amp;quot;super sprites&amp;quot;&lt;br /&gt;
* Note : A sprite cannot be linked to itself.&lt;br /&gt;
* Example : SPRLINK,1,2,16,0 link sprite 2 to sprite 1 with a relative x position of 16 pixels&lt;br /&gt;
* Example : SPRLINK,2,5,0,16 link sprite 5 to sprite 2 with a relative y position of 16 pixels&lt;br /&gt;
* [ so move the sprite 1 signify to move sprite 2 and 5 ]&lt;br /&gt;
----&lt;br /&gt;
'''SPRUNLINK,SpriteNumber1,SpriteNumber2'''&lt;br /&gt;
* SpriteNumberx=[0..15]&lt;br /&gt;
* Unlink a sprite from anoter sprite.&lt;br /&gt;
* Example : SPRUNLINK,2,5 erase the link between sprite 2 and 5&lt;br /&gt;
----&lt;br /&gt;
'''ERALINK'''&lt;br /&gt;
* Erase all link&lt;br /&gt;
----&lt;br /&gt;
'''SPRCOLL,NumDef,SpriteNum1,DeltaX1,DeltaY1,SpriteNum2,DeltaX2,DeltaY2,@collision%, PixelPerfect'''&lt;br /&gt;
'''SPRCOLL, NoDef, 255'''&lt;br /&gt;
'''SPRCOLL'''&lt;br /&gt;
* Process the collision test between two sprites automatically or manually&lt;br /&gt;
* NumDef = [0..7] (8 collisions can be processed simultaneously) SpriteNum1=[0..15] &lt;br /&gt;
* DeltaXn=[0..255], DeltaYn=[0..255] : Number of pixels in mode 2 definition from sprite coordinate defining the zone to test collision. This method is useful to extend the collision to a super sprite or to restrict collision to only a part of a sprite or supersprite. &lt;br /&gt;
* PixelPerfect is not used actually&lt;br /&gt;
* @collision% : This variable take the value 1 when a collision is detected between 2 sprites. The user must set the value to 0 to reset the collision detection.&lt;br /&gt;
&lt;br /&gt;
'''VERY IMPORTANT''' : The variable collision must be defined like an integer (déclaration by initialisation with %), and the variable must be given to function by address (e.g. @ ou à (on french keyboard) before the variable name).&lt;br /&gt;
Example : collision%=0  used in function like @collision%&lt;br /&gt;
When SPRCOLL is used with all parameters, the collision process is automatic, and so independant of locomotive basic program. But it's possible to control manually each collision test using the instruction without parameters (at this time, the automatic mode is disactivated). If the user wants to cancel a collision process, he must use the instruction with 2 parameters  : SPRCOLL,NumDef,255 (This will help the cpu ;-)) &lt;br /&gt;
 &lt;br /&gt;
'''WARNING about SPRCOLL:'''&lt;br /&gt;
SPRCOLL use a locomotive basic variable given by address. And this address is stored by B-Asic when SPRCOLL is called with all parameters. So the user needs ABSOLUTLY keep in mind the two following situation :&lt;br /&gt;
* When SPRCOLL is used in automatic mode (e.g B-Asic store automatically the collision test result at each frame), you  must absolutly replace the instruction in manual mode (by using SPRCOLL without parameter) before to modify your basic program because the variable is stored and moved in the basic area.&lt;br /&gt;
* When you have just stopped your basic program, NEVER modify the program and do a GOTO through a SPRCOLL instruction used without parameters. (the SPRCOLL must be called before with all parameters to give to B-Asic the new address of the variable)&lt;br /&gt;
'''You must respect ABSOLUTLY these 2 rules to avoid a destruction of some part of your basic program. (I will solve the problem of first case later.''' I need to know when the locomotive basic interpreter is not running. Help appreciate)&lt;br /&gt;
----&lt;br /&gt;
'''DEFORGXY,SpriteNumber,XPos,YPos'''&lt;br /&gt;
* SpriteNumber=[0..15] XPos=[-256..767] YPos=[-256..255]&lt;br /&gt;
* Define absolute origin position of the specified sprite&lt;br /&gt;
* That means that real sprite position take care of this defined coordinates.&lt;br /&gt;
* Example : DEFORGXY,1,10,20:SPRXY,1,5,3 display sprite at 15,23&lt;br /&gt;
* Note : It's possible to define an origin position for a sprite following a path (see SPRTDEF)&lt;br /&gt;
* The default of origin at B-Asic reset is 0,0&lt;br /&gt;
----&lt;br /&gt;
'''DEFORGSPR,SpriteSlave,SpriteMaster'''&lt;br /&gt;
* SpriteSlave=[0..15] SpriteMaster=[0..15]&lt;br /&gt;
* Define the origin position of SpriteSlave with the position of SpriteMaster.&lt;br /&gt;
* Note : It's possible to define a sprite relative position for a sprite following a path (see SPRTDEF)&lt;br /&gt;
* It's possible to generate complex definitions of sprites movments.&lt;br /&gt;
* If a sprite 1 use a path 1 and a sprite 2 use a path 2, if the sprite 2 is the slave of sprite 1, then&lt;br /&gt;
* the path 2 will be relative to path 1.&lt;br /&gt;
* To erase the slavery of a sprite, use DEFORGXY instruction&lt;br /&gt;
----&lt;br /&gt;
'''DEFKBDSPR, NumDef, SpriteNumber, KeyUp, StepUp, KeyDown, StepDown, KeyLeft, StepLeft, KeyRight, StepRight'''&lt;br /&gt;
'''DEFKBDSPR,NumDef,255'''&lt;br /&gt;
'''DEFKBDSPR'''&lt;br /&gt;
* Associate the sprite coordinates to keyboard keys&lt;br /&gt;
* NumDef =[0..1] It's possible to define keys for 2 sprites /  SpriteNumber=[0..15] Sprite number / Keyxxxxx=[Key number] (see table), Stepxxxx=value 0..255 : Step in mode 2 pixel to add or substract associated value to corresponding key.&lt;br /&gt;
* A key 0 indicate to do not test the key. When DEFKBDSPR is defined with all parameters, the sprite process is automatic, and so independent from basic program. It is possible to control manually the sprite movment by using the instruction without parameters (the automatic mode is disactivated). &lt;br /&gt;
* Note : If the user wants to cancel a definition, it's better to disactivate the sprite with DEFKBDSPR,NumDef,255 instead of defining all keys with 0 (The B-Asic will gain cpu-speed).&lt;br /&gt;
---&lt;br /&gt;
=== Others Instructions Set ===&lt;br /&gt;
----&lt;br /&gt;
'''POKEASIC,Address,val1,...,valx'''&lt;br /&gt;
* Address=[&amp;amp;4000..&amp;amp;7FFF] Valx=[&amp;amp;00..&amp;amp;FF]&lt;br /&gt;
* Poke one or more bytes in Asic I/O page&lt;br /&gt;
* Instruction reserved to experimented users.&lt;br /&gt;
----&lt;br /&gt;
'''POKEVR,Address,val1,...,valn'''&lt;br /&gt;
* Address=[&amp;amp;4000..&amp;amp;7FFF] Valx=[&amp;amp;00..&amp;amp;FF]&lt;br /&gt;
* Poke one or more bytes in second video page&lt;br /&gt;
* Instruction reserved to experimented users.&lt;br /&gt;
----&lt;br /&gt;
'''DOKE,Address,value16bits'''&lt;br /&gt;
* Address=[&amp;amp;4000..&amp;amp;7FFF] value16bits=[&amp;amp;0000..&amp;amp;FFFF] &lt;br /&gt;
* Double Poke in user memory &lt;br /&gt;
---- &lt;br /&gt;
'''SCREENCOPY,direction '''&lt;br /&gt;
* direction=[0..1] &lt;br /&gt;
* 0 : Copy the main videoram  to videoram 2&lt;br /&gt;
* 1 : Copy the videoram2 to main videoram&lt;br /&gt;
&lt;br /&gt;
== Error Messages ==&lt;br /&gt;
'''Bad arguments number'''&lt;br /&gt;
* Bad number of arguments used in the instruction&lt;br /&gt;
&lt;br /&gt;
'''Invalid Argument'''&lt;br /&gt;
* An invalid value is used in one or more arguments of the instruction&lt;br /&gt;
&lt;br /&gt;
'''Invalid Filename'''&lt;br /&gt;
* A bad filename was used in a SPRSAVE or SPRLOAD instruction&lt;br /&gt;
&lt;br /&gt;
'''Disc Error'''&lt;br /&gt;
* An I/O error has occured in a SPRSAVE or SPRLOAD instruction.&lt;br /&gt;
* Disc is missing, or the disk has a wrong or damaged format.&lt;br /&gt;
&lt;br /&gt;
'''Not a Sprite file'''&lt;br /&gt;
* The size of the file specified in SPRLOAD is not correct.&lt;br /&gt;
* See if you do no use the SPRLOAD with a block instead of a single sprite (or the opposite)&lt;br /&gt;
&lt;br /&gt;
'''Same Sprites Numbers'''&lt;br /&gt;
* An instruction SPRLINK or SPRUNLINK is attempted with 2 identical sprite numbers.&lt;br /&gt;
&lt;br /&gt;
'''Bad Graphic Mode'''&lt;br /&gt;
* Instruction CATCH is not used in MODE 0&lt;br /&gt;
&lt;br /&gt;
'''Invalid Moving List'''&lt;br /&gt;
* An invalid table is created for SPRTDEF &lt;br /&gt;
* (e.g. the first coordinate is the path end)&lt;br /&gt;
&lt;br /&gt;
'''Link Table Full'''&lt;br /&gt;
* The link table is full.&lt;br /&gt;
* Normally this error cannot occur in a well built program.&lt;br /&gt;
&lt;br /&gt;
'''Sprites not Linked'''&lt;br /&gt;
* Instruction SPRUNLINK is used with sprites not linked.&lt;br /&gt;
&lt;br /&gt;
== Links ==&lt;br /&gt;
[http://logon.system.free.fr/html/lienscpc.htm Download B-Asic]&lt;br /&gt;
&lt;br /&gt;
[[Category:Programming software]]&lt;br /&gt;
[[Category:CPC Plus]]&lt;/div&gt;</summary>
		<author><name>Longshot</name></author>	</entry>

	<entry>
		<id>https://oldwiki.cpcwiki.eu/index.php?title=Talk:Programming:Hardware_scrolling_the_screen_horizontally_byte-by-byte_using_the_CRTC&amp;diff=14948</id>
		<title>Talk:Programming:Hardware scrolling the screen horizontally byte-by-byte using the CRTC</title>
		<link rel="alternate" type="text/html" href="https://oldwiki.cpcwiki.eu/index.php?title=Talk:Programming:Hardware_scrolling_the_screen_horizontally_byte-by-byte_using_the_CRTC&amp;diff=14948"/>
				<updated>2007-03-13T11:35:51Z</updated>
		
		<summary type="html">&lt;p&gt;Longshot: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Hi. This method to reduce scroll speed is not really &amp;quot;smooth&amp;quot; because register 3 does not give  a step with exactly one byte length. The only way to reduce scroll speed and keep a smooth effect is to use two videos data areas (offset switching). The inconvenient of switching is to need more memory (2x). By the way, it's the right way and the only method known on cpc old to code a slower hardware scroll (1/2 byte : 2 pixel mode 1, 1/4 byte : 1 pixel mode 1)&lt;br /&gt;
Great article on Interrupt Im0 on Cpc+...&lt;br /&gt;
--[[User:Longshot|Longshot]] 12:35, 13 March 2007 (CET)&lt;/div&gt;</summary>
		<author><name>Longshot</name></author>	</entry>

	<entry>
		<id>https://oldwiki.cpcwiki.eu/index.php?title=Talk:Programming:Hardware_scrolling_the_screen_horizontally_byte-by-byte_using_the_CRTC&amp;diff=14947</id>
		<title>Talk:Programming:Hardware scrolling the screen horizontally byte-by-byte using the CRTC</title>
		<link rel="alternate" type="text/html" href="https://oldwiki.cpcwiki.eu/index.php?title=Talk:Programming:Hardware_scrolling_the_screen_horizontally_byte-by-byte_using_the_CRTC&amp;diff=14947"/>
				<updated>2007-03-13T11:34:50Z</updated>
		
		<summary type="html">&lt;p&gt;Longshot: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Hi. This method to reduce scroll speed is not really &amp;quot;smooth&amp;quot; because register 3 does not give  a step with exactly one byte length. The only way to reduce scroll speed and keep a smooth effect is to use two videos data areas (offset switching). The inconvenient of switching is to need more memory (2x). By the way, it's the right way and the only method known on cpc old to code a slower hardware scroll (1/2 byte : 2 pixel mode 1, 1/4 byte : 1 pixel mode 1)&lt;br /&gt;
Great article on Interrupt Im0 on Cpc+...&lt;/div&gt;</summary>
		<author><name>Longshot</name></author>	</entry>

	</feed>