toolchain-gcc/0001-Make-project-compile-with-GCC.patch
2025-01-15 13:17:41 +01:00

342 lines
8.9 KiB
Diff

From 456a9dbf5e31297a638475afb1b3b8fef5f12969 Mon Sep 17 00:00:00 2001
From: User <user@example.com>
Date: Wed, 15 Jan 2025 11:46:50 +0000
Subject: [PATCH] Make project compile with GCC
---
Cargo.toml | 3 +-
examples/megapong/entry.S | 154 ++++++++++++++---------------
examples/megapong/hack.c | 27 +++++
libs/megadrive-graphics/src/lib.rs | 2 +-
libs/megadrive-util/src/panic.rs | 5 +-
share/ldscripts/megadrive.x | 11 ++-
6 files changed, 116 insertions(+), 86 deletions(-)
create mode 100644 examples/megapong/hack.c
diff --git a/Cargo.toml b/Cargo.toml
index 03b1a1c..b0624fb 100644
--- a/Cargo.toml
+++ b/Cargo.toml
@@ -11,8 +11,9 @@ members = [
]
[profile.release]
-lto = true
+lto = "fat"
panic = "abort"
[profile.dev]
+lto = "fat"
panic = "abort"
diff --git a/examples/megapong/entry.S b/examples/megapong/entry.S
index e5343ed..0dde62b 100644
--- a/examples/megapong/entry.S
+++ b/examples/megapong/entry.S
@@ -6,91 +6,91 @@
.set HBLANK, _int
.set VBLANK, _vblank
-.long 0x0 ; Initial Stack Address
-.long START ; Start of program Code
-.long INT ; Bus error
-.long INT ; Address error
-.long INT ; Illegal instruction
-.long INT ; Division by zero
-.long INT ; CHK exception
-.long INT ; TRAPV exception
-.long INT ; Privilage violation
-.long INT ; TRACE exception
-.long INT ; Line-A emulator
-.long INT ; Line-F emulator
-.long INT ; Reserved (NOT USED)
-.long INT ; Co-processor protocol violation
-.long INT ; Format error
-.long INT ; Uninitialized Interrupt
-.long INT ; Reserved (NOT USED)
-.long INT ; Reserved (NOT USED)
-.long INT ; Reserved (NOT USED)
-.long INT ; Reserved (NOT USED)
-.long INT ; Reserved (NOT USED)
-.long INT ; Reserved (NOT USED)
-.long INT ; Reserved (NOT USED)
-.long INT ; Reserved (NOT USED)
-.long INT ; Spurious Interrupt
-.long INT ; IRQ Level 1
-.long INT ; IRQ Level 2 (EXT Interrupt)
-.long INT ; IRQ Level 3
-.long HBLANK ; IRQ Level 4 (VDP Horizontal Interrupt)
-.long INT ; IRQ Level 5
-.long VBLANK ; IRQ Level 6 (VDP Vertical Interrupt)
-.long INT ; IRQ Level 7
-.long INT ; TRAP #00 Exception
-.long INT ; TRAP #01 Exception
-.long INT ; TRAP #02 Exception
-.long INT ; TRAP #03 Exception
-.long INT ; TRAP #04 Exception
-.long INT ; TRAP #05 Exception
-.long INT ; TRAP #06 Exception
-.long INT ; TRAP #07 Exception
-.long INT ; TRAP #08 Exception
-.long INT ; TRAP #09 Exception
-.long INT ; TRAP #10 Exception
-.long INT ; TRAP #11 Exception
-.long INT ; TRAP #12 Exception
-.long INT ; TRAP #13 Exception
-.long INT ; TRAP #14 Exception
-.long INT ; TRAP #15 Exception
-.long INT ; (FP) Branch or Set on Unordered Condition
-.long INT ; (FP) Inexact Result
-.long INT ; (FP) Divide by Zero
-.long INT ; (FP) Underflow
-.long INT ; (FP) Operand Error
-.long INT ; (FP) Overflow
-.long INT ; (FP) Signaling NAN
-.long INT ; (FP) Unimplemented Data Type
-.long INT ; MMU Configuration Error
-.long INT ; MMU Illegal Operation Error
-.long INT ; MMU Access Violation Error
-.long INT ; Reserved (NOT USED)
-.long INT ; Reserved (NOT USED)
-.long INT ; Reserved (NOT USED)
-.long INT ; Reserved (NOT USED)
-.long INT ; Reserved (NOT USED)
+.long 0x0
+.long START
+.long INT
+.long INT
+.long INT
+.long INT
+.long INT
+.long INT
+.long INT
+.long INT
+.long INT
+.long INT
+.long INT
+.long INT
+.long INT
+.long INT
+.long INT
+.long INT
+.long INT
+.long INT
+.long INT
+.long INT
+.long INT
+.long INT
+.long INT
+.long INT
+.long INT
+.long INT
+.long HBLANK
+.long INT
+.long VBLANK
+.long INT
+.long INT
+.long INT
+.long INT
+.long INT
+.long INT
+.long INT
+.long INT
+.long INT
+.long INT
+.long INT
+.long INT
+.long INT
+.long INT
+.long INT
+.long INT
+.long INT
+.long INT
+.long INT
+.long INT
+.long INT
+.long INT
+.long INT
+.long INT
+.long INT
+.long INT
+.long INT
+.long INT
+.long INT
+.long INT
+.long INT
+.long INT
+.long INT
-.ascii "SEGA MEGADRIVE " ; SEGA must be the first four chars for TMSS
+.ascii "SEGA MEGADRIVE "
.ascii "(C)2021.JAN "
-.ascii "TESTPROJECT " ; export name
+.ascii "TESTPROJECT "
.ascii " "
.ascii " "
-.ascii "TESTPROJECT " ; domestic (Japanese) name
+.ascii "TESTPROJECT "
.ascii " "
.ascii " "
.ascii "GM MK-0000 -01"
-.short 0x0000 ; checksum - not needed
+.short 0x0000
.ascii "J6 "
-.long 0x00000000, 0x0007ffff ; ROM start, end
-.long 0x00ff0000, 0x00ffffff ; RAM start, end
-.ascii " " ; no SRAM
+.long 0x00000000, 0x0007ffff
+.long 0x00ff0000, 0x00ffffff
+.ascii " "
.ascii " "
.ascii " "
-.ascii " " ; memo
+.ascii " "
.ascii " "
.ascii " "
-.ascii "F " ; enable any hardware configuration
+.ascii "F "
.global vblank
_vblank:
@@ -100,14 +100,14 @@ _vblank:
.global _start
.global main
_start:
- move.l #_stack_top, sp
- move.w #0x2500, sr
+ move.l #_stack_top, %sp
+ move.w #0x2500, %sr
jsr _init_runtime
- bra #main
+ bra main
.global abort
abort:
- bra #abort
+ bra abort
_int:
rte
diff --git a/examples/megapong/hack.c b/examples/megapong/hack.c
new file mode 100644
index 0000000..f853c8b
--- /dev/null
+++ b/examples/megapong/hack.c
@@ -0,0 +1,27 @@
+#if 1
+void* memcpy(void *dst, const void *src, long unsigned int n) {
+ char *dst_ = dst;
+ const char *src_ = src;
+ while (--n) *dst_++ = *src_++;
+}
+#endif
+
+#if 0
+void *memset(char *s, int c, long unsigned int n) {
+ while (--n) *s++ = c;
+}
+#endif
+
+
+#if 0
+int memcmp(char *a, char *b, long unsigned n) {
+ while (--n) {
+ if (*a < *b) return -1;
+ if (*a > *b) return 1;
+ ++a;
+ ++b;
+ }
+
+ return (*a == *b) ? 0 : 1;
+}
+#endif
diff --git a/libs/megadrive-graphics/src/lib.rs b/libs/megadrive-graphics/src/lib.rs
index d7aa284..5e7f929 100644
--- a/libs/megadrive-graphics/src/lib.rs
+++ b/libs/megadrive-graphics/src/lib.rs
@@ -5,7 +5,7 @@ use core::mem::MaybeUninit;
use megadrive_sys::vdp::{Sprite, VDP};
pub mod default_ascii {
- include!(concat!(env!("OUT_DIR"), "/default_ascii.rs"));
+ // include!(concat!(env!("OUT_DIR"), "/default_ascii.rs"));
}
mod font;
diff --git a/libs/megadrive-util/src/panic.rs b/libs/megadrive-util/src/panic.rs
index 8564bbd..edb1663 100644
--- a/libs/megadrive-util/src/panic.rs
+++ b/libs/megadrive-util/src/panic.rs
@@ -3,7 +3,6 @@ use core::ptr::read_volatile;
use megadrive_sys::vdp::VDP;
use megadrive_graphics::Renderer;
-use megadrive_graphics::default_ascii::DEFAULT_FONT_1X1;
static mut NEW_FRAME: u16 = 0;
@@ -19,7 +18,7 @@ fn panic(_info: &PanicInfo) -> ! {
vdp.enable_display(true);
// Initialize the default font tiles
- DEFAULT_FONT_1X1.load(&mut vdp);
+ // DEFAULT_FONT_1X1.load(&mut vdp);
let resolution = vdp.resolution();
let half_screen_width = (resolution.0 >> 1) as i16;
@@ -36,7 +35,7 @@ fn panic(_info: &PanicInfo) -> ! {
// let mut panic_text: &str = &_info.payload().downcast_ref::<&str>().unwrap();
let panic_text= "Panic!";
- DEFAULT_FONT_1X1.blit_text(&mut renderer, panic_text, x_off as u16, y_off as u16);
+ // DEFAULT_FONT_1X1.blit_text(&mut renderer, panic_text, x_off as u16, y_off as u16);
renderer.render(&mut vdp);
// vsync
wait_for_vblank();
diff --git a/share/ldscripts/megadrive.x b/share/ldscripts/megadrive.x
index 95e1cf3..dd61c42 100644
--- a/share/ldscripts/megadrive.x
+++ b/share/ldscripts/megadrive.x
@@ -4,6 +4,8 @@ MEMORY
RAM (rwx) : ORIGIN = 0xFF0000, LENGTH = 0x10000
}
+ENTRY(_start)
+
SECTIONS
{
_stack_top = 0x1000000;
@@ -16,25 +18,26 @@ SECTIONS
.rodata :
{
+ . = ALIGN(4);
*(.rodata .rodata.*);
_data_src = .;
} > ROM
.data :
{
- ALIGN(4);
+ . = ALIGN(4);
_data_start = .;
*(.data);
- ALIGN(4);
+ . = ALIGN(4);
_data_end = .;
} > RAM AT > ROM
.bss (NOLOAD) :
{
- ALIGN(4);
+ . = ALIGN(4);
_bss_start = .;
*(.bss);
- ALIGN(4);
+ . = ALIGN(4);
_bss_end = .;
} > RAM AT > ROM
--
2.34.1