5 releases
Uses old Rust 2015
0.1.4 | Nov 15, 2021 |
---|---|
0.1.3 | Aug 10, 2021 |
0.1.2 | Feb 22, 2016 |
0.1.1 | Feb 16, 2016 |
0.1.0 | Feb 11, 2016 |
#306 in Emulators
Used in ya6502
57KB
1K
SLoC
A 6502 assembler as a Rust macro
If you want to lose a bit of your sanity, then this crate is for you!
(no but seriously, you want to use a macro to assemble stuff?)
Implemented Features
- Full compile-time assembly to executable machine code
- Machine code is emitted as a constant
u8
array (you can store it in astatic
orconst
) - Label support (
loop: jmp loop
,beq start
) - Supports all official 6502 opcodes and addressing modes
lib.rs
:
A MOS6502 assembler implemented as a macro.
Note: Due to limitations in Rust macros, there are two deviations from a typical 6502 assembly syntax:
- For absolute addressing mode, you need to use
abs
after the mnemonic (eg.lda abs 0xffff
). - For accumulator addressing mode, you need to use
a
after the mnemonic (eg.lsr a
).
Example
#[macro_use] #[no_link]
extern crate rustasm6502;
fn main() {
let machine_code = assemble6502! {
lda #0x00
ldx #0x00
ldy #0x00
txs
main:
adc 0xff // Zero-Page
adc abs 0x1234 // Absolute address 0x1234
ror a // Rotate the accumulator
beq main
end:
jmp end
};
assert_eq!(machine_code, [
0xA9, 0x00,
0xA2, 0x00,
0xA0, 0x00,
0x9A,
0x65, 0xff,
0x6D, 0x34, 0x12, // Little-endian
0x6A,
0xF0, (-8i8) as u8,
0x4C, 15, 0,
]);
}