Changes the hardware palette colour values (selecting new ones).
void cpct_setPalette (u8* colour_array, u16 size)
(2B HL) colour_array | Pointer to a byte array containing new hardware colour values [0 - 31] |
(2B DE) size | [1 - 16] Number of colours to change |
call cpct_setPalette_asm
This function requires the CPC firmware to be DISABLED. Otherwise, it may not work, as firmware tends to restore palette colour values to its own selection.
This function modifies hardware palette registers to set new colours to use. These colours values are easily identified with PENs on the CPC, and are the ones shown in the 2nd column of Table 1. The function starts modiying PEN 0, and goes changing PEN 1, 2, 3... up to the number of provided colours (size) from the colour_array. It is important to notice that this function requires hardware colour values, which are different from firmware colour values (usually known as INKs on the CPC). Table 1 shows all of them, and you may use it for reference.
Palette registers are contained inside the PAL chip of the CPC (which is located inside the Gate Array). To access PAL chip, the same port (&7F) as Gate Array is used. The function is not thought to be optimal, but secure. If a more optimal one is required, it can be derived from this code. The array of color values passed to this routine must include hardware color values (0-31) and not firmware ones.
Firmware | Hardware | Hard+Command | Colour Name | R% G% B% Colour --------------------------------------------------------------------------- 0 | 20 (0x14) | 0x54 | Black | 0 0 0 1 | 4 (0x04) | 0x44 (0x50) | Blue | 0 0 50 2 | 21 (0x15) | 0x55 | Bright Blue | 0 0 100 3 | 28 (0x1C) | 0x5C | Red | 50 0 0 4 | 24 (0x18) | 0x58 | Magenta | 50 0 50 5 | 29 (0x1D) | 0x5D | Mauve | 50 0 100 6 | 12 (0x0C) | 0x4C | Bright Red | 100 0 0 7 | 5 (0x05) | 0x45 (0x48) | Purple | 100 0 50 8 | 13 (0x0D) | 0x4D | Bright Magenta | 100 0 100 9 | 22 (0x16) | 0x56 | Green | 0 50 0 10 | 6 (0x06) | 0x46 | Cyan | 0 50 50 11 | 23 (0x17) | 0x57 | Sky Blue | 0 50 100 12 | 30 (0x1E) | 0x5E | Yellow | 50 50 0 13 | 0 (0x00) | 0x40 (0x41) | White | 50 50 50 14 | 31 (0x1F) | 0x5F | Pastel Blue | 50 50 100 15 | 14 (0x0E) | 0x4E | Orange | 100 50 0 16 | 7 (0x07) | 0x47 | Pink | 100 50 50 17 | 15 (0x0F) | 0x4F | Pastel Magenta | 100 50 100 18 | 18 (0x12) | 0x52 | Bright Green | 0 100 0 19 | 2 (0x02) | 0x42 (0x51) | Sea Green | 0 100 50 20 | 19 (0x13) | 0x53 | Bright Cyan | 0 100 100 21 | 26 (0x1A) | 0x5A | Lime | 50 100 0 22 | 25 (0x19) | 0x59 | Pastel Green | 50 100 50 23 | 27 (0x1B) | 0x5B | Pastel Cyan | 50 100 100 24 | 10 (0x0A) | 0x4A | Bright Yellow | 100 100 0 25 | 3 (0x03) | 0x43 (0x49) | Pastel Yellow | 100 100 50 26 | 11 (0x0B) | 0x4B | Bright White | 100 100 100 --------------------------------------------------------------------------- Table 1. Colour values on the CPC (Firmware, Hardware and RGB)
Table 1 shows Firmware colour values (column 1), Hardware correspondant colour values (column 2) and classic Hardware values (column 3) which include the colour value (5 Least significant bits) along with the command for the Gate Array (3 Most significant bits). As this function already provides hardware commands, the values it requires are the ones from column 2 (Hardware). Table 1 also provides colour names and precentages of RGB values for better understanding.
This function cannot set blinking colors, as blinking colours are managed by the firmware (not by hardware).
AF, BC, DE, HL
C-bindings | 23 bytes |
ASM-bindings | 19 bytes |
Case | microSecs (us) | CPU Cycles --------------------------------------------- Any | 22 + 20*NC | 88 + 80*NC --------------------------------------------- Asm saving | -13 | -52 --------------------------------------------- NC = 4 | 102 | 408 NC = 16 | 342 | 1368
NC=Number of colours to be set
This function has been constructed with great help from the documentation at Grimware about the Gate Array.
http://www.grimware.org