diff options
author | Kartik Agaram <vc@akkartik.com> | 2021-01-22 19:57:33 -0800 |
---|---|---|
committer | Kartik Agaram <vc@akkartik.com> | 2021-01-22 19:57:33 -0800 |
commit | 121a9eba56d62ef6bd9900bcd771647c0c58e718 (patch) | |
tree | 29b19ce63ea7f3e9c733ed847141189e452daf11 /baremetal | |
parent | c316a11ffa6fa184c9c62dc6fccbc0a6aa6c8f63 (diff) | |
download | mu-121a9eba56d62ef6bd9900bcd771647c0c58e718.tar.gz |
7540 - baremetal: cursor
I spent over a week agonizing over this. * I had to come to terms with the fact that I don't really know how to make pixel graphics testable. ASCII art on a pixel by pixel basis feels inhuman. Just focus on text mode for now. * I had to set aside the problem of non-English family languages. Languages like Arabic that can stack complex graphemes together likely can't be fixed-width. But I don't know enough at the moment to solve for them. * I spent a while trying to juggle two cursors, one invisible output cursor for tracking the most recent print, and one visible one that's just a hint to the user of what the next keystroke will do. But it looks like I can fold both into a single cursor. Drawing things updates the location of the cursor but doesn't display it. Explicitly moving the cursor displays it, but future drawing can overwrite the cursor.
Diffstat (limited to 'baremetal')
-rw-r--r-- | baremetal/103grapheme.subx | 24 | ||||
-rw-r--r-- | baremetal/mu-init.subx | 4 |
2 files changed, 19 insertions, 9 deletions
diff --git a/baremetal/103grapheme.subx b/baremetal/103grapheme.subx index 5b160bfe..97a44315 100644 --- a/baremetal/103grapheme.subx +++ b/baremetal/103grapheme.subx @@ -96,8 +96,8 @@ cursor-position-on-real-screen: # -> _/eax: int, _/ecx: int 55/push-ebp 89/<- %ebp 4/r32/esp # TODO: support fake screen; we currently assume 'screen' is always 0 (real) - 8b/-> *Default-next-x 0/r32/eax - 8b/-> *Default-next-y 1/r32/ecx + 8b/-> *Real-screen-cursor-x 0/r32/eax + 8b/-> *Real-screen-cursor-y 1/r32/ecx $cursor-position-on-real-screen:end: # . epilogue 89/<- %esp 5/r32/ebp @@ -110,11 +110,13 @@ set-cursor-position-on-real-screen: # x: int, y: int 89/<- %ebp 4/r32/esp # . save registers 50/push-eax + # + (draw-grapheme-on-real-screen 0x20 *(ebp+8) *(ebp+0xc) 0 7) # TODO: support fake screen; we currently assume 'screen' is always 0 (real) 8b/-> *(ebp+8) 0/r32/eax - 89/<- *Default-next-x 0/r32/eax + 89/<- *Real-screen-cursor-x 0/r32/eax 8b/-> *(ebp+0xc) 0/r32/eax - 89/<- *Default-next-y 0/r32/eax + 89/<- *Real-screen-cursor-y 0/r32/eax $set-cursor-position-on-real-screen:end: # . restore registers 58/pop-to-eax @@ -125,8 +127,16 @@ $set-cursor-position-on-real-screen:end: == data -Default-next-x: +# The cursor is where certain Mu functions (usually of the form +# 'draw*cursor*') print to by default. It becomes visible on +# set-cursor-position, but further drawing might overwrite it. +# We don't bother displaying the cursor when drawing text. It's up to +# applications to display the cursor before waiting for a key, and to ensure +# its location appropriately suggests the effect keystrokes will have. +# +# There's no low-level support for blinking, etc. We aren't using any +# hardware-supported text mode here. +Real-screen-cursor-x: 0/imm32 - -Default-next-y: +Real-screen-cursor-y: 0/imm32 diff --git a/baremetal/mu-init.subx b/baremetal/mu-init.subx index 0ed4f085..26b83451 100644 --- a/baremetal/mu-init.subx +++ b/baremetal/mu-init.subx @@ -16,8 +16,8 @@ bd/copy-to-ebp 0/imm32 3d/compare-eax-and 0/imm32 75/jump-if-!= break/disp8 (clear-real-screen) - c7 0/subop/copy *Default-next-x 0/imm32 - c7 0/subop/copy *Default-next-y 0/imm32 + c7 0/subop/copy *Real-screen-cursor-x 0/imm32 + c7 0/subop/copy *Real-screen-cursor-y 0/imm32 (main) } |