1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223
//! An implementation of the [`pir-8` ISA](https://github.com/thecoshman/pir-8/blob/master/ISA.md). //! //! # The library //! //! [`pir-8-emu`](https://github.com/LoungeCPP/pir-8-emu) can be thought of as consisting of layers: //! //! The first layer is the [`isa`](isa/) module, //! which contains a pure implementation of the [`pir-8` ISA](https://github.com/thecoshman/pir-8/blob/master/ISA.md), //! and can be used on its own to parse/generate binaries and assembly at the instruction level. //! //! The second layer is the [`vm`](vm/) module, //! which contains parts of VM memory and port handling. //! //! The third layer is the [`micro`](micro/) module, //! which contains a full stack-based microcode implementation, //! and can be used to fully emulate a `pir-8` machine (see example inside). //! //! The fourth layer is the various [`binutils`](binutils/), //! which contain useful parts of the executables, //! like [`AssemblerDirective`](binutils/pir_8_as/enum.AssemblerDirective.html) and //! [`OutputWithQueue`](binutils/pir_8_as/struct.OutputWithQueue.html), //! or [`NativePortHandler`](binutils/pir_8_emu/struct.NativePortHandler.html). //! //! These utilities can be used to quickly and correctly build off existing solutions, //! but may have some quirks or be less absolutely generic //! (e.g. [`Vm`](binutils/pir_8_emu/struct.Vm.html) will allow you to integrate //! a fully (as-emulator) controllable and functional `pir-8` virtual machine in about 5 lines, //! but it needs to have the `INS` SP register be observed after each μOp (see example inside)). //! //! # The binaries //! //! The headers link to manpages with more detailed usage instructions: //! //! ## [`pir-8-as`](https://rawcdn.githack.com/LoungeCPP/pir-8-emu/man/pir-8-as.1.html) //! //! An assembler with an… idiosyncratic syntax: //! //! ```p8a //! LOAD IMM WIDE C&D //! :label load-offset full message -1 //! //! :label save loop //! MOVE D X //! LOAD IMM BYTE Y //! 1 //! ALU ADD //! MOVE S D //! MOVE C X //! LOAD IMM BYTE Y //! 0 //! ALU ADDC //! MOVE S C //! MADR WRITE C&D //! //! LOAD IMM BYTE A //! 0 ; port number //! LOAD IND B //! PORT OUT B //! //! MOVE B S //! COMP S //! //! LOAD IMM WIDE ADR //! :label load full end //! JMZG //! LOAD IMM WIDE ADR //! :label load full loop //! JUMP //! //! :label save end //! HALT //! //! //! :label save message //! :literal "*pounces on u* OwO what's whis?" //! ``` //! //! If you'd rather use a more normal syntax, [CatPlusPlus](https://github.com/TheCatPlusPlus) has also made //! a [`fasm`-based assembler](https://github.com/TheCatPlusPlus/pir8/tree/master/Assembler): //! //! ```asm //! include 'pir8.finc' //! //! origin 0x0002 //! //! load a, [0x0000] //! load b, [0x0001] //! //! top: //! move x, a //! move y, b //! sub //! //! jmpz exit //! //! move s, a //! comp b //! //! jmpl lt //! //! sub //! move a, s //! jump top //! //! lt: //! move y, a //! move x, b //! sub //! move b, s //! jump top //! //! exit: //! move d, a //! halt //! ``` //! //! ## [`pir-8-disasm`](https://rawcdn.githack.com/LoungeCPP/pir-8-emu/man/pir-8-disasm.1.html) //! //! A dissassembler with a [`ndisasm`](https://www.nasm.us)-based frontend: //! //! ```plaintext //! $ pir-8-disasm -k 0x27,31 test-data/copy-any-length-literal-to-port.p8b //! 00000000 1E LOAD IMM C //! 00000001 00 D 0x00 //! 00000002 1A LOAD IMM X //! 00000003 27 D 0x27 //! 00000004 1B LOAD IMM Y //! 00000005 01 D 0x01 //! 00000006 31 ALU SUB //! 00000007 4A MOVE S X //! 00000008 4F MOVE S D //! 00000009 7A MOVE D X //! 0000000A 1B LOAD IMM Y //! 0000000B 01 D 0x01 //! 0000000C 30 ALU ADD //! 0000000D 4F MOVE S D //! 0000000E 72 MOVE C X //! 0000000F 1B LOAD IMM Y //! 00000010 00 D 0x00 //! 00000011 32 ALU ADDC //! 00000012 4E MOVE S C //! 00000013 0D MADR WRITE C&D //! 00000014 1C LOAD IMM A //! 00000015 00 D 0x00 //! 00000016 25 LOAD IND B //! 00000017 E5 PORT OUT B //! 00000018 69 MOVE B S //! 00000019 F1 COMP S //! 0000001A 1C LOAD IMM A //! 0000001B 00 D 0x00 //! 0000001C 1D LOAD IMM B //! 0000001D 26 D 0x26 //! 0000001E 0C MADR WRITE A&B //! 0000001F 14 JMZG //! 00000020 1C LOAD IMM A //! 00000021 00 D 0x00 //! 00000022 1D LOAD IMM B //! 00000023 09 D 0x09 //! 00000024 0C MADR WRITE A&B //! 00000025 17 JUMP //! 00000026 FF HALT //! 00000027 S skipping 0x1F bytes //! ``` //! //! ## [`pir-8-emu`](https://rawcdn.githack.com/LoungeCPP/pir-8-emu/man/pir-8-emu.1.html) //! //! The emulator in-of itself: //! //! ![Emulator screenshot](data:image/png;base64,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) //! //! # Example programs //! //! Apart from the two forthlaid above, //! take a look at the [`test-data/`](https://github.com/LoungeCPP/pir-8-emu/tree/master/test-data) directory in the git repo, //! which contains a mix of assembler programs (`.p8a`), program binaries (`.p8b`), and derivations/hand-assemblies (`.diz`). //! //! # Native handlers //! //! For more information, //! consult the documentation on [`RawNativePortHandler`](binutils/pir_8_emu/struct.RawNativePortHandler.html). //! //! For examples, take a look at the [`handler-examples/`](https://github.com/LoungeCPP/pir-8-emu/tree/master/handler-examples) //! directory in the git repo. //! Running `make` at the root thereof *should* build them without much hassle, //! if it doesn't, please [open an issue](https://github.com/LoungeCPP/pir-8-emu/issues). //! //! The //! [`include/pir-8-emu/port_handler.h`](https://github.com/LoungeCPP/pir-8-emu/tree/master/include/pir-8-emu/port_handler.h) //! file contains C declarations. //! //! # Special thanks //! //! To all who support further development on [Patreon](https://patreon.com/nabijaczleweli), in particular: //! //! * ThePhD extern crate bear_lib_terminal; #[macro_use] extern crate downcast_rs; #[macro_use] extern crate lazy_static; extern crate arraydeque; #[macro_use] extern crate const_cstr; extern crate num_traits; extern crate dlopen; extern crate serde; #[macro_use] extern crate clap; extern crate libc; extern crate dirs; extern crate toml; mod rw; pub mod vm; pub mod isa; pub mod util; pub mod micro; pub mod options; pub mod binutils; pub use self::rw::{ReadWriteMarker, ReadWritable};