vavi-apps-appleii-bdj/src/main/java/vavi/apps/appleii/AppleIIGo.java

370 lines
8.8 KiB
Java

/*
* AppleIIGo
* The Java Apple II Emulator
* (C) 2006 by Marc S. Ressl(ressl@lonetree.com)
* Released under the GPL
*/
package vavi.apps.appleii;
/**
* AppleIIGo class<p>
* Connects EmAppleII, AppleCanvas
*/
public class AppleIIGo {
// Class instances
private EmAppleII apple;
private AppleDisplay display;
// private AppleSpeaker speaker;
private DiskII disk;
// Machine variables
private boolean isCpuPaused;
private boolean isCpuDebugEnabled;
/** */
public boolean isCpuDebugEnabled() {
return isCpuDebugEnabled;
}
// Keyboard variables
private boolean keyboardUppercaseOnly;
// Paddle variables
private boolean isPaddleInverted;
// Disk variables
private String diskDriveResource[] = new String[2];
public String getDiskDriveResource(int drive) {
return diskDriveResource[drive];
}
private boolean diskWritable;
/** */
public interface View {
/** */
void repaint();
/** */
Object getCharSet(int[] buffer, int w, int h, int s);
/** */
void flushCharSet(Object resource);
/** */
void setDisplayScaledSizeX(int w);
/** */
void setDisplayScaledSizeY(int h);
/** */
void debug(Throwable t);
/** */
void debug(String s);
}
/** */
public void setView(View view) {
this.view = view;
}
/** */
private View view;
/** */
public interface Dao {
/** */
String getParameter(String parameter);
/** */
void openInputStream(String resource);
/** */
void read(byte[] bytes, int offset, int length);
/** */
void closeInputStream();
}
/** */
public void setDao(Dao dao) {
this.dao = dao;
}
/** */
private Dao dao;
public void setKeyLatch(int key) {
if (key < 128) {
if (keyboardUppercaseOnly && (key >= 97) && (key <= 122)) {
key -= 32;
}
apple.setKeyLatch(key);
}
}
public void setButton(int button, boolean flag) {
apple.paddle.setButton(button, flag);
}
/** for key */
public void setPaddle(int paddle, int value) {
apple.paddle.setPaddlePos(paddle, value);
}
/** for mouse */
public void setPaddlePos(int x, int y) {
if (isPaddleInverted) {
apple.paddle.setPaddlePos(0, (int) (display.getScale() * (255 - y * 256 / 192)));
apple.paddle.setPaddlePos(1, (int) (display.getScale() * (255 - x * 256 / 280)));
} else {
apple.paddle.setPaddlePos(0, (int) (x * display.getScale() * 256 / 280));
apple.paddle.setPaddlePos(1, (int) (y * display.getScale() * 256 / 192));
}
}
public void setVolume(boolean up) {
// speaker.setVolume(speaker.getVolume() + (up ? 1 : -1));
}
public void toggleStatMode() {
setStatMode(!isStatMode);
}
public void toggleStepMode() {
apple.setStepMode(!apple.getStepMode());
}
public void stepInstructions(int step) {
apple.setStepMode(apple.getStepMode());
apple.stepInstructions(step);
}
public int[] getDisplayImageBuffer() {
return display.getDisplayImageBuffer();
}
public boolean isPaused() {
return display.isPaused();
}
private boolean isGlare;
private boolean isStatMode;
/**
* Set glare
*/
public void setGlare(boolean value) {
isGlare = value;
display.requestRefresh();
}
/**
* Get glare
*/
public boolean isGlare() {
return isGlare;
}
/**
* Set stat mode
*/
public void setStatMode(boolean value) {
isStatMode = value;
display.requestRefresh();
}
/**
* Get stat mode
*/
public boolean isStatMode() {
return isStatMode;
}
public String getStatInfo() {
StringBuffer statInfo = new StringBuffer();
statInfo.append(apple.getStatInfo()).append("\n").append(display.getStatInfo());
return statInfo.toString();
}
/**
* Parameters
*/
private String getParameter(String parameter, String defaultValue) {
String value = dao.getParameter(parameter);
if ((value == null) || (value.length() == 0)) {
return defaultValue;
}
return value;
}
/**
* On applet initialization
*/
public void init() {
System.err.println("init()");
// Activate listeners
// Initialize Apple II emulator
apple = new EmAppleII(view);
loadRom(getParameter("cpuRom", ""));
apple.setCpuSpeed(new Integer(getParameter("cpuSpeed", "1000")).intValue());
isCpuPaused = getParameter("cpuPaused", "false").equals("true");
isCpuDebugEnabled = getParameter("cpuDebugEnabled", "false").equals("true");
apple.setStepMode(getParameter("cpuStepMode", "false").equals("true"));
// Keyboard
keyboardUppercaseOnly = getParameter("keyboardUppercaseOnly", "true").equals("true");
// Display
display = new AppleDisplay(apple);
display.setScale(new Float(getParameter("displayScale", "1")).floatValue());
display.setRefreshRate(new Integer(getParameter("displayRefreshRate", "10")).intValue());
display.setColorMode(new Integer(getParameter("displayColorMode", "0")).intValue());
setStatMode(getParameter("displayStatMode", "false").equals("true"));
setGlare(getParameter("displayGlare", "false").equals("true"));
// Speaker
// speaker = new AppleSpeaker(apple);
// speaker.setVolume(new Integer(getAppletParameter("speakerVolume", "3")).intValue());
// Peripherals
disk = new DiskII();
apple.setPeripheral(disk, 6);
// Initialize disk drives
diskWritable = getParameter("diskWritable", "false").equals("true");
mountDisk(0, getParameter("diskDrive1", ""));
mountDisk(1, getParameter("diskDrive2", ""));
}
public void start() {
// Start CPU
if (!isCpuPaused) {
resume();
}
}
/**
* On applet destruction
*/
public void destroy() {
System.err.println("destroy()");
unmountDisk(0);
unmountDisk(1);
}
/**
* Pause emulator
*/
public void pause() {
System.err.println("pause()");
isCpuPaused = true;
apple.setPaused(isCpuPaused);
display.setPaused(isCpuPaused);
// speaker.setPaused(isCpuPaused);
}
/**
* Resume emulator
*/
public void resume() {
System.err.println("resume()");
isCpuPaused = false;
// speaker.setPaused(isCpuPaused);
display.setPaused(isCpuPaused);
apple.setPaused(isCpuPaused);
}
/**
* Restarts emulator
*/
public void restart() {
System.err.println("restart()");
apple.restart();
}
/**
* Resets emulator
*/
public void reset() {
System.err.println("reset()");
apple.reset();
}
/**
* Load ROM
*/
public void loadRom(String resource) {
System.err.println("loadRom(resource: " + resource + ")");
apple.loadRom(dao, resource);
}
/**
* Mount a disk
*/
public boolean mountDisk(int drive, String resource) {
System.err.println("mountDisk(drive: " + drive + ", resource: " + resource + ")");
if ((drive < 0) || (drive > 2)) {
return false;
}
try {
unmountDisk(drive);
diskDriveResource[drive] = resource;
System.err.println("mount: dirve: " + drive + ", " + resource);
disk.readDisk(dao, drive, resource, 254, false);
return true;
} catch (Throwable e) {
if (e instanceof IllegalStateException) {
System.err.println("mount: drive: " + drive + ": no disk");
} else {
e.printStackTrace(System.err);
}
return false;
}
}
/**
* Unmount a disk
*/
public void unmountDisk(int drive) {
System.err.println("unmount: drive: " + drive);
if ((drive < 0) || (drive > 2)) {
return;
}
if (!diskWritable) {
System.err.println("unmount: drive: " + drive + ", not writable");
return;
}
try {
disk.writeDisk(drive, diskDriveResource[drive]);
} catch (Throwable e) {
if (e instanceof NullPointerException) {
System.err.println("unmount: drive: " + drive + ": no disk");
} else {
e.printStackTrace(System.err);
}
}
}
/**
* Set color mode
*/
public void setColorMode(int value) {
System.err.println("setColorMode(value: " + value + ")");
display.setColorMode(value);
}
/**
* Get disk activity
*/
public boolean getDiskActivity() {
return (!isCpuPaused && disk.isMotorOn());
}
}
/* */