home *** CD-ROM | disk | FTP | other *** search
/ C!T ROM 5 / ctrom5b.zip / ctrom5b / PROGRAM / ASM / ALIB30A / DISKINFO.ASM < prev    next >
Assembly Source File  |  1994-12-03  |  14KB  |  722 lines

  1. ;**************************** DISKINFO.ASM **********************************
  2. PAGE  70,132
  3.  
  4. ;Purpose:  Display information about DOS and BIOS fixed disk setup
  5. ;Usage:  DISKINFO <seg>
  6. ;        where: <seg> is optional memory area to dump
  7.         
  8.     include    mac.inc
  9.     include    common.inc
  10. ;-----------------------------------------------------------------------------
  11.     extrn    library_setup:far
  12.     extrn    clear_screen:far
  13.     extrn    library_terminate:far
  14.     extrn    byte_to_hex_str:far
  15.     extrn    word_to_hex_str:far
  16.  
  17. ;------------------------------- STRUCTURES -----------------------------------
  18.  
  19. lists struc
  20. dpb_ptr    dd    ?        ;ptr to dpb for A:
  21.            dd    ?        ;ptr to system file table
  22.     dd    ?        ;ptr to clock dev
  23.     dd    ?        ;ptr to CON device
  24. bps_    dw    ?        ;max bytes per sector
  25.     dd    ?        ;ptr to disk buffer rec
  26.     dd    ?        ;ptr to array of current dir struc's
  27.     dd    ?        ;ptr to system FCB tables
  28.     dw    ?        ;number of FCB's
  29.     db    ?        ;number of block devices
  30. nulld    db    ?        ;start of null device header
  31. lists    ends
  32.  
  33. ; location 40:75 has number of fixed disks
  34. ; location 0:4c  (int 13) disk bios entry
  35. ; location 0:100 (int 40) grabber by fixed disk
  36. ; location 0:104 (int 41) has fixed disk 0 parameters
  37. ; location 0:118 (int 46) has fixed disk 1 parameters
  38. ;
  39.  
  40. fparm    struc
  41. f_num_cyl    dw    ?        ;number of cyl
  42. f_num_hd    db    ?        ;number of heads
  43. f_writec    dw    ?        ;write current
  44. f_precom    dw    ?        ;write precomp
  45. f_burst     db    ?        ;burst
  46. f_ctrl        db    ?        ;ctrl
  47.     db    ?
  48.     db    ?
  49.     db    ?
  50. f_landing    dw    ?        ;landing cyl
  51. f_sec_trk    db    ?        ;sect/track
  52. fparm    ends
  53.     
  54.     
  55. ;------------------------------------------------------------------------------
  56. code        segment para public 'CODE'
  57.         assume    cs:code, ds:code
  58. ;-----------------------------------------------------------------------------
  59. pspseg        dw    0
  60. lib_info_ptr    dw    0
  61. lib_info_seg    dw    0
  62.  
  63.  
  64. file_asciiz        db    40 dup (0)
  65.  
  66. stacksize    equ    1024
  67.     db    stacksize dup (0)
  68. stack_    label    word
  69. ;
  70. signon_msg    label    byte
  71.  db 'diskinfo execution started --------------------------',0dh,0ah,0
  72.  
  73. app_text_color        db    07h,'background color',0
  74.  
  75.  
  76. ;-----------------------------------------------------------------------------
  77. start:
  78.     cli
  79.     mov    cs:pspseg,es    ;save PSP segment
  80.     mov    ax,cs        ;get CODE segment
  81.     mov    ss,ax
  82.     mov    ds,ax
  83.     mov    es,ax
  84.     mov    sp,offset stack_
  85.     sti
  86.     
  87. ; next, release memory beyond the end of the program
  88. ; The  definition for ZSEG marks the
  89. ; end of the program's code, data and stack area.
  90. ; When linking be sure ZSEG is at the end of the program.
  91.  
  92.     mov    ax,zseg
  93.  
  94.     mov    bx,cs:pspseg        ;
  95.     mov    es,bx
  96.     sub    bx,ax
  97.     neg    bx            ; size of program in paragraphs
  98.     mov    ah,4Ah            ; resize memory block
  99.     int    21h
  100.  
  101.     mov    ax,cs
  102.     mov    es,ax
  103. ;
  104. ; check if enough memory free to run program
  105. ;
  106.     mov    ax,pspseg        ;pass psp segment to setup
  107.     mov    bx,0            ;number of floating point variables
  108.     call    library_setup
  109.     mov    lib_info_ptr,si        ;save ptr to library info block
  110.     mov    lib_info_seg,es         ; see COMMON.INC or LIBRARY_SETUP
  111.     cmp    ax,128
  112.     jae    got_enough_mem        ;jmp if 128k of memory avail
  113.     jmp    exitx
  114.     
  115. got_enough_mem:
  116. ;
  117. ; display signon message
  118. ;
  119.     mov    si,offset signon_msg
  120.     call    display
  121.     call    crlf
  122.  
  123.     call    show_vectors
  124.  
  125.     call    show_bios_data
  126.  
  127.     call    show_devices
  128.  
  129.     call    show_dpb
  130.  
  131.     call    show_memory
  132.  
  133.     
  134. exit:
  135.  
  136. ; normal program exit
  137.  
  138. exitx:    mov    ax,1
  139.     call    library_terminate
  140.     mov    ax,4C00h
  141.     int    21h
  142.  
  143.  
  144. ;------------------------------------------------------------------------
  145.  
  146. probe_msg1    label    byte
  147.  db 'int13 reset returns       '
  148. stuff_0    db '   (drive 0)       '
  149. stuff_1 db '   (drive 1)',0
  150.  
  151. probe_msg2    label    byte
  152.  db ' vectors  int13 [0000:004c] = '
  153. stuff_a1 db '    :         int40 [0000:0100] = '
  154. stuff_a2 db '    :     ',0
  155.  
  156. probe_msg3    label    byte
  157.  db ' BIOS fixed disk count [0000:0075] = '
  158. stuff_c db '    ',0
  159.  
  160. ;--------------------------------------- 
  161. show_vectors:
  162. ;
  163. ; issue reset to both possible fixed disks
  164. ;
  165.     mov    ah,0dh
  166.     mov    dl,80h
  167.     int    13h
  168.     jc    sv_ok1
  169.     mov    ah,0
  170. sv_ok1:    mov    al,ah
  171.     mov    si,offset stuff_0
  172.     call    byte_to_hex_str
  173. ;
  174.     mov    ah,0dh
  175.     mov    dl,81h
  176.     int    13h
  177.     jc    sv_ok2
  178.     mov    ah,0
  179. sv_ok2:    mov    al,ah
  180.     mov    si,offset stuff_1
  181.     call    byte_to_hex_str
  182. ;
  183.     mov    si,offset probe_msg1
  184.     call    display
  185. ;
  186. ; display int13 vector
  187. ;
  188.     sub    ax,ax
  189.     mov    es,ax
  190.     mov    ax,es:4ch
  191.     mov    dx,es:4eh
  192.     push    ds
  193.     pop    es
  194.     mov    si,offset stuff_a1
  195.     call    store_address
  196. ;
  197. ; display int40 vector
  198. ;
  199.     sub    ax,ax
  200.     mov    es,ax
  201.     mov    ax,es:100h
  202.     mov    dx,es:102h
  203.     push    ds
  204.     pop    es
  205.     mov    si,offset stuff_a2
  206.     call    store_address
  207.  
  208.     mov    si,offset probe_msg2
  209.     call    display
  210. ;
  211. ; display BIOS fixed disk count
  212. ;
  213.     sub    ax,ax
  214.     mov    es,ax
  215.     mov    al,es:[475h]
  216.     push    ds
  217.     pop    es
  218.     mov    si,offset stuff_c
  219.     call    byte_to_hex_str
  220.  
  221.     mov    si,offset probe_msg3
  222.     call    display
  223.     call    crlf        
  224.         
  225.     ret
  226. ;------------------------------------------------------------------------
  227. sb_msg1 db 'BIOS fixed disk vector at int41 [0000:0104] points to '
  228. stuff_b1 db '    :    ',0
  229. sb_msg2 db 'BIOS fixed disk vector at int46 [0000:0118] points to '
  230. stuff_b2 db '    :    ',0
  231. ;----------------------------------
  232. show_bios_data:
  233.     push    es
  234.     mov    ax,0
  235.     mov    es,ax
  236.     les    di,es:[104h]
  237.  
  238.     mov    ax,di
  239.     mov    dx,es
  240.     mov    si,offset stuff_b1
  241.     call    store_address
  242.     
  243.     mov    si,offset sb_msg1
  244.     call    display
  245.     call    show_bios_sub
  246.     call    crlf
  247. ;
  248. ; show drive 1
  249. ;
  250.     mov    ax,0
  251.     mov    es,ax
  252.     les    di,es:[118h]
  253.  
  254.     mov    ax,di
  255.     mov    dx,es
  256.     mov    si,offset stuff_b2
  257.     call    store_address
  258.     
  259.     mov    si,offset sb_msg2
  260.     call    display
  261.     call    show_bios_sub
  262.     call    crlf
  263.     
  264.     pop    es    
  265.     ret
  266. ;-----------------------------------
  267. ; inputs:  es:di = ptr to block
  268. ;
  269. show_bios_sub:
  270.  
  271.     mov    ax,es:[di.f_num_cyl]
  272.     mov    si,offset stuff_s1
  273.     call    word_to_hex_str
  274.     mov    si,offset sbd_msg1
  275.     call    display
  276.     
  277.     mov    al,es:[di.f_num_hd]
  278.     mov    si,offset stuff_s2
  279.     call    byte_to_hex_str
  280.     mov    si,offset sbd_msg2
  281.     call    display
  282.     
  283.     mov    ax,es:[di.f_writec]
  284.     mov    si,offset stuff_s3
  285.     call    word_to_hex_str
  286.     mov    si,offset sbd_msg3
  287.     call    display
  288.     
  289.     mov    ax,es:[di.f_precom]
  290.     mov    si,offset stuff_s4
  291.     call    word_to_hex_str
  292.     mov    si,offset sbd_msg4
  293.     call    display
  294.     
  295.     mov    al,es:[di.f_burst]
  296.     mov    si,offset stuff_s5
  297.     call    byte_to_hex_str
  298.     mov    si,offset sbd_msg5
  299.     call    display
  300.     
  301.     mov    ax,es:[di.f_landing]
  302.     mov    si,offset stuff_s6
  303.     call    word_to_hex_str
  304.     mov    si,offset sbd_msg6
  305.     call    display
  306.     ret    
  307.  
  308. sbd_msg1 db '  number of cylinders = '
  309. stuff_s1 db '    ',0
  310. sbd_msg2 db '  number of heads = '
  311. stuff_s2 db '    ',0
  312. sbd_msg3 db '  write current = '
  313. stuff_s3 db '    ',0
  314. sbd_msg4 db '  pre compensation = '
  315. stuff_s4 db '    ',0
  316. sbd_msg5 db '  burst rate = '
  317. stuff_s5 db '    ',0
  318. sbd_msg6 db '  landing cylinder = '
  319. stuff_s6 db '    ',0    
  320. ;------------------------------------------------------------------------
  321. ; displayl device chain
  322. ;
  323.  
  324. ddhead    struc
  325. next_dd        dd    0    ;
  326. attrib        dw    0    ;
  327. strat_ptr    dw    0    ;
  328. int_ptr        dw    0    ;
  329. dev_name    db    8 dup (0);
  330. ddhead    ends
  331.  
  332.  
  333.  
  334. show_devices:
  335.     push    es
  336. ;
  337.     mov    ah,52h        ;get dos variables
  338.     int    21h
  339.                 ;es:bx -> vars
  340.     add    bx,22h        ;get to nul device
  341.  
  342.     call    crlf
  343.     mov    dx,offset head0
  344.     call    string_out
  345.  
  346. loop1:
  347.     call    prt_dd        ;print device driver info
  348.     cmp    word ptr es:[bx],0FFFFh    ;check if last driver in chain
  349.     je    done        ;yes - so exit
  350.     les    bx,es:[bx]    ;get address of next driver
  351.     jmp    short loop1        
  352.  
  353. done:    pop    es
  354.     ret
  355. ;-----------------------------
  356.  
  357. prt_dd    proc    near        
  358. ;Print pertinent field of device driver header
  359. ;Input: ES:BX points to device driver header
  360. ;Output: None
  361.  
  362.     push    ax        ;save registers
  363.     push    bx
  364.     push    cx
  365.     push    dx
  366.     push    si
  367.  
  368.     mov    dx,es        ;segment of device driver
  369.     call    hex_to_ascii
  370.     mov    al,':'
  371.     call    char_out
  372.  
  373.     mov    dx,bx        ;offset of device driver
  374.     call    hex_to_ascii
  375.     mov    al,' '
  376.     call    char_out
  377.     mov    al,' '
  378.     call    char_out
  379.  
  380.     mov    dx,es:[bx.attrib]    ;attribute
  381.     call    hex_to_ascii
  382.     mov    al,' '
  383.     call    char_out
  384.     mov    al,' '
  385.     call    char_out
  386.  
  387.     mov    dx,es        ;Print SEG:OFS of Strategy
  388.     call    hex_to_ascii
  389.     mov    al,':'
  390.     call    char_out
  391.     mov    dx,es:[bx.strat_ptr]
  392.     call    hex_to_ascii
  393.     mov    al,' '
  394.     call    char_out
  395.  
  396.     mov    dx,es        ;Print SEG:OFS of Interrupt
  397.     call    hex_to_ascii
  398.     mov    al,':'
  399.     call    char_out
  400.     mov    dx,es:[bx.int_ptr]
  401.     call    hex_to_ascii
  402.  
  403.     mov    al,' '
  404.     call    char_out
  405.     mov    al,' '
  406.     call    char_out
  407.  
  408.     mov    ax,es:[bx.attrib];Print BLOCK or CHAR
  409.     and    ax,0f000h
  410.     test    ax,8000h
  411.     jnz    is_char        ;Has Character Attribute
  412.  
  413.     mov    dx,offset block    ;Print Out Block Info
  414.     call    string_out    
  415.     mov    al,' '
  416.     call    char_out
  417.  
  418.     mov    al,es:[bx+10]
  419.     add    al,48
  420.     call    char_out
  421.     jmp    prt_dd1
  422.  
  423. is_char:mov    dx,offset char    ;Print Out Character Info
  424.     call    string_out
  425.     mov    al,' '
  426.     call    char_out
  427.     mov    si,bx
  428.     add    si,10
  429.     mov    cx,8
  430.  
  431. is_char_loop:            ;Print Out Character Device Name
  432.     mov    al,es:[si]
  433.     inc    si    
  434.     call    char_out
  435.     loopnz    is_char_loop
  436.  
  437. prt_dd1:
  438.     call    crlf
  439.  
  440.     pop    si        ;restore registers
  441.     pop    dx
  442.     pop    cx
  443.     pop    bx
  444.     pop    ax
  445.     ret    
  446. prt_dd    endp
  447. ;-----------------------------------
  448. char_out proc near  ;output character in al
  449.     push    dx
  450.     mov    dl,al
  451.     mov    ah,2
  452.     int    21h
  453.     pop    dx
  454.     ret
  455. char_out    endp
  456.  
  457.  
  458. hex_to_ascii    proc    near    ;output hex word in dx 
  459.     push    cx
  460.     push    ax
  461.     mov    cx,4
  462. hex1:
  463.     push    cx
  464.     mov    cl,4
  465.     rol    dx,cl
  466.     mov    al,dl
  467.     and    al,0fh
  468.     daa
  469.     add    al,0f0h
  470.     adc    al,040h
  471.     call    char_out
  472.     pop    cx
  473.     loop    hex1
  474.     
  475.     pop    ax
  476.     pop    cx    
  477.     ret
  478. hex_to_ascii    endp
  479.  
  480. string_out    proc    near    ;print a string pointed to by DS:DX
  481.                 ;first byte of string is length
  482.  
  483.     push    ax
  484.     push    bx
  485.     push    cx
  486.     push    dx
  487.     mov    ah,40h
  488.     mov    bx,dx
  489.     inc    dx    ;point to string
  490.     mov    cl,[bx]    ;get length
  491.     mov    ch,0
  492.     mov    bx,1    ;standard output
  493.     int    21h
  494.     pop    dx
  495.     pop    cx
  496.     pop    bx
  497.     pop    ax
  498.     ret
  499. string_out    endp
  500.  
  501. ;
  502. ;data
  503. ;
  504.  
  505. head0    db    162,'     D E V I C E    D R I V E R    C H A I N      ',13,10
  506.         db        'Drv Addrs  Atrb  Strategy  Interrupt  Type  Name/Unit',13,10
  507.     db        '---------  ----  --------- ---------  ----- ---------',13,10
  508. block    db    5,'Block'
  509. char    db    5,'Char '
  510. ;
  511.  
  512.  
  513.     ret
  514. ;------------------------------------------------------------------------
  515.     
  516. dpb    struc
  517. dpb_dr    db    ?        ;drive number 0=a:
  518. dpb_u    db    ?        ;unit
  519. dpb_bs    dw    ?        ;bytes per sector
  520. dpb_sc    db    ?        ;sectors/cluster
  521.     db    ?
  522. dpb_r    dw    ?        ;reserved sectors at start
  523. dpb_f    db    ?        ;number of fats
  524. dpb_rn    dw    ?        ;max entries in root
  525. dpb_d1    dw    ?        ;first data sector
  526. dpb_cl    dw    ?        ;clusters
  527. dpb_sf    dw    ?        ;sectors per fat
  528. dpb_dir    dw    ?        ;first dir sector
  529. dpb_dev    dd    ?        ;ptr to device drvr
  530. dpb_m    db    ?        ;media byte
  531. dpb_a    db    ?        ;disk accessed yet, ff=no
  532. dpb_nex    dd    ?        ;ptr to next dpb
  533. dpb    ends
  534.  
  535.  
  536. show_dpb:
  537.     call    crlf
  538.     
  539.     push    es
  540.     push    ds
  541.     mov    ah,32h
  542.     mov    dl,03        ;get DPB for drive c:
  543.     int    21h
  544.     mov    di,bx        ;offset to -di-
  545.     mov    bx,ds
  546.     mov    es,bx        ;set to -es-
  547.     pop    ds
  548. sh_loop:
  549.     mov    ax,es
  550.     cmp    ax,-1
  551.     je    sh_done        ;jmp if last dpb
  552.     call    show_dpb_sub
  553.     les    di,dword ptr es:[di.dpb_nex]
  554.     jmp    sh_loop    
  555. sh_done:
  556.     pop    es
  557.     ret
  558.  
  559. dpb_msg1 db 'DPB (Disk paramter block) for fixed disk, stored at ['
  560. stuff_dp1 db '    :    ]',0
  561. ;---------------------------
  562. ; inputs:  es:di point at DPB
  563. ;
  564. show_dpb_sub:
  565.     mov    ax,di
  566.     mov    dx,es
  567.     mov    si,offset stuff_dp1
  568.     call    store_address
  569.     mov    si,offset dpb_msg1
  570.     call    display
  571. ;
  572. ; drive number
  573. ;
  574.     mov    al,es:[di.dpb_dr]
  575.     mov    si,offset stuff_dr
  576.     call    byte_to_hex_str
  577.     mov    si,offset dpb_dr_msg
  578.     call    display
  579.             
  580. ;
  581. ; unit number
  582. ;
  583.     mov    al,es:[di.dpb_u]
  584.     mov    si,offset stuff_u
  585.     call    byte_to_hex_str
  586.     mov    si,offset dpb_u_msg
  587.     call    display
  588. ;
  589. ; bytes per sector
  590. ;
  591.     mov    ax,es:[di.dpb_bs]
  592.     mov    si,offset stuff_bs
  593.     call    word_to_hex_str
  594.     mov    si,offset dpb_bs_msg
  595.     call    display
  596. ;
  597. ; sectors per cluster
  598. ;
  599.     mov    al,es:[di.dpb_sc]
  600.     mov    si,offset stuff_sc
  601.     call    byte_to_hex_str
  602.     mov    si,offset dpb_sc_msg
  603.     call    display
  604. ;
  605. ; reserved sectors
  606. ;
  607.     mov    ax,es:[di.dpb_r]
  608.     mov    si,offset stuff_r
  609.     call    word_to_hex_str
  610.     mov    si,offset dpb_r_msg
  611.     call    display
  612. ;
  613. ; number of fats
  614. ;
  615.     mov    al,es:[di.dpb_f]
  616.     mov    si,offset stuff_f
  617.     call    byte_to_hex_str
  618.     mov    si,offset dpb_f_msg
  619.     call    display
  620. ;
  621. ; skip forward
  622. ; device driver
  623. ;
  624.     mov    ax,word ptr es:[di.dpb_dev]
  625.     mov    dx,word ptr es:[di.dpb_dev+2]
  626.     mov    si,offset stuff_dev
  627.     call    store_address
  628.     mov    si,offset dpb_dev_msg
  629.     call    display
  630. ;
  631. ; accessed yet flag
  632. ;
  633.     mov    al,es:[di.dpb_a]
  634.     mov    si,offset stuff_a
  635.     call    byte_to_hex_str
  636.     mov    si,offset dpb_a_msg
  637.     call    display
  638.             
  639.     ret
  640.     
  641. dpb_dr_msg    db '  drive# (0=A:) '
  642. stuff_dr    db '  ',0
  643. dpb_u_msg    db '  unit# '
  644. stuff_u        db '  ',0
  645. dpb_bs_msg    db '  bytes per sector = '
  646. stuff_bs    db '    ',0
  647. dpb_sc_msg    db '  sectors per cluster = '
  648. stuff_sc    db '  ',0    
  649. dpb_r_msg    db '  reserved sectors = '
  650. stuff_r        db '    ',0
  651. dpb_f_msg    db '  number of fats = '
  652. stuff_f        db '    ',0
  653. dpb_dev_msg    db '  device driver at '
  654. stuff_dev    db '    :    ',0
  655. dpb_a_msg    db '  disk accessed yet, ff=no - '
  656. stuff_a        db '  ',0
  657. ;------------------------------------------------------------------------
  658. show_memory:
  659.     ret
  660. ;------------------------------------------------------------------------
  661.  
  662. ;------------------------------------------------------------------------
  663. ;------------------------------------------------------------------------
  664. ; display - display one line to stdout
  665. ;  inputs:  ds:si = msg
  666. ;
  667. display:
  668.     lodsb
  669.     or    al,al
  670.     jz    crlf
  671.     mov    dl,al
  672.     mov    ah,2
  673.     int    21h
  674.     jmp    display
  675. ;------------------------------------------------------------------------
  676. crlf:    mov    dl,0dh
  677.     mov    ah,02h
  678.     int    21h
  679.     mov    dl,0ah
  680.     mov    ah,02h
  681.     int    21h
  682.     ret
  683. ;------------------------------------------------------------------------
  684. ; store_address - display segment:offset
  685. ;  ax = offset
  686. ;  dx = segment
  687. ;  ds:si = storage point
  688. ;
  689. store_address:
  690.     apush    ax,dx,di,si
  691.     xchg    ax,dx
  692.     call    word_to_hex_str
  693.     mov    byte ptr ds:[si],':'
  694.     inc    si
  695.     xchg    ax,dx
  696.     call    word_to_hex_str
  697.     apop    si,di,dx,ax
  698.     ret
  699. ;------------------------------------------------------------------------
  700.  
  701.     
  702. code        ends
  703.  
  704. ;-------------------------------------------------------------------------
  705. ;
  706. ; This segment definition is needed so linker will put the LIBSEG here
  707. ; before the ZSEG.  We want ZSEG to be last so memory allocation will
  708. ; work correctly.
  709. ;
  710. LIBSEG           segment byte public 'LIB'
  711. LIBSEG    ENDS
  712. ;-------------------------------------------------------------------------
  713. ; zseg must be at the end of the program for memory allocation from
  714. ; DOS.
  715. ;
  716. zseg    segment    para public 'ZZ'
  717.  
  718. zseg    ends
  719.  
  720.         end    start
  721.