diff --git a/graphics/gr/lines/Makefile b/graphics/gr/lines/Makefile index bdecc9e8..794d1157 100644 --- a/graphics/gr/lines/Makefile +++ b/graphics/gr/lines/Makefile @@ -7,12 +7,13 @@ EMPTYDISK = ../../../empty_disk/empty.dsk all: lines.dsk -lines.dsk: HELLO LINES LINES_SMALL LINES_ROM +lines.dsk: HELLO LINES LINES_SMALL LINES_ROM LINES_WIKI cp $(EMPTYDISK) lines.dsk $(DOS33) -y lines.dsk SAVE A HELLO $(DOS33) -y lines.dsk BSAVE -a 0xC00 LINES $(DOS33) -y lines.dsk BSAVE -a 0xC00 LINES_SMALL $(DOS33) -y lines.dsk BSAVE -a 0xC00 LINES_ROM + $(DOS33) -y lines.dsk BSAVE -a 0xC00 LINES_WIKI ### @@ -43,8 +44,16 @@ LINES_ROM: lines_rom.o lines_rom.o: lines_rom.s ca65 -o lines_rom.o lines_rom.s -l lines_rom.lst +### + +LINES_WIKI: lines_wiki.o + ld65 -o LINES_WIKI lines_wiki.o -C $(LINKERSCRIPTS)/apple2_c00.inc + +lines_wiki.o: lines_wiki.s + ca65 -o lines_wiki.o lines_wiki.s -l lines_wiki.lst + ### clean: - rm -f *~ *.o *.lst HELLO LINES LINES_SMALL LINES_ROM + rm -f *~ *.o *.lst HELLO LINES LINES_SMALL LINES_ROM LINES_WIKI diff --git a/graphics/gr/lines/lines_wiki.s b/graphics/gr/lines/lines_wiki.s new file mode 100644 index 00000000..11494be6 --- /dev/null +++ b/graphics/gr/lines/lines_wiki.s @@ -0,0 +1,229 @@ +; Bresenham Lines + +; by Vince `deater` Weaver + +; based on pseudo-code from +; https://en.wikipedia.org/wiki/Bresenham%27s_line_algorithm + + + +.include "zp.inc" +.include "hardware.inc" + +; 174 -- initial +; 170 -- inline init +; 166 -- inline step + +B_X1 = $F0 +B_Y1 = $F1 +B_X2 = $F2 +B_Y2 = $F3 +B_DX = $F4 +B_DY = $F5 +B_SX = $F6 +B_SY = $F7 +B_ERR = $F8 +COUNT = $F9 + +lines: + + jsr SETGR ; set lo-res 40x40 mode + ; A=$D0 afterward + + + lda #0 + sta COUNT +lines_loop: + + jsr NEXTCOL + + lda #0 + sta B_X1 + lda #36 +; lda #35 + sta B_Y2 + + lda COUNT + cmp #10 +end: + beq end + + asl + asl + sta B_Y1 + sta B_X2 + + jsr draw_line + + inc COUNT + + jmp lines_loop + + + + ;============================ + ; draw line + ; from x1,y1 to x2,y2 + ;============================ +draw_line: + + ; from wikipedia + + ; dx = abs(x2 - x1) + ; sx = x1 < x2 ? 1 : -1 + ; dy = -abs(y2 - y1) + ; sy = y1 < y2 ? 1 : -1 + ; err = dx+dy + +init_bresenham: + + + ; dx = abs(x2-x1) + ; sx = x1= dy: + ; err = err + dy + ; x1 = x1 + sx + ; signed compare + clc + cmp B_DY + beq do_x + + sbc B_DY + bvc blah2 + eor #$80 +blah2: + bmi skip_x ; ble + +do_x: + lda B_ERR + clc + adc B_DY + sta B_ERR + lda B_X1 + + clc + adc B_SX + sta B_X1 +skip_x: + + ; if err2 <= dx: + ; err = err + dx + ; y1 = y1 + sy + pla ; pop err2 + + clc ; signed compare + sbc B_DX + bvc blah + eor #$80 +blah: + bpl skip_y + +do_inc_y: + clc + lda B_ERR + adc B_DX + sta B_ERR + + clc + lda B_Y1 + adc B_SY + sta B_Y1 + +skip_y: + + jmp line_loop + +done_line: + rts + + + +neg: + eor #$ff + clc + adc #1 + rts + + + + +;B_X1 = $F0 00 +;B_Y1 = $F1 00 +;B_X2 = $F2 00 +;B_Y2 = $F3 $23 = 35 +;B_DX = $F4 $00 +;B_DY = $F5 $DD = -35 +;B_SX = $F6 $FF = -1 +;B_SY = $F7 $01 = 1 +;B_ERR = $F8 $DD = -35 + +; E2=2*ERR = 1101 1101 1011 1010 = 0100 0110 = $46 = -70 +; if -70 >= -35 .... no +; if -70 <= 0 ... yes, err=err+dx, -35+0=-35