]> git.sur5r.net Git - cc65/commitdiff
Fixed a bug (report and patch by Greg King)
authorcuz <cuz@b7a2c559-68d2-44c3-8de9-860c34a00d81>
Mon, 14 Feb 2005 09:59:54 +0000 (09:59 +0000)
committercuz <cuz@b7a2c559-68d2-44c3-8de9-860c34a00d81>
Mon, 14 Feb 2005 09:59:54 +0000 (09:59 +0000)
git-svn-id: svn://svn.cc65.org/cc65/trunk@3384 b7a2c559-68d2-44c3-8de9-860c34a00d81

libsrc/common/vfprintf.s

index 21f4ff33bbae210ef5e7a2c286133aaac304264a..c839c2c02b8084cdd760567789273bcd1b85b733 100644 (file)
@@ -1,29 +1,28 @@
+; vfprintf.s
 ;
-; int vfprintf (FILE* f, const char* Format, va_list ap);
-;
-; Ullrich von Bassewitz, 1.12.2000
+; int fastcall vfprintf(FILE* f, const char* Format, va_list ap);
 ;
+; 2005-02-08, Ullrich von Bassewitz
+; 2005-02-11, Greg King
 
-       .export         _vfprintf
-       .import         pushax, popax, push1, pushwysp, ldaxysp, ldaxidx, incsp6
-       .import         _fwrite, __printf
-       .importzp       sp, ptr1, ptr2
+        .export                _vfprintf
+        .import                pushax, popax, push1, pushwysp, ldaxysp, ldaxidx, incsp6
+        .import                _fwrite, __printf
+        .importzp              sp, ptr1, ptr2
 
-       .macpack        generic
+        .macpack       generic
 
 
 .data
 
 ; ----------------------------------------------------------------------------
-;
 ; Static data for the _vfprintf routine
 ;
-
-outdesc:                       ; Static outdesc structure
-       .word   0               ; ccount
-       .word   out             ; Output function pointer
-       .word   0               ; ptr
-       .word   0               ; uns
+outdesc:                        ; Static outdesc structure
+ccount: .res   2
+        .word  out             ; Output function pointer
+ptr:    .res   2               ; Points to output file
+        .res   2               ; (Not used by this function)
 
 .code
 
@@ -33,24 +32,20 @@ outdesc:                    ; Static outdesc structure
 ; static void out (struct outdesc* d, const char* buf, unsigned count)
 ; /* Routine used for writing */
 ; {
+;     register size_t cnt;
 ;     /* Write to the file */
-;     if (fwrite (buf, count, 1, (FILE*) d->ptr) == -1) {
+;     if ((cnt = fwrite(buf, 1, count, (FILE *)d->ptr)) == 0) {
 ;         d->ccount = -1;
 ;     } else {
-;         d->ccount += count;
+;         d->ccount += cnt;
 ;     }
 ; }
 
-out:
-
 ; About to call
 ;
-;              fwrite (buf, 1, count, (FILE*) d->ptr);
+;       fwrite (buf, 1, count, (FILE*) d->ptr);
 ;
-; Since Buf and Count are already in place, we will just push the last
-; two parameters. The fwrite function will remove Buf and Count on exit.
-
-        ldy     #5
+out:    ldy     #5
         jsr     pushwysp        ; Push buf
         jsr     push1           ; Push #1
         ldy     #7
@@ -59,9 +54,9 @@ out:
         jsr     ldaxysp         ; Load D
         ldy     #5              ; Offset of ptr1+1 in struct outdesc
         jsr     ldaxidx         ; Load
-       jsr     _fwrite
-               sta     ptr2            ; Save function result
-       stx     ptr2+1
+        jsr    _fwrite
+        sta    ptr2            ; Save function result
+        stx    ptr2+1
 
 ; Get D and store it in ptr1
 
@@ -72,41 +67,49 @@ out:
 
 ; Load the offset of ccount in struct outdesc
 
-       ldy     #$00
+        ldy    #$00
 
-; Check the return code. Checking the high byte against $FF is ok here.
+; Check the return value.
 
-               lda     ptr2+1
-       cmp     #$FF
-       bne     @Ok
+        lda    ptr2+1
+        ora    ptr2
+        bne    @Ok
 
 ; We had an error. Store -1 into d->ccount
 
-       sta     (ptr1),y
+.ifp02
+        lda    #<-1
+.else
+        dec    a
+.endif
+        sta    (ptr1),y
         iny
         bne     @Done           ; Branch always
 
 ; Result was ok, count bytes written
 
-@Ok:   lda     (ptr1),y
-       add     ptr2
-       sta     (ptr1),y
+@Ok:    lda    (ptr1),y
+        add    ptr2
+        sta    (ptr1),y
         iny
-       lda     (ptr1),y
-       adc     ptr2+1
-@Done:  sta    (ptr1),y
-       jmp     incsp6          ; Drop stackframe
+        lda    (ptr1),y
+        adc    ptr2+1
+@Done:  sta     (ptr1),y
+        jmp     incsp6          ; Drop stackframe
 
 
 ; ----------------------------------------------------------------------------
 ; vfprintf - formatted output
 ;
-; int vfprintf (FILE* f, const char* format, va_list ap)
+; int fastcall vfprintf(FILE* f, const char* format, va_list ap)
 ; {
-;     struct outdesc d;
+;     static struct outdesc d = {
+;         0,
+;         out
+;     };
 ;
 ;     /* Setup descriptor */
-;     d.fout = out;
+;     d.ccount = 0;
 ;     d.ptr  = f;
 ;
 ;     /* Do formatting and output */
@@ -115,39 +118,39 @@ out:
 ;     /* Return bytes written */
 ;     return d.ccount;
 ; }
-
+;
 _vfprintf:
-       pha                     ; Save low byte of ap
+        pha                    ; Save low byte of ap
 
 ; Setup the outdesc structure
 
-       lda     #0
-       sta     outdesc
-       sta     outdesc+1       ; Clear ccount
+        lda    #0
+        sta    ccount
+        sta    ccount+1        ; Clear character-count
 
 ; Reorder the stack. Replace f on the stack by &d, so the stack frame is
 ; exactly as _printf expects it. Parameters will get dropped by _printf.
 
-       ldy     #2              ;
-       lda     (sp),y          ; Low byte of f
-       sta     outdesc+4       ;
-       lda     #<outdesc
-       sta     (sp),y
-       iny
-       lda     (sp),y          ; High byte of f
-       sta     outdesc+5
-       lda     #>outdesc
-       sta     (sp),y
+        ldy    #2
+        lda    (sp),y          ; Low byte of f
+        sta    ptr
+        lda    #<outdesc
+        sta    (sp),y
+        iny
+        lda    (sp),y          ; High byte of f
+        sta    ptr+1
+        lda    #>outdesc
+        sta    (sp),y
 
 ; Restore low byte of ap and call _printf
 
-       pla
-       jsr     __printf
+        pla
+        jsr    __printf
 
 ; Return the number of bytes written
 
-       lda     outdesc
-       ldx     outdesc+1
-       rts
+        lda    ccount
+        ldx    ccount+1
+        rts