Subversion Repositories HelenOS

Rev

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

Rev 3930 Rev 3940
Line 24... Line 24...
24
 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
24
 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
25
 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
25
 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
26
 * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
26
 * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
27
 */
27
 */
28
 
28
 
29
/** @addtogroup genarch_drivers
29
/** @addtogroup genarch_drivers
30
 * @{
30
 * @{
31
 */
31
 */
32
/**
32
/**
33
 * @file
33
 * @file
34
 * @brief EGA driver.
34
 * @brief EGA driver.
Line 65... Line 65...
65
/*
65
/*
66
 * This function takes care of scrolling.
66
 * This function takes care of scrolling.
67
 */
67
 */
68
static void ega_check_cursor(void)
68
static void ega_check_cursor(void)
69
{
69
{
70
    if (ega_cursor < SCREEN)
70
    if (ega_cursor < EGA_SCREEN)
71
        return;
71
        return;
72
 
72
 
73
    memmove((void *) videoram, (void *) (videoram + ROW * 2),
73
    memmove((void *) videoram, (void *) (videoram + EGA_COLS * 2),
74
        (SCREEN - ROW) * 2);
74
        (EGA_SCREEN - EGA_COLS) * 2);
75
    memmove((void *) backbuf, (void *) (backbuf + ROW * 2),
75
    memmove((void *) backbuf, (void *) (backbuf + EGA_COLS * 2),
76
        (SCREEN - ROW) * 2);
76
        (EGA_SCREEN - EGA_COLS) * 2);
77
    memsetw(videoram + (SCREEN - ROW) * 2, ROW, 0x0720);
77
    memsetw(videoram + (EGA_SCREEN - EGA_COLS) * 2, EGA_COLS, 0x0720);
78
    memsetw(backbuf + (SCREEN - ROW) * 2, ROW, 0x0720);
78
    memsetw(backbuf + (EGA_SCREEN - EGA_COLS) * 2, EGA_COLS, 0x0720);
79
    ega_cursor = ega_cursor - ROW;
79
    ega_cursor = ega_cursor - EGA_COLS;
80
}
80
}
81
 
81
 
82
static void ega_move_cursor(void)
82
static void ega_move_cursor(void)
83
{
83
{
84
    pio_write_8(ega_base + EGA_INDEX_REG, 0xe);
84
    pio_write_8(ega_base + EGA_INDEX_REG, 0xe);
85
    pio_write_8(ega_base + EGA_DATA_REG, (uint8_t) ((ega_cursor >> 8) & 0xff));
85
    pio_write_8(ega_base + EGA_DATA_REG, (uint8_t) ((ega_cursor >> 8) & 0xff));
86
    pio_write_8(ega_base + EGA_INDEX_REG, 0xf);
86
    pio_write_8(ega_base + EGA_INDEX_REG, 0xf);
87
    pio_write_8(ega_base + EGA_DATA_REG, (uint8_t) (ega_cursor & 0xff));   
87
    pio_write_8(ega_base + EGA_DATA_REG, (uint8_t) (ega_cursor & 0xff));
88
}
88
}
89
 
89
 
90
static void ega_display_char(char ch, bool silent)
90
static void ega_display_char(char ch, bool silent)
91
{
91
{
92
    backbuf[ega_cursor * 2] = ch;
92
    backbuf[ega_cursor * 2] = ch;
Line 102... Line 102...
102
    ipl = interrupts_disable();
102
    ipl = interrupts_disable();
103
    spinlock_lock(&egalock);
103
    spinlock_lock(&egalock);
104
   
104
   
105
    switch (ch) {
105
    switch (ch) {
106
    case '\n':
106
    case '\n':
107
        ega_cursor = (ega_cursor + ROW) - ega_cursor % ROW;
107
        ega_cursor = (ega_cursor + EGA_COLS) - ega_cursor % EGA_COLS;
108
        break;
108
        break;
109
    case '\t':
109
    case '\t':
110
        ega_cursor = (ega_cursor + 8) - ega_cursor % 8;
110
        ega_cursor = (ega_cursor + 8) - ega_cursor % 8;
111
        break;
111
        break;
112
    case '\b':
112
    case '\b':
113
        if (ega_cursor % ROW)
113
        if (ega_cursor % EGA_COLS)
114
            ega_cursor--;
114
            ega_cursor--;
115
        break;
115
        break;
116
    default:
116
    default:
117
        ega_display_char(ch, silent);
117
        ega_display_char(ch, silent);
118
        ega_cursor++;
118
        ega_cursor++;
Line 131... Line 131...
131
    .write = ega_putchar
131
    .write = ega_putchar
132
};
132
};
133
 
133
 
134
void ega_init(ioport8_t *base, uintptr_t videoram_phys)
134
void ega_init(ioport8_t *base, uintptr_t videoram_phys)
135
{
135
{
136
    /* Initialize the software structure. */   
136
    /* Initialize the software structure. */
137
    ega_base = base;
137
    ega_base = base;
138
   
138
   
139
    backbuf = (uint8_t *) malloc(SCREEN * 2, 0);
139
    backbuf = (uint8_t *) malloc(EGA_VRAM_SIZE, 0);
140
    if (!backbuf)
140
    if (!backbuf)
141
        panic("Unable to allocate backbuffer.");
141
        panic("Unable to allocate backbuffer.");
142
   
142
   
143
    videoram = (uint8_t *) hw_map(videoram_phys, SCREEN * 2);
143
    videoram = (uint8_t *) hw_map(videoram_phys, EGA_VRAM_SIZE);
144
   
144
   
145
    /* Clear the screen and set the cursor position. */
145
    /* Clear the screen and set the cursor position. */
146
    memsetw(videoram, SCREEN, 0x0720);
146
    memsetw(videoram, EGA_SCREEN, 0x0720);
147
    memsetw(backbuf, SCREEN, 0x0720);
147
    memsetw(backbuf, EGA_SCREEN, 0x0720);
148
    ega_move_cursor();
148
    ega_move_cursor();
149
   
149
   
150
    chardev_initialize("ega_out", &ega_console, &ega_ops);
150
    chardev_initialize("ega_out", &ega_console, &ega_ops);
151
    stdout = &ega_console;
151
    stdout = &ega_console;
152
   
152
   
153
    sysinfo_set_item_val("fb", NULL, true);
153
    sysinfo_set_item_val("fb", NULL, true);
154
    sysinfo_set_item_val("fb.kind", NULL, 2);
154
    sysinfo_set_item_val("fb.kind", NULL, 2);
155
    sysinfo_set_item_val("fb.width", NULL, ROW);
155
    sysinfo_set_item_val("fb.width", NULL, EGA_COLS);
156
    sysinfo_set_item_val("fb.height", NULL, ROWS);
156
    sysinfo_set_item_val("fb.height", NULL, EGA_ROWS);
157
    sysinfo_set_item_val("fb.blinking", NULL, true);
157
    sysinfo_set_item_val("fb.blinking", NULL, true);
158
    sysinfo_set_item_val("fb.address.physical", NULL, videoram_phys);
158
    sysinfo_set_item_val("fb.address.physical", NULL, videoram_phys);
159
}
159
}
160
 
160
 
161
void ega_redraw(void)
161
void ega_redraw(void)
162
{
162
{
163
    memcpy(videoram, backbuf, SCREEN * 2);
163
    memcpy(videoram, backbuf, EGA_VRAM_SIZE);
164
    ega_move_cursor();
164
    ega_move_cursor();
165
}
165
}
166
 
166
 
167
/** @}
167
/** @}
168
 */
168
 */