diff --git a/libsrc/common/Makefile b/libsrc/common/Makefile
index de9459c4f..bd373b158 100644
--- a/libsrc/common/Makefile
+++ b/libsrc/common/Makefile
@@ -57,7 +57,8 @@ C_OBJS =	_afailed.o	\
                 vsscanf.o
 
 
-S_OBJS = 	_fdesc.o 	\
+S_OBJS = 	_cwd.o          \
+                _fdesc.o 	\
 	 	_file.o  	\
 		_fopen.o	\
 	 	_heap.o	 	\
@@ -86,6 +87,7 @@ S_OBJS = 	_fdesc.o 	\
 		free.o		\
 		fwrite.o	\
 		getcpu.o	\
+                getcwd.o        \
 		isalnum.o	\
 		isalpha.o	\
 		isblank.o	\
diff --git a/libsrc/common/_cwd.s b/libsrc/common/_cwd.s
new file mode 100644
index 000000000..c393aa863
--- /dev/null
+++ b/libsrc/common/_cwd.s
@@ -0,0 +1,16 @@
+;
+; Ullrich von Bassewitz, 2003-08-12
+;
+; Place to store the current working directory.
+;
+
+       	.export		__cwd
+        .export         __cwd_buf_size
+
+        __cwd_buf_size  = 64
+
+.bss
+
+__cwd:  .res	__cwd_buf_size
+
+
diff --git a/libsrc/common/chdir.s b/libsrc/common/chdir.s
index 4a17d4910..0d2c6952a 100644
--- a/libsrc/common/chdir.s
+++ b/libsrc/common/chdir.s
@@ -11,6 +11,8 @@
 
 
 ;--------------------------------------------------------------------------
+; The function calls __syschdir, which must check the directory, set it, and
+; copy it to __cwd if it is valid. The copycwd may be used for the latter.
 
 .proc   _chdir
 
@@ -20,5 +22,3 @@
 .endproc
 
 
-
-
diff --git a/libsrc/common/getcwd.s b/libsrc/common/getcwd.s
new file mode 100644
index 000000000..824f4d5c0
--- /dev/null
+++ b/libsrc/common/getcwd.s
@@ -0,0 +1,64 @@
+;
+; Ullrich von Bassewitz, 2003-08-12
+;
+; char* __fastcall__ getcwd (char* buf, size_t size);
+;
+
+        .export         _getcwd
+
+        .import         popax
+        .import         __cwd
+        .importzp       ptr1, ptr2
+
+        .include        "errno.inc"
+
+
+;--------------------------------------------------------------------------
+
+.proc   _getcwd
+
+; Remember -size-1 because this simplifies the following loop
+
+        eor     #$FF
+        sta     ptr2
+        txa
+        eor     #$FF
+        sta     ptr2+1
+
+        jsr     popax           ; Get buf
+        sta     ptr1
+        stx     ptr1+1          ; Save buf
+
+; Copy __cwd to the given buffer checking the length
+
+        ldy     #$00
+loop:   inc     ptr2
+        bne     @L1
+        inc     ptr2+1
+        beq     overflow
+
+; Copy one character, end the loop if the zero terminator is reached
+
+@L1:    lda     __cwd,y
+        sta     (ptr1),y
+        bne     loop
+
+; Current working dir copied ok, A contains zero
+
+        tax                     ; Return zero in a/x
+        rts
+
+; String overflow, return ERANGE
+
+overflow:
+        lda     #<ERANGE
+        sta     __errno
+        lda     #>ERANGE
+        sta     __errno+1
+        lda     #$FF
+        tax                     ; Return -1
+        rts
+
+.endproc
+
+