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:
parent
bdeb32b11c
commit
8ba1161404
|
@ -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
|
|
@ -1,2 +1,4 @@
|
||||||
bin/
|
bin/
|
||||||
**/obj
|
**/obj
|
||||||
|
/.cache
|
||||||
|
/compile_commands.json
|
7
Makefile
7
Makefile
|
@ -1,4 +1,4 @@
|
||||||
.PHONY: all copy clean
|
.PHONY: all copy clean bear
|
||||||
|
|
||||||
TOP=$(shell pwd)
|
TOP=$(shell pwd)
|
||||||
|
|
||||||
|
@ -9,10 +9,12 @@ endif
|
||||||
|
|
||||||
all:
|
all:
|
||||||
make -C rom/ee TOP=$(TOP) CONFIG=$(CONFIG)
|
make -C rom/ee TOP=$(TOP) CONFIG=$(CONFIG)
|
||||||
|
make -C rom/iop TOP=$(TOP) CONFIG=$(CONFIG)
|
||||||
make -C rom TOP=$(TOP) CONFIG=$(CONFIG)
|
make -C rom TOP=$(TOP) CONFIG=$(CONFIG)
|
||||||
|
|
||||||
clean:
|
clean:
|
||||||
make -C rom/ee 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
|
make -C rom TOP=$(TOP) CONFIG=$(CONFIG) clean
|
||||||
|
|
||||||
# copy to PCSX2 BIOS root
|
# copy to PCSX2 BIOS root
|
||||||
|
@ -21,3 +23,6 @@ clean:
|
||||||
# ROMDIR (and the BIOS selection menu only shows ROMs with a ROMDIR)
|
# ROMDIR (and the BIOS selection menu only shows ROMs with a ROMDIR)
|
||||||
copy:
|
copy:
|
||||||
cp bin/ps2rom_$(CONFIG).rom ~/.config/PCSX2/bios
|
cp bin/ps2rom_$(CONFIG).rom ~/.config/PCSX2/bios
|
||||||
|
|
||||||
|
bear:
|
||||||
|
bear -- $(MAKE) CONFIG=$(CONFIG)
|
|
@ -29,6 +29,8 @@ OBJECTS := $(patsubst %.c,obj/$(CONFIG)/%.o,$(filter %.c,$(SRCS)))
|
||||||
OBJECTS += $(patsubst %.cpp,obj/$(CONFIG)/%.o,$(filter %.cpp,$(SRCS)))
|
OBJECTS += $(patsubst %.cpp,obj/$(CONFIG)/%.o,$(filter %.cpp,$(SRCS)))
|
||||||
OBJECTS += $(patsubst %.s,obj/$(CONFIG)/%.o,$(filter %.s,$(SRCS)))
|
OBJECTS += $(patsubst %.s,obj/$(CONFIG)/%.o,$(filter %.s,$(SRCS)))
|
||||||
|
|
||||||
|
CFLAGS := $(CFLAGS) $(INCS)
|
||||||
|
|
||||||
# include target-specific recipies specifying how to
|
# include target-specific recipies specifying how to
|
||||||
# build for the target.
|
# build for the target.
|
||||||
include $(TOP)/build/targets/$(TARGET).mk
|
include $(TOP)/build/targets/$(TARGET).mk
|
||||||
|
|
|
@ -1,5 +1,5 @@
|
||||||
NAME=ps2rom
|
NAME=ps2rom
|
||||||
TARGET=iop
|
TARGET=ee
|
||||||
KIND=bin
|
KIND=bin
|
||||||
|
|
||||||
SELF=$(shell pwd)
|
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.
|
# this will only link to the EE ROM codebase.
|
||||||
LIBS=-lps2rom_ee_$(CONFIG)
|
LIBS=-lps2rom_ee_$(CONFIG)
|
||||||
|
|
||||||
|
#-lps2rom_iop_$(CONFIG)
|
||||||
|
|
||||||
# sources
|
# sources
|
||||||
SRCS = rom_start.s
|
SRCS = rom_start.s
|
||||||
|
|
||||||
|
@ -30,6 +32,10 @@ $(BINDIR)/:
|
||||||
$(OBJDIR)/:
|
$(OBJDIR)/:
|
||||||
mkdir -p $@
|
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
|
$(BINDIR)/$(FINALNAME).rom: $(BINDIR)/$(FINALNAME).elf
|
||||||
$(OBJCOPY) -O binary $< $@
|
$(OBJCOPY) -O binary $< $@
|
||||||
|
|
||||||
|
|
|
@ -9,6 +9,7 @@ CXXFLAGS = -fno-exceptions -fno-rtti
|
||||||
|
|
||||||
# sources
|
# sources
|
||||||
SRCS = _ee_start.s \
|
SRCS = _ee_start.s \
|
||||||
|
ee_sio.c \
|
||||||
ee_start.c
|
ee_start.c
|
||||||
|
|
||||||
.PHONY: all clean clean-products
|
.PHONY: all clean clean-products
|
||||||
|
|
|
@ -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++);
|
||||||
|
}
|
|
@ -1,16 +1,8 @@
|
||||||
|
#include "shared/sio.h"
|
||||||
#define __noreturn __attribute__((noreturn))
|
#include "shared/attributes.h"
|
||||||
|
|
||||||
static void putc(char c) {
|
|
||||||
*((char*)0x1000f180) = c;
|
|
||||||
}
|
|
||||||
|
|
||||||
static void puts(const char* s) {
|
|
||||||
while (*s)
|
|
||||||
putc(*s++);
|
|
||||||
}
|
|
||||||
|
|
||||||
__noreturn void _ee_start() {
|
__noreturn void _ee_start() {
|
||||||
puts("EE: Hello World from Lily~\n");
|
SIO_puts("EE: Hello World from Lily~\n");
|
||||||
while(1);
|
while(1)
|
||||||
|
;
|
||||||
}
|
}
|
||||||
|
|
|
@ -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
|
|
@ -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
|
|
@ -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++);
|
||||||
|
}
|
|
@ -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)
|
||||||
|
;
|
||||||
|
}
|
13
rom/link.ld
13
rom/link.ld
|
@ -1,14 +1,21 @@
|
||||||
_stack_size = 0x80000;
|
_stack_size = 0x80000;
|
||||||
_heap_size = 1024*1024*10;
|
_heap_size = 1024*1024*10;
|
||||||
|
|
||||||
|
_text_origin = 0xbfc00000;
|
||||||
|
|
||||||
ENTRY(_start);
|
ENTRY(_start);
|
||||||
SECTIONS {
|
SECTIONS {
|
||||||
.text 0xbfc00000 : {
|
. = 0xbfc00000;
|
||||||
_text_origin = .;
|
|
||||||
*start.o /* Always link reset first */
|
.text : {
|
||||||
|
*rom_start.o /* Always link reset as the first object */
|
||||||
|
|
||||||
|
*(libps2rom_ee_*.a)
|
||||||
|
*(libps2rom_iop_*.a)
|
||||||
|
|
||||||
*(.text)
|
*(.text)
|
||||||
*(.rodata)
|
*(.rodata)
|
||||||
|
*(.rodata.*)
|
||||||
}
|
}
|
||||||
_text_size = . - _text_origin;
|
_text_size = . - _text_origin;
|
||||||
|
|
||||||
|
|
|
@ -10,8 +10,9 @@
|
||||||
.org 0
|
.org 0
|
||||||
.set noat
|
.set noat
|
||||||
|
|
||||||
// externs
|
// externs from each piece of the code
|
||||||
.extern _ee_start
|
.extern _ee_start
|
||||||
|
.extern _iop_start
|
||||||
|
|
||||||
.globl _start
|
.globl _start
|
||||||
_start:
|
_start:
|
||||||
|
@ -21,5 +22,7 @@ _start:
|
||||||
nop
|
nop
|
||||||
j _ee_start // Call EE start routine
|
j _ee_start // Call EE start routine
|
||||||
nop
|
nop
|
||||||
__iop: // for now the iop stalls.
|
__iop:
|
||||||
j __iop
|
j __iop
|
||||||
|
//j _iop_start // Call IOP start routine
|
||||||
|
//nop
|
|
@ -0,0 +1 @@
|
||||||
|
#define __noreturn __attribute__((noreturn))
|
|
@ -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
|
Loading…
Reference in New Issue