6703 - new types: code-point and grapheme

Both have the same size: 4 bytes.

So far I've just renamed print-byte to print-grapheme, but it still behaves
the same.

I'm going to support printing code-points next, but grapheme 'clusters'
spanning multiple code-points won't be supported for some time.
This commit is contained in:
Kartik Agaram 2020-08-02 12:05:25 -07:00
parent 1b79f705b9
commit 0452b05f5a
51 changed files with 144 additions and 75 deletions

View File

@ -131,7 +131,8 @@ $print-string-to-real-screen:end:
5d/pop-to-ebp
c3/return
print-byte-to-real-screen: # c: byte
# currently only supports ascii
print-grapheme-to-real-screen: # c: grapheme
# . prologue
55/push-ebp
89/<- %ebp 4/r32/esp
@ -142,7 +143,7 @@ print-byte-to-real-screen: # c: byte
68/push 4/imm32/size
89/<- %ecx 4/r32/esp
(write 2 %ecx)
$print-byte-to-real-screen:end:
$print-grapheme-to-real-screen:end:
# . reclaim locals
81 0/subop/add %esp 8/imm32
# . restore registers

2
400.mu
View File

@ -142,7 +142,7 @@ sig real-screen-size -> nrows/eax: int, ncols/ecx: int
sig clear-real-screen
sig move-cursor-on-real-screen row: int, column: int
sig print-string-to-real-screen s: (addr array byte)
sig print-byte-to-real-screen c: byte
sig print-grapheme-to-real-screen c: grapheme
sig print-int32-hex-to-real-screen n: int
sig reset-formatting-on-real-screen
sig start-color-on-real-screen fg: int, bg: int

View File

@ -82,6 +82,7 @@ $clear-screen:body: {
{
break-if-=
# fake screen
var space/edi: grapheme <- copy 0x20
move-cursor screen, 1, 1
var screen-addr/esi: (addr screen) <- copy screen
var i/eax: int <- copy 1
@ -94,7 +95,7 @@ $clear-screen:body: {
{
compare j, *ncols
break-if->
print-byte screen, 0x20 # space
print-grapheme screen, space
j <- increment
loop
}
@ -136,13 +137,13 @@ $print-string:body: {
}
}
fn print-byte screen: (addr screen), c: byte {
$print-byte:body: {
fn print-grapheme screen: (addr screen), c: grapheme {
$print-grapheme:body: {
compare screen, 0
{
break-if-!=
print-byte-to-real-screen c
break $print-byte:body
print-grapheme-to-real-screen c
break $print-grapheme:body
}
{
break-if-=

View File

@ -96,7 +96,8 @@ $line-loop: {
update-attributes c, r
compare c, 0xa # newline
break-if-= # no need to print newlines
print-byte 0, c
var g/eax: grapheme <- copy c
print-grapheme 0, g
col <- increment
loop
}
@ -176,6 +177,7 @@ fn dump in: (addr buffered-file) {
var c/eax: byte <- read-byte-buffered in
compare c, 0xffffffff # EOF marker
break-if-=
print-byte 0, c
var g/eax: grapheme <- copy c
print-grapheme 0, g
loop
}

BIN
apps/mu

Binary file not shown.

View File

@ -412,8 +412,10 @@ Type-id: # (stream (addr array byte))
# some SubX types deliberately left undefined in Mu; they can only be operated on using SubX primitives
"stream"/imm32 # 11
"slice"/imm32 # 12
"code-point"/imm32 # 13; smallest scannable unit from a text stream
"grapheme"/imm32 # 14; smallest printable unit; will eventually be composed of multiple code-points, but currently corresponds 1:1
# Keep Primitive-type-ids in sync if you add types here.
0/imm32 0/imm32 0/imm32
0/imm32
0/imm32 0/imm32 0/imm32 0/imm32 0/imm32 0/imm32 0/imm32 0/imm32
0/imm32 0/imm32 0/imm32 0/imm32 0/imm32 0/imm32 0/imm32 0/imm32
0/imm32 0/imm32 0/imm32 0/imm32 0/imm32 0/imm32 0/imm32 0/imm32

View File

@ -31,7 +31,7 @@ $main-body: {
var c/eax: byte <- read-byte-buffered in-addr
compare c, 0xffffffff # EOF marker
break-if-=
print-byte 0, c
print-grapheme 0, c
loop
}
}

Binary file not shown.

View File

@ -26,7 +26,8 @@ fn dump in: (addr buffered-file) {
var c/eax: byte <- read-byte-buffered in
compare c, 0xffffffff # EOF marker
break-if-=
print-byte 0, c
var g/eax: grapheme <- copy c
print-grapheme 0, g
loop
}
}

View File

@ -75,7 +75,8 @@ $line-loop: {
compare c, 0xa # newline
break-if-= # no need to print newlines
# print c
print-byte 0, c
var g/eax: grapheme <- copy c
print-grapheme 0, g
col <- increment
loop
} # $char-loop
@ -171,6 +172,7 @@ fn dump in: (addr buffered-file) {
var c/eax: byte <- read-byte-buffered in
compare c, 0xffffffff # EOF marker
break-if-=
print-byte 0, c
var g/eax: grapheme <- copy c
print-grapheme 0, g
loop
}

View File

@ -119,7 +119,8 @@ $update-attributes:check-state: {
compare c, 0xa # newline
break-if-= # no need to print newlines
# print c
print-byte 0, c
var g/eax: grapheme <- copy c
print-grapheme 0, g
col <- increment
loop
} # $char-loop
@ -167,6 +168,7 @@ fn dump in: (addr buffered-file) {
var c/eax: byte <- read-byte-buffered in
compare c, 0xffffffff # EOF marker
break-if-=
print-byte 0, c
var g/eax: grapheme <- copy c
print-grapheme 0, g
loop
}

View File

@ -98,7 +98,8 @@ $update-attributes:check-state: {
{
break-if-!=
# r->current-state == 1 && c == '*' => print c, then normal text
print-byte 0, c
var g/eax: grapheme <- copy c
print-grapheme 0, g
col <- increment
reset-formatting 0
start-color 0, 0xec, 7 # 236 = darkish gray
@ -109,7 +110,8 @@ $update-attributes:check-state: {
{
break-if-!=
# r->current-state == 1 && c == '_' => print c, then normal text
print-byte 0, c
var g/eax: grapheme <- copy c
print-grapheme 0, g
col <- increment
reset-formatting 0
start-color 0, 0xec, 7 # 236 = darkish gray
@ -122,7 +124,8 @@ $update-attributes:check-state: {
compare c, 0xa # newline
break-if-= # no need to print newlines
# print c
print-byte 0, c
var g/eax: grapheme <- copy c
print-grapheme 0, g
col <- increment
loop
} # $char-loop
@ -170,6 +173,7 @@ fn dump in: (addr buffered-file) {
var c/eax: byte <- read-byte-buffered in
compare c, 0xffffffff # EOF marker
break-if-=
print-byte 0, c
var g/eax: grapheme <- copy c
print-grapheme 0, g
loop
}

View File

@ -99,7 +99,8 @@ $update-attributes:check-state: {
{
break-if-!=
# r->current-state == 1 && c == '*' => print c, then normal text
print-byte 0, c
var g/eax: grapheme <- copy c
print-grapheme 0, g
col <- increment
reset-formatting 0
start-color 0, 0xec, 7 # 236 = darkish gray
@ -110,7 +111,8 @@ $update-attributes:check-state: {
{
break-if-!=
# r->current-state == 1 && c == '_' => print c, then normal text
print-byte 0, c
var g/eax: grapheme <- copy c
print-grapheme 0, g
col <- increment
reset-formatting 0
start-color 0, 0xec, 7 # 236 = darkish gray
@ -123,7 +125,8 @@ $update-attributes:check-state: {
compare c, 0xa # newline
break-if-= # no need to print newlines
# print c
print-byte 0, c
var g/eax: grapheme <- copy c
print-grapheme 0, g
col <- increment
loop
} # $char-loop
@ -171,6 +174,7 @@ fn dump in: (addr buffered-file) {
var c/eax: byte <- read-byte-buffered in
compare c, 0xffffffff # EOF marker
break-if-=
print-byte 0, c
var g/eax: grapheme <- copy c
print-grapheme 0, g
loop
}

View File

@ -97,7 +97,8 @@ $change-state: {
{
break-if-!=
# r->current-state == 1 && c == '*' => print c, then normal text
print-byte 0, c
var g/eax: grapheme <- copy c
print-grapheme 0, g
col <- increment
reset-formatting 0
start-color 0, 0xec, 7 # 236 = darkish gray
@ -108,7 +109,8 @@ $change-state: {
{
break-if-!=
# r->current-state == 1 && c == '_' => print c, then normal text
print-byte 0, c
var g/eax: grapheme <- copy c
print-grapheme 0, g
col <- increment
reset-formatting 0
start-color 0, 0xec, 7 # 236 = darkish gray
@ -121,7 +123,8 @@ $change-state: {
compare c, 0xa # newline
break-if-= # no need to print newlines
# print c
print-byte 0, c
var g/eax: grapheme <- copy c
print-grapheme 0, g
col <- increment
loop
} # $char-loop
@ -169,6 +172,7 @@ fn dump in: (addr buffered-file) {
var c/eax: byte <- read-byte-buffered in
compare c, 0xffffffff # EOF marker
break-if-=
print-byte 0, c
var g/eax: grapheme <- copy c
print-grapheme 0, g
loop
}

View File

@ -121,7 +121,8 @@ $change-state: {
{
break-if-!=
# r->current-state == 1 && c == '*' => print c, then normal text
print-byte 0, c
var g/eax: grapheme <- copy c
print-grapheme 0, g
col <- increment
reset-formatting 0
start-color 0, 0xec, 7 # 236 = darkish gray
@ -132,7 +133,8 @@ $change-state: {
{
break-if-!=
# r->current-state == 1 && c == '_' => print c, then normal text
print-byte 0, c
var g/eax: grapheme <- copy c
print-grapheme 0, g
col <- increment
reset-formatting 0
start-color 0, 0xec, 7 # 236 = darkish gray
@ -163,7 +165,8 @@ $change-state: {
copy-to *s, 0 # false
}
# print c
print-byte 0, c
var g/eax: grapheme <- copy c
print-grapheme 0, g
col <- increment
loop
}
@ -211,6 +214,7 @@ fn dump in: (addr buffered-file) {
var c/eax: byte <- read-byte-buffered in
compare c, 0xffffffff # EOF marker
break-if-=
print-byte 0, c
var g/eax: grapheme <- copy c
print-grapheme 0, g
loop
}

View File

@ -183,6 +183,7 @@ fn dump in: (addr buffered-file) {
var c/eax: byte <- read-byte-buffered in
compare c, 0xffffffff # EOF marker
break-if-=
print-byte 0, c
var g/eax: grapheme <- copy c
print-grapheme 0, g
loop
}

View File

@ -28,6 +28,7 @@ fn dump in: (addr buffered-file) {
var c/eax: byte <- read-byte-buffered in
compare c, 0xffffffff # EOF marker
break-if-=
print-byte 0, c
var g/eax: grapheme <- copy c
print-grapheme 0, g
loop
}

View File

@ -39,6 +39,7 @@ fn dump in: (addr buffered-file) {
var c/eax: byte <- read-byte-buffered in
compare c, 0xffffffff # EOF marker
break-if-=
print-byte 0, c
var g/eax: grapheme <- copy c
print-grapheme 0, g
loop
}

View File

@ -19,7 +19,8 @@ fn render-normal fs: (addr file-state) {
compare c, 0xffffffff # EOF marker
break-if-=
#
print-byte 0, c
var g/eax: grapheme <- copy c
print-grapheme 0, g
#
loop
}

View File

@ -39,6 +39,7 @@ fn dump in: (addr buffered-file) {
var c/eax: byte <- read-byte-buffered in
compare c, 0xffffffff # EOF marker
break-if-=
print-byte 0, c
var g/eax: grapheme <- copy c
print-grapheme 0, g
loop
}

View File

@ -63,7 +63,8 @@ fn start-drawing _self: (addr screen-position-state) {
fn add-char _self: (addr screen-position-state), c: byte {
var self/esi: (addr screen-position-state) <- copy _self
# print c
print-byte 0, c
var g/eax: grapheme <- copy c
print-grapheme 0, g
# self->col++
var tmp/eax: (addr int) <- get self, col
increment *tmp

View File

@ -25,7 +25,8 @@ fn dump in: (addr buffered-file) {
var c/eax: byte <- read-byte-buffered in
compare c, 0xffffffff # EOF marker
break-if-=
print-byte 0, c
var g/eax: grapheme <- copy c
print-grapheme 0, g
loop
}
}

View File

@ -39,6 +39,7 @@ fn dump in: (addr buffered-file) {
var c/eax: byte <- read-byte-buffered in
compare c, 0xffffffff # EOF marker
break-if-=
print-byte 0, c
var g/eax: grapheme <- copy c
print-grapheme 0, g
loop
}

View File

@ -71,7 +71,8 @@ $add-char:body: {
break $add-char:body
}
# print c
print-byte 0, c
var g/eax: grapheme <- copy c
print-grapheme 0, g
# self->col++
var tmp/eax: (addr int) <- get self, col
increment *tmp

View File

@ -39,6 +39,7 @@ fn dump in: (addr buffered-file) {
var c/eax: byte <- read-byte-buffered in
compare c, 0xffffffff # EOF marker
break-if-=
print-byte 0, c
var g/eax: grapheme <- copy c
print-grapheme 0, g
loop
}

View File

@ -70,7 +70,8 @@ $add-char:body: {
break $add-char:body
}
# print c
print-byte 0, c
var g/eax: grapheme <- copy c
print-grapheme 0, g
# self->col++
var tmp/eax: (addr int) <- get self, col
increment *tmp

View File

@ -39,6 +39,7 @@ fn dump in: (addr buffered-file) {
var c/eax: byte <- read-byte-buffered in
compare c, 0xffffffff # EOF marker
break-if-=
print-byte 0, c
var g/eax: grapheme <- copy c
print-grapheme 0, g
loop
}

View File

@ -70,7 +70,8 @@ $add-char:body: {
break $add-char:body
}
# print c
print-byte 0, c
var g/eax: grapheme <- copy c
print-grapheme 0, g
# self->col++
var tmp/eax: (addr int) <- get self, col
increment *tmp

View File

@ -39,6 +39,7 @@ fn dump in: (addr buffered-file) {
var c/eax: byte <- read-byte-buffered in
compare c, 0xffffffff # EOF marker
break-if-=
print-byte 0, c
var g/eax: grapheme <- copy c
print-grapheme 0, g
loop
}

View File

@ -71,7 +71,8 @@ $add-char:body: {
break $add-char:body
}
# print c
print-byte 0, c
var g/eax: grapheme <- copy c
print-grapheme 0, g
# self->col++
var tmp/eax: (addr int) <- get self, col
increment *tmp

View File

@ -39,6 +39,7 @@ fn dump in: (addr buffered-file) {
var c/eax: byte <- read-byte-buffered in
compare c, 0xffffffff # EOF marker
break-if-=
print-byte 0, c
var g/eax: grapheme <- copy c
print-grapheme 0, g
loop
}

View File

@ -71,7 +71,8 @@ $add-char:body: {
break $add-char:body
}
# print c
print-byte 0, c
var g/eax: grapheme <- copy c
print-grapheme 0, g
# self->col++
var tmp/eax: (addr int) <- get self, col
increment *tmp

View File

@ -39,6 +39,7 @@ fn dump in: (addr buffered-file) {
var c/eax: byte <- read-byte-buffered in
compare c, 0xffffffff # EOF marker
break-if-=
print-byte 0, c
var g/eax: grapheme <- copy c
print-grapheme 0, g
loop
}

View File

@ -72,7 +72,8 @@ $add-char:body: {
break $add-char:body
}
# print c
print-byte 0, c
var g/eax: grapheme <- copy c
print-grapheme 0, g
# self->col++
var tmp/eax: (addr int) <- get self, col
increment *tmp

View File

@ -39,6 +39,7 @@ fn dump in: (addr buffered-file) {
var c/eax: byte <- read-byte-buffered in
compare c, 0xffffffff # EOF marker
break-if-=
print-byte 0, c
var g/eax: grapheme <- copy c
print-grapheme 0, g
loop
}

View File

@ -72,7 +72,8 @@ $add-char:body: {
break $add-char:body
}
# print c
print-byte 0, c
var g/eax: grapheme <- copy c
print-grapheme 0, g
# self->col++
var tmp/eax: (addr int) <- get self, col
increment *tmp

View File

@ -39,6 +39,7 @@ fn dump in: (addr buffered-file) {
var c/eax: byte <- read-byte-buffered in
compare c, 0xffffffff # EOF marker
break-if-=
print-byte 0, c
var g/eax: grapheme <- copy c
print-grapheme 0, g
loop
}

View File

@ -72,7 +72,8 @@ $add-char:body: {
break $add-char:body
}
# print c
print-byte 0, c
var g/eax: grapheme <- copy c
print-grapheme 0, g
# self->col++
var tmp/eax: (addr int) <- get self, col
increment *tmp

View File

@ -39,6 +39,7 @@ fn dump in: (addr buffered-file) {
var c/eax: byte <- read-byte-buffered in
compare c, 0xffffffff # EOF marker
break-if-=
print-byte 0, c
var g/eax: grapheme <- copy c
print-grapheme 0, g
loop
}

View File

@ -72,7 +72,8 @@ $add-char:body: {
break $add-char:body
}
# print c
print-byte 0, c
var g/eax: grapheme <- copy c
print-grapheme 0, g
# self->col++
var tmp/eax: (addr int) <- get self, col
increment *tmp

View File

@ -39,6 +39,7 @@ fn dump in: (addr buffered-file) {
var c/eax: byte <- read-byte-buffered in
compare c, 0xffffffff # EOF marker
break-if-=
print-byte 0, c
var g/eax: grapheme <- copy c
print-grapheme 0, g
loop
}

View File

@ -72,7 +72,8 @@ $add-char:body: {
break $add-char:body
}
# print c
print-byte 0, c
var g/eax: grapheme <- copy c
print-grapheme 0, g
# self->col++
var tmp/eax: (addr int) <- get self, col
increment *tmp

View File

@ -24,6 +24,7 @@ fn dump in: (addr buffered-file) {
var c/eax: byte <- read-byte-buffered in
compare c, 0xffffffff # EOF marker
break-if-=
print-byte 0, c
var g/eax: grapheme <- copy c
print-grapheme 0, g
loop
}

View File

@ -29,7 +29,8 @@ $line-loop: {
compare c, 0xffffffff # EOF marker
break-if-= $line-loop
# print c
print-byte 0, c
var g/eax: grapheme <- copy c
print-grapheme 0, g
col <- increment
loop
} # $char-loop
@ -76,6 +77,7 @@ fn dump in: (addr buffered-file) {
var c/eax: byte <- read-byte-buffered in
compare c, 0xffffffff # EOF marker
break-if-=
print-byte 0, c
var g/eax: grapheme <- copy c
print-grapheme 0, g
loop
}

View File

@ -31,7 +31,8 @@ $line-loop: {
compare c, 0xa # newline
break-if-= # no need to print newlines
# print c
print-byte 0, c
var g/eax: grapheme <- copy c
print-grapheme 0, g
col <- increment
loop
} # $char-loop
@ -78,6 +79,7 @@ fn dump in: (addr buffered-file) {
var c/eax: byte <- read-byte-buffered in
compare c, 0xffffffff # EOF marker
break-if-=
print-byte 0, c
var g/eax: grapheme <- copy c
print-grapheme 0, g
loop
}

View File

@ -42,7 +42,8 @@ $line-loop: {
compare c, 0xa # newline
break-if-= # no need to print newlines
# print c
print-byte 0, c
var g/eax: grapheme <- copy c
print-grapheme 0, g
col <- increment
loop
} # $char-loop
@ -89,6 +90,7 @@ fn dump in: (addr buffered-file) {
var c/eax: byte <- read-byte-buffered in
compare c, 0xffffffff # EOF marker
break-if-=
print-byte 0, c
var g/eax: grapheme <- copy c
print-grapheme 0, g
loop
}

View File

@ -46,7 +46,8 @@ $line-loop: {
compare c, 0xa # newline
break-if-= # no need to print newlines
# print c
print-byte 0, c
var g/eax: grapheme <- copy c
print-grapheme 0, g
col <- increment
loop
} # $char-loop
@ -94,6 +95,7 @@ fn dump in: (addr buffered-file) {
var c/eax: byte <- read-byte-buffered in
compare c, 0xffffffff # EOF marker
break-if-=
print-byte 0, c
var g/eax: grapheme <- copy c
print-grapheme 0, g
loop
}

View File

@ -62,7 +62,8 @@ $line-loop: {
compare c, 0xa # newline
break-if-= # no need to print newlines
# print c
print-byte 0, c
var g/eax: grapheme <- copy c
print-grapheme 0, g
col <- increment
loop
} # $char-loop
@ -110,6 +111,7 @@ fn dump in: (addr buffered-file) {
var c/eax: byte <- read-byte-buffered in
compare c, 0xffffffff # EOF marker
break-if-=
print-byte 0, c
var g/eax: grapheme <- copy c
print-grapheme 0, g
loop
}

View File

@ -70,7 +70,8 @@ $line-loop: {
compare c, 0xa # newline
break-if-= # no need to print newlines
# print c
print-byte 0, c
var g/eax: grapheme <- copy c
print-grapheme 0, g
col <- increment
loop
} # $char-loop
@ -147,6 +148,7 @@ fn dump in: (addr buffered-file) {
var c/eax: byte <- read-byte-buffered in
compare c, 0xffffffff # EOF marker
break-if-=
print-byte 0, c
var g/eax: grapheme <- copy c
print-grapheme 0, g
loop
}

3
prototypes/tile/2.mu generated
View File

@ -76,7 +76,8 @@ $render:render-loop: {
move-cursor 0, row, col
loop $render:render-loop
}
print-byte 0, c
var g/eax: grapheme <- copy c
print-grapheme 0, g
col <- increment
loop
}

3
prototypes/tile/3.mu generated
View File

@ -68,7 +68,8 @@ $render:render-loop: {
move-cursor 0, row, col
loop $render:render-loop
}
print-byte 0, c
var g/eax: grapheme <- copy c
print-grapheme 0, g
col <- increment
loop
}