package dcpu.tests;
import static org.junit.Assert.*;
import org.junit.Test;
import dcpu.Dcpu;
import static dcpu.DcpuConstants.*;
public class DCPUInterrupts {
@Test
public void swi() {
Dcpu d = mkcpu(
ASSEMBLE(ADV, IAS, SHORT_LIT(4)),
ASSEMBLE(ADV, IAQ, SHORT_LIT(0)),
ASSEMBLE(ADV, INT, SHORT_LIT(10)),
ASSEMBLE(SUB, PC, SHORT_LIT(1)),
ASSEMBLE(SET, EX, REG_A),
ASSEMBLE(ADV, RFI, SHORT_LIT(0))
);
d.step();// IAS 4
assertEquals((char)4, d.regs.ia);
assertEquals(1, d.cyclecnt);
d.cyclecnt = 0;
d.step();// IAQ 0, interrupts no longer queued
assertEquals(false, d.queue_interrupts);
d.cyclecnt = 0;
d.step();//INT 10
assertEquals(4, d.cyclecnt);
assertEquals(false, d.interrupts.isEmpty());
d.cyclecnt = 0;
d.step();//One step phase for entering interrupt
assertEquals((char)4, d.regs.pc);
assertEquals(0, d.cyclecnt);
assertEquals((char)10, d.regs.gp[REG_A]);
d.step();//set EX, REG_A
assertEquals((char)10, d.regs.ex);
assertEquals(1, d.cyclecnt);
d.cyclecnt = 0;
d.step();//rfi
assertEquals((char)0, d.regs.gp[REG_A]);
assertEquals((char)3, d.regs.pc);
}
@Test
public void iag() {
Dcpu d = mkcpu(
ASSEMBLE(ADV, IAG, REG_A)
);
d.regs.ia = (char) 10;
d.step();
assertEquals(1, d.cyclecnt);
assertEquals((char)10, d.regs.gp[REG_A]);
}
}