;**************************** ListPorts *****************************
;*                                                                  *
;*  Listet die Public-Ports mit Namen, Adresse und Priorität auf.   *
;*  Dies sind die 'öffentlichen' Message-Ports, die in der Liste    *
;*  'PortList' miteinander verkettet sind. Außerdem wird noch der   *
;*  Zeiger auf den Empfänger-Task ausgegeben.                       *
;*  Aufruf vom CLI aus ohne Parameter.                              *
;*                                                                  *
;*                   © 1993 by Michael Gottwald                     *
;********************************************************************

Open     =  -30                      ; dos.library
Write    =  -48                      ;  "     "
OutPut   =  -60                      ;  "     "
Exit     = -144                      ;  "     "
OpenLib  = -408                      ; exec.library
CloseLib = -414                      ;  "     "

;----dos.library öffnen und Standard-Ausgabekanal ermitteln----------

run:     movem.l a0-a6/d0-d7,-(sp)   ; Alle Register retten
         move.l  $4,a6
         lea     DosName,a1
         jsr     OpenLib(a6)
         move.l  d0,DosBase
         move.l  d0,a6
         jsr     OutPut(a6)
         move.l  d0,Handle
         move.l  #Text,d2
         move.l  #41,d3
         bsr     print               ; Text ausgeben

;----PortList-Liste durchsuchen und Namen ausgeben-------------------

         move.l  $4,a0               ; Adresse der ExecBase-Struktur
         add.l   #392,a0             ; ab hier beginnt PortList...
         move.l  a0,d0
         add.l   #4,d0
         cmp.l   (a0),d0             ; ist die Liste leer ?
         beq     noPorts             ; ja, --> Ende

         move.l  (a0),a0             ; Listenkopf überlesen
loop:    move.l  (a0),Node           ; Zeiger auf Nachfolger retten
         beq     end                 ; = 0, --> Ende

         move.l  a0,Adress           ; Adresse der Struktur
         move.b  9(a0),Priority      ; Priorität holen
         move.l  16(a0),SigTask      ; Zeiger auf Empfänger-Task
         move.l  10(a0),a1           ; Adresse des Namens
         lea.l   Name,a2             ; Adresse des String-Puffers
         move.l  #0,d3
copy:    move.b  (a1)+,(a2)+         ; Zeichen kopieren
         addq.l  #1,d3               ; Zeichen zählen
         tst.b   -1(a2)              ; war letzter Code = 0 ?
         bne     copy                ; nein, --> weiterkopieren
         addq.l  #1,d3
         move.l  #Name,d2            ; Text-Adresse...
         bsr     print               ; Name ausgeben
         
         move.l  Node,a0             ; Zeiger auf nächsten Knoten
         bra     loop                ; nächsten Namen holen

noPorts: move.l  #Text2,d2           ; Liste ist leer...
         move.l  #33,d3
         bsr     print               ; Meldung ausgeben
         bra     end

;----Text ausgeben---------------------------------------------------

print:   move.l  DosBase,a6
         move.l  Handle,d1           ; Ausgabekanal (Shell-Fenster)
         jsr     Write(a6)           ; Text ausgeben
         rts

;----Zurück ins CLI--------------------------------------------------

end:     movem.l (sp)+,a0-a6/d0-d7   ; Register zurückholen
         move.l  DosBase,a6
         clr.l   d1                  ; kein Return Code
         jsr     Exit(a6)

;----Dezimalzahl zwischen -128 und 127 ausgeben----------------------

prntDez: lea.l   Puffer,a0
         btst    #7,d0               ; Zahl negativ ?
         bne     positiv             ; nein, --> springen

         move.b  #"-",(a0)+          ; "-" voranstellen
         and.b   #127,d0             ; Bit 7 löschen
         subi.w  #256,d0             ; Absolutwert errechnen

positiv: cmp.b   #99,d0
         bhi     xxx                 ; größer als 99, --> springen

         cmp.b   #9,d0
         bhi     xx                  ; größer als 9, --> springen

prntVal: add.b   #"0",d0             ; ASCII-Code berechnen
         move.b  d0,(a0)             ; Ziffer in Puffer schreiben
         move.l  #Puffer,d2
         move.l  #5,d3
         bsr     print               ; Zahl ausgeben
         rts

xxx:     move.b  #"1",(a0)+          ; Hunderter-Ziffer in Puffer
         subi.b  #100,d0             ; 3. Stelle entfernen
xx:
;----Datenbereich----------------------------------------------------
  even
DosName:  dc.b "dos.library",0
DosBase:  dc.l 0
Handle:   dc.l 0
Node:     dc.l 0
Priority: dc.l 0
Adress:   dc.l 0
SigTask:  dc.l 0
Name:     blk.b 50,0                 ; Puffer für den aktuellen Namen
Text:     dc.b "Folgende Message-Ports sind vorhanden:",13,10,10,0
Text2:    dc.b "Keine Message-Ports vorhanden !",13,10
PriText:  dc.b " , Priorität = ",0
AdrText:  dc.b " , Adresse = ",0
TskText:  dc.b " , Empfänger-Task = ",0
Puffer:   blk.b 10,0                 ; Puffer für Dez- und Hex-Zahl
