:(scenarios run_mu_scenario)
:(scenario keyboard_in_scenario)
scenario keyboard-in-scenario [
assume-keyboard [abc]
run [
1:character, 2:boolean, keyboard:address <- read-key keyboard:address
3:character, 4:boolean, keyboard:address <- read-key keyboard:address
5:character, 6:boolean, keyboard:address <- read-key keyboard:address
7:character, 8:boolean, keyboard:address <- read-key keyboard:address
]
memory-should-contain [
1 <- 97
2 <- 1
3 <- 98
4 <- 1
5 <- 99
6 <- 1
7 <- 0
8 <- 1
]
]
:(before "End Scenario Globals")
const long long int KEYBOARD = Next_predefined_global_for_scenarios++;
:(before "End Predefined Scenario Locals In Run")
Name[tmp_recipe.at(0)]["keyboard"] = KEYBOARD;
:(before "End is_special_name Cases")
if (s == "keyboard") return true;
:(before "End Rewrite Instruction(curr)")
if (curr.name == "assume-keyboard") {
curr.operation = Recipe_number["new"];
assert(curr.products.empty());
curr.products.push_back(reagent("keyboard:address"));
curr.products.at(0).set_value(KEYBOARD);
result.steps.push_back(curr);
curr.clear();
curr.operation = Recipe_number["init-fake-keyboard"];
curr.name = "init-fake-keyboard";
assert(curr.ingredients.empty());
curr.ingredients.push_back(reagent("keyboard:address"));
curr.ingredients.at(0).set_value(KEYBOARD);
assert(curr.products.empty());
curr.products.push_back(reagent("keyboard:address"));
curr.products.at(0).set_value(KEYBOARD);
}
:(before "End Primitive Recipe Declarations")
REPLACE_IN_KEYBOARD,
:(before "End Primitive Recipe Numbers")
Recipe_number["replace-in-keyboard"] = REPLACE_IN_KEYBOARD;
:(before "End Primitive Recipe Implementations")
case REPLACE_IN_KEYBOARD: {
long long int size = Memory[KEYBOARD];
assert(scalar(ingredients.at(0)));
assert(scalar(ingredients.at(1)));
for (long long int curr = KEYBOARD+1; curr <= KEYBOARD+size; ++curr) {
if (Memory[curr] == ingredients.at(0).at(0)) {
Memory[curr] = ingredients.at(1).at(0);
}
}
break;
}