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 #define X86LIB_BUILD
earlz 0:217a7931b41f 31 #include <iostream>
earlz 0:217a7931b41f 32 #include "include/x86Lib.h"
earlz 0:217a7931b41f 33
earlz 0:217a7931b41f 34
earlz 0:217a7931b41f 35 namespace x86Lib{
earlz 0:217a7931b41f 36 //The lack of indentation for namespaces is intentional...
earlz 0:217a7931b41f 37 using namespace std;
earlz 0:217a7931b41f 38
earlz 0:217a7931b41f 39
earlz 0:217a7931b41f 40 x86CPU::x86CPU(uint32_t cpu_level_,uint32_t flags){
earlz 0:217a7931b41f 41 if(cpu_level_==0){
earlz 0:217a7931b41f 42 cpu_level=CPU286_REAL; //The default CPU right now..
earlz 0:217a7931b41f 43 }else{
earlz 0:217a7931b41f 44 cpu_level=cpu_level_;
earlz 0:217a7931b41f 45 }
earlz 0:217a7931b41f 46 Init();
earlz 0:217a7931b41f 47 }
earlz 0:217a7931b41f 48 x86CPU::x86CPU(x86SaveData &load_data,uint32_t flags){
earlz 0:217a7931b41f 49 Init();
earlz 0:217a7931b41f 50 LoadState(load_data);
earlz 0:217a7931b41f 51 }
earlz 0:217a7931b41f 52
earlz 0:217a7931b41f 53 void x86CPU::Init(){
earlz 0:217a7931b41f 54 //ports=new x86Ports();
earlz 0:217a7931b41f 55 #ifdef ENABLE_OPCODE_CALLBACK
earlz 0:217a7931b41f 56 EachOpcodeCallback=NULL;
earlz 0:217a7931b41f 57 #endif
earlz 0:217a7931b41f 58 Reset();
earlz 0:217a7931b41f 59 }
earlz 0:217a7931b41f 60
earlz 0:217a7931b41f 61 void Onx86LibError()
earlz 0:217a7931b41f 62 {
earlz 0:217a7931b41f 63 Serial pc(USBTX, USBRX); // tx, rx
earlz 0:217a7931b41f 64 pc.printf("x86lib error\n");
earlz 0:217a7931b41f 65 exit(1);
earlz 0:217a7931b41f 66 }
earlz 0:217a7931b41f 67
earlz 0:217a7931b41f 68 void x86CPU::Reset(){
earlz 0:217a7931b41f 69 /**Initialize register pointers**/
earlz 0:217a7931b41f 70 regs16[0]=&((volatile uint16_t*)reg32)[0];
earlz 0:217a7931b41f 71 regs16[1]=&((volatile uint16_t*)reg32)[2];
earlz 0:217a7931b41f 72 regs16[2]=&((volatile uint16_t*)reg32)[4];
earlz 0:217a7931b41f 73 regs16[3]=&((volatile uint16_t*)reg32)[6];
earlz 0:217a7931b41f 74 regs16[4]=&((volatile uint16_t*)reg32)[8];
earlz 0:217a7931b41f 75 regs16[5]=&((volatile uint16_t*)reg32)[10];
earlz 0:217a7931b41f 76 regs16[6]=&((volatile uint16_t*)reg32)[12];
earlz 0:217a7931b41f 77 regs16[7]=&((volatile uint16_t*)reg32)[14];
earlz 0:217a7931b41f 78 regs8[0]=&((volatile uint8_t*)reg32)[0];
earlz 0:217a7931b41f 79 regs8[1]=&((volatile uint8_t*)reg32)[4];
earlz 0:217a7931b41f 80 regs8[2]=&((volatile uint8_t*)reg32)[8];
earlz 0:217a7931b41f 81 regs8[3]=&((volatile uint8_t*)reg32)[12], //now do all the highs
earlz 0:217a7931b41f 82 regs8[4]=&((volatile uint8_t*)reg32)[1];
earlz 0:217a7931b41f 83 regs8[5]=&((volatile uint8_t*)reg32)[5];
earlz 0:217a7931b41f 84 regs8[6]=&((volatile uint8_t*)reg32)[9];
earlz 0:217a7931b41f 85 regs8[7]=&((volatile uint8_t*)reg32)[13];
earlz 0:217a7931b41f 86 busmaster=0;
earlz 0:217a7931b41f 87 //assumes pmem and ports are still the same...
earlz 0:217a7931b41f 88 InitOpcodes();
earlz 0:217a7931b41f 89 uint32_t i;
earlz 0:217a7931b41f 90 for(i=0;i<8;i++){
earlz 0:217a7931b41f 91 reg32[i]=0;
earlz 0:217a7931b41f 92 }
earlz 0:217a7931b41f 93 for(i=0;i<7;i++){
earlz 0:217a7931b41f 94 seg[i]=0;
earlz 0:217a7931b41f 95 }
earlz 0:217a7931b41f 96 ResetSegments();
earlz 0:217a7931b41f 97 //eip=0xFFFE;
earlz 0:217a7931b41f 98 eip=0x0;
earlz 0:217a7931b41f 99 seg[cCS]=0xF000;
earlz 0:217a7931b41f 100 *(uint16_t*)&freg=0;
earlz 0:217a7931b41f 101 string_compares=0;
earlz 0:217a7931b41f 102 int_pending=0;
earlz 0:217a7931b41f 103 cli_count=0;
earlz 0:217a7931b41f 104 }
earlz 0:217a7931b41f 105
earlz 0:217a7931b41f 106
earlz 0:217a7931b41f 107 void x86CPU::SaveState(x86SaveData *save){
earlz 0:217a7931b41f 108 uint32_t i;
earlz 0:217a7931b41f 109 for(i=0;i<8;i++){
earlz 0:217a7931b41f 110 save->reg32[i]=reg32[i];
earlz 0:217a7931b41f 111 }
earlz 0:217a7931b41f 112 for(i=0;i<7;i++){
earlz 0:217a7931b41f 113 save->seg[i]=seg[i];
earlz 0:217a7931b41f 114 }
earlz 0:217a7931b41f 115 save->freg=*(uint16_t*)&freg;
earlz 0:217a7931b41f 116 save->eip=eip;
earlz 0:217a7931b41f 117 save->seg_route[cES]=ES;
earlz 0:217a7931b41f 118 save->seg_route[cCS]=CS;
earlz 0:217a7931b41f 119 save->seg_route[cDS]=DS;
earlz 0:217a7931b41f 120 save->seg_route[cSS]=SS;
earlz 0:217a7931b41f 121 save->seg_route[cFS]=FS;
earlz 0:217a7931b41f 122 save->seg_route[cGS]=GS;
earlz 0:217a7931b41f 123 save->cpu_level=cpu_level;
earlz 0:217a7931b41f 124 if(Opcodes==opcodes_16bit){
earlz 0:217a7931b41f 125 save->opcode_mode=OPCODE_REAL_16;
earlz 0:217a7931b41f 126 }else{
earlz 0:217a7931b41f 127 Onx86LibError();
earlz 0:217a7931b41f 128 //throw Default_excp(__FILE__,__FUNCTION__,__LINE__);
earlz 0:217a7931b41f 129 }
earlz 0:217a7931b41f 130 }
earlz 0:217a7931b41f 131
earlz 0:217a7931b41f 132 void x86CPU::LoadState(x86SaveData &load){
earlz 0:217a7931b41f 133 uint32_t i;
earlz 0:217a7931b41f 134 cpu_level=load.cpu_level;
earlz 0:217a7931b41f 135 Reset();
earlz 0:217a7931b41f 136 for(i=0;i<8;i++){
earlz 0:217a7931b41f 137 reg32[i]=load.reg32[i];
earlz 0:217a7931b41f 138 }
earlz 0:217a7931b41f 139 for(i=0;i<7;i++){
earlz 0:217a7931b41f 140 seg[i]=load.seg[i];
earlz 0:217a7931b41f 141 }
earlz 0:217a7931b41f 142 *(uint16_t*)&freg=load.freg;
earlz 0:217a7931b41f 143 eip=load.eip;
earlz 0:217a7931b41f 144 ES=load.seg_route[cES];
earlz 0:217a7931b41f 145 CS=load.seg_route[cCS];
earlz 0:217a7931b41f 146 DS=load.seg_route[cDS];
earlz 0:217a7931b41f 147 SS=load.seg_route[cSS];
earlz 0:217a7931b41f 148 GS=load.seg_route[cGS];
earlz 0:217a7931b41f 149 FS=load.seg_route[cFS];
earlz 0:217a7931b41f 150 if(load.opcode_mode==OPCODE_REAL_16){
earlz 0:217a7931b41f 151 Opcodes=opcodes_16bit;
earlz 0:217a7931b41f 152 }else{
earlz 0:217a7931b41f 153 Onx86LibError();
earlz 0:217a7931b41f 154 //throw Default_excp(__FILE__,__FUNCTION__,__LINE__);
earlz 0:217a7931b41f 155 }
earlz 0:217a7931b41f 156 }
earlz 0:217a7931b41f 157
earlz 0:217a7931b41f 158
earlz 0:217a7931b41f 159
earlz 0:217a7931b41f 160
earlz 0:217a7931b41f 161 void x86CPU::DumpState(ostream &output){
earlz 0:217a7931b41f 162 output << "EAX: "<< hex << reg32[EAX] <<endl;
earlz 0:217a7931b41f 163 output << "ECX: "<< hex << reg32[ECX] <<endl;
earlz 0:217a7931b41f 164 output << "EDX: "<< hex << reg32[EDX] <<endl;
earlz 0:217a7931b41f 165 output << "EBX: "<< hex << reg32[EBX] <<endl;
earlz 0:217a7931b41f 166 output << "ESP: "<< hex << reg32[ESP] <<endl;
earlz 0:217a7931b41f 167 output << "EBP: "<< hex << reg32[EBP] <<endl;
earlz 0:217a7931b41f 168 output << "ESI: "<< hex << reg32[ESI] <<endl;
earlz 0:217a7931b41f 169 output << "EDI: "<< hex << reg32[EDI] <<endl;
earlz 0:217a7931b41f 170
earlz 0:217a7931b41f 171 output << "CS: " << hex << seg[cCS] << endl;
earlz 0:217a7931b41f 172 output << "SS: " << hex << seg[cSS] << endl;
earlz 0:217a7931b41f 173 output << "DS: " << hex << seg[cDS] << endl;
earlz 0:217a7931b41f 174 output << "ES: " << hex << seg[cES] << endl;
earlz 0:217a7931b41f 175 output << "FS: " << hex << seg[cFS] << endl;
earlz 0:217a7931b41f 176 output << "GS: " << hex << seg[cGS] << endl;
earlz 0:217a7931b41f 177 output << "EIP: " << hex << eip << endl;
earlz 0:217a7931b41f 178
earlz 0:217a7931b41f 179 output << "--Flags:" <<hex << *(uint16_t*)&freg<< endl;
earlz 0:217a7931b41f 180 output << "CF: " << (int)freg.cf << endl;
earlz 0:217a7931b41f 181 output << "PF: " << (int)freg.pf << endl;
earlz 0:217a7931b41f 182 output << "AF: " << (int)freg.af << endl;
earlz 0:217a7931b41f 183 output << "ZF: " << (int)freg.zf << endl;
earlz 0:217a7931b41f 184 output << "SF: " << (int)freg.sf << endl;
earlz 0:217a7931b41f 185 output << "TF: " << (int)freg.tf << endl;
earlz 0:217a7931b41f 186 output << "IF: " << (int)freg._if << endl;
earlz 0:217a7931b41f 187 output << "DF: " << (int)freg.df << endl;
earlz 0:217a7931b41f 188 output << "OF: " << (int)freg.of << endl;
earlz 0:217a7931b41f 189 }
earlz 0:217a7931b41f 190
earlz 0:217a7931b41f 191 void x86CPU::Int(uint8_t num){ //external interrupt
earlz 0:217a7931b41f 192 int_pending=1;
earlz 0:217a7931b41f 193 int_number=num;
earlz 0:217a7931b41f 194 }
earlz 0:217a7931b41f 195
earlz 0:217a7931b41f 196 bool x86CPU::IntPending(){
earlz 0:217a7931b41f 197 return int_pending;
earlz 0:217a7931b41f 198 }
earlz 0:217a7931b41f 199
earlz 0:217a7931b41f 200
earlz 0:217a7931b41f 201
earlz 0:217a7931b41f 202 int x86CPU::CheckInterrupts(){
earlz 0:217a7931b41f 203 //possible bug here. What if we have a pop SS without an interrupt waiting? Won't interrupts be forever ignored?
earlz 0:217a7931b41f 204 if(int_pending==0){return 0;} //quickly get out of this, this is in the main Cycle loop, so needs to be very speedy...
earlz 0:217a7931b41f 205 if((int_pending==1) && (int_number==2)){ //NMI
earlz 0:217a7931b41f 206 eip--;
earlz 0:217a7931b41f 207 Int16(2);
earlz 0:217a7931b41f 208 eip++;
earlz 0:217a7931b41f 209 int_pending=0;
earlz 0:217a7931b41f 210 return 1;
earlz 0:217a7931b41f 211 }
earlz 0:217a7931b41f 212 if(freg._if==0){
earlz 0:217a7931b41f 213 if(cli_count>1){
earlz 0:217a7931b41f 214 cli_count--;
earlz 0:217a7931b41f 215 }else{
earlz 0:217a7931b41f 216 if(cli_count!=0){
earlz 0:217a7931b41f 217 freg._if=1;
earlz 0:217a7931b41f 218 }
earlz 0:217a7931b41f 219 }
earlz 0:217a7931b41f 220 }else{
earlz 0:217a7931b41f 221 if(int_pending==1){
earlz 0:217a7931b41f 222 eip--;
earlz 0:217a7931b41f 223 Int16(int_number);
earlz 0:217a7931b41f 224 eip++;
earlz 0:217a7931b41f 225 int_pending=0;
earlz 0:217a7931b41f 226 return 1;
earlz 0:217a7931b41f 227 }
earlz 0:217a7931b41f 228 }
earlz 0:217a7931b41f 229 return 0;
earlz 0:217a7931b41f 230 }
earlz 0:217a7931b41f 231
earlz 0:217a7931b41f 232 void x86CPU::Exec(int cyclecount){
earlz 0:217a7931b41f 233 int i=0;
earlz 0:217a7931b41f 234 bool done=false;
earlz 0:217a7931b41f 235 while(!done){
earlz 0:217a7931b41f 236 //try{
earlz 0:217a7931b41f 237 for(;i<cyclecount;i++){
earlz 0:217a7931b41f 238 Cycle();
earlz 0:217a7931b41f 239 }
earlz 0:217a7931b41f 240 //}
earlz 0:217a7931b41f 241 /*catch(CpuInt_excp err){
earlz 0:217a7931b41f 242 err.code&=0x00FF;
earlz 0:217a7931b41f 243 switch(err.code){
earlz 0:217a7931b41f 244 case 0: //division by zero
earlz 0:217a7931b41f 245 case 1: //debug exception
earlz 0:217a7931b41f 246 case 2: //NMI
earlz 0:217a7931b41f 247 case 3: //breakpoint
earlz 0:217a7931b41f 248 case 4: //overflow
earlz 0:217a7931b41f 249
earlz 0:217a7931b41f 250 case 7: //device unavailable
earlz 0:217a7931b41f 251 Int16(err.code);
earlz 0:217a7931b41f 252 eip++; //undo the decrement by Int
earlz 0:217a7931b41f 253 break;
earlz 0:217a7931b41f 254 case 5: //(186+ bounds check)
earlz 0:217a7931b41f 255 if(cpu_level >= CPU186){
earlz 0:217a7931b41f 256 Int16(err.code);
earlz 0:217a7931b41f 257 eip++;
earlz 0:217a7931b41f 258 break;
earlz 0:217a7931b41f 259 }
earlz 0:217a7931b41f 260 default:
earlz 0:217a7931b41f 261 throw CpuPanic_excp("16bit Faults",(err.code|0xF000)|TRIPLE_FAULT_EXCP);
earlz 0:217a7931b41f 262 break;
earlz 0:217a7931b41f 263 }
earlz 0:217a7931b41f 264 }
earlz 0:217a7931b41f 265 catch(Mem_excp err){
earlz 0:217a7931b41f 266 throw CpuPanic_excp("Mem Error--16bit Faults",TRIPLE_FAULT_EXCP);
earlz 0:217a7931b41f 267 }
earlz 0:217a7931b41f 268 */
earlz 0:217a7931b41f 269 if(i>=cyclecount){
earlz 0:217a7931b41f 270 done=true;
earlz 0:217a7931b41f 271 }
earlz 0:217a7931b41f 272 }
earlz 0:217a7931b41f 273 }
earlz 0:217a7931b41f 274
earlz 0:217a7931b41f 275
earlz 0:217a7931b41f 276 void x86CPU::Cycle(){
earlz 0:217a7931b41f 277 #ifdef ENABLE_OPCODE_CALLBACK
earlz 0:217a7931b41f 278 if(EachOpcodeCallback!=NULL){
earlz 0:217a7931b41f 279 (*EachOpcodeCallback)(this);
earlz 0:217a7931b41f 280 }
earlz 0:217a7931b41f 281 #endif
earlz 0:217a7931b41f 282 CheckInterrupts();
earlz 0:217a7931b41f 283 *(uint32_t*)&op_cache=ReadDword(cCS,eip);
earlz 0:217a7931b41f 284 (this->*Opcodes[op_cache[0]])();
earlz 0:217a7931b41f 285 //operate on the this class with the opcode functions in this class
earlz 0:217a7931b41f 286 eip=(uint16_t)eip+1;
earlz 0:217a7931b41f 287 }
earlz 0:217a7931b41f 288
earlz 0:217a7931b41f 289
earlz 0:217a7931b41f 290
earlz 0:217a7931b41f 291
earlz 0:217a7931b41f 292
earlz 0:217a7931b41f 293
earlz 0:217a7931b41f 294
earlz 0:217a7931b41f 295 void x86CPU::InstallOp(uint8_t num,opcode func,uint32_t level){
earlz 0:217a7931b41f 296 if((cpu_level&level)>0){
earlz 0:217a7931b41f 297 Opcodes[num]=func;
earlz 0:217a7931b41f 298 }
earlz 0:217a7931b41f 299 }
earlz 0:217a7931b41f 300
earlz 0:217a7931b41f 301
earlz 0:217a7931b41f 302 void x86CPU::InitOpcodes(){
earlz 0:217a7931b41f 303 Opcodes=opcodes_16bit;
earlz 0:217a7931b41f 304 int i;
earlz 0:217a7931b41f 305 for(i=0;i<256;i++){
earlz 0:217a7931b41f 306 InstallOp(i,&x86CPU::op16_unknown);
earlz 0:217a7931b41f 307 }
earlz 0:217a7931b41f 308 for(i=0;i<=7;i++){
earlz 0:217a7931b41f 309 InstallOp(0xB0+i,&x86CPU::op16_mov_r8_imm8);
earlz 0:217a7931b41f 310 InstallOp(0x58+i,&x86CPU::op16_pop_r16);
earlz 0:217a7931b41f 311 InstallOp(0x50+i,&x86CPU::op16_push_r16);
earlz 0:217a7931b41f 312 InstallOp(0x40+i,&x86CPU::op16_inc_r16);
earlz 0:217a7931b41f 313 InstallOp(0x48+i,&x86CPU::op16_dec_r16);
earlz 0:217a7931b41f 314 InstallOp(0xD8+i,&x86CPU::op16_escape);
earlz 0:217a7931b41f 315 InstallOp(0x90+i,&x86CPU::op16_xchg_ax_r16);
earlz 0:217a7931b41f 316 InstallOp(0xB8+i,&x86CPU::op16_mov_r16_imm16);
earlz 0:217a7931b41f 317 }
earlz 0:217a7931b41f 318 InstallOp(0xF4,&x86CPU::op16_hlt);
earlz 0:217a7931b41f 319 InstallOp(0x90,&x86CPU::op16_nop);
earlz 0:217a7931b41f 320 InstallOp(0xEB,&x86CPU::op16_jmp_rel8);
earlz 0:217a7931b41f 321 InstallOp(0x2C,&x86CPU::op16_sub_al_imm8);
earlz 0:217a7931b41f 322 InstallOp(0x2D,&x86CPU::op16_sub_ax_imm16);
earlz 0:217a7931b41f 323 InstallOp(0x77,&x86CPU::op16_ja_rel8);
earlz 0:217a7931b41f 324 InstallOp(0x70,&x86CPU::op16_jo_rel8);
earlz 0:217a7931b41f 325 InstallOp(0x71,&x86CPU::op16_jno_rel8);
earlz 0:217a7931b41f 326 InstallOp(0x72,&x86CPU::op16_jc_rel8);
earlz 0:217a7931b41f 327 InstallOp(0x73,&x86CPU::op16_jnc_rel8);
earlz 0:217a7931b41f 328 InstallOp(0x74,&x86CPU::op16_jz_rel8);
earlz 0:217a7931b41f 329 InstallOp(0x75,&x86CPU::op16_jnz_rel8);
earlz 0:217a7931b41f 330 InstallOp(0x77,&x86CPU::op16_jbe_rel8);
earlz 0:217a7931b41f 331 InstallOp(0x78,&x86CPU::op16_js_rel8);
earlz 0:217a7931b41f 332 InstallOp(0x79,&x86CPU::op16_jns_rel8);
earlz 0:217a7931b41f 333 InstallOp(0x7A,&x86CPU::op16_jp_rel8);
earlz 0:217a7931b41f 334 InstallOp(0x7B,&x86CPU::op16_jnp_rel8);
earlz 0:217a7931b41f 335 InstallOp(0x7C,&x86CPU::op16_jl_rel8);
earlz 0:217a7931b41f 336 InstallOp(0x7D,&x86CPU::op16_jge_rel8);
earlz 0:217a7931b41f 337 InstallOp(0x7E,&x86CPU::op16_jle_rel8);
earlz 0:217a7931b41f 338 InstallOp(0x7F,&x86CPU::op16_jg_rel8);
earlz 0:217a7931b41f 339 InstallOp(0x8E,&x86CPU::op16_mov_sr_rm16);
earlz 0:217a7931b41f 340 InstallOp(0x8C,&x86CPU::op16_mov_rm16_sr);
earlz 0:217a7931b41f 341 InstallOp(0x68,&x86CPU::op16_push_imm16,CPU286_REAL);
earlz 0:217a7931b41f 342 InstallOp(0x07,&x86CPU::op16_pop_es);
earlz 0:217a7931b41f 343 InstallOp(0x17,&x86CPU::op16_pop_ss);
earlz 0:217a7931b41f 344 InstallOp(0x1F,&x86CPU::op16_pop_ds);
earlz 0:217a7931b41f 345 InstallOp(0x06,&x86CPU::op16_push_es);
earlz 0:217a7931b41f 346 InstallOp(0x0E,&x86CPU::op16_push_cs);
earlz 0:217a7931b41f 347 InstallOp(0x16,&x86CPU::op16_push_ss);
earlz 0:217a7931b41f 348 InstallOp(0x1E,&x86CPU::op16_push_ds);
earlz 0:217a7931b41f 349 InstallOp(0x89,&x86CPU::op16_mov_rm16_r16);
earlz 0:217a7931b41f 350 InstallOp(0x8B,&x86CPU::op16_mov_r16_rm16);
earlz 0:217a7931b41f 351 InstallOp(0xE8,&x86CPU::op16_call_rel16);
earlz 0:217a7931b41f 352 InstallOp(0xC3,&x86CPU::op16_retn);
earlz 0:217a7931b41f 353 InstallOp(0xE2,&x86CPU::op16_loop_rel8);
earlz 0:217a7931b41f 354 InstallOp(0x26,&x86CPU::op16_pre_es_override);
earlz 0:217a7931b41f 355 InstallOp(0x3E,&x86CPU::op16_pre_ds_override);
earlz 0:217a7931b41f 356 InstallOp(0x36,&x86CPU::op16_pre_ss_override);
earlz 0:217a7931b41f 357 InstallOp(0x2E,&x86CPU::op16_pre_cs_override);
earlz 0:217a7931b41f 358 InstallOp(0xA5,&x86CPU::op16_movsw);
earlz 0:217a7931b41f 359 InstallOp(0xA4,&x86CPU::op16_movsb);
earlz 0:217a7931b41f 360 InstallOp(0xF8,&x86CPU::op16_clc);
earlz 0:217a7931b41f 361 InstallOp(0xFC,&x86CPU::op16_cld);
earlz 0:217a7931b41f 362 InstallOp(0xFA,&x86CPU::op16_cli);
earlz 0:217a7931b41f 363 InstallOp(0xF9,&x86CPU::op16_stc);
earlz 0:217a7931b41f 364 InstallOp(0xFD,&x86CPU::op16_std);
earlz 0:217a7931b41f 365 InstallOp(0xFB,&x86CPU::op16_sti);
earlz 0:217a7931b41f 366 InstallOp(0xF2,&x86CPU::op16_rep);
earlz 0:217a7931b41f 367 InstallOp(0xF3,&x86CPU::op16_rep); //different, but handled by the same function...
earlz 0:217a7931b41f 368 InstallOp(0xE6,&x86CPU::op16_out_imm8_al);
earlz 0:217a7931b41f 369 InstallOp(0xE7,&x86CPU::op16_out_imm8_ax);
earlz 0:217a7931b41f 370 InstallOp(0x9A,&x86CPU::op16_call_imm16_imm16);
earlz 0:217a7931b41f 371 InstallOp(0xCB,&x86CPU::op16_retf); //lol...CB...<inside joke>
earlz 0:217a7931b41f 372 InstallOp(0xCD,&x86CPU::op16_int_imm8);
earlz 0:217a7931b41f 373 InstallOp(0xCF,&x86CPU::op16_iret);
earlz 0:217a7931b41f 374 InstallOp(0xCC,&x86CPU::op16_int3);
earlz 0:217a7931b41f 375 InstallOp(0xCE,&x86CPU::op16_into);
earlz 0:217a7931b41f 376 InstallOp(0xE4,&x86CPU::op16_in_al_imm8);
earlz 0:217a7931b41f 377 InstallOp(0xE5,&x86CPU::op16_in_ax_imm8);
earlz 0:217a7931b41f 378 InstallOp(0x04,&x86CPU::op16_add_al_imm8);
earlz 0:217a7931b41f 379 InstallOp(0x05,&x86CPU::op16_add_ax_imm8);
earlz 0:217a7931b41f 380 InstallOp(0x28,&x86CPU::op16_sub_rm8_r8);
earlz 0:217a7931b41f 381 InstallOp(0x80,&x86CPU::op16_group_80);
earlz 0:217a7931b41f 382 InstallOp(0x29,&x86CPU::op16_sub_rm16_r16);
earlz 0:217a7931b41f 383 InstallOp(0x2A,&x86CPU::op16_sub_r8_rm8);
earlz 0:217a7931b41f 384 InstallOp(0x2B,&x86CPU::op16_sub_r16_rm16);
earlz 0:217a7931b41f 385 InstallOp(0x81,&x86CPU::op16_group_81);
earlz 0:217a7931b41f 386 InstallOp(0x00,&x86CPU::op16_add_rm8_r8);
earlz 0:217a7931b41f 387 InstallOp(0x01,&x86CPU::op16_add_rm16_r16);
earlz 0:217a7931b41f 388 InstallOp(0x02,&x86CPU::op16_add_r8_rm8);
earlz 0:217a7931b41f 389 InstallOp(0x03,&x86CPU::op16_add_r16_rm16);
earlz 0:217a7931b41f 390 InstallOp(0xA0,&x86CPU::op16_mov_al_off8);
earlz 0:217a7931b41f 391 InstallOp(0xA1,&x86CPU::op16_mov_ax_off16);
earlz 0:217a7931b41f 392 InstallOp(0x88,&x86CPU::op16_mov_rm8_r8);
earlz 0:217a7931b41f 393 InstallOp(0x8A,&x86CPU::op16_mov_r8_rm8);
earlz 0:217a7931b41f 394 InstallOp(0xA2,&x86CPU::op16_mov_off8_al);
earlz 0:217a7931b41f 395 InstallOp(0xA3,&x86CPU::op16_mov_off16_ax);
earlz 0:217a7931b41f 396 InstallOp(0xC6,&x86CPU::op16_mov_m8_imm8);
earlz 0:217a7931b41f 397 InstallOp(0xC7,&x86CPU::op16_mov_m16_imm16);
earlz 0:217a7931b41f 398 InstallOp(0x38,&x86CPU::op16_cmp_rm8_r8);
earlz 0:217a7931b41f 399 InstallOp(0x39,&x86CPU::op16_cmp_rm16_r16);
earlz 0:217a7931b41f 400 InstallOp(0x3A,&x86CPU::op16_cmp_r8_rm8);
earlz 0:217a7931b41f 401 InstallOp(0x3B,&x86CPU::op16_cmp_r16_rm16);
earlz 0:217a7931b41f 402 InstallOp(0x3C,&x86CPU::op16_cmp_al_imm8);
earlz 0:217a7931b41f 403 InstallOp(0x3D,&x86CPU::op16_cmp_ax_imm16); //3D TimD Tim Vision TV!!! Yay!!!
earlz 0:217a7931b41f 404 InstallOp(0x83,&x86CPU::op16_group_83); //83 is my lucky number btw...
earlz 0:217a7931b41f 405 InstallOp(0xFF,&x86CPU::op16_group_FF);
earlz 0:217a7931b41f 406 InstallOp(0xE9,&x86CPU::op16_jmp_rel16);
earlz 0:217a7931b41f 407 InstallOp(0xEA,&x86CPU::op16_jmp_imm16_imm16);
earlz 0:217a7931b41f 408 InstallOp(0x6A,&x86CPU::op16_push_imm8);
earlz 0:217a7931b41f 409 InstallOp(0x8F,&x86CPU::op16_group_8F);
earlz 0:217a7931b41f 410 InstallOp(0xD6,&x86CPU::op16_salc);
earlz 0:217a7931b41f 411 InstallOp(0xF5,&x86CPU::op16_cmc);
earlz 0:217a7931b41f 412 InstallOp(0x98,&x86CPU::op16_cbw);
earlz 0:217a7931b41f 413 InstallOp(0x37,&x86CPU::op16_aaa);
earlz 0:217a7931b41f 414 InstallOp(0x27,&x86CPU::op16_daa);
earlz 0:217a7931b41f 415 InstallOp(0x2F,&x86CPU::op16_das);
earlz 0:217a7931b41f 416 InstallOp(0x3F,&x86CPU::op16_aas);
earlz 0:217a7931b41f 417 InstallOp(0xD5,&x86CPU::op16_aad);
earlz 0:217a7931b41f 418 InstallOp(0xD4,&x86CPU::op16_aam);
earlz 0:217a7931b41f 419 InstallOp(0xFE,&x86CPU::op16_group_FE);
earlz 0:217a7931b41f 420 InstallOp(0xF6,&x86CPU::op16_group_F6);
earlz 0:217a7931b41f 421 InstallOp(0xF7,&x86CPU::op16_group_F7);
earlz 0:217a7931b41f 422 InstallOp(0x99,&x86CPU::op16_cwd);
earlz 0:217a7931b41f 423 InstallOp(0x20,&x86CPU::op16_and_rm8_r8);
earlz 0:217a7931b41f 424 InstallOp(0x21,&x86CPU::op16_and_rm16_r16);
earlz 0:217a7931b41f 425 InstallOp(0x22,&x86CPU::op16_and_r8_rm8);
earlz 0:217a7931b41f 426 InstallOp(0x23,&x86CPU::op16_and_r16_rm16);
earlz 0:217a7931b41f 427 InstallOp(0x24,&x86CPU::op16_and_al_imm8);
earlz 0:217a7931b41f 428 InstallOp(0x25,&x86CPU::op16_and_ax_imm16);
earlz 0:217a7931b41f 429 InstallOp(0x08,&x86CPU::op16_or_rm8_r8);
earlz 0:217a7931b41f 430 InstallOp(0x09,&x86CPU::op16_or_rm16_r16);
earlz 0:217a7931b41f 431 InstallOp(0x0A,&x86CPU::op16_or_r8_rm8);
earlz 0:217a7931b41f 432 InstallOp(0x0B,&x86CPU::op16_or_r16_rm16);
earlz 0:217a7931b41f 433 InstallOp(0x0C,&x86CPU::op16_or_al_imm8);
earlz 0:217a7931b41f 434 InstallOp(0x0D,&x86CPU::op16_or_ax_imm16);
earlz 0:217a7931b41f 435 InstallOp(0xA6,&x86CPU::op16_cmpsb);
earlz 0:217a7931b41f 436 InstallOp(0xA7,&x86CPU::op16_cmpsw);
earlz 0:217a7931b41f 437 InstallOp(0xE3,&x86CPU::op16_jcxz_rel8);
earlz 0:217a7931b41f 438 InstallOp(0x14,&x86CPU::op16_adc_al_imm8);
earlz 0:217a7931b41f 439 InstallOp(0x15,&x86CPU::op16_adc_ax_imm8);
earlz 0:217a7931b41f 440 InstallOp(0x10,&x86CPU::op16_adc_rm8_r8);
earlz 0:217a7931b41f 441 InstallOp(0x11,&x86CPU::op16_adc_rm16_r16);
earlz 0:217a7931b41f 442 InstallOp(0x12,&x86CPU::op16_adc_r8_rm8);
earlz 0:217a7931b41f 443 InstallOp(0x13,&x86CPU::op16_adc_r16_rm16);
earlz 0:217a7931b41f 444 InstallOp(0x9E,&x86CPU::op16_sahf);
earlz 0:217a7931b41f 445 InstallOp(0x9F,&x86CPU::op16_lahf);
earlz 0:217a7931b41f 446 InstallOp(0xE1,&x86CPU::op16_loope_rel8);
earlz 0:217a7931b41f 447 InstallOp(0xE0,&x86CPU::op16_loopne_rel8);
earlz 0:217a7931b41f 448 InstallOp(0xC5,&x86CPU::op16_lds);
earlz 0:217a7931b41f 449 InstallOp(0xC4,&x86CPU::op16_les);
earlz 0:217a7931b41f 450 InstallOp(0x8D,&x86CPU::op16_lea);
earlz 0:217a7931b41f 451 InstallOp(0xF0,&x86CPU::op16_lock);
earlz 0:217a7931b41f 452 InstallOp(0x30,&x86CPU::op16_xor_rm8_r8);
earlz 0:217a7931b41f 453 InstallOp(0x31,&x86CPU::op16_xor_rm16_r16);
earlz 0:217a7931b41f 454 InstallOp(0x32,&x86CPU::op16_xor_r8_rm8);
earlz 0:217a7931b41f 455 InstallOp(0x33,&x86CPU::op16_xor_r16_rm16);
earlz 0:217a7931b41f 456 InstallOp(0x34,&x86CPU::op16_xor_al_imm8);
earlz 0:217a7931b41f 457 InstallOp(0x35,&x86CPU::op16_xor_ax_imm16);
earlz 0:217a7931b41f 458 InstallOp(0x1C,&x86CPU::op16_sbb_al_imm8);
earlz 0:217a7931b41f 459 InstallOp(0x1D,&x86CPU::op16_sbb_ax_imm16);
earlz 0:217a7931b41f 460 InstallOp(0x19,&x86CPU::op16_sbb_rm16_r16);
earlz 0:217a7931b41f 461 InstallOp(0x1A,&x86CPU::op16_sbb_r8_rm8);
earlz 0:217a7931b41f 462 InstallOp(0x1B,&x86CPU::op16_sbb_r16_rm16);
earlz 0:217a7931b41f 463 InstallOp(0x18,&x86CPU::op16_sub_rm8_r8);
earlz 0:217a7931b41f 464 InstallOp(0x84,&x86CPU::op16_test_rm8_r8);
earlz 0:217a7931b41f 465 InstallOp(0x85,&x86CPU::op16_test_rm16_r16);
earlz 0:217a7931b41f 466 InstallOp(0xA8,&x86CPU::op16_test_al_imm8);
earlz 0:217a7931b41f 467 InstallOp(0xA9,&x86CPU::op16_test_ax_imm16);
earlz 0:217a7931b41f 468 InstallOp(0x86,&x86CPU::op16_xchg_rm8_r8);
earlz 0:217a7931b41f 469 InstallOp(0x87,&x86CPU::op16_xchg_rm16_r16);
earlz 0:217a7931b41f 470 InstallOp(0xD2,&x86CPU::op16_group_D2);
earlz 0:217a7931b41f 471 InstallOp(0xD3,&x86CPU::op16_group_D3);
earlz 0:217a7931b41f 472 InstallOp(0xD0,&x86CPU::op16_group_D0);
earlz 0:217a7931b41f 473 InstallOp(0xD1,&x86CPU::op16_group_D1);
earlz 0:217a7931b41f 474 InstallOp(0xAC,&x86CPU::op16_lodsb);
earlz 0:217a7931b41f 475 InstallOp(0xAD,&x86CPU::op16_lodsw);
earlz 0:217a7931b41f 476 InstallOp(0xAE,&x86CPU::op16_scasb);
earlz 0:217a7931b41f 477 InstallOp(0xAF,&x86CPU::op16_scasw);
earlz 0:217a7931b41f 478 InstallOp(0x9B,&x86CPU::op16_wait);
earlz 0:217a7931b41f 479 InstallOp(0xD7,&x86CPU::op16_xlatb);
earlz 0:217a7931b41f 480 InstallOp(0xEC,&x86CPU::op16_in_al_dx);
earlz 0:217a7931b41f 481 InstallOp(0xED,&x86CPU::op16_in_ax_dx);
earlz 0:217a7931b41f 482 InstallOp(0xEE,&x86CPU::op16_out_dx_al);
earlz 0:217a7931b41f 483 InstallOp(0xEF,&x86CPU::op16_out_dx_ax);
earlz 0:217a7931b41f 484 InstallOp(0xAA,&x86CPU::op16_stosb);
earlz 0:217a7931b41f 485 InstallOp(0xAB,&x86CPU::op16_stosw);
earlz 0:217a7931b41f 486
earlz 0:217a7931b41f 487
earlz 0:217a7931b41f 488
earlz 0:217a7931b41f 489 }
earlz 0:217a7931b41f 490
earlz 0:217a7931b41f 491
earlz 0:217a7931b41f 492
earlz 0:217a7931b41f 493 //void unknown();
earlz 0:217a7931b41f 494
earlz 0:217a7931b41f 495 bool x86CPU::IsLocked(){
earlz 0:217a7931b41f 496 return Memory->IsLocked();
earlz 0:217a7931b41f 497 }
earlz 0:217a7931b41f 498
earlz 0:217a7931b41f 499 void x86CPU::Lock(){
earlz 0:217a7931b41f 500 //nothing...
earlz 0:217a7931b41f 501 Memory->Lock();
earlz 0:217a7931b41f 502 busmaster=1;
earlz 0:217a7931b41f 503 }
earlz 0:217a7931b41f 504
earlz 0:217a7931b41f 505 void x86CPU::Unlock(){
earlz 0:217a7931b41f 506 //still nothing...
earlz 0:217a7931b41f 507 Memory->Unlock();
earlz 0:217a7931b41f 508 busmaster=0;
earlz 0:217a7931b41f 509 }
earlz 0:217a7931b41f 510
earlz 0:217a7931b41f 511
earlz 0:217a7931b41f 512
earlz 0:217a7931b41f 513
earlz 0:217a7931b41f 514
earlz 0:217a7931b41f 515
earlz 0:217a7931b41f 516
earlz 0:217a7931b41f 517
earlz 0:217a7931b41f 518
earlz 0:217a7931b41f 519
earlz 0:217a7931b41f 520
earlz 0:217a7931b41f 521
earlz 0:217a7931b41f 522
earlz 0:217a7931b41f 523
earlz 0:217a7931b41f 524
earlz 0:217a7931b41f 525
earlz 0:217a7931b41f 526
earlz 0:217a7931b41f 527
earlz 0:217a7931b41f 528
earlz 0:217a7931b41f 529
earlz 0:217a7931b41f 530
earlz 0:217a7931b41f 531
earlz 0:217a7931b41f 532
earlz 0:217a7931b41f 533
earlz 0:217a7931b41f 534
earlz 0:217a7931b41f 535
earlz 0:217a7931b41f 536 };
earlz 0:217a7931b41f 537
earlz 0:217a7931b41f 538
earlz 0:217a7931b41f 539
earlz 0:217a7931b41f 540
earlz 0:217a7931b41f 541
earlz 0:217a7931b41f 542