User Tools

Site Tools


base:bresenham_circle_routine

Differences

This shows you the differences between two versions of the page.

Link to this comparison view

base:bresenham_circle_routine [2015-04-17 04:30] (current)
Line 1: Line 1:
 +====== Bresenham Circle Routine ======
  
 +Implementation by Scout/​Silicon Ltd.
 +
 +This example is textmode (40x25) only but can easily be converted into any other mode.
 +Enjoy and don't forget to credit me if you use it ;-)
 +
 +I hope those solid circle tunnels show up now in a demo.
 +
 +<​code>​
 +; Draws a circle using the Bresenham algorithm in textmode ​
 +; [C]2006 Scout/​Silicon Ltd.
 +
 +Radius = 12
 +CenterX = 20
 +CenterY = 12
 +Char    = 160
 +Cx = $50
 +Cy = $51
 +Cd = $52
 +
 +*=$0810
 +
 +circle
 + lda #Radius
 + sta Cy
 + asl ; 2 * radius
 + sta CalcD
 +
 + lda #0
 + sta Cx
 +
 + lda #3
 + sec
 +CalcD = *+1
 + sbc #$00
 + sta Cd
 +
 +C_loop
 + lda Cx
 + cmp Cy
 + bmi C_Points
 + jmp E_rts
 +C_points
 +
 + lda Cx
 + sta x1
 + sta y2
 + sta x4
 + sta y7
 +
 + eor #$ff ; Maak 
 + clc ; getal
 + adc #1 ; negatief
 + sta y3
 + sta x5
 + sta y6
 + sta x8
 +
 + lda Cy
 +
 + sta y1
 + sta x2
 + sta x3
 + sta y8
 +
 + eor #$ff
 + clc
 + adc #1
 + sta y4
 + sta y5
 + sta x6
 + sta x7
 +
 +y1=*+1
 + lda #0 ; y
 + clc
 + adc #CenterY
 + tax
 + lda screenlo,x
 + sta $f0
 + lda screenhi,x
 + sta $f1 
 +x1=*+1
 + lda #0 ; x
 + clc
 + adc #CenterX
 + tay
 + lda #Char
 + sta ($f0),y
 +;-----
 +
 +y2=*+1
 + lda #0 ; x
 + clc
 + adc #CenterY
 + tax
 + lda screenlo,x
 + sta $f0
 + lda screenhi,x
 + sta $f1 
 +x2=*+1
 + lda #0 ; y
 + clc
 + adc #CenterX
 + tay
 + lda #Char
 + sta ($f0),y
 +
 +;-----
 +
 +y3=*+1
 + lda #0 ; x
 + clc
 + adc #CenterY
 + tax
 + lda screenlo,x
 + sta $f0
 + lda screenhi,x
 + sta $f1 
 +x3=*+1
 + lda #0 ; y
 + clc
 + adc #CenterX
 + tay
 + lda #Char
 + sta ($f0),y
 +;----
 +
 +y4=*+1
 + lda #0 ; x
 + clc
 + adc #CenterY
 + tax
 + lda screenlo,x
 + sta $f0
 + lda screenhi,x
 + sta $f1 
 +x4=*+1
 + lda #0 ; y
 + clc
 + adc #CenterX
 + tay
 + lda #Char
 + sta ($f0),y
 +
 +;----
 +
 +y5=*+1
 + lda #0 ; x
 + clc
 + adc #CenterY
 + tax
 + lda screenlo,x
 + sta $f0
 + lda screenhi,x
 + sta $f1 
 +x5=*+1
 + lda #0 ; y
 + clc
 + adc #CenterX
 + tay
 + lda #Char
 + sta ($f0),y
 +
 +y6=*+1
 + lda #0 ; x
 + clc
 + adc #CenterY
 + tax
 + lda screenlo,x
 + sta $f0
 + lda screenhi,x
 + sta $f1 
 +x6=*+1
 + lda #0 ; y
 + clc
 + adc #CenterX
 + tay
 + lda #Char
 + sta ($f0),y
 +
 +y7=*+1
 + lda #0 ; x
 + clc
 + adc #CenterY
 + tax
 + lda screenlo,x
 + sta $f0
 + lda screenhi,x
 + sta $f1 
 +x7=*+1
 + lda #0 ; y
 + clc
 + adc #CenterX
 + tay
 + lda #Char
 + sta ($f0),y
 +
 +y8=*+1
 + lda #0 ; x
 + clc
 + adc #CenterY
 + tax
 + lda screenlo,x
 + sta $f0
 + lda screenhi,x
 + sta $f1 
 +x8=*+1
 + lda #0 ; y
 + clc
 + adc #CenterX
 + tay
 + lda #Char
 + sta ($f0),y
 +
 + lda Cd
 + bpl D_pos ; d >= 0
 +
 + lda Cx
 + asl
 + asl ; 4*x
 + clc
 + adc #6
 + adc Cd
 + sta Cd
 + inc Cx
 + jmp C_loop
 +
 +D_pos
 + lda Cx
 + sec
 + sbc Cy
 + asl
 + asl ;​4*(x-y)
 + clc
 + adc #10
 + clc
 + adc Cd
 + sta Cd
 + dec Cy
 +
 +E_next
 + inc Cx
 + jmp C_loop
 +
 +E_rts
 + lda Cx
 + sta xx1
 + sta yy2
 + sta xx4
 + sta yy7
 +
 + eor #$ff
 + clc
 + adc #1
 + sta yy3
 + sta xx5
 + sta yy6
 + sta xx8
 +
 + lda Cy
 +
 + sta yy1
 + sta xx2
 + sta xx3
 + sta yy8
 +
 + eor #$ff
 + clc
 + adc #1
 + sta yy4
 + sta yy5
 + sta xx6
 + sta xx7
 +
 +yy1=*+1
 + lda #0 ; y
 + clc
 + adc #CenterY
 + tax
 + lda screenlo,x
 + sta $f0
 + lda screenhi,x
 + sta $f1 
 +xx1=*+1
 + lda #0 ; x
 + clc
 + adc #CenterX
 + tay
 + lda #Char
 + sta ($f0),y
 +;-----
 +
 +yy2=*+1
 + lda #0 ; x
 + clc
 + adc #CenterY
 + tax
 + lda screenlo,x
 + sta $f0
 + lda screenhi,x
 + sta $f1 
 +xx2=*+1
 + lda #0 ; y
 + clc
 + adc #CenterX
 + tay
 + lda #Char
 + sta ($f0),y
 +
 +;-----
 +
 +yy3=*+1
 + lda #0 ; x
 + clc
 + adc #CenterY
 + tax
 + lda screenlo,x
 + sta $f0
 + lda screenhi,x
 + sta $f1 
 +xx3=*+1
 + lda #0 ; y
 + clc
 + adc #CenterX
 + tay
 + lda #Char
 + sta ($f0),y
 +;----
 +
 +yy4=*+1
 + lda #0 ; x
 + clc
 + adc #CenterY
 + tax
 + lda screenlo,x
 + sta $f0
 + lda screenhi,x
 + sta $f1 
 +xx4=*+1
 + lda #0 ; y
 + clc
 + adc #CenterX
 + tay
 + lda #Char
 + sta ($f0),y
 +
 +;----
 +
 +yy5=*+1
 + lda #0 ; x
 + clc
 + adc #CenterY
 + tax
 + lda screenlo,x
 + sta $f0
 + lda screenhi,x
 + sta $f1 
 +xx5=*+1
 + lda #0 ; y
 + clc
 + adc #CenterX
 + tay
 + lda #Char
 + sta ($f0),y
 +
 +yy6=*+1
 + lda #0 ; x
 + clc
 + adc #CenterY
 + tax
 + lda screenlo,x
 + sta $f0
 + lda screenhi,x
 + sta $f1 
 +xx6=*+1
 + lda #0 ; y
 + clc
 + adc #CenterX
 + tay
 + lda #Char
 + sta ($f0),y
 +
 +yy7=*+1
 + lda #0 ; x
 + clc
 + adc #CenterY
 + tax
 + lda screenlo,x
 + sta $f0
 + lda screenhi,x
 + sta $f1 
 +xx7=*+1
 + lda #0 ; y
 + clc
 + adc #CenterX
 + tay
 + lda #Char
 + sta ($f0),y
 +
 +yy8=*+1
 + lda #0 ; x
 + clc
 + adc #CenterY
 + tax
 + lda screenlo,x
 + sta $f0
 + lda screenhi,x
 + sta $f1 
 +xx8=*+1
 + lda #0 ; y
 + clc
 + adc #CenterX
 + tay
 + lda #Char
 + sta ($f0),y
 +
 + rts
 +
 +.align 256
 +
 +screenlo ; you could also get this from kernal address $EFCO, if kernal is enabled.
 +
 + .byte <​$0400+(40*0),​ <​$0400+(40*1),<​$0400+(40*2),<​$0400+(40*3),<​$0400+(40*4),<​$0400+(40*5)
 + .byte <​$0400+(40*6),​ <​$0400+(40*7),<​$0400+(40*8),<​$0400+(40*9),<​$0400+(40*10),<​$0400+(40*11)
 + .byte <​$0400+(40*12),​ <​$0400+(40*13),<​$0400+(40*14),<​$0400+(40*15),<​$0400+(40*16),<​$0400+(40*17)
 + .byte <​$0400+(40*18),​ <​$0400+(40*19),<​$0400+(40*20),<​$0400+(40*21),<​$0400+(40*22),<​$0400+(40*23)
 + .byte <​$0400+(40*24)
 +     
 +screenhi
 + .byte >​$0400+(40*0),​ >​$0400+(40*1),>​$0400+(40*2),>​$0400+(40*3),>​$0400+(40*4),>​$0400+(40*5)
 + .byte >​$0400+(40*6),​ >​$0400+(40*7),>​$0400+(40*8),>​$0400+(40*9),>​$0400+(40*10),>​$0400+(40*11)
 + .byte >​$0400+(40*12),​ >​$0400+(40*13),>​$0400+(40*14),>​$0400+(40*15),>​$0400+(40*16),>​$0400+(40*17)
 + .byte >​$0400+(40*18),​ >​$0400+(40*19),>​$0400+(40*20),>​$0400+(40*21),>​$0400+(40*22),>​$0400+(40*23)
 + .byte >​$0400+(40*24)
 +
 +</​code>​
base/bresenham_circle_routine.txt ยท Last modified: 2015-04-17 04:30 (external edit)