ROLAND
0.70
Amstrad Emulator based on Caprice Source rewritten in C++.
|
#include <crtc.h>
Public Types | |
enum | Register : tUBYTE { HorizontalTotal = 0, HorizontalDisplayed = 1, HorizontalSyncPosition = 2, SyncWidth = 3, VerticalTotal = 4, VerticalTotalAdjust = 5, VerticalDisplayed = 6, VerticalSyncPosition = 7, InterlaceAndSkew = 8, MaximumRasterAddress = 9, CursorStartRaster = 10, CursorEndRaster = 11, StartAddressHigh = 12, StartAddressLow = 13, CursorHigh = 14, CursorLow = 15, LightPenHigh = 16, LightPenLow = 17 } |
enum | Flags : tUWORD { VS = 1, HS = 2, HDT = 4, VDT = 8, HT = 16, VT = 32, MR = 64, VTadj = 128, VSf = 256 } |
The CRTC6845 CRTC6845
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) |
---|---|---|
UM6845 | UMC | 0 |
HD6845S | Hitachi | 0 |
UM6845R | UMC | 1 |
MC6845 | Motorola | 2 |
AMS40489 | Amstrad | 3 (note 1) |
??? | Amstrad? | 4 (note 2) |
NOTES:
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:
In most cases, the type of the detected 6845 is reported.
The 6845 is selected when bit 14 of the I/O port address is set to "0". Bit 1 and 0 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 addressess 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:
The following table defines the generated memory address from the CRTC and Gate-Array signals.
Memory Address Signal | Signal source | Signal name |
---|---|---|
A15 | 6845 | MA13 |
A15 | 6845 | MA12 |
A14 | 6845 | MA11 |
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 |
The Internal registers of the 6845 are:
Register Index | Register Name |
---|---|
0 | Horizontal Total |
1 | Horizontal Displayed |
2 | Horizontal Sync Position |
3 | Horizontal and Vertical Sync Widths |
4 | Vertical Total | 5 | Vertical Total Adjust | 6 | Vertical Displayed |
7 | Vertical Sync position |
8 | Interlace and Skew |
9 | Maximum Raster Address |
10 | Cursor Start Raster |
11 | Cursor End Raster |
12 | Display Start Address (High) |
13 | Display Start Address (Low) |
14 | Cursor Address (High) |
15 | Cursor Address (High) |
16 | Light Pen Address (High) |
17 | Light Pen Address (High) |
In this section I will attempt to identify all the differences between each CRTC.
The following tables list the functions that can be accessed for each type:
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 |
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 |
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 |
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 | ||
0 | Horizontal Total | Write Only | Write Only | Write Only | (note 2) |
1 | Horizontal Displayed | Write Only | Write Only | Write Only | (note 2) |
2 | Horizontal Sync Position | Write Only | Write Only | Write Only | (note 2) |
3 | Horizontal and Vertical Sync Widths | Write Only | Write Only | Write Only | (note 2) |
4 | Vertical Total | Write Only | Write Only | Write Only | (note 2) | 5 | Vertical Total Adjust | Write Only | Write Only | Write Only | (note 2) | 6 | Vertical Displayed | Write Only | Write Only | Write Only | (note 2) |
7 | Vertical Sync position | Write Only | Write Only | Write Only | (note 2) |
8 | Interlace and Skew | Write Only | Write Only | Write Only | (note 2) |
9 | Maximum Raster Address | Write Only | Write Only | Write Only | (note 2) |
10 | Cursor Start Raster | Write Only | Write Only | Write Only | (note 2) |
11 | Cursor End Raster | Write Only | Write Only | Write Only | (note 2) |
12 | Display Start Address (High) | Read/Write | Write Only | Write Only | Read/Write (note 2) |
13 | Display Start Address (Low) | Read/Write | Write Only | Write Only | Read/Write (note 2) |
14 | Cursor Address (High) | Read/Write | Read/Write | Read/Write | Read/Write (note 2) ***check |
15 | Cursor Address (Low) | Read/Write | Read/Write | Read/Write | Read/Write (note 2) **check |
16 | Light Pen Address (High) | Read Only | Read Only | Read Only | Read Only (note 2) **check |
17 | Light Pen Address (High) | Read Only | Read Only | Read Only | Read Only (note 2) **check |
Notes:
|
inline |
References init(), ROLAND_DEFAULT, and Crtc::~Crtc().
~Crtc | ( | ) |
Referenced by Crtc::Crtc().
|
inline |
References Crtc::flags(), and Crtc::mFlags.
Referenced by Vdu::access_video_memory().
|
inline |
References Crtc::mAddr.
Referenced by Vdu::access_video_memory().
|
inline |
References Crtc::mCharCount.
Referenced by Vdu::access_video_memory().
|
inline |
References Crtc::mFlags.
Referenced by Vdu::access_video_memory(), Crtc::addFlags(), Crtc::setFlags(), and Cpc::z80_in_handler().
|
inline |
References Crtc::mHsw.
Referenced by Vdu::access_video_memory().
|
inline |
References Crtc::mHswActive.
Referenced by Vdu::access_video_memory().
|
inline |
References Crtc::mHswCount.
Referenced by Vdu::access_video_memory().
|
inline |
References Crtc::mHswVdu.
Referenced by Vdu::access_video_memory().
|
inline |
References Crtc::mVswCount.
Referenced by Vdu::access_video_memory().
|
inline |
References Crtc::mLastHDisp.
Referenced by Vdu::access_video_memory().
|
inline |
References Crtc::mLineCount.
Referenced by Vdu::access_video_memory().
|
inline |
References Crtc::mMaxRaster.
Referenced by Vdu::access_video_memory().
|
inline |
References Crtc::mRasterCount.
Referenced by Vdu::access_video_memory().
|
inline |
References Crtc::mRegister, and Crtc::mSelected.
Referenced by Vdu::access_video_memory(), and Cpc::z80_in_handler().
References Crtc::mRegister.
|
inline |
References Crtc::mFlags.
Referenced by Vdu::access_video_memory().
|
inline |
References Crtc::mRequestedAddr.
Referenced by Vdu::access_video_memory().
|
inline |
References Crtc::mSelected.
Referenced by Cpc::z80_out_handler().
|
inline |
References Crtc::mSelected.
Referenced by Cpc::z80_in_handler(), and Cpc::z80_out_handler().
|
inline |
References Crtc::mAddr.
Referenced by Vdu::access_video_memory().
|
inline |
References Crtc::mCharCount.
Referenced by Vdu::access_video_memory().
|
inline |
References Crtc::flags(), and Crtc::mFlags.
|
inline |
References Crtc::mHswActive.
Referenced by Vdu::access_video_memory().
|
inline |
References Crtc::mHswCount.
Referenced by Vdu::access_video_memory().
|
inline |
References Crtc::mHswVdu.
|
inline |
References Crtc::mLastHDisp.
Referenced by Vdu::access_video_memory().
|
inline |
References Crtc::mLineCount.
Referenced by Vdu::access_video_memory().
|
inline |
References Crtc::mRasterCount.
Referenced by Vdu::access_video_memory().
|
inline |
References Crtc::mSkew.
Referenced by Vdu::access_video_memory().
|
inline |
References Crtc::mVswCount.
Referenced by Vdu::access_video_memory().
|
inline |
References Crtc::mVtAdjust.
|
inline |
References Crtc::mVtAdjustCount.
Referenced by Vdu::access_video_memory().
|
inline |
References Crtc::mSkew.
Referenced by Vdu::access_video_memory().
|
inline |
References Crtc::mVsw.
Referenced by Vdu::access_video_memory().
|
inline |
References Crtc::mVswCount.
Referenced by Vdu::access_video_memory().
|
inline |
References Crtc::mVtAdjust.
Referenced by Vdu::access_video_memory().
|
inline |
References Crtc::mVtAdjustCount.
Referenced by Vdu::access_video_memory().
References Crtc::mRegister.
Referenced by Cpc::z80_out_handler().
void write | ( | tUBYTE | value | ) |
References Crtc::mHsw, Crtc::mHswVdu, Crtc::mMaxRaster, Crtc::mRegister, Crtc::mRequestedAddr, Crtc::mSelected, Crtc::mSkew, Crtc::mVsw, and Crtc::mVtAdjust.
|
private |
Referenced by Crtc::addr(), and Crtc::setAddr().
|
private |
Referenced by Crtc::charCount(), and Crtc::setCharCount().
|
private |
Referenced by Crtc::addFlags(), Crtc::flags(), Crtc::removeFlags(), and Crtc::setFlags().
|
private |
Referenced by Crtc::hsw(), and Crtc::write().
|
private |
Referenced by Crtc::hswActive(), and Crtc::setHswActive().
|
private |
Referenced by Crtc::hswCount(), and Crtc::setHswCount().
|
private |
Referenced by Crtc::hswVdu(), Crtc::setHswVdu(), and Crtc::write().
|
private |
Referenced by Crtc::lastHDisp(), and Crtc::setLastHDisp().
|
private |
Referenced by Crtc::lineCount(), and Crtc::setLineCount().
|
private |
Referenced by Crtc::maxRaster(), and Crtc::write().
|
private |
|
private |
Referenced by Crtc::rasterCount(), and Crtc::setRasterCount().
|
private |
Referenced by Crtc::read(), and Crtc::write().
|
private |
Referenced by Crtc::requestedAddr(), and Crtc::write().
|
private |
Referenced by Crtc::read(), Crtc::select(), Crtc::selected(), and Crtc::write().
|
private |
Referenced by Crtc::setSkew(), Crtc::skew(), and Crtc::write().
|
private |
Referenced by Crtc::vsw(), and Crtc::write().
|
private |
Referenced by Crtc::incVswCount(), Crtc::setVswCount(), and Crtc::vswCount().
|
private |
Referenced by Crtc::setVtAdjust(), Crtc::vtAdjust(), and Crtc::write().
|
private |
Referenced by Crtc::setVtAdjustCount(), and Crtc::vtAdjustCount().