Subversion Repositories HelenOS-historic

Rev

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

Rev 1547 Rev 1551
Line 41... Line 41...
41
 
41
 
42
#include "ega.h"
42
#include "ega.h"
43
#include "../console/screenbuffer.h"
43
#include "../console/screenbuffer.h"
44
#include "main.h"
44
#include "main.h"
45
 
45
 
-
 
46
 
-
 
47
#define EGA_IO_ADDRESS 0x3d4
-
 
48
#define EGA_IO_SIZE 2
-
 
49
 
-
 
50
typedef unsigned char u8;
-
 
51
typedef unsigned short u16;
-
 
52
typedef unsigned int u32;
-
 
53
 
-
 
54
 
46
/* Allow only 1 connection */
55
/* Allow only 1 connection */
47
static int client_connected = 0;
56
static int client_connected = 0;
48
 
57
 
49
static unsigned int scr_width;
58
static unsigned int scr_width;
50
static unsigned int scr_height;
59
static unsigned int scr_height;
51
static char *scr_addr;
60
static char *scr_addr;
52
 
61
 
53
static unsigned int style = 0x0f;
62
static unsigned int style = 0x0f;
54
 
63
 
-
 
64
static inline void outb(u16 port, u8 b)
-
 
65
{
-
 
66
    asm volatile ("outb %0, %1\n" :: "a" (b), "d" (port));
-
 
67
}
-
 
68
 
-
 
69
static inline void outw(u16 port, u16 w)
-
 
70
{
-
 
71
    asm volatile ("outw %0, %1\n" :: "a" (w), "d" (port));
-
 
72
}
-
 
73
 
-
 
74
static inline void outl(u16 port, u32 l)
-
 
75
{
-
 
76
    asm volatile ("outl %0, %1\n" :: "a" (l), "d" (port));
-
 
77
}
-
 
78
 
-
 
79
static inline u8 inb(u16 port)
-
 
80
{
-
 
81
    u8 val;
-
 
82
 
-
 
83
    asm volatile ("inb %1, %0 \n" : "=a" (val) : "d"(port));
-
 
84
    return val;
-
 
85
}
-
 
86
 
-
 
87
static inline u16 inw(u16 port)
-
 
88
{
-
 
89
    u16 val;
-
 
90
 
-
 
91
    asm volatile ("inw %1, %0 \n" : "=a" (val) : "d"(port));
-
 
92
    return val;
-
 
93
}
-
 
94
 
-
 
95
static inline u32 inl(u16 port)
-
 
96
{
-
 
97
    u32 val;
-
 
98
 
-
 
99
    asm volatile ("inl %1, %0 \n" : "=a" (val) : "d"(port));
-
 
100
    return val;
-
 
101
}
-
 
102
 
-
 
103
 
-
 
104
 
-
 
105
 
55
static void clrscr(void)
106
static void clrscr(void)
56
{
107
{
57
    int i;
108
    int i;
58
   
109
   
59
    for (i=0; i < scr_width*scr_height; i++) {
110
    for (i=0; i < scr_width*scr_height; i++) {
60
        scr_addr[i*2] = ' ';
111
        scr_addr[i*2] = ' ';
61
        scr_addr[i*2+1] = style;
112
        scr_addr[i*2+1] = style;
62
    }
113
    }
63
}
114
}
64
 
115
 
-
 
116
void cursor_goto(unsigned int row, unsigned int col)
-
 
117
{
-
 
118
    int ega_cursor;
-
 
119
 
-
 
120
    ega_cursor=col+scr_width*row;
-
 
121
   
-
 
122
    outb(EGA_IO_ADDRESS    , 0xe);
-
 
123
    outb(EGA_IO_ADDRESS + 1, (ega_cursor >>8) & 0xff);
-
 
124
    outb(EGA_IO_ADDRESS    , 0xf);
-
 
125
    outb(EGA_IO_ADDRESS + 1, ega_cursor & 0xff);
-
 
126
}
-
 
127
 
-
 
128
void cursor_disable(void)
-
 
129
{
-
 
130
    u8 stat;
-
 
131
    outb(EGA_IO_ADDRESS , 0xa);
-
 
132
    stat=inb(EGA_IO_ADDRESS + 1);
-
 
133
    outb(EGA_IO_ADDRESS , 0xa);
-
 
134
    outb(EGA_IO_ADDRESS +1 ,stat | (1<<5) );
-
 
135
}
-
 
136
 
-
 
137
void cursor_enable(void)
-
 
138
{
-
 
139
    u8 stat;
-
 
140
    outb(EGA_IO_ADDRESS , 0xa);
-
 
141
    stat=inb(EGA_IO_ADDRESS + 1);
-
 
142
    outb(EGA_IO_ADDRESS , 0xa);
-
 
143
    outb(EGA_IO_ADDRESS +1 ,stat & (~(1<<5)) );
-
 
144
}
-
 
145
 
65
static void printchar(char c, unsigned int row, unsigned int col)
146
static void printchar(char c, unsigned int row, unsigned int col)
66
{
147
{
67
    scr_addr[(row*scr_width + col)*2] = c;
148
    scr_addr[(row*scr_width + col)*2] = c;
68
    scr_addr[(row*scr_width + col)*2+1] = style;
149
    scr_addr[(row*scr_width + col)*2+1] = style;
-
 
150
   
-
 
151
    cursor_goto(row,col+1);
69
}
152
}
70
 
153
 
71
static void draw_text_data(keyfield_t *data)
154
static void draw_text_data(keyfield_t *data)
72
{
155
{
73
    int i;
156
    int i;
Line 139... Line 222...
139
                break;
222
                break;
140
            }
223
            }
141
            printchar(c,row,col);
224
            printchar(c,row,col);
142
            retval = 0;
225
            retval = 0;
143
            break;
226
            break;
-
 
227
        case FB_CURSOR_GOTO:
-
 
228
            row = IPC_GET_ARG1(call);
-
 
229
            col = IPC_GET_ARG2(call);
-
 
230
            if (row >= scr_height || col >= scr_width) {
-
 
231
                retval = EINVAL;
-
 
232
                break;
-
 
233
            }
-
 
234
            cursor_goto(row,col);
-
 
235
            retval = 0;
-
 
236
            break;
-
 
237
        case FB_CURSOR_VISIBILITY:
-
 
238
            if(IPC_GET_ARG1(call))
-
 
239
                cursor_enable();
-
 
240
            else
-
 
241
                cursor_disable();
-
 
242
            retval = 0;
-
 
243
            break;
144
        case FB_SET_STYLE:
244
        case FB_SET_STYLE:
145
            fgcolor = IPC_GET_ARG1(call);
245
            fgcolor = IPC_GET_ARG1(call);
146
            bgcolor = IPC_GET_ARG2(call);
246
            bgcolor = IPC_GET_ARG2(call);
147
            if (fgcolor > bgcolor)
247
            if (fgcolor > bgcolor)
148
                style = 0x0f;
248
                style = 0x0f;
Line 162... Line 262...
162
 
262
 
163
 
263
 
164
    ega_ph_addr=(void *)sysinfo_value("fb.address.physical");
264
    ega_ph_addr=(void *)sysinfo_value("fb.address.physical");
165
    scr_width=sysinfo_value("fb.width");
265
    scr_width=sysinfo_value("fb.width");
166
    scr_height=sysinfo_value("fb.height");
266
    scr_height=sysinfo_value("fb.height");
-
 
267
    iospace_enable(task_get_id(),(void *)EGA_IO_ADDRESS,2);
167
 
268
 
168
    sz = scr_width*scr_height*2;
269
    sz = scr_width*scr_height*2;
169
    scr_addr = as_get_mappable_page(sz);
270
    scr_addr = as_get_mappable_page(sz);
170
 
271
 
171
    map_physmem(ega_ph_addr, scr_addr, ALIGN_UP(sz,PAGE_SIZE)>>PAGE_WIDTH,
272
    map_physmem(ega_ph_addr, scr_addr, ALIGN_UP(sz,PAGE_SIZE)>>PAGE_WIDTH,
Line 175... Line 276...
175
 
276
 
176
    clrscr();
277
    clrscr();
177
 
278
 
178
    return 0;
279
    return 0;
179
}
280
}
-
 
281