home *** CD-ROM | disk | FTP | other *** search
/ Fresh Fish 8 / FreshFishVol8-CD2.bin / bbs / dev / ssl-4.1.lha / SSL / SSLExamp / Inf.asm < prev    next >
Assembly Source File  |  1994-07-01  |  7KB  |  416 lines

  1. ; Another INFO Utility
  2. ; (c) 1994 MJSoft System Software, Martin Mares
  3.  
  4.     include    "ssmac.h"
  5.  
  6.     clistart
  7.  
  8. ; DeviceInfo structure:
  9.     rsreset
  10. di_node    rs.l    2
  11. di_name    rs.b    8    ; Null-terminated
  12. di_state    rs.l    1    ; Disk state
  13. di_blocks    rs.l    1    ; Number of blocks
  14. di_blused    rs.l    1    ; Number of used blocks
  15. di_blocksize    rs.l    1    ; Bytes per block
  16. di_disktype    rs.l    1    ; FileSystem ID
  17. di_errors    rs.l    1    ; Number of soft errors
  18. di_volname    rs.b    32    ; Volume name
  19. di_sizeof    rs.b    0
  20.  
  21.     dbuf    infodata,id_SIZEOF    ; Must be _LONGWORD_ALIGNED_ !!!
  22.     dbuf    devlist,12        ; Original device list
  23.     dbuf    dvclist,12        ; Sorted device list
  24.  
  25.     geta    devlist,a0
  26.     move.l    a0,LH_TAILPRED(a0)    ; This NEWLIST macro requires
  27.     move.l    a0,(a0)            ; previously cleared memory
  28.     addq.l    #LH_TAIL,(a0)
  29.  
  30.     geta    dvclist,a0
  31.     move.l    a0,LH_TAILPRED(a0)
  32.     move.l    a0,(a0)
  33.     addq.l    #LH_TAIL,(a0)
  34.  
  35. ; Scan devices
  36.  
  37.     moveq    #LDF_READ+LDF_DEVICES,d1
  38.     call    dos,LockDosList
  39.     move.l    d0,d1
  40. scandl    moveq    #LDF_DEVICES,d2
  41.     call    dos,NextDosEntry
  42.     tst.l    d0
  43.     beq.s    scande
  44.     move.l    d0,a3
  45.  
  46.     moveq    #di_sizeof,d0
  47.     call    ss,TrackAlloc
  48.     move.l    d0,a2
  49.     move.l    a2,a1
  50.     geta    devlist,a0
  51.     call    exec,AddTail
  52.  
  53.     move.l    dol_Name(a3),a0
  54.     add.l    a0,a0
  55.     add.l    a0,a0
  56.     moveq    #0,d0
  57.     move.b    (a0)+,d0
  58.     lea    di_name(a2),a1
  59.     cmp.b    #6,d0
  60.     bcs.s    1$
  61.     moveq    #6,d0
  62. 1$    move.w    d0,d1
  63.     subq.b    #1,d1
  64.     bmi.s    4$
  65. 3$    move.b    (a0)+,(a1)+
  66.     dbra    d1,3$
  67.     move.b    #':',(a1)+
  68.  
  69. 4$    move.l    a3,d1
  70.     bra.s    scandl
  71.  
  72. scande    moveq    #LDF_READ+LDF_DEVICES,d1
  73.     call    UnLockDosList
  74.  
  75. ; Get info on each device
  76.  
  77. anadev    get.l    devlist,a2
  78.     geta    infodata,a3
  79.     get.l    sv_thistask,a0
  80.     push    pr_WindowPtr(a0)
  81.     moveq    #-1,d0
  82.     move.l    d0,pr_WindowPtr(a0)
  83. 1$    move.l    (a2),d7
  84.     beq    2$
  85.  
  86.     move.l    a2,d1
  87.     addq.l    #di_name,d1
  88.     moveq    #0,d6
  89.     call    dos,IsFileSystem
  90.     tst.l    d0
  91.     beq.s    30$
  92.  
  93.     move.l    a2,d1
  94.     addq.l    #di_name,d1
  95.     moveq    #ACCESS_READ,d2
  96.     call    dos,Lock
  97.     move.l    d0,d6
  98.     beq.s    40$
  99.     move.l    d0,d1
  100.     move.l    a3,d2
  101.     call    Info
  102.     move.l    d0,d5
  103.     beq.s    40$
  104.  
  105.     lea    di_state(a2),a0
  106.     lea    id_DiskState(a3),a1
  107.     moveq    #4,d0
  108. 10$    move.l    (a1)+,(a0)+
  109.     dbra    d0,10$
  110.     move.l    (a3),(a0)+    ; NumSoftErrors
  111.  
  112.     move.l    id_VolumeNode(a3),a1
  113.     add.l    a1,a1
  114.     add.l    a1,a1
  115.     move.l    dol_Name(a1),a1
  116.     add.l    a1,a1
  117.     add.l    a1,a1
  118.     moveq    #0,d0
  119.     move.b    (a1)+,d0
  120.     cmp.w    #30,d0
  121.     bcs.s    11$
  122.     moveq    #30,d0
  123.     bra.s    11$
  124. 12$    move.b    (a1)+,(a0)+
  125. 11$    dbra    d0,12$
  126.  
  127.     bra.s    31$
  128.  
  129. 40$    call    IoErr
  130.     move.l    d0,di_volname(a2)
  131.     bra.s    31$
  132.  
  133. 30$    move.l    a2,a1
  134.     call    exec,Remove
  135. 31$    move.l    d6,d1
  136.     beq.s    32$
  137.     call    UnLock
  138. 32$    move.l    d7,a2
  139.     bra    1$
  140.  
  141. 2$    get.l    sv_thistask,a0
  142.     pop    pr_WindowPtr(a0)
  143.  
  144. ; Sort the devices by name
  145.  
  146. sortit    get.l    devlist,a2
  147.     move.l    a2,d7
  148.     move.l    (a2),d0
  149.     beq.s    dumpit
  150.     move.l    d0,a2
  151. sort1    move.l    (a2),d6
  152.     beq.s    sort2
  153.     move.l    a2,a0
  154.     move.l    d7,a1
  155.     addq.l    #di_name,a0
  156.     addq.l    #di_name,a1
  157.     call    utility,Stricmp
  158.     tst.l    d0
  159.     bpl.s    1$
  160.     move.l    a2,d7
  161. 1$    move.l    d6,a2
  162.     bra.s    sort1
  163.  
  164. sort2    move.l    d7,a1
  165.     call    exec,Remove
  166.     move.l    d7,a1
  167.     geta    dvclist,a0
  168.     call    AddTail
  169.     bra.s    sortit
  170.  
  171. ; Display the devices
  172.  
  173. dumpit    lea    head(pc),a0
  174.     call    ss,PutsNL
  175.     get.l    dvclist,a2
  176. dump1    move.l    (a2),d7
  177.     beq    memstat
  178.  
  179.     lea    di_name(a2),a3
  180.     moveq    #0,d2
  181.     moveq    #7,d3
  182. dumpname    move.b    (a3)+,d2
  183.     beq.s    1$
  184.     bsr    putc
  185.     dbra    d3,dumpname
  186. 1$    addq.w    #1,d3
  187. 2$    moveq    #32,d2
  188.     bsr    putc
  189.     dbra    d3,2$
  190.  
  191.     tst.w    di_volname(a2)
  192.     beq    novolume
  193.  
  194.     move.l    di_blocks(a2),d0
  195.     bsr    putsize
  196.     move.l    di_blocks(a2),d0
  197.     sub.l    di_blused(a2),d0
  198.     push    d0
  199.     bsr    putsize
  200.     pop    d0
  201.     move.l    di_blocks(a2),d2
  202.     bsr    putperc
  203.  
  204.     move.l    di_state(a2),d0
  205.     moveq    #80,d1
  206.     sub.l    d1,d0
  207.     moveq    #3,d1
  208.     cmp.l    d1,d0
  209.     bcs.s    10$
  210.     moveq    #4,d0
  211. 10$    lsl.l    #2,d0
  212.     lea    dit(pc),a0
  213.     add.l    d0,a0
  214.     call    ss,Puts
  215.     bsr    putsp
  216.  
  217.     lea    many(pc),a0
  218.     move.l    di_errors(a2),d0
  219.     cmp.l    #1000,d0
  220.     bcc.s    20$
  221.     lea    form1(pc),a0
  222. 20$    push    d0
  223.     move.l    sp,a1
  224.     call    ss,Printf
  225.     addq.l    #4,sp
  226.     bsr    put2sp
  227.  
  228.     move.l    di_disktype(a2),d0
  229.     move.l    d0,d1
  230.     sub.l    #'DOS'*256,d1
  231.     moveq    #6,d2
  232.     cmp.l    d2,d1
  233.     bcs.s    30$
  234.     moveq    #6,d1
  235.     cmp.l    #'MSD'*256,d0
  236.     beq.s    30$
  237.     moveq    #7,d1
  238.     cmp.l    #'MDD'*256,d0
  239.     beq.s    30$
  240.     moveq    #8,d1
  241. 30$    lsl.l    #2,d1
  242.     lea    fstab(pc),a0
  243.     add.l    d1,a0
  244.     clr.l    -(sp)
  245.     move.l    (a0)+,-(sp)
  246.     move.l    sp,a0
  247.     call    ss,Puts
  248.     addq.l    #8,sp
  249.  
  250.     bsr    put2sp
  251.     move.l    di_blocksize(a2),d0
  252.     bsr    putsize2
  253.     lea    di_volname(a2),a0
  254.     call    ss,PutsNL
  255.  
  256. dumpnext    move.l    d7,a2
  257.     bra    dump1
  258.  
  259. novolume    move.l    di_volname(a2),d0
  260.     lea    nodisk(pc),a0
  261.     cmp.l    #ERROR_NO_DISK,d0
  262.     beq.s    1$
  263.     lea    nodos(pc),a0
  264.     cmp.l    #ERROR_NOT_A_DOS_DISK,d0
  265.     beq.s    1$
  266.     lea    qem(pc),a0
  267. 1$    call    ss,PutsNL
  268.     bra.s    dumpnext
  269.  
  270. ; After all, inform the user about available memory
  271.  
  272.     dv.l    chipram
  273.     dv.l    fastram
  274.     dv.l    slowram
  275.  
  276.     dv.l    chiplar
  277.     dv.l    fastlar
  278.     dv.l    slowlar
  279.  
  280.     dv.l    chiptot
  281.     dv.l    fasttot
  282.     dv.l    slowtot
  283.  
  284.     dv.l    chipis
  285.     dv.l    fastis
  286.     dv.l    expis
  287.  
  288. memstat    call    exec,Forbid
  289.     move.l    MemList(a6),a3
  290. 1$    move.l    (a3),d7
  291.     beq.s    2$
  292.     move.l    MH_LOWER(a3),d2
  293.     move.l    MH_UPPER(a3),d3
  294.     move.w    MH_ATTRIBUTES(a3),d0
  295.     geta    chipram,a0
  296.     btst    #MEMB_CHIP,d0
  297.     bne.s    3$
  298.     addq.l    #4,a0
  299.     cmp.l    #$c00000,d2
  300.     bcs.s    3$
  301.     cmp.l    #$dc0000,d2
  302.     bcc.s    3$
  303.     addq.l    #4,a0
  304. 3$    sub.l    d2,d3
  305.     add.l    d3,(chiptot-chipram)(a0)
  306.     move.l    MH_FREE(a3),d0
  307.     add.l    d0,(a0)
  308.     moveq    #0,d0
  309.     move.l    MH_FIRST(a3),d1
  310.     beq.s    4$
  311. 5$    move.l    d1,a1
  312.     move.l    (a1)+,d1
  313.     cmp.l    (a1),d0
  314.     bcc.s    6$
  315.     move.l    (a1),d0
  316. 6$    tst.l    d1
  317.     bne.s    5$
  318.  
  319. 4$    cmp.l    (chiplar-chipram)(a0),d0
  320.     bcs.s    41$
  321.     move.l    d0,(chiplar-chipram)(a0)
  322. 41$    st    (chipis-chipram)(a0)
  323.     move.l    d7,a3
  324.     bra.s    1$
  325.  
  326. 2$    call    exec,Permit
  327.  
  328. memdump    moveq    #10,d2
  329.     bsr    putc
  330.     geta    chipram,a2
  331.     lea    chip(pc),a3
  332.     moveq    #2,d7
  333. showmem    tst.l    (chipis-chipram)(a2)
  334.     beq.s    1$
  335.     push    (chiptot-chipram)(a2)
  336.     push    (chiplar-chipram)(a2)
  337.     push    (a2)
  338.     push    a3
  339.     lea    ramt(pc),a0
  340.     move.l    sp,a1
  341.     call    ss,Printf
  342.     lea    16(sp),sp
  343. 1$    addq.l    #4,a2
  344.     addq.l    #5,a3
  345.     dbra    d7,showmem
  346.  
  347.     rts
  348.  
  349. ; Some useful routines ...
  350.  
  351. putsize    move.l    di_blocksize(a2),d1
  352.     call    utility,UMult32
  353. putsize2    moveq    #'B',d2
  354.     bsr.s    putsize3
  355.     moveq    #'K',d2
  356.     bsr.s    putsize3
  357.     moveq    #'M',d2
  358.     bsr.s    putsize3
  359.     moveq    #'G',d2
  360.     subq.l    #4,sp
  361. putsize3    move.l    #1024,d1
  362.     cmp.l    d1,d0
  363.     bcs.s    putsize4
  364.     add.l    #512,d0
  365.     jump    utility,UDivMod32
  366.  
  367. putsize4    lea    form1(pc),a0
  368. putsize5    push    d0
  369.     move.l    sp,a1
  370.     call    ss,Printf
  371.     bsr.s    putc
  372.     addq.l    #8,sp
  373.  
  374. put2sp    bsr    putsp
  375. putsp    moveq    #32,d2
  376. putc    get.l    stdout,d1
  377.     jump    dos,FPutC
  378.  
  379. putperc    moveq    #100,d1
  380.     call    utility,UMult32
  381.     move.l    d2,d1
  382.     lsr.l    #1,d2
  383.     add.l    d2,d0
  384.     tst.l    d1
  385.     beq.s    putperz
  386.     call    UDivMod32
  387. putperz1    lea    form2(pc),a0
  388.     moveq    #'%',d2
  389.     bsr.s    putsize5    ; Return address will be discarded
  390.  
  391. putperz    moveq    #0,d0
  392.     bra.s    putperz1
  393.  
  394. ; Strings and tables
  395.  
  396. fstab    dc.b    'OFS FFS OFSIFFSIOFSCFFSCMSD MSDD'
  397. qem    dc.b    '??? ',0        ; Must follow fstab !
  398. head    dc.b    'Device    Size   Free  Free  Stat Err  Type  Block  '
  399.     dc.b    'Volume',0
  400. form1    dc.b    '%4ld',0
  401. form2    dc.b    '%3ld',0
  402. dit    dc.b    'R/O',0,'VAL',0,'R/W',0
  403. many    dc.b    'MANY',0
  404. nodisk    dc.b    'No disk present',0
  405. nodos    dc.b    'Not a dos disk',0
  406. chip    dc.b    'Chip',0
  407. fast    dc.b    'Fast',0
  408. c0    dc.b    'Slow',0
  409. ramt    dc.b    '%s RAM: %ld (%ld) of %ld',10,0
  410.     dc.b    '$VER: Inf 1.1 (5.4.94) by Martin Mares',0
  411.     even
  412.  
  413.     tags
  414.     finish
  415.     end
  416.