29 return (uint16_t)(((uint16_t)
ge->
mem[addr] << 8) |
30 (uint16_t)
ge->
mem[(uint16_t)(addr + 1)]);
83 else if (reg_val == value)
112 uint32_t full = (uint32_t)(*reg) + (uint32_t)value;
113 uint16_t result = (uint16_t)(full & 0xFFFF);
116 uint8_t carry_out = (full >> 16) & 1;
126 uint8_t carry_into_15 = (uint8_t)(
127 (((uint32_t)(*reg & 0x7FFF)) + ((uint32_t)(value & 0x7FFF))) >> 15
136 uint8_t cc = (uint8_t)((carry_out << 1) | (result != 0 ? 1 : 0));
164 uint16_t result = (uint16_t)(*reg - value);
170 uint8_t borrow_out = (*reg < value) ? 1 : 0;
176 uint8_t borrow_into_15 = (uint8_t)((*reg & 0x7FFF) < (value & 0x7FFF) ? 1 : 0);
179 ge->
URPU = borrow_into_15;
189 int16_t sresult = (int16_t)result;
193 else if (sresult == 0)
229 uint16_t field, uint16_t len, uint8_t model)
233 for (i = 0; i < len; i++) {
234 if (
ge->
mem[(uint16_t)(field + i)] == model) {
235 *r7 = (uint16_t)(field + i + 1);
242 *r7 = (uint16_t)(field + len);
264 uint16_t field, uint16_t len, uint8_t model)
269 for (i = 0; i < len; i++) {
270 uint16_t pos = (uint16_t)(field - i);
271 if (
ge->
mem[pos] == model) {
272 *r7 = (uint16_t)(pos - 1);
279 *r7 = (uint16_t)(field - len);
305void alu_mvq(
struct ge *
ge, uint16_t dst, uint16_t src, uint8_t len)
307 uint8_t any_nonzero = 0;
311 for (i = 0; i < len; i++) {
312 uint16_t sa = (uint16_t)(src - i);
313 uint16_t da = (uint16_t)(dst - i);
314 uint8_t digit =
ge->
mem[sa] & 0x0F;
315 uint8_t zone =
ge->
mem[da] & 0xF0;
356 for (i = 0; i < len; i++) {
357 uint8_t da =
ge->
mem[(uint16_t)(a - (len - 1) + i)] & 0x0F;
358 uint8_t db =
ge->
mem[(uint16_t)(b - (len - 1) + i)] & 0x0F;
void alu_set_cc(struct ge *ge, uint8_t cc)
void alu_mvq(struct ge *ge, uint16_t dst, uint16_t src, uint8_t len)
alu_mvq - Move Quartets (MVQ, 0xF8)
void alu_cmq(struct ge *ge, uint16_t a, uint16_t b, uint8_t len)
alu_cmq - Compare Quartets (CMQ, 0xF9)
void alu_lr(struct ge *ge, uint16_t *reg, uint16_t addr)
alu_lr - Load Register (LR, 0xBC)
void alu_cmr(struct ge *ge, uint16_t reg_val, uint16_t value)
alu_cmr - Compare Memory to Register (CMR, 0xBD)
void alu_sr(struct ge *ge, uint16_t *r7, uint16_t field, uint16_t len, uint8_t model)
alu_sr - Search Right (SR, 0xD9)
static void mem_write16(struct ge *ge, uint16_t addr, uint16_t val)
mem_write16 - write a big-endian 16-bit word to memory.
static uint16_t mem_read16(struct ge *ge, uint16_t addr)
mem_read16 - read a big-endian 16-bit word from memory.
void alu_smr(struct ge *ge, uint16_t *reg, uint16_t value)
alu_smr - Subtract Memory from Register (SMR, 0xBF)
void alu_la(struct ge *ge, uint16_t *reg, uint16_t addr)
alu_la - Load Address (LA, 0x68)
void alu_sl(struct ge *ge, uint16_t *r7, uint16_t field, uint16_t len, uint8_t model)
alu_sl - Search Left (SL, 0xDB)
void alu_str(struct ge *ge, uint16_t reg_val, uint16_t addr)
alu_str - Store Register (STR, 0x84)
void alu_amr(struct ge *ge, uint16_t *reg, uint16_t value)
alu_amr - Add Memory to Register (AMR, 0xBE)
ALU helpers for GE-120/GE-130 register and memory-field operations.
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.