Skip to content

Commit

Permalink
Merge pull request #1 from jeroenbakker-atmind/staging
Browse files Browse the repository at this point in the history
Prerelease 0.1.0
  • Loading branch information
jeroenbakker-atmind authored Jan 29, 2025
2 parents df77897 + de89025 commit b5affb2
Show file tree
Hide file tree
Showing 36 changed files with 1,070 additions and 689 deletions.
16 changes: 8 additions & 8 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -28,12 +28,12 @@ cargo add c64-assembler

### Basic Assembly

To assemble some c64 assembly file into a PRG file:
To assemble C64 assembly.

```rust
use c64_assembler::builder::application::ApplicationBuilder;
use c64_assembler::builder::ApplicationBuilder;
use c64_assembler::builder::module::ModuleBuilder;
use c64_assembler::builder::instruction::InstructionBuilder;
use c64_assembler::builder::InstructionBuilder;

let application = ApplicationBuilder::default()
.name("Set black border")
Expand All @@ -49,11 +49,11 @@ let application = ApplicationBuilder::default()
.comment("Load black color")
.sta_addr("VIC20_BORDER_COLOR")
.rts()
.finalize(),
.build(),
)
.finalize(),
.build(),
)
.finalize();
.build();
```

After this the application can be generated to bytes (`Vec<u8>`) using the `ProgramGenerator`
Expand Down Expand Up @@ -103,10 +103,10 @@ main_entry_point:
rts
```

### Using macros (Experimental)
### Using macros (work in progress)

> [!NOTE]
> This is still in development and doesn't include all expected features yet.
> This is still in development and doesn't include all features yet.
The `c64-assembly-macro` crate introduces several macros to reduce the boiler plating.

Expand Down
44 changes: 22 additions & 22 deletions c64-assembler-6502/examples/codegen_instruction_builder.rs
Original file line number Diff line number Diff line change
Expand Up @@ -17,10 +17,10 @@ fn main() {
///
/// # Example
/// ```
/// use c64_assembler::builder::instruction::InstructionBuilder;
/// use c64_assembler::builder::InstructionBuilder;
/// let instructions = InstructionBuilder::default()
/// .{0}()
/// .finalize();
/// .build();
/// ```
pub fn {0}(&mut self) -> &mut Self {{
self.add_instruction(Operation::{1}, AddressMode::Implied);
Expand Down Expand Up @@ -48,10 +48,10 @@ fn main() {
/// Record a {0} instruction with data (byte).
/// # Example
/// ```
/// use c64_assembler::builder::instruction::InstructionBuilder;
/// use c64_assembler::builder::InstructionBuilder;
/// let instructions = InstructionBuilder::default()
/// .{0}_imm(0xC0)
/// .finalize();
/// .build();
/// ```
pub fn {0}_imm(&mut self, byte: u8) -> &mut Self {{
self.{0}(AddressMode::Immediate(Immediate::Byte(byte)))
Expand All @@ -61,11 +61,11 @@ fn main() {
///
/// # Example
/// ```
/// use c64_assembler::builder::instruction::InstructionBuilder;
/// use c64_assembler::builder::InstructionBuilder;
/// let instructions = InstructionBuilder::default()
/// .{0}_imm_low(\"test_data\")
/// .label(\"test_data\")
/// .finalize();
/// .build();
/// ```
pub fn {0}_imm_low(&mut self, address_name: &str) -> &mut Self {{
self.{0}(AddressMode::Immediate(Immediate::Low(
Expand All @@ -77,11 +77,11 @@ fn main() {
///
/// # Example
/// ```
/// use c64_assembler::builder::instruction::InstructionBuilder;
/// use c64_assembler::builder::InstructionBuilder;
/// let instructions = InstructionBuilder::default()
/// .{0}_imm_high(\"test_data\")
/// .label(\"test_data\")
/// .finalize();
/// .build();
/// ```
pub fn {0}_imm_high(&mut self, address_name: &str) -> &mut Self {{
self.{0}(AddressMode::Immediate(Immediate::High(
Expand All @@ -99,10 +99,10 @@ fn main() {
///
/// # Example
/// ```
/// use c64_assembler::builder::instruction::InstructionBuilder;
/// use c64_assembler::builder::InstructionBuilder;
/// let instructions = InstructionBuilder::default()
/// .{0}_acc()
/// .finalize();
/// .build();
/// ```
pub fn {0}_acc(&mut self) -> &mut Self {{
self.{0}(AddressMode::Accumulator)
Expand All @@ -119,11 +119,11 @@ fn main() {
///
/// # Example
/// ```
/// use c64_assembler::builder::instruction::InstructionBuilder;
/// use c64_assembler::builder::InstructionBuilder;
/// let instructions = InstructionBuilder::default()
/// .{0}_addr(\"test_label\")
/// .label(\"test_label\")
/// .finalize();
/// .build();
/// ```
pub fn {0}_addr(&mut self, address_name: &str) -> &mut Self {{
self.{0}(AddressMode::Absolute(AddressReference::new(address_name)))
Expand All @@ -134,11 +134,11 @@ fn main() {
///
/// # Example
/// ```
/// use c64_assembler::builder::instruction::InstructionBuilder;
/// use c64_assembler::builder::InstructionBuilder;
/// let instructions = InstructionBuilder::default()
/// .{0}_addr_offs(\"test_label\", 8)
/// .label(\"test_label\")
/// .finalize();
/// .build();
/// ```
pub fn {0}_addr_offs(&mut self, address_name: &str, offset: Address) -> &mut Self {{
self.{0}(AddressMode::Absolute(AddressReference::with_offset(
Expand All @@ -156,12 +156,12 @@ fn main() {
///
/// # Example
/// ```
/// use c64_assembler::builder::instruction::InstructionBuilder;
/// use c64_assembler::builder::InstructionBuilder;
/// let instructions = InstructionBuilder::default()
/// .lda_imm(0x08)
/// .{0}_addr_x(\"test_label\")
/// .label(\"test_label\")
/// .finalize();
/// .build();
/// ```
pub fn {0}_addr_x(&mut self, address_name: &str) -> &mut Self {{
self.{0}(AddressMode::AbsoluteX(AddressReference::new(address_name)))
Expand All @@ -177,12 +177,12 @@ fn main() {
///
/// # Example
/// ```
/// use c64_assembler::builder::instruction::InstructionBuilder;
/// use c64_assembler::builder::InstructionBuilder;
/// let instructions = InstructionBuilder::default()
/// .lda_imm(0x08)
/// .{0}_addr_y(\"test_label\")
/// .label(\"test_label\")
/// .finalize();
/// .build();
/// ```
pub fn {0}_addr_y(&mut self, address_name: &str) -> &mut Self {{
self.{0}(AddressMode::AbsoluteY(AddressReference::new(address_name)))
Expand All @@ -198,11 +198,11 @@ fn main() {
///
/// # Example
/// ```
/// use c64_assembler::builder::instruction::InstructionBuilder;
/// use c64_assembler::builder::InstructionBuilder;
/// let instructions = InstructionBuilder::default()
/// .{0}_addr(\"test_label\")
/// .label(\"test_label\")
/// .finalize();
/// .build();
/// ```
pub fn {0}_addr(&mut self, address_name: &str) -> &mut Self {{
self.{0}(AddressMode::Relative(AddressReference::new(address_name)))
Expand All @@ -213,11 +213,11 @@ fn main() {
///
/// # Example
/// ```
/// use c64_assembler::builder::instruction::InstructionBuilder;
/// use c64_assembler::builder::InstructionBuilder;
/// let instructions = InstructionBuilder::default()
/// .{0}_addr_offs(\"test_label\", 8)
/// .label(\"test_label\")
/// .finalize();
/// .build();
/// ```
pub fn {0}_addr_offs(&mut self, address_name: &str, offset: Address) -> &mut Self {{
self.{0}(AddressMode::Relative(AddressReference::with_offset(
Expand Down
19 changes: 10 additions & 9 deletions c64-assembler-6502/examples/codegen_instruction_test.rs
Original file line number Diff line number Diff line change
Expand Up @@ -35,7 +35,7 @@ fn main() {
use crate::test_first;
const OP: Operation = Operation::{1};
",
def.instruction.to_string(),
def.instruction,
def.instruction.to_string().to_uppercase()
));

Expand All @@ -61,7 +61,7 @@ fn main() {
test_first(
instructions!({0} #<test),
OP,
AddressMode::Immediate(Immediate::Low(AddressReference::new(\"test\"))),
AddressMode::Immediate(Immediate::Low(AddressReference::new(&\"test\"))),
);
}}
Expand All @@ -70,7 +70,7 @@ fn main() {
test_first(
instructions!({0} #>test),
OP,
AddressMode::Immediate(Immediate::High(AddressReference::new(\"test\"))),
AddressMode::Immediate(Immediate::High(AddressReference::new(&\"test\"))),
);
}}
",
Expand All @@ -90,7 +90,7 @@ fn main() {
);
}}
",
def.instruction.to_string()
def.instruction
));
}

Expand Down Expand Up @@ -155,7 +155,7 @@ fn main() {
);
}}
",
def.instruction.to_string()
def.instruction
));
}
if def.absolute_y != NO_ABSOLUTE_Y || def.zeropage_y != NO_ZEROPAGE_Y {
Expand All @@ -170,7 +170,7 @@ fn main() {
);
}}
",
def.instruction.to_string()
def.instruction
));
}
/*
Expand Down Expand Up @@ -223,11 +223,12 @@ fn main() {
*/

// Close module
lines.push(format!(
lines.push(
"
}}
}
"
));
.to_string(),
);
}

print!("{}", lines.join("\n"));
Expand Down
30 changes: 15 additions & 15 deletions c64-assembler-6502/examples/codegen_opcodes.rs
Original file line number Diff line number Diff line change
Expand Up @@ -9,30 +9,30 @@ fn main() {
result.push(format!(
"/// OpCode for the {} instruction in addressing mode {}
pub const {}_{}:OpCode = 0x{:02x};",
instruction.to_string(),
instruction,
post.to_lowercase(),
instruction.to_string().to_uppercase(),
post.to_string(),
post,
opcode
));
}
}

let mut lines = Vec::<String>::default();
for def in isa_6502() {
format_opcode(&mut lines, &def.instruction, def.implied, "IMPLIED");
format_opcode(&mut lines, &def.instruction, def.immediate, "IMMEDIATE");
format_opcode(&mut lines, &def.instruction, def.accumulator, "ACCUMULATOR");
format_opcode(&mut lines, &def.instruction, def.absolute, "ABSOLUTE");
format_opcode(&mut lines, &def.instruction, def.absolute_x, "ABSOLUTE_X");
format_opcode(&mut lines, &def.instruction, def.absolute_y, "ABSOLUTE_Y");
format_opcode(&mut lines, &def.instruction, def.zeropage, "ZEROPAGE");
format_opcode(&mut lines, &def.instruction, def.zeropage_x, "ZEROPAGE_X");
format_opcode(&mut lines, &def.instruction, def.zeropage_y, "ZEROPAGE_Y");
format_opcode(&mut lines, &def.instruction, def.relative, "RELATIVE");
format_opcode(&mut lines, &def.instruction, def.indirect, "INDIRECT");
format_opcode(&mut lines, &def.instruction, def.indexed_indirect, "INDEXED_INDIRECT");
format_opcode(&mut lines, &def.instruction, def.indirect_indexed, "INDIRECT_INDEXED");
format_opcode(&mut lines, def.instruction, def.implied, "IMPLIED");
format_opcode(&mut lines, def.instruction, def.immediate, "IMMEDIATE");
format_opcode(&mut lines, def.instruction, def.accumulator, "ACCUMULATOR");
format_opcode(&mut lines, def.instruction, def.absolute, "ABSOLUTE");
format_opcode(&mut lines, def.instruction, def.absolute_x, "ABSOLUTE_X");
format_opcode(&mut lines, def.instruction, def.absolute_y, "ABSOLUTE_Y");
format_opcode(&mut lines, def.instruction, def.zeropage, "ZEROPAGE");
format_opcode(&mut lines, def.instruction, def.zeropage_x, "ZEROPAGE_X");
format_opcode(&mut lines, def.instruction, def.zeropage_y, "ZEROPAGE_Y");
format_opcode(&mut lines, def.instruction, def.relative, "RELATIVE");
format_opcode(&mut lines, def.instruction, def.indirect, "INDIRECT");
format_opcode(&mut lines, def.instruction, def.indexed_indirect, "INDEXED_INDIRECT");
format_opcode(&mut lines, def.instruction, def.indirect_indexed, "INDIRECT_INDEXED");
}

println!("{}", lines.join("\n"));
Expand Down
Loading

0 comments on commit b5affb2

Please sign in to comment.