I\'ve ported my library x86Lib to mbed. It fully emulates the 8086 processor, but a few things I\'m still working on. Notable missing things are interrupts. Previously I used exceptions for interrupts, but exceptions aren\'t supported with the mbed compiler. It is also quite slow

Dependents:   x86Lib_Tester

Committer:
earlz
Date:
Sun Mar 04 08:15:47 2012 +0000
Revision:
0:217a7931b41f

        

Who changed what in which revision?

UserRevisionLine numberNew contents of line
earlz 0:217a7931b41f 1 /**
earlz 0:217a7931b41f 2 Copyright (c) 2007 - 2010 Jordan "Earlz/hckr83" Earls <http://www.Earlz.biz.tm>
earlz 0:217a7931b41f 3 All rights reserved.
earlz 0:217a7931b41f 4
earlz 0:217a7931b41f 5 Redistribution and use in source and binary forms, with or without
earlz 0:217a7931b41f 6 modification, are permitted provided that the following conditions
earlz 0:217a7931b41f 7 are met:
earlz 0:217a7931b41f 8
earlz 0:217a7931b41f 9 1. Redistributions of source code must retain the above copyright
earlz 0:217a7931b41f 10 notice, this list of conditions and the following disclaimer.
earlz 0:217a7931b41f 11 2. Redistributions in binary form must reproduce the above copyright
earlz 0:217a7931b41f 12 notice, this list of conditions and the following disclaimer in the
earlz 0:217a7931b41f 13 documentation and/or other materials provided with the distribution.
earlz 0:217a7931b41f 14 3. The name of the author may not be used to endorse or promote products
earlz 0:217a7931b41f 15 derived from this software without specific prior written permission.
earlz 0:217a7931b41f 16
earlz 0:217a7931b41f 17 THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,
earlz 0:217a7931b41f 18 INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
earlz 0:217a7931b41f 19 AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL
earlz 0:217a7931b41f 20 THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
earlz 0:217a7931b41f 21 EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
earlz 0:217a7931b41f 22 PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
earlz 0:217a7931b41f 23 OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
earlz 0:217a7931b41f 24 WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
earlz 0:217a7931b41f 25 OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
earlz 0:217a7931b41f 26 ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
earlz 0:217a7931b41f 27
earlz 0:217a7931b41f 28 This file is part of the x86Lib project.
earlz 0:217a7931b41f 29 **/
earlz 0:217a7931b41f 30
earlz 0:217a7931b41f 31 /**This file contains the opcode function definitions and prototypes for x86CPU**/
earlz 0:217a7931b41f 32
earlz 0:217a7931b41f 33 /**NOTE! this is included INSIDE of a class, so this file is somewhat limited...**/
earlz 0:217a7931b41f 34 uint8_t Add8(uint8_t,uint8_t);
earlz 0:217a7931b41f 35 uint16_t Add16(uint16_t,uint16_t);
earlz 0:217a7931b41f 36 uint8_t Sub8(uint8_t,uint8_t);
earlz 0:217a7931b41f 37 uint16_t Sub16(uint16_t,uint16_t);
earlz 0:217a7931b41f 38 uint8_t And8(uint8_t,uint8_t);
earlz 0:217a7931b41f 39 uint16_t And16(uint16_t,uint16_t);
earlz 0:217a7931b41f 40 uint8_t Or8(uint8_t,uint8_t);
earlz 0:217a7931b41f 41 uint16_t Or16(uint16_t,uint16_t);
earlz 0:217a7931b41f 42 uint8_t Xor8(uint8_t,uint8_t);
earlz 0:217a7931b41f 43 uint16_t Xor16(uint16_t,uint16_t);
earlz 0:217a7931b41f 44 uint8_t ShiftLogicalRight8(uint8_t,uint8_t);
earlz 0:217a7931b41f 45 uint16_t ShiftLogicalRight16(uint16_t,uint8_t);
earlz 0:217a7931b41f 46 uint8_t ShiftArithmeticRight8(uint8_t,uint8_t);
earlz 0:217a7931b41f 47 uint16_t ShiftArithmeticRight16(uint16_t,uint8_t);
earlz 0:217a7931b41f 48 uint8_t ShiftLogicalLeft8(uint8_t,uint8_t);
earlz 0:217a7931b41f 49 uint16_t ShiftLogicalLeft16(uint16_t,uint8_t);
earlz 0:217a7931b41f 50 uint8_t RotateRight8(uint8_t,uint8_t);
earlz 0:217a7931b41f 51 uint16_t RotateRight16(uint16_t,uint8_t);
earlz 0:217a7931b41f 52 uint8_t RotateLeft8(uint8_t,uint8_t);
earlz 0:217a7931b41f 53 uint16_t RotateLeft16(uint16_t,uint8_t);
earlz 0:217a7931b41f 54 uint8_t RotateCarryRight8(uint8_t,uint8_t);
earlz 0:217a7931b41f 55 uint16_t RotateCarryRight16(uint16_t,uint8_t);
earlz 0:217a7931b41f 56 uint8_t RotateCarryLeft8(uint8_t,uint8_t);
earlz 0:217a7931b41f 57 uint16_t RotateCarryLeft16(uint16_t,uint8_t);
earlz 0:217a7931b41f 58
earlz 0:217a7931b41f 59
earlz 0:217a7931b41f 60 void InstallOp(uint8_t,opcode,uint32_t=CPU086);
earlz 0:217a7931b41f 61 void InitOpcodes();
earlz 0:217a7931b41f 62 /*
earlz 0:217a7931b41f 63 uint8_t ReadByte(uint8_t seg,uint32_t offset);
earlz 0:217a7931b41f 64 uint16_t ReadWord(uint8_t seg,uint32_t offset);
earlz 0:217a7931b41f 65 uint32_t ReadDword(uint8_t seg,uint32_t offset);
earlz 0:217a7931b41f 66
earlz 0:217a7931b41f 67 void WriteByte(uint8_t seg,uint32_t offset,uint8_t data);
earlz 0:217a7931b41f 68 void WriteWord(uint8_t seg,uint32_t offset,uint16_t data);
earlz 0:217a7931b41f 69 void WriteDword(uint8_t seg,uint32_t offset,uint32_t data);
earlz 0:217a7931b41f 70 */
earlz 0:217a7931b41f 71
earlz 0:217a7931b41f 72
earlz 0:217a7931b41f 73
earlz 0:217a7931b41f 74
earlz 0:217a7931b41f 75
earlz 0:217a7931b41f 76 void op16_unknown();
earlz 0:217a7931b41f 77 void op16_mov_r8_imm8(); //Tested, pass #1;
earlz 0:217a7931b41f 78 void op16_hlt(); //Tested, pass #1;
earlz 0:217a7931b41f 79 void op16_nop(); //Tested, pass #1;
earlz 0:217a7931b41f 80 void op16_mov_r16_imm16(); //Tested, pass #1;
earlz 0:217a7931b41f 81 void op16_jmp_rel8(); //Tested, pass #1;
earlz 0:217a7931b41f 82 void op16_sub_al_imm8(); //Tested, pass #1;
earlz 0:217a7931b41f 83 void op16_sub_ax_imm16(); //Tested, pass #1;
earlz 0:217a7931b41f 84 void op16_ja_rel8();
earlz 0:217a7931b41f 85 void op16_jnc_rel8();
earlz 0:217a7931b41f 86 void op16_jbe_rel8();
earlz 0:217a7931b41f 87 void op16_jc_rel8(); //Tested, pass #1;
earlz 0:217a7931b41f 88 void op16_jz_rel8(); //Tested, pass #1;
earlz 0:217a7931b41f 89 void op16_jnz_rel8(); //Tested, pass #1;
earlz 0:217a7931b41f 90 void op16_jp_rel8(); //Tested, pass #1;
earlz 0:217a7931b41f 91 void op16_jnp_rel8(); //Tested, pass #1;
earlz 0:217a7931b41f 92 void op16_jg_rel8(); //Tested, pass #1;
earlz 0:217a7931b41f 93 void op16_jge_rel8();
earlz 0:217a7931b41f 94 void op16_jle_rel8();
earlz 0:217a7931b41f 95 void op16_jl_rel8(); //Tested, pass #1;
earlz 0:217a7931b41f 96 void op16_jo_rel8();
earlz 0:217a7931b41f 97 void op16_jno_rel8();
earlz 0:217a7931b41f 98 void op16_js_rel8();
earlz 0:217a7931b41f 99 void op16_jns_rel8();
earlz 0:217a7931b41f 100 void op16_mov_sr_rm16(); //Tested, pass #1;
earlz 0:217a7931b41f 101 void op16_mov_rm16_sr(); //Tested, pass #1;
earlz 0:217a7931b41f 102 void op16_pop_r16(); //Tested, pass #1;
earlz 0:217a7931b41f 103 void op16_push_imm16(); //Tested, pass #1;
earlz 0:217a7931b41f 104 void op16_push_r16(); //Tested, pass #1;
earlz 0:217a7931b41f 105 void op16_push_es(); //Tested, pass #1;
earlz 0:217a7931b41f 106 void op16_push_cs(); //Tested, pass #1;
earlz 0:217a7931b41f 107 void op16_push_ss(); //Tested, pass #1;
earlz 0:217a7931b41f 108 void op16_push_ds(); //Tested, pass #1;
earlz 0:217a7931b41f 109 void op16_pop_es(); //Tested, pass #1;
earlz 0:217a7931b41f 110 void op16_pop_ss(); //Tested, pass #1;
earlz 0:217a7931b41f 111 void op16_pop_ds(); //Tested, pass #1;
earlz 0:217a7931b41f 112 void op16_mov_r16_rm16(); //Tested, pass #1;
earlz 0:217a7931b41f 113 void op16_mov_rm16_r16(); //Tested, pass #1;
earlz 0:217a7931b41f 114 void op16_call_rel16(); //Tested, pass #1;
earlz 0:217a7931b41f 115 void op16_retn(); //Tested, pass #1;
earlz 0:217a7931b41f 116 void op16_loop_rel8(); //Tested, pass #1;
earlz 0:217a7931b41f 117 void op16_pre_cs_override(); //Tested, pass #1;
earlz 0:217a7931b41f 118 void op16_pre_ds_override(); //Tested, pass #1;
earlz 0:217a7931b41f 119 void op16_pre_es_override(); //Tested, pass #1;
earlz 0:217a7931b41f 120 void op16_pre_ss_override(); //Tested, pass #1;
earlz 0:217a7931b41f 121 void op16_movsw(); //Tested, pass #1;
earlz 0:217a7931b41f 122 void op16_movsb(); //Tested, pass #1;
earlz 0:217a7931b41f 123 void op16_clc();
earlz 0:217a7931b41f 124 void op16_cld(); //Tested, pass #1;
earlz 0:217a7931b41f 125 void op16_cli(); //Tested, pass #1;
earlz 0:217a7931b41f 126 void op16_stc();
earlz 0:217a7931b41f 127 void op16_std(); //Tested, pass #1;
earlz 0:217a7931b41f 128 void op16_sti(); //Tested, pass #1;
earlz 0:217a7931b41f 129 void op16_rep(); //Tested, pass #1;(only rep, not conditionals)
earlz 0:217a7931b41f 130 void op16_out_imm8_al(); //Tested, pass #1;
earlz 0:217a7931b41f 131 void op16_out_imm8_ax(); //Tested, pass #1;
earlz 0:217a7931b41f 132 void op16_call_imm16_imm16(); //Tested, pass #1;
earlz 0:217a7931b41f 133 void op16_retf(); //Tested, pass #1;
earlz 0:217a7931b41f 134 void op16_int_imm8(); //Tested, pass #1;
earlz 0:217a7931b41f 135 void op16_iret(); //Tested, pass #1;
earlz 0:217a7931b41f 136 void op16_into();
earlz 0:217a7931b41f 137 void op16_int3();
earlz 0:217a7931b41f 138 void op16_in_al_imm8();
earlz 0:217a7931b41f 139 void op16_in_ax_imm8();
earlz 0:217a7931b41f 140 void op16_add_al_imm8(); //Tested, pass #1;
earlz 0:217a7931b41f 141 void op16_add_ax_imm8(); //Tested, pass #1;
earlz 0:217a7931b41f 142 void op16_sub_rm8_r8(); //Tested, pass #1;
earlz 0:217a7931b41f 143 void op16_group_80(); //Tested, pass #1;
earlz 0:217a7931b41f 144 void op16_sub_r8_rm8();
earlz 0:217a7931b41f 145 void op16_sub_rm16_r16();
earlz 0:217a7931b41f 146 void op16_sub_r16_rm16();
earlz 0:217a7931b41f 147 void op16_group_81(); //Tested, pass #1;
earlz 0:217a7931b41f 148 void op16_add_rm8_r8();
earlz 0:217a7931b41f 149 void op16_add_rm16_r16();
earlz 0:217a7931b41f 150 void op16_add_r8_rm8();
earlz 0:217a7931b41f 151 void op16_add_r16_rm16();
earlz 0:217a7931b41f 152 void op16_mov_al_off8();
earlz 0:217a7931b41f 153 void op16_mov_ax_off16();
earlz 0:217a7931b41f 154 void op16_mov_rm8_r8();
earlz 0:217a7931b41f 155 void op16_mov_r8_rm8();
earlz 0:217a7931b41f 156 void op16_mov_off8_al(); //Tested, pass #1;
earlz 0:217a7931b41f 157 void op16_mov_off16_ax(); //Tested, pass #1;
earlz 0:217a7931b41f 158 void op16_mov_m8_imm8(); //Tested, pass #1;
earlz 0:217a7931b41f 159 void op16_mov_m16_imm16(); //Tested, pass #1;//currently have 85 instructions or prefixes implemented(actually more, not counting group instructions)
earlz 0:217a7931b41f 160 void op16_cmp_rm8_r8();
earlz 0:217a7931b41f 161 void op16_cmp_rm16_r16();
earlz 0:217a7931b41f 162 void op16_cmp_r8_rm8();
earlz 0:217a7931b41f 163 void op16_cmp_r16_rm16();
earlz 0:217a7931b41f 164 void op16_cmp_al_imm8(); //Tested, pass #1;
earlz 0:217a7931b41f 165 void op16_cmp_ax_imm16(); //Tested, pass #1;
earlz 0:217a7931b41f 166 void op16_group_83(); //Tested, pass #1;
earlz 0:217a7931b41f 167 void op16_jmp_rel16(); //Tested, pass #1
earlz 0:217a7931b41f 168 void op16_jmp_imm16_imm16(); //Tested, pass #1
earlz 0:217a7931b41f 169 void op16_group_FF();
earlz 0:217a7931b41f 170 void op16_push_imm8();
earlz 0:217a7931b41f 171 void op16_group_8F();
earlz 0:217a7931b41f 172 void op16_salc(); //Undocumented -- Set AL on Carry
earlz 0:217a7931b41f 173 void op16_cmc();
earlz 0:217a7931b41f 174 void op16_cbw();
earlz 0:217a7931b41f 175 void op16_aaa();
earlz 0:217a7931b41f 176 void op16_daa();
earlz 0:217a7931b41f 177 void op16_das();
earlz 0:217a7931b41f 178 void op16_aas();
earlz 0:217a7931b41f 179 void op16_aad();
earlz 0:217a7931b41f 180 void op16_aam();
earlz 0:217a7931b41f 181 void op16_inc_r16();
earlz 0:217a7931b41f 182 void op16_dec_r16();
earlz 0:217a7931b41f 183 void op16_group_FE();
earlz 0:217a7931b41f 184 void op16_group_F6();
earlz 0:217a7931b41f 185 void op16_group_F7();
earlz 0:217a7931b41f 186 void op16_cwd();
earlz 0:217a7931b41f 187 void op16_and_rm8_r8();
earlz 0:217a7931b41f 188 void op16_and_rm16_r16();
earlz 0:217a7931b41f 189 void op16_and_r8_rm8();
earlz 0:217a7931b41f 190 void op16_and_r16_rm16();
earlz 0:217a7931b41f 191 void op16_and_al_imm8();
earlz 0:217a7931b41f 192 void op16_and_ax_imm16();
earlz 0:217a7931b41f 193 void op16_or_rm8_r8();
earlz 0:217a7931b41f 194 void op16_or_rm16_r16();
earlz 0:217a7931b41f 195 void op16_or_r8_rm8();
earlz 0:217a7931b41f 196 void op16_or_r16_rm16();
earlz 0:217a7931b41f 197 void op16_or_al_imm8();
earlz 0:217a7931b41f 198 void op16_or_ax_imm16();
earlz 0:217a7931b41f 199 void op16_escape();
earlz 0:217a7931b41f 200 void op16_cmpsb(); //Tested, pass #1, full
earlz 0:217a7931b41f 201 void op16_cmpsw(); //tested, pass #1, full
earlz 0:217a7931b41f 202 void op16_jcxz_rel8();
earlz 0:217a7931b41f 203 void op16_adc_al_imm8();
earlz 0:217a7931b41f 204 void op16_adc_ax_imm8();
earlz 0:217a7931b41f 205 void op16_adc_rm8_r8();
earlz 0:217a7931b41f 206 void op16_adc_rm16_r16();
earlz 0:217a7931b41f 207 void op16_adc_r8_rm8();
earlz 0:217a7931b41f 208 void op16_adc_r16_rm16();
earlz 0:217a7931b41f 209 void op16_lahf();
earlz 0:217a7931b41f 210 void op16_sahf();
earlz 0:217a7931b41f 211 void op16_loope_rel8();
earlz 0:217a7931b41f 212 void op16_loopne_rel8();
earlz 0:217a7931b41f 213 void op16_lds();
earlz 0:217a7931b41f 214 void op16_les();
earlz 0:217a7931b41f 215 void op16_lea();
earlz 0:217a7931b41f 216 void op16_lock(); //funcitonally does nothing...
earlz 0:217a7931b41f 217 void op16_xor_rm8_r8();
earlz 0:217a7931b41f 218 void op16_xor_rm16_r16();
earlz 0:217a7931b41f 219 void op16_xor_r8_rm8();
earlz 0:217a7931b41f 220 void op16_xor_r16_rm16();
earlz 0:217a7931b41f 221 void op16_xor_al_imm8();
earlz 0:217a7931b41f 222 void op16_xor_ax_imm16();
earlz 0:217a7931b41f 223 void op16_sbb_rm8_r8();
earlz 0:217a7931b41f 224 void op16_sbb_rm16_r16();
earlz 0:217a7931b41f 225 void op16_sbb_r8_rm8();
earlz 0:217a7931b41f 226 void op16_sbb_r16_rm16();
earlz 0:217a7931b41f 227 void op16_sbb_al_imm8();
earlz 0:217a7931b41f 228 void op16_sbb_ax_imm16();
earlz 0:217a7931b41f 229 void op16_test_al_imm8();
earlz 0:217a7931b41f 230 void op16_test_ax_imm16();
earlz 0:217a7931b41f 231 void op16_test_rm8_r8();
earlz 0:217a7931b41f 232 void op16_test_rm16_r16();
earlz 0:217a7931b41f 233 void op16_xchg_rm8_r8();
earlz 0:217a7931b41f 234 void op16_xchg_rm16_r16();
earlz 0:217a7931b41f 235 void op16_xchg_ax_r16();
earlz 0:217a7931b41f 236 void op16_group_D2();
earlz 0:217a7931b41f 237 void op16_group_D3();
earlz 0:217a7931b41f 238 void op16_group_D0();
earlz 0:217a7931b41f 239 void op16_group_D1();
earlz 0:217a7931b41f 240 void op16_lodsb();
earlz 0:217a7931b41f 241 void op16_lodsw();
earlz 0:217a7931b41f 242 void op16_scasb();
earlz 0:217a7931b41f 243 void op16_scasw();
earlz 0:217a7931b41f 244 void op16_stosb();
earlz 0:217a7931b41f 245 void op16_stosw();
earlz 0:217a7931b41f 246 void op16_wait();
earlz 0:217a7931b41f 247 void op16_xlatb();
earlz 0:217a7931b41f 248
earlz 0:217a7931b41f 249 void op16_in_al_dx();
earlz 0:217a7931b41f 250 void op16_in_ax_dx();
earlz 0:217a7931b41f 251 void op16_out_dx_al();
earlz 0:217a7931b41f 252 void op16_out_dx_ax();
earlz 0:217a7931b41f 253
earlz 0:217a7931b41f 254
earlz 0:217a7931b41f 255
earlz 0:217a7931b41f 256
earlz 0:217a7931b41f 257 //Oh God how I hate prototyping and adding the opcodes to the master InstallOp list...
earlz 0:217a7931b41f 258
earlz 0:217a7931b41f 259
earlz 0:217a7931b41f 260
earlz 0:217a7931b41f 261
earlz 0:217a7931b41f 262 /**Group Include Functions(not direct opcodes)**/
earlz 0:217a7931b41f 263 void op16_sub_rm8_imm8(ModRM16&); //group 0x80 /5
earlz 0:217a7931b41f 264 void op16_sub_rm16_imm16(ModRM16&);
earlz 0:217a7931b41f 265 void op16_add_rm8_imm8(ModRM16&);
earlz 0:217a7931b41f 266 void op16_add_rm16_imm16(ModRM16&);
earlz 0:217a7931b41f 267 void op16_cmp_rm8_imm8(ModRM16&); //Tested, pass #1
earlz 0:217a7931b41f 268 void op16_cmp_rm16_imm16(ModRM16&);
earlz 0:217a7931b41f 269 void op16_sub_rm16_imm8(ModRM16&);
earlz 0:217a7931b41f 270 void op16_add_rm16_imm8(ModRM16&);
earlz 0:217a7931b41f 271 void op16_cmp_rm16_imm8(ModRM16&); //Tested, pass #1
earlz 0:217a7931b41f 272 void op16_jmp_rm16(ModRM16&); //Tested, pass #1
earlz 0:217a7931b41f 273 void op16_jmp_m16_m16(ModRM16&); //Tested, pass #1
earlz 0:217a7931b41f 274 void op16_push_m16(ModRM16&);
earlz 0:217a7931b41f 275 void op16_pop_m16(ModRM16&);
earlz 0:217a7931b41f 276 void op16_inc_rm8(ModRM16&);
earlz 0:217a7931b41f 277 void op16_inc_rm16(ModRM16&);
earlz 0:217a7931b41f 278 void op16_dec_rm8(ModRM16&);
earlz 0:217a7931b41f 279 void op16_dec_rm16(ModRM16&);
earlz 0:217a7931b41f 280 void op16_div_rm8(ModRM16 &rm);//Tested, pass #1
earlz 0:217a7931b41f 281 void op16_div_rm16(ModRM16 &rm);//Tested, pass #1
earlz 0:217a7931b41f 282 void op16_idiv_rm8(ModRM16 &rm);//Tested, pass #1
earlz 0:217a7931b41f 283 void op16_idiv_rm16(ModRM16 &rm);//Tested, pass #1
earlz 0:217a7931b41f 284 void op16_mul_rm8(ModRM16 &rm);//Tested, pass #1
earlz 0:217a7931b41f 285 void op16_mul_rm16(ModRM16 &rm);//Tested, pass #1
earlz 0:217a7931b41f 286 void op16_imul_rm8(ModRM16 &rm);
earlz 0:217a7931b41f 287 void op16_imul_rm16(ModRM16 &rm);
earlz 0:217a7931b41f 288 void op16_and_rm8_imm8(ModRM16 &rm);
earlz 0:217a7931b41f 289 void op16_and_rm16_imm16(ModRM16 &rm);
earlz 0:217a7931b41f 290 void op16_and_rm16_imm8(ModRM16 &rm);
earlz 0:217a7931b41f 291 void op16_or_rm8_imm8(ModRM16& rm);
earlz 0:217a7931b41f 292 void op16_or_rm16_imm16(ModRM16 &rm);
earlz 0:217a7931b41f 293 void op16_or_rm16_imm8(ModRM16 &rm);
earlz 0:217a7931b41f 294 void op16_adc_rm8_imm8(ModRM16&);
earlz 0:217a7931b41f 295 void op16_adc_rm16_imm16(ModRM16&);
earlz 0:217a7931b41f 296 void op16_adc_rm16_imm8(ModRM16&);
earlz 0:217a7931b41f 297 void op16_neg_rm16(ModRM16&);
earlz 0:217a7931b41f 298 void op16_neg_rm8(ModRM16&);
earlz 0:217a7931b41f 299 void op16_xor_rm8_imm8(ModRM16& rm);
earlz 0:217a7931b41f 300 void op16_xor_rm16_imm16(ModRM16 &rm);
earlz 0:217a7931b41f 301 void op16_xor_rm16_imm8(ModRM16 &rm);
earlz 0:217a7931b41f 302 void op16_sbb_rm8_imm8(ModRM16 &rm);
earlz 0:217a7931b41f 303 void op16_sbb_rm16_imm16(ModRM16 &rm);
earlz 0:217a7931b41f 304 void op16_sbb_rm16_imm8(ModRM16 &rm);
earlz 0:217a7931b41f 305 void op16_test_rm8_imm8(ModRM16 &rm);
earlz 0:217a7931b41f 306 void op16_test_rm16_imm16(ModRM16 &rm);
earlz 0:217a7931b41f 307 void op16_test_rm16_imm8(ModRM16 &rm); /**This needs to be added**/
earlz 0:217a7931b41f 308 void op16_shr_rm8_cl(ModRM16 &rm);
earlz 0:217a7931b41f 309 void op16_shr_rm16_cl(ModRM16 &rm);
earlz 0:217a7931b41f 310 void op16_sar_rm8_cl(ModRM16 &rm);
earlz 0:217a7931b41f 311 void op16_sar_rm16_cl(ModRM16 &rm);
earlz 0:217a7931b41f 312 void op16_shl_rm8_cl(ModRM16 &rm);
earlz 0:217a7931b41f 313 void op16_shl_rm16_cl(ModRM16 &rm);
earlz 0:217a7931b41f 314 void op16_rol_rm8_cl(ModRM16 &rm);
earlz 0:217a7931b41f 315 void op16_rol_rm16_cl(ModRM16 &rm);
earlz 0:217a7931b41f 316 void op16_ror_rm8_cl(ModRM16 &rm);
earlz 0:217a7931b41f 317 void op16_ror_rm16_cl(ModRM16 &rm);
earlz 0:217a7931b41f 318 void op16_rcl_rm8_cl(ModRM16 &rm);
earlz 0:217a7931b41f 319 void op16_rcl_rm16_cl(ModRM16 &rm);
earlz 0:217a7931b41f 320 void op16_rcr_rm8_cl(ModRM16 &rm);
earlz 0:217a7931b41f 321 void op16_rcr_rm16_cl(ModRM16 &rm);
earlz 0:217a7931b41f 322 void op16_shr_rm8_1(ModRM16 &rm);
earlz 0:217a7931b41f 323 void op16_shr_rm16_1(ModRM16 &rm);
earlz 0:217a7931b41f 324 void op16_sar_rm8_1(ModRM16 &rm);
earlz 0:217a7931b41f 325 void op16_sar_rm16_1(ModRM16 &rm);
earlz 0:217a7931b41f 326 void op16_shl_rm8_1(ModRM16 &rm);
earlz 0:217a7931b41f 327 void op16_shl_rm16_1(ModRM16 &rm);
earlz 0:217a7931b41f 328 void op16_rol_rm8_1(ModRM16 &rm);
earlz 0:217a7931b41f 329 void op16_rol_rm16_1(ModRM16 &rm);
earlz 0:217a7931b41f 330 void op16_ror_rm8_1(ModRM16 &rm);
earlz 0:217a7931b41f 331 void op16_ror_rm16_1(ModRM16 &rm);
earlz 0:217a7931b41f 332 void op16_rcl_rm8_1(ModRM16 &rm);
earlz 0:217a7931b41f 333 void op16_rcl_rm16_1(ModRM16 &rm);
earlz 0:217a7931b41f 334 void op16_rcr_rm8_1(ModRM16 &rm);
earlz 0:217a7931b41f 335 void op16_rcr_rm16_1(ModRM16 &rm);
earlz 0:217a7931b41f 336 void op16_not_rm8(ModRM16 &rm);
earlz 0:217a7931b41f 337 void op16_not_rm16(ModRM16 &rm);
earlz 0:217a7931b41f 338 void op16_call_rm16(ModRM16 &rm);
earlz 0:217a7931b41f 339 void op16_call_rm16_rm16(ModRM16 &rm);
earlz 0:217a7931b41f 340
earlz 0:217a7931b41f 341
earlz 0:217a7931b41f 342
earlz 0:217a7931b41f 343 void Push16(uint16_t val){
earlz 0:217a7931b41f 344 *regs16[SP]-=2;
earlz 0:217a7931b41f 345 WriteWord(cSS,*regs16[SP],val);
earlz 0:217a7931b41f 346 }
earlz 0:217a7931b41f 347 uint16_t Pop16(){
earlz 0:217a7931b41f 348 uint16_t register tmp;
earlz 0:217a7931b41f 349 tmp=ReadWord(cSS,*regs16[SP]);
earlz 0:217a7931b41f 350 *regs16[SP]+=2;
earlz 0:217a7931b41f 351 return tmp;
earlz 0:217a7931b41f 352 }
earlz 0:217a7931b41f 353
earlz 0:217a7931b41f 354
earlz 0:217a7931b41f 355 inline void SetIndex8(){ //this just makes my code look better...
earlz 0:217a7931b41f 356 if(freg.df==0){
earlz 0:217a7931b41f 357 (*regs16[SI])++;
earlz 0:217a7931b41f 358 (*regs16[DI])++;
earlz 0:217a7931b41f 359 }else{
earlz 0:217a7931b41f 360 (*regs16[SI])--;
earlz 0:217a7931b41f 361 (*regs16[DI])--;
earlz 0:217a7931b41f 362 }
earlz 0:217a7931b41f 363 }
earlz 0:217a7931b41f 364
earlz 0:217a7931b41f 365 inline void SetIndex16(){
earlz 0:217a7931b41f 366 if(freg.df==0){
earlz 0:217a7931b41f 367 (*regs16[SI])+=2;
earlz 0:217a7931b41f 368 (*regs16[DI])+=2;
earlz 0:217a7931b41f 369 }else{
earlz 0:217a7931b41f 370 (*regs16[SI])-=2;
earlz 0:217a7931b41f 371 (*regs16[DI])-=2;
earlz 0:217a7931b41f 372 }
earlz 0:217a7931b41f 373 }
earlz 0:217a7931b41f 374
earlz 0:217a7931b41f 375 inline void CalculatePF8(uint8_t val){
earlz 0:217a7931b41f 376 unsigned int i;
earlz 0:217a7931b41f 377 unsigned int count=0;
earlz 0:217a7931b41f 378 for(i=0;i<=7;i++){
earlz 0:217a7931b41f 379 if((val&((1<<i)))!=0){count++;}
earlz 0:217a7931b41f 380 }
earlz 0:217a7931b41f 381 if((count%2)==0){freg.pf=1;}else{freg.pf=0;}
earlz 0:217a7931b41f 382
earlz 0:217a7931b41f 383
earlz 0:217a7931b41f 384
earlz 0:217a7931b41f 385
earlz 0:217a7931b41f 386 }
earlz 0:217a7931b41f 387
earlz 0:217a7931b41f 388 inline void CalculatePF16(uint16_t val){
earlz 0:217a7931b41f 389 #ifndef USE_NATIVE
earlz 0:217a7931b41f 390 unsigned int i;
earlz 0:217a7931b41f 391 unsigned int count=0;
earlz 0:217a7931b41f 392 for(i=0;i<=15;i++){
earlz 0:217a7931b41f 393 /* TODO (Jordan#4#): speed this up! */
earlz 0:217a7931b41f 394 if((val&((1<<i)))!=0){count++;}
earlz 0:217a7931b41f 395 }
earlz 0:217a7931b41f 396 if((count%2)==0){freg.pf=1;}else{freg.pf=0;}
earlz 0:217a7931b41f 397 #else
earlz 0:217a7931b41f 398 //x86 ASM optimization..
earlz 0:217a7931b41f 399 __asm(".intel_syntax noprefix\n"
earlz 0:217a7931b41f 400 "cmp WORD PTR [ebp-10],0\n"
earlz 0:217a7931b41f 401 "jp .yes__\n"
earlz 0:217a7931b41f 402 ".att_syntax\n");
earlz 0:217a7931b41f 403 val=0;
earlz 0:217a7931b41f 404 __asm(".intel_syntax noprefix\n"
earlz 0:217a7931b41f 405 "jmp .end__\n"
earlz 0:217a7931b41f 406 ".local .yes__:\n"
earlz 0:217a7931b41f 407 ".att_syntax\n");
earlz 0:217a7931b41f 408 val=1;
earlz 0:217a7931b41f 409 __asm(".intel_syntax noprefix\n"
earlz 0:217a7931b41f 410 ".local .end__:\n"
earlz 0:217a7931b41f 411 ".att_syntax\n");
earlz 0:217a7931b41f 412 freg.pf=val;
earlz 0:217a7931b41f 413 return;
earlz 0:217a7931b41f 414 #endif
earlz 0:217a7931b41f 415 }
earlz 0:217a7931b41f 416
earlz 0:217a7931b41f 417 //these calculate SF for the given operand size
earlz 0:217a7931b41f 418 inline void CalculateSF8(uint8_t val){
earlz 0:217a7931b41f 419 if((val&0x80)==0){freg.sf=0;}else{freg.sf=1;}
earlz 0:217a7931b41f 420 }
earlz 0:217a7931b41f 421
earlz 0:217a7931b41f 422 inline void CalculateSF16(uint16_t val){
earlz 0:217a7931b41f 423 if((val&0x8000)==0){freg.sf=0;}else{freg.sf=1;}
earlz 0:217a7931b41f 424 }
earlz 0:217a7931b41f 425
earlz 0:217a7931b41f 426
earlz 0:217a7931b41f 427
earlz 0:217a7931b41f 428
earlz 0:217a7931b41f 429 void Jmp16_near16(uint16_t off){
earlz 0:217a7931b41f 430
earlz 0:217a7931b41f 431 //I thought there would be a good way to do this, but I suppose this works..
earlz 0:217a7931b41f 432 if((off&0x8000)==0){ //if unsigned
earlz 0:217a7931b41f 433 eip=eip+off;
earlz 0:217a7931b41f 434 }else{
earlz 0:217a7931b41f 435 eip=eip-((uint16_t)-off);
earlz 0:217a7931b41f 436 }
earlz 0:217a7931b41f 437
earlz 0:217a7931b41f 438 }
earlz 0:217a7931b41f 439
earlz 0:217a7931b41f 440 void Jmp16_near8(uint8_t off){
earlz 0:217a7931b41f 441 //I thought there would be a good way to do this, but I suppose this works..
earlz 0:217a7931b41f 442 if((off&0x80)==0){ //if unsigned
earlz 0:217a7931b41f 443 eip=eip+off;
earlz 0:217a7931b41f 444 }else{
earlz 0:217a7931b41f 445 eip=eip-((uint8_t)-off);
earlz 0:217a7931b41f 446 }
earlz 0:217a7931b41f 447 //eip++;
earlz 0:217a7931b41f 448
earlz 0:217a7931b41f 449 }
earlz 0:217a7931b41f 450
earlz 0:217a7931b41f 451 void Int16(uint8_t num){
earlz 0:217a7931b41f 452 Push16(*(uint16_t*)&freg);
earlz 0:217a7931b41f 453 freg._if=0;
earlz 0:217a7931b41f 454 Push16(seg[cCS]);
earlz 0:217a7931b41f 455 Push16(eip);
earlz 0:217a7931b41f 456 seg[cIS]=0;
earlz 0:217a7931b41f 457 eip=ReadWord(cIS,num*4);
earlz 0:217a7931b41f 458 seg[cCS]=ReadWord(cIS,num*4+2);
earlz 0:217a7931b41f 459
earlz 0:217a7931b41f 460 // cout << "0x" << hex << eip << "0x" << seg[cCS] << endl;
earlz 0:217a7931b41f 461 eip--;
earlz 0:217a7931b41f 462 }
earlz 0:217a7931b41f 463
earlz 0:217a7931b41f 464 inline void ResetSegments(){
earlz 0:217a7931b41f 465 ES=cES;
earlz 0:217a7931b41f 466 CS=cCS;
earlz 0:217a7931b41f 467 SS=cSS;
earlz 0:217a7931b41f 468 DS=cDS;
earlz 0:217a7931b41f 469 FS=cFS;
earlz 0:217a7931b41f 470 GS=cGS;
earlz 0:217a7931b41f 471 }
earlz 0:217a7931b41f 472
earlz 0:217a7931b41f 473 inline void SetSegments(uint8_t segm){
earlz 0:217a7931b41f 474 ES=segm;
earlz 0:217a7931b41f 475 CS=segm;
earlz 0:217a7931b41f 476 SS=segm;
earlz 0:217a7931b41f 477 DS=segm;
earlz 0:217a7931b41f 478 FS=segm;
earlz 0:217a7931b41f 479 GS=segm;
earlz 0:217a7931b41f 480 }
earlz 0:217a7931b41f 481
earlz 0:217a7931b41f 482
earlz 0:217a7931b41f 483
earlz 0:217a7931b41f 484 inline uint8_t ReadByte(uint8_t segm,uint32_t off){
earlz 0:217a7931b41f 485 Memory->WaitLock(busmaster);
earlz 0:217a7931b41f 486 uint8_t res=0;
earlz 0:217a7931b41f 487 Memory->Read((seg[segm]<<4)|off,1,&res);
earlz 0:217a7931b41f 488 return res;
earlz 0:217a7931b41f 489 }
earlz 0:217a7931b41f 490
earlz 0:217a7931b41f 491 inline uint16_t ReadWord(uint8_t segm,uint32_t off){
earlz 0:217a7931b41f 492 Memory->WaitLock(busmaster);
earlz 0:217a7931b41f 493 uint16_t res=0;
earlz 0:217a7931b41f 494 if(Opcodes==opcodes_16bit && off>=0xFFFE){
earlz 0:217a7931b41f 495
earlz 0:217a7931b41f 496 uint16_t offset=off; //for ease of rounding
earlz 0:217a7931b41f 497 uint32_t tmp=0;
earlz 0:217a7931b41f 498 Memory->Read((seg[segm]<<4)|offset,1,&tmp);
earlz 0:217a7931b41f 499 res=tmp;
earlz 0:217a7931b41f 500 Memory->Read((seg[segm]<<4)|(uint16_t)(offset+1),1,&tmp);
earlz 0:217a7931b41f 501 res|=tmp<<8;
earlz 0:217a7931b41f 502 return res;
earlz 0:217a7931b41f 503 }else{
earlz 0:217a7931b41f 504 Memory->Read((seg[segm]<<4)|off,2,&res);
earlz 0:217a7931b41f 505 return res;
earlz 0:217a7931b41f 506 }
earlz 0:217a7931b41f 507 }
earlz 0:217a7931b41f 508
earlz 0:217a7931b41f 509 inline uint32_t ReadDword(uint8_t segm,uint32_t off){
earlz 0:217a7931b41f 510 Memory->WaitLock(busmaster);
earlz 0:217a7931b41f 511 uint32_t res=0;
earlz 0:217a7931b41f 512 if(Opcodes==opcodes_16bit && off>=0xFFFC){
earlz 0:217a7931b41f 513 uint16_t offset=off; //for ease of rounding
earlz 0:217a7931b41f 514 uint32_t tmp=0;
earlz 0:217a7931b41f 515 Memory->Read((seg[segm]<<4)|offset,1,&tmp);
earlz 0:217a7931b41f 516 res=tmp;
earlz 0:217a7931b41f 517 Memory->Read((seg[segm]<<4)|(uint16_t)(offset+1),1,&tmp);
earlz 0:217a7931b41f 518 res|=tmp<<8;
earlz 0:217a7931b41f 519 Memory->Read((seg[segm]<<4)|(uint16_t)(offset+2),1,&tmp);
earlz 0:217a7931b41f 520 res|=tmp<<16;
earlz 0:217a7931b41f 521 Memory->Read((seg[segm]<<4)|(uint16_t)(offset+3),1,&tmp);
earlz 0:217a7931b41f 522 res|=tmp<<24;
earlz 0:217a7931b41f 523 return res;
earlz 0:217a7931b41f 524 }else{
earlz 0:217a7931b41f 525 Memory->Read((seg[segm]<<4)|off,4,&res);
earlz 0:217a7931b41f 526 return res;
earlz 0:217a7931b41f 527 }
earlz 0:217a7931b41f 528 }
earlz 0:217a7931b41f 529
earlz 0:217a7931b41f 530 inline void WriteByte(uint8_t segm,uint32_t off,uint8_t val){
earlz 0:217a7931b41f 531 Memory->WaitLock(busmaster);
earlz 0:217a7931b41f 532 Memory->Write((seg[segm]<<4)|off,1,&val);
earlz 0:217a7931b41f 533 }
earlz 0:217a7931b41f 534
earlz 0:217a7931b41f 535 inline void WriteWord(uint8_t segm,uint32_t off,uint16_t val){
earlz 0:217a7931b41f 536 Memory->WaitLock(busmaster);
earlz 0:217a7931b41f 537 if(Opcodes==opcodes_16bit && off>=0xFFFE){
earlz 0:217a7931b41f 538 uint16_t offset=off; //for ease of rounding
earlz 0:217a7931b41f 539 uint16_t tmp=val&0x00FF;
earlz 0:217a7931b41f 540 Memory->Write((seg[segm]<<4)|offset,1,&tmp);
earlz 0:217a7931b41f 541 tmp=(val&0xFF00)>>8;
earlz 0:217a7931b41f 542 Memory->Write((seg[segm]<<4)|(uint16_t)(offset+1),1,&tmp);
earlz 0:217a7931b41f 543 }else{
earlz 0:217a7931b41f 544 Memory->Write((seg[segm]<<4)|off,2,&val);
earlz 0:217a7931b41f 545 }
earlz 0:217a7931b41f 546 }
earlz 0:217a7931b41f 547
earlz 0:217a7931b41f 548 inline void WriteDword(uint8_t segm,uint32_t off,uint32_t val){
earlz 0:217a7931b41f 549 Memory->WaitLock(busmaster);
earlz 0:217a7931b41f 550 if(Opcodes==opcodes_16bit && off>=0xFFFC){
earlz 0:217a7931b41f 551 uint16_t offset=off; //for ease of rounding
earlz 0:217a7931b41f 552 uint32_t tmp=val&0x00FF;
earlz 0:217a7931b41f 553 Memory->Write((seg[segm]<<4)|offset,1,&tmp);
earlz 0:217a7931b41f 554 tmp=(val&0xFF00)>>8;
earlz 0:217a7931b41f 555 Memory->Write((seg[segm]<<4)|(uint16_t)(offset+1),1,&tmp);
earlz 0:217a7931b41f 556 tmp=(val&0xFF0000)>>16;
earlz 0:217a7931b41f 557 Memory->Write((seg[segm]<<4)|(uint16_t)(offset+2),1,&tmp);
earlz 0:217a7931b41f 558 tmp=(val&0xFF000000)>>24;
earlz 0:217a7931b41f 559 Memory->Write((seg[segm]<<4)|(uint16_t)(offset+3),1,&tmp);
earlz 0:217a7931b41f 560 }else{
earlz 0:217a7931b41f 561 Memory->Write((seg[segm]<<4)|off,4,&val);
earlz 0:217a7931b41f 562 }
earlz 0:217a7931b41f 563 }
earlz 0:217a7931b41f 564
earlz 0:217a7931b41f 565
earlz 0:217a7931b41f 566
earlz 0:217a7931b41f 567