llvm-mos-sdk
rp6502.h
Go to the documentation of this file.
1 #ifndef _RP6502_H
2 #define _RP6502_H
3 
4 #ifdef __cplusplus
5 extern "C" {
6 #endif
7 
8 /* RP6502 RIA $FFE0-$FFF9 */
9 struct __RP6502 {
10  const unsigned char ready;
11  unsigned char tx;
12  const unsigned char rx;
13  const unsigned char vsync;
14  unsigned char rw0;
15  unsigned char step0;
16  unsigned int addr0;
17  unsigned char rw1;
18  unsigned char step1;
19  unsigned int addr1;
20  unsigned char xstack;
21  unsigned int errno_;
22  unsigned char op;
23  unsigned char irq;
24  const unsigned char spin;
25  const unsigned char busy;
26  const unsigned char lda;
27  unsigned char a;
28  const unsigned char ldx;
29  unsigned char x;
30  const unsigned char rts;
31  unsigned int sreg;
32 };
33 #define RIA (*(volatile struct __RP6502 *)0xFFE0)
34 
35 #define RIA_READY_TX_BIT 0x80
36 #define RIA_READY_RX_BIT 0x40
37 #define RIA_BUSY_BIT 0x80
38 
39 /* XSTACK helpers */
40 
41 void ria_push_long(unsigned long val);
42 void ria_push_int(unsigned int val);
43 #define ria_push_char(v) RIA.xstack = v
44 
45 long ria_pop_long(void);
46 int ria_pop_int(void);
47 #define ria_pop_char() RIA.xstack
48 
49 /* Set the RIA fastcall register */
50 
51 void ria_set_axsreg(unsigned long axsreg);
52 void ria_set_ax(unsigned int ax);
53 #define ria_set_a(v) RIA.a = v
54 
55 /* Run an OS operation */
56 
57 int ria_call_int(unsigned char op);
58 long ria_call_long(unsigned char op);
59 
60 /* OS operation numbers */
61 
62 #define RIA_OP_EXIT 0xFF
63 #define RIA_OP_ZXSTACK 0x00
64 #define RIA_OP_XREG 0x01
65 #define RIA_OP_PHI2 0x02
66 #define RIA_OP_CODE_PAGE 0x03
67 #define RIA_OP_LRAND 0x04
68 #define RIA_OP_STDIN_OPT 0x05
69 #define RIA_OP_ERRNO_OPT 0x06
70 #define RIA_OP_CLOCK 0x0F
71 #define RIA_OP_CLOCK_GETRES 0x10
72 #define RIA_OP_CLOCK_GETTIME 0x11
73 #define RIA_OP_CLOCK_SETTIME 0x12
74 #define RIA_OP_CLOCK_GETTIMEZONE 0x13
75 #define RIA_OP_OPEN 0x14
76 #define RIA_OP_CLOSE 0x15
77 #define RIA_OP_READ_XSTACK 0x16
78 #define RIA_OP_READ_XRAM 0x17
79 #define RIA_OP_WRITE_XSTACK 0x18
80 #define RIA_OP_WRITE_XRAM 0x19
81 #define RIA_OP_LSEEK_CC65 0x1A
82 #define RIA_OP_UNLINK 0x1B
83 #define RIA_OP_RENAME 0x1C
84 #define RIA_OP_LSEEK 0x1D
85 #define RIA_OP_LSEEK_LLVM 0x1D
86 #define RIA_OP_SYNCFS 0x1E
87 #define RIA_OP_STAT 0x1F
88 #define RIA_OP_OPENDIR 0x20
89 #define RIA_OP_READDIR 0x21
90 #define RIA_OP_CLOSEDIR 0x22
91 #define RIA_OP_TELLDIR 0x23
92 #define RIA_OP_SEEKDIR 0x24
93 #define RIA_OP_REWINDDIR 0x25
94 #define RIA_OP_CHMOD 0x26
95 #define RIA_OP_UTIME 0x27
96 #define RIA_OP_MKDIR 0x28
97 #define RIA_OP_CHDIR 0x29
98 #define RIA_OP_CHDRIVE 0x2A
99 #define RIA_OP_GETCWD 0x2B
100 #define RIA_OP_SETLABEL 0x2C
101 #define RIA_OP_GETLABEL 0x2D
102 #define RIA_OP_GETFREE 0x2E
103 
104 /* C API for the operating system. */
105 
106 typedef struct {
107  unsigned long fsize;
108  unsigned fdate;
109  unsigned ftime;
110  unsigned crdate;
111  unsigned crtime;
112  unsigned char fattrib;
113  char altname[12 + 1];
114  char fname[255 + 1];
115 } f_stat_t;
116 
117 int xregn(char device, char channel, unsigned char address, unsigned count,
118  ...);
119 int phi2(void);
120 int code_page(int);
121 long lrand(void);
122 int stdin_opt(unsigned long ctrl_bits, unsigned char str_length);
123 int read_xstack(void *buf, unsigned count, int fildes);
124 int read_xram(unsigned buf, unsigned count, int fildes);
125 int write_xstack(const void *buf, unsigned count, int fildes);
126 int write_xram(unsigned buf, unsigned count, int fildes);
127 long f_lseek(long offset, int whence, int fildes);
128 int f_stat(const char *path, f_stat_t *dirent);
129 int f_opendir(const char *name);
130 int f_readdir(f_stat_t *dirent, int dirdes);
131 int f_closedir(int dirdes);
132 long f_telldir(int dirdes);
133 int f_seekdir(long offs, int dirdes);
134 int f_rewinddir(int dirdes);
135 int f_chmod(const char *path, unsigned char attr, unsigned char mask);
136 int f_utime(const char *path, unsigned fdate, unsigned ftime, unsigned crdate,
137  unsigned crtime);
138 int f_mkdir(const char *name);
139 int f_chdrive(const char *name);
140 int f_getcwd(char *name, int size);
141 int f_setlabel(const char *name);
142 int f_getlabel(const char *path, char *label);
143 int f_getfree(const char *name, unsigned long *free, unsigned long *total);
144 
145 /* XREG helper macros */
146 
147 #define xreg__(_16, _15, _14, _13, _12, _11, _10, _9, _8, _7, _6, _5, _4, _3, \
148  _2, _1, count, ...) \
149  count
150 #define xreg_(...) \
151  xreg__(__VA_ARGS__, 16, 15, 14, 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1)
152 #define xreg(d, c, a, ...) xregn(d, c, a, xreg_(__VA_ARGS__), __VA_ARGS__)
153 
154 #define xreg_ria_keyboard(...) xreg(0, 0, 0, __VA_ARGS__)
155 #define xreg_ria_mouse(...) xreg(0, 0, 1, __VA_ARGS__)
156 #define xreg_ria_gamepad(...) xreg(0, 0, 2, __VA_ARGS__)
157 #define xreg_vga_canvas(...) xreg(1, 0, 0, __VA_ARGS__)
158 #define xreg_vga_mode(...) xreg(1, 0, 1, __VA_ARGS__)
159 
160 /* XRAM structure helpers */
161 
162 #define xram0_struct_set(addr, type, member, val) \
163  RIA.addr0 = (unsigned)(&((type *)0)->member) + (unsigned)addr; \
164  switch (sizeof(((type *)0)->member)) { \
165  case 1: \
166  RIA.rw0 = val; \
167  break; \
168  case 2: \
169  RIA.step0 = 1; \
170  RIA.rw0 = val & 0xff; \
171  RIA.rw0 = (val >> 8) & 0xff; \
172  break; \
173  case 4: \
174  RIA.step0 = 1; \
175  RIA.rw0 = (unsigned long)val & 0xff; \
176  RIA.rw0 = ((unsigned long)val >> 8) & 0xff; \
177  RIA.rw0 = ((unsigned long)val >> 16) & 0xff; \
178  RIA.rw0 = ((unsigned long)val >> 24) & 0xff; \
179  break; \
180  }
181 
182 #define xram1_struct_set(addr, type, member, val) \
183  RIA.addr1 = (unsigned)(&((type *)0)->member) + (unsigned)addr; \
184  switch (sizeof(((type *)0)->member)) { \
185  case 1: \
186  RIA.rw1 = val; \
187  break; \
188  case 2: \
189  RIA.step1 = 1; \
190  RIA.rw1 = val & 0xff; \
191  RIA.rw1 = (val >> 8) & 0xff; \
192  break; \
193  case 4: \
194  RIA.step1 = 1; \
195  RIA.rw1 = (unsigned long)val & 0xff; \
196  RIA.rw1 = ((unsigned long)val >> 8) & 0xff; \
197  RIA.rw1 = ((unsigned long)val >> 16) & 0xff; \
198  RIA.rw1 = ((unsigned long)val >> 24) & 0xff; \
199  break; \
200  }
201 
202 typedef struct {
203  unsigned char x_wrap; // bool
204  unsigned char y_wrap; // bool
205  int x_pos_px;
206  int y_pos_px;
209  unsigned xram_data_ptr;
211  unsigned xram_font_ptr;
213 
214 typedef struct {
215  unsigned char x_wrap; // bool
216  unsigned char y_wrap; // bool
217  int x_pos_px;
218  int y_pos_px;
221  unsigned xram_data_ptr;
223  unsigned xram_tile_ptr;
225 
226 typedef struct {
227  unsigned char x_wrap; // bool
228  unsigned char y_wrap; // bool
229  int x_pos_px;
230  int y_pos_px;
231  int width_px;
233  unsigned xram_data_ptr;
236 
237 typedef struct {
238  int x_pos_px;
239  int y_pos_px;
240  unsigned xram_sprite_ptr;
241  unsigned char log_size;
242  unsigned char has_opacity_metadata; // bool
244 
245 typedef struct {
246  int transform[6];
247  int x_pos_px;
248  int y_pos_px;
249  unsigned xram_sprite_ptr;
250  unsigned char log_size;
251  unsigned char has_opacity_metadata; // bool
253 
254 #ifdef __cplusplus
255 }
256 #endif
257 
258 #endif /* _RP6502_H */
uint8_t uint16_t address
Definition: bios.h:180
void free(void *ptr)
byte x
Definition: api.h:26
char channel
Definition: famitone2.h:31
const void uint16_t count
Definition: memory.h:58
char char char attr
Definition: neslib.h:85
unsigned size
Definition: neslib.h:185
int f_seekdir(long offs, int dirdes)
int f_chdrive(const char *name)
int f_opendir(const char *name)
int f_getlabel(const char *path, char *label)
long f_telldir(int dirdes)
int write_xstack(const void *buf, unsigned count, int fildes)
int f_setlabel(const char *name)
int f_getfree(const char *name, unsigned long *free, unsigned long *total)
int xregn(char device, char channel, unsigned char address, unsigned count,...)
int f_utime(const char *path, unsigned fdate, unsigned ftime, unsigned crdate, unsigned crtime)
int stdin_opt(unsigned long ctrl_bits, unsigned char str_length)
int ria_call_int(unsigned char op)
int f_rewinddir(int dirdes)
int read_xram(unsigned buf, unsigned count, int fildes)
int ria_pop_int(void)
int f_mkdir(const char *name)
int f_readdir(f_stat_t *dirent, int dirdes)
long lrand(void)
int f_getcwd(char *name, int size)
int f_closedir(int dirdes)
void ria_push_long(unsigned long val)
long ria_call_long(unsigned char op)
int code_page(int)
int f_stat(const char *path, f_stat_t *dirent)
long f_lseek(long offset, int whence, int fildes)
int write_xram(unsigned buf, unsigned count, int fildes)
int phi2(void)
void ria_push_int(unsigned int val)
int read_xstack(void *buf, unsigned count, int fildes)
void ria_set_axsreg(unsigned long axsreg)
long ria_pop_long(void)
int f_chmod(const char *path, unsigned char attr, unsigned char mask)
void ria_set_ax(unsigned int ax)
Definition: rp6502.h:106
unsigned char fattrib
Definition: rp6502.h:112
unsigned ftime
Definition: rp6502.h:109
unsigned crtime
Definition: rp6502.h:111
unsigned long fsize
Definition: rp6502.h:107
unsigned fdate
Definition: rp6502.h:108
unsigned crdate
Definition: rp6502.h:110
Definition: rp6502.h:202
unsigned xram_data_ptr
Definition: rp6502.h:209
int width_chars
Definition: rp6502.h:207
int x_pos_px
Definition: rp6502.h:205
unsigned char y_wrap
Definition: rp6502.h:204
unsigned char x_wrap
Definition: rp6502.h:203
unsigned xram_palette_ptr
Definition: rp6502.h:210
unsigned xram_font_ptr
Definition: rp6502.h:211
int y_pos_px
Definition: rp6502.h:206
int height_chars
Definition: rp6502.h:208
Definition: rp6502.h:214
int x_pos_px
Definition: rp6502.h:217
int y_pos_px
Definition: rp6502.h:218
unsigned xram_tile_ptr
Definition: rp6502.h:223
unsigned xram_palette_ptr
Definition: rp6502.h:222
unsigned xram_data_ptr
Definition: rp6502.h:221
unsigned char y_wrap
Definition: rp6502.h:216
int height_tiles
Definition: rp6502.h:220
unsigned char x_wrap
Definition: rp6502.h:215
int width_tiles
Definition: rp6502.h:219
Definition: rp6502.h:226
int height_px
Definition: rp6502.h:232
unsigned xram_data_ptr
Definition: rp6502.h:233
int y_pos_px
Definition: rp6502.h:230
unsigned char x_wrap
Definition: rp6502.h:227
int x_pos_px
Definition: rp6502.h:229
unsigned xram_palette_ptr
Definition: rp6502.h:234
int width_px
Definition: rp6502.h:231
unsigned char y_wrap
Definition: rp6502.h:228
Definition: rp6502.h:245
unsigned char has_opacity_metadata
Definition: rp6502.h:251
unsigned char log_size
Definition: rp6502.h:250
int y_pos_px
Definition: rp6502.h:248
int x_pos_px
Definition: rp6502.h:247
unsigned xram_sprite_ptr
Definition: rp6502.h:249
Definition: rp6502.h:237
unsigned char has_opacity_metadata
Definition: rp6502.h:242
int x_pos_px
Definition: rp6502.h:238
unsigned char log_size
Definition: rp6502.h:241
unsigned xram_sprite_ptr
Definition: rp6502.h:240
int y_pos_px
Definition: rp6502.h:239