1
0
mirror of https://github.com/cc65/cc65.git synced 2024-12-22 12:30:41 +00:00

Merge pull request #2526 from picocomputer/master

Add to rp6502 target: clock(), xregn(), and RIA stack increase
This commit is contained in:
Bob Andrews 2024-10-05 14:11:34 +02:00 committed by GitHub
commit bb7f0c17b8
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
9 changed files with 40 additions and 5 deletions

View File

@ -37,6 +37,7 @@ RIA_OP_PHI2 := $02
RIA_OP_CODEPAGE := $03
RIA_OP_LRAND := $04
RIA_OP_STDIN_OPT := $05
RIA_OP_CLOCK := $0F
RIA_OP_CLOCK_GETRES := $10
RIA_OP_CLOCK_GETTIME := $11
RIA_OP_CLOCK_SETTIME := $12

View File

@ -47,8 +47,7 @@ struct __RP6502
unsigned char step1;
unsigned int addr1;
unsigned char xstack;
unsigned char errno_lo;
unsigned char errno_hi;
unsigned int errno;
unsigned char op;
unsigned char irq;
const unsigned char spin;
@ -101,6 +100,7 @@ long __fastcall__ ria_call_long_errno (unsigned char op);
#define RIA_OP_CODEPAGE 0x03
#define RIA_OP_LRAND 0x04
#define RIA_OP_STDIN_OPT 0x05
#define RIA_OP_CLOCK 0x0F
#define RIA_OP_CLOCK_GETRES 0x10
#define RIA_OP_CLOCK_GETTIME 0x11
#define RIA_OP_CLOCK_SETTIME 0x12
@ -117,6 +117,8 @@ long __fastcall__ ria_call_long_errno (unsigned char op);
/* C API for the operating system. */
int __cdecl__ xregn (char device, char channel, unsigned char address, unsigned count,
...);
int __cdecl__ xreg (char device, char channel, unsigned char address, ...);
int phi2 (void);
int codepage (void);

View File

@ -86,6 +86,8 @@ struct tm {
# define CLOCKS_PER_SEC 135 /* FIXME */
#elif defined(__GEOS__)
# define CLOCKS_PER_SEC 1
#elif defined (__RP6502__)
# define CLOCKS_PER_SEC 100
#elif defined(__TELESTRAT__)
# define CLOCKS_PER_SEC 10
#elif defined(__ATARI__) || defined (__LYNX__)

7
libsrc/rp6502/clock.c Normal file
View File

@ -0,0 +1,7 @@
#include <rp6502.h>
#include <time.h>
clock_t __fastcall__ clock (void)
{
return ria_call_long (RIA_OP_CLOCK);
}

View File

@ -5,7 +5,7 @@ int __fastcall__ read (int fildes, void* buf, unsigned count)
{
int total = 0;
while (count) {
unsigned blockcount = (count > 256) ? 256 : count;
unsigned blockcount = (count > 512) ? 512 : count;
int bytes_read = read_xstack (&((char*)buf)[total], blockcount, fildes);
if (bytes_read < 0) {
return bytes_read;

View File

@ -7,7 +7,7 @@ unsigned char __fastcall__ _sysrename (const char* oldpath, const char* newpath)
size_t oldpathlen, newpathlen;
oldpathlen = strlen (oldpath);
newpathlen = strlen (newpath);
if (oldpathlen + newpathlen > 254) {
if (oldpathlen + newpathlen > 510) {
return _mappederrno (EINVAL);
}
while (oldpathlen) {

View File

@ -5,7 +5,7 @@ int __fastcall__ write (int fildes, const void* buf, unsigned count)
{
int ax, total = 0;
while (count) {
int blockcount = (count > 256) ? 256 : count;
int blockcount = (count > 512) ? 512 : count;
ax = write_xstack (&((char*)buf)[total], blockcount, fildes);
if (ax < 0) {
return ax;

View File

@ -1,8 +1,12 @@
#include <rp6502.h>
#include <errno.h>
int __fastcall__ write_xstack (const void* buf, unsigned count, int fildes)
{
unsigned i;
if (count > 512) {
return _mappederrno (EINVAL);
}
for (i = count; i;) {
ria_push_char (((char*)buf)[--i]);
}

19
libsrc/rp6502/xregn.c Normal file
View File

@ -0,0 +1,19 @@
#include <rp6502.h>
#include <stdarg.h>
int __cdecl__ xregn (char device, char channel, unsigned char address, unsigned count,
...)
{
va_list args;
va_start (args, count);
RIA.xstack = device;
RIA.xstack = channel;
RIA.xstack = address;
while (count--) {
unsigned v = va_arg (args, unsigned);
RIA.xstack = v >> 8;
RIA.xstack = v;
}
va_end (args);
return ria_call_int_errno (RIA_OP_XREG);
}