Text colors working.

This commit is contained in:
Scott Duensing 2024-01-01 20:10:21 -06:00
parent 4cedb359a2
commit 7f259eb824
4 changed files with 122 additions and 45 deletions

View file

@ -9,6 +9,7 @@ START=0x2000
echo "__f256_start = ${START};" > ${SETTINGS}
mos-f256k-clang \
-fno-builtin-memset \
-I${F256}/include \
-I${F256}/f256lib \
-o pgztest \
@ -24,5 +25,5 @@ ${F256}/header/header \
pgztest.bin ${START}
#llvm-nm pgztest.elf
llvm-objdump -d --print-imm-hex pgztest.elf
hexdump -C pgztest.pgz
#llvm-objdump -d --print-imm-hex pgztest.elf
#hexdump -C pgztest.pgz

View file

@ -3,6 +3,8 @@
int main(void) {
reset();
print("F256 LIVES!");
print("F256 LIVES!\n");
setTextColor(LIGHT_GREEN, BLACK);
print("Green!");
return 0;
}

View file

@ -3,23 +3,23 @@
char error;
uint32_t textColors[16] = {
0xff000000, // 0 Black
0xffdd0033, // 1 Deep Red
0xff000099, // 2 Dark Blue
0xffdd22dd, // 3 Purple
0xff007722, // 4 Dark Green
0xff555555, // 5 Dark Gray
0xff2222ff, // 6 Medium Blue
0xff66aaff, // 7 Light Blue
0xff885500, // 8 Brown
0xffff6600, // 9 Orange
0xffaaaaaa, // A Light Gray
0xffff9988, // B Pink
0xff00dd00, // C Light Green
0xffffff00, // D Yellow
0xff55ff99, // E Aquamarine
0xffffffff // F White
colorT textColors[16] = {
{ 0x00, 0x00, 0x00 }, // 0 Black
{ 0xdd, 0x00, 0x33 }, // 1 Deep Red
{ 0x00, 0x00, 0x99 }, // 2 Dark Blue
{ 0xdd, 0x22, 0xdd }, // 3 Purple
{ 0x00, 0x77, 0x22 }, // 4 Dark Green
{ 0x55, 0x55, 0x55 }, // 5 Dark Gray
{ 0x22, 0x22, 0xff }, // 6 Medium Blue
{ 0x66, 0xaa, 0xff }, // 7 Light Blue
{ 0x88, 0x55, 0x00 }, // 8 Brown
{ 0xff, 0x66, 0x00 }, // 9 Orange
{ 0xaa, 0xaa, 0xaa }, // A Light Gray
{ 0xff, 0x99, 0x88 }, // B Pink
{ 0x00, 0xdd, 0x00 }, // C Light Green
{ 0xff, 0xff, 0x00 }, // D Yellow
{ 0x55, 0xff, 0x99 }, // E Aquamarine
{ 0xff, 0xff, 0xff } // F White
};
@ -27,39 +27,68 @@ static byte _MAX_COL = 80;
static byte _MAX_ROW = 60;
static byte _row = 0;
static byte _col = 0;
static byte _fcolor = 15;
static byte _bcolor = 0;
static byte _ccolor = 240;
// Clear screen, does not change text attributes.
// Clear screen to current text attributes.
void cls(void) {
int i;
byte *vram = (byte *)TEXT_MATRIX;
byte mmu;
mmu = PEEK(MMU_IO_CTRL); // Get current MMU state.
POKE(MMU_IO_CTRL, 2); // Swap I/O page 2 into bank 6.
byte mmu = PEEK(MMU_IO_CTRL); // Get current MMU state.
POKE(MMU_IO_CTRL, MMU_IO_TEXT); // Swap I/O page 2 into bank 6.
for (i = 0; i < _MAX_COL * _MAX_ROW; i++) *vram++ = 32;
POKE(MMU_IO_CTRL, MMU_IO_COLOR); // Swap I/O page 3 into bank 6.
vram = (byte *)TEXT_MATRIX;
for (i = 0; i < _MAX_COL * _MAX_ROW; i++) *vram++ = _ccolor;
POKE(MMU_IO_CTRL, mmu); // Restore MMU state.
gotoxy(0, 0);
}
// Define text color.
void defineTextColor(byte slot, byte fr, byte fg, byte fb, byte br, byte bg, byte bb) {
byte mmu;
byte *write;
mmu = PEEK(MMU_IO_CTRL); // Get current MMU state.
POKE(MMU_IO_CTRL, MMU_IO_PAGE_0); // Swap I/O page 0 into bank 6.
write = (byte *)VKY_TXT_FGLUT + slot * 4;
*write++ = fb;
*write++ = fg;
*write++ = fr;
*write++ = 0xff;
write = (byte *)VKY_TXT_BGLUT + slot * 4;
*write++ = bb;
*write++ = bg;
*write++ = br;
*write++ = 0xff;
POKE(MMU_IO_CTRL, mmu); // Restore MMU state.
}
// Move cursor.
void gotoxy(byte x, byte y) {
byte mmu;
mmu = PEEK(MMU_IO_CTRL); // Get current MMU state.
POKE(MMU_IO_CTRL, 0); // Swap I/O page 0 into bank 6.
POKE(MMU_IO_CTRL, MMU_IO_PAGE_0); // Swap I/O page 0 into bank 6.
_col = x;
POKE(CURSOR_X_LOW, _col); // Set cursor X position.
POKE(CURSOR_X_HIGH, 0);
POKE(VKY_CRSR_X_L, _col); // Set cursor X position.
POKE(VKY_CRSR_X_H, 0);
_row = y;
POKE(CURSOR_Y_LOW, _row); // Set cursor Y position.
POKE(CURSOR_Y_HIGH, 0);
POKE(VKY_CRSR_Y_L, _row); // Set cursor Y position.
POKE(VKY_CRSR_Y_H, 0);
POKE(MMU_IO_CTRL, mmu); // Restore MMU state.
}
@ -69,15 +98,17 @@ void gotoxy(byte x, byte y) {
void print(char *message) {
int x = 0;
int i = 0;
byte *vram = (byte *)TEXT_MATRIX + _col * _row;
byte mmu;
mmu = PEEK(MMU_IO_CTRL); // Get current MMU state.
POKE(MMU_IO_CTRL, 2); // Swap I/O page 2 into bank 6.
int j = 0;
byte *vram = (byte *)TEXT_MATRIX + _col + (_MAX_COL * _row);
byte *save = 0;
byte mmu = PEEK(MMU_IO_CTRL); // Get current MMU state.
while (message[x] != 0) {
switch (message[x]) {
default:
POKE(MMU_IO_CTRL, MMU_IO_COLOR); // Swap I/O page 3 into bank 6.
vram[_col] = _ccolor;
POKE(MMU_IO_CTRL, MMU_IO_TEXT); // Swap I/O page 2 into bank 6.
vram[_col] = message[x];
_col++;
if (_col != _MAX_COL) break;
@ -89,9 +120,18 @@ void print(char *message) {
if (_row == _MAX_ROW) {
// Scroll contents up one line.
vram = (byte *)TEXT_MATRIX;
for (i = 0; i < _MAX_COL * (_MAX_ROW - 1); i++) vram[i] = vram[i+_MAX_COL];
POKE(MMU_IO_CTRL, MMU_IO_COLOR); // Swap I/O page 3 into bank 6.
for (j=0; j<2; j++) {
for (i = 0; i < _MAX_COL * (_MAX_ROW - 1); i++) vram[i] = vram[i+_MAX_COL];
POKE(MMU_IO_CTRL, MMU_IO_TEXT); // Swap I/O page 2 into bank 6.
}
// Clear bottom line.
vram += i;
save = vram;
POKE(MMU_IO_CTRL, MMU_IO_COLOR); // Swap I/O page 3 into bank 6.
for (i = 0; i < _MAX_COL; i++) *vram++ = _ccolor;
POKE(MMU_IO_CTRL, MMU_IO_TEXT); // Swap I/O page 2 into bank 6.
vram = save;
for (i = 0; i < _MAX_COL; i++) *vram++ = 32;
// Set up on bottom line.
_row--;
@ -112,10 +152,12 @@ void print(char *message) {
// Reset display to text, "standard" colors.
void reset(void) {
byte mmu;
byte mmu;
byte x;
byte y;
mmu = PEEK(MMU_IO_CTRL); // Get current MMU state.
POKE(MMU_IO_CTRL, 2); // Swap I/O page 2 into bank 6.
POKE(MMU_IO_CTRL, MMU_IO_TEXT); // Swap I/O page 2 into bank 6.
// If we set 0xD000 to 0x01 and 0xD001 to 0x00, that will put us into text mode at 80 × 60.
POKE(VKY_MSTR_CTRL_0, 1);
@ -124,11 +166,33 @@ void reset(void) {
_MAX_COL = 80;
_MAX_ROW = 60;
POKE(MMU_IO_CTRL, 0); // Swap I/O page 0 into bank 6.
POKE(CURSOR_SETTINGS, 9); // Disable cursor flash.
POKE(CURSOR_CHARACTER, '_'); // Set cursor shape. (199 = Checkerboard)
_fcolor = 15;
_bcolor = 0;
_ccolor = 240;
POKE(MMU_IO_CTRL, MMU_IO_PAGE_0); // Swap I/O page 0 into bank 6.
POKE(VKY_CRSR_CTRL, 3); // Enable cursor, 1/2s flash.
POKE(VKY_CRSR_CHAR, '_'); // Set cursor shape. (199 = Checkerboard)
// Set up default text colors.
for (x=0; x<TEXTCOLORS_COUNT; x++)
defineTextColor(x,
textColors[x].r,
textColors[x].g,
textColors[x].b,
textColors[x].r,
textColors[x].g,
textColors[x].b);
POKE(MMU_IO_CTRL, mmu); // Restore MMU state.
cls();
}
void setTextColor(byte f, byte b) {
_fcolor = f;
_bcolor = b;
_ccolor = (f << 4) + b;
}

View file

@ -38,8 +38,8 @@ extern "C"
typedef unsigned char byte;
#define TEXT_MATRIX 0xc000 // I/O Page 2
/*
#define TEXT_COLOR_MATRIX 0xc000 // I/O Page 3
#define TEXT_LUT_FOREGROUND 0xd800 // I/O Page 0
#define TEXT_LUT_BACKGROUND 0xd840 // I/O Page 0
@ -52,6 +52,7 @@ typedef unsigned char byte;
#define CURSOR_X_HIGH 0xd015
#define CURSOR_Y_LOW 0xd016
#define CURSOR_Y_HIGH 0xd017
*/
#define PEEK(addy) ((byte)*(volatile byte *)(addy))
#define POKE(addy, value) (*(volatile byte *)(addy) = (value))
@ -73,7 +74,7 @@ extern char error;
// Apple IIgs Colors, because that's how we roll.
typedef enum textColorsE {
BLACK,
BLACK = 0,
DEEP_RED,
DARK_BLUE,
PURPLE,
@ -88,16 +89,25 @@ typedef enum textColorsE {
LIGHT_GREEN,
YELLOW,
AQUAMARINE,
WHITE
WHITE,
TEXTCOLORS_COUNT
} textColorsT;
extern uint32_t textColors[16];
typedef struct colorS {
byte r;
byte g;
byte b;
} colorT;
extern colorT textColors[16];
void cls(void);
void defineTextColor(byte slot, byte fr, byte fg, byte fb, byte br, byte bg, byte bb);
void gotoxy(byte x, byte y);
void print(char *message);
void reset(void);
void setTextColor(byte f, byte b);
#ifdef __cplusplus