This commit is contained in:
Kartik K. Agaram 2021-08-28 22:22:04 -07:00
parent 3640f1dfe9
commit 468927ee1c
1 changed files with 54 additions and 69 deletions

View File

@ -18,10 +18,8 @@ type screen {
data: (handle array screen-cell)
cursor-x: int # [0..width)
cursor-y: int # [0..height)
invalid-cell-index: int
# pixel graphics
pixels: (handle array byte)
invalid-pixel-index: int
}
type screen-cell {
@ -48,14 +46,10 @@ fn initialize-screen _screen: (addr screen), width: int, height: int, pixel-grap
var data-ah/edi: (addr handle array screen-cell) <- get screen, data
var capacity/eax: int <- copy width
capacity <- multiply height
# add 1 for sentinel
capacity <- increment
#
populate data-ah, capacity
# save sentinel index
capacity <- decrement
var dest/ecx: (addr int) <- get screen, invalid-cell-index
copy-to *dest, capacity
}
# if necessary, populate screen->pixels
{
@ -66,14 +60,10 @@ fn initialize-screen _screen: (addr screen), width: int, height: int, pixel-grap
capacity <- shift-left 3/log2-font-width
capacity <- multiply height
capacity <- shift-left 4/log2-font-height
# add 1 for sentinel
capacity <- increment
#
populate pixels-ah, capacity
# save sentinel index
capacity <- decrement
var dest/ecx: (addr int) <- get screen, invalid-pixel-index
copy-to *dest, capacity
}
# screen->cursor-x = 0
dest <- get screen, cursor-x
@ -111,6 +101,32 @@ fn draw-grapheme _screen: (addr screen), g: grapheme, x: int, y: int, color: int
return
}
# fake screen
# ignore if out of bounds
{
compare x, 0
break-if->=
return
}
{
var xmax/eax: (addr int) <- get screen, width
var xcurr/ecx: int <- copy x
compare xcurr, *xmax
break-if-<
return
}
{
compare y, 0
break-if->=
return
}
{
var ymax/eax: (addr int) <- get screen, height
var ycurr/ecx: int <- copy y
compare ycurr, *ymax
break-if-<
return
}
#
var index/ecx: int <- screen-cell-index screen, x, y
var data-ah/eax: (addr handle array screen-cell) <- get screen, data
var data/eax: (addr array screen-cell) <- lookup *data-ah
@ -136,35 +152,6 @@ fn draw-code-point screen: (addr screen), c: code-point, x: int, y: int, color:
# fake screens only
fn screen-cell-index _screen: (addr screen), x: int, y: int -> _/ecx: int {
var screen/esi: (addr screen) <- copy _screen
# if out of bounds, silently return a pixel that's never checked
{
compare x, 0
break-if->=
var invalid/eax: (addr int) <- get screen, invalid-cell-index
return *invalid
}
{
var xmax/eax: (addr int) <- get screen, width
var xcurr/ecx: int <- copy x
compare xcurr, *xmax
break-if-<
var invalid/eax: (addr int) <- get screen, invalid-cell-index
return *invalid
}
{
compare y, 0
break-if->=
var invalid/eax: (addr int) <- get screen, invalid-cell-index
return *invalid
}
{
var ymax/eax: (addr int) <- get screen, height
var ycurr/ecx: int <- copy y
compare ycurr, *ymax
break-if-<
var invalid/eax: (addr int) <- get screen, invalid-cell-index
return *invalid
}
var width-addr/eax: (addr int) <- get screen, width
var result/ecx: int <- copy y
result <- multiply *width-addr
@ -515,6 +502,34 @@ fn pixel screen: (addr screen), x: int, y: int, color: int {
break-if-!=
abort "pixel graphics not enabled for this screen"
}
# ignore if out of bounds
{
compare x, 0
break-if->=
return
}
{
var xmax-addr/eax: (addr int) <- get screen, width
var xmax/eax: int <- copy *xmax-addr
xmax <- shift-left 3/log2-font-width
compare x, xmax
break-if-<
return
}
{
compare y, 0
break-if->=
return
}
{
var ymax-addr/eax: (addr int) <- get screen, height
var ymax/eax: int <- copy *ymax-addr
ymax <- shift-left 4/log2-font-height
compare y, ymax
break-if-<
return
}
#
var index/ecx: int <- pixel-index screen, x, y
var dest/ecx: (addr byte) <- index pixels, index
var src/eax: byte <- copy-byte color
@ -523,36 +538,6 @@ fn pixel screen: (addr screen), x: int, y: int, color: int {
fn pixel-index _screen: (addr screen), x: int, y: int -> _/ecx: int {
var screen/esi: (addr screen) <- copy _screen
{
compare x, 0
break-if->=
var invalid/eax: (addr int) <- get screen, invalid-pixel-index
return *invalid
}
{
var xmax-a/eax: (addr int) <- get screen, width
var xmax/eax: int <- copy *xmax-a
xmax <- shift-left 3/log2-font-width
compare x, xmax
break-if-<
var invalid/eax: (addr int) <- get screen, invalid-pixel-index
return *invalid
}
{
compare y, 0
break-if->=
var invalid/eax: (addr int) <- get screen, invalid-pixel-index
return *invalid
}
{
var ymax-a/eax: (addr int) <- get screen, height
var ymax/eax: int <- copy *ymax-a
ymax <- shift-left 4/log2-font-height
compare y, ymax
break-if-<
var invalid/eax: (addr int) <- get screen, invalid-pixel-index
return *invalid
}
var width-addr/eax: (addr int) <- get screen, width
var result/ecx: int <- copy y
result <- multiply *width-addr