TMS9927 CRT Controller
From Intellivision Wiki
The TMS9927 CRT Controller (also known as the SMC CRT5027) is simple CRT controller capable of a wide range of operating modes. The TMS9927 and CRT5027 data sheets describes the full capability of the part. The Keyboard Component uses the CRT controller to provide white text on a 40x24 grid. The characters are formed from an character generator font stored in the Keyboard Component itself. This font differs from the font found in the Master Component's GROM.
The CRT controller synchronizes with the STIC so that the two produce video that can be overlaid. The CRT controller's output gets fed into the "EXT VIDEO" (pin 8) input on the Master Component's Cartridge Port. (This input was removed on the Intellivision II.) A diode and resistor tie the CRT input to the STIC's output, giving the CRT controller the ability to pull the video image to "white." The result is white text overlaid on the STIC's current display output.
The Keyboard synchronizes the CRT with the STIC using (most likely) a Phase-Locked Loop (PLL) that locks to some combination of the CBLNK, SR1 and INTRM signals coming from the Master Component. These STIC signals indicate the STIC's current display timing and are sufficient for the Keyboard to synchronize with the STIC's output. The Master Component also outputs a 3.579545MHz clock (NTSC color burst), which most likely provides the video dot clock to the TMS 9927. One artifact of the PLL synchronization is that the Keyboard Component's title screen appears to "spin" momentarily after reset as the Keyboard locks onto the Master's signals.
One hardware oddity exists in the Master Component's circuitry for merging the Keyboard's external video. Close examination of the AY-3-8915 Color Processor's data sheet indicates an "ext. video" pin intended for "high resolution video input." It's unclear why the Master Component does not use this input for the Keyboard's video.
The 6502 programs the CRT controller through a series of memory mapped registers and a frame buffer stored in RAM. The Master Component cannot directly program the CRT controller.
The CRT controller implements the following registers:
|$40C0||Control Register 0|
|$40C1||Control Register 1|
|$40C2||Control Register 2|
|$40C3||Control Register 3|
|$40C4||Control Register 4|
|$40C5||Control Register 5|
|$40C6||Control Register 6|
|$40C7||Processor Self Load command|
|$40C8||Read Cursor Column|
|$40C9||Read Cursor Row|
|$40CA||Reset: Halts and prepares timing chain for sync-up|
|$40CB||Up Scroll: Causes all lines on screen to scroll up by 1, with the top line becoming the new bottom line.|
|$40CC||Load Cursor Column|
|$40CD||Load Cursor Row|
|$40CE||Start Timing Chain|
|$40CF||Non-processor Self Load|
The following table describes Control Registers 0 through 6:
|Control Register 0||Horizontal character count (total scan line, not visible characters)|
|Control Register 1||
|Control Register 2||
|Control Register 3||
|Control Register 4||Scan lines / Frame|
|Control Register 5||Vertical Data Start|
|Control Register 6||Last Displayed Row|
In addition to the CRT controller's register set, bit 0 at location $4043 controls the visibility of the CRT controller's video. Writing 1 to this location makes the display visible. Writing 0 blanks out the CRT controller's display.
The CRT's text frame buffer resides at $B800 - $BFFF. The first 960 bytes of this memory hold the displayed text. After reset, Row 0 of the display resides at $B800 - $B827. Row 1 resides at $B828 - $B84F, and so on. Writes to either $40C6 or $40CB will rotate the mapping of rows to addresses. This allows for hardware scrolling.
Default Operating Mode
The Keyboard initializes the CRT controller with the following code:
;--- CRT controller initialization sequence C956 LDA $40CA ; Strobe screen scan location reset C959 LDX #$07 C95B LDA $C96A,X ; \ C95E STA $40BF,X ; |__ Copy video parameters to display from C961 DEX ; | table below. 9927 is at $40C0..$40CF C962 BNE $C95B ; / C964 JSR $C917 ; Clear column position. C967 LDA $40CE ; Strobe 9927 timing chain start C96A RTS ; Done! . ;--- Data to load C96B .byte $38 ; $40C0: Horiz character count = 56 .byte $25 ; $40C1: HSync Width = 4, HSync Delay = 5 .byte $3A ; $40C2: Scans/Data Row = 7, Chars/Data Row = 4 .byte $97 ; $40C3: Skew = 2, Data Rows/Frame = 23 .byte $03 ; $40C4: Scan lines/Frame = 3 .byte $44 ; $40C5: Vertical Data Start = 70 .byte $17 ; $40C6: Last displayed data row = 23
See the CRT5027 Data Sheet for more information on the encodings for the various control register fields.