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 VIA $FFD0-$FFDF */
9 struct __6522 {
10  unsigned char prb; /* Port register B */
11  unsigned char pra; /* Port register A */
12  unsigned char ddrb; /* Data direction register B */
13  unsigned char ddra; /* Data direction register A */
14  unsigned char t1_lo; /* Timer 1, low byte */
15  unsigned char t1_hi; /* Timer 1, high byte */
16  unsigned char t1l_lo; /* Timer 1 latch, low byte */
17  unsigned char t1l_hi; /* Timer 1 latch, high byte */
18  unsigned char t2_lo; /* Timer 2, low byte */
19  unsigned char t2_hi; /* Timer 2, high byte */
20  unsigned char sr; /* Shift register */
21  unsigned char acr; /* Auxiliary control register */
22  unsigned char pcr; /* Peripheral control register */
23  unsigned char ifr; /* Interrupt flag register */
24  unsigned char ier; /* Interrupt enable register */
25  unsigned char pra2; /* Port register A w/o handshake */
26 };
27 #define VIA (*(volatile struct __6522 *)0xFFD0)
28 
29 /* RP6502 RIA $FFE0-$FFF9 */
30 struct __RP6502 {
31  const unsigned char ready;
32  unsigned char tx;
33  const unsigned char rx;
34  const unsigned char vsync;
35  unsigned char rw0;
36  unsigned char step0;
37  unsigned int addr0;
38  unsigned char rw1;
39  unsigned char step1;
40  unsigned int addr1;
41  unsigned char xstack;
42  unsigned int errno_;
43  unsigned char op;
44  unsigned char irq;
45  const unsigned char spin;
46  const unsigned char busy;
47  const unsigned char lda;
48  unsigned char a;
49  const unsigned char ldx;
50  unsigned char x;
51  const unsigned char rts;
52  unsigned int sreg;
53 };
54 #define RIA (*(volatile struct __RP6502 *)0xFFE0)
55 
56 #define RIA_READY_TX_BIT 0x80
57 #define RIA_READY_RX_BIT 0x40
58 #define RIA_BUSY_BIT 0x80
59 
60 /* XSTACK helpers */
61 
62 void ria_push_long(unsigned long val);
63 void ria_push_int(unsigned int val);
64 #define ria_push_char(v) RIA.xstack = v
65 
66 long ria_pop_long(void);
67 int ria_pop_int(void);
68 #define ria_pop_char() RIA.xstack
69 
70 /* Set the RIA fastcall register */
71 
72 void ria_set_axsreg(unsigned long axsreg);
73 void ria_set_ax(unsigned int ax);
74 #define ria_set_a(v) RIA.a = v
75 
76 /* Run an OS operation */
77 
78 int ria_call_int(unsigned char op);
79 long ria_call_long(unsigned char op);
80 
81 /* OS operation numbers */
82 
83 #define RIA_OP_EXIT 0xFF
84 #define RIA_OP_ZXSTACK 0x00
85 #define RIA_OP_XREG 0x01
86 #define RIA_OP_ARGV 0x08
87 #define RIA_OP_EXEC 0x09
88 #define RIA_OP_ATTR_GET 0x0A
89 #define RIA_OP_ATTR_SET 0x0B
90 #define RIA_OP_OPEN 0x14
91 #define RIA_OP_CLOSE 0x15
92 #define RIA_OP_READ_XSTACK 0x16
93 #define RIA_OP_READ_XRAM 0x17
94 #define RIA_OP_WRITE_XSTACK 0x18
95 #define RIA_OP_WRITE_XRAM 0x19
96 #define RIA_OP_LSEEK_CC65 0x1A
97 #define RIA_OP_UNLINK 0x1B
98 #define RIA_OP_RENAME 0x1C
99 #define RIA_OP_LSEEK 0x1D
100 #define RIA_OP_LSEEK_LLVM 0x1D
101 #define RIA_OP_SYNCFS 0x1E
102 #define RIA_OP_STAT 0x1F
103 #define RIA_OP_OPENDIR 0x20
104 #define RIA_OP_READDIR 0x21
105 #define RIA_OP_CLOSEDIR 0x22
106 #define RIA_OP_TELLDIR 0x23
107 #define RIA_OP_SEEKDIR 0x24
108 #define RIA_OP_REWINDDIR 0x25
109 #define RIA_OP_CHMOD 0x26
110 #define RIA_OP_UTIME 0x27
111 #define RIA_OP_MKDIR 0x28
112 #define RIA_OP_CHDIR 0x29
113 #define RIA_OP_CHDRIVE 0x2A
114 #define RIA_OP_GETCWD 0x2B
115 #define RIA_OP_SETLABEL 0x2C
116 #define RIA_OP_GETLABEL 0x2D
117 #define RIA_OP_GETFREE 0x2E
118 #define RIA_OP_RLN_LASTKEY 0x30
119 #define RIA_OP_RLN_PEEK 0x31
120 #define RIA_OP_RLN_POKE 0x32
121 #define RIA_OP_GMTIME 0x3A
122 #define RIA_OP_LOCALTIME 0x3B
123 #define RIA_OP_MKTIME 0x3C
124 #define RIA_OP_STRFTIME 0x3D
125 #define RIA_OP_TIME_SET 0x3E
126 #define RIA_OP_TIME_GET 0x3F
127 
128 /* RIA attribute IDs */
129 
130 #define RIA_ATTR_ERRNO_OPT 0x00
131 #define RIA_ATTR_PHI2_KHZ 0x01
132 #define RIA_ATTR_CODE_PAGE 0x02
133 #define RIA_ATTR_RLN_LENGTH 0x03
134 #define RIA_ATTR_LRAND 0x04
135 #define RIA_ATTR_BEL 0x05
136 #define RIA_ATTR_LAUNCHER 0x06
137 #define RIA_ATTR_EXIT_CODE 0x07
138 #define RIA_ATTR_SIGINT 0x08
139 #define RIA_ATTR_RLN_CAPS 0x09
140 #define RIA_ATTR_RLN_WIDTH 0x0A
141 #define RIA_ATTR_RLN_HEIGHT 0x0B
142 #define RIA_ATTR_RLN_SUPPRESS_NL 0x0C
143 #define RIA_ATTR_CLK_RUN_MS 0x10
144 #define RIA_ATTR_CLK_RUN_CS 0x11
145 #define RIA_ATTR_CLK_RUN_DS 0x12
146 #define RIA_ATTR_CLK_RUN_S 0x13
147 
148 /* C API for the operating system. */
149 
150 typedef struct {
151  unsigned long fsize;
152  unsigned fdate;
153  unsigned ftime;
154  unsigned crdate;
155  unsigned crtime;
156  unsigned char fattrib;
157  char altname[12 + 1];
158  char fname[255 + 1];
159 } f_stat_t;
160 
161 int xregn(char device, char channel, unsigned char address, unsigned count,
162  ...);
163 int phi2(void); // deprecated, use ria_attr_*
164 int code_page(int); // deprecated, use ria_attr_*
165 long lrand(void); // deprecated, use ria_attr_*
166 int ria_execv(const char *path, char *const argv[]);
167 int ria_execl(const char *path, ...);
168 long ria_attr_get(unsigned char id);
169 int ria_attr_set(long val, unsigned char id);
170 int read_xstack(void *buf, unsigned count, int fildes);
171 int read_xram(unsigned buf, unsigned count, int fildes);
172 int write_xstack(const void *buf, unsigned count, int fildes);
173 int write_xram(unsigned buf, unsigned count, int fildes);
174 long f_lseek(long offset, int whence, int fildes);
175 int f_stat(const char *path, f_stat_t *dirent);
176 int f_opendir(const char *name);
177 int f_readdir(f_stat_t *dirent, int dirdes);
178 int f_closedir(int dirdes);
179 long f_telldir(int dirdes);
180 int f_seekdir(long offs, int dirdes);
181 int f_rewinddir(int dirdes);
182 int f_chmod(const char *path, unsigned char attr, unsigned char mask);
183 int f_utime(const char *path, unsigned fdate, unsigned ftime, unsigned crdate,
184  unsigned crtime);
185 int f_mkdir(const char *name);
186 int f_chdrive(const char *name);
187 int f_getcwd(char *name, int size);
188 int f_setlabel(const char *name);
189 int f_getlabel(const char *path, char *label);
190 int f_getfree(const char *name, unsigned long *free, unsigned long *total);
191 int ria_rln_lastkey(char *key, unsigned char *action);
192 int ria_rln_peek(char *peek, unsigned char *pos);
193 int ria_rln_poke(const char *poke);
194 int time_set(long long time);
195 
196 /* XREG helper macros */
197 
198 #define xreg__(_16, _15, _14, _13, _12, _11, _10, _9, _8, _7, _6, _5, _4, _3, \
199  _2, _1, count, ...) \
200  count
201 #define xreg_(...) \
202  xreg__(__VA_ARGS__, 16, 15, 14, 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1)
203 #define xreg(d, c, a, ...) xregn(d, c, a, xreg_(__VA_ARGS__), __VA_ARGS__)
204 
205 #define xreg_ria_keyboard(...) xreg(0, 0, 0, __VA_ARGS__)
206 #define xreg_ria_mouse(...) xreg(0, 0, 1, __VA_ARGS__)
207 #define xreg_ria_gamepad(...) xreg(0, 0, 2, __VA_ARGS__)
208 #define xreg_ria_tablet(...) xreg(0, 0, 3, __VA_ARGS__)
209 #define xreg_vga_canvas(...) xreg(1, 0, 0, __VA_ARGS__)
210 #define xreg_vga_mode(...) xreg(1, 0, 1, __VA_ARGS__)
211 
212 /* XRAM structure helpers */
213 
214 #define xram0_struct_set(addr, type, member, val) \
215  RIA.addr0 = (unsigned)(&((type *)0)->member) + (unsigned)addr; \
216  switch (sizeof(((type *)0)->member)) { \
217  case 1: \
218  RIA.rw0 = val; \
219  break; \
220  case 2: \
221  RIA.step0 = 1; \
222  RIA.rw0 = val & 0xff; \
223  RIA.rw0 = (val >> 8) & 0xff; \
224  break; \
225  case 4: \
226  RIA.step0 = 1; \
227  RIA.rw0 = (unsigned long)val & 0xff; \
228  RIA.rw0 = ((unsigned long)val >> 8) & 0xff; \
229  RIA.rw0 = ((unsigned long)val >> 16) & 0xff; \
230  RIA.rw0 = ((unsigned long)val >> 24) & 0xff; \
231  break; \
232  }
233 
234 #define xram1_struct_set(addr, type, member, val) \
235  RIA.addr1 = (unsigned)(&((type *)0)->member) + (unsigned)addr; \
236  switch (sizeof(((type *)0)->member)) { \
237  case 1: \
238  RIA.rw1 = val; \
239  break; \
240  case 2: \
241  RIA.step1 = 1; \
242  RIA.rw1 = val & 0xff; \
243  RIA.rw1 = (val >> 8) & 0xff; \
244  break; \
245  case 4: \
246  RIA.step1 = 1; \
247  RIA.rw1 = (unsigned long)val & 0xff; \
248  RIA.rw1 = ((unsigned long)val >> 8) & 0xff; \
249  RIA.rw1 = ((unsigned long)val >> 16) & 0xff; \
250  RIA.rw1 = ((unsigned long)val >> 24) & 0xff; \
251  break; \
252  }
253 
254 typedef struct {
255  unsigned char x_wrap; // bool
256  unsigned char y_wrap; // bool
257  int x_pos_px;
258  int y_pos_px;
261  unsigned xram_data_ptr;
263  unsigned xram_font_ptr;
265 
266 typedef struct {
267  unsigned char x_wrap; // bool
268  unsigned char y_wrap; // bool
269  int x_pos_px;
270  int y_pos_px;
273  unsigned xram_data_ptr;
275  unsigned xram_tile_ptr;
277 
278 typedef struct {
279  unsigned char x_wrap; // bool
280  unsigned char y_wrap; // bool
281  int x_pos_px;
282  int y_pos_px;
283  int width_px;
285  unsigned xram_data_ptr;
288 
289 typedef struct {
290  int x_pos_px;
291  int y_pos_px;
292  unsigned xram_sprite_ptr;
293  unsigned char log_size;
294  unsigned char has_opacity_metadata; // bool
296 
297 typedef struct {
298  int transform[6];
299  int x_pos_px;
300  int y_pos_px;
301  unsigned xram_sprite_ptr;
302  unsigned char log_size;
303  unsigned char has_opacity_metadata; // bool
305 
306 typedef struct {
307  int x_pos_px;
308  int y_pos_px;
309  unsigned xram_sprite_ptr;
310  unsigned palette_ptr;
312 
313 #ifdef __cplusplus
314 }
315 #endif
316 
317 #endif /* _RP6502_H */
void free(void *ptr)
time_t time(time_t *timep)
byte x
Definition: api.h:26
char channel
Definition: famitone2.h:31
char count
Definition: bios.h:188
char char char attr
Definition: neslib.h:85
unsigned size
Definition: neslib.h:185
uint8_t uint16_t address
Definition: bios.h:180
int f_seekdir(long offs, int dirdes)
int f_chdrive(const char *name)
int ria_rln_poke(const char *poke)
int f_opendir(const char *name)
int ria_rln_lastkey(char *key, unsigned char *action)
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 time_set(long long time)
int f_getfree(const char *name, unsigned long *free, unsigned long *total)
int xregn(char device, char channel, unsigned char address, unsigned count,...)
int ria_attr_set(long val, unsigned char id)
int f_utime(const char *path, unsigned fdate, unsigned ftime, unsigned crdate, unsigned crtime)
int ria_execv(const char *path, char *const argv[])
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)
long ria_attr_get(unsigned char id)
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 ria_rln_peek(char *peek, unsigned char *pos)
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 ria_execl(const char *path,...)
int f_chmod(const char *path, unsigned char attr, unsigned char mask)
void ria_set_ax(unsigned int ax)
Definition: rp6502.h:150
unsigned char fattrib
Definition: rp6502.h:156
unsigned ftime
Definition: rp6502.h:153
unsigned crtime
Definition: rp6502.h:155
unsigned long fsize
Definition: rp6502.h:151
unsigned fdate
Definition: rp6502.h:152
unsigned crdate
Definition: rp6502.h:154
Definition: rp6502.h:254
unsigned xram_data_ptr
Definition: rp6502.h:261
int width_chars
Definition: rp6502.h:259
int x_pos_px
Definition: rp6502.h:257
unsigned char y_wrap
Definition: rp6502.h:256
unsigned char x_wrap
Definition: rp6502.h:255
unsigned xram_palette_ptr
Definition: rp6502.h:262
unsigned xram_font_ptr
Definition: rp6502.h:263
int y_pos_px
Definition: rp6502.h:258
int height_chars
Definition: rp6502.h:260
Definition: rp6502.h:266
int x_pos_px
Definition: rp6502.h:269
int y_pos_px
Definition: rp6502.h:270
unsigned xram_tile_ptr
Definition: rp6502.h:275
unsigned xram_palette_ptr
Definition: rp6502.h:274
unsigned xram_data_ptr
Definition: rp6502.h:273
unsigned char y_wrap
Definition: rp6502.h:268
int height_tiles
Definition: rp6502.h:272
unsigned char x_wrap
Definition: rp6502.h:267
int width_tiles
Definition: rp6502.h:271
Definition: rp6502.h:278
int height_px
Definition: rp6502.h:284
unsigned xram_data_ptr
Definition: rp6502.h:285
int y_pos_px
Definition: rp6502.h:282
unsigned char x_wrap
Definition: rp6502.h:279
int x_pos_px
Definition: rp6502.h:281
unsigned xram_palette_ptr
Definition: rp6502.h:286
int width_px
Definition: rp6502.h:283
unsigned char y_wrap
Definition: rp6502.h:280
Definition: rp6502.h:297
unsigned char has_opacity_metadata
Definition: rp6502.h:303
unsigned char log_size
Definition: rp6502.h:302
int y_pos_px
Definition: rp6502.h:300
int x_pos_px
Definition: rp6502.h:299
unsigned xram_sprite_ptr
Definition: rp6502.h:301
Definition: rp6502.h:289
unsigned char has_opacity_metadata
Definition: rp6502.h:294
int x_pos_px
Definition: rp6502.h:290
unsigned char log_size
Definition: rp6502.h:293
unsigned xram_sprite_ptr
Definition: rp6502.h:292
int y_pos_px
Definition: rp6502.h:291
Definition: rp6502.h:306
unsigned palette_ptr
Definition: rp6502.h:310
unsigned xram_sprite_ptr
Definition: rp6502.h:309
int x_pos_px
Definition: rp6502.h:307
int y_pos_px
Definition: rp6502.h:308