Allow overlapping Overlays

This commit is contained in:
2023-01-22 16:37:36 +01:00
parent 22efc808ca
commit f16e991b9f
5 changed files with 53 additions and 71 deletions

View File

@@ -24,13 +24,7 @@ pub fn write(output: &mut Output, overlay_desc: &OverlayDesc) -> Result<(), Erro
}
fn get_slot_start_adr(slot: &OverlaySlot) -> &str {
if let Some(slot_adr) = &slot.start_adr {
slot_adr.as_ref()
}
else {
OVERLAY_DEFAULT_START
}
slot.start_adr.as_ref()
}
if overlay_desc.additional_slots.is_empty() && overlay_desc.boot_section.is_empty() {
@@ -44,7 +38,7 @@ pub fn write(output: &mut Output, overlay_desc: &OverlayDesc) -> Result<(), Erro
writeln!(output, "")?;
writeln!(output, "SECTIONS {{")?;
writeln!(output, "\t/DISCARD/ : {{ *(.comment*) *(.gnu.*) *(.mdebug*) *(.debug_*) *(.pdr)}}")?;
write_planschi_section(output, &overlay_desc.boot_section)?;
write_first_section(output, &overlay_desc.boot_section)?;
for slot in &overlay_desc.additional_slots {
writeln!(output, "\t/*{}*/", slot.name)?;
writeln!(output, "\tOVERLAY {} : NOCROSSREFS SUBALIGN(4) {{", get_slot_start_adr(slot))?;
@@ -63,39 +57,8 @@ fn write_heap_base(output: &mut Output, heap_base: &str) -> Result<(), Error> {
Ok(())
}
fn write_planschi_section(output: &mut Output, boot_overlay: &BootOverlaySection) -> Result<(), Error> {
fn write_first_section(output: &mut Output, boot_overlay: &BootOverlaySection) -> Result<(), Error> {
writeln!(output, "\tOVERLAY __bss_end : NOCROSSREFS SUBALIGN(4) {{")?;
writeln!(output, "\t\t.planschi {{")?;
writeln!(output, "\t\t\t__planschi_start = .;")?;
writeln!(output, "\t\t\t__boot_loader_start = .;")?;
writeln!(output, "")?;
writeln!(output, "\t\t\t*libJabyEngine.a:*_boot.o(.text.startup._GLOBAL__*)")?;
writeln!(output, "\t\t\t*_boot.o(.text.startup._GLOBAL__*)")?;
writeln!(output, "\t\t\t*libJabyEngine.a:*_boot.o(.ctors)")?;
writeln!(output, "\t\t\t*_boot.o(.ctors)")?;
writeln!(output, "")?;
writeln!(output, "\t\t\t*libJabyEngine.a:*_boot.o(.text.*)")?;
writeln!(output, "\t\t\t*_boot.o(.text.*)")?;
writeln!(output, "\t\t\t*libJabyEngine.a:*_boot.o(.rodata*)")?;
writeln!(output, "\t\t\t*_boot.o(.rodata*)")?;
writeln!(output, "\t\t\t*libJabyEngine.a:*_boot.o(.sdata*)")?;
writeln!(output, "\t\t\t*_boot.o(.sdata*)")?;
writeln!(output, "\t\t\t*libJabyEngine.a:*_boot.o(.data*)")?;
writeln!(output, "\t\t\t*_boot.o(.data*)")?;
writeln!(output, "\t\t\t*libJabyEngine.a:*_boot.o(.sbss*)")?;
writeln!(output, "\t\t\t*_boot.o(.sbss*)")?;
writeln!(output, "\t\t\t*libJabyEngine.a:*_boot.o(.bss*)")?;
writeln!(output, "\t\t\t*_boot.o(.bss*)")?;
writeln!(output, "\t\t\t*libJabyEngine.a:*_boot.o(*)")?;
writeln!(output, "\t\t\t*_boot.o(*)")?;
writeln!(output, "")?;
writeln!(output, "\t\t\t. = ALIGN(4);")?;
writeln!(output, "\t\t\t__boot_loader_end = .;")?;
writeln!(output, "\t\t\t/*Only needed for the PSX BIOS to load the entire game*/")?;
writeln!(output, "\t\t\t. = ALIGN(2048);")?;
writeln!(output, "\t\t\t__planschi_end = .;")?;
writeln!(output, "\t\t}}")?;
writeln!(output, "")?;
writeln!(output, "\t\t/*{}*/", boot_overlay.name)?;
write_section(output, &boot_overlay.sections, true)?;
writeln!(output, "\t}}")?;

View File

@@ -10,24 +10,18 @@ pub fn read_config(input: Input) -> Result<OverlayDesc, Error> {
if let Some(objects) = json_reader.as_object() {
for object in objects {
let mut slot = read_as_slot(object)?;
if slot.start_adr.is_none() {
if overlay_desc.boot_section.is_empty() {
overlay_desc.boot_section = BootOverlaySection::new(slot.name, slot.sections);
}
else {
if let Some(prev_slot) = overlay_desc.additional_slots.last() {
slot.set_start_adr_as_end_of(prev_slot.name.as_ref());
}
else {
slot.set_start_adr_as_end_of("planschi");
}
overlay_desc.additional_slots.push(slot);
}
if overlay_desc.boot_section.is_empty() {
overlay_desc.boot_section = BootOverlaySection::new(slot.name, slot.sections);
}
else {
if let Some(prev_slot) = overlay_desc.additional_slots.last() {
slot.set_start_adr_as_end_of(prev_slot.name.as_ref());
}
else {
slot.set_start_adr_as_end_of("bss");
}
overlay_desc.additional_slots.push(slot);
}
}
@@ -42,7 +36,7 @@ pub fn read_config(input: Input) -> Result<OverlayDesc, Error> {
fn read_as_slot(json_value: (&String, &serde_json::Value)) -> Result<OverlaySlot, Error> {
let (slot_name, json_value) = json_value;
let mut slot = OverlaySlot::new(slot_name.clone(), None);
let mut slot = OverlaySlot::new(slot_name.clone(), "bss");
if let Some(json_value) = json_value.as_object() {
for (name, json_value) in json_value {

View File

@@ -49,26 +49,17 @@ impl OverlaySection {
pub struct OverlaySlot {
pub(super) name: String,
pub(super) start_adr: Option<String>,
pub(super) start_adr: String,
pub(super) sections: Vec<OverlaySection>
}
impl OverlaySlot {
pub fn new(name: String, start_adr: Option<&str>) -> OverlaySlot {
let start_adr = {
if let Some(str) = start_adr {
Some(str.to_owned())
}
else {
None
}
};
OverlaySlot{name, start_adr, sections: Vec::new()}
pub fn new(name: String, start_adr: &str) -> OverlaySlot {
OverlaySlot{name, start_adr: String::from(start_adr), sections: Vec::new()}
}
pub fn set_start_adr_as_end_of(&mut self, end: &str) {
self.start_adr = Some(format!("__{}_end", end));
self.start_adr = format!("__{}_end", end);
}
pub fn add_section(&mut self, section: OverlaySection) {