In my last project I needed to use some test-coordinates before I generated a sine curve. The easiest way to do such thing is to read the mouse and as many people know that is a fairly easy task in for example Basic or other high level languages.

If you want to read the mouse in assembler you need to read \$dff00a, which is a word and has the structure of Y position in bytes + X Position in bytes.

Well… This seems simple, just read it in and see if there is some change and then get the delta (Old Coordinate – New Coordinate). This might work, but what do you do if the counter loops?

## Information:

• Code was made in AsmOne 1.48 / AsmPro 1.18
• Activate LimitMouse to ScreenWidth/ScreenHeight but setting MouseLimit to 1
• Read the X Mouse and Y Mouse from the MouseX and MouseY label

## The code:

```		; -----------------------------

ScreenWidth		equ	320
ScreenHeight		equ	256

IFND MouseLimit
; 0 = Mouse Limit InActive
; 1 = Mouse Limit Active (Default)
MouseLimit			equ	1
ENDC

; **** SOF Read Mouse Routine ****

movem.l	d0-d2/a0-a1,-(sp)
lea.l	OldDeltaY,a0
lea.l	\$dff00a,a1

moveq	#0,d0
move.b	(a1),d0		; Get New Y Mouse
move.w	(a0),d1		; Get Old Y Mouse
move.w	d0,(a0)		; Save New Y Mouse
sub.w	d1,d0		; Delta Y

moveq	#0,d1
move.b	1(a1),d1	; Get New X Mouse
move.w	2(a0),d2	; Get Old X Mouse
move.w	d1,2(a0)	; Save New X Mouse
sub.w	d2,d1		; Delta X

; **** Check Y Delta ****

cmp.w	#-127,d0
bge	.NoUnderFlowY
move.w	#-255,d2
sub.w	d0,d2		; Delta Y = -255 - Delta Y
bpl	.noYPos
moveq	#0,d2

.noYPos:	move.w	d2,d0
bra	.rmSkipY

.noUnderFlowY:	cmp.w	#127,d0
ble	.rmSkipY
move.w	#255,d2
sub.w	d0,d2		; Delta X = 255 - Delta Y
bmi	.noYNeg
moveq	#0,d2
.noYNeg:	move.w	d2,d0

.rmSkipY:

; **** Check X Delta ****

cmp.w	#-127,d1
bge	.NoUnderFlowX
move.w	#-255,d2
sub.w	d1,d2		; Delta X = -255 - Delta X
bpl	.noXPos
moveq	#0,d2

.noXPos:	move.w	d2,d1
bra	.rmSkipX

.noUnderFlowX:	cmp.w	#127,d1
ble	.rmSkipX
move.w	#255,d2
sub.w	d1,d2		; Delta X = 255 - Delta X
bmi	.noXNeg
moveq	#0,d2
.noXNeg:	move.w	d2,d1

.rmSkipX:

lea.l	MouseY,a0

move.w	(a0),d2		; D2.W = Old Y Mouse
add.w	d0,d2		; Y Mouse = Y Mouse + Y Delta

IF MouseLimit
bpl	.yPositive

moveq	#0,d2
.yPositive:	cmp.w	#ScreenHeight-1,d2	; Y Mouse > Screen Height?
ble	.yBelow
move.w	#ScreenHeight-1,d2
.yBelow:
ENDC
move.w	d2,(a0)+	; Save Y Mouse

move.w	(a0),d2		; D2.W = Old X Mouse
add.w	d1,d2		; X Mouse = X Mouse + X Delta
IF MouseLimit
bpl	.xPositive

moveq	#0,d2
.xPositive:	cmp.w	#ScreenWidth-1,d2	; X Mouse > Screen Width?
ble	.xBelow
move.w	#ScreenWidth-1,d2
.xBelow:
ENDC
move.w	d2,(a0)+

movem.l	(sp)+,d0-d2/a0-a1
rts

; **** EOF Read Mouse Routine ****

OldDeltaY:	dc.w	0
OldDeltaX:	dc.w	0
MouseY:		dc.w	0
MouseX:		dc.w	0

; -----------------------------
```
0