mirror of
https://github.com/reactos/reactos.git
synced 2024-08-04 10:30:59 +00:00
[NTVDM]
- DOS: the DOS file attributes are one byte. - BIOS: don't use hardcoded values; use the SEG_OFF_TO_PTR macro introduced earlier; use get/setAX instead of EmulatorGet/SetRegister. svn path=/branches/ntvdm/; revision=60781
This commit is contained in:
parent
09d991b838
commit
76708ef246
|
@ -270,7 +270,7 @@ static LPBYTE VideoModes[] =
|
|||
static BOOLEAN BiosKbdBufferPush(WORD Data)
|
||||
{
|
||||
/* Get the location of the element after the tail */
|
||||
WORD NextElement = Bda->KeybdBufferTail + 2;
|
||||
WORD NextElement = Bda->KeybdBufferTail + sizeof(WORD);
|
||||
|
||||
/* Wrap it around if it's at or beyond the end */
|
||||
if (NextElement >= Bda->KeybdBufferEnd) NextElement = Bda->KeybdBufferStart;
|
||||
|
@ -455,11 +455,11 @@ BOOLEAN BiosInitialize(VOID)
|
|||
{
|
||||
INT i;
|
||||
WORD Offset = 0;
|
||||
LPWORD IntVecTable = (LPWORD)((ULONG_PTR)BaseAddress);
|
||||
LPBYTE BiosCode = (LPBYTE)((ULONG_PTR)BaseAddress + TO_LINEAR(BIOS_SEGMENT, 0));
|
||||
LPWORD IntVecTable = (LPWORD)BaseAddress;
|
||||
LPBYTE BiosCode = (LPBYTE)SEG_OFF_TO_PTR(BIOS_SEGMENT, 0);
|
||||
|
||||
/* Initialize the BDA */
|
||||
Bda = (PBIOS_DATA_AREA)((ULONG_PTR)BaseAddress + TO_LINEAR(BDA_SEGMENT, 0));
|
||||
Bda = (PBIOS_DATA_AREA)SEG_OFF_TO_PTR(BDA_SEGMENT, 0);
|
||||
Bda->EquipmentList = BIOS_EQUIPMENT_LIST;
|
||||
Bda->KeybdBufferStart = FIELD_OFFSET(BIOS_DATA_AREA, KeybdBuffer);
|
||||
Bda->KeybdBufferEnd = Bda->KeybdBufferStart + BIOS_KBD_BUFFER_SIZE * sizeof(WORD);
|
||||
|
@ -594,8 +594,8 @@ VOID BiosCleanup(VOID)
|
|||
|
||||
WORD BiosPeekCharacter(VOID)
|
||||
{
|
||||
WORD CharacterData;
|
||||
|
||||
WORD CharacterData = 0;
|
||||
|
||||
/* Get the key from the queue, but don't remove it */
|
||||
if (BiosKbdBufferTop(&CharacterData)) return CharacterData;
|
||||
else return 0xFFFF;
|
||||
|
@ -777,17 +777,12 @@ VOID BiosPrintCharacter(CHAR Character, BYTE Attribute, BYTE Page)
|
|||
|
||||
VOID BiosVideoService(LPWORD Stack)
|
||||
{
|
||||
DWORD Eax = EmulatorGetRegister(EMULATOR_REG_AX);
|
||||
DWORD Ecx = EmulatorGetRegister(EMULATOR_REG_CX);
|
||||
DWORD Edx = EmulatorGetRegister(EMULATOR_REG_DX);
|
||||
DWORD Ebx = EmulatorGetRegister(EMULATOR_REG_BX);
|
||||
|
||||
switch (HIBYTE(Eax))
|
||||
switch (getAH())
|
||||
{
|
||||
/* Set Video Mode */
|
||||
case 0x00:
|
||||
{
|
||||
BiosSetVideoMode(LOBYTE(Eax));
|
||||
BiosSetVideoMode(getAL());
|
||||
VgaClearMemory();
|
||||
break;
|
||||
}
|
||||
|
@ -796,8 +791,8 @@ VOID BiosVideoService(LPWORD Stack)
|
|||
case 0x01:
|
||||
{
|
||||
/* Update the BDA */
|
||||
Bda->CursorStartLine = HIBYTE(Ecx);
|
||||
Bda->CursorEndLine = LOBYTE(Ecx);
|
||||
Bda->CursorStartLine = getCH();
|
||||
Bda->CursorEndLine = getCL();
|
||||
|
||||
/* Modify the CRTC registers */
|
||||
VgaWritePort(VGA_CRTC_INDEX, VGA_CRTC_CURSOR_START_REG);
|
||||
|
@ -811,7 +806,7 @@ VOID BiosVideoService(LPWORD Stack)
|
|||
/* Set Cursor Position */
|
||||
case 0x02:
|
||||
{
|
||||
BiosSetCursorPosition(HIBYTE(Edx), LOBYTE(Edx), HIBYTE(Ebx));
|
||||
BiosSetCursorPosition(getDH(), getDL(), getBH());
|
||||
break;
|
||||
}
|
||||
|
||||
|
@ -819,14 +814,12 @@ VOID BiosVideoService(LPWORD Stack)
|
|||
case 0x03:
|
||||
{
|
||||
/* Make sure the selected video page exists */
|
||||
if (HIBYTE(Ebx) >= BIOS_MAX_PAGES) break;
|
||||
if (getBH() >= BIOS_MAX_PAGES) break;
|
||||
|
||||
/* Return the result */
|
||||
EmulatorSetRegister(EMULATOR_REG_AX, 0);
|
||||
EmulatorSetRegister(EMULATOR_REG_CX,
|
||||
(Bda->CursorStartLine << 8) | Bda->CursorEndLine);
|
||||
EmulatorSetRegister(EMULATOR_REG_DX, Bda->CursorPosition[HIBYTE(Ebx)]);
|
||||
|
||||
setAX(0);
|
||||
setCX(MAKEWORD(Bda->CursorEndLine, Bda->CursorStartLine));
|
||||
setDX(Bda->CursorPosition[getBH()]);
|
||||
break;
|
||||
}
|
||||
|
||||
|
@ -837,14 +830,14 @@ VOID BiosVideoService(LPWORD Stack)
|
|||
* On modern BIOSes, this function returns 0
|
||||
* so that we can ignore the other registers.
|
||||
*/
|
||||
EmulatorSetRegister(EMULATOR_REG_AX, 0);
|
||||
setAX(0);
|
||||
break;
|
||||
}
|
||||
|
||||
/* Select Active Display Page */
|
||||
case 0x05:
|
||||
{
|
||||
BiosSetVideoPage(LOBYTE(Eax));
|
||||
BiosSetVideoPage(getAL());
|
||||
break;
|
||||
}
|
||||
|
||||
|
@ -852,21 +845,15 @@ VOID BiosVideoService(LPWORD Stack)
|
|||
case 0x06:
|
||||
case 0x07:
|
||||
{
|
||||
SMALL_RECT Rectangle =
|
||||
{
|
||||
LOBYTE(Ecx),
|
||||
HIBYTE(Ecx),
|
||||
LOBYTE(Edx),
|
||||
HIBYTE(Edx)
|
||||
};
|
||||
SMALL_RECT Rectangle = { getCL(), getCH(), getDL(), getDH() };
|
||||
|
||||
/* Call the internal function */
|
||||
BiosScrollWindow((HIBYTE(Eax) == 0x06) ? SCROLL_DIRECTION_UP
|
||||
: SCROLL_DIRECTION_DOWN,
|
||||
LOBYTE(Eax),
|
||||
BiosScrollWindow((getAH() == 0x06) ? SCROLL_DIRECTION_UP
|
||||
: SCROLL_DIRECTION_DOWN,
|
||||
getAL(),
|
||||
Rectangle,
|
||||
Bda->VideoPage,
|
||||
HIBYTE(Ebx));
|
||||
getBH());
|
||||
|
||||
break;
|
||||
}
|
||||
|
@ -876,19 +863,19 @@ VOID BiosVideoService(LPWORD Stack)
|
|||
case 0x09:
|
||||
case 0x0A:
|
||||
{
|
||||
WORD CharacterData = MAKEWORD(LOBYTE(Eax), LOBYTE(Ebx));
|
||||
BYTE Page = HIBYTE(Ebx);
|
||||
WORD CharacterData = MAKEWORD(getAL(), getBL());
|
||||
BYTE Page = getBH();
|
||||
DWORD Offset;
|
||||
|
||||
/* Check if the page exists */
|
||||
if (Page >= BIOS_MAX_PAGES) break;
|
||||
|
||||
/* Find the offset of the character */
|
||||
Offset = Page * Bda->VideoPageSize
|
||||
+ (HIBYTE(Bda->CursorPosition[Page]) * Bda->ScreenColumns
|
||||
+ LOBYTE(Bda->CursorPosition[Page])) * 2;
|
||||
Offset = Page * Bda->VideoPageSize +
|
||||
(HIBYTE(Bda->CursorPosition[Page]) * Bda->ScreenColumns +
|
||||
LOBYTE(Bda->CursorPosition[Page])) * 2;
|
||||
|
||||
if (HIBYTE(Eax) == 0x08)
|
||||
if (getAH() == 0x08)
|
||||
{
|
||||
/* Read from the video memory */
|
||||
VgaReadMemory(TO_LINEAR(TEXT_VIDEO_SEG, Offset),
|
||||
|
@ -896,14 +883,14 @@ VOID BiosVideoService(LPWORD Stack)
|
|||
sizeof(WORD));
|
||||
|
||||
/* Return the character in AX */
|
||||
EmulatorSetRegister(EMULATOR_REG_AX, CharacterData);
|
||||
setAX(CharacterData);
|
||||
}
|
||||
else
|
||||
{
|
||||
/* Write to video memory */
|
||||
VgaWriteMemory(TO_LINEAR(TEXT_VIDEO_SEG, Offset),
|
||||
(LPVOID)&CharacterData,
|
||||
(HIBYTE(Ebx) == 0x09) ? sizeof(WORD) : sizeof(BYTE));
|
||||
(getBH() == 0x09) ? sizeof(WORD) : sizeof(BYTE));
|
||||
}
|
||||
|
||||
break;
|
||||
|
@ -912,35 +899,26 @@ VOID BiosVideoService(LPWORD Stack)
|
|||
/* Teletype Output */
|
||||
case 0x0E:
|
||||
{
|
||||
BiosPrintCharacter(LOBYTE(Eax), LOBYTE(Ebx), HIBYTE(Ebx));
|
||||
BiosPrintCharacter(getAL(), getBL(), getBH());
|
||||
break;
|
||||
}
|
||||
|
||||
/* Get Current Video Mode */
|
||||
case 0x0F:
|
||||
{
|
||||
EmulatorSetRegister(EMULATOR_REG_AX,
|
||||
MAKEWORD(Bda->VideoMode, Bda->ScreenColumns));
|
||||
EmulatorSetRegister(EMULATOR_REG_BX,
|
||||
MAKEWORD(LOBYTE(Ebx), Bda->VideoPage));
|
||||
|
||||
setAX(MAKEWORD(Bda->VideoMode, Bda->ScreenColumns));
|
||||
setBX(MAKEWORD(getBL(), Bda->VideoPage));
|
||||
break;
|
||||
}
|
||||
|
||||
/* Scroll Window */
|
||||
case 0x12:
|
||||
{
|
||||
SMALL_RECT Rectangle =
|
||||
{
|
||||
LOBYTE(Ecx),
|
||||
HIBYTE(Ecx),
|
||||
LOBYTE(Edx),
|
||||
HIBYTE(Edx)
|
||||
};
|
||||
SMALL_RECT Rectangle = { getCL(), getCH(), getDL(), getDH() };
|
||||
|
||||
/* Call the internal function */
|
||||
BiosScrollWindow(LOBYTE(Ebx),
|
||||
LOBYTE(Eax),
|
||||
BiosScrollWindow(getBL(),
|
||||
getAL(),
|
||||
Rectangle,
|
||||
Bda->VideoPage,
|
||||
DEFAULT_ATTRIBUTE);
|
||||
|
@ -951,11 +929,11 @@ VOID BiosVideoService(LPWORD Stack)
|
|||
/* Display combination code */
|
||||
case 0x1A:
|
||||
{
|
||||
switch(LOBYTE(Eax))
|
||||
switch(getAL())
|
||||
{
|
||||
case 0x00: /* Get Display combiantion code */
|
||||
EmulatorSetRegister(EMULATOR_REG_AX, MAKEWORD(0x1A, 0x1A));
|
||||
EmulatorSetRegister(EMULATOR_REG_BX, MAKEWORD(0x08, 0x0)); /* VGA w/ color analog display */
|
||||
setAX(MAKEWORD(0x1A, 0x1A));
|
||||
setBX(MAKEWORD(0x08, 0x00)); /* VGA w/ color analog display */
|
||||
break;
|
||||
case 0x01: /* Set Display combination code */
|
||||
DPRINT1("Set Display combination code - Unsupported\n");
|
||||
|
@ -969,16 +947,14 @@ VOID BiosVideoService(LPWORD Stack)
|
|||
default:
|
||||
{
|
||||
DPRINT1("BIOS Function INT 10h, AH = 0x%02X NOT IMPLEMENTED\n",
|
||||
HIBYTE(Eax));
|
||||
getAH());
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
VOID BiosKeyboardService(LPWORD Stack)
|
||||
{
|
||||
DWORD Eax = EmulatorGetRegister(EMULATOR_REG_AX);
|
||||
|
||||
switch (HIBYTE(Eax))
|
||||
switch (getAH())
|
||||
{
|
||||
/* Wait for keystroke and read */
|
||||
case 0x00:
|
||||
|
@ -986,7 +962,7 @@ VOID BiosKeyboardService(LPWORD Stack)
|
|||
case 0x10: // FIXME: Temporarily do the same as INT 16h, 00h
|
||||
{
|
||||
/* Read the character (and wait if necessary) */
|
||||
EmulatorSetRegister(EMULATOR_REG_AX, BiosGetCharacter());
|
||||
setAX(BiosGetCharacter());
|
||||
break;
|
||||
}
|
||||
|
||||
|
@ -1000,8 +976,8 @@ VOID BiosKeyboardService(LPWORD Stack)
|
|||
if (Data != 0xFFFF)
|
||||
{
|
||||
/* There is a character, clear ZF and return it */
|
||||
EmulatorSetRegister(EMULATOR_REG_AX, Data);
|
||||
Stack[STACK_FLAGS] &= ~EMULATOR_FLAG_ZF;
|
||||
setAX(Data);
|
||||
}
|
||||
else
|
||||
{
|
||||
|
@ -1053,29 +1029,23 @@ VOID BiosKeyboardService(LPWORD Stack)
|
|||
default:
|
||||
{
|
||||
DPRINT1("BIOS Function INT 16h, AH = 0x%02X NOT IMPLEMENTED\n",
|
||||
HIBYTE(Eax));
|
||||
getAH());
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
VOID BiosTimeService(LPWORD Stack)
|
||||
{
|
||||
DWORD Eax = EmulatorGetRegister(EMULATOR_REG_AX);
|
||||
DWORD Ecx = EmulatorGetRegister(EMULATOR_REG_CX);
|
||||
DWORD Edx = EmulatorGetRegister(EMULATOR_REG_DX);
|
||||
|
||||
switch (HIBYTE(Eax))
|
||||
switch (getAH())
|
||||
{
|
||||
case 0x00:
|
||||
{
|
||||
/* Set AL to 1 if midnight had passed, 0 otherwise */
|
||||
Eax &= 0xFFFFFF00;
|
||||
if (Bda->MidnightPassed) Eax |= 1;
|
||||
setAL(Bda->MidnightPassed ? 0x01 : 0x00);
|
||||
|
||||
/* Return the tick count in CX:DX */
|
||||
EmulatorSetRegister(EMULATOR_REG_AX, Eax);
|
||||
EmulatorSetRegister(EMULATOR_REG_CX, HIWORD(Bda->TickCounter));
|
||||
EmulatorSetRegister(EMULATOR_REG_DX, LOWORD(Bda->TickCounter));
|
||||
setCX(HIWORD(Bda->TickCounter));
|
||||
setDX(LOWORD(Bda->TickCounter));
|
||||
|
||||
/* Reset the midnight flag */
|
||||
Bda->MidnightPassed = FALSE;
|
||||
|
@ -1086,7 +1056,7 @@ VOID BiosTimeService(LPWORD Stack)
|
|||
case 0x01:
|
||||
{
|
||||
/* Set the tick count to CX:DX */
|
||||
Bda->TickCounter = MAKELONG(LOWORD(Edx), LOWORD(Ecx));
|
||||
Bda->TickCounter = MAKELONG(getDX(), getCX());
|
||||
|
||||
/* Reset the midnight flag */
|
||||
Bda->MidnightPassed = FALSE;
|
||||
|
@ -1097,7 +1067,7 @@ VOID BiosTimeService(LPWORD Stack)
|
|||
default:
|
||||
{
|
||||
DPRINT1("BIOS Function INT 1Ah, AH = 0x%02X NOT IMPLEMENTED\n",
|
||||
HIBYTE(Eax));
|
||||
getAH());
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -1111,7 +1081,7 @@ VOID BiosSystemTimerInterrupt(LPWORD Stack)
|
|||
VOID BiosEquipmentService(LPWORD Stack)
|
||||
{
|
||||
/* Return the equipment list */
|
||||
EmulatorSetRegister(EMULATOR_REG_AX, Bda->EquipmentList);
|
||||
setAX(Bda->EquipmentList);
|
||||
}
|
||||
|
||||
VOID BiosHandleIrq(BYTE IrqNumber, LPWORD Stack)
|
||||
|
@ -1123,7 +1093,6 @@ VOID BiosHandleIrq(BYTE IrqNumber, LPWORD Stack)
|
|||
{
|
||||
/* Perform the system timer interrupt */
|
||||
EmulatorInterrupt(BIOS_SYS_TIMER_INTERRUPT);
|
||||
|
||||
break;
|
||||
}
|
||||
|
||||
|
@ -1144,15 +1113,15 @@ VOID BiosHandleIrq(BYTE IrqNumber, LPWORD Stack)
|
|||
if (!(ScanCode & (1 << 7)))
|
||||
{
|
||||
/* Key press */
|
||||
if (VirtualKey == VK_NUMLOCK
|
||||
|| VirtualKey == VK_CAPITAL
|
||||
|| VirtualKey == VK_SCROLL
|
||||
|| VirtualKey == VK_INSERT)
|
||||
if (VirtualKey == VK_NUMLOCK ||
|
||||
VirtualKey == VK_CAPITAL ||
|
||||
VirtualKey == VK_SCROLL ||
|
||||
VirtualKey == VK_INSERT)
|
||||
{
|
||||
/* For toggle keys, toggle the lowest bit in the keyboard map */
|
||||
BiosKeyboardMap[VirtualKey] ^= ~(1 << 0);
|
||||
}
|
||||
|
||||
|
||||
/* Set the highest bit */
|
||||
BiosKeyboardMap[VirtualKey] |= (1 << 7);
|
||||
|
||||
|
|
|
@ -1886,8 +1886,7 @@ VOID DosInt21h(LPWORD Stack)
|
|||
|
||||
/* Return the attributes that DOS can understand */
|
||||
Stack[STACK_FLAGS] &= ~EMULATOR_FLAG_CF;
|
||||
// setCL(LOBYTE(Attributes));
|
||||
setCX(LOWORD(Attributes));
|
||||
setCL(LOBYTE(Attributes));
|
||||
}
|
||||
else if (getAL() == 0x01)
|
||||
{
|
||||
|
|
Loading…
Reference in a new issue