/* 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 Prefices { public static int encodePrefix(int prefices, int b) { if (b == 0x66) // Op size return prefices ^ 1; if (b == 0x67) // addr size return prefices ^ (1 << 1); if (b == 0x26) // ES return (Processor.ES_INDEX << 2) | (prefices & ~0x1C); if (b == 0x2E) // CS return (Processor.CS_INDEX << 2) | (prefices & ~0x1C); if (b == 0x36) // SS return (Processor.SS_INDEX << 2) | (prefices & ~0x1C); if (b == 0x3E) // DS return (Processor.DS_INDEX << 2) | (prefices & ~0x1C); if (b == 0x64) // FS return (Processor.FS_INDEX << 2) | (prefices & ~0x1C); if (b == 0x65) // GS return (Processor.GS_INDEX << 2) | (prefices & ~0x1C); if (b == 0xF0) // Lock return (1 << 5) | prefices; if (b == 0xF2) // REPNE return (1 << 6) | prefices; if (b == 0xF3) // REP return (1 << 7) | prefices; return 0; } public static boolean isAddr16(int prefices) { return (prefices & 2) == 0; } public static int getSegment(int prefices, int def) { int seg = ((prefices >> 2) & 7); if (seg == 7) // no override return def; return seg; } public static boolean isLock(int prefices) { return (prefices & (1 << 5)) != 0; } public static boolean isRep(int prefices) { return (prefices & (1 << 7)) != 0; } public static boolean isRepne(int prefices) { return (prefices & (1 << 6)) != 0; } public static boolean isPrefix(int b) { if (b == 0x66) // Op size return true; if (b == 0x67) // addr size return true; if (b == 0x26) // ES return true; if (b == 0x2E) // CS return true; if (b == 0x36) // SS return true; if (b == 0x3E) // DS return true; if (b == 0x64) // FS return true; if (b == 0x65) // GS return true; if (b == 0xF0) // Lock return true; if (b == 0xF2) // REPNE return true; if (b == 0xF3) // REP return true; return false; } }