diff --git a/platform/atari/Makefile.atari b/platform/atari/Makefile.atari index aa3726caa..1436bbdd7 100644 --- a/platform/atari/Makefile.atari +++ b/platform/atari/Makefile.atari @@ -30,11 +30,14 @@ # # Author: Oliver Schmidt # -# $Id: Makefile.atari,v 1.1 2010/09/29 19:44:01 oliverschmidt Exp $ +# $Id: Makefile.atari,v 1.2 2010/11/01 19:44:34 oliverschmidt Exp $ # ETHERNET = cs8900a +CONTIKI_SOURCEFILES += cfs-posix-dir.c +CONTIKI_TARGET_SOURCEFILES += posixdirent.S + CONTIKI_CPU = $(CONTIKI)/cpu/6502 include $(CONTIKI_CPU)/Makefile.6502 diff --git a/platform/atari/contiki-conf.h b/platform/atari/contiki-conf.h index 8c17f20c6..3444fac45 100644 --- a/platform/atari/contiki-conf.h +++ b/platform/atari/contiki-conf.h @@ -30,7 +30,7 @@ * * Author: Oliver Schmidt * - * $Id: contiki-conf.h,v 1.4 2010/10/23 08:17:45 oliverschmidt Exp $ + * $Id: contiki-conf.h,v 1.5 2010/11/01 19:44:34 oliverschmidt Exp $ */ #ifndef __CONTIKI_CONF_H__ @@ -43,10 +43,6 @@ #define CTK_CONF_WIDGETUP_KEY 0x01 /* Ctrl-A */ #define CTK_CONF_WIDGETDOWN_KEY '\t' /* Tab or Ctrl-I */ -#define cfs_opendir(dir, name) 0 -#define cfs_readdir(dir, entry) -1 -#define cfs_closedir(dir) - #define textcolor(color) COLOR_WHITE #define BORDERCOLOR COLOR_BLACK diff --git a/platform/atari/lib/posixdirent.S b/platform/atari/lib/posixdirent.S new file mode 100644 index 000000000..f33a7f04f --- /dev/null +++ b/platform/atari/lib/posixdirent.S @@ -0,0 +1,159 @@ +; Native: Shawn Jefferson, December 2005 +; POSIX: Stefan Haubenthal, April 2008 + + .include "atari.inc" + .export _opendir, _readdir, _closedir + .import findfreeiocb, clriocb + .import __oserror, return0, __do_oserror + .importzp ptr1, tmp1 +.ifdef DEFAULT_DEVICE + .import __defdev +.endif + + +.proc _opendir + sta ptr1 + stx ptr1+1 + jsr findfreeiocb + beq @iocbok + bne cioerr +@iocbok: stx diriocb + jsr clriocb + ldx diriocb + ldy #0 ; '.' -> "D:*.*" + lda (ptr1),y + cmp #'.' + bne @use_parm + +; "." was given as parameter, use default device/dir + +.ifdef DEFAULT_DEVICE + ; construct a "Dn:*.*" like string from the default drive + lda __defdev+1 + sta dddefdev+1 ; copy drive number (overwrite 2nd 'D') + lda #dddefdev + sta ICBAH,x + bne @cont +.else + lda #defdev + sta ICBAH,x + bne @cont +.endif + +@use_parm: lda ptr1 + sta ICBAL,x + lda ptr1+1 + sta ICBAH,x + +@cont: lda #OPEN + sta ICCOM,x + lda #OPNIN|DIRECT + sta ICAX1,x + jsr CIOV + bmi cioerr + lda #0 + sta __oserror + tax + lda diriocb + rts +.endproc + +cioerr: sty __oserror + jmp return0 + +.proc _readdir + tax + lda #GETREC + sta ICCOM,x + lda #entry + sta ICBAH,x + sta ptr1+1 + lda #DSCTSZ + sta ICBLL,x + lda #0 + sta ICBLH,x + jsr CIOV + bmi cioerr + ldy #0 ; FREE SECTORS + lda (ptr1),y + cmp #'0' + bcs cioerr + dey +@next: iny ; remove trailing spaces + iny + iny + lda (ptr1),y + dey + dey + sta (ptr1),y + cpy #9 + bcs @break + cmp #' ' + bne @next + +@break: lda #'.' ; extension dot + sta (ptr1),y + iny ; copy extension + sty tmp1 + ldy #10 + lda (ptr1),y + cmp #' ' + bne @hasext + +; no extension present: remove the trailing dot and be done + ldy tmp1 + dey + bne @done + +@hasext: jsr copychar + ldy #11 + jsr copychar + ldy #12 + jsr copychar + +@done: lda #0 ; end of string + sta (ptr1),y + lda ptr1 + ldx ptr1+1 + rts + + +copychar: lda (ptr1),y ; src=y dest=tmp1 + ldy tmp1 + cmp #' ' + beq @break + sta (ptr1),y + iny + sty tmp1 +@break: rts +.endproc + +.proc _closedir + tax + lda #CLOSE + sta ICCOM,x + jsr CIOV + bmi @cioerr + ldx #0 + stx __oserror ; clear system specific error code + txa + rts +@cioerr: jmp __do_oserror +.endproc + + .data +.ifdef DEFAULT_DEVICE +dddefdev: .byte "D" +.endif +defdev: .asciiz "D:*.*" + + .bss +diriocb: .res 1 +entry: .res DSCTSZ