--- /dev/null
+;
+; Stefan Haubenthal, 2005-12-24
+; Based on on code by Christian Groessler
+;
+; unsigned char __fastcall__ _syschdir (const char* name);
+; for SpartaDOS and MyDOS
+;
+
+ .include "atari.inc"
+ .import findfreeiocb
+ .import __dos_type
+ .import initcwd
+ .importzp tmp4
+.ifdef UCASE_FILENAME
+ .importzp tmp3
+ .import addysp
+ .import ucase_fn
+.endif
+ .export __syschdir
+
+.proc __syschdir
+
+ pha ; save input parameter
+ txa
+ pha
+
+ jsr findfreeiocb
+ beq iocbok ; we found one
+
+ pla
+ pla ; fix up stack
+
+ lda #TMOF ; too many open files
+ rts
+
+iocbok: stx tmp4 ; remember IOCB index
+ pla
+ tax
+ pla ; get argument again
+
+.ifdef UCASE_FILENAME
+
+ jsr ucase_fn
+ bcc ucok1
+
+ lda #182 ; see oserror.s
+ rts
+ucok1:
+
+.endif ; defined UCASE_FILENAME
+
+ ldy tmp4 ; IOCB index
+ sta ICBAL,y ; store pointer to filename
+ txa
+ sta ICBAH,y
+ tya
+ tax
+ lda __dos_type
+ cmp #SPARTADOS
+ beq :+
+ lda #41
+ .byte $2C ; BIT <abs>
+: lda #44
+ sta ICCOM,x
+ lda #0
+ sta ICAX1,x
+ sta ICAX2,x
+ sta ICBLL,x
+ sta ICBLH,x
+ jsr CIOV
+
+.ifdef UCASE_FILENAME
+ tya
+ pha
+ ldy tmp3 ; get size
+ jsr addysp ; free used space on the stack
+ pla
+ tay
+.endif ; defined UCASE_FILENAME
+
+ bmi cioerr
+ jsr initcwd
+ lda #0
+ rts
+cioerr: tya
+ rts
+
+.endproc ; __syschdir