summaryrefslogtreecommitdiffstats
path: root/board/MAI/bios_emulator/scitech/src/v86bios/mem.c
diff options
context:
space:
mode:
Diffstat (limited to 'board/MAI/bios_emulator/scitech/src/v86bios/mem.c')
-rw-r--r--board/MAI/bios_emulator/scitech/src/v86bios/mem.c126
1 files changed, 126 insertions, 0 deletions
diff --git a/board/MAI/bios_emulator/scitech/src/v86bios/mem.c b/board/MAI/bios_emulator/scitech/src/v86bios/mem.c
new file mode 100644
index 0000000000..50dc55fdf5
--- /dev/null
+++ b/board/MAI/bios_emulator/scitech/src/v86bios/mem.c
@@ -0,0 +1,126 @@
+/*
+ * Copyright 1999 Egbert Eich
+ *
+ * Permission to use, copy, modify, distribute, and sell this software and its
+ * documentation for any purpose is hereby granted without fee, provided that
+ * the above copyright notice appear in all copies and that both that
+ * copyright notice and this permission notice appear in supporting
+ * documentation, and that the name of the authors not be used in
+ * advertising or publicity pertaining to distribution of the software without
+ * specific, written prior permission. The authors makes no representations
+ * about the suitability of this software for any purpose. It is provided
+ * "as is" without express or implied warranty.
+ *
+ * THE AUTHORS DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE,
+ * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO
+ * EVENT SHALL THE AUTHORS BE LIABLE FOR ANY SPECIAL, INDIRECT OR
+ * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE,
+ * DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
+ * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
+ * PERFORMANCE OF THIS SOFTWARE.
+ */
+#include "debug.h"
+#include "v86bios.h"
+#include "x86emu.h"
+
+#ifdef __alpha__
+
+void* vram_map = 0;
+int sparse_shift = 5;
+
+#define mem_barrier() __asm__ __volatile__("mb" : : : "memory")
+
+#define vuip volatile unsigned int *
+
+CARD8
+mem_rb(CARD32 addr)
+{
+ unsigned long result, shift;
+#if 1
+ if (addr >= 0xA0000 && addr <= 0xBFFFF) {
+ addr -= 0xA0000;
+ shift = (addr & 0x3) * 8;
+ result = *(vuip) ((unsigned long)vram_map + (addr << sparse_shift));
+ result >>= shift;
+ return 0xffUL & result;
+ } else
+#endif
+ return rdb(addr);
+}
+
+CARD16
+mem_rw(CARD32 addr)
+{
+ unsigned long result, shift;
+#if 1
+ if (addr >= 0xA0000 && addr <= 0xBFFFF) {
+ addr -= 0xA0000;
+ shift = (addr & 0x2) * 8;
+ result = *(vuip)((unsigned long)vram_map+(addr<<sparse_shift)
+ +(1<<(sparse_shift-2)));
+ result >>= shift;
+ return 0xffffUL & result;
+ } else
+#endif
+ return rdw(addr);
+}
+
+CARD32
+mem_rl(CARD32 addr)
+{
+ unsigned long result;
+#if 1
+ if (addr >= 0xA0000 && addr <= 0xBFFFF) {
+ addr -= 0xA0000;
+ result = *(vuip)((unsigned long)vram_map+(addr<<sparse_shift)+(3<<(sparse_shift-2)));
+ return result;
+ } else
+#endif
+ return rdl(addr);
+}
+
+void
+mem_wb(CARD32 addr, CARD8 val)
+{
+ unsigned int b = val & 0xffU;
+#if 1
+ if (addr >= 0xA0000 && addr <= 0xBFFFF) {
+ addr -= 0xA0000;
+ *(vuip) ((unsigned long)vram_map + (addr << sparse_shift)) = b * 0x01010101;
+ mem_barrier();
+ } else
+#endif
+ wrb(addr,val);
+}
+
+void
+mem_ww(CARD32 addr, CARD16 val)
+{
+ unsigned int w = val & 0xffffU;
+#if 1
+ if (addr >= 0xA0000 && addr <= 0xBFFFF) {
+ addr -= 0xA0000;
+ *(vuip)((unsigned long)vram_map+(addr<<sparse_shift)
+ +(1<<(sparse_shift-2))) = w * 0x00010001;
+ mem_barrier();
+ } else
+#endif
+ wrw(addr,val);
+}
+
+void
+mem_wl(CARD32 addr, CARD32 val)
+{
+#if 1
+ if (addr >= 0xA0000 && addr <= 0xBFFFF) {
+ addr -= 0xA0000;
+ *(vuip)((unsigned long)vram_map+(addr<<sparse_shift)
+ +(3<<(sparse_shift-2))) = val;
+ mem_barrier();
+ } else
+#endif
+ wrl(addr,val);
+}
+#endif
+
+
OpenPOWER on IntegriCloud