HMI does not 'work' with VGAScreens, Heap issues.

Topics: Developing Cosmos (Working on Cosmos source code directly), Using Cosmos (Developing your own OS, projects, etc)
Jul 18, 2014 at 8:11 AM
Edited Jul 18, 2014 at 3:30 PM
I am using the Heap Memory Interface implemented into COSMOS last year so I can clear up memory. My graphical application updates text objects (they themselves are a collection of individual character objects) in the Run() method, and the heap fills up quite quickly.

Attempting to use HMI.Init at the very beginning of the BeforeRun method results in execution halting and the virtual machine window being resized. Putting it after the screen object is created results in the following methods for switching to 320x200x8 graphics mode and clearing the screen to a given color, but Run() not being reached. My debugger is not working properly, it seems, so I can not use breakpoints in Visual Studio to see where the execution stops after this code, and the Dbg.Message method sends inconsistent messages that at certain points in the execution contain only the first index of the string being received.

I have tried allocating memory for the byte arrays that represent the cursor and text objects so that I can then erase those addresses after the labels are drawn, but the Heap class' memory allocation methods are (apparently?) useless without the HMI being initialized. Regardless, it seems to collect at a similar if not identical speed regardless of what is being drawn to the screen sans the mouse cursor. I believe I am going about this the wrong way.

I have also noticed that moving my cursor in the program results in the heap filling up slower but will sometimes result in a crash before the entire heap is filled.

I am unsure if providing my unsightly source will be of assistance:
public class Kernel : Sys.Kernel
    {
        // Initialize hardware.
        Screen vga; // Screen object
        Cursor mousePnt; // Cursor object
        // Visual elements
        public LabelBuilder txtCoords, txtOSLabel, txtOSClock, txtMem;
        public Image imgOSBG;
        public Clock clk;

        uint pX = 0, pY = 0;

        protected override void BeforeRun()
        {
            // Set up objects.
            vga = new Screen(VGAScreen.ScreenSize.Size320x200, VGAScreen.ColorDepth.BitDepth8); // Create the screen with the appropriate size.
            mousePnt = new Cursor();
            // Set up VGA screen.
            // HMI.Init();
            vga.Start();
            vga.Clear(4);
            // Start mouse.
            mousePnt.CursorInit(vga);
            // Set up screen objects (TODO: add to render manager and loop in Run())
            imgOSBG = new Background(vga, vga.width / 2 - 16, vga.height / 2 - 16);
            txtCoords = new LabelBuilder(vga, 2, 193);
            txtCoords.Create("(x, y)");
            txtOSLabel = new LabelBuilder(vga, 195, 193); // 195 193
            txtOSLabel.Create("Generic Operating System");
            txtOSClock = new LabelBuilder(vga, 255, 187);
            txtOSClock.Create("4:20");
            txtMem = new LabelBuilder(vga, 2, 187);
            txtMem.Create("MEM: ");
            clk = new Clock();
        }
        protected override void Run()
        {
                // Coordinates label code
                if (pX != mousePnt.currX || pY != mousePnt.currY)
                {
                    if (mousePnt.currX == 0 && mousePnt.currY > 193)
                    {
                        txtCoords.Edit(2, 6);
                    }
                    else
                    {
                        txtCoords.Edit(2, 193);
                    }
                    txtCoords.Edit("(" + mousePnt.currX.ToString() + "," + mousePnt.currY.ToString() + ")");
                }
                pX = mousePnt.currX;
                pY = mousePnt.currY;
                // Update clock and do edits
                clk.Update();
                txtOSClock.Edit(clk.GetHourSecond());
                txtMem.Edit("MEM: " + Heap.GetMemoryUse() / 1024 / 1024);
                // Update all graphics
                 imgOSBG.Update();
                txtOSClock.Update();
                txtCoords.Update();
                txtOSLabel.Update();
                txtMem.Update();
                mousePnt.Update(); // !! Update mouse pointer LAST !!
        }
I am running the latest release (108477) and using VMWare Player with the default 256mb of RAM allocated.
Jul 18, 2014 at 8:13 AM
I feel like referencing the VGAScreen in every method rather than making it publicly-accessible from the Kernel or making Screen's methods static may help - could this be a solution/part of one?
Jul 18, 2014 at 8:36 AM
Edited Jul 18, 2014 at 8:37 AM
More issues arise as I continue my attempt to fix these issues: my program inexplicably freezes when the 'coordinates label code' and the related values and setup methods are commented out.

There is nothing in the rest of my code referencing anything related to the label in question - but uncommenting the code somehow fixes the issue (until the heap fills up).
Coordinator
Jul 18, 2014 at 9:17 AM
What version of Cosmos are you using?



2014-07-18 10:36 GMT+02:00 SethiXzon <[email removed]>:

From: SethiXzon

More issues arise as I continue my attempt to fix these issues: my program inexplicably freezes when the 'coordinates label code' and the related values and setup methods are commented out.

Read the full discussion online.

To add a post to this discussion, reply to this email ([email removed])

To start a new discussion for this project, email [email removed]

You are receiving this email because you subscribed to this discussion on CodePlex. You can unsubscribe or change your settings on codePlex.com.

Please note: Images and attachments will be removed from emails. Any posts to this discussion will also be available online at codeplex.com


Jul 18, 2014 at 2:51 PM
Edited Jul 18, 2014 at 2:51 PM
mterwoord wrote:
What version of Cosmos are you using? 2014-07-18 10:36 GMT+02:00 SethiXzon <[email removed]>:
I'm using the 108477 release.
Coordinator
Jul 18, 2014 at 4:45 PM
OK. HMI has been disabled (commented out) in latest devkit, because of certain shortcomings..
For support on it, please wait for someone else to join in..



2014-07-18 16:51 GMT+02:00 SethiXzon <[email removed]>:

From: SethiXzon

mterwoord wrote:
What version of Cosmos are you using? 2014-07-18 10:36 GMT+02:00 SethiXzon <[email removed]>:
I'm using the 108477 release.

Read the full discussion online.

To add a post to this discussion, reply to this email ([email removed])

To start a new discussion for this project, email [email removed]

You are receiving this email because you subscribed to this discussion on CodePlex. You can unsubscribe or change your settings on codePlex.com.

Please note: Images and attachments will be removed from emails. Any posts to this discussion will also be available online at codeplex.com


Jul 18, 2014 at 5:03 PM
mterwoord wrote:
OK. HMI has been disabled (commented out) in latest devkit, because of certain shortcomings.. For support on it, please wait for someone else to join in.. 2014-07-18 16:51 GMT+02:00 SethiXzon <[email removed]>: From: SethiXzon mterwoord wrote: What version of Cosmos are you using? 2014-07-18 10:36 GMT+02:00 SethiXzon <[email removed]>: I'm using the 108477 release. Read the full discussion online. To add a post to this discussion, reply to this email ([email removed]) To start a new discussion for this project, email [email removed] You are receiving this email because you subscribed to this discussion on CodePlex. You can unsubscribe or change your settings on codePlex.com. Please note: Images and attachments will be removed from emails. Any posts to this discussion will also be available online at codeplex.com
Will the Heap's functions still work? I noticed in the latest version of the source that most all of the Heap was replaced by forest with code that references HMI code.
I'll need to look around at finding a copy of Visual Studio 2013 for a reduced price before I can mess with the DevKit.
Coordinator
Jul 18, 2014 at 5:04 PM
The HMI by Forest is commented out, and replaced with the initial reference implementation which we had for 4 years..



2014-07-18 19:03 GMT+02:00 SethiXzon <[email removed]>:

From: SethiXzon

mterwoord wrote:
OK. HMI has been disabled (commented out) in latest devkit, because of certain shortcomings.. For support on it, please wait for someone else to join in.. 2014-07-18 16:51 GMT+02:00 SethiXzon <[email removed]>: From: SethiXzon mterwoord wrote: What version of Cosmos are you using? 2014-07-18 10:36 GMT+02:00 SethiXzon <[email removed]>: I'm using the 108477 release. Read the full discussion online. To add a post to this discussion, reply to this email ([email removed]) To start a new discussion for this project, email [email removed] You are receiving this email because you subscribed to this discussion on CodePlex. You can unsubscribe or change your settings on codePlex.com. Please note: Images and attachments will be removed from emails. Any posts to this discussion will also be available online at codeplex.com
Will the Heap's functions still work? I noticed in the latest version of the source that most all of the Heap was replaced by forest with code that references HMI code.
I'll need to look around at finding a copy of Visual Studio 2013 for a reduced price before I can mess with the DevKit.

Read the full discussion online.

To add a post to this discussion, reply to this email ([email removed])

To start a new discussion for this project, email [email removed]

You are receiving this email because you subscribed to this discussion on CodePlex. You can unsubscribe or change your settings on codePlex.com.

Please note: Images and attachments will be removed from emails. Any posts to this discussion will also be available online at codeplex.com


Jul 19, 2014 at 5:38 AM
Edited Jul 19, 2014 at 6:15 AM
mterwoord wrote:
The HMI by Forest is commented out, and replaced with the initial reference implementation which we had for 4 years.. 2014-07-18 19:03 GMT+02:00 SethiXzon <[email removed]>:
Since I'm unable to build the latest version of the DevKit, I simply added the old version of the heap into my program inside another namespace. I made some very minor changes to the class and made the DoInitialize method public and made some interesting discoveries.
  • Simply starting from the address given from CPU.GetEndOfKernel to the end of the memory results in the VM not booting properly after my screen is cleared (execution stops at the VGA.Clear(4) method - refer to my source in the first post.)
  • Adding ~6.5kb to the starting address (6650 seems to be around the lowest amount for my program but it would surely be source-dependent) DOES work, but losing focus in VMWare Player and attempting to refocus the mouse cursor results in the mouse no longer functioning. The Run() loop continues to execute, as the screen labels (again, see source) update until the heap runs out of memory. If I allocate more memory; around 8kb, I can regain focus without any adverse effects.
  • The heap seems to fill up slower after running DoInitialize regardless of what is being drawn to the screen.
I am initializing the heap with this code:
System.Heap.DoInitialize(Cosmos.Core.CPU.GetEndOfKernel()+8192, (Cosmos.Core.CPU.GetAmountOfRAM()-1)*1024*1024); // ~6650 (6.5kb)? Note: magic number.
The Heap code I am using is as follows:
    public class Heap
        // The old Cosmos heap (now present in the new devkit but not available)
    {
        public static bool EnableDebug = true;
        private static uint mStart;
        private static uint mStartAddress;
        private static uint mLength;
        private static uint mEndOfRam;
        
        public static void DoInitialize(uint aStartAddress, uint aEndOfRam) 
       // Change #1 - Method made public so I can easily modify the starting address. Consider editing the Initialize method and adding an offset argument instead.
        {
            mStart = mStartAddress = aStartAddress + (4 - (aStartAddress % 4));
            mLength = aEndOfRam - aStartAddress;
            mLength = (mLength / 4) * 4;
            ClearMemory(aStartAddress, mLength);
           
            mStartAddress += 1024;
            mEndOfRam = aEndOfRam;
            mStartAddress = (mStartAddress / 4) * 4;
            mLength -= 1024;
            UpdateDebugDisplay();
            mInitialized = true;
        }

        private static bool mInitialized = false;
        internal static void Initialize()
        {
            if (!mInitialized)
            {
                mInitialized = true;
                DoInitialize(CPU.GetEndOfKernel(), (CPU.GetAmountOfRAM() - 1) * 1024 * 1024);
            }
        }

        private static void ClearMemory(uint aStartAddress, uint aLength)
        {
            //TODO: Move to memory. Internal access only...
            CPU cpu = new CPU();
            cpu.ZeroFill(aStartAddress, aLength);
        }

        private static void WriteNumber(uint aNumber, byte aBits)
        {
            uint xValue = aNumber;
            byte xCurrentBits = aBits;
            Console.Write("0x");
            while (xCurrentBits >= 4)
            {
                xCurrentBits -= 4;
                byte xCurrentDigit = (byte)((xValue >> xCurrentBits) & 0xF);
                string xDigitString = null;
                switch (xCurrentDigit)
                {
                    case 0:
                        xDigitString = "0";
                        goto default;
                    case 1:
                        xDigitString = "1";
                        goto default;
                    case 2:
                        xDigitString = "2";
                        goto default;
                    case 3:
                        xDigitString = "3";
                        goto default;
                    case 4:
                        xDigitString = "4";
                        goto default;
                    case 5:
                        xDigitString = "5";
                        goto default;
                    case 6:
                        xDigitString = "6";
                        goto default;
                    case 7:
                        xDigitString = "7";
                        goto default;
                    case 8:
                        xDigitString = "8";
                        goto default;
                    case 9:
                        xDigitString = "9";
                        goto default;
                    case 10:
                        xDigitString = "A";
                        goto default;
                    case 11:
                        xDigitString = "B";
                        goto default;
                    case 12:
                        xDigitString = "C";
                        goto default;
                    case 13:
                        xDigitString = "D";
                        goto default;
                    case 14:
                        xDigitString = "E";
                        goto default;
                    case 15:
                        xDigitString = "F";
                        goto default;
                    default:
                        if (xDigitString == null)
                        {
                            Cosmos.Core.Global.Dbg.Break();
                        }
                        Console.Write(xDigitString);
                        break;
                }
            }
        }

        private static bool mDebugDisplayInitialized = false;

        // this method displays the used/total memory of the heap on the first line of the text screen
        private static void UpdateDebugDisplay()
        {
            //if (EnableDebug)
            //{
            //    if (!mDebugDisplayInitialized)
            //    {
            //        mDebugDisplayInitialized = true;
            //        int xOldPositionLeft = Console.CursorLeft;
            //        int xOldPositionTop = Console.CursorTop;
            //        Console.CursorLeft = 0;
            //        Console.CursorTop = 0;
            //        Console.Write("[Heap Usage: ");
            //        WriteNumber(mStartAddress,
            //                    32);
            //        Console.Write("/");
            //        WriteNumber(mEndOfRam,
            //                    32);
            //        Console.Write("] bytes");
            //        while (Console.CursorLeft < (Console.WindowWidth-1))
            //        {
            //            Console.Write(" ");
            //        }
            //        Console.CursorLeft = xOldPositionLeft;
            //        Console.CursorTop = xOldPositionTop;
            //    }
            //    else
            //    {
            //        int xOldPositionLeft = Console.CursorLeft;
            //        int xOldPositionTop = Console.CursorTop;
            //        Console.CursorLeft = 13;
            //        Console.CursorTop = 0;
            //        WriteNumber(mStartAddress,
            //                    32);
            //        Console.CursorLeft = xOldPositionLeft;
            //        Console.CursorTop = xOldPositionTop;
            //    }
            //}
        }

        public static uint MemAlloc(uint aLength)
        {
            Initialize();
            uint xTemp = mStartAddress;

            if ((xTemp + aLength) > (mStart + mLength))
            {
                Console.WriteLine("Memory block too large to allocate! (Size was "+(xTemp+aLength)+")"); // Change #2
                WriteNumber(aLength, 32);
                while (true)
                    ;
            }
            mStartAddress += aLength;
            UpdateDebugDisplay();
            ClearMemory(xTemp, aLength);
            return xTemp;
        }
    }
Coordinator
Jul 19, 2014 at 11:59 AM
There's no way currently to replace a heap. So in your situation, there are 2 heaps "fighting" over space. Both will hand out the same memory, and clearing it before giving stuff out..
This (at best) is very error-prone, and will definitely lead to errors!



2014-07-19 7:38 GMT+02:00 SethiXzon <[email removed]>:

From: SethiXzon

mterwoord wrote:
The HMI by Forest is commented out, and replaced with the initial reference implementation which we had for 4 years.. 2014-07-18 19:03 GMT+02:00 SethiXzon <[email removed]>:
Since I'm unable to build the latest version of the DevKit, I simply added the old version of the heap into my program inside another namespace. I made some very minor changes to the class and made the DoInitialize method public and made some interesting discoveries.
  • Simply starting from the address given from CPU.GetEndOfKernel to the end of the memory results in the VM not booting properly after my screen is cleared (execution stops at the VGA.Clear(4) method - refer to my source in the first post.)
  • Adding ~6.5kb to the starting address (6650 seems to be around the lowest amount for my program but it would surely be source-dependent) DOES work, but losing focus in VMWare Player and attempting to refocus the mouse cursor results in the mouse no longer functioning. The Run() loop continues to run, as the screen labels (again, see source) update until the heap runs out of memory. If I allocate more memory; around 8kb, I can regain focus without any adverse effects.
  • The heap seems to fill up slower after running DoInitialize regardless of what is being drawn to the screen.
I am initializing the heap with this code:
System.Heap.DoInitialize(Cosmos.Core.CPU.GetEndOfKernel()+8192, (Cosmos.Core.CPU.GetAmountOfRAM()-1)*1024*1024); // ~6650 (6.5kb)? Note: magic number.
The Heap code I am using is as follows:
    public class Heap
        // The old Cosmos heap (now present in the new devkit but not available)
    {
        public static bool EnableDebug = true;
        private static uint mStart;
        private static uint mStartAddress;
        private static uint mLength;
        private static uint mEndOfRam;
        
        public static void DoInitialize(uint aStartAddress, uint aEndOfRam) 
       // Change #1 - Method made public so I can easily modify the starting address. Consider editing the Initialize method and adding an offset argument instead.
        {
            mStart = mStartAddress = aStartAddress + (4 - (aStartAddress % 4));
            mLength = aEndOfRam - aStartAddress;
            mLength = (mLength / 4) * 4;
            ClearMemory(aStartAddress, mLength);
           
            mStartAddress += 1024;
            mEndOfRam = aEndOfRam;
            mStartAddress = (mStartAddress / 4) * 4;
            mLength -= 1024;
            UpdateDebugDisplay();
            mInitialized = true;
        }

        private static bool mInitialized = false;
        internal static void Initialize()
        {
            if (!mInitialized)
            {
                mInitialized = true;
                DoInitialize(CPU.GetEndOfKernel(), (CPU.GetAmountOfRAM() - 1) * 1024 * 1024);
            }
        }

        private static void ClearMemory(uint aStartAddress, uint aLength)
        {
            //TODO: Move to memory. Internal access only...
            CPU cpu = new CPU();
            cpu.ZeroFill(aStartAddress, aLength);
        }

        private static void WriteNumber(uint aNumber, byte aBits)
        {
            uint xValue = aNumber;
            byte xCurrentBits = aBits;
            Console.Write("0x");
            while (xCurrentBits >= 4)
            {
                xCurrentBits -= 4;
                byte xCurrentDigit = (byte)((xValue >> xCurrentBits) & 0xF);
                string xDigitString = null;
                switch (xCurrentDigit)
                {
                    case 0:
                        xDigitString = "0";
                        goto default;
                    case 1:
                        xDigitString = "1";
                        goto default;
                    case 2:
                        xDigitString = "2";
                        goto default;
                    case 3:
                        xDigitString = "3";
                        goto default;
                    case 4:
                        xDigitString = "4";
                        goto default;
                    case 5:
                        xDigitString = "5";
                        goto default;
                    case 6:
                        xDigitString = "6";
                        goto default;
                    case 7:
                        xDigitString = "7";
                        goto default;
                    case 8:
                        xDigitString = "8";
                        goto default;
                    case 9:
                        xDigitString = "9";
                        goto default;
                    case 10:
                        xDigitString = "A";
                        goto default;
                    case 11:
                        xDigitString = "B";
                        goto default;
                    case 12:
                        xDigitString = "C";
                        goto default;
                    case 13:
                        xDigitString = "D";
                        goto default;
                    case 14:
                        xDigitString = "E";
                        goto default;
                    case 15:
                        xDigitString = "F";
                        goto default;
                    default:
                        if (xDigitString == null)
                        {
                            Cosmos.Core.Global.Dbg.Break();
                        }
                        Console.Write(xDigitString);
                        break;
                }
            }
        }

        private static bool mDebugDisplayInitialized = false;

        // this method displays the used/total memory of the heap on the first line of the text screen
        private static void UpdateDebugDisplay()
        {
            //if (EnableDebug)
            //{
            //    if (!mDebugDisplayInitialized)
            //    {
            //        mDebugDisplayInitialized = true;
            //        int xOldPositionLeft = Console.CursorLeft;
            //        int xOldPositionTop = Console.CursorTop;
            //        Console.CursorLeft = 0;
            //        Console.CursorTop = 0;
            //        Console.Write("[Heap Usage: ");
            //        WriteNumber(mStartAddress,
            //                    32);
            //        Console.Write("/");
            //        WriteNumber(mEndOfRam,
            //                    32);
            //        Console.Write("] bytes");
            //        while (Console.CursorLeft < (Console.WindowWidth-1))
            //        {
            //            Console.Write(" ");
            //        }
            //        Console.CursorLeft = xOldPositionLeft;
            //        Console.CursorTop = xOldPositionTop;
            //    }
            //    else
            //    {
            //        int xOldPositionLeft = Console.CursorLeft;
            //        int xOldPositionTop = Console.CursorTop;
            //        Console.CursorLeft = 13;
            //        Console.CursorTop = 0;
            //        WriteNumber(mStartAddress,
            //                    32);
            //        Console.CursorLeft = xOldPositionLeft;
            //        Console.CursorTop = xOldPositionTop;
            //    }
            //}
        }

        public static uint MemAlloc(uint aLength)
        {
            Initialize();
            uint xTemp = mStartAddress;

            if ((xTemp + aLength) > (mStart + mLength))
            {
                Console.WriteLine("Memory block too large to allocate! (Size was "+(xTemp+aLength)+")"); // Change #2
                WriteNumber(aLength, 32);
                while (true)
                    ;
            }
            mStartAddress += aLength;
            UpdateDebugDisplay();
            ClearMemory(xTemp, aLength);
            return xTemp;
        }
    }

Read the full discussion online.

To add a post to this discussion, reply to this email ([email removed])

To start a new discussion for this project, email [email removed]

You are receiving this email because you subscribed to this discussion on CodePlex. You can unsubscribe or change your settings on codePlex.com.

Please note: Images and attachments will be removed from emails. Any posts to this discussion will also be available online at codeplex.com


Jul 19, 2014 at 5:33 PM
What code is using the heap? I thought the old heap code in the current userkit didn't run if it wasn't initialized without HMI running?
Coordinator
Jul 20, 2014 at 8:58 AM
c# Code:
var obj = new Object();

That code uses the heap, to get the memory block required.



2014-07-19 19:33 GMT+02:00 SethiXzon <[email removed]>:

From: SethiXzon

What code is using the heap? I thought the old heap code in the current userkit didn't run if it wasn't initialized without HMI running?

Read the full discussion online.

To add a post to this discussion, reply to this email ([email removed])

To start a new discussion for this project, email [email removed]

You are receiving this email because you subscribed to this discussion on CodePlex. You can unsubscribe or change your settings on codePlex.com.

Please note: Images and attachments will be removed from emails. Any posts to this discussion will also be available online at codeplex.com


Developer
Jul 24, 2014 at 2:59 PM
I use Cosmos Userkit + devkit (106458). Only problem i know HMI has is with IRQs. If you suddenly type on the keyboard and move the mouse at the same time it causes a slight memory leak. It should be solved by disabling Garbage Collection for IRQs in INT.cs
 /*  var xCallback = mIRQ_Handlers[irq];*/
            if (mIRQ_Handlers[irq] != null)
            {
               // HMI.Monitor();
                mIRQ_Handlers[irq](ref aContext);  
               // HMI.Release();
            }
@mterwood I'm wondering about the list of things cosmos needs that you talked about. Where is it exactly? Oh i managed to rethink a memory manager. One that uses generations.


:( i cant test it though on real hardware. My previous Dev PC died and im using a PC with Phoenix Bios which boots Cosmos to a black screen. I thought it was in compatible video settings but it does respond to any commands.. i placed a "beep" command to check if it works but no hope.

Those Award BIOS's are a pain.
Coordinator
Jul 25, 2014 at 8:39 AM
forest: ask on mailinglist.


Memory manager is a bit further down the road. First things first...




2014-07-24 16:59 GMT+02:00 forest201 <[email removed]>:

From: forest201

I use Cosmos Userkit + devkit (106458). Only problem i know HMI has is with IRQs. If you suddenly type on the keyboard and move the mouse at the same time it causes a slight memory leak. It should be solved by disabling Garbage Collection for IRQs in INT.cs
 /*  var xCallback = mIRQ_Handlers[irq];*/
            if (mIRQ_Handlers[irq] != null)
            {
               // HMI.Monitor();
                mIRQ_Handlers[irq](ref aContext);  
               // HMI.Release();
            }
@mterwood I'm wondering about the list of things cosmos needs that you talked about. Where is it exactly? Oh i managed to rethink a memory manager. One that uses generations.


:( i cant test it though on real hardware. My previous Dev PC died and im using a PC with Phoenix Bios which boots Cosmos to a black screen. I thought it was in compatible video settings but it does respond to any commands.. i placed a "beep" command to check if it works but no hope.

Those Award BIOS's are a pain.

Read the full discussion online.

To add a post to this discussion, reply to this email ([email removed])

To start a new discussion for this project, email [email removed]

You are receiving this email because you subscribed to this discussion on CodePlex. You can unsubscribe or change your settings on codePlex.com.

Please note: Images and attachments will be removed from emails. Any posts to this discussion will also be available online at codeplex.com