render functions in MRU order
This commit is contained in:
parent
b22e6ebfe2
commit
542773df2f
21
512array.mu
21
512array.mu
|
@ -80,6 +80,27 @@ fn test-slide-down {
|
||||||
check-slide-down "0 1 2 3 0", 1/start 4/end, 2/target, "0 1 1 2 3", "F - test-slide-down/overlapping"
|
check-slide-down "0 1 2 3 0", 1/start 4/end, 2/target, "0 1 1 2 3", "F - test-slide-down/overlapping"
|
||||||
}
|
}
|
||||||
|
|
||||||
|
# Return the index that val is at.
|
||||||
|
# If not found, return len-1.
|
||||||
|
# That way the result is always a valid index to pass into slide-down.
|
||||||
|
fn find-slide-down-slot-in-array _a: (addr array int), _val: int -> _/ecx: int {
|
||||||
|
var a/esi: (addr array int) <- copy _a
|
||||||
|
var val/ebx: int <- copy _val
|
||||||
|
var max/edx: int <- length a
|
||||||
|
max <- decrement
|
||||||
|
var i/ecx: int <- copy 0
|
||||||
|
{
|
||||||
|
compare i, max
|
||||||
|
break-if->=
|
||||||
|
var curr/eax: (addr int) <- index a, i
|
||||||
|
compare *curr, val
|
||||||
|
break-if-=
|
||||||
|
i <- increment
|
||||||
|
loop
|
||||||
|
}
|
||||||
|
return i
|
||||||
|
}
|
||||||
|
|
||||||
# helpers for tests
|
# helpers for tests
|
||||||
fn check-slide-up before: (addr array byte), start: int, end: int, target: int, after: (addr array byte), msg: (addr array byte) {
|
fn check-slide-up before: (addr array byte), start: int, end: int, target: int, after: (addr array byte), msg: (addr array byte) {
|
||||||
var arr-h: (handle array int)
|
var arr-h: (handle array int)
|
||||||
|
|
|
@ -14,6 +14,7 @@ Entry:
|
||||||
bd/copy-to-ebp 0/imm32
|
bd/copy-to-ebp 0/imm32
|
||||||
#
|
#
|
||||||
#? (main 0 0 Primary-bus-secondary-drive)
|
#? (main 0 0 Primary-bus-secondary-drive)
|
||||||
|
#? (test-definition-in-environment)
|
||||||
# always first run tests
|
# always first run tests
|
||||||
(run-tests)
|
(run-tests)
|
||||||
(num-test-failures) # => eax
|
(num-test-failures) # => eax
|
||||||
|
|
|
@ -284,8 +284,12 @@ fn edit-environment _self: (addr environment), key: grapheme, data-disk: (addr d
|
||||||
var cursor-in-go-modal-a/eax: (addr boolean) <- get self, cursor-in-go-modal?
|
var cursor-in-go-modal-a/eax: (addr boolean) <- get self, cursor-in-go-modal?
|
||||||
copy-to *cursor-in-go-modal-a, 0/false
|
copy-to *cursor-in-go-modal-a, 0/false
|
||||||
# switch focus to global at index
|
# switch focus to global at index
|
||||||
var globals-cursor-index/eax: (addr int) <- get globals, cursor-index
|
#? set-cursor-position 0/screen, 0x20/x 0x20/y
|
||||||
copy-to *globals-cursor-index, index
|
#? draw-int32-decimal-wrapping-right-then-down-from-cursor-over-full-screen 0/screen, index, 7/fg 0/bg
|
||||||
|
bump-global globals, index
|
||||||
|
#? var cursor-index/ecx: int <- cursor-global globals
|
||||||
|
#? draw-int32-decimal-wrapping-right-then-down-from-cursor-over-full-screen 0/screen, cursor-index, 4/fg 0/bg
|
||||||
|
#? abort "a"
|
||||||
var cursor-in-globals-a/ecx: (addr boolean) <- get self, cursor-in-globals?
|
var cursor-in-globals-a/ecx: (addr boolean) <- get self, cursor-in-globals?
|
||||||
copy-to *cursor-in-globals-a, 1/true
|
copy-to *cursor-in-globals-a, 1/true
|
||||||
return
|
return
|
||||||
|
@ -329,8 +333,7 @@ fn edit-environment _self: (addr environment), key: grapheme, data-disk: (addr d
|
||||||
create-empty-global globals, name, 0x2000/default-gap-buffer-size=8KB
|
create-empty-global globals, name, 0x2000/default-gap-buffer-size=8KB
|
||||||
var globals-final-index/eax: (addr int) <- get globals, final-index
|
var globals-final-index/eax: (addr int) <- get globals, final-index
|
||||||
var new-index/ecx: int <- copy *globals-final-index
|
var new-index/ecx: int <- copy *globals-final-index
|
||||||
var globals-cursor-index/eax: (addr int) <- get globals, cursor-index
|
bump-global globals, new-index
|
||||||
copy-to *globals-cursor-index, new-index
|
|
||||||
var cursor-in-globals-a/ecx: (addr boolean) <- get self, cursor-in-globals?
|
var cursor-in-globals-a/ecx: (addr boolean) <- get self, cursor-in-globals?
|
||||||
copy-to *cursor-in-globals-a, 1/true
|
copy-to *cursor-in-globals-a, 1/true
|
||||||
return
|
return
|
||||||
|
@ -913,8 +916,7 @@ fn word-at-cursor _self: (addr environment), out: (addr stream byte) {
|
||||||
break-if-=
|
break-if-=
|
||||||
# cursor in some global editor
|
# cursor in some global editor
|
||||||
var globals/eax: (addr global-table) <- get self, globals
|
var globals/eax: (addr global-table) <- get self, globals
|
||||||
var cursor-index-addr/ecx: (addr int) <- get globals, cursor-index
|
var cursor-index/ecx: int <- cursor-global globals
|
||||||
var cursor-index/ecx: int <- copy *cursor-index-addr
|
|
||||||
var globals-data-ah/eax: (addr handle array global) <- get globals, data
|
var globals-data-ah/eax: (addr handle array global) <- get globals, data
|
||||||
var globals-data/eax: (addr array global) <- lookup *globals-data-ah
|
var globals-data/eax: (addr array global) <- lookup *globals-data-ah
|
||||||
var cursor-offset/ecx: (offset global) <- compute-offset globals-data, cursor-index
|
var cursor-offset/ecx: (offset global) <- compute-offset globals-data, cursor-index
|
||||||
|
|
101
shell/global.mu
101
shell/global.mu
|
@ -1,7 +1,8 @@
|
||||||
type global-table {
|
type global-table {
|
||||||
data: (handle array global)
|
data: (handle array global)
|
||||||
final-index: int
|
final-index: int
|
||||||
cursor-index: int
|
render-list: (handle array int) # sequence of globals to render on the left side
|
||||||
|
# no pagination or scrolling
|
||||||
}
|
}
|
||||||
|
|
||||||
type global {
|
type global {
|
||||||
|
@ -22,6 +23,8 @@ fn initialize-globals _self: (addr global-table) {
|
||||||
var data-ah/eax: (addr handle array global) <- get self, data
|
var data-ah/eax: (addr handle array global) <- get self, data
|
||||||
populate data-ah, 0x80
|
populate data-ah, 0x80
|
||||||
initialize-primitives self
|
initialize-primitives self
|
||||||
|
var render-ah/eax: (addr handle array int) <- get self, render-list
|
||||||
|
populate render-ah, 0x20/render-size
|
||||||
}
|
}
|
||||||
|
|
||||||
fn load-globals in: (addr handle cell), self: (addr global-table) {
|
fn load-globals in: (addr handle cell), self: (addr global-table) {
|
||||||
|
@ -124,27 +127,16 @@ fn render-globals screen: (addr screen), _self: (addr global-table), show-cursor
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
var data-ah/eax: (addr handle array global) <- get self, data
|
var data-ah/eax: (addr handle array global) <- get self, data
|
||||||
var data/eax: (addr array global) <- lookup *data-ah
|
var _data/eax: (addr array global) <- lookup *data-ah
|
||||||
var curr-index/edx: int <- copy 1
|
var data/ebx: (addr array global) <- copy _data
|
||||||
{
|
var curr-index/edx: int <- copy 0
|
||||||
var curr-offset/ebx: (offset global) <- compute-offset data, curr-index
|
|
||||||
var curr/ebx: (addr global) <- index data, curr-offset
|
|
||||||
var continue?/eax: boolean <- primitive-global? curr
|
|
||||||
compare continue?, 0/false
|
|
||||||
break-if-=
|
|
||||||
curr-index <- increment
|
|
||||||
loop
|
|
||||||
}
|
|
||||||
var lowest-index/edi: int <- copy curr-index
|
|
||||||
var cursor-index/edx: (addr int) <- get self, cursor-index
|
|
||||||
var curr-index/edx: int <- copy *cursor-index
|
|
||||||
var y1: int
|
var y1: int
|
||||||
copy-to y1, 1/padding-top
|
copy-to y1, 1/padding-top
|
||||||
var y2: int
|
var y2: int
|
||||||
copy-to y2, 1/padding-top
|
copy-to y2, 1/padding-top
|
||||||
$render-globals:loop: {
|
$render-globals:loop: {
|
||||||
compare curr-index, lowest-index
|
compare curr-index, 0x20/render-size
|
||||||
break-if-<
|
break-if->=
|
||||||
{
|
{
|
||||||
compare y1, 0x2f/ymax
|
compare y1, 0x2f/ymax
|
||||||
break-if-<
|
break-if-<
|
||||||
|
@ -157,13 +149,18 @@ fn render-globals screen: (addr screen), _self: (addr global-table), show-cursor
|
||||||
{
|
{
|
||||||
compare show-cursor?, 0/false
|
compare show-cursor?, 0/false
|
||||||
break-if-=
|
break-if-=
|
||||||
var cursor-index/eax: (addr int) <- get self, cursor-index
|
compare curr-index, 0
|
||||||
compare *cursor-index, curr-index
|
|
||||||
break-if-!=
|
break-if-!=
|
||||||
copy-to cursor-in-current-line?, 1/true
|
copy-to cursor-in-current-line?, 1/true
|
||||||
}
|
}
|
||||||
var curr-offset/edx: (offset global) <- compute-offset data, curr-index
|
var render-list-ah/eax: (addr handle array int) <- get self, render-list
|
||||||
var curr/edx: (addr global) <- index data, curr-offset
|
var render-list/eax: (addr array int) <- lookup *render-list-ah
|
||||||
|
var global-id-a/eax: (addr int) <- index render-list, curr-index
|
||||||
|
var global-id/eax: int <- copy *global-id-a
|
||||||
|
compare global-id, 0
|
||||||
|
break-if-= $render-globals:loop
|
||||||
|
var global-offset/edx: (offset global) <- compute-offset data, global-id
|
||||||
|
var curr/edx: (addr global) <- index data, global-offset
|
||||||
var curr-input-ah/eax: (addr handle gap-buffer) <- get curr, input
|
var curr-input-ah/eax: (addr handle gap-buffer) <- get curr, input
|
||||||
var _curr-input/eax: (addr gap-buffer) <- lookup *curr-input-ah
|
var _curr-input/eax: (addr gap-buffer) <- lookup *curr-input-ah
|
||||||
var curr-input/ebx: (addr gap-buffer) <- copy _curr-input
|
var curr-input/ebx: (addr gap-buffer) <- copy _curr-input
|
||||||
|
@ -192,7 +189,7 @@ fn render-globals screen: (addr screen), _self: (addr global-table), show-cursor
|
||||||
copy-to y2, y
|
copy-to y2, y
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
curr-index <- decrement
|
curr-index <- increment
|
||||||
loop
|
loop
|
||||||
}
|
}
|
||||||
# render primitives on top
|
# render primitives on top
|
||||||
|
@ -236,8 +233,12 @@ fn edit-globals _self: (addr global-table), key: grapheme {
|
||||||
refresh-cursor-definition self
|
refresh-cursor-definition self
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
var cursor-index-addr/ecx: (addr int) <- get self, cursor-index
|
var cursor-index/ecx: int <- cursor-global self
|
||||||
var cursor-index/ecx: int <- copy *cursor-index-addr
|
compare cursor-index, 0
|
||||||
|
{
|
||||||
|
break-if-!=
|
||||||
|
return
|
||||||
|
}
|
||||||
var data-ah/eax: (addr handle array global) <- get self, data
|
var data-ah/eax: (addr handle array global) <- get self, data
|
||||||
var data/eax: (addr array global) <- lookup *data-ah
|
var data/eax: (addr array global) <- lookup *data-ah
|
||||||
var cursor-offset/ecx: (offset global) <- compute-offset data, cursor-index
|
var cursor-offset/ecx: (offset global) <- compute-offset data, cursor-index
|
||||||
|
@ -251,9 +252,12 @@ fn create-empty-global _self: (addr global-table), name-stream: (addr stream byt
|
||||||
var self/esi: (addr global-table) <- copy _self
|
var self/esi: (addr global-table) <- copy _self
|
||||||
var final-index-addr/ecx: (addr int) <- get self, final-index
|
var final-index-addr/ecx: (addr int) <- get self, final-index
|
||||||
increment *final-index-addr
|
increment *final-index-addr
|
||||||
|
var render-list-ah/eax: (addr handle array int) <- get self, render-list
|
||||||
|
var render-list/eax: (addr array int) <- lookup *render-list-ah
|
||||||
|
slide-down render-list, 0/start 0x1f/penultimate, 1/target
|
||||||
var curr-index/ecx: int <- copy *final-index-addr
|
var curr-index/ecx: int <- copy *final-index-addr
|
||||||
var cursor-index-addr/eax: (addr int) <- get self, cursor-index
|
var dest/eax: (addr int) <- index render-list, 0
|
||||||
copy-to *cursor-index-addr, curr-index
|
copy-to *dest, curr-index
|
||||||
var data-ah/eax: (addr handle array global) <- get self, data
|
var data-ah/eax: (addr handle array global) <- get self, data
|
||||||
var data/eax: (addr array global) <- lookup *data-ah
|
var data/eax: (addr array global) <- lookup *data-ah
|
||||||
var curr-offset/ecx: (offset global) <- compute-offset data, curr-index
|
var curr-offset/ecx: (offset global) <- compute-offset data, curr-index
|
||||||
|
@ -272,7 +276,9 @@ fn create-empty-global _self: (addr global-table), name-stream: (addr stream byt
|
||||||
|
|
||||||
fn refresh-cursor-definition _self: (addr global-table) {
|
fn refresh-cursor-definition _self: (addr global-table) {
|
||||||
var self/esi: (addr global-table) <- copy _self
|
var self/esi: (addr global-table) <- copy _self
|
||||||
var cursor-index/edx: (addr int) <- get self, cursor-index
|
var render-list-ah/eax: (addr handle array int) <- get self, render-list
|
||||||
|
var render-list/eax: (addr array int) <- lookup *render-list-ah
|
||||||
|
var cursor-index/edx: (addr int) <- index render-list, 0
|
||||||
refresh-definition self, *cursor-index
|
refresh-definition self, *cursor-index
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -307,8 +313,11 @@ fn assign-or-create-global _self: (addr global-table), name: (addr array byte),
|
||||||
var final-index-addr/eax: (addr int) <- get self, final-index
|
var final-index-addr/eax: (addr int) <- get self, final-index
|
||||||
increment *final-index-addr
|
increment *final-index-addr
|
||||||
curr-index <- copy *final-index-addr
|
curr-index <- copy *final-index-addr
|
||||||
var cursor-index-addr/eax: (addr int) <- get self, cursor-index
|
var arr-ah/eax: (addr handle array int) <- get self, render-list
|
||||||
copy-to *cursor-index-addr, curr-index
|
var arr/eax: (addr array int) <- lookup *arr-ah
|
||||||
|
slide-down arr, 0/start 0x1e/penultimate, 1/target
|
||||||
|
var dest/eax: (addr int) <- index arr, 0
|
||||||
|
copy-to *dest, curr-index
|
||||||
}
|
}
|
||||||
var data-ah/eax: (addr handle array global) <- get self, data
|
var data-ah/eax: (addr handle array global) <- get self, data
|
||||||
var data/eax: (addr array global) <- lookup *data-ah
|
var data/eax: (addr array global) <- lookup *data-ah
|
||||||
|
@ -326,6 +335,30 @@ fn assign-or-create-global _self: (addr global-table), name: (addr array byte),
|
||||||
initialize-trace trace, 1/only-errors, 0x10/capacity, 0/visible
|
initialize-trace trace, 1/only-errors, 0x10/capacity, 0/visible
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fn bump-global _globals: (addr global-table), global-id: int {
|
||||||
|
var globals/esi: (addr global-table) <- copy _globals
|
||||||
|
var render-list-ah/eax: (addr handle array int) <- get globals, render-list
|
||||||
|
var render-list/eax: (addr array int) <- lookup *render-list-ah
|
||||||
|
var idx/ecx: int <- find-slide-down-slot-in-array render-list, global-id
|
||||||
|
{
|
||||||
|
compare idx, 0
|
||||||
|
break-if-!=
|
||||||
|
return
|
||||||
|
}
|
||||||
|
slide-down render-list, 0/start idx, 1/target
|
||||||
|
var dest/eax: (addr int) <- index render-list, 0
|
||||||
|
var val/ecx: int <- copy global-id
|
||||||
|
copy-to *dest, val
|
||||||
|
}
|
||||||
|
|
||||||
|
fn cursor-global _globals: (addr global-table) -> _/ecx: int {
|
||||||
|
var globals/esi: (addr global-table) <- copy _globals
|
||||||
|
var render-list-ah/eax: (addr handle array int) <- get globals, render-list
|
||||||
|
var render-list/eax: (addr array int) <- lookup *render-list-ah
|
||||||
|
var dest/eax: (addr int) <- index render-list, 0
|
||||||
|
return *dest
|
||||||
|
}
|
||||||
|
|
||||||
fn lookup-symbol-in-globals _sym: (addr cell), out: (addr handle cell), _globals: (addr global-table), trace: (addr trace), inner-screen-var: (addr handle cell), inner-keyboard-var: (addr handle cell) {
|
fn lookup-symbol-in-globals _sym: (addr cell), out: (addr handle cell), _globals: (addr global-table), trace: (addr trace), inner-screen-var: (addr handle cell), inner-keyboard-var: (addr handle cell) {
|
||||||
var sym/eax: (addr cell) <- copy _sym
|
var sym/eax: (addr cell) <- copy _sym
|
||||||
var sym-name-ah/eax: (addr handle stream byte) <- get sym, text-data
|
var sym-name-ah/eax: (addr handle stream byte) <- get sym, text-data
|
||||||
|
@ -568,13 +601,3 @@ fn load-lexical-scope in-ah: (addr handle gap-buffer), _globals: (addr global-ta
|
||||||
loop
|
loop
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
fn set-global-cursor-index _globals: (addr global-table), name-gap: (addr gap-buffer) {
|
|
||||||
var globals/esi: (addr global-table) <- copy _globals
|
|
||||||
var name-storage: (stream byte 0x40)
|
|
||||||
var name/ecx: (addr stream byte) <- address name-storage
|
|
||||||
emit-gap-buffer name-gap, name
|
|
||||||
var index/ecx: int <- find-symbol-in-globals globals, name
|
|
||||||
var dest/edi: (addr int) <- get globals, cursor-index
|
|
||||||
copy-to *dest, index
|
|
||||||
}
|
|
||||||
|
|
Loading…
Reference in New Issue