diff --git a/libsrc/common/time.s b/libsrc/common/time.s
index 2ee3c04d2..1f032ec31 100644
--- a/libsrc/common/time.s
+++ b/libsrc/common/time.s
@@ -1,13 +1,14 @@
 ;
 ; Ullrich von Bassewitz, 12.11.2002
 ;
-; time_t __fastcall__ time (time_t* t);
+; time_t __fastcall__ time (time_t* timep);
 ;
 
 	.export		_time
 
+        .import         __systime
         .import         __errno
-        .importzp       ptr1, sreg
+        .importzp       ptr1, sreg, tmp1
 
         .include        "errno.inc"
 
@@ -16,28 +17,51 @@
 
 .proc   _time
 
+        pha
+        txa
+        pha                     ; Save timep
+
+        jsr     __systime       ; Get the time (machine dependent)
+
+        sta     tmp1            ; Save low byte of result
+
+; Restore timep and check if it is NULL
+
+        pla
         sta     ptr1
-        stx     ptr1+1          ; t
-
-        ldx     #$FF
-        stx     sreg
-        stx     sreg+1
-
-        ora     ptr1+1          ; t == 0?
+        pla
+        sta     ptr1+1          ; Restore timep
+        ora     ptr1            ; timep == 0?
         beq     @L1
 
-        ldy     #$03
-        txa
-@L0:    sta     (ptr1),y        ; *t = -1
-        dey
-        bpl     @L0
-        lda     #$00
+; timep is not NULL, store the result there
 
-@L1:    sta     __errno+1
+        ldy     #3
+        lda     sreg+1
+        sta     (ptr1),y
+        dey
+        lda     sreg
+        sta     (ptr1),y
+        dey
+        txa
+        sta     (ptr1),y
+        dey
+        lda     tmp1
+        sta     (ptr1),y
+
+; If the result is less than zero, set ERRNO
+
+@L1:    ldy     sreg+1
+        bpl     @L2
+
+        lda     #$00
+        sta     __errno+1
         lda     #ENOSYS         ; Function not implemented
         sta     __errno
 
-        txa                     ; A = $FF
+; Reload the low byte of the result and return
+
+@L2:    lda     tmp1
         rts
 
 .endproc