From b22b36bc2a3445f1047ae2342436ac5597c627f0 Mon Sep 17 00:00:00 2001 From: Johannes Muenzel Date: Fri, 26 Sep 2014 02:29:27 -0400 Subject: [PATCH] Get some basic definitions and module structure going. Not sure whether Cargo.lock should be in .gitignore --- .gitignore | 1 + Cargo.toml | 40 +++++++++ src/defs6502/Cargo.toml | 36 +++++++++ src/defs6502/lib.rs | 39 +++++++++ src/defs6502/machine/mod.rs | 156 ++++++++++++++++++++++++++++++++++++ src/exe/main.rs | 37 +++++++++ 6 files changed, 309 insertions(+) create mode 100644 Cargo.toml create mode 100644 src/defs6502/Cargo.toml create mode 100644 src/defs6502/lib.rs create mode 100644 src/defs6502/machine/mod.rs create mode 100644 src/exe/main.rs diff --git a/.gitignore b/.gitignore index 718e797..a50055b 100644 --- a/.gitignore +++ b/.gitignore @@ -1,3 +1,4 @@ +Cargo.lock *.a *.aux *.bc diff --git a/Cargo.toml b/Cargo.toml new file mode 100644 index 0000000..3a54a43 --- /dev/null +++ b/Cargo.toml @@ -0,0 +1,40 @@ +# Copyright (C) 2014 The 6502-rs Developers +# All rights reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions +# are met: +# 1. Redistributions of source code must retain the above copyright +# notice, this list of conditions and the following disclaimer. +# 2. Redistributions in binary form must reproduce the above copyright +# notice, this list of conditions and the following disclaimer in the +# documentation and/or other materials provided with the distribution. +# 3. Neither the names of the copyright holders nor the names of any +# contributors may be used to endorse or promote products derived from this +# software without specific prior written permission. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE +# LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +# POSSIBILITY OF SUCH DAMAGE. + +[package] + +name = "6502-rs" +version = "0.0.1" +authors = ["The 6502-rs Developers"] + +[[bin]] +name = "6502-rs" +path = "src/exe/main.rs" + +[dependencies.defs6502] +path="src/defs6502" + diff --git a/src/defs6502/Cargo.toml b/src/defs6502/Cargo.toml new file mode 100644 index 0000000..e3d8ff4 --- /dev/null +++ b/src/defs6502/Cargo.toml @@ -0,0 +1,36 @@ +# Copyright (C) 2014 The 6502-rs Developers +# All rights reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions +# are met: +# 1. Redistributions of source code must retain the above copyright +# notice, this list of conditions and the following disclaimer. +# 2. Redistributions in binary form must reproduce the above copyright +# notice, this list of conditions and the following disclaimer in the +# documentation and/or other materials provided with the distribution. +# 3. Neither the names of the copyright holders nor the names of any +# contributors may be used to endorse or promote products derived from this +# software without specific prior written permission. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE +# LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +# POSSIBILITY OF SUCH DAMAGE. + +[package] +name = "defs6502" +version = "0.0.1" +authors = [ "The 6502-rs Developers" ] + +[lib] +name = "defs6502" +path = "lib.rs" + diff --git a/src/defs6502/lib.rs b/src/defs6502/lib.rs new file mode 100644 index 0000000..df841ba --- /dev/null +++ b/src/defs6502/lib.rs @@ -0,0 +1,39 @@ +// Copyright (C) 2014 The 6502-rs Developers +// All rights reserved. +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions +// are met: +// 1. Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// 2. Redistributions in binary form must reproduce the above copyright +// notice, this list of conditions and the following disclaimer in the +// documentation and/or other materials provided with the distribution. +// 3. Neither the names of the copyright holders nor the names of any +// contributors may be used to endorse or promote products derived from this +// software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +// AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +// ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE +// LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +// CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +// SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +// INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +// CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +// ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +// POSSIBILITY OF SUCH DAMAGE. + +pub use machine::ProcessorStatus; +pub use machine::Machine; +pub use machine::StackPointer; +pub use machine::STACK_POINTER_IN_MEMORY_LO; +pub use machine::STACK_POINTER_IN_MEMORY_HI; +pub use machine::MemoryAddr; +pub use machine::stack_pointer_to_addr; +pub use machine::Instruction; +pub use machine::AddressingMode; + +mod machine; + diff --git a/src/defs6502/machine/mod.rs b/src/defs6502/machine/mod.rs new file mode 100644 index 0000000..a91681c --- /dev/null +++ b/src/defs6502/machine/mod.rs @@ -0,0 +1,156 @@ +// Copyright (C) 2014 The 6502-rs Developers +// All rights reserved. +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions +// are met: +// 1. Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// 2. Redistributions in binary form must reproduce the above copyright +// notice, this list of conditions and the following disclaimer in the +// documentation and/or other materials provided with the distribution. +// 3. Neither the names of the copyright holders nor the names of any +// contributors may be used to endorse or promote products derived from this +// software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +// AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +// ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE +// LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +// CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +// SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +// INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +// CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +// ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +// POSSIBILITY OF SUCH DAMAGE. + +// Abbreviations +// +// Registers +// +// A accumulator +// X general purpose register +// Y general purpose register +// SP stack pointer +// NV-BDIZC processor status flags -- see ProcessorStatus bitflags +// PC program counter +// +// M stands for `Memory location` + +pub bitflags! { + flags ProcessorStatus: u8 { + static N = 0b10000000, // Negative + static V = 0b01000000, // oVerflow + static B = 0b00010000, // Brk + static D = 0b00001000, // Decimal mode active? + static I = 0b00000100, // Irq disabled? + static Z = 0b00000010, // Zero + static C = 0b00000001, // Carry + } +} + +pub struct Machine { + A : u8, + X : u8, + Y : u8, + SP : u8, + P : ProcessorStatus, + PC : u16, +} + +impl Machine { + pub fn new() -> Machine { + Machine { A: 0, X: 0, Y: 0, SP: 0, P: ProcessorStatus::empty(), PC: 0 } + } +} + +pub struct StackPointer(u8); + +pub static STACK_POINTER_IN_MEMORY_LO : u16 = 0x0100; +pub static STACK_POINTER_IN_MEMORY_HI : u16 = 0x01FF; + +pub struct MemoryAddr(u16); + +pub fn stack_pointer_to_addr(StackPointer(x) : StackPointer) -> MemoryAddr +{ + MemoryAddr(x as u16 + STACK_POINTER_IN_MEMORY_HI) +} + +#[deriving(Show)] +pub enum Instruction + // out in +{ ADC // ADd with Carry................ A,Z,C,N = A + M + C +, AND // logical AND................... A,Z,N = A && M +, ASL // Arithmetic Shift Left......... A,Z,C,N = M << 1 +, BCC // Branch if Carry Clear......... _ <- +, BCS // Branch if Carry Set........... +, BEQ // Branch if Equal............... +, BIT // BIT test...................... a & +, BMI // Branch if Minus............... +, BNE // Branch if Not Equal........... +, BPL // Branch if Positive............ +, BRK // BReaK......................... +, BVC // Branch if oVerflow Clear...... +, BVS // Branch if oVerflow Set........ +, CLC // CLear Carry flag.............. +, CLD // Clear Decimal Mode............ +, CLI // Clear Interrupt Disable....... +, CLV // Clear oVerflow flag........... +, CMP // Compare....................... +, CPX // Compare X register............ +, CPY // Compare Y register............ +, DEC // DECrement memory.............. +, DEX // DEcrement X register.......... +, DEY // DEcrement Y register.......... +, EOR // Exclusive OR.................. +, INC // INCrement memory.............. +, INX // INcrement X register.......... +, INY // INcrement Y register.......... +, JMP // JuMP.......................... +, JSR // Jump to SubRoutine............ +, LDA // LoaD Accumulator.............. +, LDX // LoaD X register............... +, LDY // LoaD Y register............... +, LSR // Logical Shift Right........... +, NOP // No OPeration.................. +, ORA // inclusive OR.................. +, PHA // PusH Accumulator.............. +, PHP // PusH Processor status......... +, PLA // PuLl Accumulator.............. +, PLP // PuLl Processor status......... +, ROL // ROtate Left................... +, ROR // ROtate Right.................. +, RTI // ReTurn from Interrupt......... +, RTS // ReTurn from Subroutine........ +, SBC // SuBtract with Carry........... +, SEC // SEt Carry flag................ +, SED // SEt Decimal flag.............. +, SEI // SEt Interrupt disable......... +, STA // STore Accumulator............. +, STX // STore X register.............. +, STY // STore Y register.............. +, TAX // Transfer Accumulator to X..... +, TAY // Transfer Accumulator to Y..... +, TSX // Transfer Stack pointer to X... +, TXA // Transfer X to Accumulator..... +, TXS // Transfer X to Stack pointer... +, TYA // Transfer Y to Accumulator..... +} + +pub enum AddressingMode { + Immediate, + Absolute, + ZeroPage, + Implied, + IndirectAbsolute, + AbsoluteIndexedX, + AbsoluteIndexedY, + ZeroPageIndexedX, + ZeroageIndexedY, + IndexedIndirect, + IndirectIndexed, + Relative, + Accumulator, +} + diff --git a/src/exe/main.rs b/src/exe/main.rs new file mode 100644 index 0000000..fde0727 --- /dev/null +++ b/src/exe/main.rs @@ -0,0 +1,37 @@ +// Copyright (C) 2014 The 6502-rs Developers +// All rights reserved. +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions +// are met: +// 1. Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// 2. Redistributions in binary form must reproduce the above copyright +// notice, this list of conditions and the following disclaimer in the +// documentation and/or other materials provided with the distribution. +// 3. Neither the names of the copyright holders nor the names of any +// contributors may be used to endorse or promote products derived from this +// software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +// AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +// ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE +// LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +// CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +// SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +// INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +// CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +// ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +// POSSIBILITY OF SUCH DAMAGE. + +extern crate defs6502; + +use defs6502::Machine; + +fn main() { + let _q = Machine::new(); + + println!("Hello, 6502?"); +} +