From 34000e48a5a7162ad7e71da727a3c296bb674f02 Mon Sep 17 00:00:00 2001
From: kn0000 <kn0000@aleteoryx.me>
Date: Wed, 19 Mar 2025 18:11:37 +0000
Subject: [PATCH] Add long addresses for jump, push and pop instructions

---
 src/lib.rs | 43 +++++++++++++++++++++++++++----------------
 1 file changed, 27 insertions(+), 16 deletions(-)

diff --git a/src/lib.rs b/src/lib.rs
index b5fe4f0..a3d7590 100644
--- a/src/lib.rs
+++ b/src/lib.rs
@@ -1,7 +1,7 @@
 struct Processor {
     stack_a: Vec<u16>,
     stack_b: Vec<u16>,
-    pub memory: [u16;1024],
+    pub memory: Vec<u16>,
     carry: bool,
     pub pc: u16 //program counter
 }
@@ -19,8 +19,11 @@ impl Processor {
                     let conditional = (instruction & 0x40) != 0;
                     let relative = (instruction & 0x20) != 0;
                     let save_pc = (instruction & 0x10) != 0;
+                    let long_address = (instruction & 0x8) != 0;
                     if !conditional || self.carry {
-                        let address = self.stack_a.pop().expect("End of stack");
+                        let address;
+                        if long_address {address = self.stack_a.pop().unwrap_or(0) | (self.stack_a.pop().unwrap_or(0) << 10)} //lower value on stack is high half of long address
+                        else {address = self.stack_a.pop().unwrap_or(0)};
                         if save_pc {self.stack_a.push(self.pc+1)};
                         if relative {self.pc += address}
                         else {self.pc = address};
@@ -29,41 +32,49 @@ impl Processor {
                 }
                 else {
                     let toggle = (instruction & 0x40) != 0;
-                    let mut stack;
+                    let stack;
                     if toggle {stack = &mut self.stack_b;}
                     else {stack = &mut self.stack_a;};
                     match instruction & 0x3F {
                         0 => { //swap top 2
-                            let a = stack.pop().expect("End of stack");
-                            let b = stack.pop().expect("End of stack");
+                            let a = stack.pop().unwrap_or(0);
+                            let b = stack.pop().unwrap_or(0);
                             stack.push(a);
                             stack.push(b);
                         }
                         1 => { //clone top
-                            let a = stack.pop().expect("End of stack");
+                            let a = stack.pop().unwrap_or(0);
                             stack.push(a);
                             stack.push(a);
                         }
                         2 => { //clone second
-                            let a = stack.pop().expect("End of stack");
-                            let b = stack.pop().expect("End of stack");
+                            let a = stack.pop().unwrap_or(0);
+                            let b = stack.pop().unwrap_or(0);
                             stack.push(b);
                             stack.push(a);
                             stack.push(b);
                         }
                         3 => { //move between stacks
-                            if toggle {self.stack_a.push(self.stack_b.pop().expect("End of stack"));}
-                            else {self.stack_b.push(self.stack_a.pop().expect("End of stack"));};
+                            if toggle {self.stack_a.push(self.stack_b.pop().unwrap_or(0));}
+                            else {self.stack_b.push(self.stack_a.pop().unwrap_or(0));};
                         }
                         4 => { //push/pop
-                            let addr = self.stack_a.pop().expect("End of stack") as usize;
+                            let addr = self.stack_a.pop().unwrap_or(0) as usize;
                             if toggle {
-                                let value = self.stack_a.pop().expect("End of stack");
+                                let value = self.stack_a.pop().unwrap_or(0);
                                 self.memory[addr] = value;
                             }
-                            else {self.stack_a.push(self.memory[addr]);};
+                            else {self.stack_a.push(self.memory[addr])};
                         }
-                        5 => { //set/clear carry
+                        5 => { //long addr push/pop
+                            let addr = (self.stack_a.pop().unwrap_or(0) | (self.stack_a.pop().unwrap_or(0) << 10)) as usize;
+                            if toggle {
+                                let value = self.stack_a.pop().unwrap_or(0);
+                                self.memory[addr] = value;
+                            }
+                            else {self.stack_a.push(self.memory[addr])};
+                        }
+                        6 => { //set/clear carry
                             self.carry = toggle;
                         }
                         _ => ()
@@ -77,8 +88,8 @@ impl Processor {
 }
 
 fn calc(stack: &mut Vec::<u16>, instruction: u16, carry_in: bool) -> bool {
-    let operand_a = stack.pop().expect("End of stack");
-    let operand_b = stack.pop().expect("End of stack");
+    let operand_a = stack.pop().unwrap_or(0);
+    let operand_b = stack.pop().unwrap_or(0);
     let mut carry = carry_in;
     let mut result = 0;
     for i in 0..10 {
-- 
2.45.2