;: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 jsr memfac lda #sr jsr memmult ldx #sr2 jsr facmem lda #si jsr memfac lda #si jsr memmult lda #sr2 jsr memmin lda #cr jsr memplus ldx #sr2 jsr facmem ; si = sr*si*2 + ci lda #sr jsr memfac lda #si jsr memmult inc exp lda #ci jsr memplus ldx #si jsr facmem ldx #4 ; sr = sr2 ap6 lda sr2,x sta sr,x dex bpl ap6 ; fac = sr*sr + si*si lda #sr jsr memfac lda #sr jsr memmult ldx #aw jsr facmem lda #si jsr memfac lda #si jsr memmult lda #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 jsr memfac lda #ci jsr memmin lda #my jsr memmult jsr integer tya pha ; x = (cr - lg) * mx lda #lg jsr memfac lda #cr jsr memmin lda #mx jsr memmult jsr integer pla tax jsr plot ; schleifen beenden ************** ; ci = ci + vy divergent lda #ci jsr memfac lda #vy jsr memplus ldx #ci jsr facmem ; falls ci => ug dann fertig lda #ci jsr memfac lda #ug jsr vergleich cmp #2 bcc ok1 jmp ap4 ; cr = cr + vx ok1 lda #cr jsr memfac lda #vx jsr memplus ldx #cr jsr facmem ; falls cr => rg dann fertig lda #cr jsr memfac lda #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 jsr strout jsr enter ldx #lg jsr facmem lda #text2 jsr strout jsr enter ldx #rg jsr facmem lda #text3 jsr strout jsr enter ldx #og jsr facmem lda #text4 jsr strout jsr enter ldx #ug jsr facmem lda #text6 jsr strout jsr enter jsr integer sty iz lda #text9 jsr strout jsr enter ldx #bx jsr facmem lda #text10 jsr strout jsr enter ldx #by jsr facmem lda #text7 jsr strout jsr enter ldx #rx jsr facmem lda #text8 jsr strout jsr enter ldx #ry jsr facmem ; berechnung der mult.konstanten * ; mx = bx / (rg-lg) lda #lg jsr memfac lda #rg jsr memmin lda #bx jsr memdiv ldx #mx jsr facmem ; my = by / (ug-og) lda #og jsr memfac lda #ug jsr memmin lda #by jsr memdiv ldx #my jsr facmem ; berechnung der schrittweite **** ; vx = (rg-lg)/rx lda #lg jsr memfac lda #rg jsr memmin ldx #vx jsr facmem lda #rx jsr memfac lda #vx jsr memdiv ldx #vx jsr facmem ; vy = (ug-og)/ry lda #og jsr memfac lda #ug jsr memmin ldx #vy jsr facmem lda #ry jsr memfac lda #vy jsr memdiv ldx #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 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