7538 - baremetal: screen coords in graphemes
This commit is contained in:
parent
7363c6dfd3
commit
dbf434f096
|
@ -2,9 +2,16 @@
|
||||||
#
|
#
|
||||||
# We need to do this in machine code because Mu doesn't have global variables
|
# We need to do this in machine code because Mu doesn't have global variables
|
||||||
# yet (for the start of video memory).
|
# yet (for the start of video memory).
|
||||||
|
#
|
||||||
|
# There are uncomfortable assumptions baked in here about english/latin
|
||||||
|
# script. We convert the grid of pixels into a fixed-width grid of graphemes,
|
||||||
|
# which may not work well with other language families.
|
||||||
|
|
||||||
== code
|
== code
|
||||||
|
|
||||||
|
# The Mu computer's screen is 1024px wide and 768px tall.
|
||||||
|
# The Mu computer's font is 8px wide and 16px tall.
|
||||||
|
# Therefore 'x' here is in [0, 128), and 'y' is in [0, 48)
|
||||||
draw-grapheme-on-real-screen: # g: grapheme, x: int, y: int, color: int, background-color: int
|
draw-grapheme-on-real-screen: # g: grapheme, x: int, y: int, color: int, background-color: int
|
||||||
# . prologue
|
# . prologue
|
||||||
55/push-ebp
|
55/push-ebp
|
||||||
|
@ -22,25 +29,29 @@ draw-grapheme-on-real-screen: # g: grapheme, x: int, y: int, color: int, backgr
|
||||||
# if (letter-bitmap >= 0x9000) return # characters beyond ASCII currently not supported
|
# if (letter-bitmap >= 0x9000) return # characters beyond ASCII currently not supported
|
||||||
81 7/subop/compare %esi 0x9000/imm32
|
81 7/subop/compare %esi 0x9000/imm32
|
||||||
7d/jump-if->= $draw-grapheme-on-real-screen:end/disp8
|
7d/jump-if->= $draw-grapheme-on-real-screen:end/disp8
|
||||||
# edx = y
|
# var ycurr/edx: int = y*16
|
||||||
8b/-> *(ebp+0x10) 2/r32/edx
|
8b/-> *(ebp+0x10) 2/r32/edx
|
||||||
# var ymax/ebx: int = y + 16
|
c1 4/subop/shift-left %edx 4/imm8
|
||||||
|
# var ymax/ebx: int = ycurr + 16
|
||||||
8b/-> *(ebp+0x10) 3/r32/ebx
|
8b/-> *(ebp+0x10) 3/r32/ebx
|
||||||
|
c1 4/subop/shift-left %ebx 4/imm8
|
||||||
81 0/subop/add %ebx 0x10/imm32
|
81 0/subop/add %ebx 0x10/imm32
|
||||||
{
|
{
|
||||||
# if (y >= ymax) break
|
# if (ycurr >= ymax) break
|
||||||
39/compare %edx 3/r32/ebx
|
39/compare %edx 3/r32/ebx
|
||||||
7d/jump-if->= break/disp8
|
7d/jump-if->= break/disp8
|
||||||
# eax = x + 7
|
# var xcurr/eax: int = x*8 + 7
|
||||||
8b/-> *(ebp+0xc) 0/r32/eax # font-width - 1
|
8b/-> *(ebp+0xc) 0/r32/eax # font-width - 1
|
||||||
|
c1 4/subop/shift-left %eax 3/imm8
|
||||||
81 0/subop/add %eax 7/imm32
|
81 0/subop/add %eax 7/imm32
|
||||||
# var xmin/ecx: int = x
|
# var xmin/ecx: int = x*8
|
||||||
8b/-> *(ebp+0xc) 1/r32/ecx
|
8b/-> *(ebp+0xc) 1/r32/ecx
|
||||||
|
c1 4/subop/shift-left %ecx 3/imm8
|
||||||
# var row-bitmap/ebx: int = *letter-bitmap
|
# var row-bitmap/ebx: int = *letter-bitmap
|
||||||
53/push-ebx
|
53/push-ebx
|
||||||
8b/-> *esi 3/r32/ebx
|
8b/-> *esi 3/r32/ebx
|
||||||
{
|
{
|
||||||
# if (x < xmin) break
|
# if (xcurr < xmin) break
|
||||||
39/compare %eax 1/r32/ecx
|
39/compare %eax 1/r32/ecx
|
||||||
7c/jump-if-< break/disp8
|
7c/jump-if-< break/disp8
|
||||||
# shift LSB from row-bitmap into carry flag (CF)
|
# shift LSB from row-bitmap into carry flag (CF)
|
||||||
|
|
|
@ -45,13 +45,14 @@ fn initialize-screen screen: (addr screen), width: int, height: int {
|
||||||
copy-to *dest, 0
|
copy-to *dest, 0
|
||||||
}
|
}
|
||||||
|
|
||||||
|
# in graphemes
|
||||||
fn screen-size screen: (addr screen) -> _/eax: int, _/ecx: int {
|
fn screen-size screen: (addr screen) -> _/eax: int, _/ecx: int {
|
||||||
var width/eax: int <- copy 0
|
var width/eax: int <- copy 0
|
||||||
var height/ecx: int <- copy 0
|
var height/ecx: int <- copy 0
|
||||||
compare screen, 0
|
compare screen, 0
|
||||||
{
|
{
|
||||||
break-if-!=
|
break-if-!=
|
||||||
return 0x400, 0x300 # 1024x768
|
return 0x80, 0x30 # 128x48
|
||||||
}
|
}
|
||||||
# fake screen
|
# fake screen
|
||||||
var screen-addr/esi: (addr screen) <- copy screen
|
var screen-addr/esi: (addr screen) <- copy screen
|
||||||
|
|
|
@ -9,7 +9,7 @@ fn cursor-left screen: (addr screen) {
|
||||||
break-if->
|
break-if->
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
cursor-x <- subtract 8 # font-width
|
cursor-x <- decrement
|
||||||
set-cursor-position screen, cursor-x, cursor-y
|
set-cursor-position screen, cursor-x, cursor-y
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -26,7 +26,7 @@ fn cursor-right screen: (addr screen) {
|
||||||
break-if-<
|
break-if-<
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
cursor-x <- add 8 # font-width
|
cursor-x <- increment
|
||||||
set-cursor-position screen, cursor-x, cursor-y
|
set-cursor-position screen, cursor-x, cursor-y
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -39,7 +39,7 @@ fn cursor-up screen: (addr screen) {
|
||||||
break-if->
|
break-if->
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
cursor-y <- subtract 0x10 # screen-height
|
cursor-y <- decrement
|
||||||
set-cursor-position screen, cursor-x, cursor-y
|
set-cursor-position screen, cursor-x, cursor-y
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -56,7 +56,7 @@ fn cursor-down screen: (addr screen) {
|
||||||
break-if-<
|
break-if-<
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
cursor-y <- add 0x10 # screen-height
|
cursor-y <- increment
|
||||||
set-cursor-position screen, cursor-x, cursor-y
|
set-cursor-position screen, cursor-x, cursor-y
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -82,7 +82,7 @@ fn draw-text-rightward screen: (addr screen), text: (addr array byte), x: int, x
|
||||||
var g/eax: grapheme <- read-grapheme stream
|
var g/eax: grapheme <- read-grapheme stream
|
||||||
compare g, 0xffffffff # end-of-file
|
compare g, 0xffffffff # end-of-file
|
||||||
break-if-=
|
break-if-=
|
||||||
xcurr <- add 8 # font-width
|
xcurr <- increment
|
||||||
loop
|
loop
|
||||||
}
|
}
|
||||||
compare xcurr, xmax
|
compare xcurr, xmax
|
||||||
|
@ -98,7 +98,7 @@ fn draw-text-rightward screen: (addr screen), text: (addr array byte), x: int, x
|
||||||
compare g, 0xffffffff # end-of-file
|
compare g, 0xffffffff # end-of-file
|
||||||
break-if-=
|
break-if-=
|
||||||
draw-grapheme screen, g, xcurr, y, color
|
draw-grapheme screen, g, xcurr, y, color
|
||||||
xcurr <- add 8 # font-width
|
xcurr <- increment
|
||||||
loop
|
loop
|
||||||
}
|
}
|
||||||
set-cursor-position screen, xcurr, y
|
set-cursor-position screen, xcurr, y
|
||||||
|
@ -130,12 +130,12 @@ fn draw-text-wrapping-right-then-down screen: (addr screen), text: (addr array b
|
||||||
var g/eax: grapheme <- read-grapheme stream
|
var g/eax: grapheme <- read-grapheme stream
|
||||||
compare g, 0xffffffff # end-of-file
|
compare g, 0xffffffff # end-of-file
|
||||||
break-if-=
|
break-if-=
|
||||||
xcurr <- add 8 # font-width
|
xcurr <- increment
|
||||||
compare xcurr, xmax
|
compare xcurr, xmax
|
||||||
{
|
{
|
||||||
break-if-<
|
break-if-<
|
||||||
xcurr <- copy xmin
|
xcurr <- copy xmin
|
||||||
ycurr <- add 0x10 # font-height
|
ycurr <- increment
|
||||||
}
|
}
|
||||||
loop
|
loop
|
||||||
}
|
}
|
||||||
|
@ -153,12 +153,12 @@ fn draw-text-wrapping-right-then-down screen: (addr screen), text: (addr array b
|
||||||
compare g, 0xffffffff # end-of-file
|
compare g, 0xffffffff # end-of-file
|
||||||
break-if-=
|
break-if-=
|
||||||
draw-grapheme screen, g, xcurr, ycurr, color
|
draw-grapheme screen, g, xcurr, ycurr, color
|
||||||
xcurr <- add 8 # font-width
|
xcurr <- increment
|
||||||
compare xcurr, xmax
|
compare xcurr, xmax
|
||||||
{
|
{
|
||||||
break-if-<
|
break-if-<
|
||||||
xcurr <- copy xmin
|
xcurr <- copy xmin
|
||||||
ycurr <- add 0x10 # font-height
|
ycurr <- increment
|
||||||
}
|
}
|
||||||
loop
|
loop
|
||||||
}
|
}
|
||||||
|
@ -170,12 +170,12 @@ fn move-cursor-rightward-and-downward screen: (addr screen), xmin: int, xmax: in
|
||||||
var cursor-x/eax: int <- copy 0
|
var cursor-x/eax: int <- copy 0
|
||||||
var cursor-y/ecx: int <- copy 0
|
var cursor-y/ecx: int <- copy 0
|
||||||
cursor-x, cursor-y <- cursor-position screen
|
cursor-x, cursor-y <- cursor-position screen
|
||||||
cursor-x <- add 8 # font-width
|
cursor-x <- increment
|
||||||
compare cursor-x, xmax
|
compare cursor-x, xmax
|
||||||
{
|
{
|
||||||
break-if-<
|
break-if-<
|
||||||
cursor-x <- copy xmin
|
cursor-x <- copy xmin
|
||||||
cursor-y <- add 0x10 # font-height
|
cursor-y <- increment
|
||||||
}
|
}
|
||||||
set-cursor-position screen, cursor-x, cursor-y
|
set-cursor-position screen, cursor-x, cursor-y
|
||||||
}
|
}
|
||||||
|
@ -193,12 +193,12 @@ fn draw-text-wrapping-right-then-down-from-cursor screen: (addr screen), text: (
|
||||||
var cursor-y/ecx: int <- copy 0
|
var cursor-y/ecx: int <- copy 0
|
||||||
cursor-x, cursor-y <- cursor-position screen
|
cursor-x, cursor-y <- cursor-position screen
|
||||||
var end-x/edx: int <- copy cursor-x
|
var end-x/edx: int <- copy cursor-x
|
||||||
end-x <- add 8 # font-width
|
end-x <- increment
|
||||||
compare end-x, xmax
|
compare end-x, xmax
|
||||||
{
|
{
|
||||||
break-if-<
|
break-if-<
|
||||||
cursor-x <- copy xmin
|
cursor-x <- copy xmin
|
||||||
cursor-y <- add 0x10 # font-height
|
cursor-y <- increment
|
||||||
}
|
}
|
||||||
cursor-x, cursor-y <- draw-text-wrapping-right-then-down screen, text, xmin, ymin, xmax, ymax, cursor-x, cursor-y, color
|
cursor-x, cursor-y <- draw-text-wrapping-right-then-down screen, text, xmin, ymin, xmax, ymax, cursor-x, cursor-y, color
|
||||||
}
|
}
|
||||||
|
@ -223,12 +223,12 @@ fn draw-int32-hex-wrapping-right-then-down screen: (addr screen), n: int, xmin:
|
||||||
var g/eax: grapheme <- read-grapheme stream
|
var g/eax: grapheme <- read-grapheme stream
|
||||||
compare g, 0xffffffff # end-of-file
|
compare g, 0xffffffff # end-of-file
|
||||||
break-if-=
|
break-if-=
|
||||||
xcurr <- add 8 # font-width
|
xcurr <- increment
|
||||||
compare xcurr, xmax
|
compare xcurr, xmax
|
||||||
{
|
{
|
||||||
break-if-<
|
break-if-<
|
||||||
xcurr <- copy xmin
|
xcurr <- copy xmin
|
||||||
ycurr <- add 0x10 # font-height
|
ycurr <- increment
|
||||||
}
|
}
|
||||||
loop
|
loop
|
||||||
}
|
}
|
||||||
|
@ -246,12 +246,12 @@ fn draw-int32-hex-wrapping-right-then-down screen: (addr screen), n: int, xmin:
|
||||||
compare g, 0xffffffff # end-of-file
|
compare g, 0xffffffff # end-of-file
|
||||||
break-if-=
|
break-if-=
|
||||||
draw-grapheme screen, g, xcurr, ycurr, color
|
draw-grapheme screen, g, xcurr, ycurr, color
|
||||||
xcurr <- add 8 # font-width
|
xcurr <- increment
|
||||||
compare xcurr, xmax
|
compare xcurr, xmax
|
||||||
{
|
{
|
||||||
break-if-<
|
break-if-<
|
||||||
xcurr <- copy xmin
|
xcurr <- copy xmin
|
||||||
ycurr <- add 0x10 # font-height
|
ycurr <- increment
|
||||||
}
|
}
|
||||||
loop
|
loop
|
||||||
}
|
}
|
||||||
|
@ -272,12 +272,12 @@ fn draw-int32-hex-wrapping-right-then-down-from-cursor screen: (addr screen), n:
|
||||||
var cursor-y/ecx: int <- copy 0
|
var cursor-y/ecx: int <- copy 0
|
||||||
cursor-x, cursor-y <- cursor-position screen
|
cursor-x, cursor-y <- cursor-position screen
|
||||||
var end-x/edx: int <- copy cursor-x
|
var end-x/edx: int <- copy cursor-x
|
||||||
end-x <- add 8 # font-width
|
end-x <- increment
|
||||||
compare end-x, xmax
|
compare end-x, xmax
|
||||||
{
|
{
|
||||||
break-if-<
|
break-if-<
|
||||||
cursor-x <- copy xmin
|
cursor-x <- copy xmin
|
||||||
cursor-y <- add 0x10 # font-height
|
cursor-y <- increment
|
||||||
}
|
}
|
||||||
cursor-x, cursor-y <- draw-int32-hex-wrapping-right-then-down screen, n, xmin, ymin, xmax, ymax, cursor-x, cursor-y, color
|
cursor-x, cursor-y <- draw-int32-hex-wrapping-right-then-down screen, n, xmin, ymin, xmax, ymax, cursor-x, cursor-y, color
|
||||||
}
|
}
|
||||||
|
@ -302,12 +302,12 @@ fn draw-int32-decimal-wrapping-right-then-down screen: (addr screen), n: int, xm
|
||||||
var g/eax: grapheme <- read-grapheme stream
|
var g/eax: grapheme <- read-grapheme stream
|
||||||
compare g, 0xffffffff # end-of-file
|
compare g, 0xffffffff # end-of-file
|
||||||
break-if-=
|
break-if-=
|
||||||
xcurr <- add 8 # font-width
|
xcurr <- increment
|
||||||
compare xcurr, xmax
|
compare xcurr, xmax
|
||||||
{
|
{
|
||||||
break-if-<
|
break-if-<
|
||||||
xcurr <- copy xmin
|
xcurr <- copy xmin
|
||||||
ycurr <- add 0x10 # font-height
|
ycurr <- increment
|
||||||
}
|
}
|
||||||
loop
|
loop
|
||||||
}
|
}
|
||||||
|
@ -325,12 +325,12 @@ fn draw-int32-decimal-wrapping-right-then-down screen: (addr screen), n: int, xm
|
||||||
compare g, 0xffffffff # end-of-file
|
compare g, 0xffffffff # end-of-file
|
||||||
break-if-=
|
break-if-=
|
||||||
draw-grapheme screen, g, xcurr, ycurr, color
|
draw-grapheme screen, g, xcurr, ycurr, color
|
||||||
xcurr <- add 8 # font-width
|
xcurr <- increment
|
||||||
compare xcurr, xmax
|
compare xcurr, xmax
|
||||||
{
|
{
|
||||||
break-if-<
|
break-if-<
|
||||||
xcurr <- copy xmin
|
xcurr <- copy xmin
|
||||||
ycurr <- add 0x10 # font-height
|
ycurr <- increment
|
||||||
}
|
}
|
||||||
loop
|
loop
|
||||||
}
|
}
|
||||||
|
@ -351,12 +351,12 @@ fn draw-int32-decimal-wrapping-right-then-down-from-cursor screen: (addr screen)
|
||||||
var cursor-y/ecx: int <- copy 0
|
var cursor-y/ecx: int <- copy 0
|
||||||
cursor-x, cursor-y <- cursor-position screen
|
cursor-x, cursor-y <- cursor-position screen
|
||||||
var end-x/edx: int <- copy cursor-x
|
var end-x/edx: int <- copy cursor-x
|
||||||
end-x <- add 8 # font-width
|
end-x <- increment
|
||||||
compare end-x, xmax
|
compare end-x, xmax
|
||||||
{
|
{
|
||||||
break-if-<
|
break-if-<
|
||||||
cursor-x <- copy xmin
|
cursor-x <- copy xmin
|
||||||
cursor-y <- add 0x10 # font-height
|
cursor-y <- increment
|
||||||
}
|
}
|
||||||
cursor-x, cursor-y <- draw-int32-decimal-wrapping-right-then-down screen, n, xmin, ymin, xmax, ymax, cursor-x, cursor-y, color
|
cursor-x, cursor-y <- draw-int32-decimal-wrapping-right-then-down screen, n, xmin, ymin, xmax, ymax, cursor-x, cursor-y, color
|
||||||
}
|
}
|
||||||
|
@ -385,7 +385,7 @@ fn draw-text-downward screen: (addr screen), text: (addr array byte), x: int, y:
|
||||||
var g/eax: grapheme <- read-grapheme stream
|
var g/eax: grapheme <- read-grapheme stream
|
||||||
compare g, 0xffffffff # end-of-file
|
compare g, 0xffffffff # end-of-file
|
||||||
break-if-=
|
break-if-=
|
||||||
ycurr <- add 0x10 # font-height
|
ycurr <- increment
|
||||||
loop
|
loop
|
||||||
}
|
}
|
||||||
compare ycurr, ymax
|
compare ycurr, ymax
|
||||||
|
@ -401,7 +401,7 @@ fn draw-text-downward screen: (addr screen), text: (addr array byte), x: int, y:
|
||||||
compare g, 0xffffffff # end-of-file
|
compare g, 0xffffffff # end-of-file
|
||||||
break-if-=
|
break-if-=
|
||||||
draw-grapheme screen, g, x, ycurr, color
|
draw-grapheme screen, g, x, ycurr, color
|
||||||
ycurr <- add 0x10 # font-height
|
ycurr <- increment
|
||||||
loop
|
loop
|
||||||
}
|
}
|
||||||
set-cursor-position screen, x, ycurr
|
set-cursor-position screen, x, ycurr
|
||||||
|
@ -432,11 +432,11 @@ fn draw-text-wrapping-down-then-right screen: (addr screen), text: (addr array b
|
||||||
var g/eax: grapheme <- read-grapheme stream
|
var g/eax: grapheme <- read-grapheme stream
|
||||||
compare g, 0xffffffff # end-of-file
|
compare g, 0xffffffff # end-of-file
|
||||||
break-if-=
|
break-if-=
|
||||||
ycurr <- add 0x10 # font-height
|
ycurr <- increment
|
||||||
compare ycurr, ymax
|
compare ycurr, ymax
|
||||||
{
|
{
|
||||||
break-if-<
|
break-if-<
|
||||||
xcurr <- add 8 # font-width
|
xcurr <- increment
|
||||||
ycurr <- copy ymin
|
ycurr <- copy ymin
|
||||||
}
|
}
|
||||||
loop
|
loop
|
||||||
|
@ -455,11 +455,11 @@ fn draw-text-wrapping-down-then-right screen: (addr screen), text: (addr array b
|
||||||
compare g, 0xffffffff # end-of-file
|
compare g, 0xffffffff # end-of-file
|
||||||
break-if-=
|
break-if-=
|
||||||
draw-grapheme screen, g, xcurr, ycurr, color
|
draw-grapheme screen, g, xcurr, ycurr, color
|
||||||
ycurr <- add 0x10 # font-height
|
ycurr <- increment
|
||||||
compare ycurr, ymax
|
compare ycurr, ymax
|
||||||
{
|
{
|
||||||
break-if-<
|
break-if-<
|
||||||
xcurr <- add 8 # font-width
|
xcurr <- increment
|
||||||
ycurr <- copy ymin
|
ycurr <- copy ymin
|
||||||
}
|
}
|
||||||
loop
|
loop
|
||||||
|
@ -481,11 +481,11 @@ fn draw-text-wrapping-down-then-right-from-cursor screen: (addr screen), text: (
|
||||||
var cursor-y/ecx: int <- copy 0
|
var cursor-y/ecx: int <- copy 0
|
||||||
cursor-x, cursor-y <- cursor-position screen
|
cursor-x, cursor-y <- cursor-position screen
|
||||||
var end-y/edx: int <- copy cursor-y
|
var end-y/edx: int <- copy cursor-y
|
||||||
end-y <- add 0x10 # font-height
|
end-y <- increment
|
||||||
compare end-y, ymax
|
compare end-y, ymax
|
||||||
{
|
{
|
||||||
break-if-<
|
break-if-<
|
||||||
cursor-x <- add 8 # font-width
|
cursor-x <- increment
|
||||||
cursor-y <- copy ymin
|
cursor-y <- copy ymin
|
||||||
}
|
}
|
||||||
cursor-x, cursor-y <- draw-text-wrapping-down-then-right screen, text, xmin, ymin, xmax, ymax, cursor-x, cursor-y, color
|
cursor-x, cursor-y <- draw-text-wrapping-down-then-right screen, text, xmin, ymin, xmax, ymax, cursor-x, cursor-y, color
|
||||||
|
|
|
@ -11,5 +11,5 @@
|
||||||
|
|
||||||
fn main {
|
fn main {
|
||||||
var g/eax: grapheme <- copy 0x41 # 'A'
|
var g/eax: grapheme <- copy 0x41 # 'A'
|
||||||
draw-grapheme 0, g, 0x10, 0x10, 0xa
|
draw-grapheme 0, g, 2, 1, 0xa # x of 2 graphemes = 16px from top-left; y of 1 grapheme = 16px down from top-left
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue