This is a2.h 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 */ #define TRUE 1 #define FALSE 0 extern FILE *sfp; /* * Assertion verifier */ #define assert(p) if(! (p)) asfail(__FILE__, __LINE__, "p"); else #define join(low, high) ((low) | ((high) << 8)) #define low(x) ((x) & 0xFF) #define high(x) ((x) >> 8) #define tobinary(v) ((v >> 4) * 10 + (v & 0xF)) #define tobcd(v) ((v % 10) | ((v / 10) << 4)) #define push(s) mem[0x100 | Sp--] = s; #define pop() mem[0x100 | ++Sp] #define SIGN(x) N = ((x) & 0x80) #define ZERO(x) NZ = (x) #define CARRY(x) C = ((x) > 0xFF) #define dCARRY(x) C = ((x) > 99) #define REF(a) ((a & 0xF000) == 0xC000 ? mem_map(a) : mem[a]) #define REFptr ((ptr & 0xF000) == 0xC000 ? mem_map(ptr) : mem[ptr]) #define REFzero mem[ptr] #define REFimm mem[Pc++] #define SET(a,v) if (mem_set[a >> 8]) (*mem_set[a >> 8])(a,v); else mem[a] = v; #define SETptr(v) if (mem_set[ptr >> 8]) (*mem_set[ptr >> 8])(ptr,v); else mem[ptr] = v; #define SETzero(v) mem[ptr] = v; #define PCINC Pc++; #define ABSOL ptr = mem[Pc++]; ptr |= mem[Pc++] << 8; #define ABSX ptr = mem[Pc++]; ptr |= mem[Pc++] << 8; ptr += X; #define ABSY ptr = mem[Pc++]; ptr |= mem[Pc++] << 8; ptr += Y; #define ZEROP ptr = mem[Pc++]; #define ZEROX ptr = (mem[Pc++] + X) & 0xFF; #define ZEROY ptr = (mem[Pc++] + Y) & 0xFF; #define INDX stmp = mem[Pc++] + X; ptr = mem[stmp++]; ptr |= mem[stmp] << 8; #define INDY stmp = mem[Pc++]; ptr = mem[stmp++]; ptr |= mem[stmp] << 8; ptr += Y; #define rZEROP mem[ mem[Pc++] ] #define rZEROX mem[ (mem[Pc++] + X) & 0xFF ] #define rZEROY mem[ (mem[Pc++] + Y) & 0xFF ] #define sZEROP(v) mem[ mem[Pc++] ] = v; #define sZEROX(v) mem[ (mem[Pc++] + X) & 0xFF ] = v; #define sZEROY(v) mem[ (mem[Pc++] + Y) & 0xFF ] = v; #define ZIND ptr = mem[ mem[Pc++] ]; #define ABINDX stmp = mem[Pc++]; stmp |= mem[Pc++] << 8; ptr = mem[stmp++]; ptr |= mem[stmp] << 8; ptr += X; /* * Since we store flags as 0/nonzero instead of 0/1, we need to turn * nonzero back into 1. Thus, "!!" is not a no-op. */ #define get_status() ((!!N << 7)|(!!V << 6)|(!!B << 4)|(!!D << 3)|(!!I << 2)|(!NZ << 1)|(!!C)) extern unsigned char mem[]; /* 64K memory image */ extern unsigned char jmp_tbl[]; /* jmp & jsr interceptor functions */ extern int (*mem_set[])(); /* memory store interceptors */ extern unsigned char mem_map(); extern unsigned short Pc; extern unsigned char Sp; /* stack pointer */ extern unsigned int A; /* accumulator */ extern unsigned char X; /* X register */ extern unsigned char Y; /* Y register */ extern unsigned int N; /* 7 - sign */ extern unsigned int V; /* 6 - Overflow */ /* 5 - Unused */ extern unsigned int B; /* 4 - Break */ extern unsigned int D; /* 3 - Decimal */ extern unsigned int I; /* 2 - Interrupt */ extern unsigned int NZ; /* 1 - inverse of Zero */ extern unsigned int C; /* 0 - Carry */ /* * Note: * Flags are stored as zero/nonzero instead of 0/1, except for * N which is stored 0/0x80. NZ is "not Z"; use !NZ to get * the zero flag. * * The flags code is tight, especially around overflow set on ADC * and SBC. Integer basic is a good test to see if it still works. */ #define M_NONE 0 #define M_ZP 1 #define M_ZPX 2 #define M_ZPY 3 #define M_IND 4 #define M_INDX 5 #define M_INDY 6 #define M_ABS 7 #define M_ABSX 8 #define M_ABSY 9 #define M_IMM 10 #define M_REL 11 #define M_ZIND 12 /* zero page indirect, 65C02 */ #define M_ABINDX 13 /* for jmp $7C in 65C02 */ extern int ram_read; extern int ram_write; extern int bank2_enable; struct op_info { char *name; int add_mode; }; extern struct op_info opcode[]; extern int running; extern int tracing; extern char *my_malloc(); extern int term_lines, term_cols; extern int text1[]; /* base addresses for text page 1 */ extern int last_line; /* line the cursor is on now */ extern int last_col; /* current column of cursor */ extern int disk[2]; extern int write_prot[2]; extern int drive; #define DO_RTS Pc = pop(); Pc |= pop() << 8; Pc++;
These are the contents of the former NiCE NeXT User Group NeXTSTEP/OpenStep software archive, currently hosted by Netfuture.ch.