summaryrefslogtreecommitdiff
path: root/src/stack.rs
diff options
context:
space:
mode:
Diffstat (limited to 'src/stack.rs')
-rw-r--r--src/stack.rs73
1 files changed, 14 insertions, 59 deletions
diff --git a/src/stack.rs b/src/stack.rs
index 2862b72..ab18cca 100644
--- a/src/stack.rs
+++ b/src/stack.rs
@@ -11,6 +11,10 @@ impl Stack {
}
}
+ pub fn reset(&mut self) {
+ self.sp = 0;
+ }
+
pub fn push_u8(&mut self, val: u8) {
self.mem[self.sp as usize] = val;
self.sp = self.sp.wrapping_add(1);
@@ -22,67 +26,18 @@ impl Stack {
}
pub fn push_u16(&mut self, val: u16) {
- let [byte_high, byte_low] = u16::to_be_bytes(val);
- self.push_u8(byte_high);
- self.push_u8(byte_low);
+ let [high, low] = u16::to_be_bytes(val);
+ self.mem[self.sp as usize] = high;
+ self.sp = self.sp.wrapping_add(1);
+ self.mem[self.sp as usize] = low;
+ self.sp = self.sp.wrapping_add(1);
}
pub fn pop_u16(&mut self) -> u16 {
- self.sp = self.sp.wrapping_sub(1);
- let byte_low = self.mem[self.sp as usize];
- self.sp = self.sp.wrapping_sub(1);
- let byte_high = self.mem[self.sp as usize];
- u16::from_be_bytes([byte_high, byte_low])
- }
-
- pub fn get_u8(&mut self) -> u8 {
- self.mem[self.sp.wrapping_sub(1) as usize]
- }
-
- pub fn get_u16(&mut self) -> u16 {
- let byte_low = self.mem[self.sp.wrapping_sub(1) as usize];
- let byte_high = self.mem[self.sp.wrapping_sub(2) as usize];
- u16::from_be_bytes([byte_high, byte_low])
- }
-
- pub fn reset(&mut self) {
- self.mem.fill(0);
- self.sp = 0;
- }
-}
-
-use std::ops::Not;
-
-impl Stack {
- pub fn inc_u8(&mut self) {
- let sp = self.sp.wrapping_sub(1) as usize;
- self.mem[sp] = self.mem[sp].wrapping_add(1);
- }
-
- pub fn dec_u8(&mut self) {
- let sp = self.sp.wrapping_sub(1) as usize;
- self.mem[sp] = self.mem[sp].wrapping_sub(1);
- }
-
- pub fn not_u8(&mut self) {
- let sp = self.sp.wrapping_sub(1) as usize;
- self.mem[sp] = self.mem[sp].not();
- }
-
- pub fn not_u16(&mut self) {
- let sp = self.sp.wrapping_sub(1) as usize;
- self.mem[sp] = self.mem[sp].not();
- let sp = self.sp.wrapping_sub(2) as usize;
- self.mem[sp] = self.mem[sp].not();
- }
-
- pub fn tal_u8(&mut self) {
- let sp = self.sp.wrapping_sub(1) as usize;
- self.mem[sp] = self.mem[sp].count_ones() as u8;
- }
-
- pub fn rev_u8(&mut self) {
- let sp = self.sp.wrapping_sub(1) as usize;
- self.mem[sp] = self.mem[sp].reverse_bits();
+ self.sp = self.sp.wrapping_sub(1);
+ let low = self.mem[self.sp as usize];
+ self.sp = self.sp.wrapping_sub(1);
+ let high = self.mem[self.sp as usize];
+ u16::from_be_bytes([high, low])
}
}