Subversion Repositories HelenOS

Rev

Rev 4327 | Go to most recent revision | Show entire file | Ignore whitespace | Details | Blame | Last modification | View Log | RSS feed

Rev 4327 Rev 4581
Line 47... Line 47...
47
#include <ipc/fb.h>
47
#include <ipc/fb.h>
48
#include <ipc/ipc.h>
48
#include <ipc/ipc.h>
49
#include <ipc/ns.h>
49
#include <ipc/ns.h>
50
#include <ipc/services.h>
50
#include <ipc/services.h>
51
#include <libarch/ddi.h>
51
#include <libarch/ddi.h>
52
#include <console/style.h>
52
#include <io/style.h>
53
#include <console/color.h>
53
#include <io/color.h>
54
#include <sys/types.h>
54
#include <sys/types.h>
55
 
55
 
56
#include "ega.h"
56
#include "ega.h"
57
#include "../console/screenbuffer.h"
57
#include "../console/screenbuffer.h"
58
#include "main.h"
58
#include "main.h"
Line 68... Line 68...
68
#define EGA_IO_SIZE 2
68
#define EGA_IO_SIZE 2
69
 
69
 
70
int ega_normal_color = 0x0f;
70
int ega_normal_color = 0x0f;
71
int ega_inverted_color = 0xf0;
71
int ega_inverted_color = 0xf0;
72
 
72
 
73
#define NORMAL_COLOR        ega_normal_color       
73
#define NORMAL_COLOR        ega_normal_color
74
#define INVERTED_COLOR      ega_inverted_color
74
#define INVERTED_COLOR      ega_inverted_color
75
 
75
 
76
/* Allow only 1 connection */
76
/* Allow only 1 connection */
77
static int client_connected = 0;
77
static int client_connected = 0;
78
 
78
 
Line 85... Line 85...
85
static unsigned attr_to_ega_style(const attrs_t *a);
85
static unsigned attr_to_ega_style(const attrs_t *a);
86
static uint8_t ega_glyph(wchar_t ch);
86
static uint8_t ega_glyph(wchar_t ch);
87
 
87
 
88
static void clrscr(void)
88
static void clrscr(void)
89
{
89
{
90
    int i;
90
    unsigned i;
91
   
91
   
92
    for (i = 0; i < scr_width * scr_height; i++) {
92
    for (i = 0; i < scr_width * scr_height; i++) {
93
        scr_addr[i * 2] = ' ';
93
        scr_addr[i * 2] = ' ';
94
        scr_addr[i * 2 + 1] = style;
94
        scr_addr[i * 2 + 1] = style;
95
    }
95
    }
96
}
96
}
97
 
97
 
98
static void cursor_goto(unsigned int row, unsigned int col)
98
static void cursor_goto(unsigned int col, unsigned int row)
99
{
99
{
100
    int ega_cursor;
100
    int ega_cursor;
101
 
101
 
102
    ega_cursor = col + scr_width * row;
102
    ega_cursor = col + scr_width * row;
103
   
103
   
Line 127... Line 127...
127
    pio_write_8(EGA_IO_BASE + 1, stat & (~(1 << 5)));
127
    pio_write_8(EGA_IO_BASE + 1, stat & (~(1 << 5)));
128
}
128
}
129
 
129
 
130
static void scroll(int rows)
130
static void scroll(int rows)
131
{
131
{
132
    int i;
132
    unsigned i;
-
 
133
 
133
    if (rows > 0) {
134
    if (rows > 0) {
134
        memmove(scr_addr, ((char *) scr_addr) + rows * scr_width * 2,
135
        memmove(scr_addr, ((char *) scr_addr) + rows * scr_width * 2,
135
            scr_width * scr_height * 2 - rows * scr_width * 2);
136
            scr_width * scr_height * 2 - rows * scr_width * 2);
136
        for (i = 0; i < rows * scr_width; i++)
137
        for (i = 0; i < rows * scr_width; i++)
137
            (((short *) scr_addr) + scr_width * scr_height - rows *
138
            (((short *) scr_addr) + scr_width * scr_height - rows *
Line 142... Line 143...
142
        for (i = 0; i < -rows * scr_width; i++)
143
        for (i = 0; i < -rows * scr_width; i++)
143
            ((short *)scr_addr)[i] = ((style << 8 ) + ' ');
144
            ((short *)scr_addr)[i] = ((style << 8 ) + ' ');
144
    }
145
    }
145
}
146
}
146
 
147
 
147
static void printchar(wchar_t c, unsigned int row, unsigned int col)
148
static void printchar(wchar_t c, unsigned int col, unsigned int row)
148
{
149
{
149
    scr_addr[(row * scr_width + col) * 2] = ega_glyph(c);
150
    scr_addr[(row * scr_width + col) * 2] = ega_glyph(c);
150
    scr_addr[(row * scr_width + col) * 2 + 1] = style;
151
    scr_addr[(row * scr_width + col) * 2 + 1] = style;
151
   
152
   
152
    cursor_goto(row, col + 1);
153
    cursor_goto(col + 1, row);
153
}
154
}
154
 
155
 
155
/** Draw text data to viewport.
156
/** Draw text data to viewport.
156
 *
157
 *
157
 * @param vport Viewport id
158
 * @param vport Viewport id
Line 239... Line 240...
239
}
240
}
240
 
241
 
241
static unsigned attr_to_ega_style(const attrs_t *a)
242
static unsigned attr_to_ega_style(const attrs_t *a)
242
{
243
{
243
    switch (a->t) {
244
    switch (a->t) {
-
 
245
    case at_style:
244
    case at_style: return style_to_ega_style(a->a.s.style);
246
        return style_to_ega_style(a->a.s.style);
-
 
247
    case at_rgb:
245
    case at_rgb: return rgb_to_ega_style(a->a.r.fg_color, a->a.r.bg_color);
248
        return rgb_to_ega_style(a->a.r.fg_color, a->a.r.bg_color);
-
 
249
    case at_idx:
246
    case at_idx: return color_to_ega_style(a->a.i.fg_color,
250
        return color_to_ega_style(a->a.i.fg_color,
247
        a->a.i.bg_color, a->a.i.flags);
251
            a->a.i.bg_color, a->a.i.flags);
-
 
252
    default:
248
    default: return INVERTED_COLOR;
253
        return INVERTED_COLOR;
249
    }
254
    }
250
}
255
}
251
 
256
 
252
static uint8_t ega_glyph(wchar_t ch)
257
static uint8_t ega_glyph(wchar_t ch)
253
{
258
{
Line 310... Line 315...
310
            }
315
            }
311
            draw_text_data(interbuf, col, row, w, h);
316
            draw_text_data(interbuf, col, row, w, h);
312
            retval = 0;
317
            retval = 0;
313
            break;
318
            break;
314
        case FB_GET_CSIZE:
319
        case FB_GET_CSIZE:
315
            ipc_answer_2(callid, EOK, scr_height, scr_width);
320
            ipc_answer_2(callid, EOK, scr_width, scr_height);
316
            continue;
321
            continue;
317
        case FB_CLEAR:
322
        case FB_CLEAR:
318
            clrscr();
323
            clrscr();
319
            retval = 0;
324
            retval = 0;
320
            break;
325
            break;
321
        case FB_PUTCHAR:
326
        case FB_PUTCHAR:
322
            c = IPC_GET_ARG1(call);
327
            c = IPC_GET_ARG1(call);
323
            row = IPC_GET_ARG2(call);
328
            col = IPC_GET_ARG2(call);
324
            col = IPC_GET_ARG3(call);
329
            row = IPC_GET_ARG3(call);
325
            if (col >= scr_width || row >= scr_height) {
330
            if (col >= scr_width || row >= scr_height) {
326
                retval = EINVAL;
331
                retval = EINVAL;
327
                break;
332
                break;
328
            }
333
            }
329
            printchar(c, row, col);
334
            printchar(c, col, row);
330
            retval = 0;
335
            retval = 0;
331
            break;
336
            break;
332
        case FB_CURSOR_GOTO:
337
        case FB_CURSOR_GOTO:
333
            row = IPC_GET_ARG1(call);
338
            col = IPC_GET_ARG1(call);
334
            col = IPC_GET_ARG2(call);
339
            row = IPC_GET_ARG2(call);
335
            if (row >= scr_height || col >= scr_width) {
340
            if (row >= scr_height || col >= scr_width) {
336
                retval = EINVAL;
341
                retval = EINVAL;
337
                break;
342
                break;
338
            }
343
            }
339
            cursor_goto(row, col);
344
            cursor_goto(col, row);
340
            retval = 0;
345
            retval = 0;
341
            break;
346
            break;
342
        case FB_SCROLL:
347
        case FB_SCROLL:
343
            i = IPC_GET_ARG1(call);
348
            i = IPC_GET_ARG1(call);
344
            if (i > scr_height || i < -((int) scr_height)) {
349
            if (i > (int) scr_height || i < -((int) scr_height)) {
345
                retval = EINVAL;
350
                retval = EINVAL;
346
                break;
351
                break;
347
            }
352
            }
348
            scroll(i);
353
            scroll(i);
349
            retval = 0;
354
            retval = 0;