* Simple Assembly language example. Eats away a little ram
* from WorkBench use, should probably link with some startup
* code to handle the WBenchMsg coming to the task.

_AbsExecBase equ 4

_LVOForbid       equ -$84
_LVOPermit       equ -$8a
_LVOReplyMsg     equ -$17a
_LVOGetMsg       equ -$174
_LVODisplayBeep  equ -$60
_LVOOpenLibrary  equ -$228
_LVOCloseLibrary equ -$19e
_LVOOpenScreen   equ -$c6
_LVOCloseScreen  equ -$42
_LVOWaitPort     equ -$180
_LVOOpenWindow   equ -$cc
_LVOCloseWindow  equ -$48

SMART_REFRESH equ 0
WINDOWDRAG equ 2
WINDOWDEPTH equ 4
WINDOWCLOSE equ 8
CUSTOMSCREEN equ $f
wd_RPort    equ $32
wd_UserPort equ $56
CLOSEWINDOW equ $200
ACTIVATE    equ $1000

pr_MsgPort       equ $5c
pr_CLI           equ $ac
ThisTask         equ $114

       movea.l _AbsExecBase,a6   test if WB or CLI
       movea.l ThisTask(a6),a0
       moveq   #0,d0
       tst.l   pr_CLI(a0)
       bne.s   isCLI

       lea     pr_MsgPort(a0),a0     for WB get WB Message
       jsr     _LVOWaitPort(a6)
       jsr     _LVOGetMsg(a6)

isCLI  move.l  d0,-(a7)

   lea        IntuitionName(pc),a1
   clr.l    d0
   movea.l  _AbsExecBase,a6
   jsr      _LVOOpenLibrary(a6)      ; Ought to make things secure,
   tst.l    d0
   beq      exit

   move.l   d0,IntuiBase
   move.l   d0,a6      ; Need pointer right away
   lea      MyNewScreen(pc),a0
   jsr      _LVOOpenScreen(a6)      ; No error checking done
   tst.l    d0
   beq      3$

   move.l   d0,MyScreen
   move.l   d0,NewWindowScreen
   movea.l  IntuiBase(pc),a6
   lea      MyNewWindow(pc),a0
   jsr      _LVOOpenWindow(a6)      ; Still no error checking
   tst.l    d0
   beq      2$

   move.l   d0,MyWindow
   move.l   d0,a0
   move.l   wd_UserPort(a0),a0
   movea.l  _AbsExecBase,a6
   jsr      _LVOWaitPort(a6)      ; Wait for close gadget
   
   movea.l  IntuiBase(pc),a6
   movea.l  MyWindow(pc),a0
   jsr      _LVOCloseWindow(a6)
2$:
   movea.l  IntuiBase(pc),a6
   movea.l  MyScreen(pc),a0
   jsr      _LVOCloseScreen(a6)
3$:
   movea.l  _AbsExecBase,a6
   move.l   IntuiBase(pc),a1
   jsr      _LVOCloseLibrary(a6)

exit:  movea.l _AbsExecBase,a6
       move.l  (a7)+,d0
       beq.s   NoBenh
       jsr     _LVOForbid(a6)       reply to WB
       movea.l d0,a1
       jsr     _LVOReplyMsg(a6)
       jsr     _LVOPermit(a6)

NoBenh moveq   #0,d0
       rts

* Data section

**************** Screen data

MyScreen:
   dc.l 0

MyNewScreen:  dc.w 0,0,320,256   ;size filled in later
              dc.w 4      ;depth
              dc.b 0,1
              dc.w 0      ;viewmodes
              dc.w CUSTOMSCREEN
              dc.l 0
              dc.l ScreenTitle
              dc.l 0,0

**************** Window data

MyWindow:
   dc.l 0

MyFlags       EQU SMART_REFRESH!ACTIVATE!WINDOWDEPTH!WINDOWDRAG!WINDOWCLOSE
MyNewWindow:  dc.w 0,30,250,100
              dc.b 2,5
              dc.l CLOSEWINDOW   ; IDCMP Flags
              dc.l MyFlags
              dc.l 0,0
              dc.l WindowTitle
NewWindowScreen: dc.l 0      ; Screen to be filled in later
              dc.l 0      ; Pointer to bitmap
              dc.w 0,0,0,0
              dc.w CUSTOMSCREEN

ScreenTitle:
   dc.b 'Assembly Language Screen!',0
WindowTitle:
   dc.b 'Assembly Language is fun!',0
IntuitionName:
   dc.b 'intuition.library',0
IntuiBase:
   dc.l 0
   end
