From dabaf8451f444989485bd9a7b58fee4901ab1d47 Mon Sep 17 00:00:00 2001 From: Jeff Epler Date: Sat, 28 Jun 2025 14:29:21 +0200 Subject: [PATCH] Start on vfs_mac --- extmod/modos.c | 3 ++ extmod/vfs_posix.c | 10 ----- ports/m68kmac/Makefile | 3 ++ ports/m68kmac/macutil.c | 6 +++ ports/m68kmac/macutil.h | 4 ++ ports/m68kmac/main.c | 27 ------------- ports/m68kmac/mpconfigport.h | 10 +++-- ports/m68kmac/vfs_mac.c | 73 ++++++++++++++++++++++++++++++++++++ 8 files changed, 95 insertions(+), 41 deletions(-) create mode 100644 ports/m68kmac/macutil.c create mode 100644 ports/m68kmac/macutil.h create mode 100644 ports/m68kmac/vfs_mac.c diff --git a/extmod/modos.c b/extmod/modos.c index 69fdc3fac0..05b43c2222 100644 --- a/extmod/modos.c +++ b/extmod/modos.c @@ -214,6 +214,9 @@ static const mp_rom_map_elem_t os_module_globals_table[] = { #if MICROPY_VFS_POSIX { MP_ROM_QSTR(MP_QSTR_VfsPosix), MP_ROM_PTR(&mp_type_vfs_posix) }, #endif + #if defined(MICROPY_VFS_PORT) + MICROPY_VFS_PORT, + #endif #endif #if MICROPY_MBFS diff --git a/extmod/vfs_posix.c b/extmod/vfs_posix.c index 60e4cecc04..bd9a6d8406 100644 --- a/extmod/vfs_posix.c +++ b/extmod/vfs_posix.c @@ -42,9 +42,7 @@ #include #include #include -#if MICROPY_VFS_POSIX_DIRENT #include -#endif #ifdef _MSC_VER #include // For mkdir etc. #endif @@ -200,7 +198,6 @@ static mp_obj_t vfs_posix_getcwd(mp_obj_t self_in) { } static MP_DEFINE_CONST_FUN_OBJ_1(vfs_posix_getcwd_obj, vfs_posix_getcwd); -#if MICROPY_VFS_POSIX_DIRENT typedef struct _vfs_posix_ilistdir_it_t { mp_obj_base_t base; mp_fun_1_t iternext; @@ -278,10 +275,8 @@ static mp_obj_t vfs_posix_ilistdir_it_del(mp_obj_t self_in) { } return mp_const_none; } -#endif static mp_obj_t vfs_posix_ilistdir(mp_obj_t self_in, mp_obj_t path_in) { - #if MICROPY_VFS_POSIX_DIRENT mp_obj_vfs_posix_t *self = MP_OBJ_TO_PTR(self_in); vfs_posix_ilistdir_it_t *iter = mp_obj_malloc_with_finaliser(vfs_posix_ilistdir_it_t, &mp_type_polymorph_iter_with_finaliser); iter->iternext = vfs_posix_ilistdir_it_iternext; @@ -298,18 +293,13 @@ static mp_obj_t vfs_posix_ilistdir(mp_obj_t self_in, mp_obj_t path_in) { mp_raise_OSError(errno); } return MP_OBJ_FROM_PTR(iter); - #else - mp_raise_OSError(EINVAL); - #endif } static MP_DEFINE_CONST_FUN_OBJ_2(vfs_posix_ilistdir_obj, vfs_posix_ilistdir); typedef struct _mp_obj_listdir_t { mp_obj_base_t base; mp_fun_1_t iternext; - #if MICROPY_VFS_POSIX_DIRENT DIR *dir; - #endif } mp_obj_listdir_t; static mp_obj_t vfs_posix_mkdir(mp_obj_t self_in, mp_obj_t path_in) { diff --git a/ports/m68kmac/Makefile b/ports/m68kmac/Makefile index ce212caced..770156b4b3 100644 --- a/ports/m68kmac/Makefile +++ b/ports/m68kmac/Makefile @@ -38,6 +38,8 @@ LIBS = SRC_C = \ main.c \ + vfs_mac.c \ + macutil.c \ SRC_C += \ $(BUILD)/_frozen_mpy.c \ @@ -56,6 +58,7 @@ SRC_S += \ shared/runtime/gchelper_m68k.S \ SRC_QSTR += \ + vfs_mac.c \ shared/readline/readline.c \ shared/runtime/pyexec.c \ diff --git a/ports/m68kmac/macutil.c b/ports/m68kmac/macutil.c new file mode 100644 index 0000000000..0e580f79f3 --- /dev/null +++ b/ports/m68kmac/macutil.c @@ -0,0 +1,6 @@ +#include +#include "macutil.h" + +mp_obj_t new_str_from_pstr(Byte *pStr) { + return mp_obj_new_str((const char *)pStr + 1, *pStr); +} diff --git a/ports/m68kmac/macutil.h b/ports/m68kmac/macutil.h new file mode 100644 index 0000000000..491a90795a --- /dev/null +++ b/ports/m68kmac/macutil.h @@ -0,0 +1,4 @@ +#include +#include "Multiverse.h" + +extern mp_obj_t new_str_from_pstr(Byte *pStr); diff --git a/ports/m68kmac/main.c b/ports/m68kmac/main.c index 654a4edf2c..7176cc73ae 100644 --- a/ports/m68kmac/main.c +++ b/ports/m68kmac/main.c @@ -118,33 +118,6 @@ void MP_NORETURN __fatal_error(const char *msg) { } } -char *getcwd(char buf[], size_t size) { - snprintf(buf, size, "/"); - return buf; -} - -int mkdir(const char *pathname) { - errno = -EINVAL; - return -1; -} - -int rmdir(const char *pathname) { - errno = -EINVAL; - return -1; -} - -int chdir(const char *pathname) { - if (strcmp(pathname, "/") == 0 || strcmp(pathname, ".") == 0 || strcmp(pathname, "") == 0) { - return 0; - } - errno = -ENOENT; - return -1; -} - -int fsync(int fd) { - return 0; -} - #ifndef NDEBUG void MP_WEAK __assert_func(const char *file, int line, const char *func, const char *expr) { printf("Assertion '%s' failed, at file %s:%d\n", expr, file, line); diff --git a/ports/m68kmac/mpconfigport.h b/ports/m68kmac/mpconfigport.h index fcd88a08ac..e10498847a 100644 --- a/ports/m68kmac/mpconfigport.h +++ b/ports/m68kmac/mpconfigport.h @@ -23,12 +23,10 @@ #define MICROPY_STACK_CHECK (0) #define MICROPY_LONGINT_IMPL (MICROPY_LONGINT_IMPL_MPZ) #define MICROPY_FLOAT_IMPL (MICROPY_FLOAT_IMPL_FLOAT) -#define MICROPY_READER_POSIX (1) +#define MICROPY_READER_POSIX (0) #define MICROPY_READER_VFS (1) #define MICROPY_VFS (1) -#define MICROPY_VFS_POSIX (1) #define MICROPY_PY_OS_STATVFS (0) -#define MICROPY_VFS_POSIX_DIRENT (0) #define MP_SSIZE_MAX LONG_MAX @@ -46,10 +44,14 @@ typedef long mp_off_t; // We need to provide a declaration/definition of alloca() #include -#define MICROPY_HW_BOARD_NAME "minimal" +#define MICROPY_HW_BOARD_NAME "macplus" #define MICROPY_HW_MCU_NAME "m68000" #define MICROPY_MIN_USE_STDOUT (0) #define MICROPY_HEAP_SIZE (100 * 1024) #define MP_STATE_PORT MP_STATE_VM + +typedef struct _mp_obj_type_t mp_obj_type_t; +extern const mp_obj_type_t mp_type_vfs_mac; +#define MICROPY_VFS_PORT { MP_ROM_QSTR(MP_QSTR_VfsMac), MP_ROM_PTR(&mp_type_vfs_mac) } diff --git a/ports/m68kmac/vfs_mac.c b/ports/m68kmac/vfs_mac.c new file mode 100644 index 0000000000..46eaec9f1e --- /dev/null +++ b/ports/m68kmac/vfs_mac.c @@ -0,0 +1,73 @@ +#include "py/mpconfig.h" +#include "py/obj.h" +#include "py/runtime.h" +#include "extmod/vfs.h" + +#include "macutil.h" + +typedef struct _mp_obj_vfs_mac_t { + mp_obj_base_t base; + vstr_t root; + size_t root_len; + bool readonly; +} mp_obj_vfs_mac_t; + +static mp_obj_t vfs_mac_make_new(const mp_obj_type_t *type, size_t n_args, size_t n_kw, const mp_obj_t *args) { + mp_arg_check_num(n_args, n_kw, 1, 1, false); + + // create new object + mp_obj_vfs_mac_t *vfs = mp_obj_malloc(mp_obj_vfs_mac_t, type); + + return MP_OBJ_FROM_PTR(vfs); +} + +static mp_obj_t volumes(mp_obj_t self_in) { + mp_obj_t result = mp_obj_list_make_new(&mp_type_list, 0, 0, NULL); + VCB *vol = (VCB *)LMGetVCBQHdr().qHead; + mp_obj_t args[3]; + mp_load_method(result, MP_QSTR_append, args); + while (vol) { + args[2] = new_str_from_pstr(vol->vcbVN + 1); + mp_call_method_n_kw(1, 0, args); + vol = (VCB *)vol->qLink; + } + return result; +} +MP_DEFINE_CONST_FUN_OBJ_1(volumes_obj, volumes); + +static const mp_rom_map_elem_t vfs_mac_locals_dict_table[] = { + { MP_ROM_QSTR(MP_QSTR_volumes), MP_ROM_PTR(&volumes_obj) }, + #if 0 + { MP_ROM_QSTR(MP_QSTR_mount), MP_ROM_PTR(&vfs_mac_mount_obj) }, + { MP_ROM_QSTR(MP_QSTR_umount), MP_ROM_PTR(&vfs_mac_umount_obj) }, + { MP_ROM_QSTR(MP_QSTR_open), MP_ROM_PTR(&vfs_mac_open_obj) }, + + { MP_ROM_QSTR(MP_QSTR_chdir), MP_ROM_PTR(&vfs_mac_chdir_obj) }, + { MP_ROM_QSTR(MP_QSTR_getcwd), MP_ROM_PTR(&vfs_mac_getcwd_obj) }, + { MP_ROM_QSTR(MP_QSTR_ilistdir), MP_ROM_PTR(&vfs_mac_ilistdir_obj) }, + { MP_ROM_QSTR(MP_QSTR_mkdir), MP_ROM_PTR(&vfs_mac_mkdir_obj) }, + { MP_ROM_QSTR(MP_QSTR_remove), MP_ROM_PTR(&vfs_mac_remove_obj) }, + { MP_ROM_QSTR(MP_QSTR_rename), MP_ROM_PTR(&vfs_mac_rename_obj) }, + { MP_ROM_QSTR(MP_QSTR_rmdir), MP_ROM_PTR(&vfs_mac_rmdir_obj) }, + { MP_ROM_QSTR(MP_QSTR_stat), MP_ROM_PTR(&vfs_mac_stat_obj) }, + #if MICROPY_PY_OS_STATVFS + { MP_ROM_QSTR(MP_QSTR_statvfs), MP_ROM_PTR(&vfs_mac_statvfs_obj) }, + #endif + #endif +}; +static MP_DEFINE_CONST_DICT(vfs_mac_locals_dict, vfs_mac_locals_dict_table); + +static const mp_vfs_proto_t vfs_mac_proto = { + #if 0 + .import_stat = mp_vfs_mac_import_stat, + #endif +}; + +MP_DEFINE_CONST_OBJ_TYPE( + mp_type_vfs_mac, + MP_QSTR_VfsMac, + MP_TYPE_FLAG_NONE, + make_new, vfs_mac_make_new, + protocol, &vfs_mac_proto, + locals_dict, &vfs_mac_locals_dict + );