home *** CD-ROM | disk | FTP | other *** search
/ Simtel MSDOS - Coast to Coast / simteldosarchivecoasttocoast2.iso / c / mfile.asm < prev    next >
Assembly Source File  |  1994-03-04  |  3KB  |  141 lines

  1. Date: Friday, 2 May 1986  16:39-MDT
  2. From: Dana Myers <bilbo.dana at LOCUS.UCLA.EDU>
  3. To:   Info-IBMPC at USC-ISIB.ARPA
  4. Re:   20 File Limit
  5.  
  6.  Jeff Jacobsen recently sent a message repeating a clipping from DDJ
  7. (5/86) about expanded file handles. Having been aware of this
  8. mechanism existing for a while (2.X or 3.X), I thought I would try it.
  9. Something that seems to be ommitted from the DDJ article (16 Bit
  10. Toolbox, I believe) is that it is important to copy all the file
  11. descriptors in the original table.  Also, depending what you
  12. initialize your new table to, the 'new' entries (extra entries on the
  13. end) MUST be initialized to 0xFF. Otherwise, DOS will (a) believe you
  14. have a bunch of open files and (b) not let you open nearly as many as
  15. you might expect. In the case of Asm, you can DUP fill the new table
  16. with 0xFF. In the case of C, you can either prefill, initialize or do
  17. what I did; while copying the table, add on a remaining count of
  18. 0xFFs. Of course, if your new tabke is SMALLER than the 20 file table,
  19. be sure to close any file descriptors which will not be copied. (Of
  20. course, who is going to make a smaller new table?)
  21.  
  22.   It seems (as I expected) that the larger table will be closed and
  23. forgotten by DOS on exit; there is no need to restore the PSP table or
  24. such.
  25.  
  26. The source to mfile.asm
  27.  
  28. use as:
  29. mfile(size, arr)
  30. int    size;        /* sizeof(arr) */
  31. char    *arr;        /* pointer to an arry at least size big */
  32.  
  33. written for S model Microsoft C V3
  34.  
  35. ;    Static Name Aliases
  36. ;
  37.     TITLE   mfile
  38.  
  39. _TEXT    SEGMENT  BYTE PUBLIC 'CODE'
  40. _TEXT    ENDS
  41.  
  42. CONST    SEGMENT  WORD PUBLIC 'CONST'
  43. CONST    ENDS
  44.  
  45. _BSS    SEGMENT  WORD PUBLIC 'BSS'
  46. _BSS    ENDS
  47.  
  48. _DATA    SEGMENT  WORD PUBLIC 'DATA'
  49. _DATA    ENDS
  50.  
  51. DGROUP    GROUP    CONST,    _BSS,    _DATA
  52.     ASSUME  CS: _TEXT, DS: DGROUP, SS: DGROUP, ES: DGROUP
  53.  
  54. PUBLIC  _mfile
  55.  
  56.  
  57. ;
  58. ; PSP structure of the filetable header
  59. ;
  60.  
  61. pspf    struc
  62.  
  63. p_count    dw    ?
  64. p_ptr    dd    ?
  65.  
  66. pspf    ends
  67.  
  68. PSPF_OFF    equ    0032h
  69.  
  70.  
  71. _TEXT      SEGMENT
  72.  
  73. ;    p = 6
  74. ;    n = 4
  75. ;    rem = -2
  76.  
  77. _mfile    PROC NEAR
  78.     push    bp
  79.     mov    bp,sp
  80.     push    SI
  81.     push    DI
  82.     push    ES
  83.  
  84. ;
  85. ; copy the old table to the new, if possible
  86. ;
  87.  
  88.     mov    AH, 051h    ; get PSP
  89.     int    021h
  90.     mov    ES, BX
  91.     mov    BX, PSPF_OFF
  92.     mov    AX, ES:[BX.p_count]    ; current size
  93.     mov    CX, [BP+4]
  94.     sub    CX, AX            ; any leftover?
  95.     jle    mf_001
  96.     mov    [BP-2], CX        ; save rem count
  97.     jmp    short mf_004        ; leave count in AX
  98.  
  99. mf_001:
  100.     mov    AX, [BP+4]
  101.     mov    word ptr [BP-2], 0
  102.  
  103. mf_004:
  104.     mov    DI, [BP+6]        ; get dest
  105.     mov    DX, DI
  106.     mov    CX, AX            ; AX has count in bytes
  107.     push    ES
  108.     push    DS
  109.     lds    SI, dword ptr ES:[BX.p_ptr]
  110.     cld
  111.     mov    AX, DGROUP
  112.     mov    ES, AX
  113.     rep    movsb
  114.     mov    CX, [BP-2]    ; get remnant
  115.     or    CX, CX
  116.     jz    mf_003
  117.     xchg    AX, [BP-2]
  118.     mov    AL, -1
  119.     rep    stosb        ; fill in table
  120.     xchg    AX, [BP-2]
  121. mf_003:
  122.     pop    DS
  123.     pop    ES
  124.     mov    word ptr ES:[BX.p_ptr], DX    ; DX has offest
  125.     mov    word ptr ES:[BX.p_ptr+2], AX    ; AX has segment
  126.     mov    AX, [BP+4]            ; get new size
  127.     mov    ES:[BX.p_count], AX
  128.  
  129. mf_002:
  130.     pop    ES
  131.     pop    DI
  132.     pop    SI
  133.     mov    sp,bp
  134.     pop    bp
  135.     ret
  136.  
  137. _mfile    ENDP
  138.  
  139. _TEXT    ENDS
  140.     END
  141.