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 //jmp rel8 jcc stuff
earlz 0:217a7931b41f 36 void x86CPU::op16_ja_rel8(){ //is also jnbe
earlz 0:217a7931b41f 37 eip++;
earlz 0:217a7931b41f 38 if(freg.cf==0 && freg.zf==0){
earlz 0:217a7931b41f 39 Jmp16_near8(op_cache[1]);
earlz 0:217a7931b41f 40 }
earlz 0:217a7931b41f 41 }
earlz 0:217a7931b41f 42
earlz 0:217a7931b41f 43 void x86CPU::op16_jnc_rel8(){ //is also jae and jnb
earlz 0:217a7931b41f 44 eip++;
earlz 0:217a7931b41f 45 if(freg.cf==0){
earlz 0:217a7931b41f 46 Jmp16_near8(op_cache[1]);
earlz 0:217a7931b41f 47 }
earlz 0:217a7931b41f 48 }
earlz 0:217a7931b41f 49
earlz 0:217a7931b41f 50
earlz 0:217a7931b41f 51 void x86CPU::op16_jbe_rel8(){ //is also jna
earlz 0:217a7931b41f 52 eip++;
earlz 0:217a7931b41f 53 if(freg.cf==1 || freg.zf==1){
earlz 0:217a7931b41f 54 Jmp16_near8(op_cache[1]);
earlz 0:217a7931b41f 55 }else{
earlz 0:217a7931b41f 56 eip++;
earlz 0:217a7931b41f 57 }
earlz 0:217a7931b41f 58 }
earlz 0:217a7931b41f 59
earlz 0:217a7931b41f 60 void x86CPU::op16_jc_rel8(){ //is also jb and jnae
earlz 0:217a7931b41f 61 eip++;
earlz 0:217a7931b41f 62 if(freg.cf==1){
earlz 0:217a7931b41f 63 Jmp16_near8(op_cache[1]);
earlz 0:217a7931b41f 64 }
earlz 0:217a7931b41f 65 }
earlz 0:217a7931b41f 66
earlz 0:217a7931b41f 67 void x86CPU::op16_jz_rel8(){ //is also je
earlz 0:217a7931b41f 68 eip++;
earlz 0:217a7931b41f 69 if(freg.zf==1){
earlz 0:217a7931b41f 70 Jmp16_near8(op_cache[1]);
earlz 0:217a7931b41f 71 }
earlz 0:217a7931b41f 72 }
earlz 0:217a7931b41f 73
earlz 0:217a7931b41f 74 void x86CPU::op16_jnz_rel8(){ //is also jne
earlz 0:217a7931b41f 75 eip++;
earlz 0:217a7931b41f 76 if(freg.zf==0){
earlz 0:217a7931b41f 77 Jmp16_near8(op_cache[1]);
earlz 0:217a7931b41f 78 }
earlz 0:217a7931b41f 79 }
earlz 0:217a7931b41f 80
earlz 0:217a7931b41f 81
earlz 0:217a7931b41f 82 void x86CPU::op16_jp_rel8(){ //also jpe
earlz 0:217a7931b41f 83 eip++;
earlz 0:217a7931b41f 84 if(freg.pf==1){
earlz 0:217a7931b41f 85 Jmp16_near8(op_cache[1]);
earlz 0:217a7931b41f 86 }
earlz 0:217a7931b41f 87 }
earlz 0:217a7931b41f 88
earlz 0:217a7931b41f 89 void x86CPU::op16_jnp_rel8(){ //is also jpo
earlz 0:217a7931b41f 90 eip++;
earlz 0:217a7931b41f 91 if(freg.pf==0){
earlz 0:217a7931b41f 92 Jmp16_near8(op_cache[1]);
earlz 0:217a7931b41f 93 }
earlz 0:217a7931b41f 94 }
earlz 0:217a7931b41f 95
earlz 0:217a7931b41f 96 void x86CPU::op16_jg_rel8(){ //is also jnle
earlz 0:217a7931b41f 97 eip++;
earlz 0:217a7931b41f 98 if(freg.sf==freg.of && freg.zf==0){
earlz 0:217a7931b41f 99 Jmp16_near8(op_cache[1]);
earlz 0:217a7931b41f 100 }
earlz 0:217a7931b41f 101 }
earlz 0:217a7931b41f 102
earlz 0:217a7931b41f 103
earlz 0:217a7931b41f 104 void x86CPU::op16_jge_rel8(){ //is also jnl
earlz 0:217a7931b41f 105 eip++;
earlz 0:217a7931b41f 106 if(freg.sf==freg.of){
earlz 0:217a7931b41f 107 Jmp16_near8(op_cache[1]);
earlz 0:217a7931b41f 108 }
earlz 0:217a7931b41f 109 }
earlz 0:217a7931b41f 110
earlz 0:217a7931b41f 111 void x86CPU::op16_jle_rel8(){ //is also jng
earlz 0:217a7931b41f 112 eip++;
earlz 0:217a7931b41f 113 if(freg.sf!=freg.of || freg.zf==1){
earlz 0:217a7931b41f 114 Jmp16_near8(op_cache[1]);
earlz 0:217a7931b41f 115 }
earlz 0:217a7931b41f 116 }
earlz 0:217a7931b41f 117
earlz 0:217a7931b41f 118 void x86CPU::op16_jl_rel8(){ //is also jnge
earlz 0:217a7931b41f 119 eip++;
earlz 0:217a7931b41f 120 if(freg.sf!=freg.of){
earlz 0:217a7931b41f 121 Jmp16_near8(op_cache[1]);
earlz 0:217a7931b41f 122 }
earlz 0:217a7931b41f 123 }
earlz 0:217a7931b41f 124
earlz 0:217a7931b41f 125
earlz 0:217a7931b41f 126 void x86CPU::op16_jo_rel8(){
earlz 0:217a7931b41f 127 eip++;
earlz 0:217a7931b41f 128 if(freg.of==1){
earlz 0:217a7931b41f 129 Jmp16_near8(op_cache[1]);
earlz 0:217a7931b41f 130 }
earlz 0:217a7931b41f 131 }
earlz 0:217a7931b41f 132
earlz 0:217a7931b41f 133 void x86CPU::op16_jno_rel8(){
earlz 0:217a7931b41f 134 eip++;
earlz 0:217a7931b41f 135 if(freg.of==0){
earlz 0:217a7931b41f 136 Jmp16_near8(op_cache[1]);
earlz 0:217a7931b41f 137 }
earlz 0:217a7931b41f 138 }
earlz 0:217a7931b41f 139
earlz 0:217a7931b41f 140 void x86CPU::op16_js_rel8(){ //is negative
earlz 0:217a7931b41f 141 eip++;
earlz 0:217a7931b41f 142 if(freg.sf==1){
earlz 0:217a7931b41f 143 Jmp16_near8(op_cache[1]);
earlz 0:217a7931b41f 144 }
earlz 0:217a7931b41f 145 }
earlz 0:217a7931b41f 146
earlz 0:217a7931b41f 147 void x86CPU::op16_jns_rel8(){ //is positive
earlz 0:217a7931b41f 148 eip++;
earlz 0:217a7931b41f 149 if(freg.sf==0){
earlz 0:217a7931b41f 150 Jmp16_near8(op_cache[1]);
earlz 0:217a7931b41f 151 }
earlz 0:217a7931b41f 152 }
earlz 0:217a7931b41f 153
earlz 0:217a7931b41f 154
earlz 0:217a7931b41f 155
earlz 0:217a7931b41f 156 void x86CPU::op16_clc(){
earlz 0:217a7931b41f 157 freg.cf=0;
earlz 0:217a7931b41f 158 }
earlz 0:217a7931b41f 159
earlz 0:217a7931b41f 160 void x86CPU::op16_cld(){
earlz 0:217a7931b41f 161 freg.df=0;
earlz 0:217a7931b41f 162 }
earlz 0:217a7931b41f 163
earlz 0:217a7931b41f 164 void x86CPU::op16_cli(){
earlz 0:217a7931b41f 165 freg._if=0;
earlz 0:217a7931b41f 166 }
earlz 0:217a7931b41f 167
earlz 0:217a7931b41f 168 void x86CPU::op16_stc(){
earlz 0:217a7931b41f 169 freg.cf=1;
earlz 0:217a7931b41f 170 }
earlz 0:217a7931b41f 171
earlz 0:217a7931b41f 172 void x86CPU::op16_std(){
earlz 0:217a7931b41f 173 freg.df=1;
earlz 0:217a7931b41f 174 }
earlz 0:217a7931b41f 175
earlz 0:217a7931b41f 176 void x86CPU::op16_sti(){
earlz 0:217a7931b41f 177 freg._if=1;
earlz 0:217a7931b41f 178 }
earlz 0:217a7931b41f 179
earlz 0:217a7931b41f 180
earlz 0:217a7931b41f 181 void x86CPU::op16_cmc(){
earlz 0:217a7931b41f 182 freg.cf=freg.cf^1;
earlz 0:217a7931b41f 183 }
earlz 0:217a7931b41f 184
earlz 0:217a7931b41f 185 void x86CPU::op16_lahf(){
earlz 0:217a7931b41f 186 *regs8[AL]=*(uint8_t*)&freg;
earlz 0:217a7931b41f 187 }
earlz 0:217a7931b41f 188 void x86CPU::op16_sahf(){
earlz 0:217a7931b41f 189 *(uint8_t*)&freg=*regs8[AL];
earlz 0:217a7931b41f 190 }
earlz 0:217a7931b41f 191
earlz 0:217a7931b41f 192
earlz 0:217a7931b41f 193
earlz 0:217a7931b41f 194
earlz 0:217a7931b41f 195
earlz 0:217a7931b41f 196
earlz 0:217a7931b41f 197
earlz 0:217a7931b41f 198
earlz 0:217a7931b41f 199
earlz 0:217a7931b41f 200
earlz 0:217a7931b41f 201
earlz 0:217a7931b41f 202 };
earlz 0:217a7931b41f 203
earlz 0:217a7931b41f 204
earlz 0:217a7931b41f 205