|
Nugget
Bare-metal libraries and examples for the original PlayStation
|
#include "common/hardware/dma.h"#include "common/hardware/hwregs.h"#include "common/syscalls/syscalls.h"#include "exotic/cester.h"#include "../cop0/cester-cop0.c"
Macros | |
| #define | PCSX_TESTS 0 |
| #define | CESTER_MAYBE_TEST CESTER_TEST |
| #define | CESTER_NO_SIGNAL |
| #define | CESTER_NO_TIME |
| #define | EXIT_SUCCESS 0 |
| #define | EXIT_FAILURE 1 |
Functions | |
| CESTER_TEST (cpu_quiet, CESTER_TEST(cpu_tests, for(unsigned i=0;i< 200000;i++) __asm__ volatile("");cester_assert_uint_eq(0, s_got40);cester_assert_uint_eq(0, s_got80);) | |
| cester_assert_uint_eq (0x88bbccdd, out) | |
| CESTER_MAYBE_TEST (cpu_LWR_LWL_nodelay, cpu_tests, uint32_t buff[2]={0x11223344, 0x55667788};uint32_t out=cpu_LWR_LWL_nodelay(buff, 0xaabbccdd);cester_assert_uint_eq(0xaabbccdd, out);) CESTER_TEST(cpu_LWR_LWL_delayed | |
| cester_assert_uint_eq (0x88112233, out) | |
| CESTER_TEST (cpu_LWR_LWL_load_different, cpu_tests, uint32_t buff[3]={0x11223344, 0x55667788, 0xaabbccdd};uint32_t out=cpu_LWR_LWL_load_different(buff, 0xeeffeffe);cester_assert_uint_eq(0x88556677, out);) CESTER_TEST(cpu_LW_LWR | |
| cester_assert_uint_eq (0xaa112233, out) | |
| CESTER_TEST (cpu_delayed_load, cpu_tests, uint32_t buff[1]={1};uint32_t out=cpu_delayed_load(buff, 0);cester_assert_uint_eq(0, out);) CESTER_TEST(cpu_delayed_load_cancelled | |
| cester_assert_uint_eq (0, out) | |
| CESTER_MAYBE_TEST (cpu_delayed_load_load, cpu_tests, uint32_t buff[2]={1, 2};uint64_t out=cpu_delayed_load_load(buff, 4);out=((out > > 16)|out) &0xffffffff;cester_assert_uint_eq(0x00020004, out);) CESTER_MAYBE_TEST(cpu_BRANCH_BRANCH_slot | |
| cester_assert_uint_eq (0x189, out) | |
| cester_assert_uint_eq (9, out) | |
| CESTER_MAYBE_TEST (cpu_JUMP_JUMP_slot, cpu_tests, uint32_t out=jumpjump1();cester_assert_uint_eq(0x69, out);out=jumpjump2();cester_assert_uint_eq(21, out);) CESTER_TEST(cpu_DIV_by_zero | |
| __asm__ | __volatile__ ("li $v0, 0x55555555\n" "mthi $v0\n" "mtlo $v0\n" "nop\n" "div $0, $0\n" "mfhi %0\n" "mflo %1\n" "nop\n" :"=r"(hi), "=r"(lo) ::"v0") |
| cester_assert_int_eq (0, hi) | |
| cester_assert_int_eq (-1, lo) | |
| __asm__ | __volatile__ ("li $v0, 0x55555555\n" "mthi $v0\n" "mtlo $v0\n" "li $v0, 42\n" ".word 0x0040001a\n" "mfhi %0\n" "mflo %1\n" "nop\n" :"=r"(hi), "=r"(lo) ::"v0") |
| cester_assert_int_eq (42, hi) | |
| CESTER_TEST (cpu_DIVU_by_zero, cpu_tests, int32_t hi, lo;__asm__ __volatile__("li $v0, 0x55555555\n" "mthi $v0\n" "mtlo $v0\n" "nop\n" "divu $0, $0\n" "mfhi %0\n" "mflo %1\n" "nop\n" :"=r"(hi), "=r"(lo) ::"v0");cester_assert_int_eq(0, hi);cester_assert_int_eq(-1, lo);__asm__ __volatile__("li $v0, 0x55555555\n" "mthi $v0\n" "mtlo $v0\n" "li $v0, 42\n" ".word 0x0040001b\n" "mfhi %0\n" "mflo %1\n" "nop\n" :"=r"(hi), "=r"(lo) ::"v0");cester_assert_int_eq(42, hi);cester_assert_int_eq(-1, lo);) CESTER_TEST(cpu_MULT_constant_operands | |
| __asm__ | __volatile__ ("li $v0, 0x55555555\n" "mthi $v0\n" "mtlo $v0\n" "li $v0, 256\n" "li $v1, 384\n" "mult $v0, $v1\n" "mflo %1\n" "mfhi %0\n" "nop\n" :"=r"(hi), "=r"(lo) ::"v0", "v1") |
| cester_assert_uint_eq (0, hi) | |
| cester_assert_uint_eq (98304, lo) | |
| __asm__ | __volatile__ ("li $v0, 0x55555555\n" "mthi $v0\n" "mtlo $v0\n" "li $v0, -3\n" "li $v1, 0x40000001\n" "mult $v0, $v1\n" "mflo %1\n" "mfhi %0\n" "nop\n" :"=r"(hi), "=r"(lo) ::"v0", "v1") |
| cester_assert_uint_eq (0xffffffff, hi) | |
| cester_assert_uint_eq (0x3ffffffd, lo) | |
| __asm__ | __volatile__ ("li $v0, 0x55555555\n" "mthi $v0\n" "mtlo $v0\n" "li $v0, 0x10000\n" "li $v1, 0x8000\n" "mult $v0, $v1\n" "mflo %1\n" "mfhi %0\n" "nop\n" :"=r"(hi), "=r"(lo) ::"v0", "v1") |
| cester_assert_uint_eq (0x80000000, lo) | |
| __asm__ | __volatile__ ("li $v0, 0x55555555\n" "mthi $v0\n" "mtlo $v0\n" "li $v0, -7\n" "li $v1, 5\n" "mult $v0, $v1\n" "mflo %1\n" "mfhi %0\n" "nop\n" :"=r"(hi), "=r"(lo) ::"v0", "v1") |
| cester_assert_uint_eq (0xffffffdd, lo) | |
| CESTER_TEST (cpu_MULTU_constant_operands, cpu_tests, uint32_t hi, lo;__asm__ __volatile__("li $v0, 0x55555555\n" "mthi $v0\n" "mtlo $v0\n" "li $v0, -3\n" "li $v1, 0x40000001\n" "multu $v0, $v1\n" "mflo %1\n" "mfhi %0\n" "nop\n" :"=r"(hi), "=r"(lo) ::"v0", "v1");cester_assert_uint_eq(0x40000000, hi);cester_assert_uint_eq(0x3ffffffd, lo);) CESTER_TEST(links | |
| cester_assert_uint_eq (0, r) | |
| cester_assert_uint_ne (0, r) | |
| CESTER_TEST (delayslot_load_first_entry, cpu_tests, uint32_t buff[2]={0x12345678, 0x9abcdef0};uint32_t out[6]={0, 0, 0, 0, 0, 0};delayslot_load_first_entry(buff, out);cester_assert_uint_eq(0x1111, out[0]);cester_assert_uint_eq(0x12345678, out[1]);cester_assert_uint_eq(0x12345678, out[2]);cester_assert_uint_eq(0x2222, out[3]);cester_assert_uint_eq(0x9abcdef0, out[4]);cester_assert_uint_eq(3, out[5]);) CESTER_TEST(nolink | |
Variables | |
| uint32_t | out = cpu_LWR_LWL_half(buff, 0xaabbccdd) |
| cpu_tests | |
| uint32_t | buff [2] = {0x11223344, 0x55667788} |
| int32_t | hi |
| int32_t | lo |
| uint32_t | r = linkandload() |
| #define CESTER_MAYBE_TEST CESTER_TEST |
| #define CESTER_NO_SIGNAL |
| #define CESTER_NO_TIME |
| #define EXIT_FAILURE 1 |
| #define EXIT_SUCCESS 0 |
| #define PCSX_TESTS 0 |
| __asm__ __volatile__ | ( | "li | $v0, |
| 0x55555555\n" "mthi $v0\n" "mtlo $v0\n" "li | $v0, | ||
| -3\n" "li | $v1, | ||
| 0x40000001\n" "mult | $v0 | ||
| ) |
| __asm__ __volatile__ | ( | "li | $v0, |
| 0x55555555\n" "mthi $v0\n" "mtlo $v0\n" "li | $v0, | ||
| -7\n" "li | $v1, | ||
| 5\n" "mult | $v0 | ||
| ) |
| __asm__ __volatile__ | ( | "li | $v0, |
| 0x55555555\n" "mthi $v0\n" "mtlo $v0\n" "li | $v0, | ||
| 0x10000\n" "li | $v1, | ||
| 0x8000\n" "mult | $v0 | ||
| ) |
| __asm__ __volatile__ | ( | "li | $v0, |
| 0x55555555\n" "mthi $v0\n" "mtlo $v0\n" "li | $v0, | ||
| 256\n" "li | $v1, | ||
| 384\n" "mult | $v0 | ||
| ) |
| __asm__ __volatile__ | ( | "li | $v0, |
| 0x55555555\n" "mthi $v0\n" "mtlo $v0\n" "li | $v0 | ||
| ) |
| __asm__ __volatile__ | ( | "li | $v0, |
| 0x55555555\n" "mthi $v0\n" "mtlo $v0\n" "nop\n" "div | $0 | ||
| ) |
| cester_assert_int_eq | ( | - | 1, |
| lo | |||
| ) |
| cester_assert_int_eq | ( | 0 | , |
| hi | |||
| ) |
| cester_assert_int_eq | ( | 42 | , |
| hi | |||
| ) |
| cester_assert_uint_eq | ( | 0 | , |
| hi | |||
| ) |
| cester_assert_uint_eq | ( | 0 | , |
| out | |||
| ) |
| cester_assert_uint_eq | ( | 0 | , |
| r | |||
| ) |
| cester_assert_uint_eq | ( | 0x189 | , |
| out | |||
| ) |
| cester_assert_uint_eq | ( | 0x3ffffffd | , |
| lo | |||
| ) |
| cester_assert_uint_eq | ( | 0x80000000 | , |
| lo | |||
| ) |
| cester_assert_uint_eq | ( | 0x88112233 | , |
| out | |||
| ) |
| cester_assert_uint_eq | ( | 0x88bbccdd | , |
| out | |||
| ) |
| cester_assert_uint_eq | ( | 0xaa112233 | , |
| out | |||
| ) |
| cester_assert_uint_eq | ( | 0xffffffdd | , |
| lo | |||
| ) |
| cester_assert_uint_eq | ( | 0xffffffff | , |
| hi | |||
| ) |
| cester_assert_uint_eq | ( | 9 | , |
| out | |||
| ) |
| cester_assert_uint_eq | ( | 98304 | , |
| lo | |||
| ) |
| cester_assert_uint_ne | ( | 0 | , |
| r | |||
| ) |
| CESTER_MAYBE_TEST | ( | cpu_delayed_load_load | , |
| cpu_tests | , | ||
| uint32_t | buff[2] = {1, 2}; uint64_t out = cpu_delayed_load_load(buff, 4); out = ((out >> 16) | out) & 0xffffffff; cester_assert_uint_eq(0x00020004, out); |
||
| ) |
| CESTER_MAYBE_TEST | ( | cpu_JUMP_JUMP_slot | , |
| cpu_tests | , | ||
| uint32_t | out = jumpjump1(); cester_assert_uint_eq(0x69, out); out = jumpjump2(); cester_assert_uint_eq(21, out); |
||
| ) |
| CESTER_MAYBE_TEST | ( | cpu_LWR_LWL_nodelay | , |
| cpu_tests | , | ||
| uint32_t | buff[2] = {0x11223344, 0x55667788}; uint32_t out = cpu_LWR_LWL_nodelay(buff, 0xaabbccdd); cester_assert_uint_eq(0xaabbccdd, out); |
||
| ) |
| CESTER_TEST | ( | cpu_delayed_load | , |
| cpu_tests | , | ||
| uint32_t | buff[1] = {1}; uint32_t out = cpu_delayed_load(buff, 0); cester_assert_uint_eq(0, out); |
||
| ) |
| CESTER_TEST | ( | cpu_DIVU_by_zero | , |
| cpu_tests | , | ||
| int32_t | hi, | ||
| lo;__asm__ __volatile__("li $v0, 0x55555555\n" "mthi $v0\n" "mtlo $v0\n" "nop\n" "divu $0, $0\n" "mfhi %0\n" "mflo %1\n" "nop\n" :"=r"(hi), "=r"(lo) ::"v0");cester_assert_int_eq(0, hi);cester_assert_int_eq(-1, lo);__asm__ __volatile__("li $v0, 0x55555555\n" "mthi $v0\n" "mtlo $v0\n" "li $v0, 42\n" ".word 0x0040001b\n" "mfhi %0\n" "mflo %1\n" "nop\n" :"=r"(hi), "=r"(lo) ::"v0");cester_assert_int_eq(42, hi);cester_assert_int_eq(-1, lo); | |||
| ) |
| CESTER_TEST | ( | cpu_LWR_LWL_load_different | , |
| cpu_tests | , | ||
| uint32_t | buff[3] = {0x11223344, 0x55667788, 0xaabbccdd}; uint32_t out = cpu_LWR_LWL_load_different(buff, 0xeeffeffe); cester_assert_uint_eq(0x88556677, out); |
||
| ) |
| CESTER_TEST | ( | cpu_MULTU_constant_operands | , |
| cpu_tests | , | ||
| uint32_t | hi, | ||
| lo;__asm__ __volatile__("li $v0, 0x55555555\n" "mthi $v0\n" "mtlo $v0\n" "li $v0, -3\n" "li $v1, 0x40000001\n" "multu $v0, $v1\n" "mflo %1\n" "mfhi %0\n" "nop\n" :"=r"(hi), "=r"(lo) ::"v0", "v1");cester_assert_uint_eq(0x40000000, hi);cester_assert_uint_eq(0x3ffffffd, lo); | |||
| ) |
| CESTER_TEST | ( | cpu_quiet | , |
| CESTER_TEST( | cpu_tests, | ||
| for(unsigned i=0;i< 200000;i++) __asm__ volatile("");cester_assert_uint_eq(0, s_got40);cester_assert_uint_eq(0, s_got80); | |||
| ) |
| CESTER_TEST | ( | delayslot_load_first_entry | , |
| cpu_tests | , | ||
| uint32_t | buff[2] = {0x12345678, 0x9abcdef0}; uint32_t out[6] = {0, 0, 0, 0, 0, 0}; delayslot_load_first_entry(buff, out); cester_assert_uint_eq(0x1111, out[0]); cester_assert_uint_eq(0x12345678, out[1]); cester_assert_uint_eq(0x12345678, out[2]); cester_assert_uint_eq(0x2222, out[3]); cester_assert_uint_eq(0x9abcdef0, out[4]); cester_assert_uint_eq(3, out[5]); |
||
| ) |
| uint32_t buff = {0x11223344, 0x55667788} |
| cpu_tests |
| uint32_t hi |
| uint32_t lo |
| char out = cpu_LWR_LWL_half(buff, 0xaabbccdd) |
| int r = linkandload() |