Added support for debug prints over a RS232 line.
authorBrian Palmer <brianp@sginet.com>
Tue, 7 Aug 2001 06:19:43 +0000 (06:19 +0000)
committerBrian Palmer <brianp@sginet.com>
Tue, 7 Aug 2001 06:19:43 +0000 (06:19 +0000)
svn path=/trunk/; revision=2159

freeldr/freeldr/Makefile
freeldr/freeldr/debug.c
freeldr/freeldr/debug.h
freeldr/freeldr/freeldr.c
freeldr/freeldr/freeldr.h
freeldr/freeldr/portio.c [new file with mode: 0644]
freeldr/freeldr/portio.h [new file with mode: 0644]
freeldr/freeldr/rs232.c [new file with mode: 0644]
freeldr/freeldr/rs232.h [new file with mode: 0644]

index 4d1ff17..8823afa 100644 (file)
@@ -25,7 +25,8 @@ export RM = cmd /C del
 export CP = cmd /C copy
 
 #FLAGS = -Wall -nostdinc -fno-builtin
-FLAGS = -Wall -fno-builtin -DDEBUG
+#FLAGS = -Wall -fno-builtin -DDEBUG
+FLAGS = -Wall -fno-builtin
 
 # asmcode.o has to be first in the link line because it contains the startup code
 OBJS = asmcode.a asmcode.o mb.o boot.o freeldr.o stdlib.o fs.a fs.o fs_fat.o \
@@ -33,20 +34,28 @@ OBJS = asmcode.a asmcode.o mb.o boot.o freeldr.o stdlib.o fs.a fs.o fs_fat.o \
        mem.o memory.o debug.o parseini.o
 ASM_OBJS = asmcode.o mb.o boot.o mem.o
 C_OBJS = freeldr.o stdlib.o fs.a reactos.o tui.o menu.o miscboot.o options.o linux.o \
-       multiboot.o arcname.o memory.o debug.o parseini.o
+       multiboot.o
+C_OBJS2 = arcname.o memory.o debug.o parseini.o rs232.o portio.o
 
 .PHONY : clean
 
 all:   freeldr.sys
 
 freeldr.sys:   asmcode.a c_code.a
-       $(LD) -N -Ttext=0x8000 --oformat=binary -o freeldr.sys asmcode.a c_code.a
+       $(LD) -N -Ttext=0x8000 --oformat=binary -o f.sys asmcode.a c_code.a
+       ../bootsect/stubit ../bootsect/fatstub.bin f.sys freeldr.sys 
 
 asmcode.a:     $(ASM_OBJS)
        $(LD) -r -o asmcode.a $(ASM_OBJS)
 
-c_code.a:      $(C_OBJS)
-       $(LD) -r -o c_code.a $(C_OBJS)
+c_code.a:      c_code1.a c_code2.a
+       $(LD) -r -o c_code.a c_code1.a c_code2.a
+
+c_code1.a:     $(C_OBJS)
+       $(LD) -r -o c_code1.a $(C_OBJS)
+
+c_code2.a:     $(C_OBJS2)
+       $(LD) -r -o c_code2.a $(C_OBJS2)
 
 asmcode.o:     asmcode.S asmcode.h Makefile
        $(CC) $(FLAGS) -o asmcode.o -c asmcode.S
@@ -108,6 +117,12 @@ debug.o:   debug.c debug.h Makefile
 parseini.o:    parseini.c parseini.h Makefile
        $(CC) $(FLAGS) -o parseini.o -c parseini.c
 
+rs232.o:       rs232.c rs232.h Makefile
+       $(CC) $(FLAGS) -o rs232.o -c rs232.c
+
+portio.o:      portio.c portio.h Makefile
+       $(CC) $(FLAGS) -o portio.o -c portio.c
+
 clean:
        $(RM) *.o
        $(RM) *.a
index 699bfbf..e65c12b 100644 (file)
 #include "freeldr.h"
 #include "debug.h"
 #include "stdlib.h"
+#include "rs232.h"
+#include "parseini.h"
+
+#ifdef DEBUG
 
 ULONG  DebugPrintMask = DPRINT_WARNING | DPRINT_MEMORY;
 
+#define        SCREEN          0
+#define        RS232           1
+
+#define        COM1            1
+#define        COM2            2
+#define        COM3            3
+#define        COM4            4
+
+ULONG  DebugPort = RS232; //SCREEN;
+ULONG  ComPort = COM1;
+ULONG  BaudRate = 19200;
+
+VOID DebugInit(VOID)
+{
+       if (DebugPort == RS232)
+       {
+               Rs232PortInitialize(ComPort, BaudRate);
+       }
+}
+
 void DebugPrint(ULONG Mask, char *format, ...)
 {
        int *dataptr = (int *) &format;
        char c, *ptr, str[16];
        char buffer[512];
        char *p = buffer;
+       int i;
        
        // Mask out unwanted debug messages
        if (!(Mask & DebugPrintMask))
@@ -79,5 +104,21 @@ void DebugPrint(ULONG Mask, char *format, ...)
        *p=0;
 
 
-       print(buffer);
+       if (DebugPort == RS232)
+       {
+               for (i=0; buffer[i] != 0; i++)
+               {
+                       Rs232PortPutByte(buffer[i]);
+                       if (buffer[i] == '\n')
+                       {
+                               Rs232PortPutByte('\r');
+                       }
+               }
+       }
+       else
+       {
+               print(buffer);
+       }
 }
+
+#endif // defined DEBUG
index 8ac0da9..7bade77 100644 (file)
 #ifndef __DEBUG_H
 #define __DEBUG_H
 
+#ifdef DEBUG
+
 #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
 
+VOID   DebugInit(VOID);
 void   DebugPrint(ULONG Mask, char *format, ...);
 
 #define BugCheck0(format) \
@@ -54,4 +57,6 @@ void  DebugPrint(ULONG Mask, char *format, ...);
                                for (;;); \
                        }
 
+#endif // defined DEBUG
+
 #endif // defined __DEBUG_H
\ No newline at end of file
index 52db113..3f45a27 100644 (file)
@@ -28,6 +28,7 @@
 #include "linux.h"
 #include "memory.h"
 #include "parseini.h"
+#include "debug.h"
 
 // Variable BootDrive moved to asmcode.S
 //ULONG                        BootDrive = 0;          // BIOS boot drive, 0-A:, 1-B:, 0x80-C:, 0x81-D:, etc.
@@ -58,6 +59,10 @@ void BootMain(void)
 
        printf("Loading FreeLoader...\n");
 
+#ifdef DEBUG
+       DebugInit();
+#endif
+
        InitMemoryManager((PVOID)0x100000, 0x20000);
 
        if (!ParseIniFile())
index b290d82..b7fa0b6 100644 (file)
@@ -31,6 +31,7 @@
 
 #define        size_t  unsigned int
 #define BOOL   int
+#define BOOLEAN        int
 #define        NULL    0
 #define        TRUE    1
 #define FALSE  0
@@ -43,6 +44,9 @@
 #define PUCHAR unsigned char *
 #define WCHAR  unsigned short
 #define PWCHAR unsigned short *
+#define SHORT  short
+#define USHORT unsigned short
+#define PUSHORT        unsigned short *
 #define LONG   long
 #define ULONG  unsigned long
 #define PULONG unsigned long *
diff --git a/freeldr/freeldr/portio.c b/freeldr/freeldr/portio.c
new file mode 100644 (file)
index 0000000..1e6865f
--- /dev/null
@@ -0,0 +1,183 @@
+/* $Id: portio.c,v 1.1 2001/08/07 06:19:43 bpalmer Exp $
+ *
+ * COPYRIGHT:       See COPYING in the top level directory
+ * PROJECT:         ReactOS kernel
+ * FILE:            ntoskrnl/hal/x86/portio.c
+ * PURPOSE:         Port I/O functions
+ * PROGRAMMER:      Eric Kohl (ekohl@abo.rhein-zeitung.de)
+ * UPDATE HISTORY:
+ *                  Created 18/10/99
+ */
+
+//#include <ddk/ntddk.h>
+#include "freeldr.h"
+
+
+/* FUNCTIONS ****************************************************************/
+
+/*
+ * This file contains the definitions for the x86 IO instructions
+ * inb/inw/inl/outb/outw/outl and the "string versions" of the same
+ * (insb/insw/insl/outsb/outsw/outsl). You can also use "pausing"
+ * versions of the single-IO instructions (inb_p/inw_p/..).
+ *
+ * This file is not meant to be obfuscating: it's just complicated
+ * to (a) handle it all in a way that makes gcc able to optimize it
+ * as well as possible and (b) trying to avoid writing the same thing
+ * over and over again with slight variations and possibly making a
+ * mistake somewhere.
+ */
+
+/*
+ * Thanks to James van Artsdalen for a better timing-fix than
+ * the two short jumps: using outb's to a nonexistent port seems
+ * to guarantee better timings even on fast machines.
+ *
+ * On the other hand, I'd like to be sure of a non-existent port:
+ * I feel a bit unsafe about using 0x80 (should be safe, though)
+ *
+ *             Linus
+ */
+
+#ifdef SLOW_IO_BY_JUMPING
+#define __SLOW_DOWN_IO __asm__ __volatile__("jmp 1f\n1:\tjmp 1f\n1:")
+#else
+#define __SLOW_DOWN_IO __asm__ __volatile__("outb %al,$0x80")
+#endif
+
+#ifdef REALLY_SLOW_IO
+#define SLOW_DOWN_IO { __SLOW_DOWN_IO; __SLOW_DOWN_IO; __SLOW_DOWN_IO; __SLOW_DOWN_IO; }
+#else
+#define SLOW_DOWN_IO __SLOW_DOWN_IO
+#endif
+
+VOID /*STDCALL*/
+READ_PORT_BUFFER_UCHAR (PUCHAR Port,
+                        PUCHAR Buffer,
+                        ULONG Count)
+{
+   __asm__ __volatile__ ("cld ; rep ; insb\n\t" 
+                        : "=D" (Buffer), "=c" (Count) 
+                        : "d" (Port),"0" (Buffer),"1" (Count));
+}
+
+VOID /*STDCALL*/
+READ_PORT_BUFFER_USHORT (PUSHORT Port,
+                         PUSHORT Buffer,
+                         ULONG Count)
+{
+   __asm__ __volatile__ ("cld ; rep ; insw"
+                        : "=D" (Buffer), "=c" (Count) 
+                        : "d" (Port),"0" (Buffer),"1" (Count));
+}
+
+VOID /*STDCALL*/
+READ_PORT_BUFFER_ULONG (PULONG Port,
+                        PULONG Buffer,
+                        ULONG Count)
+{
+   __asm__ __volatile__ ("cld ; rep ; insl"
+                        : "=D" (Buffer), "=c" (Count) 
+                        : "d" (Port),"0" (Buffer),"1" (Count));
+}
+
+UCHAR /*STDCALL*/
+READ_PORT_UCHAR (PUCHAR Port)
+{
+   UCHAR Value;
+   
+   __asm__("inb %w1, %0\n\t"
+          : "=a" (Value)
+          : "d" (Port));
+   SLOW_DOWN_IO;
+   return(Value);
+}
+
+USHORT /*STDCALL*/
+READ_PORT_USHORT (PUSHORT Port)
+{
+   USHORT Value;
+   
+   __asm__("inw %w1, %0\n\t"
+          : "=a" (Value)
+          : "d" (Port));
+   SLOW_DOWN_IO;
+   return(Value);
+}
+
+ULONG /*STDCALL*/
+READ_PORT_ULONG (PULONG Port)
+{
+   ULONG Value;
+   
+   __asm__("inl %w1, %0\n\t"
+          : "=a" (Value)
+          : "d" (Port));
+   SLOW_DOWN_IO;
+   return(Value);
+}
+
+VOID /*STDCALL*/
+WRITE_PORT_BUFFER_UCHAR (PUCHAR Port,
+                         PUCHAR Buffer,
+                         ULONG Count)
+{
+   __asm__ __volatile__ ("cld ; rep ; outsb" 
+                        : "=S" (Buffer), "=c" (Count) 
+                        : "d" (Port),"0" (Buffer),"1" (Count));
+}
+
+VOID /*STDCALL*/
+WRITE_PORT_BUFFER_USHORT (PUSHORT Port,
+                          PUSHORT Buffer,
+                          ULONG Count)
+{
+   __asm__ __volatile__ ("cld ; rep ; outsw"
+                        : "=S" (Buffer), "=c" (Count) 
+                        : "d" (Port),"0" (Buffer),"1" (Count));
+}
+
+VOID /*STDCALL*/
+WRITE_PORT_BUFFER_ULONG (PULONG Port,
+                         PULONG Buffer,
+                         ULONG Count)
+{
+   __asm__ __volatile__ ("cld ; rep ; outsl" 
+                        : "=S" (Buffer), "=c" (Count) 
+                        : "d" (Port),"0" (Buffer),"1" (Count));
+}
+
+VOID /*STDCALL*/
+WRITE_PORT_UCHAR (PUCHAR Port,
+                  UCHAR Value)
+{
+   __asm__("outb %0, %w1\n\t"
+          : 
+          : "a" (Value),
+            "d" (Port));
+   SLOW_DOWN_IO;
+}
+
+VOID /*STDCALL*/
+WRITE_PORT_USHORT (PUSHORT Port,
+                   USHORT Value)
+{
+   __asm__("outw %0, %w1\n\t"
+          : 
+          : "a" (Value),
+            "d" (Port));
+   SLOW_DOWN_IO;
+}
+
+VOID /*STDCALL*/
+WRITE_PORT_ULONG (PULONG Port,
+                  ULONG Value)
+{
+   __asm__("outl %0, %w1\n\t"
+          : 
+          : "a" (Value),
+            "d" (Port));
+   SLOW_DOWN_IO;
+}
+
+/* EOF */
diff --git a/freeldr/freeldr/portio.h b/freeldr/freeldr/portio.h
new file mode 100644 (file)
index 0000000..feee621
--- /dev/null
@@ -0,0 +1,77 @@
+/*
+ *  FreeLoader
+ *  Copyright (C) 2001  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.
+ */
+
+#ifndef __PORTIO_H
+#define __PORTIO_H
+
+
+/*
+ * Port I/O functions
+ */
+
+VOID
+/*STDCALL*/
+READ_PORT_BUFFER_UCHAR (PUCHAR Port, PUCHAR Value, ULONG Count);
+
+VOID
+/*STDCALL*/
+READ_PORT_BUFFER_ULONG (PULONG Port, PULONG Value, ULONG Count);
+
+VOID
+/*STDCALL*/
+READ_PORT_BUFFER_USHORT (PUSHORT Port, PUSHORT Value, ULONG Count);
+
+UCHAR
+/*STDCALL*/
+READ_PORT_UCHAR (PUCHAR Port);
+
+ULONG
+/*STDCALL*/
+READ_PORT_ULONG (PULONG Port);
+
+USHORT
+/*STDCALL*/
+READ_PORT_USHORT (PUSHORT Port);
+
+VOID
+/*STDCALL*/
+WRITE_PORT_BUFFER_UCHAR (PUCHAR Port, PUCHAR Value, ULONG Count);
+
+VOID
+/*STDCALL*/
+WRITE_PORT_BUFFER_ULONG (PULONG Port, PULONG Value, ULONG Count);
+
+VOID
+/*STDCALL*/
+WRITE_PORT_BUFFER_USHORT (PUSHORT Port, PUSHORT Value, ULONG Count);
+
+VOID
+/*STDCALL*/
+WRITE_PORT_UCHAR (PUCHAR Port, UCHAR Value);
+
+VOID
+/*STDCALL*/
+WRITE_PORT_ULONG (PULONG Port, ULONG Value);
+
+VOID
+/*STDCALL*/
+WRITE_PORT_USHORT (PUSHORT Port, USHORT Value);
+
+
+#endif // defined __PORTIO_H
diff --git a/freeldr/freeldr/rs232.c b/freeldr/freeldr/rs232.c
new file mode 100644 (file)
index 0000000..2c21d7e
--- /dev/null
@@ -0,0 +1,276 @@
+/*
+ *  FreeLoader
+ *  Copyright (C) 2001  Brian Palmer  <brianp@sginet.com>
+ *  Copyright (C) 2001  Eric Kohl
+ *  Copyright (C) 2001  Emanuele Aliberti
+ *
+ *  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 "portio.h"
+
+
+/* MACROS *******************************************************************/
+
+#define DEFAULT_BAUD_RATE    19200
+
+#define   SER_RBR(x)   ((x)+0)
+#define   SER_THR(x)   ((x)+0)
+#define   SER_DLL(x)   ((x)+0)
+#define   SER_IER(x)   ((x)+1)
+#define   SER_DLM(x)   ((x)+1)
+#define   SER_IIR(x)   ((x)+2)
+#define   SER_LCR(x)   ((x)+3)
+#define     SR_LCR_CS5 0x00
+#define     SR_LCR_CS6 0x01
+#define     SR_LCR_CS7 0x02
+#define     SR_LCR_CS8 0x03
+#define     SR_LCR_ST1 0x00
+#define     SR_LCR_ST2 0x04
+#define     SR_LCR_PNO 0x00
+#define     SR_LCR_POD 0x08
+#define     SR_LCR_PEV 0x18
+#define     SR_LCR_PMK 0x28
+#define     SR_LCR_PSP 0x38
+#define     SR_LCR_BRK 0x40
+#define     SR_LCR_DLAB 0x80
+#define   SER_MCR(x)   ((x)+4)
+#define     SR_MCR_DTR 0x01
+#define     SR_MCR_RTS 0x02
+#define   SER_LSR(x)   ((x)+5)
+#define     SR_LSR_DR  0x01
+#define     SR_LSR_TBE 0x20
+#define   SER_MSR(x)   ((x)+6)
+#define     SR_MSR_CTS 0x10
+#define     SR_MSR_DSR 0x20
+#define   SER_SCR(x)   ((x)+7)
+
+/* STATIC VARIABLES *********************************************************/
+
+static ULONG Rs232ComPort = 0;
+static ULONG Rs232BaudRate = 0;
+static PUCHAR Rs232PortBase = (PUCHAR)0;
+
+/* The com port must only be initialized once! */
+static BOOLEAN PortInitialized = FALSE;
+
+/* STATIC FUNCTIONS *********************************************************/
+
+static BOOL Rs232DoesComPortExist(PUCHAR BaseAddress)
+{
+        BOOLEAN found;
+        BYTE mcr;
+        BYTE msr;
+
+        found = FALSE;
+
+        /* save Modem Control Register (MCR) */
+        mcr = READ_PORT_UCHAR (SER_MCR(BaseAddress));
+
+        /* enable loop mode (set Bit 4 of the MCR) */
+        WRITE_PORT_UCHAR (SER_MCR(BaseAddress), 0x10);
+
+        /* clear all modem output bits */
+        WRITE_PORT_UCHAR (SER_MCR(BaseAddress), 0x10);
+
+        /* read the Modem Status Register */
+        msr = READ_PORT_UCHAR (SER_MSR(BaseAddress));
+
+        /*
+         * the upper nibble of the MSR (modem output bits) must be
+         * equal to the lower nibble of the MCR (modem input bits)
+         */
+        if ((msr & 0xF0) == 0x00)
+        {
+                /* set all modem output bits */
+                WRITE_PORT_UCHAR (SER_MCR(BaseAddress), 0x1F);
+
+                /* read the Modem Status Register */
+                msr = READ_PORT_UCHAR (SER_MSR(BaseAddress));
+
+                /*
+                 * the upper nibble of the MSR (modem output bits) must be
+                 * equal to the lower nibble of the MCR (modem input bits)
+                 */
+                if ((msr & 0xF0) == 0xF0)
+                        found = TRUE;
+        }
+
+        /* restore MCR */
+        WRITE_PORT_UCHAR (SER_MCR(BaseAddress), mcr);
+
+        return (found);
+}
+
+/* FUNCTIONS *********************************************************/
+
+BOOL Rs232PortInitialize(ULONG ComPort, ULONG BaudRate)
+{
+        ULONG BaseArray[5] = {0, 0x3F8, 0x2F8, 0x3E8, 0x2E8};
+        char buffer[80];
+        ULONG divisor;
+        BYTE lcr;
+
+        if (PortInitialized == FALSE)
+        {
+                if (BaudRate != 0)
+                {
+                        Rs232BaudRate = BaudRate;
+                }
+                else
+                {
+                        Rs232BaudRate = DEFAULT_BAUD_RATE;
+                }
+
+                if (ComPort == 0)
+                {
+                        if (Rs232DoesComPortExist ((PUCHAR)BaseArray[2]))
+                        {
+                                Rs232PortBase = (PUCHAR)BaseArray[2];
+                                Rs232ComPort = 2;
+/*#ifndef NDEBUG
+                                sprintf (buffer,
+                                         "\nSerial port COM%ld found at 0x%lx\n",
+                                         ComPort,
+                                         (ULONG)PortBase);
+                                HalDisplayString (buffer);
+#endif*/ /* NDEBUG */
+                        }
+                        else if (Rs232DoesComPortExist ((PUCHAR)BaseArray[1]))
+                        {
+                                Rs232PortBase = (PUCHAR)BaseArray[1];
+                                Rs232ComPort = 1;
+/*#ifndef NDEBUG
+                                sprintf (buffer,
+                                         "\nSerial port COM%ld found at 0x%lx\n",
+                                         ComPort,
+                                         (ULONG)PortBase);
+                                HalDisplayString (buffer);
+#endif*/ /* NDEBUG */
+                        }
+                        else
+                        {
+                                /*sprintf (buffer,
+                                         "\nKernel Debugger: No COM port found!!!\n\n");
+                                HalDisplayString (buffer);*/
+                                return FALSE;
+                        }
+                }
+                else
+                {
+                        if (Rs232DoesComPortExist ((PUCHAR)BaseArray[ComPort]))
+                        {
+                                Rs232PortBase = (PUCHAR)BaseArray[ComPort];
+                                Rs232ComPort = ComPort;
+/*#ifndef NDEBUG
+                                sprintf (buffer,
+                                         "\nSerial port COM%ld found at 0x%lx\n",
+                                         ComPort,
+                                         (ULONG)PortBase);
+                                HalDisplayString (buffer);
+#endif*/ /* NDEBUG */
+                        }
+                        else
+                        {
+                                /*sprintf (buffer,
+                                         "\nKernel Debugger: No serial port found!!!\n\n");
+                                HalDisplayString (buffer);*/
+                                return FALSE;
+                        }
+                }
+
+                PortInitialized = TRUE;
+        }
+
+        /*
+         * set baud rate and data format (8N1)
+         */
+
+        /*  turn on DTR and RTS  */
+        WRITE_PORT_UCHAR (SER_MCR(Rs232PortBase), SR_MCR_DTR | SR_MCR_RTS);
+
+        /* set DLAB */
+        lcr = READ_PORT_UCHAR (SER_LCR(Rs232PortBase)) | SR_LCR_DLAB;
+        WRITE_PORT_UCHAR (SER_LCR(Rs232PortBase), lcr);
+
+        /* set baud rate */
+        divisor = 115200 / BaudRate;
+        WRITE_PORT_UCHAR (SER_DLL(Rs232PortBase), divisor & 0xff);
+        WRITE_PORT_UCHAR (SER_DLM(Rs232PortBase), (divisor >> 8) & 0xff);
+
+        /* reset DLAB and set 8N1 format */
+        WRITE_PORT_UCHAR (SER_LCR(Rs232PortBase),
+                          SR_LCR_CS8 | SR_LCR_ST1 | SR_LCR_PNO);
+
+        /* read junk out of the RBR */
+        lcr = READ_PORT_UCHAR (SER_RBR(Rs232PortBase));
+
+        /*
+         * set global info
+         */
+        //KdComPortInUse = (ULONG)PortBase;
+
+        /*
+         * print message to blue screen
+         */
+        /*sprintf (buffer,
+                 "\nKernel Debugger: COM%ld (Port 0x%lx) BaudRate %ld\n\n",
+                 ComPort,
+                 (ULONG)PortBase,
+                 BaudRate);
+
+        HalDisplayString (buffer);*/
+
+        return TRUE;
+}
+
+BOOL Rs232PortGetByte(PUCHAR ByteRecieved)
+{
+       if (PortInitialized == FALSE)
+               return FALSE;
+
+       if ((READ_PORT_UCHAR (SER_LSR(Rs232PortBase)) & SR_LSR_DR))
+       {
+               *ByteRecieved = READ_PORT_UCHAR (SER_RBR(Rs232PortBase));
+               return TRUE;
+       }
+
+       return FALSE;
+}
+
+BOOL Rs232PortPollByte(PUCHAR ByteRecieved)
+{
+       if (PortInitialized == FALSE)
+               return FALSE;
+
+       while ((READ_PORT_UCHAR (SER_LSR(Rs232PortBase)) & SR_LSR_DR) == 0)
+               ;
+
+       *ByteRecieved = READ_PORT_UCHAR (SER_RBR(Rs232PortBase));
+
+       return TRUE;
+}
+
+VOID Rs232PortPutByte(UCHAR ByteToSend)
+{
+       if (PortInitialized == FALSE)
+               return;
+
+       while ((READ_PORT_UCHAR (SER_LSR(Rs232PortBase)) & SR_LSR_TBE) == 0)
+               ;
+
+       WRITE_PORT_UCHAR (SER_THR(Rs232PortBase), ByteToSend);
+}
diff --git a/freeldr/freeldr/rs232.h b/freeldr/freeldr/rs232.h
new file mode 100644 (file)
index 0000000..2f716e9
--- /dev/null
@@ -0,0 +1,31 @@
+/*
+ *  FreeLoader
+ *  Copyright (C) 2001  Brian Palmer  <brianp@sginet.com>
+ *  Copyright (C) 2001  Eric Kohl
+ *  Copyright (C) 2001  Emanuele Aliberti
+ *
+ *  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 __RS232_H
+#define __RS232_H
+
+BOOL Rs232PortInitialize(ULONG ComPort, ULONG BaudRate);
+BOOL Rs232PortGetByte(PUCHAR ByteRecieved);
+BOOL Rs232PortPollByte(PUCHAR ByteRecieved);
+VOID Rs232PortPutByte(UCHAR ByteToSend);
+
+
+#endif // defined __RS232_H
\ No newline at end of file