diff --git a/Makefile b/Makefile index 4dea321dd..7fb78eb56 100644 --- a/Makefile +++ b/Makefile @@ -7,12 +7,10 @@ QEMU_IRIX ?= tools/irix/qemu-irix IRIX_ROOT ?= tools/irix/root IDOCC ?= $(QEMU_IRIX) -silent -L $(IRIX_ROOT) $(IRIX_ROOT)/usr/bin/cc -IDOAS ?= $(QEMU_IRIX) -silent -L $(IRIX_ROOT) $(IRIX_ROOT)/usr/bin/as ################################################################################ QEMUCC = $(QEMU_IRIX) -silent -L $(IRIX_ROOT) $(IRIX_ROOT)/usr/bin/cc -QEMUAS = $(QEMU_IRIX) -silent -L $(IRIX_ROOT) $(IRIX_ROOT)/usr/bin/as export ROMID @@ -46,6 +44,11 @@ ifeq ($(ROMID),jpn-final) VERSION=5 endif +DEFINES := VERSION=$(VERSION) NTSC=$(NTSC) PAL=$(PAL) JPN=$(JPN) PIRACYCHECKS=$(PIRACYCHECKS) + +C_DEFINES := $(foreach d,$(DEFINES),-D$(d)) +AS_DEFINES := $(foreach d,$(DEFINES),--defsym $(d)) --defsym _LANGUAGE_ASSEMBLY=1 + A_DIR := src/assets/$(ROMID) B_DIR := build/$(ROMID) E_DIR := extracted/$(ROMID) @@ -62,6 +65,8 @@ else TOOLCHAIN := mips-elf endif +AS := $(TOOLCHAIN)-as + MIPSISET := -mips2 -32 OPT_LVL := -O2 LOOPUNROLL := -Wo,-loopunroll,0 @@ -153,11 +158,7 @@ ifeq ($(ROMID), ntsc-beta) $(B_DIR)/lib/ultra/io/pfsisplug.o: OPT_LVL := -O1 endif -CFLAGS = -DVERSION=$(VERSION) \ - -DNTSC=$(NTSC) \ - -DPAL=$(PAL) \ - -DJPN=$(JPN) \ - -DPIRACYCHECKS=$(PIRACYCHECKS) \ +CFLAGS = $(C_DEFINES) \ $(LOOPUNROLL) \ -Wab,-r4300_mul \ -non_shared \ @@ -171,6 +172,8 @@ CFLAGS = -DVERSION=$(VERSION) \ $(OPT_LVL) \ $(MIPSISET) +ASFLAGS = -march=vr4300 -mabi=32 -Isrc/include $(AS_DEFINES) + C_FILES := $(shell find src/lib src/game src/inflate -name '*.c') S_FILES := $(shell find src/lib src/game -name '*.s') @@ -518,7 +521,7 @@ $(B_DIR)/%.o: src/%.c $(ASSETMGR_O_FILES) $(B_DIR)/%.o: src/%.s @mkdir -p $(dir $@) - $(IDOAS) $(CFLAGS) $< -o $@ + cpp -P -Wno-trigraphs -I src/include $(C_DEFINES) -D_LANGUAGE_ASSEMBLY -D_MIPSEB $< | $(AS) $(ASFLAGS) -o $@ $(B_DIR)/assets/%.o: $(A_DIR)/%.c @mkdir -p $(dir $@) diff --git a/macros.inc b/src/include/macros.inc similarity index 74% rename from macros.inc rename to src/include/macros.inc index c97fd81f4..1adda2564 100644 --- a/macros.inc +++ b/src/include/macros.inc @@ -1,7 +1,4 @@ -# Assembly Macros - .macro glabel label .global \label \label: .endm - diff --git a/src/lib/segments.s b/src/lib/segments.s index 4429f1801..71363ce5d 100644 --- a/src/lib/segments.s +++ b/src/lib/segments.s @@ -1,41 +1,36 @@ -#include "asm_helper.h" +#include "macros.inc" .set noat .set noreorder -.text -LEAF(segGetDataStart) - lui v0, %hi(_dataSegmentStart) - jr ra - addiu v0, v0, %lo(_dataSegmentStart) -END(segGetDataStart) +.section .text -LEAF(segGetDatazipRomStart) - lui v0, %hi(_datazipSegmentRomStart) - jr ra - addiu v0, v0, %lo(_datazipSegmentRomStart) -END(segGetDatazipRomStart) +glabel segGetDataStart + lui $v0, %hi(_dataSegmentStart) + jr $ra + addiu $v0, $v0, %lo(_dataSegmentStart) -LEAF(segGetInflateRomStart) - lui v0, %hi(_inflateSegmentRomStart) - jr ra - addiu v0, v0, %lo(_inflateSegmentRomStart) -END(segGetInflateRomStart) +glabel segGetDatazipRomStart + lui $v0, %hi(_datazipSegmentRomStart) + jr $ra + addiu $v0, $v0, %lo(_datazipSegmentRomStart) -LEAF(segGetInflateRomStart2) - lui v0, %hi(_inflateSegmentRomStart) - jr ra - addiu v0, v0, %lo(_inflateSegmentRomStart) -END(segGetInflateRomStart2) +glabel segGetInflateRomStart + lui $v0, %hi(_inflateSegmentRomStart) + jr $ra + addiu $v0, $v0, %lo(_inflateSegmentRomStart) -LEAF(segGetGamezipsRomStart) - lui v0, %hi(_gamezipSegmentRomStart) - jr ra - addiu v0, v0, %lo(_gamezipSegmentRomStart) -END(segGetGamezipsRomStart) +glabel segGetInflateRomStart2 + lui $v0, %hi(_inflateSegmentRomStart) + jr $ra + addiu $v0, $v0, %lo(_inflateSegmentRomStart) -LEAF(bootInflate) - lui a3, %hi(inflate1173) - addiu a3, a3, %lo(inflate1173) - jr a3 +glabel segGetGamezipsRomStart + lui $v0, %hi(_gamezipSegmentRomStart) + jr $ra + addiu $v0, $v0, %lo(_gamezipSegmentRomStart) + +glabel bootInflate + lui $a3, %hi(inflate1173) + addiu $a3, $a3, %lo(inflate1173) + jr $a3 nop -END(bootInflate) diff --git a/src/lib/ultra/gu/sqrtf.s b/src/lib/ultra/gu/sqrtf.s index 458ecb434..c4772c204 100644 --- a/src/lib/ultra/gu/sqrtf.s +++ b/src/lib/ultra/gu/sqrtf.s @@ -1,7 +1,7 @@ -#include "asm_helper.h" +#include "macros.inc" -.text -LEAF(sqrtf) +.section .text + +glabel sqrtf sqrt.s $f0, $f12 - jr ra -END(sqrtf) + jr $ra diff --git a/src/lib/ultra/os/getcause.s b/src/lib/ultra/os/getcause.s index 4ec0035f3..37cb87469 100644 --- a/src/lib/ultra/os/getcause.s +++ b/src/lib/ultra/os/getcause.s @@ -1,7 +1,8 @@ #include "asm_helper.h" +#include "macros.inc" -.text -LEAF(__osGetCause) - STAY2(mfc0 v0, C0_CAUSE) - jr ra -END(__osGetCause) +.section .text + +glabel __osGetCause + STAY2(mfc0 $v0, C0_CAUSE) + jr $ra diff --git a/src/lib/ultra/os/getcount.s b/src/lib/ultra/os/getcount.s index 1158334fb..95986949d 100644 --- a/src/lib/ultra/os/getcount.s +++ b/src/lib/ultra/os/getcount.s @@ -1,7 +1,8 @@ #include "asm_helper.h" +#include "macros.inc" -.text -LEAF(osGetCount) - STAY2(mfc0 v0, C0_COUNT) - jr ra -END(osGetCount) +.section .text + +glabel osGetCount + STAY2(mfc0 $v0, C0_COUNT) + jr $ra diff --git a/src/lib/ultra/os/getfpccsr.s b/src/lib/ultra/os/getfpccsr.s index 7fd81e912..2803a8927 100644 --- a/src/lib/ultra/os/getfpccsr.s +++ b/src/lib/ultra/os/getfpccsr.s @@ -1,7 +1,8 @@ #include "asm_helper.h" +#include "macros.inc" -.text -LEAF(__osGetFpcCsr) - STAY2(cfc1 v0, $31) - jr ra -END(__osGetFpcCsr) +.section .text + +glabel __osGetFpcCsr + STAY2(cfc1 $v0, $31) + jr $ra diff --git a/src/lib/ultra/os/getsr.s b/src/lib/ultra/os/getsr.s index 4f3fa41b5..e7f723cd9 100644 --- a/src/lib/ultra/os/getsr.s +++ b/src/lib/ultra/os/getsr.s @@ -1,7 +1,8 @@ #include "asm_helper.h" +#include "macros.inc" -.text -LEAF(__osGetSR) - STAY2(mfc0 v0, C0_SR) - jr ra -END(__osGetSR) +.section .text + +glabel __osGetSR + STAY2(mfc0 $v0, C0_SR) + jr $ra diff --git a/src/lib/ultra/os/maptlbrdb.s b/src/lib/ultra/os/maptlbrdb.s index 3ee064196..16dca990d 100644 --- a/src/lib/ultra/os/maptlbrdb.s +++ b/src/lib/ultra/os/maptlbrdb.s @@ -1,29 +1,30 @@ #include "asm_helper.h" +#include "macros.inc" .set noat .set noreorder -.text -LEAF(osMapTLBRdb) - mfc0 t0, C0_ENTRYHI - li t1, 1 - mtc0 t1, C0_INX - mtc0 zero, C0_PAGEMASK - li t2, TLBLO_UNCACHED | TLBLO_D | TLBLO_V | TLBLO_G - li t1, K2BASE - mtc0 t1, C0_ENTRYHI - li t1, KUSIZE - srl t3, t1,TLBLO_PFNSHIFT - or t3, t3,t2 - mtc0 t3, C0_ENTRYLO0 - li t1, TLBLO_G - mtc0 t1, C0_ENTRYLO1 +.section .text + +glabel osMapTLBRdb + mfc0 $t0, C0_ENTRYHI + li $t1, 1 + mtc0 $t1, C0_INX + mtc0 $zero, C0_PAGEMASK + li $t2, TLBLO_UNCACHED | TLBLO_D | TLBLO_V | TLBLO_G + li $t1, K2BASE + mtc0 $t1, C0_ENTRYHI + li $t1, KUSIZE + srl $t3, $t1, TLBLO_PFNSHIFT + or $t3, $t3, $t2 + mtc0 $t3, C0_ENTRYLO0 + li $t1, TLBLO_G + mtc0 $t1, C0_ENTRYLO1 nop tlbwi nop nop nop nop - mtc0 t0, C0_ENTRYHI - jr ra + mtc0 $t0, C0_ENTRYHI + jr $ra nop -END(osMapTLBRdb) diff --git a/src/lib/ultra/os/setcompare.s b/src/lib/ultra/os/setcompare.s index 5408cd044..da08c3609 100644 --- a/src/lib/ultra/os/setcompare.s +++ b/src/lib/ultra/os/setcompare.s @@ -1,9 +1,10 @@ #include "asm_helper.h" +#include "macros.inc" .set noreorder -.text -LEAF(__osSetCompare) - mtc0 a0, C0_COMPARE - jr ra +.section .text + +glabel __osSetCompare + mtc0 $a0, C0_COMPARE + jr $ra nop -END(__osSetCompare) diff --git a/src/lib/ultra/os/setfpccsr.s b/src/lib/ultra/os/setfpccsr.s index 8d02b9c8f..e8c68db8f 100644 --- a/src/lib/ultra/os/setfpccsr.s +++ b/src/lib/ultra/os/setfpccsr.s @@ -1,11 +1,10 @@ -#include "asm_helper.h" +#include "macros.inc" .set noreorder .text -LEAF(__osSetFpcCsr) - cfc1 v0, $31 - ctc1 a0, $31 - jr ra +glabel __osSetFpcCsr + cfc1 $v0, $31 + ctc1 $a0, $31 + jr $ra nop -END(__osSetFpcCsr) diff --git a/src/lib/ultra/os/setintmask.c b/src/lib/ultra/os/setintmask.c deleted file mode 100644 index 5373b76d0..000000000 --- a/src/lib/ultra/os/setintmask.c +++ /dev/null @@ -1,80 +0,0 @@ -#include -#include "data.h" - -const u32 var70059e30[] = {0x05550556}; -const u32 var70059e34[] = {0x0559055a}; -const u32 var70059e38[] = {0x05650566}; -const u32 var70059e3c[] = {0x0569056a}; -const u32 var70059e40[] = {0x05950596}; -const u32 var70059e44[] = {0x0599059a}; -const u32 var70059e48[] = {0x05a505a6}; -const u32 var70059e4c[] = {0x05a905aa}; -const u32 var70059e50[] = {0x06550656}; -const u32 var70059e54[] = {0x0659065a}; -const u32 var70059e58[] = {0x06650666}; -const u32 var70059e5c[] = {0x0669066a}; -const u32 var70059e60[] = {0x06950696}; -const u32 var70059e64[] = {0x0699069a}; -const u32 var70059e68[] = {0x06a506a6}; -const u32 var70059e6c[] = {0x06a906aa}; -const u32 var70059e70[] = {0x09550956}; -const u32 var70059e74[] = {0x0959095a}; -const u32 var70059e78[] = {0x09650966}; -const u32 var70059e7c[] = {0x0969096a}; -const u32 var70059e80[] = {0x09950996}; -const u32 var70059e84[] = {0x0999099a}; -const u32 var70059e88[] = {0x09a509a6}; -const u32 var70059e8c[] = {0x09a909aa}; -const u32 var70059e90[] = {0x0a550a56}; -const u32 var70059e94[] = {0x0a590a5a}; -const u32 var70059e98[] = {0x0a650a66}; -const u32 var70059e9c[] = {0x0a690a6a}; -const u32 var70059ea0[] = {0x0a950a96}; -const u32 var70059ea4[] = {0x0a990a9a}; -const u32 var70059ea8[] = {0x0aa50aa6}; -const u32 var70059eac[] = {0x0aa90aaa}; - -GLOBAL_ASM( -glabel osSetIntMask -/* 48650: 400c6000 */ mfc0 $t4,$12 -/* 48654: 3182ff01 */ andi $v0,$t4,0xff01 -/* 48658: 3c088006 */ lui $t0,%hi(__osGlobalIntMask) -/* 4865c: 2508cf70 */ addiu $t0,$t0,%lo(__osGlobalIntMask) -/* 48660: 8d0b0000 */ lw $t3,0x0($t0) -/* 48664: 2401ffff */ addiu $at,$zero,-1 -/* 48668: 01614026 */ xor $t0,$t3,$at -/* 4866c: 3108ff00 */ andi $t0,$t0,0xff00 -/* 48670: 00481025 */ or $v0,$v0,$t0 -/* 48674: 3c0aa430 */ lui $t2,0xa430 -/* 48678: 8d4a000c */ lw $t2,0xc($t2) -/* 4867c: 11400005 */ beqz $t2,.L00048694 -/* 48680: 000b4c02 */ srl $t1,$t3,0x10 -/* 48684: 2401ffff */ addiu $at,$zero,-1 -/* 48688: 01214826 */ xor $t1,$t1,$at -/* 4868c: 3129003f */ andi $t1,$t1,0x3f -/* 48690: 01495025 */ or $t2,$t2,$t1 -.L00048694: -/* 48694: 000a5400 */ sll $t2,$t2,0x10 -/* 48698: 004a1025 */ or $v0,$v0,$t2 -/* 4869c: 3c01003f */ lui $at,0x3f -/* 486a0: 00814024 */ and $t0,$a0,$at -/* 486a4: 010b4024 */ and $t0,$t0,$t3 -/* 486a8: 000843c2 */ srl $t0,$t0,0xf -/* 486ac: 3c0a7006 */ lui $t2,%hi(var70059e30) -/* 486b0: 01485021 */ addu $t2,$t2,$t0 -/* 486b4: 954a9e30 */ lhu $t2,%lo(var70059e30)($t2) -/* 486b8: 3c01a430 */ lui $at,0xa430 -/* 486bc: ac2a000c */ sw $t2,0xc($at) -/* 486c0: 3088ff01 */ andi $t0,$a0,0xff01 -/* 486c4: 3169ff00 */ andi $t1,$t3,0xff00 -/* 486c8: 01094024 */ and $t0,$t0,$t1 -/* 486cc: 3c01ffff */ lui $at,0xffff -/* 486d0: 342100ff */ ori $at,$at,0xff -/* 486d4: 01816024 */ and $t4,$t4,$at -/* 486d8: 01886025 */ or $t4,$t4,$t0 -/* 486dc: 408c6000 */ mtc0 $t4,$12 -/* 486e0: 00000000 */ nop -/* 486e4: 00000000 */ nop -/* 486e8: 03e00008 */ jr $ra -/* 486ec: 00000000 */ nop -); diff --git a/src/lib/ultra/os/setintmask.s b/src/lib/ultra/os/setintmask.s new file mode 100644 index 000000000..73c50e25e --- /dev/null +++ b/src/lib/ultra/os/setintmask.s @@ -0,0 +1,117 @@ +#include "macros.inc" +.set noat +.set noreorder + +.section .text + +glabel osSetIntMask + mfc0 $t4, $12 + andi $v0, $t4, 0xff01 + lui $t0, %hi(__osGlobalIntMask) + addiu $t0, $t0, %lo(__osGlobalIntMask) + lw $t3, 0x0($t0) + addiu $at, $zero, -1 + xor $t0, $t3, $at + andi $t0, $t0, 0xff00 + or $v0, $v0, $t0 + lui $t2, 0xa430 + lw $t2, 0xc($t2) + beqz $t2, .L00048694 + srl $t1, $t3, 0x10 + addiu $at, $zero, -1 + xor $t1, $t1, $at + andi $t1, $t1, 0x3f + or $t2, $t2, $t1 +.L00048694: + sll $t2, $t2, 0x10 + or $v0, $v0, $t2 + lui $at, 0x3f + and $t0, $a0, $at + and $t0, $t0, $t3 + srl $t0, $t0, 0xf + lui $t2, %hi(var70059e30) + addu $t2, $t2, $t0 + lhu $t2, %lo(var70059e30)($t2) + lui $at, 0xa430 + sw $t2, 0xc($at) + andi $t0, $a0, 0xff01 + andi $t1, $t3, 0xff00 + and $t0, $t0, $t1 + lui $at, 0xffff + ori $at, $at, 0xff + and $t4, $t4, $at + or $t4, $t4, $t0 + mtc0 $t4, $12 + nop + nop + jr $ra + nop + +.section .rodata + +glabel var70059e30 +.half 0x0555 +.half 0x0556 +.half 0x0559 +.half 0x055a +.half 0x0565 +.half 0x0566 +.half 0x0569 +.half 0x056a +.half 0x0595 +.half 0x0596 +.half 0x0599 +.half 0x059a +.half 0x05a5 +.half 0x05a6 +.half 0x05a9 +.half 0x05aa +.half 0x0655 +.half 0x0656 +.half 0x0659 +.half 0x065a +.half 0x0665 +.half 0x0666 +.half 0x0669 +.half 0x066a +.half 0x0695 +.half 0x0696 +.half 0x0699 +.half 0x069a +.half 0x06a5 +.half 0x06a6 +.half 0x06a9 +.half 0x06aa +.half 0x0955 +.half 0x0956 +.half 0x0959 +.half 0x095a +.half 0x0965 +.half 0x0966 +.half 0x0969 +.half 0x096a +.half 0x0995 +.half 0x0996 +.half 0x0999 +.half 0x099a +.half 0x09a5 +.half 0x09a6 +.half 0x09a9 +.half 0x09aa +.half 0x0a55 +.half 0x0a56 +.half 0x0a59 +.half 0x0a5a +.half 0x0a65 +.half 0x0a66 +.half 0x0a69 +.half 0x0a6a +.half 0x0a95 +.half 0x0a96 +.half 0x0a99 +.half 0x0a9a +.half 0x0aa5 +.half 0x0aa6 +.half 0x0aa9 +.half 0x0aaa + diff --git a/src/lib/ultra/os/setsr.s b/src/lib/ultra/os/setsr.s index 63cc3d73b..6453176e5 100644 --- a/src/lib/ultra/os/setsr.s +++ b/src/lib/ultra/os/setsr.s @@ -1,10 +1,11 @@ #include "asm_helper.h" +#include "macros.inc" .set noreorder -.text -LEAF(__osSetSR) - mtc0 a0, C0_SR +.section .text + +glabel __osSetSR + mtc0 $a0, C0_SR nop - jr ra + jr $ra nop -END(__osSetSR) diff --git a/tools/asmpreproc/prelude.s b/tools/asmpreproc/prelude.s index 0c111a2a9..6450b7f6b 100644 --- a/tools/asmpreproc/prelude.s +++ b/tools/asmpreproc/prelude.s @@ -1,5 +1,5 @@ .set noat .set noreorder .set gp=64 -.include "macros.inc" +.include "src/include/macros.inc"