]> git.sur5r.net Git - cc65/commitdiff
syschdir by Stefan Haubenthal
authorcpg <cpg@b7a2c559-68d2-44c3-8de9-860c34a00d81>
Sat, 1 May 2010 22:33:25 +0000 (22:33 +0000)
committercpg <cpg@b7a2c559-68d2-44c3-8de9-860c34a00d81>
Sat, 1 May 2010 22:33:25 +0000 (22:33 +0000)
git-svn-id: svn://svn.cc65.org/cc65/trunk@4658 b7a2c559-68d2-44c3-8de9-860c34a00d81

libsrc/atari/Makefile
libsrc/atari/initcwd.s [new file with mode: 0644]
libsrc/atari/syschdir.s [new file with mode: 0644]

index 349e6d9f53f3b9df4f1ff060cca68e7e742b7f90..93eec9f2bf2945279f3f380d869511080685f568 100644 (file)
@@ -88,6 +88,7 @@ OBJS =        _scrsize.o      \
        gotoy.o         \
        gotoxy.o        \
        graphics.o      \
+       initcwd.o       \
        inviocb.o       \
        joy_stddrv.o    \
        kbhit.o         \
@@ -107,6 +108,7 @@ OBJS =      _scrsize.o      \
        scroll.o        \
        setcolor.o      \
        siocall.o       \
+       syschdir.o      \
        sysmkdir.o      \
        sysremove.o     \
        sysrmdir.o      \
diff --git a/libsrc/atari/initcwd.s b/libsrc/atari/initcwd.s
new file mode 100644 (file)
index 0000000..54afeb1
--- /dev/null
@@ -0,0 +1,33 @@
+;
+; Stefan Haubenthal, 2008-04-29
+;
+
+       .export         initcwd
+       .import         findfreeiocb
+       .import         __cwd
+       .include        "atari.inc"
+
+       .segment        "INIT"
+
+.proc  initcwd
+
+       jsr     findfreeiocb
+       bne     oserr
+       lda     #48
+       sta     ICCOM,x
+       lda     #<__cwd
+       sta     ICBLL,x
+       lda     #>__cwd
+       sta     ICBLH,x
+       jsr     CIOV
+       bmi     oserr
+       ldx     #0              ; ATEOL -> \0
+:      lda     __cwd,x
+       inx
+       cmp     #ATEOL
+       bne     :-
+       lda     #0
+       sta     __cwd-1,x
+oserr: rts
+
+.endproc
diff --git a/libsrc/atari/syschdir.s b/libsrc/atari/syschdir.s
new file mode 100644 (file)
index 0000000..901c15e
--- /dev/null
@@ -0,0 +1,88 @@
+;
+; 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