home *** CD-ROM | disk | FTP | other *** search
/ Frozen Fish 1: Amiga / FrozenFish-Apr94.iso / bbs / alib / d1xx / d139 / listscanner.lha / ListScanner / ListScanner.asm < prev    next >
Assembly Source File  |  1988-05-15  |  15KB  |  492 lines

  1. ;*****************************************************************************
  2. ;*
  3. ;* ListScanner.asm    by HEIKO RATH
  4. ;* 
  5. ;*            Copyright 1988 by the Software Brewery
  6. ;*
  7. ;* This program may be non-commercially distributed.
  8. ;* 
  9. ;* This little program is intented to printout all ExecLists. It will only
  10. ;* work from CLI, WB-starting is senseless. To redirect the output to a file
  11. ;* use the standart DOS file redirection (ListScanner >filename). The output
  12. ;* contains the name of node, the type and the priority. 
  13. ;*
  14. ;*
  15. ;* A note to Leo Schwab: keep on developing display hacks.
  16. ;*
  17. ;*                                Heiko Rath
  18. ;*
  19. ;*****************************************************************************
  20. ;                          
  21. ;______  /          
  22. ;______\O                    - The Software Brewery - 
  23. ;      \\                        
  24. ;       o            Sparkling, fresh software from W.-Germany
  25. ;                 
  26. ;     @@@@@             Straight from the bar to your Amiga
  27. ;     |~~~|\        
  28. ;     | | |/        
  29. ;     |___|        With our regards to the Software Distillery
  30. ;
  31. ;Members are (listed alphabetically):
  32. ;Christian Balzer alias <CB>, Lattice C, user interfaces, beer addict. 
  33. ;Christof Bonnkirch alias KEY, Aztec C, Hardware & Devices, beer adict.
  34. ;Heiko Rath alias <HR>, Assembler, ROM-Kernal stuff, Marabou addict. 
  35. ;Peter Stark alias PS, Lattice C, IO & utilities, WordStar addict.
  36. ;Ralf Woitinas alias RAF, Assembler, anything, Ray-Tracing addict.
  37. ;Torsten Wronski alias MM, Assembler, anything, girls addict.
  38. ;
  39. ;Beverages: Altenmuenster Brauer Bier, Urfraenkisches Landbier, Grohe Bock.
  40. ;
  41. ;Send exotic drinks, beautyful girls, $$$$, comments, critizism, flames to:
  42. ;
  43. ;The Software Brewery    
  44. ;Christian Balzer        
  45. ;Im Wingertsberg 45        
  46. ;D-6108 Weiterstadt    
  47. ;West-Germany        
  48. ;
  49. ;Our BBS "AmigaNode" isn't online yet. As soon as it becomes available, 
  50. ;you'll be the first to know :-).
  51. ;
  52. ;
  53. ;Send the above stuff and of course MARABOU-CHOCOLATE to:
  54. ;
  55. ;Heiko Rath (AAAARRRRGGGHHH, where is my Marabou chocolate??)
  56. ;Raiffeisenstr.10a
  57. ;D-6108 Weiterstadt
  58. ;Tel.06150-2658
  59. ;West-Germany
  60. ;
  61. ;
  62.  
  63. ExecBase    Equ    4
  64.  
  65. ;***
  66. ;*** Exec Offsets:
  67. ;***
  68. OpenLibrary    Equ    -552        ;OpenLibrary (LibName,version)(a1,d0)
  69. CloseLibrary    Equ    -414        ;CloseLibrary (Library)(a1)
  70. Forbid        Equ    -132        ;Forbid ()()
  71. Permit        Equ    -138        ;Permit ()()
  72. AllocMem    Equ    -198        ;AllocMem (bytesize,requirement)(d0,d1)
  73. FreeMem        Equ    -210        ;FreeMem (memoryblock,bytesize)(a1,d0)
  74.  
  75. ;***
  76. ;*** DOS Offsets:
  77. ;***
  78. OutPut        Equ    -60        ;OutPut ()
  79. Write        Equ    -48        ;Write (file,buffer,length)(d1,d2,d3)
  80.  
  81. ;***
  82. ;*** I use these Macros to make things easier for me
  83. ;***
  84.  
  85. doit:    MACRO
  86.     move.l    #\1.txt,d2        ;address of listname to d2
  87.     bsr    TextOutPut        ;output listname
  88.     move.l    #HeadLine,d2        ;address of HeadLine to d2
  89.     bsr    TextOutPut        ;output HeadLine
  90.     move.l    \1,d0            ;offset of listhead to d0
  91.     bsr    Showlist        ;output list
  92.     ENDM
  93.  
  94. ;***
  95. ;*** Here we go:
  96. ;***
  97. DosOpen:        ;opens DOS-library, saves DOSBasepointer
  98.             ;saves stdout
  99.     move.l    ExecBase,a6        ;Execaddress to a6 (only to be sure)
  100.     move.l    #DOSNAME,a1        ;Librarynamepointer to a1
  101.     moveq    #0,d0            ;any version
  102.     jsr    OpenLibrary(a6)        ;try to open DOS-Libary
  103.     tst.l    d0            ;is d0 = NULL?
  104.     beq    ErrorExit        ;exit if call wasn't successfull
  105.     move.l    d0,DOSBase        ;save DOSBasepointer
  106.     move.l    d0,a6            ;move DOSBasepointer to a6
  107.     jsr    OutPut(a6)        ;identify the initial output handle
  108.     move.l    d0,stdout        ;save stdout
  109.  
  110.             ;from here we call the PrintOutPut-subroutine to output
  111.             ;the listnames and then we call the Showlist-subroutine
  112. start:            ;to printout the contents of the lists.  
  113.     move.l    #Text,d2
  114.     bsr    TextOutPut
  115.     doit    memlist            ;output Memorylist
  116.     doit    reslist            ;output Resourcelist
  117.     doit    devlist            ;output Devicelist
  118.     doit    intrlist        ;output Interruptlist
  119.     doit    liblist            ;output Librarylist
  120.     doit    portlist        ;output Portlist
  121.     doit    trdylist        ;output Taskreadylist
  122.     doit    twtlist            ;output Taskwaitinglist
  123.     doit    smlist            ;output Semaphorlist
  124.  
  125. DosClose:
  126.     move.l    ExecBase,a6        ;ExecBase to a6
  127.     move.l    DOSBase,a1        ;DOS-pointer to a1
  128.     move.l    ExecBase,a6        ;Exec-pointer to a6
  129.     jsr    CloseLibrary(a6)    ;close DOS
  130. ErrorExit:
  131.     rts                ;CLI here I come again!!!!
  132.  
  133. ;*****************************************************************************
  134. ;*
  135. ;*    Showlist II                    11.1.87
  136. ;*            by    Heiko Rath
  137. ;*                Raiffeisenstr.10a
  138. ;*                D-6108 Weiterstadt
  139. ;*                West-Germany
  140. ;*                Tel.06150-2658
  141. ;*
  142. ;* PURPOSE:            print out Exec-Systemlist (address of Node,
  143. ;*                type, priority, name of Node)
  144. ;*
  145. ;* ROUTINETYPE:            subroutine
  146. ;*
  147. ;* SYNTAX:            bsr Showlist    (Exec-offset to list)(d0)
  148. ;*
  149. ;* ENTRY CONDITIONS:        needs DOSlibrary opened and stdout defined
  150. ;*                also needs DOS-'Write' offset -48 defined.
  151. ;*                It also needs binhex subroutine.
  152. ;*
  153. ;* RETURNS:            none
  154. ;*
  155. ;* BUGS:            none
  156. ;*
  157. ;* NOTE:            none
  158. ;*
  159. ;* CHANGED:            nothing
  160. ;*
  161. ;* USAGE:            move.l    Listoffset,d0
  162. ;*                bsr    Showlist
  163. ;*
  164. ;*****************************************************************************
  165. Showlist:
  166.     movem.l    d0-d7/a0-a6,-(sp)    ;save registers
  167.  
  168.     move.l    ExecBase,a6        ;ExecBase to a6
  169.     jsr    Forbid(a6)        ;forbid taskswitching (very important,
  170.                     ; 'cause we are accessing Systemdata)
  171.  
  172.     move.l    a6,a0            ;Execpointer to a0
  173.     add.l    d0,a0            ; + librarylistoffset=address of listhead
  174.     move.l    a0,ListHead        ;save address of listheader -=> ListHead
  175.     move.l    (a0),a1            ;get address of 1.Node to a1
  176.     move.l    a1,Node            ;save address of 1.Node -=> Node
  177.     addq.l    #4,a0
  178.     cmp.l    a1,a0            ;list empty?
  179.                     ;(test if listhead points to listhead+4)
  180.     beq    PrintLF            ;yes -=> send LF and exit
  181.  
  182.     moveq.l    #1,d1            ;set counter to 1 'cause there is at least
  183.                     ; one node in the list
  184. MyCountLoop:
  185.     move.l    (a1),a1            ;get address of next node to a1
  186.     tst.l    (a1)            ;see if contents of (a1) is NULL
  187.     beq.b    EndCount        ;leave counting loop
  188.     addq.l    #1,d1            ;increment counter by one
  189.     bra.b    MyCountLoop        ;do this once more
  190.  
  191. EndCount:
  192.     move.l    d1,NodeCount        ;save number of Nodes
  193.  
  194. GetMem:
  195.     move.l    #48,d0            ;number of bytes per node
  196.     mulu    d1,d0            ;bytes per node * NodeCount
  197.     addq.l    #1,d0            ;add one for the bufferterminating Null
  198.     move.l    d0,MyMemoryLength    ;save lenght of Memoryblock
  199.     move.l    #$10001,d1        ;requirements:MEMF_Public & Clear
  200.     jsr    AllocMem(a6)        ;get memory from system
  201.     move.l    d0,MyMemoryBlock    ;save address of Memoryblock
  202.     move.l    d0,MyMemoryOffset    ;save address of Memoryblock 2.time
  203.     tst.l    d0            ;see if call was successfull
  204.     bne    MoveNodeToBuffer    ;yes -=> MoveNodeToBuffer
  205.  
  206.     move.l    #Err,d2            ;this code is only here, to inform the
  207.     bsr    TextOutPut        ; user that the AllocMem call wasn't
  208.     bra    PrintLF            ; successfull
  209.  
  210. MoveNodeToBuffer:
  211.     move.l    d0,a0            ;get address of MemoryBlock to a0
  212.     move.l    MyMemoryLength,d1    ;get length to d1
  213.  
  214. fill:
  215.     move.b    #' ',(a0)+        ;fill MyMemoryBlock with spaces
  216.     dbeq.b    d1,fill            ;is d1=NULL? (no-=>d1=d1-1-=>fill)
  217.  
  218. TheLoop:
  219.     move.l    MyMemoryOffset,a0    ;get address of MyMemoryOffset to a0
  220.     move.l    Node,a1            ;get address of current node to a1
  221.  
  222. CopyName:
  223.     add.l    #10,a1            ;address of namepointer to a1
  224.     move.l    (a1),a1            ;get address of nodename to a1
  225.     moveq.l    #0,d1            ;this is faster than clr.l d1
  226.     moveq.l    #0,d2            ;set this to NULL for strlen
  227.  
  228. strlen:
  229.     cmp.b    (a1)+,d2        ;NULL?
  230.     beq.b    strlentest        ;yes -=>strlentest
  231.     addq.l    #1,d1            ;increment d1 by one (stringlength)
  232.     bra.b    strlen            ;do the loop once more
  233.  
  234. strlentest:
  235.     cmp.b    #28,d1            ;see if string is greater #28
  236.     ble.b    DoCopy            ;no (less or equal)-=>DoCopy
  237.     move.l    #28,d1            ;set max.length to 28
  238.  
  239. DoCopy:
  240.     move.l    Node,a1            ;get address of node to a1
  241.     add.l    #10,a1            ;address of namepointer to a1
  242.     move.l    (a1),a1            ;get address of nodename to a1
  243.     tst.l    d1            ;see if d1=0
  244.     bne    DoTheCopy        ;jump only if d1<>0
  245.     move.l    #NoName,a1        ;get address of NoName to a1
  246.     moveq.l    #7,d1            ;set length to 7 (length of 'No Name')
  247.  
  248. DoTheCopy:
  249.     subq.l    #1,d1            ;decrement d1 by 1
  250.  
  251. CopyLoop:
  252.     move.b    0(a1,d1),0(a0,d1)    ;copy source to destination
  253.     dbf    d1,CopyLoop        ;decrement d1, if d1<0 then out of loop
  254.  
  255.     move.l    MyMemoryOffset,a0    ;get address of MyMemoryOffset to a0
  256.     move.b    #'$',29(a0)        ;store '$'
  257.     move.b    #'$',39(a0)        ;store '$'
  258.     move.b    #'$',43(a0)        ;store '$'
  259.     move.b    #10,47(a0)        ;store LF
  260.  
  261.     move.l    Node,a1            ;get Nodeaddress to a1
  262.     addq.l    #8,a1            ;add 8 to get address of Type
  263.     moveq.l    #0,d0            ;clear d0
  264.     move.w    (a1),d0            ;get Type & Priority to d0
  265.     move.l    #Buffer,a0        ;get bufferaddress to a0
  266.     bsr    binhex            ;convert address to ASCII
  267.     move.w    Buffer+6,d0        ;get converted Type & Priority to d0
  268.     move.l    MyMemoryOffset,a0    ;get address of MyMemoryOffset to a0
  269.     move.w    d0,44(a0)        ;copy Priority to MyMemoryBlock
  270.     move.w    Buffer+4,d0        ;get converted Priority to d0
  271.     move.w    d0,40(a0)        ;copy Type to MyMemoryBlock
  272.  
  273.     move.l    Node,d0            ;get Nodeaddress to d2
  274.     move.l    MyMemoryOffset,a0    ;get address of MyMemoryOffset to a0
  275.     add.l    #30,a0            ;add 30 to get storeaddress
  276.     bsr    binhex            ;convert address to ASCII
  277.  
  278.     add.l    #48,MyMemoryOffset    ;do this for the next loop
  279.     move.l    Node,a1            ;get nodeaddress to a1
  280.     move.l    (a1),Node        ;save address of next node
  281.     move.l    MyMemoryOffset,d0    ;get MyMemoryOffset to d0
  282.     addq.l    #1,d0
  283.     move.l    MyMemoryBlock,d1    ;get MyMemoryBlock to d1
  284.     add.l    MyMemoryLength,d1    ;add MyMemoryLength to d1
  285.     cmp.l    d0,d1            ;see if we have to loop once more
  286.     bne    TheLoop            ;if <> -=> TheLoop
  287.     move.l    MyMemoryBlock,a0    ;get address of MyMemoryBlock to a0
  288.     add.l    MyMemoryLength,a0    ;add length to MyMemoryBlock
  289.     subq.l    #1,a0            ;decrement address by one
  290.     move.b    #0,(a0)            ;set last byte of MyMemoryBlock to NULL
  291.  
  292.     move.l    MyMemoryBlock,d2    ;get address of MyMemoryBlock to d2
  293.     bsr    TextOutPut        ;print out the complete buffered list
  294.     move.l    MyMemoryBlock,a1    ;get address of MyMemoryBlock to a1
  295.     move.l    MyMemoryLength,d0    ;get length of MyMemoryBlock to d0
  296.     jsr    FreeMem(a6)        ;free the allocated RAM
  297.  
  298. PrintLF:
  299.     move.l    #LF,d2            ;get address of LF-string to d2
  300.     bsr.b    TextOutPut        ;and get it out via DOS-Write & stdout
  301.     jsr    Permit(a6)        ;permit taskswitching (I think Dos enables
  302.                     ; this for you, but I do this to be sure
  303.                     ; that taskswitching is now allowed.)
  304.     movem.l    (sp)+,d0-d7/a0-a6    ;restore Registers
  305.     rts
  306.  
  307. ;*****************************************************************************
  308. ;*
  309. ;*    TextOutPut
  310. ;*            by    Heiko Rath
  311. ;*                Raiffeisenstr.10a
  312. ;*                D-6108 Weiterstadt
  313. ;*                West Germany
  314. ;*                Tel.06150-2658
  315. ;*
  316. ;* PURPOSE:         output a NULL-terminated string via stdout
  317. ;*
  318. ;* ROUTINE TYPE:     subroutine
  319. ;*
  320. ;* SYNTAX:        bsr    TextOutPut    (stringaddress)(d0)
  321. ;*
  322. ;* ENTRY CONDITIONS:    needs DOSlibrary opened and stdout defined
  323. ;*            also needs DOS-'Write' offset -48 defined.
  324. ;*
  325. ;* RETURNS:        none
  326. ;*
  327. ;* NOTE:        its better if the string is really NULL-terminated
  328. ;*
  329. ;* CHANGED:        nothing
  330. ;*
  331. ;* USAGE:        move.l    #Textaddress,d2
  332. ;*            bsr    TextOutPut
  333. ;*
  334. ;*****************************************************************************
  335.  
  336. TextOutPut:
  337.     movem.l    d0-d7/a0-a6,-(sp)    ;save registers
  338.     move.l    d2,a0            ;address to a0
  339.     clr.l    d3            ;count = 0
  340.  
  341. CountLoop:
  342.     tst.b    (a0)+            ;is it NULL ?
  343.     beq.b    PMsg            ;yes: -=> determine length
  344.     addq.l    #1,d3            ;count = count+1
  345.     bra.b    CountLoop        ;test next byte
  346.  
  347. PMsg:
  348.     move.l    stdout,d1        ;get stdout to d1
  349.     move.l    DOSBase,a6        ;move DOSBase to a6
  350.     jsr    Write(a6)        ;write the Text
  351.     movem.l    (sp)+,d0-d7/a0-a6    ;reserve registers
  352.     rts
  353.  
  354. ;***********************************************************************
  355. ;*
  356. ;*     binhex
  357. ;*             by Heiko Rath
  358. ;*
  359. ;* PURPOSE: Convert a binary value in a register to
  360. ;*        a hex ASCII string at the destination address
  361. ;*          
  362. ;* ROUTINE TYPE: SUBROUTINE
  363. ;*
  364. ;* SYNTAX: bsr    binhex    (source(long),destination) (d0.l,a0)
  365. ;*       bsr    binhexw    (source(word),destination) (d0.w,a0)
  366. ;*       bsr    binhexb    (source(byte),destination) (d0.b,a0)
  367. ;*
  368. ;* ENTRY CONDITIONS: None
  369. ;*
  370. ;* RETURNS: ASCII string in destination address
  371. ;* NOTE:     the destination place must contain 8 bytes for any
  372. ;*            length (byte, word, longword)
  373. ;*
  374. ;* CHANGED: Nothing
  375. ;*
  376. ;* USAGE:
  377. ;*
  378. ;*     move    #label,d0
  379. ;*     move.l    address,a0    ;converts the address at label to
  380. ;*     bsr    binhex        ;string at address
  381. ;*                
  382. ;*     move    label,d0
  383. ;*     move.l    address,a0
  384. ;*     bsr    binhex        ;conv contents at label
  385. ;*
  386. ;*     move    #value,d0
  387. ;*     move.l    address,a0
  388. ;*     bsr    binhex        ;convert immediate value
  389. ;*
  390. ;****************************************************************
  391.  
  392. binhex:    movem.l    d0-d2/a0,-(sp)        ;save registers
  393.  
  394.     move.l    #7,d2            ;get number of counts to d2
  395.     clr.l    d1            ;clear work register
  396.  
  397. 001$:    rol.l    #4,d0            ;move high nibble to low order
  398.     move.b    d0,d1            ;get low order byte to d1
  399.     andi.b    #$f,d1            ;isolate low order nibble
  400.     cmp.b    #$0a,d1            ;is it a letter or a digit?
  401.     blt.b    002$            ;if digit -=> 002$
  402.     add.b    #'A'-'0'-$0A,d1        ;offset for letters
  403.  
  404. 002$:    add.b    #'0',d1            ;convert to ASCII
  405.     move.b    d1,(a0)+        ;store it and increment storeaddress
  406.     dbf.b    d2,001$            ;do the converting 8 times
  407.  
  408.     movem.l    (sp)+,d0-d2/a0        ;restore registers
  409.     rts
  410.  
  411. ;
  412. ; Variables:
  413. ;
  414. DOSBase:    dc.l    0        ;this contains the DOSlibraryaddress
  415. stdout:        dc.l    0        ;this contains stdout
  416. Buffer:        dc.b    '00000000'    ;At runtime this is the storage of
  417.                     ; Type & Priority
  418. ListHead:
  419.     dc.l    0            ;At runtime this contains the
  420.                     ; address of the listheader
  421. Node:
  422.     dc.l    0            ;At runtime this contains the
  423.                     ; address of the current node
  424. NodeCount:
  425.     dc.l    0            ;At runtime this contains the
  426.                     ; number of nodes in the list
  427. MyMemoryLength:
  428.     dc.l    0            ;At runtime this contains the
  429.                     ; length of the memoryblock
  430. MyMemoryBlock:
  431.     dc.l    0            ;At runtime this contains the
  432.                     ; address of the memoryblock
  433. MyMemoryOffset:
  434.     dc.l    0            ;At runtime this contains the
  435.                     ; address of the memoryblock
  436.                     ; + 48 Bytes per finished node
  437.  
  438. ;
  439. ; Constants:
  440. ;
  441. memlist:    dc.l    $142    ;These are the offsets of the Exec-
  442. reslist:    dc.l    $150    ; systemlists. To get the address
  443. devlist:    dc.l    $15e    ; of a listheader they are added to
  444. intrlist:    dc.l    $16c    ; ExecBase.
  445. liblist:    dc.l    $17a
  446. portlist:    dc.l    $188
  447. trdylist:    dc.l    $196
  448. twtlist:    dc.l    $1a4
  449. smlist:        dc.l    $214
  450.  
  451. DOSNAME:    cstring    'dos.library'
  452.         cnop    0,2
  453. INTNAME:    cstring    'intuition.library'
  454.         cnop    0,2
  455. Err:        dc.b    '*** Out of Memory Error ***',0
  456.         cnop    0,2
  457. NoName:        dc.b    'No Name',0
  458.         cnop    0,2
  459. LF:        dc.b    10,0        ;LF
  460.         cnop    0,2
  461. HeadLine:    dc.b    $9b,'4;32;40m'
  462.         dc.b    'Name:                         Address Type Pri'
  463.         dc.b    $9b,'0;31;40m',10,0
  464.         cnop    0,2
  465. Text:
  466.     dc.b    $9b,'0;33;40m','ListScanner',$9b,'0;31;40m'
  467.     dc.b    ' by Heiko Rath - copyright ',169,' by '
  468.     dc.b    $9b,'1;31;40m','The Software Brewery',$9b,'0;31;40m',10
  469.     dc.b    '            '
  470.     dc.b    'Raiffeisenstr.10a,D-6108 Weiterstadt,Tel.06150-2658',10
  471.     dc.b    '            '
  472.     dc.b    '(famous last words: Where is my Marabou chocolate?)'
  473.     dc.b    10,10,0
  474.         cnop    0,2
  475. memlist.txt:    dc.b    'MemoryList:',10,0
  476.         cnop    0,2
  477. reslist.txt:    dc.b    'ResourceList:',10,0
  478.         cnop    0,2
  479. devlist.txt:    dc.b    'DeviceList:',10,0
  480.         cnop    0,2
  481. intrlist.txt:    dc.b    'InterruptList:',10,0
  482.         cnop    0,2
  483. liblist.txt:    dc.b    'LibraryList:',10,0
  484.         cnop    0,2
  485. portlist.txt:    dc.b    'PortList:',10,0
  486.         cnop    0,2
  487. trdylist.txt:    dc.b    'TaskReadyList:',10,0
  488.         cnop    0,2
  489. twtlist.txt:    dc.b    'TaskWaitingList:',10,0
  490.         cnop    0,2
  491. smlist.txt:    dc.b    'SemaphoreList:',10,0
  492.