From 815135f71680cbbcacbaeaa6f93cffa878e9d59c Mon Sep 17 00:00:00 2001 From: rumbledethumps <16963588+rumbledethumps@users.noreply.github.com> Date: Wed, 15 Oct 2025 23:41:44 -0700 Subject: [PATCH] chdir and friends --- include/rp6502.h | 8 ++++++++ libsrc/rp6502/chdir.s | 14 ++++++++++++++ libsrc/rp6502/f_chdrive.c | 16 ++++++++++++++++ libsrc/rp6502/f_chmod.c | 19 +++++++++++++++++++ libsrc/rp6502/f_mkdir.c | 16 ++++++++++++++++ libsrc/rp6502/f_utime.c | 21 +++++++++++++++++++++ libsrc/rp6502/syschdir.c | 16 ++++++++++++++++ 7 files changed, 110 insertions(+) create mode 100644 libsrc/rp6502/chdir.s create mode 100644 libsrc/rp6502/f_chdrive.c create mode 100644 libsrc/rp6502/f_chmod.c create mode 100644 libsrc/rp6502/f_mkdir.c create mode 100644 libsrc/rp6502/f_utime.c create mode 100644 libsrc/rp6502/syschdir.c diff --git a/include/rp6502.h b/include/rp6502.h index d40ba8a88..85916e390 100644 --- a/include/rp6502.h +++ b/include/rp6502.h @@ -162,6 +162,14 @@ 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, unsigned len); +// int __fastcall__ f_setlabel(const char* name); +// int __fastcall__ f_getlabel(const char* path, char* label); +// int __fastcall__ f_getfree(const char* name); /* Time zone hack */ 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/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_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_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/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); +}