diff --git a/libsrc/apple2/dir.h b/libsrc/apple2/dir.h
deleted file mode 100644
index ed44f08c6..000000000
--- a/libsrc/apple2/dir.h
+++ /dev/null
@@ -1,63 +0,0 @@
-/*****************************************************************************/
-/* */
-/* dir.h */
-/* */
-/* Apple ][ system specific DIR */
-/* */
-/* */
-/* */
-/* (C) 2005 Oliver Schmidt,
*/
-/* */
-/* */
-/* This software is provided 'as-is', without any expressed or implied */
-/* warranty. In no event will the authors be held liable for any damages */
-/* arising from the use of this software. */
-/* */
-/* Permission is granted to anyone to use this software for any purpose, */
-/* including commercial applications, and to alter it and redistribute it */
-/* freely, subject to the following restrictions: */
-/* */
-/* 1. The origin of this software must not be misrepresented; you must not */
-/* claim that you wrote the original software. If you use this software */
-/* in a product, an acknowledgment in the product documentation would be */
-/* appreciated but is not required. */
-/* 2. Altered source versions must be plainly marked as such, and must not */
-/* be misrepresented as being the original software. */
-/* 3. This notice may not be removed or altered from any source */
-/* distribution. */
-/* */
-/*****************************************************************************/
-
-
-
-#ifndef _DIR_H
-#define _DIR_H
-
-
-
-/*****************************************************************************/
-/* Data */
-/*****************************************************************************/
-
-
-
-struct DIR {
- int fd;
- unsigned char entry_length;
- unsigned char entries_per_block;
- unsigned int file_count;
- unsigned char current_entry;
- union {
- unsigned char bytes[512];
- struct {
- unsigned prev_block;
- unsigned next_block;
- unsigned char entries[1];
- } content;
- } block;
-};
-
-
-
-/* End of dir.h */
-#endif
diff --git a/libsrc/apple2/rewinddir.c b/libsrc/apple2/rewinddir.c
deleted file mode 100644
index 3329852d8..000000000
--- a/libsrc/apple2/rewinddir.c
+++ /dev/null
@@ -1,69 +0,0 @@
-/*****************************************************************************/
-/* */
-/* rewinddir.c */
-/* */
-/* Reset directory stream */
-/* */
-/* */
-/* */
-/* (C) 2005 Oliver Schmidt, */
-/* */
-/* */
-/* This software is provided 'as-is', without any expressed or implied */
-/* warranty. In no event will the authors be held liable for any damages */
-/* arising from the use of this software. */
-/* */
-/* Permission is granted to anyone to use this software for any purpose, */
-/* including commercial applications, and to alter it and redistribute it */
-/* freely, subject to the following restrictions: */
-/* */
-/* 1. The origin of this software must not be misrepresented; you must not */
-/* claim that you wrote the original software. If you use this software */
-/* in a product, an acknowledgment in the product documentation would be */
-/* appreciated but is not required. */
-/* 2. Altered source versions must be plainly marked as such, and must not */
-/* be misrepresented as being the original software. */
-/* 3. This notice may not be removed or altered from any source */
-/* distribution. */
-/* */
-/*****************************************************************************/
-
-
-
-#include
-#include
-#include
-#include
-#include "dir.h"
-
-
-
-/*****************************************************************************/
-/* Code */
-/*****************************************************************************/
-
-
-
-void __fastcall__ rewinddir (register DIR* dir)
-{
- /* Rewind directory file */
- if (lseek (dir->fd, 0, SEEK_SET)) {
-
- /* Read directory key block */
- if (read (dir->fd,
- dir->block.bytes,
- sizeof (dir->block)) == sizeof (dir->block)) {
-
- /* Skip directory header entry */
- dir->current_entry = 1;
-
- /* Return success */
- return;
- }
- }
-
- /* Assert that no subsequent readdir() finds an active entry */
- memset (dir->block.bytes, 0, sizeof (dir->block));
-
- /* Return failure */
-}
diff --git a/libsrc/apple2/rewinddir.s b/libsrc/apple2/rewinddir.s
new file mode 100644
index 000000000..fd3e5738f
--- /dev/null
+++ b/libsrc/apple2/rewinddir.s
@@ -0,0 +1,70 @@
+;
+; Colin Leroy-Mira , 2024
+;
+; void __fastcall__ rewinddir (DIR* dir)
+;
+ .export _rewinddir
+ .import read_dir_block_ptr1
+
+ .import pusha, pusha0, pushax
+ .import pushptr1, popptr1
+ .import incaxy
+ .import _lseek, _memset
+
+ .importzp ptr1, sreg
+
+ .include "dir.inc"
+ .include "stdio.inc"
+
+.proc _rewinddir
+ sta ptr1
+ stx ptr1+1
+ jsr pushptr1 ; Backup ptr1, destroyed by _lseek
+
+ ; Rewind directory file
+ ldy #DIR::FD
+ lda (ptr1),y
+ jsr pusha0 ; Push dir->fd
+
+ tya ; Y = 0 here
+ jsr pusha0
+ jsr pusha0 ; Push 0L
+
+ lda #SEEK_SET ; X = 0 here
+ jsr _lseek
+
+ ora sreg ; Check lseek returned 0L
+ ora sreg+1
+ bne @rewind_err
+ txa
+ bne @rewind_err
+
+ jsr popptr1 ; Restore ptr1
+
+ ; Read directory key block
+ jsr read_dir_block_ptr1
+ bcs @rewind_err
+
+ ; Skip directory header entry
+ lda #$01
+ ldy #DIR::CURRENT_ENTRY
+ sta (ptr1),y
+ rts
+
+@rewind_err:
+ jsr popptr1 ; Restore ptr1
+
+ ; Assert that no subsequent readdir() finds an active entry
+ lda ptr1
+ ldx ptr1+1
+ ldy #DIR::BYTES + DIR::CONTENT::ENTRIES
+ jsr incaxy
+ jsr pushax
+
+ lda #$00
+ jsr pusha
+
+ lda #<.sizeof(DIR::BYTES)
+ ldx #>.sizeof(DIR::BYTES)
+ jmp _memset
+.endproc