diff options
Diffstat (limited to 'mixlib')
-rw-r--r-- | mixlib/xmix_vm.c | 465 |
1 files changed, 233 insertions, 232 deletions
diff --git a/mixlib/xmix_vm.c b/mixlib/xmix_vm.c index c810a71..9eede01 100644 --- a/mixlib/xmix_vm.c +++ b/mixlib/xmix_vm.c @@ -1,22 +1,22 @@ /* ---------------------- xmix_vm.c : * Implementation of the functions declared in xmix_vm.h * ------------------------------------------------------------------ - * Copyright (C) 2000 Free Software Foundation, Inc. - * + * Copyright (C) 2000, 2003 Free Software Foundation, Inc. + * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. - * + * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. - * + * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. - * + * */ @@ -32,23 +32,23 @@ G_INLINE_FUNC mix_device_t * get_dev_ (mix_vm_t *vm, mix_fspec_t type); G_INLINE_FUNC mix_address_t -get_M_(const mix_vm_t *vm, const mix_ins_t *ins) +get_M_ (const mix_vm_t *vm, const mix_ins_t *ins) { if ( ins->index == 0 ) return ins->address; else - return mix_short_add(ins->address, - mix_word_to_short_fast(get_rI_(vm, ins->index))); + return mix_short_add (ins->address, + mix_word_to_short_fast (get_rI_ (vm, ins->index))); } G_INLINE_FUNC mix_word_t -get_V_(const mix_vm_t *vm, const mix_ins_t *ins) +get_V_ (const mix_vm_t *vm, const mix_ins_t *ins) { - return mix_word_get_field(ins->fspec, get_cell_(vm, get_M_(vm,ins))); + return mix_word_get_field (ins->fspec, get_cell_ (vm, get_M_ (vm,ins))); } G_INLINE_FUNC mix_device_t * -get_dev_ (mix_vm_t *vm, mix_fspec_t type) +get_dev_ (mix_vm_t *vm, mix_fspec_t type) { if (type >= BD_NO_) return NULL; if (vm->devices[type] == NULL) @@ -58,165 +58,165 @@ get_dev_ (mix_vm_t *vm, mix_fspec_t type) /* Instruction handlers */ -static gboolean -nop_handler_(mix_vm_t *vm, const mix_ins_t *ins) +static gboolean +nop_handler_ (mix_vm_t *vm, const mix_ins_t *ins) { - g_assert(ins->opcode == mix_opNOP); - inc_loc_(vm); + g_assert (ins->opcode == mix_opNOP); + inc_loc_ (vm); return TRUE; } -static gboolean -add_handler_(mix_vm_t *vm, const mix_ins_t *ins) +static gboolean +add_handler_ (mix_vm_t *vm, const mix_ins_t *ins) { - mix_word_t val = get_V_(vm, ins); - g_assert(ins->opcode == mix_opADD || ins->opcode == mix_opSUB); - if ( ins->opcode == mix_opSUB ) mix_word_reverse_sign(val); - if ( mix_word_add_and_carry(get_rA_(vm), val, NULL, &get_rA_(vm)) ) - set_over_(vm,TRUE); - inc_loc_(vm); + mix_word_t val = get_V_ (vm, ins); + g_assert (ins->opcode == mix_opADD || ins->opcode == mix_opSUB); + if ( ins->opcode == mix_opSUB ) mix_word_reverse_sign (val); + if ( mix_word_add_and_carry (get_rA_ (vm), val, NULL, &get_rA_ (vm)) ) + set_over_ (vm,TRUE); + inc_loc_ (vm); return TRUE; } -static gboolean -mul_handler_(mix_vm_t *vm, const mix_ins_t *ins) +static gboolean +mul_handler_ (mix_vm_t *vm, const mix_ins_t *ins) { - g_assert(ins->opcode == mix_opMUL); - mix_word_mul(get_rA_(vm), get_V_(vm,ins), &get_rA_(vm), &get_rX_(vm)); - inc_loc_(vm); + g_assert (ins->opcode == mix_opMUL); + mix_word_mul (get_rA_ (vm), get_V_ (vm,ins), &get_rA_ (vm), &get_rX_ (vm)); + inc_loc_ (vm); return TRUE; } -static gboolean -div_handler_(mix_vm_t *vm, const mix_ins_t *ins) +static gboolean +div_handler_ (mix_vm_t *vm, const mix_ins_t *ins) { - g_assert(ins->opcode == mix_opDIV); - if ( mix_word_div(get_rA_(vm), get_rX_(vm), get_V_(vm,ins), - &get_rA_(vm), &get_rX_(vm)) ) - set_over_(vm,TRUE); - inc_loc_(vm); + g_assert (ins->opcode == mix_opDIV); + if ( mix_word_div (get_rA_ (vm), get_rX_ (vm), get_V_ (vm,ins), + &get_rA_ (vm), &get_rX_ (vm)) ) + set_over_ (vm,TRUE); + inc_loc_ (vm); return TRUE; } -static gboolean -spc_handler_(mix_vm_t *vm, const mix_ins_t *ins) +static gboolean +spc_handler_ (mix_vm_t *vm, const mix_ins_t *ins) { - g_assert(ins->opcode == mix_opSPC); - - switch (mix_ins_id_from_ins(*ins)) { - case mix_HLT: halt_(vm, TRUE); break; + g_assert (ins->opcode == mix_opSPC); + + switch (mix_ins_id_from_ins (*ins)) { + case mix_HLT: halt_ (vm, TRUE); break; case mix_CHAR: - { - guint32 num = mix_word_magnitude(get_rA_(vm)); - mix_char_t z = mix_ascii_to_char('0'); + { + guint32 num = mix_word_magnitude (get_rA_ (vm)); + mix_char_t z = mix_ascii_to_char ('0'); guint i; for (i = 5; 0 < i; --i, num /= 10) - mix_word_set_byte(&get_rX_(vm), i, z + num % 10); + mix_word_set_byte (&get_rX_ (vm), i, z + num % 10); for (i = 5; 0 < i; --i, num /= 10) - mix_word_set_byte(&get_rA_(vm), i, z + num % 10); + mix_word_set_byte (&get_rA_ (vm), i, z + num % 10); break; } - case mix_NUM: - { + case mix_NUM: + { guint i; mix_word_t num = MIX_WORD_ZERO; mix_word_t ten = 10; for (i = 1; i <= 5; ++i) { - mix_word_mul(ten, num, NULL, &num); - mix_word_add_and_carry(num, mix_word_get_byte(get_rA_(vm),i)%10, - NULL, &num); + mix_word_mul (ten, num, NULL, &num); + mix_word_add_and_carry (num, mix_word_get_byte (get_rA_ (vm),i)%10, + NULL, &num); } for (i = 1; i <= 5; ++i) { - mix_word_mul(ten, num, NULL, &num); - mix_word_add_and_carry(num, mix_word_get_byte(get_rX_(vm),i)%10, - NULL, &num); + mix_word_mul (ten, num, NULL, &num); + mix_word_add_and_carry (num, mix_word_get_byte (get_rX_ (vm),i)%10, + NULL, &num); } - set_rA_(vm, - mix_word_is_negative(get_rA_(vm)) ? mix_word_negative(num):num); + set_rA_ (vm, mix_word_is_negative (get_rA_ (vm)) ? + mix_word_negative (num) : num); break; } default: return FALSE; } - inc_loc_(vm); + inc_loc_ (vm); return TRUE; } -static gboolean -sla_handler_(mix_vm_t *vm, const mix_ins_t *ins) +static gboolean +sla_handler_ (mix_vm_t *vm, const mix_ins_t *ins) { - mix_short_t n = get_M_(vm,ins); - - g_assert(ins->opcode == mix_opSLx); - g_return_val_if_fail(mix_short_is_positive(n), FALSE); - - switch ( mix_ins_id_from_ins(*ins) ) { + mix_short_t n = get_M_ (vm,ins); + + g_assert (ins->opcode == mix_opSLx); + g_return_val_if_fail (mix_short_is_positive (n), FALSE); + + switch ( mix_ins_id_from_ins (*ins) ) { case mix_SLA: - mix_word_shift_left(get_rA_(vm), MIX_WORD_ZERO, n, &get_rA_(vm), NULL); + mix_word_shift_left (get_rA_ (vm), MIX_WORD_ZERO, n, &get_rA_ (vm), NULL); break; case mix_SRA: - mix_word_shift_right(get_rA_(vm), MIX_WORD_ZERO, n, &get_rA_(vm), NULL); + mix_word_shift_right (get_rA_ (vm), MIX_WORD_ZERO, n, &get_rA_ (vm), NULL); break; case mix_SLAX: - mix_word_shift_left(get_rA_(vm), get_rX_(vm), n, - &get_rA_(vm), &get_rX_(vm)); + mix_word_shift_left (get_rA_ (vm), get_rX_ (vm), n, + &get_rA_ (vm), &get_rX_ (vm)); break; case mix_SRAX: - mix_word_shift_right(get_rA_(vm), get_rX_(vm), n, - &get_rA_(vm), &get_rX_(vm)); + mix_word_shift_right (get_rA_ (vm), get_rX_ (vm), n, + &get_rA_ (vm), &get_rX_ (vm)); break; case mix_SLC: - mix_word_shift_left_circular(get_rA_(vm), get_rX_(vm), n, - &get_rA_(vm), &get_rX_(vm)); + mix_word_shift_left_circular (get_rA_ (vm), get_rX_ (vm), n, + &get_rA_ (vm), &get_rX_ (vm)); break; case mix_SRC: - mix_word_shift_right_circular(get_rA_(vm), get_rX_(vm), n, - &get_rA_(vm), &get_rX_(vm)); + mix_word_shift_right_circular (get_rA_ (vm), get_rX_ (vm), n, + &get_rA_ (vm), &get_rX_ (vm)); break; default: return FALSE; } - - inc_loc_(vm); + + inc_loc_ (vm); return TRUE; } -static gboolean -mov_handler_(mix_vm_t *vm, const mix_ins_t *ins) +static gboolean +mov_handler_ (mix_vm_t *vm, const mix_ins_t *ins) { - mix_short_t from = get_M_(vm,ins), - to = mix_word_to_short_fast(get_rI_(vm,1)); + mix_short_t from = get_M_ (vm,ins), + to = mix_word_to_short_fast (get_rI_ (vm,1)); guint k, delta = ins->fspec; - - g_assert(ins->opcode == mix_opMOVE); - g_return_val_if_fail(mix_short_is_positive(from), FALSE); - g_return_val_if_fail(mix_short_is_positive(to), FALSE); - g_return_val_if_fail(MEMOK_(from + delta -1), FALSE); - g_return_val_if_fail(MEMOK_(to + delta - 1), FALSE); - + + g_assert (ins->opcode == mix_opMOVE); + g_return_val_if_fail (mix_short_is_positive (from), FALSE); + g_return_val_if_fail (mix_short_is_positive (to), FALSE); + g_return_val_if_fail (MEMOK_ (from + delta -1), FALSE); + g_return_val_if_fail (MEMOK_ (to + delta - 1), FALSE); + for (k = 0; k < delta; ++k) - set_cell_(vm, to+k, get_cell_(vm, from+k)); - set_rI_(vm, 1, to+delta); - inc_loc_(vm); + set_cell_ (vm, to+k, get_cell_ (vm, from+k)); + set_rI_ (vm, 1, to+delta); + inc_loc_ (vm); return TRUE; } static gboolean -lda_handler_(mix_vm_t *vm, const mix_ins_t *ins) +lda_handler_ (mix_vm_t *vm, const mix_ins_t *ins) { gint r = 0; mix_word_t val; - mix_ins_id_t id = mix_ins_id_from_ins(*ins); - - g_assert(id >= mix_LDA && id <= mix_LDXN); - - val = get_V_(vm, ins); - if ( id > mix_LDX && mix_fspec_left(ins->fspec) == 0) - mix_word_reverse_sign(val); + mix_ins_id_t id = mix_ins_id_from_ins (*ins); + + g_assert (id >= mix_LDA && id <= mix_LDXN); + + val = get_V_ (vm, ins); + if ( id > mix_LDX && mix_fspec_left (ins->fspec) == 0) + mix_word_reverse_sign (val); if ( (id > mix_LDA && id < mix_LDX) || (id > mix_LDAN && id < mix_LDXN) ) /* Bytes 1-3 of I regs are always null */ - val = mix_word_set_field(mix_fspec_new(1,3),MIX_WORD_ZERO,val); - + val = mix_word_set_field (mix_fspec_new (1,3),MIX_WORD_ZERO,val); + switch (id) { case mix_LDA: case mix_LDAN: r = A_; break; case mix_LDX: case mix_LDXN: r = X_; break; @@ -226,331 +226,332 @@ lda_handler_(mix_vm_t *vm, const mix_ins_t *ins) case mix_LD4: case mix_LD4N: r = I4_; break; case mix_LD5: case mix_LD5N: r = I5_; break; case mix_LD6: case mix_LD6N: r = I6_; break; - default: g_assert_not_reached(); + default: g_assert_not_reached (); } - set_reg_(vm, r, val); - inc_loc_(vm); + set_reg_ (vm, r, val); + inc_loc_ (vm); return TRUE; } static gboolean -sta_handler_(mix_vm_t *vm, const mix_ins_t *ins) +sta_handler_ (mix_vm_t *vm, const mix_ins_t *ins) { - mix_address_t addr = get_M_(vm, ins); - mix_ins_id_t id = mix_ins_id_from_ins(*ins); + mix_address_t addr = get_M_ (vm, ins); + mix_ins_id_t id = mix_ins_id_from_ins (*ins); mix_word_t from; - - g_assert(id >= mix_STA && id <= mix_STZ); + + g_assert (id >= mix_STA && id <= mix_STZ); switch (id) { - case mix_STA: from = get_rA_(vm); break; - case mix_STX: from = get_rX_(vm); break; - case mix_STJ: from = get_rJ_(vm); break; + case mix_STA: from = get_rA_ (vm); break; + case mix_STX: from = get_rX_ (vm); break; + case mix_STJ: from = get_rJ_ (vm); break; case mix_STZ: from = MIX_WORD_ZERO; break; - default: from = get_rI_(vm, id - mix_ST1 + 1); break; + default: from = get_rI_ (vm, id - mix_ST1 + 1); break; } - set_cell_(vm, addr, - mix_word_store_field(ins->fspec, from, get_cell_(vm, addr))); - inc_loc_(vm); + set_cell_ (vm, addr, + mix_word_store_field (ins->fspec, from, get_cell_ (vm, addr))); + inc_loc_ (vm); return TRUE; } -static gboolean +static gboolean jbs_handler_ (mix_vm_t *vm, const mix_ins_t *ins) { g_assert (ins->opcode == mix_opJBUS); g_return_val_if_fail (ins->fspec < BD_NO_, TRUE); g_return_val_if_fail (get_dev_ (vm, ins->fspec) != NULL, TRUE); if ( mix_device_busy (get_dev_ (vm, ins->fspec)) ) { - set_rJ_(vm, get_loc_ (vm)); - set_loc_ (vm, get_M_ (vm, ins)); + set_rJ_ (vm, get_loc_ (vm)); + set_loc_ (vm, get_M_ (vm, ins)); } else inc_loc_ (vm); return TRUE; } -static gboolean -ioc_handler_(mix_vm_t *vm, const mix_ins_t *ins) +static gboolean +ioc_handler_ (mix_vm_t *vm, const mix_ins_t *ins) { mix_address_t addr; mix_device_t *dev; gboolean result; - - g_assert(ins->opcode == mix_opIOC); + + g_assert (ins->opcode == mix_opIOC); addr = get_M_ (vm, ins); g_return_val_if_fail (ins->fspec < BD_NO_, TRUE); dev = get_dev_ (vm, ins->fspec); g_return_val_if_fail (dev != NULL, TRUE); result = mix_device_ioc (dev, addr); - - inc_loc_(vm); + + inc_loc_ (vm); return result; } -static gboolean +static gboolean inp_handler_ (mix_vm_t *vm, const mix_ins_t *ins) { mix_address_t addr; mix_device_t *dev; gboolean result; - - g_assert(ins->opcode == mix_opIN); + + g_assert (ins->opcode == mix_opIN); addr = get_M_ (vm, ins); g_return_val_if_fail (ins->fspec < BD_NO_, TRUE); - g_return_val_if_fail (MEMOK_(addr), TRUE); + g_return_val_if_fail (MEMOK_ (addr), TRUE); dev = get_dev_ (vm, ins->fspec); g_return_val_if_fail ( dev != NULL, TRUE); - g_return_val_if_fail (MEM_CELLS_NO_ - addr > mix_device_block_size(dev), + g_return_val_if_fail (MEM_CELLS_NO_ - addr > mix_device_block_size (dev), TRUE); result = mix_device_read (dev, get_cell_ptr_ (vm, addr)); - - inc_loc_(vm); + + inc_loc_ (vm); return result; } -static gboolean -out_handler_(mix_vm_t *vm, const mix_ins_t *ins) +static gboolean +out_handler_ (mix_vm_t *vm, const mix_ins_t *ins) { mix_address_t addr; mix_device_t *dev; gboolean result; - - g_assert(ins->opcode == mix_opOUT); + + g_assert (ins->opcode == mix_opOUT); addr = get_M_ (vm, ins); g_return_val_if_fail (ins->fspec < BD_NO_, TRUE); - g_return_val_if_fail (MEMOK_(addr), TRUE); + g_return_val_if_fail (MEMOK_ (addr), TRUE); dev = get_dev_ (vm, ins->fspec); g_return_val_if_fail ( dev != NULL, TRUE); - g_return_val_if_fail (MEM_CELLS_NO_ - addr > mix_device_block_size(dev), + g_return_val_if_fail (MEM_CELLS_NO_ - addr > mix_device_block_size (dev), TRUE); result = mix_device_write (dev, get_cell_ptr_ (vm, addr)); - - inc_loc_(vm); + + inc_loc_ (vm); return result; } -static gboolean -jrd_handler_(mix_vm_t *vm, const mix_ins_t *ins) +static gboolean +jrd_handler_ (mix_vm_t *vm, const mix_ins_t *ins) { - g_assert(ins->opcode == mix_opJRED); + g_assert (ins->opcode == mix_opJRED); g_return_val_if_fail (ins->fspec < BD_NO_, TRUE); g_return_val_if_fail (get_dev_ (vm, ins->fspec) != NULL, TRUE); inc_loc_ (vm); - if ( !mix_device_busy (get_dev_ (vm, ins->fspec)) ) + if ( !mix_device_busy (get_dev_ (vm, ins->fspec)) ) { - set_rJ_(vm, get_loc_(vm)); + set_rJ_ (vm, get_loc_ (vm)); set_loc_ (vm, get_M_ (vm, ins)); } return TRUE; } static gboolean -jmp_handler_(mix_vm_t *vm, const mix_ins_t *ins) +jmp_handler_ (mix_vm_t *vm, const mix_ins_t *ins) { gboolean jump = FALSE; - mix_address_t addr = get_M_(vm, ins); - mix_ins_id_t id = mix_ins_id_from_ins(*ins); - - g_assert(ins->opcode == mix_opJMP); - g_return_val_if_fail(MEMOK_(addr), FALSE); + mix_address_t addr = get_M_ (vm, ins); + mix_ins_id_t id = mix_ins_id_from_ins (*ins); + + g_assert (ins->opcode == mix_opJMP); + g_return_val_if_fail (MEMOK_ (addr), FALSE); switch ( id ) { case mix_JMP: case mix_JSJ: jump = TRUE; break; case mix_JOV: - jump = get_over_(vm); - if (jump) set_over_(vm, FALSE); + jump = get_over_ (vm); + if (jump) set_over_ (vm, FALSE); break; case mix_JNOV: - jump = !get_over_(vm); - set_over_(vm, FALSE); + jump = !get_over_ (vm); + set_over_ (vm, FALSE); break; case mix_JL: - jump = ( get_cmp_(vm) == mix_LESS ); + jump = ( get_cmp_ (vm) == mix_LESS ); break; case mix_JE: - jump = ( get_cmp_(vm) == mix_EQ ); + jump = ( get_cmp_ (vm) == mix_EQ ); break; case mix_JG: - jump = ( get_cmp_(vm) == mix_GREAT ); + jump = ( get_cmp_ (vm) == mix_GREAT ); break; case mix_JGE: - jump = ( get_cmp_(vm) != mix_LESS ); + jump = ( get_cmp_ (vm) != mix_LESS ); break; case mix_JNE: - jump = ( get_cmp_(vm) != mix_EQ ); + jump = ( get_cmp_ (vm) != mix_EQ ); break; case mix_JLE: - jump = ( get_cmp_(vm) != mix_GREAT ); + jump = ( get_cmp_ (vm) != mix_GREAT ); break; default: return FALSE; } - - inc_loc_(vm); + + inc_loc_ (vm); if ( jump ) { - if ( id != mix_JSJ ) set_rJ_(vm, get_loc_(vm)); - set_loc_(vm, addr); + if ( id != mix_JSJ ) set_rJ_ (vm, get_loc_ (vm)); + set_loc_ (vm, addr); } return TRUE; } static gboolean -jpx_handler_(mix_vm_t *vm, const mix_ins_t *ins) +jpx_handler_ (mix_vm_t *vm, const mix_ins_t *ins) { gboolean jump = FALSE; - mix_address_t addr = get_M_(vm, ins); - mix_ins_id_t id = mix_ins_id_from_ins(*ins); + mix_address_t addr = get_M_ (vm, ins); + mix_ins_id_t id = mix_ins_id_from_ins (*ins); mix_word_t val; - - g_assert(ins->opcode >= mix_opJAx || ins->opcode <= mix_opJXx); - g_return_val_if_fail(MEMOK_(addr), FALSE); - + + g_assert (ins->opcode >= mix_opJAx || ins->opcode <= mix_opJXx); + g_return_val_if_fail (MEMOK_ (addr), FALSE); + switch (ins->opcode) { - case mix_opJAx: val = get_rA_(vm); break; - case mix_opJXx: val = get_rX_(vm); break; - default: val = get_rI_(vm, ins->opcode - mix_opJAx); + case mix_opJAx: val = get_rA_ (vm); break; + case mix_opJXx: val = get_rX_ (vm); break; + default: val = get_rI_ (vm, ins->opcode - mix_opJAx); } - + switch (id) { case mix_JAN: case mix_JXN: case mix_J1N: case mix_J2N: case mix_J3N: case mix_J4N: case mix_J5N: case mix_J6N: - jump = mix_word_is_negative(val) && val != MIX_WORD_MINUS_ZERO; + jump = mix_word_is_negative (val) && val != MIX_WORD_MINUS_ZERO; break; case mix_JAZ: case mix_JXZ: case mix_J1Z: case mix_J2Z: case mix_J3Z: case mix_J4Z: case mix_J5Z: case mix_J6Z: - jump = mix_word_magnitude(val) == MIX_WORD_ZERO; + jump = mix_word_magnitude (val) == MIX_WORD_ZERO; break; case mix_JAP: case mix_JXP: case mix_J1P: case mix_J2P: case mix_J3P: case mix_J4P: case mix_J5P: case mix_J6P: - jump = mix_word_is_positive(val) && val != MIX_WORD_ZERO; + jump = mix_word_is_positive (val) && val != MIX_WORD_ZERO; break; case mix_JANN: case mix_JXNN: case mix_J1NN: case mix_J2NN: case mix_J3NN: case mix_J4NN: case mix_J5NN: case mix_J6NN: - jump = mix_word_magnitude(val) == MIX_WORD_ZERO - || mix_word_is_positive(val); + jump = mix_word_magnitude (val) == MIX_WORD_ZERO + || mix_word_is_positive (val); break; case mix_JANZ: case mix_JXNZ: case mix_J1NZ: case mix_J2NZ: case mix_J3NZ: case mix_J4NZ: case mix_J5NZ: case mix_J6NZ: - jump = mix_word_magnitude(val) != MIX_WORD_ZERO; + jump = mix_word_magnitude (val) != MIX_WORD_ZERO; break; case mix_JANP: case mix_JXNP: case mix_J1NP: case mix_J2NP: case mix_J3NP: case mix_J4NP: case mix_J5NP: case mix_J6NP: - jump = mix_word_magnitude(val) == MIX_WORD_ZERO - || mix_word_is_negative(val); + jump = mix_word_magnitude (val) == MIX_WORD_ZERO + || mix_word_is_negative (val); break; default: return FALSE; } - - inc_loc_(vm); + + inc_loc_ (vm); if ( jump ) { - set_rJ_(vm, get_loc_(vm)); - set_loc_(vm, addr); + set_rJ_ (vm, get_loc_ (vm)); + set_loc_ (vm, addr); } return TRUE; } static gboolean -ina_handler_(mix_vm_t *vm, const mix_ins_t *ins) +ina_handler_ (mix_vm_t *vm, const mix_ins_t *ins) { - mix_word_t val = mix_short_to_word_fast(get_M_(vm, ins)); - mix_ins_id_t id = mix_ins_id_from_ins(*ins); + mix_word_t val = mix_short_to_word_fast (get_M_ (vm, ins)); + mix_ins_id_t id = mix_ins_id_from_ins (*ins); gint r; - - g_assert(id >= mix_INCA && id <= mix_ENNX); - + + g_assert (id >= mix_INCA && id <= mix_ENNX); + switch (ins->opcode) { case mix_opINCA: r = A_; break; case mix_opINCX: r = X_; break; default: r = I1_ + ins->opcode - mix_opINC1; } - + switch (id) { case mix_ENTA: case mix_ENTX: break; - case mix_ENT1: case mix_ENT2: case mix_ENT3: - case mix_ENT4: case mix_ENT5: case mix_ENT6: - val = mix_word_set_field(mix_fspec_new(1,3), MIX_WORD_ZERO, val); + case mix_ENT1: case mix_ENT2: case mix_ENT3: + case mix_ENT4: case mix_ENT5: case mix_ENT6: + val = mix_word_set_field (mix_fspec_new (1,3), MIX_WORD_ZERO, val); break; case mix_INCA: case mix_INCX: - if ( mix_word_add_and_carry(val, get_reg_(vm, r), NULL, &val) ) - set_over_(vm, TRUE); + if ( mix_word_add_and_carry (val, get_reg_ (vm, r), NULL, &val) ) + set_over_ (vm, TRUE); break; - case mix_INC1: case mix_INC2: case mix_INC3: + case mix_INC1: case mix_INC2: case mix_INC3: case mix_INC4: case mix_INC5: case mix_INC6: - mix_word_add_and_carry(val, get_reg_(vm,r), NULL, &val); - val = mix_word_set_field(mix_fspec_new(1,3), MIX_WORD_ZERO, val); + mix_word_add_and_carry (val, get_reg_ (vm,r), NULL, &val); + val = mix_word_set_field (mix_fspec_new (1,3), MIX_WORD_ZERO, val); break; case mix_DECA: case mix_DECX: - if ( mix_word_add_and_carry(mix_word_negative(val), get_reg_(vm, r), - NULL, &val) ) - set_over_(vm, TRUE); + if ( mix_word_add_and_carry (mix_word_negative (val), get_reg_ (vm, r), + NULL, &val) ) + set_over_ (vm, TRUE); break; - case mix_DEC1: case mix_DEC2: case mix_DEC3: - case mix_DEC4: case mix_DEC5: case mix_DEC6: - mix_word_add_and_carry(mix_word_negative(val), get_reg_(vm,r), NULL, &val); - val = mix_word_set_field(mix_fspec_new(1,3), MIX_WORD_ZERO, val); + case mix_DEC1: case mix_DEC2: case mix_DEC3: + case mix_DEC4: case mix_DEC5: case mix_DEC6: + mix_word_add_and_carry (mix_word_negative (val), get_reg_ (vm,r), + NULL, &val); + val = mix_word_set_field (mix_fspec_new (1,3), MIX_WORD_ZERO, val); break; - case mix_ENN1: case mix_ENN2: case mix_ENN3: - case mix_ENN4: case mix_ENN5: case mix_ENN6: - val = mix_word_set_field(mix_fspec_new(1,3), MIX_WORD_ZERO, val); + case mix_ENN1: case mix_ENN2: case mix_ENN3: + case mix_ENN4: case mix_ENN5: case mix_ENN6: + val = mix_word_set_field (mix_fspec_new (1,3), MIX_WORD_ZERO, val); /* fallthrough */ case mix_ENNA: case mix_ENNX: - mix_word_reverse_sign(val); + mix_word_reverse_sign (val); break; default: return FALSE; } - set_reg_(vm, r, val); - inc_loc_(vm); + set_reg_ (vm, r, val); + inc_loc_ (vm); return TRUE; } static gboolean -cmp_handler_(mix_vm_t *vm, const mix_ins_t *ins) +cmp_handler_ (mix_vm_t *vm, const mix_ins_t *ins) { - g_assert(ins->opcode >= mix_opCMPA && ins->opcode <= mix_opCMPX); + g_assert (ins->opcode >= mix_opCMPA && ins->opcode <= mix_opCMPX); if ( ins->fspec == 0 ) { /* shortcut: +0 == -0 */ - set_cmp_(vm, mix_EQ); + set_cmp_ (vm, mix_EQ); } else { - mix_word_t v = get_V_(vm, ins); + mix_word_t v = get_V_ (vm, ins); mix_word_t reg; mix_cmpflag_t flag; - + switch (ins->opcode) { case mix_opCMPA: - reg = get_rA_(vm); + reg = get_rA_ (vm); break; case mix_opCMPX: - reg = get_rX_(vm); + reg = get_rX_ (vm); break; default: - reg = get_rI_(vm, ins->opcode - mix_opCMPA); + reg = get_rI_ (vm, ins->opcode - mix_opCMPA); break; } - reg = mix_word_get_field(ins->fspec, reg); - mix_word_add_and_carry(reg, mix_word_negative(v), NULL, ®); - if ( mix_word_magnitude(reg) == MIX_WORD_ZERO ) flag = mix_EQ; - else if ( mix_word_is_positive(reg) ) flag = mix_GREAT; + reg = mix_word_get_field (ins->fspec, reg); + mix_word_add_and_carry (reg, mix_word_negative (v), NULL, ®); + if ( mix_word_magnitude (reg) == MIX_WORD_ZERO ) flag = mix_EQ; + else if ( mix_word_is_positive (reg) ) flag = mix_GREAT; else flag = mix_LESS; - set_cmp_(vm, flag); + set_cmp_ (vm, flag); } - inc_loc_(vm); + inc_loc_ (vm); return TRUE; } -ins_handler_t_ ins_handlers_[MIX_BYTE_MAX + 1] = { +ins_handler_t_ ins_handlers_[MIX_BYTE_MAX + 1] = { nop_handler_, add_handler_, add_handler_, mul_handler_, div_handler_, spc_handler_, sla_handler_, mov_handler_, lda_handler_, lda_handler_, lda_handler_, lda_handler_, lda_handler_, lda_handler_, lda_handler_, @@ -563,5 +564,5 @@ ins_handler_t_ ins_handlers_[MIX_BYTE_MAX + 1] = { jpx_handler_, jpx_handler_, jpx_handler_, ina_handler_, ina_handler_, ina_handler_, ina_handler_, ina_handler_, ina_handler_, ina_handler_, ina_handler_, cmp_handler_, cmp_handler_, cmp_handler_, cmp_handler_, - cmp_handler_, cmp_handler_, cmp_handler_, cmp_handler_, + cmp_handler_, cmp_handler_, cmp_handler_, cmp_handler_, }; |