1 /* $NetBSD: x86emu_util.c,v 1.2 2007/12/04 17:32:22 joerg Exp $ */ 2 3 /**************************************************************************** 4 * 5 * Realmode X86 Emulator Library 6 * 7 * Copyright (C) 1996-1999 SciTech Software, Inc. 8 * Copyright (C) David Mosberger-Tang 9 * Copyright (C) 1999 Egbert Eich 10 * Copyright (C) 2007 Joerg Sonnenberger 11 * 12 * ======================================================================== 13 * 14 * Permission to use, copy, modify, distribute, and sell this software and 15 * its documentation for any purpose is hereby granted without fee, 16 * provided that the above copyright notice appear in all copies and that 17 * both that copyright notice and this permission notice appear in 18 * supporting documentation, and that the name of the authors not be used 19 * in advertising or publicity pertaining to distribution of the software 20 * without specific, written prior permission. The authors makes no 21 * representations about the suitability of this software for any purpose. 22 * It is provided "as is" without express or implied warranty. 23 * 24 * THE AUTHORS DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, 25 * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO 26 * EVENT SHALL THE AUTHORS BE LIABLE FOR ANY SPECIAL, INDIRECT OR 27 * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF 28 * USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR 29 * OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR 30 * PERFORMANCE OF THIS SOFTWARE. 31 * 32 ****************************************************************************/ 33 34 #include <x86emu/x86emu.h> 35 #include <x86emu/x86emu_regs.h> 36 37 #include <sys/endian.h> 38 #include <sys/null.h> 39 40 /**************************************************************************** 41 PARAMETERS: 42 addr - Emulator memory address to read 43 44 RETURNS: 45 Byte value read from emulator memory. 46 47 REMARKS: 48 Reads a byte value from the emulator memory. 49 ****************************************************************************/ 50 static uint8_t 51 rdb(struct X86EMU *emu, uint32_t addr) 52 { 53 if (addr > emu->mem_size - 1) 54 X86EMU_halt_sys(emu); 55 return emu->mem_base[addr]; 56 } 57 /**************************************************************************** 58 PARAMETERS: 59 addr - Emulator memory address to read 60 61 RETURNS: 62 Word value read from emulator memory. 63 64 REMARKS: 65 Reads a word value from the emulator memory. 66 ****************************************************************************/ 67 static uint16_t 68 rdw(struct X86EMU *emu, uint32_t addr) 69 { 70 if (addr > emu->mem_size - 2) 71 X86EMU_halt_sys(emu); 72 return le16dec(emu->mem_base + addr); 73 } 74 /**************************************************************************** 75 PARAMETERS: 76 addr - Emulator memory address to read 77 78 RETURNS: 79 Long value read from emulator memory. 80 REMARKS: 81 Reads a long value from the emulator memory. 82 ****************************************************************************/ 83 static uint32_t 84 rdl(struct X86EMU *emu, uint32_t addr) 85 { 86 if (addr > emu->mem_size - 4) 87 X86EMU_halt_sys(emu); 88 return le32dec(emu->mem_base + addr); 89 } 90 /**************************************************************************** 91 PARAMETERS: 92 addr - Emulator memory address to read 93 val - Value to store 94 95 REMARKS: 96 Writes a byte value to emulator memory. 97 ****************************************************************************/ 98 static void 99 wrb(struct X86EMU *emu, uint32_t addr, uint8_t val) 100 { 101 if (addr > emu->mem_size - 1) 102 X86EMU_halt_sys(emu); 103 emu->mem_base[addr] = val; 104 } 105 /**************************************************************************** 106 PARAMETERS: 107 addr - Emulator memory address to read 108 val - Value to store 109 110 REMARKS: 111 Writes a word value to emulator memory. 112 ****************************************************************************/ 113 static void 114 wrw(struct X86EMU *emu, uint32_t addr, uint16_t val) 115 { 116 if (addr > emu->mem_size - 2) 117 X86EMU_halt_sys(emu); 118 le16enc(emu->mem_base + addr, val); 119 } 120 /**************************************************************************** 121 PARAMETERS: 122 addr - Emulator memory address to read 123 val - Value to store 124 125 REMARKS: 126 Writes a long value to emulator memory. 127 ****************************************************************************/ 128 static void 129 wrl(struct X86EMU *emu, uint32_t addr, uint32_t val) 130 { 131 if (addr > emu->mem_size - 4) 132 X86EMU_halt_sys(emu); 133 le32enc(emu->mem_base + addr, val); 134 } 135 136 /*----------------------------- Setup -------------------------------------*/ 137 138 void 139 X86EMU_init_default(struct X86EMU *emu) 140 { 141 int i; 142 143 emu->emu_rdb = rdb; 144 emu->emu_rdw = rdw; 145 emu->emu_rdl = rdl; 146 emu->emu_wrb = wrb; 147 emu->emu_wrw = wrw; 148 emu->emu_wrl = wrl; 149 150 for (i = 0; i < 256; i++) 151 emu->_X86EMU_intrTab[i] = NULL; 152 } 153