If we are drawing a sprite, we use our pixel coordinates to define the upper-left coordinate of the sprite.
Since the CPC and KC Compact do not have sprite hardware, we will need to plot the sprites using a software function.
If we want to plot graphics to the display, e.g. to draw a sprite, then we will need to be able to calculate a memory address from our pixel coordinates.
This document will describe how this is done.
The CPC display hardware generates a memory address by using the CRTC MA (MA0-MA13) and RA (RA0-RA5) outputs in the following way:
| Memory address Signal | 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 | 
Notes
The screen has the following form:
When R9 is 7:
| line 0 | 0 + &000 | 
| line 1 | 0 + &800 | 
| line 2 | 0 + &1000 | 
| line 3 | 0 + &1800 | 
| line 4 | 0 + &2000 | 
| line 5 | 0 + &2800 | 
| line 6 | 0 + &3000 | 
| line 7 | 0 + &3800 | 
| line 8 | ((R1*1)*2) + &000 | 
| line 9 | (R1*2) + &800 | 
| line 10 | (R1*2) + &1000 | 
| line 11 | (R1*2) + &1800 | 
| line 12 | (R1*2) + &2000 | 
| line 13 | (R1*2) + &2800 | 
| line 14 | (R1*2) + &3000 | 
| line 15 | (R1*2) + &3800 | 
| line 16 | (R1*2) + &000 | 
| line 17 | (R1*2) + &800 | 
| line 18 | (R1*2) + &1000 | 
| line 19 | (R1*2) + &1800 | 
| line 20 | (R1*2) + &2000 | 
| line 21 | (R1*2) + &2800 | 
| line 22 | (R1*2) + &3000 | 
| line 23 | (R1*2) + &3800 | 
CRTC character row = (y_coordinate/(R9+1))
CRTC character scan line = y_coordinate - (CRTC character row*(R9+1));
Byte offset to CRTC row start = CRTC character row * (R1*2)
Byte offset to CRTC character scan line = CRTC character scan line * &0800
Byte offset to start of line = Byte offset to CRTC row start + Byte offset to CRTC character scan line
For a 16k screen:
screen start byte offset = (((R12 & 0x03)*256) + (R13 & 255))*2
For a 32k screen:
screen start byte offset = (((R12 & 15)*256) + (R13 & 255))*2
On a hardware scrolling screen, there is a problem:
| C7FF->C000 | 
| CFFF->C800 | 
| D7FF->D000 | 
| DFFF->D800 | 
| E7FF->E000 | 
| EFFF->E800 | 
| F7FF->F000 | 
| FFFF->F800 |