#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: } }