3 * module for graphical output on the terminal
4 *********************************************/
22 static uint8_t mkcolor(uint8_t fg
, uint8_t bg
);
23 static uint16_t mkVGAentry(char c
, uint8_t color
);
24 static void putCharAt(char c
, uint8_t color
, size_t i
, size_t j
);
25 static void mvcursor();
26 static void newline();
27 static void scroll1();
29 /* clear the terminal */
35 for(size_t i
= 0; i
< term
.MAX_HEIGHT
; i
++) {
36 for(size_t j
= 0; j
< term
.MAX_WIDTH
; j
++) {
37 const size_t k
= i
* term
.MAX_WIDTH
+ j
;
38 term
.buffer
[k
] = mkVGAentry(' ', term
.color
);
44 /* initialize terminal to default values and draw all entries */
45 void term_init(size_t max_width
, size_t max_height
, uint8_t fg
, uint8_t bg
)
47 term
.MAX_HEIGHT
= max_height
;
48 term
.MAX_WIDTH
= max_width
;
51 term
.color
= mkcolor(fg
,bg
);
52 term
.buffer
= (uint16_t*) 0xB8000;
54 for(size_t i
= 0; i
< max_height
; i
++) {
55 for(size_t j
= 0; j
< max_width
; j
++) {
56 const size_t k
= i
* max_width
+ j
;
57 term
.buffer
[k
] = mkVGAentry(' ', term
.color
);
62 /* draw char using current term settings, and update cursor position */
63 void term_putChar(char c
)
68 putCharAt(c
,term
.color
,term
.column
, term
.row
);
74 void term_putStr(const char *str
)
76 size_t len
= strlen(str
);
77 for(size_t i
= 0; i
< len
; i
++)
81 void term_setcolor(uint8_t fg
, uint8_t bg
)
83 term
.color
= mkcolor(fg
,bg
);
86 /*** static functions ***/
88 /* return color suitable for drawing on terminal */
89 uint8_t mkcolor(uint8_t fg
, uint8_t bg
)
94 /* create an entry for drawing */
95 uint16_t mkVGAentry(char c
, uint8_t color
)
98 uint16_t color16
= color
;
99 return c16
| color16
<< 8;
102 /* draw entry at specified position */
103 void putCharAt(char c
, uint8_t color
, size_t i
, size_t j
)
105 const size_t k
= j
* term
.MAX_WIDTH
+ i
;
106 term
.buffer
[k
] = mkVGAentry(c
,color
);
111 if(++term
.column
== term
.MAX_WIDTH
)
117 if(term
.row
+ 1 == term
.MAX_HEIGHT
)
125 for(size_t i
= 0; i
< term
.MAX_HEIGHT
- 1; i
++) {
126 for(size_t j
= 0; j
< term
.MAX_WIDTH
; j
++) {
127 const size_t k1
= i
* term
.MAX_WIDTH
+ j
;
128 const size_t k2
= (i
+1) * term
.MAX_WIDTH
+ j
;
129 term
.buffer
[k1
] = term
.buffer
[k2
];
133 for(size_t j
= 0; j
< term
.MAX_WIDTH
; j
++) {
134 const size_t k
= (term
.MAX_HEIGHT
- 1) * term
.MAX_WIDTH
+ j
;
135 term
.buffer
[k
] = mkVGAentry(' ', term
.color
);