home *** CD-ROM | disk | FTP | other *** search
/ QBasic & Borland Pascal & C / Delphi5.iso / C / Samples / CASM.ARJ / FPUTC.ASM < prev    next >
Assembly Source File  |  1988-09-06  |  3KB  |  182 lines

  1. ;_ fputc.asm   Tue Sep  6 1988   Modified by: Walter Bright */
  2. ; Copyright (C) 1985-1988 by Northwest Software
  3. ; All Rights Reserved
  4. ; Written by Walter Bright
  5.  
  6.     include    macros.asm
  7.     include    stdio.asm
  8.  
  9.     if LCODE
  10.     c_extrn    _flushbu,far
  11.     c_extrn    _fillbuf,far
  12.     c_extrn    fflush,far
  13.     else
  14.     c_extrn    _flushbu,near
  15.     c_extrn    _fillbuf,near
  16.     c_extrn    fflush,near
  17.     endif
  18.  
  19.     begcode    fputc
  20.  
  21.     c_public    fputc
  22.  
  23. ;;;;;;;;;;;;;;;;;;;;;;;;;
  24. ;    fputc(c,fp);
  25.  
  26. func    fputc
  27.     push    BP
  28.     mov    BP,SP
  29.     mov    AX,P[BP]    ;get c
  30.     if SPTR
  31.     mov    BX,P+2[BP]    ;get fp
  32.     else
  33.     mov    CX,DS        ;save original DS
  34.     lds    BX,P+2[BP]    ;get fp
  35.     endif
  36.     .if    AL e 10, L4    ;if LF
  37.  
  38. ; Input:
  39. ;    AX = c
  40. ;    DS:BX = fp
  41. ;    CX = original value of DS
  42. ; Output:
  43. ;    DS is restored
  44.  
  45. L1:    pop    BP
  46.  
  47. _putit:
  48.     dec    word ptr _cnt[BX]
  49.     js    L2
  50. L5:    mov    DX,DI
  51.     if SPTR
  52.     mov    DI,_ptr[BX]
  53.      ifdef BIGBUF        ;can't have LPTR with BIGBUF
  54.     mov    ES,_seg[BX]    ;segment of buffer
  55.     stosb
  56.      else
  57.     mov    [DI],AL
  58.     inc    DI
  59.      endif
  60.     else ;LPTR
  61.     les    DI,_ptr[BX]
  62.     stosb
  63.     endif
  64.     mov    _ptr[BX],DI
  65.     if LPTR
  66.     mov    DS,CX        ;restore original DS
  67.     endif
  68.     mov    DI,DX        ;restore DI
  69.     ret
  70.  
  71. L4:    test    byte ptr _flag+1[BX],_IOTRAN/256
  72.     jz    L3        ;if not translated mode
  73.     mov    AL,13        ;CR first
  74.     callm    putit
  75.     mov    AX,P[BP]
  76.     if SPTR
  77.     mov    BX,P+2[BP]
  78.     else
  79.     mov    CX,DS        ;save original DS
  80.     lds    BX,P+2[BP]
  81.     endif
  82.  
  83. L3:    test    byte ptr _flag[BX],_IOLBF    ;line buffered?
  84.     jz    L1                ;no
  85.     callm    putit
  86.     if LPTR
  87.     push    P+4[BP]        ;segment of fp
  88.     endif
  89.     push    P+2[BP]        ;offset of fp
  90.     callm    fflush
  91.     add    SP,SIZEPTR
  92.     pop    BP
  93.     ret
  94.  
  95. L2:
  96.     .if    <word ptr _cnt[BX]> ne 0FFFFh, L5
  97.     if LPTR
  98.     push    DS        ;segment of fp
  99.     mov    DS,CX        ;restore original DS
  100.     endif
  101.     push    BX        ;push fp
  102.     push    AX        ;push c
  103.     callm    _flushbu
  104.     add    SP,2+SIZEPTR
  105.     ret
  106. c_endp    fputc
  107.  
  108. ;;;;;;;;;;;;;;;;;;;;;;;;;;
  109. ; fgetc(fp);
  110.  
  111.     c_public fgetc
  112.  
  113. func    fgetc
  114.     push    BP
  115.     mov    BP,SP
  116. G4:
  117.     if SPTR
  118.     mov    BX,P[BP]
  119.     else
  120.     mov    CX,DS
  121.     lds    BX,P[BP]
  122.     endif
  123. G1:    dec    word ptr _cnt[BX]
  124.     js    G2            ;if out of chars in buffer
  125.  
  126. G6:    mov    DX,SI
  127.     if SPTR
  128.     mov    SI,_ptr[BX]
  129.       ifdef BIGBUF            ;can't have both LPTR and BIGBUF
  130.     mov    CX,DS
  131.     mov    DS,_seg[BX]        ;load segment of disk buffer
  132.     lodsb                ;get char from buffer
  133.     mov    DS,CX            ;restore original DS
  134.       else
  135.     lodsb                ;get char from buffer
  136.       endif
  137.     else
  138.     les    SI,_ptr[BX]
  139.     mov    AL,ES:[SI]
  140.     inc    SI
  141.     endif
  142.     clr    AH
  143.     mov    _ptr[BX],SI            ;updated pointer
  144.     mov    SI,DX
  145.     test    byte ptr _flag+1[BX],_IOTRAN/256    ;translated mode?
  146.     je    G3                ;no
  147.     .if    AL e 13, G1            ;ignore CRs
  148.     .if    AL e 26, G5            ;^Z marks end of file
  149. G3:
  150.     if LPTR
  151.     mov    DS,CX
  152.     endif
  153.     pop    BP
  154.     ret
  155.  
  156. G2:
  157.     .if    <word ptr _cnt[BX]> ne 0FFFFh, G6
  158.     if LPTR
  159.     push    DS
  160.     mov    DS,CX
  161.     endif
  162.     push    BX
  163.     callm    _fillbuf        ;fill buffer (_fillbuf(fp))
  164.     mov    SP,BP
  165.     tst    AX            ;EOF?
  166.     jz    G4            ;no
  167.     pop    BP            ;return EOF
  168.     ret
  169.  
  170. G5:    mov    AX,EOF
  171.     or    byte ptr _flag[BX],_IOEOF    ;set EOF flag bit
  172.     mov    word ptr _cnt[BX],0        ;0 chars left in buffer
  173.     if LPTR
  174.     mov    DS,CX
  175.     endif
  176.     pop    BP
  177.     ret
  178. c_endp    fgetc
  179.  
  180.     endcode    fputc
  181.     end
  182.