simplify cga memory manipulation
This commit is contained in:
@ -73,14 +73,14 @@ void CGA::show(int x, int y, char character, unsigned char attrib) {
|
||||
|
||||
/* Hier muess Code eingefuegt werden */
|
||||
|
||||
if (x > COLUMNS || y > ROWS) {
|
||||
if (x >= COLUMNS || y >= ROWS) {
|
||||
// Out of bounds
|
||||
return;
|
||||
}
|
||||
|
||||
char* pos = (char*)(CGA_START + 2 * (x + y * COLUMNS)); // cast to char* to make writable
|
||||
*pos = character;
|
||||
*(pos + 1) = attrib;
|
||||
cga_char_t* pos = (cga_char_t*)(CGA_START + 2 * (x + y * COLUMNS)); // cast to char* to make writable
|
||||
pos->cga_char = character;
|
||||
pos->cga_attribute = attrib;
|
||||
}
|
||||
|
||||
/*****************************************************************************
|
||||
@ -147,19 +147,13 @@ void CGA::print(char* string, int n, unsigned char attrib) {
|
||||
*****************************************************************************/
|
||||
void CGA::scrollup() {
|
||||
|
||||
/* Hier muess Code eingefuegt werden */
|
||||
|
||||
// TODO: I really want a scrollback buffer
|
||||
/* Hier muss Code eingefuegt werden */
|
||||
|
||||
// Move up
|
||||
for (unsigned short byte = 2 * COLUMNS * 1; byte < 2 * COLUMNS * ROWS; ++byte) {
|
||||
*((char*)(CGA_START + byte - 2 * COLUMNS * 1)) = *(CGA_START + byte);
|
||||
}
|
||||
mymemcpy<cga_line_t>((cga_line_t*)CGA_START, (cga_line_t*)CGA_START + 1, ROWS - 1);
|
||||
|
||||
// Clear last line
|
||||
for (unsigned short byte = 2 * COLUMNS * (ROWS - 1); byte < 2 * COLUMNS * ROWS; ++byte) {
|
||||
*((char*)(CGA_START + byte)) = '\0';
|
||||
}
|
||||
myzero<cga_line_t>((cga_line_t*)CGA_START + ROWS - 1);
|
||||
}
|
||||
|
||||
/*****************************************************************************
|
||||
@ -171,10 +165,7 @@ void CGA::clear() {
|
||||
|
||||
/* Hier muess Code eingefuegt werden */
|
||||
|
||||
for (unsigned short byte = 2 * COLUMNS * 0; byte < 2 * COLUMNS * ROWS; ++byte) {
|
||||
*((char*)(CGA_START + byte)) = '\0';
|
||||
}
|
||||
|
||||
myzero<cga_page_t>((cga_page_t*)CGA_START);
|
||||
this->setpos(0, 0);
|
||||
}
|
||||
|
||||
|
||||
@ -15,6 +15,7 @@
|
||||
#define __CGA_include__
|
||||
|
||||
#include "kernel/IOport.h"
|
||||
#include "lib/MyStdLib.h"
|
||||
|
||||
class CGA {
|
||||
|
||||
@ -63,6 +64,18 @@ public:
|
||||
enum { ROWS = 25,
|
||||
COLUMNS = 80 };
|
||||
|
||||
// NOTE: I added this
|
||||
typedef struct {
|
||||
char cga_char;
|
||||
char cga_attribute;
|
||||
} cga_char_t;
|
||||
typedef struct {
|
||||
cga_char_t cga_line[COLUMNS];
|
||||
} cga_line_t;
|
||||
typedef struct {
|
||||
cga_line_t cga_page[ROWS];
|
||||
} cga_page_t;
|
||||
|
||||
// Setzen des Cursors in Spalte x und Zeile y.
|
||||
void setpos(int x, int y);
|
||||
|
||||
@ -73,14 +86,14 @@ public:
|
||||
void show(int x, int y, char character, unsigned char attrib = STD_ATTR);
|
||||
|
||||
// Anzeige mehrerer Zeichen ab der aktuellen Cursorposition
|
||||
void print(char* string, int n, unsigned char attrib = STD_ATTR);
|
||||
virtual void print(char* string, int n, unsigned char attrib = STD_ATTR);
|
||||
|
||||
// Verschiebt den Bildschirminhalt um eine Zeile nach oben.
|
||||
// Neue Zeile am unteren Bildrand mit Leerzeichen fuellen
|
||||
void scrollup();
|
||||
virtual void scrollup();
|
||||
|
||||
// Lösche den Textbildschirm
|
||||
void clear();
|
||||
virtual void clear();
|
||||
|
||||
// Hilfsfunktion zur Erzeugung eines Attribut-Bytes
|
||||
unsigned char attribute(CGA::color bg, CGA::color fg, bool blink);
|
||||
|
||||
Reference in New Issue
Block a user