; ***********************************
; *          Automaus               *
; *        /---------\              *
; * Geschrieben von Laurenz Prüßner *
; *                                 *
; * Sprache : 680x0 Assembler       *
; * Compiler: TurboAss 1,65         *
; *                                 *
; ***********************************

OPT F+

mousevec:
	EQU	$10	; mousevec-Offset

TEXT

	bsr	xbra	; neue Mausroutine installieren
	lea	ausgabe(PC)	; Einschaltmeldung
	movea.w	#'-', A5	; Vorzeichen für negative Werte
	bsr.s	textaus	; bleibt ständig in A5

was_passiert:
	lea	xpos(PC), A0	; X-Positions-String laden
	bsr.s	textaus	; und ausgeben
	lea	relmouse(PC), A0
	move.w	(A0)+, D7	; Mausdaten lesen, Header -> D7
	move.w	(A0)+, D5	; dx -> D5
	move.w	(A0), D6	; dy -> D6

	clr.l	-2(A0)	; alte Daten löschen
	bsr.s	bindec	; X-Werte umrechnen
	bsr.s	textaus	; Y-Positions-String ausgeben
	move.w	D6, D5	; Y-Werte in D5 laden
	bsr.s	bindec	; auch umrechnen
	bchg	#1, D7	; Linke Maustaste gedrückt?
	beq.s	right	; nein
	bsr.s	textaus	; Ja. L-String ausgeben

right:
	bchg	#0, D7	; Rechte Maustaste gedrückt?
	beq.s	was_passiert	; Nein. Auf neue Mausevents warten
	lea	rightbutt(PC), A6	; Ja
	bsr.s	textaus	; R-String ausgeben
	moveq	#%10, D0
	and.l	D0, D7	; beide Tasten gedrückt?
	bne.s	was_passiert	; Nein -> weiter warten
	bsr.s	xbra	; Deinstallieren

	clr.w	-(SP)
	trap	#1	; Programmende

textaus:
	moveq	#0, D5	; D5 auf Word-Breite bringen
cont_textaus:
	move.b	(A6)+, D5
	beq.s	rücksprung	; -> rts (req gibts ja nicht)
	bsr.s	conout
	bra.s	cont_textaus
bindec:
	bsr.s	bin
	moveq	#' ‚, D5	; SPACE ausgeben
	bra.s	conout

bin:
	ext.w	D5
	bge.s	umrechnen	; positiver Wert?
	exg	A5, D5
	bsr.s	conout
	exg	A5, D5
	not.w	D5
	addq.w	#1, D5

umrechnen:
	divs	#100, D5
	bsr	endaus
	clr.w	D5
	swap	D5
	divs	#10, D5
	bsr.s	endaus
	swap	D5

endaus:
	add.b	#'0', D5

cconout:
	move.w	D5, -(SP)
	move.w	#2, -(SP)	; Cconout()
	trap	#1
	addq.l	#4, SP
rücksprung:
	rts

xbra:
	move.w	#$22, -(SP)	; Kbdvbase
	trap	#14
	addq.l	#2, SP	; D0 - Pointer auf KBDVECS

	moveq	#mousevec, D1	; kürzer als
	add.l	D1, D0	; addi.l  #mousevec, D0
	movea.l	D0, A0
	lea	my_mouse(PC), A1

	movea.l	(A0), A2	; Startadresse der Routine holen

kette:
	ble.s	install
	cmpi.l	#'XBRA', -12(A2)	; XBRA-Struktur gefunden?
	bne.s	install	; Wenn nicht, dann installieren
	move.l	-8(A1), D1	; Ist es die gleiche Routine?
	cmp.l	-8(A2), D1
	beq.s	found	; Ja!

	lea	-4(A2), A0
	movea.l	(A0), A2
	bra.s	kette

install:
	movea.l	D0, A0
	move.l	(A0), -4(A1)	; Routine installieren
	move.l	A1, (A0)
	rts

found:
	move.l	-4(A2), (A0)	; Oldadr rekonstruieren
	rts

; *****************************
; *** XBRA - IKBD - Routine ***


	DC.L	'XBRA'	; XBRA-Struktur
	DC.L	'AMOS'
oldadr:
	DC.L	1

my_mouse:
	move.l	(A0), D0	; Das Kommandopaket umkopieren
	lea	relmouse(PC), A0
	movep.l	D0, 1(A0)	; und dabei auf WORD-Größe bringen
	rts

; *****************************

DATA

ausgabe:
	DC.B	$1B, $45, $0A, $1B, $70
	ASCII	'   AUTOMAUS 1.0   '
	DC.B	$1B, $71, $0D, $0A
	ASCII	'von Laurenz Prüßner'
	DC.B	$0D, $0A, 0
	EVEN

xpos:
	DC.B	$1b, $48, $0A, $0A, $0A, $0A
	ASCII	'Veränderung der X-Position: '
	DC.B	0
	EVEN

ypos:
	DC.B	$0A, $0D
	ASCII	'Veränderung der Y-Position: ‚
	DC.B	$0A, $1B, $6F, $1B, $4B, $1B, $41, 0
	EVEN

	DC.B	$0A, $0D
	ASCIIZ	‚Linke Maustaste gedrückt'
	EVEN

rightbutt:
	DC.B	$0A, $0D
	ASCIIZ	'Rechte Maustaste gedrückt'
	EVEN

BSS
relmouse:
	DS.W	4

END
