Changes

CRTC

4,361 bytes added, 14 May
/* HSYNC and VSYNC */
* ''This is an article about the "Cathode Ray Tube Controller" hardware unit of the Amstrad CPC. For the cpc scene member see [[ChaRleyTroniC]]''
 
 
The '''CRTC''' (Cathode Ray Tube Controller) helps to generate the video signal of the Amstrad CPC.
CRTC generates the address, Gate-Array reads the data and converts it to pixels based on the current mode.
 
CRTC pins RA3, RA4, MA10, MA11 are not connected on CPC.
 
== CUDISP ==
 
CUDISP signal defines the hardware cursor.
 
CRTC pin CUDISP is not connected to the Gate Array, so it has no effect on a barebone CPC or Plus machine.
 
However, this signal is provided to the expansion port. And it is used by the [[PlayCity]] and [[Play2CPC]] expansions.
== DISPTMG ==
DISPTMG signal defines the border. When DISPTMG is "1" 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.
The border has higher priority than pixels but lower priority than the black colour output when HSYNC/VSYNC are active.
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.
Using CRTC1, CRTCs 1 and 2 have a fixed VSYNC width value 0 means a value of 16. VSYNC width can be configured with Register 3 on CRTCs 0, 3 and 4. The bit 0 of port B of the PPI changes to 1 as soon as the VSYNC signal is produced by the CRTC.
== The 6845 Registers ==
|2||Horizontal Sync Position ||00000000||46||When to start the HSync signal.
|-
|3||Horizontal and Vertical Sync Widths||VVVVHHHH||128+14||HSync pulse width in characters (0 means 16 only on some CRTC), should always CRTCs. Needs to be more than 8at least 2 for Gate Array to change the video mode); VSync width in scan-lines. (0 always means 16 on some CRTC. Not present on all CRTCs, fixed to 16 lines on these).
|-
|4||Vertical Total (-1)||x0000000||38||Height of the screen, in characters.
|7||Vertical Sync Position||x0000000||30||When to start the VSync signal, in characters.
|-
|8||Interlace and Skew||xxxxxx00CCDDxxII||0||00CC: No interlace; 01Cursor Skew (Only in CRTCs 0, 3 and 4). DD: Interlace Sync Raster Scan Mode; 10Display Skew (Only in CRTCs 0, 3 and 4). II: No Interlace; 11: Interlace Sync and Video Raster Scan Mode.
|-
|9||Maximum Raster Address (aka Number of Scan LineLines) (-1)||xxx00000||7||Maximum scan line address on CPC can hold between 0 and 7, higher values' upper bits are ignored
|-
|10||Cursor Start Raster||xBP00000||0||Cursor signal is not used on CPCconnected to the Gate Array but is provided to the expansion port. B = Blink On/Off; P = Blink Period Control (Slow/Fast). Sets first raster row of character that cursor is on to invert.
|-
|11||Cursor End Raster||xxx00000||0||Sets last raster row of character that cursor is on to invert
|-
|12||Display Start Address (High)||xx000000||48||On Amstrad Plus, bit7 of the printer port is controlled by bit3 of CRTC R12 (ie. bit11 of Display Start Address)
|-
|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 &0000 with the firmware.
|15||Cursor Address (Low)||00000000||0
|-
|16||Light Pen Address (High)||xx000000||||Read Only. On CRTC1, bit6 of Status register goes to 0 when R16 is read
|-
|17||Light Pen Address (Low)||00000000||||Read Only. On CRTC1, bit6 of Status register goes to 0 when R17 is read
|-
|}
registers 18-31 read as 0, on type 0 and 2.
registers 18-30 read as 0 on type1, register 31 reads as 0x0ff0xff.
Details about Reg. 12 and Reg. 13 specifically:
|1||0||-||-
|-
|1||1||Read from selected internal 6845 register||Read only Only
|-
|}
|1||0||Read Status Register||Read Only
|-
|1||1||Read from selected internal 6845 register||Read only Only
|}
|1||0||-||-
|-
|1||1||Read from selected internal 6845 register||Read only Only
|-
|}
|1||0||Read from selected internal 6845 register||Read Only
|-
|1||1||Read from selected internal 6845 register||Read only Only
|-
|}
{|{{Prettytable|width: 700px; font-size: 2em;}}
|rowspan=2|''Register Index''||rowspan=2|''Register Name''||colspan=43|''Type''
|-
|0||1 & 2||3 & 4
|-
|0||Horizontal Total (-1)||Write Only||Write Only|colspan=3 style="text-align: center;"|Write Only
|-
|1||Horizontal Displayed||Write Only||Write Only|colspan=3 style="text-align: center;"|Write Only
|-
|2||Horizontal Sync Position||Write Only||Write Only|colspan=3 style="text-align: center;"|Write Only
|-
|3||Horizontal and Vertical Sync Widths||Write Only||Write Only|colspan=3 style="text-align: center;"|Write Only
|-
|4||Vertical Total (-1)||Write Only||Write Only|colspan=3 style="text-align: center;"|Write Only
|-
|5||Vertical Total Adjust||Write Only||Write Only|colspan=3 style="text-align: center;"|Write Only
|-
|6||Vertical Displayed||Write Only||Write Only|colspan=3 style="text-align: center;"|Write Only
|-
|7||Vertical Sync Position||Write Only||Write Only|colspan=3 style="text-align: center;"|Write Only
|-
|8||Interlace and Skew||Write Only||Write Only|colspan=3 style="text-align: center;"|Write Only
|-
|9||Maximum Raster Address (aka Number of Scan LineLines) (-1)||Write Only||Write Only|colspan=3 style="text-align: center;"|Write Only
|-
|10||Cursor Start Raster||Write Only||Write Only||Read Only/Write
|-
|11||Cursor End Raster||Write Only||Write Only||Read Only/Write
|-
|12||Display Start Address (High)||Read/Write||Write Only||Read/Write
|13||Display Start Address (Low)||Read/Write||Write Only||Read/Write
|-
|14||Cursor Address (High)||Read/Write||Read/Write|colspan=3 style="text-align: center;"|Read/Write
|-
|15||Cursor Address (Low)||Read/Write||Read/Write|colspan=3 style="text-align: center;"|Read/Write
|-
|16||Light Pen Address (High)||Read Only||Read Only|colspan=3 style="text-align: center;"|Read Only
|-
|17||Light Pen Address (Low)||Read Only||Read Only|colspan=3 style="text-align: center;"|Read Only
|-
|}
'''Notes'''
* On type 0 The CRTC is not connected to the CPU's RD and 1WR pins, so the CRTC is not aware of the CPU bus I/O direction. Therefore, if a Write Only register is read frominstruction is used on a write register of the CRTC, "0" then a data is returnedsent to the CRTC.
* CRTC type 4 On types 0 and 1, if a Write Only register is the same as read from, "0" is returned. * CRTC type types 3. The registers also repeat as they do on and 4 are identical in every way, except for the type 3unlocking mechanism, split-screen and 8-bit printer port functionalities specific to the ASIC.
* See the document "Extra CPC Plus Hardware Information" for more details.
=== Horizontal and Vertical Sync (R3) === Type 0:*Bits 7..4 define Vertical Sync Width. If 0 is programmed this gives 16 lines of VSYNC.*Bits 3..0 define Horizontal Sync Width. If 0 is programmed no HSYNC is generated. Type 1:*Bits 7..4 are ignored. Vertical Sync is fixed at 16 lines.*Bits 3..0 define Horizontal Sync Width. If 0 is programmed no HSYNC is generated.
UM6845Type 2:*Bits 7..4 are ignored. Vertical Sync is fixed at 16 lines.*Bits 3..0 define Horizontal Sync Width. If 0 is programmed this gives a HSYNC width of 16.
Types 3/4:*Bits 7..4 define Vertical Sync Width. If 0 is programmed this gives 16 lines of VSYNC.*Bits 3..0 define Horizontal Sync Width. If 0 is programmed no this gives a HSYNC is generatedwidth of 16.
UM6845R:=== Interlace and Skew (R8) ===
Types 0/3/4:*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).*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).*Bits 3..2 are ignored. Vertical Sync is fixed at 16 lines.*Bits 31..0 define Horizontal the interlace mode (00 = No Interlace; 01 = Interlace Sync Width. If 0 is programmed no HSYNC is generated; 10 = No Interlace; 11 = Interlace Sync and Video).
MC6845Types 1/2:*Bits 7..2 are ignored.*Bits 1..0 define the interlace mode.
Bits 7..4 are ignored. Vertical Sync is fixed at 16 lines.
Bits 3..0 define Horizontal Sync Width. If 0 is programmed this gives a HSYNC width of 16.
Pre-ASIC/ASICInterlace modes:
Bits 7..4 define Vertical Sync Width. If 0 is programmed this gives 16 lines of VSYNC.Bits 3..0 define Horizontal Sync Width. If 0 is programmed this gives a HSYNC width of 16[[File:CRTC Interlace modes.png]]
=== UM6845R and R31 ===
R31 is described in the UM6845R documentation as "Dummy Register".
In the UM6845R it appears to have no effect. Reading and writing does nothing. Reading it returns 0x0ff.
R31 doesn't exist on types 0,2,3,4.
=== UM6845R and R12/R13 ===
The UM6845R differs to other CRTC in respect of R12/R13.
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.
=== UM6845R status register ===
The UM6845R has a status register that can be read using port &BExx.
All the other bits read as 0 and don't have any function.
=== R10/R11 on ASIC/Pre-ASIC === The cursor raster registers R10/R11 act as status registers when read on Types 3 & 4. They behave as normal cursor raster registers upon write. {| class="wikitable sortable"! R10 - Bit number! Bit value! Event|-|0|1|C0=R0|-|1|0|C0=R0/2|-|2|0|C0=R1-1 (if R0>=R1)|-|3|0|C0=R2|-|4|0|C0=R2+R3|-|5|01|R3h>0 : C0=0..R0 on the line R3h from Vsync (C4=R7)R3h=0 : C0=0..R0 over 15 lines from Vsync (C4=R7)|-|6|1|Always 1|-|7|00|C0=0..R0-1 : VMA.Lsb=0xFFC0=R0 : VMA'.Lsb=0x00 (same cond if C0=R0=0)|} {| class="wikitable sortable"! R11 - Bit number! Bit value! Event|-|0|0|C4=R4 and C9=R9 and C0=R0 : Last char of screen|-|1|0|C4=R6-1 and C9=R9 and C0=R0 : Last char displayed|-|2|0|C4=R7-1 and C9=R9 and C0=R0 : Last char before Vsync|-|3|0/1|Timer 16 CRTC frames|-|4|1|Always 1|-|5|0|C9=R9 : C0=0 to R0|-|6|0|Always 0|-|7|1|(C9=R9 and C0=R0) or (C9=0 and C0=0 to R0-1)|} === Reading from CRTC registers on ASIC/Pre-ASIC === On CRTC Types 3 and 4, only the 3 least significant bits of the selected register number are considered to read a register according to the following table: {|{{Prettytable|width: 700px; font-size: 2em;}}|'''Nb'''||'''Register'''||'''Definition'''|-|0||R16||Light Pen Address (High)|-|1||R17||Light Pen Address (Low)|-|2||R10||Cursor Start Raster|-|3||R11||Cursor End Raster|-|4||R12||Display Start Address (High)|-|5||R13||Display Start Address (Low)|-|6||R14||Cursor Address (High)|-|7||R15||Cursor Address (Low)|} Therefore, as an example, reading register 4 will give the same result as reading register 12 or 20. <br> == CRTC Type Detection ==<pre>10 MODE 1:' Reinitialize screen20 OUT &BC00,31:IF INP(&BF00)=255 THEN PRINT"crtc 1":END30 OUT &BC00,12:IF INP(&BF00)=0 THEN PRINT"crtc 2":END40 OUT &BC00,20:IF INP(&BF00)=0 THEN PRINT"crtc 0":END50 PRINT"crtc 3/4"</pre><br> == CRTC Timing Diagram Diagrams ==[[File:CRTC Timing Diagram Rockwell.png]] <br> 
[[File:CRTC timing small.gif]]
 
<br>
== Internal Counters ==
|VTAC
|C5 (or C9 on CRTCs 0/3/4)
|-
|Frame Counter
|FC
|''Used for interlace and CRTC cursor blinking''
|}
 
No matter its type, the CRTC never buffers its counters.
 
The only value that is saved in a buffer in the CRTC is the video pointer because it is reloaded at each line start.
 
<br>
== Hitachi Block Diagram ==
[[File:CRTC Block Diagram.png]]
 
<br>
== UMC Block Diagram ==
[[File:UMC CRTC Block Diagram.png]]
 
<br>
== Motorola Block Diagram ==
[[File:Motorola CRTC Block Diagram.png]]
 
<br>
== Datasheets ==
* [[Media:Um6845r.umc.pdf|UM6845R (UMC) (aka type 1)]]
* [[Media:Mc6845.motorola.pdf|MC6845 (Motorola) (aka type 2)]] [[Media:Mc6845.pdf|Other datasheet version]]
*[[Media:CRTC-5-HD6345.pdf|HD6345 (Hitachi) (aka type 5)]] Upgraded pin-compatible CRTC chip with advanced functionalities [https://thecheshirec.at/2024/05/07/un-crtc6345-sur-amstrad-cpc/ Upgrading the CPC to HD6345]
== Unused clones ==
* [UM6845E by UMC]
* [SY6845EA by Synertek]
* CRTC6545 (MOS, Rockwell, Synertek) is pin-compatible with the 6845 and only has minor differences
* [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&path=%2FSystem09%2Ftrunk%2Frtl%2FVHDL%2Fcrtc6845.vhd OpenCores] Verilog/VHDL implementations of the 6845
* [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)
* [[File:Shaker25Shaker26.dsk]] Shaker v2.5 - 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)
* [[File:Shaker addon.dsk]] Shaker Add-On (Pixel 1 Hard Scroll / Vertical Rupture all Crtc)
* [http://www.grimware.org/doku.php/documentations/devices/crtc CRTC documentation from Grimware]
* [http://quasar.cpcscene.net/doku.php?id=assem:crtc Quasar CRTC documentation (in french)]
* [https[Media://cpcrulez.fr/coding_CRTC-Paradox.htm Dossier CRTC Rupture(Gozeur/Paradox).pdf]]
* [[Media:Dossier CRTC(Ramlaid Mortel).pdf]] Les entrailles du CRTC
* [https://thecheshirec.at/tag/crtc6845/ Leçons CRTC (CheshireCat)]
* [[Media:ACCC1.78-EN.pdf]] [[Media:ACCC1.78-FR.pdf]] CPC CRTC Compendium - Latest (1004/20232024!) document containing in-depth info about CRTC programming on CPC.
==Related pages==
4,825
edits