home *** CD-ROM | disk | FTP | other *** search
/ ftp.barnyard.co.uk / 2015.02.ftp.barnyard.co.uk.tar / ftp.barnyard.co.uk / cpm / walnut-creek-CDROM / CPM / BBSING / RBBS / RBBS4102.ARK / TDOSFN.CSM < prev    next >
Text File  |  1985-02-09  |  5KB  |  267 lines

  1. ; Contains:
  2. ;
  3. ;    open  lokrec  frerec
  4. ;
  5. ; set up for TurboDOS use
  6. ;
  7.  
  8.     INCLUDE <bds.lib>
  9.  
  10. ; Open:
  11. ;    int open(filename,mode)
  12. ;        char *filename;
  13. ;
  14. ; Open a file for read (mode == 0), write (mode == 1) or both (mode = 2),
  15. ; and detect a user-number prefix.  Returns a file descriptor.
  16. ;
  17. ; Modified version of open to open a TurboDOS file in shared mode,
  18. ; i.e., set hi bit of f5 in FCB.
  19.  
  20.     FUNCTION    open
  21.     call    arghak
  22.     xra    a
  23.     call    fgfcb    ;any fcb's free?
  24.     jnc    open2    ;if not, error
  25.     mvi    a,10    ;"no more file slots"
  26.     jmp    error
  27.  
  28. open2:    sta    tmp
  29.     xchg
  30.     lhld    arg1
  31.     xchg
  32.     push    b
  33.     call    setfcu    ;parse name and set usenum
  34.     push    d    ;save registers
  35.     push    h
  36.     lxi    h,5    ;get offset to f5
  37.     dad    d    ;add to fcb address
  38.     mov    a,m    ;get character
  39.     ori    80h    ;set shared file bit
  40.     mov    m,a    ;restore updated character
  41.     pop    h    ;restore registers
  42.     pop    d
  43.     lda    usrnum
  44.     call    setusr    ;set new user number
  45.  
  46.     mvi    c,openc
  47.     call    bdos
  48.     cpi    errorv    ;successful open?
  49.     pop    b
  50.  
  51.     mvi    a,11    ; set error code in case of error
  52.     jz    oerror    ;if error, go abort
  53.  
  54.     lda    tmp
  55.     call    fgfd    ;get HL pointing to fd table entry
  56.     lda    arg2
  57.     ora    a    ;open for read?
  58.     mvi    d,3
  59.     jz    open4
  60.     dcr    a
  61.     mvi    d,5
  62.     jz    open4    ;write?
  63.     dcr    a
  64.     mvi    a,12    ;"bad mode" for open operation...
  65.     jnz    oerror    ;...if not mode 2
  66.     mvi    d,7    ;else must be mode 2.
  67. open4:    lda    usrnum    ;get user number for the file
  68.     add    d    ;add r/w bit codes
  69.     mov    m,a    ;and store in fd table
  70.     inx    h    ;clear max sector number field of fd entry
  71.     xra    a
  72.     mov    m,a
  73.     inx    h
  74.     mov    m,a
  75.     lda    tmp    ;get back fd
  76.     mov    l,a
  77.     mvi    h,0
  78.     call    rstusr    ;reset user number
  79.     ret
  80.  
  81. oerror:    call    rstusr    ;reset user number
  82.     sta    errnum    ;store error code number
  83.     jmp    error    ;and return general error condition
  84.     ENDFUNC
  85.  
  86. ;
  87. ; Lokrec:
  88. ;     lokrec(fd,rec);
  89. ; Lock specified record using Function 42.  If rec -1, lock whole file.
  90. ;
  91. ; Returns with A (and HL) =    0 if successful
  92. ;                1 if positioning to unwritten data
  93. ;                3 if error changing extents
  94. ;                4 if positioning to unwritten extent
  95. ;                6 if random record number too large
  96. ;                8 if record locked by another process
  97. ;
  98. ; See the TurboDOS manual for more details on the use of this function.
  99. ;
  100.  
  101.     FUNCTION    lokrec
  102.     call    arghak
  103.     lda    arg1
  104.     call    fgfd
  105.     mov    d,m    ;save fdt entry in D
  106.     mvi    a,7    ;prepare for possible "bad fd"
  107.     jc    lerror
  108.  
  109.     mov    a,d
  110.     ani    2
  111.     mvi    a,8    ;prepare for possible "no read permission"
  112.     jz    lerror
  113.  
  114.     push    b    ;save BC
  115.     mov    a,d
  116.     call    setusr    ;set user area to that of the file
  117.  
  118.     lda    arg1
  119.     call    fgfcb    ;get pointer to fd table entry
  120.  
  121.     mov    d,h    ;mov fcb address into DE
  122.     mov    e,l
  123.     lxi    h,33    ;get to random record field
  124.     dad    d
  125.     push    h    ;save ptr to random record field for after BDOS call
  126.     shld    tmp
  127.  
  128.     mov    a,m
  129.     inx    h
  130.     mov    h,m
  131.     mov    l,a    ;HL = current setting
  132.     push    h    ;save current value of random record field
  133.  
  134.     lhld    tmp    ;get address of random record field
  135.     lda    arg2
  136.     mov    m,a
  137.     inx    h
  138.     lda    arg2+1
  139.     mov    m,a
  140.     inx    h
  141.     cpi    0ffh
  142.     push    psw
  143.     mov    a,m
  144.     sta    tmp
  145.     pop    psw
  146.     jnz    lok2
  147.     mov    m,a
  148. lok2:
  149.     push    d
  150.     mvi    c,42    ;Lock Random Record
  151.     call    bdos
  152.     pop    d
  153.     cpi    8
  154.     jz    lok2
  155.     
  156.     pop    b    ;pop old random record value into BC
  157.     pop    h    ;get pointer to random record field
  158.     mov    m,c    ;restore original value
  159.     inx    h
  160.     mov    m,b
  161.     push    psw    ;save returned value
  162.     lda    tmp
  163.     inx    h
  164.     mov    m,a    ;restore 3rd byte of random record field
  165.     call    rstusr
  166.     pop    psw
  167.     mov    l,a
  168.     mvi    h,0
  169.     pop    b
  170.     ret
  171.  
  172. lerror:    sta    errnum
  173.     jmp    error
  174.     ENDFUNC
  175.  
  176. ;
  177. ; Frerec:
  178. ;     frerec(fd,rec);
  179. ; Unlock specified record using Function 43.
  180. ;
  181. ; If rec = -1, release any all-inclusive lock,
  182. ; but not any individual record locks.
  183. ;
  184. ; Returns with A (and HL) =    0 if successful
  185. ;                1 if positioning to unwritten data
  186. ;                3 if error changing extents
  187. ;                4 if positioning to unwritten extent
  188. ;                6 if random record number too large
  189. ;
  190. ; See the TurboDOS manual for more details on the use of this function.
  191. ;
  192.  
  193.     FUNCTION    frerec
  194.     call    arghak
  195.     lda    arg1
  196.     call    fgfd
  197.     mov    d,m    ;save fdt entry in D
  198.     mvi    a,7    ;prepare for possible "bad fd"
  199.     jc    uerror
  200.  
  201.     mov    a,d
  202.     ani    2
  203.     mvi    a,8    ;prepare for possible "no read permission"
  204.     jz    uerror
  205.  
  206.     push    b    ;save BC
  207.     mov    a,d
  208.     call    setusr    ;set user area to that of the file
  209.  
  210.     lda    arg1
  211.     call    fgfcb    ;get pointer to fd table entry
  212.  
  213.     mov    d,h    ;restore fcb address into DE
  214.     mov    e,l
  215.     lxi    h,33    ;get to random record field
  216.     dad    d
  217.     push    h    ;save ptr to random record field for after BDOS call
  218.     shld    tmp
  219.  
  220.     mov    a,m
  221.     inx    h
  222.     mov    h,m
  223.     mov    l,a    ;HL = current setting
  224.     push    h    ;save current value of random record field
  225.  
  226.     lhld    tmp    ;get address of random record field
  227.     lda    arg2
  228.     mov    m,a
  229.     inx    h
  230.     lda    arg2+1
  231.     mov    m,a
  232.     inx    h
  233.     cpi    0ffh
  234.     push    psw
  235.     mov    a,m
  236.     sta    tmp
  237.     pop    psw
  238.     jnz    ulok2
  239.     mov    m,a
  240. ulok2:
  241.  
  242.     mvi    c,43    ;Unlock Random Record
  243.     call    bdos
  244.     pop    b    ;pop old random record value into BC
  245.     pop    h    ;get pointer to random record field
  246.     mov    m,c    ;restore original value
  247.     inx    h
  248.     mov    m,b
  249.     push    psw
  250.     lda    tmp
  251.     inx    h
  252.     mov    m,a
  253.     call    rstusr
  254.     pop    psw
  255.     mov    l,a
  256.     mvi    h,0
  257.     pop    b
  258.     ret
  259.  
  260. uerror:    sta    errnum
  261.     jmp    error
  262.     ENDFUNC
  263.  
  264.     END
  265. 
  266.     ani    2
  267.     mvi    a,8    ;prepare for possible "no read per