;* InputDevice example
 
; * This example adds a few mouse movements to the input chain...


		include	"baselibs.i"
		include	"baselibs1.i"
		include	"baseexec.i"
		include	"baseio.i"
		include	"exec/nodes.i"
		include	"exec/libraries.i"
		include	"exec/io.i"
		include "exec/memory.i"
		include "devices/input.i"
		include "devices/inputevent.i"

	#define	NULL,0
	#define	LF,10

		main()

	CPTR	inputReqBlk		;IOStdReg
	CPTR	inputport		;inputport
	CPTR	FakeEvent		;InputEvent
	int	flag			;deviceflag
       short      loop;
       short      num;
       short      numloop;
   {

    func	inputport,=,CreatePort,NULL,NULL
	if	inputport,==,0,1
	    {
		print	<"no open port",LF>
		exit	0
	    }
	    ifend	1
	
        func	FakeEvent,=,AllocMem,ie_SIZEOF,PUBLIC
	   if	FakeEvent,==,0,2
             {
		print	<"no memory for FakeEvent",LF>
		deleteport	inputport
		exit	0
	     }
	     ifend	2

            func	inputReqBlk,=,CreateExtIO,inputport,IOSTD_SIZE
		if	inputReqBlk,==,0,3                  
               	   {
		  	print	<"no create CreateExtIO",LF>
			Freemem	FakeEvent,ie_SIZEOF
			deleteport	inputport
			exit	0
		   }
	           ifend	3

                func	flag,=,OpenDevice,"input.device",NULL,inputReqBlk,NULL
		if	flag,==,0,4
                {
		    calc	numloop,=,0
                    while	numloop,«,4,5
		     {
		     calc	loop,=,0
                     while	loop,«,8,6
			{
			calc	num,=,0
	               	while	num,«,20,7
        	       	{
                	  structput	FakeEvent,->,ie_NextEvent,=,NULL;
     		          structput	FakeEvent,->,ie_Class,=,IECLASS_RAWMOUSE;
                	  structput	FakeEvent,->,ie_Code,=,IECODE_NOBUTTON;
                 	  structput	FakeEvent,->,ie_Qualifier,=,IEQUALIFIER_RELATIVEMOUSE;
                 	  structput	FakeEvent,->,ie_X,=,0;
                	  structput	FakeEvent,->,ie_Y,=,0;

                        switch loop
                        {
                        case 0,1
				 structput	FakeEvent,->,ie_X,=,1;
				break	1,1
                        case 1,2	
				 structput	FakeEvent,->,ie_X,=,1
				 structput	FakeEvent,->,ie_Y,=,1;
				break	2,1
                        case 2,3	
 				structput	FakeEvent,->,ie_Y,=,1;
				break	3,1
                        case 3,4
				structput	FakeEvent,->,ie_Y,=,1	
				structput	FakeEvent,->,ie_X,=,-1;
				 break	4,1
                        case 4,5
				structput	FakeEvent,->,ie_X,=,-1;
				break	5,1
                        case 5,6
				structput	FakeEvent,->,ie_X,=,-1
				structput	FakeEvent,->,ie_Y,=,-1; 
				break	6,1
                        case 6,7
				structput	FakeEvent,->,ie_Y,=,-1;
				break	7,1
                        case 7,8
				structput	FakeEvent,->,ie_Y,=,-1
				structput	FakeEvent,->,ie_X,=,1;
				break	8,1
                        }	1

                	   structput	inputReqBlk,->,IO_DATA,=,FakeEvent;
                 	   structput	inputReqBlk,->,IO_COMMAND,=,IND_WRITEEVENT;
                   	   structput	inputReqBlk,->,IO_FLAGS,=,0;
                  	   structput	inputReqBlk,->,IO_LENGTH,=,ie_SIZEOF;

                        DoIO	inputReqBlk;
			calc	num,++
                    	}	7
		      calc	loop,++
		      }	  6
		     calc	numloop,++
		     }	5
		    }
		    ifend	4		
                CloseDevice	 inputReqBlk
             
            DeleteExtIO		inputReqBlk
        
            FreeMem	FakeEvent,ie_SIZEOF

	    DeletePort	inputport

	}
	end
