File: 6502.h

package info (click to toggle)
cc65 2.19-2
  • links: PTS
  • area: main
  • in suites: forky, sid, trixie
  • size: 20,268 kB
  • sloc: ansic: 117,151; asm: 66,339; pascal: 4,248; makefile: 1,009; perl: 607
file content (140 lines) | stat: -rw-r--r-- 5,470 bytes parent folder | download | duplicates (2)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
/*****************************************************************************/
/*                                                                           */
/*                                  6502.h                                   */
/*                                                                           */
/*                        6502 specific declarations                         */
/*                                                                           */
/*                                                                           */
/*                                                                           */
/* (C) 1998-2012, Ullrich von Bassewitz                                      */
/*                Roemerstrasse 52                                           */
/*                D-70794 Filderstadt                                        */
/* EMail:         uz@cc65.org                                                */
/*                                                                           */
/*                                                                           */
/* This software is provided 'as-is', without any expressed or implied       */
/* warranty.  In no event will the authors be held liable for any damages    */
/* arising from the use of this software.                                    */
/*                                                                           */
/* Permission is granted to anyone to use this software for any purpose,     */
/* including commercial applications, and to alter it and redistribute it    */
/* freely, subject to the following restrictions:                            */
/*                                                                           */
/* 1. The origin of this software must not be misrepresented; you must not   */
/*    claim that you wrote the original software. If you use this software   */
/*    in a product, an acknowledgment in the product documentation would be  */
/*    appreciated but is not required.                                       */
/* 2. Altered source versions must be plainly marked as such, and must not   */
/*    be misrepresented as being the original software.                      */
/* 3. This notice may not be removed or altered from any source              */
/*    distribution.                                                          */
/*                                                                           */
/*****************************************************************************/



#ifndef _6502_H
#define _6502_H



/* We need size_t */
#ifndef _HAVE_size_t
#define _HAVE_size_t
typedef unsigned size_t;
#endif



/* Possible returns of getcpu() */
#define CPU_6502        0
#define CPU_65C02       1
#define CPU_65816       2
#define CPU_4510        3
#define CPU_65SC02      4
#define CPU_65CE02      5
#define CPU_HUC6280     6
#define CPU_2A0x        7
#define CPU_45GS02      8

unsigned char getcpu (void);
/* Detect the CPU the program is running on */



/* Macros for CPU instructions */
#define BRK()   __asm__ ("brk")
#define CLI()   __asm__ ("cli")
#define SEI()   __asm__ ("sei")



/* Struct that holds the registers for the sys function */
struct regs {
    unsigned char a;            /* A register value */
    unsigned char x;            /* X register value */
    unsigned char y;            /* Y register value */
    unsigned char flags;        /* Flags value */
    unsigned      pc;           /* Program counter */
};

/* Defines for the flags in the regs structure */
#define F6502_N         0x80    /* N flag */
#define F6502_V         0x40    /* V flag */
#define F6502_B         0x10    /* B flag */
#define F6502_D         0x08    /* D flag */
#define F6502_I         0x04    /* I flag */
#define F6502_Z         0x02    /* Z flag */
#define F6502_C         0x01    /* C flag */

/* Function to call any machine language subroutine. All registers in the
** regs structure are passed into the routine and the results are passed
** out. The B flag is ignored on input. The called routine must end with
** an RTS.
*/
void __fastcall__ _sys (struct regs* r);



/* Set and reset the break vector. The given user function is called if
** a break occurs. The values of the registers may be read from the brk_...
** variables. The value in brk_pc will point to the address that contains
** the brk instruction.
** The set_brk function will install an exit handler that will reset the
** vector if the program ends.
*/

extern unsigned char brk_a;     /* A register value */
extern unsigned char brk_x;     /* X register value */
extern unsigned char brk_y;     /* Y register value */
extern unsigned char brk_sr;    /* Status register */
extern unsigned brk_pc;         /* PC value */

typedef void (*brk_handler) (void);
/* Type of the break handler */

void __fastcall__ set_brk (brk_handler f);
/* Set the break vector to the given address */

void reset_brk (void);
/* Reset the break vector to the original value */



/* Possible returns for irq_handler() */
#define IRQ_NOT_HANDLED 0
#define IRQ_HANDLED     1

typedef unsigned char (*irq_handler) (void);
/* Type of the C level interrupt request handler */

void __fastcall__ set_irq (irq_handler f, void *stack_addr, size_t stack_size);
/* Set the C level interrupt request vector to the given address */

void reset_irq (void);
/* Reset the C level interrupt request vector */



/* End of 6502.h */
#endif