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.