function vga.xy, x, y
. a3=SCREEN.PITCH, a4=a2*a3
. a4+(a1<<1), a2=@vga, a1=a2+a4
endf
function clear.screen, c
alias vga=a3,\
w=a2, c=a1
. vga=@vga, w=SCREEN.N
.repeat w
. (u16) *vga++=c
.endr
endf
function draw.pixel, x, y, c
alias vga=a1, c=v1
. c=a3
vga.xy
. (u16) *vga=c
endf
function draw.line.h, x, y, w, c
alias vga=a1,\
c=v1, w=v2
. c=a4, w=a3
vga.xy
.repeat w
. (u16) *vga++=c
.endr
endf
function draw.line.v, x, y, h, c
alias vga=a1,\
h=v1, c=v2, pitch=v3
. c=a4, h=a3
vga.xy
. pitch=SCREEN.PITCH
.repeat h
. (u16) *vga=c, vga+pitch
.endr
endf
function draw.box
alias vga=a1, c=v1,\
sw=v2, w=v3, h=v4,\
pitch=a2, wb=a3
. w=a3, sw=w, h=a4
vga.xy
. pitch=SCREEN.PITCH
. wb=w<<1
.repeat h
. w=sw
.repeat w
. (u16) *vga++=c
.endr
. vga+pitch, vga-wb
.endr
endf
macro draw.box x, y, w, h, c {
if ~x eq
. v1=c, a1=x, a2=y, a3=w, a4=h
draw.box
end if
}
function draw.outline
alias c=v1,\
x=v2, y=v3, w=v4, h=v5
. x=a1, y=a2, w=a3, h=a4
vga.xy
draw.line.h x, y, w, c
draw.line.v x, y, h, c
. a1=x+w, a1--
draw.line.v \
a1, y+1, h-1, c
. a2=y+h, a2--
draw.line.h x, a2, w, c
endf
macro draw.outline x, y, w, h, c {
if ~x eq
. a1=x, a2=y, a3=w, a4=h, v1=c
end if
draw.outline
}
function draw.box.t
alias vga=a1, c=v1,\
w=v3, h=v4, sw=v2,\
cl=v5, a=v6,\
pitch=a2,\
wb=a3, sc=v7
. w=a3, sw=w, h=a4
vga.xy
. pitch=SCREEN.PITCH
. wb=w<<1
.repeat h
. w=sw
.repeat w
. (u16) c=*vga
pusha
mix c, cl, a
. c=a1
popa
. (u16) *vga++=c
.endr
. vga+pitch, vga-wb
.endr
endf
macro draw.box.t x, y, w, h, c, a {
. a1=x, a2=y, a3=w, a4=h, v5=c, v6=a
draw.box.t
}
function draw.scanline, x, y, w, p
alias vga=a1,\
p=v1, w=v2
. p=a4, w=a3
vga.xy
.repeat w
. (u16) *vga++=*p++
.endr
endf
function draw.scanline.t, x, y, w, p
alias vga=a1,\
c=a2, key=v2,\
w=v3, p=v1
. w=a3, p=a4
vga.xy
. (u16) key=*p
.repeat w
. (u16) c=*p++
.if c<>key
. (u16) *vga=c
.end
. vga+2
.endr
endf
function draw.scanline.v
alias vga=a1,\
p=v1, c=v2, s=v3,\
cl=v4, x=v5, w=v6,\
n=v7
. w=a3, cl=a4
vga.xy
.repeat w
. (u16) c=*p++
.if c=0
go .next
.end
. x=WHITE
.if c=x
. c=cl
go .draw
.end
. (u16) s=*vga
. n=c&11111b, n<<3
.if n>=252
go .next
.end
.if n<=4
. c=cl
go .draw
.end
pusha
mix s, cl, n
. c=r0
popa
.draw:
. (u16) *vga=c
.next:
. vga+2
.endr
endf
macro draw.scanline.v x, y, w, c, p {
. a1=x, a2=y, a3=w, a4=c, v1=p
draw.scanline.v
}
function draw.bitmap
alias vga=a1,\
image=v1,\
w=v2, h=v3, sw=v4,\
pitch=v5, iwb=v6
. w=a3, h=a4, sw=w
. pitch=SCREEN.PITCH
. iwb=w<<1
vga.xy
.repeat h
. w=sw
.repeat w
. (u16) \
*vga++=*image++
.endr
. vga+pitch, vga-iwb
.endr
endf
macro draw.bitmap p, x, y, w, h {
if ~p eq
. v1=p, a1=x, a2=y, a3=w, a4=h
end if
draw.bitmap
}
function draw.bitmap.t
alias \
vga=a1, image=v1,\
w=v2, h=v3, sw=v4,\
pitch=v5, iwb=v6,\
key=v7, c=a2
. w=a3, h=a4, sw=w
. pitch=SCREEN.PITCH
. iwb=w<<1
. (u16) key=*image
vga.xy
.repeat h
. w=sw
.repeat w
. (u16) c=*image++
.if c<>key
. (u16) *vga++=c
.else
. vga+2
.end
.endr
. vga+pitch, vga-iwb
.endr
endf
macro draw.bitmap.t p, x, y, w, h {
if ~p eq
. v1=p, a1=x, a2=y, a3=w, a4=h
end if
draw.bitmap.t
}
function draw.bitmap.a
alias \
vga=a1, image=v1,\
w=v2, h=v3, sw=v4,\
pitch=v5, iwb=v6,\
key=v7, a=v8, c=r12
. w=a3, h=a4, sw=w
. pitch=SCREEN.PITCH
. iwb=w<<1
. (u16) key=*image
vga.xy
.repeat h
. w=sw
.repeat w
. (u16) c=*image++
.if c<>key
pusha
. (u16) a2=*vga
. a1=c, a3=a
mix
. c=a1
popa
. (u16) *vga++=c
.else
. vga+2
.end
.endr
. vga+pitch, vga-iwb
.endr
endf
macro draw.bitmap.a p, x, y, w, h, a {
if ~p eq
. v1=p, a1=x, a2=y, a3=w, a4=h, v8=a
end if
draw.bitmap.a
}
function draw.fade
alias vga=a1,\
r=v1, g=v2, b=v3,\
rn=v4, gn=v5, bn=v6,\
c1=v7, c2=v8, h=r12
pusha
. c1=v5, c2=v6, h=a4
delta8 c1, c2, 11, h
. rn=a1
delta8 c1, c2, 5, h
. gn=a1
delta8 c1, c2, 0, h
. bn=a1, a1=c1
get.rgb
. r=a1<<8
. g=a2<<8
. b=a3<<8
popa
push a3-a4
vga.xy
pop a3-a4
.repeat h
pusha
get c1=rgb r>>>8,\
g>>>8, b>>>8
popa
. v8=a3
.repeat v8
. (u16) *vga++=c1
.endr
. a2=SCREEN.PITCH
. a1-(a3<<1), a1+a2
. r+rn, g+gn, b+bn
.endr
endf
macro draw.fade x, y, w, h, c1, c2 {
. a1=x, a2=y, a3=w, a4=h, v5=c1, v6=c2
draw.fade
}
function draw.shade
alias \
x=a1, y=a2,\
w=a3, h=a4,\
c1=v5, c2=v6,\
tmp=v7
. h>>>1
pusha
draw.fade \
x, y, w, h,\
c1, c2
popa
. y+h, tmp=c1
. c1=c2, c2=tmp
draw.fade \
x, y, w, h,\
c1, c2
endf
macro draw.shade x, y, w, h, c1, c2 {
. a1=x, a2=y, a3=w, a4=h, v5=c1, v6=c2
draw.shade
}
function draw.black.bar, x, y, w, h
alias \
x=a1, y=a2,\
w=a3, h=a4,\
c1=v5, c2=v6
. h>>>1
pusha
draw.fade x, y, w, h,\
GRAY, GRAY25
popa
pusha
. y+h
draw.fade x, y, w, h,\
BLACK, GRAY25
popa
pusha
. h<<1
draw.outline \
x, y, w, h, GRAY
popa
pusha
draw.line.h \
x, y, w, GRAY.L
popa
endf