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 - 2009 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 #define X86LIB_BUILD
earlz 0:217a7931b41f 31 #include <x86Lib.h>
earlz 0:217a7931b41f 32 namespace x86Lib{
earlz 0:217a7931b41f 33 using namespace std;
earlz 0:217a7931b41f 34
earlz 0:217a7931b41f 35
earlz 0:217a7931b41f 36
earlz 0:217a7931b41f 37
earlz 0:217a7931b41f 38 // TODO (Jordan#4#): Get AF stuff working in this!!
earlz 0:217a7931b41f 39 uint8_t x86CPU::Sub8(uint8_t base,uint8_t subt){
earlz 0:217a7931b41f 40 int8_t result;
earlz 0:217a7931b41f 41 if(subt>base){freg.cf=1;}else{freg.cf=0;}
earlz 0:217a7931b41f 42 if((int16_t)base-subt>127 || (int16_t)base-subt<-127){
earlz 0:217a7931b41f 43 freg.of=1;
earlz 0:217a7931b41f 44 }else{
earlz 0:217a7931b41f 45 freg.of=0;
earlz 0:217a7931b41f 46 }
earlz 0:217a7931b41f 47 result=base-subt;
earlz 0:217a7931b41f 48 if(result==0){freg.zf=1;}else{freg.zf=0;}
earlz 0:217a7931b41f 49 CalculatePF8(result); //do pf
earlz 0:217a7931b41f 50 CalculateSF8(result); //do sf
earlz 0:217a7931b41f 51 base&=0xF;
earlz 0:217a7931b41f 52 subt&=0xF;
earlz 0:217a7931b41f 53 freg.af = (((base-subt) & ~0xf) != 0); //thank you http://stackoverflow.com/questions/4513746/explain-how-the-af-flag-works-in-an-x86-instructions
earlz 0:217a7931b41f 54 return result;
earlz 0:217a7931b41f 55 }
earlz 0:217a7931b41f 56
earlz 0:217a7931b41f 57 uint16_t x86CPU::Sub16(uint16_t base,uint16_t subt){
earlz 0:217a7931b41f 58 int16_t result;
earlz 0:217a7931b41f 59 uint16_t mirror;
earlz 0:217a7931b41f 60 if(subt>base){freg.cf=1;}else{freg.cf=0;}
earlz 0:217a7931b41f 61 if((int32_t)base-subt>32767 || (int32_t)base-subt<-32767){
earlz 0:217a7931b41f 62 freg.of=1;
earlz 0:217a7931b41f 63 }else{
earlz 0:217a7931b41f 64 freg.of=0;
earlz 0:217a7931b41f 65 }
earlz 0:217a7931b41f 66 mirror=base-subt;
earlz 0:217a7931b41f 67 result=mirror;
earlz 0:217a7931b41f 68 if(result==0){freg.zf=1;}else{freg.zf=0;}
earlz 0:217a7931b41f 69 CalculatePF16(result); //do pf
earlz 0:217a7931b41f 70 CalculateSF16(result); //do sf
earlz 0:217a7931b41f 71 base&=0xF;
earlz 0:217a7931b41f 72 subt&=0xF;
earlz 0:217a7931b41f 73 freg.af = (((base-subt) & ~0xf) != 0);
earlz 0:217a7931b41f 74 return mirror;
earlz 0:217a7931b41f 75 }
earlz 0:217a7931b41f 76
earlz 0:217a7931b41f 77 uint8_t x86CPU::Add8(uint8_t base,uint8_t adder){
earlz 0:217a7931b41f 78 int8_t result;
earlz 0:217a7931b41f 79 if(adder+base>255){freg.cf=1;}else{freg.cf=0;}
earlz 0:217a7931b41f 80 if((int16_t)base+adder>127 || (int16_t)base+adder<-127){
earlz 0:217a7931b41f 81 freg.of=1;
earlz 0:217a7931b41f 82 }else{
earlz 0:217a7931b41f 83 freg.of=0;
earlz 0:217a7931b41f 84 }
earlz 0:217a7931b41f 85 result=base+adder;
earlz 0:217a7931b41f 86 if(result==0){freg.zf=1;}else{freg.zf=0;}
earlz 0:217a7931b41f 87 CalculatePF8(result); //do pf
earlz 0:217a7931b41f 88 CalculateSF8(result); //do sf
earlz 0:217a7931b41f 89 base&=0x0F;
earlz 0:217a7931b41f 90 adder&=0x0F;
earlz 0:217a7931b41f 91 freg.af = ((int16_t)base+adder > 15);
earlz 0:217a7931b41f 92 return result;
earlz 0:217a7931b41f 93 }
earlz 0:217a7931b41f 94
earlz 0:217a7931b41f 95 uint16_t x86CPU::Add16(uint16_t base,uint16_t adder){
earlz 0:217a7931b41f 96 int16_t result;
earlz 0:217a7931b41f 97 if((uint32_t)adder+base>(uint32_t)65535){freg.cf=1;}else{freg.cf=0;}
earlz 0:217a7931b41f 98 if((int32_t)base+adder>32767 || (int32_t)base+adder<-32767){
earlz 0:217a7931b41f 99 freg.of=1;
earlz 0:217a7931b41f 100 }else{
earlz 0:217a7931b41f 101 freg.of=0;
earlz 0:217a7931b41f 102 }
earlz 0:217a7931b41f 103 result=base+adder;
earlz 0:217a7931b41f 104 if(result==0){freg.zf=1;}else{freg.zf=0;}
earlz 0:217a7931b41f 105 CalculatePF16(result); //do pf
earlz 0:217a7931b41f 106 CalculateSF16(result); //do sf
earlz 0:217a7931b41f 107 base&=0x0F;
earlz 0:217a7931b41f 108 adder&=0x0F;
earlz 0:217a7931b41f 109 freg.af = ((int16_t)base+adder > 15);
earlz 0:217a7931b41f 110 return result;
earlz 0:217a7931b41f 111 }
earlz 0:217a7931b41f 112
earlz 0:217a7931b41f 113
earlz 0:217a7931b41f 114
earlz 0:217a7931b41f 115
earlz 0:217a7931b41f 116 uint8_t x86CPU::And8(uint8_t base,uint8_t mask){
earlz 0:217a7931b41f 117 freg.of=0;
earlz 0:217a7931b41f 118 freg.cf=0;
earlz 0:217a7931b41f 119 base=base&mask;
earlz 0:217a7931b41f 120 CalculatePF8(base);
earlz 0:217a7931b41f 121 CalculateSF8(base);
earlz 0:217a7931b41f 122 if(base==0){
earlz 0:217a7931b41f 123 freg.zf=1;
earlz 0:217a7931b41f 124 }else{
earlz 0:217a7931b41f 125 freg.zf=0;
earlz 0:217a7931b41f 126 }
earlz 0:217a7931b41f 127 return base;
earlz 0:217a7931b41f 128 }
earlz 0:217a7931b41f 129
earlz 0:217a7931b41f 130 uint16_t x86CPU::And16(uint16_t base,uint16_t mask){
earlz 0:217a7931b41f 131 freg.of=0;
earlz 0:217a7931b41f 132 freg.cf=0;
earlz 0:217a7931b41f 133 base=base&mask;
earlz 0:217a7931b41f 134 CalculatePF16(base);
earlz 0:217a7931b41f 135 CalculateSF16(base);
earlz 0:217a7931b41f 136 if(base==0){
earlz 0:217a7931b41f 137 freg.zf=1;
earlz 0:217a7931b41f 138 }else{
earlz 0:217a7931b41f 139 freg.zf=0;
earlz 0:217a7931b41f 140 }
earlz 0:217a7931b41f 141 return base;
earlz 0:217a7931b41f 142 }
earlz 0:217a7931b41f 143
earlz 0:217a7931b41f 144 //Not affects no flags, so just use ~
earlz 0:217a7931b41f 145
earlz 0:217a7931b41f 146
earlz 0:217a7931b41f 147 uint8_t x86CPU::Or8(uint8_t base,uint8_t mask){
earlz 0:217a7931b41f 148 freg.of=0;
earlz 0:217a7931b41f 149 freg.cf=0;
earlz 0:217a7931b41f 150 base=base|mask;
earlz 0:217a7931b41f 151 CalculatePF8(base);
earlz 0:217a7931b41f 152 CalculateSF8(base);
earlz 0:217a7931b41f 153 if(base==0){
earlz 0:217a7931b41f 154 freg.zf=1;
earlz 0:217a7931b41f 155 }else{
earlz 0:217a7931b41f 156 freg.zf=0;
earlz 0:217a7931b41f 157 }
earlz 0:217a7931b41f 158 return base;
earlz 0:217a7931b41f 159 }
earlz 0:217a7931b41f 160
earlz 0:217a7931b41f 161 uint16_t x86CPU::Or16(uint16_t base,uint16_t mask){
earlz 0:217a7931b41f 162 freg.of=0;
earlz 0:217a7931b41f 163 freg.cf=0;
earlz 0:217a7931b41f 164 base=base|mask;
earlz 0:217a7931b41f 165 CalculatePF16(base);
earlz 0:217a7931b41f 166 CalculateSF16(base);
earlz 0:217a7931b41f 167 if(base==0){
earlz 0:217a7931b41f 168 freg.zf=1;
earlz 0:217a7931b41f 169 }else{
earlz 0:217a7931b41f 170 freg.zf=0;
earlz 0:217a7931b41f 171 }
earlz 0:217a7931b41f 172 return base;
earlz 0:217a7931b41f 173 }
earlz 0:217a7931b41f 174
earlz 0:217a7931b41f 175 uint8_t x86CPU::Xor8(uint8_t base,uint8_t mask){
earlz 0:217a7931b41f 176 freg.of=0;
earlz 0:217a7931b41f 177 freg.cf=0;
earlz 0:217a7931b41f 178 base=base^mask;
earlz 0:217a7931b41f 179 CalculatePF8(base);
earlz 0:217a7931b41f 180 CalculateSF8(base);
earlz 0:217a7931b41f 181 if(base==0){
earlz 0:217a7931b41f 182 freg.zf=1;
earlz 0:217a7931b41f 183 }else{
earlz 0:217a7931b41f 184 freg.zf=0;
earlz 0:217a7931b41f 185 }
earlz 0:217a7931b41f 186 return base;
earlz 0:217a7931b41f 187 }
earlz 0:217a7931b41f 188
earlz 0:217a7931b41f 189 uint16_t x86CPU::Xor16(uint16_t base,uint16_t mask){
earlz 0:217a7931b41f 190 freg.of=0;
earlz 0:217a7931b41f 191 freg.cf=0;
earlz 0:217a7931b41f 192 base=base^mask;
earlz 0:217a7931b41f 193 CalculatePF16(base);
earlz 0:217a7931b41f 194 CalculateSF16(base);
earlz 0:217a7931b41f 195 if(base==0){
earlz 0:217a7931b41f 196 freg.zf=1;
earlz 0:217a7931b41f 197 }else{
earlz 0:217a7931b41f 198 freg.zf=0;
earlz 0:217a7931b41f 199 }
earlz 0:217a7931b41f 200 return base;
earlz 0:217a7931b41f 201 }
earlz 0:217a7931b41f 202
earlz 0:217a7931b41f 203 uint8_t x86CPU::ShiftLogicalRight8(uint8_t base,uint8_t count){
earlz 0:217a7931b41f 204 count&=0x1F; //only use bottom 5 bits
earlz 0:217a7931b41f 205 if(count==0){
earlz 0:217a7931b41f 206 CalculatePF8(base);
earlz 0:217a7931b41f 207 CalculateSF8(base);
earlz 0:217a7931b41f 208 freg.zf=1;
earlz 0:217a7931b41f 209 return base;
earlz 0:217a7931b41f 210 }
earlz 0:217a7931b41f 211 freg.of=(base&0x80)>>7;
earlz 0:217a7931b41f 212 freg.cf=(base>>(count-1))&1;
earlz 0:217a7931b41f 213 base=base>>count;
earlz 0:217a7931b41f 214 freg.of=freg.of^((base&0x80)>>7); //if the sign bit changed, then set it to 1
earlz 0:217a7931b41f 215 CalculatePF8(base);
earlz 0:217a7931b41f 216 CalculateSF8(base);
earlz 0:217a7931b41f 217 if(base==0){
earlz 0:217a7931b41f 218 freg.zf=1;
earlz 0:217a7931b41f 219 }else{
earlz 0:217a7931b41f 220 freg.zf=0;
earlz 0:217a7931b41f 221 }
earlz 0:217a7931b41f 222 freg.of=0;
earlz 0:217a7931b41f 223 return base;
earlz 0:217a7931b41f 224 }
earlz 0:217a7931b41f 225
earlz 0:217a7931b41f 226 uint16_t x86CPU::ShiftLogicalRight16(uint16_t base,uint8_t count){
earlz 0:217a7931b41f 227 count&=0x1F; //only use bottom 5 bits
earlz 0:217a7931b41f 228 if(count==0){
earlz 0:217a7931b41f 229 CalculatePF16(base);
earlz 0:217a7931b41f 230 CalculateSF16(base);
earlz 0:217a7931b41f 231 freg.zf=1;
earlz 0:217a7931b41f 232 return base;
earlz 0:217a7931b41f 233 }
earlz 0:217a7931b41f 234 freg.of=(base&0x8000)>>15;
earlz 0:217a7931b41f 235 freg.cf=(base>>(count-1))&1;
earlz 0:217a7931b41f 236 base=base>>count;
earlz 0:217a7931b41f 237 freg.of=freg.of^((base&0x8000)>>15); //if the sign bit changed, then set it to 1
earlz 0:217a7931b41f 238 CalculatePF16(base);
earlz 0:217a7931b41f 239 CalculateSF16(base);
earlz 0:217a7931b41f 240 if(base==0){
earlz 0:217a7931b41f 241 freg.zf=1;
earlz 0:217a7931b41f 242 }else{
earlz 0:217a7931b41f 243 freg.zf=0;
earlz 0:217a7931b41f 244 }
earlz 0:217a7931b41f 245 freg.of=0;
earlz 0:217a7931b41f 246 return base;
earlz 0:217a7931b41f 247 }
earlz 0:217a7931b41f 248 uint8_t x86CPU::ShiftArithmeticRight8(uint8_t base,uint8_t count){
earlz 0:217a7931b41f 249 count&=0x1F; //only use bottom 5 bits
earlz 0:217a7931b41f 250 if(count==0){
earlz 0:217a7931b41f 251 CalculatePF8(base);
earlz 0:217a7931b41f 252 CalculateSF8(base);
earlz 0:217a7931b41f 253 freg.zf=1;
earlz 0:217a7931b41f 254 return base;
earlz 0:217a7931b41f 255 }
earlz 0:217a7931b41f 256 freg.cf=(base>>(count-1))&1;
earlz 0:217a7931b41f 257 if((base&0x80)!=0){
earlz 0:217a7931b41f 258 base=(base>>count)|(~(0xFF>>count)); //this replaces displaced zero bits with the sign bit
earlz 0:217a7931b41f 259 }else{
earlz 0:217a7931b41f 260 base=(base>>count);
earlz 0:217a7931b41f 261 }
earlz 0:217a7931b41f 262 freg.of=0;
earlz 0:217a7931b41f 263 CalculatePF8(base);
earlz 0:217a7931b41f 264 CalculateSF8(base);
earlz 0:217a7931b41f 265 if(base==0){
earlz 0:217a7931b41f 266 freg.zf=1;
earlz 0:217a7931b41f 267 }else{
earlz 0:217a7931b41f 268 freg.zf=0;
earlz 0:217a7931b41f 269 }
earlz 0:217a7931b41f 270 freg.of=0;
earlz 0:217a7931b41f 271 return base;
earlz 0:217a7931b41f 272 }
earlz 0:217a7931b41f 273 uint16_t x86CPU::ShiftArithmeticRight16(uint16_t base,uint8_t count){
earlz 0:217a7931b41f 274 count&=0x1F; //only use bottom 5 bits
earlz 0:217a7931b41f 275 if(count==0){
earlz 0:217a7931b41f 276 CalculatePF16(base);
earlz 0:217a7931b41f 277 CalculateSF16(base);
earlz 0:217a7931b41f 278 freg.zf=1;
earlz 0:217a7931b41f 279 return base;
earlz 0:217a7931b41f 280 }
earlz 0:217a7931b41f 281 freg.cf=(base>>(count-1))&1;
earlz 0:217a7931b41f 282 if((base&0x8000)!=0){
earlz 0:217a7931b41f 283 base=(base>>count)|(~(0xFFFF>>count)); //this replaces displaced zero bits with the sign bit
earlz 0:217a7931b41f 284 }else{
earlz 0:217a7931b41f 285 base=(base>>count);
earlz 0:217a7931b41f 286 }
earlz 0:217a7931b41f 287 freg.of=0;
earlz 0:217a7931b41f 288 CalculatePF16(base);
earlz 0:217a7931b41f 289 CalculateSF16(base);
earlz 0:217a7931b41f 290 if(base==0){
earlz 0:217a7931b41f 291 freg.zf=1;
earlz 0:217a7931b41f 292 }else{
earlz 0:217a7931b41f 293 freg.zf=0;
earlz 0:217a7931b41f 294 }
earlz 0:217a7931b41f 295 freg.of=0;
earlz 0:217a7931b41f 296 return base;
earlz 0:217a7931b41f 297 }
earlz 0:217a7931b41f 298
earlz 0:217a7931b41f 299 uint8_t x86CPU::ShiftLogicalLeft8(uint8_t base,uint8_t count){
earlz 0:217a7931b41f 300 count&=0x1F; //only use bottom 5 bits
earlz 0:217a7931b41f 301 if(count==0){
earlz 0:217a7931b41f 302 CalculatePF8(base);
earlz 0:217a7931b41f 303 CalculateSF8(base);
earlz 0:217a7931b41f 304 freg.zf=1;
earlz 0:217a7931b41f 305 return base;
earlz 0:217a7931b41f 306 }
earlz 0:217a7931b41f 307 freg.of=(base&0x80)>>7;
earlz 0:217a7931b41f 308 freg.cf=((base<<(count-1))&0x80)>>7;
earlz 0:217a7931b41f 309 base=base<<count;
earlz 0:217a7931b41f 310 freg.of=freg.of^((base&0x80)>>7); //if the sign bit changed, then set it to 1
earlz 0:217a7931b41f 311 CalculatePF8(base);
earlz 0:217a7931b41f 312 CalculateSF8(base);
earlz 0:217a7931b41f 313 if(base==0){
earlz 0:217a7931b41f 314 freg.zf=1;
earlz 0:217a7931b41f 315 }else{
earlz 0:217a7931b41f 316 freg.zf=0;
earlz 0:217a7931b41f 317 }
earlz 0:217a7931b41f 318 freg.of=0;
earlz 0:217a7931b41f 319 return base;
earlz 0:217a7931b41f 320 }
earlz 0:217a7931b41f 321
earlz 0:217a7931b41f 322 uint16_t x86CPU::ShiftLogicalLeft16(uint16_t base,uint8_t count){
earlz 0:217a7931b41f 323 count&=0x1F; //only use bottom 5 bits
earlz 0:217a7931b41f 324 if(count==0){
earlz 0:217a7931b41f 325 CalculatePF16(base);
earlz 0:217a7931b41f 326 CalculateSF16(base);
earlz 0:217a7931b41f 327 freg.zf=1;
earlz 0:217a7931b41f 328 return base;
earlz 0:217a7931b41f 329 }
earlz 0:217a7931b41f 330 freg.of=(base&0x8000)>>15;
earlz 0:217a7931b41f 331 freg.cf=((base<<(count-1))&0x8000)>>15;
earlz 0:217a7931b41f 332 base=base<<count;
earlz 0:217a7931b41f 333 freg.of=freg.of^((base&0x8000)>>15); //if the sign bit changed, then set it to 1
earlz 0:217a7931b41f 334 CalculatePF16(base);
earlz 0:217a7931b41f 335 CalculateSF16(base);
earlz 0:217a7931b41f 336 if(base==0){
earlz 0:217a7931b41f 337 freg.zf=1;
earlz 0:217a7931b41f 338 }else{
earlz 0:217a7931b41f 339 freg.zf=0;
earlz 0:217a7931b41f 340 }
earlz 0:217a7931b41f 341 return base;
earlz 0:217a7931b41f 342 }
earlz 0:217a7931b41f 343
earlz 0:217a7931b41f 344 /**ToDo: Possibly adapt BOCHS source so that we avoid this loop crap...**/
earlz 0:217a7931b41f 345 uint8_t x86CPU::RotateRight8(uint8_t base,uint8_t count){
earlz 0:217a7931b41f 346 freg.of=(base&0x80)>>7;
earlz 0:217a7931b41f 347 while(count>0){
earlz 0:217a7931b41f 348 freg.cf=(base&0x01);
earlz 0:217a7931b41f 349 base=(freg.cf<<7)|(base>>1);
earlz 0:217a7931b41f 350 count--;
earlz 0:217a7931b41f 351 }
earlz 0:217a7931b41f 352 freg.of=freg.of^((base&0x80)>>7);
earlz 0:217a7931b41f 353 return base;
earlz 0:217a7931b41f 354 }
earlz 0:217a7931b41f 355
earlz 0:217a7931b41f 356 uint16_t x86CPU::RotateRight16(uint16_t base,uint8_t count){
earlz 0:217a7931b41f 357 freg.of=(base&0x8000)>>15;
earlz 0:217a7931b41f 358 while(count>0){
earlz 0:217a7931b41f 359 freg.cf=(base&0x01);
earlz 0:217a7931b41f 360 base=(freg.cf<<15)|(base>>1);
earlz 0:217a7931b41f 361 count--;
earlz 0:217a7931b41f 362 }
earlz 0:217a7931b41f 363 freg.of=freg.of^((base&0x80)>>15);
earlz 0:217a7931b41f 364 return base;
earlz 0:217a7931b41f 365 }
earlz 0:217a7931b41f 366
earlz 0:217a7931b41f 367 uint8_t x86CPU::RotateLeft8(uint8_t base,uint8_t count){
earlz 0:217a7931b41f 368 freg.of=(base&0x80)>>7;
earlz 0:217a7931b41f 369 while(count>0){
earlz 0:217a7931b41f 370 freg.cf=(base&0x80)>>7;
earlz 0:217a7931b41f 371 base=(freg.cf)|(base<<1);
earlz 0:217a7931b41f 372 count--;
earlz 0:217a7931b41f 373 }
earlz 0:217a7931b41f 374 freg.of=freg.of^((base&0x80)>>7);
earlz 0:217a7931b41f 375 return base;
earlz 0:217a7931b41f 376 }
earlz 0:217a7931b41f 377
earlz 0:217a7931b41f 378 uint16_t x86CPU::RotateLeft16(uint16_t base,uint8_t count){
earlz 0:217a7931b41f 379 freg.of=(base&0x8000)>>15;
earlz 0:217a7931b41f 380 while(count>0){
earlz 0:217a7931b41f 381 freg.cf=(base&0x8000)>>15;
earlz 0:217a7931b41f 382 base=(freg.cf)|(base<<1);
earlz 0:217a7931b41f 383 count--;
earlz 0:217a7931b41f 384 }
earlz 0:217a7931b41f 385 freg.of=freg.of^((base&0x8000)>>15);
earlz 0:217a7931b41f 386 return base;
earlz 0:217a7931b41f 387 }
earlz 0:217a7931b41f 388
earlz 0:217a7931b41f 389 uint8_t x86CPU::RotateCarryLeft8(uint8_t base,uint8_t count){
earlz 0:217a7931b41f 390 freg.of=(base&0x80)>>7;
earlz 0:217a7931b41f 391 while(count>0){
earlz 0:217a7931b41f 392 freg.r0=freg.cf; //reserved bit as a temp variable...
earlz 0:217a7931b41f 393 freg.cf=(base&0x80)>>7;
earlz 0:217a7931b41f 394 base=(base<<1);
earlz 0:217a7931b41f 395 base|=freg.r0; //puts (old)CF in it's place
earlz 0:217a7931b41f 396 count--;
earlz 0:217a7931b41f 397 }
earlz 0:217a7931b41f 398 freg.of=freg.of^((base&0x80)>>7);
earlz 0:217a7931b41f 399 return base;
earlz 0:217a7931b41f 400 }
earlz 0:217a7931b41f 401
earlz 0:217a7931b41f 402 uint16_t x86CPU::RotateCarryLeft16(uint16_t base,uint8_t count){
earlz 0:217a7931b41f 403 freg.of=(base&0x8000)>>15;
earlz 0:217a7931b41f 404 while(count>0){
earlz 0:217a7931b41f 405 freg.r0=freg.cf; //reserved bit as a temp variable...
earlz 0:217a7931b41f 406 freg.cf=(base&0x8000)>>15;
earlz 0:217a7931b41f 407 base=(base<<1);
earlz 0:217a7931b41f 408 base=(base&0xFFFE)|freg.r0; //zeros the 0 bit and puts (old)CF in it's place
earlz 0:217a7931b41f 409 count--;
earlz 0:217a7931b41f 410 }
earlz 0:217a7931b41f 411 freg.of=freg.of^((base&0x8000)>>15);
earlz 0:217a7931b41f 412 return base;
earlz 0:217a7931b41f 413 }
earlz 0:217a7931b41f 414
earlz 0:217a7931b41f 415 uint8_t x86CPU::RotateCarryRight8(uint8_t base,uint8_t count){
earlz 0:217a7931b41f 416 freg.of=(base&0x80)>>7;
earlz 0:217a7931b41f 417 while(count>0){
earlz 0:217a7931b41f 418 freg.r0=freg.cf;
earlz 0:217a7931b41f 419 freg.cf=(base&0x01);
earlz 0:217a7931b41f 420 base=(freg.r0<<7)|(base>>1);
earlz 0:217a7931b41f 421 count--;
earlz 0:217a7931b41f 422 }
earlz 0:217a7931b41f 423 freg.of=freg.of^((base&0x80)>>7);
earlz 0:217a7931b41f 424 return base;
earlz 0:217a7931b41f 425 }
earlz 0:217a7931b41f 426
earlz 0:217a7931b41f 427 uint16_t x86CPU::RotateCarryRight16(uint16_t base,uint8_t count){
earlz 0:217a7931b41f 428 freg.of=(base&0x8000)>>15;
earlz 0:217a7931b41f 429 while(count>0){
earlz 0:217a7931b41f 430 freg.r0=freg.cf;
earlz 0:217a7931b41f 431 freg.cf=(base&0x01);
earlz 0:217a7931b41f 432 base=(freg.r0<<15)|(base>>1);
earlz 0:217a7931b41f 433 count--;
earlz 0:217a7931b41f 434 }
earlz 0:217a7931b41f 435 freg.of=freg.of^((base&0x8000)>>15);
earlz 0:217a7931b41f 436 return base;
earlz 0:217a7931b41f 437 }
earlz 0:217a7931b41f 438
earlz 0:217a7931b41f 439
earlz 0:217a7931b41f 440
earlz 0:217a7931b41f 441
earlz 0:217a7931b41f 442
earlz 0:217a7931b41f 443
earlz 0:217a7931b41f 444
earlz 0:217a7931b41f 445
earlz 0:217a7931b41f 446
earlz 0:217a7931b41f 447 void x86CPU::op16_sub_al_imm8(){ //0x2C
earlz 0:217a7931b41f 448 *regs8[AL]=Sub8(*regs8[AL],op_cache[1]);
earlz 0:217a7931b41f 449 eip++;
earlz 0:217a7931b41f 450 }
earlz 0:217a7931b41f 451
earlz 0:217a7931b41f 452 void x86CPU::op16_sub_ax_imm16(){ //0x2D..yay! 2D and not 3!
earlz 0:217a7931b41f 453 *regs16[AX]=Sub16(*regs16[AX],*(uint16_t*)&op_cache[1]);
earlz 0:217a7931b41f 454 eip+=2;
earlz 0:217a7931b41f 455 }
earlz 0:217a7931b41f 456
earlz 0:217a7931b41f 457 void x86CPU::op16_sub_rm8_r8(){
earlz 0:217a7931b41f 458 eip++;
earlz 0:217a7931b41f 459 ModRM16 rm8(this);
earlz 0:217a7931b41f 460 rm8.WriteByter(Sub8(rm8.ReadByter(),*regs8[rm8.GetExtra()]));
earlz 0:217a7931b41f 461 //finally learning the power of deconstructors!
earlz 0:217a7931b41f 462 }
earlz 0:217a7931b41f 463
earlz 0:217a7931b41f 464 void x86CPU::op16_sub_rm16_r16(){
earlz 0:217a7931b41f 465 eip++;
earlz 0:217a7931b41f 466 ModRM16 rm16(this);
earlz 0:217a7931b41f 467 rm16.WriteWordr(Sub16(rm16.ReadWordr(),*regs16[rm16.GetExtra()]));
earlz 0:217a7931b41f 468 }
earlz 0:217a7931b41f 469 void x86CPU::op16_sub_r8_rm8(){
earlz 0:217a7931b41f 470 eip++;
earlz 0:217a7931b41f 471 ModRM16 rm8(this);
earlz 0:217a7931b41f 472 *regs8[rm8.GetExtra()]=Sub8(*regs8[rm8.GetExtra()],rm8.ReadByter());
earlz 0:217a7931b41f 473 }
earlz 0:217a7931b41f 474
earlz 0:217a7931b41f 475 void x86CPU::op16_sub_r16_rm16(){
earlz 0:217a7931b41f 476 eip++;
earlz 0:217a7931b41f 477 ModRM16 rm16(this);
earlz 0:217a7931b41f 478 *regs16[rm16.GetExtra()]=Sub16(*regs16[rm16.GetExtra()],rm16.ReadWordr());
earlz 0:217a7931b41f 479 }
earlz 0:217a7931b41f 480
earlz 0:217a7931b41f 481 void x86CPU::op16_sub_rm8_imm8(ModRM16 &rm8){ //group 0x80 /5
earlz 0:217a7931b41f 482 rm8.WriteByter(Sub8(rm8.ReadByter(),ReadByte(cCS,eip+rm8.GetLength())));
earlz 0:217a7931b41f 483 }
earlz 0:217a7931b41f 484
earlz 0:217a7931b41f 485 void x86CPU::op16_sub_rm16_imm16(ModRM16 &rm){ //Group 0x81 /5
earlz 0:217a7931b41f 486 rm.WriteWordr(Sub16(rm.ReadWordr(),ReadWord(cCS,eip+rm.GetLength())));
earlz 0:217a7931b41f 487 }
earlz 0:217a7931b41f 488
earlz 0:217a7931b41f 489 void x86CPU::op16_sub_rm16_imm8(ModRM16 &rm){ //group 0x83 /5
earlz 0:217a7931b41f 490 rm.WriteWordr(Sub16(rm.ReadWordr(),SignExtend8(ReadByte(cCS,eip+rm.GetLength()))));
earlz 0:217a7931b41f 491 }
earlz 0:217a7931b41f 492
earlz 0:217a7931b41f 493 /****/
earlz 0:217a7931b41f 494 void x86CPU::op16_sbb_al_imm8(){
earlz 0:217a7931b41f 495 *regs8[AL]=Sub8(*regs8[AL],op_cache[1]-freg.cf);
earlz 0:217a7931b41f 496 eip++;
earlz 0:217a7931b41f 497 }
earlz 0:217a7931b41f 498
earlz 0:217a7931b41f 499 void x86CPU::op16_sbb_ax_imm16(){
earlz 0:217a7931b41f 500 *regs16[AX]=Sub16(*regs16[AX],*(uint16_t*)&op_cache[1]-freg.cf);
earlz 0:217a7931b41f 501 eip++;
earlz 0:217a7931b41f 502 eip++;
earlz 0:217a7931b41f 503 }
earlz 0:217a7931b41f 504
earlz 0:217a7931b41f 505 void x86CPU::op16_sbb_rm8_r8(){
earlz 0:217a7931b41f 506 eip++;
earlz 0:217a7931b41f 507 ModRM16 rm8(this);
earlz 0:217a7931b41f 508 rm8.WriteByter(Sub8(rm8.ReadByter(),*regs8[rm8.GetExtra()]-freg.cf));
earlz 0:217a7931b41f 509 }
earlz 0:217a7931b41f 510
earlz 0:217a7931b41f 511 void x86CPU::op16_sbb_rm16_r16(){
earlz 0:217a7931b41f 512 eip++;
earlz 0:217a7931b41f 513 ModRM16 rm16(this);
earlz 0:217a7931b41f 514 rm16.WriteWordr(Sub16(rm16.ReadWordr(),*regs16[rm16.GetExtra()]-freg.cf));
earlz 0:217a7931b41f 515 }
earlz 0:217a7931b41f 516 void x86CPU::op16_sbb_r8_rm8(){
earlz 0:217a7931b41f 517 eip++;
earlz 0:217a7931b41f 518 ModRM16 rm8(this);
earlz 0:217a7931b41f 519 *regs8[rm8.GetExtra()]=Sub8(*regs8[rm8.GetExtra()],rm8.ReadByter()-freg.cf);
earlz 0:217a7931b41f 520 }
earlz 0:217a7931b41f 521
earlz 0:217a7931b41f 522 void x86CPU::op16_sbb_r16_rm16(){
earlz 0:217a7931b41f 523 eip++;
earlz 0:217a7931b41f 524 ModRM16 rm16(this);
earlz 0:217a7931b41f 525 *regs16[rm16.GetExtra()]=Sub16(*regs16[rm16.GetExtra()],rm16.ReadWordr()-freg.cf);
earlz 0:217a7931b41f 526 }
earlz 0:217a7931b41f 527
earlz 0:217a7931b41f 528 void x86CPU::op16_sbb_rm8_imm8(ModRM16 &rm8){ //group 0x80
earlz 0:217a7931b41f 529 rm8.WriteByter(Sub8(rm8.ReadByter(),ReadByte(cCS,eip+rm8.GetLength())-freg.cf));
earlz 0:217a7931b41f 530 }
earlz 0:217a7931b41f 531
earlz 0:217a7931b41f 532 void x86CPU::op16_sbb_rm16_imm16(ModRM16 &rm){ //Group 0x81
earlz 0:217a7931b41f 533 rm.WriteWordr(Sub16(rm.ReadWordr(),ReadWord(cCS,eip+rm.GetLength())-freg.cf));
earlz 0:217a7931b41f 534 }
earlz 0:217a7931b41f 535
earlz 0:217a7931b41f 536 void x86CPU::op16_sbb_rm16_imm8(ModRM16 &rm){ //group 0x83
earlz 0:217a7931b41f 537 rm.WriteWordr(Sub16(rm.ReadWordr(),SignExtend8(ReadByte(cCS,eip+rm.GetLength())-freg.cf)));
earlz 0:217a7931b41f 538 }
earlz 0:217a7931b41f 539
earlz 0:217a7931b41f 540
earlz 0:217a7931b41f 541 void x86CPU::op16_dec_r16(){ //0x48+r
earlz 0:217a7931b41f 542 freg.r0=freg.cf;
earlz 0:217a7931b41f 543 *regs16[(op_cache[0]-0x48)]=Sub16(*regs16[(op_cache[0]-0x48)],1);
earlz 0:217a7931b41f 544 freg.cf=freg.r0;
earlz 0:217a7931b41f 545 }
earlz 0:217a7931b41f 546
earlz 0:217a7931b41f 547 void x86CPU::op16_dec_rm8(ModRM16& rm){
earlz 0:217a7931b41f 548 freg.r0=freg.cf;
earlz 0:217a7931b41f 549 rm.WriteByter(Sub8(rm.ReadByter(),1));
earlz 0:217a7931b41f 550 freg.cf=freg.r0;
earlz 0:217a7931b41f 551 }
earlz 0:217a7931b41f 552
earlz 0:217a7931b41f 553 void x86CPU::op16_dec_rm16(ModRM16& rm){
earlz 0:217a7931b41f 554 freg.r0=freg.cf;
earlz 0:217a7931b41f 555 rm.WriteWordr(Sub16(rm.ReadWordr(),1));
earlz 0:217a7931b41f 556 freg.cf=freg.r0;
earlz 0:217a7931b41f 557 }
earlz 0:217a7931b41f 558
earlz 0:217a7931b41f 559
earlz 0:217a7931b41f 560
earlz 0:217a7931b41f 561
earlz 0:217a7931b41f 562
earlz 0:217a7931b41f 563
earlz 0:217a7931b41f 564 //cmp and sub are so similar, that they are both going in here...
earlz 0:217a7931b41f 565 void x86CPU::op16_cmp_al_imm8(){
earlz 0:217a7931b41f 566 Sub8(*regs8[AL],op_cache[1]);
earlz 0:217a7931b41f 567 eip++;
earlz 0:217a7931b41f 568 }
earlz 0:217a7931b41f 569
earlz 0:217a7931b41f 570 void x86CPU::op16_cmp_ax_imm16(){
earlz 0:217a7931b41f 571 Sub16(*regs16[AX],*(uint16_t*)&op_cache[1]);
earlz 0:217a7931b41f 572 eip+=2;
earlz 0:217a7931b41f 573 }
earlz 0:217a7931b41f 574
earlz 0:217a7931b41f 575 void x86CPU::op16_cmp_rm8_r8(){
earlz 0:217a7931b41f 576 eip++;
earlz 0:217a7931b41f 577 ModRM16 rm(this);
earlz 0:217a7931b41f 578 Sub8(rm.ReadByter(),*regs8[rm.GetExtra()]);
earlz 0:217a7931b41f 579 }
earlz 0:217a7931b41f 580
earlz 0:217a7931b41f 581 void x86CPU::op16_cmp_rm16_r16(){
earlz 0:217a7931b41f 582 eip++;
earlz 0:217a7931b41f 583 ModRM16 rm(this);
earlz 0:217a7931b41f 584 Sub16(rm.ReadWordr(),*regs16[rm.GetExtra()]);
earlz 0:217a7931b41f 585 }
earlz 0:217a7931b41f 586
earlz 0:217a7931b41f 587 void x86CPU::op16_cmp_r8_rm8(){
earlz 0:217a7931b41f 588 eip++;
earlz 0:217a7931b41f 589 ModRM16 rm(this);
earlz 0:217a7931b41f 590 Sub8(*regs16[rm.GetExtra()],rm.ReadByter());
earlz 0:217a7931b41f 591 }
earlz 0:217a7931b41f 592
earlz 0:217a7931b41f 593 void x86CPU::op16_cmp_r16_rm16(){
earlz 0:217a7931b41f 594 eip++;
earlz 0:217a7931b41f 595 ModRM16 rm(this);
earlz 0:217a7931b41f 596 Sub16(*regs16[rm.GetExtra()],rm.ReadWordr());
earlz 0:217a7931b41f 597 }
earlz 0:217a7931b41f 598
earlz 0:217a7931b41f 599 void x86CPU::op16_cmp_rm8_imm8(ModRM16 &rm){ //group 80 /7
earlz 0:217a7931b41f 600 Sub8(rm.ReadByter(),ReadByte(cCS,eip+rm.GetLength()));
earlz 0:217a7931b41f 601 }
earlz 0:217a7931b41f 602
earlz 0:217a7931b41f 603 void x86CPU::op16_cmp_rm16_imm16(ModRM16 &rm){ //group 81 /7
earlz 0:217a7931b41f 604 Sub16(rm.ReadWordr(),ReadWord(cCS,eip+rm.GetLength()));
earlz 0:217a7931b41f 605 }
earlz 0:217a7931b41f 606
earlz 0:217a7931b41f 607 void x86CPU::op16_cmp_rm16_imm8(ModRM16 &rm){ //group 83 /7
earlz 0:217a7931b41f 608 Sub16(rm.ReadWordr(),SignExtend8(ReadByte(cCS,eip+rm.GetLength())));
earlz 0:217a7931b41f 609 }
earlz 0:217a7931b41f 610
earlz 0:217a7931b41f 611
earlz 0:217a7931b41f 612
earlz 0:217a7931b41f 613
earlz 0:217a7931b41f 614
earlz 0:217a7931b41f 615
earlz 0:217a7931b41f 616 void x86CPU::op16_add_al_imm8(){
earlz 0:217a7931b41f 617 *regs8[AL]=Add8(*regs8[AL],op_cache[1]);
earlz 0:217a7931b41f 618 eip++;
earlz 0:217a7931b41f 619 }
earlz 0:217a7931b41f 620
earlz 0:217a7931b41f 621 void x86CPU::op16_add_ax_imm8(){
earlz 0:217a7931b41f 622 *regs16[AX]=Add16(*regs16[AX],*(uint16_t*)&op_cache[1]);
earlz 0:217a7931b41f 623 eip++;
earlz 0:217a7931b41f 624 eip++;
earlz 0:217a7931b41f 625 }
earlz 0:217a7931b41f 626
earlz 0:217a7931b41f 627 void x86CPU::op16_add_rm8_r8(){
earlz 0:217a7931b41f 628 eip++;
earlz 0:217a7931b41f 629 ModRM16 rm8(this);
earlz 0:217a7931b41f 630 rm8.WriteByter(Add8(rm8.ReadByter(),*regs8[rm8.GetExtra()]));
earlz 0:217a7931b41f 631 }
earlz 0:217a7931b41f 632
earlz 0:217a7931b41f 633 void x86CPU::op16_add_rm16_r16(){
earlz 0:217a7931b41f 634 eip++;
earlz 0:217a7931b41f 635 ModRM16 rm16(this);
earlz 0:217a7931b41f 636 rm16.WriteWordr(Add16(rm16.ReadWordr(),*regs16[rm16.GetExtra()]));
earlz 0:217a7931b41f 637 }
earlz 0:217a7931b41f 638
earlz 0:217a7931b41f 639 void x86CPU::op16_add_r8_rm8(){
earlz 0:217a7931b41f 640 eip++;
earlz 0:217a7931b41f 641 ModRM16 rm(this);
earlz 0:217a7931b41f 642 *regs8[rm.GetExtra()]=Add8(*regs8[rm.GetExtra()],rm.ReadByter());
earlz 0:217a7931b41f 643 }
earlz 0:217a7931b41f 644
earlz 0:217a7931b41f 645 void x86CPU::op16_add_r16_rm16(){
earlz 0:217a7931b41f 646 eip++;
earlz 0:217a7931b41f 647 ModRM16 rm(this);
earlz 0:217a7931b41f 648 *regs16[rm.GetExtra()]=Add16(*regs16[rm.GetExtra()],rm.ReadWordr());
earlz 0:217a7931b41f 649 }
earlz 0:217a7931b41f 650
earlz 0:217a7931b41f 651 void x86CPU::op16_add_rm8_imm8(ModRM16 &rm){ //Group 0x80 /0
earlz 0:217a7931b41f 652 rm.WriteByter(Add8(rm.ReadWordr(),ReadByte(cCS,eip+rm.GetLength())));
earlz 0:217a7931b41f 653 }
earlz 0:217a7931b41f 654
earlz 0:217a7931b41f 655 void x86CPU::op16_add_rm16_imm16(ModRM16 &rm){ //Group 0x81 /0
earlz 0:217a7931b41f 656 rm.WriteWordr(Add16(rm.ReadWordr(),ReadWord(cCS,eip+rm.GetLength())));
earlz 0:217a7931b41f 657 }
earlz 0:217a7931b41f 658
earlz 0:217a7931b41f 659 void x86CPU::op16_add_rm16_imm8(ModRM16 &rm){ //group 0x83 /0
earlz 0:217a7931b41f 660 rm.WriteWordr(Add16(rm.ReadWordr(),SignExtend8(ReadByte(cCS,eip+rm.GetLength()))));
earlz 0:217a7931b41f 661 }
earlz 0:217a7931b41f 662
earlz 0:217a7931b41f 663
earlz 0:217a7931b41f 664 /****/
earlz 0:217a7931b41f 665 void x86CPU::op16_adc_al_imm8(){
earlz 0:217a7931b41f 666 *regs8[AL]=Add8(*regs8[AL],op_cache[1]+freg.cf);
earlz 0:217a7931b41f 667 eip++;
earlz 0:217a7931b41f 668 }
earlz 0:217a7931b41f 669
earlz 0:217a7931b41f 670 void x86CPU::op16_adc_ax_imm8(){
earlz 0:217a7931b41f 671 *regs16[AX]=Add16(*regs16[AX],*(uint16_t*)&op_cache[1]+freg.cf);
earlz 0:217a7931b41f 672 eip++;
earlz 0:217a7931b41f 673 eip++;
earlz 0:217a7931b41f 674 }
earlz 0:217a7931b41f 675
earlz 0:217a7931b41f 676 void x86CPU::op16_adc_rm8_r8(){
earlz 0:217a7931b41f 677 eip++;
earlz 0:217a7931b41f 678 ModRM16 rm8(this);
earlz 0:217a7931b41f 679 rm8.WriteByter(Add8(rm8.ReadByter(),*regs8[rm8.GetExtra()]+freg.cf));
earlz 0:217a7931b41f 680 }
earlz 0:217a7931b41f 681
earlz 0:217a7931b41f 682 void x86CPU::op16_adc_rm16_r16(){
earlz 0:217a7931b41f 683 eip++;
earlz 0:217a7931b41f 684 ModRM16 rm16(this);
earlz 0:217a7931b41f 685 rm16.WriteWordr(Add16(rm16.ReadWordr(),*regs16[rm16.GetExtra()]+freg.cf));
earlz 0:217a7931b41f 686 }
earlz 0:217a7931b41f 687
earlz 0:217a7931b41f 688 void x86CPU::op16_adc_r8_rm8(){
earlz 0:217a7931b41f 689 eip++;
earlz 0:217a7931b41f 690 ModRM16 rm(this);
earlz 0:217a7931b41f 691 *regs8[rm.GetExtra()]=Add8(*regs8[rm.GetExtra()],rm.ReadByter()+freg.cf);
earlz 0:217a7931b41f 692 }
earlz 0:217a7931b41f 693
earlz 0:217a7931b41f 694 void x86CPU::op16_adc_r16_rm16(){
earlz 0:217a7931b41f 695 eip++;
earlz 0:217a7931b41f 696 ModRM16 rm(this);
earlz 0:217a7931b41f 697 *regs16[rm.GetExtra()]=Add16(*regs16[rm.GetExtra()],rm.ReadWordr()+freg.cf);
earlz 0:217a7931b41f 698 }
earlz 0:217a7931b41f 699
earlz 0:217a7931b41f 700 void x86CPU::op16_adc_rm8_imm8(ModRM16 &rm){ //Group 0x80 /2
earlz 0:217a7931b41f 701 rm.WriteByter(Add8(rm.ReadWordr(),ReadByte(cCS,eip+rm.GetLength())+freg.cf));
earlz 0:217a7931b41f 702 }
earlz 0:217a7931b41f 703
earlz 0:217a7931b41f 704 void x86CPU::op16_adc_rm16_imm16(ModRM16 &rm){ //Group 0x81 /2
earlz 0:217a7931b41f 705 rm.WriteWordr(Add16(rm.ReadWordr(),ReadWord(cCS,eip+rm.GetLength())+freg.cf));
earlz 0:217a7931b41f 706 }
earlz 0:217a7931b41f 707
earlz 0:217a7931b41f 708 void x86CPU::op16_adc_rm16_imm8(ModRM16 &rm){ //group 0x83 /2
earlz 0:217a7931b41f 709 rm.WriteWordr(Add16(rm.ReadWordr(),SignExtend8(ReadByte(cCS,eip+rm.GetLength()))+freg.cf));
earlz 0:217a7931b41f 710 }
earlz 0:217a7931b41f 711
earlz 0:217a7931b41f 712
earlz 0:217a7931b41f 713
earlz 0:217a7931b41f 714 void x86CPU::op16_inc_r16(){ //0x40+r
earlz 0:217a7931b41f 715 freg.r0=freg.cf;
earlz 0:217a7931b41f 716 *regs16[(op_cache[0]-0x40)]=Add16(*regs16[(op_cache[0]-0x40)],1);
earlz 0:217a7931b41f 717 freg.cf=freg.r0;
earlz 0:217a7931b41f 718 }
earlz 0:217a7931b41f 719
earlz 0:217a7931b41f 720 void x86CPU::op16_inc_rm8(ModRM16 &rm){
earlz 0:217a7931b41f 721 freg.r0=freg.cf; //yay for reserved flags!
earlz 0:217a7931b41f 722 rm.WriteByter(Add8(rm.ReadByter(),1));
earlz 0:217a7931b41f 723 freg.cf=freg.r0;
earlz 0:217a7931b41f 724 }
earlz 0:217a7931b41f 725
earlz 0:217a7931b41f 726 void x86CPU::op16_inc_rm16(ModRM16 &rm){
earlz 0:217a7931b41f 727 freg.r0=freg.cf;
earlz 0:217a7931b41f 728 rm.WriteWordr(Add16(rm.ReadWordr(),1));
earlz 0:217a7931b41f 729 freg.cf=freg.r0;
earlz 0:217a7931b41f 730 }
earlz 0:217a7931b41f 731
earlz 0:217a7931b41f 732 void x86CPU::op16_neg_rm8(ModRM16 &rm){
earlz 0:217a7931b41f 733 uint8_t tmp=rm.ReadByter();
earlz 0:217a7931b41f 734 if(tmp==0xFF){
earlz 0:217a7931b41f 735 freg.of=1;
earlz 0:217a7931b41f 736 return;
earlz 0:217a7931b41f 737 }
earlz 0:217a7931b41f 738 rm.WriteByter(Sub8(0,tmp));
earlz 0:217a7931b41f 739 if(tmp==0){
earlz 0:217a7931b41f 740 freg.cf=0;
earlz 0:217a7931b41f 741 }else{
earlz 0:217a7931b41f 742 freg.cf=1;
earlz 0:217a7931b41f 743 }
earlz 0:217a7931b41f 744 }
earlz 0:217a7931b41f 745 void x86CPU::op16_neg_rm16(ModRM16 &rm){
earlz 0:217a7931b41f 746 uint16_t tmp=rm.ReadWordr();
earlz 0:217a7931b41f 747 if(tmp==0xFFFF){
earlz 0:217a7931b41f 748 freg.of=1;
earlz 0:217a7931b41f 749 return;
earlz 0:217a7931b41f 750 }
earlz 0:217a7931b41f 751 rm.WriteWordr(Sub16(0,tmp));
earlz 0:217a7931b41f 752 if(tmp==0){
earlz 0:217a7931b41f 753 freg.cf=0;
earlz 0:217a7931b41f 754 }else{
earlz 0:217a7931b41f 755 freg.cf=1;
earlz 0:217a7931b41f 756 }
earlz 0:217a7931b41f 757 }
earlz 0:217a7931b41f 758
earlz 0:217a7931b41f 759
earlz 0:217a7931b41f 760
earlz 0:217a7931b41f 761 void x86CPU::op16_div_rm8(ModRM16 &rm){
earlz 0:217a7931b41f 762 if(rm.ReadByter()==0){
earlz 0:217a7931b41f 763 Onx86LibError();
earlz 0:217a7931b41f 764 //throw CpuInt_excp(DIV0_IEXCP);
earlz 0:217a7931b41f 765 }
earlz 0:217a7931b41f 766 if(((*regs16[AX])/rm.ReadByter())>0xFF){
earlz 0:217a7931b41f 767 Onx86LibError();
earlz 0:217a7931b41f 768 //throw CpuInt_excp(DIV0_IEXCP);
earlz 0:217a7931b41f 769 }
earlz 0:217a7931b41f 770 *regs8[AL]=(*regs16[AX])/rm.ReadByter();
earlz 0:217a7931b41f 771 *regs8[AH]=(*regs16[AX])%rm.ReadByter();
earlz 0:217a7931b41f 772 }
earlz 0:217a7931b41f 773
earlz 0:217a7931b41f 774 void x86CPU::op16_div_rm16(ModRM16 &rm){
earlz 0:217a7931b41f 775 if(rm.ReadWordr()==0){
earlz 0:217a7931b41f 776 Onx86LibError();
earlz 0:217a7931b41f 777 //throw CpuInt_excp(DIV0_IEXCP);
earlz 0:217a7931b41f 778 }
earlz 0:217a7931b41f 779 if((((*regs16[DX]<<16)|(*regs16[AX]))/rm.ReadWordr())>0xFFFF){
earlz 0:217a7931b41f 780 Onx86LibError();
earlz 0:217a7931b41f 781 //throw CpuInt_excp(DIV0_IEXCP);
earlz 0:217a7931b41f 782 }
earlz 0:217a7931b41f 783 *regs8[AX]=((*regs16[DX]<<16)|(*regs16[AX]))/rm.ReadWordr();
earlz 0:217a7931b41f 784 *regs8[DX]=((*regs16[DX]<<16)|(*regs16[AX]))%rm.ReadWordr();
earlz 0:217a7931b41f 785 }
earlz 0:217a7931b41f 786
earlz 0:217a7931b41f 787
earlz 0:217a7931b41f 788 void x86CPU::op16_idiv_rm8(ModRM16 &rm){ //This WORKS! both signed, and unsigned!
earlz 0:217a7931b41f 789 //grrr...who the crap does signed division anyway!?
earlz 0:217a7931b41f 790 if(rm.ReadByter()==0){
earlz 0:217a7931b41f 791 Onx86LibError();
earlz 0:217a7931b41f 792 //throw CpuInt_excp(DIV0_IEXCP);
earlz 0:217a7931b41f 793 }
earlz 0:217a7931b41f 794 uint8_t tmp=rm.ReadByter();
earlz 0:217a7931b41f 795 bool store1,store2;
earlz 0:217a7931b41f 796
earlz 0:217a7931b41f 797 tmp=Unsign8(tmp,store1);
earlz 0:217a7931b41f 798 *regs16[AX]=Unsign16(*regs16[AX],store2);
earlz 0:217a7931b41f 799 if(((*regs16[AX])/tmp)>0xFF){
earlz 0:217a7931b41f 800 Onx86LibError();
earlz 0:217a7931b41f 801 //throw CpuInt_excp(DIV0_IEXCP);
earlz 0:217a7931b41f 802 }
earlz 0:217a7931b41f 803
earlz 0:217a7931b41f 804 *regs8[AL]=(*regs16[AX])/tmp;
earlz 0:217a7931b41f 805 *regs8[AH]=(*regs16[AX])%tmp;
earlz 0:217a7931b41f 806
earlz 0:217a7931b41f 807 *regs8[AL]=Resign8(*regs8[AL],store1^store2);
earlz 0:217a7931b41f 808 }
earlz 0:217a7931b41f 809
earlz 0:217a7931b41f 810 void x86CPU::op16_idiv_rm16(ModRM16 &rm){
earlz 0:217a7931b41f 811 if(rm.ReadWordr()==0){
earlz 0:217a7931b41f 812 Onx86LibError();
earlz 0:217a7931b41f 813 //throw CpuInt_excp(DIV0_IEXCP);
earlz 0:217a7931b41f 814 }
earlz 0:217a7931b41f 815 uint16_t tmp=rm.ReadWordr();
earlz 0:217a7931b41f 816 bool store1,store2;
earlz 0:217a7931b41f 817 tmp=Unsign16(tmp,store1);
earlz 0:217a7931b41f 818 static uint32_t tmp2=Unsign32(((*regs16[DX])<<16)|(*regs16[AX]),store2);
earlz 0:217a7931b41f 819
earlz 0:217a7931b41f 820 if((tmp2/tmp)>0xFFFF){
earlz 0:217a7931b41f 821 Onx86LibError();
earlz 0:217a7931b41f 822 //throw CpuInt_excp(DIV0_IEXCP);
earlz 0:217a7931b41f 823 }
earlz 0:217a7931b41f 824 *regs16[AX]=tmp2/tmp;
earlz 0:217a7931b41f 825 *regs16[DX]=tmp2%tmp;
earlz 0:217a7931b41f 826
earlz 0:217a7931b41f 827 *regs16[AX]=Resign16(*regs16[AX],store1^store2);
earlz 0:217a7931b41f 828 }
earlz 0:217a7931b41f 829
earlz 0:217a7931b41f 830
earlz 0:217a7931b41f 831
earlz 0:217a7931b41f 832 void x86CPU::op16_mul_rm8(ModRM16 &rm){
earlz 0:217a7931b41f 833 *regs16[AX]=(*regs8[AL])*rm.ReadByter();
earlz 0:217a7931b41f 834 if((*regs8[AH])>0){ //if tophalf of result has anything in it
earlz 0:217a7931b41f 835 freg.cf=1;
earlz 0:217a7931b41f 836 freg.of=1;
earlz 0:217a7931b41f 837 }else{
earlz 0:217a7931b41f 838 freg.cf=0;
earlz 0:217a7931b41f 839 freg.of=0;
earlz 0:217a7931b41f 840 }
earlz 0:217a7931b41f 841 }
earlz 0:217a7931b41f 842
earlz 0:217a7931b41f 843
earlz 0:217a7931b41f 844 void x86CPU::op16_mul_rm16(ModRM16 &rm){
earlz 0:217a7931b41f 845 uint32_t result;
earlz 0:217a7931b41f 846 result=(*regs16[AX])*rm.ReadWordr();
earlz 0:217a7931b41f 847 *regs16[AX]=result&0x0000FFFF;
earlz 0:217a7931b41f 848 *regs16[DX]=(result&0xFFFF0000)>>16;
earlz 0:217a7931b41f 849 if((*regs16[DX])>0){ //if tophalf of result has anything in it
earlz 0:217a7931b41f 850 freg.cf=1;
earlz 0:217a7931b41f 851 freg.of=1;
earlz 0:217a7931b41f 852 }else{
earlz 0:217a7931b41f 853 freg.cf=0;
earlz 0:217a7931b41f 854 freg.of=0;
earlz 0:217a7931b41f 855 }
earlz 0:217a7931b41f 856 }
earlz 0:217a7931b41f 857
earlz 0:217a7931b41f 858 void x86CPU::op16_imul_rm8(ModRM16 &rm){
earlz 0:217a7931b41f 859 bool store1,store2;
earlz 0:217a7931b41f 860 *regs16[AX]=Unsign8(*regs8[AL],store1)*Unsign8(rm.ReadByter(),store2);
earlz 0:217a7931b41f 861 if(*regs8[AX]>0){
earlz 0:217a7931b41f 862 freg.of=1;
earlz 0:217a7931b41f 863 freg.cf=1;
earlz 0:217a7931b41f 864 }else{
earlz 0:217a7931b41f 865 freg.of=0;
earlz 0:217a7931b41f 866 freg.cf=0;
earlz 0:217a7931b41f 867 }
earlz 0:217a7931b41f 868 *regs16[AX]=Resign16(*regs16[AX],store1^store2);
earlz 0:217a7931b41f 869 }
earlz 0:217a7931b41f 870
earlz 0:217a7931b41f 871 void x86CPU::op16_imul_rm16(ModRM16 &rm){
earlz 0:217a7931b41f 872 bool store1,store2;
earlz 0:217a7931b41f 873 uint32_t result=Unsign16(*regs16[AX],store1)*Unsign16(rm.ReadWordr(),store2);
earlz 0:217a7931b41f 874 if((result&0xFFFF0000)>0){
earlz 0:217a7931b41f 875 freg.of=1;
earlz 0:217a7931b41f 876 freg.cf=1;
earlz 0:217a7931b41f 877 }else{
earlz 0:217a7931b41f 878 freg.of=0;
earlz 0:217a7931b41f 879 freg.cf=0;
earlz 0:217a7931b41f 880 }
earlz 0:217a7931b41f 881 result=Resign32(result,store1^store2);
earlz 0:217a7931b41f 882 *regs16[DX]=(result&0xFFFF0000)>>16;
earlz 0:217a7931b41f 883 *regs16[AX]=(result&0xFFFF);
earlz 0:217a7931b41f 884 }
earlz 0:217a7931b41f 885
earlz 0:217a7931b41f 886
earlz 0:217a7931b41f 887
earlz 0:217a7931b41f 888 void x86CPU::op16_and_rm8_r8(){
earlz 0:217a7931b41f 889 eip++;
earlz 0:217a7931b41f 890 ModRM16 rm(this);
earlz 0:217a7931b41f 891 rm.WriteByter(And8(rm.ReadByter(),*regs8[rm.GetExtra()]));
earlz 0:217a7931b41f 892 }
earlz 0:217a7931b41f 893
earlz 0:217a7931b41f 894 void x86CPU::op16_and_rm16_r16(){
earlz 0:217a7931b41f 895 eip++;
earlz 0:217a7931b41f 896 ModRM16 rm(this);
earlz 0:217a7931b41f 897 rm.WriteWordr(And16(rm.ReadWordr(),*regs16[rm.GetExtra()]));
earlz 0:217a7931b41f 898 }
earlz 0:217a7931b41f 899
earlz 0:217a7931b41f 900 void x86CPU::op16_and_r8_rm8(){
earlz 0:217a7931b41f 901 eip++;
earlz 0:217a7931b41f 902 ModRM16 rm(this);
earlz 0:217a7931b41f 903 *regs8[rm.GetExtra()]=And8(*regs8[rm.GetExtra()],rm.ReadByter());
earlz 0:217a7931b41f 904 }
earlz 0:217a7931b41f 905
earlz 0:217a7931b41f 906 void x86CPU::op16_and_r16_rm16(){
earlz 0:217a7931b41f 907 eip++;
earlz 0:217a7931b41f 908 ModRM16 rm(this);
earlz 0:217a7931b41f 909 *regs16[rm.GetExtra()]=And16(*regs16[rm.GetExtra()],rm.ReadWordr());
earlz 0:217a7931b41f 910 }
earlz 0:217a7931b41f 911
earlz 0:217a7931b41f 912 void x86CPU::op16_and_al_imm8(){
earlz 0:217a7931b41f 913 eip++;
earlz 0:217a7931b41f 914 *regs8[AL]=And8(*regs8[AL],op_cache[1]);
earlz 0:217a7931b41f 915 }
earlz 0:217a7931b41f 916
earlz 0:217a7931b41f 917 void x86CPU::op16_and_ax_imm16(){
earlz 0:217a7931b41f 918 eip++;
earlz 0:217a7931b41f 919 eip++;
earlz 0:217a7931b41f 920 *regs16[AX]=And16(*regs16[AX],*(uint16_t*)&op_cache[1]);
earlz 0:217a7931b41f 921 }
earlz 0:217a7931b41f 922
earlz 0:217a7931b41f 923 void x86CPU::op16_and_rm8_imm8(ModRM16& rm){
earlz 0:217a7931b41f 924 rm.WriteByter(And8(rm.ReadByter(),ReadByte(cCS,eip+rm.GetLength())));
earlz 0:217a7931b41f 925 }
earlz 0:217a7931b41f 926
earlz 0:217a7931b41f 927 void x86CPU::op16_and_rm16_imm16(ModRM16& rm){
earlz 0:217a7931b41f 928 rm.WriteWordr(And16(rm.ReadWordr(),ReadWord(cCS,eip+rm.GetLength())));
earlz 0:217a7931b41f 929 }
earlz 0:217a7931b41f 930
earlz 0:217a7931b41f 931 void x86CPU::op16_and_rm16_imm8(ModRM16& rm){
earlz 0:217a7931b41f 932 rm.WriteWordr(And16(rm.ReadWordr(),SignExtend8(ReadByte(cCS,eip+rm.GetLength()))));
earlz 0:217a7931b41f 933 //gotta love parentheses...
earlz 0:217a7931b41f 934 }
earlz 0:217a7931b41f 935
earlz 0:217a7931b41f 936 void x86CPU::op16_or_rm8_r8(){
earlz 0:217a7931b41f 937 eip++;
earlz 0:217a7931b41f 938 ModRM16 rm(this);
earlz 0:217a7931b41f 939 rm.WriteByter(Or8(rm.ReadByter(),*regs8[rm.GetExtra()]));
earlz 0:217a7931b41f 940 }
earlz 0:217a7931b41f 941
earlz 0:217a7931b41f 942 void x86CPU::op16_or_rm16_r16(){
earlz 0:217a7931b41f 943 eip++;
earlz 0:217a7931b41f 944 ModRM16 rm(this);
earlz 0:217a7931b41f 945 rm.WriteWordr(Or16(rm.ReadWordr(),*regs16[rm.GetExtra()]));
earlz 0:217a7931b41f 946 }
earlz 0:217a7931b41f 947
earlz 0:217a7931b41f 948 void x86CPU::op16_or_r8_rm8(){
earlz 0:217a7931b41f 949 eip++;
earlz 0:217a7931b41f 950 ModRM16 rm(this);
earlz 0:217a7931b41f 951 *regs8[rm.GetExtra()]=Or8(*regs8[rm.GetExtra()],rm.ReadByter());
earlz 0:217a7931b41f 952 }
earlz 0:217a7931b41f 953
earlz 0:217a7931b41f 954 void x86CPU::op16_or_r16_rm16(){
earlz 0:217a7931b41f 955 eip++;
earlz 0:217a7931b41f 956 ModRM16 rm(this);
earlz 0:217a7931b41f 957 *regs16[rm.GetExtra()]=Or16(*regs16[rm.GetExtra()],rm.ReadWordr());
earlz 0:217a7931b41f 958 }
earlz 0:217a7931b41f 959
earlz 0:217a7931b41f 960 void x86CPU::op16_or_al_imm8(){
earlz 0:217a7931b41f 961 eip++;
earlz 0:217a7931b41f 962 *regs8[AL]=Or8(*regs8[AL],op_cache[1]);
earlz 0:217a7931b41f 963 }
earlz 0:217a7931b41f 964
earlz 0:217a7931b41f 965 void x86CPU::op16_or_ax_imm16(){
earlz 0:217a7931b41f 966 eip++;
earlz 0:217a7931b41f 967 eip++;
earlz 0:217a7931b41f 968 *regs16[AX]=Or16(*regs16[AX],*(uint16_t*)&op_cache[1]);
earlz 0:217a7931b41f 969 }
earlz 0:217a7931b41f 970
earlz 0:217a7931b41f 971 void x86CPU::op16_or_rm8_imm8(ModRM16& rm){
earlz 0:217a7931b41f 972 rm.WriteByter(Or8(rm.ReadByter(),ReadByte(cCS,eip+rm.GetLength())));
earlz 0:217a7931b41f 973 }
earlz 0:217a7931b41f 974
earlz 0:217a7931b41f 975 void x86CPU::op16_or_rm16_imm16(ModRM16& rm){
earlz 0:217a7931b41f 976 rm.WriteWordr(Or16(rm.ReadWordr(),ReadWord(cCS,eip+rm.GetLength())));
earlz 0:217a7931b41f 977 }
earlz 0:217a7931b41f 978
earlz 0:217a7931b41f 979 void x86CPU::op16_or_rm16_imm8(ModRM16& rm){
earlz 0:217a7931b41f 980 rm.WriteWordr(Or16(rm.ReadWordr(),SignExtend8(ReadByte(cCS,eip+rm.GetLength()))));
earlz 0:217a7931b41f 981 //gotta love parentheses...
earlz 0:217a7931b41f 982 }
earlz 0:217a7931b41f 983
earlz 0:217a7931b41f 984
earlz 0:217a7931b41f 985
earlz 0:217a7931b41f 986 void x86CPU::op16_xor_rm8_r8(){
earlz 0:217a7931b41f 987 eip++;
earlz 0:217a7931b41f 988 ModRM16 rm(this);
earlz 0:217a7931b41f 989 rm.WriteByter(Xor8(rm.ReadByter(),*regs8[rm.GetExtra()]));
earlz 0:217a7931b41f 990 }
earlz 0:217a7931b41f 991
earlz 0:217a7931b41f 992 void x86CPU::op16_xor_rm16_r16(){
earlz 0:217a7931b41f 993 eip++;
earlz 0:217a7931b41f 994 ModRM16 rm(this);
earlz 0:217a7931b41f 995 rm.WriteWordr(Xor16(rm.ReadWordr(),*regs16[rm.GetExtra()]));
earlz 0:217a7931b41f 996 }
earlz 0:217a7931b41f 997
earlz 0:217a7931b41f 998 void x86CPU::op16_xor_r8_rm8(){
earlz 0:217a7931b41f 999 eip++;
earlz 0:217a7931b41f 1000 ModRM16 rm(this);
earlz 0:217a7931b41f 1001 *regs8[rm.GetExtra()]=Xor8(*regs8[rm.GetExtra()],rm.ReadByter());
earlz 0:217a7931b41f 1002 }
earlz 0:217a7931b41f 1003
earlz 0:217a7931b41f 1004 void x86CPU::op16_xor_r16_rm16(){
earlz 0:217a7931b41f 1005 eip++;
earlz 0:217a7931b41f 1006 ModRM16 rm(this);
earlz 0:217a7931b41f 1007 *regs16[rm.GetExtra()]=Xor16(*regs16[rm.GetExtra()],rm.ReadWordr());
earlz 0:217a7931b41f 1008 }
earlz 0:217a7931b41f 1009
earlz 0:217a7931b41f 1010 void x86CPU::op16_xor_al_imm8(){
earlz 0:217a7931b41f 1011 eip++;
earlz 0:217a7931b41f 1012 *regs8[AL]=Xor8(*regs8[AL],op_cache[1]);
earlz 0:217a7931b41f 1013 }
earlz 0:217a7931b41f 1014
earlz 0:217a7931b41f 1015 void x86CPU::op16_xor_ax_imm16(){
earlz 0:217a7931b41f 1016 eip++;
earlz 0:217a7931b41f 1017 eip++;
earlz 0:217a7931b41f 1018 *regs16[AX]=Xor16(*regs16[AX],*(uint16_t*)&op_cache[1]);
earlz 0:217a7931b41f 1019 }
earlz 0:217a7931b41f 1020
earlz 0:217a7931b41f 1021 void x86CPU::op16_xor_rm8_imm8(ModRM16& rm){
earlz 0:217a7931b41f 1022 rm.WriteByter(Xor8(rm.ReadByter(),ReadByte(cCS,eip+rm.GetLength())));
earlz 0:217a7931b41f 1023 }
earlz 0:217a7931b41f 1024
earlz 0:217a7931b41f 1025 void x86CPU::op16_xor_rm16_imm16(ModRM16& rm){
earlz 0:217a7931b41f 1026 rm.WriteWordr(Xor16(rm.ReadWordr(),ReadWord(cCS,eip+rm.GetLength())));
earlz 0:217a7931b41f 1027 }
earlz 0:217a7931b41f 1028
earlz 0:217a7931b41f 1029 void x86CPU::op16_xor_rm16_imm8(ModRM16& rm){
earlz 0:217a7931b41f 1030 rm.WriteWordr(Xor16(rm.ReadWordr(),SignExtend8(ReadByte(cCS,eip+rm.GetLength()))));
earlz 0:217a7931b41f 1031 //gotta love parentheses...
earlz 0:217a7931b41f 1032 }
earlz 0:217a7931b41f 1033
earlz 0:217a7931b41f 1034 void x86CPU::op16_test_rm8_r8(){
earlz 0:217a7931b41f 1035 eip++;
earlz 0:217a7931b41f 1036 ModRM16 rm(this);
earlz 0:217a7931b41f 1037 And8(rm.ReadByter(),*regs8[rm.GetExtra()]);
earlz 0:217a7931b41f 1038 }
earlz 0:217a7931b41f 1039
earlz 0:217a7931b41f 1040 void x86CPU::op16_test_rm16_r16(){
earlz 0:217a7931b41f 1041 eip++;
earlz 0:217a7931b41f 1042 ModRM16 rm(this);
earlz 0:217a7931b41f 1043 And16(rm.ReadWordr(),*regs16[rm.GetExtra()]);
earlz 0:217a7931b41f 1044 }
earlz 0:217a7931b41f 1045 void x86CPU::op16_test_al_imm8(){
earlz 0:217a7931b41f 1046 eip++;
earlz 0:217a7931b41f 1047 And8(*regs8[AL],op_cache[1]);
earlz 0:217a7931b41f 1048 }
earlz 0:217a7931b41f 1049 void x86CPU::op16_test_ax_imm16(){
earlz 0:217a7931b41f 1050 eip++;
earlz 0:217a7931b41f 1051 eip++;
earlz 0:217a7931b41f 1052 And16(*regs16[AX],*(uint16_t*)&op_cache[1]);
earlz 0:217a7931b41f 1053 }
earlz 0:217a7931b41f 1054
earlz 0:217a7931b41f 1055 void x86CPU::op16_test_rm8_imm8(ModRM16& rm){
earlz 0:217a7931b41f 1056 And8(rm.ReadByter(),ReadByte(cCS,eip+rm.GetLength()));
earlz 0:217a7931b41f 1057 }
earlz 0:217a7931b41f 1058
earlz 0:217a7931b41f 1059 void x86CPU::op16_test_rm16_imm16(ModRM16& rm){
earlz 0:217a7931b41f 1060 And16(rm.ReadWordr(),ReadWord(cCS,eip+rm.GetLength()));
earlz 0:217a7931b41f 1061 }
earlz 0:217a7931b41f 1062
earlz 0:217a7931b41f 1063 void x86CPU::op16_test_rm16_imm8(ModRM16& rm){
earlz 0:217a7931b41f 1064 And16(rm.ReadWordr(),SignExtend8(ReadByte(cCS,eip+rm.GetLength())));
earlz 0:217a7931b41f 1065 //gotta love parentheses...
earlz 0:217a7931b41f 1066 }
earlz 0:217a7931b41f 1067
earlz 0:217a7931b41f 1068
earlz 0:217a7931b41f 1069 void x86CPU::op16_shr_rm8_cl(ModRM16 &rm){
earlz 0:217a7931b41f 1070 rm.WriteByter(ShiftLogicalRight8(rm.ReadByter(),*regs8[CL]));
earlz 0:217a7931b41f 1071 }
earlz 0:217a7931b41f 1072 void x86CPU::op16_shr_rm16_cl(ModRM16 &rm){
earlz 0:217a7931b41f 1073 rm.WriteWordr(ShiftLogicalRight16(rm.ReadWordr(),*regs8[CL]));
earlz 0:217a7931b41f 1074 }
earlz 0:217a7931b41f 1075
earlz 0:217a7931b41f 1076 void x86CPU::op16_shl_rm8_cl(ModRM16 &rm){
earlz 0:217a7931b41f 1077 rm.WriteByter(ShiftLogicalLeft8(rm.ReadByter(),*regs8[CL]));
earlz 0:217a7931b41f 1078 }
earlz 0:217a7931b41f 1079 void x86CPU::op16_shl_rm16_cl(ModRM16 &rm){
earlz 0:217a7931b41f 1080 rm.WriteWordr(ShiftLogicalLeft16(rm.ReadWordr(),*regs8[CL]));
earlz 0:217a7931b41f 1081 }
earlz 0:217a7931b41f 1082
earlz 0:217a7931b41f 1083 void x86CPU::op16_sar_rm8_cl(ModRM16 &rm){
earlz 0:217a7931b41f 1084 rm.WriteByter(ShiftArithmeticRight8(rm.ReadByter(),*regs8[CL]));
earlz 0:217a7931b41f 1085 }
earlz 0:217a7931b41f 1086 void x86CPU::op16_sar_rm16_cl(ModRM16 &rm){
earlz 0:217a7931b41f 1087 rm.WriteWordr(ShiftArithmeticRight16(rm.ReadWordr(),*regs8[CL]));
earlz 0:217a7931b41f 1088 }
earlz 0:217a7931b41f 1089
earlz 0:217a7931b41f 1090 void x86CPU::op16_rol_rm8_cl(ModRM16 &rm){
earlz 0:217a7931b41f 1091 rm.WriteByter(RotateLeft8(rm.ReadByter(),*regs8[CL]));
earlz 0:217a7931b41f 1092 }
earlz 0:217a7931b41f 1093 void x86CPU::op16_rol_rm16_cl(ModRM16 &rm){
earlz 0:217a7931b41f 1094 rm.WriteWordr(RotateLeft16(rm.ReadWordr(),*regs8[CL]));
earlz 0:217a7931b41f 1095 }
earlz 0:217a7931b41f 1096
earlz 0:217a7931b41f 1097 void x86CPU::op16_ror_rm8_cl(ModRM16 &rm){
earlz 0:217a7931b41f 1098 rm.WriteByter(RotateRight8(rm.ReadByter(),*regs8[CL]));
earlz 0:217a7931b41f 1099 }
earlz 0:217a7931b41f 1100 void x86CPU::op16_ror_rm16_cl(ModRM16 &rm){
earlz 0:217a7931b41f 1101 rm.WriteWordr(RotateRight16(rm.ReadWordr(),*regs8[CL]));
earlz 0:217a7931b41f 1102 }
earlz 0:217a7931b41f 1103
earlz 0:217a7931b41f 1104
earlz 0:217a7931b41f 1105 void x86CPU::op16_rcl_rm8_cl(ModRM16 &rm){
earlz 0:217a7931b41f 1106 rm.WriteByter(RotateCarryLeft8(rm.ReadByter(),*regs8[CL]));
earlz 0:217a7931b41f 1107 }
earlz 0:217a7931b41f 1108 void x86CPU::op16_rcl_rm16_cl(ModRM16 &rm){
earlz 0:217a7931b41f 1109 rm.WriteWordr(RotateCarryLeft16(rm.ReadWordr(),*regs8[CL]));
earlz 0:217a7931b41f 1110 }
earlz 0:217a7931b41f 1111
earlz 0:217a7931b41f 1112 void x86CPU::op16_rcr_rm8_cl(ModRM16 &rm){
earlz 0:217a7931b41f 1113 rm.WriteByter(RotateCarryRight8(rm.ReadByter(),*regs8[CL]));
earlz 0:217a7931b41f 1114 }
earlz 0:217a7931b41f 1115 void x86CPU::op16_rcr_rm16_cl(ModRM16 &rm){
earlz 0:217a7931b41f 1116 rm.WriteWordr(RotateCarryRight16(rm.ReadWordr(),*regs8[CL]));
earlz 0:217a7931b41f 1117 }
earlz 0:217a7931b41f 1118
earlz 0:217a7931b41f 1119
earlz 0:217a7931b41f 1120 /****/
earlz 0:217a7931b41f 1121 void x86CPU::op16_shr_rm8_1(ModRM16 &rm){
earlz 0:217a7931b41f 1122 rm.WriteByter(ShiftLogicalRight8(rm.ReadByter(),1));
earlz 0:217a7931b41f 1123 }
earlz 0:217a7931b41f 1124 void x86CPU::op16_shr_rm16_1(ModRM16 &rm){
earlz 0:217a7931b41f 1125 rm.WriteWordr(ShiftLogicalRight16(rm.ReadWordr(),1));
earlz 0:217a7931b41f 1126 }
earlz 0:217a7931b41f 1127
earlz 0:217a7931b41f 1128 void x86CPU::op16_shl_rm8_1(ModRM16 &rm){
earlz 0:217a7931b41f 1129 rm.WriteByter(ShiftLogicalLeft8(rm.ReadByter(),1));
earlz 0:217a7931b41f 1130 }
earlz 0:217a7931b41f 1131 void x86CPU::op16_shl_rm16_1(ModRM16 &rm){
earlz 0:217a7931b41f 1132 rm.WriteWordr(ShiftLogicalLeft16(rm.ReadWordr(),1));
earlz 0:217a7931b41f 1133 }
earlz 0:217a7931b41f 1134
earlz 0:217a7931b41f 1135 void x86CPU::op16_sar_rm8_1(ModRM16 &rm){
earlz 0:217a7931b41f 1136 rm.WriteByter(ShiftArithmeticRight8(rm.ReadByter(),1));
earlz 0:217a7931b41f 1137 }
earlz 0:217a7931b41f 1138 void x86CPU::op16_sar_rm16_1(ModRM16 &rm){
earlz 0:217a7931b41f 1139 rm.WriteWordr(ShiftArithmeticRight16(rm.ReadWordr(),1));
earlz 0:217a7931b41f 1140 }
earlz 0:217a7931b41f 1141
earlz 0:217a7931b41f 1142 void x86CPU::op16_rol_rm8_1(ModRM16 &rm){
earlz 0:217a7931b41f 1143 rm.WriteByter(RotateLeft8(rm.ReadByter(),1));
earlz 0:217a7931b41f 1144 }
earlz 0:217a7931b41f 1145 void x86CPU::op16_rol_rm16_1(ModRM16 &rm){
earlz 0:217a7931b41f 1146 rm.WriteWordr(RotateLeft16(rm.ReadWordr(),1));
earlz 0:217a7931b41f 1147 }
earlz 0:217a7931b41f 1148
earlz 0:217a7931b41f 1149 void x86CPU::op16_ror_rm8_1(ModRM16 &rm){
earlz 0:217a7931b41f 1150 rm.WriteByter(RotateRight8(rm.ReadByter(),1));
earlz 0:217a7931b41f 1151 }
earlz 0:217a7931b41f 1152 void x86CPU::op16_ror_rm16_1(ModRM16 &rm){
earlz 0:217a7931b41f 1153 rm.WriteWordr(RotateRight16(rm.ReadWordr(),1));
earlz 0:217a7931b41f 1154 }
earlz 0:217a7931b41f 1155
earlz 0:217a7931b41f 1156
earlz 0:217a7931b41f 1157 void x86CPU::op16_rcl_rm8_1(ModRM16 &rm){
earlz 0:217a7931b41f 1158 rm.WriteByter(RotateCarryLeft8(rm.ReadByter(),1));
earlz 0:217a7931b41f 1159 }
earlz 0:217a7931b41f 1160 void x86CPU::op16_rcl_rm16_1(ModRM16 &rm){
earlz 0:217a7931b41f 1161 rm.WriteWordr(RotateCarryLeft16(rm.ReadWordr(),1));
earlz 0:217a7931b41f 1162 }
earlz 0:217a7931b41f 1163
earlz 0:217a7931b41f 1164 void x86CPU::op16_rcr_rm8_1(ModRM16 &rm){
earlz 0:217a7931b41f 1165 rm.WriteByter(RotateCarryRight8(rm.ReadByter(),1));
earlz 0:217a7931b41f 1166 }
earlz 0:217a7931b41f 1167 void x86CPU::op16_rcr_rm16_1(ModRM16 &rm){
earlz 0:217a7931b41f 1168 rm.WriteWordr(RotateCarryRight16(rm.ReadWordr(),1));
earlz 0:217a7931b41f 1169 }
earlz 0:217a7931b41f 1170
earlz 0:217a7931b41f 1171 void x86CPU::op16_not_rm8(ModRM16 &rm){
earlz 0:217a7931b41f 1172 rm.WriteByter(~(rm.ReadByter()));
earlz 0:217a7931b41f 1173 }
earlz 0:217a7931b41f 1174
earlz 0:217a7931b41f 1175 void x86CPU::op16_not_rm16(ModRM16 &rm){
earlz 0:217a7931b41f 1176 rm.WriteWordr(~(rm.ReadWordr()));
earlz 0:217a7931b41f 1177 }
earlz 0:217a7931b41f 1178
earlz 0:217a7931b41f 1179
earlz 0:217a7931b41f 1180
earlz 0:217a7931b41f 1181
earlz 0:217a7931b41f 1182 /**
earlz 0:217a7931b41f 1183 BCD Opcodes for Open86
earlz 0:217a7931b41f 1184 By: Alboin, 3-16-07
earlz 0:217a7931b41f 1185 Modified to work with x86Lib by Jordan(hckr83)
earlz 0:217a7931b41f 1186 **/
earlz 0:217a7931b41f 1187
earlz 0:217a7931b41f 1188
earlz 0:217a7931b41f 1189 /* Opcode: 0x37 */
earlz 0:217a7931b41f 1190 void x86CPU::op16_aaa() {
earlz 0:217a7931b41f 1191 if((*regs8[AL] & 0x0f) > 9 || freg.af == 1) {
earlz 0:217a7931b41f 1192 *regs8[AL] += 6;
earlz 0:217a7931b41f 1193 *regs8[AH]++;
earlz 0:217a7931b41f 1194 freg.af = 1;
earlz 0:217a7931b41f 1195 freg.cf = 1;
earlz 0:217a7931b41f 1196 }
earlz 0:217a7931b41f 1197 else {
earlz 0:217a7931b41f 1198 freg.af = 0;
earlz 0:217a7931b41f 1199 freg.cf = 0;
earlz 0:217a7931b41f 1200 }
earlz 0:217a7931b41f 1201 *regs8[AL] = *regs8[AL] & 0x0f;
earlz 0:217a7931b41f 1202 }
earlz 0:217a7931b41f 1203
earlz 0:217a7931b41f 1204
earlz 0:217a7931b41f 1205 /* Opcode: 0x27 */
earlz 0:217a7931b41f 1206 void x86CPU::op16_daa() {
earlz 0:217a7931b41f 1207 if((*regs8[AL] & 0x0f) > 9 || freg.af == 1) {
earlz 0:217a7931b41f 1208 *regs8[AL] += 6;
earlz 0:217a7931b41f 1209 *regs8[AH]++;
earlz 0:217a7931b41f 1210 }
earlz 0:217a7931b41f 1211 else
earlz 0:217a7931b41f 1212 freg.af = 0;
earlz 0:217a7931b41f 1213
earlz 0:217a7931b41f 1214 if(*regs8[AL] > 0x9f || freg.cf == 1) {
earlz 0:217a7931b41f 1215 *regs8[AL] = *regs8[AL] + 0x60;
earlz 0:217a7931b41f 1216 freg.cf = 1;
earlz 0:217a7931b41f 1217 }
earlz 0:217a7931b41f 1218 else
earlz 0:217a7931b41f 1219 freg.cf = 0;
earlz 0:217a7931b41f 1220 }
earlz 0:217a7931b41f 1221
earlz 0:217a7931b41f 1222 /* Opcode: 0x2F */
earlz 0:217a7931b41f 1223 void x86CPU::op16_das() {
earlz 0:217a7931b41f 1224 if((*regs8[AL] & 0x0f) > 9 || freg.af == 1) {
earlz 0:217a7931b41f 1225 *regs8[AL] -= 6;
earlz 0:217a7931b41f 1226 freg.af = 1;
earlz 0:217a7931b41f 1227 }
earlz 0:217a7931b41f 1228 else
earlz 0:217a7931b41f 1229 freg.af = 0;
earlz 0:217a7931b41f 1230
earlz 0:217a7931b41f 1231 if(*regs8[AL] > 0x9f || freg.cf == 1) {
earlz 0:217a7931b41f 1232 *regs8[AL] -= 0x60;
earlz 0:217a7931b41f 1233 freg.cf = 1;
earlz 0:217a7931b41f 1234 }
earlz 0:217a7931b41f 1235 else
earlz 0:217a7931b41f 1236 freg.cf = 0;
earlz 0:217a7931b41f 1237 }
earlz 0:217a7931b41f 1238
earlz 0:217a7931b41f 1239 /* Opcode: 0x3F */
earlz 0:217a7931b41f 1240 void x86CPU::op16_aas() {
earlz 0:217a7931b41f 1241 if((*regs8[AL] & 0x0f) > 9 || freg.af == 1) {
earlz 0:217a7931b41f 1242 *regs8[AL] -= 6;
earlz 0:217a7931b41f 1243 *regs8[AH]--;
earlz 0:217a7931b41f 1244 freg.af = 1;
earlz 0:217a7931b41f 1245 freg.cf = 1;
earlz 0:217a7931b41f 1246 }
earlz 0:217a7931b41f 1247 else {
earlz 0:217a7931b41f 1248 freg.af = 0;
earlz 0:217a7931b41f 1249 freg.cf = 0;
earlz 0:217a7931b41f 1250 }
earlz 0:217a7931b41f 1251 *regs8[AL] = *regs8[AL] & 0x0f;
earlz 0:217a7931b41f 1252 }
earlz 0:217a7931b41f 1253
earlz 0:217a7931b41f 1254
earlz 0:217a7931b41f 1255
earlz 0:217a7931b41f 1256 void x86CPU::op16_aad(){
earlz 0:217a7931b41f 1257 //AAD is a weird opcode because it is two bytes
earlz 0:217a7931b41f 1258 //for "apparently" no reason. But really, it is just
earlz 0:217a7931b41f 1259 //undocumented... the 0x0A in the second byte is for
earlz 0:217a7931b41f 1260 //multiplecation...but it can be changed...
earlz 0:217a7931b41f 1261 *regs8[AL]=(*regs8[AH])*(op_cache[1])+*regs8[AL];
earlz 0:217a7931b41f 1262 *regs8[AH]=0;
earlz 0:217a7931b41f 1263 }
earlz 0:217a7931b41f 1264
earlz 0:217a7931b41f 1265 void x86CPU::op16_aam(){
earlz 0:217a7931b41f 1266 //same wiht the 0x0A operand as above..
earlz 0:217a7931b41f 1267 if(op_cache[1]==0){
earlz 0:217a7931b41f 1268 Onx86LibError();
earlz 0:217a7931b41f 1269 //throw CpuInt_excp(DIV0_IEXCP);
earlz 0:217a7931b41f 1270 }
earlz 0:217a7931b41f 1271 *regs8[AH]=(*regs8[AL])/op_cache[1];
earlz 0:217a7931b41f 1272 *regs8[AL]=(*regs8[AL])%op_cache[1];
earlz 0:217a7931b41f 1273 }
earlz 0:217a7931b41f 1274
earlz 0:217a7931b41f 1275
earlz 0:217a7931b41f 1276
earlz 0:217a7931b41f 1277
earlz 0:217a7931b41f 1278
earlz 0:217a7931b41f 1279
earlz 0:217a7931b41f 1280
earlz 0:217a7931b41f 1281
earlz 0:217a7931b41f 1282
earlz 0:217a7931b41f 1283
earlz 0:217a7931b41f 1284 };
earlz 0:217a7931b41f 1285
earlz 0:217a7931b41f 1286
earlz 0:217a7931b41f 1287