home *** CD-ROM | disk | FTP | other *** search
/ Hall of Fame / HallofFameCDROM.cdr / proglc / tnylib.lzh / FOPEN.ASM < prev    next >
Encoding:
Assembly Source File  |  1986-11-21  |  2.0 KB  |  92 lines

  1. include compiler.inc
  2.  
  3.     ttl    FOPEN, 1.05, 11-18-86 jwk
  4.  
  5. ;open files for stream i/o. returns file pointer or NULL
  6.  
  7.     dseg
  8.     exterr
  9.     extrn _ftb:byte
  10.     cseg
  11.     xtfs    <open, lseek>
  12.  
  13.     procdef    fopen, <<path, ptr>, <mode, ptr>>
  14.     locs    <<tmpm, word>, <hndl, word>, <rtv, ptr>>
  15.     pushreg
  16.     pushds
  17.     xor    ax, ax
  18.     moverr    ax
  19.     gci    mode        ;get HOW character
  20.     caseb    'a',ap        ;append
  21.     caseb    'w',wr        ;write
  22.     caseb    'r',rd        ;read
  23. df:    stc            ;signal bad return
  24.     jmp short quit        ;bad attribute, get out
  25.  
  26. rd:    mov    al, 1        ;read
  27.     jmp    short ckrtvl
  28.  
  29. wr:    mov    al, 2        ;write
  30.     jmp    short ckrtvl
  31.  
  32. ap:    mov    al, 10        ;write + APPEND
  33. ;    jmp    ckrtvl
  34.  
  35. ckrtvl:    call    lopen        ;local routine
  36.     cmp    ax, 0
  37.     jl    df        ;error, return NULL
  38.     mov    si, 5        ;convert handle to pointer
  39.     mul    si
  40.     add    ax, offset _ftb
  41.     svptr    ax, rtv, ds    ;save return pointer value
  42.     mov    ax, tmpm    ;check APPEND bit
  43.     and    al, 8
  44.     jz    fini        ;nope, done
  45.  
  46.     mov    ax, 2        ;append needs seek to EOF
  47.     sub    bx,bx
  48.     callit    lseek,<<ax,reg>,<bx,reg>,<bx,reg>,<hndl,word>>
  49.  
  50. fini:    ldptr    si,rtv
  51.     xor    ax,ax
  52.     mov    word ptr 3[si], ax    ;clear ERFLAG and CRFLG bytes
  53.     dec    ax            ;to EOF value
  54.     mov    word ptr [si], ax    ;erase ungetc() char
  55.     mov    ax, tmpm        ;get mode indicator
  56.     and    ax,7            ;mask to R, W, and RAW bits only
  57.     mov    byte ptr 2[si], al    ;set MODE byte
  58.     clc                ;signal successful return
  59. quit:    retptrr    si,ds            ;return pointer or NULL
  60.     pend    fopen
  61.  
  62. ckh1:    caseb    '+',rwa        ;set r/w access
  63.     caseb    'b',mkraw    ;set make-raw bit
  64. ;    jmp    ckhow        ;ignore anything else
  65. ckhow:    gci    mode        ;check rest of string
  66.     or    ax, ax        ;was char EOS
  67.     jnz    ckh1        ;no, check it
  68.     mov    ax, tmpm
  69.     ret
  70.  
  71. mkraw:    mov    ax, tmpm    ;set RAW bit
  72.     or    al, 4
  73.     mov    tmpm, ax
  74.     jmp    ckhow
  75.  
  76. rwa:    mov    ax, tmpm    ;set both R and W
  77.     or    al, 3
  78.     mov    tmpm, ax
  79.     jmp    ckhow
  80.  
  81. lopen:    mov    tmpm, ax    ;save mode
  82.     call    ckhow        ;get rest of line
  83.     test    al,8        ;check for appending
  84.     jz    op1        ;no
  85.     or    al,3        ;yes, open as r/w
  86. op1:    dec    ax        ;to standard C code
  87.     callit    open,<<ax,reg>,<path,ptr>>
  88.     mov    hndl, ax    ;handle
  89.     ret
  90.  
  91.     finish
  92.