ps2rom: Initial commit

This is the first version of the code which works.
This commit is contained in:
Lily Tsuru 2023-11-02 03:57:19 -04:00
commit d7e07280d0
10 changed files with 264 additions and 0 deletions

2
.gitignore vendored Normal file
View File

@ -0,0 +1,2 @@
bin/
**/obj

14
Makefile Normal file
View File

@ -0,0 +1,14 @@
.PHONY: all clean
TOP=$(shell pwd)
# Set a default configuration.
ifeq ($(CONFIG),)
CONFIG=release
endif
all:
make -C rom TOP=$(TOP) CONFIG=$(CONFIG)
clean:
make -C rom TOP=$(TOP) CONFIG=$(CONFIG) clean

36
build/core.mk Normal file
View File

@ -0,0 +1,36 @@
# Common GNU Make rules for building the project
# This makefile is expected to be included after the variables given
# have been defined:
#
# NAME=name
#
# TARGET=ee|iop
#
# KIND=bin|lib
#
# SRCS=[... source-file-list]
#
debug_Valid := y
release_Valid := y
ifneq ($($(CONFIG)_Valid),y)
$(error Invalid configuration $(CONFIG) specified)
endif
BINDIR = $(TOP)/bin
OBJDIR = obj/$(CONFIG)
# include target-specific recipies specifying how to
# build for the target.
include $(TOP)/build/$(TARGET)-common.mk
#include $(TOP)/build/$(TARGET)-$(KIND).mk
FINALNAME=$(NAME)_$(CONFIG)
OBJECTS := $(patsubst %.c,obj/$(CONFIG)/%.o,$(filter %.c,$(SRCS)))
OBJECTS += $(patsubst %.cpp,obj/$(CONFIG)/%.o,$(filter %.cpp,$(SRCS)))
OBJECTS += $(patsubst %.s,obj/$(CONFIG)/%.o,$(filter %.s,$(SRCS)))

12
build/ee-bin.mk Normal file
View File

@ -0,0 +1,12 @@
FINALNAME=$(NAME)_$(CONFIG)
OBJECTS := $(patsubst %.c,obj/$(CONFIG)/%.o,$(filter %.c,$(SRCS)))
OBJECTS += $(patsubst %.cpp,obj/$(CONFIG)/%.o,$(filter %.cpp,$(SRCS)))
OBJECTS += $(patsubst %.s,obj/$(CONFIG)/%.o,$(filter %.s,$(SRCS)))
$(BINDIR)/$(FINALNAME).elf: $(OBJDIR)/ $(BINDIR)/ $(OBJECTS)
$(LD) $(LDFLAGS) $(LIBS) $(OBJECTS) -o $@
clean-products:
-rm $(BINDIR)/$(FINALNAME).elf
-rm -rf obj

36
build/ee-common.mk Normal file
View File

@ -0,0 +1,36 @@
# common EE toolchain stuff
# EE toolchain root.
EE_TRIPLET=mips64r5900el-ps2-elf
CC=$(EE_TRIPLET)-gcc
AS=$(CC) -mabi=32 -march=r3000 #HACK
CXX=$(EE_TRIPLET)-g++
#LD=$(CC)
LD=mipsel-ps2-irx-gcc # HACK
AR=$(EE_TRIPLET)-ar
OBJCOPY=$(EE_TRIPLET)-objcopy
ifeq ($(CONFIG),release)
CFLAGS := $(CFLAGS) -G0 -O3 -Wall -Wextra -Werror -fno-common -fno-strict-aliasing
ASFLAGS := -xassembler-with-cpp
endif
ifeq ($(CONFIG),debug)
CFLAGS := $(CFLAGS) -G0 -O0 -g3 -Wall -Wextra -fno-common -fno-strict-aliasing
ASFLAGS := -xassembler-with-cpp -g3
endif
CXXFLAGS := $(CXXFLAGS) $(CFLAGS)
# compile rules
$(OBJDIR)/%.o: %.c
$(CC) -c $(CFLAGS) $< -o $@
$(OBJDIR)/%.o: %.cpp
$(CXX) -c $(CXXFLAGS) $< -o $@
$(OBJDIR)/%.o: %.s
$(AS) -c $(ASFLAGS) $< -o $@

12
build/ee-lib.mk Normal file
View File

@ -0,0 +1,12 @@
FINALNAME=$(NAME)_$(CONFIG)
OBJECTS := $(patsubst %.c,obj/$(CONFIG)/%.o,$(filter %.c,$(SRCS)))
OBJECTS += $(patsubst %.cpp,obj/$(CONFIG)/%.o,$(filter %.cpp,$(SRCS)))
OBJECTS += $(patsubst %.s,obj/$(CONFIG)/%.o,$(filter %.s,$(SRCS)))
clean-products:
-rm $(BINDIR)/lib$(FINALNAME).a
-rm -rf obj
$(BINDIR)/lib$(FINALNAME).a: $(OBJDIR)/ $(BINDIR)/ $(OBJECTS)
$(AR) rv $@ $(OBJECTS)

44
rom/Makefile Normal file
View File

@ -0,0 +1,44 @@
NAME=ps2rom
TARGET=ee
KIND=bin
SELF=$(shell pwd)
INCS = -I$(TOP)/src
CFLAGS = -ffreestanding -fno-stack-protector -mabi=32
CXXFLAGS = -fno-exceptions -fno-rtti
LDFLAGS = -nostartfiles -nodefaultlibs -Wl,-Map,$(BINDIR)/$(FINALNAME).map -T$(SELF)/link.ld
# sources
SRCS = start.s \
ee_start.c
.PHONY: all clean clean-products
include $(TOP)/build/core.mk
all: $(BINDIR)/$(FINALNAME).rom
$(BINDIR)/:
mkdir -p $@
$(OBJDIR)/:
mkdir -p $@
clean-products:
-rm $(BINDIR)/$(FINALNAME).elf
-rm -rf obj
clean: clean-products
-rm $(BINDIR)/$(FINALNAME).rom
$(BINDIR)/$(FINALNAME).rom: $(BINDIR)/$(FINALNAME).elf
$(OBJCOPY) -O binary $< $@
$(BINDIR)/$(FINALNAME).elf: $(OBJDIR)/ $(BINDIR)/ $(OBJECTS)
$(LD) $(LDFLAGS) $(LIBS) $(OBJECTS) -o $@

24
rom/ee_start.c Normal file
View File

@ -0,0 +1,24 @@
#define __noreturn __attribute__((noreturn))
static void putc(char c) {
*((char*)0x1000f180) = c;
}
static void puts(const char* s) {
while (*s != 0) {
putc(*s++);
}
}
__noreturn void _ee_start() {
puts("Hello World from Riri~ (EE)\n");
while(1);
}
__asm__ (
".global ee_start\n"
"ee_start:\n"
"li $sp, 0x80010000\n"
"j _ee_start\n");

68
rom/link.ld Normal file
View File

@ -0,0 +1,68 @@
_stack_size = 0x80000;
_heap_size = 1024*1024*10;
ENTRY(_start);
SECTIONS {
/* 0xbfc00000 */
.text 0xbfc00000 : {
_text_origin = .;
*start.o /* Always link reset first */
*(.text)
*(.rodata)
}
_text_size = . - _text_origin;
.reginfo ALIGN(128) : {
*(.reginfo)
}
.data ALIGN(128) : {
_data_origin = .;
*(.data)
}
.rdata ALIGN(128) : {
*(.rdata)
}
_data_size = . - _data_origin;
_gp = ALIGN(128) + 0x7ff0;
.lit4 ALIGN(128) : {
*(.lit4)
}
.lit8 ALIGN(128) : {
*(.lit8)
}
.sdata ALIGN(128) : {
*(.sdata)
}
.sbss ALIGN(128) (NOLOAD) : { /* uninitialized data */
_fbss = . ;
*(.scommon)
*(.sbss)
}
.bss ALIGN(128) (NOLOAD) : { /* uninitialized data */
*(.bss)
}
.COMMON ALIGN(128) (NOLOAD) : { /* uninitialized data */
*(COMMON)
}
_bss_size = . - _fbss;
_end_bss = . - 4;
_stack = .;
. += _stack_size ;
_end_stack = . - 8*5;
_end = . ;
__lc_bh = . ;
. += _heap_size ;
__lc_eh = .;
}

16
rom/start.s Normal file
View File

@ -0,0 +1,16 @@
.org 0
.set noat
// externs
.extern ee_start
.globl _start
_start:
mfc0 $at, $15 // load PRID
sltiu $at, 0x59
bne $15, 0, __iop
nop
j ee_start
nop
__iop: // for now iop stalls.
j __iop