;** Workbench-Message and .info display demo  S.D. **

execbase = 4            ;EXEC-Base address
FindTask = -294         ;Search for task
WaitPort = -384         ;Wait for message
GetMsg   = -372         ;Get message

OpenLib  = -408         ;Open library
CloseLib = -414         ;Close library
Open     = -30          ;Open channel
Close    = -36          ;Close channel
Read     = -42          ;Read data
Write    = -48          ;Display data
CurrentDir = -126       ;Set current directory
mode_old = 1005         ;Mode for opening

GetDiskObject = -78     ;Load DiskObject


run:
        move.l execbase,a6      ;EXEC-Base address

        suba.l a1,a1
        jsr    FindTask(a6)     ;Look for your own task

        move.l d0,a4            ;Pointer in A4
        tst.l  $ac(a4)          ;pr_CLI: CLI or Workbench?
        bne    fromCLI          ;CLI! End...

        lea    $5c(a4),a0       ;Wait for WBench
        jsr    WaitPort(a6)     ;message

        jsr    GetMsg(a6)       ;Get message
        move.l d0,message       ;Get pointer

; **** Open libraries and window ****

        lea    iconname,a1      ;"icon.library"
        clr.l  d0
        jsr    OpenLib(a6)      ;Open ICON.library
        move.l d0,iconbase      ;Reserve base
        beq    ende3            ;Found an error

        lea    dosname,a1       ;"dos.library"
        clr.l  d0
        jsr    OpenLib(a6)      ;Open DOS
        move.l d0,dosbase
        beq    ende2            ;Found an error

        move.l d0,a6
        move.l #conname,d1
        move.l #mode_old,d2
        jsr    Open(a6)         ;Open CON window
        move.l d0,conbase
        beq    ende1            ;Found an error

;**** Set the current directory when necessary ****

        move.l message,a0       ;Pointer to WBMessage
        move.l $24(a0),a0       ;sm_ArgList: Pointer to argument
        beq    ende             ;No argument

        move.l (a0),d1          ;D1 => Lock
        move.l dosbase,a6
        jsr    CurrentDir(a6)   ;Set current directory

; **** Load DiskObject (.info file) ****

        move.l message,a0
        move.l $24(a0),a0       ;sm_ArgList pointer
        move.l 4(a0),a0         ;wa_Name: Pointer to names

        move.l iconbase,a6
        jsr    GetDiskObject(a6) ;Load DiskObject

; **** Display ToolType entry in the window ****

        move.l d0,a1            ;Pointer to DiskObject-structure
        move.l $36(a1),a1       ;do_ToolTypes: Pointer to ToolType array
        move.l a1,typetext      ;Reserve text pointer

typesloop:
        move.l typetext,a1      ;Load text pointer
        move.l (a1)+,a0         ;Pointer to text in A0
        cmp.l  #0,a0            ;Text available?
        beq    nomore           ;NO: End of output
        move.l a1,typetext      ;Else reserve pointer

        move.l a0,d2            ;= Text address for output
        move.l a0,d3            ;Use length
lenlop:
        tst.b  (a0)+            ;Look for end
        bne    lenlop
        sub.l  a0,d3            ;Compute text length and
        not.l  d3               ;compensate as needed

        move.l dosbase,a6
        move.l conbase,d1
        jsr    Write(a6)        ;Display text in window

        move.l conbase,d1
        move.l #lf,d2           ;Linefeed:
        move.l #1,d3
        jsr    Write(a6)        ;next line

        bra    typesloop        ;Goto next entry

; **** That's all folks - wait for a keypress ****

nomore:
        move.l conbase,d1
        move.l #1,d3            ;Read one character
        move.l #buffer,d2       ;in buffer
        jsr    Read(a6)         ;(wait for Return key)

; **** End of program: Close everything up and return ****

ende:   move.l conbase,d1
        move.l dosbase,a6
        jsr    Close(a6)        ;Close window
ende1:
        move.l execbase,a6
        move.l dosbase,a1
        jsr    Closelib(a6)     ;Close DOS 
ende2:
        move.l iconbase,a1
        jsr    Closelib(a6)     ;Close ICON.library

fromCLI:
ende3:
        rts                     ;Program end

; **** Data arrays ****

dosbase:  blk.l 1       ;DOS base address
conbase:  blk.l 1       ;Window base address
iconbase: blk.l 1       ;icon.library base address
message:  blk.l 1       ;Pointer to WBMessage
typetext: blk.l 1       ;Text pointer

dosname:  dc.b 'dos.library',0
iconname: dc.b 'icon.library',0
conname:  dc.b 'CON:10/20/300/100/** Message output',0
lf:       dc.b $a
buffer:   blk.b 2

 end
