40 uint16_t base_addr, uint8_t len,
45 return ge->
mem[(uint16_t)(base_addr - pos)];
52 uint16_t base_addr, uint8_t len,
53 uint8_t pos, uint8_t val)
69 uint16_t a_addr, uint8_t a_len,
70 uint16_t b_addr, uint8_t b_len)
77 uint8_t result_nonzero = 0;
80 for (uint8_t pos = 0; pos < a_len; pos++) {
81 uint16_t sum = (uint16_t)
field_byte(
ge, a_addr, a_len, pos)
84 carry = (uint8_t)(sum >> 8);
85 uint8_t
byte = (uint8_t)(sum & 0xFF);
102 cc = result_nonzero ? 3u : 2u;
104 cc = result_nonzero ? 1u : 0u;
119 uint16_t a_addr, uint8_t a_len,
120 uint16_t b_addr, uint8_t b_len)
131 uint8_t result_nonzero = 0;
133 for (uint8_t pos = 0; pos < a_len; pos++) {
134 int16_t diff = (int16_t)
field_byte(
ge, a_addr, a_len, pos)
143 uint8_t
byte = (uint8_t)(diff & 0xFF);
161 uint8_t negative = borrow;
167 }
else if (!result_nonzero) {
186 uint16_t base_addr, uint8_t len,
201 uint16_t a_addr, uint8_t a_len,
202 uint16_t b_addr, uint8_t b_len)
209 uint8_t result_nonzero = 0;
211 for (uint8_t pos = 0; pos < a_len; pos++) {
213 uint8_t sum = (uint8_t)((aorig & 0x0F)
217 uint8_t digit = sum % 10;
233 alu_set_cc(
ge, (uint8_t)((carry ? 2u : 0u) | (result_nonzero ? 1u : 0u)));
250 uint16_t a_addr, uint8_t a_len,
251 uint16_t b_addr, uint8_t b_len)
258 uint8_t result_nonzero = 0;
260 for (uint8_t pos = 0; pos < a_len; pos++) {
262 int8_t diff = (int8_t)(aorig & 0x0F)
271 uint8_t digit = (uint8_t)diff;
287 else if (!result_nonzero)
static void field_byte_set(struct ge *ge, uint16_t base_addr, uint8_t len, uint8_t pos, uint8_t val)
Write one byte into a multi-byte big-endian field.
static uint8_t dec_digit(const struct ge *ge, uint16_t base_addr, uint8_t len, uint8_t pos)
void alu_ad(struct ge *ge, uint16_t a_addr, uint8_t a_len, uint16_t b_addr, uint8_t b_len)
AD – Add Decimal (opcode 0xFA).
static uint8_t field_byte(const struct ge *ge, uint16_t base_addr, uint8_t len, uint8_t pos)
Read one byte from a multi-byte big-endian field at position pos (0 = least-significant byte = rightm...
void alu_sb(struct ge *ge, uint16_t a_addr, uint8_t a_len, uint16_t b_addr, uint8_t b_len)
SB – Subtract Binary (opcode 0xFF).
void alu_sd(struct ge *ge, uint16_t a_addr, uint8_t a_len, uint16_t b_addr, uint8_t b_len)
SD – Subtract Decimal (opcode 0xFB).
void alu_ab(struct ge *ge, uint16_t a_addr, uint8_t a_len, uint16_t b_addr, uint8_t b_len)
AB – Add Binary (opcode 0xFE).
Binary and decimal (unpacked) arithmetic helpers for the GE-120/130.
void alu_set_cc(struct ge *ge, uint8_t cc)
void ge_mem_store8(struct ge *ge, uint16_t addr, uint8_t val)
Store a byte with generated odd parity + mark-written (for the hybrid ALU/SS write paths that write g...
The entire state of the emulated system, including registers, memory, peripherals and timings.
uint8_t mem[MEM_SIZE]
The memory of the emulated system.