[][src]Struct ggbasm::RomBuilder

pub struct RomBuilder { /* fields omitted */ }

Keeps track of the state of a rom as it is being constructed.

Keeps track of the current address and inserts binary data and instructions at that address. The address is advanced when binary data or instructions are added and can also be manually advanced. When manually advanced the area in between is filled with zeroes. The address can only be advanced, it can never go backwards.

In *.asm files, the advance_address instruction will cause the space between the last instruction . and the new address to be filled with zeroes.

Implementations

impl RomBuilder[src]

pub fn new() -> Result<RomBuilder, Error>[src]

Creates a RomBuilder.

pub fn add_basic_interrupts_and_jumps(mut self: Self) -> Result<Self, Error>[src]

Adds basic interrupt and jump data from 0x0000 to 0x0103.

The entry point jumps to 0x0150. The interrupts return immediately. The RST commands jump to the entry point. Returns an error if the RomBuilder address is not at 0x0000.

pub fn add_header(mut self: Self, header: Header) -> Result<Self, Error>[src]

Adds provided header data at 0x0104 to 0x149.

Returns an error if the RomBuilder address is not at 0x104

pub fn add_bytes(
    mut self: Self,
    bytes: Vec<u8>,
    identifier: &str
) -> Result<Self, Error>
[src]

Includes raw bytes in the rom. The name is used to reference the address in assembly code. Returns an error if crosses rom bank boundaries.

pub fn add_image(
    mut self: Self,
    file_name: &str,
    identifier: &str,
    color_map: &HashMap<Color, u8>
) -> Result<Self, Error>
[src]

Includes graphics data generated from the provided image file in the graphics folder.

The name is used to reference the address in assembly code. Returns an error if crosses rom bank boundaries. The color_map argument specifes how to convert 24 bit rgb color values into the 2 bit color values used by the gameboy.

TODO: Describe the format of generated images.

pub fn add_audio_file(self, file_name: &str) -> Result<Self, Error>[src]

Includes audio data generated from the provided ggbasm audio text file in the audio folder.

Returns an error if crosses rom bank boundaries.

Currently only supports playing one track at a time, playing sound effects on top of background music might not be possible with the current architecture. Oops...

Format

There are long lines containing the data for each sound register and how long to wait before running the next command. There are also various commands to e.g. set a label or continue playing from a specific label

label my_cool_song
07                       D6:2:10:7:4Y:NY
07                       D6:2:10:7:4Y:NY
07  D6:2:10:7:4Y:NY:Y00                 
07                       D6:2:10:7:4Y:NY
07  D6:2:10:7:4Y:NY:Y00  D6:2:10:7:4Y:NY
playfrom my_cool_song

Channel formats

Data for each channel is written on the same line like this:

RST CHANNEL1             CHANNEL2         CHANNEL3      CHANNEL4
0F  D6:2:10:7:4Y:NY:Y00  D6:2:10:7:4Y:NY  TODO          TODO

Only changes between lines are included in the audio data.

Channel 1 format:

AB:C:DD:E:FG:HI:JKL

Key:

  • A: Note A-G (natural), a-g (sharp)
  • B: Octave 1-8
  • C: Duty 0-3
  • DD: length 0-3F
  • E: envelope initial volume 0-F
  • F: envelope argument 0-7
  • G: envelope increase Y/N
  • H: enable length Y/N
  • I: initial Y/N
  • J: sweep increase Y/N
  • K: sweep time 0-7
  • L: number of sweeps 0-7

For example: D6:2:10:7:4Y:NY:Y00

Channel 2 format:

AB:C:DD:E:FG:HI

Key:

  • A: Note A-G (natural), a-g (sharp)
  • B: Octave 1-8
  • C: Duty 0-3
  • DD: length 0-3F
  • E: envelope initial volume 0-F
  • F: envelope argument 0-7
  • G: envelope increase Y/N
  • H: enable length Y/N
  • I: initial Y/N

For example: D6:2:10:7:4Y:NY

Channel 3 format:

TODO

Channel 4 format:

TODO

Control lines

  • rest AA - rest AA frames before continuing
  • jp foo - set the GGBASMAudio
  • disable - disables audio by setting the value at GGBASMAudioEnable to 0

TODO: Maybe syntax highlighting could help make the audio format more readable

pub fn add_audio_player(self) -> Result<Self, Error>[src]

Includes bytecodes generated from the audio player

Returns an error if crosses rom bank boundaries.

Functions

This should be called once during initialization:

call GGBASMInitAudio

This should be called once per frame:

call GGBASMStepAudio

RAM Locations

These identifiers need to be set to some unused ram values.

GGBASMAudioEnable    EQU 0xC020 ; dont process music when 0 otherwise process it
GGBASMAudioBank      EQU 0xC021 ; the bank the currently playing song is stored on
GGBASMAudioPointerLo EQU 0xC022 ; pointer to the currently playing song
GGBASMAudioPointerHi EQU 0xC023
GGBASMAudioRest      EQU 0xC024 ; rest for this many steps

Change the currently playing song by setting GGBASMAudioBank, GGBASMAudioPointerHi and GGBASMAudioPointerLo to the address of the song you want to play

Make sure the memory is accessible (correct bank enabled) whenever an audio function is called.

pub fn add_asm_file(self, file_name: &str) -> Result<Self, Error>[src]

Includes bytecodes generated from the provided assembly file in the gbasm folder.

TODO: Document the syntax. Its very similar to the RGBDS syntax with the addition of the advance_address command. However we should have our syntax documentation listing every instruction and every operator in rom compile time expressions.

Returns an error if crosses rom bank boundaries. Returns an error if encounters file system issues.

pub fn add_instructions(
    self,
    instructions: Vec<Instruction>
) -> Result<Self, Error>
[src]

This function is used to include instructions in the rom. Returns an error if crosses rom bank boundaries.

pub fn advance_address(
    mut self: Self,
    rom_bank: u32,
    address: u32
) -> Result<Self, Error>
[src]

Sets the current address and bank as specified. Returns an error if attempts to go backwards. To cross bank boundaries you need to use this function.

pub fn get_address_global(&self) -> u32[src]

Gets the current address within the entire rom.

pub fn get_address_bank(&self) -> u16[src]

Gets the current address within the current bank.

pub fn get_bank(&self) -> u32[src]

Gets the current bank.

pub fn print_variables_by_value(self) -> Result<Self, Error>[src]

pub fn print_variables_by_identifier(self) -> Result<Self, Error>[src]

pub fn compile(mut self: Self) -> Result<Vec<u8>, Error>[src]

Compiles assembly and binary data into binary rom data.

pub fn write_to_disk(self, name: &str) -> Result<(), Error>[src]

Compile the ROM then write it to disk at the root of the project. The root of the project is the outermost directory containing a Cargo.toml file.

pub fn write_to_disk_html(self, _name: &str) -> Result<(), Error>[src]

Provide some sort of mechanism to generate an html file with embedded gb emulator and rom data. Use Cargo.toml metadata to generate a link to repository, include developers name etc. (use panic-handler as a reference here) This is completely unimplemented, its just a reminder to do this some day.

Auto Trait Implementations

Blanket Implementations

impl<T> Any for T where
    T: 'static + ?Sized
[src]

impl<T> Borrow<T> for T where
    T: ?Sized
[src]

impl<T> BorrowMut<T> for T where
    T: ?Sized
[src]

impl<T> Conv for T

impl<T> Conv for T

impl<T> FmtForward for T

impl<T> From<T> for T[src]

impl<T, U> Into<U> for T where
    U: From<T>, 
[src]

impl<T> Pipe for T where
    T: ?Sized

impl<T> Pipe for T

impl<T> PipeAsRef for T

impl<T> PipeBorrow for T

impl<T> PipeDeref for T

impl<T> PipeRef for T

impl<T> Pointable for T

type Init = T

The type for initializers.

impl<T> Tap for T

impl<T> Tap for T

impl<T, U> TapAsRef<U> for T where
    U: ?Sized

impl<T, U> TapBorrow<U> for T where
    U: ?Sized

impl<T> TapDeref for T

impl<T> TryConv for T

impl<T> TryConv for T

impl<T, U> TryFrom<U> for T where
    U: Into<T>, 
[src]

type Error = Infallible

The type returned in the event of a conversion error.

impl<T, U> TryInto<U> for T where
    U: TryFrom<T>, 
[src]

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.