134 lines
2.9 KiB
C
134 lines
2.9 KiB
C
#include "f256.h"
|
||
|
||
|
||
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
|
||
};
|
||
|
||
|
||
static byte _MAX_COL = 80;
|
||
static byte _MAX_ROW = 60;
|
||
static byte _row = 0;
|
||
static byte _col = 0;
|
||
|
||
|
||
// Clear screen, does not change 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.
|
||
|
||
for (i = 0; i < _MAX_COL * _MAX_ROW; i++) *vram++ = 32;
|
||
|
||
POKE(MMU_IO_CTRL, mmu); // Restore MMU state.
|
||
|
||
gotoxy(0, 0);
|
||
}
|
||
|
||
|
||
// 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.
|
||
|
||
_col = x;
|
||
POKE(CURSOR_X_LOW, _col); // Set cursor X position.
|
||
POKE(CURSOR_X_HIGH, 0);
|
||
|
||
_row = y;
|
||
POKE(CURSOR_Y_LOW, _row); // Set cursor Y position.
|
||
POKE(CURSOR_Y_HIGH, 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;
|
||
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.
|
||
|
||
while (message[x] != 0) {
|
||
switch (message[x]) {
|
||
default:
|
||
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;
|
||
for (i = 0; i < _MAX_COL * (_MAX_ROW - 1); i++) vram[i] = vram[i+_MAX_COL];
|
||
// Clear bottom line.
|
||
vram += i;
|
||
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;
|
||
|
||
mmu = PEEK(MMU_IO_CTRL); // Get current MMU state.
|
||
POKE(MMU_IO_CTRL, 2); // 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;
|
||
|
||
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)
|
||
|
||
POKE(MMU_IO_CTRL, mmu); // Restore MMU state.
|
||
|
||
cls();
|
||
}
|