** Version 1.2

**  CreateStdIO and CreatePort is linked into the program  **
**  when you run the linker program   **
**  To Link Use:
**  ALINK <programname> to <outputprogramname> lib <drive>:lib/amiga.lib
**  eg:
**  ALINK AutoIconOpen.obj to AutoIconOpen lib df0:lib/amiga.lib
**  You will have an runable program

* This version by John Veldthuis
* Updated to work under AmigaDOS 1.2
* For more documentation see 'C' version on NZAmigaUG#5 or AmigaLibDisk#87
* (two other programs that may be of interest are 'Move Pointer'
*  and 'Move Window' by 'Cewy', they are also on AmigaLibDisk#87)

   section  "AutoOpenIcon",code
   NOLIST
   NOPAGE
   include  "exec/types.i"
   include  "exec/io.i"
   include  "exec/devices.i"
   include  "devices/input.i"
   include  "devices/inputevent.i"
   LIST
   xref  _AbsExecBase
   xref  _LVOOpenDevice
   xref  _LVOCloseDevice
   xref  _LVODoIO
   xref  _CreatePort
   xref  _CreateStdIO
   xref  _DeleteStdIO
   xref  _DeletePort
   xdef  _SysBase
_SysBase  equ  4

** Open up reply port for Intuition **
Start clr.l    -(sp)
      clr.l    -(sp)
      jsr      _CreatePort ; CreatePort for IO
      addq.l   #8,sp
      tst.l    d0
      beq      Error
      move.l   d0,Port

** Create a hunk of memory for IO structure  **
      move.l   d0,-(sp)
      jsr      _CreateStdIO; Create IO data structure
      addq.l   #4,sp
      tst.l    d0
      beq      Error1
      move.l   d0,Input_request_block

** Open up Input.Device **
      lea      DevName,a0
      move.l   d0,a1
      clr.l    d0
      clr.l    d1
      move.l   _SysBase,a6
      jsr      _LVOOpenDevice(a6); Open input Device
      tst.l    d0
      bne      Error2

** Set up IO structure for Input Event **
      move.l   Input_request_block,a0
      move.w   #IND_WRITEEVENT,IO_COMMAND(a0)
      move.b   #0,IO_FLAGS(a0)
      move.l   #ie_SIZEOF,IO_LENGTH(a0)
      move.l   #Event,IO_DATA(a0)

** Move to Top Left Corner  **

      lea      Event,a0
      move.l   #0,ie_NextEvent(a0)      ; No next Event
      move.b   #IECLASS_RAWMOUSE,ie_Class(a0) ;RawMouse Event
      move.l   #0,ie_TimeStamp+TV_SECS(a0)
      move.l   #0,ie_TimeStamp+TV_MICRO(a0)
      move.w   #IECODE_NOBUTTON,ie_Code(a0)
      move.w   #IEQUALIFIER_RELATIVEMOUSE,ie_Qualifier(a0)
      move.w   #-640,ie_X(a0)
      move.w   #-512,ie_Y(a0)
      move.l   Input_request_block,a1
      jsr      _LVODoIO(a6)                   ;Move
      tst.l    d0
      bne      Error3

**  Move pointer to bottom-righthand corner **

      lea      Event,a0
      move.l   #0,ie_NextEvent(a0)        ; no next event
      move.b   #IECLASS_RAWMOUSE,ie_Class(a0)
      move.l   #0,ie_TimeStamp+TV_SECS(a0)
      move.l   #0,ie_TimeStamp+TV_MICRO(A0)
      move.w   #IECODE_LBUTTON,ie_Code(a0)    ; left button down
      move.w   #IEQUALIFIER_RELATIVEMOUSE,ie_Qualifier(a0)
      move.w   #638,ie_X(a0)   ;    move  mouse to lower right
      move.w   #398,ie_Y(a0)
      move.l   Input_request_block,a1
      jsr      _LVODoIO(a6)
      tst.l    d0
      bne      Error3 ;  Error from IO if not Null returned

**  resize window **

      lea      Event,a0
      move.l   #0,ie_NextEvent(a0)
      move.b   #IECLASS_RAWMOUSE,ie_Class(a0)
      move.l   #0,ie_TimeStamp+TV_SECS(a0)
      move.l   #0,ie_TimeStamp+TV_MICRO(A0)
      move.w   #IECODE_LBUTTON!IECODE_UP_PREFIX,ie_Code(a0) ; left button up
      move.w   #IEQUALIFIER_RELATIVEMOUSE,ie_Qualifier(a0)
      move.w   #-100,ie_X(a0)       ;move mouse left 100
      move.w   #0,ie_Y(a0)
      Move.l   Input_request_block,a1
      jsr      _LVODoIO(a6)
      tst.l    d0
      bne      Error3 ;  Error from IO if not Null returned

**  Move to Disk Icon (595,45)?  **

      lea      Event,a0
      move.l   #0,ie_NextEvent(a0)
      move.b   #IECLASS_RAWMOUSE,ie_Class(a0)
      move.l   #0,ie_TimeStamp+TV_SECS(a0)
      move.l   #0,ie_TimeStamp+TV_MICRO(A0)
      move.w   #IECODE_NOBUTTON,ie_Code(a0)        ; no button
      move.w   #IEQUALIFIER_RELATIVEMOUSE,ie_Qualifier(a0)
      move.w   #55,ie_X(a0)          ; move mouse to icon
      move.w   #-355,ie_Y(a0)
      move.l   Input_request_block,a1
      jsr      _LVODoIO(a6)
      tst.l    d0
      bne      Error3 ;  Error from IO if not Null returned

**  Press left button   **

      lea      Event,a0
      move.l   #0,ie_NextEvent(a0)
      move.b   #IECLASS_RAWMOUSE,ie_Class(a0)
      move.l   #0,ie_TimeStamp+TV_SECS(a0)
      move.l   #0,ie_TimeStamp+TV_MICRO(A0)
      move.w   #IECODE_LBUTTON,ie_Code(a0)        ; left button down
      move.w   #IEQUALIFIER_RELATIVEMOUSE,ie_Qualifier(a0)
      move.w   #0,ie_X(a0)
      move.w   #0,ie_Y(a0)
      move.l   Input_request_block,a1
      jsr      _LVODoIO(a6)
      tst.l    d0
      bne      Error3 ;  Error from IO if not Null returned


**  Press left button again   **

      lea      Event,a0
      move.l   #0,ie_NextEvent(a0)
      move.b   #IECLASS_RAWMOUSE,ie_Class(a0)
      move.l   #0,ie_TimeStamp+TV_SECS(a0)
      move.l   #0,ie_TimeStamp+TV_MICRO(A0)
      move.w   #IECODE_LBUTTON,ie_Code(a0)       ; left button down again
      move.w   #IEQUALIFIER_RELATIVEMOUSE,ie_Qualifier(a0)
      move.w   #0,ie_X(a0)
      move.w   #0,ie_Y(a0)
      move.l   Input_request_block,a1
      jsr      _LVODoIO(a6)
      tst.l    d0
      bne      Error3 ;  Error from IO if not Null returned

** Close Down IO and Deallocate all memory used **
         move.l   Input_request_block,a1
         jsr      _LVOCloseDevice(a6)
         move.l   Input_request_block,-(sp)
         jsr      _DeleteStdIO
         addq.l   #4,sp
         move.l   Port,-(sp)
         jsr      _DeletePort
         addq.l   #4,sp
         clr.l    d0          ; signal no error to CLI
         rts


**    Close down and deallocate whatever is opened When error  **
Error3   move.l   Input_request_block,a1
         jsr      _LVOCloseDevice(a6)
Error2   move.l   Input_request_block,-(sp)
         jsr      _DeleteStdIO
         addq.l   #4,sp
Error1   move.l   Port,-(sp)
         jsr      _DeletePort
         addq.l   #4,sp
Error    move.l   #20,d0     ; signal error to CLI
         rts

      SECTION  "Data",DATA

DevName  dc.b  'input.device',0
           CNOP   0,2
Port     dc.l  0
Input_request_block  dc.l  0
Dev      dc.l  0
Event    dc.l  0
         dc.b  0
         dc.b  0
         dc.w  0
         dc.w  0
         dc.l  0
         dc.w  0
         dc.w  0
         dc.l  0
         dc.l  0
         dc.l  0
         dc.l  0

            CNOP 0,2
   end

