f256/f256lib/f256.c
Scott Duensing 4cedb359a2 It lives!
2024-01-01 19:04:19 -06:00

134 lines
2.9 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;
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();
}