/* JPC: An x86 PC Hardware Emulator for a pure Java Virtual Machine Release Version 2.4 A project from the Physics Dept, The University of Oxford Copyright (C) 2007-2010 The University of Oxford This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License version 2 as published by the Free Software Foundation. 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. Details (including contact information) can be found at: jpc.sourceforge.net or the developer website sourceforge.net/projects/jpc/ Conceived and Developed by: Rhys Newman, Ian Preston, Chris Dennis End of licence header */ package org.jpc.emulator.motherboard; import java.io.*; import java.nio.charset.Charset; import java.util.logging.*; import org.jpc.emulator.*; /** * This class provides a <code>Bios</code> implementation for the VGA Bios. The * VGA Bios is loaded at address <code>0xc0000</code>. * <p> * IO ports <code>0x500-0x503</code> are registered for debugging output. Byte * writes cause ASCII characters to be written to standard output, and word * writes indicate a BIOS panic at the written value line number. * @author Chris Dennis */ public class VGABIOS extends Bios implements IODevice { private static final Logger LOGGING = Logger.getLogger(VGABIOS.class.getName()); private static final Charset US_ASCII = Charset.forName("US-ASCII"); private boolean ioportRegistered; /** * Loads the vga bios from the resource <code>image</code>. * @param image vga bios resource name. * @throws java.io.IOException propogated from the resource load. * @throws java.util.MissingResourceException propogated from the resource load */ public VGABIOS(String image) throws IOException { super(image); ioportRegistered = false; } public void loadState(DataInput input) throws IOException { super.loadState(input); ioportRegistered = false; } public int[] ioPortsRequested() { return new int[]{0x500, 0x501, 0x502, 0x503}; } public void ioPortWrite8(int address, int data) { switch (address) { /* LGPL VGA-BIOS Messages */ case 0x500: case 0x503: print(new String(new byte[]{(byte) data}, US_ASCII)); break; default: } } public void ioPortWrite16(int address, int data) { switch (address) { /* Bochs BIOS Messages */ case 0x501: case 0x502: LOGGING.log(Level.SEVERE, "panic in vgabios at line {0,number,integer}", Integer.valueOf(data)); } } public int ioPortRead8(int address) { return 0xff; } public int ioPortRead16(int address) { return 0xffff; } public int ioPortRead32(int address) { return 0xffffffff; } public void ioPortWrite32(int address, int data) { } protected int loadAddress() { return 0xc0000; } public boolean updated() { return super.updated() && ioportRegistered; } public void updateComponent(HardwareComponent component) { super.updateComponent(component); if ((component instanceof IOPortHandler) && component.updated()) { ((IOPortHandler) component).registerIOPortCapable(this); ioportRegistered = true; } } public boolean initialised() { return super.initialised() && ioportRegistered; } public void acceptComponent(HardwareComponent component) { super.acceptComponent(component); if ((component instanceof IOPortHandler) && component.initialised()) { ((IOPortHandler) component).registerIOPortCapable(this); ioportRegistered = true; } } public void reset() { super.reset(); ioportRegistered = false; } }