jankos/core/framebuffer.c
2019-09-12 11:46:41 -07:00

47 lines
1.5 KiB
C

// Driver implementation for Jank's text frame buffer
// Buffer can display 80 columns by 25 Rows
// Start of buffer is at (real)address 0x000B8000
// Memory at this section is divided into 16-bit cells
// | 15-8 | 7-4 | 0-3
// | Asci | FG | BG
#include "framebuffer.h"
#include "io.h"
static char* Frame_Buffer = (char*)FRAME_BUFFER_ADDR;
//static char* Frame_Buffer_End = (char*)(FRAME_BUFFER_ADDR + AREA);
// Writes character to a given cell in the framebuffer
// @cell parameter is the logical (linear)index into the buffer
// _not_ the actual offset from the buffer addr
// also proper location is caller's responsibility
void write_cell_fb(unsigned cell, char c, char fg, char bg) {
Frame_Buffer[cell] = c;
Frame_Buffer[cell+1] = (fg & 0x0f << 4) | (bg & 0x0f);
}
void clear_fb() {
for(unsigned cell=0;cell<AREA; cell+=2) {
write_cell_fb(cell, ' ', 0x00, 0x00);
}
}
void fb_move_cursor(unsigned short position) {
out_buffer(FB_CMD, FB_HIGH_CMD);
out_buffer(FB_DATA, ((position >> 8) & 0x00ff) );
out_buffer(FB_CMD, FB_LOW_CMD);
out_buffer(FB_DATA, position & 0x00ff);
}
/* generic test func for this module */
void test_fb() {
clear_fb();
write_cell_fb(FRAME_CELL(0), 'a', Green, White);
write_cell_fb(FRAME_CELL(1), 'b', Green, White);
write_cell_fb(FRAME_CELL(2), 'c', Green, White);
write_cell_fb(FRAME_CELL(3), 'c', Green, White);
write_cell_fb(FRAME_CELL(4), 'c', Green, White);
write_cell_fb(FRAME_CELL(5), 'c', Green, White);
fb_move_cursor(5);
}