===== Mandelbrot generator ===== Using the floating point routines in the BASIC ROM. The "stdlib.a" which is required by this asm source can be found in the [[projects:Resurrection]] project ZIP file. ;Mandelbrot test code !source "../stdlib/stdlib.a" !to "Mandelbrot.prg", cbm !sal !sl "Mandelbrot.map" !svl "Mandelbrot.lbl" !cpu 6510 !ct pet !source "../stdlib/BASICEntry80d.a" !macro OutputFAC { jsr $bddd ; Convert FAC#1 to ASCII String. Kills FAC#2 jsr $b487 ; Set Up String jsr $ab21 ; Output String } LDFAC = $bba2 STFAC = $bbd4 SUBFAC = $b850 DIVFAC = $bb0f CMPFAC = $bc5b MULFAC = $ba28 ADDFAC = $b867 SETFAC = $b391 !macro LoadFAC .addr { lda #<.addr ldy #>.addr jsr LDFAC } !macro StoreFAC .addr { ldx #<.addr ldy #>.addr jsr STFAC } !macro SubMemFAC .addr { lda #<.addr ldy #>.addr jsr SUBFAC } !macro SubFACMem .addr { +StoreFAC Temp +LoadFAC .addr +SubMemFAC Temp } !macro DivMemFAC .addr { lda #<.addr ldy #>.addr jsr DIVFAC } !macro DivFACMem .addr { +StoreFAC Temp +LoadFAC .addr +DivMemFAC Temp } !macro CmpFACMem .addr { +StoreFAC Temp +LoadFAC .addr +CmpMemFAC Temp } !macro CmpMemFAC .addr { lda #<.addr ldy #>.addr jsr CMPFAC } !macro MulMemFAC .addr { lda #<.addr ldy #>.addr jsr MULFAC } !macro AddMemFAC .addr { lda #<.addr ldy #>.addr jsr ADDFAC } !macro SetFAC_Y { lda #0 jsr SETFAC } kMaxIterations = 26 !zn *=BASICEntry cld jsr CINT ;xs=(xmax-xmin)/40.0; +LoadFAC xmin +SubMemFAC xmax +DivFACMem ScrW +StoreFAC xs ;ys=(ymax-ymin)/24.0; +LoadFAC ymin +SubMemFAC ymax +DivFACMem ScrH +StoreFAC ys ;for (y=0;y<24;y++) { lda #0 sta y .l1 ; for (x=0;x<40;x++) { lda #0 sta x .l2 ; p=xmin+(x*xs); ldy x +SetFAC_Y +MulMemFAC xs +AddMemFAC xmin +StoreFAC p ; q=ymin+(y*ys); ldy y +SetFAC_Y +MulMemFAC ys +AddMemFAC ymin +StoreFAC q ; xtemp=0; ; x0=0; ; y0=0; ldy #0 +SetFAC_Y +StoreFAC x0 +StoreFAC y0 ; i=0; lda #0 sta i .while ; while (((x0*x0)+(y0*y0))<4 && ++i