mirror of
https://github.com/reactos/reactos.git
synced 2025-08-02 20:36:26 +00:00
Support video and memory detection on the Xbox
svn path=/trunk/; revision=11599
This commit is contained in:
parent
cfde60c60d
commit
5882e75d37
27 changed files with 1420 additions and 402 deletions
|
@ -31,6 +31,10 @@ all:
|
||||||
$(MAKE) -C install
|
$(MAKE) -C install
|
||||||
$(MAKE) -C fdebug
|
$(MAKE) -C fdebug
|
||||||
|
|
||||||
|
freeldr:
|
||||||
|
$(MAKE) -C freeldr
|
||||||
|
.PHONY : freeldr
|
||||||
|
|
||||||
clean:
|
clean:
|
||||||
$(MAKE) -C bootsect clean
|
$(MAKE) -C bootsect clean
|
||||||
$(MAKE) -C freeldr clean
|
$(MAKE) -C freeldr clean
|
||||||
|
|
|
@ -200,7 +200,6 @@ ARCH_OBJS = fathelp.o \
|
||||||
boot.o \
|
boot.o \
|
||||||
linux.o \
|
linux.o \
|
||||||
mb.o \
|
mb.o \
|
||||||
i386mem.o \
|
|
||||||
i386rtl.o \
|
i386rtl.o \
|
||||||
i386vid.o \
|
i386vid.o \
|
||||||
drvmap.o \
|
drvmap.o \
|
||||||
|
@ -210,6 +209,14 @@ ARCH_OBJS = fathelp.o \
|
||||||
hardware.o \
|
hardware.o \
|
||||||
hwcpu.o \
|
hwcpu.o \
|
||||||
hwpci.o \
|
hwpci.o \
|
||||||
|
archmach.o \
|
||||||
|
machpc.o \
|
||||||
|
machxbox.o \
|
||||||
|
pccons.o \
|
||||||
|
pcmem.o \
|
||||||
|
xboxfont.o \
|
||||||
|
xboxmem.o \
|
||||||
|
xboxvideo.o \
|
||||||
_alloca.o # For Mingw32 builds
|
_alloca.o # For Mingw32 builds
|
||||||
|
|
||||||
|
|
||||||
|
@ -272,7 +279,8 @@ BASE_OBJS = freeldr.o \
|
||||||
debug.o \
|
debug.o \
|
||||||
multiboot.o \
|
multiboot.o \
|
||||||
version.o \
|
version.o \
|
||||||
cmdline.o
|
cmdline.o \
|
||||||
|
machine.o
|
||||||
|
|
||||||
FREELDR_OBJS= bootmgr.o \
|
FREELDR_OBJS= bootmgr.o \
|
||||||
drivemap.o \
|
drivemap.o \
|
||||||
|
|
50
freeldr/freeldr/arch/i386/archmach.c
Normal file
50
freeldr/freeldr/arch/i386/archmach.c
Normal file
|
@ -0,0 +1,50 @@
|
||||||
|
/* $Id: archmach.c,v 1.1 2004/11/08 22:02:47 gvg Exp $
|
||||||
|
*
|
||||||
|
* FreeLoader
|
||||||
|
*
|
||||||
|
* This program is free software; you can redistribute it and/or modify
|
||||||
|
* it under the terms of the GNU General Public License as published by
|
||||||
|
* the Free Software Foundation; either version 2 of the License, or
|
||||||
|
* (at your option) any later version.
|
||||||
|
*
|
||||||
|
* This program is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
* GNU General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU General Public License
|
||||||
|
* along with this program; if not, write to the Free Software
|
||||||
|
* Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include "freeldr.h"
|
||||||
|
#include "mm.h"
|
||||||
|
#include "machine.h"
|
||||||
|
#include "machpc.h"
|
||||||
|
#include "machxbox.h"
|
||||||
|
#include "portio.h"
|
||||||
|
#include "hardware.h"
|
||||||
|
#include "rtl.h"
|
||||||
|
|
||||||
|
VOID
|
||||||
|
MachInit(VOID)
|
||||||
|
{
|
||||||
|
U32 PciId;
|
||||||
|
|
||||||
|
memset(&MachVtbl, 0, sizeof(MACHVTBL));
|
||||||
|
|
||||||
|
/* Check for Xbox by identifying device at PCI 0:0:0, if it's
|
||||||
|
* 0x10de/0x02a5 then we're running on an Xbox */
|
||||||
|
WRITE_PORT_ULONG((U32*) 0xcf8, CONFIG_CMD(0, 0, 0));
|
||||||
|
PciId = READ_PORT_ULONG((U32*) 0xcfc);
|
||||||
|
if (0x02a510de == PciId)
|
||||||
|
{
|
||||||
|
XboxMachInit();
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
PcMachInit();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/* EOF */
|
|
@ -21,6 +21,10 @@
|
||||||
#ifndef __I386_HARDWARE_H_
|
#ifndef __I386_HARDWARE_H_
|
||||||
#define __I386_HARDWARE_H_
|
#define __I386_HARDWARE_H_
|
||||||
|
|
||||||
|
#ifndef __REGISTRY_H
|
||||||
|
#include "../../reactos/registry.h"
|
||||||
|
#endif
|
||||||
|
|
||||||
typedef enum
|
typedef enum
|
||||||
{
|
{
|
||||||
InterfaceTypeUndefined = -1,
|
InterfaceTypeUndefined = -1,
|
||||||
|
@ -149,6 +153,8 @@ typedef struct _CM_COMPONENT_INFORMATION
|
||||||
#define Input 0x00000020
|
#define Input 0x00000020
|
||||||
#define Output 0x00000040
|
#define Output 0x00000040
|
||||||
|
|
||||||
|
#define CONFIG_CMD(bus, dev_fn, where) \
|
||||||
|
(0x80000000 | (((U32)(bus)) << 16) | (((dev_fn) & 0x1F) << 11) | (((dev_fn) & 0xE0) << 3) | ((where) & ~3))
|
||||||
|
|
||||||
/* PROTOTYPES ***************************************************************/
|
/* PROTOTYPES ***************************************************************/
|
||||||
|
|
||||||
|
|
|
@ -1,216 +0,0 @@
|
||||||
/*
|
|
||||||
* FreeLoader
|
|
||||||
* Copyright (C) 1998-2003 Brian Palmer <brianp@sginet.com>
|
|
||||||
*
|
|
||||||
* This program is free software; you can redistribute it and/or modify
|
|
||||||
* it under the terms of the GNU General Public License as published by
|
|
||||||
* the Free Software Foundation; either version 2 of the License, or
|
|
||||||
* (at your option) any later version.
|
|
||||||
*
|
|
||||||
* This program is distributed in the hope that it will be useful,
|
|
||||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
||||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
||||||
* GNU General Public License for more details.
|
|
||||||
*
|
|
||||||
* You should have received a copy of the GNU General Public License
|
|
||||||
* along with this program; if not, write to the Free Software
|
|
||||||
* Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
|
|
||||||
*/
|
|
||||||
|
|
||||||
#include <freeldr.h>
|
|
||||||
#include <arch.h>
|
|
||||||
#include <mm.h>
|
|
||||||
#include <debug.h>
|
|
||||||
#include <rtl.h>
|
|
||||||
#include <portio.h>
|
|
||||||
|
|
||||||
|
|
||||||
U32 GetExtendedMemorySize(VOID)
|
|
||||||
{
|
|
||||||
REGS RegsIn;
|
|
||||||
REGS RegsOut;
|
|
||||||
U32 MemorySize;
|
|
||||||
|
|
||||||
DbgPrint((DPRINT_MEMORY, "GetExtendedMemorySize()\n"));
|
|
||||||
|
|
||||||
// Int 15h AX=E801h
|
|
||||||
// Phoenix BIOS v4.0 - GET MEMORY SIZE FOR >64M CONFIGURATIONS
|
|
||||||
//
|
|
||||||
// AX = E801h
|
|
||||||
// Return:
|
|
||||||
// CF clear if successful
|
|
||||||
// AX = extended memory between 1M and 16M, in K (max 3C00h = 15MB)
|
|
||||||
// BX = extended memory above 16M, in 64K blocks
|
|
||||||
// CX = configured memory 1M to 16M, in K
|
|
||||||
// DX = configured memory above 16M, in 64K blocks
|
|
||||||
// CF set on error
|
|
||||||
RegsIn.w.ax = 0xE801;
|
|
||||||
Int386(0x15, &RegsIn, &RegsOut);
|
|
||||||
|
|
||||||
DbgPrint((DPRINT_MEMORY, "Int15h AX=E801h\n"));
|
|
||||||
DbgPrint((DPRINT_MEMORY, "AX = 0x%x\n", RegsOut.w.ax));
|
|
||||||
DbgPrint((DPRINT_MEMORY, "BX = 0x%x\n", RegsOut.w.bx));
|
|
||||||
DbgPrint((DPRINT_MEMORY, "CX = 0x%x\n", RegsOut.w.cx));
|
|
||||||
DbgPrint((DPRINT_MEMORY, "DX = 0x%x\n", RegsOut.w.dx));
|
|
||||||
DbgPrint((DPRINT_MEMORY, "CF set = %s\n\n", (RegsOut.x.eflags & I386FLAG_CF) ? "TRUE" : "FALSE"));
|
|
||||||
|
|
||||||
if (INT386_SUCCESS(RegsOut))
|
|
||||||
{
|
|
||||||
// If AX=BX=0000h the use CX and DX
|
|
||||||
if (RegsOut.w.ax == 0)
|
|
||||||
{
|
|
||||||
// Return extended memory size in K
|
|
||||||
MemorySize = RegsOut.w.dx * 64;
|
|
||||||
MemorySize += RegsOut.w.cx;
|
|
||||||
return MemorySize;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
// Return extended memory size in K
|
|
||||||
MemorySize = RegsOut.w.bx * 64;
|
|
||||||
MemorySize += RegsOut.w.ax;
|
|
||||||
return MemorySize;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// If we get here then Int15 Func E801h didn't work
|
|
||||||
// So try Int15 Func 88h
|
|
||||||
|
|
||||||
// Int 15h AH=88h
|
|
||||||
// SYSTEM - GET EXTENDED MEMORY SIZE (286+)
|
|
||||||
//
|
|
||||||
// AH = 88h
|
|
||||||
// Return:
|
|
||||||
// CF clear if successful
|
|
||||||
// AX = number of contiguous KB starting at absolute address 100000h
|
|
||||||
// CF set on error
|
|
||||||
// AH = status
|
|
||||||
// 80h invalid command (PC,PCjr)
|
|
||||||
// 86h unsupported function (XT,PS30)
|
|
||||||
RegsIn.b.ah = 0x88;
|
|
||||||
Int386(0x15, &RegsIn, &RegsOut);
|
|
||||||
|
|
||||||
DbgPrint((DPRINT_MEMORY, "Int15h AH=88h\n"));
|
|
||||||
DbgPrint((DPRINT_MEMORY, "AX = 0x%x\n", RegsOut.w.ax));
|
|
||||||
DbgPrint((DPRINT_MEMORY, "CF set = %s\n\n", (RegsOut.x.eflags & I386FLAG_CF) ? "TRUE" : "FALSE"));
|
|
||||||
|
|
||||||
if (INT386_SUCCESS(RegsOut) && RegsOut.w.ax != 0)
|
|
||||||
{
|
|
||||||
MemorySize = RegsOut.w.ax;
|
|
||||||
return MemorySize;
|
|
||||||
}
|
|
||||||
|
|
||||||
// If we get here then Int15 Func 88h didn't work
|
|
||||||
// So try reading the CMOS
|
|
||||||
WRITE_PORT_UCHAR((PUCHAR)0x70, 0x31);
|
|
||||||
MemorySize = READ_PORT_UCHAR((PUCHAR)0x71);
|
|
||||||
MemorySize = (MemorySize & 0xFFFF);
|
|
||||||
MemorySize = (MemorySize << 8);
|
|
||||||
|
|
||||||
DbgPrint((DPRINT_MEMORY, "Int15h Failed\n"));
|
|
||||||
DbgPrint((DPRINT_MEMORY, "CMOS reports: 0x%x\n", MemorySize));
|
|
||||||
|
|
||||||
return MemorySize;
|
|
||||||
}
|
|
||||||
|
|
||||||
U32 GetConventionalMemorySize(VOID)
|
|
||||||
{
|
|
||||||
REGS Regs;
|
|
||||||
|
|
||||||
DbgPrint((DPRINT_MEMORY, "GetConventionalMemorySize()\n"));
|
|
||||||
|
|
||||||
// Int 12h
|
|
||||||
// BIOS - GET MEMORY SIZE
|
|
||||||
//
|
|
||||||
// Return:
|
|
||||||
// AX = kilobytes of contiguous memory starting at absolute address 00000h
|
|
||||||
//
|
|
||||||
// This call returns the contents of the word at 0040h:0013h;
|
|
||||||
// in PC and XT, this value is set from the switches on the motherboard
|
|
||||||
Regs.w.ax = 0;
|
|
||||||
Int386(0x12, &Regs, &Regs);
|
|
||||||
|
|
||||||
DbgPrint((DPRINT_MEMORY, "Int12h\n"));
|
|
||||||
DbgPrint((DPRINT_MEMORY, "AX = 0x%x\n\n", Regs.w.ax));
|
|
||||||
|
|
||||||
return (U32)Regs.w.ax;
|
|
||||||
}
|
|
||||||
|
|
||||||
U32 GetBiosMemoryMap(PBIOS_MEMORY_MAP BiosMemoryMap, U32 MaxMemoryMapSize)
|
|
||||||
{
|
|
||||||
REGS Regs;
|
|
||||||
U32 MapCount;
|
|
||||||
|
|
||||||
DbgPrint((DPRINT_MEMORY, "GetBiosMemoryMap()\n"));
|
|
||||||
|
|
||||||
// Int 15h AX=E820h
|
|
||||||
// Newer BIOSes - GET SYSTEM MEMORY MAP
|
|
||||||
//
|
|
||||||
// AX = E820h
|
|
||||||
// EAX = 0000E820h
|
|
||||||
// EDX = 534D4150h ('SMAP')
|
|
||||||
// EBX = continuation value or 00000000h to start at beginning of map
|
|
||||||
// ECX = size of buffer for result, in bytes (should be >= 20 bytes)
|
|
||||||
// ES:DI -> buffer for result
|
|
||||||
// Return:
|
|
||||||
// CF clear if successful
|
|
||||||
// EAX = 534D4150h ('SMAP')
|
|
||||||
// ES:DI buffer filled
|
|
||||||
// EBX = next offset from which to copy or 00000000h if all done
|
|
||||||
// ECX = actual length returned in bytes
|
|
||||||
// CF set on error
|
|
||||||
// AH = error code (86h)
|
|
||||||
Regs.x.eax = 0x0000E820;
|
|
||||||
Regs.x.edx = 0x534D4150; // ('SMAP')
|
|
||||||
Regs.x.ebx = 0x00000000;
|
|
||||||
Regs.x.ecx = sizeof(BIOS_MEMORY_MAP);
|
|
||||||
Regs.w.es = BIOSCALLBUFSEGMENT;
|
|
||||||
Regs.w.di = BIOSCALLBUFOFFSET;
|
|
||||||
for (MapCount=0; MapCount<MaxMemoryMapSize; MapCount++)
|
|
||||||
{
|
|
||||||
Int386(0x15, &Regs, &Regs);
|
|
||||||
|
|
||||||
DbgPrint((DPRINT_MEMORY, "Memory Map Entry %d\n", MapCount));
|
|
||||||
DbgPrint((DPRINT_MEMORY, "Int15h AX=E820h\n"));
|
|
||||||
DbgPrint((DPRINT_MEMORY, "EAX = 0x%x\n", Regs.x.eax));
|
|
||||||
DbgPrint((DPRINT_MEMORY, "EBX = 0x%x\n", Regs.x.ebx));
|
|
||||||
DbgPrint((DPRINT_MEMORY, "ECX = 0x%x\n", Regs.x.ecx));
|
|
||||||
DbgPrint((DPRINT_MEMORY, "CF set = %s\n", (Regs.x.eflags & I386FLAG_CF) ? "TRUE" : "FALSE"));
|
|
||||||
|
|
||||||
// If the BIOS didn't return 'SMAP' in EAX then
|
|
||||||
// it doesn't support this call
|
|
||||||
if (Regs.x.eax != 0x534D4150)
|
|
||||||
{
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Copy data to caller's buffer
|
|
||||||
RtlCopyMemory(&BiosMemoryMap[MapCount], (PVOID)BIOSCALLBUFFER, Regs.x.ecx);
|
|
||||||
|
|
||||||
DbgPrint((DPRINT_MEMORY, "BaseAddress: 0x%x%x\n", BiosMemoryMap[MapCount].BaseAddress));
|
|
||||||
DbgPrint((DPRINT_MEMORY, "Length: 0x%x%x\n", BiosMemoryMap[MapCount].Length));
|
|
||||||
DbgPrint((DPRINT_MEMORY, "Type: 0x%x\n", BiosMemoryMap[MapCount].Type));
|
|
||||||
DbgPrint((DPRINT_MEMORY, "Reserved: 0x%x\n", BiosMemoryMap[MapCount].Reserved));
|
|
||||||
DbgPrint((DPRINT_MEMORY, "\n"));
|
|
||||||
|
|
||||||
// If the continuation value is zero or the
|
|
||||||
// carry flag is set then this was
|
|
||||||
// the last entry so we're done
|
|
||||||
if (Regs.x.ebx == 0x00000000 || !INT386_SUCCESS(Regs))
|
|
||||||
{
|
|
||||||
MapCount++;
|
|
||||||
DbgPrint((DPRINT_MEMORY, "End Of System Memory Map!\n\n"));
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Setup the registers for the next call
|
|
||||||
Regs.x.eax = 0x0000E820;
|
|
||||||
Regs.x.edx = 0x534D4150; // ('SMAP')
|
|
||||||
//Regs.x.ebx = 0x00000001; // Continuation value already set by the BIOS
|
|
||||||
Regs.x.ecx = sizeof(BIOS_MEMORY_MAP);
|
|
||||||
Regs.w.es = BIOSCALLBUFSEGMENT;
|
|
||||||
Regs.w.di = BIOSCALLBUFOFFSET;
|
|
||||||
}
|
|
||||||
|
|
||||||
return MapCount;
|
|
||||||
}
|
|
|
@ -22,45 +22,6 @@
|
||||||
#include <rtl.h>
|
#include <rtl.h>
|
||||||
#include <portio.h>
|
#include <portio.h>
|
||||||
|
|
||||||
void putchar(int ch)
|
|
||||||
{
|
|
||||||
REGS Regs;
|
|
||||||
|
|
||||||
/* If we are displaying a CR '\n' then do a LF also */
|
|
||||||
if (ch == '\n')
|
|
||||||
{
|
|
||||||
/* Display the LF */
|
|
||||||
putchar('\r');
|
|
||||||
}
|
|
||||||
|
|
||||||
/* If we are displaying a TAB '\t' then display 8 spaces ' ' */
|
|
||||||
if (ch == '\t')
|
|
||||||
{
|
|
||||||
/* Display the 8 spaces ' ' */
|
|
||||||
putchar(' ');
|
|
||||||
putchar(' ');
|
|
||||||
putchar(' ');
|
|
||||||
putchar(' ');
|
|
||||||
putchar(' ');
|
|
||||||
putchar(' ');
|
|
||||||
putchar(' ');
|
|
||||||
putchar(' ');
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Int 10h AH=0Eh
|
|
||||||
// VIDEO - TELETYPE OUTPUT
|
|
||||||
//
|
|
||||||
// AH = 0Eh
|
|
||||||
// AL = character to write
|
|
||||||
// BH = page number
|
|
||||||
// BL = foreground color (graphics modes only)
|
|
||||||
Regs.b.ah = 0x0E;
|
|
||||||
Regs.b.al = ch;
|
|
||||||
Regs.w.bx = 1;
|
|
||||||
Int386(0x10, &Regs, &Regs);
|
|
||||||
}
|
|
||||||
|
|
||||||
int kbhit(void)
|
int kbhit(void)
|
||||||
{
|
{
|
||||||
REGS Regs;
|
REGS Regs;
|
||||||
|
|
|
@ -24,7 +24,7 @@
|
||||||
#include <arch.h>
|
#include <arch.h>
|
||||||
#include <version.h>
|
#include <version.h>
|
||||||
|
|
||||||
|
#define SCREEN_ATTR 0x1f /* Bright white on blue background */
|
||||||
|
|
||||||
.macro SAVE_CPU_REGS
|
.macro SAVE_CPU_REGS
|
||||||
movl %eax,i386_EAX
|
movl %eax,i386_EAX
|
||||||
|
@ -272,7 +272,9 @@ i386CommonExceptionHandler:
|
||||||
|
|
||||||
SAVE_CPU_REGS
|
SAVE_CPU_REGS
|
||||||
|
|
||||||
call i386ClearScreenToBlue
|
pushl $SCREEN_ATTR
|
||||||
|
call _MachClearScreenAttr
|
||||||
|
add $4,%esp
|
||||||
|
|
||||||
movl $i386ExceptionHandlerText,%esi
|
movl $i386ExceptionHandlerText,%esi
|
||||||
call i386PrintText
|
call i386PrintText
|
||||||
|
@ -438,12 +440,14 @@ i386CommonExceptionHandler:
|
||||||
movl $0,i386_ScreenPosX
|
movl $0,i386_ScreenPosX
|
||||||
incl i386_ScreenPosY
|
incl i386_ScreenPosY
|
||||||
incl i386_ScreenPosY
|
incl i386_ScreenPosY
|
||||||
call i386PrintFrames // Display frames
|
call i386PrintFrames // Display frames
|
||||||
incl i386_ScreenPosY
|
incl i386_ScreenPosY
|
||||||
incl i386_ScreenPosY
|
incl i386_ScreenPosY
|
||||||
|
|
||||||
|
cli
|
||||||
i386ExceptionHandlerHang:
|
i386ExceptionHandlerHang:
|
||||||
jmp i386ExceptionHandlerHang
|
hlt
|
||||||
|
jmp i386ExceptionHandlerHang
|
||||||
|
|
||||||
iret
|
iret
|
||||||
|
|
||||||
|
@ -454,31 +458,35 @@ i386PrintFrames:
|
||||||
|
|
||||||
movl i386_EBP,%edi
|
movl i386_EBP,%edi
|
||||||
printnextframe:
|
printnextframe:
|
||||||
test %edi,%edi
|
test %edi,%edi
|
||||||
je nomoreframes
|
je nomoreframes
|
||||||
movl $STACK32ADDR,%eax
|
movl $STACK32ADDR,%eax
|
||||||
cmpl %edi,%eax
|
cmpl %edi,%eax
|
||||||
jbe nomoreframes
|
jbe nomoreframes
|
||||||
movl 4(%edi),%eax
|
movl 4(%edi),%eax
|
||||||
pushl %edi
|
pushl %edi
|
||||||
call i386PrintHexDword // Display frame
|
call i386PrintHexDword // Display frame
|
||||||
popl %edi
|
popl %edi
|
||||||
incl i386_ScreenPosX
|
incl i386_ScreenPosX
|
||||||
incl i386_ScreenPosX
|
incl i386_ScreenPosX
|
||||||
movl 0(%edi),%edi
|
movl 0(%edi),%edi
|
||||||
jmp printnextframe
|
jmp printnextframe
|
||||||
nomoreframes:
|
nomoreframes:
|
||||||
ret
|
ret
|
||||||
|
|
||||||
/************************************************************************/
|
/************************************************************************/
|
||||||
i386ClearScreenToBlue:
|
/* AL = Char to display */
|
||||||
|
/************************************************************************/
|
||||||
|
i386PrintChar:
|
||||||
.code32
|
.code32
|
||||||
|
|
||||||
cld
|
pushl i386_ScreenPosY
|
||||||
movw $0x1F20,%ax
|
pushl i386_ScreenPosX
|
||||||
movl $0xB0000,%edi
|
pushl $SCREEN_ATTR
|
||||||
movl $0x8000,%ecx
|
andl $0xff,%eax
|
||||||
rep stosw
|
pushl %eax
|
||||||
|
call _MachPutCharAttrAtLoc
|
||||||
|
addl $16,%esp
|
||||||
|
|
||||||
ret
|
ret
|
||||||
|
|
||||||
|
@ -492,48 +500,26 @@ i386PrintTextLoop:
|
||||||
lodsb
|
lodsb
|
||||||
|
|
||||||
// Check for end of string char
|
// Check for end of string char
|
||||||
cmp $0,%al
|
cmp $0,%al
|
||||||
je i386PrintTextDone
|
je i386PrintTextDone
|
||||||
|
|
||||||
// Check for newline char
|
// Check for newline char
|
||||||
cmp $0x0a,%al
|
cmp $0x0a,%al
|
||||||
jne i386PrintTextLoop2
|
jne i386PrintTextLoop2
|
||||||
incl i386_ScreenPosY
|
incl i386_ScreenPosY
|
||||||
movl $0,i386_ScreenPosX
|
movl $0,i386_ScreenPosX
|
||||||
jmp i386PrintTextLoop
|
jmp i386PrintTextLoop
|
||||||
|
|
||||||
i386PrintTextLoop2:
|
i386PrintTextLoop2:
|
||||||
call i386PrintTextCalcAddressOfNextChar
|
call i386PrintChar
|
||||||
|
|
||||||
stosb
|
|
||||||
incl i386_ScreenPosX
|
incl i386_ScreenPosX
|
||||||
|
|
||||||
jmp i386PrintTextLoop
|
jmp i386PrintTextLoop
|
||||||
|
|
||||||
i386PrintTextDone:
|
i386PrintTextDone:
|
||||||
|
|
||||||
ret
|
ret
|
||||||
|
|
||||||
/************************************************************************/
|
|
||||||
/* On return EDI = Address of next char in screen memory */
|
|
||||||
/************************************************************************/
|
|
||||||
i386PrintTextCalcAddressOfNextChar:
|
|
||||||
.code32
|
|
||||||
|
|
||||||
push %eax
|
|
||||||
|
|
||||||
movl $0xB8000,%edi
|
|
||||||
addl i386_ScreenPosX,%edi
|
|
||||||
addl i386_ScreenPosX,%edi
|
|
||||||
movl i386_ScreenPosY,%eax
|
|
||||||
movl $160,%ecx // 80 columns, 2 bytes per column
|
|
||||||
mull %ecx
|
|
||||||
addl %eax,%edi
|
|
||||||
|
|
||||||
pop %eax
|
|
||||||
|
|
||||||
ret
|
|
||||||
|
|
||||||
/************************************************************************/
|
/************************************************************************/
|
||||||
/* Prints the value in EAX on the screen in hex */
|
/* Prints the value in EAX on the screen in hex */
|
||||||
/************************************************************************/
|
/************************************************************************/
|
||||||
|
@ -553,8 +539,7 @@ i386PrintHex3:
|
||||||
andb $0x0f,%al
|
andb $0x0f,%al
|
||||||
movl $i386PrintHexTable,%ebx
|
movl $i386PrintHexTable,%ebx
|
||||||
xlat /*$i386PrintHexTable*/
|
xlat /*$i386PrintHexTable*/
|
||||||
call i386PrintTextCalcAddressOfNextChar
|
call i386PrintChar
|
||||||
stosb
|
|
||||||
incl i386_ScreenPosX
|
incl i386_ScreenPosX
|
||||||
pop %eax
|
pop %eax
|
||||||
|
|
||||||
|
@ -579,10 +564,9 @@ i386PrintHexWord2:
|
||||||
andb $0x0f,%al
|
andb $0x0f,%al
|
||||||
movl $i386PrintHexTable,%ebx
|
movl $i386PrintHexTable,%ebx
|
||||||
xlat /*$i386PrintHexTable*/
|
xlat /*$i386PrintHexTable*/
|
||||||
call i386PrintTextCalcAddressOfNextChar
|
call i386PrintChar
|
||||||
stosb
|
|
||||||
incl i386_ScreenPosX
|
incl i386_ScreenPosX
|
||||||
pop %eax
|
pop %eax
|
||||||
|
|
||||||
ret
|
ret
|
||||||
|
|
||||||
|
@ -600,8 +584,7 @@ i386PrintHexByte1:
|
||||||
andb $0x0f,%al
|
andb $0x0f,%al
|
||||||
movl $i386PrintHexTable,%ebx
|
movl $i386PrintHexTable,%ebx
|
||||||
xlat /*$i386PrintHexTable*/
|
xlat /*$i386PrintHexTable*/
|
||||||
call i386PrintTextCalcAddressOfNextChar
|
call i386PrintChar
|
||||||
stosb
|
|
||||||
incl i386_ScreenPosX
|
incl i386_ScreenPosX
|
||||||
pop %eax
|
pop %eax
|
||||||
|
|
||||||
|
|
39
freeldr/freeldr/arch/i386/machpc.c
Normal file
39
freeldr/freeldr/arch/i386/machpc.c
Normal file
|
@ -0,0 +1,39 @@
|
||||||
|
/* $Id: machpc.c,v 1.1 2004/11/08 22:02:47 gvg Exp $
|
||||||
|
*
|
||||||
|
* FreeLoader
|
||||||
|
*
|
||||||
|
* This program is free software; you can redistribute it and/or modify
|
||||||
|
* it under the terms of the GNU General Public License as published by
|
||||||
|
* the Free Software Foundation; either version 2 of the License, or
|
||||||
|
* (at your option) any later version.
|
||||||
|
*
|
||||||
|
* This program is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
* GNU General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU General Public License
|
||||||
|
* along with this program; if not, write to the Free Software
|
||||||
|
* Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include "freeldr.h"
|
||||||
|
#include "mm.h"
|
||||||
|
#include "arch.h"
|
||||||
|
#include "machine.h"
|
||||||
|
#include "machpc.h"
|
||||||
|
#include "rtl.h"
|
||||||
|
|
||||||
|
VOID
|
||||||
|
PcMachInit(VOID)
|
||||||
|
{
|
||||||
|
EnableA20();
|
||||||
|
|
||||||
|
/* Setup vtbl */
|
||||||
|
MachVtbl.ClearScreenAttr = PcConsClearScreenAttr;
|
||||||
|
MachVtbl.PutChar = PcConsPutChar;
|
||||||
|
MachVtbl.PutCharAttrAtLoc = PcConsPutCharAttrAtLoc;
|
||||||
|
MachVtbl.GetMemoryMap = PcMemGetMemoryMap;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* EOF */
|
39
freeldr/freeldr/arch/i386/machpc.h
Normal file
39
freeldr/freeldr/arch/i386/machpc.h
Normal file
|
@ -0,0 +1,39 @@
|
||||||
|
/* $Id: machpc.h,v 1.1 2004/11/08 22:02:47 gvg Exp $
|
||||||
|
*
|
||||||
|
* FreeLoader
|
||||||
|
*
|
||||||
|
* Copyright (C) 2003 Eric Kohl
|
||||||
|
*
|
||||||
|
* This program is free software; you can redistribute it and/or modify
|
||||||
|
* it under the terms of the GNU General Public License as published by
|
||||||
|
* the Free Software Foundation; either version 2 of the License, or
|
||||||
|
* (at your option) any later version.
|
||||||
|
*
|
||||||
|
* This program is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
* GNU General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU General Public License
|
||||||
|
* along with this program; if not, write to the Free Software
|
||||||
|
* Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef __I386_MACHPC_H_
|
||||||
|
#define __I386_MACHPC_H_
|
||||||
|
|
||||||
|
#ifndef __MEMORY_H
|
||||||
|
#include "mm.h"
|
||||||
|
#endif
|
||||||
|
|
||||||
|
VOID PcMachInit(VOID);
|
||||||
|
|
||||||
|
VOID PcConsClearScreenAttr(U8 Attr);
|
||||||
|
VOID PcConsPutChar(int Ch);
|
||||||
|
VOID PcConsPutCharAttrAtLoc(int Ch, U8 Attr, unsigned X, unsigned Y);
|
||||||
|
|
||||||
|
U32 PcMemGetMemoryMap(PBIOS_MEMORY_MAP BiosMemoryMap, U32 MaxMemoryMapSize);
|
||||||
|
|
||||||
|
#endif /* __I386_MACHPC_H_ */
|
||||||
|
|
||||||
|
/* EOF */
|
37
freeldr/freeldr/arch/i386/machxbox.c
Normal file
37
freeldr/freeldr/arch/i386/machxbox.c
Normal file
|
@ -0,0 +1,37 @@
|
||||||
|
/* $Id: machxbox.c,v 1.1 2004/11/08 22:02:47 gvg Exp $
|
||||||
|
*
|
||||||
|
* FreeLoader
|
||||||
|
*
|
||||||
|
* This program is free software; you can redistribute it and/or modify
|
||||||
|
* it under the terms of the GNU General Public License as published by
|
||||||
|
* the Free Software Foundation; either version 2 of the License, or
|
||||||
|
* (at your option) any later version.
|
||||||
|
*
|
||||||
|
* This program is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
* GNU General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU General Public License
|
||||||
|
* along with this program; if not, write to the Free Software
|
||||||
|
* Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include "freeldr.h"
|
||||||
|
#include "mm.h"
|
||||||
|
#include "machine.h"
|
||||||
|
#include "machxbox.h"
|
||||||
|
|
||||||
|
VOID
|
||||||
|
XboxMachInit(VOID)
|
||||||
|
{
|
||||||
|
/* Initialize our stuff */
|
||||||
|
XboxMemInit();
|
||||||
|
XboxVideoInit();
|
||||||
|
|
||||||
|
/* Setup vtbl */
|
||||||
|
MachVtbl.ClearScreenAttr = XboxVideoClearScreenAttr;
|
||||||
|
MachVtbl.PutChar = XboxVideoPutChar;
|
||||||
|
MachVtbl.PutCharAttrAtLoc = XboxVideoPutCharAttrAtLoc;
|
||||||
|
MachVtbl.GetMemoryMap = XboxMemGetMemoryMap;
|
||||||
|
}
|
42
freeldr/freeldr/arch/i386/machxbox.h
Normal file
42
freeldr/freeldr/arch/i386/machxbox.h
Normal file
|
@ -0,0 +1,42 @@
|
||||||
|
/* $Id: machxbox.h,v 1.1 2004/11/08 22:02:47 gvg Exp $
|
||||||
|
*
|
||||||
|
* FreeLoader
|
||||||
|
*
|
||||||
|
* This program is free software; you can redistribute it and/or modify
|
||||||
|
* it under the terms of the GNU General Public License as published by
|
||||||
|
* the Free Software Foundation; either version 2 of the License, or
|
||||||
|
* (at your option) any later version.
|
||||||
|
*
|
||||||
|
* This program is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
* GNU General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU General Public License
|
||||||
|
* along with this program; if not, write to the Free Software
|
||||||
|
* Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef __I386_MACHXBOX_H_
|
||||||
|
#define __I386_MACHXBOX_H_
|
||||||
|
|
||||||
|
#ifndef __MEMORY_H
|
||||||
|
#include "mm.h"
|
||||||
|
#endif
|
||||||
|
|
||||||
|
U8 XboxFont8x16[256 * 16];
|
||||||
|
|
||||||
|
VOID XboxMachInit(VOID);
|
||||||
|
|
||||||
|
VOID XboxVideoInit(VOID);
|
||||||
|
VOID XboxVideoClearScreenAttr(U8 Attr);
|
||||||
|
VOID XboxVideoPutChar(int Ch);
|
||||||
|
VOID XboxVideoPutCharAttrAtLoc(int Ch, U8 Attr, unsigned X, unsigned Y);
|
||||||
|
|
||||||
|
VOID XboxMemInit(VOID);
|
||||||
|
PVOID XboxMemReserveMemory(U32 MbToReserve);
|
||||||
|
U32 XboxMemGetMemoryMap(PBIOS_MEMORY_MAP BiosMemoryMap, U32 MaxMemoryMapSize);
|
||||||
|
|
||||||
|
#endif /* __I386_HWXBOX_H_ */
|
||||||
|
|
||||||
|
/* EOF */
|
98
freeldr/freeldr/arch/i386/pccons.c
Normal file
98
freeldr/freeldr/arch/i386/pccons.c
Normal file
|
@ -0,0 +1,98 @@
|
||||||
|
/* $Id: pccons.c,v 1.1 2004/11/08 22:02:47 gvg Exp $
|
||||||
|
*
|
||||||
|
* FreeLoader
|
||||||
|
*
|
||||||
|
* This program is free software; you can redistribute it and/or modify
|
||||||
|
* it under the terms of the GNU General Public License as published by
|
||||||
|
* the Free Software Foundation; either version 2 of the License, or
|
||||||
|
* (at your option) any later version.
|
||||||
|
*
|
||||||
|
* This program is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
* GNU General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU General Public License
|
||||||
|
* along with this program; if not, write to the Free Software
|
||||||
|
* Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include "freeldr.h"
|
||||||
|
#include "mm.h"
|
||||||
|
#include "arch.h"
|
||||||
|
#include "debug.h"
|
||||||
|
#include "machpc.h"
|
||||||
|
#include "rtl.h"
|
||||||
|
|
||||||
|
#define TEXTMODE_BUFFER 0xb8000
|
||||||
|
#define TEXTMODE_BUFFER_SIZE 0x8000
|
||||||
|
|
||||||
|
#define TEXT_COLS 80
|
||||||
|
#define TEXT_LINES 25
|
||||||
|
|
||||||
|
VOID
|
||||||
|
PcConsClearScreenAttr(U8 Attr)
|
||||||
|
{
|
||||||
|
U16 AttrChar;
|
||||||
|
U16 *BufPtr;
|
||||||
|
|
||||||
|
AttrChar = ((U16) Attr << 8) | ' ';
|
||||||
|
for (BufPtr = (U16 *) TEXTMODE_BUFFER;
|
||||||
|
BufPtr < (U16 *) (TEXTMODE_BUFFER + TEXTMODE_BUFFER_SIZE);
|
||||||
|
BufPtr++)
|
||||||
|
{
|
||||||
|
*BufPtr = AttrChar;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
VOID
|
||||||
|
PcConsPutChar(int Ch)
|
||||||
|
{
|
||||||
|
REGS Regs;
|
||||||
|
|
||||||
|
/* If we are displaying a CR '\n' then do a LF also */
|
||||||
|
if ('\n' == Ch)
|
||||||
|
{
|
||||||
|
/* Display the LF */
|
||||||
|
PcConsPutChar('\r');
|
||||||
|
}
|
||||||
|
|
||||||
|
/* If we are displaying a TAB '\t' then display 8 spaces ' ' */
|
||||||
|
if ('\t' == Ch)
|
||||||
|
{
|
||||||
|
/* Display the 8 spaces ' ' */
|
||||||
|
PcConsPutChar(' ');
|
||||||
|
PcConsPutChar(' ');
|
||||||
|
PcConsPutChar(' ');
|
||||||
|
PcConsPutChar(' ');
|
||||||
|
PcConsPutChar(' ');
|
||||||
|
PcConsPutChar(' ');
|
||||||
|
PcConsPutChar(' ');
|
||||||
|
PcConsPutChar(' ');
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Int 10h AH=0Eh
|
||||||
|
* VIDEO - TELETYPE OUTPUT
|
||||||
|
*
|
||||||
|
* AH = 0Eh
|
||||||
|
* AL = character to write
|
||||||
|
* BH = page number
|
||||||
|
* BL = foreground color (graphics modes only)
|
||||||
|
*/
|
||||||
|
Regs.b.ah = 0x0E;
|
||||||
|
Regs.b.al = Ch;
|
||||||
|
Regs.w.bx = 1;
|
||||||
|
Int386(0x10, &Regs, &Regs);
|
||||||
|
}
|
||||||
|
|
||||||
|
VOID
|
||||||
|
PcConsPutCharAttrAtLoc(int Ch, U8 Attr, unsigned X, unsigned Y)
|
||||||
|
{
|
||||||
|
U16 *BufPtr;
|
||||||
|
|
||||||
|
BufPtr = (U16 *) (TEXTMODE_BUFFER + (Y * TEXT_COLS + X) * 2);
|
||||||
|
*BufPtr = ((U16) Attr << 8) | (Ch & 0xff);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* EOF */
|
252
freeldr/freeldr/arch/i386/pcmem.c
Normal file
252
freeldr/freeldr/arch/i386/pcmem.c
Normal file
|
@ -0,0 +1,252 @@
|
||||||
|
/* $Id: pcmem.c,v 1.1 2004/11/08 22:02:47 gvg Exp $
|
||||||
|
*
|
||||||
|
* FreeLoader
|
||||||
|
*
|
||||||
|
* This program is free software; you can redistribute it and/or modify
|
||||||
|
* it under the terms of the GNU General Public License as published by
|
||||||
|
* the Free Software Foundation; either version 2 of the License, or
|
||||||
|
* (at your option) any later version.
|
||||||
|
*
|
||||||
|
* This program is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
* GNU General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU General Public License
|
||||||
|
* along with this program; if not, write to the Free Software
|
||||||
|
* Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
|
||||||
|
*
|
||||||
|
* Note: Most of this code comes from the old file "i386mem.c", which
|
||||||
|
* was Copyright (C) 1998-2003 Brian Palmer <brianp@sginet.com>
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include "freeldr.h"
|
||||||
|
#include "arch.h"
|
||||||
|
#include "debug.h"
|
||||||
|
#include "mm.h"
|
||||||
|
#include "machpc.h"
|
||||||
|
#include "portio.h"
|
||||||
|
#include "rtl.h"
|
||||||
|
|
||||||
|
static U32
|
||||||
|
PcMemGetExtendedMemorySize(VOID)
|
||||||
|
{
|
||||||
|
REGS RegsIn;
|
||||||
|
REGS RegsOut;
|
||||||
|
U32 MemorySize;
|
||||||
|
|
||||||
|
DbgPrint((DPRINT_MEMORY, "GetExtendedMemorySize()\n"));
|
||||||
|
|
||||||
|
/* Int 15h AX=E801h
|
||||||
|
* Phoenix BIOS v4.0 - GET MEMORY SIZE FOR >64M CONFIGURATIONS
|
||||||
|
*
|
||||||
|
* AX = E801h
|
||||||
|
* Return:
|
||||||
|
* CF clear if successful
|
||||||
|
* AX = extended memory between 1M and 16M, in K (max 3C00h = 15MB)
|
||||||
|
* BX = extended memory above 16M, in 64K blocks
|
||||||
|
* CX = configured memory 1M to 16M, in K
|
||||||
|
* DX = configured memory above 16M, in 64K blocks
|
||||||
|
* CF set on error
|
||||||
|
*/
|
||||||
|
RegsIn.w.ax = 0xE801;
|
||||||
|
Int386(0x15, &RegsIn, &RegsOut);
|
||||||
|
|
||||||
|
DbgPrint((DPRINT_MEMORY, "Int15h AX=E801h\n"));
|
||||||
|
DbgPrint((DPRINT_MEMORY, "AX = 0x%x\n", RegsOut.w.ax));
|
||||||
|
DbgPrint((DPRINT_MEMORY, "BX = 0x%x\n", RegsOut.w.bx));
|
||||||
|
DbgPrint((DPRINT_MEMORY, "CX = 0x%x\n", RegsOut.w.cx));
|
||||||
|
DbgPrint((DPRINT_MEMORY, "DX = 0x%x\n", RegsOut.w.dx));
|
||||||
|
DbgPrint((DPRINT_MEMORY, "CF set = %s\n\n", (RegsOut.x.eflags & I386FLAG_CF) ? "TRUE" : "FALSE"));
|
||||||
|
|
||||||
|
if (INT386_SUCCESS(RegsOut))
|
||||||
|
{
|
||||||
|
/* If AX=BX=0000h the use CX and DX */
|
||||||
|
if (RegsOut.w.ax == 0)
|
||||||
|
{
|
||||||
|
/* Return extended memory size in K */
|
||||||
|
MemorySize = RegsOut.w.dx * 64;
|
||||||
|
MemorySize += RegsOut.w.cx;
|
||||||
|
return MemorySize;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
/* Return extended memory size in K */
|
||||||
|
MemorySize = RegsOut.w.bx * 64;
|
||||||
|
MemorySize += RegsOut.w.ax;
|
||||||
|
return MemorySize;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/* If we get here then Int15 Func E801h didn't work */
|
||||||
|
/* So try Int15 Func 88h */
|
||||||
|
|
||||||
|
/* Int 15h AH=88h
|
||||||
|
* SYSTEM - GET EXTENDED MEMORY SIZE (286+)
|
||||||
|
*
|
||||||
|
* AH = 88h
|
||||||
|
* Return:
|
||||||
|
* CF clear if successful
|
||||||
|
* AX = number of contiguous KB starting at absolute address 100000h
|
||||||
|
* CF set on error
|
||||||
|
* AH = status
|
||||||
|
* 80h invalid command (PC,PCjr)
|
||||||
|
* 86h unsupported function (XT,PS30)
|
||||||
|
*/
|
||||||
|
RegsIn.b.ah = 0x88;
|
||||||
|
Int386(0x15, &RegsIn, &RegsOut);
|
||||||
|
|
||||||
|
DbgPrint((DPRINT_MEMORY, "Int15h AH=88h\n"));
|
||||||
|
DbgPrint((DPRINT_MEMORY, "AX = 0x%x\n", RegsOut.w.ax));
|
||||||
|
DbgPrint((DPRINT_MEMORY, "CF set = %s\n\n", (RegsOut.x.eflags & I386FLAG_CF) ? "TRUE" : "FALSE"));
|
||||||
|
|
||||||
|
if (INT386_SUCCESS(RegsOut) && RegsOut.w.ax != 0)
|
||||||
|
{
|
||||||
|
MemorySize = RegsOut.w.ax;
|
||||||
|
return MemorySize;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* If we get here then Int15 Func 88h didn't work */
|
||||||
|
/* So try reading the CMOS */
|
||||||
|
WRITE_PORT_UCHAR((PUCHAR)0x70, 0x31);
|
||||||
|
MemorySize = READ_PORT_UCHAR((PUCHAR)0x71);
|
||||||
|
MemorySize = (MemorySize & 0xFFFF);
|
||||||
|
MemorySize = (MemorySize << 8);
|
||||||
|
|
||||||
|
DbgPrint((DPRINT_MEMORY, "Int15h Failed\n"));
|
||||||
|
DbgPrint((DPRINT_MEMORY, "CMOS reports: 0x%x\n", MemorySize));
|
||||||
|
|
||||||
|
return MemorySize;
|
||||||
|
}
|
||||||
|
|
||||||
|
static U32
|
||||||
|
PcMemGetConventionalMemorySize(VOID)
|
||||||
|
{
|
||||||
|
REGS Regs;
|
||||||
|
|
||||||
|
DbgPrint((DPRINT_MEMORY, "GetConventionalMemorySize()\n"));
|
||||||
|
|
||||||
|
/* Int 12h
|
||||||
|
* BIOS - GET MEMORY SIZE
|
||||||
|
*
|
||||||
|
* Return:
|
||||||
|
* AX = kilobytes of contiguous memory starting at absolute address 00000h
|
||||||
|
*
|
||||||
|
* This call returns the contents of the word at 0040h:0013h;
|
||||||
|
* in PC and XT, this value is set from the switches on the motherboard
|
||||||
|
*/
|
||||||
|
Regs.w.ax = 0;
|
||||||
|
Int386(0x12, &Regs, &Regs);
|
||||||
|
|
||||||
|
DbgPrint((DPRINT_MEMORY, "Int12h\n"));
|
||||||
|
DbgPrint((DPRINT_MEMORY, "AX = 0x%x\n\n", Regs.w.ax));
|
||||||
|
|
||||||
|
return (U32)Regs.w.ax;
|
||||||
|
}
|
||||||
|
|
||||||
|
static U32
|
||||||
|
PcMemGetBiosMemoryMap(PBIOS_MEMORY_MAP BiosMemoryMap, U32 MaxMemoryMapSize)
|
||||||
|
{
|
||||||
|
REGS Regs;
|
||||||
|
U32 MapCount;
|
||||||
|
|
||||||
|
DbgPrint((DPRINT_MEMORY, "GetBiosMemoryMap()\n"));
|
||||||
|
|
||||||
|
/* Int 15h AX=E820h
|
||||||
|
* Newer BIOSes - GET SYSTEM MEMORY MAP
|
||||||
|
*
|
||||||
|
* AX = E820h
|
||||||
|
* EAX = 0000E820h
|
||||||
|
* EDX = 534D4150h ('SMAP')
|
||||||
|
* EBX = continuation value or 00000000h to start at beginning of map
|
||||||
|
* ECX = size of buffer for result, in bytes (should be >= 20 bytes)
|
||||||
|
* ES:DI -> buffer for result
|
||||||
|
* Return:
|
||||||
|
* CF clear if successful
|
||||||
|
* EAX = 534D4150h ('SMAP')
|
||||||
|
* ES:DI buffer filled
|
||||||
|
* EBX = next offset from which to copy or 00000000h if all done
|
||||||
|
* ECX = actual length returned in bytes
|
||||||
|
* CF set on error
|
||||||
|
* AH = error code (86h)
|
||||||
|
*/
|
||||||
|
Regs.x.eax = 0x0000E820;
|
||||||
|
Regs.x.edx = 0x534D4150; /* ('SMAP') */
|
||||||
|
Regs.x.ebx = 0x00000000;
|
||||||
|
Regs.x.ecx = sizeof(BIOS_MEMORY_MAP);
|
||||||
|
Regs.w.es = BIOSCALLBUFSEGMENT;
|
||||||
|
Regs.w.di = BIOSCALLBUFOFFSET;
|
||||||
|
for (MapCount = 0; MapCount < MaxMemoryMapSize; MapCount++)
|
||||||
|
{
|
||||||
|
Int386(0x15, &Regs, &Regs);
|
||||||
|
|
||||||
|
DbgPrint((DPRINT_MEMORY, "Memory Map Entry %d\n", MapCount));
|
||||||
|
DbgPrint((DPRINT_MEMORY, "Int15h AX=E820h\n"));
|
||||||
|
DbgPrint((DPRINT_MEMORY, "EAX = 0x%x\n", Regs.x.eax));
|
||||||
|
DbgPrint((DPRINT_MEMORY, "EBX = 0x%x\n", Regs.x.ebx));
|
||||||
|
DbgPrint((DPRINT_MEMORY, "ECX = 0x%x\n", Regs.x.ecx));
|
||||||
|
DbgPrint((DPRINT_MEMORY, "CF set = %s\n", (Regs.x.eflags & I386FLAG_CF) ? "TRUE" : "FALSE"));
|
||||||
|
|
||||||
|
/* If the BIOS didn't return 'SMAP' in EAX then
|
||||||
|
* it doesn't support this call */
|
||||||
|
if (Regs.x.eax != 0x534D4150)
|
||||||
|
{
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Copy data to caller's buffer */
|
||||||
|
RtlCopyMemory(&BiosMemoryMap[MapCount], (PVOID)BIOSCALLBUFFER, Regs.x.ecx);
|
||||||
|
|
||||||
|
DbgPrint((DPRINT_MEMORY, "BaseAddress: 0x%x%x\n", BiosMemoryMap[MapCount].BaseAddress));
|
||||||
|
DbgPrint((DPRINT_MEMORY, "Length: 0x%x%x\n", BiosMemoryMap[MapCount].Length));
|
||||||
|
DbgPrint((DPRINT_MEMORY, "Type: 0x%x\n", BiosMemoryMap[MapCount].Type));
|
||||||
|
DbgPrint((DPRINT_MEMORY, "Reserved: 0x%x\n", BiosMemoryMap[MapCount].Reserved));
|
||||||
|
DbgPrint((DPRINT_MEMORY, "\n"));
|
||||||
|
|
||||||
|
/* If the continuation value is zero or the
|
||||||
|
* carry flag is set then this was
|
||||||
|
* the last entry so we're done */
|
||||||
|
if (Regs.x.ebx == 0x00000000 || !INT386_SUCCESS(Regs))
|
||||||
|
{
|
||||||
|
MapCount++;
|
||||||
|
DbgPrint((DPRINT_MEMORY, "End Of System Memory Map!\n\n"));
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Setup the registers for the next call */
|
||||||
|
Regs.x.eax = 0x0000E820;
|
||||||
|
Regs.x.edx = 0x534D4150; /* ('SMAP') */
|
||||||
|
/* Regs.x.ebx = 0x00000001; Continuation value already set by the BIOS */
|
||||||
|
Regs.x.ecx = sizeof(BIOS_MEMORY_MAP);
|
||||||
|
Regs.w.es = BIOSCALLBUFSEGMENT;
|
||||||
|
Regs.w.di = BIOSCALLBUFOFFSET;
|
||||||
|
}
|
||||||
|
|
||||||
|
return MapCount;
|
||||||
|
}
|
||||||
|
|
||||||
|
U32
|
||||||
|
PcMemGetMemoryMap(PBIOS_MEMORY_MAP BiosMemoryMap, U32 MaxMemoryMapSize)
|
||||||
|
{
|
||||||
|
U32 EntryCount;
|
||||||
|
|
||||||
|
EntryCount = PcMemGetBiosMemoryMap(BiosMemoryMap, MaxMemoryMapSize);
|
||||||
|
|
||||||
|
/* If the BIOS didn't provide a memory map, synthesize one */
|
||||||
|
if (0 == EntryCount && 2 <= MaxMemoryMapSize)
|
||||||
|
{
|
||||||
|
/* Conventional memory */
|
||||||
|
BiosMemoryMap[0].BaseAddress = 0;
|
||||||
|
BiosMemoryMap[0].Length = PcMemGetConventionalMemorySize() * 1024;
|
||||||
|
BiosMemoryMap[0].Type = MEMTYPE_USABLE;
|
||||||
|
/* Extended memory */
|
||||||
|
BiosMemoryMap[1].BaseAddress = 1024 * 1024;
|
||||||
|
BiosMemoryMap[1].Length = PcMemGetExtendedMemorySize() * 1024;
|
||||||
|
BiosMemoryMap[1].Type = MEMTYPE_USABLE;
|
||||||
|
EntryCount = 2;
|
||||||
|
}
|
||||||
|
|
||||||
|
return EntryCount;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* EOF */
|
286
freeldr/freeldr/arch/i386/xboxfont.c
Normal file
286
freeldr/freeldr/arch/i386/xboxfont.c
Normal file
|
@ -0,0 +1,286 @@
|
||||||
|
/* $Id: xboxfont.c,v 1.1 2004/11/08 22:02:47 gvg Exp $
|
||||||
|
*
|
||||||
|
* FreeLoader
|
||||||
|
*
|
||||||
|
* This program is free software; you can redistribute it and/or modify
|
||||||
|
* it under the terms of the GNU General Public License as published by
|
||||||
|
* the Free Software Foundation; either version 2 of the License, or
|
||||||
|
* (at your option) any later version.
|
||||||
|
*
|
||||||
|
* This program is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
* GNU General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU General Public License
|
||||||
|
* along with this program; if not, write to the Free Software
|
||||||
|
* Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
|
||||||
|
*
|
||||||
|
* Note: Converted from the XFree vga.bdf font
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include "freeldr.h"
|
||||||
|
#include "machxbox.h"
|
||||||
|
|
||||||
|
U8 XboxFont8x16[256 * 16] =
|
||||||
|
{
|
||||||
|
0x00,0x00,0x00,0x7c,0xc6,0xc6,0xde,0xde,0xde,0xdc,0xc0,0x7c,0x00,0x00,0x00,0x00, /* 0x00 */
|
||||||
|
0x00,0x00,0x7e,0x81,0xa5,0x81,0x81,0xa5,0x99,0x81,0x81,0x7e,0x00,0x00,0x00,0x00, /* 0x01 */
|
||||||
|
0x00,0x00,0x7e,0xff,0xdb,0xff,0xff,0xdb,0xe7,0xff,0xff,0x7e,0x00,0x00,0x00,0x00, /* 0x02 */
|
||||||
|
0x00,0x00,0x00,0x00,0x6c,0xfe,0xfe,0xfe,0xfe,0x7c,0x38,0x10,0x00,0x00,0x00,0x00, /* 0x03 */
|
||||||
|
0x00,0x00,0x00,0x00,0x10,0x38,0x7c,0xfe,0x7c,0x38,0x10,0x00,0x00,0x00,0x00,0x00, /* 0x04 */
|
||||||
|
0x00,0x00,0x00,0x18,0x3c,0x3c,0xe7,0xe7,0xe7,0x18,0x18,0x3c,0x00,0x00,0x00,0x00, /* 0x05 */
|
||||||
|
0x00,0x00,0x00,0x18,0x3c,0x7e,0xff,0xff,0x7e,0x18,0x18,0x3c,0x00,0x00,0x00,0x00, /* 0x06 */
|
||||||
|
0x00,0x00,0x00,0x00,0x00,0x00,0x18,0x3c,0x3c,0x18,0x00,0x00,0x00,0x00,0x00,0x00, /* 0x07 */
|
||||||
|
0xff,0xff,0xff,0xff,0xff,0xff,0xe7,0xc3,0xc3,0xe7,0xff,0xff,0xff,0xff,0xff,0xff, /* 0x08 */
|
||||||
|
0x00,0x00,0x00,0x00,0x00,0x3c,0x66,0x42,0x42,0x66,0x3c,0x00,0x00,0x00,0x00,0x00, /* 0x09 */
|
||||||
|
0xff,0xff,0xff,0xff,0xff,0xc3,0x99,0xbd,0xbd,0x99,0xc3,0xff,0xff,0xff,0xff,0xff, /* 0x0a */
|
||||||
|
0x00,0x00,0x1e,0x06,0x0e,0x1a,0x78,0xcc,0xcc,0xcc,0xcc,0x78,0x00,0x00,0x00,0x00, /* 0x0b */
|
||||||
|
0x00,0x00,0x3c,0x66,0x66,0x66,0x66,0x3c,0x18,0x7e,0x18,0x18,0x00,0x00,0x00,0x00, /* 0x0c */
|
||||||
|
0x00,0x00,0x3f,0x33,0x3f,0x30,0x30,0x30,0x30,0x70,0xf0,0xe0,0x00,0x00,0x00,0x00, /* 0x0d */
|
||||||
|
0x00,0x00,0x7f,0x63,0x7f,0x63,0x63,0x63,0x63,0x67,0xe7,0xe6,0xc0,0x00,0x00,0x00, /* 0x0e */
|
||||||
|
0x00,0x00,0x00,0x18,0x18,0xdb,0x3c,0xe7,0x3c,0xdb,0x18,0x18,0x00,0x00,0x00,0x00, /* 0x0f */
|
||||||
|
0x00,0x80,0xc0,0xe0,0xf0,0xf8,0xfe,0xf8,0xf0,0xe0,0xc0,0x80,0x00,0x00,0x00,0x00, /* 0x10 */
|
||||||
|
0x00,0x02,0x06,0x0e,0x1e,0x3e,0xfe,0x3e,0x1e,0x0e,0x06,0x02,0x00,0x00,0x00,0x00, /* 0x11 */
|
||||||
|
0x00,0x00,0x18,0x3c,0x7e,0x18,0x18,0x18,0x7e,0x3c,0x18,0x00,0x00,0x00,0x00,0x00, /* 0x12 */
|
||||||
|
0x00,0x00,0x66,0x66,0x66,0x66,0x66,0x66,0x66,0x00,0x66,0x66,0x00,0x00,0x00,0x00, /* 0x13 */
|
||||||
|
0x00,0x00,0x7f,0xdb,0xdb,0xdb,0x7b,0x1b,0x1b,0x1b,0x1b,0x1b,0x00,0x00,0x00,0x00, /* 0x14 */
|
||||||
|
0x00,0x7c,0xc6,0x60,0x38,0x6c,0xc6,0xc6,0x6c,0x38,0x0c,0xc6,0x7c,0x00,0x00,0x00, /* 0x15 */
|
||||||
|
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xfe,0xfe,0xfe,0xfe,0x00,0x00,0x00,0x00, /* 0x16 */
|
||||||
|
0x00,0x00,0x18,0x3c,0x7e,0x18,0x18,0x18,0x7e,0x3c,0x18,0x7e,0x00,0x00,0x00,0x00, /* 0x17 */
|
||||||
|
0x00,0x00,0x18,0x3c,0x7e,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x00,0x00,0x00,0x00, /* 0x18 */
|
||||||
|
0x00,0x00,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x7e,0x3c,0x18,0x00,0x00,0x00,0x00, /* 0x19 */
|
||||||
|
0x00,0x00,0x00,0x00,0x00,0x18,0x0c,0xfe,0x0c,0x18,0x00,0x00,0x00,0x00,0x00,0x00, /* 0x1a */
|
||||||
|
0x00,0x00,0x00,0x00,0x00,0x30,0x60,0xfe,0x60,0x30,0x00,0x00,0x00,0x00,0x00,0x00, /* 0x1b */
|
||||||
|
0x00,0x00,0x00,0x00,0x00,0x00,0xc0,0xc0,0xc0,0xfe,0x00,0x00,0x00,0x00,0x00,0x00, /* 0x1c */
|
||||||
|
0x00,0x00,0x00,0x00,0x00,0x28,0x6c,0xfe,0x6c,0x28,0x00,0x00,0x00,0x00,0x00,0x00, /* 0x1d */
|
||||||
|
0x00,0x00,0x00,0x00,0x10,0x38,0x38,0x7c,0x7c,0xfe,0xfe,0x00,0x00,0x00,0x00,0x00, /* 0x1e */
|
||||||
|
0x00,0x00,0x00,0x00,0xfe,0xfe,0x7c,0x7c,0x38,0x38,0x10,0x00,0x00,0x00,0x00,0x00, /* 0x1f */
|
||||||
|
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* */
|
||||||
|
0x00,0x00,0x18,0x3c,0x3c,0x3c,0x18,0x18,0x18,0x00,0x18,0x18,0x00,0x00,0x00,0x00, /* ! */
|
||||||
|
0x00,0x66,0x66,0x66,0x24,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* " */
|
||||||
|
0x00,0x00,0x00,0x6c,0x6c,0xfe,0x6c,0x6c,0x6c,0xfe,0x6c,0x6c,0x00,0x00,0x00,0x00, /* # */
|
||||||
|
0x18,0x18,0x7c,0xc6,0xc2,0xc0,0x7c,0x06,0x06,0x86,0xc6,0x7c,0x18,0x18,0x00,0x00, /* $ */
|
||||||
|
0x00,0x00,0x00,0x00,0xc2,0xc6,0x0c,0x18,0x30,0x60,0xc6,0x86,0x00,0x00,0x00,0x00, /* % */
|
||||||
|
0x00,0x00,0x38,0x6c,0x6c,0x38,0x76,0xdc,0xcc,0xcc,0xcc,0x76,0x00,0x00,0x00,0x00, /* & */
|
||||||
|
0x00,0x30,0x30,0x30,0x60,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* ' */
|
||||||
|
0x00,0x00,0x0c,0x18,0x30,0x30,0x30,0x30,0x30,0x30,0x18,0x0c,0x00,0x00,0x00,0x00, /* ( */
|
||||||
|
0x00,0x00,0x30,0x18,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x18,0x30,0x00,0x00,0x00,0x00, /* ) */
|
||||||
|
0x00,0x00,0x00,0x00,0x00,0x66,0x3c,0xff,0x3c,0x66,0x00,0x00,0x00,0x00,0x00,0x00, /* * */
|
||||||
|
0x00,0x00,0x00,0x00,0x00,0x18,0x18,0x7e,0x18,0x18,0x00,0x00,0x00,0x00,0x00,0x00, /* + */
|
||||||
|
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x18,0x18,0x18,0x30,0x00,0x00,0x00, /* , */
|
||||||
|
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* - */
|
||||||
|
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x18,0x18,0x00,0x00,0x00,0x00, /* . */
|
||||||
|
0x00,0x00,0x00,0x00,0x02,0x06,0x0c,0x18,0x30,0x60,0xc0,0x80,0x00,0x00,0x00,0x00, /* / */
|
||||||
|
0x00,0x00,0x38,0x6c,0xc6,0xc6,0xd6,0xd6,0xc6,0xc6,0x6c,0x38,0x00,0x00,0x00,0x00, /* 0 */
|
||||||
|
0x00,0x00,0x18,0x38,0x78,0x18,0x18,0x18,0x18,0x18,0x18,0x7e,0x00,0x00,0x00,0x00, /* 1 */
|
||||||
|
0x00,0x00,0x7c,0xc6,0x06,0x0c,0x18,0x30,0x60,0xc0,0xc6,0xfe,0x00,0x00,0x00,0x00, /* 2 */
|
||||||
|
0x00,0x00,0x7c,0xc6,0x06,0x06,0x3c,0x06,0x06,0x06,0xc6,0x7c,0x00,0x00,0x00,0x00, /* 3 */
|
||||||
|
0x00,0x00,0x0c,0x1c,0x3c,0x6c,0xcc,0xfe,0x0c,0x0c,0x0c,0x1e,0x00,0x00,0x00,0x00, /* 4 */
|
||||||
|
0x00,0x00,0xfe,0xc0,0xc0,0xc0,0xfc,0x06,0x06,0x06,0xc6,0x7c,0x00,0x00,0x00,0x00, /* 5 */
|
||||||
|
0x00,0x00,0x38,0x60,0xc0,0xc0,0xfc,0xc6,0xc6,0xc6,0xc6,0x7c,0x00,0x00,0x00,0x00, /* 6 */
|
||||||
|
0x00,0x00,0xfe,0xc6,0x06,0x06,0x0c,0x18,0x30,0x30,0x30,0x30,0x00,0x00,0x00,0x00, /* 7 */
|
||||||
|
0x00,0x00,0x7c,0xc6,0xc6,0xc6,0x7c,0xc6,0xc6,0xc6,0xc6,0x7c,0x00,0x00,0x00,0x00, /* 8 */
|
||||||
|
0x00,0x00,0x7c,0xc6,0xc6,0xc6,0x7e,0x06,0x06,0x06,0x0c,0x78,0x00,0x00,0x00,0x00, /* 9 */
|
||||||
|
0x00,0x00,0x00,0x00,0x18,0x18,0x00,0x00,0x00,0x18,0x18,0x00,0x00,0x00,0x00,0x00, /* : */
|
||||||
|
0x00,0x00,0x00,0x00,0x18,0x18,0x00,0x00,0x00,0x18,0x18,0x30,0x00,0x00,0x00,0x00, /* ; */
|
||||||
|
0x00,0x00,0x00,0x06,0x0c,0x18,0x30,0x60,0x30,0x18,0x0c,0x06,0x00,0x00,0x00,0x00, /* < */
|
||||||
|
0x00,0x00,0x00,0x00,0x00,0x7e,0x00,0x00,0x7e,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* = */
|
||||||
|
0x00,0x00,0x00,0x60,0x30,0x18,0x0c,0x06,0x0c,0x18,0x30,0x60,0x00,0x00,0x00,0x00, /* > */
|
||||||
|
0x00,0x00,0x7c,0xc6,0xc6,0x0c,0x18,0x18,0x18,0x00,0x18,0x18,0x00,0x00,0x00,0x00, /* ? */
|
||||||
|
0x00,0x00,0x00,0x7c,0xc6,0xc6,0xde,0xde,0xde,0xdc,0xc0,0x7c,0x00,0x00,0x00,0x00, /* @ */
|
||||||
|
0x00,0x00,0x10,0x38,0x6c,0xc6,0xc6,0xfe,0xc6,0xc6,0xc6,0xc6,0x00,0x00,0x00,0x00, /* A */
|
||||||
|
0x00,0x00,0xfc,0x66,0x66,0x66,0x7c,0x66,0x66,0x66,0x66,0xfc,0x00,0x00,0x00,0x00, /* B */
|
||||||
|
0x00,0x00,0x3c,0x66,0xc2,0xc0,0xc0,0xc0,0xc0,0xc2,0x66,0x3c,0x00,0x00,0x00,0x00, /* C */
|
||||||
|
0x00,0x00,0xf8,0x6c,0x66,0x66,0x66,0x66,0x66,0x66,0x6c,0xf8,0x00,0x00,0x00,0x00, /* D */
|
||||||
|
0x00,0x00,0xfe,0x66,0x62,0x68,0x78,0x68,0x60,0x62,0x66,0xfe,0x00,0x00,0x00,0x00, /* E */
|
||||||
|
0x00,0x00,0xfe,0x66,0x62,0x68,0x78,0x68,0x60,0x60,0x60,0xf0,0x00,0x00,0x00,0x00, /* F */
|
||||||
|
0x00,0x00,0x3c,0x66,0xc2,0xc0,0xc0,0xde,0xc6,0xc6,0x66,0x3a,0x00,0x00,0x00,0x00, /* G */
|
||||||
|
0x00,0x00,0xc6,0xc6,0xc6,0xc6,0xfe,0xc6,0xc6,0xc6,0xc6,0xc6,0x00,0x00,0x00,0x00, /* H */
|
||||||
|
0x00,0x00,0x3c,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x3c,0x00,0x00,0x00,0x00, /* I */
|
||||||
|
0x00,0x00,0x1e,0x0c,0x0c,0x0c,0x0c,0x0c,0xcc,0xcc,0xcc,0x78,0x00,0x00,0x00,0x00, /* J */
|
||||||
|
0x00,0x00,0xe6,0x66,0x66,0x6c,0x78,0x78,0x6c,0x66,0x66,0xe6,0x00,0x00,0x00,0x00, /* K */
|
||||||
|
0x00,0x00,0xf0,0x60,0x60,0x60,0x60,0x60,0x60,0x62,0x66,0xfe,0x00,0x00,0x00,0x00, /* L */
|
||||||
|
0x00,0x00,0xc6,0xee,0xfe,0xfe,0xd6,0xc6,0xc6,0xc6,0xc6,0xc6,0x00,0x00,0x00,0x00, /* M */
|
||||||
|
0x00,0x00,0xc6,0xe6,0xf6,0xfe,0xde,0xce,0xc6,0xc6,0xc6,0xc6,0x00,0x00,0x00,0x00, /* N */
|
||||||
|
0x00,0x00,0x7c,0xc6,0xc6,0xc6,0xc6,0xc6,0xc6,0xc6,0xc6,0x7c,0x00,0x00,0x00,0x00, /* O */
|
||||||
|
0x00,0x00,0xfc,0x66,0x66,0x66,0x7c,0x60,0x60,0x60,0x60,0xf0,0x00,0x00,0x00,0x00, /* P */
|
||||||
|
0x00,0x00,0x7c,0xc6,0xc6,0xc6,0xc6,0xc6,0xc6,0xd6,0xde,0x7c,0x0c,0x0e,0x00,0x00, /* Q */
|
||||||
|
0x00,0x00,0xfc,0x66,0x66,0x66,0x7c,0x6c,0x66,0x66,0x66,0xe6,0x00,0x00,0x00,0x00, /* R */
|
||||||
|
0x00,0x00,0x7c,0xc6,0xc6,0x60,0x38,0x0c,0x06,0xc6,0xc6,0x7c,0x00,0x00,0x00,0x00, /* S */
|
||||||
|
0x00,0x00,0x7e,0x7e,0x5a,0x18,0x18,0x18,0x18,0x18,0x18,0x3c,0x00,0x00,0x00,0x00, /* T */
|
||||||
|
0x00,0x00,0xc6,0xc6,0xc6,0xc6,0xc6,0xc6,0xc6,0xc6,0xc6,0x7c,0x00,0x00,0x00,0x00, /* U */
|
||||||
|
0x00,0x00,0xc6,0xc6,0xc6,0xc6,0xc6,0xc6,0xc6,0x6c,0x38,0x10,0x00,0x00,0x00,0x00, /* V */
|
||||||
|
0x00,0x00,0xc6,0xc6,0xc6,0xc6,0xd6,0xd6,0xd6,0xfe,0xee,0x6c,0x00,0x00,0x00,0x00, /* W */
|
||||||
|
0x00,0x00,0xc6,0xc6,0x6c,0x7c,0x38,0x38,0x7c,0x6c,0xc6,0xc6,0x00,0x00,0x00,0x00, /* X */
|
||||||
|
0x00,0x00,0x66,0x66,0x66,0x66,0x3c,0x18,0x18,0x18,0x18,0x3c,0x00,0x00,0x00,0x00, /* Y */
|
||||||
|
0x00,0x00,0xfe,0xc6,0x86,0x0c,0x18,0x30,0x60,0xc2,0xc6,0xfe,0x00,0x00,0x00,0x00, /* Z */
|
||||||
|
0x00,0x00,0x3c,0x30,0x30,0x30,0x30,0x30,0x30,0x30,0x30,0x3c,0x00,0x00,0x00,0x00, /* [ */
|
||||||
|
0x00,0x00,0x00,0x80,0xc0,0xe0,0x70,0x38,0x1c,0x0e,0x06,0x02,0x00,0x00,0x00,0x00, /* \ */
|
||||||
|
0x00,0x00,0x3c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x3c,0x00,0x00,0x00,0x00, /* ] */
|
||||||
|
0x10,0x38,0x6c,0xc6,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* ^ */
|
||||||
|
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0x00,0x00, /* _ */
|
||||||
|
0x30,0x30,0x18,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* ` */
|
||||||
|
0x00,0x00,0x00,0x00,0x00,0x78,0x0c,0x7c,0xcc,0xcc,0xcc,0x76,0x00,0x00,0x00,0x00, /* a */
|
||||||
|
0x00,0x00,0xe0,0x60,0x60,0x78,0x6c,0x66,0x66,0x66,0x66,0x7c,0x00,0x00,0x00,0x00, /* b */
|
||||||
|
0x00,0x00,0x00,0x00,0x00,0x7c,0xc6,0xc0,0xc0,0xc0,0xc6,0x7c,0x00,0x00,0x00,0x00, /* c */
|
||||||
|
0x00,0x00,0x1c,0x0c,0x0c,0x3c,0x6c,0xcc,0xcc,0xcc,0xcc,0x76,0x00,0x00,0x00,0x00, /* d */
|
||||||
|
0x00,0x00,0x00,0x00,0x00,0x7c,0xc6,0xfe,0xc0,0xc0,0xc6,0x7c,0x00,0x00,0x00,0x00, /* e */
|
||||||
|
0x00,0x00,0x38,0x6c,0x64,0x60,0xf0,0x60,0x60,0x60,0x60,0xf0,0x00,0x00,0x00,0x00, /* f */
|
||||||
|
0x00,0x00,0x00,0x00,0x00,0x76,0xcc,0xcc,0xcc,0xcc,0xcc,0x7c,0x0c,0xcc,0x78,0x00, /* g */
|
||||||
|
0x00,0x00,0xe0,0x60,0x60,0x6c,0x76,0x66,0x66,0x66,0x66,0xe6,0x00,0x00,0x00,0x00, /* h */
|
||||||
|
0x00,0x00,0x18,0x18,0x00,0x38,0x18,0x18,0x18,0x18,0x18,0x3c,0x00,0x00,0x00,0x00, /* i */
|
||||||
|
0x00,0x00,0x06,0x06,0x00,0x0e,0x06,0x06,0x06,0x06,0x06,0x06,0x66,0x66,0x3c,0x00, /* j */
|
||||||
|
0x00,0x00,0xe0,0x60,0x60,0x66,0x6c,0x78,0x78,0x6c,0x66,0xe6,0x00,0x00,0x00,0x00, /* k */
|
||||||
|
0x00,0x00,0x38,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x3c,0x00,0x00,0x00,0x00, /* l */
|
||||||
|
0x00,0x00,0x00,0x00,0x00,0xec,0xfe,0xd6,0xd6,0xd6,0xd6,0xc6,0x00,0x00,0x00,0x00, /* m */
|
||||||
|
0x00,0x00,0x00,0x00,0x00,0xdc,0x66,0x66,0x66,0x66,0x66,0x66,0x00,0x00,0x00,0x00, /* n */
|
||||||
|
0x00,0x00,0x00,0x00,0x00,0x7c,0xc6,0xc6,0xc6,0xc6,0xc6,0x7c,0x00,0x00,0x00,0x00, /* o */
|
||||||
|
0x00,0x00,0x00,0x00,0x00,0xdc,0x66,0x66,0x66,0x66,0x66,0x7c,0x60,0x60,0xf0,0x00, /* p */
|
||||||
|
0x00,0x00,0x00,0x00,0x00,0x76,0xcc,0xcc,0xcc,0xcc,0xcc,0x7c,0x0c,0x0c,0x1e,0x00, /* q */
|
||||||
|
0x00,0x00,0x00,0x00,0x00,0xdc,0x76,0x66,0x60,0x60,0x60,0xf0,0x00,0x00,0x00,0x00, /* r */
|
||||||
|
0x00,0x00,0x00,0x00,0x00,0x7c,0xc6,0x60,0x38,0x0c,0xc6,0x7c,0x00,0x00,0x00,0x00, /* s */
|
||||||
|
0x00,0x00,0x10,0x30,0x30,0xfc,0x30,0x30,0x30,0x30,0x36,0x1c,0x00,0x00,0x00,0x00, /* t */
|
||||||
|
0x00,0x00,0x00,0x00,0x00,0xcc,0xcc,0xcc,0xcc,0xcc,0xcc,0x76,0x00,0x00,0x00,0x00, /* u */
|
||||||
|
0x00,0x00,0x00,0x00,0x00,0x66,0x66,0x66,0x66,0x66,0x3c,0x18,0x00,0x00,0x00,0x00, /* v */
|
||||||
|
0x00,0x00,0x00,0x00,0x00,0xc6,0xc6,0xd6,0xd6,0xd6,0xfe,0x6c,0x00,0x00,0x00,0x00, /* w */
|
||||||
|
0x00,0x00,0x00,0x00,0x00,0xc6,0x6c,0x38,0x38,0x38,0x6c,0xc6,0x00,0x00,0x00,0x00, /* x */
|
||||||
|
0x00,0x00,0x00,0x00,0x00,0xc6,0xc6,0xc6,0xc6,0xc6,0xc6,0x7e,0x06,0x0c,0xf8,0x00, /* y */
|
||||||
|
0x00,0x00,0x00,0x00,0x00,0xfe,0xcc,0x18,0x30,0x60,0xc6,0xfe,0x00,0x00,0x00,0x00, /* z */
|
||||||
|
0x00,0x00,0x0e,0x18,0x18,0x18,0x70,0x18,0x18,0x18,0x18,0x0e,0x00,0x00,0x00,0x00, /* { */
|
||||||
|
0x00,0x00,0x18,0x18,0x18,0x18,0x00,0x18,0x18,0x18,0x18,0x18,0x00,0x00,0x00,0x00, /* | */
|
||||||
|
0x00,0x00,0x70,0x18,0x18,0x18,0x0e,0x18,0x18,0x18,0x18,0x70,0x00,0x00,0x00,0x00, /* } */
|
||||||
|
0x00,0x00,0x76,0xdc,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* ~ */
|
||||||
|
0x00,0x00,0x00,0x00,0x10,0x38,0x6c,0xc6,0xc6,0xc6,0xfe,0x00,0x00,0x00,0x00,0x00, /* 0x7f */
|
||||||
|
0x00,0x00,0x3c,0x66,0xc2,0xc0,0xc0,0xc0,0xc2,0x66,0x3c,0x0c,0x06,0x7c,0x00,0x00, /* 0x80 */
|
||||||
|
0x00,0x00,0xcc,0x00,0x00,0xcc,0xcc,0xcc,0xcc,0xcc,0xcc,0x76,0x00,0x00,0x00,0x00, /* 0x81 */
|
||||||
|
0x00,0x0c,0x18,0x30,0x00,0x7c,0xc6,0xfe,0xc0,0xc0,0xc6,0x7c,0x00,0x00,0x00,0x00, /* 0x82 */
|
||||||
|
0x00,0x10,0x38,0x6c,0x00,0x78,0x0c,0x7c,0xcc,0xcc,0xcc,0x76,0x00,0x00,0x00,0x00, /* 0x83 */
|
||||||
|
0x00,0x00,0xcc,0x00,0x00,0x78,0x0c,0x7c,0xcc,0xcc,0xcc,0x76,0x00,0x00,0x00,0x00, /* 0x84 */
|
||||||
|
0x00,0x60,0x30,0x18,0x00,0x78,0x0c,0x7c,0xcc,0xcc,0xcc,0x76,0x00,0x00,0x00,0x00, /* 0x85 */
|
||||||
|
0x00,0x38,0x6c,0x38,0x00,0x78,0x0c,0x7c,0xcc,0xcc,0xcc,0x76,0x00,0x00,0x00,0x00, /* 0x86 */
|
||||||
|
0x00,0x00,0x00,0x00,0x3c,0x66,0x60,0x60,0x66,0x3c,0x0c,0x06,0x3c,0x00,0x00,0x00, /* 0x87 */
|
||||||
|
0x00,0x10,0x38,0x6c,0x00,0x7c,0xc6,0xfe,0xc0,0xc0,0xc6,0x7c,0x00,0x00,0x00,0x00, /* 0x88 */
|
||||||
|
0x00,0x00,0xc6,0x00,0x00,0x7c,0xc6,0xfe,0xc0,0xc0,0xc6,0x7c,0x00,0x00,0x00,0x00, /* 0x89 */
|
||||||
|
0x00,0x60,0x30,0x18,0x00,0x7c,0xc6,0xfe,0xc0,0xc0,0xc6,0x7c,0x00,0x00,0x00,0x00, /* 0x8a */
|
||||||
|
0x00,0x00,0x66,0x00,0x00,0x38,0x18,0x18,0x18,0x18,0x18,0x3c,0x00,0x00,0x00,0x00, /* 0x8b */
|
||||||
|
0x00,0x18,0x3c,0x66,0x00,0x38,0x18,0x18,0x18,0x18,0x18,0x3c,0x00,0x00,0x00,0x00, /* 0x8c */
|
||||||
|
0x00,0x60,0x30,0x18,0x00,0x38,0x18,0x18,0x18,0x18,0x18,0x3c,0x00,0x00,0x00,0x00, /* 0x8d */
|
||||||
|
0x00,0xc6,0x00,0x10,0x38,0x6c,0xc6,0xc6,0xfe,0xc6,0xc6,0xc6,0x00,0x00,0x00,0x00, /* 0x8e */
|
||||||
|
0x38,0x6c,0x38,0x00,0x38,0x6c,0xc6,0xc6,0xfe,0xc6,0xc6,0xc6,0x00,0x00,0x00,0x00, /* 0x8f */
|
||||||
|
0x18,0x30,0x60,0x00,0xfe,0x66,0x60,0x7c,0x60,0x60,0x66,0xfe,0x00,0x00,0x00,0x00, /* 0x90 */
|
||||||
|
0x00,0x00,0x00,0x00,0x00,0xcc,0x76,0x36,0x7e,0xd8,0xd8,0x6e,0x00,0x00,0x00,0x00, /* 0x91 */
|
||||||
|
0x00,0x00,0x3e,0x6c,0xcc,0xcc,0xfe,0xcc,0xcc,0xcc,0xcc,0xce,0x00,0x00,0x00,0x00, /* 0x92 */
|
||||||
|
0x00,0x10,0x38,0x6c,0x00,0x7c,0xc6,0xc6,0xc6,0xc6,0xc6,0x7c,0x00,0x00,0x00,0x00, /* 0x93 */
|
||||||
|
0x00,0x00,0xc6,0x00,0x00,0x7c,0xc6,0xc6,0xc6,0xc6,0xc6,0x7c,0x00,0x00,0x00,0x00, /* 0x94 */
|
||||||
|
0x00,0x60,0x30,0x18,0x00,0x7c,0xc6,0xc6,0xc6,0xc6,0xc6,0x7c,0x00,0x00,0x00,0x00, /* 0x95 */
|
||||||
|
0x00,0x30,0x78,0xcc,0x00,0xcc,0xcc,0xcc,0xcc,0xcc,0xcc,0x76,0x00,0x00,0x00,0x00, /* 0x96 */
|
||||||
|
0x00,0x60,0x30,0x18,0x00,0xcc,0xcc,0xcc,0xcc,0xcc,0xcc,0x76,0x00,0x00,0x00,0x00, /* 0x97 */
|
||||||
|
0x00,0x00,0xc6,0x00,0x00,0xc6,0xc6,0xc6,0xc6,0xc6,0xc6,0x7e,0x06,0x0c,0x78,0x00, /* 0x98 */
|
||||||
|
0x00,0xc6,0x00,0x7c,0xc6,0xc6,0xc6,0xc6,0xc6,0xc6,0xc6,0x7c,0x00,0x00,0x00,0x00, /* 0x99 */
|
||||||
|
0x00,0xc6,0x00,0xc6,0xc6,0xc6,0xc6,0xc6,0xc6,0xc6,0xc6,0x7c,0x00,0x00,0x00,0x00, /* 0x9a */
|
||||||
|
0x00,0x18,0x18,0x3c,0x66,0x60,0x60,0x60,0x66,0x3c,0x18,0x18,0x00,0x00,0x00,0x00, /* 0x9b */
|
||||||
|
0x00,0x38,0x6c,0x64,0x60,0xf0,0x60,0x60,0x60,0x60,0xe6,0xfc,0x00,0x00,0x00,0x00, /* 0x9c */
|
||||||
|
0x00,0x00,0x66,0x66,0x3c,0x18,0x7e,0x18,0x7e,0x18,0x18,0x18,0x00,0x00,0x00,0x00, /* 0x9d */
|
||||||
|
0x00,0xf8,0xcc,0xcc,0xf8,0xc4,0xcc,0xde,0xcc,0xcc,0xcc,0xc6,0x00,0x00,0x00,0x00, /* 0x9e */
|
||||||
|
0x00,0x0e,0x1b,0x18,0x18,0x18,0x7e,0x18,0x18,0x18,0x18,0x18,0xd8,0x70,0x00,0x00, /* 0x9f */
|
||||||
|
0x00,0x18,0x30,0x60,0x00,0x78,0x0c,0x7c,0xcc,0xcc,0xcc,0x76,0x00,0x00,0x00,0x00, /* 0xa0 */
|
||||||
|
0x00,0x0c,0x18,0x30,0x00,0x38,0x18,0x18,0x18,0x18,0x18,0x3c,0x00,0x00,0x00,0x00, /* 0xa1 */
|
||||||
|
0x00,0x18,0x30,0x60,0x00,0x7c,0xc6,0xc6,0xc6,0xc6,0xc6,0x7c,0x00,0x00,0x00,0x00, /* 0xa2 */
|
||||||
|
0x00,0x18,0x30,0x60,0x00,0xcc,0xcc,0xcc,0xcc,0xcc,0xcc,0x76,0x00,0x00,0x00,0x00, /* 0xa3 */
|
||||||
|
0x00,0x00,0x76,0xdc,0x00,0xdc,0x66,0x66,0x66,0x66,0x66,0x66,0x00,0x00,0x00,0x00, /* 0xa4 */
|
||||||
|
0x76,0xdc,0x00,0xc6,0xe6,0xf6,0xfe,0xde,0xce,0xc6,0xc6,0xc6,0x00,0x00,0x00,0x00, /* 0xa5 */
|
||||||
|
0x00,0x3c,0x6c,0x6c,0x3e,0x00,0x7e,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* 0xa6 */
|
||||||
|
0x00,0x38,0x6c,0x6c,0x38,0x00,0x7c,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* 0xa7 */
|
||||||
|
0x00,0x00,0x30,0x30,0x00,0x30,0x30,0x60,0xc0,0xc6,0xc6,0x7c,0x00,0x00,0x00,0x00, /* 0xa8 */
|
||||||
|
0x00,0x00,0x00,0x00,0x00,0x00,0xfe,0xc0,0xc0,0xc0,0xc0,0x00,0x00,0x00,0x00,0x00, /* 0xa9 */
|
||||||
|
0x00,0x00,0x00,0x00,0x00,0x00,0xfe,0x06,0x06,0x06,0x06,0x00,0x00,0x00,0x00,0x00, /* 0xaa */
|
||||||
|
0x00,0xc0,0xc0,0xc2,0xc6,0xcc,0x18,0x30,0x60,0xdc,0x86,0x0c,0x18,0x3e,0x00,0x00, /* 0xab */
|
||||||
|
0x00,0xc0,0xc0,0xc2,0xc6,0xcc,0x18,0x30,0x66,0xce,0x9e,0x3e,0x06,0x06,0x00,0x00, /* 0xac */
|
||||||
|
0x00,0x00,0x18,0x18,0x00,0x18,0x18,0x18,0x3c,0x3c,0x3c,0x18,0x00,0x00,0x00,0x00, /* 0xad */
|
||||||
|
0x00,0x00,0x00,0x00,0x00,0x36,0x6c,0xd8,0x6c,0x36,0x00,0x00,0x00,0x00,0x00,0x00, /* 0xae */
|
||||||
|
0x00,0x00,0x00,0x00,0x00,0xd8,0x6c,0x36,0x6c,0xd8,0x00,0x00,0x00,0x00,0x00,0x00, /* 0xaf */
|
||||||
|
0x11,0x44,0x11,0x44,0x11,0x44,0x11,0x44,0x11,0x44,0x11,0x44,0x11,0x44,0x11,0x44, /* 0xb0 */
|
||||||
|
0x55,0xaa,0x55,0xaa,0x55,0xaa,0x55,0xaa,0x55,0xaa,0x55,0xaa,0x55,0xaa,0x55,0xaa, /* 0xb1 */
|
||||||
|
0xdd,0x77,0xdd,0x77,0xdd,0x77,0xdd,0x77,0xdd,0x77,0xdd,0x77,0xdd,0x77,0xdd,0x77, /* 0xb2 */
|
||||||
|
0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18, /* 0xb3 */
|
||||||
|
0x18,0x18,0x18,0x18,0x18,0x18,0x18,0xf8,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18, /* 0xb4 */
|
||||||
|
0x18,0x18,0x18,0x18,0x18,0xf8,0x18,0xf8,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18, /* 0xb5 */
|
||||||
|
0x36,0x36,0x36,0x36,0x36,0x36,0x36,0xf6,0x36,0x36,0x36,0x36,0x36,0x36,0x36,0x36, /* 0xb6 */
|
||||||
|
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xfe,0x36,0x36,0x36,0x36,0x36,0x36,0x36,0x36, /* 0xb7 */
|
||||||
|
0x00,0x00,0x00,0x00,0x00,0xf8,0x18,0xf8,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18, /* 0xb8 */
|
||||||
|
0x36,0x36,0x36,0x36,0x36,0xf6,0x06,0xf6,0x36,0x36,0x36,0x36,0x36,0x36,0x36,0x36, /* 0xb9 */
|
||||||
|
0x36,0x36,0x36,0x36,0x36,0x36,0x36,0x36,0x36,0x36,0x36,0x36,0x36,0x36,0x36,0x36, /* 0xba */
|
||||||
|
0x00,0x00,0x00,0x00,0x00,0xfe,0x06,0xf6,0x36,0x36,0x36,0x36,0x36,0x36,0x36,0x36, /* 0xbb */
|
||||||
|
0x36,0x36,0x36,0x36,0x36,0xf6,0x06,0xfe,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* 0xbc */
|
||||||
|
0x36,0x36,0x36,0x36,0x36,0x36,0x36,0xfe,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* 0xbd */
|
||||||
|
0x18,0x18,0x18,0x18,0x18,0xf8,0x18,0xf8,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* 0xbe */
|
||||||
|
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xf8,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18, /* 0xbf */
|
||||||
|
0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x1f,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* 0xc0 */
|
||||||
|
0x18,0x18,0x18,0x18,0x18,0x18,0x18,0xff,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* 0xc1 */
|
||||||
|
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18, /* 0xc2 */
|
||||||
|
0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x1f,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18, /* 0xc3 */
|
||||||
|
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* 0xc4 */
|
||||||
|
0x18,0x18,0x18,0x18,0x18,0x18,0x18,0xff,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18, /* 0xc5 */
|
||||||
|
0x18,0x18,0x18,0x18,0x18,0x1f,0x18,0x1f,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18, /* 0xc6 */
|
||||||
|
0x36,0x36,0x36,0x36,0x36,0x36,0x36,0x37,0x36,0x36,0x36,0x36,0x36,0x36,0x36,0x36, /* 0xc7 */
|
||||||
|
0x36,0x36,0x36,0x36,0x36,0x37,0x30,0x3f,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* 0xc8 */
|
||||||
|
0x00,0x00,0x00,0x00,0x00,0x3f,0x30,0x37,0x36,0x36,0x36,0x36,0x36,0x36,0x36,0x36, /* 0xc9 */
|
||||||
|
0x36,0x36,0x36,0x36,0x36,0xf7,0x00,0xff,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* 0xca */
|
||||||
|
0x00,0x00,0x00,0x00,0x00,0xff,0x00,0xf7,0x36,0x36,0x36,0x36,0x36,0x36,0x36,0x36, /* 0xcb */
|
||||||
|
0x36,0x36,0x36,0x36,0x36,0x37,0x30,0x37,0x36,0x36,0x36,0x36,0x36,0x36,0x36,0x36, /* 0xcc */
|
||||||
|
0x00,0x00,0x00,0x00,0x00,0xff,0x00,0xff,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* 0xcd */
|
||||||
|
0x36,0x36,0x36,0x36,0x36,0xf7,0x00,0xf7,0x36,0x36,0x36,0x36,0x36,0x36,0x36,0x36, /* 0xce */
|
||||||
|
0x18,0x18,0x18,0x18,0x18,0xff,0x00,0xff,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* 0xcf */
|
||||||
|
0x36,0x36,0x36,0x36,0x36,0x36,0x36,0xff,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* 0xd0 */
|
||||||
|
0x00,0x00,0x00,0x00,0x00,0xff,0x00,0xff,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18, /* 0xd1 */
|
||||||
|
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0x36,0x36,0x36,0x36,0x36,0x36,0x36,0x36, /* 0xd2 */
|
||||||
|
0x36,0x36,0x36,0x36,0x36,0x36,0x36,0x3f,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* 0xd3 */
|
||||||
|
0x18,0x18,0x18,0x18,0x18,0x1f,0x18,0x1f,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* 0xd4 */
|
||||||
|
0x00,0x00,0x00,0x00,0x00,0x1f,0x18,0x1f,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18, /* 0xd5 */
|
||||||
|
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3f,0x36,0x36,0x36,0x36,0x36,0x36,0x36,0x36, /* 0xd6 */
|
||||||
|
0x36,0x36,0x36,0x36,0x36,0x36,0x36,0xff,0x36,0x36,0x36,0x36,0x36,0x36,0x36,0x36, /* 0xd7 */
|
||||||
|
0x18,0x18,0x18,0x18,0x18,0xff,0x18,0xff,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18, /* 0xd8 */
|
||||||
|
0x18,0x18,0x18,0x18,0x18,0x18,0x18,0xf8,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* 0xd9 */
|
||||||
|
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1f,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18, /* 0xda */
|
||||||
|
0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, /* 0xdb */
|
||||||
|
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, /* 0xdc */
|
||||||
|
0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0, /* 0xdd */
|
||||||
|
0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f, /* 0xde */
|
||||||
|
0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* 0xdf */
|
||||||
|
0x00,0x00,0x00,0x00,0x00,0x76,0xdc,0xd8,0xd8,0xd8,0xdc,0x76,0x00,0x00,0x00,0x00, /* 0xe0 */
|
||||||
|
0x00,0x00,0x78,0xcc,0xcc,0xcc,0xd8,0xcc,0xc6,0xc6,0xc6,0xcc,0x00,0x00,0x00,0x00, /* 0xe1 */
|
||||||
|
0x00,0x00,0xfe,0xc6,0xc6,0xc0,0xc0,0xc0,0xc0,0xc0,0xc0,0xc0,0x00,0x00,0x00,0x00, /* 0xe2 */
|
||||||
|
0x00,0x00,0x00,0x00,0xfe,0x6c,0x6c,0x6c,0x6c,0x6c,0x6c,0x6c,0x00,0x00,0x00,0x00, /* 0xe3 */
|
||||||
|
0x00,0x00,0x00,0xfe,0xc6,0x60,0x30,0x18,0x30,0x60,0xc6,0xfe,0x00,0x00,0x00,0x00, /* 0xe4 */
|
||||||
|
0x00,0x00,0x00,0x00,0x00,0x7e,0xd8,0xd8,0xd8,0xd8,0xd8,0x70,0x00,0x00,0x00,0x00, /* 0xe5 */
|
||||||
|
0x00,0x00,0x00,0x00,0x66,0x66,0x66,0x66,0x66,0x7c,0x60,0x60,0xc0,0x00,0x00,0x00, /* 0xe6 */
|
||||||
|
0x00,0x00,0x00,0x00,0x76,0xdc,0x18,0x18,0x18,0x18,0x18,0x18,0x00,0x00,0x00,0x00, /* 0xe7 */
|
||||||
|
0x00,0x00,0x00,0x7e,0x18,0x3c,0x66,0x66,0x66,0x3c,0x18,0x7e,0x00,0x00,0x00,0x00, /* 0xe8 */
|
||||||
|
0x00,0x00,0x00,0x38,0x6c,0xc6,0xc6,0xfe,0xc6,0xc6,0x6c,0x38,0x00,0x00,0x00,0x00, /* 0xe9 */
|
||||||
|
0x00,0x00,0x38,0x6c,0xc6,0xc6,0xc6,0x6c,0x6c,0x6c,0x6c,0xee,0x00,0x00,0x00,0x00, /* 0xea */
|
||||||
|
0x00,0x00,0x1e,0x30,0x18,0x0c,0x3e,0x66,0x66,0x66,0x66,0x3c,0x00,0x00,0x00,0x00, /* 0xeb */
|
||||||
|
0x00,0x00,0x00,0x00,0x00,0x7e,0xdb,0xdb,0xdb,0x7e,0x00,0x00,0x00,0x00,0x00,0x00, /* 0xec */
|
||||||
|
0x00,0x00,0x00,0x03,0x06,0x7e,0xdb,0xdb,0xf3,0x7e,0x60,0xc0,0x00,0x00,0x00,0x00, /* 0xed */
|
||||||
|
0x00,0x00,0x1c,0x30,0x60,0x60,0x7c,0x60,0x60,0x60,0x30,0x1c,0x00,0x00,0x00,0x00, /* 0xee */
|
||||||
|
0x00,0x00,0x00,0x7c,0xc6,0xc6,0xc6,0xc6,0xc6,0xc6,0xc6,0xc6,0x00,0x00,0x00,0x00, /* 0xef */
|
||||||
|
0x00,0x00,0x00,0x00,0xfe,0x00,0x00,0xfe,0x00,0x00,0xfe,0x00,0x00,0x00,0x00,0x00, /* 0xf0 */
|
||||||
|
0x00,0x00,0x00,0x00,0x18,0x18,0x7e,0x18,0x18,0x00,0x00,0xff,0x00,0x00,0x00,0x00, /* 0xf1 */
|
||||||
|
0x00,0x00,0x00,0x30,0x18,0x0c,0x06,0x0c,0x18,0x30,0x00,0x7e,0x00,0x00,0x00,0x00, /* 0xf2 */
|
||||||
|
0x00,0x00,0x00,0x0c,0x18,0x30,0x60,0x30,0x18,0x0c,0x00,0x7e,0x00,0x00,0x00,0x00, /* 0xf3 */
|
||||||
|
0x00,0x00,0x0e,0x1b,0x1b,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18, /* 0xf4 */
|
||||||
|
0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0xd8,0xd8,0xd8,0x70,0x00,0x00,0x00,0x00, /* 0xf5 */
|
||||||
|
0x00,0x00,0x00,0x00,0x18,0x18,0x00,0x7e,0x00,0x18,0x18,0x00,0x00,0x00,0x00,0x00, /* 0xf6 */
|
||||||
|
0x00,0x00,0x00,0x00,0x00,0x76,0xdc,0x00,0x76,0xdc,0x00,0x00,0x00,0x00,0x00,0x00, /* 0xf7 */
|
||||||
|
0x00,0x38,0x6c,0x6c,0x38,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* 0xf8 */
|
||||||
|
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x18,0x18,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* 0xf9 */
|
||||||
|
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x18,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* 0xfa */
|
||||||
|
0x00,0x0f,0x0c,0x0c,0x0c,0x0c,0x0c,0xec,0x6c,0x6c,0x3c,0x1c,0x00,0x00,0x00,0x00, /* 0xfb */
|
||||||
|
0x00,0xd8,0x6c,0x6c,0x6c,0x6c,0x6c,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* 0xfc */
|
||||||
|
0x00,0x70,0xd8,0x30,0x60,0xc8,0xf8,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* 0xfd */
|
||||||
|
0x00,0x00,0x00,0x00,0x7c,0x7c,0x7c,0x7c,0x7c,0x7c,0x7c,0x00,0x00,0x00,0x00,0x00, /* 0xfe */
|
||||||
|
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 /* 0xff */
|
||||||
|
};
|
||||||
|
|
||||||
|
/* EOF */
|
||||||
|
|
144
freeldr/freeldr/arch/i386/xboxmem.c
Normal file
144
freeldr/freeldr/arch/i386/xboxmem.c
Normal file
|
@ -0,0 +1,144 @@
|
||||||
|
/* $Id: xboxmem.c,v 1.1 2004/11/08 22:02:47 gvg Exp $
|
||||||
|
*
|
||||||
|
* FreeLoader
|
||||||
|
*
|
||||||
|
* This program is free software; you can redistribute it and/or modify
|
||||||
|
* it under the terms of the GNU General Public License as published by
|
||||||
|
* the Free Software Foundation; either version 2 of the License, or
|
||||||
|
* (at your option) any later version.
|
||||||
|
*
|
||||||
|
* This program is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
* GNU General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU General Public License
|
||||||
|
* along with this program; if not, write to the Free Software
|
||||||
|
* Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
|
||||||
|
*
|
||||||
|
* Note: much of this code was based on knowledge and/or code developed
|
||||||
|
* by the Xbox Linux group: http://www.xbox-linux.org
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include "freeldr.h"
|
||||||
|
#include "debug.h"
|
||||||
|
#include "mm.h"
|
||||||
|
#include "rtl.h"
|
||||||
|
#include "hardware.h"
|
||||||
|
#include "machxbox.h"
|
||||||
|
#include "portio.h"
|
||||||
|
|
||||||
|
static U32 InstalledMemoryMb = 0;
|
||||||
|
static U32 AvailableMemoryMb = 0;
|
||||||
|
|
||||||
|
#define TEST_SIZE 0x200
|
||||||
|
#define TEST_PATTERN1 0xaa
|
||||||
|
#define TEST_PATTERN2 0x55
|
||||||
|
|
||||||
|
VOID
|
||||||
|
XboxMemInit(VOID)
|
||||||
|
{
|
||||||
|
U8 ControlRegion[TEST_SIZE];
|
||||||
|
PVOID MembaseTop = (PVOID)(64 * 1024 * 1024);
|
||||||
|
PVOID MembaseLow = (PVOID)0;
|
||||||
|
|
||||||
|
(*(PU32)(0xfd000000 + 0x100200)) = 0x03070103 ;
|
||||||
|
(*(PU32)(0xfd000000 + 0x100204)) = 0x11448000 ;
|
||||||
|
|
||||||
|
WRITE_PORT_ULONG((U32*) 0xcf8, CONFIG_CMD(0, 0, 0x84));
|
||||||
|
WRITE_PORT_ULONG((U32*) 0xcfc, 0x7ffffff); /* Prep hardware for 128 Mb */
|
||||||
|
|
||||||
|
InstalledMemoryMb = 64;
|
||||||
|
memset(ControlRegion, TEST_PATTERN1, TEST_SIZE);
|
||||||
|
memset(MembaseTop, TEST_PATTERN1, TEST_SIZE);
|
||||||
|
__asm__ ("wbinvd\n");
|
||||||
|
|
||||||
|
if (0 == memcmp(MembaseTop, ControlRegion, TEST_SIZE))
|
||||||
|
{
|
||||||
|
/* Looks like there is memory .. maybe a 128MB box */
|
||||||
|
memset(ControlRegion, TEST_PATTERN2, TEST_SIZE);
|
||||||
|
memset(MembaseTop, TEST_PATTERN2, TEST_SIZE);
|
||||||
|
__asm__ ("wbinvd\n");
|
||||||
|
if (0 == memcmp(MembaseTop, ControlRegion, TEST_SIZE))
|
||||||
|
{
|
||||||
|
/* Definitely looks like there is memory */
|
||||||
|
if (0 == memcmp(MembaseLow, ControlRegion, TEST_SIZE))
|
||||||
|
{
|
||||||
|
/* Hell, we find the Test-string at 0x0 too ! */
|
||||||
|
InstalledMemoryMb = 64;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
InstalledMemoryMb = 128;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Set hardware for amount of memory detected */
|
||||||
|
WRITE_PORT_ULONG((U32*) 0xcf8, CONFIG_CMD(0, 0, 0x84));
|
||||||
|
WRITE_PORT_ULONG((U32*) 0xcfc, InstalledMemoryMb * 1024 * 1024 - 1);
|
||||||
|
|
||||||
|
AvailableMemoryMb = InstalledMemoryMb;
|
||||||
|
}
|
||||||
|
|
||||||
|
U32
|
||||||
|
XboxMemGetMemoryMap(PBIOS_MEMORY_MAP BiosMemoryMap, U32 MaxMemoryMapSize)
|
||||||
|
{
|
||||||
|
U32 EntryCount = 0;
|
||||||
|
|
||||||
|
/* Synthesize memory map */
|
||||||
|
if (1 <= MaxMemoryMapSize)
|
||||||
|
{
|
||||||
|
/* Available RAM block */
|
||||||
|
BiosMemoryMap[0].BaseAddress = 0;
|
||||||
|
BiosMemoryMap[0].Length = AvailableMemoryMb * 1024 * 1024;
|
||||||
|
BiosMemoryMap[0].Type = MEMTYPE_USABLE;
|
||||||
|
EntryCount = 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (2 <= MaxMemoryMapSize)
|
||||||
|
{
|
||||||
|
/* Video memory */
|
||||||
|
BiosMemoryMap[1].BaseAddress = AvailableMemoryMb * 1024 * 1024;
|
||||||
|
BiosMemoryMap[1].Length = (InstalledMemoryMb - AvailableMemoryMb) * 1024 * 1024;
|
||||||
|
BiosMemoryMap[1].Type = MEMTYPE_RESERVED;
|
||||||
|
EntryCount = 2;
|
||||||
|
}
|
||||||
|
|
||||||
|
return EntryCount;
|
||||||
|
}
|
||||||
|
|
||||||
|
unsigned
|
||||||
|
XboxMemGetInstalledMemoryMb(VOID)
|
||||||
|
{
|
||||||
|
if (0 == InstalledMemoryMb)
|
||||||
|
{
|
||||||
|
/* Hmm, seems we're not initialized yet */
|
||||||
|
XboxMemInit();
|
||||||
|
}
|
||||||
|
|
||||||
|
return InstalledMemoryMb;
|
||||||
|
}
|
||||||
|
|
||||||
|
PVOID
|
||||||
|
XboxMemReserveMemory(U32 MbToReserve)
|
||||||
|
{
|
||||||
|
if (0 == InstalledMemoryMb)
|
||||||
|
{
|
||||||
|
/* Hmm, seems we're not initialized yet */
|
||||||
|
XboxMemInit();
|
||||||
|
}
|
||||||
|
|
||||||
|
if (AvailableMemoryMb < MbToReserve)
|
||||||
|
{
|
||||||
|
/* Can't satisfy the request */
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
AvailableMemoryMb -= MbToReserve;
|
||||||
|
|
||||||
|
/* Top of available memory points to the space just reserved */
|
||||||
|
return (PVOID) (AvailableMemoryMb * 1024 * 1024);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* EOF */
|
176
freeldr/freeldr/arch/i386/xboxvideo.c
Normal file
176
freeldr/freeldr/arch/i386/xboxvideo.c
Normal file
|
@ -0,0 +1,176 @@
|
||||||
|
/* $Id: xboxvideo.c,v 1.1 2004/11/08 22:02:47 gvg Exp $
|
||||||
|
*
|
||||||
|
* FreeLoader
|
||||||
|
*
|
||||||
|
* This program is free software; you can redistribute it and/or modify
|
||||||
|
* it under the terms of the GNU General Public License as published by
|
||||||
|
* the Free Software Foundation; either version 2 of the License, or
|
||||||
|
* (at your option) any later version.
|
||||||
|
*
|
||||||
|
* This program is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
* GNU General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU General Public License
|
||||||
|
* along with this program; if not, write to the Free Software
|
||||||
|
* Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
|
||||||
|
*
|
||||||
|
* Note: much of this code was based on knowledge and/or code developed
|
||||||
|
* by the Xbox Linux group: http://www.xbox-linux.org
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include "freeldr.h"
|
||||||
|
#include "debug.h"
|
||||||
|
#include "rtl.h"
|
||||||
|
#include "machxbox.h"
|
||||||
|
|
||||||
|
static PVOID FrameBuffer;
|
||||||
|
static U32 ScreenWidth;
|
||||||
|
static U32 ScreenHeight;
|
||||||
|
static U32 BytesPerPixel;
|
||||||
|
static U32 Delta;
|
||||||
|
|
||||||
|
static unsigned CurrentCursorX;
|
||||||
|
static unsigned CurrentCursorY;
|
||||||
|
static unsigned CurrentFgColor;
|
||||||
|
static unsigned CurrentBgColor;
|
||||||
|
|
||||||
|
#define CHAR_WIDTH 8
|
||||||
|
#define CHAR_HEIGHT 16
|
||||||
|
|
||||||
|
#define TOP_BOTTOM_LINES 40
|
||||||
|
|
||||||
|
#define FB_SIZE_MB 4
|
||||||
|
|
||||||
|
#define MAKE_COLOR(Red, Green, Blue) (0xff000000 | (((Red) & 0xff) << 16) | (((Green) & 0xff) << 8) | ((Blue) & 0xff))
|
||||||
|
|
||||||
|
static VOID
|
||||||
|
XboxVideoOutputChar(U8 Char, unsigned X, unsigned Y, U32 FgColor, U32 BgColor)
|
||||||
|
{
|
||||||
|
PU8 FontPtr;
|
||||||
|
PU32 Pixel;
|
||||||
|
U8 Mask;
|
||||||
|
unsigned Line;
|
||||||
|
unsigned Col;
|
||||||
|
|
||||||
|
FontPtr = XboxFont8x16 + Char * 16;
|
||||||
|
Pixel = (PU32) ((char *) FrameBuffer + (Y * CHAR_HEIGHT + TOP_BOTTOM_LINES) * Delta
|
||||||
|
+ X * CHAR_WIDTH * BytesPerPixel);
|
||||||
|
for (Line = 0; Line < CHAR_HEIGHT; Line++)
|
||||||
|
{
|
||||||
|
Mask = 0x80;
|
||||||
|
for (Col = 0; Col < CHAR_WIDTH; Col++)
|
||||||
|
{
|
||||||
|
Pixel[Col] = (0 != (FontPtr[Line] & Mask) ? FgColor : BgColor);
|
||||||
|
Mask = Mask >> 1;
|
||||||
|
}
|
||||||
|
Pixel = (PU32) ((char *) Pixel + Delta);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
static U32
|
||||||
|
XboxVideoAttrToSingleColor(U8 Attr)
|
||||||
|
{
|
||||||
|
U8 Intensity;
|
||||||
|
|
||||||
|
Intensity = (0 == (Attr & 0x08) ? 127 : 255);
|
||||||
|
|
||||||
|
return 0xff000000 |
|
||||||
|
(0 == (Attr & 0x04) ? 0 : (Intensity << 16)) |
|
||||||
|
(0 == (Attr & 0x02) ? 0 : (Intensity << 8)) |
|
||||||
|
(0 == (Attr & 0x01) ? 0 : Intensity);
|
||||||
|
}
|
||||||
|
|
||||||
|
static VOID
|
||||||
|
XboxVideoAttrToColors(U8 Attr, U32 *FgColor, U32 *BgColor)
|
||||||
|
{
|
||||||
|
*FgColor = XboxVideoAttrToSingleColor(Attr & 0xf);
|
||||||
|
*BgColor = XboxVideoAttrToSingleColor((Attr >> 4) & 0xf);
|
||||||
|
}
|
||||||
|
|
||||||
|
static VOID
|
||||||
|
XboxVideoClearScreen(U32 Color, BOOL FullScreen)
|
||||||
|
{
|
||||||
|
U32 Line, Col;
|
||||||
|
PU32 p;
|
||||||
|
|
||||||
|
for (Line = 0; Line < ScreenHeight - (FullScreen ? 0 : 2 * TOP_BOTTOM_LINES); Line++)
|
||||||
|
{
|
||||||
|
p = (PU32) ((char *) FrameBuffer + (Line + (FullScreen ? 0 : TOP_BOTTOM_LINES)) * Delta);
|
||||||
|
for (Col = 0; Col < ScreenWidth; Col++)
|
||||||
|
{
|
||||||
|
*p++ = Color;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
VOID
|
||||||
|
XboxVideoClearScreenAttr(U8 Attr)
|
||||||
|
{
|
||||||
|
U32 FgColor, BgColor;
|
||||||
|
|
||||||
|
XboxVideoAttrToColors(Attr, &FgColor, &BgColor);
|
||||||
|
|
||||||
|
XboxVideoClearScreen(BgColor, FALSE);
|
||||||
|
}
|
||||||
|
|
||||||
|
VOID
|
||||||
|
XboxVideoPutChar(int c)
|
||||||
|
{
|
||||||
|
if ('\r' == c)
|
||||||
|
{
|
||||||
|
CurrentCursorX = 0;
|
||||||
|
}
|
||||||
|
else if ('\n' == c)
|
||||||
|
{
|
||||||
|
CurrentCursorX = 0;
|
||||||
|
CurrentCursorY++;
|
||||||
|
}
|
||||||
|
else if ('\t' == c)
|
||||||
|
{
|
||||||
|
CurrentCursorX = (CurrentCursorX + 8) & ~ 7;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
XboxVideoOutputChar(c, CurrentCursorX, CurrentCursorY, CurrentFgColor, CurrentBgColor);
|
||||||
|
CurrentCursorX++;
|
||||||
|
}
|
||||||
|
if (ScreenWidth / CHAR_WIDTH <= CurrentCursorX)
|
||||||
|
{
|
||||||
|
CurrentCursorX = 0;
|
||||||
|
CurrentCursorY++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
VOID
|
||||||
|
XboxVideoPutCharAttrAtLoc(int Ch, U8 Attr, unsigned X, unsigned Y)
|
||||||
|
{
|
||||||
|
U32 FgColor, BgColor;
|
||||||
|
|
||||||
|
XboxVideoAttrToColors(Attr, &FgColor, &BgColor);
|
||||||
|
|
||||||
|
XboxVideoOutputChar(Ch, X, Y, FgColor, BgColor);
|
||||||
|
}
|
||||||
|
|
||||||
|
VOID
|
||||||
|
XboxVideoInit(VOID)
|
||||||
|
{
|
||||||
|
FrameBuffer = (PVOID)((U32) XboxMemReserveMemory(FB_SIZE_MB) | 0xf0000000);
|
||||||
|
ScreenWidth = 640;
|
||||||
|
ScreenHeight = 480;
|
||||||
|
BytesPerPixel = 4;
|
||||||
|
Delta = (ScreenWidth * BytesPerPixel + 3) & ~ 0x3;
|
||||||
|
|
||||||
|
CurrentCursorX = 0;
|
||||||
|
CurrentCursorY = 0;
|
||||||
|
CurrentFgColor = MAKE_COLOR(192, 192, 192);
|
||||||
|
CurrentBgColor = MAKE_COLOR(0, 0, 0);
|
||||||
|
|
||||||
|
XboxVideoClearScreen(CurrentBgColor, TRUE);
|
||||||
|
|
||||||
|
/* Tell the nVidia controller about the framebuffer */
|
||||||
|
*((PU32) 0xfd600800) = (U32) FrameBuffer;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* EOF */
|
|
@ -22,6 +22,7 @@
|
||||||
#include <rtl.h>
|
#include <rtl.h>
|
||||||
#include <comm.h>
|
#include <comm.h>
|
||||||
#include <portio.h>
|
#include <portio.h>
|
||||||
|
#include <machine.h>
|
||||||
|
|
||||||
#ifdef DEBUG
|
#ifdef DEBUG
|
||||||
|
|
||||||
|
@ -75,6 +76,7 @@ VOID DebugInit(VOID)
|
||||||
|
|
||||||
VOID DebugPrintChar(UCHAR Character)
|
VOID DebugPrintChar(UCHAR Character)
|
||||||
{
|
{
|
||||||
|
extern VOID XboxVideoPutChar(char c);
|
||||||
if (Character == '\n')
|
if (Character == '\n')
|
||||||
{
|
{
|
||||||
DebugStartOfLine = TRUE;
|
DebugStartOfLine = TRUE;
|
||||||
|
@ -94,7 +96,7 @@ VOID DebugPrintChar(UCHAR Character)
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
putchar(Character);
|
MachPutChar(Character);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -230,26 +232,11 @@ VOID DebugPrintHeader(U32 Mask)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
VOID DebugPrint(U32 Mask, char *format, ...)
|
static VOID DebugPrintV(char *format, int *dataptr)
|
||||||
{
|
{
|
||||||
int *dataptr = (int *) &format;
|
|
||||||
char c, *ptr, str[16];
|
char c, *ptr, str[16];
|
||||||
int ll;
|
int ll;
|
||||||
|
|
||||||
// Mask out unwanted debug messages
|
|
||||||
if (!(Mask & DebugPrintMask))
|
|
||||||
{
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Print the header if we have started a new line
|
|
||||||
if (DebugStartOfLine)
|
|
||||||
{
|
|
||||||
DebugPrintHeader(Mask);
|
|
||||||
DebugStartOfLine = FALSE;
|
|
||||||
}
|
|
||||||
|
|
||||||
dataptr++;
|
|
||||||
ll = 0;
|
ll = 0;
|
||||||
while ((c = *(format++)))
|
while ((c = *(format++)))
|
||||||
{
|
{
|
||||||
|
@ -308,7 +295,7 @@ VOID DebugPrint(U32 Mask, char *format, ...)
|
||||||
DebugPrintChar(c);
|
DebugPrintChar(c);
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
DebugPrint(Mask, "\nDebugPrint() invalid format specifier - %%%c\n", c);
|
DebugPrint(DPRINT_WARNING, "\nDebugPrint() invalid format specifier - %%%c\n", c);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -322,6 +309,33 @@ VOID DebugPrint(U32 Mask, char *format, ...)
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
VOID DebugPrint(U32 Mask, char *format, ...)
|
||||||
|
{
|
||||||
|
int *dataptr = (int *) &format;
|
||||||
|
|
||||||
|
// Mask out unwanted debug messages
|
||||||
|
if (!(Mask & DebugPrintMask))
|
||||||
|
{
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Print the header if we have started a new line
|
||||||
|
if (DebugStartOfLine)
|
||||||
|
{
|
||||||
|
DebugPrintHeader(Mask);
|
||||||
|
DebugStartOfLine = FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
|
DebugPrintV(format, ++dataptr);
|
||||||
|
}
|
||||||
|
|
||||||
|
VOID DebugPrint1(char *format, ...)
|
||||||
|
{
|
||||||
|
int *dataptr = (int *) &format;
|
||||||
|
|
||||||
|
DebugPrintV(format, ++dataptr);
|
||||||
|
}
|
||||||
|
|
||||||
VOID DebugDumpBuffer(U32 Mask, PVOID Buffer, U32 Length)
|
VOID DebugDumpBuffer(U32 Mask, PVOID Buffer, U32 Length)
|
||||||
{
|
{
|
||||||
PUCHAR BufPtr = (PUCHAR)Buffer;
|
PUCHAR BufPtr = (PUCHAR)Buffer;
|
||||||
|
|
|
@ -20,6 +20,7 @@
|
||||||
#include <freeldr.h>
|
#include <freeldr.h>
|
||||||
#include <rtl.h>
|
#include <rtl.h>
|
||||||
#include <arch.h>
|
#include <arch.h>
|
||||||
|
#include <machine.h>
|
||||||
#include <mm.h>
|
#include <mm.h>
|
||||||
#include <debug.h>
|
#include <debug.h>
|
||||||
#include <bootmgr.h>
|
#include <bootmgr.h>
|
||||||
|
@ -30,11 +31,9 @@ VOID BootMain(char *CmdLine)
|
||||||
{
|
{
|
||||||
CmdLineParse(CmdLine);
|
CmdLineParse(CmdLine);
|
||||||
|
|
||||||
EnableA20();
|
MachInit();
|
||||||
|
|
||||||
#ifdef DEBUG
|
|
||||||
DebugInit();
|
DebugInit();
|
||||||
#endif
|
|
||||||
|
|
||||||
DbgPrint((DPRINT_WARNING, "BootMain() called. BootDrive = 0x%x BootPartition = %d\n", BootDrive, BootPartition));
|
DbgPrint((DPRINT_WARNING, "BootMain() called. BootDrive = 0x%x BootPartition = %d\n", BootDrive, BootPartition));
|
||||||
|
|
||||||
|
|
|
@ -23,24 +23,26 @@
|
||||||
|
|
||||||
#ifdef DEBUG
|
#ifdef DEBUG
|
||||||
|
|
||||||
#define DPRINT_NONE 0x00000000 // No debug print
|
#define DPRINT_NONE 0x00000000 // No debug print
|
||||||
#define DPRINT_WARNING 0x00000001 // OR this with DebugPrintMask to enable debugger messages and other misc stuff
|
#define DPRINT_WARNING 0x00000001 // OR this with DebugPrintMask to enable debugger messages and other misc stuff
|
||||||
#define DPRINT_MEMORY 0x00000002 // OR this with DebugPrintMask to enable memory management messages
|
#define DPRINT_MEMORY 0x00000002 // OR this with DebugPrintMask to enable memory management messages
|
||||||
#define DPRINT_FILESYSTEM 0x00000004 // OR this with DebugPrintMask to enable file system messages
|
#define DPRINT_FILESYSTEM 0x00000004 // OR this with DebugPrintMask to enable file system messages
|
||||||
#define DPRINT_INIFILE 0x00000008 // OR this with DebugPrintMask to enable .ini file messages
|
#define DPRINT_INIFILE 0x00000008 // OR this with DebugPrintMask to enable .ini file messages
|
||||||
#define DPRINT_UI 0x00000010 // OR this with DebugPrintMask to enable user interface messages
|
#define DPRINT_UI 0x00000010 // OR this with DebugPrintMask to enable user interface messages
|
||||||
#define DPRINT_DISK 0x00000020 // OR this with DebugPrintMask to enable disk messages
|
#define DPRINT_DISK 0x00000020 // OR this with DebugPrintMask to enable disk messages
|
||||||
#define DPRINT_CACHE 0x00000040 // OR this with DebugPrintMask to enable cache messages
|
#define DPRINT_CACHE 0x00000040 // OR this with DebugPrintMask to enable cache messages
|
||||||
#define DPRINT_REGISTRY 0x00000080 // OR this with DebugPrintMask to enable registry messages
|
#define DPRINT_REGISTRY 0x00000080 // OR this with DebugPrintMask to enable registry messages
|
||||||
#define DPRINT_REACTOS 0x00000100 // OR this with DebugPrintMask to enable ReactOS messages
|
#define DPRINT_REACTOS 0x00000100 // OR this with DebugPrintMask to enable ReactOS messages
|
||||||
#define DPRINT_LINUX 0x00000200 // OR this with DebugPrintMask to enable Linux messages
|
#define DPRINT_LINUX 0x00000200 // OR this with DebugPrintMask to enable Linux messages
|
||||||
#define DPRINT_HWDETECT 0x00000400 // OR this with DebugPrintMask to enable hardware detection messages
|
#define DPRINT_HWDETECT 0x00000400 // OR this with DebugPrintMask to enable hardware detection messages
|
||||||
|
|
||||||
VOID DebugInit(VOID);
|
VOID DebugInit(VOID);
|
||||||
VOID DebugPrint(U32 Mask, char *format, ...);
|
VOID DebugPrint(U32 Mask, char *format, ...);
|
||||||
|
VOID DebugPrint1(char *format, ...);
|
||||||
VOID DebugDumpBuffer(U32 Mask, PVOID Buffer, U32 Length);
|
VOID DebugDumpBuffer(U32 Mask, PVOID Buffer, U32 Length);
|
||||||
|
|
||||||
#define DbgPrint(_x_) DebugPrint _x_ ;
|
#define DbgPrint(_x_) DebugPrint _x_ ;
|
||||||
|
#define DPRINT1 DebugPrint1
|
||||||
#define BugCheck(_x_) { DebugPrint(DPRINT_WARNING, "Fatal Error: %s:%d(%s)\n", __FILE__, __LINE__, __FUNCTION__); DebugPrint _x_ ; for (;;); }
|
#define BugCheck(_x_) { DebugPrint(DPRINT_WARNING, "Fatal Error: %s:%d(%s)\n", __FILE__, __LINE__, __FUNCTION__); DebugPrint _x_ ; for (;;); }
|
||||||
#define DbgDumpBuffer(_x_, _y_, _z_) DebugDumpBuffer(_x_, _y_, _z_)
|
#define DbgDumpBuffer(_x_, _y_, _z_) DebugDumpBuffer(_x_, _y_, _z_)
|
||||||
|
|
||||||
|
@ -73,7 +75,9 @@ void MEMORY_WRITE_BREAKPOINT4(unsigned long addr);
|
||||||
|
|
||||||
#else
|
#else
|
||||||
|
|
||||||
|
#define DebugInit()
|
||||||
#define DbgPrint(_x_)
|
#define DbgPrint(_x_)
|
||||||
|
#define DPRINT1(_x_)
|
||||||
#define BugCheck(_x_)
|
#define BugCheck(_x_)
|
||||||
#define DbgDumpBuffer(_x_, _y_, _z_)
|
#define DbgDumpBuffer(_x_, _y_, _z_)
|
||||||
|
|
||||||
|
|
47
freeldr/freeldr/include/machine.h
Normal file
47
freeldr/freeldr/include/machine.h
Normal file
|
@ -0,0 +1,47 @@
|
||||||
|
/* $Id: machine.h,v 1.1 2004/11/08 22:02:48 gvg Exp $
|
||||||
|
*
|
||||||
|
* FreeLoader
|
||||||
|
*
|
||||||
|
* This program is free software; you can redistribute it and/or modify
|
||||||
|
* it under the terms of the GNU General Public License as published by
|
||||||
|
* the Free Software Foundation; either version 2 of the License, or
|
||||||
|
* (at your option) any later version.
|
||||||
|
*
|
||||||
|
* This program is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
* GNU General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU General Public License
|
||||||
|
* along with this program; if not, write to the Free Software
|
||||||
|
* Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef __MACHINE_H_
|
||||||
|
#define __MACHINE_H_
|
||||||
|
|
||||||
|
#ifndef __MEMORY_H
|
||||||
|
#include "mm.h"
|
||||||
|
#endif
|
||||||
|
|
||||||
|
typedef struct tagMACHVTBL
|
||||||
|
{
|
||||||
|
VOID (*ClearScreenAttr)(U8 Attr);
|
||||||
|
VOID (*PutChar)(int Ch);
|
||||||
|
VOID (*PutCharAttrAtLoc)(int Ch, U8 Attr, unsigned X, unsigned Y);
|
||||||
|
|
||||||
|
U32 (*GetMemoryMap)(PBIOS_MEMORY_MAP BiosMemoryMap, U32 MaxMemoryMapSize);
|
||||||
|
} MACHVTBL, *PMACHVTBL;
|
||||||
|
|
||||||
|
VOID MachInit(VOID);
|
||||||
|
|
||||||
|
extern MACHVTBL MachVtbl;
|
||||||
|
|
||||||
|
#define MachClearScreenAttr(Attr) MachVtbl.ClearScreenAttr(Attr)
|
||||||
|
#define MachPutChar(Ch) MachVtbl.PutChar(Ch)
|
||||||
|
#define MachPutCharAttrAtLoc(Ch, Attr, X, Y) MachVtbl.PutCharAttrAtLoc((Ch), (Attr), (X), (Y))
|
||||||
|
#define MachGetMemoryMap(MMap, Size) MachVtbl.GetMemoryMap((MMap), (Size))
|
||||||
|
|
||||||
|
#endif /* __MACHINE_H_ */
|
||||||
|
|
||||||
|
/* EOF */
|
|
@ -38,13 +38,6 @@ typedef struct
|
||||||
|
|
||||||
U32 GetSystemMemorySize(VOID); // Returns the amount of total memory in the system
|
U32 GetSystemMemorySize(VOID); // Returns the amount of total memory in the system
|
||||||
|
|
||||||
// These functions are implemented in mem.S
|
|
||||||
U32 GetExtendedMemorySize(VOID); // Returns extended memory size in KB
|
|
||||||
U32 GetConventionalMemorySize(VOID); // Returns conventional memory size in KB
|
|
||||||
U32 GetBiosMemoryMap(PBIOS_MEMORY_MAP BiosMemoryMap, U32 MaxMemoryMapSize); // Fills structure with BIOS memory map and returns memory map item count
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
//BOOL MmInitializeMemoryManager(U32 LowMemoryStart, U32 LowMemoryLength);
|
//BOOL MmInitializeMemoryManager(U32 LowMemoryStart, U32 LowMemoryLength);
|
||||||
BOOL MmInitializeMemoryManager(VOID);
|
BOOL MmInitializeMemoryManager(VOID);
|
||||||
|
|
|
@ -72,7 +72,6 @@ int isxdigit(int c);
|
||||||
char * convert_to_ascii(char *buf, int c, ...);
|
char * convert_to_ascii(char *buf, int c, ...);
|
||||||
char * convert_i64_to_ascii(char *buf, int c, ...);
|
char * convert_i64_to_ascii(char *buf, int c, ...);
|
||||||
|
|
||||||
void putchar(int ch); // Implemented in asmcode.S
|
|
||||||
int kbhit(void); // Implemented in asmcode.S
|
int kbhit(void); // Implemented in asmcode.S
|
||||||
int getch(void); // Implemented in asmcode.S
|
int getch(void); // Implemented in asmcode.S
|
||||||
int getyear(void); // Implemented in asmcode.S
|
int getyear(void); // Implemented in asmcode.S
|
||||||
|
|
51
freeldr/freeldr/machine.c
Normal file
51
freeldr/freeldr/machine.c
Normal file
|
@ -0,0 +1,51 @@
|
||||||
|
/* $Id: machine.c,v 1.1 2004/11/08 22:02:47 gvg Exp $
|
||||||
|
*
|
||||||
|
* FreeLoader
|
||||||
|
*
|
||||||
|
* This program is free software; you can redistribute it and/or modify
|
||||||
|
* it under the terms of the GNU General Public License as published by
|
||||||
|
* the Free Software Foundation; either version 2 of the License, or
|
||||||
|
* (at your option) any later version.
|
||||||
|
*
|
||||||
|
* This program is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
* GNU General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU General Public License
|
||||||
|
* along with this program; if not, write to the Free Software
|
||||||
|
* Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include "freeldr.h"
|
||||||
|
#include "machine.h"
|
||||||
|
|
||||||
|
#undef MachClearScreenAttr
|
||||||
|
#undef MachPutChar
|
||||||
|
#undef MachPutCharAttrAtLoc
|
||||||
|
#undef MachGetMemoryMap
|
||||||
|
|
||||||
|
MACHVTBL MachVtbl;
|
||||||
|
|
||||||
|
void
|
||||||
|
MachClearScreenAttr(U8 Attr)
|
||||||
|
{
|
||||||
|
MachVtbl.ClearScreenAttr(Attr);
|
||||||
|
}
|
||||||
|
|
||||||
|
void MachPutChar(int Ch)
|
||||||
|
{
|
||||||
|
MachVtbl.PutChar(Ch);
|
||||||
|
}
|
||||||
|
|
||||||
|
void MachPutCharAttrAtLoc(int Ch, U8 Attr, unsigned X, unsigned Y)
|
||||||
|
{
|
||||||
|
MachVtbl.PutCharAttrAtLoc(Ch, Attr, X, Y);
|
||||||
|
}
|
||||||
|
|
||||||
|
U32 MachGetMemoryMap(PBIOS_MEMORY_MAP BiosMemoryMap, U32 MaxMemoryMapSize)
|
||||||
|
{
|
||||||
|
return MachVtbl.GetMemoryMap(BiosMemoryMap, MaxMemoryMapSize);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* EOF */
|
|
@ -24,6 +24,7 @@
|
||||||
#include <rtl.h>
|
#include <rtl.h>
|
||||||
#include <debug.h>
|
#include <debug.h>
|
||||||
#include <ui.h>
|
#include <ui.h>
|
||||||
|
#include <machine.h>
|
||||||
|
|
||||||
|
|
||||||
#ifdef DEBUG
|
#ifdef DEBUG
|
||||||
|
@ -52,20 +53,16 @@ U32 LastFreePageHint = 0;
|
||||||
BOOL MmInitializeMemoryManager(VOID)
|
BOOL MmInitializeMemoryManager(VOID)
|
||||||
{
|
{
|
||||||
BIOS_MEMORY_MAP BiosMemoryMap[32];
|
BIOS_MEMORY_MAP BiosMemoryMap[32];
|
||||||
U32 BiosMemoryMapEntryCount;
|
U32 BiosMemoryMapEntryCount;
|
||||||
U32 ExtendedMemorySize;
|
|
||||||
U32 ConventionalMemorySize;
|
|
||||||
#ifdef DEBUG
|
#ifdef DEBUG
|
||||||
U32 Index;
|
U32 Index;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
DbgPrint((DPRINT_MEMORY, "Initializing Memory Manager.\n"));
|
DbgPrint((DPRINT_MEMORY, "Initializing Memory Manager.\n"));
|
||||||
|
|
||||||
RtlZeroMemory(BiosMemoryMap, sizeof(BIOS_MEMORY_MAP) * 32);
|
RtlZeroMemory(BiosMemoryMap, sizeof(BIOS_MEMORY_MAP) * 32);
|
||||||
|
|
||||||
BiosMemoryMapEntryCount = GetBiosMemoryMap(BiosMemoryMap, 32);
|
BiosMemoryMapEntryCount = MachGetMemoryMap(BiosMemoryMap, sizeof(BiosMemoryMap) / sizeof(BIOS_MEMORY_MAP));
|
||||||
ExtendedMemorySize = GetExtendedMemorySize();
|
|
||||||
ConventionalMemorySize = GetConventionalMemorySize();
|
|
||||||
|
|
||||||
#ifdef DEBUG
|
#ifdef DEBUG
|
||||||
// Dump the system memory map
|
// Dump the system memory map
|
||||||
|
@ -77,13 +74,6 @@ BOOL MmInitializeMemoryManager(VOID)
|
||||||
DbgPrint((DPRINT_MEMORY, "%x%x\t %x%x\t %s\n", BiosMemoryMap[Index].BaseAddress, BiosMemoryMap[Index].Length, MmGetSystemMemoryMapTypeString(BiosMemoryMap[Index].Type)));
|
DbgPrint((DPRINT_MEMORY, "%x%x\t %x%x\t %s\n", BiosMemoryMap[Index].BaseAddress, BiosMemoryMap[Index].Length, MmGetSystemMemoryMapTypeString(BiosMemoryMap[Index].Type)));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else
|
|
||||||
{
|
|
||||||
DbgPrint((DPRINT_MEMORY, "GetBiosMemoryMap() not supported.\n"));
|
|
||||||
}
|
|
||||||
|
|
||||||
DbgPrint((DPRINT_MEMORY, "Extended memory size: %d KB\n", ExtendedMemorySize));
|
|
||||||
DbgPrint((DPRINT_MEMORY, "Conventional memory size: %d KB\n", ConventionalMemorySize));
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
// If we got the system memory map then fixup invalid entries
|
// If we got the system memory map then fixup invalid entries
|
||||||
|
@ -92,19 +82,6 @@ BOOL MmInitializeMemoryManager(VOID)
|
||||||
MmFixupSystemMemoryMap(BiosMemoryMap, &BiosMemoryMapEntryCount);
|
MmFixupSystemMemoryMap(BiosMemoryMap, &BiosMemoryMapEntryCount);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Since I don't feel like writing two sets of routines
|
|
||||||
// one to handle the BiosMemoryMap structure and another
|
|
||||||
// to handle just a flat extended memory size I'm going
|
|
||||||
// to create a 'fake' memory map entry out of the
|
|
||||||
// extended memory size if GetBiosMemoryMap() fails.
|
|
||||||
//if (BiosMemoryMapEntryCount == 0)
|
|
||||||
{
|
|
||||||
BiosMemoryMap[0].BaseAddress = 0x100000; // Start at 1MB
|
|
||||||
BiosMemoryMap[0].Length = ExtendedMemorySize * 1024;
|
|
||||||
BiosMemoryMap[0].Type = MEMTYPE_USABLE;
|
|
||||||
BiosMemoryMapEntryCount = 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
TotalPagesInLookupTable = MmGetAddressablePageCountIncludingHoles(BiosMemoryMap, BiosMemoryMapEntryCount);
|
TotalPagesInLookupTable = MmGetAddressablePageCountIncludingHoles(BiosMemoryMap, BiosMemoryMapEntryCount);
|
||||||
PageLookupTableAddress = MmFindLocationForPageLookupTable(BiosMemoryMap, BiosMemoryMapEntryCount);
|
PageLookupTableAddress = MmFindLocationForPageLookupTable(BiosMemoryMap, BiosMemoryMapEntryCount);
|
||||||
LastFreePageHint = TotalPagesInLookupTable;
|
LastFreePageHint = TotalPagesInLookupTable;
|
||||||
|
@ -159,7 +136,7 @@ PVOID MmGetEndAddressOfAnyMemory(PBIOS_MEMORY_MAP BiosMemoryMap, U32 MapCount)
|
||||||
EndAddressOfMemory = 0;
|
EndAddressOfMemory = 0;
|
||||||
for (Index=0; Index<MapCount; Index++)
|
for (Index=0; Index<MapCount; Index++)
|
||||||
{
|
{
|
||||||
if (MaxStartAddressSoFar < BiosMemoryMap[Index].BaseAddress)
|
if (MaxStartAddressSoFar <= BiosMemoryMap[Index].BaseAddress)
|
||||||
{
|
{
|
||||||
MaxStartAddressSoFar = BiosMemoryMap[Index].BaseAddress;
|
MaxStartAddressSoFar = BiosMemoryMap[Index].BaseAddress;
|
||||||
EndAddressOfMemory = (MaxStartAddressSoFar + BiosMemoryMap[Index].Length);
|
EndAddressOfMemory = (MaxStartAddressSoFar + BiosMemoryMap[Index].Length);
|
||||||
|
|
|
@ -28,6 +28,7 @@
|
||||||
#include <ui.h>
|
#include <ui.h>
|
||||||
#include <multiboot.h>
|
#include <multiboot.h>
|
||||||
#include <mm.h>
|
#include <mm.h>
|
||||||
|
#include <machine.h>
|
||||||
#include <inifile.h>
|
#include <inifile.h>
|
||||||
|
|
||||||
#include "registry.h"
|
#include "registry.h"
|
||||||
|
@ -604,22 +605,35 @@ LoadAndBootReactOS(PUCHAR OperatingSystemName)
|
||||||
* Setup multiboot information structure
|
* Setup multiboot information structure
|
||||||
*/
|
*/
|
||||||
mb_info.flags = MB_INFO_FLAG_MEM_SIZE | MB_INFO_FLAG_BOOT_DEVICE | MB_INFO_FLAG_COMMAND_LINE | MB_INFO_FLAG_MODULES;
|
mb_info.flags = MB_INFO_FLAG_MEM_SIZE | MB_INFO_FLAG_BOOT_DEVICE | MB_INFO_FLAG_COMMAND_LINE | MB_INFO_FLAG_MODULES;
|
||||||
mb_info.mem_lower = GetConventionalMemorySize();
|
|
||||||
mb_info.mem_upper = GetExtendedMemorySize();
|
|
||||||
mb_info.boot_device = 0xffffffff;
|
mb_info.boot_device = 0xffffffff;
|
||||||
mb_info.cmdline = (unsigned long)multiboot_kernel_cmdline;
|
mb_info.cmdline = (unsigned long)multiboot_kernel_cmdline;
|
||||||
mb_info.mods_count = 0;
|
mb_info.mods_count = 0;
|
||||||
mb_info.mods_addr = (unsigned long)multiboot_modules;
|
mb_info.mods_addr = (unsigned long)multiboot_modules;
|
||||||
mb_info.mmap_length = (unsigned long)GetBiosMemoryMap((PBIOS_MEMORY_MAP)(PVOID)&multiboot_memory_map, 32) * sizeof(memory_map_t);
|
mb_info.mmap_length = (unsigned long)MachGetMemoryMap((PBIOS_MEMORY_MAP)(PVOID)&multiboot_memory_map, 32) * sizeof(memory_map_t);
|
||||||
if (mb_info.mmap_length)
|
if (mb_info.mmap_length)
|
||||||
{
|
{
|
||||||
mb_info.mmap_addr = (unsigned long)&multiboot_memory_map;
|
mb_info.mmap_addr = (unsigned long)&multiboot_memory_map;
|
||||||
mb_info.flags |= MB_INFO_FLAG_MEMORY_MAP;
|
mb_info.flags |= MB_INFO_FLAG_MEM_SIZE | MB_INFO_FLAG_MEMORY_MAP;
|
||||||
multiboot_memory_map_descriptor_size = sizeof(memory_map_t); // GetBiosMemoryMap uses a fixed value of 24
|
multiboot_memory_map_descriptor_size = sizeof(memory_map_t); // GetBiosMemoryMap uses a fixed value of 24
|
||||||
DbgPrint((DPRINT_REACTOS, "memory map length: %d\n", mb_info.mmap_length));
|
DbgPrint((DPRINT_REACTOS, "memory map length: %d\n", mb_info.mmap_length));
|
||||||
DbgPrint((DPRINT_REACTOS, "dumping memory map:\n"));
|
DbgPrint((DPRINT_REACTOS, "dumping memory map:\n"));
|
||||||
for (i=0; i<(mb_info.mmap_length/sizeof(memory_map_t)); i++)
|
for (i=0; i<(mb_info.mmap_length/sizeof(memory_map_t)); i++)
|
||||||
{
|
{
|
||||||
|
if (MEMTYPE_USABLE == multiboot_memory_map[i].type &&
|
||||||
|
0 == multiboot_memory_map[i].base_addr_low)
|
||||||
|
{
|
||||||
|
mb_info.mem_lower = (multiboot_memory_map[i].base_addr_low + multiboot_memory_map[i].length_low) / 1024;
|
||||||
|
if (640 < mb_info.mem_lower)
|
||||||
|
{
|
||||||
|
mb_info.mem_lower = 640;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (MEMTYPE_USABLE == multiboot_memory_map[i].type &&
|
||||||
|
multiboot_memory_map[i].base_addr_low <= 1024 * 1024 &&
|
||||||
|
1024 * 1024 <= multiboot_memory_map[i].base_addr_low + multiboot_memory_map[i].length_low)
|
||||||
|
{
|
||||||
|
mb_info.mem_upper = (multiboot_memory_map[i].base_addr_low + multiboot_memory_map[i].length_low) / 1024 - 1024;
|
||||||
|
}
|
||||||
DbgPrint((DPRINT_REACTOS, "start: %x\t size: %x\t type %d\n",
|
DbgPrint((DPRINT_REACTOS, "start: %x\t size: %x\t type %d\n",
|
||||||
multiboot_memory_map[i].base_addr_low,
|
multiboot_memory_map[i].base_addr_low,
|
||||||
multiboot_memory_map[i].length_low,
|
multiboot_memory_map[i].length_low,
|
||||||
|
|
|
@ -27,6 +27,7 @@
|
||||||
#include <fs.h>
|
#include <fs.h>
|
||||||
#include <multiboot.h>
|
#include <multiboot.h>
|
||||||
#include <mm.h>
|
#include <mm.h>
|
||||||
|
#include <machine.h>
|
||||||
#include <ui.h>
|
#include <ui.h>
|
||||||
#include <inffile.h>
|
#include <inffile.h>
|
||||||
|
|
||||||
|
@ -238,40 +239,48 @@ VOID RunLoader(VOID)
|
||||||
U32 Size;
|
U32 Size;
|
||||||
char *SourcePath;
|
char *SourcePath;
|
||||||
char *LoadOptions;
|
char *LoadOptions;
|
||||||
|
int i;
|
||||||
|
|
||||||
HINF InfHandle;
|
HINF InfHandle;
|
||||||
U32 ErrorLine;
|
U32 ErrorLine;
|
||||||
INFCONTEXT InfContext;
|
INFCONTEXT InfContext;
|
||||||
|
|
||||||
/* Setup multiboot information structure */
|
/* Setup multiboot information structure */
|
||||||
mb_info.flags = MB_INFO_FLAG_MEM_SIZE | MB_INFO_FLAG_BOOT_DEVICE | MB_INFO_FLAG_COMMAND_LINE | MB_INFO_FLAG_MODULES;
|
mb_info.flags = MB_INFO_FLAG_BOOT_DEVICE | MB_INFO_FLAG_COMMAND_LINE | MB_INFO_FLAG_MODULES;
|
||||||
mb_info.mem_lower = GetConventionalMemorySize();
|
|
||||||
mb_info.mem_upper = GetExtendedMemorySize();
|
|
||||||
mb_info.boot_device = 0xffffffff;
|
mb_info.boot_device = 0xffffffff;
|
||||||
mb_info.cmdline = (unsigned long)multiboot_kernel_cmdline;
|
mb_info.cmdline = (unsigned long)multiboot_kernel_cmdline;
|
||||||
mb_info.mods_count = 0;
|
mb_info.mods_count = 0;
|
||||||
mb_info.mods_addr = (unsigned long)multiboot_modules;
|
mb_info.mods_addr = (unsigned long)multiboot_modules;
|
||||||
mb_info.mmap_length = (unsigned long)GetBiosMemoryMap((PBIOS_MEMORY_MAP)(PVOID)&multiboot_memory_map, 32) * sizeof(memory_map_t);
|
mb_info.mmap_length = (unsigned long)MachGetMemoryMap((PBIOS_MEMORY_MAP)(PVOID)&multiboot_memory_map, 32) * sizeof(memory_map_t);
|
||||||
if (mb_info.mmap_length)
|
if (mb_info.mmap_length)
|
||||||
{
|
{
|
||||||
mb_info.mmap_addr = (unsigned long)&multiboot_memory_map;
|
mb_info.mmap_addr = (unsigned long)&multiboot_memory_map;
|
||||||
mb_info.flags |= MB_INFO_FLAG_MEMORY_MAP;
|
mb_info.flags |= MB_INFO_FLAG_MEM_SIZE | MB_INFO_FLAG_MEMORY_MAP;
|
||||||
multiboot_memory_map_descriptor_size = sizeof(memory_map_t); // GetBiosMemoryMap uses a fixed value of 24
|
multiboot_memory_map_descriptor_size = sizeof(memory_map_t); // GetBiosMemoryMap uses a fixed value of 24
|
||||||
|
for (i = 0; i < (mb_info.mmap_length / sizeof(memory_map_t)); i++)
|
||||||
|
{
|
||||||
|
if (MEMTYPE_USABLE == multiboot_memory_map[i].type &&
|
||||||
|
0 == multiboot_memory_map[i].base_addr_low)
|
||||||
|
{
|
||||||
|
mb_info.mem_lower = (multiboot_memory_map[i].base_addr_low + multiboot_memory_map[i].length_low) / 1024;
|
||||||
|
if (640 < mb_info.mem_lower)
|
||||||
|
{
|
||||||
|
mb_info.mem_lower = 640;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (MEMTYPE_USABLE == multiboot_memory_map[i].type &&
|
||||||
|
multiboot_memory_map[i].base_addr_low <= 1024 * 1024 &&
|
||||||
|
1024 * 1024 <= multiboot_memory_map[i].base_addr_low + multiboot_memory_map[i].length_low)
|
||||||
|
{
|
||||||
|
mb_info.mem_upper = (multiboot_memory_map[i].base_addr_low + multiboot_memory_map[i].length_low) / 1024 - 1024;
|
||||||
|
}
|
||||||
#if 0
|
#if 0
|
||||||
{
|
|
||||||
int i;
|
|
||||||
printf("memory map length: %d\n", mb_info.mmap_length);
|
|
||||||
printf("dumping memory map:\n");
|
|
||||||
for (i=0; i<(mb_info.mmap_length / sizeof(memory_map_t)); i++)
|
|
||||||
{
|
|
||||||
printf("start: %x\t size: %x\t type %d\n",
|
printf("start: %x\t size: %x\t type %d\n",
|
||||||
multiboot_memory_map[i].base_addr_low,
|
multiboot_memory_map[i].base_addr_low,
|
||||||
multiboot_memory_map[i].length_low,
|
multiboot_memory_map[i].length_low,
|
||||||
multiboot_memory_map[i].type);
|
multiboot_memory_map[i].type);
|
||||||
}
|
|
||||||
getch();
|
|
||||||
}
|
|
||||||
#endif
|
#endif
|
||||||
|
}
|
||||||
}
|
}
|
||||||
#if 0
|
#if 0
|
||||||
printf("low_mem = %d\n", mb_info.mem_lower);
|
printf("low_mem = %d\n", mb_info.mem_lower);
|
||||||
|
|
|
@ -17,6 +17,8 @@
|
||||||
* Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
|
* Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
#include <freeldr.h>
|
||||||
|
#include <machine.h>
|
||||||
#include <rtl.h>
|
#include <rtl.h>
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
@ -27,7 +29,7 @@ void print(char *str)
|
||||||
int i;
|
int i;
|
||||||
|
|
||||||
for (i = 0; i < strlen(str); i++)
|
for (i = 0; i < strlen(str); i++)
|
||||||
putchar(str[i]);
|
MachPutChar(str[i]);
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
@ -46,7 +48,7 @@ void printf(char *format, ... )
|
||||||
{
|
{
|
||||||
if (c != '%')
|
if (c != '%')
|
||||||
{
|
{
|
||||||
putchar(c);
|
MachPutChar(c);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
@ -75,22 +77,22 @@ void printf(char *format, ... )
|
||||||
|
|
||||||
while (*ptr)
|
while (*ptr)
|
||||||
{
|
{
|
||||||
putchar(*(ptr++));
|
MachPutChar(*(ptr++));
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case 'c': putchar((*(dataptr++))&0xff); break;
|
case 'c': MachPutChar((*(dataptr++))&0xff); break;
|
||||||
|
|
||||||
case 's':
|
case 's':
|
||||||
ptr = (char *)(*(dataptr++));
|
ptr = (char *)(*(dataptr++));
|
||||||
|
|
||||||
while ((c = *(ptr++)))
|
while ((c = *(ptr++)))
|
||||||
{
|
{
|
||||||
putchar(c);
|
MachPutChar(c);
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case '%':
|
case '%':
|
||||||
putchar(c);
|
MachPutChar(c);
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
printf("\nprintf() invalid format specifier - %%%c\n", c);
|
printf("\nprintf() invalid format specifier - %%%c\n", c);
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue