Litrally almost functional PS/2 driver. #19
|
@ -30,7 +30,10 @@ light_cyan := mode.light_cyan
|
||||||
put_pixel := mode.put_pixel
|
put_pixel := mode.put_pixel
|
||||||
put_rect := mode.put_rect
|
put_rect := mode.put_rect
|
||||||
put_filled_rect := mode.put_filled_rect
|
put_filled_rect := mode.put_filled_rect
|
||||||
|
put_trirect := mode.put_trirect
|
||||||
put_line := mode.put_line
|
put_line := mode.put_line
|
||||||
|
put_vline := mode.put_vline
|
||||||
|
put_hline := mode.put_hline
|
||||||
clear := mode.clear
|
clear := mode.clear
|
||||||
put_img := mode.put_img
|
put_img := mode.put_img
|
||||||
|
|
||||||
|
|
|
@ -119,7 +119,7 @@ sync := fn(): void {
|
||||||
bb := ctx.buf
|
bb := ctx.buf
|
||||||
fb := ctx.fb
|
fb := ctx.fb
|
||||||
boundary := bb + ctx.pixels
|
boundary := bb + ctx.pixels
|
||||||
loop if bb == boundary break else {
|
loop if bb >= boundary break else {
|
||||||
*@as(^[Color; copy_pixels], @bitcast(fb)) = *@as(^[Color; copy_pixels], @bitcast(bb))
|
*@as(^[Color; copy_pixels], @bitcast(fb)) = *@as(^[Color; copy_pixels], @bitcast(bb))
|
||||||
bb += copy_pixels
|
bb += copy_pixels
|
||||||
fb += copy_pixels
|
fb += copy_pixels
|
||||||
|
@ -137,6 +137,9 @@ height := fn(): int {
|
||||||
}
|
}
|
||||||
|
|
||||||
screenidx := fn(x: int, y: int): int {
|
screenidx := fn(x: int, y: int): int {
|
||||||
|
/*if x < 0 || y < 0 || x >= ctx.width || y >= ctx.height {
|
||||||
|
return -1
|
||||||
|
}*/
|
||||||
return x + ctx.width * y
|
return x + ctx.width * y
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -178,6 +181,27 @@ put_rect := fn(pos: Vec2(int), tr: Vec2(int), color: Color): void {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
|
put_trirect := fn(pos: Vec2(int), size: Vec2(int), color0: Color, color1: Color): void {
|
||||||
|
step := Vec2(int).(1, 1)
|
||||||
|
if size.x < 0 {
|
||||||
|
step.x = -1
|
||||||
|
}
|
||||||
|
if size.y < 0 {
|
||||||
|
step.y = size.y / size.x
|
||||||
|
}
|
||||||
|
|
||||||
|
start_y := pos.y
|
||||||
|
target := pos + size
|
||||||
|
|
||||||
|
loop if pos.x == target.x break else {
|
||||||
|
put_vline(pos.x, pos.y, target.y, color0)
|
||||||
|
put_vline(pos.x, pos.y, start_y, color1)
|
||||||
|
pos += step
|
||||||
|
}
|
||||||
|
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
put_line_low := fn(p0: Vec2(int), p1: Vec2(int), color: Color): void {
|
put_line_low := fn(p0: Vec2(int), p1: Vec2(int), color: Color): void {
|
||||||
dx := p1.x - p0.x
|
dx := p1.x - p0.x
|
||||||
dy := p1.y - p0.y
|
dy := p1.y - p0.y
|
||||||
|
@ -243,6 +267,38 @@ put_line := fn(p0: Vec2(int), p1: Vec2(int), color: Color): void {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
|
put_vline := fn(x: int, y0: int, y1: int, color: Color): void {
|
||||||
|
if y1 < y0 {
|
||||||
|
tmp := y0
|
||||||
|
y0 = y1
|
||||||
|
y1 = tmp
|
||||||
|
}
|
||||||
|
y := y0
|
||||||
|
|
||||||
|
loop if y == y1 break else {
|
||||||
|
*(ctx.buf + @inline(screenidx, x, y)) = color
|
||||||
|
y += 1
|
||||||
|
}
|
||||||
|
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
put_hline := fn(y: int, x0: int, x1: int, color: Color): void {
|
||||||
|
if x1 < x0 {
|
||||||
|
tmp := x0
|
||||||
|
x0 = x1
|
||||||
|
x1 = tmp
|
||||||
|
}
|
||||||
|
x := x0
|
||||||
|
|
||||||
|
loop if x == x1 break else {
|
||||||
|
*(ctx.buf + @inline(screenidx, x, y)) = color
|
||||||
|
x += 1
|
||||||
|
}
|
||||||
|
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
set_height := fn(new: int): void {
|
set_height := fn(new: int): void {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
|
@ -0,0 +1,83 @@
|
||||||
|
render := @use("../../../../libraries/render/src/lib.hb");
|
||||||
|
.{math, random} := @use("../../../../libraries/stn/src/lib.hb")
|
||||||
|
Vec2 := math.Vec2
|
||||||
|
|
||||||
|
/* expected result:
|
||||||
|
a grid of green lines scrolling from the left top corner to the right bottom one
|
||||||
|
with a "target" randomly apperaing in one of them and a "seeker" "catching" it*/
|
||||||
|
|
||||||
|
example := fn(): void {
|
||||||
|
render.init()
|
||||||
|
|
||||||
|
width := render.width()
|
||||||
|
height := render.height()
|
||||||
|
cell_size := 0
|
||||||
|
range := Vec2(int).(0, 0)
|
||||||
|
if width > height {
|
||||||
|
cell_size = width / 40
|
||||||
|
range = .(39, height / cell_size - 1)
|
||||||
|
} else {
|
||||||
|
cell_size = height / 40
|
||||||
|
range = .(width / cell_size - 1, 39)
|
||||||
|
}
|
||||||
|
width -= 1
|
||||||
|
height -= 1
|
||||||
|
|
||||||
|
scroll := 0
|
||||||
|
target := Vec2(int).(random.range(int, 0, range.x), random.range(int, 0, range.y))
|
||||||
|
|
||||||
|
halfcell := cell_size / 2
|
||||||
|
octcell := cell_size / 8
|
||||||
|
sevenoctcell := cell_size - octcell
|
||||||
|
|
||||||
|
seeker := Vec2(int).(random.range(int, 0, range.x), random.range(int, 0, range.y))
|
||||||
|
|
||||||
|
loop {
|
||||||
|
render.clear(render.black)
|
||||||
|
|
||||||
|
target_pixel_coord := target * .(cell_size, cell_size) + .(scroll, scroll)
|
||||||
|
render.put_trirect(target_pixel_coord, .(cell_size, cell_size), render.red, render.light_red)
|
||||||
|
|
||||||
|
render.put_hline(target_pixel_coord.y + halfcell, target_pixel_coord.x - octcell, target_pixel_coord.x - sevenoctcell, render.light_red)
|
||||||
|
render.put_hline(target_pixel_coord.y + halfcell, target_pixel_coord.x + cell_size + octcell, target_pixel_coord.x + cell_size + sevenoctcell, render.light_red)
|
||||||
|
render.put_vline(target_pixel_coord.x + halfcell, target_pixel_coord.y - octcell, target_pixel_coord.y - sevenoctcell, render.light_red)
|
||||||
|
render.put_vline(target_pixel_coord.x + halfcell, target_pixel_coord.y + cell_size + octcell, target_pixel_coord.y + cell_size + sevenoctcell, render.light_red)
|
||||||
|
|
||||||
|
x := scroll
|
||||||
|
loop if x > width break else {
|
||||||
|
render.put_vline(x, 0, height, .(0, 127, 0, 127))
|
||||||
|
x += cell_size
|
||||||
|
}
|
||||||
|
|
||||||
|
y := scroll
|
||||||
|
loop if y > height break else {
|
||||||
|
render.put_hline(y, 0, width, .(0, 127, 0, 127))
|
||||||
|
y += cell_size
|
||||||
|
}
|
||||||
|
|
||||||
|
render.put_hline(seeker.y * cell_size + halfcell + scroll, 0, width, render.light_green)
|
||||||
|
render.put_vline(seeker.x * cell_size + halfcell + scroll, 0, height, render.light_green)
|
||||||
|
|
||||||
|
render.sync()
|
||||||
|
|
||||||
|
if seeker.x < target.x {
|
||||||
|
seeker.x += 1
|
||||||
|
} else if seeker.x > target.x {
|
||||||
|
seeker.x -= 1
|
||||||
|
} else if seeker.y < target.y {
|
||||||
|
seeker.y += 1
|
||||||
|
} else if seeker.y > target.y {
|
||||||
|
seeker.y -= 1
|
||||||
|
} else {
|
||||||
|
target = .(random.range(int, 0, range.x), random.range(int, 0, range.y))
|
||||||
|
}
|
||||||
|
|
||||||
|
scroll += 1
|
||||||
|
if scroll > cell_size {
|
||||||
|
scroll = 0
|
||||||
|
target += .(1, 1)
|
||||||
|
seeker += .(1, 1)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return
|
||||||
|
}
|
|
@ -1,4 +1,4 @@
|
||||||
.{example} := @use("./examples/amogus.hb")
|
.{example} := @use("./examples/tactical_screen.hb")
|
||||||
|
|
||||||
main := fn(): void {
|
main := fn(): void {
|
||||||
@inline(example)
|
@inline(example)
|
||||||
|
|
|
@ -1,14 +1,27 @@
|
||||||
.{memory, log, string, buffer} := @use("../../../libraries/stn/src/lib.hb")
|
.{memory, log, string, buffer, math} := @use("../../../libraries/stn/src/lib.hb")
|
||||||
|
render := @use("../../../libraries/render/src/lib.hb")
|
||||||
|
Color := render.Color
|
||||||
|
Vec2 := math.Vec2
|
||||||
|
|
||||||
main := fn(): void {
|
main := fn(): void {
|
||||||
storage := @as(u8, 0)
|
input := @as(u8, 0)
|
||||||
output_buffer := memory.request_page(1)
|
output_buffer := memory.request_page(1)
|
||||||
input_buffer := buffer.search("XKeyboard\0")
|
input_buffer := buffer.search("XKeyboard\0")
|
||||||
|
|
||||||
|
render.init()
|
||||||
|
|
||||||
loop {
|
loop {
|
||||||
buffer.recv(input_buffer, &storage, 1)
|
render.clear(render.black)
|
||||||
if storage != 0 {
|
render.put_vline(100, 255, 128, Color.(255, 255, 255, 255))
|
||||||
log.info(string.display_int(storage, output_buffer))
|
render.put_hline(64, 100 - 64, 164, Color.(255, 255, 255, 255))
|
||||||
storage = 0
|
render.put_trirect(Vec2(int).(128, 128 + 256), Vec2(int).(256, -256), Color.(147, 147, 147, 255), Color.(107, 107, 107, 255))
|
||||||
|
render.put_filled_rect(Vec2(int).(128 + 32, 128 + 32), Vec2(int).(256 - 64, 256 - 64), Color.(127, 127, 127, 127))
|
||||||
|
render.sync()
|
||||||
|
|
||||||
|
buffer.recv(input_buffer, &input, 1)
|
||||||
|
if input != 0 {
|
||||||
|
log.info(string.display_int(input, output_buffer))
|
||||||
|
input = 0
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return
|
return
|
||||||
|
|
|
@ -3,7 +3,7 @@
|
||||||
default_entry = 1
|
default_entry = 1
|
||||||
timeout = 0
|
timeout = 0
|
||||||
verbose = false
|
verbose = false
|
||||||
interface_resolution = "1024x768x24"
|
interface_resolution = "1600x900x24"
|
||||||
# interface_resolution = "640x480x32"
|
# interface_resolution = "640x480x32"
|
||||||
# Terminal related settings
|
# Terminal related settings
|
||||||
term_wallpaper = "boot:///background.bmp"
|
term_wallpaper = "boot:///background.bmp"
|
||||||
|
@ -16,7 +16,7 @@ protocol = "limine"
|
||||||
kernel_path = "boot:///kernel_${ARCH}"
|
kernel_path = "boot:///kernel_${ARCH}"
|
||||||
kernel_cmdline = ""
|
kernel_cmdline = ""
|
||||||
# resolution = "640x480x32"
|
# resolution = "640x480x32"
|
||||||
resolution = "1024x768x24"
|
resolution = "1600x900x24"
|
||||||
|
|
||||||
[boot.limine.ableos.modules]
|
[boot.limine.ableos.modules]
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue