Difference between revisions of "CRTC"

From CPCWiki - THE Amstrad CPC encyclopedia!
Jump to: navigation, search
(Minor adjustments; some incorrect apostrophes, and minor other things.)
(HSC (C3l) overflow)
 
(261 intermediate revisions by 5 users not shown)
Line 1: Line 1:
* ''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.
 
The '''CRTC''' (Cathode Ray Tube Controller) helps to generate the video signal of the Amstrad CPC.
  
 
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.
 
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.
 +
 +
<br>
  
 
== Overview ==
 
== Overview ==
Line 49: Line 48:
  
 
4. As far as I know, the KC compact used HD6845R only.
 
4. As far as I know, the KC compact used HD6845R only.
 +
 +
<br>
  
 
== Timings and relating with Z80 instructions count ==
 
== Timings and relating with Z80 instructions count ==
Line 54: Line 55:
 
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
 
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
 
(To be extracted/edited to conform to wiki good practices).
 
(To be extracted/edited to conform to wiki good practices).
 +
 +
<br>
  
 
==Programming==
 
==Programming==
Line 78: Line 81:
 
1. The function of these I/O ports is dependant on the CRTC type
 
1. The function of these I/O ports is dependant on the CRTC type
 
   
 
   
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.
+
2. The CRTC is not connected to the CPU's RD and WR pins, so the CRTC is not aware of the CPU bus I/O direction. Therefore, 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.
 +
 
 +
<br>
  
 
==Addressing==
 
==Addressing==
  
The following table defines the generated memory address from the CRTC and Gate-Array signals.  
+
The video memory address VMA of the [[Gate Array]] is constructed from the CRTC MA and RA signals.
  
 
{|{{Prettytable|width: 700px; font-size: 2em;}}
 
{|{{Prettytable|width: 700px; font-size: 2em;}}
|''Memory Address Signal''||''Signal source''||''Signal name''
+
|''Video Memory Address''||''Signal source''||''Signal name''
 
|-
 
|-
 
|A15||6845||MA13  
 
|A15||6845||MA13  
Line 121: Line 126:
 
|}
 
|}
  
CRTC generates the address, Gate-Array reads the data and converts it to pixels based on the current mode.
+
CRTC generates the address, Gate Array reads the data and converts it to pixels based on its current graphics mode and palette.
  
== DISPTMG ==
+
CRTC pins RA3, RA4, MA10, MA11 are not connected on CPC.
  
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.
+
<br>
 +
 
 +
== CUDISP (aka CURSOR) ==
 +
 
 +
CUDISP (Cursor Display) 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.
 +
 
 +
<br>
 +
 
 +
== DISPTMG (aka Display Enable) ==
 +
 
 +
DISPTMG (Display Timing) signal defines the border. When DISPTMG is "0" the border colour is output by the Gate Array to the display.
  
 
The border has higher priority than pixels but lower priority than the black colour output when HSYNC/VSYNC are active.
 
The border has higher priority than pixels but lower priority than the black colour output when HSYNC/VSYNC are active.
  
== HSYNC and VSYNC ==
+
The DISPTMG can be forced to 0 by 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.
  
On CPC, HSYNC and VSYNC from the CRTC are passed into the Gate-Array.
+
<br>
  
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.
+
== HSYNC and VSYNC ==
  
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.  
+
On CPC, HSYNC and VSYNC from the CRTC are passed to the [[Gate Array]] for further modification. See its wiki page.
  
If R2=46, and HSYNC width is 14 then monitor hsync starts at 48 and lasts until 51.
+
The HSYNC width value is interpreted differently between CRTCs. On CRTCs 0/1, if 0 is programmed no HSYNC is generated. On CRTCs 2/3/4, if 0 is programmed this gives a HSYNC width of 16.
  
On a CPC monitor, the HSYNC is rendered in "absolute black". It is darker than the black output by the Gate-Array.
+
CRTCs 1/2 have a fixed VSYNC width value of 16. VSYNC width can be configured with Register 3 on CRTCs 0/3/4. If 0 is programmed this gives 16 lines of VSYNC.
  
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.
+
The bit 0 of port B of the PPI changes to 1 as soon as the VSYNC signal is produced by the CRTC.
  
Using CRTC1, VSYNC width value 0 means a value of 16.
+
<br>
  
== The 6845 Registers ==
+
== CRTC registers ==
  
 
The Internal registers of the 6845 are:
 
The Internal registers of the 6845 are:
Line 152: Line 171:
 
|''Register Index''||''Register Name''||''Range''||''CPC Setting''||''Notes''
 
|''Register Index''||''Register Name''||''Range''||''CPC Setting''||''Notes''
 
|-
 
|-
|0||Horizontal Total||00000000||63||Width of the screen, in characters. Should always be 63 (64 characters). 1 character == 1μs.
+
|0||Horizontal Total (-1)||00000000||63||Width of the screen, in characters. Should always be 63 (64 characters). 1 character == 1μs.
 
|-
 
|-
 
|1||Horizontal Displayed||00000000||40||Number of characters displayed. Once horizontal character count (HCC) matches this value, DISPTMG is set to 1.
 
|1||Horizontal Displayed||00000000||40||Number of characters displayed. Once horizontal character count (HCC) matches this value, DISPTMG is set to 1.
 
|-
 
|-
|2||Horizontal Sync Position||00000000||46||When to start the HSync signal.
+
|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 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)
+
|3||Horizontal and Vertical Sync Widths||VVVVHHHH||128+14||VSync width in scan-lines (Not present on all CRTCs, fixed to 16 lines on these) ; HSync pulse width in characters.
 
|-
 
|-
|4||Vertical Total||x0000000||38||Height of the screen, in characters.
+
|4||Vertical Total (-1)||x0000000||38||Height of the screen, in characters.
 
|-
 
|-
 
|5||Vertical Total Adjust||xxx00000||0||Measured in scanlines, can be used for smooth vertical scrolling on CPC.
 
|5||Vertical Total Adjust||xxx00000||0||Measured in scanlines, can be used for smooth vertical scrolling on CPC.
Line 166: Line 185:
 
|6||Vertical Displayed||x0000000||25||Height of displayed screen in characters. Once vertical character count (VCC) matches this value, DISPTMG is set to 1.
 
|6||Vertical Displayed||x0000000||25||Height of displayed screen in characters. Once vertical character count (VCC) matches this value, DISPTMG is set to 1.
 
|-
 
|-
|7||Vertical Sync position||x0000000||30||When to start the VSync signal, in characters.
+
|7||Vertical Sync Position||x0000000||30||When to start the VSync signal, in characters.
 
|-
 
|-
|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
+
|8||Interlace and Skew||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.
 
|-
 
|-
|9||Maximum Raster Address||xxx00000||7||Maximum scan line address on CPC can hold between 0 and 7, higher values' upper bits are ignored
+
|9||Maximum Raster Address (aka Number of Scan Lines) (-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 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.
+
|10||Cursor Start Raster||xBP00000||0||Cursor signal is not connected 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
 
|11||Cursor End Raster||xxx00000||0||Sets last raster row of character that cursor is on to invert
 
|-
 
|-
|12||Display Start Address (High)||xx000000||32
+
|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.
 
|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.
Line 184: Line 203:
 
|15||Cursor Address (Low)||00000000||0
 
|15||Cursor Address (Low)||00000000||0
 
|-
 
|-
|16||Light Pen Address (High)||xx000000||||Read Only
+
|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
+
|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-31 read as 0, on type 0 and 2.
registers 18-30 read as 0 on type1, register 31 reads as 0x0ff.
+
registers 18-30 read as 0 on type1, register 31 reads as 0xff.
  
 
Details about Reg. 12 and Reg. 13 specifically:
 
Details about Reg. 12 and Reg. 13 specifically:
Line 224: Line 243:
 
   '--'--'--------------'  '--'--'---------------'
 
   '--'--'--------------'  '--'--'---------------'
  
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).
+
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.
  
== CRTC Differences ==
+
<br>
  
In this section I will attempt to identify all the differences between each CRTC.
+
== CRTC register differences ==
  
 
The following tables list the functions that can be accessed for each type:  
 
The following tables list the functions that can be accessed for each type:  
Line 243: Line 262:
 
|1||0||-||-  
 
|1||0||-||-  
 
|-
 
|-
|1||1||Read from selected internal 6845 register||Read only
+
|1||1||Read from selected internal 6845 register||Read Only
 
|-
 
|-
 
|}
 
|}
Line 258: Line 277:
 
|1||0||Read Status Register||Read Only  
 
|1||0||Read Status Register||Read Only  
 
|-
 
|-
|1||1||Read from selected internal 6845 register||Read only
+
|1||1||Read from selected internal 6845 register||Read Only
 
|}
 
|}
  
Line 272: Line 291:
 
|1||0||-||-  
 
|1||0||-||-  
 
|-
 
|-
|1||1||Read from selected internal 6845 register||Read only
+
|1||1||Read from selected internal 6845 register||Read Only
 
|-
 
|-
 
|}
 
|}
Line 287: Line 306:
 
|1||0||Read from selected internal 6845 register||Read Only  
 
|1||0||Read from selected internal 6845 register||Read Only  
 
|-
 
|-
|1||1||Read from selected internal 6845 register||Read only
+
|1||1||Read from selected internal 6845 register||Read Only
 
|-
 
|-
 
|}
 
|}
Line 294: Line 313:
  
 
{|{{Prettytable|width: 700px; font-size: 2em;}}
 
{|{{Prettytable|width: 700px; font-size: 2em;}}
|rowspan=2|''Register Index''||rowspan=2|''Register Name''||colspan=4|''Type''  
+
|rowspan=2|''Register Index''||rowspan=2|''Register Name''||colspan=3|''Type''  
 
|-
 
|-
|0||1||2||3||4
+
|0||1 & 2||3 & 4
 
|-
 
|-
|0||Horizontal Total||Write Only||Write Only||Write Only||(note 2)||(note 3)
+
|0||Horizontal Total (-1)||colspan=3 style="text-align: center;"|Write Only
 
|-
 
|-
|1||Horizontal Displayed||Write Only||Write Only||Write Only||(note 2)||(note 3)
+
|1||Horizontal Displayed||colspan=3 style="text-align: center;"|Write Only
 
|-
 
|-
|2||Horizontal Sync Position||Write Only||Write Only||Write Only||(note 2)||(note 3)
+
|2||Horizontal Sync Position||colspan=3 style="text-align: center;"|Write Only
 
|-
 
|-
|3||Horizontal and Vertical Sync Widths||Write Only||Write Only||Write Only||(note 2)||(note 3)
+
|3||Horizontal and Vertical Sync Widths||colspan=3 style="text-align: center;"|Write Only
 
|-
 
|-
|4||Vertical Total||Write Only||Write Only||Write Only||(note 2)||(note 3)
+
|4||Vertical Total (-1)||colspan=3 style="text-align: center;"|Write Only
 
|-
 
|-
|5||Vertical Total Adjust||Write Only||Write Only||Write Only||(note 2)||(note 3)
+
|5||Vertical Total Adjust||colspan=3 style="text-align: center;"|Write Only
 
|-
 
|-
|6||Vertical Displayed||Write Only||Write Only||Write Only||(note 2)||(note 3)
+
|6||Vertical Displayed||colspan=3 style="text-align: center;"|Write Only
 
|-
 
|-
|7||Vertical Sync position||Write Only||Write Only||Write Only||(note 2)||(note 3)
+
|7||Vertical Sync Position||colspan=3 style="text-align: center;"|Write Only
 
|-
 
|-
|8||Interlace and Skew||Write Only||Write Only||Write Only||(note 2)||(note 3)
+
|8||Interlace and Skew||colspan=3 style="text-align: center;"|Write Only
 
|-
 
|-
|9||Maximum Raster Address||Write Only||Write Only||Write Only||(note 2)||(note 3)
+
|9||Maximum Raster Address (aka Number of Scan Lines) (-1)||colspan=3 style="text-align: center;"|Write Only
 
|-
 
|-
|10||Cursor Start Raster||Write Only||Write Only||Write Only||(note 2)||(note 3)
+
|10||Cursor Start Raster||Write Only||Write Only||Read/Write
 
|-
 
|-
|11||Cursor End Raster||Write Only||Write Only||Write Only||(note 2)||(note 3)
+
|11||Cursor End Raster||Write Only||Write Only||Read/Write
 
|-
 
|-
|12||Display Start Address (High)||Read/Write||Write Only||Write Only||Read/Write (note 2)||(note 3)
+
|12||Display Start Address (High)||Read/Write||Write Only||Read/Write  
 
|-
 
|-
|13||Display Start Address (Low)||Read/Write||Write Only||Write Only||Read/Write (note 2)||(note 3)
+
|13||Display Start Address (Low)||Read/Write||Write Only||Read/Write
 
|-
 
|-
|14||Cursor Address (High)||Read/Write||Read/Write||Read/Write||Read/Write (note 2)||(note 3)
+
|14||Cursor Address (High)||colspan=3 style="text-align: center;"|Read/Write
 
|-
 
|-
|15||Cursor Address (Low)||Read/Write||Read/Write||Read/Write||Read/Write (note 2)||(note 3)
+
|15||Cursor Address (Low)||colspan=3 style="text-align: center;"|Read/Write
 
|-
 
|-
|16||Light Pen Address (High)||Read Only||Read Only||Read Only||Read Only (note 2)||(note 3)
+
|16||Light Pen Address (High)||colspan=3 style="text-align: center;"|Read Only
 
|-
 
|-
|17||Light Pen Address (Low)||Read Only||Read Only||Read Only||Read Only (note 2)||(note 3)
+
|17||Light Pen Address (Low)||colspan=3 style="text-align: center;"|Read Only
 
|-
 
|-
 
|}
 
|}
Line 338: Line 357:
 
'''Notes'''
 
'''Notes'''
  
1. On type 0 and 1, if a Write Only register is read from, "0" is returned.  
+
* On types 0 and 1, if a Write Only register is read from, "0" is returned.
  
2. See the document "Extra CPC Plus Hardware Information" for more details.
+
* CRTC types 3 and 4 are identical in every way, except for the unlocking mechanism, split-screen and 8-bit printer port functionalities specific to the ASIC.
  
3. CRTC type 4 is the same as CRTC type 3. The registers also repeat as they do on the type 3.
+
* See the document "Extra CPC Plus Hardware Information" for more details.
  
== Horizontal and Vertical Sync (R3) ==
+
<br>
  
UM6845:
+
=== Horizontal and Vertical Sync (R3) ===
  
Bits 7..4 define Vertical Sync Width. If 0 is programmed this gives 16 lines of VSYNC.
+
Type 0:
Bits 3..0 define Horizontal Sync Width. If 0 is programmed no HSYNC is generated.
+
*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.
  
UM6845R:
+
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.
  
Bits 7..4 are ignored. Vertical Sync is fixed at 16 lines.
+
Type 2:
Bits 3..0 define Horizontal Sync Width. If 0 is programmed no HSYNC is generated.
+
*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.
  
MC6845:
+
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 this gives a HSYNC width of 16.
  
Bits 7..4 are ignored. Vertical Sync is fixed at 16 lines.
+
<br>
Bits 3..0 define Horizontal Sync Width. If 0 is programmed this gives a HSYNC width of 16.
+
  
Pre-ASIC/ASIC:
+
=== Interlace and Skew (R8) ===
  
Bits 7..4 define Vertical Sync Width. If 0 is programmed this gives 16 lines of VSYNC.
+
Types 0/3/4:
Bits 3..0 define Horizontal Sync Width. If 0 is programmed this gives a HSYNC width of 16.
+
*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.
 +
*Bits 1..0 define the interlace mode (00 = No Interlace; 01 = Interlace Sync; 10 = No Interlace; 11 = Interlace Sync and Video).
  
== UM6845R and R31 ==
+
Types 1/2:
 +
*Bits 7..2 are ignored.
 +
*Bits 1..0 define the interlace mode.
  
R31 is described in the UM6845R documentation as "Dummy Register".
 
  
Its use is described in the documentation for the Rockwell R6545 in combination with R18, R19 and R8 and the Status Register.
+
2 interlace modes are available:
 +
* In interlace sync mode, the same information is painted in both fields to enhance readability. In this mode, reprogramming the CRTC is not necessary
 +
* In interlace sync and video mode, alternating lines are displayed in the even and odd field to double the resolution. In this mode, it is necessary to reprogram the CRTC as if we were building a frame of 624 lines. The 625th line is managed automatically by the CRTC
 +
[[File:CRTC Interlace modes.png]]
  
In the UM6845R it appears to have no effect. Reading and writing does nothing. Reading it returns 0x0ff.
+
<br>
  
R31 doesn't exist on types 0,2,3.
+
=== R31 on Type 1 ===
  
== UM6845R and R12/R13 ==
+
R31 is described in the UM6845R documentation as "Dummy Register".
  
The UM6845R differs to other CRTC in respect of R12/R13.  
+
Its use is described in the documentation for the Rockwell R6545 in combination with R18, R19 and R8 and the Status Register.
  
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.  
+
In the UM6845R it appears to have no effect. Reading and writing does nothing. Reading it returns 0x0ff.
  
Just like other CRTCs when RC==(R9-1), the current MA is captured for the next char-line.
+
R31 doesn't exist on types 0,2,3,4.
  
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.
+
<br>
  
== UM6845R status register ==
+
=== Status register on Type 1 ===
  
 
The UM6845R has a status register that can be read using port &BExx.
 
The UM6845R has a status register that can be read using port &BExx.
Line 398: Line 429:
  
 
All the other bits read as 0 and don't have any function.
 
All the other bits read as 0 and don't have any function.
 +
 +
<br>
 +
 +
=== 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
 +
|0
 +
1
 +
|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
 +
|0
 +
0
 +
|C0=0..R0-1 : VMA.Lsb=0xFF
 +
C0=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)
 +
|}
 +
 +
<br>
 +
 +
=== 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 screen
 +
20 OUT &BC00,31:IF INP(&BF00)=255 THEN PRINT"crtc 1":END
 +
30 OUT &BC00,12:IF INP(&BF00)=0 THEN PRINT"crtc 2":END
 +
40 OUT &BC00,20:IF INP(&BF00)=0 THEN PRINT"crtc 0":END
 +
50 PRINT"crtc 3/4"
 +
</pre>
 +
<br>
 +
 +
== CRTC Timing Diagrams ==
 +
[[File:CRTC Timing Diagram Rockwell.png]]
 +
 +
<br>
 +
 +
[[File:CRTC timing small.gif]]
 +
 +
<br>
 +
 +
== Internal Counters ==
 +
 +
{| class="wikitable sortable"
 +
! Counter name
 +
! Abbr
 +
! Alternate name
 +
! Comment
 +
|-
 +
|Horizontal Character Counter
 +
|HCC
 +
|C0
 +
|
 +
|-
 +
|Horizontal Sync Counter
 +
|HSC
 +
|C3l
 +
|
 +
|-
 +
|Vertical Character Counter
 +
|VCC
 +
|C4
 +
|
 +
|-
 +
|Vertical Sync Counter
 +
|VSC
 +
|C3h
 +
|-
 +
|Vertical Line Counter
 +
|VLC
 +
|C9
 +
|If non-interlace, this counter is exposed on CRTC pins RA0..RA4
 +
|-
 +
|Vertical Total Adjust Counter
 +
|VTAC
 +
|C5
 +
|This counter does not exist on CRTCs 0/3/4. C9 is reused instead
 +
|-
 +
|Frame Counter
 +
|FC
 +
|
 +
|Used to alternate frames in interlace and for CRTC cursor blinking
 +
|-
 +
|Memory Address
 +
|MA
 +
|
 +
|This counter is exposed on CRTC pins MA0..MA13
 +
|}
 +
 +
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 MA because it is reloaded at each raster line start.
 +
 +
R12/R13 is loaded only once per frame, in MA and MA', at the first raster line start of the frame. The counter MA is then reloaded with the value of MA' at each raster line start. And at each new character line start, MA' captures the current value of MA.
 +
 +
The exception is the CRTC 1 for which MA is reloaded at each raster line start with R12/R13 instead of MA' as long as VCC=0.
 +
 +
This is a major source of incompatibility if the programmer does not take care of this discrepancy. In demos and games, to make a display compatible with all CRTCs, program R12/R13 when VCC!=0. This will then take effect at the next frame start.
 +
 +
<br>
 +
 +
== CRTC counter differences ==
 +
 +
=== VSC (C3h) overflow ===
 +
 +
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 continue to count up to its maximum value (15) before looping back and counting up again until it reaches the new value of R3h.
 +
 +
On CRTCs 1/2, the VSYNC width is fixed to 16 characters. It is not possible to modify it. Therefore, VSC cannot be overflowed.
 +
 +
<br>
 +
 +
=== HSC (C3l) overflow ===
 +
 +
During an HSYNC, if HSYNC Width (R3l) is changed with a value less than the current HSC, then HSC overflows and will continue to count up to its maximum value (15) before looping back and counting up again until it reaches the new value of R3l.
 +
 +
The only exception is for CRTC 1 with a value of 0, which immediately cancels the current HSYNC.
 +
 +
<br>
 +
 +
=== VCC (C4) overflow ===
 +
 +
On all CRTCs, if Vertical Total (R4) is changed with a value less than VCC, then:
 +
* if this update was done when VCC < R4, then VCC overflows and will continue to count up to its maximum value (127) before looping back and counting up again until it reaches the new value of R4
 +
* 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
 +
 +
The only exception when VCC = R4 is for CRTC 1 with a value of 0, which will cause VCC to overflow.
 +
 +
<br>
 +
 +
=== HCC (C0) overflow ===
 +
 +
If Horizontal Total (R0) is changed with a value less than the current HCC, then:
 +
* 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
 +
* on CRTCs 3/4, the current line is considered finished and HCC is immediately reset to 0 on the next line
 +
 +
<br>
 +
 +
=== VLC (C9) overflow ===
 +
 +
If Number of Scan Lines (R9) is changed with a value less than the current VLC, then:
 +
* 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
 +
* 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
 +
 +
<br>
 +
 +
=== VTAC (C5/C9) overflow ===
 +
 +
During vertical adjustment mode, if Vertical Total Adjust (R5) is changed with a value less than the current VTAC, then:
 +
* on CRTCs 0/1/2, VTAC overflows and will continue to count up to its maximum value (31) before looping back and counting up again until it reaches the new value of R5
 +
* on CRTCs 3/4, the current line is considered the last one of the current frame and vertical adjustment will end
 +
 +
<br>
 +
 +
=== Vertical Adjustment mode ===
 +
 +
On CRTCs 0/1/2, this mode increments VCC and so VCC goes beyond R4.
 +
 +
On CRTCs 3/4, this mode does not increment VCC and so VCC stays equal to R4.
 +
 +
<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 ==
 
== Datasheets ==
  
* [[Media:hd6845.hitachi.pdf|HD6845S (Hitachi) (aka type 0)]]
+
* [[Media:hd6845.hitachi.pdf|HD6845S (Hitachi)]] aka Type 0
* [[Media:Um6845.umc.pdf|UM6845 (UMC)  (aka type 0)]]
+
* [[Media:UM6845-UMC.pdf|UM6845 (UMC)]] aka Type 0
* [[Media:Um6845r.umc.pdf|UM6845R (UMC) (aka type 1)]]
+
* [[Media:Um6845r.umc.pdf|UM6845R (UMC)]] aka Type 1
* [[Media:Mc6845.motorola.pdf|MC6845 (Motorola) (aka type 2)]]
+
* [[Media:Mc6845.motorola.pdf|MC6845 (Motorola)]] aka Type 2 [[Media:Mc6845.pdf|Other datasheet version]]
 +
* [[Media:CPC_Plus_Asic_Schematic.GIF|AMS40489 (Amstrad)]] aka Type 3
 +
* [[AMS40226 (Amstrad)]] aka Type 4
 +
*[[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]
  
* [[VHDL implementation of the 6845]]
+
<br>
  
== Clones ==
+
== Unused clones ==
* [CM607P   a Bulgarian clone made in Pravetz factory]
+
* [[CM607P]] a Bulgarian clone made in Pravetz factory
* [EF6845P by Thomson Semiconductors]
+
* [[Media:EF6845P.pdf|EF6845]] by Thomson Semiconductors
 +
* [[Media:UM6845E-UMC.pdf|UM6845E]] by UMC
 +
* [[Media:F6845.pdf|F6845]] by Fairchild
 +
* [[Media:Mos 6545-1 crtc.pdf|CRTC 6545]] (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
  
 +
<br>
  
 
== Tools about CRTC ==
 
== Tools about CRTC ==
  
* [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)
+
* [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: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)
 +
* [[File:Shaker addon.dsk]] Shaker Add-On (Pixel 1 Hard Scroll / Vertical Rupture all Crtc)
 +
 
 +
<br>
  
 
== Links ==
 
== Links ==
  
 
* [http://en.wikipedia.org/wiki/6845 Wikipedia on the CRTC]
 
* [http://en.wikipedia.org/wiki/6845 Wikipedia on the CRTC]
* [http://www.grimware.org/doku.php/documentations/devices/crtc CRTCs on grimware]
+
* [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://pulkomandy.github.io/shinra.github.io/crtc.html Differences between CRTC types]
 +
* [[Media:Dossier 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.8-EN.pdf]] [[Media:ACCC1.8-FR.pdf]] CPC CRTC Compendium - Latest (04/2024!) document containing in-depth info about CRTC programming on CPC.
 +
 
 +
<br>
  
 
==Related pages==
 
==Related pages==
Line 432: Line 753:
 
*[[Synchronising with the CRTC and display]] : technic and details on the relationship between Gate Array and CRTC.
 
*[[Synchronising with the CRTC and display]] : technic and details on the relationship between Gate Array and CRTC.
  
[[Category:Hardware]] [[Category:CPC Internal Components]] [[Category:Programming]] [[Category:Datasheet]] [[Category:Graphic]]
+
[[Category:Hardware]] [[Category:CPC Internal Components]] [[Category:Electronic Component]] [[Category:Programming]] [[Category:Datasheet]] [[Category:Graphic]]

Latest revision as of 07:19, 3 July 2024

The CRTC (Cathode Ray Tube Controller) helps to generate the video signal of the Amstrad CPC.

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.


Overview

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.

The CRTC was a common part available from many different manufacturers. During the life of the CPC, Amstrad sourced the CRTC from various manufacturers.

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.

This table lists the known ICs used, with their part number, manufacturer and type number.

Part number Manufacturer Type number (note 3)
HD6845S Hitachi 0
UM6845 UMC 0
UM6845R UMC 1
MC6845 Motorola 2
AMS40489 Amstrad 3 (note 1)
40226 Amstrad 4 (note 2)

NOTES

1. The CRTC functionality is integrated into the CPC+ ASIC. This type exists only in the CPC464+,CPC6128+ and GX4000.

2. This type exists in "cost-down" CPC464 and CPC6128 systems. In the "cost-down" the CRTC functionality is integrated into a single ASIC IC. This ASIC is often refered to as the "Pre-ASIC" because it preceeded the CPC+ ASIC. The CRTC functionality of the Pre-ASIC is almost identical to the CRTC within the ASIC.

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.

As far as I know, the type number system was originally used by demo programmers.

It is possible to detect the 6845 present using software methods, and this is done to:

  • warn that the software was not designed for the detected 6845 and may function incorrectly,
  • to adapt the software so that it will run with the detected 6845
  • In most cases, the type of the detected 6845 is reported.

4. As far as I know, the KC compact used HD6845R only.


Timings and relating with Z80 instructions count

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 (To be extracted/edited to conform to wiki good practices).


Programming

The 6845 is selected when bit 14 of the I/O port address is set to "0". 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 "1" to avoid conflict with other devices in the system.

The recommended I/O port addresses are

I/O port address Function Read/Write
&BCxx Select 6845 register Write only
&BDxx Write 6845 register data Write only
&BExx (note 1) Read only
&BFxx (note 1) Read only

NOTE

1. The function of these I/O ports is dependant on the CRTC type

2. The CRTC is not connected to the CPU's RD and WR pins, so the CRTC is not aware of the CPU bus I/O direction. Therefore, 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.


Addressing

The video memory address VMA of the Gate Array is constructed from the CRTC MA and RA signals.

Video Memory Address Signal source Signal name
A15 6845 MA13
A14 6845 MA12
A13 6845 RA2
A12 6845 RA1
A11 6845 RA0
A10 6845 MA9
A9 6845 MA8
A8 6845 MA7
A7 6845 MA6
A6 6845 MA5
A5 6845 MA4
A4 6845 MA3
A3 6845 MA2
A2 6845 MA1
A1 6845 MA0
A0 Gate-Array CCLK

CRTC generates the address, Gate Array reads the data and converts it to pixels based on its current graphics mode and palette.

CRTC pins RA3, RA4, MA10, MA11 are not connected on CPC.


CUDISP (aka CURSOR)

CUDISP (Cursor Display) 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 (aka Display Enable)

DISPTMG (Display Timing) signal defines the border. When DISPTMG is "0" the border colour is output by the Gate Array to the display.

The border has higher priority than pixels but lower priority than the black colour output when HSYNC/VSYNC are active.

The DISPTMG can be forced to 0 by 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.


HSYNC and VSYNC

On CPC, HSYNC and VSYNC from the CRTC are passed to the Gate Array for further modification. See its wiki page.

The HSYNC width value is interpreted differently between CRTCs. On CRTCs 0/1, if 0 is programmed no HSYNC is generated. On CRTCs 2/3/4, if 0 is programmed this gives a HSYNC width of 16.

CRTCs 1/2 have a fixed VSYNC width value of 16. VSYNC width can be configured with Register 3 on CRTCs 0/3/4. If 0 is programmed this gives 16 lines of VSYNC.

The bit 0 of port B of the PPI changes to 1 as soon as the VSYNC signal is produced by the CRTC.


CRTC registers

The Internal registers of the 6845 are:

Register Index Register Name Range CPC Setting Notes
0 Horizontal Total (-1) 00000000 63 Width of the screen, in characters. Should always be 63 (64 characters). 1 character == 1μs.
1 Horizontal Displayed 00000000 40 Number of characters displayed. Once horizontal character count (HCC) matches this value, DISPTMG is set to 1.
2 Horizontal Sync Position 00000000 46 When to start the HSync signal.
3 Horizontal and Vertical Sync Widths VVVVHHHH 128+14 VSync width in scan-lines (Not present on all CRTCs, fixed to 16 lines on these) ; HSync pulse width in characters.
4 Vertical Total (-1) x0000000 38 Height of the screen, in characters.
5 Vertical Total Adjust xxx00000 0 Measured in scanlines, can be used for smooth vertical scrolling on CPC.
6 Vertical Displayed x0000000 25 Height of displayed screen in characters. Once vertical character count (VCC) matches this value, DISPTMG is set to 1.
7 Vertical Sync Position x0000000 30 When to start the VSync signal, in characters.
8 Interlace and Skew 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.
9 Maximum Raster Address (aka Number of Scan Lines) (-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 connected 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.
14 Cursor Address (High) xx000000 0
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 0xff.

Details about Reg. 12 and Reg. 13 specifically:

 .------- REG 12 --------.   .------- REG 13 --------.
 |                       |   |                       |
  15 14 13 12 11 10 09 08     07 06 05 04 03 02 01 00
 .--.--.--.--.--.--.--.--.   .--.--.--.--.--.--.--.--.
 |X |X |  |  |  |  |  |  |   |  |  |  |  |  |  |  |  |
 '--'--'--'--'--'--'--'--'   '--'--'--'--'--'--'--'--'
       '--.--'--.--'---------------.-----------------'
          |     |                  |
          |     |                  '------> Offset for setting
          |     |                           videoram 
          |     |                           (1024 positions)
          |     |                           Bits 0..9
          |     |
          |     '-------------------------> Video Buffer : note (1)
          |
          '-------------------------------> Video Page : note (2)
 note (1)                 note (2)
 .--.--.--------------.  .--.--.---------------.
 |11|10| Video Buffer |  |13|12|   Video Page  |
 |--|--|--------------|  |--|--|---------------|
 | 0| 0|     16Ko     |  | 0| 0|  0000 - 3FFF  |
 |--|--|--------------|  |--|--|---------------|
 | 0| 1|     16Ko     |  | 0| 1|  4000 - 7FFF  |
 |--|--|--------------|  |--|--|---------------|
 | 1| 0|     16Ko     |  | 1| 0|  8000 - BFFF  |
 |--|--|--------------|  |--|--|---------------|
 | 1| 1|     32Ko     |  | 1| 1|  C000 - FFFF  |
 '--'--'--------------'  '--'--'---------------'

So, it's possible to use 32KB screen size (used for 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.


CRTC register differences

The following tables list the functions that can be accessed for each type:

Type 0

b1 b0 Function Read/Write
0 0 Select internal 6845 register Write Only
0 1 Write to selected internal 6845 register Write Only
1 0 - -
1 1 Read from selected internal 6845 register Read Only

Type 1

b1 b0 Function Read/Write
0 0 Select internal 6845 register Write Only
0 1 Write to selected internal 6845 register Write Only
1 0 Read Status Register Read Only
1 1 Read from selected internal 6845 register Read Only

Type 2

b1 b0 Function Read/Write
0 0 Select internal 6845 register Write Only
0 1 Write to selected internal 6845 register Write Only
1 0 - -
1 1 Read from selected internal 6845 register Read Only

Type 3 and 4

b1 b0 Function Read/Write
0 0 Select internal 6845 register Write Only
0 1 Write to selected internal 6845 register Write Only
1 0 Read from selected internal 6845 register Read Only
1 1 Read from selected internal 6845 register Read Only

It is not possible to read from all the internal registers, this table shows the read/write status of each register for each type:

Register Index Register Name Type
0 1 & 2 3 & 4
0 Horizontal Total (-1) Write Only
1 Horizontal Displayed Write Only
2 Horizontal Sync Position Write Only
3 Horizontal and Vertical Sync Widths Write Only
4 Vertical Total (-1) Write Only
5 Vertical Total Adjust Write Only
6 Vertical Displayed Write Only
7 Vertical Sync Position Write Only
8 Interlace and Skew Write Only
9 Maximum Raster Address (aka Number of Scan Lines) (-1) Write Only
10 Cursor Start Raster Write Only Write Only Read/Write
11 Cursor End Raster Write Only Write Only Read/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
15 Cursor Address (Low) Read/Write
16 Light Pen Address (High) Read Only
17 Light Pen Address (Low) Read Only

Notes

  • On types 0 and 1, if a Write Only register is read from, "0" is returned.
  • CRTC types 3 and 4 are identical in every way, except for the unlocking 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.

Type 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 this gives a HSYNC width of 16.


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.
  • Bits 1..0 define the interlace mode (00 = No Interlace; 01 = Interlace Sync; 10 = No Interlace; 11 = Interlace Sync and Video).

Types 1/2:

  • Bits 7..2 are ignored.
  • Bits 1..0 define the interlace mode.


2 interlace modes are available:

  • In interlace sync mode, the same information is painted in both fields to enhance readability. In this mode, reprogramming the CRTC is not necessary
  • In interlace sync and video mode, alternating lines are displayed in the even and odd field to double the resolution. In this mode, it is necessary to reprogram the CRTC as if we were building a frame of 624 lines. The 625th line is managed automatically by the CRTC

CRTC Interlace modes.png


R31 on Type 1

R31 is described in the UM6845R documentation as "Dummy Register".

Its use is described in the documentation for the Rockwell R6545 in combination with R18, R19 and R8 and the Status 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.


Status register on Type 1

The UM6845R has a status register that can be read using port &BExx.

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.

Bit 5 is set to 1 when CRTC is in "vertical blanking". Vertical blanking is when the vertical border is active. i.e. VCC>=R6.

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. This bit will be 0 when pixels are being displayed.

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.

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 0

1

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 0

0

C0=0..R0-1 : VMA.Lsb=0xFF

C0=R0 : VMA'.Lsb=0x00 (same cond if C0=R0=0)

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:

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.


CRTC Type Detection

10 MODE 1:' Reinitialize screen
20 OUT &BC00,31:IF INP(&BF00)=255 THEN PRINT"crtc 1":END
30 OUT &BC00,12:IF INP(&BF00)=0 THEN PRINT"crtc 2":END
40 OUT &BC00,20:IF INP(&BF00)=0 THEN PRINT"crtc 0":END
50 PRINT"crtc 3/4"


CRTC Timing Diagrams

CRTC Timing Diagram Rockwell.png


CRTC timing small.gif


Internal Counters

Counter name Abbr Alternate name Comment
Horizontal Character Counter HCC C0
Horizontal Sync Counter HSC C3l
Vertical Character Counter VCC C4
Vertical Sync Counter VSC C3h
Vertical Line Counter VLC C9 If non-interlace, this counter is exposed on CRTC pins RA0..RA4
Vertical Total Adjust Counter VTAC C5 This counter does not exist on CRTCs 0/3/4. C9 is reused instead
Frame Counter FC Used to alternate frames in interlace and for CRTC cursor blinking
Memory Address MA This counter is exposed on CRTC pins MA0..MA13

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 MA because it is reloaded at each raster line start.

R12/R13 is loaded only once per frame, in MA and MA', at the first raster line start of the frame. The counter MA is then reloaded with the value of MA' at each raster line start. And at each new character line start, MA' captures the current value of MA.

The exception is the CRTC 1 for which MA is reloaded at each raster line start with R12/R13 instead of MA' as long as VCC=0.

This is a major source of incompatibility if the programmer does not take care of this discrepancy. In demos and games, to make a display compatible with all CRTCs, program R12/R13 when VCC!=0. This will then take effect at the next frame start.


CRTC counter differences

VSC (C3h) overflow

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 continue to count up to its maximum value (15) before looping back and counting up again until it reaches the new value of R3h.

On CRTCs 1/2, the VSYNC width is fixed to 16 characters. It is not possible to modify it. Therefore, VSC cannot be overflowed.


HSC (C3l) overflow

During an HSYNC, if HSYNC Width (R3l) is changed with a value less than the current HSC, then HSC overflows and will continue to count up to its maximum value (15) before looping back and counting up again until it reaches the new value of R3l.

The only exception is for CRTC 1 with a value of 0, which immediately cancels the current HSYNC.


VCC (C4) overflow

On all CRTCs, if Vertical Total (R4) is changed with a value less than VCC, then:

  • if this update was done when VCC < R4, then VCC overflows and will continue to count up to its maximum value (127) before looping back and counting up again until it reaches the new value of R4
  • 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

The only exception when VCC = R4 is for CRTC 1 with a value of 0, which will cause VCC to overflow.


HCC (C0) overflow

If Horizontal Total (R0) is changed with a value less than the current HCC, then:

  • 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
  • on CRTCs 3/4, the current line is considered finished and HCC is immediately reset to 0 on the next line


VLC (C9) overflow

If Number of Scan Lines (R9) is changed with a value less than the current VLC, then:

  • 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
  • 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


VTAC (C5/C9) overflow

During vertical adjustment mode, if Vertical Total Adjust (R5) is changed with a value less than the current VTAC, then:

  • on CRTCs 0/1/2, VTAC overflows and will continue to count up to its maximum value (31) before looping back and counting up again until it reaches the new value of R5
  • on CRTCs 3/4, the current line is considered the last one of the current frame and vertical adjustment will end


Vertical Adjustment mode

On CRTCs 0/1/2, this mode increments VCC and so VCC goes beyond R4.

On CRTCs 3/4, this mode does not increment VCC and so VCC stays equal to R4.


Hitachi Block Diagram

CRTC Block Diagram.png


UMC Block Diagram

UMC CRTC Block Diagram.png


Motorola Block Diagram

Motorola CRTC Block Diagram.png


Datasheets


Unused clones

  • CM607P a Bulgarian clone made in Pravetz factory
  • EF6845 by Thomson Semiconductors
  • UM6845E by UMC
  • F6845 by Fairchild
  • CRTC 6545 (MOS, Rockwell, Synertek) is pin-compatible with the 6845 and only has minor differences
  • BeebFpga MiSTer OpenCores Verilog/VHDL implementations of the 6845


Tools about CRTC


Links


Related pages