From 8b26ed2a6993cd428c915adfccf8eb4a12f6d167 Mon Sep 17 00:00:00 2001
From: "ol.sc" 
Date: Tue, 16 Oct 2012 21:39:40 +0000
Subject: [PATCH] Implemented __syschdir on CBM. As getcwd returns a cached
 directory any direct access to __curunit would cause inconsistencies.
 Therefore __curunit was renamed to curunit to prohibit user access.
git-svn-id: svn://svn.cc65.org/cc65/trunk@5857 b7a2c559-68d2-44c3-8de9-860c34a00d81
---
 include/cbm.h         |   5 +-
 libsrc/cbm/Makefile   | 108 +++++++++++++++++++++---------------------
 libsrc/cbm/filename.s |   4 +-
 libsrc/cbm/filevars.s |   6 +--
 libsrc/cbm/initcwd.s  |   8 ++--
 libsrc/cbm/syschdir.s |  86 +++++++++++++++++++++++++++++++++
 6 files changed, 151 insertions(+), 66 deletions(-)
 create mode 100644 libsrc/cbm/syschdir.s
diff --git a/include/cbm.h b/include/cbm.h
index 3ca8715e4..5a422806a 100644
--- a/include/cbm.h
+++ b/include/cbm.h
@@ -81,10 +81,9 @@
 
 
 
-/* The file stream implementation and the POSIX I/O functions will use the
- * following variables to determine the file type and the disk unit to use.
+/* The file stream implementation and the POSIX I/O functions will
+ * use the following variable to determine the file type to use.
  */
-extern unsigned char _curunit;  /* Defaults to current when program started */
 extern char _filetype;          /* Defaults to 's' */
 
 
diff --git a/libsrc/cbm/Makefile b/libsrc/cbm/Makefile
index 5e3396e13..3230ab3b9 100644
--- a/libsrc/cbm/Makefile
+++ b/libsrc/cbm/Makefile
@@ -19,7 +19,7 @@ CFLAGS	= -Osir -g -T -t $(SYS) --forget-inc-paths -I . -I ../../include
 #--------------------------------------------------------------------------
 # Rules
 
-%.o:   	%.c
+%.o:	%.c
 	@$(CC) $(CFLAGS) $<
 	@$(AS) -o $@ $(AFLAGS) $(*).s
 
@@ -29,74 +29,75 @@ CFLAGS	= -Osir -g -T -t $(SYS) --forget-inc-paths -I . -I ../../include
 #--------------------------------------------------------------------------
 # Object files
 
-C_OBJS =       	cbm_dir.o       \
-                cbm_load.o	\
-		cbm_save.o      \
-                opendir.o       \
-                readdir.o       \
-                seekdir.o
+C_OBJS =	cbm_dir.o	\
+		cbm_load.o	\
+		cbm_save.o	\
+		opendir.o	\
+		readdir.o	\
+		seekdir.o
 
 S_OBJS =	c_acptr.o	\
-	 	c_basin.o 	\
+		c_basin.o	\
 		c_bsout.o	\
 		c_chkin.o	\
-	 	c_ciout.o	\
-		c_ckout.o 	\
+		c_ciout.o	\
+		c_ckout.o	\
 		c_clall.o	\
-		c_close.o 	\
-		c_clrch.o 	\
-                c_getin.o       \
+		c_close.o	\
+		c_clrch.o	\
+		c_getin.o	\
 		c_iobase.o	\
 		c_listen.o	\
-		c_load.o 	\
-		c_open.o 	\
-		c_readst.o 	\
-		c_save.o 	\
+		c_load.o	\
+		c_open.o	\
+		c_readst.o	\
+		c_save.o	\
 		c_setlfs.o	\
 		c_setnam.o	\
-		c_talk.o 	\
+		c_talk.o	\
 		c_unlsn.o	\
 		c_untlk.o	\
 		cbm_close.o	\
-                cbm_filetype.o  \
-		cbm_open.o 	\
-		cbm_read.o 	\
-		cbm_write.o     \
-		cclear.o 	\
-		chline.o 	\
-	 	clock.o  	\
-                close.o         \
-                closedir.o      \
-		ctype.o  	\
-		cvline.o 	\
-                devicedir.o     \
-                dir.o           \
-                diskcmd.o       \
-                exehdr.o        \
-                filedes.o       \
-                filename.o      \
-                filetype.o      \
-                filevars.o      \
-                getdevice.o     \
+		cbm_filetype.o	\
+		cbm_open.o	\
+		cbm_read.o	\
+		cbm_write.o	\
+		cclear.o	\
+		chline.o	\
+		clock.o		\
+		close.o		\
+		closedir.o	\
+		ctype.o		\
+		cvline.o	\
+		devicedir.o	\
+		dir.o		\
+		diskcmd.o	\
+		exehdr.o	\
+		filedes.o	\
+		filename.o	\
+		filetype.o	\
+		filevars.o	\
+		getdevice.o	\
 		gotox.o 	\
 		gotoxy.o 	\
 		gotoy.o 	\
-                initcwd.o       \
-                loadaddr.o      \
-                open.o          \
-                oserrlist.o     \
+		initcwd.o	\
+		loadaddr.o	\
+		open.o		\
+		oserrlist.o	\
 		oserror.o	\
-                read.o          \
-                rewinddir.o     \
-                rwcommon.o      \
-                scratch.o       \
-                sysremove.o     \
-                sysrename.o     \
-                telldir.o       \
-                toascii.o       \
-		wherex.o        \
-                wherey.o        \
-                write.o
+		read.o		\
+		rewinddir.o	\
+		rwcommon.o	\
+		scratch.o	\
+		syschdir.o	\
+		sysremove.o	\
+		sysrename.o	\
+		telldir.o	\
+		toascii.o	\
+		wherex.o	\
+		wherey.o	\
+		write.o
 
 #--------------------------------------------------------------------------
 # Targets
@@ -109,4 +110,3 @@ clean:
 	@$(RM) *~ *.bck $(C_OBJS:.o=.s) $(C_OBJS) $(S_OBJS)
 
 zap:	clean
-
diff --git a/libsrc/cbm/filename.s b/libsrc/cbm/filename.s
index 37caef21d..e5884bbdf 100644
--- a/libsrc/cbm/filename.s
+++ b/libsrc/cbm/filename.s
@@ -9,7 +9,7 @@
         .export         fnunit, fnlen, fnisfile, fncmd, fnbuf
 
         .import         SETNAM
-        .import         __curunit, __filetype
+        .import         curunit, __filetype
         .importzp       ptr1, tmp1
 
         .include        "ctype.inc"
@@ -147,7 +147,7 @@ drivedone:
 
 .proc   fndefunit
 
-        lda     __curunit
+        lda     curunit
         sta     fnunit
         rts
 
diff --git a/libsrc/cbm/filevars.s b/libsrc/cbm/filevars.s
index baaef66a4..316cf2762 100644
--- a/libsrc/cbm/filevars.s
+++ b/libsrc/cbm/filevars.s
@@ -4,14 +4,14 @@
 ; Variables used for CBM file I/O
 ;
 
-        .export         __curunit
+        .export         curunit
         .constructor    initcurunit, 30
         .importzp       devnum
 
 
 .bss
 
-__curunit:
+curunit:
         .res    1
 
 
@@ -23,7 +23,7 @@ __curunit:
         bne     @L0
         lda     #8              ; Default is disk
         sta     devnum
-@L0:    sta     __curunit
+@L0:    sta     curunit
         rts
 
 .endproc
diff --git a/libsrc/cbm/initcwd.s b/libsrc/cbm/initcwd.s
index d5eb7fb90..1289b71dc 100644
--- a/libsrc/cbm/initcwd.s
+++ b/libsrc/cbm/initcwd.s
@@ -5,7 +5,7 @@
 ;
 
 	.export		initcwd, devicestr
-	.import		__curunit, __cwd
+	.import		curunit, __cwd
 	.import		pusha0, tosudiva0
 	.importzp	sreg, ptr1, ptr2
 
@@ -16,7 +16,7 @@ initcwd:
 	ldx	#>__cwd
 	sta	ptr2
 	stx	ptr2+1
-	lda	__curunit
+	lda	curunit
 	; Fall through
 
 ;------------------------------------------------------------------------------
@@ -28,11 +28,11 @@ devicestr:
 	jsr	tosudiva0
 	ldy	#0
 	lda	sreg
-	beq	:+		; >=10
+	beq	@L0		; >=10
 	add	#'0'
 	sta	(ptr2),y
 	iny
-:	lda	ptr1		; rem
+@L0:	lda	ptr1		; rem
 	add	#'0'
 	sta	(ptr2),y
 	iny
diff --git a/libsrc/cbm/syschdir.s b/libsrc/cbm/syschdir.s
new file mode 100644
index 000000000..10dbe33ed
--- /dev/null
+++ b/libsrc/cbm/syschdir.s
@@ -0,0 +1,86 @@
+;
+; Oliver Schmidt, 2012-10-16
+;
+; unsigned char __fastcall__ _syschdir (const char* name);
+;
+
+        .export         __syschdir
+        .import         curunit, initcwd
+        .importzp       ptr1, tmp1, tmp2
+
+;--------------------------------------------------------------------------
+; __syschdir
+
+.proc   __syschdir
+
+; Save name
+
+        sta     ptr1
+        stx     ptr1+1
+
+; Process first character
+
+        ldy     #0
+        lda     (ptr1),y
+        beq     err
+        jsr     getdigit
+        bcs     err
+        tax
+
+; Process second character
+
+        iny
+        lda     (ptr1),y
+        beq     done
+        jsr     getdigit
+        bcs     err
+        stx     tmp1            ; First digit
+        sta     tmp2            ; Second digit
+
+; Multiply first digit by 10
+
+        ldx     #8
+@L0:    asl
+        asl     tmp1
+        bcc     @L1
+        clc
+        adc     #10
+@L1:    dex
+        bne     @L0
+
+; Add second digit to product
+
+        clc
+        adc     tmp2
+        tax
+
+; Process third character
+
+        iny
+        lda     (ptr1),y
+        bne     err
+
+; Success, update cwd
+
+done:   stx     curunit
+        jmp     initcwd         ; Returns with A = 0
+
+err:    lda     #9              ; "Ilegal device"
+        rts
+
+.endproc
+
+;--------------------------------------------------------------------------
+; getdigit
+
+.proc   getdigit
+
+        sec
+        sbc     #'0'
+        bcs     @L0
+        sec
+        rts
+@L0:    cmp     #10
+        rts
+
+.endproc
\ No newline at end of file
-- 
2.39.5