This is mem.c in view mode; [Download] [Up]
/* * a2, an Apple II emulator in C * (c) Copyright 1990 by Rich Skrenta * * Command line interface written by Tom Markson * * Distribution agreement: * * You may freely copy or redistribute this software, so long * as there is no profit made from its use, sale, trade or * reproduction. You may not change this copyright notice, * and it must be included prominently in any copy made. * * Send emulator related mail to: skrenta@blekko.commodore.com * skrenta@blekko.uucp */ #include <stdio.h> #include "a2.h" unsigned char mem[65536]; /* 64K memory image */ unsigned char jmp_tbl[65536]; /* jmp & jsr interceptor functions */ int (*mem_set[256])(); /* memory store interceptors */ unsigned char rom[0x3000]; unsigned char ram[0x2000]; unsigned char bank1[0x1000]; unsigned char bank2[0x1000]; int ram_read = 0; int ram_write = 0; int bank2_enable = 0; #ifdef NeXT #define ram_copy(f,t,l) memcpy(t,f,l) #else ram_copy(from, to, len) unsigned char *from; unsigned char *to; int len; { while (len--) *to++ = *from++; } #endif memory_setup() { long i; int set_writep(); for (i = 0; i < 256; i++) mem_set[i] = NULL; for (i = 0; i < 65536; i++) jmp_tbl[i] = 0; writep(set_writep); ram_copy(&mem[0xD000], rom, 0x3000); } /* * Write protect/unprotect D000-FFFF */ writep(fn) int (*fn)(); { int i; for (i = 0xD0; i <= 0xFF; i++) mem_set[i] = fn; } set_writep(a, n) unsigned short a; unsigned char n; { /* Just eat it. */ } set_ramwrite(a, n) unsigned short a; unsigned char n; { if (a >= 0xE000) ram[a - 0xE000] = n; else if (bank2_enable) bank2[a - 0xD000] = n; else bank1[a - 0xD000] = n; } ram_card(addr) unsigned short addr; { if (ram_read) { ram_copy(&mem[0xE000], ram, 0x2000); if (bank2_enable) ram_copy(&mem[0xD000], bank2, 0x1000); else ram_copy(&mem[0xD000], bank1, 0x1000); } switch (addr & 0x000F) { case 0x00: /* C080 */ ram_read = 1; ram_write = 0; bank2_enable = 1; ram_copy(ram, &mem[0xE000], 0x2000); ram_copy(bank2, &mem[0xD000], 0x1000); writep(set_writep); break; case 0x01: /* C081 */ ram_read = 0; ram_write = 1; bank2_enable = 1; ram_copy(rom, &mem[0xD000], 0x3000); writep(set_ramwrite); break; case 0x02: /* C082 */ ram_read = 0; ram_write = 0; bank2_enable = 1; ram_copy(rom, &mem[0xD000], 0x3000); writep(set_writep); break; case 0x03: /* C083 */ ram_read = 1; ram_write = 1; bank2_enable = 1; ram_copy(ram, &mem[0xE000], 0x2000); ram_copy(bank2, &mem[0xD000], 0x1000); writep(NULL); break; case 0x08: /* C088 */ ram_read = 1; ram_write = 0; bank2_enable = 0; ram_copy(ram, &mem[0xE000], 0x2000); ram_copy(bank1, &mem[0xD000], 0x1000); writep(set_writep); break; case 0x09: /* C089 */ ram_read = 0; ram_write = 1; bank2_enable = 0; ram_copy(rom, &mem[0xD000], 0x3000); writep(set_ramwrite); break; case 0x0a: /* C08A */ ram_read = 0; ram_write = 0; bank2_enable = 0; ram_copy(rom, &mem[0xD000], 0x3000); writep(set_writep); break; case 0x0b: /* C08B */ ram_read = 1; ram_write = 1; bank2_enable = 0; ram_copy(ram, &mem[0xE000], 0x2000); ram_copy(bank1, &mem[0xD000], 0x1000); writep(NULL); break; } }
These are the contents of the former NiCE NeXT User Group NeXTSTEP/OpenStep software archive, currently hosted by Netfuture.ch.