fox32+fox32asm: Add proper support for greater than and less than

This adds IFGT, IFGTEQ, IFLT, and IFLTEQ, which makes it easier to
check for these conditions.
This commit is contained in:
Ry 2022-03-12 12:15:27 -08:00
parent 342c3e6061
commit 998646cb80
2 changed files with 19 additions and 7 deletions

View File

@ -22,13 +22,17 @@ If the instruction doesn't allow variable sizes or a size was not specified, set
| 3- | | DEC[.8,16,32] | REM[.8,16,32] | NOT[.8,16,32] | | | | | | RTA | RETI | | | | | | | 3- | | DEC[.8,16,32] | REM[.8,16,32] | NOT[.8,16,32] | | | | | | RTA | RETI | | | | | |
# Condition table # Condition table
| | | | | | |
| :---: | -------- | | :---: | ------ | --------------------------------------------- |
| 0b000 | (always) | | 0b000 | --- | always |
| 0b001 | IFZ | | 0b001 | IFZ | zero |
| 0b010 | IFNZ | | 0b010 | IFNZ | not zero |
| 0b011 | IFC | | 0b011 | IFC | carry |
| 0b100 | IFNC | | 0b011 | IFLT | less than (equivalent to IFC) |
| 0b100 | IFNC | not carry |
| 0b100 | IFGTEQ | greater than or equal to (equivalent to IFNC) |
| 0b101 | IFGT | greater than |
| 0b110 | IFLTEQ | less than or equal to |
# Destination table # Destination table
| | | | | |

View File

@ -73,6 +73,8 @@ impl Cpu {
Condition::NotZero => !self.flag.zero, Condition::NotZero => !self.flag.zero,
Condition::Carry => self.flag.carry, Condition::Carry => self.flag.carry,
Condition::NotCarry => !self.flag.carry, Condition::NotCarry => !self.flag.carry,
Condition::GreaterThan => !self.flag.carry && !self.flag.zero,
Condition::LessThanEqualTo => self.flag.carry || self.flag.zero,
} }
} }
fn relative_to_absolute(&self, relative_address: u32) -> u32 { fn relative_to_absolute(&self, relative_address: u32) -> u32 {
@ -2689,6 +2691,10 @@ enum Condition {
NotZero, NotZero,
Carry, Carry,
NotCarry, NotCarry,
GreaterThan,
// GreaterThanEqualTo is equivalent to NotCarry
// LessThan is equivalent to Carry
LessThanEqualTo,
} }
#[derive(Debug)] #[derive(Debug)]
@ -2783,6 +2789,8 @@ impl Instruction {
0x20 => Condition::NotZero, 0x20 => Condition::NotZero,
0x30 => Condition::Carry, 0x30 => Condition::Carry,
0x40 => Condition::NotCarry, 0x40 => Condition::NotCarry,
0x50 => Condition::GreaterThan,
0x60 => Condition::LessThanEqualTo,
_ => return None, _ => return None,
}; };
match opcode { match opcode {