mirror of https://github.com/tongzx/nt5src
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
172 lines
3.4 KiB
172 lines
3.4 KiB
|
|
#include "enduser.h"
|
|
|
|
|
|
VOID
|
|
UpdateMasterDiskState(
|
|
IN HDISK DiskHandle,
|
|
IN UINT NewState
|
|
)
|
|
{
|
|
MasterDiskInfo.State = NewState;
|
|
memset(IoBuffer,0,512);
|
|
memcpy(IoBuffer,&MasterDiskInfo,sizeof(MASTER_DISK));
|
|
if(!WriteDisk(DiskHandle,1,1,IoBuffer)) {
|
|
FatalError(textWriteFailedAtSector,1,1L);
|
|
}
|
|
}
|
|
|
|
|
|
UINT
|
|
LocateMasterDisk(
|
|
IN UINT UserSpecifiedInt13Unit OPTIONAL
|
|
)
|
|
{
|
|
UINT DiskCount;
|
|
UINT i;
|
|
BYTE Int13Unit;
|
|
BYTE spt;
|
|
USHORT h,cyl;
|
|
ULONG ext;
|
|
BYTE UnitToMatch;
|
|
|
|
UnitToMatch = (BYTE)(UserSpecifiedInt13Unit ? UserSpecifiedInt13Unit : 0x80);
|
|
|
|
DiskCount = InitializeDiskList();
|
|
|
|
for(i=0; i<DiskCount; i++) {
|
|
|
|
if(IsMasterDisk(i,IoBuffer)) {
|
|
//
|
|
// Want unit 80h
|
|
//
|
|
if(GetDiskInfoById(i,0,&Int13Unit,&spt,&h,&cyl,&ext)
|
|
&& (Int13Unit == UnitToMatch)) {
|
|
return(i);
|
|
}
|
|
}
|
|
}
|
|
|
|
FatalError(textCantFindMasterDisk);
|
|
}
|
|
|
|
|
|
VOID
|
|
FatalError(
|
|
IN FPCHAR FormatString,
|
|
...
|
|
)
|
|
{
|
|
char strng[250];
|
|
va_list arglist;
|
|
unsigned p;
|
|
|
|
DispClearClientArea(NULL);
|
|
|
|
DispPositionCursor(TEXT_LEFT_MARGIN,TEXT_TOP_LINE);
|
|
|
|
DispSetCurrentPixelValue(VGAPIX_LIGHT_YELLOW);
|
|
|
|
DispWriteString(textFatalError1);
|
|
DispWriteString("\n\n");
|
|
DispWriteString(textFatalError2);
|
|
|
|
DispSetCurrentPixelValue(VGAPIX_LIGHT_RED);
|
|
|
|
va_start(arglist,FormatString);
|
|
vsprintf(strng,FormatString,arglist);
|
|
va_end(arglist);
|
|
|
|
DispWriteString("\n\n");
|
|
DispWriteString(strng);
|
|
|
|
//
|
|
// Hanging this way prevents control-c because DOS isn't involved.
|
|
//
|
|
// We allow a special way to get out of this screen and exit
|
|
// the program, for testing.
|
|
//
|
|
strcpy(strng,"I am TEDM");
|
|
p = (unsigned)strng;
|
|
|
|
_asm {
|
|
y:
|
|
mov si,p
|
|
|
|
x:
|
|
push si
|
|
|
|
xor ax,ax ; get keystroke
|
|
int 16h
|
|
|
|
pop si
|
|
|
|
push ss
|
|
pop ds
|
|
cmp byte ptr [si],0 ; reached and of match string?
|
|
jnz not0 ; no, try to match chars
|
|
cmp al,ASCI_CR ; see if user hit ENTER
|
|
je bustout ; user entered magic code, exit to DOS
|
|
jne y ; start all over
|
|
|
|
not0:
|
|
cmp [si],al ; still on target for magic sequence?
|
|
jne y ; no, start over
|
|
inc si ; yes, set up for next iteration
|
|
jmp short x
|
|
|
|
bustout:
|
|
|
|
mov ax,3
|
|
int 10h
|
|
}
|
|
|
|
exit(0);
|
|
}
|
|
|
|
|
|
USHORT
|
|
GetKey(
|
|
VOID
|
|
)
|
|
{
|
|
USHORT c;
|
|
|
|
_asm {
|
|
mov ah,0
|
|
int 16h
|
|
mov c,ax
|
|
}
|
|
|
|
switch(c) {
|
|
case 0x5000:
|
|
return(DN_KEY_DOWN);
|
|
case 0x4800:
|
|
return(DN_KEY_UP);
|
|
case 0x4200:
|
|
return(DN_KEY_F8);
|
|
default:
|
|
return(c & 0x00ff);
|
|
}
|
|
}
|
|
|
|
|
|
VOID
|
|
DrainKeyboard(
|
|
VOID
|
|
)
|
|
{
|
|
_asm {
|
|
drain:
|
|
|
|
mov ah,1 ; get keyboard status
|
|
int 16h ; zero flag set = no key waiting
|
|
jz drained ; no key waiting, we're done
|
|
mov ah,0 ; get keypress, we know one is there
|
|
int 16h
|
|
jmp short drain ; see if there are more keys waiting
|
|
|
|
drained:
|
|
}
|
|
|
|
}
|