// * refactor redundant code into sub-functions
// * See if there is a method to the in/out stuff that can be encapsulated.
// * remove "biosfn" prefixes
-// * don't hardcode 0xc000
-// * add defs for 0xa000/0xb800
// * verify all funcs static
//
// * convert vbe/clext code
#define DEBUG_VGA_POST 1
#define DEBUG_VGA_10 3
-#define SET_VGA(var, val) SET_FARVAR(0xc000, (var), (val))
+#define SET_VGA(var, val) SET_FARVAR(get_global_seg(), (var), (val))
// ===================================================================
if (CONFIG_CIRRUS)
cirrus_set_video_mode(mode);
-#ifdef VBE
- if (vbe_has_vbe_display())
- dispi_set_enable(VBE_DISPI_DISABLED);
-#endif
+ if (CONFIG_VBE)
+ if (vbe_has_vbe_display())
+ dispi_set_enable(VBE_DISPI_DISABLED);
// The real mode
u8 noclearmem = mode & 0x80;
// FIXME We nearly have the good tables. to be reworked
SET_BDA(dcc_index, 0x08); // 8 is VGA should be ok for now
SET_BDA(video_savetable_ptr, (u32)video_save_pointer_table);
- SET_BDA(video_savetable_seg, 0xc000);
+ SET_BDA(video_savetable_seg, get_global_seg());
// FIXME
SET_BDA(video_msr, 0x00); // Unavailable on vanilla vga, but...
call16_vgaint(0x1103, 0);
}
// Set the ints 0x1F and 0x43
- SET_IVT(0x1f, 0xC000, (u32)&vgafont8[128 * 8]);
+ SET_IVT(0x1f, get_global_seg(), (u32)&vgafont8[128 * 8]);
switch (cheight) {
case 8:
- SET_IVT(0x43, 0xC000, (u32)vgafont8);
+ SET_IVT(0x43, get_global_seg(), (u32)vgafont8);
break;
case 14:
- SET_IVT(0x43, 0xC000, (u32)vgafont14);
+ SET_IVT(0x43, get_global_seg(), (u32)vgafont14);
break;
case 16:
- SET_IVT(0x43, 0xC000, (u32)vgafont16);
+ SET_IVT(0x43, get_global_seg(), (u32)vgafont16);
break;
}
}
outw(0x0105, VGAREG_GRDC_ADDRESS);
u8 i;
for (i = 0; i < cheight; i++)
- memcpy_far(0xa000, (void*)(dest + i * nbcols)
- , 0xa000, (void*)(src + i * nbcols), cols);
+ memcpy_far(SEG_GRAPH, (void*)(dest + i * nbcols)
+ , SEG_GRAPH, (void*)(src + i * nbcols), cols);
outw(0x0005, VGAREG_GRDC_ADDRESS);
}
outw(0x0205, VGAREG_GRDC_ADDRESS);
u8 i;
for (i = 0; i < cheight; i++)
- memset_far(0xa000, (void*)(dest + i * nbcols), attr, cols);
+ memset_far(SEG_GRAPH, (void*)(dest + i * nbcols), attr, cols);
outw(0x0005, VGAREG_GRDC_ADDRESS);
}
u8 i;
for (i = 0; i < cheight; i++)
if (i & 1)
- memcpy_far(0xb800, (void*)(0x2000 + dest + (i >> 1) * nbcols)
- , 0xb800, (void*)(0x2000 + src + (i >> 1) * nbcols)
+ memcpy_far(SEG_CTEXT, (void*)(0x2000 + dest + (i >> 1) * nbcols)
+ , SEG_CTEXT, (void*)(0x2000 + src + (i >> 1) * nbcols)
, cols);
else
- memcpy_far(0xb800, (void*)(dest + (i >> 1) * nbcols)
- , 0xb800, (void*)(src + (i >> 1) * nbcols), cols);
+ memcpy_far(SEG_CTEXT, (void*)(dest + (i >> 1) * nbcols)
+ , SEG_CTEXT, (void*)(src + (i >> 1) * nbcols), cols);
}
// -------------------------------------------------------------------
u8 i;
for (i = 0; i < cheight; i++)
if (i & 1)
- memset_far(0xb800, (void*)(0x2000 + dest + (i >> 1) * nbcols)
+ memset_far(SEG_CTEXT, (void*)(0x2000 + dest + (i >> 1) * nbcols)
, attr, cols);
else
- memset_far(0xb800, (void*)(dest + (i >> 1) * nbcols), attr, cols);
+ memset_far(SEG_CTEXT, (void*)(dest + (i >> 1) * nbcols), attr, cols);
}
// -------------------------------------------------------------------
for (j = 0; j < 8; j++) {
u8 mask = 0x80 >> j;
outw((mask << 8) | 0x08, VGAREG_GRDC_ADDRESS);
- GET_FARVAR(0xa000, *dest_far);
+ GET_FARVAR(SEG_GRAPH, *dest_far);
if (GET_GLOBAL(fdata_g[src + i]) & mask)
- SET_FARVAR(0xa000, *dest_far, attr & 0x0f);
+ SET_FARVAR(SEG_GRAPH, *dest_far, attr & 0x0f);
else
- SET_FARVAR(0xa000, *dest_far, 0x00);
+ SET_FARVAR(SEG_GRAPH, *dest_far, 0x00);
}
}
outw(0xff08, VGAREG_GRDC_ADDRESS);
if (bpp == 1) {
u8 data = 0;
if (attr & 0x80)
- data = GET_FARVAR(0xb800, *dest_far);
+ data = GET_FARVAR(SEG_CTEXT, *dest_far);
u8 j;
for (j = 0; j < 8; j++) {
if (GET_GLOBAL(fdata_g[src + i]) & mask) {
}
mask >>= 1;
}
- SET_FARVAR(0xb800, *dest_far, data);
+ SET_FARVAR(SEG_CTEXT, *dest_far, data);
} else {
while (mask > 0) {
u8 data = 0;
if (attr & 0x80)
- data = GET_FARVAR(0xb800, *dest_far);
+ data = GET_FARVAR(SEG_CTEXT, *dest_far);
u8 j;
for (j = 0; j < 4; j++) {
if (GET_GLOBAL(fdata_g[src + i]) & mask) {
}
mask >>= 1;
}
- SET_FARVAR(0xb800, *dest_far, data);
+ SET_FARVAR(SEG_CTEXT, *dest_far, data);
dest_far += 1;
}
}
u8 data = 0x00;
if (GET_GLOBAL(fdata_g[src + i]) & mask)
data = attr;
- SET_FARVAR(0xa000, dest_far[j], data);
+ SET_FARVAR(SEG_GRAPH, dest_far[j], data);
mask >>= 1;
}
}
switch (GET_GLOBAL(vmode_g->memmodel)) {
case PLANAR4:
case PLANAR1:
- write_gfx_char_pl4(car, attr, xcurs, ycurs, nbcols,
- cheight);
+ write_gfx_char_pl4(car, attr, xcurs, ycurs, nbcols, cheight);
break;
case CGA:
write_gfx_char_cga(car, attr, xcurs, ycurs, nbcols, bpp);
switch (GET_GLOBAL(vmode_g->memmodel)) {
case PLANAR4:
case PLANAR1:
- write_gfx_char_pl4(car, attr, xcurs, ycurs, nbcols,
- cheight);
+ write_gfx_char_pl4(car, attr, xcurs, ycurs, nbcols, cheight);
break;
case CGA:
write_gfx_char_cga(car, attr, xcurs, ycurs, nbcols, bpp);
mask = 0x80 >> (CX & 0x07);
outw((mask << 8) | 0x08, VGAREG_GRDC_ADDRESS);
outw(0x0205, VGAREG_GRDC_ADDRESS);
- data = GET_FARVAR(0xa000, *addr_far);
+ data = GET_FARVAR(SEG_GRAPH, *addr_far);
if (AL & 0x80)
outw(0x1803, VGAREG_GRDC_ADDRESS);
- SET_FARVAR(0xa000, *addr_far, AL);
+ SET_FARVAR(SEG_GRAPH, *addr_far, AL);
outw(0xff08, VGAREG_GRDC_ADDRESS);
outw(0x0005, VGAREG_GRDC_ADDRESS);
outw(0x0003, VGAREG_GRDC_ADDRESS);
addr_far = (void*)((CX >> 3) + (DX >> 1) * 80);
if (DX & 1)
addr_far += 0x2000;
- data = GET_FARVAR(0xb800, *addr_far);
+ data = GET_FARVAR(SEG_CTEXT, *addr_far);
if (GET_GLOBAL(vmode_g->pixbits) == 2) {
attr = (AL & 0x03) << ((3 - (CX & 0x03)) * 2);
mask = 0x03 << ((3 - (CX & 0x03)) * 2);
data &= ~mask;
data |= attr;
}
- SET_FARVAR(0xb800, *addr_far, data);
+ SET_FARVAR(SEG_CTEXT, *addr_far, data);
break;
case LINEAR8:
addr_far = (void*)(CX + DX * (GET_BDA(video_cols) * 8));
- SET_FARVAR(0xa000, *addr_far, AL);
+ SET_FARVAR(SEG_GRAPH, *addr_far, AL);
break;
}
}
attr = 0x00;
for (i = 0; i < 4; i++) {
outw((i << 8) | 0x04, VGAREG_GRDC_ADDRESS);
- data = GET_FARVAR(0xa000, *addr_far) & mask;
+ data = GET_FARVAR(SEG_GRAPH, *addr_far) & mask;
if (data > 0)
attr |= (0x01 << i);
}
addr_far = (void*)((CX >> 2) + (DX >> 1) * 80);
if (DX & 1)
addr_far += 0x2000;
- data = GET_FARVAR(0xb800, *addr_far);
+ data = GET_FARVAR(SEG_CTEXT, *addr_far);
if (GET_GLOBAL(vmode_g->pixbits) == 2)
attr = (data >> ((3 - (CX & 0x03)) * 2)) & 0x03;
else
break;
case LINEAR8:
addr_far = (void*)(CX + DX * (GET_BDA(video_cols) * 8));
- attr = GET_FARVAR(0xa000, *addr_far);
+ attr = GET_FARVAR(SEG_GRAPH, *addr_far);
break;
}
*AX = (*AX & 0xff00) | attr;
for (i = 0; i < CX; i++) {
void *src_far = (void*)(BP + i * BH);
void *dest_far = (void*)(blockaddr + (DX + i) * 32);
- memcpy_far(0xA000, dest_far, ES, src_far, BH);
+ memcpy_far(SEG_GRAPH, dest_far, ES, src_far, BH);
}
release_font_access();
if (AL >= 0x10)
for (i = 0; i < 0x100; i++) {
u16 src = i * 14;
void *dest_far = (void*)(blockaddr + i * 32);
- memcpy_far(0xA000, dest_far, 0xC000, &vgafont14[src], 14);
+ memcpy_far(SEG_GRAPH, dest_far, get_global_seg(), &vgafont14[src], 14);
}
release_font_access();
if (AL >= 0x10)
for (i = 0; i < 0x100; i++) {
u16 src = i * 8;
void *dest_far = (void*)(blockaddr + i * 32);
- memcpy_far(0xA000, dest_far, 0xC000, &vgafont8[src], 8);
+ memcpy_far(SEG_GRAPH, dest_far, get_global_seg(), &vgafont8[src], 8);
}
release_font_access();
if (AL >= 0x10)
for (i = 0; i < 0x100; i++) {
u16 src = i * 16;
void *dest_far = (void*)(blockaddr + i * 32);
- memcpy_far(0xA000, dest_far, 0xC000, &vgafont16[src], 16);
+ memcpy_far(SEG_GRAPH, dest_far, get_global_seg(), &vgafont16[src], 16);
}
release_font_access();
if (AL >= 0x10)
break;
}
case 0x02:
- *ES = 0xC000;
+ *ES = get_global_seg();
*BP = (u32)vgafont14;
break;
case 0x03:
- *ES = 0xC000;
+ *ES = get_global_seg();
*BP = (u32)vgafont8;
break;
case 0x04:
- *ES = 0xC000;
+ *ES = get_global_seg();
*BP = (u32)vgafont8 + 128 * 8;
break;
case 0x05:
- *ES = 0xC000;
+ *ES = get_global_seg();
*BP = (u32)vgafont14alt;
break;
case 0x06:
- *ES = 0xC000;
+ *ES = get_global_seg();
*BP = (u32)vgafont16;
break;
case 0x07:
- *ES = 0xC000;
+ *ES = get_global_seg();
*BP = (u32)vgafont16alt;
break;
default:
{
// Address of static functionality table
SET_FARVAR(ES, *(u16*)(DI + 0x00), (u32)static_functionality);
- SET_FARVAR(ES, *(u16*)(DI + 0x02), 0xC000);
+ SET_FARVAR(ES, *(u16*)(DI + 0x02), get_global_seg());
// Hard coded copy from BIOS area. Should it be cleaner ?
memcpy_far(ES, (void*)(DI + 0x04), SEG_BDA, (void*)0x49, 30);
SET_FARVAR(ES, *(u8*)(BX+0), GET_BDA(video_page));
BX++;
/* current font */
- SET_FARVAR(ES, *(u16*)(BX+0), GET_FARVAR(0, *(u16*)(0x1f * 4)));
- BX += 2;
- SET_FARVAR(ES, *(u16*)(BX+0), GET_FARVAR(0, *(u16*)(0x1f * 4 + 2)));
- BX += 2;
- SET_FARVAR(ES, *(u16*)(BX+0), GET_FARVAR(0, *(u16*)(0x43 * 4)));
- BX += 2;
- SET_FARVAR(ES, *(u16*)(BX+0), GET_FARVAR(0, *(u16*)(0x43 * 4 + 2)));
- BX += 2;
+ SET_FARVAR(ES, *(u32*)(BX+0), GET_IVT(0x1f).segoff);
+ BX += 4;
+ SET_FARVAR(ES, *(u32*)(BX+0), GET_IVT(0x43).segoff);
+ BX += 4;
}
if (CX & 4) {
/* XXX: check this */
handle_101100(struct bregs *regs)
{
// XXX - inline
- biosfn_load_text_user_pat(regs->al, regs->es, 0 // XXX - regs->bp
+ biosfn_load_text_user_pat(regs->al, regs->es, regs->bp
, regs->cx, regs->dx, regs->bl, regs->bh);
}
handle_101130(struct bregs *regs)
{
// XXX - inline
- biosfn_get_font_info(regs->bh, ®s->es, 0 // ®s->bp
+ biosfn_get_font_info(regs->bh, ®s->es, ®s->bp
, ®s->cx, ®s->dx);
}
{
// XXX - inline
biosfn_write_string(regs->al, regs->bh, regs->bl, regs->cx
- , regs->dh, regs->dl, regs->es, 0); // regs->bp);
+ , regs->dh, regs->dl, regs->es, (void*)(regs->bp + 0));
}
static void
handle_104f(struct bregs *regs)
{
- if (! CONFIG_VBE) {
+ if (! CONFIG_VBE || !vbe_has_vbe_display()) {
handle_104fXX(regs);
return;
}
- // XXX - check vbe_has_vbe_display()?
-
switch (regs->al) {
case 0x00: handle_104f00(regs); break;
case 0x01: handle_104f01(regs); break;
init_bios_area();
- // vbe_init();
+ if (CONFIG_VBE)
+ vbe_init();
extern void entry_10(void);
- SET_IVT(0x10, 0xC000, (u32)entry_10);
+ SET_IVT(0x10, get_global_seg(), (u32)entry_10);
if (CONFIG_CIRRUS)
cirrus_init();
// XXX: fill it
SET_VGA(video_save_pointer_table[0], (u32)video_param_table);
- SET_VGA(video_save_pointer_table[1], 0xC000);
+ SET_VGA(video_save_pointer_table[1], get_global_seg());
// Fixup checksum
extern u8 _rom_header_size, _rom_header_checksum;
SET_VGA(_rom_header_checksum, 0);
- u8 sum = -checksum_far(0xC000, 0, _rom_header_size * 512);
+ u8 sum = -checksum_far(get_global_seg(), 0, _rom_header_size * 512);
SET_VGA(_rom_header_checksum, sum);
}