;#####################################################
;###                 Mouse-Handling                ###
;#####################################################
;
; wird über GetKey aufgerufen, falls peekEvent=2 (Maus)
; in X steht Zeiger auf Eingangspuffer IbuffS,X

	.IF Mouse

; Hilfsroutinen
MouseLoadString:
	.DB	"LOAD",'"',$00	
MouseRunString:
	.DB	"RUN",$00		; ESC+String
	

; Hilfsroutine zur Screen-Ausgabe eines Strings nach JSR WriteMsg
MouseOverlayMsg:		; Put Msg String Routine
	PLA		; Get the return address LSB from stack
	STA Cmdptr	; ..into w/s
	PLA		; Get the return address MSB from stack
	STA Cmdptr+1	; ..into w/s
MouseOverlayMsgChar:
	LDY #$0
	INC Cmdptr	; Point to the next byte of embedded text
	BNE MouseOverlayMsgNext
	INC Cmdptr+1	; Increment MSB text pointer if carried over
MouseOverlayMsgNext:
	LDA (Cmdptr),Y	; Get the next character of embedded text
	BMI MouseOverlayMsgExit; ..reached terminator - execute from here
	STA	BtnWR		; Zeichen in GTEXT-Schreibregister
	INC	BtnX
	JMP MouseOverlayMsgChar; ..and go for the next character
MouseOverlayMsgExit:
	JMP (Cmdptr)	; Continue execution from the negative byte


MouseOverlayClear:
	JSR	OverlayClear	; kehrt für GetKey mit 0 in Acc zurück
	LDA	#0	; Eingabe beendet
	RTS

MouseOverlayOnOff:
; auf rechte Maustaste reagieren - Tastatur ein- und ausblenden
	LDA	MouseOverlayToggle
	EOR	#$FF
	STA	MouseOverlayToggle
	BEQ	MouseOverlayClear
	JSR	OverlayClear
	LDA	#0
	STA	BtnX
	LDA	#6	; MouseY = 30..34 bei 16x20 Fontsize
	STA	BtnY
	JSR	MouseOverlayMsg
	.db	32,91,"1\2\3\4\5\6\7\8\9\0\=\?\!",93
	NOP
	LDA	#0
	STA	BtnX
	LDA	#7	; MouseY = 35..39
	STA	BtnY
	JSR	MouseOverlayMsg
	.db	91,"Q\W\E\R\T\Y\U\I\O\P\*\<<",93
	NOP
	LDA	#0
	STA	BtnX
	LDA	#8	; MouseY = 40..44
	STA	BtnY
	JSR	MouseOverlayMsg
	.db	32,91,"A\S\D\F\G\H\J\K\L\+\#\/\__",93
	NOP
	LDA	#0
	STA	BtnX
	LDA	#9	; MouseY = 46..49
	STA	BtnY
	JSR	MouseOverlayMsg
	.db	32,32,91,"Z\X\C\V\B\N\M\,\.\:\-",93
	NOP
	LDA	#0
	STA	BtnX
	LDA	#10	; MouseY = 50..54
	STA	BtnY
	JSR	MouseOverlayMsg
	.db	"   ",91,'"',"\$\^^^^^^^^^^^\(\)",93
	NOP
	JMP	MouseCmdNone

	
MousePutBuf:	
	LDY	#0
MousePutBuf_lp:
	LDA	(ptrsrc),Y
	BEQ	MousePutBuf_exit	; NOP erreicht?
	STA	Ibuffs,Y	; in Buffer abgelegen
	INY
	BNE	MousePutBuf_lp
MousePutBuf_exit:
	RTS

	
		
MouseChar:	; holt Zeichen bei letzter Maus-Position aus regulärem Textspeicher
	JSR	MouseSaveText
	BIT	MouseOverlayToggle
	BMI	MouseCharOverlay	; vom Button-Overlay holen
	LDA	MouseTextX		; sonst aus normalem Textspeicher
	STA	TextX
	LDA	MouseTextY
	STA	TextY
	LDA	TextWR
	JMP	MouseRestoreText

MouseCharOverlayNone:
	LDA	#0
	JMP	MouseCharOverlay_9	
	
MouseCharOverlay:
	LDA	#6		; oberste Zeile "Overlay"
	STA	TextIdx
	LDA	MousePosY	
; Overlay-Zeile ermitteln
	CMP	#55	
	BCS	MouseCharOverlayNone	; wenn MousePosY >55
	CMP	#50
	BCS	MouseCharOverlay_add4
	CMP	#45
	BCS	MouseCharOverlay_add3
	CMP	#40
	BCS	MouseCharOverlay_add2
	CMP	#35
	BCS	MouseCharOverlay_add1
	CMP	#30
	BCS	MouseCharOverlay_add0
	BCC	MouseCharOverlayNone	; nicht innerhalb Overlaybereich
	
MouseCharOverlay_add4:	
	INC	TextIdx
MouseCharOverlay_add3:	
	INC	TextIdx
MouseCharOverlay_add2:	
	INC	TextIdx
MouseCharOverlay_add1:	
	INC	TextIdx
MouseCharOverlay_add0:
	LDA	TextIdx
	STA	BtnY	
	LDA	MouseTextX
	LSR				; div 2, da doppelt so breit wie 8x12er Font
	STA	BtnX
	LDA	BtnWR
	CMP	#' '
	BEQ	MouseCharOverlayNone	; Taste nicht getroffen
	CMP	#'\'
	BEQ	MouseCharOverlayNone	; Taste nicht getroffen
	CMP	#91
	BEQ	MouseCharOverlayNone	; Taste nicht getroffen
	CMP	#93
	BEQ	MouseCharOverlayNone	; Taste nicht getroffen
	CMP	#'^'			; Button-Space
	BNE	MouseCharOverlay_1
	LDA	#' '
MouseCharOverlay_1:
	CMP	#'<'			; Button-Backspace
	BNE	MouseCharOverlay_2
	LDA	#8
MouseCharOverlay_2:
	CMP	#95			; Button-Enter
	BNE	MouseCharOverlay_3
	LDA	#13
MouseCharOverlay_3:
	PHA
	LDA	BtnWR	
	PHA
	LDA	#64
	STA	BtnWR			; @ = gedrückte Taste
;	LDA	#$FF
;	STA	BtnHilite
	LDA	#5
	JSR	TickerDelay
	LDA	#$0
	STA	BtnHilite
	PLA	
	STA	BtnWR
	PLA
MouseCharOverlay_9:
	CLC
		
MouseRestoreText:	
; Vorherige Text-Schreibposition wiederherstellen
	PHA
	LDA 	Color	; letzte Grundfarbe
	STA 	ColorP
	LDA	MouseTextXtemp
	STA	TextX
	LDA	MouseTextYtemp
	STA	TextY
	PLA
	RTS


; Aktuelle Text-Schreibposition sichern
MouseSaveText:
	LDA	TextX
	STA	MouseTextXtemp
	LDA	TextY
	STA	MouseTextYtemp
	RTS

MouseOverlayOnOffJmp:
	JMP	MouseOverlayOnOff	
; ### Maus-Event behandeln
; ### übergibt Befehl in IbuffS ###
; ### Einsprungpunkt
MouseEvent:
	LDA	#0
	STA	peekEvent
	LDA	MouseButtons
	CMP	#2
	BEQ	MouseOverlayOnOffJmp
	CMP	#1
	BNE	MouseEventNone	; wenn 0, nur losgelassen
	LDA	MouseTextY
	BNE	MouseNotLine0
	LDA	MouseTextX
; Auf Klick in oberste Zeile reagieren
	CMP	#58
	BCS	MouseCLS
	CMP	#11	; ab Spalte 13 ist nix
	BCS	MouseEventNone
	CMP	#8
	BCS	MouseLoad
	CMP	#4
	BCS	MouseStop
	JMP	MouseRun
	
MouseNotLine0:
	BIT	MouseOverlayToggle	;Overlayd eingeschaltet?
	BPL	MouseEventNone
	JSR	MouseChar		; Zeichen an Mausposition holen
	RTS
	
MouseEventNone:
	LDA	#0	; keine Taste simulieren
	RTS

MouseCmdNone:
	LDA	#0
	STA 	xsave	; keine Befehlseingabe, IBuffS leer (X=0)
	RTS

MouseCLS:
	LDX	xsave	
	JSR	ClearFullScreen
	LDA	#0
	RTS
	
MouseBS:
	LDA	#8
	RTS
	
MouseStop:
	JSR	OverlayClear
	LDA	#0
	STA	MouseOverlayToggle
	JMP	LAB_WARM
	
MouseRun:	
; Eingabe "RUN" faken	
	LDA	RunFlag	
	BNE	MouseCmdNone	; ein Programm läuft, also nix machen
	LDA	#<MouseRunString
	STA	ptrsrc
	LDA	#>MouseRunString
	STA	ptrsrc+1
	JSR	MousePutBuf
	JMP	MouseSetBufEnd
	
MouseLoad:	
; Mouse Directory and LOAD
	LDA	RunFlag	
	BNE	MouseCmdNone	; ein Programm läuft, also nix machen
	JSR	ClearFullScreen
	JSR 	WriteMsg
	.DB 	"Click button to load file",$0D,$0A	
	NOP
	JSR	MouseCardDir
	
MouseLoadClick:
	JSR	ClickWait
	
; Häkchen getroffen?
	LDA	MouseTextX
	STA	work
	JSR	MouseChar	; Zeichen unter Maus holen
	CMP	#145
	BEQ	MouseLHitOK	; Button getroffen?
	INC	work	; Zeiger eins vor
	CMP	#144
	BEQ	MouseLHitOK	; kein Button?
	JMP	MouseLoadNone
MouseLHitOK:
;
; Eingabe LOAD "... faken	
	LDA	#<MouseLoadString
	STA	ptrsrc
	LDA	#>MouseLoadString
	STA	ptrsrc+1
	JSR	MousePutBuf
	
MouseLoadClick_0:
	LDX	work
	INX			; Häkchen und Leerzeichen überspringen
	LDA	MouseTextY
	STA	TextY
MouseLoadClick_1:
	INX	
	STX	TextX
	LDA	TextWR	; Zeichen direkt vom Bildschirm holen
	CMP	#' '	; Ende=Leerzeichen?
	BEQ	MouseSetBufEnd
	STA	Ibuffs,Y	; in Buffer abgelegen
	INY
	BNE	MouseLoadClick_1	; immer


MouseSetBufEnd:		; Y zeigt auf Ende des Eingabepuffers
	LDA	#0
	STA	Ibuffs,Y	; in Buffer abgelegen
	STY	xsave
	LDX	xsave	
; abschließendes " nach Dateinamen wird in BASIC nicht benötigt	
; (!) Y-Index wird neuer Pointer (X) auf Ibuffs-Position für BASIC, xsave geht über GetKey in X
	TAY
	
	JSR	ClearFullScreen
	LDA	#$0D	; ENTER-Taste übergeben
	RTS
	
Clickwait:
	LDA	MouseButtons
	CMP	#1
	BNE	Clickwait	; auf Click-Event vom IRQ warten
	LDA	#0
	STA	peekEvent	; Event löschen, wird jetzt behandelt
	RTS
	
MouseLoadNone:
	JSR	ClearFullScreen
	JSR 	WriteMsg
	.DB 	$0D,$0A,"None selected",$0D,$0A	
	NOP
	LDX	#0
	JMP	LAB_WARM

			
MouseCardDir:	; Directory on Screen, dreispaltig
	JSR 	COMswitch
	JSR 	SendMsg
	.ASCII "9:DIR",$0D
	NOP

MouseCardDirResponse:
	JSR	ReceiveString
	STX	scratch+1	; Ende des empfangenen Strings
	BCC	MouseCardDirResponseExit
	LDA	#'['
	JSR	SearchIbuffAcc
	BCC	MouseCardDirResponse
	INY
	STY	work	; Filename Anfang
	LDA	#'.'
	JSR	SearchIbuffAccY
	BCC	MouseCardDirResponse	; kein Punkt im Dateinamen

	INY				; Extension überprüfen
	LDA	IBuffS,Y
	CMP	#'B'	
	BNE	MouseCardDirResponse
	INY
	LDA	IBuffS,Y
	CMP	#'A'	
	BNE	MouseCardDirResponse
	INY
	LDA	IBuffS,Y
	CMP	#'S'	
	BNE	MouseCardDirResponse
	
	LDA	#32	
	JSR 	WriteScreen
	LDA	#7			; Zeichen weiß
	STA	ColorP
	LDA	#144	
	JSR 	WriteScreen
	LDA	#7
	STA	ColorP
	LDA	#145	
	JSR 	WriteScreen
	LDA	#32	
	JSR 	WriteScreen
	LDA	#3
	STA	ColorP

MouseCardDirResponseWrite:
	LDY	#0
	STY 	scratch
	LDY	work
MouseCardDirWriteLoop:
	LDA	IBuffS,Y
	CMP	#']'	
	BEQ	MouseCardDirNextEntry
	JSR 	WriteAcc
	INC	scratch
	
	INY
	BEQ	MouseCardDirResponse
	JMP	MouseCardDirWriteLoop
	
MouseCardDirNextEntry:
	LDA	#16	;
	SEC		;
	SBC	scratch
	TAX
	JSR	PrintXSP;
	LDX	scratch+1

	JMP	MouseCardDirResponse
			
MouseCardDirResponseExit:
	LDA	Color
	STA	ColorP
	JSR 	LAB_FlushRx
	LDA 	COMCHsave
	STA 	COMCH
	JMP	MouseCmdNone

	.ENDIF	; mouse
