Merge pull request #20 from jannic/fix-rom-functions

Fix rom_table_lookup
This commit is contained in:
Jonathan 'theJPster' Pallant 2021-02-21 16:18:51 +00:00 committed by GitHub
commit b96339c417
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23

View file

@ -11,19 +11,25 @@ type RomTableLookupFn<T> = unsafe extern "C" fn(*const u16, u32) -> T;
const ROM_TABLE_LOOKUP_PTR: *const u16 = 0x18 as _; const ROM_TABLE_LOOKUP_PTR: *const u16 = 0x18 as _;
/// Pointer to helper functions lookup table. /// Pointer to helper functions lookup table.
const FUNC_TABLE: *const *const u16 = 0x14 as _; const FUNC_TABLE: *const u16 = 0x14 as _;
/// Pointer to the public data lookup table. /// Pointer to the public data lookup table.
const DATA_TABLE: *const *const u16 = 0x16 as _; const DATA_TABLE: *const u16 = 0x16 as _;
/// Retrive rom content from a table using a code. /// Retrive rom content from a table using a code.
fn rom_table_lookup<T>(table: *const *const u16, tag: RomFnTableCode) -> T { fn rom_table_lookup<T>(table: *const u16, tag: RomFnTableCode) -> T {
unsafe { unsafe {
let rom_table_lookup: RomTableLookupFn<T> = core::mem::transmute(ROM_TABLE_LOOKUP_PTR); let rom_table_lookup_ptr: *const u32 = rom_hword_as_ptr(ROM_TABLE_LOOKUP_PTR);
rom_table_lookup(*table, u16::from_le_bytes(tag) as u32) let rom_table_lookup: RomTableLookupFn<T> = core::mem::transmute(rom_table_lookup_ptr);
rom_table_lookup(rom_hword_as_ptr(table) as *const u16, u16::from_le_bytes(tag) as u32)
} }
} }
unsafe fn rom_hword_as_ptr(rom_address: *const u16) -> *const u32 {
let ptr: u16 = *rom_address;
ptr as *const u32
}
macro_rules! rom_funcs { macro_rules! rom_funcs {
( (
$( $(
@ -138,9 +144,9 @@ pub fn copyright_string() -> &'static str {
} }
/// The 8 most significant hex digits of the Bootrom git revision. /// The 8 most significant hex digits of the Bootrom git revision.
pub fn git_revision() -> &'static str { pub fn git_revision() -> u32 {
let s: *const u8 = rom_table_lookup(DATA_TABLE, *b"GR"); let s: *const u32 = rom_table_lookup(DATA_TABLE, *b"GR");
unsafe { convert_str(s) } unsafe { *s }
} }
/// The start address of the floating point library code and data. This and fplib_end along with the individual /// The start address of the floating point library code and data. This and fplib_end along with the individual