wokwi/rp2040js

RSBS - SBCS wrong flags

Turro75 opened this issue · 0 comments

SBCS instruction fails with this test:

it('should execute a sbcs r0, r3 instruction', async () => {
await cpu.setPC(0x20000000);
await cpu.writeUint16(0x20000000, opcodeSBCS(r0, r3));
await cpu.setRegisters({ r0: 0, r3: 0x80000000, C: true });
await cpu.singleStep();
const registers = await cpu.readRegisters();
expect(registers.r0).toEqual(0x80000000);
expect(registers.N).toEqual(true);
expect(registers.Z).toEqual(false);
expect(registers.C).toEqual(false);
expect(registers.V).toEqual(true);
});

it('should execute a sbcs r0, r3 instruction', async () => {
await cpu.setPC(0x20000000);
await cpu.writeUint16(0x20000000, opcodeSBCS(r0, r3));
await cpu.setRegisters({ r0: 0x80000000, r3: 0x0, C: false });
await cpu.singleStep();
const registers = await cpu.readRegisters();
expect(registers.r0).toEqual(0x7fffffff);
expect(registers.N).toEqual(false);
expect(registers.Z).toEqual(false);
expect(registers.C).toEqual(true);
expect(registers.V).toEqual(true);
});

and RSBS

it('should execute a rsbs r0, r3 instruction', async () => {
// This instruction is also calledasync negs
await cpu.setPC(0x20000000);
await cpu.writeUint16(0x20000000, opcodeRSBS(r0, r3));
await cpu.setRegisters({ r3: 0x80000000 });
await cpu.singleStep();
const registers = await cpu.readRegisters();
expect(registers.r0).toEqual(0x80000000);
expect(registers.N).toEqual(true);
expect(registers.Z).toEqual(false);
expect(registers.C).toEqual(false);
expect(registers.V).toEqual(true);
});

it('should execute a rsbs r0, r3 instruction', async () => {
// This instruction is also calledasync negs
await cpu.setPC(0x20000000);
await cpu.writeUint16(0x20000000, opcodeRSBS(r0, r3));
await cpu.setRegisters({ r3: 0x7fffffff });
await cpu.singleStep();
const registers = await cpu.readRegisters();
expect(registers.r0).toEqual(0x80000001);
expect(registers.N).toEqual(true);
expect(registers.Z).toEqual(false);
expect(registers.C).toEqual(false);
expect(registers.V).toEqual(false);
});

the fix is easy, both must be rewritten as CMP/SUBS, a PR with is coming