commit 478e5216c3e15d2ac9c33bc5a7f43a912f3a1a7d
parent 89c4face0f0a6aaf827bfd147e71446b77c1fc57
Author: evenfri <evenfri256@gmail.com>
Date: Fri, 21 Aug 2026 21:41:23 +0800
feat: executing instructions, registers, load program from binary, update ui, documentation
Diffstat:
12 files changed, 858 insertions(+), 324 deletions(-)
diff --git a/altair.bin b/altair.bin
@@ -0,0 +1 @@
+>Gv
+\ No newline at end of file
diff --git a/computer_interface.cs b/computer_interface.cs
@@ -4,18 +4,26 @@ using static emulator;
public partial class computer_interface : Node {
-[Export] public Button[] button_bits;
-[Export] public Button[] button_memory_bits;
+const int INDEXES_BUTTON_DATA = 7;
+const int INDEXES_BUTTON_ADDR = 15;
+
+[Export] public Button[] buttons;
[Export] public Sprite2D[] lamp_current_instruction;
[Export] public Sprite2D[] lamp_addr;
[Export] public Color lamp_on = Colors.Red;
[Export] public Color lamp_off = Colors.DarkGray;
-[Export] public Button button_execute;
-[Export] public Button button_write_byte;
-[Export] public Button button_jmp_memory;
+[Export] public Button button_off_on;
+[Export] public Button button_stop;
+[Export] public Button button_run;
+[Export] public Button button_single_step;
[Export] public Button button_examine;
+[Export] public Button button_examine_next;
+[Export] public Button button_deposit;
+[Export] public Button button_deposit_next;
+[Export] public Button button_reset;
+[Export] public Button button_clear;
IntPtr _emu;
ushort curr_addr;
@@ -24,14 +32,29 @@ bool worked = false;
public override void _Ready() {
_emu = emu_create();
-
- button_execute.Pressed += execute;
- button_write_byte.Pressed += write_byte;
- button_jmp_memory.Pressed += jmp_memory;
- button_examine.Pressed += examine;
-
- for (int i = 0; i < 16; i++) {
- button_memory_bits[i].Pressed += memory_pressed;
+ /*
+ int r = emu_load_program(_emu, "altair.bin");
+ if (r != 0) {
+ GD.Print("error to load program: altair.bin");
+ }
+ */
+
+ if (button_run != null) button_run.Pressed += run_pressed;
+ if (button_stop != null) button_stop.Pressed += stop_pressed;
+ if (button_single_step != null) button_single_step.Pressed += single_step_pressed;
+ if (button_examine != null) button_examine.Pressed += examine_pressed;
+ if (button_examine_next != null) button_examine_next.Pressed += examine_next_pressed;
+ if (button_deposit != null) button_deposit.Pressed += deposit_pressed;
+ if (button_deposit_next != null) button_deposit_next.Pressed += deposit_next_pressed;
+ if (button_reset != null) button_reset.Pressed += reset_pressed;
+ if (button_clear != null) button_clear.Pressed += clear_pressed;
+
+ if (buttons != null) {
+ for (int i = 0; i < buttons.Length; i++) {
+ if (buttons[i] != null) {
+ buttons[i].Pressed += bit_button_pressed;
+ }
+ }
}
update_lamps();
@@ -45,59 +68,115 @@ public override void _Notification(int what) {
public override void _Process(double delta) {
if (!worked) return;
+
int r = emu_step(_emu);
if (r > 0) {
worked = false;
+ return;
}
- GD.Print($"pc: {emu_get_pc(_emu)}");
+ curr_addr = (ushort)emu_get_pc(_emu);
+ curr_instr = emu_mem_read(_emu, curr_addr);
+
+ update_lamps();
+
+ byte reg_a = emu_get_reg(_emu, 0b111);
+ byte reg_b = emu_get_reg(_emu, 0b000);
+ byte reg_c = emu_get_reg(_emu, 0b001);
+ byte reg_d = emu_get_reg(_emu, 0b010);
+ GD.Print($"opcode=0x{curr_instr:X2}; pc=0x{curr_addr:X4}; a=0x{reg_a:X2}; b=0x{reg_b:X2}; c=0x{reg_c:X2}; d=0x{reg_d:X2}");
}
void update_lamps() {
- update_data_lamps(curr_instr);
- update_addr_lamps(curr_addr);
+ update_data_lamps(curr_instr);
+ update_addr_lamps(curr_addr);
}
-void memory_pressed() {
- byte b0 = assem_byte(button_memory_bits, 0);
- byte b1 = assem_byte(button_memory_bits, 8);
- curr_addr = (ushort)((b1 << 8) | b0);
+ushort read_switches_addr() {
+ byte b0 = assem_byte(buttons, 0, 8);
+ byte b1 = assem_byte(buttons, 8, 8);
+ return (ushort)((b1 << 8) | b0);
+}
+
+byte read_switches_data() {
+ return assem_byte(buttons, 0, INDEXES_BUTTON_DATA + 1);
+}
+void bit_button_pressed() {
update_lamps();
}
-void execute() {
+void run_pressed() {
worked = true;
+}
- emu_set_pc(_emu, 0);
+void stop_pressed() {
+ worked = false;
}
-void write_byte() {
- byte b = assem_byte(button_bits, 0);
+void single_step_pressed() {
+ worked = false;
+ emu_step(_emu);
+ curr_addr = (ushort)emu_get_pc(_emu);
+ curr_instr = emu_mem_read(_emu, curr_addr);
+ update_lamps();
+}
- curr_instr = b;
- emu_mem_write(_emu, curr_addr, b);
- curr_addr++;
+void examine_pressed() {
+ worked = false;
+ curr_addr = read_switches_addr();
+ emu_set_pc(_emu, curr_addr);
+ curr_instr = emu_mem_read(_emu, curr_addr);
+ update_lamps();
+
+ GD.Print($"Examine at 0x{curr_addr:X4}: 0x{curr_instr:X2}");
+}
+
+void examine_next_pressed() {
+ worked = false;
+ curr_addr++;
+ emu_set_pc(_emu, curr_addr);
+ curr_instr = emu_mem_read(_emu, curr_addr);
+ update_lamps();
+
+ GD.Print($"Examine Next at 0x{curr_addr:X4}: 0x{curr_instr:X2}");
+}
+
+void deposit_pressed() {
+ worked = false;
+ byte val = read_switches_data();
+
+ emu_mem_write(_emu, curr_addr, val);
+ curr_instr = val;
update_lamps();
- GD.Print($"write byte 0x{b:x2} by 0x{curr_addr:x4}");
+ GD.Print($"Deposit 0x{val:X2} at 0x{curr_addr:X4}");
}
-void jmp_memory() {
- byte b0 = assem_byte(button_memory_bits, 0);
- byte b1 = assem_byte(button_memory_bits, 8);
+void deposit_next_pressed() {
+ worked = false;
+
+ curr_addr++;
+ emu_set_pc(_emu, curr_addr);
+
+ byte val = read_switches_data();
+ emu_mem_write(_emu, curr_addr, val);
+ curr_instr = val;
+ update_lamps();
- ushort r = (ushort)((b1 << 8) | b0);
- curr_addr = r;
-
- GD.Print($"jump to 0x{curr_addr:x4}");
+ GD.Print($"Deposit Next 0x{val:X2} at 0x{curr_addr:X4}");
}
-void examine() {
+void reset_pressed() {
+ worked = false;
+ emu_set_pc(_emu, 0);
+ curr_addr = 0;
curr_instr = emu_mem_read(_emu, curr_addr);
- update_lamps();
+ update_lamps();
+}
- GD.Print($"read byte 0x{curr_instr:x2} by 0x{curr_addr:x4}");
+void clear_pressed() {
+ update_lamps();
}
void update_data_lamps(byte value) {
@@ -114,10 +193,13 @@ void update_addr_lamps(ushort value) {
}
}
-byte assem_byte(Button[] buttons, int offset) {
+byte assem_byte(Button[] btns, int offset, int count = 8) {
byte r = 0;
- for (int i = 0; i < 8; i++) {
- if (buttons[offset + i].ButtonPressed) {
+ if (btns == null) return r;
+
+ for (int i = 0; i < count && i < 8; i++) {
+ int index = offset + i;
+ if (index < btns.Length && btns[index] != null && btns[index].ButtonPressed) {
r |= (byte)(1 << i);
}
}
diff --git a/emulator.cs b/emulator.cs
@@ -9,6 +9,9 @@ const string lib_name = "emulator/emu.so";
public static extern IntPtr emu_create();
[DllImport(lib_name, CallingConvention = CallingConvention.Cdecl)]
+public static extern int emu_load_program(IntPtr emu, [MarshalAs(UnmanagedType.LPStr)] string filename);
+
+[DllImport(lib_name, CallingConvention = CallingConvention.Cdecl)]
public static extern void emu_destroy(IntPtr emu);
[DllImport(lib_name, CallingConvention = CallingConvention.Cdecl)]
@@ -21,9 +24,12 @@ public static extern void emu_set_pc(IntPtr emu, int pc);
public static extern int emu_step(IntPtr emu);
[DllImport(lib_name, CallingConvention = CallingConvention.Cdecl)]
-public static extern void emu_mem_write(IntPtr emu, int addr, byte val);
+public static extern void emu_mem_write(IntPtr emu, ushort addr, byte val);
+
+[DllImport(lib_name, CallingConvention = CallingConvention.Cdecl)]
+public static extern byte emu_mem_read(IntPtr emu, ushort addr);
[DllImport(lib_name, CallingConvention = CallingConvention.Cdecl)]
-public static extern byte emu_mem_read(IntPtr emu, int addr);
+public static extern byte emu_get_reg(IntPtr emu, byte c);
}
\ No newline at end of file
diff --git a/emulator/build.sh b/emulator/build.sh
@@ -1,3 +1,3 @@
#!/bin/sh
-gcc -shared -fPIC -o emu.so main.c
+gcc -Wall -Wextra -shared -fPIC -o emu.so main.c
+\ No newline at end of file
diff --git a/emulator/emu.h b/emulator/emu.h
@@ -1,18 +1,50 @@
#ifndef emu_h
#define emu_h
+#include <stdlib.h>
#include <stdint.h>
+#include <string.h>
+#include <stdio.h>
-#define EXPORT
+#define reg_a 0b111
+#define reg_b 0b000
+#define reg_c 0b001
+#define reg_d 0b010
+#define reg_e 0b011
+#define reg_h 0b100
+#define reg_l 0b101
+#define reg_m 0b110
+
+#define op_n 0b00
+#define op_mv 0b01
+#define op_sum_a 0b10
+#define op_jmp 0b11
+
+#if defined(__GNUC__) || defined(__clang__)
+ #define EXPORT __attribute__((visibility("default")))
+#else
+ #define EXPORT
+#endif
typedef struct emulator emulator;
+typedef unsigned char byte;
+
+#ifdef __cplusplus
+extern "C" {
+#endif
EXPORT emulator* emu_create(void);
+EXPORT int emu_load_program(emulator *e, const char *filename);
EXPORT void emu_destroy(emulator *e);
EXPORT int emu_step(emulator *e);
-EXPORT void emu_mem_write(emulator *e, uint16_t addr, unsigned char val);
-EXPORT unsigned char emu_mem_read(emulator *e, uint16_t addr);
+EXPORT void emu_mem_write(emulator *e, uint16_t addr, byte val);
+EXPORT byte emu_mem_read(emulator *e, uint16_t addr);
EXPORT int emu_get_pc(emulator *e);
EXPORT void emu_set_pc(emulator *e, int pc);
+EXPORT byte emu_get_reg(emulator *e, byte c);
+
+#ifdef __cplusplus
+}
+#endif
#endif /* emu_h */
\ No newline at end of file
diff --git a/emulator/emu.so b/emulator/emu.so
Binary files differ.
diff --git a/emulator/main.c b/emulator/main.c
@@ -1,21 +1,55 @@
-#include <stdlib.h>
-#include <stdint.h>
-#include <string.h>
#include "emu.h"
-#define op_hlt 0x00
-
struct emulator {
- unsigned char memory[65536];
+ byte memory[65536];
+ byte a;
+ byte b;
+ byte c;
+ byte d;
+ byte e;
+ byte h;
+ byte l;
int pc;
};
+static void set_reg(emulator *e, byte c, byte val) {
+ switch (c) {
+ case reg_a: e->a = val; break;
+ case reg_b: e->b = val; break;
+ case reg_c: e->c = val; break;
+ case reg_d: e->d = val; break;
+ case reg_e: e->e = val; break;
+ case reg_h: e->h = val; break;
+ case reg_l: e->l = val; break;
+ case reg_m:
+ {
+ uint16_t hl = ((uint16_t)e->h << 8) | e->l;
+ e->memory[hl] = val;
+ break;
+ }
+ }
+}
+
emulator* emu_create(void) {
emulator* e = malloc(sizeof(emulator));
memset(e, 0, sizeof(emulator));
return e;
}
+int emu_load_program(emulator *e, const char *filename) {
+ FILE *f = fopen(filename, "rb");
+ if (!f) return 1;
+
+ size_t bytes_read = fread(e->memory, 1, sizeof(e->memory), f);
+
+ fclose(f);
+ if (bytes_read == 0) {
+ return 1;
+ }
+ e->pc = 0;
+ return 0;
+}
+
void emu_destroy(emulator *e) { free(e); }
int emu_get_pc(emulator *e) {
@@ -27,20 +61,65 @@ void emu_set_pc(emulator *e, int pc) {
}
int emu_step(emulator *e) {
- unsigned int instr = e->memory[e->pc];
+ byte instr = e->memory[e->pc];
- if (instr == op_hlt) {
- return 1;
+ /* parse instr */
+ byte part1 = (instr >> 6) & 0x03; /* 0b[00]000000 */
+ byte dst = (instr >> 3) & 0x07; /* 0b00[000]000 */
+ byte src = instr & 0x07; /* 0b00000[000] */
+
+ switch (part1) {
+ case op_mv:
+ /* instr = 0b01110110 hlt */
+ if (dst == reg_m && src == reg_m) {
+ return 1;
+ }
+ set_reg(e, dst, emu_get_reg(e, src));
+ e->pc++;
+ break;
+ case op_n:
+ if (src == 0b110) {
+ set_reg(e, dst, e->memory[e->pc+1]);
+ e->pc += 2;
+ } else {
+ e->pc++;
+ }
+ break;
+ case op_sum_a:
+ e->pc++;
+ break;
+ case op_jmp:
+ e->pc++;
+ break;
+ default:
+ return 1;
}
- e->pc++;
return 0;
}
-void emu_mem_write(emulator *e, uint16_t addr, unsigned char val) {
+void emu_mem_write(emulator *e, uint16_t addr, byte val) {
e->memory[addr] = val;
}
-unsigned char emu_mem_read(emulator *e, uint16_t addr) {
+byte emu_mem_read(emulator *e, uint16_t addr) {
return e->memory[addr];
-}
-\ No newline at end of file
+}
+
+byte emu_get_reg(emulator *e, byte c) {
+ switch (c) {
+ case reg_a: return e->a;
+ case reg_b: return e->b;
+ case reg_c: return e->c;
+ case reg_d: return e->d;
+ case reg_e: return e->e;
+ case reg_h: return e->h;
+ case reg_l: return e->l;
+ case reg_m:
+ {
+ uint16_t hl = ((uint16_t)e->h << 8) | e->l;
+ return e->memory[hl];
+ }
+ default: return 0;
+ }
+}
diff --git a/main.tscn b/main.tscn
@@ -3,371 +3,629 @@
[ext_resource type="Texture2D" uid="uid://osbck513ghe3" path="res://computer.png" id="1_ig7tw"]
[ext_resource type="Script" uid="uid://cgdypxcbuexde" path="res://computer_interface.cs" id="2_0xm2m"]
[ext_resource type="Texture2D" uid="uid://bb5mof51kodyv" path="res://lamp.png" id="3_h2yge"]
+[ext_resource type="Texture2D" uid="uid://blxdcjt4qu82c" path="res://paper.png" id="4_1bvp3"]
+[ext_resource type="Script" uid="uid://b6lty8spdabbf" path="res://paper_list.cs" id="4_lquwl"]
+
+[sub_resource type="LabelSettings" id="LabelSettings_7mycd"]
+font_size = 8
+
+[sub_resource type="LabelSettings" id="LabelSettings_272bh"]
+font_size = 8
+
+[sub_resource type="LabelSettings" id="LabelSettings_5vw27"]
+line_spacing = -8.0
+font_size = 9
+
+[sub_resource type="LabelSettings" id="LabelSettings_1bvp3"]
+line_spacing = -8.0
+font_size = 9
+
+[sub_resource type="LabelSettings" id="LabelSettings_h2yge"]
+line_spacing = -4.0
+font_size = 8
+
+[sub_resource type="LabelSettings" id="LabelSettings_lquwl"]
+line_spacing = -4.0
+font_size = 8
+
+[sub_resource type="LabelSettings" id="LabelSettings_xpk6w"]
+line_spacing = 0.0
+font_size = 8
+
+[sub_resource type="LabelSettings" id="LabelSettings_kek77"]
+line_spacing = 0.0
+font_size = 8
+
+[sub_resource type="FontFile" id="FontFile_272bh"]
+cache/0/variation_coordinates = {}
+cache/0/face_index = 0
+cache/0/embolden = 0.0
+cache/0/transform = Transform2D(1, 0, 0, 1, 0, 0)
+cache/0/spacing_top = 0
+cache/0/spacing_bottom = 0
+cache/0/spacing_space = 0
+cache/0/spacing_glyph = 0
+cache/0/baseline_offset = 0.0
+cache/0/16/0/ascent = 0.0
+cache/0/16/0/descent = 0.0
+cache/0/16/0/underline_position = 0.0
+cache/0/16/0/underline_thickness = 0.0
+cache/0/16/0/scale = 1.0
+cache/0/8/0/ascent = 0.0
+cache/0/8/0/descent = 0.0
+cache/0/8/0/underline_position = 0.0
+cache/0/8/0/underline_thickness = 0.0
+cache/0/8/0/scale = 1.0
+
+[sub_resource type="LabelSettings" id="LabelSettings_a5vro"]
+line_spacing = 0.0
+font = SubResource("FontFile_272bh")
+font_size = 8
+font_color = Color(0, 0, 0, 1)
+
+[sub_resource type="RectangleShape2D" id="RectangleShape2D_a5vro"]
+size = Vector2(206, 590)
[node name="main" type="Node2D" unique_id=1804574269]
[node name="cam" type="Camera2D" parent="." unique_id=1611617563]
zoom = Vector2(1.5, 1.5)
-[node name="computer" type="Sprite2D" parent="." unique_id=1267147980 node_paths=PackedStringArray("button_bits", "button_memory_bits", "lamp_current_instruction", "lamp_addr", "button_execute", "button_write_byte", "button_jmp_memory", "button_examine")]
+[node name="computer" type="Sprite2D" parent="." unique_id=1267147980 node_paths=PackedStringArray("buttons", "lamp_current_instruction", "lamp_addr", "button_off_on", "button_stop", "button_run", "button_single_step", "button_examine", "button_examine_next", "button_deposit", "button_deposit_next", "button_reset", "button_clear")]
position = Vector2(-355, -141)
texture = ExtResource("1_ig7tw")
centered = false
script = ExtResource("2_0xm2m")
-button_bits = [NodePath("data/buttons/bit-0"), NodePath("data/buttons/bit-1"), NodePath("data/buttons/bit-2"), NodePath("data/buttons/bit-3"), NodePath("data/buttons/bit-4"), NodePath("data/buttons/bit-5"), NodePath("data/buttons/bit-6"), NodePath("data/buttons/bit-7")]
-button_memory_bits = [NodePath("addr/buttons/bit-0"), NodePath("addr/buttons/bit-1"), NodePath("addr/buttons/bit-2"), NodePath("addr/buttons/bit-3"), NodePath("addr/buttons/bit-4"), NodePath("addr/buttons/bit-5"), NodePath("addr/buttons/bit-6"), NodePath("addr/buttons/bit-7"), NodePath("addr/buttons/bit-8"), NodePath("addr/buttons/bit-9"), NodePath("addr/buttons/bit-10"), NodePath("addr/buttons/bit-11"), NodePath("addr/buttons/bit-12"), NodePath("addr/buttons/bit-13"), NodePath("addr/buttons/bit-14"), NodePath("addr/buttons/bit-15")]
-lamp_current_instruction = [NodePath("data/lamps/lamp"), NodePath("data/lamps/lamp2"), NodePath("data/lamps/lamp3"), NodePath("data/lamps/lamp4"), NodePath("data/lamps/lamp5"), NodePath("data/lamps/lamp6"), NodePath("data/lamps/lamp7"), NodePath("data/lamps/lamp8")]
-lamp_addr = [NodePath("addr/lamps/lamp"), NodePath("addr/lamps/lamp2"), NodePath("addr/lamps/lamp3"), NodePath("addr/lamps/lamp4"), NodePath("addr/lamps/lamp5"), NodePath("addr/lamps/lamp6"), NodePath("addr/lamps/lamp7"), NodePath("addr/lamps/lamp8"), NodePath("addr/lamps/lamp9"), NodePath("addr/lamps/lamp10"), NodePath("addr/lamps/lamp11"), NodePath("addr/lamps/lamp12"), NodePath("addr/lamps/lamp13"), NodePath("addr/lamps/lamp14"), NodePath("addr/lamps/lamp15"), NodePath("addr/lamps/lamp16")]
-button_execute = NodePath("execute")
-button_write_byte = NodePath("data/buttons/write")
-button_jmp_memory = NodePath("addr/buttons/jmp")
-button_examine = NodePath("data/lamps/examine")
-
-[node name="data" type="Node2D" parent="computer" unique_id=750574758]
-position = Vector2(352, 173)
-
-[node name="buttons" type="Node2D" parent="computer/data" unique_id=969809626]
-position = Vector2(-95, 39)
-
-[node name="bit-0" type="CheckButton" parent="computer/data/buttons" unique_id=928947275]
-offset_right = 44.0
-offset_bottom = 24.0
-rotation = 4.712389
+buttons = [NodePath("buttons/0"), NodePath("buttons/1"), NodePath("buttons/2"), NodePath("buttons/3"), NodePath("buttons/4"), NodePath("buttons/5"), NodePath("buttons/6"), NodePath("buttons/7"), NodePath("buttons/8"), NodePath("buttons/9"), NodePath("buttons/10"), NodePath("buttons/11"), NodePath("buttons/12"), NodePath("buttons/13"), NodePath("buttons/14"), NodePath("buttons/15")]
+lamp_current_instruction = [NodePath("lamps_data/0"), NodePath("lamps_data/1"), NodePath("lamps_data/2"), NodePath("lamps_data/3"), NodePath("lamps_data/4"), NodePath("lamps_data/5"), NodePath("lamps_data/6"), NodePath("lamps_data/7")]
+lamp_addr = [NodePath("lamps_addr/0"), NodePath("lamps_addr/1"), NodePath("lamps_addr/2"), NodePath("lamps_addr/3"), NodePath("lamps_addr/4"), NodePath("lamps_addr/5"), NodePath("lamps_addr/6"), NodePath("lamps_addr/7"), NodePath("lamps_addr/8"), NodePath("lamps_addr/9"), NodePath("lamps_addr/10"), NodePath("lamps_addr/11"), NodePath("lamps_addr/12"), NodePath("lamps_addr/13"), NodePath("lamps_addr/14"), NodePath("lamps_addr/15")]
+button_off_on = NodePath("control/on_off")
+button_stop = NodePath("control/stop")
+button_run = NodePath("control/run")
+button_single_step = NodePath("control/s_step")
+button_examine = NodePath("control/examine")
+button_examine_next = NodePath("control/examine_n")
+button_deposit = NodePath("control/deposit")
+button_deposit_next = NodePath("control/deposit_n")
+button_reset = NodePath("control/reset")
+button_clear = NodePath("control/clr")
+
+[node name="lamps_data" type="Node2D" parent="computer" unique_id=2113274042]
+position = Vector2(274, 51)
+
+[node name="0" type="Sprite2D" parent="computer/lamps_data" unique_id=208655575]
+position = Vector2(261, 8)
+scale = Vector2(0.25, 0.25)
+texture = ExtResource("3_h2yge")
-[node name="bit-1" type="CheckButton" parent="computer/data/buttons" unique_id=1497880795]
-offset_left = 24.0
-offset_right = 68.0
-offset_bottom = 24.0
-rotation = 4.712389
+[node name="1" type="Sprite2D" parent="computer/lamps_data" unique_id=1215730673]
+position = Vector2(237, 8)
+scale = Vector2(0.25, 0.25)
+texture = ExtResource("3_h2yge")
-[node name="bit-2" type="CheckButton" parent="computer/data/buttons" unique_id=1937568649]
-offset_left = 48.0
-offset_right = 92.0
-offset_bottom = 24.0
-rotation = 4.712389
+[node name="2" type="Sprite2D" parent="computer/lamps_data" unique_id=930259770]
+position = Vector2(213, 8)
+scale = Vector2(0.25, 0.25)
+texture = ExtResource("3_h2yge")
-[node name="bit-3" type="CheckButton" parent="computer/data/buttons" unique_id=789265495]
-offset_left = 72.0
-offset_right = 116.0
-offset_bottom = 24.0
-rotation = 4.712389
+[node name="3" type="Sprite2D" parent="computer/lamps_data" unique_id=519104149]
+position = Vector2(189, 8)
+scale = Vector2(0.25, 0.25)
+texture = ExtResource("3_h2yge")
-[node name="bit-4" type="CheckButton" parent="computer/data/buttons" unique_id=833821743]
-offset_left = 96.0
-offset_right = 140.0
-offset_bottom = 24.0
-rotation = 4.712389
+[node name="4" type="Sprite2D" parent="computer/lamps_data" unique_id=243385059]
+position = Vector2(165, 8)
+scale = Vector2(0.25, 0.25)
+texture = ExtResource("3_h2yge")
-[node name="bit-5" type="CheckButton" parent="computer/data/buttons" unique_id=1557534661]
-offset_left = 120.0
-offset_right = 164.0
-offset_bottom = 24.0
-rotation = 4.712389
+[node name="5" type="Sprite2D" parent="computer/lamps_data" unique_id=981124598]
+position = Vector2(141, 8)
+scale = Vector2(0.25, 0.25)
+texture = ExtResource("3_h2yge")
-[node name="bit-6" type="CheckButton" parent="computer/data/buttons" unique_id=1615780657]
-offset_left = 144.0
-offset_right = 188.0
-offset_bottom = 24.0
-rotation = 4.712389
+[node name="6" type="Sprite2D" parent="computer/lamps_data" unique_id=221933103]
+position = Vector2(117, 8)
+scale = Vector2(0.25, 0.25)
+texture = ExtResource("3_h2yge")
-[node name="bit-7" type="CheckButton" parent="computer/data/buttons" unique_id=787642520]
-offset_left = 168.0
-offset_right = 212.0
-offset_bottom = 24.0
-rotation = 4.712389
+[node name="7" type="Sprite2D" parent="computer/lamps_data" unique_id=1641223163]
+position = Vector2(93, 8)
+scale = Vector2(0.25, 0.25)
+texture = ExtResource("3_h2yge")
-[node name="write" type="Button" parent="computer/data/buttons" unique_id=5392396]
-offset_left = 192.0
-offset_top = -42.0
-offset_right = 208.0
-offset_bottom = -26.0
+[node name="lamps_addr" type="Node2D" parent="computer" unique_id=1734725300]
+position = Vector2(274, 76)
-[node name="text" type="Label" parent="computer/data/buttons/write" unique_id=917668259]
-layout_mode = 0
-offset_left = 18.0
-offset_top = -6.0
-offset_right = 58.0
-offset_bottom = 17.0
-text = "write"
+[node name="0" type="Sprite2D" parent="computer/lamps_addr" unique_id=1911411271]
+position = Vector2(261, 8)
+scale = Vector2(0.25, 0.25)
+texture = ExtResource("3_h2yge")
-[node name="lamps" type="Node2D" parent="computer/data" unique_id=1993962898]
-position = Vector2(0, -22)
+[node name="1" type="Sprite2D" parent="computer/lamps_addr" unique_id=2009264748]
+position = Vector2(237, 8)
+scale = Vector2(0.25, 0.25)
+texture = ExtResource("3_h2yge")
-[node name="lamp" type="Sprite2D" parent="computer/data/lamps" unique_id=691408274]
-position = Vector2(-84, 8)
+[node name="2" type="Sprite2D" parent="computer/lamps_addr" unique_id=307082814]
+position = Vector2(213, 8)
scale = Vector2(0.25, 0.25)
texture = ExtResource("3_h2yge")
-[node name="lamp2" type="Sprite2D" parent="computer/data/lamps" unique_id=1393453519]
-position = Vector2(-60, 8)
+[node name="3" type="Sprite2D" parent="computer/lamps_addr" unique_id=339122357]
+position = Vector2(189, 8)
scale = Vector2(0.25, 0.25)
texture = ExtResource("3_h2yge")
-[node name="lamp3" type="Sprite2D" parent="computer/data/lamps" unique_id=1888166272]
-position = Vector2(-36, 8)
+[node name="4" type="Sprite2D" parent="computer/lamps_addr" unique_id=1864714391]
+position = Vector2(165, 8)
scale = Vector2(0.25, 0.25)
texture = ExtResource("3_h2yge")
-[node name="lamp4" type="Sprite2D" parent="computer/data/lamps" unique_id=1421031255]
-position = Vector2(-11, 8)
+[node name="5" type="Sprite2D" parent="computer/lamps_addr" unique_id=140769146]
+position = Vector2(141, 8)
scale = Vector2(0.25, 0.25)
texture = ExtResource("3_h2yge")
-[node name="lamp5" type="Sprite2D" parent="computer/data/lamps" unique_id=1492744603]
-position = Vector2(12, 8)
+[node name="6" type="Sprite2D" parent="computer/lamps_addr" unique_id=1138734365]
+position = Vector2(117, 8)
scale = Vector2(0.25, 0.25)
texture = ExtResource("3_h2yge")
-[node name="lamp6" type="Sprite2D" parent="computer/data/lamps" unique_id=605179344]
-position = Vector2(37, 8)
+[node name="7" type="Sprite2D" parent="computer/lamps_addr" unique_id=1284145815]
+position = Vector2(93, 8)
scale = Vector2(0.25, 0.25)
texture = ExtResource("3_h2yge")
-[node name="lamp7" type="Sprite2D" parent="computer/data/lamps" unique_id=1033917715]
-position = Vector2(61, 8)
+[node name="8" type="Sprite2D" parent="computer/lamps_addr" unique_id=1370430321]
+position = Vector2(69, 8)
scale = Vector2(0.25, 0.25)
texture = ExtResource("3_h2yge")
-[node name="lamp8" type="Sprite2D" parent="computer/data/lamps" unique_id=2000831074]
-position = Vector2(85, 7)
+[node name="9" type="Sprite2D" parent="computer/lamps_addr" unique_id=1368353718]
+position = Vector2(45, 8)
scale = Vector2(0.25, 0.25)
texture = ExtResource("3_h2yge")
-[node name="examine" type="Button" parent="computer/data/lamps" unique_id=1814681530]
-offset_left = 97.0
-offset_right = 113.0
-offset_bottom = 16.0
+[node name="10" type="Sprite2D" parent="computer/lamps_addr" unique_id=95336119]
+position = Vector2(21, 8)
+scale = Vector2(0.25, 0.25)
+texture = ExtResource("3_h2yge")
-[node name="text" type="Label" parent="computer/data/lamps/examine" unique_id=1029160794]
-layout_mode = 0
-offset_left = 18.0
-offset_top = -5.0
-offset_right = 85.0
-offset_bottom = 18.0
-text = "examine"
+[node name="11" type="Sprite2D" parent="computer/lamps_addr" unique_id=1761830216]
+position = Vector2(-3, 8)
+scale = Vector2(0.25, 0.25)
+texture = ExtResource("3_h2yge")
-[node name="text" type="Label" parent="computer/data" unique_id=1336008430]
-offset_left = -138.0
-offset_top = -13.0
-offset_right = -103.0
-offset_bottom = 10.0
-text = "data"
+[node name="12" type="Sprite2D" parent="computer/lamps_addr" unique_id=446232673]
+position = Vector2(-27, 8)
+scale = Vector2(0.25, 0.25)
+texture = ExtResource("3_h2yge")
-[node name="addr" type="Node2D" parent="computer" unique_id=1662363803]
-position = Vector2(352, 104)
+[node name="13" type="Sprite2D" parent="computer/lamps_addr" unique_id=1509287834]
+position = Vector2(-51, 8)
+scale = Vector2(0.25, 0.25)
+texture = ExtResource("3_h2yge")
-[node name="buttons" type="Node2D" parent="computer/addr" unique_id=733435300]
-position = Vector2(-189, 37)
+[node name="14" type="Sprite2D" parent="computer/lamps_addr" unique_id=2063842413]
+position = Vector2(-75, 8)
+scale = Vector2(0.25, 0.25)
+texture = ExtResource("3_h2yge")
-[node name="bit-0" type="CheckButton" parent="computer/addr/buttons" unique_id=325488317]
-offset_right = 44.0
-offset_bottom = 24.0
-rotation = 4.712389
+[node name="15" type="Sprite2D" parent="computer/lamps_addr" unique_id=301037469]
+position = Vector2(-99, 8)
+scale = Vector2(0.25, 0.25)
+texture = ExtResource("3_h2yge")
-[node name="bit-1" type="CheckButton" parent="computer/addr/buttons" unique_id=1336488479]
-offset_left = 24.0
-offset_right = 68.0
+[node name="buttons" type="Node2D" parent="computer" unique_id=733435300]
+position = Vector2(163, 137)
+
+[node name="0" type="CheckButton" parent="computer/buttons" unique_id=2129421308]
+offset_left = 360.0
+offset_right = 404.0
offset_bottom = 24.0
rotation = 4.712389
+mouse_filter = 1
-[node name="bit-2" type="CheckButton" parent="computer/addr/buttons" unique_id=695745454]
-offset_left = 48.0
-offset_right = 92.0
+[node name="1" type="CheckButton" parent="computer/buttons" unique_id=862879246]
+offset_left = 336.0
+offset_right = 380.0
offset_bottom = 24.0
rotation = 4.712389
+mouse_filter = 1
-[node name="bit-3" type="CheckButton" parent="computer/addr/buttons" unique_id=1690503583]
-offset_left = 72.0
-offset_right = 116.0
+[node name="2" type="CheckButton" parent="computer/buttons" unique_id=70508066]
+offset_left = 312.0
+offset_right = 356.0
offset_bottom = 24.0
rotation = 4.712389
+mouse_filter = 1
-[node name="bit-4" type="CheckButton" parent="computer/addr/buttons" unique_id=760018466]
-offset_left = 96.0
-offset_right = 140.0
+[node name="3" type="CheckButton" parent="computer/buttons" unique_id=2099906965]
+offset_left = 288.0
+offset_right = 332.0
offset_bottom = 24.0
rotation = 4.712389
+mouse_filter = 1
-[node name="bit-5" type="CheckButton" parent="computer/addr/buttons" unique_id=1404060575]
-offset_left = 120.0
-offset_right = 164.0
+[node name="4" type="CheckButton" parent="computer/buttons" unique_id=1943659506]
+offset_left = 264.0
+offset_right = 308.0
offset_bottom = 24.0
rotation = 4.712389
+mouse_filter = 1
-[node name="bit-6" type="CheckButton" parent="computer/addr/buttons" unique_id=313744853]
-offset_left = 144.0
-offset_right = 188.0
+[node name="5" type="CheckButton" parent="computer/buttons" unique_id=2076865949]
+offset_left = 240.0
+offset_right = 284.0
offset_bottom = 24.0
rotation = 4.712389
+mouse_filter = 1
-[node name="bit-7" type="CheckButton" parent="computer/addr/buttons" unique_id=210349797]
-offset_left = 168.0
-offset_right = 212.0
+[node name="6" type="CheckButton" parent="computer/buttons" unique_id=1421105136]
+offset_left = 216.0
+offset_right = 260.0
offset_bottom = 24.0
rotation = 4.712389
+mouse_filter = 1
-[node name="bit-8" type="CheckButton" parent="computer/addr/buttons" unique_id=1283918352]
+[node name="7" type="CheckButton" parent="computer/buttons" unique_id=1283918352]
offset_left = 192.0
offset_right = 236.0
offset_bottom = 24.0
rotation = 4.712389
+mouse_filter = 1
-[node name="bit-9" type="CheckButton" parent="computer/addr/buttons" unique_id=1421105136]
-offset_left = 216.0
-offset_right = 260.0
+[node name="8" type="CheckButton" parent="computer/buttons" unique_id=210349797]
+offset_left = 168.0
+offset_right = 212.0
offset_bottom = 24.0
rotation = 4.712389
+mouse_filter = 1
-[node name="bit-10" type="CheckButton" parent="computer/addr/buttons" unique_id=2076865949]
-offset_left = 240.0
-offset_right = 284.0
+[node name="9" type="CheckButton" parent="computer/buttons" unique_id=313744853]
+offset_left = 144.0
+offset_right = 188.0
offset_bottom = 24.0
rotation = 4.712389
+mouse_filter = 1
-[node name="bit-11" type="CheckButton" parent="computer/addr/buttons" unique_id=1943659506]
-offset_left = 264.0
-offset_right = 308.0
+[node name="10" type="CheckButton" parent="computer/buttons" unique_id=1404060575]
+offset_left = 120.0
+offset_right = 164.0
offset_bottom = 24.0
rotation = 4.712389
+mouse_filter = 1
-[node name="bit-12" type="CheckButton" parent="computer/addr/buttons" unique_id=2099906965]
-offset_left = 288.0
-offset_right = 332.0
+[node name="11" type="CheckButton" parent="computer/buttons" unique_id=760018466]
+offset_left = 96.0
+offset_right = 140.0
offset_bottom = 24.0
rotation = 4.712389
+mouse_filter = 1
-[node name="bit-13" type="CheckButton" parent="computer/addr/buttons" unique_id=70508066]
-offset_left = 312.0
-offset_right = 356.0
+[node name="12" type="CheckButton" parent="computer/buttons" unique_id=1690503583]
+offset_left = 72.0
+offset_right = 116.0
offset_bottom = 24.0
rotation = 4.712389
+mouse_filter = 1
-[node name="bit-14" type="CheckButton" parent="computer/addr/buttons" unique_id=862879246]
-offset_left = 336.0
-offset_right = 380.0
+[node name="13" type="CheckButton" parent="computer/buttons" unique_id=695745454]
+offset_left = 48.0
+offset_right = 92.0
offset_bottom = 24.0
rotation = 4.712389
+mouse_filter = 1
-[node name="bit-15" type="CheckButton" parent="computer/addr/buttons" unique_id=2129421308]
-offset_left = 360.0
-offset_right = 404.0
+[node name="14" type="CheckButton" parent="computer/buttons" unique_id=1336488479]
+offset_left = 24.0
+offset_right = 68.0
offset_bottom = 24.0
rotation = 4.712389
+mouse_filter = 1
-[node name="jmp" type="Button" parent="computer/addr/buttons" unique_id=137966172]
-offset_left = 384.0
-offset_top = 29.0
-offset_right = 400.0
-offset_bottom = 45.0
-
-[node name="text" type="Label" parent="computer/addr/buttons/jmp" unique_id=663994812]
-layout_mode = 0
-offset_left = 18.0
-offset_top = -6.0
-offset_right = 58.0
-offset_bottom = 17.0
-text = "jump"
-
-[node name="lamps" type="Node2D" parent="computer/addr" unique_id=1734725300]
-position = Vector2(-78, -22)
-
-[node name="lamp" type="Sprite2D" parent="computer/addr/lamps" unique_id=301037469]
-position = Vector2(-99, 8)
-scale = Vector2(0.25, 0.25)
-texture = ExtResource("3_h2yge")
-
-[node name="lamp2" type="Sprite2D" parent="computer/addr/lamps" unique_id=2063842413]
-position = Vector2(-75, 8)
-scale = Vector2(0.25, 0.25)
-texture = ExtResource("3_h2yge")
-
-[node name="lamp3" type="Sprite2D" parent="computer/addr/lamps" unique_id=1509287834]
-position = Vector2(-51, 8)
-scale = Vector2(0.25, 0.25)
-texture = ExtResource("3_h2yge")
-
-[node name="lamp4" type="Sprite2D" parent="computer/addr/lamps" unique_id=446232673]
-position = Vector2(-27, 8)
-scale = Vector2(0.25, 0.25)
-texture = ExtResource("3_h2yge")
-
-[node name="lamp5" type="Sprite2D" parent="computer/addr/lamps" unique_id=1761830216]
-position = Vector2(-3, 8)
-scale = Vector2(0.25, 0.25)
-texture = ExtResource("3_h2yge")
-
-[node name="lamp6" type="Sprite2D" parent="computer/addr/lamps" unique_id=95336119]
-position = Vector2(21, 8)
-scale = Vector2(0.25, 0.25)
-texture = ExtResource("3_h2yge")
-
-[node name="lamp7" type="Sprite2D" parent="computer/addr/lamps" unique_id=1368353718]
-position = Vector2(45, 8)
-scale = Vector2(0.25, 0.25)
-texture = ExtResource("3_h2yge")
-
-[node name="lamp8" type="Sprite2D" parent="computer/addr/lamps" unique_id=1370430321]
-position = Vector2(69, 8)
-scale = Vector2(0.25, 0.25)
-texture = ExtResource("3_h2yge")
-
-[node name="lamp9" type="Sprite2D" parent="computer/addr/lamps" unique_id=1284145815]
-position = Vector2(93, 8)
-scale = Vector2(0.25, 0.25)
-texture = ExtResource("3_h2yge")
-
-[node name="lamp10" type="Sprite2D" parent="computer/addr/lamps" unique_id=1138734365]
-position = Vector2(117, 8)
-scale = Vector2(0.25, 0.25)
-texture = ExtResource("3_h2yge")
-
-[node name="lamp11" type="Sprite2D" parent="computer/addr/lamps" unique_id=140769146]
-position = Vector2(141, 8)
-scale = Vector2(0.25, 0.25)
-texture = ExtResource("3_h2yge")
-
-[node name="lamp12" type="Sprite2D" parent="computer/addr/lamps" unique_id=1864714391]
-position = Vector2(165, 8)
-scale = Vector2(0.25, 0.25)
-texture = ExtResource("3_h2yge")
-
-[node name="lamp13" type="Sprite2D" parent="computer/addr/lamps" unique_id=339122357]
-position = Vector2(189, 8)
-scale = Vector2(0.25, 0.25)
-texture = ExtResource("3_h2yge")
+[node name="15" type="CheckButton" parent="computer/buttons" unique_id=325488317]
+offset_right = 44.0
+offset_bottom = 24.0
+rotation = 4.712389
+mouse_filter = 1
-[node name="lamp14" type="Sprite2D" parent="computer/addr/lamps" unique_id=307082814]
-position = Vector2(213, 8)
-scale = Vector2(0.25, 0.25)
-texture = ExtResource("3_h2yge")
+[node name="control" type="Node2D" parent="computer" unique_id=1094110876]
+position = Vector2(355, 163)
-[node name="lamp15" type="Sprite2D" parent="computer/addr/lamps" unique_id=2009264748]
-position = Vector2(237, 8)
-scale = Vector2(0.25, 0.25)
-texture = ExtResource("3_h2yge")
+[node name="on_off" type="CheckButton" parent="computer/control" unique_id=1276014139]
+offset_left = -305.0
+offset_top = -12.999999
+offset_right = -261.0
+offset_bottom = 11.000001
+rotation = 1.5707964
+mouse_filter = 1
-[node name="lamp16" type="Sprite2D" parent="computer/addr/lamps" unique_id=1911411271]
-position = Vector2(261, 8)
-scale = Vector2(0.25, 0.25)
-texture = ExtResource("3_h2yge")
+[node name="off" type="Label" parent="computer/control/on_off" unique_id=887485295]
+layout_mode = 0
+offset_left = -3.0
+offset_top = 19.000004
+offset_right = 27.0
+offset_bottom = 42.000008
+rotation = -1.5707964
+mouse_filter = 1
+text = "OFF"
+label_settings = SubResource("LabelSettings_7mycd")
+
+[node name="on" type="Label" parent="computer/control/on_off" unique_id=965272764]
+layout_mode = 0
+offset_left = 36.0
+offset_top = 18.0
+offset_right = 56.0
+offset_bottom = 41.0
+rotation = -1.5707964
+mouse_filter = 1
+text = "ON"
+label_settings = SubResource("LabelSettings_272bh")
+
+[node name="stop" type="Button" parent="computer/control" unique_id=886115773]
+offset_left = -188.0
+offset_top = -5.999999
+offset_right = -172.0
+offset_bottom = 10.000001
+mouse_filter = 1
+
+[node name="text" type="Label" parent="computer/control/stop" unique_id=1984568674]
+layout_mode = 0
+offset_left = -11.0
+offset_top = -12.0
+offset_right = 30.0
+offset_bottom = 11.0
+mouse_filter = 1
+text = "STOP"
+label_settings = SubResource("LabelSettings_5vw27")
+horizontal_alignment = 1
+
+[node name="run" type="Button" parent="computer/control" unique_id=214883096]
+offset_left = -188.0
+offset_top = 11.000001
+offset_right = -172.0
+offset_bottom = 27.0
+mouse_filter = 1
+
+[node name="text" type="Label" parent="computer/control/run" unique_id=1347445060]
+layout_mode = 0
+offset_left = -11.0
+offset_top = 13.0
+offset_right = 30.0
+offset_bottom = 36.0
+mouse_filter = 1
+text = "RUN"
+label_settings = SubResource("LabelSettings_1bvp3")
+horizontal_alignment = 1
+
+[node name="s_step" type="Button" parent="computer/control" unique_id=1023167207]
+offset_left = -133.0
+offset_top = 2.000001
+offset_right = -117.0
+offset_bottom = 18.0
+mouse_filter = 1
-[node name="text" type="Label" parent="computer/addr" unique_id=783362460]
-offset_left = -247.0
-offset_top = -15.0
-offset_right = -186.0
-offset_bottom = 8.0
-text = "address"
+[node name="text" type="Label" parent="computer/control/s_step" unique_id=822028633]
+layout_mode = 0
+offset_left = -12.0
+offset_top = -19.0
+offset_right = 30.0
+offset_bottom = 7.0
+mouse_filter = 1
+text = "SINGLE
+STEP"
+label_settings = SubResource("LabelSettings_h2yge")
+horizontal_alignment = 1
+
+[node name="examine" type="Button" parent="computer/control" unique_id=296196073]
+offset_left = -76.0
+offset_top = -5.999999
+offset_right = -60.0
+offset_bottom = 10.000001
+mouse_filter = 1
+
+[node name="text" type="Label" parent="computer/control/examine" unique_id=1867917591]
+layout_mode = 0
+offset_left = -17.0
+offset_top = -14.0
+offset_right = 36.0
+offset_bottom = 9.0
+mouse_filter = 1
+text = "EXAMINE"
+label_settings = SubResource("LabelSettings_1bvp3")
+horizontal_alignment = 1
+
+[node name="examine_n" type="Button" parent="computer/control" unique_id=107187658]
+offset_left = -76.0
+offset_top = 11.000001
+offset_right = -60.0
+offset_bottom = 27.0
+mouse_filter = 1
+
+[node name="text" type="Label" parent="computer/control/examine_n" unique_id=551910634]
+layout_mode = 0
+offset_left = -17.0
+offset_top = 12.0
+offset_right = 36.0
+offset_bottom = 46.0
+mouse_filter = 1
+text = "EXAMINE
+NEXT"
+label_settings = SubResource("LabelSettings_lquwl")
+horizontal_alignment = 1
+
+[node name="deposit" type="Button" parent="computer/control" unique_id=1692201661]
+offset_left = -11.0
+offset_top = -5.999999
+offset_right = 5.0
+offset_bottom = 10.000001
+mouse_filter = 1
+
+[node name="text" type="Label" parent="computer/control/deposit" unique_id=1183008914]
+layout_mode = 0
+offset_left = -20.0
+offset_top = -13.0
+offset_right = 33.0
+offset_bottom = 10.0
+mouse_filter = 1
+text = "DEPOSIT"
+label_settings = SubResource("LabelSettings_1bvp3")
+horizontal_alignment = 1
+
+[node name="deposit_n" type="Button" parent="computer/control" unique_id=845138324]
+offset_left = -11.0
+offset_top = 11.000001
+offset_right = 5.0
+offset_bottom = 27.0
+mouse_filter = 1
+
+[node name="text" type="Label" parent="computer/control/deposit_n" unique_id=926335548]
+layout_mode = 0
+offset_left = -17.0
+offset_top = 12.0
+offset_right = 36.0
+offset_bottom = 46.0
+mouse_filter = 1
+text = "DEPOSIT
+NEXT"
+label_settings = SubResource("LabelSettings_lquwl")
+horizontal_alignment = 1
+
+[node name="reset" type="Button" parent="computer/control" unique_id=1280760691]
+offset_left = 52.0
+offset_top = -5.999999
+offset_right = 68.0
+offset_bottom = 10.000001
+mouse_filter = 1
-[node name="execute" type="Button" parent="computer" unique_id=499234741]
-offset_left = 547.0
-offset_top = 151.0
-offset_right = 563.0
-offset_bottom = 167.0
+[node name="text" type="Label" parent="computer/control/reset" unique_id=1297615840]
+layout_mode = 0
+offset_left = -16.0
+offset_top = -12.0
+offset_right = 37.0
+offset_bottom = 11.0
+mouse_filter = 1
+text = "RESET"
+label_settings = SubResource("LabelSettings_1bvp3")
+horizontal_alignment = 1
+
+[node name="clr" type="Button" parent="computer/control" unique_id=1324293289]
+offset_left = 52.0
+offset_top = 11.000001
+offset_right = 68.0
+offset_bottom = 27.0
+mouse_filter = 1
-[node name="text" type="Label" parent="computer/execute" unique_id=548414139]
+[node name="text" type="Label" parent="computer/control/clr" unique_id=2030335195]
layout_mode = 0
-offset_left = 18.0
-offset_top = -5.0
-offset_right = 85.0
-offset_bottom = 18.0
-text = "execute"
+offset_left = -19.0
+offset_top = 14.0
+offset_right = 34.0
+offset_bottom = 48.0
+mouse_filter = 1
+text = "CLR
+"
+label_settings = SubResource("LabelSettings_lquwl")
+horizontal_alignment = 1
+
+[node name="d0-7" type="Label" parent="computer" unique_id=731723272]
+offset_left = 363.0
+offset_top = 42.0
+offset_right = 541.0
+offset_bottom = 65.0
+mouse_filter = 1
+text = "D7 D6 D5 D4 D3 D2 D1 D0"
+label_settings = SubResource("LabelSettings_xpk6w")
+horizontal_alignment = 1
+
+[node name="a0-15" type="Label" parent="computer" unique_id=554604991]
+offset_left = 165.0
+offset_top = 67.0
+offset_right = 534.0
+offset_bottom = 90.0
+mouse_filter = 1
+text = "A15 A14 A13 A12 A11 A10 A9 A8 A7 A6 A5 A4 A3 A2 A1 A0"
+label_settings = SubResource("LabelSettings_kek77")
+horizontal_alignment = 1
+
+[node name="paper" type="Area2D" parent="." unique_id=1717261404]
+z_index = 1
+position = Vector2(0, 349)
+script = ExtResource("4_lquwl")
+offset = -300.0
+
+[node name="doc" type="Sprite2D" parent="paper" unique_id=1634288699]
+texture = ExtResource("4_1bvp3")
+
+[node name="header" type="Label" parent="paper/doc" unique_id=2038232969]
+offset_left = -99.0
+offset_top = -141.0
+offset_right = 101.0
+offset_bottom = -133.0
+mouse_filter = 1
+text = "DOCUMENTATION"
+label_settings = SubResource("LabelSettings_a5vro")
+horizontal_alignment = 1
+
+[node name="system" type="Label" parent="paper/doc" unique_id=1094384802]
+offset_left = -100.0
+offset_top = -133.0
+offset_right = 100.0
+offset_bottom = -109.0
+mouse_filter = 1
+text = "A0-15 - Address switchers
+D0-7 - Data switchers
+EXAMINE/NEXT - Change current address and show
+ data from memory by address
+DEPOSIT/NEXT - Load data in memory by address
+RESET - Set address to 0x0000"
+label_settings = SubResource("LabelSettings_a5vro")
+
+[node name="registers" type="Label" parent="paper/doc" unique_id=1958491991]
+offset_left = -100.0
+offset_top = -80.0
+offset_right = 100.0
+offset_bottom = -56.0
+mouse_filter = 1
+text = "NAME OPCODE
+ A 111
+ B 000
+ C 001
+ D 010
+ E 011
+ H 100
+ L 101
+ M 110"
+label_settings = SubResource("LabelSettings_a5vro")
+
+[node name="opcode" type="Label" parent="paper/doc" unique_id=720962544]
+offset_left = -100.0
+offset_top = -8.0
+offset_right = 100.0
+offset_bottom = 16.0
+mouse_filter = 1
+text = "NAME OPCODE DESCRIPTION
+ MVI 00<dst>110 move immediate
+ MOV 01<dst><src> move register
+ HLT 01110110 halt machine
+"
+label_settings = SubResource("LabelSettings_a5vro")
+
+[node name="example program" type="Label" parent="paper/doc" unique_id=702865304]
+offset_left = -100.0
+offset_top = 27.0
+offset_right = 100.0
+offset_bottom = 75.0
+mouse_filter = 1
+text = "Example program:
+ ADDR OPCODE ASM
+ 0000 00111110 MOV A
+ 0001 00001000 8
+ 0002 01000111 MOV B, A
+ 0003 01110110 HLT"
+label_settings = SubResource("LabelSettings_a5vro")
+
+[node name="collision" type="CollisionShape2D" parent="paper" unique_id=1149371540]
+position = Vector2(0, 148.5)
+shape = SubResource("RectangleShape2D_a5vro")
diff --git a/paper.png b/paper.png
Binary files differ.
diff --git a/paper.png.import b/paper.png.import
@@ -0,0 +1,40 @@
+[remap]
+
+importer="texture"
+type="CompressedTexture2D"
+uid="uid://blxdcjt4qu82c"
+path="res://.godot/imported/paper.png-7786f1cec57caf764293039fee58b648.ctex"
+metadata={
+"vram_texture": false
+}
+
+[deps]
+
+source_file="res://paper.png"
+dest_files=["res://.godot/imported/paper.png-7786f1cec57caf764293039fee58b648.ctex"]
+
+[params]
+
+compress/mode=0
+compress/high_quality=false
+compress/lossy_quality=0.7
+compress/uastc_level=0
+compress/rdo_quality_loss=0.0
+compress/hdr_compression=1
+compress/normal_map=0
+compress/channel_pack=0
+mipmaps/generate=false
+mipmaps/limit=-1
+roughness/mode=0
+roughness/src_normal=""
+process/channel_remap/red=0
+process/channel_remap/green=1
+process/channel_remap/blue=2
+process/channel_remap/alpha=3
+process/fix_alpha_border=true
+process/premult_alpha=false
+process/normal_map_invert_y=false
+process/hdr_as_srgb=false
+process/hdr_clamp_exposure=false
+process/size_limit=0
+detect_3d/compress_to=1
diff --git a/paper_list.cs b/paper_list.cs
@@ -0,0 +1,34 @@
+using Godot;
+
+public partial class paper_list : Area2D {
+
+[Export] public
+float offset = 300f;
+[Export] public
+float speed = 5f;
+
+float init_y;
+float target_y;
+
+public override void _Ready() {
+ init_y = Position.Y;
+ target_y = init_y;
+
+ MouseEntered += on_enter;
+ MouseExited += on_exited;
+}
+
+public override void _Process(double delta) {
+ float y = Mathf.Lerp(Position.Y, target_y, speed * (float)delta);
+ Position = new Vector2(Position.X, y);
+}
+
+void on_enter() {
+ target_y = init_y + offset;
+}
+
+void on_exited() {
+ target_y = init_y;
+}
+
+}
diff --git a/paper_list.cs.uid b/paper_list.cs.uid
@@ -0,0 +1 @@
+uid://b6lty8spdabbf