Last active
May 8, 2025 20:40
-
-
Save petrihakkinen/cc07aa5d15baf157c668f3dcc582ecc2 to your computer and use it in GitHub Desktop.
Bresenham's line algorithm for 6502
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| ;***************************************************************** | |
| ; negate accumulator | |
| ;***************************************************************** | |
| neg: eor #$ff | |
| clc | |
| adc #1 | |
| rts | |
| ;***************************************************************** | |
| ; init bresenham line | |
| ;***************************************************************** | |
| init_bresenham: | |
| ; dx = abs(x2 - x1) | |
| ; dy = abs(y2 - y1) | |
| ; sx = x1 < x2 ? 1 : -1 | |
| ; sy = y1 < y2 ? 1 : -1 | |
| ; err = dx > dy ? dx : -dy | |
| ; dx = dx * 2 | |
| ; dy = dy * 2 | |
| ; if y1 < y2: | |
| ; sy = 1 | |
| ; dy = y2 - y1 | |
| ; else: | |
| ; sy = -1 | |
| ; dy = y1 - y2 | |
| ldx #$ff ; X = -1 | |
| lda bresenham_y1 | |
| sec | |
| sbc bresenham_y2 ; A = y1 - y2 | |
| bpl :+ | |
| ldx #1 ; X = 1 | |
| jsr neg ; A = y2 - y1 | |
| : sta bresenham_dy | |
| stx bresenham_sy | |
| ; if x1 < x2: | |
| ; sx = 1 | |
| ; dx = x2 - x1 | |
| ; else: | |
| ; sx = -1 | |
| ; dx = x1 - x2 | |
| ldx #$ff ; X = -1 | |
| lda bresenham_x1 | |
| sec | |
| sbc bresenham_x2 ; A = x1 - x2 | |
| bpl :+ | |
| ldx #1 ; X = 1 | |
| jsr neg ; A = x2 - x1 | |
| : sta bresenham_dx | |
| stx bresenham_sx | |
| ; err = dx > dy ? dx : -dy | |
| ;lda bresenham_dx | |
| cmp bresenham_dy ; dx - dy > 0 | |
| beq :+ | |
| bpl @skiperr | |
| : lda bresenham_dy | |
| jsr neg | |
| @skiperr: sta bresenham_err | |
| ; dx = dx * 2 | |
| ; dy = dy * 2 | |
| asl bresenham_dx | |
| asl bresenham_dy | |
| rts | |
| ;***************************************************************** | |
| ; step along bresenham line | |
| ;***************************************************************** | |
| step_bresenham: | |
| ; err2 = err | |
| lda bresenham_err | |
| pha ; push err2 | |
| ; if err2 > -dx: | |
| ; err = err - dy | |
| ; x = x + sx | |
| clc | |
| adc bresenham_dx ; skip if err2 + dx <= 0 | |
| bmi :+ | |
| beq :+ | |
| lda bresenham_err | |
| sec | |
| sbc bresenham_dy | |
| sta bresenham_err | |
| lda bresenham_x1 | |
| clc | |
| adc bresenham_sx | |
| sta bresenham_x1 | |
| : | |
| ; if err2 < dy: | |
| ; err = err + dx | |
| ; y = y + sy | |
| pla ; pop err2 | |
| cmp bresenham_dy ; skip if err2 - dy >= 0 | |
| bpl :+ | |
| lda bresenham_err | |
| clc | |
| adc bresenham_dx | |
| sta bresenham_err | |
| lda bresenham_y1 | |
| clc | |
| adc bresenham_sy | |
| sta bresenham_y1 | |
| : rts |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment