diff --git a/freeldr/Makefile b/freeldr/Makefile index fe140b2414a..d6d283b9560 100644 --- a/freeldr/Makefile +++ b/freeldr/Makefile @@ -31,6 +31,10 @@ all: $(MAKE) -C install $(MAKE) -C fdebug +freeldr: + $(MAKE) -C freeldr +.PHONY : freeldr + clean: $(MAKE) -C bootsect clean $(MAKE) -C freeldr clean diff --git a/freeldr/freeldr/Makefile b/freeldr/freeldr/Makefile index 22786f03197..d1de3c83d0e 100644 --- a/freeldr/freeldr/Makefile +++ b/freeldr/freeldr/Makefile @@ -200,7 +200,6 @@ ARCH_OBJS = fathelp.o \ boot.o \ linux.o \ mb.o \ - i386mem.o \ i386rtl.o \ i386vid.o \ drvmap.o \ @@ -210,6 +209,14 @@ ARCH_OBJS = fathelp.o \ 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 @@ BASE_OBJS = freeldr.o \ debug.o \ multiboot.o \ version.o \ - cmdline.o + cmdline.o \ + machine.o FREELDR_OBJS= bootmgr.o \ drivemap.o \ diff --git a/freeldr/freeldr/arch/i386/archmach.c b/freeldr/freeldr/arch/i386/archmach.c new file mode 100644 index 00000000000..ef25e1124c8 --- /dev/null +++ b/freeldr/freeldr/arch/i386/archmach.c @@ -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 --git a/freeldr/freeldr/arch/i386/hardware.h b/freeldr/freeldr/arch/i386/hardware.h index 0f593795002..a65e11862b0 100644 --- a/freeldr/freeldr/arch/i386/hardware.h +++ b/freeldr/freeldr/arch/i386/hardware.h @@ -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 @@ typedef struct _CM_COMPONENT_INFORMATION #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 --git a/freeldr/freeldr/arch/i386/i386mem.c b/freeldr/freeldr/arch/i386/i386mem.c deleted file mode 100644 index 29e9f931497..00000000000 --- a/freeldr/freeldr/arch/i386/i386mem.c +++ /dev/null @@ -1,216 +0,0 @@ -/* - * FreeLoader - * Copyright (C) 1998-2003 Brian Palmer - * - * 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 -#include -#include -#include -#include -#include - - -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 #include -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 --git a/freeldr/freeldr/arch/i386/i386trap.S b/freeldr/freeldr/arch/i386/i386trap.S index 4f3ceed79d8..1a0ebe1f9d2 100644 --- a/freeldr/freeldr/arch/i386/i386trap.S +++ b/freeldr/freeldr/arch/i386/i386trap.S @@ -24,7 +24,7 @@ #include #include - +#define SCREEN_ATTR 0x1f /* Bright white on blue background */ .macro SAVE_CPU_REGS movl %eax,i386_EAX @@ -272,7 +272,9 @@ i386CommonExceptionHandler: SAVE_CPU_REGS - call i386ClearScreenToBlue + pushl $SCREEN_ATTR + call _MachClearScreenAttr + add $4,%esp movl $i386ExceptionHandlerText,%esi call i386PrintText @@ -438,12 +440,14 @@ i386CommonExceptionHandler: 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 @@ i386PrintFrames: 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,48 +500,26 @@ i386PrintTextLoop: 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 */ /************************************************************************/ @@ -553,8 +539,7 @@ i386PrintHex3: andb $0x0f,%al movl $i386PrintHexTable,%ebx xlat /*$i386PrintHexTable*/ - call i386PrintTextCalcAddressOfNextChar - stosb + call i386PrintChar incl i386_ScreenPosX pop %eax @@ -579,10 +564,9 @@ i386PrintHexWord2: 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 @@ i386PrintHexByte1: andb $0x0f,%al movl $i386PrintHexTable,%ebx xlat /*$i386PrintHexTable*/ - call i386PrintTextCalcAddressOfNextChar - stosb + call i386PrintChar incl i386_ScreenPosX pop %eax diff --git a/freeldr/freeldr/arch/i386/machpc.c b/freeldr/freeldr/arch/i386/machpc.c new file mode 100644 index 00000000000..24f89c607e9 --- /dev/null +++ b/freeldr/freeldr/arch/i386/machpc.c @@ -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 --git a/freeldr/freeldr/arch/i386/machpc.h b/freeldr/freeldr/arch/i386/machpc.h new file mode 100644 index 00000000000..39b1fdc8b4b --- /dev/null +++ b/freeldr/freeldr/arch/i386/machpc.h @@ -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 --git a/freeldr/freeldr/arch/i386/machxbox.c b/freeldr/freeldr/arch/i386/machxbox.c new file mode 100644 index 00000000000..698bf2e1c38 --- /dev/null +++ b/freeldr/freeldr/arch/i386/machxbox.c @@ -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 --git a/freeldr/freeldr/arch/i386/machxbox.h b/freeldr/freeldr/arch/i386/machxbox.h new file mode 100644 index 00000000000..3eddac5e48d --- /dev/null +++ b/freeldr/freeldr/arch/i386/machxbox.h @@ -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 --git a/freeldr/freeldr/arch/i386/pccons.c b/freeldr/freeldr/arch/i386/pccons.c new file mode 100644 index 00000000000..a362dcb1902 --- /dev/null +++ b/freeldr/freeldr/arch/i386/pccons.c @@ -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 --git a/freeldr/freeldr/arch/i386/pcmem.c b/freeldr/freeldr/arch/i386/pcmem.c new file mode 100644 index 00000000000..b18e336e64c --- /dev/null +++ b/freeldr/freeldr/arch/i386/pcmem.c @@ -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 + */ + +#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 --git a/freeldr/freeldr/arch/i386/xboxfont.c b/freeldr/freeldr/arch/i386/xboxfont.c new file mode 100644 index 00000000000..fe98e738b7b --- /dev/null +++ b/freeldr/freeldr/arch/i386/xboxfont.c @@ -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 --git a/freeldr/freeldr/arch/i386/xboxmem.c b/freeldr/freeldr/arch/i386/xboxmem.c new file mode 100644 index 00000000000..7d4539a7f56 --- /dev/null +++ b/freeldr/freeldr/arch/i386/xboxmem.c @@ -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 --git a/freeldr/freeldr/arch/i386/xboxvideo.c b/freeldr/freeldr/arch/i386/xboxvideo.c new file mode 100644 index 00000000000..d295d3cc379 --- /dev/null +++ b/freeldr/freeldr/arch/i386/xboxvideo.c @@ -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 --git a/freeldr/freeldr/debug.c b/freeldr/freeldr/debug.c index 8fff6fb42d8..d5021675658 100644 --- a/freeldr/freeldr/debug.c +++ b/freeldr/freeldr/debug.c @@ -22,6 +22,7 @@ #include #include #include +#include #ifdef DEBUG @@ -75,6 +76,7 @@ VOID DebugInit(VOID) VOID DebugPrintChar(UCHAR Character) { +extern VOID XboxVideoPutChar(char c); if (Character == '\n') { DebugStartOfLine = TRUE; @@ -94,7 +96,7 @@ VOID DebugPrintChar(UCHAR Character) } else { - putchar(Character); + MachPutChar(Character); } } @@ -230,26 +232,11 @@ VOID DebugPrintHeader(U32 Mask) } } -VOID DebugPrint(U32 Mask, char *format, ...) +static VOID DebugPrintV(char *format, int *dataptr) { - int *dataptr = (int *) &format; char c, *ptr, str[16]; 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 @@ VOID DebugPrint(U32 Mask, char *format, ...) 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, ...) } +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 --git a/freeldr/freeldr/freeldr.c b/freeldr/freeldr/freeldr.c index 2a54b3504fe..91529e1bde5 100644 --- a/freeldr/freeldr/freeldr.c +++ b/freeldr/freeldr/freeldr.c @@ -20,6 +20,7 @@ #include #include #include +#include #include #include #include @@ -30,11 +31,9 @@ VOID BootMain(char *CmdLine) { CmdLineParse(CmdLine); - EnableA20(); + MachInit(); -#ifdef DEBUG DebugInit(); -#endif DbgPrint((DPRINT_WARNING, "BootMain() called. BootDrive = 0x%x BootPartition = %d\n", BootDrive, BootPartition)); diff --git a/freeldr/freeldr/include/debug.h b/freeldr/freeldr/include/debug.h index 94c2fa40e81..9098dbd7857 100644 --- a/freeldr/freeldr/include/debug.h +++ b/freeldr/freeldr/include/debug.h @@ -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 @@ void MEMORY_WRITE_BREAKPOINT4(unsigned long addr); #else + #define DebugInit() #define DbgPrint(_x_) + #define DPRINT1(_x_) #define BugCheck(_x_) #define DbgDumpBuffer(_x_, _y_, _z_) diff --git a/freeldr/freeldr/include/machine.h b/freeldr/freeldr/include/machine.h new file mode 100644 index 00000000000..5e7c9b46e8b --- /dev/null +++ b/freeldr/freeldr/include/machine.h @@ -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 --git a/freeldr/freeldr/include/mm.h b/freeldr/freeldr/include/mm.h index 030238a33e7..96c87de24a9 100644 --- a/freeldr/freeldr/include/mm.h +++ b/freeldr/freeldr/include/mm.h @@ -38,13 +38,6 @@ typedef struct 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 --git a/freeldr/freeldr/include/rtl.h b/freeldr/freeldr/include/rtl.h index 7ba2a1b62c9..ec434cbc460 100644 --- a/freeldr/freeldr/include/rtl.h +++ b/freeldr/freeldr/include/rtl.h @@ -72,7 +72,6 @@ int isxdigit(int c); 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 --git a/freeldr/freeldr/machine.c b/freeldr/freeldr/machine.c new file mode 100644 index 00000000000..1ab96bb2949 --- /dev/null +++ b/freeldr/freeldr/machine.c @@ -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 --git a/freeldr/freeldr/mm/meminit.c b/freeldr/freeldr/mm/meminit.c index f04bcf92ef6..408e4ff6490 100644 --- a/freeldr/freeldr/mm/meminit.c +++ b/freeldr/freeldr/mm/meminit.c @@ -24,6 +24,7 @@ #include #include #include +#include #ifdef DEBUG @@ -52,20 +53,16 @@ U32 LastFreePageHint = 0; 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 @@ BOOL MmInitializeMemoryManager(VOID) 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 @@ BOOL MmInitializeMemoryManager(VOID) 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 @@ PVOID MmGetEndAddressOfAnyMemory(PBIOS_MEMORY_MAP BiosMemoryMap, U32 MapCount) EndAddressOfMemory = 0; for (Index=0; Index #include #include +#include #include #include "registry.h" @@ -604,22 +605,35 @@ LoadAndBootReactOS(PUCHAR OperatingSystemName) * 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 --git a/freeldr/freeldr/reactos/setupldr.c b/freeldr/freeldr/reactos/setupldr.c index 27a900f99c6..05e8cca6417 100644 --- a/freeldr/freeldr/reactos/setupldr.c +++ b/freeldr/freeldr/reactos/setupldr.c @@ -27,6 +27,7 @@ #include #include #include +#include #include #include @@ -238,40 +239,48 @@ VOID RunLoader(VOID) 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 --git a/freeldr/freeldr/rtl/print.c b/freeldr/freeldr/rtl/print.c index 95b4d8d2298..0b73a68b5a0 100644 --- a/freeldr/freeldr/rtl/print.c +++ b/freeldr/freeldr/rtl/print.c @@ -17,6 +17,8 @@ * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ +#include +#include #include /* @@ -27,7 +29,7 @@ void print(char *str) int i; for (i = 0; i < strlen(str); i++) - putchar(str[i]); + MachPutChar(str[i]); } /* @@ -46,7 +48,7 @@ void printf(char *format, ... ) { if (c != '%') { - putchar(c); + MachPutChar(c); } else { @@ -75,22 +77,22 @@ void printf(char *format, ... ) 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);