-
Notifications
You must be signed in to change notification settings - Fork 6
/
display.c
executable file
·97 lines (84 loc) · 1.94 KB
/
display.c
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
/*
* display.c
*
* Created on: 07.07.2012
* Author: pascal
*/
#include "display.h"
#include "util.h"
#include "string.h"
#include "console.h"
#include "pm.h"
#include "stdio.h"
#include "cpu.h"
#define GRAFIKSPEICHER 0xB8000
uint8_t Spalte, Zeile;
void Display_Init()
{
Display_Clear();
setColor(BG_BLACK | CL_WHITE);
/*uint8_t Register;
inb(0x3D8, Register);
Register &= 0xDF;
outb(0x3D8, Register);*/
}
void display_refresh(const uint16_t *buffer, uint8_t cursor_x, uint8_t cursor_y)
{
memcpy((void*)GRAFIKSPEICHER, buffer, DISPLAY_COLS * DISPLAY_ROWS * sizeof(uint16_t));
setCursor(cursor_x, cursor_y);
}
void __attribute__((deprecated)) setColor(uint8_t Color)
{
//console_changeColor(pm_getConsole(), Color);
}
void setCursor(uint8_t x, uint8_t y)
{
//Diese Funktion kann auch extern aufgerufen werden, deshalb müssen hier die
//Variablen "Spalte" und "Zeile" auch gesetzt werden.
Spalte = (x <= 79) ? x : 79;
Zeile = (y <= 24) ? y : 24;
//Cursorposition verändern
uint16_t CursorAddress = Zeile * 80 + Spalte;
outb(0x3D4, 15); //Lowbyte der Cursorposition an Grafikkarte senden
outb(0x3D5, CursorAddress & 0xFF);
outb(0x3D4, 14); //Highbyte der Cursorposition an GK senden
outb(0x3D5, CursorAddress >> 8);
}
void SysLog(char *Device, char *Text)
{
printf("[ \e[32m%s\e[37m ] %s\n", Device, Text);
}
void SysLogError(char *Device, char *Text)
{
printf("[ \e[31m%s\e[37m ] \e[31m%s\e[37m\n", Device, Text);
}
/*
* Löscht den Bildschirminhalt
*/
void Display_Clear()
{
int i;
char *gs = (char*)GRAFIKSPEICHER;
for(i = 0; i < 4096; i++)
gs[i] = 0;
Zeile = Spalte = 0;
}
/*
* Gibt eine Fehlermeldung aus und hält die CPU an (für immer).
*/
void Panic(char *Device, char *Text)
{
printf("\e[41;37m[ %s ] %s", Device, Text);
console_switch(0);
CPU_STOP();
}
void hideCursor()
{
outb(0x3D4, 10);
outb(0x3D5, 0x32); //Cursor deaktiviert
}
void showCursor()
{
outb(0x3D4, 10);
outb(0x3D5, 0x64); //Cursor aktiviert
}