ftp.nice.ch/pub/next/tools/emulators/vice.0.15.0.NeXT.sd.tgz#/vice-0.15.0/src/mos6510.h

This is mos6510.h in view mode; [Download] [Up]

/*
 * mos6510.h - Definitions for emulation of the 6510 processor.
 *
 * Written by
 *  Ettore Perazzoli (ettore@comm2000.it)
 *
 * This file is part of VICE, the Versatile Commodore Emulator.
 * See README for copyright notice.
 *
 *  This program is free software; you can redistribute it and/or modify
 *  it under the terms of the GNU General Public License as published by
 *  the Free Software Foundation; either version 2 of the License, or
 *  (at your option) any later version.
 *
 *  This program is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 *  GNU General Public License for more details.
 *
 *  You should have received a copy of the GNU General Public License
 *  along with this program; if not, write to the Free Software
 *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
 *  02111-1307  USA.
 *
 */

#ifndef _MOS6510_H
#define _MOS6510_H

#include "types.h"

/* Struct for the 6510 registers.  */
/* This contains some redundancy to make it compatible with the way registers
   are handled within the CPU emulation.  The struct should be accessed using
   the `MOS6510_REGS_*()' macros.  */
typedef struct _mos6510_regs {
    unsigned int reg_pc;        /* `unsigned int' required by the 1541 code. */
    BYTE reg_a;
    BYTE reg_x;
    BYTE reg_y;
    BYTE reg_sp;
    BYTE reg_p;
    BYTE flag_n;
    BYTE flag_z;
} mos6510_regs_t;

/* These define the position of the status flags in the P (`status')
   register.  */
#define P_SIGN          0x80
#define P_OVERFLOW      0x40
#define P_UNUSED        0x20
#define P_BREAK         0x10
#define P_DECIMAL       0x08
#define P_INTERRUPT     0x04
#define P_ZERO          0x02
#define P_CARRY         0x01

#define MOS6510_REGS_SET_A(regs, val) \
    (regs)->reg_a = (val)
#define MOS6510_REGS_SET_X(regs, val) \
    (regs)->reg_x = (val)
#define MOS6510_REGS_SET_Y(regs, val) \
    (regs)->reg_y = (val)
#define MOS6510_REGS_SET_SP(regs, val) \
    (regs)->reg_sp = (val)
#define MOS6510_REGS_SET_PC(regs, val) \
    (regs)->reg_pc = (val)
/* FIXME: This does not handle "byte ready" status on 1541.  */
#define MOS6510_REGS_SET_OVERFLOW(regs, val) \
    ((val) ? ((regs)->reg_p |= P_OVERFLOW) : ((regs)->reg_p &= ~P_OVERFLOW))
#define MOS6510_REGS_SET_BREAK(regs, val) \
    ((val) ? ((regs)->reg_p |= P_BREAK) : ((regs)->reg_p &= ~P_BREAK))
#define MOS6510_REGS_SET_DECIMAL(regs, val) \
    ((val) ? ((regs)->reg_p |= P_DECIMAL) : ((regs)->reg_p &= ~P_DECIMAL))
#define MOS6510_REGS_SET_INTERRUPT(regs, val) \
    ((val) ? ((regs)->reg_p |= P_INTERRUPT) : ((regs)->reg_p &= ~P_INTERRUPT))
#define MOS6510_REGS_SET_CARRY(regs, val) \
    ((val) ? ((regs)->reg_p |= P_CARRY) : ((regs)->reg_p &= ~P_CARRY))
#define MOS6510_REGS_SET_SIGN(regs, val) \
    ((regs)->flag_n = (val) ? 0x80 : 0)
#define MOS6510_REGS_SET_ZERO(regs, val) \
    ((regs)->flag_z = !(val))
#define MOS6510_REGS_SET_STATUS(regs, val) \
    ((regs)->reg_p = ((val) & ~(P_ZERO | P_SIGN)), \
     MOS6510_REGS_SET_ZERO(regs, (val) & P_ZERO), \
     (regs)->flag_n = (val))

#define MOS6510_REGS_GET_A(regs) \
    ((regs)->reg_a)
#define MOS6510_REGS_GET_X(regs) \
    ((regs)->reg_x)
#define MOS6510_REGS_GET_Y(regs) \
    ((regs)->reg_y)
#define MOS6510_REGS_GET_SP(regs) \
    ((regs)->reg_sp)
#define MOS6510_REGS_GET_PC(regs) \
    ((regs)->reg_pc)
#define MOS6510_REGS_GET_OVERFLOW(regs) \
    ((regs)->reg_p & P_OVERFLOW)
#define MOS6510_REGS_GET_BREAK(regs) \
    ((regs)->reg_p & P_BREAK)
#define MOS6510_REGS_GET_DECIMAL(regs) \
    ((regs)->reg_p & P_DECIMAL)
#define MOS6510_REGS_GET_INTERRUPT(regs) \
    ((regs)->reg_p & P_INTERRUPT)
#define MOS6510_REGS_GET_CARRY(regs) \
    ((regs)->reg_p & P_CARRY)
#define MOS6510_REGS_GET_SIGN(regs) \
    ((regs)->flag_n & 0x80)
#define MOS6510_REGS_GET_ZERO(regs) \
    (!(regs)->flag_z)
#define MOS6510_REGS_GET_STATUS(regs) \
    ((regs)->reg_p | ((regs)->flag_n & 0x80) | P_UNUSED \
     | (MOS6510_REGS_GET_ZERO(regs) ? P_ZERO : 0))


#endif

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