aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--mubios/.gitignore1
-rw-r--r--mubios/Makefile64
-rw-r--r--mubios/linker.ld88
3 files changed, 153 insertions, 0 deletions
diff --git a/mubios/.gitignore b/mubios/.gitignore
new file mode 100644
index 0000000..0f293b7
--- /dev/null
+++ b/mubios/.gitignore
@@ -0,0 +1 @@
+*.qcow2 \ No newline at end of file
diff --git a/mubios/Makefile b/mubios/Makefile
new file mode 100644
index 0000000..b5c268e
--- /dev/null
+++ b/mubios/Makefile
@@ -0,0 +1,64 @@
+# RCC-Project
+#
+# Copyright (C) 2026 Richard Qin
+#
+# This file is part of RCC-Project.
+#
+# RCC-Project is free software; you can redistribute it and/or modify it under
+# the terms of the GNU General Public License as published by the Free
+# Software Foundation; either version 3 of the License, or (at your option) any
+# later version.
+#
+# RCC-Project is distributed in the hope that it will be useful, but WITHOUT ANY
+# WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR
+# A PARTICULAR PURPOSE. See the GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License along with
+# RCC-Project; see the file COPYING. If not see
+# <http://www.gnu.org/licenses/>.
+
+PROJECT := mubios
+BUILD_DIR := build
+ELF := $(BUILD_DIR)/$(PROJECT).elf
+ROM := $(BUILD_DIR)/$(PROJECT).rom
+
+CC := gcc
+AS := as
+LD := ld
+OBJCOPY := objcopy
+
+CFLAGS := -m32 -ffreestanding -fno-pie -fno-stack-protector \
+ -fno-builtin -nostdinc -Iinclude -Wall -Wextra
+ASFLAGS := --32
+LDFLAGS := -m elf_i386 -nostdlib -T linker.ld
+
+C_SRCS := $(wildcard core/*.c drivers/*.c services/*.c)
+S_SRCS := $(wildcard arch/*.S)
+OBJS := $(patsubst %.c,$(BUILD_DIR)/%.o,$(C_SRCS)) \
+ $(patsubst %.S,$(BUILD_DIR)/%.o,$(S_SRCS))
+
+.PHONY: all elf rom
+
+all: $(ROM)
+
+elf: $(ELF)
+
+rom: $(ROM)
+
+$(ELF): $(OBJS) linker.ld
+ @mkdir -p $(dir $@)
+ $(LD) $(LDFLAGS) -o $@ $(OBJS)
+
+$(ROM): $(ELF)
+ @mkdir -p $(dir $@)
+ $(OBJCOPY) -O binary $< $@
+ @test "$$(stat -c %s $@)" -le 65536
+ @truncate -s 65536 $@
+
+$(BUILD_DIR)/%.o: %.c
+ @mkdir -p $(dir $@)
+ $(CC) $(CFLAGS) -c $< -o $@
+
+$(BUILD_DIR)/%.o: %.S
+ @mkdir -p $(dir $@)
+ $(AS) $(ASFLAGS) $< -o $@
diff --git a/mubios/linker.ld b/mubios/linker.ld
new file mode 100644
index 0000000..003c29b
--- /dev/null
+++ b/mubios/linker.ld
@@ -0,0 +1,88 @@
+/*
+ RCC-Project
+
+ Copyright (C) 2026 Richard Qin
+
+ This file is part of RCC-Project.
+
+ RCC-Project is free software; you can redistribute it and/or modify it under
+ the terms of the GNU General Public License as published by the Free
+ Software Foundation; either version 3 of the License, or (at your option) any
+ later version.
+
+ RCC-Project is distributed in the hope that it will be useful, but WITHOUT ANY
+ WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR
+ A PARTICULAR PURPOSE. See the GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License along with
+ RCC-Project; see the file COPYING. If not see
+ <http://www.gnu.org/licenses/>.
+*/
+
+OUTPUT_FORMAT(elf32-i386)
+OUTPUT_ARCH(i386)
+ENTRY(reset_entry)
+
+MEMORY
+{
+ ROM (rx) : ORIGIN = 0xF0000, LENGTH = 0x10000
+ EBDA (rw) : ORIGIN = 0x9C000, LENGTH = 0x4000
+}
+
+SECTIONS
+{
+ . = ORIGIN(ROM);
+ __rom_start = .;
+
+ . = ALIGN(16);
+ .text16 :
+ {
+ KEEP(*(.text16 .text16.*))
+ } > ROM
+
+ . = ALIGN(16);
+ .text32 :
+ {
+ *(.text32 .text32.*)
+ } > ROM
+
+ . = ALIGN(4);
+ .rodata :
+ {
+ *(.rodata .rodata.*)
+ } > ROM
+
+ . = ALIGN(4);
+ .data :
+ {
+ __data_start = .;
+ *(.data .data.*)
+ __data_end = .;
+ } > EBDA AT> ROM
+
+ __data_load_start = LOADADDR(.data);
+
+ .reset 0xFFFF0 :
+ {
+ KEEP(*(.reset))
+ } > ROM
+
+ .bss (NOLOAD) :
+ {
+ . = ALIGN(4);
+ __bss_start = .;
+ *(.bss .bss.* COMMON)
+ __bss_end = .;
+ } > EBDA
+
+ __ebda_start = ORIGIN(EBDA);
+ __ebda_end = ORIGIN(EBDA) + LENGTH(EBDA);
+ __rom_end = ORIGIN(ROM) + LENGTH(ROM);
+
+ ASSERT(SIZEOF(.reset) <= 16, "reset section exceeds 16 bytes")
+ ASSERT(__bss_end <= __ebda_end, "EBDA overflow")
+ ASSERT(
+ LOADADDR(.reset) + SIZEOF(.reset) <= ORIGIN(ROM) + LENGTH(ROM),
+ "ROM overflow"
+ )
+}