diff options
author | Kartik K. Agaram <vc@akkartik.com> | 2015-05-04 14:47:14 -0700 |
---|---|---|
committer | Kartik K. Agaram <vc@akkartik.com> | 2015-05-04 14:47:14 -0700 |
commit | e3092e7b5ca7fc8c87c891d4d6a1a53ea413072f (patch) | |
tree | 5c6c1d5887c14cf0515d7f7d56110fad418d9b9d /cpp/074keyboard.mu | |
parent | bbff2a35a9e4b70a8d02751a904bbf491ba0c12a (diff) | |
download | mu-e3092e7b5ca7fc8c87c891d4d6a1a53ea413072f.tar.gz |
1256 - scenarios now support keyboard
Diffstat (limited to 'cpp/074keyboard.mu')
-rw-r--r-- | cpp/074keyboard.mu | 53 |
1 files changed, 53 insertions, 0 deletions
diff --git a/cpp/074keyboard.mu b/cpp/074keyboard.mu new file mode 100644 index 00000000..9cea3d1f --- /dev/null +++ b/cpp/074keyboard.mu @@ -0,0 +1,53 @@ +# Wrappers around keyboard primitives that take a 'keyboard' object and are thus +# easier to test. + +container keyboard [ # can't think of another word like screen/display, so real and fake keyboards use the same name + index:integer + data:address:array:character +] + +recipe init-fake-keyboard [ + default-space:address:array:location <- new location:type, 30:literal + result:address:keyboard <- new keyboard:type + buf:address:address:array:character <- get-address result:address:keyboard/deref data:offset +#? $start-tracing #? 1 + buf:address:address:array:character/deref <- next-ingredient +#? $stop-tracing #? 1 + idx:address:integer <- get-address result:address:keyboard/deref index:offset + idx:address:integer/deref <- copy 0:literal + reply result:address:keyboard +] + +recipe read-key [ + default-space:address:array:location <- new location:type, 30:literal + x:address:keyboard <- next-ingredient + { + break-unless x:address:keyboard + idx:address:integer <- get-address x:address:keyboard/deref, index:offset + buf:address:array:character <- get x:address:keyboard/deref, data:offset + max:integer <- length buf:address:array:character/deref + { + done?:boolean <- greater-or-equal idx:address:integer/deref, max:integer + break-unless done?:boolean + reply 0:literal, 0:literal/done, x:address:keyboard/same-as-ingredient:0 + } + c:character <- index buf:address:array:character/deref, idx:address:integer/deref + idx:address:integer/deref <- add idx:address:integer/deref, 1:literal + reply c:character, 1:literal/found, x:address:keyboard/same-as-ingredient:0 + } + c:character, found?:boolean <- read-key-from-keyboard + reply c:character, found?:boolean, x:address:keyboard/same-as-ingredient:0 +] + +recipe wait-for-key [ + default-space:address:array:location <- new location:type, 30:literal + x:address:keyboard <- next-ingredient + { + break-unless x:address:keyboard + # on fake keyboards 'wait-for-key' behaves just like 'read-key' + c:character, x:address:keyboard <- read-key x:address:keyboard + reply c:character, x:address:keyboard/same-as-ingredient:0 + } + c:character <- wait-for-key-from-keyboard + reply c:character, x:address:keyboard/same-as-ingredient:0 +] |