From cf3306eeb2846fb3c7503f8919ec1eba8aef9342 Mon Sep 17 00:00:00 2001 From: JanNeuendorf <75676159+JanNeuendorf@users.noreply.github.com> Date: Mon, 6 Jan 2025 18:37:34 +0100 Subject: [PATCH] Debug instruction (#12) This combines the SET and INST instructions into one SET instruction and adds DEBUG for opcode 10. This is a breaking change, but the migration is very simple. --- Cargo.lock | 2 +- Cargo.toml | 2 +- README.md | 7 +++---- examples/input_tester.svc16 | Bin 5552 -> 0 bytes examples/input_tester.svc16.gz | Bin 0 -> 983 bytes examples/rectavoider.svc16 | Bin 81422 -> 0 bytes examples/rectavoider.svc16.gz | Bin 0 -> 8371 bytes specification/specification.typ | 25 ++++++++++++++++++++++--- src/cli.rs | 2 +- src/engine.rs | 20 +++++++++++++------- src/main.rs | 9 ++++++++- 11 files changed, 49 insertions(+), 18 deletions(-) delete mode 100644 examples/input_tester.svc16 create mode 100644 examples/input_tester.svc16.gz delete mode 100644 examples/rectavoider.svc16 create mode 100644 examples/rectavoider.svc16.gz diff --git a/Cargo.lock b/Cargo.lock index 5314c11..3dc6655 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -539,7 +539,7 @@ checksum = "7da8b5736845d9f2fcb837ea5d9e2628564b3b043a70948a3f0b778838c5fb4f" [[package]] name = "svc16" -version = "0.8.0" +version = "0.9.0" dependencies = [ "anyhow", "clap", diff --git a/Cargo.toml b/Cargo.toml index 01687a2..a86f7fd 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "svc16" -version = "0.8.0" +version = "0.9.0" edition = "2021" authors = ["Jan Neuendorf"] description = "An emulator for a simple virtual computer" diff --git a/README.md b/README.md index cb81443..8c60932 100644 --- a/README.md +++ b/README.md @@ -122,13 +122,12 @@ If the opcode is greater than 15, ***and the code is run***, the system will abo > You can have data blobs in the binary that does not correspond with the opcodes. > This is fine **until and unless** you explicitly try to run this blob of data as code. -If one of the three arguments is not used, it can be set to any value, but it can not be omitted. When the instruction pointer advances, it does so by four positions. | Opcode | Name | Advances | Effect | | ------ | --------- | ---------- | ---------------------------------------------------------------------------- | -| 0 | **Set** | yes | `@arg1=arg2` | +| 0 | **Set** | yes | `if arg3{@arg1=inst_ptr}else{@arg1=arg2}` | | 1 | **GoTo** | if skipped | `if(not @arg3){inst_ptr=@arg1+arg2}` | | 2 | **Skip** | if skipped | `if(not @arg3){inst_ptr=inst_ptr+4*arg1-4*arg2}` | | 3 | **Add** | yes | `@arg3=(@arg1+@arg2)` | @@ -138,8 +137,8 @@ When the instruction pointer advances, it does so by four positions. | 7 | **Cmp** | yes | `@arg3=(@arg1<@arg2)` as unsigned | | 8 | **Deref** | yes | `@arg2=@(@arg1+arg3)` | | 9 | **Ref** | yes | `@(@arg1+arg3)=@arg2` | -| 10 | **Inst** | yes | `@arg1=inst_ptr` | -| 11 | **Print** | yes | Writes `value=@arg1` to `index=@arg2` of buffer `arg3` +| 10 | **Debug** | yes | Provides `arg1,@arg2,@arg3` as debug information | +| 11 | **Print** | yes | Writes `value=@arg1` to `index=@arg2` of buffer `arg3` | | 12 | **Read** | yes | Copies `index=@arg1` of buffer `arg3` to `@arg2` | | 13 | **Band** | yes | `@arg3=@arg1&@arg2` | | 14 | **Xor** | yes | `@arg3=@arg1^@arg2` | diff --git a/examples/input_tester.svc16 b/examples/input_tester.svc16 deleted file mode 100644 index 30b66a1211cdc7e7f23509f7f05ce32f70e438ee..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5552 zcmc&&&vR2%6#kMt()3&_^>^_{E#f#Xbmxp)SFZgJ+_-SzAHa+oUAb|g8<&ntDK>?K zB2ciYwoM?+xUH1(+fpP{ETt%r#_!yBnZB1HeYuYmCNuZEbMx|@bME)uoA(YdFRd0} z@T<%V5YV6CRTf!**E;4<75%=-?{&`S{sA16Kje%A&~ZWXSdd9t;H)e+fdMQs-Z@eG zo1C}yh+MGtXSrzYPjboH<8s;BU*w9lKgyrPJuGvwM7*muyDa*d$aYC))Qcj{I9t>)B<^nzsmVlH?LMTs&U7q*n#h&<9j9* zFUh!Lsc^?+CV}sn7~e%NJ_7jSk9*;7@~!Kmd~3WY-!pA|7s+Pt_zvS=aJ*~$@)L-E zF%o}F>aqIk+gg8sDXDePd(G*+oJyC;xb;-Hbtxz4y&Thf%}b8~eDSBe@Hh3Y>!W(p zcu~EV+xV_+gWfMOZt)4mzs&ekGTv4F<2|iEz&4hKieU3cq`gFs0rKfy{ z@%4TG4EqHd|B#%B>Fq?D-m2RWe}QoqT>P3Gh{Zp!t?_rV&#}n&+OU5zVc%Qd%2p+V zJDk<`*MH?dxl8|^^Y2Tu!~STx{jm`{4_oxQ>0cz{!bJNb-QvP*B%FsEvGcI$^xL8h z^WM6D;fsIY3qRCn#stvyQGIH>=y|x&rjKR^eYV)e@b6z_kTt4<%|2SrY~6Ru8NEA$ z!2T}44wE;Ucb_SkXx;@A@4Mv9!{5XEO}f0Fy<*UU@~~x`r2RHX$DOW&u|>% z{IhmGhv&@m<^}pMy1ZX9LuTveS_6#U6Ue`z?bvE&dny9ADxPyJSD$LwtmH(ZXl=3U8Ca zMHJZY`UEA?If7w)fR8bWud$1##a?`mJ?wG4kKgefzQs4ZK2oR@j`z>^56OtUBk#$l HvRD2GS)0Q(SCzELs zt*PoxPtW}SNq_%zO#<*1OCf8|Eb{0K69>zJ`21ED)=XpHG?L61@o?B64AAaS-$Jfo`f~tQ(*6-u`YtbFh z(jDM>7ExTc$OpiZL0_C-;`wE%zlaQsMB|dz7-6F0k{nah#k2=zKLoqaF?a|Wh;d-j`7&GxmIOOeAKd#AJtWRF~8F`OY@J`f~ciDf^ z;Gg{u{!^y!pECKU8tU(b#~8K9WmM%dtCdT8-ISJYitDMK$E+!jQHObVs{dFs?_z!O z%FoCk&Ut@`NsC-2x0FkJ-Md=4ce$SGc}$t|m~@zT zr}_^y@;;;1C$Idf?Qh9C^L~nH3ohv`@wV6fH@wpg=KWNI_ZPK3weU{YnfEJ~(eD-$rbBjF@=D9KXLg(|@JG`;%Iqyz(>h9;x6Rt26I$%vf;AY>BtM?!V!k zX)y0`4c;Hs`qaWZ(}4E}@q7OrMx_69d}8u{QsEzIfPaqXbIL!8gC_sMhWaC%gbDnB zJ7p`likUt+f7~5G7koqUe(8bl_yd3PxFp9xzTHJ`a)F1+@1I`UMom2SQF*=}{S+WC zh!&{{kcJR>p49c*DM;0G6(nP>c2GH2JE@jjxu9A4{Q3WzPvNa=@7`dw7pK4q_aOiT9|g>7;aHsvU!a@0k&?SD@7J00nlpa0`j zUZ1@3Gv+E>k*knJuDUdHbwYB#1%5u$40l+eo1cOb^urlA1y`U0F2HR#5AAS+ACC}R zhjVZiCg22If{SpI^?Knd9DvIZgK@aVDslg)|F!>(f70I?I2||}=nnJ*egVmbBSE+o F007I!1GWGF literal 0 HcmV?d00001 diff --git a/examples/rectavoider.svc16 b/examples/rectavoider.svc16 deleted file mode 100644 index 08797947b7c1a3d5048c2301cd0ef739b92a2d0b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 81422 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 P17A4z+U3`M^!on-Q2!m- diff --git a/examples/rectavoider.svc16.gz b/examples/rectavoider.svc16.gz new file mode 100644 index 0000000000000000000000000000000000000000..76c111eb2422f1b77e1b89ad264d925ebc3880d8 GIT binary patch literal 8371 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 D<|cAg literal 0 HcmV?d00001 diff --git a/specification/specification.typ b/specification/specification.typ index cf7d3b8..e9963e1 100644 --- a/specification/specification.typ +++ b/specification/specification.typ @@ -158,7 +158,8 @@ All instructions are 4 values long. A value is, of course, a `u16`. The instructions have the form `opcode` `arg1` `arg2` `arg3`. All instructions are listed in @instructions. -`@arg1` refers to the value at the memory address `arg1`. If the opcode is greater than 15, the system will abort. If one of the three arguments is not used, it can be set to any value, but it can not be omitted. +`@arg1` refers to the value at the memory address `arg1`. +If the opcode is greater than 15, the system will abort. #let instruction_table=table( @@ -167,7 +168,11 @@ All instructions are listed in @instructions. table.header( [*Opcode*], [*Name*],[*Effect*], ), - [0],[*Set*],[`@arg1=arg2`], + [0],[*Set*],[`if arg3{ + @arg1=inst_ptr + }else{ + @arg1=arg2 + }`], [1],[*GoTo*],[`if(not @arg3){inst_ptr=@arg1+arg2}`], [2],[*Skip*],[ ``` @@ -183,7 +188,7 @@ All instructions are listed in @instructions. [7],[*Cmp*],[`@arg3=(@arg1<@arg2)` (as unsigned)], [8],[*Deref*],[`@arg2=@(@arg1+arg3)`], [9],[*Ref*],[`@(@arg1+arg3)=@arg2`], - [10],[*Inst*],[`@arg1=inst_ptr`], + [10],[*Debug*],[Provides `arg1,@arg2,@arg3` as debug information], [11],[*Print*],[Writes `value=@arg1` to `index=@arg2` of buffer `arg3`], [12],[*Read*],[Copies `index=@arg1` of buffer `arg3` to `@arg2`.], [13],[*Band*],[`@arg3=@arg1&@arg2` (binary and)], @@ -200,6 +205,20 @@ Every instruction shown in @instructions advances the instruction pointer by fou When an argument refers to the name of a buffer, it means the screen buffer if it is 0 and the utility buffer otherwise. +== The Debug Instruction +The *Debug* instruction is special, as it does not change anything about the state of the system. +It still counts as an instruction for the maximum instruction count. +It is up to the implementation if, when and in what way the information is provided to the user. +This means that it is valid to not do anything when the instruction is triggered. +In fact, this might be necessary to run the emulator at the intended speed. + +The way to think about the signature of the instruction is that the first argument is a label and the other arguments are the values of variables/addresses. + +The instruction is meant only for debugging. +For the programmer that means that the output should not be needed for the use of the program or game as it might be shown in different ways or not at all. +For the emulator that means that there should be no functionality that depends on the *Debug* instruction. + + = Constructing the Program A program is really just the initial state of the main memory. diff --git a/src/cli.rs b/src/cli.rs index 71a9e7e..e690698 100644 --- a/src/cli.rs +++ b/src/cli.rs @@ -27,7 +27,7 @@ pub struct Cli { short, long, default_value_t = false, - help = "Show performance metrics" + help = "Show performance metrics and debug info" )] pub verbose: bool, #[arg( diff --git a/src/engine.rs b/src/engine.rs index b743314..9298673 100644 --- a/src/engine.rs +++ b/src/engine.rs @@ -13,7 +13,7 @@ const DIV: u16 = 6; const CMP: u16 = 7; const DEREF: u16 = 8; const REF: u16 = 9; -const INST: u16 = 10; +const DEBUG: u16 = 10; const PRINT: u16 = 11; const READ: u16 = 12; const BAND: u16 = 13; @@ -115,11 +115,15 @@ impl Engine { fn advance_inst_ptr(&mut self) { self.instruction_pointer = self.instruction_pointer.wrapping_add(4); } - pub fn step(&mut self) -> Result<(), EngineError> { + pub fn step(&mut self) -> Result, EngineError> { let [opcode, arg1, arg2, arg3] = self.read_instruction(); match opcode { SET => { - self.set(arg1, arg2); + let value = match arg3 { + 0 => arg2, + _ => self.instruction_pointer, + }; + self.set(arg1, value); self.advance_inst_ptr(); } GOTO => { @@ -177,10 +181,12 @@ impl Engine { self.set(self.get(arg1) + arg3, value); self.advance_inst_ptr(); } - INST => { - let value = self.instruction_pointer; - self.set(arg1, value); + DEBUG => { + let label = arg1; + let value1 = self.get(arg2); + let value2 = self.get(arg3); self.advance_inst_ptr(); + return Ok(Some((label, value1, value2))); } PRINT => { if arg3 == 0 { @@ -219,6 +225,6 @@ impl Engine { } _ => return Err(EngineError::InvalidInstruction(opcode)), } - Ok(()) + Ok(None) } } diff --git a/src/main.rs b/src/main.rs index a07b670..cb23554 100644 --- a/src/main.rs +++ b/src/main.rs @@ -77,7 +77,14 @@ async fn main() -> Result<()> { if !paused { ipf = 0; while !engine.wants_to_sync() && ipf <= MAX_IPF { - engine.step()?; + if let Some(debug_output) = engine.step()? { + if cli.verbose { + println!( + "DEBUG label: {} values: {}, {}", + debug_output.0, debug_output.1, debug_output.2 + ); + } + } ipf += 1; }