home *** CD-ROM | disk | FTP | other *** search
/ CP/M / CPM_CDROM.iso / cpm / utils / asmutl / freset.asm < prev    next >
Assembly Source File  |  1994-07-13  |  3KB  |  123 lines

  1. ; Routine:    FRESET -- fast drive reset and login
  2. ; Author:    Bridger Mitchell (Plu*Perfect Systems)
  3. ; CPU:        Z80-compatible
  4. ; Date:        December 27, 1987
  5. ; This routine (fast-)resets and logs in the cp/m drive in register
  6. ; (A).  When possible, it uses BDOS function 37 (logoff drives). 
  7. ; In most cases FRESET is significantly faster than using function 13
  8. ; (reset all drives) to do a general reset.
  9. ; FRESET functions correctly with Digital Research's CP/M 2.2 bdos,
  10. ; which contains a bug that does not allow the logged-in drive to
  11. ; be reset with function 37.
  12. ; Some CP/M bdos emulators (such as ZRDOS, PZDOS, ...) have changed
  13. ; the operation of the general-reset function 13, in order to speed
  14. ; up warm-boots and disk-resets on systems with hard-drives. In this
  15. ; case, a non-removable drive (hard disk, ram disk), after it
  16. ; has been initially logged in, remains logged in after a general
  17. ; reset.
  18. ; On such systems it is **essential** that any program that uses
  19. ; BIOS disk functions to write to a non-removable drive also cause
  20. ; the disk's allocation map to be rebuilt before any BDOS disk
  21. ; functions are used.  DU (DU3) and UNERASE are probably the most
  22. ; common examples of such programs; they modify the disk directory.
  23. ; For these systems, the drive must first be logged off with
  24. ; function 37 and then logged in.  Calling FRESET within such
  25. ; programs will ensure that the disk's allocation map is recomputed.
  26. ; The FRESET algorithm:
  27. ;
  28. ;   if requested_drive is logged in
  29. ;     if a second drive is logged in
  30. ;         log in the second drive
  31. ;         logoff requested drive (fn.37)
  32. ;     else
  33. ;         do general reset (fn. 13)    
  34. ;   log in requested drive
  35. ;
  36. xbdos    equ    5
  37.  
  38. ;    Fast-reset drive (A)
  39. ;    A = 0 ... 15  for  A: ... P:
  40. ;    
  41. CSEG
  42. freset:
  43.     ld    (reqdrv),a    ; save requested drive
  44.     push    af
  45.     ld    c,24        ; get logged-in drives vector
  46.     call    xbdos
  47.     pop    af        ; (recover requested drive)
  48.     push    hl        ; save logged-in vector
  49.     call    fshftr        ; shift requested drive's bit to bit 0
  50.     bit    0,l        ; is requested drive logged in?
  51.     pop    hl        ;  (recover (unshifted) logged vector)
  52.     jr    z,flogit    ; ..z - no, just log it in
  53.     ld    b,0        ;  initialize drive index/count
  54.     jr    frese2
  55. ;
  56. frese1:    ld    a,1        ; shift vector right 1 bit
  57.     call    fshftr
  58. frese2:    bit    0,l        ; if drive is logged in
  59.     jr    z,frese3    ;
  60.     ld    a,(reqdrv)    ; .. and it is not requested drive
  61.     cp    b
  62.     jr    nz,fnd2nd    ; .. have found 2nd logged in drive
  63. frese3:    inc    b        ; else increment drive count
  64.     ld    a,b        ;   and continue for 16 drives 
  65.     cp    16
  66.     jr    c,frese1    ;
  67.     ld    c,13        ; no other drive is logged in, so..
  68.     jr    flogit0        ; ..do general reset, then (re)log requested
  69. ;
  70. ;    have a second logged-in drive, so switch to it
  71. ;
  72. fnd2nd:    ld    e,b        ; select b'th drive
  73.     call    fslctit
  74.     ld    a,(reqdrv)    ; set up bit to log out drive
  75.     ld    hl,1
  76.     call    fshftl
  77.     ex    de,hl
  78.     ld    c,37        ; log out drive in DE vector
  79. ;
  80. flogit0:call    xbdos
  81. ;
  82. ;    login requested drive
  83. ;
  84. flogit:    ld    a,(reqdrv)
  85.     ld    e,a
  86. fslctit:ld    c,14        ; select bdos drive
  87.     jp    xbdos    
  88. ;
  89. ;
  90. ; shift hl right (a) bits
  91. ;
  92. fshftr:
  93.     inc    a
  94. shftr1:    dec    a
  95.     ret    z
  96.     srl    h
  97.     rr    l    
  98.     jr    shftr1
  99. ;
  100. ;
  101. ; shift hl left (a) bits
  102. ;
  103. fshftl:
  104.     inc    a
  105. shftl1:    dec    a
  106.     ret    z
  107.     add    hl,hl
  108.     jr    shftl1    
  109.  
  110. ;--------------------
  111. DSEG
  112. reqdrv:    ds    1
  113.  
  114.     end
  115. t
  116.     call    fshftr
  117. frese2:    bit    0,l        ; i