ftp.nice.ch/pub/next/tools/emulators/a2_1.1.NIHS.bs.tar.gz#/a2/a2.h

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
 */


#ifndef	TRUE
#define		TRUE		1
#endif	TRUE
#ifndef	FALSE
#define		FALSE		0
#endif	FALSE

extern FILE	*sfp;

/*
 *  Assertion verifier
 */
#define	assert(p)	if(! (p)) asfail(__FILE__, __LINE__, "p");


#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 void (*mem_set[256])(unsigned short, unsigned char);/* 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 */

#define	PRIMARY_PAGE	0
#define	SECONDARY_PAGE	1

extern int screen_page;

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 */
#ifdef	TEXT2
//extern int last_line2;		/* line the cursor is on now */
//extern int last_col2;		/* current column of cursor */
#endif	TEXT2

extern int disk[2];
extern int write_prot[2];
extern int drive;

#ifdef	JOYSTICK_SUPPORT
/* from main.c */
extern int joystick_fd;
extern int xmin, ymin;
extern int xcenter, ycenter;
extern float xpartition_low, ypartition_low;
extern float xpartition_high, ypartition_high;
extern int joystick_counter_x, joystick_counter_y;
#endif	JOYSTICK_SUPPORT

#define	DO_RTS	Pc = pop(); Pc |= pop() << 8; Pc++;

/* From curses.c */
void info(char *s);
void MoveCursor(int row, int col);
int InitScreen(void);
void ClearScreen(void);
void StartInverse(void);
void EndInverse(void);
void Raw(int state);
void ScreenSize(int *lines, int *columns);

/* From mem.c */
void memory_setup(void);
void ram_card(unsigned short addr);
void set_writep(unsigned short a, unsigned char n);

/* From jump.c */
void jump(int key);
void set_special_jumps(void);

/* From commands.c */
int shell_escape(char	*rest);
int insert_disk(char	*rest);

/* From cli.c */
void status(FILE *fp);
void cli(void);

/* From a2.c */
void run(void);

/* From table.c */
void flags(FILE *fp);
int diss(unsigned short pc, FILE *fp);

/* From main.c */
int bload(char *fnam, unsigned short addr);
void bsave(char *fnam, unsigned short addr, unsigned short size);
void set_term(void);
void restore_term(void);
void asfail( char	*file, int	line, char	*cond);

/* From screen.c */
void screen_setup(void);
void redraw_screen(void);

void set_text1f(unsigned short addr, unsigned char n);
#ifdef	TEXT2
void set_text2f(unsigned short addr, unsigned char n);
#endif	TEXT2

/* From prodos.c */
void prodos(void);

/* From dos.c */
void rwts(void);

/* From disk.c */
void read_disk(int track, int sector, unsigned char *buf);
void write_disk(int track, int sector, unsigned char *buf);

/* From vidout.c */
void scroll(void);
void vidout(void);

These are the contents of the former NiCE NeXT User Group NeXTSTEP/OpenStep software archive, currently hosted by Netfuture.ch.