home *** CD-ROM | disk | FTP | other *** search
/ Simtel MSDOS 1992 June / SIMTEL_0692.cdr / msdos / dskutl / fixdsk.asm < prev    next >
Assembly Source File  |  1985-12-25  |  3KB  |  107 lines

  1. ;* NOTE: FIXDSK.ASM modified 12/22/85 by C. Washburn to use INT 40H instead of
  2. ;  13H, and to restore contents of AH when retrying. INT 40H change was based
  3. ;  the notion that NOTHING should get in the Fixed Disk INT 13H code path if
  4. ;  at all possible! INT 40H is the relocated address of the BIOS Diskette code,
  5. ;  after the Fixed Disk Controller ROM installs itself, and is only and exclu-
  6. ;  sively for Floppy I/O.
  7.  
  8. ;===================================================================
  9. ;FIXDSK.ASM - corrects floppy disk timeout problem on speeded-up AT.
  10. ;
  11. ;-------------------------------------------------------------------
  12. ;MODIFIED 12/22/85 by C. Washburn, to use INT 40 instead of INT 13
  13. ;(the relocated diskette code when a fixed disk is present), and to
  14. ;restore the entry code in AH when retrying.
  15. ;
  16. ;Indicated Modifications are (C)Copyright 1985 Clyde Washburn,
  17. ;and are placed in the Public Domain.
  18. ;-------------------------------------------------------------------
  19. ;Create FIXDSK.COM as follows:
  20. ;
  21. ;     MASM FIXDSK.ASM;
  22. ;     LINK FIXDSK;
  23. ;     EXE2BIN FIXDSK.EXE FIXDSK.COM
  24. ;
  25. ;Then place FIXDSK.COM in your AUTOEXEC.BAT file.
  26. ;
  27. ;  (C)Copyright 1985 Michael J. Markowitz
  28. ;             Department of Mathematical Sciences
  29. ;             Loyola University of Chicago
  30. ;             Chicago, IL  60626
  31. ;             (312) 508-3567
  32. ;
  33. ;This program may be freely copied and used for noncommercial purposes.
  34. ;Under no circumstances may a fee be charged for its distribution nor
  35. ;may it be included in any commercial hardware or software package
  36. ;without the written consent of the owner.
  37. ;==================================================================
  38. TIME_OUT equ     80h
  39.  
  40. vectors segment at 0h
  41.      org     40h * 4         ;CW - 40h was 13h
  42. int_40h  label     dword             ;CW - ditto
  43. int_40h_ip     dw     ?         ;CW - ditto
  44. int_40h_cs     dw     ?         ;CW - ditto
  45. vectors ends
  46.  
  47. code     segment
  48.      assume  cs:code
  49.      org     100h
  50. start:     jmp     init
  51.  
  52. ah_cont         db     ?         ;CW - save AH entry contents here
  53. old_int_40h label dword             ;CW - 40h was 13h
  54. old_int_ip     dw     ?
  55. old_int_cs     dw     ?
  56.  
  57. ret_addr label     dword
  58. ret_addr_ip     dw     ?
  59. ret_addr_cs     dw     ?
  60.  
  61. flags         dw     ?
  62.  
  63. main     proc     far
  64.      mov     cs:ah_cont,ah         ;CW - save AH for possible reuse
  65.      pushf                 ;simulate original disk interrupt
  66.      call     old_int_40h         ;CW - 40h was 13h
  67.      pushf                 ;   and save returned flags
  68.      pop     flags
  69.      jnc     fin             ;if no error, return to caller
  70.  
  71.      cmp     ah,TIME_OUT         ;is it a timeout error?
  72.      jne     fin             ;   if no, return to caller
  73.  
  74.      pushf                 ;   if yes, try one more time
  75.      mov     ah,cs:ah_cont         ;CW - restore AH for retry
  76.      call     old_int_40h         ;CW - 40h was 13h
  77.  
  78. fin:     pop     ret_addr_ip         ;simulate an INTR
  79.      pop     ret_addr_cs
  80.      add     sp,2
  81.      push     flags             ;return flags from first ROM
  82.      popf                 ;   BIOS call
  83.      jmp     ret_addr
  84. main     endp
  85.  
  86. init     proc
  87.      assume  ds:vectors         ;establish addressability of
  88.      mov     ax,vectors         ;   interrupt vectors
  89.      mov     ds,ax
  90.  
  91.      mov     ax,int_40h_ip         ;save old disk interrupt vector
  92.      mov     old_int_ip,ax         ;(line above) CW - 40h was 13h
  93.      mov     ax,int_40h_cs         ;CW - 40h was 13h
  94.      mov     old_int_cs,ax
  95.  
  96.      mov     int_40h_ip,offset main  ;replace with dword ;CW - 40h was 13h
  97.      mov     int_40h_cs,cs         ;  pointer to fixdsk ;CW - ditto
  98.  
  99.      mov     dx,offset init
  100.      int     27h             ;terminate leaving main resident
  101. init     endp
  102.  
  103. db     'INT 40H VERSION OF 12/22/85'     ;CW - internal Modification ID
  104.  
  105. code     ends
  106.      end     start
  107.