     }
 
     halt_switch.poll(panel_switches.flags.halt == HIGH);
+    halt_trigger.update(halt_switch.state());
+    resume_trigger.update(halt_switch.state());
+
     cycle_switch.poll(panel_switches.flags.cycle_step);
     cycle_trigger.update(cycle_switch.state());
     instr_switch.poll(panel_switches.flags.instuction_step);
     instr_trigger.update(instr_switch.state());
 
-    digitalWrite(PIN_HALT, halt_switch.state() ? HIGH : LOW);
+    ex_switch.poll(panel_switches.flags.examine);
+    ex_trigger.update(ex_switch.state());
+    ex_nx_switch.poll(panel_switches.flags.examine_next);
+    ex_nx_trigger.update(ex_nx_switch.state());
+    dpst_switch.poll(panel_switches.flags.deposit);
+    dpst_trigger.update(dpst_switch.state());
+    dpst_nx_switch.poll(panel_switches.flags.deposit_next);
+    dpst_nx_trigger.update(dpst_nx_switch.state());
+
+    if(halt_trigger.triggered()) {
+        digitalWrite(PIN_HALT, HIGH);
+        update_bus();
+        cursor_addr = bus_state.address;
+        halt_trigger.clear();
+    }
+
+    if(resume_trigger.triggered()) {
+        if(owning_bus) { release_bus(); }
+        digitalWrite(PIN_HALT, LOW);
+        resume_trigger.clear();
+    }
 
     if(cycle_trigger.triggered()) {
-        if(halt_switch.state()) {
+        if(!owning_bus && halt_switch.state()) {
             digitalWrite(PIN_STEP, HIGH);
             digitalWrite(PIN_STEP, LOW);
         }

SwitchState panel_switches;
SerialState serial_state;

DebouncedSwitch halt_switch, cycle_switch, instr_switch;
EdgeTrigger cycle_trigger, instr_trigger;

static void init_display();
static void update_display();
static void poll_serial();
static void update_bus();
static byte dpy_transfer(byte mx7219_reg, byte mx7219_val, byte key_out = 0);

void setup() {
    // Reset while setting up other pins.

    }

    if(instr_trigger.triggered()) {
        if(!owning_bus && halt_switch.state()) {
            do {
                digitalWrite(PIN_STEP, HIGH);
                digitalWrite(PIN_STEP, LOW);
