diff --git a/asminc/rp6502.inc b/asminc/rp6502.inc index 816712abb..1d850ec80 100644 --- a/asminc/rp6502.inc +++ b/asminc/rp6502.inc @@ -34,9 +34,10 @@ RIA_OP_EXIT := $FF RIA_OP_ZXSTACK := $00 RIA_OP_XREG := $01 RIA_OP_PHI2 := $02 -RIA_OP_CODEPAGE := $03 +RIA_OP_CODE_PAGE := $03 RIA_OP_LRAND := $04 RIA_OP_STDIN_OPT := $05 +RIA_OP_ERRNO_OPT := $06 RIA_OP_CLOCK := $0F RIA_OP_CLOCK_GETRES := $10 RIA_OP_CLOCK_GETTIME := $11 @@ -49,8 +50,27 @@ RIA_OP_READ_XRAM := $17 RIA_OP_WRITE_XSTACK := $18 RIA_OP_WRITE_XRAM := $19 RIA_OP_LSEEK := $1A +RIA_OP_LSEEK_CC65 := $1A RIA_OP_UNLINK := $1B RIA_OP_RENAME := $1C +RIA_OP_LSEEK_LLVM := $1D +RIA_OP_SYNCFS := $1E +RIA_OP_STAT := $1F +RIA_OP_OPENDIR := $20 +RIA_OP_READDIR := $21 +RIA_OP_CLOSEDIR := $22 +RIA_OP_TELLDIR := $23 +RIA_OP_SEEKDIR := $24 +RIA_OP_REWINDDIR := $25 +RIA_OP_CHMOD := $26 +RIA_OP_UTIME := $27 +RIA_OP_MKDIR := $28 +RIA_OP_CHDIR := $29 +RIA_OP_CHDRIVE := $2A +RIA_OP_GETCWD := $2B +RIA_OP_SETLABEL := $2C +RIA_OP_GETLABEL := $2D +RIA_OP_GETFREE := $2E ; 6522 VIA VIA := $FFD0 ; VIA base address @@ -72,27 +92,3 @@ VIA_PCR := VIA+$C ; Peripheral control register VIA_IFR := VIA+$D ; Interrupt flag register VIA_IER := VIA+$E ; Interrupt enable register VIA_PA2 := VIA+$F ; Port register A w/o handshake - -; Values in ___oserror are the union of these FatFs errors and errno.inc -.enum - FR_OK = 32 ; Succeeded - FR_DISK_ERR ; A hard error occurred in the low level disk I/O layer - FR_INT_ERR ; Assertion failed - FR_NOT_READY ; The physical drive cannot work - FR_NO_FILE ; Could not find the file - FR_NO_PATH ; Could not find the path - FR_INVALID_NAME ; The path name format is invalid - FR_DENIED ; Access denied due to prohibited access or directory full - FR_EXIST ; Access denied due to prohibited access - FR_INVALID_OBJECT ; The file/directory object is invalid - FR_WRITE_PROTECTED ; The physical drive is write protected - FR_INVALID_DRIVE ; The logical drive number is invalid - FR_NOT_ENABLED ; The volume has no work area - FR_NO_FILESYSTEM ; There is no valid FAT volume - FR_MKFS_ABORTED ; The f_mkfs() aborted due to any problem - FR_TIMEOUT ; Could not get a grant to access the volume within defined period - FR_LOCKED ; The operation is rejected according to the file sharing policy - FR_NOT_ENOUGH_CORE ; LFN working buffer could not be allocated - FR_TOO_MANY_OPEN_FILES ; Number of open files > FF_FS_LOCK - FR_INVALID_PARAMETER ; Given parameter is invalid -.endenum diff --git a/include/rp6502.h b/include/rp6502.h index 7deeebc4c..2c0e78b87 100644 --- a/include/rp6502.h +++ b/include/rp6502.h @@ -47,7 +47,7 @@ struct __RP6502 unsigned char step1; unsigned int addr1; unsigned char xstack; - unsigned int errno; + unsigned int errno_; unsigned char op; unsigned char irq; const unsigned char spin; @@ -86,20 +86,16 @@ void __fastcall__ ria_set_ax (unsigned int ax); int __fastcall__ ria_call_int (unsigned char op); long __fastcall__ ria_call_long (unsigned char op); -/* These run _mappederrno() on error */ - -int __fastcall__ ria_call_int_errno (unsigned char op); -long __fastcall__ ria_call_long_errno (unsigned char op); - /* OS operation numbers */ #define RIA_OP_EXIT 0xFF #define RIA_OP_ZXSTACK 0x00 #define RIA_OP_XREG 0x01 #define RIA_OP_PHI2 0x02 -#define RIA_OP_CODEPAGE 0x03 +#define RIA_OP_CODE_PAGE 0x03 #define RIA_OP_LRAND 0x04 #define RIA_OP_STDIN_OPT 0x05 +#define RIA_OP_ERRNO_OPT 0x06 #define RIA_OP_CLOCK 0x0F #define RIA_OP_CLOCK_GETRES 0x10 #define RIA_OP_CLOCK_GETTIME 0x11 @@ -112,27 +108,78 @@ long __fastcall__ ria_call_long_errno (unsigned char op); #define RIA_OP_WRITE_XSTACK 0x18 #define RIA_OP_WRITE_XRAM 0x19 #define RIA_OP_LSEEK 0x1A +#define RIA_OP_LSEEK_CC65 0x1A #define RIA_OP_UNLINK 0x1B #define RIA_OP_RENAME 0x1C +#define RIA_OP_LSEEK_LLVM 0x1D +#define RIA_OP_SYNCFS 0x1E +#define RIA_OP_STAT 0x1F +#define RIA_OP_OPENDIR 0x20 +#define RIA_OP_READDIR 0x21 +#define RIA_OP_CLOSEDIR 0x22 +#define RIA_OP_TELLDIR 0x23 +#define RIA_OP_SEEKDIR 0x24 +#define RIA_OP_REWINDDIR 0x25 +#define RIA_OP_CHMOD 0x26 +#define RIA_OP_UTIME 0x27 +#define RIA_OP_MKDIR 0x28 +#define RIA_OP_CHDIR 0x29 +#define RIA_OP_CHDRIVE 0x2A +#define RIA_OP_GETCWD 0x2B +#define RIA_OP_SETLABEL 0x2C +#define RIA_OP_GETLABEL 0x2D +#define RIA_OP_GETFREE 0x2E /* C API for the operating system. */ +typedef struct { + unsigned long fsize; + unsigned fdate; + unsigned ftime; + unsigned crdate; + unsigned crtime; + unsigned char fattrib; + char altname[12 + 1]; + char fname[255 + 1]; +} f_stat_t; + 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); -long lrand (void); +int __fastcall__ phi2 (void); +int __fastcall__ code_page (int); +long __fastcall__ lrand (void); int __fastcall__ stdin_opt (unsigned long ctrl_bits, unsigned char str_length); int __fastcall__ read_xstack (void* buf, unsigned count, int fildes); int __fastcall__ read_xram (unsigned buf, unsigned count, int fildes); int __fastcall__ write_xstack (const void* buf, unsigned count, int fildes); int __fastcall__ write_xram (unsigned buf, unsigned count, int fildes); +long __fastcall__ f_lseek (long offset, int whence, int fildes); +int __fastcall__ f_stat (const char* path, f_stat_t* dirent); +int __fastcall__ f_opendir (const char* name); +int __fastcall__ f_readdir (f_stat_t* dirent, int dirdes); +int __fastcall__ f_closedir (int dirdes); +long __fastcall__ f_telldir (int dirdes); +int __fastcall__ f_seekdir (long offs, int dirdes); +int __fastcall__ f_rewinddir (int dirdes); +int __fastcall__ f_chmod (const char* path, unsigned char attr, unsigned char mask); +int __fastcall__ f_utime (const char* path, unsigned fdate, unsigned ftime, unsigned crdate, unsigned crtime); +int __fastcall__ f_mkdir (const char* name); +int __fastcall__ f_chdrive (const char* name); +int __fastcall__ f_getcwd (char* name, int size); +int __fastcall__ f_setlabel (const char* name); +int __fastcall__ f_getlabel (const char* path, char* label); +int __fastcall__ f_getfree (const char* name, unsigned long* free, unsigned long* total); + +/* Time zone hack */ + +void ria_tzset (unsigned long time); /* XREG location helpers */ #define xreg_ria_keyboard(...) xreg(0, 0, 0, __VA_ARGS__) #define xreg_ria_mouse(...) xreg(0, 0, 1, __VA_ARGS__) +#define xreg_ria_gamepad(...) xreg(0, 0, 2, __VA_ARGS__) #define xreg_vga_canvas(...) xreg(1, 0, 0, __VA_ARGS__) #define xreg_vga_mode(...) xreg(1, 0, 1, __VA_ARGS__) @@ -237,30 +284,4 @@ typedef struct unsigned char has_opacity_metadata; // bool } vga_mode4_asprite_t; -/* Values in __oserror are the union of these FatFs errors and errno.h */ - -typedef enum -{ - FR_OK = 32, /* Succeeded */ - FR_DISK_ERR, /* A hard error occurred in the low level disk I/O layer */ - FR_INT_ERR, /* Assertion failed */ - FR_NOT_READY, /* The physical drive cannot work */ - FR_NO_FILE, /* Could not find the file */ - FR_NO_PATH, /* Could not find the path */ - FR_INVALID_NAME, /* The path name format is invalid */ - FR_DENIED, /* Access denied due to prohibited access or directory full */ - FR_EXIST, /* Access denied due to prohibited access */ - FR_INVALID_OBJECT, /* The file/directory object is invalid */ - FR_WRITE_PROTECTED, /* The physical drive is write protected */ - FR_INVALID_DRIVE, /* The logical drive number is invalid */ - FR_NOT_ENABLED, /* The volume has no work area */ - FR_NO_FILESYSTEM, /* There is no valid FAT volume */ - FR_MKFS_ABORTED, /* The f_mkfs() aborted due to any problem */ - FR_TIMEOUT, /* Could not get a grant to access the volume within defined period */ - FR_LOCKED, /* The operation is rejected according to the file sharing policy */ - FR_NOT_ENOUGH_CORE, /* LFN working buffer could not be allocated */ - FR_TOO_MANY_OPEN_FILES, /* Number of open files > FF_FS_LOCK */ - FR_INVALID_PARAMETER /* Given parameter is invalid */ -} FRESULT; - #endif /* _RP6502_H */ diff --git a/include/unistd.h b/include/unistd.h index 05b60f1fd..d48fe6f31 100644 --- a/include/unistd.h +++ b/include/unistd.h @@ -77,6 +77,7 @@ extern int optind, opterr, optopt; int __fastcall__ write (int fd, const void* buf, unsigned count); int __fastcall__ read (int fd, void* buf, unsigned count); off_t __fastcall__ lseek (int fd, off_t offset, int whence); +int __fastcall__ syncfs (int fd); int __fastcall__ unlink (const char* name); /* Same as remove() */ /* Directories */ @@ -98,6 +99,3 @@ int __fastcall__ exec (const char* progname, const char* cmdline); /* End of unistd.h */ #endif - - - diff --git a/libsrc/rp6502/chdir.s b/libsrc/rp6502/chdir.s new file mode 100644 index 000000000..bb467f671 --- /dev/null +++ b/libsrc/rp6502/chdir.s @@ -0,0 +1,14 @@ +; +; Ullrich von Bassewitz, 2003-08-12 +; +; int __fastcall__ chdir (const char* name); +; + + .export _chdir + + .import __syschdir + + +;-------------------------------------------------------------------------- + +_chdir = __syschdir diff --git a/libsrc/rp6502/close.c b/libsrc/rp6502/close.c index dd7e38115..1981baaae 100644 --- a/libsrc/rp6502/close.c +++ b/libsrc/rp6502/close.c @@ -1,8 +1,8 @@ #include -#include +#include int __fastcall__ close (int fd) { ria_set_ax (fd); - return ria_call_int_errno (RIA_OP_CLOSE); + return ria_call_int (RIA_OP_CLOSE); } diff --git a/libsrc/rp6502/code_page.c b/libsrc/rp6502/code_page.c new file mode 100644 index 000000000..b7baff27b --- /dev/null +++ b/libsrc/rp6502/code_page.c @@ -0,0 +1,7 @@ +#include + +int __fastcall__ code_page (int cp) +{ + ria_set_ax (cp); + return ria_call_int (RIA_OP_CODE_PAGE); +} diff --git a/libsrc/rp6502/codepage.c b/libsrc/rp6502/codepage.c deleted file mode 100644 index e28726f04..000000000 --- a/libsrc/rp6502/codepage.c +++ /dev/null @@ -1,6 +0,0 @@ -#include - -int __fastcall__ codepage (void) -{ - return ria_call_int (RIA_OP_CODEPAGE); -} diff --git a/libsrc/rp6502/crt0.s b/libsrc/rp6502/crt0.s index 32d565fda..5cf63b615 100644 --- a/libsrc/rp6502/crt0.s +++ b/libsrc/rp6502/crt0.s @@ -46,6 +46,6 @@ _exit: sta RIA_A plx stx RIA_X - lda #$FF ; exit() + lda #RIA_OP_EXIT sta RIA_OP stp diff --git a/libsrc/rp6502/errno.s b/libsrc/rp6502/errno.s new file mode 100644 index 000000000..a9a50afec --- /dev/null +++ b/libsrc/rp6502/errno.s @@ -0,0 +1,25 @@ +; +; 2003-08-12, Ullrich von Bassewitz +; 2015-09-24, Greg King +; +; extern int __errno; +; /* Library errors go here. */ +; + + .include "rp6502.inc" + .include "errno.inc" + .export ___errno + .import _ria_call_int + .constructor _errno_opt_constructor + +; The errno on the RIA is the errno for cc65 +___errno := RIA_ERRNO + +.code + +; Request the RIA use cc65 values for RIA_ERRNO +_errno_opt_constructor: + lda #$01 ; 1 = cc65 + sta RIA_A + lda #RIA_OP_ERRNO_OPT + jmp _ria_call_int diff --git a/libsrc/rp6502/f_chdrive.c b/libsrc/rp6502/f_chdrive.c new file mode 100644 index 000000000..8a3b8f93a --- /dev/null +++ b/libsrc/rp6502/f_chdrive.c @@ -0,0 +1,16 @@ +#include +#include +#include + +int __fastcall__ f_chdrive (const char* name) +{ + size_t namelen = strlen (name); + if (namelen > 255) { + errno = EINVAL; + return -1; + } + while (namelen) { + ria_push_char (name[--namelen]); + } + return ria_call_int (RIA_OP_CHDRIVE); +} diff --git a/libsrc/rp6502/f_chmod.c b/libsrc/rp6502/f_chmod.c new file mode 100644 index 000000000..7481cfb19 --- /dev/null +++ b/libsrc/rp6502/f_chmod.c @@ -0,0 +1,19 @@ +#include +#include +#include + +int __fastcall__ f_chmod (const char* path, unsigned char attr, unsigned char mask) +{ + size_t pathlen; + ria_set_a (mask); + pathlen = strlen (path); + if (pathlen > 255) { + errno = EINVAL; + return -1; + } + while (pathlen) { + ria_push_char (path[--pathlen]); + } + ria_push_char (attr); + return ria_call_int (RIA_OP_CHMOD); +} diff --git a/libsrc/rp6502/f_closedir.c b/libsrc/rp6502/f_closedir.c new file mode 100644 index 000000000..279483ca9 --- /dev/null +++ b/libsrc/rp6502/f_closedir.c @@ -0,0 +1,7 @@ +#include + +int __fastcall__ f_closedir (int dirdes) +{ + ria_set_ax (dirdes); + return ria_call_int (RIA_OP_CLOSEDIR); +} diff --git a/libsrc/rp6502/f_getcwd.c b/libsrc/rp6502/f_getcwd.c new file mode 100644 index 000000000..3473b81e1 --- /dev/null +++ b/libsrc/rp6502/f_getcwd.c @@ -0,0 +1,18 @@ +#include +#include +#include + +int __fastcall__ f_getcwd (char* name, int size) +{ + int i, ax; + ax = ria_call_int (RIA_OP_GETCWD); + if (ax > size) { + RIA.op = RIA_OP_ZXSTACK; + errno = ENOMEM; + return -1; + } + for (i = 0; i < ax; i++) { + name[i] = ria_pop_char (); + } + return ax; +} diff --git a/libsrc/rp6502/f_getfree.c b/libsrc/rp6502/f_getfree.c new file mode 100644 index 000000000..13240591f --- /dev/null +++ b/libsrc/rp6502/f_getfree.c @@ -0,0 +1,22 @@ +#include +#include +#include + +int __fastcall__ f_getfree (const char* name, unsigned long* free, unsigned long* total) +{ + int ax; + size_t namelen = strlen (name); + if (namelen > 255) { + errno = EINVAL; + return -1; + } + while (namelen) { + ria_push_char (name[--namelen]); + } + ax = ria_call_int (RIA_OP_GETFREE); + if (ax >= 0) { + *free = ria_pop_long (); + *total = ria_pop_long (); + } + return ax; +} diff --git a/libsrc/rp6502/f_getlabel.c b/libsrc/rp6502/f_getlabel.c new file mode 100644 index 000000000..89e72eac9 --- /dev/null +++ b/libsrc/rp6502/f_getlabel.c @@ -0,0 +1,21 @@ +#include +#include +#include + +int __fastcall__ f_getlabel (const char* path, char* label) +{ + int i, ax; + size_t pathlen = strlen (path); + if (pathlen > 255) { + errno = EINVAL; + return -1; + } + while (pathlen) { + ria_push_char (path[--pathlen]); + } + ax = ria_call_int (RIA_OP_GETLABEL); + for (i = 0; i < ax; i++) { + label[i] = ria_pop_char (); + } + return ax; +} diff --git a/libsrc/rp6502/f_lseek.c b/libsrc/rp6502/f_lseek.c new file mode 100644 index 000000000..ada9baab5 --- /dev/null +++ b/libsrc/rp6502/f_lseek.c @@ -0,0 +1,9 @@ +#include + +long __fastcall__ f_lseek (long offset, int whence, int fildes) +{ + ria_set_ax (fildes); + ria_push_long (offset); + ria_push_char (whence); + return ria_call_long (RIA_OP_LSEEK); +} diff --git a/libsrc/rp6502/f_mkdir.c b/libsrc/rp6502/f_mkdir.c new file mode 100644 index 000000000..b27c21fd7 --- /dev/null +++ b/libsrc/rp6502/f_mkdir.c @@ -0,0 +1,16 @@ +#include +#include +#include + +int __fastcall__ f_mkdir (const char* name) +{ + size_t namelen = strlen (name); + if (namelen > 255) { + errno = EINVAL; + return -1; + } + while (namelen) { + ria_push_char (name[--namelen]); + } + return ria_call_int (RIA_OP_MKDIR); +} diff --git a/libsrc/rp6502/f_opendir.c b/libsrc/rp6502/f_opendir.c new file mode 100644 index 000000000..29faf776e --- /dev/null +++ b/libsrc/rp6502/f_opendir.c @@ -0,0 +1,16 @@ +#include +#include +#include + +int __fastcall__ f_opendir (const char* name) +{ + size_t namelen = strlen (name); + if (namelen > 255) { + errno = EINVAL; + return -1; + } + while (namelen) { + ria_push_char (name[--namelen]); + } + return ria_call_int (RIA_OP_OPENDIR); +} diff --git a/libsrc/rp6502/f_readdir.c b/libsrc/rp6502/f_readdir.c new file mode 100644 index 000000000..45777c221 --- /dev/null +++ b/libsrc/rp6502/f_readdir.c @@ -0,0 +1,12 @@ +#include + +int __fastcall__ f_readdir (f_stat_t* dirent, int dirdes) +{ + int i, ax; + ria_set_ax (dirdes); + ax = ria_call_int (RIA_OP_READDIR); + for (i = 0; i < sizeof (f_stat_t); i++) { + ((char*)dirent)[i] = ria_pop_char (); + } + return ax; +} diff --git a/libsrc/rp6502/f_rewinddir.c b/libsrc/rp6502/f_rewinddir.c new file mode 100644 index 000000000..bd2ebaa1b --- /dev/null +++ b/libsrc/rp6502/f_rewinddir.c @@ -0,0 +1,7 @@ +#include + +int __fastcall__ f_rewinddir (int dirdes) +{ + ria_set_ax (dirdes); + return ria_call_int (RIA_OP_REWINDDIR); +} diff --git a/libsrc/rp6502/f_seekdir.c b/libsrc/rp6502/f_seekdir.c new file mode 100644 index 000000000..5c6890e3d --- /dev/null +++ b/libsrc/rp6502/f_seekdir.c @@ -0,0 +1,8 @@ +#include + +int __fastcall__ f_seekdir (long offs, int dirdes) +{ + ria_set_ax (dirdes); + ria_push_long (offs); + return ria_call_int (RIA_OP_SEEKDIR); +} diff --git a/libsrc/rp6502/f_setlabel.c b/libsrc/rp6502/f_setlabel.c new file mode 100644 index 000000000..0cf77ea15 --- /dev/null +++ b/libsrc/rp6502/f_setlabel.c @@ -0,0 +1,16 @@ +#include +#include +#include + +int __fastcall__ f_setlabel (const char* name) +{ + size_t namelen = strlen (name); + if (namelen > 255) { + errno = EINVAL; + return -1; + } + while (namelen) { + ria_push_char (name[--namelen]); + } + return ria_call_int (RIA_OP_SETLABEL); +} diff --git a/libsrc/rp6502/f_stat.c b/libsrc/rp6502/f_stat.c new file mode 100644 index 000000000..3e3845639 --- /dev/null +++ b/libsrc/rp6502/f_stat.c @@ -0,0 +1,21 @@ +#include +#include +#include + +int __fastcall__ f_stat (const char* path, f_stat_t* dirent) +{ + int i, ax; + size_t pathlen = strlen (path); + if (pathlen > 255) { + errno = EINVAL; + return -1; + } + while (pathlen) { + ria_push_char (path[--pathlen]); + } + ax = ria_call_int (RIA_OP_STAT); + for (i = 0; i < sizeof (f_stat_t); i++) { + ((char*)dirent)[i] = ria_pop_char (); + } + return ax; +} diff --git a/libsrc/rp6502/f_telldir.c b/libsrc/rp6502/f_telldir.c new file mode 100644 index 000000000..1396e0a88 --- /dev/null +++ b/libsrc/rp6502/f_telldir.c @@ -0,0 +1,7 @@ +#include + +long __fastcall__ f_telldir (int dirdes) +{ + ria_set_ax (dirdes); + return ria_call_long (RIA_OP_TELLDIR); +} diff --git a/libsrc/rp6502/f_utime.c b/libsrc/rp6502/f_utime.c new file mode 100644 index 000000000..a5c3e9753 --- /dev/null +++ b/libsrc/rp6502/f_utime.c @@ -0,0 +1,21 @@ +#include +#include +#include + +int __fastcall__ f_utime (const char* path, unsigned fdate, unsigned ftime, unsigned crdate, unsigned crtime) +{ + size_t pathlen; + ria_set_ax (crtime); + pathlen = strlen (path); + if (pathlen > 255) { + errno = EINVAL; + return -1; + } + while (pathlen) { + ria_push_char (path[--pathlen]); + } + ria_push_int (fdate); + ria_push_int (ftime); + ria_push_int (crdate); + return ria_call_int (RIA_OP_UTIME); +} diff --git a/libsrc/rp6502/gettime.c b/libsrc/rp6502/gettime.c index ee63c31ec..339ddeadb 100644 --- a/libsrc/rp6502/gettime.c +++ b/libsrc/rp6502/gettime.c @@ -5,8 +5,6 @@ extern int __clock_gettimespec (struct timespec* ts, unsigned char op); int clock_gettime (clockid_t clock_id, struct timespec* tp) { - (void)clock_id; - /* time.s doesn't set the stack value for clock_id (bug?) */ - ria_set_ax (CLOCK_REALTIME); + ria_set_ax (clock_id); return __clock_gettimespec (tp, RIA_OP_CLOCK_GETTIME); } diff --git a/libsrc/rp6502/gettimespec.c b/libsrc/rp6502/gettimespec.c index 4dc3a0db3..5a07a46d8 100644 --- a/libsrc/rp6502/gettimespec.c +++ b/libsrc/rp6502/gettimespec.c @@ -4,7 +4,7 @@ int __clock_gettimespec (struct timespec* ts, unsigned char op) /* Internal method shared by clock_getres and clock_gettime. */ { - int ax = ria_call_int_errno (op); + int ax = ria_call_int (op); if (ax >= 0) { ts->tv_sec = ria_pop_long (); ts->tv_nsec = ria_pop_long (); diff --git a/libsrc/rp6502/gettimezone.c b/libsrc/rp6502/gettimezone.c index f3cb2a061..4c4584c07 100644 --- a/libsrc/rp6502/gettimezone.c +++ b/libsrc/rp6502/gettimezone.c @@ -1,11 +1,12 @@ #include #include -int clock_gettimezone (clockid_t clock_id, struct _timezone* tz) +int clock_gettimezone (time_t time, clockid_t clock_id, struct _timezone* tz) { int ax; ria_set_ax (clock_id); - ax = ria_call_int_errno (RIA_OP_CLOCK_GETTIMEZONE); + ria_push_long (time); + ax = ria_call_int (RIA_OP_CLOCK_GETTIMEZONE); if (ax >= 0) { char i; for (i = 0; i < sizeof (struct _timezone); i++) { diff --git a/libsrc/rp6502/lseek.c b/libsrc/rp6502/lseek.c index 29506612c..a40c7318d 100644 --- a/libsrc/rp6502/lseek.c +++ b/libsrc/rp6502/lseek.c @@ -3,9 +3,8 @@ off_t __fastcall__ lseek (int fd, off_t offset, int whence) { - /* Modified argument order for short stacking offset */ ria_push_long (offset); ria_push_char (whence); ria_set_ax (fd); - return ria_call_long_errno (RIA_OP_LSEEK); + return ria_call_long (RIA_OP_LSEEK); } diff --git a/libsrc/rp6502/open.c b/libsrc/rp6502/open.c index ab3a374a2..5750eb769 100644 --- a/libsrc/rp6502/open.c +++ b/libsrc/rp6502/open.c @@ -1,16 +1,18 @@ #include #include #include +#include int __cdecl__ open (const char* name, int flags, ...) { size_t namelen = strlen (name); if (namelen > 255) { - return _mappederrno (EINVAL); + errno = EINVAL; + return -1; } while (namelen) { ria_push_char (name[--namelen]); } ria_set_ax (flags); - return ria_call_int_errno (RIA_OP_OPEN); + return ria_call_int (RIA_OP_OPEN); } diff --git a/libsrc/rp6502/oserrlist.s b/libsrc/rp6502/oserrlist.s deleted file mode 100644 index ef322e293..000000000 --- a/libsrc/rp6502/oserrlist.s +++ /dev/null @@ -1,86 +0,0 @@ -; -; 2002-07-18, Ullrich von Bassewitz -; 2022, ChaN -; 2023, Rumbledethumps -; -; Defines the platform-specific error list. -; -; The table is built as a list of entries: -; -; .byte entrylen -; .byte errorcode -; .asciiz errormsg -; -; and, terminated by an entry with length zero that is returned if the -; error code could not be found. -; - -.export __sys_oserrlist - -.include "rp6502.inc" -.include "errno.inc" - -;---------------------------------------------------------------------------- -; Macros used to generate the list (may get moved to an include file?) - -; Regular entry -.macro sys_oserr_entry code, msg - .local Start, End -Start: - .byte End - Start - .byte code - .asciiz msg -End: -.endmacro - -; Sentinel entry -.macro sys_oserr_sentinel msg - .byte 0 ; Length is always zero - .byte 0 ; Code is unused - .asciiz msg -.endmacro - -;---------------------------------------------------------------------------- -; The error message table - -.rodata -__sys_oserrlist: - - sys_oserr_entry ENOENT , "No such file or directory" - sys_oserr_entry ENOMEM , "Out of memory" - sys_oserr_entry EACCES , "Permission denied" - sys_oserr_entry ENODEV , "No such device" - sys_oserr_entry EMFILE , "Too many open files" - sys_oserr_entry EBUSY , "Device or resource busy" - sys_oserr_entry EINVAL , "Invalid argument" - sys_oserr_entry ENOSPC , "No space left on device" - sys_oserr_entry EEXIST , "File exists" - sys_oserr_entry EAGAIN , "Try again" - sys_oserr_entry EIO , "I/O error" - sys_oserr_entry EINTR , "Interrupted system call" - sys_oserr_entry ENOSYS , "Function not implemented" - sys_oserr_entry ESPIPE , "Illegal seek" - sys_oserr_entry ERANGE , "Range error" - sys_oserr_entry EBADF , "Bad file number" - sys_oserr_entry ENOEXEC , "Exec format error" - sys_oserr_entry EUNKNOWN , "Unknown OS specific error" - sys_oserr_entry FR_DISK_ERR , "A hard error occurred in the low level disk I/O layer" - sys_oserr_entry FR_INT_ERR , "Assertion failed" - sys_oserr_entry FR_NOT_READY , "The physical drive cannot work" - sys_oserr_entry FR_NO_FILE , "Could not find the file" - sys_oserr_entry FR_NO_PATH , "Could not find the path" - sys_oserr_entry FR_INVALID_NAME , "The path name format is invalid" - sys_oserr_entry FR_DENIED , "Access denied due to prohibited access or directory full" - sys_oserr_entry FR_EXIST , "Access denied due to prohibited access" - sys_oserr_entry FR_INVALID_OBJECT , "The file/directory object is invalid" - sys_oserr_entry FR_WRITE_PROTECTED , "The physical drive is write protected" - sys_oserr_entry FR_INVALID_DRIVE , "The logical drive number is invalid" - sys_oserr_entry FR_NOT_ENABLED , "The volume has no work area" - sys_oserr_entry FR_NO_FILESYSTEM , "There is no valid FAT volume" - sys_oserr_entry FR_MKFS_ABORTED , "The f_mkfs() aborted due to any problem" - sys_oserr_entry FR_TIMEOUT , "Could not get a grant to access the volume within defined period" - sys_oserr_entry FR_LOCKED , "The operation is rejected according to the file sharing policy" - sys_oserr_entry FR_NOT_ENOUGH_CORE , "LFN working buffer could not be allocated" - sys_oserr_entry FR_TOO_MANY_OPEN_FILES , "Number of open files > FF_FS_LOCK" - sys_oserr_entry FR_INVALID_PARAMETER , "Given parameter is invalid" - sys_oserr_sentinel "Unknown error" diff --git a/libsrc/rp6502/oserror.s b/libsrc/rp6502/oserror.s deleted file mode 100644 index 706bcfa65..000000000 --- a/libsrc/rp6502/oserror.s +++ /dev/null @@ -1,66 +0,0 @@ -; -; 2000-05-17, Ullrich von Bassewitz -; 2022, ChaN -; 2023, Rumbledethumps -; -; int __fastcall__ __osmaperrno (unsigned char oserror); -; -; RP6502 will respond with a union of CC65 and FatFs errnos. -; This will map FatFs errors into the CC65 range for portable code. - -EFATFS_START := 32 - -.include "rp6502.inc" -.include "errno.inc" - -.code - -___osmaperrno: - cmp #EFATFS_START - bmi @L2 - - ldx #ErrTabSize -@L1: - cmp ErrTab-2,x ; Search for the error code - beq @L3 ; Jump if found - dex - dex - bne @L1 ; Next entry - -; Code not found, return EUNKNOWN - lda #EUNKNOWN -@L2: - rts - -; Found the code -@L3: - lda ErrTab-1,x - ldx #$00 ; High byte always zero - rts - -.rodata - -ErrTab: - - .byte FR_DISK_ERR , EIO ; A hard error occurred in the low level disk I/O layer -; .byte FR_INT_ERR , EUNKNOWN ; Assertion failed - .byte FR_NOT_READY , EBUSY ; The physical drive cannot work - .byte FR_NO_FILE , ENOENT ; Could not find the file - .byte FR_NO_PATH , ENOENT ; Could not find the path - .byte FR_INVALID_NAME , EINVAL ; The path name format is invalid - .byte FR_DENIED , EACCES ; Access denied due to prohibited access or directory full - .byte FR_EXIST , EEXIST ; Access denied due to prohibited access - .byte FR_INVALID_OBJECT , EINVAL ; The file/directory object is invalid - .byte FR_WRITE_PROTECTED , EACCES ; The physical drive is write protected - .byte FR_INVALID_DRIVE , ENODEV ; The logical drive number is invalid -; .byte FR_NOT_ENABLED , EUNKNOWN ; The volume has no work area -; .byte FR_NO_FILESYSTEM , EUNKNOWN ; There is no valid FAT volume -; .byte FR_MKFS_ABORTED , EUNKNOWN ; The f_mkfs() aborted due to any problem -; .byte FR_TIMEOUT , EUNKNOWN ; Could not get a grant to access the volume within defined period - .byte FR_LOCKED , EBUSY ; The operation is rejected according to the file sharing policy - .byte FR_NOT_ENOUGH_CORE , ENOMEM ; LFN working buffer could not be allocated - .byte FR_TOO_MANY_OPEN_FILES , EMFILE ; Number of open files > FF_FS_LOCK - .byte FR_INVALID_PARAMETER , EINVAL ; Given parameter is invalid - -ErrTabSize = (* - ErrTab) diff --git a/libsrc/rp6502/read_xram.c b/libsrc/rp6502/read_xram.c index f88a036ee..e14ac29d4 100644 --- a/libsrc/rp6502/read_xram.c +++ b/libsrc/rp6502/read_xram.c @@ -5,5 +5,5 @@ int __fastcall__ read_xram (unsigned buf, unsigned count, int fildes) ria_push_int (buf); ria_push_int (count); ria_set_ax (fildes); - return ria_call_int_errno (RIA_OP_READ_XRAM); + return ria_call_int (RIA_OP_READ_XRAM); } diff --git a/libsrc/rp6502/read_xstack.c b/libsrc/rp6502/read_xstack.c index 70eebad2f..952323f32 100644 --- a/libsrc/rp6502/read_xstack.c +++ b/libsrc/rp6502/read_xstack.c @@ -5,7 +5,7 @@ int __fastcall__ read_xstack (void* buf, unsigned count, int fildes) int i, ax; ria_push_int (count); ria_set_ax (fildes); - ax = ria_call_int_errno (RIA_OP_READ_XSTACK); + ax = ria_call_int (RIA_OP_READ_XSTACK); for (i = 0; i < ax; i++) { ((char*)buf)[i] = ria_pop_char (); } diff --git a/libsrc/rp6502/remove.s b/libsrc/rp6502/remove.s new file mode 100644 index 000000000..3bd91001d --- /dev/null +++ b/libsrc/rp6502/remove.s @@ -0,0 +1,14 @@ +; +; Ullrich von Bassewitz, 2003-08-12 +; +; int __fastcall__ remove (const char* name); +; + + .export _remove + + .import __sysremove + + +;-------------------------------------------------------------------------- + +_remove = __sysremove diff --git a/libsrc/rp6502/rename.s b/libsrc/rp6502/rename.s new file mode 100644 index 000000000..0b85a6134 --- /dev/null +++ b/libsrc/rp6502/rename.s @@ -0,0 +1,14 @@ +; +; Ullrich von Bassewitz, 2003-08-12 +; +; int __fastcall__ rename (const char* oldname, const char* newname); +; + + .export _rename + + .import __sysrename + + +;-------------------------------------------------------------------------- + +_rename = __sysrename diff --git a/libsrc/rp6502/ria.s b/libsrc/rp6502/ria.s index 78da4daba..5fb858a03 100644 --- a/libsrc/rp6502/ria.s +++ b/libsrc/rp6502/ria.s @@ -9,10 +9,8 @@ .export _ria_pop_long, _ria_pop_int .export _ria_set_axsreg, _ria_set_ax .export _ria_call_int, _ria_call_long -.export _ria_call_int_errno, _ria_call_long_errno -.importzp c_sp, sreg -.import ___mappederrno, incsp1 +.importzp sreg .code @@ -69,21 +67,3 @@ _ria_call_long: ldy RIA_SREG+1 sty sreg+1 rts - -; int __fastcall__ ria_call_int_errno(unsigned char op); -_ria_call_int_errno: - sta RIA_OP - jsr RIA_SPIN - ldx RIA_X - bmi ERROR - rts - -; long __fastcall__ ria_call_long_errno(unsigned char op); -_ria_call_long_errno: - jsr _ria_call_long - bmi ERROR - rts - -ERROR: - lda RIA_ERRNO - jmp ___mappederrno diff --git a/libsrc/rp6502/ria_tzset.c b/libsrc/rp6502/ria_tzset.c new file mode 100644 index 000000000..3f39e44f2 --- /dev/null +++ b/libsrc/rp6502/ria_tzset.c @@ -0,0 +1,9 @@ +#include +#include + +int clock_gettimezone (time_t time, clockid_t clock_id, struct _timezone* tz); + +void ria_tzset (unsigned long time) +{ + clock_gettimezone (time, CLOCK_REALTIME, &_tz); +} diff --git a/libsrc/rp6502/settime.c b/libsrc/rp6502/settime.c index 1ba1d2e3e..4b7f8c73e 100644 --- a/libsrc/rp6502/settime.c +++ b/libsrc/rp6502/settime.c @@ -6,5 +6,5 @@ int clock_settime (clockid_t clock_id, const struct timespec* tp) ria_set_ax (clock_id); ria_push_long (tp->tv_nsec); ria_push_long (tp->tv_sec); - return ria_call_int_errno (RIA_OP_CLOCK_SETTIME); + return ria_call_int (RIA_OP_CLOCK_SETTIME); } diff --git a/libsrc/rp6502/stdin_opt.c b/libsrc/rp6502/stdin_opt.c index 3a9ccfde4..ddc1869a1 100644 --- a/libsrc/rp6502/stdin_opt.c +++ b/libsrc/rp6502/stdin_opt.c @@ -1,9 +1,8 @@ - #include int __fastcall__ stdin_opt (unsigned long ctrl_bits, unsigned char str_length) { ria_push_long (ctrl_bits); ria_set_a (str_length); - return ria_call_int_errno (RIA_OP_STDIN_OPT); + return ria_call_int (RIA_OP_STDIN_OPT); } diff --git a/libsrc/rp6502/syncfs.c b/libsrc/rp6502/syncfs.c new file mode 100644 index 000000000..34c12a8f6 --- /dev/null +++ b/libsrc/rp6502/syncfs.c @@ -0,0 +1,8 @@ +#include +#include + +int __fastcall__ syncfs (int fd) +{ + ria_set_ax (fd); + return ria_call_int (RIA_OP_SYNCFS); +} diff --git a/libsrc/rp6502/syschdir.c b/libsrc/rp6502/syschdir.c new file mode 100644 index 000000000..98ad91e47 --- /dev/null +++ b/libsrc/rp6502/syschdir.c @@ -0,0 +1,16 @@ +#include +#include +#include + +int __fastcall__ _syschdir (const char* name) +{ + size_t namelen = strlen (name); + if (namelen > 255) { + errno = EINVAL; + return -1; + } + while (namelen) { + ria_push_char (name[--namelen]); + } + return ria_call_int (RIA_OP_CHDIR); +} diff --git a/libsrc/rp6502/sysremove.c b/libsrc/rp6502/sysremove.c index d8c1ced98..32010d5bf 100644 --- a/libsrc/rp6502/sysremove.c +++ b/libsrc/rp6502/sysremove.c @@ -2,15 +2,16 @@ #include #include -unsigned char __fastcall__ _sysremove (const char* name) +int __fastcall__ _sysremove (const char* name) { size_t namelen; namelen = strlen (name); if (namelen > 255) { - return _mappederrno (EINVAL); + RIA.errno_ = EINVAL; + return -1; } while (namelen) { ria_push_char (name[--namelen]); } - return ria_call_int_errno (RIA_OP_UNLINK); + return ria_call_int (RIA_OP_UNLINK); } diff --git a/libsrc/rp6502/sysrename.c b/libsrc/rp6502/sysrename.c index 46bdd8b31..09f971918 100644 --- a/libsrc/rp6502/sysrename.c +++ b/libsrc/rp6502/sysrename.c @@ -2,13 +2,14 @@ #include #include -unsigned char __fastcall__ _sysrename (const char* oldpath, const char* newpath) +int __fastcall__ _sysrename (const char* oldpath, const char* newpath) { size_t oldpathlen, newpathlen; oldpathlen = strlen (oldpath); newpathlen = strlen (newpath); if (oldpathlen + newpathlen > 510) { - return _mappederrno (EINVAL); + errno = EINVAL; + return -1; } while (oldpathlen) { ria_push_char (oldpath[--oldpathlen]); @@ -17,5 +18,5 @@ unsigned char __fastcall__ _sysrename (const char* oldpath, const char* newpath) while (newpathlen) { ria_push_char (newpath[--newpathlen]); } - return ria_call_int_errno (RIA_OP_RENAME); + return ria_call_int (RIA_OP_RENAME); } diff --git a/libsrc/rp6502/write_xram.c b/libsrc/rp6502/write_xram.c index 31a553813..0a46ec62c 100644 --- a/libsrc/rp6502/write_xram.c +++ b/libsrc/rp6502/write_xram.c @@ -2,8 +2,8 @@ int __fastcall__ write_xram (unsigned buf, unsigned count, int fildes) { + ria_set_ax (fildes); ria_push_int (buf); ria_push_int (count); - ria_set_ax (fildes); - return ria_call_int_errno (RIA_OP_WRITE_XRAM); + return ria_call_int (RIA_OP_WRITE_XRAM); } diff --git a/libsrc/rp6502/write_xstack.c b/libsrc/rp6502/write_xstack.c index 29285a87e..98c90c757 100644 --- a/libsrc/rp6502/write_xstack.c +++ b/libsrc/rp6502/write_xstack.c @@ -5,11 +5,12 @@ int __fastcall__ write_xstack (const void* buf, unsigned count, int fildes) { unsigned i; if (count > 512) { - return _mappederrno (EINVAL); + errno = EINVAL; + return -1; } for (i = count; i;) { ria_push_char (((char*)buf)[--i]); } ria_set_ax (fildes); - return ria_call_int_errno (RIA_OP_WRITE_XSTACK); + return ria_call_int (RIA_OP_WRITE_XSTACK); } diff --git a/libsrc/rp6502/xreg.s b/libsrc/rp6502/xreg.s index a882ab10f..140d60855 100644 --- a/libsrc/rp6502/xreg.s +++ b/libsrc/rp6502/xreg.s @@ -6,7 +6,7 @@ .export _xreg .importzp c_sp -.import addysp, _ria_call_int_errno +.import addysp, _ria_call_int .include "rp6502.inc" @@ -32,6 +32,6 @@ ; run RIA operation lda #RIA_OP_XREG - jmp _ria_call_int_errno + jmp _ria_call_int .endproc diff --git a/libsrc/rp6502/xregn.c b/libsrc/rp6502/xregn.c index ec040be20..eaa6aa7b7 100644 --- a/libsrc/rp6502/xregn.c +++ b/libsrc/rp6502/xregn.c @@ -15,5 +15,5 @@ int __cdecl__ xregn (char device, char channel, unsigned char address, unsigned RIA.xstack = v; } va_end (args); - return ria_call_int_errno (RIA_OP_XREG); + return ria_call_int (RIA_OP_XREG); }