home *** CD-ROM | disk | FTP | other *** search
/ Oakland CPM Archive / oakcpm.iso / cpm / filutl / decuf13.ark / EXTFN.MAC < prev    next >
Text File  |  1989-09-27  |  4KB  |  112 lines

  1.     .Z80
  2. ;
  3. ; Extend_BDos_Disk_Functions, ExtBDF.
  4. ;
  5. ; To support extended filenames, that is unambigious file names including
  6. ; a user number, the BDos functions need to be extended. As a part of the
  7. ; normal file operations, the user number of the file must be selected
  8. ; prior to the file operation. After the file operation, the original
  9. ; user number must be restored.
  10. ;
  11. ; The FCB's of the files using the extended file names must be registered
  12. ; in a special list.  Each entry in the list specifies the address of the
  13. ; FCB together with the user number of the file.
  14. ;
  15. ; If a file operation is requested from BDos AND the supplied FCB address
  16. ; is registred, the user number swapping is performed.  In all other
  17. ; cases, no special action is taken other than invoking BDos.
  18. ;
  19.  
  20. BDOS    EQU    0001H        ;Address of real BDos
  21. EXALRB    EQU    0002H        ;List of registered FCB's
  22. EXANRB    EQU    0003H        ;Number of registered FCB's
  23. CURUSR    EQU    0004H        ;Save area current user number
  24. ;
  25. XFR:    LD    A,(EXANRB)    ;Number of registred FCB's
  26.     JR    Z,EXA010    ;Exit if none registred
  27. ;
  28. ; The following BDos function codes must be handled especially:
  29. ;    15 - Open File
  30. ;    16 - Close File
  31. ;    19 - Delete File
  32. ;    20 - Read Sequential
  33. ;    21 - Write Sequential
  34. ;    22 - Make File
  35. ;     ( 30 - Set File Attributes )
  36. ;    33 - Read Random
  37. ;    34 - Write Random
  38. ;    35 - Compute File Size
  39. ;    40 - Write Random with Zero Fill
  40. ;
  41.     LD    A,C        ;Function code
  42. ;
  43.     SUB    15        ;Compare with lower bound, 15
  44.     JR    C,EXA010    ;Exit if non-disk function
  45.     SUB    16+1-15        ;Compare with upper bound, 16
  46.     JR    C,EXA020    ;Brif a disk function
  47. ;
  48.     SUB    19-16-1        ;Compare with lower bound, 19
  49.     JR    C,EXA010    ;Exit if non-disk function
  50.     SUB    22+1-19        ;Compare with upper bound, 22
  51.     JR    C,EXA020    ;Brif a disk function
  52. ;
  53.     SUB    33-22-1        ;Compare with lower bound, 33
  54.     JR    C,EXA010    ;Exit if non-disk function
  55.     SUB    35+1-33        ;Compare with upper bound, 35
  56.     JR    C,EXA020    ;Brif a disk function
  57. ;
  58. ; The BDos function is not one of the disk function to be intercepted.
  59. ; Invoke BDos to handle the function request.
  60. ;
  61. EXA010:    JP    BDOS        ;Enter BDOS
  62. ;
  63. ; The BDos function is one of the disk functions which might need
  64. ; modification of the user area.  Check the address of the FCB to
  65. ; be one of the registered FCB's.
  66. ;
  67. EXA020:    LD    IY,EXALRB    ;List of registered FCB's
  68.     LD    A,(EXANRB)    ;Number of registered FCB's
  69.     LD    B,A        ;Move number
  70. ;
  71. EXA025:    LD    L,(IY+0)    ;LSB of registered FCB address
  72.     LD    H,(IY+1)    ;MSB of registered FCB address
  73.     OR    A        ;Clear carry flag
  74.     SBC    HL,DE        ;Compare with supplied FCB address
  75.     JR    Z,EXA030    ;Brif FCB found in list
  76.     INC    IY        ;Move pointer to next entry
  77.     INC    IY
  78.     INC    IY
  79.     DJNZ    EXA025        ;Brif not at end of list
  80.     JR    EXA010        ;FCB is not registered
  81. ;
  82. ; A registered FCB is supplied in this BDos call.  Fetch the current
  83. ; user number, select the user area needed for this function, perform
  84. ; the requested BDos function and restore the original user number.
  85. ;
  86. EXA030:    PUSH    BC        ;Save BDos function code
  87.     PUSH    DE        ;Save FCB address
  88. ;
  89.     LD    C,020H        ;Function= Get/Set_User_Number
  90.     LD    E,0FFH        ;Select Get_User_Number function
  91.     CALL    BDOS        ;Invoke BDos
  92.     LD    (CURUSR),A    ;Save current user number
  93. ;
  94.     LD    C,020H        ;Function= Get/Set_User_Number
  95.     LD    E,(IY+2)    ;Load requested user number
  96.     CALL    BDOS        ;Invoke BDos
  97. ;
  98.     POP    DE        ;Restore address of FCB
  99.     POP    BC        ;Restore BDos function code
  100.     CALL    BDOS        ;Invoke BDos
  101.     PUSH    AF        ;Save return code
  102. ;
  103.     LD    C,020H        ;Function=Get/Set_User_Number
  104.     LD    A,(CURUSR)    ;Original user number
  105.     LD    E,A        ;
  106.     CALL    BDOS        ;Invoke BDos
  107. ;
  108.     POP    AF        ;Restore return code from disk
  109.     RET            ;Return to calling procedure
  110. ;
  111.     END
  112.