ZxMemory

Trait ZxMemory 

Source
pub trait ZxMemory {
    const ROM_SIZE: usize;
    const RAMTOP: u16;
    const PAGES_MAX: u8;
    const SCR_BANKS_MAX: usize;
    const ROM_BANKS_MAX: usize;
    const RAM_BANKS_MAX: usize;
    const PAGE_SIZE: usize = 16_384usize;
Show 35 methods // Required methods fn reset(&mut self); fn read(&self, addr: u16) -> u8; fn read16(&self, addr: u16) -> u16; fn read_screen(&self, screen_bank: usize, addr: u16) -> u8; fn write(&mut self, addr: u16, val: u8); fn write16(&mut self, addr: u16, val: u16); fn mem_ref(&self) -> &[u8] ; fn mem_mut(&mut self) -> &mut [u8] ; fn screen_ref(&self, screen_bank: usize) -> Result<&ScreenArray>; fn screen_mut(&mut self, screen_bank: usize) -> Result<&mut ScreenArray>; fn page_kind(&self, page: u8) -> Result<MemoryKind>; fn page_bank(&self, page: u8) -> Result<(MemoryKind, usize)>; fn page_ref(&self, page: u8) -> Result<&[u8]>; fn page_mut(&mut self, page: u8) -> Result<&mut [u8]>; fn rom_bank_ref(&self, rom_bank: usize) -> Result<&[u8]>; fn rom_bank_mut(&mut self, rom_bank: usize) -> Result<&mut [u8]>; fn ram_bank_ref(&self, ram_bank: usize) -> Result<&[u8]>; fn ram_bank_mut(&mut self, ram_bank: usize) -> Result<&mut [u8]>; fn map_rom_bank(&mut self, rom_bank: usize, page: u8) -> Result<()>; fn map_ram_bank(&mut self, ram_bank: usize, page: u8) -> Result<()>; // Provided methods fn map_exrom(&mut self, _exrom_bank: ExRom, _page: u8) -> Result<()> { ... } fn unmap_exrom(&mut self, _exrom_bank: &ExRom) { ... } fn is_exrom_at(&self, _page: u8) -> bool { ... } fn has_mapped_exrom(&self, _exrom_bank: &ExRom) -> bool { ... } fn page_index_at(&self, address: u16) -> Result<MemPageOffset> { ... } fn rom_ref(&self) -> &[u8] { ... } fn rom_mut(&mut self) -> &mut [u8] { ... } fn ram_ref(&self) -> &[u8] { ... } fn ram_mut(&mut self) -> &mut [u8] { ... } fn load_into_rom<R: Read>(&mut self, rd: R) -> Result<()> { ... } fn load_into_rom_bank<R: Read>( &mut self, rom_bank: usize, rd: R, ) -> Result<()> { ... } fn iter_pages<A: RangeBounds<u16>>( &self, address_range: A, ) -> Result<MemPageRefIter<'_, Self>> { ... } fn for_each_page_mut<A: RangeBounds<u16>, F>( &mut self, address_range: A, f: F, ) -> Result<()> where for<'a> F: FnMut(PageMutSlice<'a>) -> Result<()> { ... } fn load_into_mem<A: RangeBounds<u16>, R: Read>( &mut self, address_range: A, rd: R, ) -> Result<()> { ... } fn fill_mem<R, F>(&mut self, address_range: R, f: F) -> Result<()> where R: RangeBounds<u16>, F: FnMut() -> u8 { ... }
}
Expand description

A trait for interfacing ZX Spectrum’s various memory types.

Required Associated Constants§

Source

const ROM_SIZE: usize

The size of the whole ROM, not just one bank.

Source

const RAMTOP: u16

The last available memory address.

Source

const PAGES_MAX: u8

A maximum value allowed for a page argument.

Source

const SCR_BANKS_MAX: usize

A maximum value allowed for a screen_bank argument

Source

const ROM_BANKS_MAX: usize

A maximum value allowed for a rom_bank argument

Source

const RAM_BANKS_MAX: usize

A maximum value allowed for a ram_bank argument

Provided Associated Constants§

Source

const PAGE_SIZE: usize = 16_384usize

This is just a hint. Actual page sizes may vary.

Required Methods§

Source

fn reset(&mut self)

Resets memory banks.

Source

fn read(&self, addr: u16) -> u8

If addr is above RAMTOP the function should return std::u8::MAX.

Source

fn read16(&self, addr: u16) -> u16

If addr is above RAMTOP the function should return std::u16::MAX.

Source

fn read_screen(&self, screen_bank: usize, addr: u16) -> u8

Reads a byte from screen memory at the given addr.

The screen banks are different from memory banks. E.g. for Spectrum 128k then screen bank 0 resides in a memory bank 5 and screen bank 1 resides in a memory bank 7. For 16k/48k Spectrum, there is only one screen bank: 0.

addr is in screen address space (0 addresses the first byte of screen memory).

§Panics

If addr is above the upper limit of screen memory address space the function should panic. If screen_bank doesn’t exist the function should also panic.

Source

fn write(&mut self, addr: u16, val: u8)

If addr is above RAMTOP the function should do nothing.

Source

fn write16(&mut self, addr: u16, val: u16)

If addr is above RAMTOP the function should do nothing.

Source

fn mem_ref(&self) -> &[u8]

Provides a continuous view into the whole memory (all banks: ROM + RAM).

Source

fn mem_mut(&mut self) -> &mut [u8]

Provides a continuous view into the whole memory (all banks: ROM + RAM).

Source

fn screen_ref(&self, screen_bank: usize) -> Result<&ScreenArray>

Returns a reference to the screen memory.

See ZxMemory::read_screen for an explanation of screen_bank argument.

Source

fn screen_mut(&mut self, screen_bank: usize) -> Result<&mut ScreenArray>

Returns a mutable reference to the screen memory.

See ZxMemory::read_screen for an explanation of screen_bank argument.

Source

fn page_kind(&self, page: u8) -> Result<MemoryKind>

Returns an enum describing what kind of memory is currently paged at the specified page.

If an EX-ROM bank is currently mapped at the specified page a MemoryKind::Rom will be returned in this instance.

page should be less or equal to PAGES_MAX.

Source

fn page_bank(&self, page: u8) -> Result<(MemoryKind, usize)>

Returns a tuple of an enum describing what kind of memory and which bank of that memory is currently paged at the specified page.

§Note

Unlike ZxMemory::page_kind this method ignores if an EX-ROM bank is currently mapped at the specified page. In this instance, the returned value corresponds to a memory bank that would be mapped at the page if the EX-ROM bank wasn’t mapped.

page should be less or equal to PAGES_MAX.

Source

fn page_ref(&self, page: u8) -> Result<&[u8]>

page should be less or equal to PAGES_MAX.

Source

fn page_mut(&mut self, page: u8) -> Result<&mut [u8]>

page should be less or equal to PAGES_MAX.

Source

fn rom_bank_ref(&self, rom_bank: usize) -> Result<&[u8]>

rom_bank should be less or equal to ROM_BANKS_MAX.

Source

fn rom_bank_mut(&mut self, rom_bank: usize) -> Result<&mut [u8]>

rom_bank should be less or equal to ROM_BANKS_MAX.

Source

fn ram_bank_ref(&self, ram_bank: usize) -> Result<&[u8]>

ram_bank should be less or equal to RAM_BANKS_MAX.

Source

fn ram_bank_mut(&mut self, ram_bank: usize) -> Result<&mut [u8]>

ram_bank should be less or equal to RAM_BANKS_MAX.

Source

fn map_rom_bank(&mut self, rom_bank: usize, page: u8) -> Result<()>

rom_bank should be less or equal to ROM_BANKS_MAX and page should be less or equal to PAGES_MAX.

Source

fn map_ram_bank(&mut self, ram_bank: usize, page: u8) -> Result<()>

ram_bank should be less or equal to RAM_BANKS_MAX and page should be less or equal to PAGES_MAX.

Provided Methods§

Source

fn map_exrom(&mut self, _exrom_bank: ExRom, _page: u8) -> Result<()>

Maps EX-ROM bank at the specified page.

exrom_bank should be one of the attachable EX-ROMS and page should be less or equal to PAGES_MAX.

Only one EX-ROM can be mapped at the same time. If an EX-ROM bank is already mapped when calling this function it will be unmapped first, regardless of the page, the previous EX-ROM bank has been mapped at.

Not all types of memory support attaching external ROMs.

Source

fn unmap_exrom(&mut self, _exrom_bank: &ExRom)

Unmaps an external ROM if the currently mapped EX-ROM bank is the same as in the argument. Otherwise does nothing.

Source

fn is_exrom_at(&self, _page: u8) -> bool

Returns true if an EX-ROM bank is currently being mapped at the specified memory page.

Source

fn has_mapped_exrom(&self, _exrom_bank: &ExRom) -> bool

Returns true if a specified EX-ROM bank is currently being mapped.

Source

fn page_index_at(&self, address: u16) -> Result<MemPageOffset>

Returns Ok(MemPageOffset) if address is equal to or less than ZxMemory::RAMTOP.

Source

fn rom_ref(&self) -> &[u8]

Provides a continuous view into the ROM memory (all banks).

Source

fn rom_mut(&mut self) -> &mut [u8]

Provides a continuous mutable view into the ROM memory (all banks).

Source

fn ram_ref(&self) -> &[u8]

Provides a continuous view into RAM (all banks).

Source

fn ram_mut(&mut self) -> &mut [u8]

Provides a continuous mutable view into RAM (all banks).

Source

fn load_into_rom<R: Read>(&mut self, rd: R) -> Result<()>

The data read depends on how big ROM is ZxMemory::ROM_SIZE. Results in an error when the ROM data size is less than the ROM_SIZE.

Source

fn load_into_rom_bank<R: Read>(&mut self, rom_bank: usize, rd: R) -> Result<()>

Results in an error when the ROM data size is less than the ROM bank’s size.

Source

fn iter_pages<A: RangeBounds<u16>>( &self, address_range: A, ) -> Result<MemPageRefIter<'_, Self>>

Returns an iterator of memory page slice references intersecting with a given address range.

§Errors

May return an ZxMemoryError::UnsupportedAddressRange error.

Source

fn for_each_page_mut<A: RangeBounds<u16>, F>( &mut self, address_range: A, f: F, ) -> Result<()>
where for<'a> F: FnMut(PageMutSlice<'a>) -> Result<()>,

Iterates over mutable memory page slices PageMutSlice intersecting with a given address range passing the slices to the closure f.

§Errors

May return an ZxMemoryError::UnsupportedAddressRange error or an error returned by the provided closure.

Source

fn load_into_mem<A: RangeBounds<u16>, R: Read>( &mut self, address_range: A, rd: R, ) -> Result<()>

Reads data into a paged-in memory area at the given address range.

Source

fn fill_mem<R, F>(&mut self, address_range: R, f: F) -> Result<()>
where R: RangeBounds<u16>, F: FnMut() -> u8,

Fills currently paged-in pages with the data produced by the closure F.

Useful to fill RAM with random bytes.

Provide the address range.

NOTE: this will overwrite both ROM and RAM locations.

Dyn Compatibility§

This trait is not dyn compatible.

In older versions of Rust, dyn compatibility was called "object safety", so this trait is not object safe.

Implementors§