/* JPC: An x86 PC Hardware Emulator for a pure Java Virtual Machine Copyright (C) 2012-2013 Ian Preston This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License version 2 as published by the Free Software Foundation. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. Details (including contact information) can be found at: jpc.sourceforge.net or the developer website sourceforge.net/projects/jpc/ End of licence header */ package org.jpc.emulator.execution.decoder; import org.jpc.emulator.processor.Processor; public class Sib { public static Pointer Ptr32_04(PeekableInputStream input, int prefices) { int sib = input.readU8(); int seg = Prefices.getSegment(prefices, Processor.DS_INDEX); int base = -1; int index = -1; int offset = 0; switch (sib&7) { case 0: /* EAX Base */ base = Processor.EAX_INDEX;break; case 1: /* ECX Base */ base = Processor.ECX_INDEX;break; case 2: /* EDX Base */ base = Processor.EDX_INDEX;break; case 3: /* EBX Base */ base = Processor.EBX_INDEX;break; case 4: /* ESP Base */ seg = Prefices.getSegment(prefices, Processor.SS_INDEX); base = Processor.ESP_INDEX;break; case 5: /* #1 Base */ offset = input.read32(); break; case 6: /* ESI Base */ base = Processor.ESI_INDEX;break; case 7: /* EDI Base */ base = Processor.EDI_INDEX;break; } int indexReg =(sib >> 3) & 7; switch (indexReg) { case 0: index = Processor.EAX_INDEX; break; case 1: index = Processor.ECX_INDEX; break; case 2: index = Processor.EDX_INDEX; break; case 3: index = Processor.EBX_INDEX; break; case 4: break; case 5: index = Processor.EBP_INDEX; break; case 6: index = Processor.ESI_INDEX; break; case 7: index = Processor.EDI_INDEX; break; } sib = sib >> 6; int scale = 1 << sib; if (index == -1) scale = 0; return new Pointer(base, index, scale, offset, seg, true); } public static Pointer Ptr32_44(PeekableInputStream input, int prefices) { int sib = input.readU8(); int seg = Prefices.getSegment(prefices, Processor.DS_INDEX); int base = -1; int index = -1; int offset = input.read8(); switch (sib&7) { case 0: /* EAX Base */ base = Processor.EAX_INDEX;break; case 1: /* ECX Base */ base = Processor.ECX_INDEX;break; case 2: /* EDX Base */ base = Processor.EDX_INDEX;break; case 3: /* EBX Base */ base = Processor.EBX_INDEX;break; case 4: /* ESP Base */ seg = Prefices.getSegment(prefices, Processor.SS_INDEX); base = Processor.ESP_INDEX;break; case 5: /* #1 Base */ seg = Prefices.getSegment(prefices, Processor.SS_INDEX); base = Processor.EBP_INDEX;break; case 6: /* ESI Base */ base = Processor.ESI_INDEX;break; case 7: /* EDI Base */ base = Processor.EDI_INDEX;break; } int indexReg =(sib >> 3) & 7; switch (indexReg) { case 0: index = Processor.EAX_INDEX; break; case 1: index = Processor.ECX_INDEX; break; case 2: index = Processor.EDX_INDEX; break; case 3: index = Processor.EBX_INDEX; break; case 4: break; case 5: index = Processor.EBP_INDEX; break; case 6: index = Processor.ESI_INDEX; break; case 7: index = Processor.EDI_INDEX; break; } sib = sib >> 6; int scale = 1 << sib; if (index == -1) scale = 0; return new Pointer(base, index, scale, offset, seg, true); } public static Pointer Ptr32_84(PeekableInputStream input, int prefices) { int sib = input.readU8(); int seg = Prefices.getSegment(prefices, Processor.DS_INDEX); int base = -1; int index = -1; int offset = input.read32(); switch (sib&7) { case 0: /* EAX Base */ base = Processor.EAX_INDEX;break; case 1: /* ECX Base */ base = Processor.ECX_INDEX;break; case 2: /* EDX Base */ base = Processor.EDX_INDEX;break; case 3: /* EBX Base */ base = Processor.EBX_INDEX;break; case 4: /* ESP Base */ seg = Prefices.getSegment(prefices, Processor.SS_INDEX); base = Processor.ESP_INDEX;break; case 5: /* #1 Base */ seg = Prefices.getSegment(prefices, Processor.SS_INDEX); base = Processor.EBP_INDEX;break; case 6: /* ESI Base */ base = Processor.ESI_INDEX;break; case 7: /* EDI Base */ base = Processor.EDI_INDEX;break; } int indexReg =(sib >> 3) & 7; switch (indexReg) { case 0: index = Processor.EAX_INDEX; break; case 1: index = Processor.ECX_INDEX; break; case 2: index = Processor.EDX_INDEX; break; case 3: index = Processor.EBX_INDEX; break; case 4: break; case 5: index = Processor.EBP_INDEX; break; case 6: index = Processor.ESI_INDEX; break; case 7: index = Processor.EDI_INDEX; break; } sib = sib >> 6; int scale = 1 << sib; if (index == -1) scale = 0; return new Pointer(base, index, scale, offset, seg, true); } }