home *** CD-ROM | disk | FTP | other *** search
/ PC Open 19 / pcopen19.iso / Zipped / PART231.ZIP / SOURCES.ZIP / DISKIO.ASM < prev    next >
Encoding:
Assembly Source File  |  1998-01-12  |  5.9 KB  |  412 lines

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