Get the numbers right
This commit is contained in:
parent
2c72c9c9ac
commit
6f1331a928
67
README.md
67
README.md
@ -1,92 +1,56 @@
|
|||||||
# Nolibgs Hello Worlds !
|
# Nolibgs Hello Worlds !
|
||||||
|
|
||||||
<p align="center">
|
<p align="center">
|
||||||
|
|
||||||
<img height="240px" src="cube.gif" alt="3D power !">
|
<img height="240px" src="cube.gif" alt="3D power !">
|
||||||
|
|
||||||
<img height="240px" src="http://psx.arthus.net/homebrew/polyfun.jpg" alt="3D power !">
|
<img height="240px" src="http://psx.arthus.net/homebrew/polyfun.jpg" alt="3D power !">
|
||||||
|
|
||||||
<img height="240px" src="hello_gt.jpg" alt="3D power !">
|
<img height="240px" src="hello_gt.jpg" alt="3D power !">
|
||||||
|
|
||||||
</p>
|
</p>
|
||||||
|
|
||||||
So you want to begin developping on the original PSX but don't know where to start ?
|
So you want to begin developping on the original PSX but don't know where to start ?
|
||||||
|
|
||||||
This repo is destined to host a bunch of simple examples, each describing how to do one thing.
|
This repo is destined to host a bunch of simple examples, each describing how to do one thing.
|
||||||
|
|
||||||
The code here will be using PsyQ, the "Official" Sony SDK, but we will not be using libGS, the Extended Graphics Library for the graphic stuff...
|
The code here will be using PsyQ, the "Official" Sony SDK, but we will not be using libGS, the Extended Graphics Library for the graphic stuff...
|
||||||
|
|
||||||
Instead we'll try to devise methods to reproduce libgs functions. This will not necessarly be more efficient, but we'll learn
|
Instead we'll try to devise methods to reproduce libgs functions. This will not necessarly be more efficient, but we'll learn
|
||||||
a lot more stuff !
|
a lot more stuff !
|
||||||
|
|
||||||
|
|
||||||
## Setting up the SDK : Modern GCC + PsyQ a.k.a Nugget+PsyQ
|
## Setting up the SDK : Modern GCC + PsyQ a.k.a Nugget+PsyQ
|
||||||
|
|
||||||
For this we'll rely heavily on [grumpy-coder](https://github.com/grumpycoders/pcsx-redux)'s work with pcsx-redux and various tools, which will provide us with:
|
For this we'll rely heavily on [grumpy-coder](https://github.com/grumpycoders/pcsx-redux)'s work with pcsx-redux and various tools, which will provide us with:
|
||||||
|
|
||||||
* A way to compile the code with a modern version of GCC
|
* A way to compile the code with a modern version of GCC
|
||||||
* An emulator with a lot of debugging features
|
* An emulator with a lot of debugging features
|
||||||
|
|
||||||
### Let's do it !
|
### Let's do it !
|
||||||
|
|
||||||
* On MacOs, a brew installation script can be found [here.](https://github.com/grumpycoders/pcsx-redux#macos)
|
* On MacOs, a brew installation script can be found [here.](https://github.com/grumpycoders/pcsx-redux#macos)
|
||||||
|
|
||||||
* On windows, either follow the [instructions here](https://github.com/grumpycoders/pcsx-redux#windows), or install WSL2 and [Ubuntu 20.04](https://www.microsoft.com/en-gb/p/ubuntu-2004-lts/9n6svws3rx71?activetab=pivot:overviewtab) then launch a GNU/Linux terminal, then proceed with the following instructions.
|
* On windows, either follow the [instructions here](https://github.com/grumpycoders/pcsx-redux#windows), or install WSL2 and [Ubuntu 20.04](https://www.microsoft.com/en-gb/p/ubuntu-2004-lts/9n6svws3rx71?activetab=pivot:overviewtab) then launch a GNU/Linux terminal, then proceed with the following instructions.
|
||||||
|
* Alternatively on Windows, if you don't care about compiling pcsx-redux, you can skip steps 1, 3 and 4, get the latest precompiled toolchain from here : [http://static.grumpycoder.net/pixel/mips/](http://static.grumpycoder.net/pixel/mips/), unzip it somewhere and [add the `bin` folder to your PATH](https://stackoverflow.com/questions/44272416/how-to-add-a-folder-to-path-environment-variable-in-windows-10-with-screensho#44272417). Then go on with steps 6 and 6.
|
||||||
* Alternatively on Windows, if you don't care about compiling pcsx-redux, you can skip steps 1 and 3, get the latest precompiled toolchain from here : [http://static.grumpycoder.net/pixel/mips/](http://static.grumpycoder.net/pixel/mips/), unzip it somewhere and [add the `bin` folder to your PATH](https://stackoverflow.com/questions/44272416/how-to-add-a-folder-to-path-environment-variable-in-windows-10-with-screensho#44272417). Then go on with steps 4 and 5.
|
|
||||||
|
|
||||||
1. Install the needed software packages ( aka dependencies in Linux world ) :
|
1. Install the needed software packages ( aka dependencies in Linux world ) :
|
||||||
|
|
||||||
* To be able to build PsyQ code, you only need the MIPS toolchain :
|
* To be able to build PsyQ code, you only need the MIPS toolchain :
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
sudo apt-get install gcc-mipsel-linux-gnu g++-mipsel-linux-gnu binutils-mipsel-linux-gnu
|
sudo apt-get install gcc-mipsel-linux-gnu g++-mipsel-linux-gnu binutils-mipsel-linux-gnu
|
||||||
```
|
```
|
||||||
|
|
||||||
* If you want to compile pcsx-redux, you need a few more packages :
|
* If you want to compile pcsx-redux, you need a few more packages :
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
sudo apt-get install -y git make pkg-config clang g++ libfreetype6-dev libavcodec-dev libavformat-dev libavutil-dev libglfw3-dev libsdl2-dev libswresample-dev libuv1-dev zlib1g-dev
|
sudo apt-get install -y git make pkg-config clang g++ libfreetype6-dev libavcodec-dev libavformat-dev libavutil-dev libglfw3-dev libsdl2-dev libswresample-dev libuv1-dev zlib1g-dev
|
||||||
```
|
```
|
||||||
|
|
||||||
2. Clone the pcsx-redux repo :
|
2. Clone the pcsx-redux repo :
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
git clone https://github.com/grumpycoders/pcsx-redux.git --recursive
|
git clone https://github.com/grumpycoders/pcsx-redux.git --recursive
|
||||||
```
|
```
|
||||||
|
|
||||||
3. Enter pcsx-redux folder:
|
3. Enter pcsx-redux folder:
|
||||||
```bash
|
```bash
|
||||||
cd pcsx-redux
|
cd pcsx-redux
|
||||||
```
|
```
|
||||||
|
|
||||||
4. Compile pcsx-redux :
|
4. Compile pcsx-redux :
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
make
|
make
|
||||||
```
|
```
|
||||||
|
|
||||||
If you encounter an error due to an old version of GCC (< 10) like something about `-fcoroutines`, then you can use **clang** ( min version 9) to compile `pcsx-redux` :
|
If you encounter an error due to an old version of GCC (< 10) like something about `-fcoroutines`, then you can use **clang** ( min version 9) to compile `pcsx-redux` :
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
|
|
||||||
CC=clang CXX=clang++ LD=clang++ make
|
CC=clang CXX=clang++ LD=clang++ make
|
||||||
```
|
```
|
||||||
|
|
||||||
5. Get the converted [PsyQ 4.7 libs](http://psx.arthus.net/sdk/Psy-Q/psyq-4.7-converted-full.7z) :
|
5. Get the converted [PsyQ 4.7 libs](http://psx.arthus.net/sdk/Psy-Q/psyq-4.7-converted-full.7z) :
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
wget http://psx.arthus.net/sdk/Psy-Q/psyq-4.7-converted-full.7z
|
wget http://psx.arthus.net/sdk/Psy-Q/psyq-4.7-converted-full.7z
|
||||||
```
|
```
|
||||||
|
|
||||||
6. Extract this archive to `[...]pcsx-redux/src/mips/psyq/`, adapting the path in the command below to the folder you cloned pcsx-redux in :
|
6. Extract this archive to `[...]pcsx-redux/src/mips/psyq/`, adapting the path in the command below to the folder you cloned pcsx-redux in :
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
7z x -o./src/mips/psyq/ psyq-4.7-converted-full.7z
|
7z x -o./src/mips/psyq/ psyq-4.7-converted-full.7z
|
||||||
```
|
```
|
||||||
|
|
||||||
Your `pcsx-redux/src/mips/psyq/` directory should now contain an `include` and a `lib` folder with a bunch of files in each of them :
|
Your `pcsx-redux/src/mips/psyq/` directory should now contain an `include` and a `lib` folder with a bunch of files in each of them :
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
$tree ~/pcsx-redux/src/mips/psyq/
|
$tree ~/pcsx-redux/src/mips/psyq/
|
||||||
.
|
.
|
||||||
@ -103,86 +67,59 @@ $tree ~/pcsx-redux/src/mips/psyq/
|
|||||||
│ ├── ...
|
│ ├── ...
|
||||||
│ └── libtap.a
|
│ └── libtap.a
|
||||||
└── tree
|
└── tree
|
||||||
|
|
||||||
3 directories, 82 files
|
3 directories, 82 files
|
||||||
```
|
```
|
||||||
|
7. That's it ! After that you can check everything's working byt trying to compile some example code :
|
||||||
6. That's it ! After that you can check everything's working byt trying to compile some example code :
|
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
cd src/mips/psyq/cube
|
cd src/mips/psyq/cube
|
||||||
make
|
make
|
||||||
```
|
```
|
||||||
|
|
||||||
You should know have a 'cube.ps-exe' file in the folder. This is a PSX executable you can load with most emulators.
|
You should know have a 'cube.ps-exe' file in the folder. This is a PSX executable you can load with most emulators.
|
||||||
|
|
||||||
|
|
||||||
## Embedding binary data in a ps-exe
|
## Embedding binary data in a ps-exe
|
||||||
|
|
||||||
So, if you don't know it yet, the fun in PSX development is to be able to upload your exes on real hardware with a USB/Serial cable.
|
So, if you don't know it yet, the fun in PSX development is to be able to upload your exes on real hardware with a USB/Serial cable.
|
||||||
This means that the data you'll use in your program ( graphics, sounds, etc.) will have to be embedded in your exe in a binary form,
|
This means that the data you'll use in your program ( graphics, sounds, etc.) will have to be embedded in your exe in a binary form,
|
||||||
as you won't be able to stream them from the serial port.
|
as you won't be able to stream them from the serial port.
|
||||||
|
|
||||||
*Well technically you could load them in memory before uploading your exe or stream them from a cd, but let's keep things simple for now.*
|
*Well technically you could load them in memory before uploading your exe or stream them from a cd, but let's keep things simple for now.*
|
||||||
|
|
||||||
With our setup, this is quite easy !
|
With our setup, this is quite easy !
|
||||||
|
|
||||||
1. In `pcsx-redux/src/mips/common.mk` , add the lines :
|
1. In `pcsx-redux/src/mips/common.mk` , add the lines :
|
||||||
|
|
||||||
```mk
|
```mk
|
||||||
# convert TIM file to bin
|
# convert TIM file to bin
|
||||||
%.o: %.tim
|
%.o: %.tim
|
||||||
$(PREFIX)-objcopy -I binary --set-section-alignment .data=4 --rename-section .data=.rodata,alloc,load,readonly,data,contents -O elf32-tradlittlemips -B mips $< $@
|
$(PREFIX)-objcopy -I binary --set-section-alignment .data=4 --rename-section .data=.rodata,alloc,load,readonly,data,contents -O elf32-tradlittlemips -B mips $< $@
|
||||||
|
|
||||||
# convert VAG files to bin
|
# convert VAG files to bin
|
||||||
%.o: %.vag
|
%.o: %.vag
|
||||||
$(PREFIX)-objcopy -I binary --set-section-alignment .data=4 --rename-section .data=.rodata,alloc,load,readonly,data,contents -O elf32-tradlittlemips -B mips $< $@
|
$(PREFIX)-objcopy -I binary --set-section-alignment .data=4 --rename-section .data=.rodata,alloc,load,readonly,data,contents -O elf32-tradlittlemips -B mips $< $@
|
||||||
```
|
```
|
||||||
|
|
||||||
If you pay attention, you can see that's the same command, but for different file types. TIM files are bitmap images and VAG is the sound format used in this example.
|
If you pay attention, you can see that's the same command, but for different file types. TIM files are bitmap images and VAG is the sound format used in this example.
|
||||||
Each time you'll want to add a file type, just duplicate and change `%.vag` to `%.filetype`
|
Each time you'll want to add a file type, just duplicate and change `%.vag` to `%.filetype`
|
||||||
|
|
||||||
Then, in your project folder, copy the makefile from the cube example :
|
Then, in your project folder, copy the makefile from the cube example :
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
mkdir new_project && cd new_project
|
mkdir new_project && cd new_project
|
||||||
cp ../cube/Makefile ../
|
cp ../cube/Makefile ../
|
||||||
```
|
```
|
||||||
|
|
||||||
All you have to do now is add the files you wish to embed to the SRCS variable, without forgetting the \ :
|
All you have to do now is add the files you wish to embed to the SRCS variable, without forgetting the \ :
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
SRCS = main.c \
|
SRCS = main.c \
|
||||||
../common/crt0/crt0.s \
|
../common/crt0/crt0.s \
|
||||||
file_to_embed.ext \
|
file_to_embed.ext \
|
||||||
```
|
```
|
||||||
|
|
||||||
2. So this part takes care of converting our data to binary. Now to access them from your program, just use this in your sources :
|
2. So this part takes care of converting our data to binary. Now to access them from your program, just use this in your sources :
|
||||||
```c
|
```c
|
||||||
extern ulong _binary_filename_extension_start[];
|
extern ulong _binary_filename_extension_start[];
|
||||||
extern ulong _binary_filename_extension_end[];
|
extern ulong _binary_filename_extension_end[];
|
||||||
extern ulong _binary_bowsht_tim_length[];
|
extern ulong _binary_bowsht_tim_length[];
|
||||||
```
|
```
|
||||||
|
|
||||||
The filename variable must begin with `_binary_` followed by the full path of your file, with . and / replaced by _ (underscore), and end with `_start[];` or `_end[];` or `_length[];` [source](https://discord.com/channels/642647820683444236/663664210525290507/780866265077383189)
|
The filename variable must begin with `_binary_` followed by the full path of your file, with . and / replaced by _ (underscore), and end with `_start[];` or `_end[];` or `_length[];` [source](https://discord.com/channels/642647820683444236/663664210525290507/780866265077383189)
|
||||||
|
|
||||||
`_start` and `_end` are pointers, while `_length` is a constant.
|
`_start` and `_end` are pointers, while `_length` is a constant.
|
||||||
|
|
||||||
That's it! When you'll type `make` next time, it should convert your files to .o, then include them in your ps-exe.
|
That's it! When you'll type `make` next time, it should convert your files to .o, then include them in your ps-exe.
|
||||||
|
|
||||||
## Compiling the examples in this repo
|
## Compiling the examples in this repo
|
||||||
|
|
||||||
All you have to do is uncomment the corresponding rules in `Makefile` then compile with `make`.
|
All you have to do is uncomment the corresponding rules in `Makefile` then compile with `make`.
|
||||||
|
|
||||||
# Links and Doc
|
# Links and Doc
|
||||||
|
|
||||||
* [Getting started with PSX dev](https://psx.arthus.net/starting.html)
|
* [Getting started with PSX dev](https://psx.arthus.net/starting.html)
|
||||||
* [PsyQ docs](http://psx.arthus.net/sdk/Psy-Q/DOCS/)
|
* [PsyQ docs](http://psx.arthus.net/sdk/Psy-Q/DOCS/)
|
||||||
* [Ps1 dev links](https://ps1.consoledev.net/)
|
* [Ps1 dev links](https://ps1.consoledev.net/)
|
||||||
* [psxdev.net](http://psxdev.net/)
|
* [psxdev.net](http://psxdev.net/)
|
||||||
* [psxdev Discord](https://discord.com/invite/N2mmwp?utm_source=Discord%20Widget&utm_medium=Connect)
|
* [psxdev Discord](https://discord.com/invite/N2mmwp?utm_source=Discord%20Widget&utm_medium=Connect)
|
||||||
|
|
||||||
# Credits, thanks, hugs
|
# Credits, thanks, hugs
|
||||||
|
|
||||||
Everything here was learnt from some more talented persons, mainly but not excluding others that hang around on the [psxdev discord](https://discord.com/channels/642647820683444236/642848627823345684)
|
Everything here was learnt from some more talented persons, mainly but not excluding others that hang around on the [psxdev discord](https://discord.com/channels/642647820683444236/642848627823345684)
|
||||||
Nicolas Noble, Lameguy64, NDR008, Jaby smoll seamonstah, danhans42, rama, sickle, paul, squaresoft74, and lot mores !
|
Nicolas Noble, Lameguy64, NDR008, Jaby smoll seamonstah, danhans42, rama, sickle, paul, squaresoft74, and lot mores !
|
||||||
|
Loading…
Reference in New Issue
Block a user