You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
42 lines
1007 B
C
42 lines
1007 B
C
#include "screen.h"
|
|
|
|
static u8 *BUFFER = (u8 *) 0xA0000;
|
|
|
|
// double buffers
|
|
u8 _sbuffers[2][SCREEN_SIZE];
|
|
u8 _sback = 0;
|
|
|
|
#define CURRENT (_sbuffers[_sback])
|
|
#define SWAP() (_sback = 1 - _sback)
|
|
|
|
// VGA control port addresses
|
|
#define PALETTE_MASK 0x3C6
|
|
#define PALETTE_READ 0x3C7
|
|
#define PALETTE_WRITE 0x3C8
|
|
#define PALETTE_DATA 0x3C9
|
|
|
|
void screen_swap() {
|
|
memcpy(BUFFER, &CURRENT, SCREEN_SIZE);
|
|
SWAP();
|
|
}
|
|
|
|
void screen_clear(u8 color) {
|
|
memset(&CURRENT, color, SCREEN_SIZE);
|
|
}
|
|
|
|
void screen_init() {
|
|
// configure palette with 8-bit RRRGGGBB color
|
|
outportb(PALETTE_MASK, 0xFF);
|
|
outportb(PALETTE_WRITE, 0);
|
|
for (u8 i = 0; i < 255; i++) {
|
|
outportb(PALETTE_DATA, (((i >> 5) & 0x7) * (256 / 8)) / 4);
|
|
outportb(PALETTE_DATA, (((i >> 2) & 0x7) * (256 / 8)) / 4);
|
|
outportb(PALETTE_DATA, (((i >> 0) & 0x3) * (256 / 4)) / 4);
|
|
}
|
|
|
|
// set color 255 = white
|
|
outportb(PALETTE_DATA, 0x3F);
|
|
outportb(PALETTE_DATA, 0x3F);
|
|
outportb(PALETTE_DATA, 0x3F);
|
|
}
|