Compare commits
4
Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
531e4a8c3e | ||
|
|
f295e02aaf | ||
|
|
67928da1e6 | ||
|
|
4ebdad0c2d |
+1
-1
@@ -495,7 +495,7 @@ static int cpuException(VB *sim) {
|
|||||||
sim->cpu.eipc = sim->cpu.pc;
|
sim->cpu.eipc = sim->cpu.pc;
|
||||||
sim->cpu.psw.ep = 1;
|
sim->cpu.psw.ep = 1;
|
||||||
sim->cpu.nextPC = 0xFFFF0000 |
|
sim->cpu.nextPC = 0xFFFF0000 |
|
||||||
((cause & 0xFFF0) == 0xFF60 ? 0xFF60 : cause & 0xFFF0);
|
((cause & 0xFFE0) == 0xFF60 ? 0xFF60 : cause & 0xFFF0);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* All exceptions */
|
/* All exceptions */
|
||||||
|
|||||||
+26
-9
@@ -132,14 +132,19 @@ static void vsuEmulateChannel(VB *sim, Channel *chan) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* Envelope modification */
|
/* Envelope modification */
|
||||||
if (chan->env.enb && !chan->env.modmask && chan->env.clocks == 0) {
|
if (chan->env.clocks == 0) {
|
||||||
|
uint8_t new_envelope = chan->env.value;
|
||||||
if (chan->env.dir == 0 && chan->env.value != 0)
|
if (chan->env.dir == 0 && chan->env.value != 0)
|
||||||
chan->env.value--;
|
new_envelope--;
|
||||||
else if (chan->env.dir == 1 && chan->env.value != 15)
|
else if (chan->env.dir == 1 && chan->env.value != 15)
|
||||||
chan->env.value++;
|
new_envelope++;
|
||||||
else if (chan->env.rep)
|
else if (chan->env.rep && chan->env.modmask != 2) {
|
||||||
chan->env.value = chan->env.reload;
|
new_envelope = chan->env.reload;
|
||||||
else chan->env.modmask = 1;
|
chan->env.modmask = 0;
|
||||||
|
} else if (!chan->env.modmask)
|
||||||
|
chan->env.modmask = 1;
|
||||||
|
if (chan->env.enb && !chan->env.modmask)
|
||||||
|
chan->env.value = new_envelope;
|
||||||
chan->env.clocks = ((uint32_t) chan->env.interval + 1) * 307220;
|
chan->env.clocks = ((uint32_t) chan->env.interval + 1) * 307220;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -215,6 +220,7 @@ static void vsuWriteEV0(VB *sim, int index, uint8_t value) {
|
|||||||
chan->env.interval = value & 7;
|
chan->env.interval = value & 7;
|
||||||
chan->env.value = value >> 4 & 15;
|
chan->env.value = value >> 4 & 15;
|
||||||
chan->env.reload = chan->env.value;
|
chan->env.reload = chan->env.value;
|
||||||
|
if (chan->env.modmask == 1) chan->env.modmask = 2;
|
||||||
if (index == 4) {
|
if (index == 4) {
|
||||||
chan->freqmod = vsuCheckFreqMod(sim);
|
chan->freqmod = vsuCheckFreqMod(sim);
|
||||||
vsuNextFreqMod(sim, chan);
|
vsuNextFreqMod(sim, chan);
|
||||||
@@ -231,6 +237,12 @@ static void vsuWriteEV1(VB *sim, int index, uint8_t value) {
|
|||||||
/* Parse fields */
|
/* Parse fields */
|
||||||
chan->env.enb = value & 1;
|
chan->env.enb = value & 1;
|
||||||
chan->env.rep = value >> 1 & 1;
|
chan->env.rep = value >> 1 & 1;
|
||||||
|
if (
|
||||||
|
!chan->env.rep && (
|
||||||
|
(chan->env.reload == 0 && chan->env.dir == 0) ||
|
||||||
|
(chan->env.reload == 15 && chan->env.dir == 1)
|
||||||
|
)
|
||||||
|
) chan->env.modmask = 1;
|
||||||
|
|
||||||
/* Processing by channel */
|
/* Processing by channel */
|
||||||
switch (index) {
|
switch (index) {
|
||||||
@@ -286,7 +298,12 @@ static void vsuWriteINT(VB *sim, int index, uint8_t value) {
|
|||||||
/* Update state */
|
/* Update state */
|
||||||
chan->int_.clocks = 76805 * ((uint32_t) chan->int_.interval + 1);
|
chan->int_.clocks = 76805 * ((uint32_t) chan->int_.interval + 1);
|
||||||
chan->env.modmask = 0;
|
chan->env.modmask = 0;
|
||||||
if (chan->env.enb)
|
if (
|
||||||
|
!chan->env.rep && (
|
||||||
|
(chan->env.reload == 0 && chan->env.dir == 0) ||
|
||||||
|
(chan->env.reload == 15 && chan->env.dir == 1)
|
||||||
|
)
|
||||||
|
) chan->env.modmask = 1;
|
||||||
chan->env.clocks = 307220 * ((uint32_t) chan->env.interval + 1);
|
chan->env.clocks = 307220 * ((uint32_t) chan->env.interval + 1);
|
||||||
if (index != 5) {
|
if (index != 5) {
|
||||||
chan->wave.sample = 0;
|
chan->wave.sample = 0;
|
||||||
@@ -377,7 +394,7 @@ static void vsuEmulate(VB *sim, uint32_t clocks) {
|
|||||||
|
|
||||||
/* Clocks until next state change */
|
/* Clocks until next state change */
|
||||||
chan->until = chan->clocks;
|
chan->until = chan->clocks;
|
||||||
if (chan->env.enb && !chan->env.modmask &&
|
if (chan->env.enb && chan->env.modmask != 2 &&
|
||||||
chan->env.clocks < chan->until)
|
chan->env.clocks < chan->until)
|
||||||
chan->until = chan->env.clocks;
|
chan->until = chan->env.clocks;
|
||||||
if (chan->int_.auto_ && chan->int_.clocks < chan->until)
|
if (chan->int_.auto_ && chan->int_.clocks < chan->until)
|
||||||
@@ -387,7 +404,7 @@ static void vsuEmulate(VB *sim, uint32_t clocks) {
|
|||||||
|
|
||||||
/* Manage clocks */
|
/* Manage clocks */
|
||||||
chan->clocks -= chan->until;
|
chan->clocks -= chan->until;
|
||||||
if (chan->env.enb && !chan->env.modmask)
|
if (chan->env.enb && chan->env.modmask != 2)
|
||||||
chan->env.clocks -= chan->until;
|
chan->env.clocks -= chan->until;
|
||||||
if (chan->int_.auto_)
|
if (chan->int_.auto_)
|
||||||
chan->int_.clocks -= chan->until;
|
chan->int_.clocks -= chan->until;
|
||||||
|
|||||||
Reference in New Issue
Block a user