ACIA interrupt handling
This commit is contained in:
1 parent
76dcbd712a
commit
1bc8eda38d
12 files changed
+244
-25
No files matched your search
@@ -1,13 +1,83 @@
|
||||
package com.loomcom.symon;
|
||||
|
||||
import org.junit.*;
|
||||
|
||||
import com.loomcom.symon.devices.Acia;
|
||||
import com.loomcom.symon.exceptions.FifoUnderrunException;
|
||||
import org.junit.Test;
|
||||
|
||||
import static org.junit.Assert.*;
|
||||
import static org.junit.Assert.assertEquals;
|
||||
import static org.mockito.Mockito.*;
|
||||
|
||||
public class AciaTest {
|
||||
|
||||
@Test
|
||||
public void shouldTriggerInterruptOnRxFullIfRxIrqEnabled() throws Exception {
|
||||
Bus mockBus = mock(Bus.class);
|
||||
|
||||
Acia acia = new Acia(0x000);
|
||||
acia.setBus(mockBus);
|
||||
|
||||
// Disable TX IRQ, Enable RX IRQ
|
||||
acia.write(2, 0x00);
|
||||
|
||||
acia.rxWrite('a');
|
||||
|
||||
verify(mockBus, atLeastOnce()).assertIrq();
|
||||
}
|
||||
|
||||
@Test
|
||||
public void shouldNotTriggerInterruptOnRxFullIfRxIrqNotEnabled() throws Exception {
|
||||
Bus mockBus = mock(Bus.class);
|
||||
|
||||
Acia acia = new Acia(0x000);
|
||||
acia.setBus(mockBus);
|
||||
|
||||
// Disable TX IRQ, Disable RX IRQ
|
||||
acia.write(2, 0x02);
|
||||
|
||||
acia.rxWrite('a');
|
||||
|
||||
verify(mockBus, never()).assertIrq();
|
||||
}
|
||||
|
||||
@Test
|
||||
public void shouldTriggerInterruptOnTxEmptyIfTxIrqEnabled() throws Exception {
|
||||
Bus mockBus = mock(Bus.class);
|
||||
|
||||
Acia acia = new Acia(0x000);
|
||||
acia.setBus(mockBus);
|
||||
|
||||
// Enable TX IRQ, Disable RX IRQ
|
||||
acia.write(2, 0x06);
|
||||
|
||||
// Write data
|
||||
acia.write(0, 'a');
|
||||
|
||||
verify(mockBus, never()).assertIrq();
|
||||
|
||||
// Transmission should cause IRQ
|
||||
acia.txRead();
|
||||
|
||||
verify(mockBus, atLeastOnce()).assertIrq();
|
||||
}
|
||||
|
||||
@Test
|
||||
public void shouldNotTriggerInterruptOnTxEmptyIfTxIrqNotEnabled() throws Exception {
|
||||
Bus mockBus = mock(Bus.class);
|
||||
|
||||
Acia acia = new Acia(0x000);
|
||||
acia.setBus(mockBus);
|
||||
|
||||
// Disable TX IRQ, Disable RX IRQ
|
||||
acia.write(2, 0x02);
|
||||
|
||||
// Write data
|
||||
acia.write(0, 'a');
|
||||
|
||||
// Transmission should cause IRQ
|
||||
acia.txRead();
|
||||
|
||||
verify(mockBus, never()).assertIrq();
|
||||
}
|
||||
|
||||
@Test
|
||||
public void newAciaShouldHaveTxEmptyStatus() throws Exception {
|
||||
Acia acia = new Acia(0x000);
|
||||
|
||||
@@ -418,6 +418,50 @@ public class CpuTest extends TestCase {
|
||||
assertEquals(0x02, cpu.getAccumulator());
|
||||
}
|
||||
|
||||
public void testIrqPushesCorrectReturnAddressOntoStack() throws Exception {
|
||||
// Ensure the IRQs are enabled
|
||||
cpu.clearIrqDisableFlag();
|
||||
|
||||
// Set the IRQ vector
|
||||
bus.write(0xffff, 0x10);
|
||||
bus.write(0xfffe, 0x00);
|
||||
|
||||
// Create an IRQ handler at 0x1000 that just RTIs.
|
||||
cpu.setProgramCounter(0x1000);
|
||||
bus.loadProgram(0xea, 0xea, 0x40); // NOP, NOP, RTI
|
||||
|
||||
cpu.setProgramCounter(0x0200);
|
||||
|
||||
// Create a little program at 0x0200 with three instruction sizes.
|
||||
bus.loadProgram(0x18, // CLC
|
||||
0xa9, 0x01, // LDA #$01
|
||||
0x6d, 0x06, 0x02, // ADC $0207
|
||||
0x00, // BRK
|
||||
0x03); // $03 (data @ $0206)
|
||||
|
||||
cpu.step(); // CLC
|
||||
assertEquals(0x0201, cpu.getProgramCounter()); // First instruction executed.
|
||||
assertEquals(0x00, cpu.getAccumulator());
|
||||
|
||||
cpu.assertIrq();
|
||||
cpu.step(); // NOP
|
||||
assertEquals(0x1001, cpu.getProgramCounter());
|
||||
cpu.step(); // NOP
|
||||
assertEquals(0x1002, cpu.getProgramCounter());
|
||||
cpu.step(); // RTI: PC -> 0x0201
|
||||
assertEquals(0x0201, cpu.getProgramCounter());
|
||||
cpu.step(); // LDA $#01
|
||||
assertEquals(0x0203, cpu.getProgramCounter());
|
||||
|
||||
cpu.assertIrq();
|
||||
cpu.step(); // NOP
|
||||
assertEquals(0x1001, cpu.getProgramCounter());
|
||||
cpu.step(); // NOP
|
||||
assertEquals(0x1002, cpu.getProgramCounter());
|
||||
cpu.step(); // RTI: PC -> 0x0203
|
||||
assertEquals(0x0203, cpu.getProgramCounter());
|
||||
}
|
||||
|
||||
public void testNmi() throws Exception {
|
||||
// Set the NMI vector to 0x1000
|
||||
bus.write(0xfffb, 0x10);
|
||||
|
||||
Reference in new issue
Block a user