crazy debugging tries and fails
This commit is contained in:
parent
450335c79a
commit
5381563d11
2
Makefile
2
Makefile
@ -32,8 +32,8 @@ ifdef USE_YAML
|
|||||||
CFLAGS += -DUSE_YAML
|
CFLAGS += -DUSE_YAML
|
||||||
LIBS += -lyaml
|
LIBS += -lyaml
|
||||||
else
|
else
|
||||||
LIBS += -laltra64
|
|
||||||
endif
|
endif
|
||||||
|
LIBS += -laltra64
|
||||||
|
|
||||||
LINK_FLAGS = -O1 -L$(ROOTDIR)/lib -L$(ROOTDIR)/mips64-elf/lib -L$(RUST_FULL_TARGET_DIR) -ldragon -lmad $(LIBS) -lc -lm -ldragonsys -lnosys -Tn64ld.x
|
LINK_FLAGS = -O1 -L$(ROOTDIR)/lib -L$(ROOTDIR)/mips64-elf/lib -L$(RUST_FULL_TARGET_DIR) -ldragon -lmad $(LIBS) -lc -lm -ldragonsys -lnosys -Tn64ld.x
|
||||||
PROG_NAME = $(BINDIR)/OS64P
|
PROG_NAME = $(BINDIR)/OS64P
|
||||||
|
@ -16,4 +16,4 @@ autogen_warning = "/* Warning, this file is autogenerated by cbindgen. Don't mod
|
|||||||
include_version = false
|
include_version = false
|
||||||
|
|
||||||
[export]
|
[export]
|
||||||
exclude = ["strtoul"]
|
exclude = ["strtoul", "screen_text", "test_c_print", "screen_text_num", "screen_text_ptr"]
|
||||||
|
@ -1,4 +1,5 @@
|
|||||||
#![no_std]
|
#![no_std]
|
||||||
|
#![allow(dead_code,unused_variables)]
|
||||||
|
|
||||||
use core::slice;
|
use core::slice;
|
||||||
use core::iter::Iterator;
|
use core::iter::Iterator;
|
||||||
@ -111,6 +112,8 @@ impl<T: PartialEq> SliceSubsequence<T> for &[T] {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
// for some reason, passing actual pointers like this freezes the n64
|
||||||
#[no_mangle]
|
#[no_mangle]
|
||||||
pub extern "C" fn parse_cheats_ffi(
|
pub extern "C" fn parse_cheats_ffi(
|
||||||
cheat_file: *mut u8, cheat_file_len: usize,
|
cheat_file: *mut u8, cheat_file_len: usize,
|
||||||
@ -123,16 +126,53 @@ pub extern "C" fn parse_cheats_ffi(
|
|||||||
|
|
||||||
parse_cheats(cheat_file, boot_cheats, in_game_cheats)
|
parse_cheats(cheat_file, boot_cheats, in_game_cheats)
|
||||||
}
|
}
|
||||||
|
*/
|
||||||
|
|
||||||
|
// in C world, usize is actually u32, no idea why but that's a problem for another day...
|
||||||
|
// but if we put u32 here it crashes, can only send usize
|
||||||
|
#[no_mangle]
|
||||||
|
pub extern "C" fn parse_cheats_ffi(
|
||||||
|
cheat_file: usize, cheat_file_len: usize,
|
||||||
|
boot_cheats: usize, boot_cheats_len: usize,
|
||||||
|
in_game_cheats: usize, in_game_cheats_len: usize,
|
||||||
|
) -> u8 {
|
||||||
|
|
||||||
|
/*
|
||||||
|
unsafe {
|
||||||
|
let cheat_file = cheat_file as *mut u8;
|
||||||
|
let cheat_file = slice::from_raw_parts_mut(cheat_file, 4);
|
||||||
|
cheat_file[1] = b'a';
|
||||||
|
0
|
||||||
|
}
|
||||||
|
*/
|
||||||
|
//unsafe { screen_text_ptr(b"from rust woot" as *const u8 as u32); }
|
||||||
|
|
||||||
|
//let cheat_file = unsafe { slice::from_raw_parts(cheat_file as *const u8, cheat_file_len as usize) };
|
||||||
|
let cheat_file = unsafe { slice::from_raw_parts_mut(cheat_file as *mut u8, cheat_file_len as usize) };
|
||||||
|
let boot_cheats = unsafe { slice::from_raw_parts_mut(boot_cheats as *mut u32, boot_cheats_len as usize) };
|
||||||
|
let in_game_cheats = unsafe { slice::from_raw_parts_mut(in_game_cheats as *mut u32, in_game_cheats_len as usize) };
|
||||||
|
|
||||||
|
dbg(100);
|
||||||
|
|
||||||
|
//cheat_file[1] = b'a';
|
||||||
|
|
||||||
|
//0
|
||||||
|
|
||||||
|
parse_cheats(cheat_file, boot_cheats, in_game_cheats)
|
||||||
|
}
|
||||||
|
|
||||||
const SUCCESS: u8 = 0;
|
const SUCCESS: u8 = 0;
|
||||||
const INVALID_CODE_LINE: u8 = 1;
|
const INVALID_CODE_LINE: u8 = 1;
|
||||||
const INVALID_LINE: u8 = 2;
|
const INVALID_LINE: u8 = 2;
|
||||||
|
|
||||||
pub fn parse_cheats(cheat_file: &[u8], boot_cheats: &mut [u32], in_game_cheats: &mut [u32]) -> u8 {
|
pub fn parse_cheats(cheat_file: &[u8], boot_cheats: &mut [u32], in_game_cheats: &mut [u32]) -> u8 {
|
||||||
|
dbg(101);
|
||||||
let mut repeater = false;
|
let mut repeater = false;
|
||||||
let mut boot_cheats_idx = 0;
|
let mut boot_cheats_idx = 0;
|
||||||
let mut in_game_cheats_idx = 0;
|
let mut in_game_cheats_idx = 0;
|
||||||
|
dbg(102);
|
||||||
for line in cheat_file.lines(b"\n") {
|
for line in cheat_file.lines(b"\n") {
|
||||||
|
dbg(200);
|
||||||
let line = line.trim(WHITESPACE);
|
let line = line.trim(WHITESPACE);
|
||||||
if line.is_empty() || line.starts_with(b"#") || line == b"---" {
|
if line.is_empty() || line.starts_with(b"#") || line == b"---" {
|
||||||
continue; // empty or comment or whatever the starting thing is
|
continue; // empty or comment or whatever the starting thing is
|
||||||
@ -233,6 +273,7 @@ pub fn parse_cheats(cheat_file: &[u8], boot_cheats: &mut [u32], in_game_cheats:
|
|||||||
return INVALID_LINE;
|
return INVALID_LINE;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
dbg(103);
|
||||||
SUCCESS
|
SUCCESS
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -248,8 +289,53 @@ fn hex_to_u32(str: &[u8]) -> u32 {
|
|||||||
unsafe { strtoul(str.as_ptr(), null_mut(), 16) }
|
unsafe { strtoul(str.as_ptr(), null_mut(), 16) }
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[no_mangle]
|
||||||
|
pub extern "C" fn test_rust_print() {
|
||||||
|
//unsafe { test_c_print(); }
|
||||||
|
//unsafe { screen_text_num(9); }
|
||||||
|
// sent 18446744073709551515 = 4294967195 = FFFF_FF9B
|
||||||
|
// sent 0xffff_ffff_ffff_ffff = 4294967295 = FFFF_FFFF
|
||||||
|
unsafe { screen_text_num(0xffff_ffff_ffff_ffff); }
|
||||||
|
//unsafe { screen_text(b"rust test\0".as_ptr()); }
|
||||||
|
}
|
||||||
|
|
||||||
|
#[no_mangle]
|
||||||
|
pub extern "C" fn rust_call_test(num: usize) {
|
||||||
|
unsafe { screen_text_num(num); }
|
||||||
|
}
|
||||||
|
|
||||||
|
#[no_mangle]
|
||||||
|
pub extern "C" fn rust_call_test_ptr(num: usize) -> u8 {
|
||||||
|
unsafe {
|
||||||
|
let cheat_file = num as *mut u8;
|
||||||
|
let cheat_file = slice::from_raw_parts_mut(cheat_file, 4);
|
||||||
|
cheat_file[1] = b'a';
|
||||||
|
//screen_text_num(cheat_file[0].into());
|
||||||
|
0
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
fn dbg(num: usize) {
|
||||||
|
#[cfg(not(test))]
|
||||||
|
unsafe { screen_text_num(num); }
|
||||||
|
#[cfg(test)]
|
||||||
|
println!("dbg: {}", num);
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
#[no_mangle]
|
||||||
|
pub extern "C" fn rust_call_test_bla() {
|
||||||
|
//rust_call_test(b"c rust test\0".as_ptr());
|
||||||
|
rust_call_test([99, 32, 114, 117, 115, 116, 32, 116, 101, 115, 116, 0].as_ptr());
|
||||||
|
}
|
||||||
|
*/
|
||||||
|
|
||||||
extern "C" {
|
extern "C" {
|
||||||
fn strtoul(s: *const u8, endp: *mut *mut u8, base: i32) -> u32; // todo: is base i32 ?
|
fn strtoul(s: *const u8, endp: *mut *mut u8, base: i32) -> u32; // todo: is base i32 ?
|
||||||
|
fn screen_text(msg: *const u8);
|
||||||
|
fn screen_text_num(num: usize);
|
||||||
|
fn screen_text_ptr(ptr: u32);
|
||||||
|
fn test_c_print();
|
||||||
}
|
}
|
||||||
|
|
||||||
#[cfg(test)]
|
#[cfg(test)]
|
||||||
@ -258,6 +344,7 @@ mod tests {
|
|||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
fn test_hex_to_u32() {
|
fn test_hex_to_u32() {
|
||||||
|
println!("i: {:?}", b"c rust test\0");
|
||||||
assert_eq!(hex_to_u32(b"0x09"), 9);
|
assert_eq!(hex_to_u32(b"0x09"), 9);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -353,5 +440,14 @@ In Health (ASM):
|
|||||||
assert_eq!(ok, SUCCESS);
|
assert_eq!(ok, SUCCESS);
|
||||||
assert_eq!(boot_cheats, [0xF10004E4, 0x2400, 0xEE000000, 0x0000, 0, 0]);
|
assert_eq!(boot_cheats, [0xF10004E4, 0x2400, 0xEE000000, 0x0000, 0, 0]);
|
||||||
assert_eq!(in_game_cheats, [0x8138EDA0, 0x2400, 0, 0, 0, 0]);
|
assert_eq!(in_game_cheats, [0x8138EDA0, 0x2400, 0, 0, 0, 0]);
|
||||||
|
|
||||||
|
let cheats_file = &b"wootwootwootwootwootwootwootwoot\0"[..];
|
||||||
|
let cheats_file = &b"wootwootwootwootwootwootwootwoot"[..];
|
||||||
|
let mut boot_cheats = [0u32; 6];
|
||||||
|
let mut in_game_cheats = [0u32; 6];
|
||||||
|
let ok = parse_cheats(cheats_file, &mut boot_cheats, &mut in_game_cheats);
|
||||||
|
assert_eq!(ok, INVALID_LINE);
|
||||||
|
assert_eq!(boot_cheats, [0, 0, 0, 0, 0, 0]);
|
||||||
|
assert_eq!(in_game_cheats, [0, 0, 0, 0, 0, 0]);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
108
src/main.c
108
src/main.c
@ -41,9 +41,9 @@
|
|||||||
// YAML parser
|
// YAML parser
|
||||||
#include <yaml.h>
|
#include <yaml.h>
|
||||||
#else
|
#else
|
||||||
#include <altra64.h>
|
|
||||||
#endif /* USE_YAML */
|
#endif /* USE_YAML */
|
||||||
|
|
||||||
|
#include <altra64.h>
|
||||||
|
|
||||||
#include "constants.h"
|
#include "constants.h"
|
||||||
#include "debug.h"
|
#include "debug.h"
|
||||||
@ -258,6 +258,50 @@ int page = 0;
|
|||||||
int cursor = 0;
|
int cursor = 0;
|
||||||
direntry_t *list;
|
direntry_t *list;
|
||||||
|
|
||||||
|
display_context_t global_disp_ctx;
|
||||||
|
|
||||||
|
void screen_text(u8 *msg) {
|
||||||
|
printText(msg, 3, -1, global_disp_ctx);
|
||||||
|
display_show(global_disp_ctx);
|
||||||
|
sleep(1000);
|
||||||
|
}
|
||||||
|
|
||||||
|
void screen_text_num(size_t num) {
|
||||||
|
char num_str[64];
|
||||||
|
|
||||||
|
sprintf(num_str, "dbg: %u", num);
|
||||||
|
screen_text(num_str);
|
||||||
|
}
|
||||||
|
|
||||||
|
void screen_text_ptr(size_t ptr) {
|
||||||
|
u8 *msg = (u8*)ptr;
|
||||||
|
screen_text(msg);
|
||||||
|
}
|
||||||
|
|
||||||
|
void call_test(size_t num) {
|
||||||
|
screen_text_num(num);
|
||||||
|
}
|
||||||
|
/*
|
||||||
|
00006644 <call_test>:
|
||||||
|
6644: 27bdffd8 addiu sp,sp,-40
|
||||||
|
6648: ffbf0020 sd ra,32(sp)
|
||||||
|
664c: 0c000000 jal 0 <ttULONG>
|
||||||
|
6650: 00000000 nop
|
||||||
|
6654: dfbf0020 ld ra,32(sp)
|
||||||
|
6658: 03e00008 jr ra
|
||||||
|
665c: 27bd0028 addiu sp,sp,40
|
||||||
|
*/
|
||||||
|
|
||||||
|
void call_test_bla() {
|
||||||
|
call_test(5);
|
||||||
|
}
|
||||||
|
|
||||||
|
void test_c_print() {
|
||||||
|
screen_text("c rust test");
|
||||||
|
screen_text_num(5);
|
||||||
|
screen_text("c rust test2");
|
||||||
|
}
|
||||||
|
|
||||||
int filesize(FILE *pFile)
|
int filesize(FILE *pFile)
|
||||||
{
|
{
|
||||||
fseek(pFile, 0, SEEK_END);
|
fseek(pFile, 0, SEEK_END);
|
||||||
@ -2191,6 +2235,11 @@ int readCheatFile(TCHAR *filename, u32 *cheat_lists[2])
|
|||||||
FIL file;
|
FIL file;
|
||||||
UINT bytesread;
|
UINT bytesread;
|
||||||
result = f_open(&file, filename, FA_READ);
|
result = f_open(&file, filename, FA_READ);
|
||||||
|
|
||||||
|
screen_text("in readCheatFile");
|
||||||
|
screen_text_num(0xffffffffffffffff);
|
||||||
|
test_rust_print();
|
||||||
|
screen_text("called rust");
|
||||||
|
|
||||||
if (result == FR_OK)
|
if (result == FR_OK)
|
||||||
{
|
{
|
||||||
@ -2238,7 +2287,7 @@ int readCheatFile(TCHAR *filename, u32 *cheat_lists[2])
|
|||||||
#else
|
#else
|
||||||
// use rust
|
// use rust
|
||||||
size_t list1_size = both_list_sizes - list2_size;
|
size_t list1_size = both_list_sizes - list2_size;
|
||||||
repeater = parse_cheats_ffi(cheatfile, fsize, list1, list1_size, list2, list2_size);
|
repeater = parse_cheats_ffi((size_t)cheatfile, fsize, (size_t)list1, list1_size, (size_t)list2, list2_size);
|
||||||
#endif /* USE_YAML */
|
#endif /* USE_YAML */
|
||||||
|
|
||||||
free(cheatfile);
|
free(cheatfile);
|
||||||
@ -2272,10 +2321,12 @@ void bootRom(display_context_t disp, int silent)
|
|||||||
char cheat_filename[64];
|
char cheat_filename[64];
|
||||||
sprintf(cheat_filename, "/"ED64_FIRMWARE_PATH"/CHEATS/%s.yml", rom_filename);
|
sprintf(cheat_filename, "/"ED64_FIRMWARE_PATH"/CHEATS/%s.yml", rom_filename);
|
||||||
|
|
||||||
|
global_disp_ctx = disp;
|
||||||
int ok = readCheatFile(cheat_filename, cheat_lists);
|
int ok = readCheatFile(cheat_filename, cheat_lists);
|
||||||
if (ok == 0)
|
if (ok == 0)
|
||||||
{
|
{
|
||||||
printText("cheats found...", 3, -1, disp);
|
printText("cheats found...", 3, -1, disp);
|
||||||
|
sleep(10000);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
@ -4589,6 +4640,59 @@ int main(void)
|
|||||||
|
|
||||||
drawBg(disp); //new
|
drawBg(disp); //new
|
||||||
drawBoxNumber(disp, 1); //new
|
drawBoxNumber(disp, 1); //new
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
*/
|
||||||
|
global_disp_ctx = disp;
|
||||||
|
screen_text("in MAIN");
|
||||||
|
screen_text_num(SIZE_MAX);
|
||||||
|
screen_text("in MAIN2");
|
||||||
|
screen_text_num((size_t)-1);
|
||||||
|
screen_text("in MAIN3");
|
||||||
|
screen_text_num(0xffffffffffffffff);
|
||||||
|
test_rust_print();
|
||||||
|
screen_text_ptr((size_t)"called rust");
|
||||||
|
rust_call_test(SIZE_MAX);
|
||||||
|
screen_text_ptr((size_t)"called rust2");
|
||||||
|
char* woot = "wootwootwootwootwootwootwootwoot";
|
||||||
|
size_t fsize = 32;
|
||||||
|
|
||||||
|
//u8 repeater = rust_call_test_ptr((size_t) woot);
|
||||||
|
|
||||||
|
/*
|
||||||
|
*/
|
||||||
|
u32 *list1;
|
||||||
|
u32 *list2;
|
||||||
|
size_t both_list_sizes = fsize + 2 * sizeof(u32);
|
||||||
|
list1 = calloc(1, both_list_sizes); // Plus 2 words to be safe
|
||||||
|
if (!list1)
|
||||||
|
{
|
||||||
|
screen_text("oom");
|
||||||
|
while(true) { sleep(1000); }
|
||||||
|
}
|
||||||
|
size_t list2_size = fsize / sizeof(u32) / 2;
|
||||||
|
list2 = &list1[list2_size];
|
||||||
|
//cheat_lists[0] = list1;
|
||||||
|
//cheat_lists[1] = list2;
|
||||||
|
|
||||||
|
size_t list1_size = both_list_sizes - list2_size;
|
||||||
|
|
||||||
|
screen_text_num(list1_size);
|
||||||
|
screen_text_num(list2_size);
|
||||||
|
screen_text_ptr((size_t)"called rust2.5");
|
||||||
|
|
||||||
|
u8 repeater = parse_cheats_ffi((size_t)woot, fsize
|
||||||
|
, (size_t)list1, list1_size
|
||||||
|
, (size_t)list2, list2_size
|
||||||
|
);
|
||||||
|
|
||||||
|
|
||||||
|
screen_text("called rust3");
|
||||||
|
screen_text(woot);
|
||||||
|
screen_text("called rust4");
|
||||||
|
while(true) { sleep(1000); }
|
||||||
|
|
||||||
uint32_t *buffer = (uint32_t *)__get_buffer(disp); //fg disp = 2
|
uint32_t *buffer = (uint32_t *)__get_buffer(disp); //fg disp = 2
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user