new files for ints
This commit is contained in:
parent
0db5c853be
commit
3fcf5b3070
6 changed files with 706 additions and 0 deletions
485
util/vgabios/int10.c
Normal file
485
util/vgabios/int10.c
Normal file
|
|
@ -0,0 +1,485 @@
|
|||
#include <stdio.h>
|
||||
#include "test.h"
|
||||
#include "pci.h"
|
||||
|
||||
void x86emu_dump_xregs(void);
|
||||
extern ptr current;
|
||||
extern int verbose;
|
||||
|
||||
|
||||
#ifndef _PC
|
||||
/*
|
||||
* This is derived from a number of PC system BIOS'es. The intent here is to
|
||||
* provide very primitive video support, before an EGA/VGA BIOS installs its
|
||||
* own interrupt vector. Here, "Ignored" calls should remain so. "Not
|
||||
* Implemented" denotes functionality that can be implemented should the need
|
||||
* arise. What are "Not Implemented" throughout are video memory accesses.
|
||||
* Also, very little input validity checking is done here.
|
||||
*/
|
||||
int int42_handler()
|
||||
{
|
||||
|
||||
if (verbose && X86_AH != 0x0e) {
|
||||
printf("int%x\n", current->num);
|
||||
x86emu_dump_xregs();
|
||||
}
|
||||
|
||||
switch (X86_AH) {
|
||||
case 0x00:
|
||||
/* Set Video Mode */
|
||||
/* Enter: AL = video mode number */
|
||||
/* Leave: Nothing */
|
||||
/* Implemented (except for clearing the screen) */
|
||||
{ /* Localise */
|
||||
int i;
|
||||
u16 ioport, int1d, regvals, tmp;
|
||||
u8 mode, cgamode, cgacolour;
|
||||
|
||||
/*
|
||||
* Ignore all mode numbers but 0x00-0x13. Some systems also ignore
|
||||
* 0x0B and 0x0C, but don't do that here.
|
||||
*/
|
||||
if (X86_AL > 0x13)
|
||||
break;
|
||||
|
||||
/*
|
||||
* You didn't think that was really the mode set, did you? There
|
||||
* are only so many slots in the video parameter table...
|
||||
*/
|
||||
mode = X86_AL;
|
||||
ioport = 0x03D4;
|
||||
switch (MEM_RB(0x0410) & 0x30) {
|
||||
case 0x30: /* MDA */
|
||||
mode = 0x07; /* Force mode to 0x07 */
|
||||
ioport = 0x03B4;
|
||||
break;
|
||||
case 0x10: /* CGA 40x25 */
|
||||
if (mode >= 0x07)
|
||||
mode = 0x01;
|
||||
break;
|
||||
case 0x20: /* CGA 80x25 (MCGA?) */
|
||||
if (mode >= 0x07)
|
||||
mode = 0x03;
|
||||
break;
|
||||
case 0x00: /* EGA/VGA */
|
||||
if (mode >= 0x07) /* Don't try MDA timings */
|
||||
mode = 0x01; /* !?!?! */
|
||||
break;
|
||||
}
|
||||
|
||||
/* Locate data in video parameter table */
|
||||
int1d = MEM_RW(0x1d << 2);
|
||||
regvals = ((mode >> 1) << 4) + int1d;
|
||||
cgacolour = 0x30;
|
||||
if (mode == 0x06) {
|
||||
regvals -= 0x10;
|
||||
cgacolour = 0x3F;
|
||||
}
|
||||
|
||||
/** Update BIOS Data Area **/
|
||||
|
||||
/* Video mode */
|
||||
MEM_WB(0x0449, mode);
|
||||
|
||||
/* Columns */
|
||||
tmp = MEM_RB(mode + int1d + 0x48);
|
||||
MEM_WW(0x044A, tmp);
|
||||
|
||||
/* Page length */
|
||||
tmp = MEM_RW((mode & 0x06) + int1d + 0x40);
|
||||
MEM_WW(0x044C, tmp);
|
||||
|
||||
/* Start Address */
|
||||
MEM_WW(0x044E, 0);
|
||||
|
||||
/* Cursor positions, one for each display page */
|
||||
for (i = 0x0450; i < 0x0460; i += 2)
|
||||
MEM_WW(i, 0);
|
||||
|
||||
/* Cursor start & end scanlines */
|
||||
tmp = MEM_RB(regvals + 0x0B);
|
||||
MEM_WB(0x0460, tmp);
|
||||
tmp = MEM_RB(regvals + 0x0A);
|
||||
MEM_WB(0x0461, tmp);
|
||||
|
||||
/* Current display page number */
|
||||
MEM_WB(0x0462, 0);
|
||||
|
||||
/* CRTC I/O address */
|
||||
MEM_WW(0x0463, ioport);
|
||||
|
||||
/* CGA Mode register value */
|
||||
cgamode = MEM_RB(mode + int1d + 0x50);
|
||||
MEM_WB(0x0465, cgamode);
|
||||
|
||||
/* CGA Colour register value */
|
||||
MEM_WB(0x0466, cgacolour);
|
||||
|
||||
/* Rows */
|
||||
MEM_WB(0x0484, (25 - 1));
|
||||
|
||||
/* Programme the mode */
|
||||
outb(ioport + 4, cgamode & 0x37); /* Turn off screen */
|
||||
for (i = 0; i < 0x10; i++) {
|
||||
tmp = MEM_RB(regvals + i);
|
||||
outb(ioport, i);
|
||||
outb(ioport + 1, tmp);
|
||||
}
|
||||
outb(ioport + 5, cgacolour); /* Select colour mode */
|
||||
outb(ioport + 4, cgamode); /* Turn on screen */
|
||||
}
|
||||
break;
|
||||
|
||||
case 0x01:
|
||||
/* Set Cursor Type */
|
||||
/* Enter: CH = starting line for cursor */
|
||||
/* CL = ending line for cursor */
|
||||
/* Leave: Nothing */
|
||||
/* Implemented */
|
||||
{ /* Localise */
|
||||
u16 ioport = MEM_RW(0x0463);
|
||||
|
||||
MEM_WB(0x0460, X86_CL);
|
||||
MEM_WB(0x0461, X86_CH);
|
||||
|
||||
outb(ioport, 0x0A);
|
||||
outb(ioport + 1, X86_CH);
|
||||
outb(ioport, 0x0B);
|
||||
outb(ioport + 1, X86_CL);
|
||||
}
|
||||
break;
|
||||
|
||||
case 0x02:
|
||||
/* Set Cursor Position */
|
||||
/* Enter: BH = display page number */
|
||||
/* DH = row */
|
||||
/* DL = column */
|
||||
/* Leave: Nothing */
|
||||
/* Implemented */
|
||||
{ /* Localise */
|
||||
u16 offset, ioport;
|
||||
|
||||
MEM_WB((X86_BH << 1) + 0x0450, X86_DL);
|
||||
MEM_WB((X86_BH << 1) + 0x0451, X86_DH);
|
||||
|
||||
if (X86_BH != MEM_RB(0x0462))
|
||||
break;
|
||||
|
||||
offset = (X86_DH * MEM_RW(0x044A)) + X86_DL;
|
||||
offset += MEM_RW(0x044E) << 1;
|
||||
|
||||
ioport = MEM_RW(0x0463);
|
||||
outb(ioport, 0x0E);
|
||||
outb(ioport + 1, offset >> 8);
|
||||
outb(ioport, 0x0F);
|
||||
outb(ioport + 1, offset & 0xFF);
|
||||
}
|
||||
break;
|
||||
|
||||
case 0x03:
|
||||
/* Get Cursor Position */
|
||||
/* Enter: BH = display page number */
|
||||
/* Leave: CH = starting line for cursor */
|
||||
/* CL = ending line for cursor */
|
||||
/* DH = row */
|
||||
/* DL = column */
|
||||
/* Implemented */
|
||||
{ /* Localise */
|
||||
X86_CL = MEM_RB(0x0460);
|
||||
X86_CH = MEM_RB(0x0461);
|
||||
X86_DL = MEM_RB((X86_BH << 1) + 0x0450);
|
||||
X86_DH = MEM_RB((X86_BH << 1) + 0x0451);
|
||||
}
|
||||
break;
|
||||
|
||||
case 0x04:
|
||||
/* Get Light Pen Position */
|
||||
/* Enter: Nothing */
|
||||
/* Leave: AH = 0x01 (down/triggered) or 0x00 (not) */
|
||||
/* BX = pixel column */
|
||||
/* CX = pixel row */
|
||||
/* DH = character row */
|
||||
/* DL = character column */
|
||||
/* Not Implemented */
|
||||
{ /* Localise */
|
||||
printf("int%x - Get Light Pen Position. "
|
||||
"Function not implemented.\n",
|
||||
current->num);
|
||||
x86emu_dump_xregs();
|
||||
X86_AH = X86_BX = X86_CX = X86_DX = 0;
|
||||
}
|
||||
break;
|
||||
|
||||
case 0x05:
|
||||
/* Set Display Page */
|
||||
/* Enter: AL = display page number */
|
||||
/* Leave: Nothing */
|
||||
/* Implemented */
|
||||
{ /* Localise */
|
||||
u16 start, ioport = MEM_RW(0x0463);
|
||||
u8 x, y;
|
||||
|
||||
/* Calculate new start address */
|
||||
MEM_WB(0x0462, X86_AL);
|
||||
start = X86_AL * MEM_RW(0x044C);
|
||||
MEM_WW(0x044E, start);
|
||||
start <<= 1;
|
||||
|
||||
/* Update start address */
|
||||
outb(ioport, 0x0C);
|
||||
outb(ioport + 1, start >> 8);
|
||||
outb(ioport, 0x0D);
|
||||
outb(ioport + 1, start & 0xFF);
|
||||
|
||||
/* Switch cursor position */
|
||||
y = MEM_RB((X86_AL << 1) + 0x0450);
|
||||
x = MEM_RB((X86_AL << 1) + 0x0451);
|
||||
start += (y * MEM_RW(0x044A)) + x;
|
||||
|
||||
/* Update cursor position */
|
||||
outb(ioport, 0x0E);
|
||||
outb(ioport + 1, start >> 8);
|
||||
outb(ioport, 0x0F);
|
||||
outb(ioport + 1, start & 0xFF);
|
||||
}
|
||||
break;
|
||||
|
||||
case 0x06:
|
||||
/* Initialise or Scroll Window Up */
|
||||
/* Enter: AL = lines to scroll up */
|
||||
/* BH = attribute for blank */
|
||||
/* CH = upper y of window */
|
||||
/* CL = left x of window */
|
||||
/* DH = lower y of window */
|
||||
/* DL = right x of window */
|
||||
/* Leave: Nothing */
|
||||
/* Not Implemented */
|
||||
{ /* Localise */
|
||||
printf("int%x: Initialise or Scroll Window Up - "
|
||||
"Function not implemented.\n",
|
||||
current->num);
|
||||
x86emu_dump_xregs();
|
||||
}
|
||||
break;
|
||||
|
||||
case 0x07:
|
||||
/* Initialise or Scroll Window Down */
|
||||
/* Enter: AL = lines to scroll down */
|
||||
/* BH = attribute for blank */
|
||||
/* CH = upper y of window */
|
||||
/* CL = left x of window */
|
||||
/* DH = lower y of window */
|
||||
/* DL = right x of window */
|
||||
/* Leave: Nothing */
|
||||
/* Not Implemented */
|
||||
{ /* Localise */
|
||||
printf("int%x: Initialise or Scroll Window Down - "
|
||||
"Function not implemented.\n",
|
||||
current->num);
|
||||
x86emu_dump_xregs();
|
||||
|
||||
}
|
||||
break;
|
||||
|
||||
case 0x08:
|
||||
/* Read Character and Attribute at Cursor */
|
||||
/* Enter: BH = display page number */
|
||||
/* Leave: AH = attribute */
|
||||
/* AL = character */
|
||||
/* Not Implemented */
|
||||
{ /* Localise */
|
||||
printf
|
||||
("int%x: Read Character and Attribute at Cursor - "
|
||||
"Function not implemented.\n", current->num);
|
||||
x86emu_dump_xregs();
|
||||
|
||||
X86_AX = 0;
|
||||
}
|
||||
break;
|
||||
|
||||
case 0x09:
|
||||
/* Write Character and Attribute at Cursor */
|
||||
/* Enter: AL = character */
|
||||
/* BH = display page number */
|
||||
/* BL = attribute (text) or colour (graphics) */
|
||||
/* CX = replication count */
|
||||
/* Leave: Nothing */
|
||||
/* Not Implemented */
|
||||
{ /* Localise */
|
||||
printf
|
||||
("int%x: Write Character and Attribute at Cursor - "
|
||||
"Function not implemented.\n", current->num);
|
||||
x86emu_dump_xregs();
|
||||
|
||||
}
|
||||
break;
|
||||
|
||||
case 0x0a:
|
||||
/* Write Character at Cursor */
|
||||
/* Enter: AL = character */
|
||||
/* BH = display page number */
|
||||
/* BL = colour */
|
||||
/* CX = replication count */
|
||||
/* Leave: Nothing */
|
||||
/* Not Implemented */
|
||||
{ /* Localise */
|
||||
printf("int%x: Write Character at Cursor - "
|
||||
"Function not implemented.\n",
|
||||
current->num);
|
||||
x86emu_dump_xregs();
|
||||
|
||||
}
|
||||
break;
|
||||
|
||||
case 0x0b:
|
||||
/* Set Palette, Background or Border */
|
||||
/* Enter: BH = 0x00 or 0x01 */
|
||||
/* BL = colour or palette (respectively) */
|
||||
/* Leave: Nothing */
|
||||
/* Implemented */
|
||||
{ /* Localise */
|
||||
u16 ioport = MEM_RW(0x0463) + 5;
|
||||
u8 cgacolour = MEM_RB(0x0466);
|
||||
|
||||
if (X86_BH) {
|
||||
cgacolour &= 0xDF;
|
||||
cgacolour |= (X86_BL & 0x01) << 5;
|
||||
} else {
|
||||
cgacolour &= 0xE0;
|
||||
cgacolour |= X86_BL & 0x1F;
|
||||
}
|
||||
|
||||
MEM_WB(0x0466, cgacolour);
|
||||
outb(ioport, cgacolour);
|
||||
}
|
||||
break;
|
||||
|
||||
case 0x0c:
|
||||
/* Write Graphics Pixel */
|
||||
/* Enter: AL = pixel value */
|
||||
/* BH = display page number */
|
||||
/* CX = column */
|
||||
/* DX = row */
|
||||
/* Leave: Nothing */
|
||||
/* Not Implemented */
|
||||
{ /* Localise */
|
||||
printf("int%x: Write Graphics Pixel - "
|
||||
"Function not implemented.\n",
|
||||
current->num);
|
||||
x86emu_dump_xregs();
|
||||
|
||||
}
|
||||
break;
|
||||
|
||||
case 0x0d:
|
||||
/* Read Graphics Pixel */
|
||||
/* Enter: BH = display page number */
|
||||
/* CX = column */
|
||||
/* DX = row */
|
||||
/* Leave: AL = pixel value */
|
||||
/* Not Implemented */
|
||||
{ /* Localise */
|
||||
printf("int%x: Write Graphics Pixel - "
|
||||
"Function not implemented.\n",
|
||||
current->num);
|
||||
x86emu_dump_xregs();
|
||||
|
||||
X86_AL = 0;
|
||||
|
||||
}
|
||||
break;
|
||||
|
||||
case 0x0e:
|
||||
/* Write Character in Teletype Mode */
|
||||
/* Enter: AL = character */
|
||||
/* BH = display page number */
|
||||
/* BL = foreground colour */
|
||||
/* Leave: Nothing */
|
||||
/* Not Implemented */
|
||||
/* WARNING: Emulation of BEL characters will require */
|
||||
/* emulation of RTC and PC speaker I/O. */
|
||||
/* Also, this recurses through int 0x10 */
|
||||
/* which might or might not have been */
|
||||
/* installed yet. */
|
||||
{ /* Localise */
|
||||
#ifdef PARANOID
|
||||
printf("int%x: Write Character in Teletype Mode - "
|
||||
"Function not implemented.\n",
|
||||
current->num);
|
||||
x86emu_dump_xregs();
|
||||
#endif
|
||||
printf("%c", X86_AL);
|
||||
}
|
||||
break;
|
||||
|
||||
case 0x0f:
|
||||
/* Get Video Mode */
|
||||
/* Enter: Nothing */
|
||||
/* Leave: AH = number of columns */
|
||||
/* AL = video mode number */
|
||||
/* BH = display page number */
|
||||
/* Implemented */
|
||||
{ /* Localise */
|
||||
X86_AH = MEM_RW(0x044A);
|
||||
X86_AL = MEM_RB(0x0449);
|
||||
X86_BH = MEM_RB(0x0462);
|
||||
}
|
||||
break;
|
||||
|
||||
case 0x10:
|
||||
/* Colour Control (subfunction in AL) */
|
||||
/* Enter: Various */
|
||||
/* Leave: Various */
|
||||
/* Ignored */
|
||||
break;
|
||||
|
||||
case 0x11:
|
||||
/* Font Control (subfunction in AL) */
|
||||
/* Enter: Various */
|
||||
/* Leave: Various */
|
||||
/* Ignored */
|
||||
break;
|
||||
|
||||
case 0x12:
|
||||
/* Miscellaneous (subfunction in BL) */
|
||||
/* Enter: Various */
|
||||
/* Leave: Various */
|
||||
/* Ignored. Previous code here optionally allowed */
|
||||
/* the enabling and disabling of VGA, but no system */
|
||||
/* BIOS I've come across actually implements it. */
|
||||
break;
|
||||
|
||||
case 0x13:
|
||||
/* Write String in Teletype Mode */
|
||||
/* Enter: AL = write mode */
|
||||
/* BL = attribute (if (AL & 0x02) == 0) */
|
||||
/* CX = string length */
|
||||
/* DH = row */
|
||||
/* DL = column */
|
||||
/* ES:BP = string segment:offset */
|
||||
/* Leave: Nothing */
|
||||
/* Not Implemented */
|
||||
/* WARNING: Emulation of BEL characters will require */
|
||||
/* emulation of RTC and PC speaker I/O. */
|
||||
/* Also, this recurses through int 0x10 */
|
||||
/* which might or might not have been */
|
||||
/* installed yet. */
|
||||
{ /* Localise */
|
||||
printf ("int%x: Write String in Teletype Mode - "
|
||||
"Function not implemented.\n", current->num);
|
||||
x86emu_dump_xregs();
|
||||
|
||||
}
|
||||
break;
|
||||
|
||||
default:
|
||||
/* Various extensions */
|
||||
/* Enter: Various */
|
||||
/* Leave: Various */
|
||||
/* Ignored */
|
||||
break;
|
||||
}
|
||||
|
||||
return 1;
|
||||
}
|
||||
#endif
|
||||
12
util/vgabios/int15.c
Normal file
12
util/vgabios/int15.c
Normal file
|
|
@ -0,0 +1,12 @@
|
|||
#include <stdio.h>
|
||||
#include "test.h"
|
||||
|
||||
void x86emu_dump_xregs();
|
||||
|
||||
int int15_handler(void)
|
||||
{
|
||||
printf("\nint15 encountered.\n");
|
||||
x86emu_dump_xregs();
|
||||
X86_EAX = 0;
|
||||
return 1;
|
||||
}
|
||||
7
util/vgabios/int16.c
Normal file
7
util/vgabios/int16.c
Normal file
|
|
@ -0,0 +1,7 @@
|
|||
#include <stdio.h>
|
||||
|
||||
int int16_handler(void)
|
||||
{
|
||||
printf("\nint16: keyboard not supported right now.\n");
|
||||
return 1;
|
||||
}
|
||||
178
util/vgabios/int1a.c
Normal file
178
util/vgabios/int1a.c
Normal file
|
|
@ -0,0 +1,178 @@
|
|||
#include <stdio.h>
|
||||
#include "test.h"
|
||||
#include "pci-userspace.h"
|
||||
|
||||
#define DEBUG_INT1A
|
||||
|
||||
#define SUCCESSFUL 0x00
|
||||
#define DEVICE_NOT_FOUND 0x86
|
||||
#define BAD_REGISTER_NUMBER 0x87
|
||||
|
||||
void x86emu_dump_xregs(void);
|
||||
extern int verbose;
|
||||
|
||||
|
||||
int int1A_handler()
|
||||
{
|
||||
PCITAG tag;
|
||||
pciVideoPtr pvp=NULL;
|
||||
|
||||
if (verbose) {
|
||||
printf("\nint1a encountered.\n");
|
||||
x86emu_dump_xregs();
|
||||
}
|
||||
|
||||
switch (X86_AX) {
|
||||
case 0xb101:
|
||||
X86_EAX = 0x00; /* no config space/special cycle support */
|
||||
X86_AL = 0x01; /* config mechanism 1 */
|
||||
X86_EDX = 0x20494350; /* " ICP" */
|
||||
X86_EBX = 0x0210; /* Version 2.10 */
|
||||
X86_ECX &= 0xFF00;
|
||||
X86_ECX |= (pciNumBuses & 0xFF); /* Max bus number in system */
|
||||
X86_EFLAGS &= ~((unsigned long) 0x01); /* clear carry flag */
|
||||
#ifdef DEBUG_INT1A
|
||||
if (verbose)
|
||||
printf("PCI bios present.\n");
|
||||
#endif
|
||||
return 1;
|
||||
case 0xb102:
|
||||
if (X86_DX == pvp->vendor_id && X86_CX == pvp->device_id
|
||||
&& X86_ESI == 0) {
|
||||
X86_EAX = X86_AL | (SUCCESSFUL << 8);
|
||||
X86_EFLAGS &= ~((unsigned long) 0x01); /* clear carry flag */
|
||||
X86_EBX = pciSlotBX(pvp);
|
||||
}
|
||||
#ifdef SHOW_ALL_DEVICES
|
||||
else if ((pvp =
|
||||
xf86FindPciDeviceVendor(X86_EDX, X86_ECX, X86_ESI, pvp))) {
|
||||
X86_EAX = X86_AL | (SUCCESSFUL << 8);
|
||||
X86_EFLAGS &= ~((unsigned long) 0x01); /* clear carry flag */
|
||||
X86_EBX = pciSlotBX(pvp);
|
||||
}
|
||||
#endif
|
||||
else {
|
||||
X86_EAX = X86_AL | (DEVICE_NOT_FOUND << 8);
|
||||
X86_EFLAGS |= ((unsigned long) 0x01); /* set carry flag */
|
||||
}
|
||||
#ifdef DEBUG_INT1A
|
||||
printf("eax=0x%x ebx=0x%x eflags=0x%x\n", X86_EAX, X86_EBX,
|
||||
X86_EFLAGS);
|
||||
#endif
|
||||
return 1;
|
||||
case 0xb103:
|
||||
#if 0
|
||||
if (X86_CL == pvp->interface &&
|
||||
X86_CH == pvp->subclass &&
|
||||
((X86_ECX & 0xFFFF0000) >> 16) == pvp->class) {
|
||||
X86_EAX = X86_AL | (SUCCESSFUL << 8);
|
||||
X86_EBX = pciSlotBX(pvp);
|
||||
X86_EFLAGS &= ~((unsigned long) 0x01); /* clear carry flag */
|
||||
}
|
||||
#else
|
||||
/* FIXME: dirty hack */
|
||||
if (0) ;
|
||||
#endif
|
||||
#ifdef SHOW_ALL_DEVICES
|
||||
else if ((pvp = FindPciClass(X86_CL, X86_CH,
|
||||
(X86_ECX & 0xffff0000) >> 16,
|
||||
X86_ESI, pvp))) {
|
||||
X86_EAX = X86_AL | (SUCCESSFUL << 8);
|
||||
X86_EFLAGS &= ~((unsigned long) 0x01); /* clear carry flag */
|
||||
X86_EBX = pciSlotBX(pvp);
|
||||
}
|
||||
#endif
|
||||
else {
|
||||
X86_EAX = X86_AL | (DEVICE_NOT_FOUND << 8);
|
||||
X86_EFLAGS |= ((unsigned long) 0x01); /* set carry flag */
|
||||
}
|
||||
#ifdef DEBUG_INT1A
|
||||
printf("eax=0x%x eflags=0x%x\n", X86_EAX, X86_EFLAGS);
|
||||
#endif
|
||||
return 1;
|
||||
case 0xb108:
|
||||
if ((tag = findPci(X86_EBX))) {
|
||||
X86_CL = pciReadByte(tag, X86_EDI);
|
||||
X86_EAX = X86_AL | (SUCCESSFUL << 8);
|
||||
X86_EFLAGS &= ~((unsigned long) 0x01); /* clear carry flag */
|
||||
} else {
|
||||
X86_EAX = X86_AL | (BAD_REGISTER_NUMBER << 8);
|
||||
X86_EFLAGS |= ((unsigned long) 0x01); /* set carry flag */
|
||||
}
|
||||
#ifdef DEBUG_INT1A
|
||||
printf("eax=0x%x ecx=0x%x eflags=0x%x\n", X86_EAX, X86_ECX,
|
||||
X86_EFLAGS);
|
||||
#endif
|
||||
return 1;
|
||||
case 0xb109:
|
||||
if ((tag = findPci(X86_EBX))) {
|
||||
X86_CX = pciReadWord(tag, X86_EDI);
|
||||
X86_EAX = X86_AL | (SUCCESSFUL << 8);
|
||||
X86_EFLAGS &= ~((unsigned long) 0x01); /* clear carry flag */
|
||||
} else {
|
||||
X86_EAX = X86_AL | (BAD_REGISTER_NUMBER << 8);
|
||||
X86_EFLAGS |= ((unsigned long) 0x01); /* set carry flag */
|
||||
}
|
||||
#ifdef DEBUG_INT1A
|
||||
printf("eax=0x%x ecx=0x%x eflags=0x%x\n", X86_EAX, X86_ECX,
|
||||
X86_EFLAGS);
|
||||
#endif
|
||||
return 1;
|
||||
case 0xb10a:
|
||||
if ((tag = findPci(X86_EBX))) {
|
||||
X86_ECX = pciReadLong(tag, X86_EDI);
|
||||
X86_EAX = X86_AL | (SUCCESSFUL << 8);
|
||||
X86_EFLAGS &= ~((unsigned long) 0x01); /* clear carry flag */
|
||||
} else {
|
||||
X86_EAX = X86_AL | (BAD_REGISTER_NUMBER << 8);
|
||||
X86_EFLAGS |= ((unsigned long) 0x01); /* set carry flag */
|
||||
}
|
||||
#ifdef DEBUG_INT1A
|
||||
printf("eax=0x%x ecx=0x%x eflags=0x%x\n", X86_EAX, X86_ECX,
|
||||
X86_EFLAGS);
|
||||
#endif
|
||||
return 1;
|
||||
case 0xb10b:
|
||||
if ((tag = findPci(X86_EBX))) {
|
||||
pciWriteByte(tag, X86_EDI, X86_CL);
|
||||
X86_EAX = X86_AL | (SUCCESSFUL << 8);
|
||||
X86_EFLAGS &= ~((unsigned long) 0x01); /* clear carry flag */
|
||||
} else {
|
||||
X86_EAX = X86_AL | (BAD_REGISTER_NUMBER << 8);
|
||||
X86_EFLAGS |= ((unsigned long) 0x01); /* set carry flag */
|
||||
}
|
||||
#ifdef DEBUG_INT1A
|
||||
printf("eax=0x%x eflags=0x%x\n", X86_EAX, X86_EFLAGS);
|
||||
#endif
|
||||
return 1;
|
||||
case 0xb10c:
|
||||
if ((tag = findPci(X86_EBX))) {
|
||||
pciWriteWord(tag, X86_EDI, X86_CX);
|
||||
X86_EAX = X86_AL | (SUCCESSFUL << 8);
|
||||
X86_EFLAGS &= ~((unsigned long) 0x01); /* clear carry flag */
|
||||
} else {
|
||||
X86_EAX = X86_AL | (BAD_REGISTER_NUMBER << 8);
|
||||
X86_EFLAGS |= ((unsigned long) 0x01); /* set carry flag */
|
||||
}
|
||||
#ifdef DEBUG_INT1A
|
||||
printf("eax=0x%x eflags=0x%x\n", X86_EAX, X86_EFLAGS);
|
||||
#endif
|
||||
return 1;
|
||||
case 0xb10d:
|
||||
if ((tag = findPci(X86_EBX))) {
|
||||
pciWriteLong(tag, X86_EDI, X86_ECX);
|
||||
X86_EAX = X86_AL | (SUCCESSFUL << 8);
|
||||
X86_EFLAGS &= ~((unsigned long) 0x01); /* clear carry flag */
|
||||
} else {
|
||||
X86_EAX = X86_AL | (BAD_REGISTER_NUMBER << 8);
|
||||
X86_EFLAGS |= ((unsigned long) 0x01); /* set carry flag */
|
||||
}
|
||||
#ifdef DEBUG_INT1A
|
||||
printf("eax=0x%x eflags=0x%x\n", X86_EAX, X86_EFLAGS);
|
||||
#endif
|
||||
return 1;
|
||||
default:
|
||||
printf("int1a: subfunction not implemented.\n");
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
20
util/vgabios/inte6.c
Normal file
20
util/vgabios/inte6.c
Normal file
|
|
@ -0,0 +1,20 @@
|
|||
#include <stdio.h>
|
||||
|
||||
int intE6_handler()
|
||||
{
|
||||
#if 0
|
||||
pciVideoPtr pvp;
|
||||
|
||||
if ((pvp = xf86GetPciInfoForEntity(pInt->entityIndex)))
|
||||
X86_AX =
|
||||
(pvp->bus << 8) | (pvp->device << 3) | (pvp->
|
||||
func & 0x7);
|
||||
pushw(X86_CS);
|
||||
pushw(X86_IP);
|
||||
X86_CS = pInt->BIOSseg;
|
||||
X86_EIP = 0x0003;
|
||||
X86_ES = 0; /* standard pc es */
|
||||
#endif
|
||||
printf("intE6 not supported right now.\n");
|
||||
return 1;
|
||||
}
|
||||
4
util/vgabios/pci.h
Normal file
4
util/vgabios/pci.h
Normal file
|
|
@ -0,0 +1,4 @@
|
|||
void x_outb(u16 port, u8 val);
|
||||
#define outb x_outb
|
||||
|
||||
|
||||
Loading…
Add table
Add a link
Reference in a new issue