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);