kopia lustrzana https://github.com/Jean-MarcHarvengt/MCUME
183 wiersze
3.9 KiB
C
183 wiersze
3.9 KiB
C
/*****************************************************************************
|
|
|
|
This file is part of x2600, the Atari 2600 Emulator
|
|
===================================================
|
|
|
|
Copyright 1996 Alex Hornby. For contributions see the file CREDITS.
|
|
|
|
This software is distributed under the terms of the GNU General Public
|
|
License. This is free software with ABSOLUTELY NO WARRANTY.
|
|
|
|
See the file COPYING for details.
|
|
|
|
$Id: cpu.h,v 1.6 1997/11/22 14:29:54 ahornby Exp $
|
|
******************************************************************************/
|
|
/*
|
|
*
|
|
* This file was part of x64.
|
|
*
|
|
* This file contains useful stuff when you are creating
|
|
* virtual machine like MCS6510 based microcomputer.
|
|
*
|
|
* Included are:
|
|
* o registers
|
|
* o flags in PSW
|
|
* o addressing modes
|
|
*
|
|
* Written by
|
|
* Vesa-Matti Puro (vmp@lut.fi)
|
|
* Jarkko Sonninen (sonninen@lut.fi)
|
|
* Jouko Valta (jopi@stekt.oulu.fi)
|
|
*
|
|
*
|
|
*/
|
|
|
|
#ifndef X2600_CPU_H
|
|
#define X2600_CPU_H
|
|
|
|
#include "types.h"
|
|
|
|
/* 6507 Registers. */
|
|
#define AC accumulator
|
|
#define XR x_register
|
|
#define YR y_register
|
|
#define SP stack_pointer
|
|
#define pc6507 program_counter
|
|
#define PCH ((pc6507>>8)&0xff)
|
|
#define PCL (pc6507&0xff)
|
|
|
|
#define ZF zero_flag
|
|
#define SF sign_flag
|
|
#define OF overflow_flag
|
|
#define BF break_flag
|
|
#define DF decimal_flag
|
|
#define IF interrupt_flag
|
|
#define CF carry_flag
|
|
|
|
|
|
/* Masks which indicate location of status flags in PSW. */
|
|
#define S_SIGN 0x80
|
|
#define S_OVERFLOW 0x40
|
|
#define S_NOTUSED 0x20
|
|
#define S_BREAK 0x10
|
|
#define S_DECIMAL 0x08
|
|
#define S_INTERRUPT 0x04
|
|
#define S_ZERO 0x02
|
|
#define S_CARRY 0x01
|
|
|
|
|
|
/* ADDRESSING MODES */
|
|
|
|
#define IMPLIED 0
|
|
#define ACCUMULATOR 1
|
|
#define IMMEDIATE 2
|
|
|
|
#define ZERO_PAGE 3
|
|
#define ZERO_PAGE_X 4
|
|
#define ZERO_PAGE_Y 5
|
|
|
|
#define ABSOLUTE 6
|
|
#define ABSOLUTE_X 7
|
|
#define ABSOLUTE_Y 8
|
|
|
|
#define ABS_INDIRECT 9
|
|
#define INDIRECT_X 10
|
|
#define INDIRECT_Y 11
|
|
|
|
#define RELATIVE 12
|
|
|
|
#define ASS_CODE 13
|
|
|
|
|
|
/*
|
|
* Declaration for lookup-table which is used to translate MOS6502
|
|
* machine instructions. Machine code is used as index to array called
|
|
* lookup. Pointer to function is then fetched from array and function
|
|
* is called.
|
|
*/
|
|
|
|
extern struct lookup_tag {
|
|
char *mnemonic; /* Selfdocumenting? */
|
|
short addr_mode;
|
|
unsigned char source;
|
|
unsigned char destination;
|
|
unsigned char cycles;
|
|
unsigned char pbc_fix; /* Cycle for Page Boundary Crossing */
|
|
} lookup[];
|
|
|
|
|
|
/* Addressing mode (addr_mode) is used when instruction is diassembled
|
|
* or assembled by diassembler or assembler. This is used i.e.
|
|
* in function char *sprint_opcode() in the file misc.c.
|
|
*
|
|
* MOS6502 addressing modes are #defined in the file "vmachine.h".
|
|
*
|
|
* Mnemonic is character string telling the name of the instruction.
|
|
*/
|
|
|
|
#define M_NONE 0
|
|
#define M_AC 1
|
|
#define M_XR 2
|
|
#define M_YR 3
|
|
#define M_SP 4
|
|
#define M_SR 5
|
|
#define M_PC 6
|
|
#define M_IMM 7
|
|
#define M_ZERO 8
|
|
#define M_ZERX 9
|
|
#define M_ZERY 10
|
|
#define M_ABS 11
|
|
#define M_ABSX 12
|
|
#define M_ABSY 13
|
|
#define M_AIND 14
|
|
#define M_INDX 15
|
|
#define M_INDY 16
|
|
#define M_REL 17
|
|
#define M_FC 18
|
|
#define M_FD 19
|
|
#define M_FI 20
|
|
#define M_FV 21
|
|
#define M_ADDR 22
|
|
#define M_ 23
|
|
|
|
#ifndef NO_UNDOC_CMDS
|
|
#define M_ACIM 24 /* Source: AC & IMMED (bus collision) */
|
|
#define M_ANXR 25 /* Source: AC & XR (bus collision) */
|
|
#define M_AXIM 26 /* Source: (AC | #EE) & XR & IMMED (bus collision) */
|
|
#define M_ACNC 27 /* Dest: M_AC and Carry = Negative */
|
|
#define M_ACXR 28 /* Dest: M_AC, M_XR */
|
|
|
|
#define M_SABY 29 /* Source: (ABS_Y & SP) (bus collision) */
|
|
#define M_ACXS 30 /* Dest: M_AC, M_XR, M_SP */
|
|
#define M_STH0 31 /* Dest: Store (src & Addr_Hi+1) to (Addr +0x100) */
|
|
#define M_STH1 32
|
|
#define M_STH2 33
|
|
#define M_STH3 34
|
|
|
|
#else
|
|
#define M_ACIM M_NONE
|
|
#define M_ANXR M_NONE
|
|
#define M_AXIM M_NONE
|
|
#define M_ACNC M_NONE
|
|
#define M_ACXR M_NONE
|
|
|
|
#define M_SABY M_NONE
|
|
#define M_ACXS M_NONE
|
|
#define M_STH0 M_NONE
|
|
#define M_STH1 M_NONE
|
|
#define M_STH2 M_NONE
|
|
#define M_STH3 M_NONE
|
|
#endif
|
|
|
|
|
|
|
|
#endif /* X2600_CPU_H */
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|