| Commit in freeldr on MAIN | |||
| Makefile | +4 | 1.7 -> 1.8 | |
| freeldr/machine.c | +51 | added 1.1 | |
| /Makefile | +10 | -2 | 1.53 -> 1.54 |
| /debug.c | +32 | -18 | 1.21 -> 1.22 |
| /freeldr.c | +2 | -3 | 1.28 -> 1.29 |
| freeldr/arch/i386/archmach.c | +50 | added 1.1 | |
| /machpc.c | +39 | added 1.1 | |
| /machpc.h | +39 | added 1.1 | |
| /machxbox.c | +37 | added 1.1 | |
| /machxbox.h | +42 | added 1.1 | |
| /pccons.c | +98 | added 1.1 | |
| /pcmem.c | +252 | added 1.1 | |
| /xboxfont.c | +286 | added 1.1 | |
| /xboxmem.c | +144 | added 1.1 | |
| /xboxvideo.c | +176 | added 1.1 | |
| /hardware.h | +6 | 1.5 -> 1.6 | |
| /i386rtl.c | -39 | 1.2 -> 1.3 | |
| /i386trap.S | +40 | -57 | 1.5 -> 1.6 |
| /i386mem.c | -216 | 1.4 removed | |
| freeldr/include/machine.h | +47 | added 1.1 | |
| /debug.h | +11 | -7 | 1.7 -> 1.8 |
| /mm.h | -7 | 1.11 -> 1.12 | |
| /rtl.h | -1 | 1.8 -> 1.9 | |
| freeldr/mm/meminit.c | +5 | -28 | 1.13 -> 1.14 |
| freeldr/reactos/reactos.c | +18 | -4 | 1.38 -> 1.39 |
| /setupldr.c | +23 | -14 | 1.15 -> 1.16 |
| freeldr/rtl/print.c | +8 | -6 | 1.7 -> 1.8 |
| +1420 | -402 | ||
Support video and memory detection on the Xbox
diff -u -r1.7 -r1.8 --- Makefile 1 Jun 2004 01:21:06 -0000 1.7 +++ Makefile 8 Nov 2004 22:02:47 -0000 1.8 @@ -31,6 +31,10 @@
$(MAKE) -C install $(MAKE) -C fdebug
+freeldr: + $(MAKE) -C freeldr +.PHONY : freeldr +
clean: $(MAKE) -C bootsect clean $(MAKE) -C freeldr clean
diff -N machine.c --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ machine.c 8 Nov 2004 22:02:47 -0000 1.1 @@ -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 */
diff -u -r1.53 -r1.54 --- Makefile 1 Nov 2004 20:49:32 -0000 1.53 +++ Makefile 8 Nov 2004 22:02:47 -0000 1.54 @@ -200,7 +200,6 @@
boot.o \ linux.o \ mb.o \
- i386mem.o \
i386rtl.o \ i386vid.o \ drvmap.o \
@@ -210,6 +209,14 @@
hardware.o \ hwcpu.o \ hwpci.o \
+ archmach.o \ + machpc.o \ + machxbox.o \ + pccons.o \ + pcmem.o \ + xboxfont.o \ + xboxmem.o \ + xboxvideo.o \
_alloca.o # For Mingw32 builds
@@ -272,7 +279,8 @@
debug.o \ multiboot.o \ version.o \
- cmdline.o
+ cmdline.o \
+ machine.o
FREELDR_OBJS= bootmgr.o \ drivemap.o \
diff -u -r1.21 -r1.22 --- debug.c 17 May 2004 20:25:01 -0000 1.21 +++ debug.c 8 Nov 2004 22:02:47 -0000 1.22 @@ -22,6 +22,7 @@
#include <rtl.h> #include <comm.h> #include <portio.h>
+#include <machine.h>
#ifdef DEBUG
@@ -75,6 +76,7 @@
VOID DebugPrintChar(UCHAR Character)
{
+extern VOID XboxVideoPutChar(char c);
if (Character == '\n')
{
DebugStartOfLine = TRUE;
@@ -94,7 +96,7 @@
}
else
{
- putchar(Character);
+ MachPutChar(Character);
} }
@@ -230,26 +232,11 @@
} }
-VOID DebugPrint(U32 Mask, char *format, ...)
+static VOID DebugPrintV(char *format, int *dataptr)
{
- int *dataptr = (int *) &format;
char c, *ptr, str[16]; 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;
while ((c = *(format++)))
{
@@ -308,7 +295,7 @@
DebugPrintChar(c); break; default:
- DebugPrint(Mask, "\nDebugPrint() invalid format specifier - %%%c\n", c);
+ DebugPrint(DPRINT_WARNING, "\nDebugPrint() invalid format specifier - %%%c\n", c);
break; } }
@@ -322,6 +309,33 @@
}
+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)
{
PUCHAR BufPtr = (PUCHAR)Buffer;
diff -u -r1.28 -r1.29 --- freeldr.c 1 Nov 2004 20:49:32 -0000 1.28 +++ freeldr.c 8 Nov 2004 22:02:47 -0000 1.29 @@ -20,6 +20,7 @@
#include <freeldr.h> #include <rtl.h> #include <arch.h>
+#include <machine.h>
#include <mm.h> #include <debug.h> #include <bootmgr.h>
@@ -30,11 +31,9 @@
{
CmdLineParse(CmdLine);
- EnableA20();
+ MachInit();
-#ifdef DEBUG
DebugInit();
-#endif
DbgPrint((DPRINT_WARNING, "BootMain() called. BootDrive = 0x%x BootPartition = %d\n", BootDrive, BootPartition));
diff -N archmach.c --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ archmach.c 8 Nov 2004 22:02:47 -0000 1.1 @@ -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 */
diff -N machpc.c --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ machpc.c 8 Nov 2004 22:02:47 -0000 1.1 @@ -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 */
diff -N machpc.h --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ machpc.h 8 Nov 2004 22:02:47 -0000 1.1 @@ -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 */
diff -N machxbox.c --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ machxbox.c 8 Nov 2004 22:02:47 -0000 1.1 @@ -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;
+}
diff -N machxbox.h --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ machxbox.h 8 Nov 2004 22:02:47 -0000 1.1 @@ -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 */
diff -N pccons.c --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ pccons.c 8 Nov 2004 22:02:47 -0000 1.1 @@ -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 */
diff -N pcmem.c --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ pcmem.c 8 Nov 2004 22:02:47 -0000 1.1 @@ -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 */
diff -N xboxfont.c --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ xboxfont.c 8 Nov 2004 22:02:47 -0000 1.1 @@ -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 */
+
diff -N xboxmem.c --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ xboxmem.c 8 Nov 2004 22:02:47 -0000 1.1 @@ -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 */
diff -N xboxvideo.c --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ xboxvideo.c 8 Nov 2004 22:02:47 -0000 1.1 @@ -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 */
diff -u -r1.5 -r1.6 --- hardware.h 30 Aug 2004 10:50:13 -0000 1.5 +++ hardware.h 8 Nov 2004 22:02:47 -0000 1.6 @@ -21,6 +21,10 @@
#ifndef __I386_HARDWARE_H_ #define __I386_HARDWARE_H_
+#ifndef __REGISTRY_H +#include "../../reactos/registry.h" +#endif +
typedef enum
{
InterfaceTypeUndefined = -1,
@@ -149,6 +153,8 @@
#define Input 0x00000020 #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 ***************************************************************/
diff -u -r1.2 -r1.3 --- i386rtl.c 19 Jan 2003 01:03:58 -0000 1.2 +++ i386rtl.c 8 Nov 2004 22:02:47 -0000 1.3 @@ -22,45 +22,6 @@
#include <rtl.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)
{
REGS Regs;
diff -u -r1.5 -r1.6 --- i386trap.S 30 Oct 2004 17:25:38 -0000 1.5 +++ i386trap.S 8 Nov 2004 22:02:47 -0000 1.6 @@ -24,7 +24,7 @@
#include <arch.h> #include <version.h>
-
+#define SCREEN_ATTR 0x1f /* Bright white on blue background */
.macro SAVE_CPU_REGS movl %eax,i386_EAX
@@ -272,7 +272,9 @@
SAVE_CPU_REGS
- call i386ClearScreenToBlue
+ pushl $SCREEN_ATTR + call _MachClearScreenAttr + add $4,%esp
movl $i386ExceptionHandlerText,%esi call i386PrintText
@@ -438,12 +440,14 @@
movl $0,i386_ScreenPosX incl i386_ScreenPosY incl i386_ScreenPosY
- call i386PrintFrames // Display frames
+ call i386PrintFrames // Display frames
incl i386_ScreenPosY incl i386_ScreenPosY
+ cli
i386ExceptionHandlerHang:
- jmp i386ExceptionHandlerHang
+ hlt + jmp i386ExceptionHandlerHang
iret
@@ -454,31 +458,35 @@
movl i386_EBP,%edi printnextframe:
- test %edi,%edi - je nomoreframes - movl $STACK32ADDR,%eax - cmpl %edi,%eax - jbe nomoreframes - movl 4(%edi),%eax - pushl %edi
+ test %edi,%edi + je nomoreframes + movl $STACK32ADDR,%eax + cmpl %edi,%eax + jbe nomoreframes + movl 4(%edi),%eax + pushl %edi
call i386PrintHexDword // Display frame
- popl %edi
+ popl %edi
incl i386_ScreenPosX incl i386_ScreenPosX
- movl 0(%edi),%edi - jmp printnextframe
+ movl 0(%edi),%edi + jmp printnextframe
nomoreframes:
- ret
+ ret
/************************************************************************/
-i386ClearScreenToBlue:
+/* AL = Char to display */ +/************************************************************************/ +i386PrintChar:
.code32
- cld - movw $0x1F20,%ax - movl $0xB0000,%edi - movl $0x8000,%ecx - rep stosw
+ pushl i386_ScreenPosY + pushl i386_ScreenPosX + pushl $SCREEN_ATTR + andl $0xff,%eax + pushl %eax + call _MachPutCharAttrAtLoc + addl $16,%esp
ret
@@ -492,49 +500,27 @@
lodsb // Check for end of string char
- cmp $0,%al - je i386PrintTextDone
+ cmp $0,%al + je i386PrintTextDone
// Check for newline char
- cmp $0x0a,%al - jne i386PrintTextLoop2
+ cmp $0x0a,%al + jne i386PrintTextLoop2
incl i386_ScreenPosY movl $0,i386_ScreenPosX
- jmp i386PrintTextLoop
+ jmp i386PrintTextLoop
i386PrintTextLoop2:
- call i386PrintTextCalcAddressOfNextChar - - stosb
+ call i386PrintChar
incl i386_ScreenPosX
- jmp i386PrintTextLoop
+ jmp i386PrintTextLoop
i386PrintTextDone: 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 */ /************************************************************************/ i386PrintHexDword:
@@ -553,8 +539,7 @@
andb $0x0f,%al movl $i386PrintHexTable,%ebx xlat /*$i386PrintHexTable*/
- call i386PrintTextCalcAddressOfNextChar - stosb
+ call i386PrintChar
incl i386_ScreenPosX pop %eax
@@ -579,10 +564,9 @@
andb $0x0f,%al movl $i386PrintHexTable,%ebx xlat /*$i386PrintHexTable*/
- call i386PrintTextCalcAddressOfNextChar - stosb
+ call i386PrintChar
incl i386_ScreenPosX
- pop %eax
+ pop %eax
ret
@@ -600,8 +584,7 @@
andb $0x0f,%al movl $i386PrintHexTable,%ebx xlat /*$i386PrintHexTable*/
- call i386PrintTextCalcAddressOfNextChar - stosb
+ call i386PrintChar
incl i386_ScreenPosX pop %eax
diff -N i386mem.c --- i386mem.c 19 Jan 2003 01:03:58 -0000 1.4 +++ /dev/null 1 Jan 1970 00:00:00 -0000 @@ -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;
-}
diff -N machine.h --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ machine.h 8 Nov 2004 22:02:48 -0000 1.1 @@ -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 */
diff -u -r1.7 -r1.8 --- debug.h 25 Apr 2003 19:32:50 -0000 1.7 +++ debug.h 8 Nov 2004 22:02:48 -0000 1.8 @@ -23,24 +23,26 @@
#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_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_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_DISK 0x00000020 // OR this with DebugPrintMask to enable disk messages - #define DPRINT_CACHE 0x00000040 // OR this with DebugPrintMask to enable cache 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_CACHE 0x00000040 // OR this with DebugPrintMask to enable cache 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_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_LINUX 0x00000200 // OR this with DebugPrintMask to enable Linux messages + #define DPRINT_HWDETECT 0x00000400 // OR this with DebugPrintMask to enable hardware detection messages
VOID DebugInit(VOID); VOID DebugPrint(U32 Mask, char *format, ...);
+ VOID DebugPrint1(char *format, ...);
VOID DebugDumpBuffer(U32 Mask, PVOID Buffer, U32 Length); #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 DbgDumpBuffer(_x_, _y_, _z_) DebugDumpBuffer(_x_, _y_, _z_)
@@ -73,7 +75,9 @@
#else
+ #define DebugInit()
#define DbgPrint(_x_)
+ #define DPRINT1(_x_)
#define BugCheck(_x_) #define DbgDumpBuffer(_x_, _y_, _z_)
diff -u -r1.11 -r1.12 --- mm.h 5 Jun 2003 20:06:48 -0000 1.11 +++ mm.h 8 Nov 2004 22:02:48 -0000 1.12 @@ -38,13 +38,6 @@
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(VOID);
diff -u -r1.8 -r1.9 --- rtl.h 17 May 2004 20:25:01 -0000 1.8 +++ rtl.h 8 Nov 2004 22:02:48 -0000 1.9 @@ -72,7 +72,6 @@
char * convert_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 getch(void); // Implemented in asmcode.S int getyear(void); // Implemented in asmcode.S
diff -u -r1.13 -r1.14 --- meminit.c 29 Aug 2003 18:54:17 -0000 1.13 +++ meminit.c 8 Nov 2004 22:02:48 -0000 1.14 @@ -24,6 +24,7 @@
#include <rtl.h> #include <debug.h> #include <ui.h>
+#include <machine.h>
#ifdef DEBUG
@@ -52,20 +53,16 @@
BOOL MmInitializeMemoryManager(VOID)
{
BIOS_MEMORY_MAP BiosMemoryMap[32];
- U32 BiosMemoryMapEntryCount; - U32 ExtendedMemorySize; - U32 ConventionalMemorySize;
+ U32 BiosMemoryMapEntryCount;
#ifdef DEBUG
- U32 Index;
+ U32 Index;
#endif DbgPrint((DPRINT_MEMORY, "Initializing Memory Manager.\n")); RtlZeroMemory(BiosMemoryMap, sizeof(BIOS_MEMORY_MAP) * 32);
- BiosMemoryMapEntryCount = GetBiosMemoryMap(BiosMemoryMap, 32); - ExtendedMemorySize = GetExtendedMemorySize(); - ConventionalMemorySize = GetConventionalMemorySize();
+ BiosMemoryMapEntryCount = MachGetMemoryMap(BiosMemoryMap, sizeof(BiosMemoryMap) / sizeof(BIOS_MEMORY_MAP));
#ifdef DEBUG // Dump the system memory map
@@ -77,13 +74,6 @@
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 // If we got the system memory map then fixup invalid entries
@@ -92,19 +82,6 @@
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); PageLookupTableAddress = MmFindLocationForPageLookupTable(BiosMemoryMap, BiosMemoryMapEntryCount); LastFreePageHint = TotalPagesInLookupTable;
@@ -159,7 +136,7 @@
EndAddressOfMemory = 0;
for (Index=0; Index<MapCount; Index++)
{
- if (MaxStartAddressSoFar < BiosMemoryMap[Index].BaseAddress)
+ if (MaxStartAddressSoFar <= BiosMemoryMap[Index].BaseAddress)
{
MaxStartAddressSoFar = BiosMemoryMap[Index].BaseAddress;
EndAddressOfMemory = (MaxStartAddressSoFar + BiosMemoryMap[Index].Length);
diff -u -r1.38 -r1.39 --- reactos.c 20 Sep 2004 18:02:36 -0000 1.38 +++ reactos.c 8 Nov 2004 22:02:48 -0000 1.39 @@ -28,6 +28,7 @@
#include <ui.h> #include <multiboot.h> #include <mm.h>
+#include <machine.h>
#include <inifile.h> #include "registry.h"
@@ -604,22 +605,35 @@
* 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.mem_lower = GetConventionalMemorySize(); - mb_info.mem_upper = GetExtendedMemorySize();
mb_info.boot_device = 0xffffffff; mb_info.cmdline = (unsigned long)multiboot_kernel_cmdline; mb_info.mods_count = 0; 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)
{
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
DbgPrint((DPRINT_REACTOS, "memory map length: %d\n", mb_info.mmap_length));
DbgPrint((DPRINT_REACTOS, "dumping memory map:\n"));
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", multiboot_memory_map[i].base_addr_low, multiboot_memory_map[i].length_low,
diff -u -r1.15 -r1.16 --- setupldr.c 30 Aug 2004 10:53:00 -0000 1.15 +++ setupldr.c 8 Nov 2004 22:02:48 -0000 1.16 @@ -27,6 +27,7 @@
#include <fs.h> #include <multiboot.h> #include <mm.h>
+#include <machine.h>
#include <ui.h> #include <inffile.h>
@@ -238,40 +239,48 @@
U32 Size; char *SourcePath; char *LoadOptions;
+ int i;
HINF InfHandle; U32 ErrorLine; INFCONTEXT InfContext; /* 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.mem_lower = GetConventionalMemorySize(); - mb_info.mem_upper = GetExtendedMemorySize();
+ mb_info.flags = MB_INFO_FLAG_BOOT_DEVICE | MB_INFO_FLAG_COMMAND_LINE | MB_INFO_FLAG_MODULES;
mb_info.boot_device = 0xffffffff; mb_info.cmdline = (unsigned long)multiboot_kernel_cmdline; mb_info.mods_count = 0; 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)
{
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
+ 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
- {
- 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",
multiboot_memory_map[i].base_addr_low,
multiboot_memory_map[i].length_low,
multiboot_memory_map[i].type);
- } - getch(); - }
#endif
+ }
}
#if 0
printf("low_mem = %d\n", mb_info.mem_lower);
diff -u -r1.7 -r1.8 --- print.c 30 Aug 2004 10:51:44 -0000 1.7 +++ print.c 8 Nov 2004 22:02:48 -0000 1.8 @@ -17,6 +17,8 @@
* Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */
+#include <freeldr.h> +#include <machine.h>
#include <rtl.h> /*
@@ -27,7 +29,7 @@
int i; for (i = 0; i < strlen(str); i++)
- putchar(str[i]);
+ MachPutChar(str[i]);
} /*
@@ -46,7 +48,7 @@
{
if (c != '%')
{
- putchar(c);
+ MachPutChar(c);
}
else
{
@@ -75,22 +77,22 @@
while (*ptr)
{
- putchar(*(ptr++));
+ MachPutChar(*(ptr++));
} break;
- case 'c': putchar((*(dataptr++))&0xff); break;
+ case 'c': MachPutChar((*(dataptr++))&0xff); break;
case 's':
ptr = (char *)(*(dataptr++));
while ((c = *(ptr++)))
{
- putchar(c);
+ MachPutChar(c);
} break; case '%':
- putchar(c);
+ MachPutChar(c);
break;
default:
printf("\nprintf() invalid format specifier - %%%c\n", c);