From 6e54bd61b1dee8a117ba23224e2b17dea409f234 Mon Sep 17 00:00:00 2001 From: Tyler Wilding Date: Wed, 26 Aug 2020 19:40:26 -0400 Subject: [PATCH] Format and start adding Windows steps --- .gitignore | 1 + CMakeLists.txt | 23 +++- README.md | 196 ++++++++++++++++++++++----------- doc/imgs/cmake-target-view.png | Bin 0 -> 15721 bytes doc/imgs/open-cmake-vs.png | Bin 0 -> 24424 bytes 5 files changed, 151 insertions(+), 69 deletions(-) create mode 100644 doc/imgs/cmake-target-view.png create mode 100644 doc/imgs/open-cmake-vs.png diff --git a/.gitignore b/.gitignore index 9a5df39548..d722b67441 100644 --- a/.gitignore +++ b/.gitignore @@ -2,3 +2,4 @@ cmake-build-debug/* .idea/* build/* +/.vs \ No newline at end of file diff --git a/CMakeLists.txt b/CMakeLists.txt index 45706cfa7f..ce4228908f 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -5,10 +5,25 @@ project(jak) set(CMAKE_CXX_STANDARD 14) # optimization level can be set here. Note that game/ overwrites this for building game C++ code. -set(CMAKE_CXX_FLAGS "-O0 -ggdb -Wall \ --Wextra -Wcast-align -Wcast-qual -Wdisabled-optimization -Wformat=2 \ --Winit-self -Wmissing-include-dirs -Woverloaded-virtual \ --Wredundant-decls -Wshadow -Wsign-promo ") +set(CMAKE_CXX_FLAGS "-O3 -ggdb") + +# Set default compile flags for GCC +if(CMAKE_COMPILER_IS_GNUCXX) + message(STATUS "GCC detected, adding compile flags") + set(CMAKE_CXX_FLAGS + "${CMAKE_CXX_FLAGS} + -Wall-Winit-self + -Wextra + -Wcast-align + -Wcast-qual + -Wdisabled-optimization + -Wformat=2 + -Wmissing-include-dirs + -Woverloaded-virtual + -Wredundant-decls + -Wshadow + -Wsign-promo") +endif(CMAKE_COMPILER_IS_GNUCXX) # includes relative to top level jak-project folder include_directories(./) diff --git a/README.md b/README.md index 556a7f5924..47dc3c4de1 100644 --- a/README.md +++ b/README.md @@ -1,18 +1,77 @@ -Project Structure ----------------------- -Requirements: +# Jak Project + +## Table of Contents + + + +- [Jak Project](#jak-project) + - [Table of Contents](#table-of-contents) + - [Requirements](#requirements) + - [Getting Started - Linux (Ubuntu)](#getting-started---linux-ubuntu) + - [Getting Started - Windows](#getting-started---windows) + - [Project Layout](#project-layout) + - [Design](#design) + - [Current State](#current-state) + - [Coding Guidelines](#coding-guidelines) + - [TODOs](#todos) + - [Project Description](#project-description) + - [GOAL Decompiler](#goal-decompiler) + - [GOAL Runtime](#goal-runtime) + - [GOAL Compiler](#goal-compiler) + - [Asset Extraction Tool](#asset-extraction-tool) + - [Asset Packing Tool](#asset-packing-tool) + + + +## Requirements + - `cmake` for build system - `clang-format` for formatting code (there is already a `.clang-format` provided) - `gtest` for testing. (Run `git submodule update --init --recursive` to check out the repository) -- `nasm` for assembling x86. There isn't much x86 assembly so if there's a better way to do this for windows, we can change. +- `nasm` for assembling x86 - Third party libraries (`nlohmann/json`, `minilzo`, and `linenoise`) are provided in the `third-party` folder -Setup (for Ubuntu): -``` +## Getting Started - Linux (Ubuntu) + +Install Packages and Init Repository + +```bash sudo apt install gcc make cmake build-essential g++ nasm clang-format +git submodule update --init --recursive ``` -Layout: +Compile + +```bash +mkdir build && cd build && cmake .. && make -j +``` + +Run Tests + +```bash +./test.sh +``` + +## Getting Started - Windows + +Install Visual Studio 2019 and get the C++ and CMake tools via the Visual Studio Installer + +On Windows, it's recommended to get Scoop to use as a package manager, making the follow steps _much_ easier. Follow the steps on the bottom of the homepage here https://scoop.sh/ + +Once Scoop is installed, run the following command: + +```ps +scoop install llvm nasm +``` + +Open the project as a CMake project, browse for the root level `CMakeLists.txt`: + +![](./doc/imgs/open-cmake-vs.png) + +TODO - more steps to follow as we actually figure it out! + +## Project Layout + - `goalc` is the GOAL compiler - `gs` contains GOOS code for parts of GOOS implemented in GOOS - `gc` contains GOAL code for parts of GOAL implemented in GOAL (must generate no machine code, just defining macros) @@ -29,8 +88,10 @@ Layout: - `tests` will contain all tests - `asset_tool` will contain the asset packer/unpacker -Design: +## Design + (if anybody has better ideas, feel free to suggest improvements! This is just a rough plan for now) + - All C++ code should build from the top-level `cmake`. - All C++ applications (GOAL compiler, asset extractor, asset packer, runtime, test) should have a script in the top level which launches them. - All file paths should be relative to the `jak` folder. @@ -48,11 +109,13 @@ Design: - `./gc.sh` : run the compiler in interactive mode - `./gs.sh` : run a goos interpreter in interactive mode - `./decomp.sh : run the decompiler - -Current state: + +## Current State + - GOAL compiler just implements the GOOS Scheme Macro Language. Running `./gc.sh` just loads the GOOS library (`goalc/gs/goos-lib.gs`) and then goes into an interactive mode. Use `(exit)` to exit. - `./test.sh` runs tests for some game C++ code, for GOOS, for the reader, for the listener connection, and for some early emitter stuff. -- The runtime boots in `fakeiso` mode which will load some dummy files. Then the C Kernel (`game/kernel`) will load the `KERNEL.CGO` and `GAME.CGO` files, which are from the "proof of concept" GOAL compiler. If you run `./gk.sh`, you should see it load stuff, then print: +- The runtime boots in `fakeiso` mode which will load some dummy files. Then the C Kernel (`game/kernel`) will load the `KERNEL.CGO` and `GAME.CGO` files, which are from the "proof of concept" GOAL compiler. If you run `./gk.sh`, you should see it load stuff, then print: + ``` calling play! ~~ HACK ~~ : fake play has been called @@ -61,13 +124,16 @@ InitCheckListener kernel: machine started ``` + where the `~~ HACK ~~` message is from code in `KERNEL.CGO`. -Code Guidelines: +## Coding Guidelines + - Avoid warnings - Use asserts over throwing exceptions in game code (throwing exceptions from C code called by GOAL code is sketchy) -TODOS: +## TODOs + - Build on Windows! - Networking - File paths @@ -82,8 +148,8 @@ TODOS: - Clean up possible duplicate code in compiler/decompiler `util` folder, consider a common utility library - Clean up header guard names (or just use `#pragma once`?) - Investigate a better config format - - The current JSON library seems to have issues with comments, which I really like -- Clean up use of namespaces + - The current JSON library seems to have issues with comments, which I really like +- Clean up use of namespaces - Clean up the print message when `gk` starts. - Finish commenting runtime stuff - Runtime document @@ -95,11 +161,10 @@ TODOS: - Clean up decompiler print spam, finish up the CFG stuff - Decompiler document - -Project Description ------------------------ +## Project Description This project is to port Jak 1 (NTSC, "black label" version) to PC. The strategy is to: + - recompile for x86 to get much better performance than emulation - create human-reabable GOAL source code that can be modified - create a GOAL compiler for x86-64 which supports live patching of code like the original @@ -107,6 +172,7 @@ This project is to port Jak 1 (NTSC, "black label" version) to PC. The strategy - unpack assets in a format that can be modified There are 6 components to this project + - GOAL decompiler. The result will be manually cleaned up for running on a PC. - GOAL compiler for x86-64. - Game source code, made from cleaning up the result of the GOAL decompiler. @@ -115,25 +181,27 @@ There are 6 components to this project - Asset packing tool. The process to build the port will be + - Build data extraction tool, GOAL compiler, and GOAL runtime library (all written in C++) - Run the GOAL compiler on the game source code to build the game engine - Run asset extraction on the game disc to get level data, textures, geometry data, music... - Run the asset packing tool to combine the unpacked assets with the compiled game engine to create the game! Some statistics: + - Estimated ~500k lines of GOAL code - 10410 functions - 5451 functions with no control flow (no branching, loops, if/else, short-circuiting boolean operators, gotos, etc) -The rough timeline is to finish sometime in 2022. If it looks like this is impossible, the project will be abandoned. But I have already spent about 4 months preparing to start this and seems doable. I also have some background in compilers, and familiarity with PS2 (worked on DobieStation PS2 emulator) / MIPS in general (wrote a PS1 emulator). I think the trick will be making good automated tools - the approach taken for SM64 and other N64 decompilations is way too labor-intensive to work. +The rough timeline is to finish sometime in 2022. If it looks like this is impossible, the project will be abandoned. But I have already spent about 4 months preparing to start this and seems doable. I also have some background in compilers, and familiarity with PS2 (worked on DobieStation PS2 emulator) / MIPS in general (wrote a PS1 emulator). I think the trick will be making good automated tools - the approach taken for SM64 and other N64 decompilations is way too labor-intensive to work. +### GOAL Decompiler -GOAL Decompiler ------------------- -The decompiler is in progress, at +The decompiler is in progress, at https://github.com/water111/jak-disassembler Here is the plan for writing the decompiler: + - [x] Decode the CGO/DGO format. - [x] Decode the linking data format. - [x] Identify all code and disassemble @@ -147,10 +215,10 @@ Here is the plan for writing the decompiler: - [ ] Variable map and scoping - [ ] S-expression construction (expression stack) +### GOAL Runtime + +The "runtime" will be a replacement for all of the C/C++ code of the original game. There is C/C++ code that runs on the main processor (EE) and the separate I/O processor (IOP). -GOAL Runtime --------------- -The "runtime" will be a replacement for all of the C/C++ code of the original game. There is C/C++ code that runs on the main processor (EE) and the separate I/O processor (IOP). - The "C Kernel", which runs on the EE and contains - [ ] File I/O (for debugging, not used by retail game) - [x] Initialization to boostrap the GOAL Kernel and start the game engine @@ -180,17 +248,18 @@ The "Sony libraries" are a simple wrapper around my `system` library, which impl Likely there will be sound/graphics code in here at some point, but this part is not fully planned yet. -GOAL Compiler ---------------- +### GOAL Compiler + The GOAL compiler will target x86-64. At first just Linux. There is a macro language called GOOS which is basically just Scheme but with a few bonus features. -The compiler will reuse a significant amount of code from my existing LISP compiler for x86-64. I have a very bad WIP combination which is capable of building a modified `gkernel.gc` for x86 as a proof of concept. It can create and run functions in threads. +The compiler will reuse a significant amount of code from my existing LISP compiler for x86-64. I have a very bad WIP combination which is capable of building a modified `gkernel.gc` for x86 as a proof of concept. It can create and run functions in threads. -An important part of the compiler is the test suite. Without tests the compiler will be full of bugs. So every feature should have a good set of tests. +An important part of the compiler is the test suite. Without tests the compiler will be full of bugs. So every feature should have a good set of tests. The major components are - [ ] GOAL-IR, a typed linear intermediate representation for GOAL code + - [ ] "Environment" - [ ] "Ref" - [ ] Constant propagation of integers/floats @@ -198,6 +267,7 @@ The major components are - [ ] Ref `in_gpr` - [ ] The type system + - [ ] Type inheritance - [ ] Integer/float/pointer types (value semantics) - [ ] Reference types @@ -216,41 +286,41 @@ The major components are - [ ] Built-in types in the GOAL runtime/C Kernel - [x] The GOOS Macro Language + - [x] S-expression parser (the "Reader") - [x] Reader text db (for error messages that point to a specific line) - [x] Scheme interpreter - + - [ ] Front-end (convert s-expressions (a tree structure) to GOAL-IR (a linear representation)) - - [ ] Parsing helpers - - [ ] Macro expansion - - [ ] Control flow/block forms - - [ ] Type definitions - - [ ] Inline assembly forms - - [ ] Function/method call - - [ ] Math forms - - [ ] Lexical scoping (immediate application of `lambda`) - - [ ] Function inlining (slightly different scoping rules of immediate `lambda`) - - [ ] Function/macro definition - - [ ] Static Objects +- [ ] Parsing helpers +- [ ] Macro expansion +- [ ] Control flow/block forms +- [ ] Type definitions +- [ ] Inline assembly forms +- [ ] Function/method call +- [ ] Math forms +- [ ] Lexical scoping (immediate application of `lambda`) +- [ ] Function inlining (slightly different scoping rules of immediate `lambda`) +- [ ] Function/macro definition +- [ ] Static Objects - [ ] Regsiter allocation - - [ ] Analysis - - [ ] Allocation - - [ ] Stack spilling - - [ ] `xmm` and `gpr` promotion/demotions for EE 128-bit register usage - +- [ ] Analysis +- [ ] Allocation +- [ ] Stack spilling +- [ ] `xmm` and `gpr` promotion/demotions for EE 128-bit register usage - [ ] Codegen / Emitter (convert GOAL-IR + register allocations to x86 object file format) - - [ ] Emitter (convert GOAL-IR to instructions) - - [ ] x86-64 instruction generation (actually generate the machine code) - - [ ] Linking data - - [ ] 64-bit GPR - - [ ] 32-bit float - - [ ] 128-bit GPR - - [ ] 32-bit float x4 vector register - - [ ] function prologue/epilogue - - [ ] stack spilling - - [ ] static object and static object links +- [ ] Emitter (convert GOAL-IR to instructions) +- [ ] x86-64 instruction generation (actually generate the machine code) +- [ ] Linking data +- [ ] 64-bit GPR +- [ ] 32-bit float +- [ ] 128-bit GPR +- [ ] 32-bit float x4 vector register +- [ ] function prologue/epilogue +- [ ] stack spilling +- [ ] static object and static object links - [ ] Listener/REPL - [ ] Network connection @@ -260,14 +330,14 @@ The major components are - [ ] Expand single macro debugging feature - [ ] Interface for running gtests +### Asset Extraction Tool -Asset Extraction Tool ------------------------ -Not started yet. The simplest version of this tool is just to use the decompiler logic to turn the level/art-group/texture/TXT files into GOAL source code, and copy all STR/sound/visibility files, as these don't need to be modified. +Not started yet. The simplest version of this tool is just to use the decompiler logic to turn the level/art-group/texture/TXT files into GOAL source code, and copy all STR/sound/visibility files, as these don't need to be modified. Eventually this should export to a more useful format. File formats: + - [ ] Art group (a GOAL object format) - There may be more formats related to art groups. - [ ] Texture page (a GOAL object format) @@ -282,12 +352,8 @@ File formats: - [ ] Loading screen image - [ ] save game icon (I do not care about this) +### Asset Packing Tool -Asset Packing Tool ------------------------ -Packs together all assets/compiled code/runtime into a format that can be played. The simplest version to go with the simplest extraction tool will just pass the level/art-group/texture/TXT files to the compiler, and copy STR/sound/visbility files into the fakeiso. Then pack in CGOs/DGOs. +Packs together all assets/compiled code/runtime into a format that can be played. The simplest version to go with the simplest extraction tool will just pass the level/art-group/texture/TXT files to the compiler, and copy STR/sound/visbility files into the fakeiso. Then pack in CGOs/DGOs. It's important that the asset extraction/packing can be automated so we can avoid distributing the assets, which are large and probably not supposed to be distributed. - - - diff --git a/doc/imgs/cmake-target-view.png b/doc/imgs/cmake-target-view.png new file mode 100644 index 0000000000000000000000000000000000000000..2a69df167af2bb6b5b3e01a5c29b7f511ef719b0 GIT binary patch literal 15721 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 a1lfp6jh|F8EFi)dATO;XRV85(`o91*%c-~k literal 0 HcmV?d00001 diff --git a/doc/imgs/open-cmake-vs.png b/doc/imgs/open-cmake-vs.png new file mode 100644 index 0000000000000000000000000000000000000000..914a2ff7fa152bf32166f9502d950a2cd17dda75 GIT binary patch literal 24424 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 literal 0 HcmV?d00001