001
002
003
004
005
006
007
008
009
010
011
012
013
014
015
016
017
018 #include <sos/klibc.h>
019 #include <hwcore/ioports.h>
020
021 #include "x86_videomem.h"
022
023
024
025
026 #define VIDEO 0xb8000
027
028
029
030 #define LINES 25
031 #define COLUMNS 80
032
033
034
035
036 typedef struct {
037 unsigned char character;
038 unsigned char attribute;
039 } __attribute__ ((packed)) x86_video_mem[LINES*COLUMNS];
040
041
042
043
044 static volatile x86_video_mem *video = (volatile x86_video_mem*)VIDEO;
045
046 sos_ret_t sos_x86_videomem_setup(void)
047 {
048
049
050
051
052 #define CRT_REG_INDEX 0x3d4
053 #define CRT_REG_DATA 0x3d5
054
055
056
057 outb(0x0a, CRT_REG_INDEX);
058
059
060 outb(1 << 5, CRT_REG_DATA);
061
062 return SOS_OK;
063 }
064
065
066 sos_ret_t sos_x86_videomem_cls(unsigned char attribute)
067 {
068
069 int i;
070 for(i = 0 ; i < LINES*COLUMNS ; i++)
071 {
072 (*video)[i].character = 0;
073 (*video)[i].attribute = attribute;
074 }
075
076 return SOS_OK;
077 }
078
079
080 sos_ret_t sos_x86_videomem_putstring(unsigned char row, unsigned char col,
081 unsigned char attribute,
082 const char *str)
083 {
084 unsigned video_offs = row*COLUMNS + col;
085
086 if (video_offs >= LINES*COLUMNS)
087 return -SOS_EINVAL;
088
089 for ( ; str && *str && (video_offs < LINES*COLUMNS) ; str++, video_offs++)
090 {
091 (*video)[video_offs].character = (unsigned char)*str;
092 (*video)[video_offs].attribute = attribute;
093 }
094
095 return SOS_OK;
096 }
097
098
099 sos_ret_t sos_x86_videomem_putchar(unsigned char row, unsigned char col,
100 unsigned char attribute,
101 unsigned char c)
102 {
103 unsigned video_offs = row*COLUMNS + col;
104
105 if (video_offs >= LINES*COLUMNS)
106 return -SOS_EINVAL;
107
108 (*video)[video_offs].character = c;
109 (*video)[video_offs].attribute = attribute;
110
111 return SOS_OK;
112 }
113
114
115 sos_ret_t sos_x86_videomem_printf(unsigned char row, unsigned char col,
116 unsigned char attribute,
117 const char *format, ...)
118 {
119 char buff[256];
120 va_list ap;
121
122 va_start(ap, format);
123 vsnprintf(buff, sizeof(buff), format, ap);
124 va_end(ap);
125
126 return sos_x86_videomem_putstring(row, col, attribute, buff);
127 }