;##########################################################################
;
;                          *** PLOTLIB ***
;
; Sammlung von Grafik-Routinen und Erweiterungen für c't-BASIC
; Zu initialisieren mit CALL $B400
; Benötigt c't-BASIC ab Version 2.3b
;
; C.Meyer 12/2009, cm@ctmagazin.de
;
;##########################################################################


OriginX	= LastPlotX
OriginY	= LastPlotY

ScaleX 	= scratch
ScaleY 	= scratch+1
SubCount = scratch+2
PlotTextFlag = scratch+3	; wenn <>0, wird Zeichen über WriteAcc geplottet
OldWriteVecL	= scratch+4
OldWriteVecH	= scratch+5
; temporäre Vars für Circle
rd	= scratch+6
cx	= scratch+7
cy	= scratch+8
dx	= scratch+9
dy	= scratch+10
fe	= scratch+11
oct	= scratch+12
atempc	= scratch+13
ytempc	= scratch+14
xtempc	= scratch+15
shift	= rd
cabval	= rd	; 3.Byte im Callback-Befehl, sonst "Color"
balkencolor = cx
cdmax	= $E5	; wie asave!
instval = $E5

; Konstanten
Pcab 	= $FD	; Callback machine code Subroutine in X (LSB) and Y (MSB)
Psub 	= $FE	; call plot subroutine in X,Y
Pret 	= $FF	; return vom plot subroutine
Pno 	= $F0	; new origin
Pns 	= $F1	; new scale
Posr 	= $F2	; new origin scaled relative
;Pera	= $F5	; erase rect
Pclr 	= $F8	; clear graphic frame

PlotColor	= $FF	; color unchanged

PlotStartChar	= 1	; PRINT CHR$(1) startet Plot statt Text
PlotEndChr	= 0	; PRINT CHR$(0) beendet Plot, ab hier wieder Text

	*=$B000
ScopeData1:	
; 127 Y-Werte zum Test, können mit POKEs überschrieben werden
; hier: Mittlere Linie auf Scope (0..100)
	.REPEAT 128
	.BYTE	50
	.ENDR
ScopeData2:	
	.REPEAT 128
	.BYTE	50
	.ENDR

PlotDataBeispiel:	

; Wertegruppen zum Test, können mit POKEs überschrieben werden
; max. 512 Wertegruppen (Koordinaten), bis Adresse $97FF

;	.BYTE	0,0,PlotColor,Pclr	; clear Frame
	.BYTE	0,0,7,0		; X, Y, COLOR, MODE
	.BYTE	5,20,PlotColor,Pno	; X, Y, unchanged, NewOrigin
	.BYTE	1,1,PlotColor,Pns	; new scale
	.byte	<PlotSub0,>PlotSub0,0,Psub	; GoSub Macro
	.byte	<PlotSub1,>PlotSub1,0,Psub	; GoSub Macro
	.byte	<PlotSub2,>PlotSub2,0,Psub	; GoSub Macro
	.byte	<PlotSub3,>PlotSub3,0,Psub	; GoSub Macro
	.byte	<PlotSub4,>PlotSub4,0,Psub	; GoSub Macro
	.BYTE	5,40,PlotColor,Pno	; X, Y, unchanged, NewOrigin
	.BYTE	0,0,PlotColor,Pns	; new scale
	.byte	<PlotSub5,>PlotSub5,0,Psub	; GoSub Macro
	.byte	<PlotSub6,>PlotSub6,0,Psub	; GoSub Macro
	.byte	<PlotSub7,>PlotSub7,0,Psub	; GoSub Macro
	.byte	<PlotSub8,>PlotSub8,0,Psub	; GoSub Macro
	.byte	<PlotSub9,>PlotSub9,0,Psub	; GoSub Macro
	.byte	<PlotSubDot,>PlotSubDot,0,Psub	; GoSub Macro
	.byte	<PlotSubPlus,>PlotSubPlus,0,Psub	; GoSub Macro
	.byte	<PlotSubMinus,>PlotSubMinus,0,Psub	; GoSub Macro
	.byte	<PlotSubE,>PlotSubE,0,Psub	; GoSub Macro
	.BYTE	0,0,0,Pret	; End Marker: MODE=255

	.BYTE	0,0,2,0	; X, Y, COLOR, MODE
	
	.BYTE	150,50,0,Pno	; X, Y, unchanged, NewOrigin
	.BYTE	0,0,0,Pns	; new scale
	.BYTE	10,255,4,5	; rd, oct, red, Circle
	.BYTE	20,255,1,5	; rd, oct, red, Circle
	.BYTE	30,255,5,5	; rd, oct, red, Circle
	.BYTE	40,255,2,5	; rd, oct, red, Circle
	
	.BYTE	0,0,0,Pret	; End Marker: MODE=255

	*=$B200
	

;############################################################################
;
;                        * BASIC-Erweiterungen Grafik *
;
;############################################################################
;
;Grafik-Routinen
;Gsmall		= $0327	; Grafik Pixelgröße, 0=DoubleScan (groß), 1=klein
;GstartX	= $0328	; Grafik-Fenster Startposition X
;GstartY	= $0329	; Grafik-Fenster Startposition Y
;GsizeX		= $032A	; Grafik-Fenster Größe X
;GsizeY		= $032B	; Grafik-Fenster Größe Y
;GridX		= $032C	; Grafik-Fenster Gitterraster Abstand X
;GridY		= $032D	; Grafik-Fenster Gitterraster Abstand Y
;GFrameC	= $032E	; Grafik-Fenster Hintergrundfarbe 0..7, 8..15 mit Raster und Rand
;GcolorP	= $032F	; Grafik-Fenster Punkt- und Linienfarbe

LAB_FRAME:
	CMP	#TK_CLEAR	; compare with token for CLEAR
	BEQ	LAB_FRAME_CLEAR
	CMP	#TK_COLOR	; compare with token for COLOR
	BEQ	LAB_FRAME_COLOR
	CMP	#TK_POSITION		; compare with token for POSition
	BEQ	LAB_FRAME_POS
	CMP	#TK_WIDTH	; compare with token for WIDTH
	BEQ	LAB_FRAME_WIDTH
	CMP	#TK_GRID	; compare with token for GRID
	BEQ	LAB_FRAME_GRID
	CMP	#TK_SIZE	; compare with token for SIZE
	BEQ	LAB_FRAME_SIZE
	CMP	#TK_WAIT	; compare with token for WAIT
	BEQ	LAB_FRAME_WAIT
	RTS	; Error
	
LAB_FRAME_SIZE:
; Grafik-Fenster löschen
	JSR	LAB_SGBY	; Size parameter
	CPX	#$02		; compare with max
	BCS	LAB_PLOTLIB_FCER1	; if greater do function call error
	DEX
	STX	Gsmall		; Grafik Pixelgröße, 0=DoubleScan (groß), 1=klein
	RTS
	
LAB_FRAME_COLOR:
; Grafik-Fenster löschen
	JSR	LAB_SGBY	; Bkgns color parameter
	CPX	#$20		; compare with max
	BCS	LAB_PLOTLIB_FCER1	; if greater do function call error
	STX	GFrameC
	RTS
		
LAB_FRAME_CLEAR:
; Grafik-Fenster löschen
	JSR 	LAB_IGBY
; Synchronisiertes löschen der Grafik
FrameClear:
	JSR	PlotSync
	LDX	#0
	STX	GraphX
	STX	GraphY
	STX	GcolorP
	STX	GmvTrig		; MOVETO
	DEX
	STX	GraphX		; ist jetzt 255
	LDX	#191
	STX	GraphY
	STX	GflTrig		; FILLRECT
	NOP			; small delay
FrameClearRdy:	
	BIT	GDone		; Grafik fertig?
	BPL	FrameClearRdy
	LDX	LastPlotColor
	STX	GcolorP
	RTS

	
LAB_FRAME_POS:
; Fensterposition setzen
	JSR	LAB_SGBY	; get byte parameter
	STX	GstartX		; Grafik-Fenster Startposition X
	JSR	LAB_SCGB	; scan for "," and get byte parameter
	STX	GstartY
	RTS
	
LAB_FRAME_WIDTH:
; Fensterposition setzen
	JSR	LAB_SGBY	; get byte parameter
	STX	GsizeX		; Grafik-Fenster Startposition X
	JSR	LAB_SCGB	; scan for "," and get byte parameter
	STX	GsizeY
	RTS
	
LAB_FRAME_GRID:
; Fensterposition setzen
	JSR	LAB_SGBY	; get byte parameter
	STX	GridX
	JSR	LAB_SCGB	; scan for "," and get byte parameter
	STX	GridY
	RTS

LAB_FRAME_WAIT:
	JSR	LAB_IGBY
	JMP	PlotSync

LAB_PLOTLIB_FCER1
	JMP	LAB_FCER	; do function call error, then warm start

;GraphX		= $0320	; X-Koordinatenregister, 0..255, oben links = 0,0
;GraphY		= $0321	; Y-Koordinatenregister, 0..255, oben links = 0,0
;GmvTrig	= $0322	; PLOT Move-Befehl triggern, Daten ignoriert, beliebiger Schreibzugriff
;GptTrig	= $0323 ; PLOT Point-Befehl triggern, Daten ignoriert
;GlnTrig	= $0324	; PLOT Line-Befehl triggern, Daten ignoriert
	
LAB_PLOT:
	CMP	#TK_CIRCLE	; compare with token for CIRCLE
	BEQ	LAB_PLOT_CIRCLE
	CMP	#TK_SIZE	; compare with token for SIZE
	BEQ	LAB_PLOT_SIZE
	CMP	#TK_COLOR	; compare with token for WAIT
	BEQ	LAB_PLOT_COLOR
	CMP	#TK_LIST	; compare with token for LIST
	BEQ	LAB_PLOT_LIST
	CMP	#TK_WAVE	; compare with token for DATA
	BEQ	LAB_PLOT_WAVE
	CMP	#TK_MACRO	; compare with token for LIST
	BEQ	LAB_PLOT_MACRO
	CMP	#TK_PRINT	; compare with token for LIST
	BEQ	LAB_PLOT_PRINT

	CMP	#TK_MOVE	; less than MOVE?
	BCC	LAB_FCER2
	
LAB_PLOT0:
	SEC
	SBC	#TK_MOVE
	STA	asave
	BMI	LAB_FCER2	; do function call error if outside
	CLC
	JSR	LAB_SGBY	; get byte parameter in X
LAB_PLOT1:	; Plot-Modus (MOVE,PIXEL,LINE,RECT,FILL) 0..4 in asave
	BIT	GDone		; Grafik fertig?
	BPL	LAB_PLOT1
	LDA	LastPlotColor	; letzte Farbe, falls "Cera" erase	
	STA	GColorP
	STX	GraphX
	STX	LastPlotX
	JSR	LAB_SCGB	; scan for "," and get byte parameter in X
	STX	GraphY
	STX	LastPlotY
	LDX	asave	
	STA	GmvTrig,X	; X > 0=MOVE, 1=POINT, 2=LINE, 3=RECT, 4=FILL
	RTS
LAB_PLOT_COLOR:	; Pinselfarbe setzen
	BIT	GDone		; Grafik fertig?
	BPL	LAB_PLOT_COLOR
	JSR	LAB_SGBY	; Bkgns color parameter
	CPX	#$20		; compare with max
	BCS	LAB_FCER2	; if greater do function call error
	STX	GColorP
	STX	LastPlotColor
	RTS
	
LAB_PLOT_CIRCLE:		; hier noch nicht in Hardware
	JMP	PlotCircle	

LAB_PLOT_SIZE:		; hier noch nicht in Hardware
	JMP	PlotNewScale
	
LAB_PLOT_LIST:
	JMP	PlotList	; CALL $B406 <adr> Plot Liste auf <adr>

LAB_PLOT_WAVE:
	JMP	PlotWave	; CALL $B40F <adr>,<shift> Plot Wave 256 Pts. auf <adr>

LAB_PLOT_MACRO:
	JMP	PlotSymbol
	
LAB_PLOT_PRINT:
	JSR	PlotInit
	JSR	LAB_IGBY

	JSR	LAB_PRINT
	JMP	PlotExit
LAB_FCER2:
	JMP	LAB_FCER	; do function call error, then warm start

;############################################################################
;
;                         * PLOTLIB-Routinen *
;
;############################################################################


PlotInit:
	LDA	WritejpH
	CMP	#>PlotSymbolAcc
	BEQ	PlotInit_0	; nicht nochmal, falls schon geschehen

	STA	OldWriteVecH
	LDA	WritejpL	; alten Vektor retten
	STA	OldWriteVecL

	LDA	#<PlotSymbolAcc
	STA	WritejpL	; WriteAcc-Vector auf eigene Routine
	LDA	#>PlotSymbolAcc	; dauerhaft umbiegen
	STA	WritejpH
PlotInit_0:
	LDA	#0
	STA	SubCount
	RTS
	

PlotExit:
	LDA	#0
	STA	PlotTextFlag
	LDA	WritejpH
	CMP	#>PlotSymbolAcc
	BNE	PlotInit1	; nicht nochmal, falls schon geschehen

	LDA	OldWriteVecL
	STA	WritejpL	; alten Vektor wiederherstellen
	LDA	OldWriteVecH
	STA	WritejpH
	RTS

PlotInit1:
	LDA	#0
	STA	PlotTextFlag
	STA	ScaleX		; Originalgröße
	STA	ScaleY
	STA	OriginX		; relativer Nullpunkt auf Null
	STA	OriginY
	STA	SubCount
	RTS


;##########################################################################
;
;                       *** PLOTSYMBOL ***
;
; Aufruf mit CALL $B403 <var> mit Symbolnummer in <var>
; PlotSymbol plottet ein Symbol in der untenstehenden PlotSymTable.
; Hier implementiert: Ziffern 0..9, +,-, E für Zahlendarstellung
; mit PlotStartChar "umgebogenen" PRINT, deshalb diese Symbole nicht ändern
;
;                      *** PLOTSYMBOLACC ***
;
; nur für "umgebogenen" ZP_WriteAcc-Vektor, nicht aus BASIC anspringen!
;
;##########################################################################

PlotSymbol:			
	JSR	LAB_SGBY	; get byte parameter in X
	LDA 	#0 
	STA	SubCount
	CPX	#$14		; compare with max num
	BCS	LAB_FCER2	; if greater do function call error
	TXA
	ORA	#$10
	AND	#$1F
	JMP	PlotSymbolA	; nur Instrument-Makros zulässig
	
PlotSymbolAcc:
	STA	asave
	STY	ysave
	STX	xsave
	LDA 	#0 
	STA	SubCount
	LDA	asave
	CMP	#' '
	BEQ	PlotSymbolSpace
	CMP	#'.'
	BEQ	PlotSymbolDot
	CMP	#'+'
	BEQ	PlotSymbolPlus
	CMP	#'-'
	BEQ	PlotSymbolMinus
	CMP	#'E'
	BEQ	PlotSymbolE
	CMP	#'0'
; wenn PlotEndChr, CR oder anderes CTRL-Zeichen:
	BMI	PlotSymbolExit	; keine Ziffer	
	SEC
	SBC	#'0'	; ASCII-Wert abziehen
	AND	#$0F	; max 16 Symbole 0..15
PlotSymbolA:
	TAX
	LDA	PlotSymTableL,X
	STA	PtrSrc
	LDA	PlotSymTableH,X
	STA	PtrSrc+1
	JSR	PlotListWait
PlotSymbolExit:
	CLC
	LDA	asave
	LDY	ysave
	LDX	xsave
	RTS
	
PlotSymbolDot:
	LDA	#10
	BNE	PlotSymbolA
PlotSymbolPlus:
	LDA	#11
	BNE	PlotSymbolA
PlotSymbolMinus:
	LDA	#12
	BNE	PlotSymbolA
PlotSymbolE:
	LDA	#13
	BNE	PlotSymbolA
PlotSymbolSpace:
	LDA	#14
	BNE	PlotSymbolA

VSwait:	; Delay 16ms
PlotSync:
	BIT 	syncFlgs	; frame generated?
	BVC 	PlotSync	; ..no, wait for frame start
PlotSync0:			; wait for PLOTSYNC completed
	BIT 	syncFlgs	; frame generated?
	BVS 	PlotSync0	; ..no, wait for frame end
	RTS
	
;##########################################################################
;
;                       *** PLOTLIST ***
;
; Aufruf mit CALL $B406 <adr>
; PlotList plottet eine Liste
; von max. 1024 Koordinatenpunkten ab Adresse <adr>
; bestehend aus je vier Bytes X, Y, COLOR, MODE

; MODE kann die normalen PLOT-Modes enthalten
; (0=MOVE, 1=POINT, 2=LINE, 3=RECT, 4=FILL),
; aber auch Pseudo-Befehle wie folgt:

;Psub 	= $FE	; call plot subroutine with addrs in X (LSB),Y (MSB)
;Pret 	= $FF	; return vom plot subroutine (X, Y, COLOR egal)
;Pno 	= $F0	; new object origin in X,Y
;Pns 	= $F1	; new scale (0=Original, 1=x2, 2=x4 usw.)
;Posr 	= $F2	; new origin scaled relative
;Pclr 	= $F8	; clear graphic frame

; COLOR kann zusätzlich enthalten:
;PlotColor	= $FF	; color unchanged
;Cera	= $FE	; Erase color, nicht merken in LastPlotColor

; Ende der gesamten Liste immer mit 0,0,0,255 ($FF=Pret)
;
;##########################################################################

SetCallback:
;Callback-Routine muss mit einem "JMP PlotListNext" enden!
	LDY	#0
	LDA	(PtrSrc),Y	; X-Wert
	STA	ItempL
	INY
	LDA	(PtrSrc),Y	; Y-Wert
	STA	ItempH
	INY
	LDA	(PtrSrc),Y	; "Color"-Wert
	STA	cabval
	JMP	(ItempL)

PlotList:
	JSR	LAB_EVNM	; evaluate expression and check is numeric,					; else do type mismatch
	JSR	LAB_F2FX	; save integer part of FAC1 in temporary integer
	LDA 	#0 
	STA	SubCount
	LDA 	ItempL	; Setup Pointer
	STA	PtrSrc
	LDA 	ItempH
	STA	PtrSrc+1
	
PlotListWait:
	BIT	GDone		; Grafik fertig?
	BPL	PlotListWait
	LDY	#3
	LDA	(PtrSrc),Y
	BPL	PlotInModeJmp	; 0..7
;Pseudo-Befehle
	CMP	#Pno		; Neuer Nullpunkt?
	BEQ	SetNewOrigin
	CMP	#Posr		; Neuer Nullpunkt relativ?
	BEQ	SetNewOriginScaledRelative
	CMP	#Pns		; Neue Skalierung?
	BEQ	SetNewScale
	CMP	#Psub		; Subroutine?
	BEQ	SubSequence
	CMP	#Pret		; Ende der Liste?
	BEQ	PlotListExit
	CMP	#Pclr		; Clear Frame?
	BEQ	PlotFrameClear
	CMP	#Pcab		; Callback?
	BEQ	SetCallback
	JMP	PlotListNext	; ungültig
PlotInModeJmp:
	JMP	PlotInMode

SetNewOriginScaledRelative:
	LDY	#0
	JSR	GetScale
	CLC
	ADC	OriginX
	STA	OriginX
	INY
	JSR	GetScale
	CLC
	ADC	OriginY
	STA	OriginY
	JMP	PlotListNext

SetNewOrigin:	
	LDY	#0
	LDA	(PtrSrc),Y	; X-Wert
	STA	OriginX
	INY
	LDA	(PtrSrc),Y	; Y-Wert
	STA	OriginY
	JMP	PlotListNext

SetNewScale:	
	LDY	#0
	LDA	(PtrSrc),Y	; X-Wert
	STA	ScaleX
	INY
	LDA	(PtrSrc),Y	; Y-Wert
	STA	ScaleY
	JMP	PlotListNext

SubSequence:	; Unterroutine aufrufen
	LDA	PtrSrc		; aktuellen Pointer-Stand auf Stack
	PHA
	LDA	PtrSrc+1
	PHA
	LDY	#0
	LDA	(PtrSrc),Y	; X-Wert = LSB
	TAX
	INY
	LDA	(PtrSrc),Y	; Y-Wert = MSB
	STA	PtrSrc+1	; Neuer Pointer
	STX	PtrSrc
	INC	SubCount
	JMP	PlotListWait
		
SubReturn:	; Rückkehr aus Unterroutine
	PLA			; alten Pointer-Stand vom Stack ziehen
	STA	PtrSrc+1
	PLA
	STA	PtrSrc
	DEC	SubCount
	JMP	PlotListNext

PlotListExit:
	LDA	SubCount
	BNE	SubReturn	; noch in Subroutine
	RTS
		
		
; Clear: ein Rechteck in Frame-Größe mit Farbe Null füllen
; wartet auf Beenden des PLOTSYNC Signals

PlotFrameClear:
	JSR 	FrameClear
	JMP	PlotListNext

LAB_FCER3:
	JMP	LAB_FCER	; do function call error, then warm start

;##########################################################################
;
;                            *** PLOTCIRCLE ***
;
; Zeichnet einen Kreis mit Radius in <var>
; Aufruf mit CALL $B412 <rd>,<octbits>
;
; wg. 8-Bit-Arithmetik sind nur Kreise bis max. Radius 64 "richtig rund"
; Oktanten im Uhrzeigersinn, beginnend mit links oberhalb Mitte (Bit 0)

;
; temporäre Vars für Circle
; rd	= scratch+6
; cx	= scratch+7
; cy	= scratch+8
; dx	= scratch+9
; dy	= scratch+10
; fe	= scratch+11
; oct	= scratch+12
;
;##########################################################################

PlotCircle:			
	JSR	LAB_SGBY
	CPX	#70		; compare with max rd
	BCS	LAB_FCER3	; if greater do function call error
PlotCircle0:			
	BIT	GDone		; Grafik fertig?
	BPL	PlotCircle0
; Radius in X-Register	
	STX	rd
	LDX	#255
	STX	oct
	JSR 	LAB_GBYT
	CMP 	#',' 	; compare with comma
	BNE 	PlotCircle1
	JSR	LAB_SCGB	; get "," and byte parameter - octant bits
	STX	oct
PlotCircle1:
	LDA	LastPlotColor
	STA	GColorP
	LDA	#$FF
	STA	cdmax
	
; Bresenham-Algorithmus für Kreise, hier für 6502
; Radius in rd, Oktanten-Bits in oct

PlotCircleSubr:	
	STY	ytempc
	STX	xtempc
	LDA	rd
	STA	fe
	STA	cx
	LDA	#0
	STA	cy
	LDA	cdmax
	BEQ	PlotCircleExit	; wenn Bogenlänge 0, alles so lassen
	JSR	PlotCirclePixels	; 4 Startpunkte
PlotCircleLoop:
	LDA	cy
	ASL
	CLC
	ADC	#1
	STA	dy
	INC	cy
	LDA	fe
	SEC
	SBC	dy
	STA	fe
	BPL	PlotCircleLoop0	; wenn >=0
	LDA	cx
	ASL
	STA	atempc
	LDA	#1
	SEC
	SBC	atempc
	STA	dx
	DEC	cx
	LDA	fe
	SEC
	SBC	dx
	STA	fe
PlotCircleLoop0:
	JSR	PlotCirclePixels
	DEC	cdmax		; max. Bogenlänge in Pixel
	BEQ	PlotCircleExit	; Abbruch wenn dmax=0, erreichter Punkt in cx/cy
	LDA	cx
	CMP	cy
	BCS	PlotCircleLoop
PlotCircleExit:
	LDY	ytempc
	LDX	xtempc
	RTS
	
; 8 punktgespiegelte Pixel plotten
PlotCirclePixels:
	LDX	OriginX
	LDY	OriginY
	LDA	oct	; welcher Oktant zu plotten?
	STA	atempc

; Oktanten im Uhrzeigersinn, beginnend mit links oberhalb mitte:
PlotCirclePixels0:
	LSR	atempc
	BCC	PlotCirclePixels1
	TXA	; Oktant Bit 0
	SEC
	SBC	cx
	STA	GraphX 
	TYA
	SEC
	SBC	cy
	STA	GraphY
	STA	GmvTrig+1	; +0=MOVE, 1=POINT, 2=LINE, 3=RECT, 4=FILL
	
PlotCirclePixels1:
	LSR	atempc
	BCC	PlotCirclePixels2
	TXA	; Oktant Bit 1
	SEC
	SBC	cy
	STA	GraphX 
	TYA
	SEC
	SBC	cx
	STA	GraphY
	STA	GmvTrig+1	; +0=MOVE, 1=POINT, 2=LINE, 3=RECT, 4=FILL
	
PlotCirclePixels2:
	LSR	atempc
	BCC	PlotCirclePixels3
	TXA	; Oktant Bit 2
	CLC
	ADC	cy
	STA	GraphX 
	TYA
	SEC
	SBC	cx
	STA	GraphY
	STA	GmvTrig+1	; +0=MOVE, 1=POINT, 2=LINE, 3=RECT, 4=FILL

PlotCirclePixels3:
	LSR	atempc
	BCC	PlotCirclePixels4
	TXA	; Oktant Bit 3
	CLC
	ADC	cx
	STA	GraphX 
	TYA
	SEC
	SBC	cy
	STA	GraphY
	STA	GmvTrig+1	; +0=MOVE, 1=POINT, 2=LINE, 3=RECT, 4=FILL

; oben und unten
PlotCirclePixels4:	
	LSR	atempc
	BCC	PlotCirclePixels5
	TXA	; Oktant Bit 4
	CLC
	ADC	cx
	STA	GraphX 
	LDY	OriginY
	TYA
	CLC
	ADC	cy
	STA	GraphY
	STA	GmvTrig+1	; +0=MOVE, 1=POINT, 2=LINE, 3=RECT, 4=FILL

PlotCirclePixels5:	
	LSR	atempc
	BCC	PlotCirclePixels6
	TXA	; Oktant Bit 5
	CLC
	ADC	cy
	STA	GraphX 
	TYA
	CLC
	ADC	cx
	STA	GraphY
	STA	GmvTrig+1	; +0=MOVE, 1=POINT, 2=LINE, 3=RECT, 4=FILL

PlotCirclePixels6:	
	LSR	atempc
	BCC	PlotCirclePixels7
	TXA	; Oktant Bit 6
	SEC
	SBC	cy
	STA	GraphX 
	TYA
	CLC
	ADC	cx
	STA	GraphY
	STA	GmvTrig+1	; +0=MOVE, 1=POINT, 2=LINE, 3=RECT, 4=FILL

PlotCirclePixels7:
	LSR	atempc
	BCC	PlotCirclePixelsExit
	TXA	; Oktant Bit 7
	SEC
	SBC	cx
	STA	GraphX 
	TYA
	CLC
	ADC	cy
	STA	GraphY
	STA	GmvTrig+1	; +0=MOVE, 1=POINT, 2=LINE, 3=RECT, 4=FILL
PlotCirclePixelsExit:
	RTS


;##########################################################################
;
;                            *** PLOTNEWSCALE ***
;
; nur neue Skalierung einstellen, CALL $B415,<scaleX>,<scaleY>
;
;##########################################################################
	
PlotNewScale:
	JSR	LAB_SGBY
	STX	ScaleX
	JSR	LAB_SCGB	; get "," and byte parameter - ScaleY value
	STX	ScaleY
	RTS


;##########################################################################
;
;                            *** PLOTINSTR ***
;
; Messinstrument <inst> darstellen mit Wert <val>, 
; Aufruf mit CALL $B418,<inst>,<val>
; Arbeitet nur mit ScaleX=0 und =1 einwandfrei
;
;##########################################################################

PlotBalkenV_CB:
	JSR	LAB_SGBY
	STX	instval
	JSR	PlotBalkenV
	JMP	PlotListNext
	
PlotBalkenH_CB:
	JSR	LAB_SGBY
	STX	instval
	JSR	PlotBalkenH
	JMP	PlotListNext
	
;vertikaler Balken vom Ausgangspunkt (Plotlist) unten links
PlotBalkenV:
	LDX	ScaleY
	BNE	PlotBalkenVScaledY
	LSR	instval		; ggf Hälfte
PlotBalkenVScaledY:
	SEC
	LDA	OriginY
	SBC	instval
	STA	GraphY	
	LDA	#10		; Breite des Balkens
	LDX	ScaleX
	BNE	PlotBalkenVScaledX
	LSR
PlotBalkenVScaledX:
	CLC
	ADC	OriginX
	STA	GraphX
PlotBalkenTrig:
	LDA	LastPlotColor
	STA	GColorP
	STA	GmvTrig+4	; +0=MOVE, 1=POINT, 2=LINE, 3=RECT, 4=FILL	
	RTS
	
PlotBalkenH:
;horizontaler Balken vom Ausgangspunkt (Plotlist) oben links
	LDX	ScaleX
	BNE	PlotBalkenHScaledX
	LSR	instval		; ggf Hälfte
PlotBalkenHScaledX:
	CLC
	LDA	OriginX
	ADC	instval
	STA	GraphX	
	LDA	#10		; Breite des Balkens
	LDX	ScaleY
	BNE	PlotBalkenHScaledY
	LSR
PlotBalkenHScaledY:
	CLC
	ADC	OriginY
	STA	GraphY
	JMP	PlotBalkenTrig
	
	
; hier eigentliche Routine
PlotInst_CB:
	JSR	LAB_SGBY
	STX	instval
	JSR	PlotInstrument
	JMP	PlotListNext
	
PlotInstrument:
	LDA	scaleX
	BNE	PlotInstrScaled
	LDA	instval
	LSR
	CLC
	ADC	#25
	STA	instval
	
PlotInstrScaled:
	STY	ysave
	LDA	#0	
	STA	oct		; nicht plotten, nur Punkt ermitteln
	LDY	#0		;
	LDA	#36		; unskalierter Radius
	JSR	GetScaleAcc	;
	STA	rd

	LDA	cdmax
	CMP	#50
	BPL	PlotInstrOkt2

PlotInstrOkt1:			; 51 abziehen und spiegeln
	LDA	#50
	SEC
	SBC	cdmax
	STA	cdmax
	JSR 	PlotCircleSubr	; rotieren um cdmax
	LDA	OriginX
	SEC
	SBC	cy
	STA	GraphX 
	LDA	OriginY
	SEC
	SBC	cx
	STA	GraphY

PlotInstrNeedle:
	STA	GmvTrig+0	; +0=MOVE, 1=POINT, 2=LINE, 3=RECT, 4=FILL

	LDA	OriginX
	STA	GraphX
	LDA	OriginY
	STA	GraphY
	LDA	#7		; weiße Nadel
	STA	GColorP
	STA	GmvTrig+2	; +0=MOVE, 1=POINT, 2=LINE, 3=RECT, 4=FILL
PlotInstrNeedleReady:
	BIT	GDone		; Grafik fertig?
	BPL	PlotInstrNeedleReady
	LDA	LastPlotColor
	STA	GColorP
	LDY	ysave
	RTS

PlotInstrOkt2:
	SEC
	SBC	#50		; Mittelpunkt abziehen, da nur Oktanten
	STA	cdmax
	JSR 	PlotCircleSubr	; rotieren um cdmax
	LDA	OriginX		; Oktant 2
	CLC
	ADC	cy
	STA	GraphX 
	LDA	OriginY
	SEC
	SBC	cx
	STA	GraphY
	JMP	PlotInstrNeedle
	
	
;##########################################################################
;
;                              *** PLOTSCOPE ***
;
; Aufruf mit CALL $B409,19,<val> (Instrument 3)
; mit <val> = 0..100
; PlotWave plottet Punkte einer Liste mit 128 Y-Werten, 
; und verschiebt die Liste um 1 Byte
; nach "links", d.h. erster Wert entfällt.
; PlotScope erneut aufrufen für fortlaufende Anzeige.
; Mit <val> = 255 wird der Scope-Speicher nur gelöscht (Mittellinie),
; aber nicht neu angezeigt.
;
;##########################################################################

; Wellenform begrenzt auf Scope-Fenster, 128 Punkte mit Y von 0 bis 100

PlotScope_CB:
	JSR	LAB_SGBY
	STY	ysave
;	DEX			; Korrektur für Nullinie
	LDA	LastPlotColor
	STA	GColorP
	LDY	#128
	STY	cdmax
	LDA	ScaleX
	BNE	PlotScope0
	LDY	#63
	STY	cdmax
PlotScope0:
	CPX	#255		; Lösch-Befehlswert
	BEQ	PlotScopeErase	
	TXA	
	STA	ScopeData1,Y	; neuen Wert eintragen
	JSR	PlotScope
	LDY	ysave
	JMP	PlotListNext

PlotScopeErase:
	DEY			; wird Index für Erase!
	LDA	#50
PlotScopeEraseLoop:
	STA	ScopeData1,Y	; nur löschen (Nullinie)
	STA	ScopeData2,Y
	DEY
	BPL	PlotScopeEraseLoop
	LDY	ysave
	JMP	PlotListNext
	
PlotScope:
	BIT	GDone		; Grafik fertig?
	BPL	PlotScope
	LDX 	#0
	LDY 	#0		; erster Punkt MOVE
PlotScopeNext:
	LDA	ScaleY
	BNE	PlotScopeNextNoShift1
	LSR	ScopeData1,X	; Y-Wert shiften, wird ohnehin überschrieben
PlotScopeNextNoShift1:
	LDA	OriginY
	SEC
	SBC	ScopeData1,X	; Absolutposition errechnen
	STA	GraphY
	LDA	ScopeData1+1,X	;
	STA	ScopeData1,X	; Punkt nach "links" verschieben
	TXA			; X-Wert fortlaufend
	ADC	OriginX
	STA	GraphX 
	STA	GmvTrig,Y	; +0=MOVE, 1=POINT, 2=LINE, 3=RECT, 4=FILL
	LDY 	#1		; POINT
	INX			; nächster Punkt
	CPX	cdmax		; Anzahl der geplotteten Punkte = Ende?
	BNE	PlotScopeNext
	RTS
	
;##########################################################################
;
;                              *** PLOTWAVE ***
;
; PlotWave plottet Punkte einer Liste mit 256 Y-Werten, 
; die bei <adr> beginnt und 256 Bytes lang ist
; und verschiebt anschließend die Liste um <shift> Bytes
; nach "links", d.h. erster Wert entfällt.
; Neue Datenpunkte können jetzt auf <var>+255 bis <var>+256-<shift> 
; gePOKEd werden, Rest wurde um <shift> Punkt nach links gerückt
; PlotWave erneut aufrufen für fortlaufende Anzeige.
;
;##########################################################################

; komplette Wellenform über ganzen Bildschirm	
	
PlotWave:
	JSR	LAB_IGBY
	JSR	LAB_EVNM	; evaluate expression and check is numeric,					; else do type mismatch
	JSR	LAB_F2FX	; save integer part of FAC1 in temporary integer
	JSR	LAB_SCGB	; get "," and byte parameter - octant bits
	STY	ysave
ShiftLeft:
; Wave um 1 Position nach "links" verschieben
	LDY	ItempL
	INY
	STY	PtrSrc
	LDY	ItempH
	STY	PtrSrc+1
	LDY	#0	; 
ShiftLoop1:
	LDA	(PtrSrc),Y
	STA	(ItempL),Y
	INY
	BNE 	ShiftLoop1	; 256 mal
	DEY
	TXA
	STA	(ItempL),Y	; neuen Wert eintragen
	LDY 	#0
PlotWaveRdy:
	BIT	GDone		; Grafik fertig?
	BPL	PlotWaveRdy
	STY	GraphX
	LDA	LastPlotColor
	STA	GColorP
	LDA 	(ItempL),Y	; zu plottende Liste
	STA	GraphY
	STA	GmvTrig+1	; +0=MOVE, 1=POINT, 2=LINE, 3=RECT, 4=FILL
	INY			; nächster Punkt
	BNE	PlotWaveRdy
	LDY	ysave
	RTS
	
; neue Datenpunkte können jetzt auf <var>+255 bis <var>+256-<shift> gePOKEd werden, 
; Rest wurde um <shift> Punkte nach links gerückt


;##########################################################################

; normaler Grafik-Befehl für GTEXT-Engine erwartet

PlotInMode:
	LDY	#0		; erstes Byte aus Record
	JSR	GetScale	; zunächst immer rel. Skalierung errechnen
	CLC
	ADC	OriginX
	STA	GraphX 
	INY
	LDA	(PtrSrc),Y	; Y im dritten Byte
	JSR	GetScale
	CLC
	ADC	OriginY
	STA	GraphY
	INY
PlotInModeRdy:	
	BIT	GDone		; letzte Grafik fertig?
	BPL	PlotInModeRdy

	LDA	(PtrSrc),Y	; Color im dritten Byte
	CMP	#PlotColor		; Unchanged?
	BNE	PlotInModeA	; PlotInModeUnch
	
	LDA	LastPlotColor	; alte Farbe von PLOT COLOR	
PlotInModeA:			; Plot mit Farbe in Acc
	STA	GColorP
	INY
	LDA	(PtrSrc),Y
	CMP	#5		; Circle-Pseudocode
	BNE	PlotInModeNoCircle

; Kreis ist in FPGA-HW noch nicht implementiert, also per Software zeichnen
	LDY	#0		; erstes Byte aus Record
	JSR	GetScale	; zunächst immer rel. Skalierung errechnen
	STA	rd		; jetzt für Kreis gebraucht
	INY
	LDA	(PtrSrc),Y	; Y im zweiten Byte
	STA	oct		; wird Oktanten-Auswahl
	LDA	#$FF		; max. Anzahl Pixel
	STA	cdmax
	JSR	PlotCircleSubr
	LDA	OriginY		; war Mittelpunkt des Kreises
	STA	GraphY
	LDA	OriginX
	STA	GraphX 
	LDA 	#0		; Move only
	
PlotInModeNoCircle:	
	TAY
	STA	GmvTrig,Y	; +0=MOVE, 1=POINT, 2=LINE, 3=RECT, 4=FILL

PlotListNext:
	CLC			; nächsten Punkt in PtrSrc
	LDA	PtrSrc
	ADC	#4		; 4 Bytes weiter
	STA	PtrSrc
	LDA	PtrSrc+1
	ADC	#0		; nur Carry
	STA	PtrSrc+1
	JMP	PlotListWait

PlotInModeUnch:
	LDA	LastPlotColor	; alte Farbe
	JMP	PlotInModeA

;##########################################################################

; Hilfsroutinen

GetScale:			; Acc um ScaleX bzw. ScaleY shiften
	LDA	(PtrSrc),Y	; X-Wert oder Y-Wert je nach Y-Reg
GetScaleAcc:
	LDX	ScaleX,Y	; Scale-Wert Y ist auch eins höher
	BEQ	GetScaleExit
GetScaleShift:
	ASL
	DEX
	BNE	GetScaleShift
GetScaleExit:
	RTS

ScaleAccOriginX:			; skaliert Akku und addiert OriginX
	LDX	ScaleX
	CPX	#0
	BEQ	ScaleAccOriginXExit
ScaleXShift:
	ASL
	DEX
	BNE	ScaleXShift
ScaleAccOriginXExit:
	CLC
	ADC	OriginX
	RTS
	
ScaleAccOriginY:			; skaliert Akku und subtrahiert OriginY
	LDX	ScaleY
	CPX	#0
	BEQ	ScaleAccOriginYExit
ScaleYShift:
	ASL
	DEX
	BNE	ScaleYShift
ScaleAccOriginYExit:
	STA	asave
	SEC
	LDA	OriginY
	SBC	asave
	RTS

PlotSymTableL:
	.db	<PlotSub0	;0	
	.db	<PlotSub1	
	.db	<PlotSub2	
	.db	<PlotSub3	
	.db	<PlotSub4	
	.db	<PlotSub5	
	.db	<PlotSub6	
	.db	<PlotSub7	
	.db	<PlotSub8	
	.DB	<PlotSub9
	.DB	<PlotSubDot
	.DB	<PlotSubPlus
	.DB	<PlotSubMinus
	.DB	<PlotSubE
	.DB	<PlotSubSpace
	.DB	<PlotSubSpace
	.DB	<PlotSubInstr	;16
	.DB	<PlotSubBalkenV	;17
	.DB	<PlotSubBalkenH	;18
	.DB	<PlotSubScope	;19
	
PlotSymTableH:
	.db	>PlotSub0	;0
	.db	>PlotSub1	
	.db	>PlotSub2	
	.db	>PlotSub3	
	.db	>PlotSub4	
	.db	>PlotSub5	
	.db	>PlotSub6	
	.db	>PlotSub7	
	.db	>PlotSub8	
	.db	>PlotSub9	
	.DB	>PlotSubDot
	.DB	>PlotSubPlus
	.DB	>PlotSubMinus
	.DB	>PlotSubE
	.DB	>PlotSubSpace
	.DB	>PlotSubSpace
	.DB	>PlotSubInstr	;16
	.DB	>PlotSubBalkenV	;17
	.DB	>PlotSubBalkenH	;18
	.DB	>PlotSubScope	;19

	

;##########################################################################

; Sequenzen mit oft gebrauchten Symbolen
;
; Achtung: Hier gelten relative Koordinaten ab OriginX/OriginY,
; die ggf. vom letzten PLOT MOVE in BASIC gesetzt wurden.
;
; Kreis wird grundsätzlich nicht auf letztem relativen Plot-Zielpunkt,
; sondern mit Mittelpunkt auf OriginX/OriginY gezeichnet
; Listen-Plot-Befehle setzen im Unterschied zu 
; BASIC-PLOTs OriginX/OriginY nicht neu.

;##########################################################################



PlotSub0:
	.BYTE	0,0,0,0	; X, Y, unchanged, move
	.BYTE	6,7,0,4	; X, Y, unchanged, erase rect
	
	.BYTE	0,1,PlotColor,0	; X, Y, unchanged, move
	.BYTE	1,0,PlotColor,2	; X, Y, unchanged, line
	.BYTE	3,0,PlotColor,2	; X, Y, unchanged, line
	.BYTE	4,1,PlotColor,2	; X, Y, unchanged, line
	.BYTE	4,6,PlotColor,2	; X, Y, unchanged, line
	.BYTE	3,7,PlotColor,2	; X, Y, unchanged, line
	.BYTE	1,7,PlotColor,2	; X, Y, unchanged, line
	.BYTE	0,6,PlotColor,2	; X, Y, unchanged, line
	.BYTE	0,1,PlotColor,2	; X, Y, unchanged, line
	.BYTE	0,5,PlotColor,0	; X, Y, unchanged, move
	.BYTE	4,2,PlotColor,2	; X, Y, unchanged, line
	.BYTE	6,0,PlotColor,Posr	; X, Y, unchanged, NewOriginScaledRelative
	.BYTE	0,0,0,Pret	; End Marker: MODE=255
	
PlotSub1:
	.BYTE	0,0,0,0	; X, Y, unchanged, move
	.BYTE	6,7,0,4	; X, Y, unchanged, erase rect
	
	.BYTE	1,2,PlotColor,0	; X, Y, unchanged, move
	.BYTE	2,0,PlotColor,2	; X, Y, unchanged, line
	.BYTE	2,7,PlotColor,2	; X, Y, unchanged, line
	.BYTE	1,7,PlotColor,0	; X, Y, unchanged, move
	.BYTE	3,7,PlotColor,2	; X, Y, unchanged, line
	.BYTE	6,0,PlotColor,Posr	; X, Y, unchanged, NewOriginScaledRelative
	.BYTE	0,0,0,Pret	; End Marker: MODE=255

PlotSub2:
	.BYTE	0,0,0,0	; X, Y, unchanged, move
	.BYTE	6,7,0,4	; X, Y, unchanged, erase fill rect
	
	.BYTE	0,1,PlotColor,0	; X, Y, unchanged, move
	.BYTE	1,0,PlotColor,2	; X, Y, unchanged, line
	.BYTE	3,0,PlotColor,2	; X, Y, unchanged, line
	.BYTE	4,1,PlotColor,2	; X, Y, unchanged, line
	.BYTE	4,2,PlotColor,2	; X, Y, unchanged, line
	.BYTE	0,6,PlotColor,2	; X, Y, unchanged, line
	.BYTE	0,7,PlotColor,2	; X, Y, unchanged, line
	.BYTE	4,7,PlotColor,2	; X, Y, unchanged, line
	.BYTE	6,0,PlotColor,Posr	; X, Y, unchanged, NewOriginScaledRelative
	.BYTE	0,0,0,Pret	; End Marker: MODE=255

PlotSub3:
	.BYTE	0,0,0,0	; X, Y, unchanged, move
	.BYTE	6,7,0,4	; X, Y, unchanged, erase fill rect
	
	.BYTE	0,1,PlotColor,0	; X, Y, unchanged, move
	.BYTE	1,0,PlotColor,2	; X, Y, unchanged, line
	.BYTE	3,0,PlotColor,2	; X, Y, unchanged, line
	.BYTE	4,1,PlotColor,2	; X, Y, unchanged, line
	.BYTE	4,2,PlotColor,2	; X, Y, unchanged, line
	.BYTE	3,3,PlotColor,2	; X, Y, unchanged, line
	.BYTE	2,3,PlotColor,2	; X, Y, unchanged, line
	.BYTE	3,3,PlotColor,0	; X, Y, unchanged, move
	.BYTE	4,4,PlotColor,2	; X, Y, unchanged, line
	.BYTE	4,6,PlotColor,2	; X, Y, unchanged, line
	.BYTE	3,7,PlotColor,2	; X, Y, unchanged, line
	.BYTE	1,7,PlotColor,2	; X, Y, unchanged, line
	.BYTE	0,6,PlotColor,2	; X, Y, unchanged, line
	.BYTE	6,0,PlotColor,Posr	; X, Y, unchanged, NewOriginScaledRelative
	.BYTE	0,0,0,Pret	; End Marker: MODE=255
	
PlotSub4:
	.BYTE	0,0,0,0	; X, Y, unchanged, move
	.BYTE	6,7,0,4	; X, Y, unchanged, erase fill rect
	
	.BYTE	1,0,PlotColor,0	; X, Y, unchanged, move
	.BYTE	0,4,PlotColor,2	; X, Y, unchanged, line
	.BYTE	4,4,PlotColor,2	; X, Y, unchanged, line
	.BYTE	3,0,PlotColor,0	; X, Y, unchanged, move
	.BYTE	3,7,PlotColor,2	; X, Y, unchanged, line
	.BYTE	6,0,PlotColor,Posr	; X, Y, unchanged, NewOriginScaledRelative
	.BYTE	0,0,0,Pret	; End Marker: MODE=255
	
PlotSub5:
	.BYTE	0,0,0,0	; X, Y, unchanged, move
	.BYTE	6,7,0,4	; X, Y, unchanged, erase fill rect
	
	.BYTE	4,0,PlotColor,0	; X, Y, unchanged, move
	.BYTE	0,0,PlotColor,2	; X, Y, unchanged, line
	.BYTE	0,3,PlotColor,2	; X, Y, unchanged, line
	.BYTE	3,3,PlotColor,2	; X, Y, unchanged, line
	.BYTE	4,4,PlotColor,2	; X, Y, unchanged, line
	.BYTE	4,6,PlotColor,2	; X, Y, unchanged, line
	.BYTE	3,7,PlotColor,2	; X, Y, unchanged, line
	.BYTE	1,7,PlotColor,2	; X, Y, unchanged, line
	.BYTE	0,6,PlotColor,2	; X, Y, unchanged, line
	.BYTE	6,0,PlotColor,Posr	; X, Y, unchanged, NewOriginScaledRelative
	.BYTE	0,0,0,Pret	; End Marker: MODE=255
	
PlotSub6:
	.BYTE	0,0,0,0	; X, Y, unchanged, move
	.BYTE	6,7,0,4	; X, Y, unchanged, erase fill rect
	
	.BYTE	4,1,PlotColor,0	; X, Y, unchanged, move
	.BYTE	3,0,PlotColor,2	; X, Y, unchanged, line
	.BYTE	1,0,PlotColor,2	; X, Y, unchanged, line
	.BYTE	0,1,PlotColor,2	; X, Y, unchanged, line
	.BYTE	0,6,PlotColor,2	; X, Y, unchanged, line
	.BYTE	1,7,PlotColor,2	; X, Y, unchanged, line
	.BYTE	3,7,PlotColor,2	; X, Y, unchanged, line
	.BYTE	4,6,PlotColor,2	; X, Y, unchanged, line
	.BYTE	4,4,PlotColor,2	; X, Y, unchanged, line
	.BYTE	3,3,PlotColor,2	; X, Y, unchanged, line
	.BYTE	0,3,PlotColor,2	; X, Y, unchanged, line
	.BYTE	6,0,PlotColor,Posr	; X, Y, unchanged, NewOriginScaledRelative
	.BYTE	0,0,0,Pret	; End Marker: MODE=255

PlotSub7:
	.BYTE	0,0,0,0	; X, Y, unchanged, move
	.BYTE	6,7,0,4	; X, Y, unchanged, erase fill rect
	
	.BYTE	0,0,PlotColor,0	; X, Y, unchanged, move
	.BYTE	4,0,PlotColor,2	; X, Y, unchanged, line
	.BYTE	2,7,PlotColor,2	; X, Y, unchanged, line
	.BYTE	6,0,PlotColor,Posr	; X, Y, unchanged, NewOriginScaledRelative
	.BYTE	0,0,0,Pret	; End Marker: MODE=255
	
PlotSub8:
	.BYTE	0,0,0,0	; X, Y, unchanged, move
	.BYTE	6,7,0,4	; X, Y, unchanged, erase fill rect
	
	.BYTE	1,3,PlotColor,0	; X, Y, unchanged, move
	.BYTE	0,2,PlotColor,2	; X, Y, unchanged, line
	.BYTE	0,1,PlotColor,2	; X, Y, unchanged, line
	.BYTE	1,0,PlotColor,2	; X, Y, unchanged, line
	.BYTE	3,0,PlotColor,2	; X, Y, unchanged, line
	.BYTE	4,1,PlotColor,2	; X, Y, unchanged, line
	.BYTE	4,2,PlotColor,2	; X, Y, unchanged, line
	.BYTE	3,3,PlotColor,2	; X, Y, unchanged, line
	.BYTE	4,4,PlotColor,2	; X, Y, unchanged, line
	.BYTE	4,6,PlotColor,2	; X, Y, unchanged, line
	.BYTE	3,7,PlotColor,2	; X, Y, unchanged, line
	.BYTE	1,7,PlotColor,2	; X, Y, unchanged, line
	.BYTE	0,6,PlotColor,2	; X, Y, unchanged, line
	.BYTE	0,4,PlotColor,2	; X, Y, unchanged, line
	.BYTE	1,3,PlotColor,2	; X, Y, unchanged, line
	.BYTE	3,3,PlotColor,2	; X, Y, unchanged, line
	.BYTE	6,0,PlotColor,Posr	; X, Y, unchanged, NewOriginScaledRelative
	.BYTE	0,0,0,Pret	; End Marker: MODE=255
	
PlotSub9:
	.BYTE	0,0,0,0	; X, Y, unchanged, move
	.BYTE	6,7,0,4	; X, Y, unchanged, erase fill rect
	
	.BYTE	4,4,PlotColor,0	; X, Y, unchanged, move
	.BYTE	1,4,PlotColor,2	; X, Y, unchanged, line
	.BYTE	0,3,PlotColor,2	; X, Y, unchanged, line
	.BYTE	0,1,PlotColor,2	; X, Y, unchanged, line
	.BYTE	1,0,PlotColor,2	; X, Y, unchanged, line
	.BYTE	3,0,PlotColor,2	; X, Y, unchanged, line
	.BYTE	4,1,PlotColor,2	; X, Y, unchanged, line
	.BYTE	4,6,PlotColor,2	; X, Y, unchanged, line
	.BYTE	3,7,PlotColor,2	; X, Y, unchanged, line
	.BYTE	1,7,PlotColor,2	; X, Y, unchanged, line
	.BYTE	0,6,PlotColor,2	; X, Y, unchanged, line
	.BYTE	6,0,PlotColor,Posr	; X, Y, unchanged, NewOriginScaledRelative
	.BYTE	0,0,0,Pret	; End Marker: MODE=255

PlotSubDot:	;10
	.BYTE	0,0,0,0	; X, Y, unchanged, move
	.BYTE	3,7,0,4	; X, Y, unchanged, erase fill rect
	
	.BYTE	0,6,PlotColor,0	; X, Y, unchanged, move
	.BYTE	1,6,PlotColor,2	; X, Y, unchanged, line
	.BYTE	1,7,PlotColor,2	; X, Y, unchanged, line
	.BYTE	0,7,PlotColor,2	; X, Y, unchanged, line
	.BYTE	0,6,PlotColor,2	; X, Y, unchanged, line
	.BYTE	3,0,PlotColor,Posr	; X, Y, unchanged, NewOriginScaledRelative
	.BYTE	0,0,0,Pret	; End Marker: MODE=255
	
PlotSubPlus:	;11
	.BYTE	0,0,0,0	; X, Y, unchanged, move
	.BYTE	6,7,0,4	; X, Y, unchanged, erase fill rect
	
	.BYTE	0,3,PlotColor,0	; X, Y, unchanged, move
	.BYTE	4,3,PlotColor,2	; X, Y, unchanged, line
	.BYTE	2,1,PlotColor,0	; X, Y, unchanged, move
	.BYTE	2,5,PlotColor,2	; X, Y, unchanged, line
	.BYTE	6,0,PlotColor,Posr	; X, Y, unchanged, NewOriginScaledRelative
	.BYTE	0,0,0,Pret	; End Marker: MODE=255
	
PlotSubMinus:	;12
	.BYTE	0,0,PlotColor,0	; X, Y, unchanged, move
	.BYTE	6,7,0,4	; X, Y, unchanged, erase fill rect
	
	.BYTE	0,3,PlotColor,0	; X, Y, unchanged, move
	.BYTE	4,3,PlotColor,2	; X, Y, unchanged, line
	.BYTE	6,0,PlotColor,Posr	; X, Y, unchanged, NewOriginScaledRelative
	.BYTE	0,0,0,Pret	; End Marker: MODE=255

PlotSubE:	;13
	.BYTE	0,0,PlotColor,0	; X, Y, unchanged, move
	.BYTE	6,7,0,4	; X, Y, unchanged, erase fill rect
	
	.BYTE	4,0,PlotColor,0	; X, Y, unchanged, move
	.BYTE	0,0,PlotColor,2	; X, Y, unchanged, line
	.BYTE	0,7,PlotColor,2	; X, Y, unchanged, line
	.BYTE	4,7,PlotColor,2	; X, Y, unchanged, line
	.BYTE	0,3,PlotColor,0	; X, Y, unchanged, move
	.BYTE	3,3,PlotColor,2	; X, Y, unchanged, line
	.BYTE	6,0,PlotColor,Posr	; X, Y, unchanged, NewOriginScaledRelative
	.BYTE	0,0,0,Pret	; End Marker: MODE=255
	
PlotSubSpace:
	.BYTE	0,0,0,0	; X, Y, unchanged, move
	.BYTE	6,7,0,4	; X, Y, unchanged, erase fill rect
	
	.BYTE	6,0,PlotColor,Posr	; X, Y, unchanged, NewOriginScaledRelative
	.BYTE	0,0,0,Pret	; End Marker: MODE=255

; verschiedene Symbole: Messisntrumente, Balkenanzeigen
; Farbcodes
;red	= 4
;green	= 2
;blue	= 1

PlotSubInstr:
	.BYTE	0,0,0,0	; X, Y, unchanged, move
	.BYTE	62,46,0,4	; X, Y, erase, fill rect

	.BYTE	0,0,0,0	; X, Y, unchanged, move
	.BYTE	62,46,6,3	; X, Y, yellow, rect

	; Nadel-Mittelpunkt
	.BYTE	31,38,0,Posr	; X, Y, unchanged, NewOriginScaledRelative
	; Skalenbogen
	.BYTE	34,6,PlotColor,5	; rd, oct, blue, Circle part
	.BYTE	0,0,0,0	; X, Y, unchanged, move
	; Nadelplot-Callback
	.byte	<PlotInst_CB, >PlotInst_CB,0,Pcab

	.BYTE	-29,-6,0,0	; X, Y, 0, move
	.BYTE	29,6,PlotColor,4	; X, Y, PlotColor, rect
	; kleiner Kreis um Nadelmittelpunkt
	.BYTE	0,0,0,0	; X, Y, unchanged, move
	.BYTE	3,255,7,5	; rd, oct, white, Circle

	; 31 ist die Mitte des Instruments
	.BYTE	26,-26,0,0	; X, Y, unchanged, move
	.BYTE	20,-21,PlotColor,2	; X, Y, PlotColor, line

	.BYTE	-26,-26,0,0	; X, Y, unchanged, move
	.BYTE	-20,-21,PlotColor,2	; X, Y, PlotColor, line

	.BYTE	0,-37,0,0	; X, Y, unchanged, move
	.BYTE	0,-28,PlotColor,2	; X, Y, PlotColor, line
	
	.BYTE	13,-34,0,0	; X, Y, unchanged, move
	.BYTE	10,-27,PlotColor,2	; X, Y, PlotColor, line

	.BYTE	-13,-34,0,0	; X, Y, unchanged, move
	.BYTE	-10,-27,PlotColor,2	; X, Y, PlotColor, line

	.BYTE	-31,-38,0,Posr	; X, Y, unchanged, NewOriginScaledRelative
	.BYTE	0,0,0,Pret	; End Marker: MODE=255
	
PlotSubBalkenV:
	.BYTE	1,1,0,0	; X, Y, unchanged, move
	.BYTE	6,51,0,4	; X, Y, erase, fill rect

	; Rechteck-Ausgangspunkt unten links im Rechteck
	.BYTE	1,51,0,Posr	; X, Y, unchanged, move
	.BYTE	0,0,0,0	; X, Y, unchanged, move
	; Callback nach Balkenwert-Plot
	.byte	<PlotBalkenV_CB, >PlotBalkenV_CB,0,Pcab
	.BYTE	-1,-51,0,Posr	; X, Y, unchanged, move

	.BYTE	0,0,0,0	; X, Y, unchanged, move
	.BYTE	7,52,6,3	; X, Y, yellow, rect

	.BYTE	2,13,0,0	; X, Y, unchanged, move
	.BYTE	5,13,6,2	; X, Y, yellow, line
	.BYTE	2,26,0,0	; X, Y, unchanged, move
	.BYTE	5,26,6,2	; X, Y, yellow, line
	.BYTE	2,38,0,0	; X, Y, unchanged, move
	.BYTE	5,38,6,2	; X, Y, yellow, line

	.BYTE	0,0,0,Pret	; End Marker: MODE=255

PlotSubBalkenH:
	.BYTE	1,1,0,0	; X, Y, unchanged, move
	.BYTE	51,6,0,4	; X, Y, erase, fill rect

	; Rechteck-Ausgangspunkt oben links im Rechteck
	.BYTE	1,1,0,Posr	; X, Y, unchanged, move relative scaled
	.BYTE	0,0,0,0	; X, Y, unchanged, move
	; Callback nach Balkenwert-Plot
	.byte	<PlotBalkenH_CB, >PlotBalkenH_CB,PlotColor,Pcab
	.BYTE	-1,-1,0,Posr	; X, Y, unchanged, move relative scaled

	.BYTE	0,0,0,0	; X, Y, unchanged, move
	.BYTE	52,7,6,3	; X, Y, yellow, rect

	.BYTE	13,2,0,0	; X, Y, unchanged, move
	.BYTE	13,5,6,2	; X, Y, yellow, line
	.BYTE	26,2,0,0	; X, Y, unchanged, move
	.BYTE	26,5,6,2	; X, Y, yellow, line
	.BYTE	38,2,0,0	; X, Y, unchanged, move
	.BYTE	38,5,6,2	; X, Y, yellow, line
	
	.BYTE	0,0,0,Pret	; End Marker: MODE=255
	
PlotSubScope:
	.BYTE	1,1,0,0	; X, Y, unchanged, move
	.BYTE	71,58,0,4	; X, Y, erase, fill rect


	.BYTE	0,0,0,0	; X, Y, unchanged, move
	.BYTE	72,59,6,3	; X, Y, yellow, rect

	.BYTE	4,29,0,0	; X, Y, unchanged, move
	.BYTE	8,29,6,2	; X, Y, yellow, line
	.BYTE	64,29,0,0	; X, Y, unchanged, move
	.BYTE	68,29,6,2	; X, Y, yellow, line

; Rechteck-Ausgangspunkt oben links im Rechteck
	.BYTE	4,54,0,Posr	; X, Y, unchanged, move relative scaled
; Raster
;	.BYTE	8,-5,6,1	; X, Y, yellow, pixel
	.BYTE	16,-5,6,1	; X, Y, yellow, pixel
	.BYTE	24,-5,6,1	; X, Y, yellow, pixel
	.BYTE	32,-5,6,1	; X, Y, yellow, pixel
	.BYTE	40,-5,6,1	; X, Y, yellow, pixel
	.BYTE	48,-5,6,1	; X, Y, yellow, pixel
;	.BYTE	56,-5,6,1	; X, Y, yellow, pixel
	.BYTE	8,-15,6,1	; X, Y, yellow, pixel
	.BYTE	16,-15,6,1	; X, Y, yellow, pixel
	.BYTE	24,-15,6,1	; X, Y, yellow, pixel
	.BYTE	32,-15,6,1	; X, Y, yellow, pixel
	.BYTE	40,-15,6,1	; X, Y, yellow, pixel
	.BYTE	48,-15,6,1	; X, Y, yellow, pixel
	.BYTE	56,-15,6,1	; X, Y, yellow, pixel
	.BYTE	8,-25,6,1	; X, Y, yellow, pixel
	.BYTE	16,-25,6,1	; X, Y, yellow, pixel
	.BYTE	24,-25,6,1	; X, Y, yellow, pixel
	.BYTE	32,-25,6,1	; X, Y, yellow, pixel
	.BYTE	40,-25,6,1	; X, Y, yellow, pixel
	.BYTE	48,-25,6,1	; X, Y, yellow, pixel
	.BYTE	56,-25,6,1	; X, Y, yellow, pixel
	.BYTE	8,-35,6,1	; X, Y, yellow, pixel
	.BYTE	16,-35,6,1	; X, Y, yellow, pixel
	.BYTE	24,-35,6,1	; X, Y, yellow, pixel
	.BYTE	32,-35,6,1	; X, Y, yellow, pixel
	.BYTE	40,-35,6,1	; X, Y, yellow, pixel
	.BYTE	48,-35,6,1	; X, Y, yellow, pixel
	.BYTE	56,-35,6,1	; X, Y, yellow, pixel
;	.BYTE	8,-45,6,1	; X, Y, yellow, pixel
	.BYTE	16,-45,6,1	; X, Y, yellow, pixel
	.BYTE	24,-45,6,1	; X, Y, yellow, pixel
	.BYTE	32,-45,6,1	; X, Y, yellow, pixel
	.BYTE	40,-45,6,1	; X, Y, yellow, pixel
	.BYTE	48,-45,6,1	; X, Y, yellow, pixel
;	.BYTE	56,-45,6,1	; X, Y, yellow, pixel

	.BYTE	0,0,0,0	; X, Y, unchanged, move
	; Callback nach Scope-Plot
	.BYTE	<PlotScope_CB, >PlotScope_CB,PlotColor,Pcab
	
	.BYTE	-4,-54,0,Posr	; X, Y, unchanged, move relative scaled

	.BYTE	4,8,0,0	; X, Y, unchanged, move
	.BYTE	8,4,6,2	; X, Y, yellow, line
	.BYTE	64,4,6,2	; X, Y, yellow, line
	.BYTE	68,8,6,2	; X, Y, yellow, line
	.BYTE	68,51,6,2	; X, Y, yellow, line
	.BYTE	64,55,6,2	; X, Y, yellow, line
	.BYTE	8,55,6,2	; X, Y, yellow, line
	.BYTE	4,51,6,2	; X, Y, yellow, line
	.BYTE	4,8,6,2	; X, Y, yellow, line

	.BYTE	0,0,0,Pret	; End Marker: MODE=255


	

