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

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

/*
 * asm.h - 6510 assembler-related definitions.
 *
 * Written by
 *   Vesa-Matti Puro (vmp@lut.fi)
 *   Jarkko Sonninen (sonninen@lut.fi)
 *   Jouko Valta (jopi@stekt.oulu.fi)
 *
 * 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 _ASM_H
#define _ASM_H

#include "types.h"

#define NUM_OF_MNEMS	56
#define TOTAL_CODES	256
#define MAXARG		19	/* command + addr + 16 bytes + 1 */

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


extern struct lookup_tag {
    const 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[];

extern int clength[];
extern char *modename[];

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

#define M_MAX	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

#define M_MAX	23
#endif

/* optimise searching a little */
#define OP_MNEM_SPC	0x04

#define OP_IMPL_MIN	0x00
#define OP_IMPL_MAX	0xfa
#define OP_IMPL_SPC	0x02

#define OP_IMM_MIN	0x09
#define OP_IMM_MAX	0xeb
#define OP_IMM_SPC	0x01	/* not used */

#define OP_ACCU_MIN	0x0a
#define OP_ACCU_MAX	0x6a
#define OP_ACCU_SPC	0x20

#define OP_ABS_MIN	0x0c
#define OP_ABS_MAX	0xff
#define OP_ABS_SPC	0x04


/* Symbol definitions */

#define SYMBOL_BYTE	1
#define SYMBOL_WORD	2
#define SYMBOL_FOUND	16
#define SYMBOL_SET	32
#define SYMBOL_VALID	64

#define SYMBOL_MAX_CHARS 8
	/* For portability, labels should be 6 characters or less. */

/* Error messages */

#define ERRORS_TO_STOP	20	/* screenfull on terminal */

#define E_OK			0

 /* Warnings */

#define E_UNDOCUMENTED		(-1)
#define E_SIZE			(-2)
#define E_LARGE_VALUE		(-3)
#define E_LONG_NAME		(-4)
#define E_FORWARD_REF		(-5)

 /* Errors */
#define E_ERROR			(-64)	/* General error */

/* Line Syntax */
#define E_SYNTAX		(E_ERROR)
#define E_PARSE_ERROR		(E_ERROR -1)
#define E_TOO_MANY_ERRORS	(E_ERROR -2)

/* Assembler */
#define E_BAD_IDENTIFIER	(E_ERROR -8)
#define E_BAD_DIRECTIVE		(E_ERROR -9)
#define E_SYMBOL_UNDEFINED	(E_ERROR -10)
#define E_SYMBOL_REDEF		(E_ERROR -11)
#define E_PC_DECREMENT		(E_ERROR -12)

/* Mnemonic */
#define E_BAD_MNEM		(E_ERROR -16)
#define E_LONG_BRANCH		(E_ERROR -17)
#define E_MISSING_OPER		(E_ERROR -18)

/* Operand Syntax */
#define E_PARAMETER_SYNTAX	(E_ERROR -24)
#define E_TOO_MANY_COMMAS	(E_ERROR -25)
#define E_RIGHT_PARENTHESIS	(E_ERROR -26)
#define E_LEFT_PARENTHESIS	(E_ERROR -27)
#define E_PARENTHESIS		(E_ERROR -28)

#define E_MIXED_XY		(E_ERROR -30)
#define E_MISSING_XY		(E_ERROR -31)
#define E_BAD_INDEX		(E_ERROR -32)



 /* Warnings */
#define EM_UNDOCUMENTED		"Undocumented opcode used"
#define EM_SIZE			"Operand length changed"
#define EM_LARGE_VALUE		"Value too large"
#define EM_LONG_NAME		"Symbol name too long"
#define EM_FORWARD_REF		"Forward reference"

 /* Errors */
#define EM_SYNTAX		"Syntax error"
#define EM_PARSE_ERROR		"Parse error - I don't get it"
#define EM_TOO_MANY_ERRORS	"Keep your filthy fingers off here!"

#define EM_BAD_IDENTIFIER	"Identifier error"
#define EM_BAD_DIRECTIVE	"Unrecognised directive"
#define EM_SYMBOL_UNDEFINED	"Undefined symbol"
#define EM_SYMBOL_REDEF 	"Symbol redefined"
#define EM_PC_DECREMENT		"PC decrement"

#define EM_BAD_MNEM		"Illegal mnemonic"
#define EM_LONG_BRANCH		"Branch out of range"
#define EM_MISSING_OPER		"Operand missing"

#define EM_PARAMETER_SYNTAX 	"Parameter syntax error"
#define EM_TOO_MANY_COMMAS  	"Too many commas found"
#define EM_RIGHT_PARENTHESIS	"Too many right parenthesis, 1 is maximum"
#define EM_LEFT_PARENTHESIS 	"Too many left parenthesis, 1 is maximum"
#define EM_PARENTHESIS	    	"Not equally right and left parenthesis"

#define EM_MIXED_XY         	"Too many index registers"
#define EM_MISSING_XY		"Index register missing"
#define EM_BAD_INDEX		"Invalid index register"

/* ------------------------------------------------------------------------- */

extern int ass(ADDRESS addr, int mode);
extern int interpret_instr(char *line, ADDRESS adr, int mode);

#endif  /* _ASM_H */

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