apple2ix/src/cpu.h

134 lines
4.7 KiB
C
Raw Normal View History

/*
* Apple // emulator for Linux: Virtual 6502/65C02 interface
*
* Copyright 1994 Alexander Jean-Claude Bottema
* Copyright 1995 Stephen Lee
* Copyright 1997, 1998 Aaron Culliney
* Copyright 1998, 1999, 2000 Michael Deutschmann
*
* This software package is subject to the GNU General Public License
* version 2 or later (your choice) as published by the Free Software
* Foundation.
*
* THERE ARE NO WARRANTIES WHATSOEVER.
*
*/
#ifndef __CPU_H_
#define __CPU_H_
#ifndef __ASSEMBLER__
#include <sys/types.h>
2013-07-07 20:16:08 +00:00
#include <stdint.h>
/* types */
typedef struct memory_vector_t {
void *r;
void *w;
} memory_vector_t;
struct cpu65_state
{
2013-07-07 20:16:08 +00:00
uint16_t pc; /* Program counter */
uint8_t a; /* Accumulator */
2014-01-26 06:10:33 +00:00
uint8_t f; /* Flags (host-order) */
2013-07-07 20:16:08 +00:00
uint8_t x; /* X Index register */
uint8_t y; /* Y Index register */
uint8_t sp; /* Stack Pointer */
};
2013-07-07 20:16:08 +00:00
struct cpu65_extra
{
2013-07-07 20:16:08 +00:00
uint16_t ea; /* Last effective address */
uint8_t d; /* Last data byte written */
uint8_t rw; /* 1 = read occured, 2 = write, 3 = both */
uint8_t opcode; /* Last opcode */
uint8_t opcycles; /* Last opcode extra cycles */
};
/* Set up the processor for a new run. Sets up opcode table. */
extern void cpu65_init();
/* Interrupt the processor */
extern void cpu65_interrupt(int reason);
extern void cpu65_uninterrupt(int reason);
extern void cpu65_run(void);
extern void cpu65_direct_write(int ea,int data);
extern memory_vector_t cpu65_vmem[65536];
extern struct cpu65_state cpu65_current;
extern struct cpu65_extra cpu65_debug;
extern unsigned char cpu65_flags_encode[256];
extern unsigned char cpu65_flags_decode[256];
extern int16_t cpu65_cycle_count;
extern int16_t cpu65_cycles_to_execute;
#endif /* !__ASSEMBLER__ */
#define ResetSig 0x02
#define IRQ6522 0x08
#define IRQSpeech 0x10
#define IRQSSC 0x20
#define IRQMouse 0x40
2014-02-23 05:08:01 +00:00
#define IRQGeneric 0x80
/* Note: These are *not* the bit positions used for the flags in the P
* register of a real 6502. Rather, they have been distorted so that C,
* N and Z match the analogous flags in the _80386_ flags register.
*
* Additionally, V matches the position of the overflow flag in the high byte
* of the 80386 register.
*
*/
#define C_Flag 0x1 /* 6502 Carry */
#define X_Flag 0x2 /* 6502 Xtra */
#define I_Flag 0x4 /* 6502 Interrupt disable */
#define V_Flag 0x8 /* 6502 Overflow */
#define B_Flag 0x10 /* 6502 Break */
#define D_Flag 0x20 /* 6502 Decimal mode */
#define Z_Flag 0x40 /* 6502 Zero */
#define N_Flag 0x80 /* 6502 Neg */
#define C_Flag_Bit 8 /* 6502 Carry */
#define X_Flag_Bit 9 /* 6502 Xtra */
#define I_Flag_Bit 10 /* 6502 Interrupt disable */
#define V_Flag_Bit 11 /* 6502 Overflow */
#define B_Flag_Bit 12 /* 6502 Break */
#define D_Flag_Bit 13 /* 6502 Decimal mode */
#define Z_Flag_Bit 14 /* 6502 Zero */
#define N_Flag_Bit 15 /* 6502 Neg */
2014-01-26 06:10:33 +00:00
/*
* These are the 6502 Flags bit positions
*/
#define C_Flag_6502 0x1 // [C]arry
#define Z_Flag_6502 0x2 // [Z]ero
#define I_Flag_6502 0x4 // [I]nterrupt
#define D_Flag_6502 0x8 // [D]ecimal
#define B_Flag_6502 0x10 // [B]reak
#define X_Flag_6502 0x20 // [X]tra (reserved)...
#define V_Flag_6502 0x40 // o[V]erflow
#define N_Flag_6502 0x80 // [N]egative
2013-07-07 20:16:08 +00:00
#define X_Reg %bl /* 6502 X register in %bl */
#define Y_Reg %bh /* 6502 Y register in %bh */
#define XY_Regs_32 %ebx /* 6502 X&Y flags */
2013-07-07 20:16:08 +00:00
#define A_Reg %cl /* 6502 A register in %cl */
#define F_Reg %ch /* 6502 flags in %ch */
#define FF_Reg %ecx /* 6502 F&A flags */
2013-07-07 20:16:08 +00:00
#define SP_Reg_L %dl /* 6502 Stack pointer low */
#define SP_Reg_H %dh /* 6502 Stack pointer high */
#define SP_Reg %edx /* 6502 Stack pointer */
2013-07-07 20:16:08 +00:00
#define PC_Reg %si /* 6502 Program Counter */
#define PC_Reg_E %esi /* 6502 Program Counter */
#define EffectiveAddr %di /* Effective address */
#define EffectiveAddr_E %edi /* Effective address */
#endif // whole file