rom: an attempt at IOP stuff

it seems multiple source files for each part break, and I don't quite know why
This commit is contained in:
Lily Tsuru 2023-11-06 06:36:49 -05:00
parent bdeb32b11c
commit 8ba1161404
16 changed files with 187 additions and 21 deletions

46
.clang-format Executable file
View File

@ -0,0 +1,46 @@
# .clang-format for native code portion
BasedOnStyle: Google
# force T* or T&
DerivePointerAlignment: false
PointerAlignment: Left
TabWidth: 4
IndentWidth: 4
UseTab: Always
IndentPPDirectives: BeforeHash
AllowAllParametersOfDeclarationOnNextLine: true
AllowShortBlocksOnASingleLine: false
AllowShortFunctionsOnASingleLine: InlineOnly
AllowShortIfStatementsOnASingleLine: Never
AllowShortLoopsOnASingleLine: false
AllowShortCaseLabelsOnASingleLine: true
BinPackArguments: true
BinPackParameters: true
BreakConstructorInitializers: BeforeColon
BreakStringLiterals: false
ColumnLimit: 150
CompactNamespaces: false
ConstructorInitializerAllOnOneLineOrOnePerLine: true
ContinuationIndentWidth: 0
# turning this on causes major issues with initializer lists
Cpp11BracedListStyle: false
SpaceBeforeCpp11BracedList: true
FixNamespaceComments: true
NamespaceIndentation: All
ReflowComments: true
SortIncludes: CaseInsensitive
SortUsingDeclarations: true
SpacesInSquareBrackets: false
SpaceBeforeParens: Never
SpacesBeforeTrailingComments: 1

2
.gitignore vendored
View File

@ -1,2 +1,4 @@
bin/
**/obj
/.cache
/compile_commands.json

View File

@ -1,4 +1,4 @@
.PHONY: all copy clean
.PHONY: all copy clean bear
TOP=$(shell pwd)
@ -9,10 +9,12 @@ endif
all:
make -C rom/ee TOP=$(TOP) CONFIG=$(CONFIG)
make -C rom/iop TOP=$(TOP) CONFIG=$(CONFIG)
make -C rom TOP=$(TOP) CONFIG=$(CONFIG)
clean:
make -C rom/ee TOP=$(TOP) CONFIG=$(CONFIG) clean
make -C rom/iop TOP=$(TOP) CONFIG=$(CONFIG) clean
make -C rom TOP=$(TOP) CONFIG=$(CONFIG) clean
# copy to PCSX2 BIOS root
@ -21,3 +23,6 @@ clean:
# ROMDIR (and the BIOS selection menu only shows ROMs with a ROMDIR)
copy:
cp bin/ps2rom_$(CONFIG).rom ~/.config/PCSX2/bios
bear:
bear -- $(MAKE) CONFIG=$(CONFIG)

View File

@ -29,6 +29,8 @@ 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)))
CFLAGS := $(CFLAGS) $(INCS)
# include target-specific recipies specifying how to
# build for the target.
include $(TOP)/build/targets/$(TARGET).mk

View File

@ -1,5 +1,5 @@
NAME=ps2rom
TARGET=iop
TARGET=ee
KIND=bin
SELF=$(shell pwd)
@ -13,6 +13,8 @@ LDFLAGS = -nostartfiles -nodefaultlibs -Wl,-Map,$(BINDIR)/$(FINALNAME).map -T$(S
# this will only link to the EE ROM codebase.
LIBS=-lps2rom_ee_$(CONFIG)
#-lps2rom_iop_$(CONFIG)
# sources
SRCS = rom_start.s
@ -30,6 +32,10 @@ $(BINDIR)/:
$(OBJDIR)/:
mkdir -p $@
# make sure to assemble the primary ROM start routine
# as MIPS-I, so that we don't get into any issues.
$(OBJDIR)/rom_start.o: AS += -march=r3000
$(BINDIR)/$(FINALNAME).rom: $(BINDIR)/$(FINALNAME).elf
$(OBJCOPY) -O binary $< $@

View File

@ -9,6 +9,7 @@ CXXFLAGS = -fno-exceptions -fno-rtti
# sources
SRCS = _ee_start.s \
ee_sio.c \
ee_start.c
.PHONY: all clean clean-products

11
rom/ee/ee_sio.c Normal file
View File

@ -0,0 +1,11 @@
//! EE SIO implementation
#include <shared/sio.h>
void SIO_putc(char c) {
*((char*)0x1000f180) = c;
}
void SIO_puts(const char* s) {
while(*s)
SIO_putc(*s++);
}

View File

@ -1,16 +1,8 @@
#define __noreturn __attribute__((noreturn))
static void putc(char c) {
*((char*)0x1000f180) = c;
}
static void puts(const char* s) {
while (*s)
putc(*s++);
}
#include "shared/sio.h"
#include "shared/attributes.h"
__noreturn void _ee_start() {
puts("EE: Hello World from Lily~\n");
while(1);
SIO_puts("EE: Hello World from Lily~\n");
while(1)
;
}

29
rom/iop/Makefile Normal file
View File

@ -0,0 +1,29 @@
NAME=ps2rom_iop
TARGET=iop
KIND=lib
INCS = -I$(TOP)/rom
CFLAGS = -ffreestanding -fno-stack-protector
CXXFLAGS = -fno-exceptions -fno-rtti
# sources
SRCS = _iop_start.s \
iop_sio.c \
iop_start.c
.PHONY: all clean clean-products
include $(TOP)/build/core.mk
all: $(BINDIR)/lib$(FINALNAME).a
$(BINDIR)/:
mkdir -p $@
$(OBJDIR)/:
mkdir -p $@
clean: clean-products
include $(TOP)/build/products/$(KIND).mk

10
rom/iop/_iop_start.s Normal file
View File

@ -0,0 +1,10 @@
.set noat
.globl _iop_start
.extern iop_start
// __noreturn __naked void _iop_start()
// This is the primary entrypoint for the IOP code
_iop_start:
li $sp, 0x001fffc0 // temporary stack (2<<20-0x40)
move $fp, $sp
j iop_start

11
rom/iop/iop_sio.c Normal file
View File

@ -0,0 +1,11 @@
//! IOP SIO implementation
#include <shared/sio.h>
void SIO_putc(char c) {
*((char*)0x1f80380c) = c;
}
void SIO_puts(const char* s) {
while(*s)
SIO_putc(*s++);
}

24
rom/iop/iop_start.c Normal file
View File

@ -0,0 +1,24 @@
#include "shared/attributes.h"
#include "shared/sio.h"
__noreturn void _iop_start() {
// setup iop
*(char*)0xbf802070 = 9;
// Poke around with the cache control registers
//
*(int*)0xfffe0130 = 0xcc4;
*(int*)0xfffe0130 = 0xcc0;
// it seems like if bit 8 is set here,
// then the cache control is set nearly
// exactly like the PS1 kernel did
if((*(int*)0xbf801450) & 8)
*(int*)0xfffe0130 = 0x1e988;
else
*(int*)0xfffe0130 = 0x1edd8;
SIO_puts("IOP: Hello World from Lily~\n");
while(1)
;
}

View File

@ -1,14 +1,21 @@
_stack_size = 0x80000;
_heap_size = 1024*1024*10;
_text_origin = 0xbfc00000;
ENTRY(_start);
SECTIONS {
.text 0xbfc00000 : {
_text_origin = .;
*start.o /* Always link reset first */
. = 0xbfc00000;
.text : {
*rom_start.o /* Always link reset as the first object */
*(libps2rom_ee_*.a)
*(libps2rom_iop_*.a)
*(.text)
*(.rodata)
*(.rodata.*)
}
_text_size = . - _text_origin;

View File

@ -10,8 +10,9 @@
.org 0
.set noat
// externs
// externs from each piece of the code
.extern _ee_start
.extern _iop_start
.globl _start
_start:
@ -21,5 +22,7 @@ _start:
nop
j _ee_start // Call EE start routine
nop
__iop: // for now the iop stalls.
__iop:
j __iop
//j _iop_start // Call IOP start routine
//nop

1
rom/shared/attributes.h Normal file
View File

@ -0,0 +1 @@
#define __noreturn __attribute__((noreturn))

16
rom/shared/sio.h Normal file
View File

@ -0,0 +1,16 @@
#ifndef SIO_H
#define SIO_H
#ifdef __cplusplus
extern "C" {
#endif
void SIO_putc(char c);
void SIO_puts(const char* s);
#ifdef __cplusplus
}
#endif
#endif