int brainfuck_make_asm(FILE *_output, FILE *_input, output_t _type, size_t stacksize) { output = _output; input = _input; type = _type; assert(type != NONE); assert(stacksize > 0); /* Create header */ session_start(); define_put(); define_get(); define_start(stacksize); /* Transpile brainfuck to asm */ memset(stack, 0, TRANSPILER_STACK_SIZE); ptr = 0; int queued_op = 0; int num_queued = 0; int op; while ((op = fgetc(input)) != EOF) { if (strchr(".,+-><[]", op) == NULL) continue; if (queued_op != 0) { if (queued_op == op) { ++num_queued; continue; } handle_queued_ops(queued_op, num_queued); queued_op = 0; num_queued = 0; } switch (op) { case '.': op_put(); break; case ',': op_get(); break; case '+': /* FALLTHROUGH */ case '-': /* FALLTHROUGH */ case '>': /* FALLTHROUGH */ case '<': queued_op = op; num_queued = 1; break; case '[': op_tag(stack, ptr); break; case ']': op_jmp(stack, ptr); break; } } handle_queued_ops(queued_op, num_queued); /* Create clean exit */ define_exit(); return 0; }
void amis2000_base_device::execute_run() { while (m_icount > 0) { m_icount--; // remember previous opcode m_prev_op = m_op; debugger_instruction_hook(this, m_pc); m_op = m_program->read_byte(m_pc); m_pc = (m_pc + 1) & 0x1fff; if (m_skip) { // always skip over PP prefix m_skip = ((m_op & 0xf0) == 0x60); m_op = 0; // nop } switch (m_op & 0xf0) { case 0x50: op_adis(); break; case 0x60: op_pp(); break; case 0x70: op_lai(); break; case 0x80: case 0x90: case 0xa0: case 0xb0: op_jms(); break; case 0xc0: case 0xd0: case 0xe0: case 0xf0: op_jmp(); break; default: switch (m_op) { case 0x00: op_nop(); break; case 0x01: op_halt(); break; case 0x02: op_rt(); break; case 0x03: op_rts(); break; case 0x04: op_psh(); break; case 0x05: op_psl(); break; case 0x06: op_and(); break; case 0x07: op_sos(); break; case 0x08: op_sbe(); break; case 0x09: op_szc(); break; case 0x0a: op_stc(); break; case 0x0b: op_rsc(); break; case 0x0c: op_lae(); break; case 0x0d: op_xae(); break; case 0x0e: op_inp(); break; case 0x0f: op_eur(); break; case 0x10: op_cma(); break; case 0x11: op_xabu(); break; case 0x12: op_lab(); break; case 0x13: op_xab(); break; case 0x14: op_adcs(); break; case 0x15: op_xor(); break; case 0x16: op_add(); break; case 0x17: op_sam(); break; case 0x18: op_disb(); break; case 0x19: op_mvs(); break; case 0x1a: op_out(); break; case 0x1b: op_disn(); break; case 0x28: op_szk(); break; case 0x29: op_szi(); break; case 0x2a: op_rf1(); break; case 0x2b: op_sf1(); break; case 0x2c: op_rf2(); break; case 0x2d: op_sf2(); break; case 0x2e: op_tf1(); break; case 0x2f: op_tf2(); break; default: switch (m_op & 0xfc) { case 0x1c: op_szm(); break; case 0x20: op_stm(); break; case 0x24: op_rsm(); break; case 0x30: op_xci(); break; case 0x34: op_xcd(); break; case 0x38: op_xc(); break; case 0x3c: op_lam(); break; case 0x40: op_lbz(); break; case 0x44: op_lbf(); break; case 0x48: op_lbe(); break; case 0x4c: op_lbep(); break; } break; // 0xfc } break; // 0xff } // big switch } }