home *** CD-ROM | disk | FTP | other *** search
/ PC World 2002 February / PCWorld_2002-02_cd.bin / Software / Vyzkuste / ranish / SOURCES.ZIP / DISKIO.ASM < prev    next >
Encoding:
Assembly Source File  |  1998-09-12  |  7.7 KB  |  518 lines

  1. .MODEL LARGE
  2. .DATA
  3.  
  4. SECT_SIZE    EQU    512    ; If not we will eventually crash
  5.  
  6. PUBLIC    _detected_os
  7.  
  8. SYS_DOS        EQU    0    ; MS-DOS v1.00 - v4.xx
  9. SYS_DOS5    EQU    1    ; MS-DOS v5.00 - v6.xx
  10. SYS_DOS7    EQU    2    ; Comand line mode of Win95
  11. SYS_WIN3    EQU    3    ; GUI mode of Windows 3.xx
  12. SYS_WIN95    EQU    4    ; GUI mode of Windows 95
  13. SYS_WIN_NT    EQU    5    ; Windows NT
  14.  
  15. _detected_os    DW    0
  16.  
  17. _reboot_addr    DD    0FFFF0000h
  18.  
  19. .CODE
  20. LOCALS
  21.  
  22. PUBLIC _diskio_init
  23. PUBLIC _diskio_exit
  24.  
  25. PUBLIC _reboot
  26. PUBLIC _flush_caches
  27.  
  28. PUBLIC _get_disk_info
  29.  
  30. PUBLIC _disk_lock
  31. PUBLIC _disk_unlock
  32.  
  33. PUBLIC _dos_drive_reset
  34.  
  35. PUBLIC _disk_read
  36. PUBLIC _disk_write
  37. PUBLIC _disk_format
  38. PUBLIC _disk_verify
  39.  
  40. ;----------------------------------------------------------------
  41.  
  42.  
  43. _diskio_init    PROC
  44.         push    bp
  45.         mov    bp, sp
  46.         push    es
  47.         push    si
  48.         push    di
  49.  
  50.         mov    si, SYS_DOS
  51.         mov    ax, 3000h    ; Get DOS version
  52.         int    21h
  53.         cmp    al, 5
  54.         jb    @@end
  55.         
  56.         mov    ax, 3306h    ; Get true DOS version
  57.         int    21h
  58.         
  59.         mov    si, SYS_WIN_NT
  60.         cmp    bx, 3205h    ; WinNT dos box returns v5.50
  61.         je    @@end
  62.  
  63.         mov    ax, 1600h    ; Get Windows version
  64.         int    2Fh
  65.         cmp    al, 0
  66.         je    @@no_win
  67.         cmp    al, 80h
  68.         je    @@no_win
  69.         cmp    al, 0FFh
  70.         je    @@no_win
  71.  
  72.         mov    si, SYS_WIN3
  73.         cmp    al, 3
  74.         je    @@end
  75.  
  76.         mov    si, SYS_WIN95    ; Windows 95 GUI
  77.         
  78.         mov    ax, 1684h    ; Lets get Reboot VxD API
  79.         mov    bx, 0009h
  80.         int    2Fh
  81.         mov    bx, es
  82.         or    bx, di        ; Did it returned 0000:0000h ?
  83.         jz    @@end
  84.  
  85.         mov    Word Ptr [_reboot_addr], di
  86.         mov    Word Ptr [_reboot_addr+2], es
  87.  
  88.         jmp    @@end
  89.         
  90.     @@no_win:            ; Windows 3+ is not running
  91.  
  92.         mov    ax, 3306h    ; Get true DOS version
  93.         int    21h
  94.  
  95.         mov    si, SYS_DOS5
  96.         cmp    bl, 7        ; Windows 95 reports v 7.xx
  97.         jb    @@end
  98.  
  99.         mov    si, SYS_DOS7
  100.     @@end:
  101.         mov    _detected_os, si
  102.  
  103.         pop    di
  104.         pop    si
  105.         pop    es
  106.         pop    bp
  107.         retf
  108. _diskio_init    ENDP
  109.  
  110.  
  111. _diskio_exit    PROC
  112.         retf
  113. _diskio_exit    ENDP
  114.  
  115. ;----------------------------------------------------------------
  116.  
  117. _reboot    PROC
  118.     call    _flush_caches
  119.     mov    ax, 0100h    ; Warm reboot if
  120.     call    [_reboot_addr]    ; calling Win95 API
  121. crazy:    jmp    crazy        ; We should never get crazy
  122. _reboot    ENDP
  123.  
  124. ;----------------------------------------------------------------
  125.  
  126. _flush_caches    PROC
  127.         push    ds
  128.         push    es
  129.         push    bp
  130.         push    si
  131.         push    di
  132.  
  133.         mov    ah, 0Dh        ; Flush and reset MS-DOS buffers
  134.         int    21h
  135.  
  136.         mov    ax, 4A10h    ; Flush SmartDrive 4+ Caches
  137.         mov    bx, 01
  138.         mov    cx, 0EBABh
  139.         int    2Fh
  140.         mov    ax, 4A10h    ; Reset SmartDrive 4+ Caches
  141.         mov    bx, 02
  142.         mov    cx, 0EBABh
  143.         int    2Fh
  144.  
  145.         xor    ax, ax
  146.         
  147.         pop    di
  148.         pop    si
  149.         pop    bp
  150.         pop    es
  151.         pop    ds
  152.         retf
  153. _flush_caches    ENDP
  154.  
  155.  
  156. ;----------------------------------------------------------------
  157.  
  158.  
  159.  
  160. _get_disk_info    PROC
  161.  
  162.    buf_ptr    EQU    [bp+0Ch]
  163.   disk_info    EQU    [bp+08h]
  164.      hd        EQU    [bp+06h]
  165.  
  166.  disk        EQU    Word Ptr es:[si]
  167.  num_cyls    EQU    Word Ptr es:[si+2]
  168.  num_heads    EQU    Word Ptr es:[si+4]
  169.  num_sects    EQU    Word Ptr es:[si+6]
  170.  total_sects0    EQU    Word Ptr es:[si+8]
  171.  total_sects1    EQU    Word Ptr es:[si+10]
  172.  sect_per_cyl    EQU    Word Ptr es:[si+12]
  173.  sect_per_track    EQU    Word Ptr es:[si+14]
  174.  sect_size    EQU    Word Ptr es:[si+16]
  175.  bios_num_cyls    EQU    Word Ptr es:[si+18]
  176.  
  177.         push    bp
  178.         mov    bp, sp
  179.         push    es
  180.         push    si
  181.         push    di
  182.         les    si, disk_info
  183.  
  184.  
  185.         mov    ah, 08h
  186.         mov    dl, hd
  187.         int    13h
  188.  
  189.         mov    ax, -1
  190.         jnc    @@fill_struct
  191.         jmp    @@end
  192.  
  193. @@fill_struct:
  194.         mov    ax, SECT_SIZE
  195.         mov    sect_size, ax
  196.  
  197.         mov    ah, 0
  198.         mov    al, dl
  199.         push    ax    ; num_disks
  200.  
  201.         mov    ah, 0
  202.         mov    al, cl
  203.         and    al, 3Fh
  204.         mov    num_sects, ax
  205.         mov    sect_per_track, ax
  206.  
  207.         mov    al, dh
  208.         inc    ax
  209.         mov    num_heads, ax
  210.  
  211.         mov    al, ch
  212.         shl    cx, 1
  213.         shl    cx, 1
  214.         and    ch, 3
  215.         mov    ah, ch
  216.         inc    ax
  217.         mov    num_cyls, ax
  218.         mov    bios_num_cyls, ax
  219.  
  220.         mov    ax, hd
  221.         mov    disk, ax
  222.         
  223.         
  224.         push    es        ; Lets check if BIOS hides last cyl
  225.  
  226.         mov    dx, disk    ; read last sector from last + 1 cyl
  227.         mov    ax, num_heads
  228.         dec    ax
  229.         mov    dh, al     ; head
  230.         mov    ax, num_sects
  231.         mov    cl, al    ; sect
  232.         mov    bx, bios_num_cyls
  233.         cmp    bx, 1024
  234.         jz    @@nomore
  235.         mov    ch, bl
  236.         mov    bl, 0
  237.         shr    bx, 1
  238.         shr    bx, 1
  239.         or    cl, bl
  240.  
  241.         les    bx, buf_ptr
  242.         mov    ax, es
  243.         or    ax, bx
  244.         jz    @@nomore
  245.         mov    ah, 02h    ; Read 1
  246.         mov    al, 1    ; sector
  247.         int    13h
  248.         jc    @@nomore
  249.         mov    bx, bios_num_cyls
  250.         inc    bx
  251.         mov    num_cyls, bx
  252.     @@nomore:
  253.         pop    es
  254.  
  255.         mov    ax, num_sects
  256.         mov    bx, num_heads
  257.         mul    bx
  258.         mov    sect_per_cyl, ax
  259.         mov    bx, num_cyls
  260.         mul    bx
  261.         mov    total_sects0, ax
  262.         mov    total_sects1, dx
  263.  
  264.         pop    ax    ; num_disks
  265.  
  266.     @@end:
  267.         pop    di
  268.         pop    si
  269.         pop    es
  270.         pop    bp
  271.         retf
  272. _get_disk_info    ENDP
  273.  
  274.  
  275. ;----------------------------------------------------------------
  276.  
  277.  
  278. _disk_lock    PROC
  279.  
  280.     disk    EQU    [bp+06h]
  281.  
  282.         push    bp
  283.         mov    bp, sp
  284.  
  285.         cmp    _detected_os, SYS_WIN95
  286.         jb    @@skip
  287.  
  288.         mov    ax, 440Dh
  289.         mov    cx, 084Bh    ; Lock phisical disk
  290.         mov    bl, disk
  291.         mov    bh, 1        ; Lock level (0-3)
  292.         mov    dx, 0        ; Device permissions
  293.         int    21h
  294.  
  295.         mov    ax, -1
  296.         jc    @@end
  297.     @@skip:
  298.         mov    ax, 0
  299.     @@end:
  300.         pop    bp
  301.         retf
  302. _disk_lock    ENDP
  303.  
  304.  
  305. ;----------------------------------------------------------------
  306.  
  307.  
  308. _disk_unlock    PROC
  309.  
  310.     disk    EQU    [bp+06h]
  311.  
  312.         push    bp
  313.         mov    bp, sp
  314.  
  315.         cmp    _detected_os, SYS_WIN95
  316.         jb    @@skip
  317.  
  318.         mov    ax, 440Dh
  319.         mov    cx, 086Bh    ; Unlock phisical disk
  320.         mov    bl, disk
  321.         int    21h
  322.  
  323.         mov    ax, -1
  324.         jc    @@end
  325.     @@skip:
  326.         mov    ax, 0
  327.     @@end:
  328.         pop    bp
  329.         retf
  330. _disk_unlock    ENDP
  331.  
  332. ;----------------------------------------------------------------
  333.  
  334. _dos_drive_reset    PROC
  335.  
  336.   drive_num    EQU    [bp+06h]
  337.  
  338.         push    bp
  339.         mov    bp, sp
  340.         push    ds
  341.         push    es
  342.         push    si
  343.         push    di
  344.  
  345.         mov    ah, 32h
  346.         mov    dl, drive_num
  347.         int    21h
  348.         mov    ah, al
  349.         
  350.         pop    di
  351.         pop    si
  352.         pop    es
  353.         pop    ds
  354.         pop    bp
  355.         retf
  356. _dos_drive_reset    ENDP
  357.  
  358.  
  359. ;----------------------------------------------------------------
  360.  
  361.   disk        EQU    es:[si]
  362.   cyl        EQU    es:[si+2]
  363.   head        EQU    es:[si+4]
  364.   sect        EQU    es:[si+6]
  365.  
  366.  Get_Disk_Params    MACRO
  367.  
  368.         mov    dl, disk
  369.         mov    dh, head
  370.         mov    cl, sect
  371.         and    cl, 3Fh
  372.         mov    bx, cyl
  373.         mov    ch, bl
  374.         mov    bl, 0
  375.         shr    bx, 1
  376.         shr    bx, 1
  377.         or    cl, bl
  378.  
  379.          ENDM
  380. ;----------------------------------------------------------------
  381.  
  382.  
  383. _disk_read    PROC
  384.  
  385.     num        EQU    [bp+0Eh]
  386.   buf_ptr    EQU    [bp+0Ah]
  387.  disk_addr    EQU    [bp+06h]
  388.  
  389.         push    bp
  390.         mov    bp, sp
  391.         push    es
  392.         push    si
  393.         push    di
  394.         les    si, disk_addr
  395.  
  396.         mov    ah, 02h    ; Read
  397.         mov    al, num    ; Sectors
  398.         Get_Disk_Params
  399.         les    bx, buf_ptr
  400.         int    13h
  401.         
  402.         mov    ax, -1
  403.         jc    @@skip
  404.         mov    ax, 0
  405.     @@skip:
  406.  
  407.         pop    di
  408.         pop    si
  409.         pop    es
  410.         pop    bp
  411.         retf
  412. _disk_read    ENDP
  413.  
  414.  
  415. ;----------------------------------------------------------------
  416.  
  417.  
  418. _disk_write    PROC
  419.  
  420.     num        EQU    [bp+0Eh]
  421.   buf_ptr    EQU    [bp+0Ah]
  422.  disk_addr    EQU    [bp+06h]
  423.  
  424.         push    bp
  425.         mov    bp, sp
  426.         push    es
  427.         push    si
  428.         push    di
  429.         les    si, disk_addr
  430.  
  431.         mov    ah, 03h    ; Write
  432.         mov    al, num ; Sectors
  433.         Get_Disk_Params
  434.         les    bx, buf_ptr
  435.         int    13h
  436.         
  437.         mov    ax, -1
  438.         jc    @@skip
  439.         mov    ax, 0
  440.     @@skip:
  441.  
  442.         pop    di
  443.         pop    si
  444.         pop    es
  445.         pop    bp
  446.         retf
  447. _disk_write    ENDP
  448.  
  449.  
  450. ;----------------------------------------------------------------
  451.  
  452.  
  453. _disk_verify    PROC
  454.  
  455.   num_sect    EQU    [bp+0Ah]
  456.  disk_addr    EQU    [bp+06h]
  457.  
  458.         push    bp
  459.         mov    bp, sp
  460.         push    es
  461.         push    si
  462.         push    di
  463.         les    si, disk_addr
  464.  
  465.         mov    ah, 04h        ; Verify
  466.         mov    al, num_sect    ; How many sectors
  467.         Get_Disk_Params
  468.         int    13h
  469.         
  470.         mov    ax, -1
  471.         jc    @@end
  472.         mov    ax, 0
  473.     @@end:
  474.         pop    di
  475.         pop    si
  476.         pop    es
  477.         pop    bp
  478.         retf
  479. _disk_verify    ENDP
  480.  
  481.  
  482. ;----------------------------------------------------------------
  483.  
  484.  
  485. _disk_format    PROC
  486.  
  487.   ftable    EQU    [bp+0Ah]
  488.  disk_addr    EQU    [bp+06h]
  489.  
  490.         push    bp
  491.         mov    bp, sp
  492.         push    es
  493.         push    si
  494.         push    di
  495.         les    si, disk_addr
  496.  
  497.         mov    ah, 05h        ; Format
  498.         Get_Disk_Params
  499.         les    bx, ftable
  500.         int    13h
  501.         
  502.         mov    ax, -1
  503.         jc    @@end
  504.         mov    ax, 0
  505.     @@end:
  506.         pop    di
  507.         pop    si
  508.         pop    es
  509.         pop    bp
  510.         retf
  511. _disk_format    ENDP
  512.  
  513.  
  514. ;----------------------------------------------------------------
  515.  
  516.  
  517. END
  518.