f256/f256lib/f256.c
2024-01-01 20:10:21 -06:00

198 lines
4.8 KiB
C
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#include "f256.h"
char error;
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
};
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 to current text attributes.
void cls(void) {
int i;
byte *vram = (byte *)TEXT_MATRIX;
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, MMU_IO_PAGE_0); // Swap I/O page 0 into bank 6.
_col = x;
POKE(VKY_CRSR_X_L, _col); // Set cursor X position.
POKE(VKY_CRSR_X_H, 0);
_row = y;
POKE(VKY_CRSR_Y_L, _row); // Set cursor Y position.
POKE(VKY_CRSR_Y_H, 0);
POKE(MMU_IO_CTRL, mmu); // Restore MMU state.
}
// Print a string to the screen.
void print(char *message) {
int x = 0;
int i = 0;
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;
// Fall through.
case 10:
case 13:
_col = 0;
_row++;
if (_row == _MAX_ROW) {
// Scroll contents up one line.
vram = (byte *)TEXT_MATRIX;
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--;
vram = (byte *)TEXT_MATRIX + _MAX_COL * (_MAX_ROW - 2) + 1;
break;
}
vram += _MAX_COL;
break;
}
x++;
}
POKE(MMU_IO_CTRL, mmu); // Restore MMU state.
gotoxy(_col, _row);
}
// Reset display to text, "standard" colors.
void reset(void) {
byte mmu;
byte x;
byte y;
mmu = PEEK(MMU_IO_CTRL); // Get current MMU state.
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);
POKE(VKY_MSTR_CTRL_1, 0);
_MAX_COL = 80;
_MAX_ROW = 60;
_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;
}