mirror of
https://github.com/badvision/jace.git
synced 2025-02-21 04:29:09 +00:00
Added support for negative clamping values, lesser-documented clamping read routine at Cn1A, and finally an optional workaround for blazing paddles clamp values to improve usability
This commit is contained in:
parent
07a4494ca1
commit
a14f23c2ee
@ -82,6 +82,8 @@ public class CardAppleMouse extends Card {
|
|||||||
public static int CYCLES_PER_UPDATE = (int) (1020484L / 60L);
|
public static int CYCLES_PER_UPDATE = (int) (1020484L / 60L);
|
||||||
@ConfigurableField(name = "Fullscreen fix", shortName = "fsfix", category = "Mouse", description = "If the mouse pointer is a little off when in fullscreen, this should fix it.")
|
@ConfigurableField(name = "Fullscreen fix", shortName = "fsfix", category = "Mouse", description = "If the mouse pointer is a little off when in fullscreen, this should fix it.")
|
||||||
public boolean fullscreenFix = true;
|
public boolean fullscreenFix = true;
|
||||||
|
@ConfigurableField(name = "Blazing Paddles fix", shortName = "bpfix", category = "Mouse", description = "Use different clamping values to make Blazing Paddles work more reliably.")
|
||||||
|
public boolean blazingPaddles = false;
|
||||||
Label mouseActive = Utility.loadIconLabel("input-mouse.png");
|
Label mouseActive = Utility.loadIconLabel("input-mouse.png");
|
||||||
public boolean movedSinceLastTick = false;
|
public boolean movedSinceLastTick = false;
|
||||||
public boolean movedSinceLastRead = false;
|
public boolean movedSinceLastRead = false;
|
||||||
@ -98,6 +100,7 @@ public class CardAppleMouse extends Card {
|
|||||||
@Override
|
@Override
|
||||||
public void reset() {
|
public void reset() {
|
||||||
mode = 0;
|
mode = 0;
|
||||||
|
clampWindow = new Rectangle2D(0, 0, 0x03ff, 0x03ff);
|
||||||
deactivateMouse();
|
deactivateMouse();
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -196,6 +199,9 @@ public class CardAppleMouse extends Card {
|
|||||||
case 7:
|
case 7:
|
||||||
initMouse();
|
initMouse();
|
||||||
break;
|
break;
|
||||||
|
case 8:
|
||||||
|
getMouseClamp();
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
// Always pass back RTS
|
// Always pass back RTS
|
||||||
e.setNewValue(0x060);
|
e.setNewValue(0x060);
|
||||||
@ -251,6 +257,9 @@ public class CardAppleMouse extends Card {
|
|||||||
case 0x19:
|
case 0x19:
|
||||||
e.setNewValue(0x087);
|
e.setNewValue(0x087);
|
||||||
break;
|
break;
|
||||||
|
case 0x1A:
|
||||||
|
e.setNewValue(0x088);
|
||||||
|
break;
|
||||||
default:
|
default:
|
||||||
e.setNewValue(0x069);
|
e.setNewValue(0x069);
|
||||||
}
|
}
|
||||||
@ -276,17 +285,19 @@ public class CardAppleMouse extends Card {
|
|||||||
} else {
|
} else {
|
||||||
getCPU().C = 0;
|
getCPU().C = 0;
|
||||||
}
|
}
|
||||||
|
//Interrupt on VBL
|
||||||
|
interruptOnVBL = ((mode & 8) != 0);
|
||||||
//Mouse off (0) or on (1)
|
//Mouse off (0) or on (1)
|
||||||
if ((mode & 1) == 0) {
|
if ((mode & 1) == 0) {
|
||||||
deactivateMouse();
|
deactivateMouse();
|
||||||
|
interruptOnMove = false;
|
||||||
|
interruptOnPress = false;
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
//Interrupt if mouse is moved
|
//Interrupt if mouse is moved
|
||||||
interruptOnMove = ((mode & 2) != 0);
|
interruptOnMove = ((mode & 2) != 0);
|
||||||
//Interrupt if button is pressed
|
//Interrupt if button is pressed
|
||||||
interruptOnPress = ((mode & 4) != 0);
|
interruptOnPress = ((mode & 4) != 0);
|
||||||
//Interrupt on VBL
|
|
||||||
interruptOnVBL = ((mode & 8) != 0);
|
|
||||||
activateMouse();
|
activateMouse();
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -355,12 +366,25 @@ public class CardAppleMouse extends Card {
|
|||||||
byte clampMaxHi = memory.getMainMemory().readByte(0x05F8);
|
byte clampMaxHi = memory.getMainMemory().readByte(0x05F8);
|
||||||
int min = (clampMinLo & 0x0ff) | ((clampMinHi << 8) & 0x0FF00);
|
int min = (clampMinLo & 0x0ff) | ((clampMinHi << 8) & 0x0FF00);
|
||||||
int max = (clampMaxLo & 0x0ff) | ((clampMaxHi << 8) & 0x0FF00);
|
int max = (clampMaxLo & 0x0ff) | ((clampMaxHi << 8) & 0x0FF00);
|
||||||
|
if (min >= 32768) {
|
||||||
|
min -= 65536;
|
||||||
|
}
|
||||||
|
if (max >= 32768) {
|
||||||
|
max -= 65536;
|
||||||
|
}
|
||||||
if (getCPU().A == 0) {
|
if (getCPU().A == 0) {
|
||||||
|
if (blazingPaddles) {
|
||||||
|
min = -1;
|
||||||
|
max = 281;
|
||||||
|
}
|
||||||
setClampWindowX(min, max);
|
setClampWindowX(min, max);
|
||||||
} else if (getCPU().A == 1) {
|
} else {
|
||||||
|
if (blazingPaddles) {
|
||||||
|
min = -1;
|
||||||
|
max = 193;
|
||||||
|
}
|
||||||
setClampWindowY(min, max);
|
setClampWindowY(min, max);
|
||||||
}
|
}
|
||||||
// System.out.println("Set mouse clamping to:" + clampMin.toString() + ";" + clampMax.toString());
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
@ -407,6 +431,47 @@ public class CardAppleMouse extends Card {
|
|||||||
getCPU().C = 0;
|
getCPU().C = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Described in Apple Mouse technical note #7
|
||||||
|
* Cn1A: Read mouse clamping values
|
||||||
|
* Register number is stored in $478 and ranges from x47 to x4e
|
||||||
|
* Return value should be stored in $5782
|
||||||
|
* Values should be returned in this order:
|
||||||
|
* MinXH, MinYH, MinXL, MinYL, MaxXH, MaxYH, MaxXL, MaxYL
|
||||||
|
*/
|
||||||
|
private void getMouseClamp() {
|
||||||
|
byte reg = computer.getMemory().readRaw(0x0478);
|
||||||
|
byte val = 0;
|
||||||
|
switch (reg - 0x047) {
|
||||||
|
case 0:
|
||||||
|
val = (byte) ((int) clampWindow.getMinX() >> 8);
|
||||||
|
break;
|
||||||
|
case 1:
|
||||||
|
val = (byte) ((int) clampWindow.getMinY() >> 8);
|
||||||
|
break;
|
||||||
|
case 2:
|
||||||
|
val = (byte) ((int) clampWindow.getMinX() & 255);
|
||||||
|
break;
|
||||||
|
case 3:
|
||||||
|
val = (byte) ((int) clampWindow.getMinY() & 255);
|
||||||
|
break;
|
||||||
|
case 4:
|
||||||
|
val = (byte) ((int) clampWindow.getMaxX() >> 8);
|
||||||
|
break;
|
||||||
|
case 5:
|
||||||
|
val = (byte) ((int) clampWindow.getMaxY() >> 8);
|
||||||
|
break;
|
||||||
|
case 6:
|
||||||
|
val = (byte) ((int) clampWindow.getMaxX() & 255);
|
||||||
|
break;
|
||||||
|
case 7:
|
||||||
|
val = (byte) ((int) clampWindow.getMaxY() & 255);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
computer.getMemory().write(0x0578, val, false, false);
|
||||||
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* This is called whenever the mouse firmware has been activated in software
|
* This is called whenever the mouse firmware has been activated in software
|
||||||
*/
|
*/
|
||||||
@ -423,7 +488,6 @@ public class CardAppleMouse extends Card {
|
|||||||
mode = 0;
|
mode = 0;
|
||||||
interruptOnMove = false;
|
interruptOnMove = false;
|
||||||
interruptOnPress = false;
|
interruptOnPress = false;
|
||||||
interruptOnVBL = false;
|
|
||||||
EmulatorUILogic.removeMouseListener(mouseHandler);
|
EmulatorUILogic.removeMouseListener(mouseHandler);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -468,7 +532,7 @@ public class CardAppleMouse extends Card {
|
|||||||
@Override
|
@Override
|
||||||
public void notifyVBLStateChanged(boolean state) {
|
public void notifyVBLStateChanged(boolean state) {
|
||||||
// VBL is false when it is the vertical blanking period
|
// VBL is false when it is the vertical blanking period
|
||||||
if (!state && interruptOnVBL && active) {
|
if (!state && interruptOnVBL) {
|
||||||
isVBL = true;
|
isVBL = true;
|
||||||
isInterrupt = true;
|
isInterrupt = true;
|
||||||
getCPU().generateInterrupt();
|
getCPU().generateInterrupt();
|
||||||
|
Loading…
x
Reference in New Issue
Block a user