Init
This commit is contained in:
45
.gitignore
vendored
Normal file
45
.gitignore
vendored
Normal file
@@ -0,0 +1,45 @@
|
||||
# --- Build directories ---
|
||||
build/
|
||||
out/
|
||||
|
||||
# --- vcpkg installed artifacts (restored from vcpkg.json on configure) ---
|
||||
vcpkg_installed/
|
||||
build/vcpkg_installed/
|
||||
|
||||
# --- CMake generated / cache files ---
|
||||
CMakeCache.txt
|
||||
CMakeFiles/
|
||||
cmake_install.cmake
|
||||
compile_commands.json
|
||||
*.cmake
|
||||
!CMakeLists.txt
|
||||
!CMakePresets.json
|
||||
!CMakeUserPresets.json
|
||||
|
||||
# --- Ninja ---
|
||||
build.ninja
|
||||
.ninja_deps
|
||||
.ninja_log
|
||||
|
||||
# --- vcpkg logs ---
|
||||
vcpkg-manifest-install.log
|
||||
|
||||
# --- Compiled objects & executables ---
|
||||
*.obj
|
||||
*.o
|
||||
*.a
|
||||
*.lib
|
||||
*.exe
|
||||
*.pdb
|
||||
*.ilk
|
||||
*.exp
|
||||
|
||||
# --- IDE / editor ---
|
||||
.vs/
|
||||
.vscode/
|
||||
*.user
|
||||
|
||||
# --- OS junk ---
|
||||
Thumbs.db
|
||||
desktop.ini
|
||||
.DS_Store
|
||||
40
CMakeLists.txt
Normal file
40
CMakeLists.txt
Normal file
@@ -0,0 +1,40 @@
|
||||
cmake_minimum_required(VERSION 3.16)
|
||||
project(emulator LANGUAGES CXX)
|
||||
|
||||
set(CMAKE_CXX_STANDARD 17)
|
||||
set(CMAKE_CXX_STANDARD_REQUIRED ON)
|
||||
set(CMAKE_CXX_EXTENSIONS OFF)
|
||||
|
||||
if(NOT CMAKE_BUILD_TYPE)
|
||||
set(CMAKE_BUILD_TYPE Release CACHE STRING "Build type" FORCE)
|
||||
endif()
|
||||
|
||||
option(EMULATOR_BUILD_TESTS "Build unit tests" OFF)
|
||||
|
||||
find_package(SDL2 REQUIRED)
|
||||
find_package(SDL2_image REQUIRED)
|
||||
|
||||
add_executable(emulator
|
||||
src/main.cpp
|
||||
src/emulator.cpp
|
||||
)
|
||||
|
||||
target_include_directories(emulator PRIVATE
|
||||
${CMAKE_CURRENT_SOURCE_DIR}/src
|
||||
)
|
||||
|
||||
target_link_libraries(emulator PRIVATE
|
||||
SDL2::SDL2
|
||||
SDL2_image::SDL2_image
|
||||
)
|
||||
|
||||
if(MSVC)
|
||||
target_compile_options(emulator PRIVATE /W4 /permissive-)
|
||||
else()
|
||||
target_compile_options(emulator PRIVATE -Wall -Wextra -Wpedantic)
|
||||
endif()
|
||||
|
||||
if(EMULATOR_BUILD_TESTS)
|
||||
enable_testing()
|
||||
add_subdirectory(tests)
|
||||
endif()
|
||||
37
CMakePresets.json
Normal file
37
CMakePresets.json
Normal file
@@ -0,0 +1,37 @@
|
||||
{
|
||||
"version": 3,
|
||||
"cmakeMinimumRequired": {
|
||||
"major": 3,
|
||||
"minor": 21,
|
||||
"patch": 0
|
||||
},
|
||||
"configurePresets": [
|
||||
{
|
||||
"name": "default",
|
||||
"displayName": "Default (vcpkg + MSVC)",
|
||||
"description": "Configure with vcpkg manifest mode and generate compile_commands.json for IntelliSense",
|
||||
"binaryDir": "${sourceDir}/build",
|
||||
"cacheVariables": {
|
||||
"CMAKE_EXPORT_COMPILE_COMMANDS": {
|
||||
"type": "BOOL",
|
||||
"value": "ON"
|
||||
},
|
||||
"CMAKE_TOOLCHAIN_FILE": {
|
||||
"type": "FILEPATH",
|
||||
"value": "C:/Program Files (x86)/Microsoft Visual Studio/18/BuildTools/VC/vcpkg/scripts/buildsystems/vcpkg.cmake"
|
||||
},
|
||||
"VCPKG_TARGET_TRIPLET": {
|
||||
"type": "STRING",
|
||||
"value": "x64-windows"
|
||||
}
|
||||
},
|
||||
"generator": "Ninja"
|
||||
}
|
||||
],
|
||||
"buildPresets": [
|
||||
{
|
||||
"name": "default",
|
||||
"configurePreset": "default"
|
||||
}
|
||||
]
|
||||
}
|
||||
93
README.md
Normal file
93
README.md
Normal file
@@ -0,0 +1,93 @@
|
||||
# emulator
|
||||
|
||||
A simple emulator built in C++17 using SDL2 for video/audio. It loads a ROM
|
||||
file from disk, maps it into memory, and runs a fetch/decode/execute loop
|
||||
rendered to an SDL window.
|
||||
|
||||
## Prerequisites
|
||||
|
||||
- **C++17 compiler** — MSVC (Visual Studio 2019 or 2022 Build Tools) on
|
||||
Windows. The project is currently configured for the MSVC toolchain.
|
||||
- **CMake** 3.21 or newer (required for the CMake Presets feature).
|
||||
- **Ninja** — used as the build generator.
|
||||
- **vcpkg** — dependencies are declared in `vcpkg.json` (manifest mode), so
|
||||
vcpkg fetches them automatically on first configure. A working vcpkg
|
||||
installation must be available on the system.
|
||||
- **Git** — for cloning and for vcpkg to fetch package sources.
|
||||
|
||||
## Project layout
|
||||
|
||||
```
|
||||
.
|
||||
├── CMakeLists.txt # build definition
|
||||
├── CMakePresets.json # configure/build presets (vcpkg + MSVC + Ninja)
|
||||
├── vcpkg.json # dependency manifest (sdl2, sdl2-image)
|
||||
├── .vscode/ # editor / IntelliSense config
|
||||
├── src/
|
||||
│ ├── main.cpp # entry point: parses argv, runs the emulator
|
||||
│ ├── emulator.hpp # Emulator class declaration
|
||||
│ └── emulator.cpp # Emulator class implementation
|
||||
└── build/ # generated after configure (gitignored)
|
||||
```
|
||||
|
||||
## Installation
|
||||
|
||||
1. **Clone the repository**
|
||||
|
||||
```sh
|
||||
git clone <repo-url> emulator
|
||||
cd emulator
|
||||
```
|
||||
|
||||
2. **Ensure vcpkg is installed**
|
||||
|
||||
If you do not already have vcpkg, clone and bootstrap it:
|
||||
|
||||
```sh
|
||||
git clone https://github.com/microsoft/vcpkg.git
|
||||
cd vcpkg
|
||||
.\bootstrap-vcpkg.bat
|
||||
```
|
||||
|
||||
Note its root path — you will reference it in the next step.
|
||||
|
||||
3. **Point CMake at the vcpkg toolchain**
|
||||
|
||||
`CMakePresets.json` sets `CMAKE_TOOLCHAIN_FILE` to:
|
||||
|
||||
```
|
||||
C:/Program Files (x86)/Microsoft Visual Studio/18/BuildTools/VC/vcpkg/scripts/buildsystems/vcpkg.cmake
|
||||
```
|
||||
|
||||
If your vcpkg lives elsewhere, edit the `default` configure preset
|
||||
(or create a `CMakeUserPresets.json` next to `CMakePresets.json`) so the
|
||||
`CMAKE_TOOLCHAIN_FILE` value matches your vcpkg install.
|
||||
|
||||
## Setup & build
|
||||
|
||||
Configure and build with the bundled preset (uses vcpkg manifest mode, so
|
||||
`sdl2` and `sdl2-image` are installed automatically on first configure):
|
||||
|
||||
```sh
|
||||
cmake --preset default
|
||||
cmake --build --preset default
|
||||
```
|
||||
|
||||
The resulting executable is placed in `build/` (e.g. `build/emulator.exe`).
|
||||
|
||||
## Running
|
||||
|
||||
Pass a ROM file as the only argument:
|
||||
|
||||
```sh
|
||||
.\build\emulator.exe <rom-file>
|
||||
```
|
||||
|
||||
Press **Esc** or close the window to quit.
|
||||
|
||||
## Editor / IntelliSense
|
||||
|
||||
VS Code IntelliSense is configured in `.vscode/c_cpp_properties.json` to read
|
||||
`build/compile_commands.json` (generated by the `default` preset). Configure
|
||||
the project once with `cmake --preset default` so the compile database exists;
|
||||
IntelliSense will then resolve `SDL.h` and the project headers correctly.
|
||||
13
src/emulator.cpp
Normal file
13
src/emulator.cpp
Normal file
@@ -0,0 +1,13 @@
|
||||
#include "emulator.hpp"
|
||||
|
||||
namespace emu {
|
||||
|
||||
Emulator::Emulator(std::string rom_path)
|
||||
: rom_path_(std::move(rom_path)) {}
|
||||
|
||||
int Emulator::run() {
|
||||
// TODO: load ROM from rom_path_ and run the emulator loop
|
||||
return 0;
|
||||
}
|
||||
|
||||
} // namespace emu
|
||||
16
src/emulator.hpp
Normal file
16
src/emulator.hpp
Normal file
@@ -0,0 +1,16 @@
|
||||
#pragma once
|
||||
|
||||
#include <string>
|
||||
|
||||
namespace emu {
|
||||
|
||||
class Emulator {
|
||||
public:
|
||||
explicit Emulator(std::string rom_path);
|
||||
int run();
|
||||
|
||||
private:
|
||||
std::string rom_path_;
|
||||
};
|
||||
|
||||
} // namespace emu
|
||||
13
src/main.cpp
Normal file
13
src/main.cpp
Normal file
@@ -0,0 +1,13 @@
|
||||
#include <iostream>
|
||||
|
||||
#include "emulator.hpp"
|
||||
|
||||
int main(int argc, char** argv) {
|
||||
if (argc < 2) {
|
||||
std::cerr << "Usage: " << argv[0] << " <rom-file>\n";
|
||||
return 1;
|
||||
}
|
||||
|
||||
emu::Emulator emulator(argv[1]);
|
||||
return emulator.run();
|
||||
}
|
||||
9
vcpkg.json
Normal file
9
vcpkg.json
Normal file
@@ -0,0 +1,9 @@
|
||||
{
|
||||
"name": "emulator",
|
||||
"version-string": "0.1.0",
|
||||
"dependencies": [
|
||||
"sdl2",
|
||||
"sdl2-image"
|
||||
],
|
||||
"builtin-baseline": "544a4c5c297e60e4ac4a5a1810df66748d908869"
|
||||
}
|
||||
Reference in New Issue
Block a user