--- /dev/null
+;
+; Ullrich von Bassewitz, 2012-05-30
+;
+; Based on C code by Groepaz
+;
+; int __fastcall__ closedir(DIR *dir);
+;
+
+
+ .include "dir.inc"
+ .include "zeropage.inc"
+
+ .import _close, _free
+
+
+.proc _closedir
+
+ sta ptr1
+ stx ptr1+1
+
+; Load dir->fd
+
+ ldy #DIR::fd+1
+ lda (ptr1),y
+ tax
+ dey
+ lda (ptr1),y
+
+; Close the file
+
+ jsr _close
+
+; Save the error code
+
+ pha
+ txa
+ pha
+
+; Free the memory block
+
+ lda ptr1
+ ldx ptr1+1
+ jsr _free
+
+; Return the error code from close()
+
+ pla
+ tax
+ pla
+ rts
+
+.endproc
+
--- /dev/null
+;
+; Internal include file, do not use directly.
+; Written by Ullrich von Bassewitz. Based on C code by Groepaz.
+;
+
+
+
+;------------------------------------------------------------------------------
+; Data structures
+
+.struct DIR
+ fd .word
+ offs .word
+ name .byte 16+1
+.endstruct
+
+
+;------------------------------------------------------------------------------
+; C callable functions
+
+ .global _opendir
+ .global _closedir
+ .global _readdir
+ .global _telldir
+ .global _rewinddir
+
+
--- /dev/null
+#include <stdlib.h>
+#include <string.h>
+#include <dirent.h>
+#include <fcntl.h>
+#include <unistd.h>
+#include <errno.h>
+#include "dir.h"
+
+
+
+DIR* __fastcall__ opendir (const char*)
+{
+ unsigned char buffer[8+16+1+7];
+ int count;
+ DIR d;
+ DIR* dir = 0;
+
+ /* Setup file name and offset */
+ d.name[0] = '$';
+ d.name[1] = '\0';
+ d.offs = 0;
+
+ /* Open the directory on disk for reading */
+ d.fd = open (d.name, O_RDONLY);
+ if (d.fd >= 0) {
+
+ /* Skip the disk header */
+ count = read (d.fd, buffer, sizeof (buffer));
+ if (count == sizeof (buffer)) {
+
+ /* Allocate memory for the DIR structure returned */
+ dir = malloc (sizeof (*dir));
+
+ /* Copy the contents of d */
+ if (dir) {
+ memcpy (dir, &d, sizeof (d));
+ } else {
+ /* Set an appropriate error code */
+ errno = ENOMEM;
+ }
+ } else if (count >= 0) {
+ /* Short read - need to set an error code */
+ errno = EIO;
+ }
+ }
+
+ /* Done */
+ return dir;
+}
+
+
+