This commit is contained in:
Irmen de Jong 2021-02-04 17:47:52 +01:00
parent 76f459ee95
commit 40e4cfb686
4 changed files with 33 additions and 61 deletions

View File

@ -34,6 +34,7 @@ graphics {
sub line(uword @zp x1, ubyte @zp y1, uword @zp x2, ubyte @zp y2) {
; Bresenham algorithm.
; This code special-cases various quadrant loops to allow simple ++ and -- operations.
; TODO there are some slight errors at the first/last pixels in certain slopes...??
if y1>y2 {
; make sure dy is always positive to have only 4 instead of 8 special cases
swap(x1, x2)

View File

@ -280,6 +280,8 @@ _done
inc cx16.VERA_ADDR_L
bne +
inc cx16.VERA_ADDR_M
+ bne +
inc cx16.VERA_ADDR_H
+ inx ; next pixel
}}
}
@ -418,6 +420,7 @@ _done
sub line(uword @zp x1, uword @zp y1, uword @zp x2, uword @zp y2, ubyte color) {
; Bresenham algorithm.
; This code special-cases various quadrant loops to allow simple ++ and -- operations.
; TODO there are some slight errors at the first/last pixels in certain slopes...
if y1>y2 {
; make sure dy is always positive to have only 4 instead of 8 special cases
swap(x1, x2)
@ -860,14 +863,35 @@ _done
}
sub addr_mul_24_for_highres_4c(uword yy, uword xx) {
; TODO asmsub, actually do 24 bits calc
; TODO turn into asmsub
; 24 bits result is in r0 and r1L (highest byte)
cx16.r0 = yy*128
cx16.r2 = yy*32
xx >>= 2
cx16.r1 = 0
cx16.r0 += cx16.r2
cx16.r0 += xx/4
%asm {{
; add r2 and xx to r0 (24-bits)
stz cx16.r1
clc
lda cx16.r0
adc cx16.r2
sta cx16.r0
lda cx16.r0+1
adc cx16.r2+1
sta cx16.r0+1
bcc +
inc cx16.r1
+ clc
lda cx16.r0
adc xx
sta cx16.r0
lda cx16.r0+1
adc xx+1
sta cx16.r0+1
bcc +
inc cx16.r1
+
}}
}
asmsub addr_mul_24_for_lores_256c(uword yy @R0, uword xx @AY) clobbers(A) -> uword @R0, ubyte @R1 {

View File

@ -13,13 +13,13 @@ main {
palette.set_rgb(amigacolors, len(amigacolors))
cx16.VERA_DC_VSCALE = 64 ; have the vertical resolution so it is 640*240 - more or less Amiga's default non interlaced mode
cx16.mouse_config(1, 1) ; enable mouse TODO make it an Amiga mouse pointer shape & colors if possible
gfx2.text_charset(3)
screen_titlebar()
window_workbench()
window_system()
window_shell()
gfx2.text(280, 210, 1, @"640x480(240) 4 colors")
gfx2.text(280, 220, 1, @"Mockup drawn using Prog8 gfx2 library")
repeat {
@ -46,8 +46,8 @@ main {
widget.window_bottomborder(win_x, win_y, width, height)
widget.window_rightborder(win_x, win_y, width, height, false)
vector_v(win_x+width - 380, win_y+height-20)
vector_v(win_x+width - 380 -14, win_y+height-20)
vector_v(win_x+width - 390, win_y+height-20)
vector_v(win_x+width - 390 -14, win_y+height-20)
widget.icon(45,40, @"Ram Disk")
widget.icon(45,90, @"Workbench3.1")

View File

@ -1,6 +1,5 @@
%import textio
%import syslib
%import test_stack
%zeropage basicsafe
; Note: this program is compatible with C64 and CX16.
@ -8,7 +7,7 @@
main {
sub start() {
txt.print("mid-point\ncircle\n and\nbresenham\nline\nalgorithms.\n")
txt.print("rectangles\nand circle\ndrawing.\n")
ubyte r
for r in 3 to 12 step 3 {
@ -21,16 +20,6 @@ main {
txt.clear_screen()
disc(20, 12, 12)
txt.print("enter for lines:")
void c64.CHRIN()
c64.CHROUT('\n')
txt.clear_screen()
line(1, 10, 38, 24)
line(1, 20, 38, 2)
line(20, 4, 10, 24)
line(39, 16, 12, 0)
txt.print("enter for rectangles:")
void c64.CHRIN()
c64.CHROUT('\n')
@ -41,8 +30,6 @@ main {
rect(10, 10, 10, 10, false)
rect(6, 0, 16, 20, true)
test_stack.test()
sub rect(ubyte x1, ubyte y1, ubyte x2, ubyte y2, ubyte fill) {
ubyte x
@ -67,46 +54,6 @@ main {
}
}
sub line(ubyte x1, ubyte y1, ubyte x2, ubyte y2) {
; Bresenham algorithm, not very optimized to keep clear code.
; For a better optimized version have a look in the graphics.p8 module.
byte d = 0
ubyte dx = abs(x2 - x1)
ubyte dy = abs(y2 - y1)
ubyte dx2 = 2 * dx
ubyte dy2 = 2 * dy
ubyte ix = sgn(x2 as byte - x1 as byte) as ubyte
ubyte iy = sgn(y2 as byte - y1 as byte) as ubyte
ubyte x = x1
ubyte y = y1
if dx >= dy {
repeat {
txt.setcc(x, y, 42, 5)
if x==x2
return
x += ix
d += dy2
if d > dx {
y += iy
d -= dx2
}
}
} else {
repeat {
txt.setcc(x, y, 42, 5)
if y == y2
return
y += iy
d += dx2
if d > dy {
x += ix
d -= dy2
}
}
}
}
sub circle(ubyte xcenter, ubyte ycenter, ubyte radius) {
; Midpoint algorithm
ubyte x = radius