;:poke56,96:clr
;:sys36864
	;.opt oo
	*= $c000
av	=249 	; grafikzeiger
xc	=20  	; x-koordinate
vic	=$d000 	; videochip
strout	=$ab1e 	; text ausgeben
bsin	=$ffcf
buffer	=820 	; puffer fuer zahleneingabe
txtptr	=$7a 	; pufferzeiger
chrgot	=121 	; zeichen holen
ascfloat	=$bcf3 	; ascii -> fac
round	=$bc1b 	; fac ggf. runden
facmem	=$bbd4 	; fac speichern
memfac	=$bba2 	; fac laden
integer	=$b7f7 	; fac -> integer
memplus	=$b867 	; fac = fac + konst
plus	=$b86a 	; fac = fac + arg
memmult	=$ba28 	; fac = fac * konst
memmin	=$b850 	; fac = konst - fac
facarg	=$bc0c 	; arg = fac
exp	=$61 	; fac-exponent
vergleich	=$bc5b 	; vgl. fac - speicher
memdiv	=$bb0f 	; fac = konst/fac
return	=$aad7 	; crlf
delay	=$eeb3 	; wartet ca. 1 ms
; apfelmaennchen ******************
; von nikolaus heusler
;     XXXXXXXXXXXX XX
;     XXXXX XXXXXXXX
; (c) 6.93
; hauptprogramm *******************
	jsr para
	jsr on
	jsr apple
	ldx #0
	stx 198
fl1	lda color,x
	sta vic+32
	ldy #40
fl2	lda 198
	bne end
	jsr delay
	dey
	bne fl2
fl3	lda vic+17
	bmi fl3
	lda vic+18
	cmp #3
	bcs fl3
	dex
	bpl fl1
	ldx #15
	bne fl1
end	jsr off
	lda #0
	sta 198
	rts
color	.byt 0,0,0,11,11,12,15,15,1,1,1,15,15,12,11,11
; variablenbereich ***************
og	brk
	brk
	brk
	brk
	brk 	; obere grenze
ug	brk
	brk
	brk
	brk
	brk 	; untere grenze
lg	brk
	brk
	brk
	brk
	brk 	; linke grenze
rg	brk
	brk
	brk
	brk
	brk 	; rechte grenze
iz	brk 	; iterationszahl
sr	brk
	brk
	brk
	brk
	brk 	; s - realteil
si	brk
	brk
	brk
	brk
	brk 	; s - imaginaerteil
cr	brk
	brk
	brk
	brk
	brk 	; c - realteil
ci	brk
	brk
	brk
	brk
	brk 	; c - imaginaerteil
i	brk 	; interationsschritt
sr2	brk
	brk
	brk
	brk
	brk 	; s - realteil (neu)
aw	brk
	brk
	brk
	brk
	brk 	; betrag von s
mx	brk
	brk
	brk
	brk
	brk 	; x - multiplikator
my	brk
	brk
	brk
	brk
	brk 	; y - multiplikator
vx	brk
	brk
	brk
	brk
	brk 	; x - schrittweite
vy	brk
	brk
	brk
	brk
	brk 	; y - schrittweite
rx	brk
	brk
	brk
	brk
	brk 	; x - aufloesung
ry	brk
	brk
	brk
	brk
	brk 	; y - aufloesung
bx	brk
	brk
	brk
	brk
	brk 	; x - groesse
by	brk
	brk
	brk
	brk
	brk 	; y - groesse
; apfelmaennchen zeichnen ********
apple	ldx #4
; cr = lg
ap1	lda lg,x
	sta cr,x
	dex
	bpl ap1
; haupt-zeilen-schleife **********
ap2	ldx #4
; ci = og
ap3	lda og,x
	sta ci,x
	dex
	bpl ap3
; haupt-spaltenschleife **********
ap4	ldx #9
	lda #0
; sr = 0, si = 0
ap5	sta sr,x
	dex
	bpl ap5
	sta i
; iterations-schleife ************
; sr2 = sr*sr - si*si + cr
ap7	lda #<sr
	ldy #>sr
	jsr memfac
	lda #<sr
	ldy #>sr
	jsr memmult
	ldx #<sr2
	ldy #>sr2
	jsr facmem
	lda #<si
	ldy #>si
	jsr memfac
	lda #<si
	ldy #>si
	jsr memmult
	lda #<sr2
	ldy #>sr2
	jsr memmin
	lda #<cr
	ldy #>cr
	jsr memplus
	ldx #<sr2
	ldy #>sr2
	jsr facmem
; si = sr*si*2 + ci
	lda #<sr
	ldy #>sr
	jsr memfac
	lda #<si
	ldy #>si
	jsr memmult
	inc exp
	lda #<ci
	ldy #>ci
	jsr memplus
	ldx #<si
	ldy #>si
	jsr facmem
	ldx #4
; sr = sr2
ap6	lda sr2,x
	sta sr,x
	dex
	bpl ap6
; fac = sr*sr + si*si
	lda #<sr
	ldy #>sr
	jsr memfac
	lda #<sr
	ldy #>sr
	jsr memmult
	ldx #<aw
	ldy #>aw
	jsr facmem
	lda #<si
	ldy #>si
	jsr memfac
	lda #<si
	ldy #>si
	jsr memmult
	lda #<aw
	ldy #>aw
	jsr memplus
; falls fac => 8, dann divergenz
	lda exp
	cmp #$84
	bcs divergent
	inc i
	lda i
	cmp iz
	bcs konvergent
	jmp ap7
; bei konvergenz punkt setzen ****
; berechnung der screen-koordinaten
; y = (ci - og) * my
konvergent	lda #<og
	ldy #>og
	jsr memfac
	lda #<ci
	ldy #>ci
	jsr memmin
	lda #<my
	ldy #>my
	jsr memmult
	jsr integer
	tya
	pha
; x = (cr - lg) * mx
	lda #<lg
	ldy #>lg
	jsr memfac
	lda #<cr
	ldy #>cr
	jsr memmin
	lda #<mx
	ldy #>mx
	jsr memmult
	jsr integer
	pla
	tax
	jsr plot
; schleifen beenden **************
; ci = ci + vy
divergent	lda #<ci
	ldy #>ci
	jsr memfac
	lda #<vy
	ldy #>vy
	jsr memplus
	ldx #<ci
	ldy #>ci
	jsr facmem
; falls ci => ug dann fertig
	lda #<ci
	ldy #>ci
	jsr memfac
	lda #<ug
	ldy #>ug
	jsr vergleich
	cmp #2
	bcc ok1
	jmp ap4
; cr = cr + vx
ok1	lda #<cr
	ldy #>cr
	jsr memfac
	lda #<vx
	ldy #>vx
	jsr memplus
	ldx #<cr
	ldy #>cr
	jsr facmem
; falls cr => rg dann fertig
	lda #<cr
	ldy #>cr
	jsr memfac
	lda #<rg
	ldy #>rg
	jsr vergleich
	cmp #2
	bcc ok2
	jmp ap2
ok2	rts
; turbo-plot-routine *************
; zeichnet einen punkt
; x-koordinate in xc
; y-koordinate im x-reg.
plot	txa
	lsr
	lsr
	lsr
	asl
	tay
	lda mult+1,y
	sta av+1
	txa
	and #7
	clc
	adc mult,y
	sta av
	lda xc
	and #$f8
	adc av
	sta av
	lda av+1
	adc xc+1
	sta av+1
	lda xc
	and #7
	tax
	lda grbit,x
	ldy #0
	ora (av),y
	sta (av),y
	rts
; zweiterpotenzen
grbit	.byt $80,$40,$20,$10,8,4,2,1
; multiplikationstabelle
mult	=*
	.word $6000,$6140,$6280,$63c0
	.word $6500,$6640,$6780,$68c0
	.word $6a00,$6b40,$6c80,$6dc0
	.word $6f00,$7040,$7180,$72c0
	.word $7400,$7540,$7680,$77c0
	.word $7900,$7a40,$7b80,$7cc0,$7e00
; grafik einschalten *************
on	ldy #0
	sty av
	ldx #32
	lda #$60
	sta av+1
	tya
loe	sta (av),y
	iny
	bne loe
	inc av+1
	dex
	bne loe
	ldx #4
	lda #$44
	sta av+1
	lda #1
faerb	sta (av),y
	iny
	bne faerb
	inc av+1
	dex
	bne faerb
	lda #59
	sta vic+17
	lda #29
	sta vic+24
	lda #2
	sta 56576
	rts
; grafik abschalten **************
off	lda #3
	sta 56576
	lda #27
	sta vic+17
	lda #21
	sta vic+24
	jmp return
; eingabe der parameter **********
para	lda #<text1
	ldy #>text1
	jsr strout
	jsr enter
	ldx #<lg
	ldy #>lg
	jsr facmem
	lda #<text2
	ldy #>text2
	jsr strout
	jsr enter
	ldx #<rg
	ldy #>rg
	jsr facmem
	lda #<text3
	ldy #>text3
	jsr strout
	jsr enter
	ldx #<og
	ldy #>og
	jsr facmem
	lda #<text4
	ldy #>text4
	jsr strout
	jsr enter
	ldx #<ug
	ldy #>ug
	jsr facmem
	lda #<text6
	ldy #>text6
	jsr strout
	jsr enter
	jsr integer
	sty iz
	lda #<text9
	ldy #>text9
	jsr strout
	jsr enter
	ldx #<bx
	ldy #>bx
	jsr facmem
	lda #<text10
	ldy #>text10
	jsr strout
	jsr enter
	ldx #<by
	ldy #>by
	jsr facmem
	lda #<text7
	ldy #>text7
	jsr strout
	jsr enter
	ldx #<rx
	ldy #>rx
	jsr facmem
	lda #<text8
	ldy #>text8
	jsr strout
	jsr enter
	ldx #<ry
	ldy #>ry
	jsr facmem
; berechnung der mult.konstanten *
; mx = bx / (rg-lg)
	lda #<lg
	ldy #>lg
	jsr memfac
	lda #<rg
	ldy #>rg
	jsr memmin
	lda #<bx
	ldy #>bx
	jsr memdiv
	ldx #<mx
	ldy #>mx
	jsr facmem
; my = by / (ug-og)
	lda #<og
	ldy #>og
	jsr memfac
	lda #<ug
	ldy #>ug
	jsr memmin
	lda #<by
	ldy #>by
	jsr memdiv
	ldx #<my
	ldy #>my
	jsr facmem
; berechnung der schrittweite ****
; vx = (rg-lg)/rx
	lda #<lg
	ldy #>lg
	jsr memfac
	lda #<rg
	ldy #>rg
	jsr memmin
	ldx #<vx
	ldy #>vx
	jsr facmem
	lda #<rx
	ldy #>rx
	jsr memfac
	lda #<vx
	ldy #>vx
	jsr memdiv
	ldx #<vx
	ldy #>vx
	jsr facmem
; vy = (ug-og)/ry
	lda #<og
	ldy #>og
	jsr memfac
	lda #<ug
	ldy #>ug
	jsr memmin
	ldx #<vy
	ldy #>vy
	jsr facmem
	lda #<ry
	ldy #>ry
	jsr memfac
	lda #<vy
	ldy #>vy
	jsr memdiv
	ldx #<vy
	ldy #>vy
	jmp facmem
; zahl eingeben -> fac ***********
enter	ldx #0
input	jsr bsin
	cmp #13
	beq drin
	sta buffer,x
	inx
	bne input
drin	lda #0
	sta buffer,x
	lda #<buffer
	ldy #>buffer
	sta txtptr
	sty txtptr+1
	jsr chrgot
	jsr ascfloat
	jmp round
text1	.byt 13,13
	.byte "apfelmaennchen-demo"
	.byt 13,13
	.byte "(c) n. heusler 6.93"
	.byt 13,13
	.byte "linker rand:          -2.1\x9d\x9d\x9d\x9d"
	brk
text2	.byt 13
	.byte "rechter rand:         0.7\x9d\x9d\x9d"
	brk
text3	.byt 13
	.byte "oberer rand:          -1\x9d\x9d"
	brk
text4	.byt 13
	.byte "unterer rand:         1\x9d"
	brk
text6	.byt 13
	.byte "\x11iterationszahl:       240\x9d\x9d\x9d"
	brk
text7	.byt 13,13
	.byte "aufloesung waager.:   320\x9d\x9d\x9d"
	brk
text8	.byt 13
	.byte "aufloesung senkr.:    200\x9d\x9d\x9d"
	brk
text9	.byt 13,13
	.byte "bildgroesse waager.:  320\x9d\x9d\x9d"
	brk
text10	.byt 13
	.byte "bildgroesse senkr.:   200\x9d\x9d\x9d"
	brk
