Spaces:
Sleeping
Sleeping
Update src/vm.rs
Browse files
src/vm.rs
CHANGED
|
@@ -19,18 +19,22 @@ impl BCNVM {
|
|
| 19 |
|
| 20 |
pub fn run(&mut self) -> Result<(), String> {
|
| 21 |
while self.pc < self.program.len() {
|
| 22 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
| 23 |
let opcode = Opcode::from_byte(instr[0])
|
| 24 |
.ok_or("Invalid opcode")?;
|
| 25 |
|
| 26 |
match opcode {
|
| 27 |
Opcode::INVCHK => self.invchk()?,
|
| 28 |
-
Opcode::TADD => self.trust_add(instr)?,
|
| 29 |
-
Opcode::TSUB => self.trust_sub(instr)?,
|
| 30 |
-
Opcode::FADD => self.flow_add(instr)?,
|
| 31 |
Opcode::FVEL => self.flow_vel()?,
|
| 32 |
-
Opcode::CISS => self.credit_issue(instr)?,
|
| 33 |
-
Opcode::CRET => self.credit_return(instr)?,
|
| 34 |
Opcode::CCAP => self.credit_cap()?,
|
| 35 |
Opcode::CDEF => self.credit_default()?,
|
| 36 |
Opcode::CREW => self.work_credit()?,
|
|
@@ -38,7 +42,7 @@ impl BCNVM {
|
|
| 38 |
Opcode::ILOCK => self.identity_lock()?,
|
| 39 |
Opcode::HALT => break,
|
| 40 |
Opcode::NOOP => {},
|
| 41 |
-
_ =>
|
| 42 |
}
|
| 43 |
|
| 44 |
self.pc += 8;
|
|
@@ -51,24 +55,24 @@ impl BCNVM {
|
|
| 51 |
return Err("Trust underflow".into());
|
| 52 |
}
|
| 53 |
if self.state.credit_balance < 0 {
|
| 54 |
-
return Err("Negative credit".into());
|
| 55 |
}
|
| 56 |
Ok(())
|
| 57 |
}
|
| 58 |
|
| 59 |
-
fn trust_add(&mut self, instr: &[u8]) -> Result<(), String> {
|
| 60 |
let imm = instr[5] as i64;
|
| 61 |
self.state.trust += imm;
|
| 62 |
Ok(())
|
| 63 |
}
|
| 64 |
|
| 65 |
-
fn trust_sub(&mut self, instr: &[u8]) -> Result<(), String> {
|
| 66 |
let imm = instr[5] as i64;
|
| 67 |
self.state.trust -= imm;
|
| 68 |
Ok(())
|
| 69 |
}
|
| 70 |
|
| 71 |
-
fn flow_add(&mut self, instr: &[u8]) -> Result<(), String> {
|
| 72 |
let imm = instr[5] as i64;
|
| 73 |
self.state.flow_total += imm;
|
| 74 |
Ok(())
|
|
@@ -86,22 +90,27 @@ impl BCNVM {
|
|
| 86 |
Ok(())
|
| 87 |
}
|
| 88 |
|
| 89 |
-
fn credit_issue(&mut self, instr: &[u8]) -> Result<(), String> {
|
| 90 |
let imm = instr[5] as i64;
|
|
|
|
| 91 |
if self.state.credit_balance > 0 {
|
| 92 |
return Err("No rollovers allowed".into());
|
| 93 |
}
|
|
|
|
| 94 |
if imm > self.state.credit_cap {
|
| 95 |
return Err("Exceeds credit cap".into());
|
| 96 |
}
|
|
|
|
| 97 |
self.state.credit_balance += imm;
|
| 98 |
Ok(())
|
| 99 |
}
|
| 100 |
|
| 101 |
-
fn credit_return(&mut self, instr: &[u8]) -> Result<(), String> {
|
| 102 |
let imm = instr[5] as i64;
|
|
|
|
| 103 |
self.state.credit_balance -= imm;
|
| 104 |
self.state.trust += imm / 10;
|
|
|
|
| 105 |
Ok(())
|
| 106 |
}
|
| 107 |
|
|
|
|
| 19 |
|
| 20 |
pub fn run(&mut self) -> Result<(), String> {
|
| 21 |
while self.pc < self.program.len() {
|
| 22 |
+
// ✅ FIX: Copy instruction into owned buffer
|
| 23 |
+
let instr: [u8; 8] = self.program[self.pc..self.pc + 8]
|
| 24 |
+
.try_into()
|
| 25 |
+
.map_err(|_| "Invalid instruction length")?;
|
| 26 |
+
|
| 27 |
let opcode = Opcode::from_byte(instr[0])
|
| 28 |
.ok_or("Invalid opcode")?;
|
| 29 |
|
| 30 |
match opcode {
|
| 31 |
Opcode::INVCHK => self.invchk()?,
|
| 32 |
+
Opcode::TADD => self.trust_add(&instr)?,
|
| 33 |
+
Opcode::TSUB => self.trust_sub(&instr)?,
|
| 34 |
+
Opcode::FADD => self.flow_add(&instr)?,
|
| 35 |
Opcode::FVEL => self.flow_vel()?,
|
| 36 |
+
Opcode::CISS => self.credit_issue(&instr)?,
|
| 37 |
+
Opcode::CRET => self.credit_return(&instr)?,
|
| 38 |
Opcode::CCAP => self.credit_cap()?,
|
| 39 |
Opcode::CDEF => self.credit_default()?,
|
| 40 |
Opcode::CREW => self.work_credit()?,
|
|
|
|
| 42 |
Opcode::ILOCK => self.identity_lock()?,
|
| 43 |
Opcode::HALT => break,
|
| 44 |
Opcode::NOOP => {},
|
| 45 |
+
_ => return Err("Unimplemented opcode".into()),
|
| 46 |
}
|
| 47 |
|
| 48 |
self.pc += 8;
|
|
|
|
| 55 |
return Err("Trust underflow".into());
|
| 56 |
}
|
| 57 |
if self.state.credit_balance < 0 {
|
| 58 |
+
return Err("Negative credit balance".into());
|
| 59 |
}
|
| 60 |
Ok(())
|
| 61 |
}
|
| 62 |
|
| 63 |
+
fn trust_add(&mut self, instr: &[u8; 8]) -> Result<(), String> {
|
| 64 |
let imm = instr[5] as i64;
|
| 65 |
self.state.trust += imm;
|
| 66 |
Ok(())
|
| 67 |
}
|
| 68 |
|
| 69 |
+
fn trust_sub(&mut self, instr: &[u8; 8]) -> Result<(), String> {
|
| 70 |
let imm = instr[5] as i64;
|
| 71 |
self.state.trust -= imm;
|
| 72 |
Ok(())
|
| 73 |
}
|
| 74 |
|
| 75 |
+
fn flow_add(&mut self, instr: &[u8; 8]) -> Result<(), String> {
|
| 76 |
let imm = instr[5] as i64;
|
| 77 |
self.state.flow_total += imm;
|
| 78 |
Ok(())
|
|
|
|
| 90 |
Ok(())
|
| 91 |
}
|
| 92 |
|
| 93 |
+
fn credit_issue(&mut self, instr: &[u8; 8]) -> Result<(), String> {
|
| 94 |
let imm = instr[5] as i64;
|
| 95 |
+
|
| 96 |
if self.state.credit_balance > 0 {
|
| 97 |
return Err("No rollovers allowed".into());
|
| 98 |
}
|
| 99 |
+
|
| 100 |
if imm > self.state.credit_cap {
|
| 101 |
return Err("Exceeds credit cap".into());
|
| 102 |
}
|
| 103 |
+
|
| 104 |
self.state.credit_balance += imm;
|
| 105 |
Ok(())
|
| 106 |
}
|
| 107 |
|
| 108 |
+
fn credit_return(&mut self, instr: &[u8; 8]) -> Result<(), String> {
|
| 109 |
let imm = instr[5] as i64;
|
| 110 |
+
|
| 111 |
self.state.credit_balance -= imm;
|
| 112 |
self.state.trust += imm / 10;
|
| 113 |
+
|
| 114 |
Ok(())
|
| 115 |
}
|
| 116 |
|