198 lines
4.8 KiB
C
198 lines
4.8 KiB
C
#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;
|
||
}
|