Gearcoleco is a cross-platform ColecoVision emulator written in C++.

Overview

Gearcoleco (currently in development)

Gearcoleco CI

This is a work in progress project, not intended to be used right now.

Gearcoleco is a cross-platform ColecoVision emulator written in C++.

This is an open source project with its ongoing development made possible thanks to the support by these awesome backers.

Please, consider sponsoring and following me on Twitter for updates.


Build Instructions

macOS

  • Install Xcode and run xcode-select --install in the terminal for the compiler to be available on the command line.
  • Run these commands to generate a Mac app bundle:
brew install sdl2
cd platforms/macos
make dist

Linux

  • Ubuntu / Debian:
sudo apt-get install build-essential libsdl2-dev libglew-dev
cd platforms/linux
make
  • Fedora:
sudo dnf install @development-tools gcc-c++ SDL2-devel glew-devel
cd platforms/linux
make

BSD

  • NetBSD:
su root -c "pkgin install gmake pkgconf SDL2 glew"
cd platforms/bsd
gmake

Libretro

  • Ubuntu / Debian:
sudo apt-get install build-essential
cd platforms/libretro
make
  • Fedora:
sudo dnf install @development-tools gcc-c++
cd platforms/libretro
make

Raspberry Pi 4 - Raspbian (Desktop)

sudo apt install build-essential libsdl2-dev libglew-dev
cd platforms/raspberrypi4
make

Contributors

Thank you to all the people who have already contributed to Gearcoleco!

Contributors

License

Gearcoleco is licensed under the GNU General Public License v3.0 License, see LICENSE for more information.

Comments
  • Emulate TMS9928A on PAL mode

    Emulate TMS9928A on PAL mode

    The "fixed" Defender ROM that makes the radar work on PAL ColecoVisions' relies on detecting the presence of the TMS9928A VDP. This "fixed" ROM fails to correct the faulty radar when the refresh rate is set to 50Hz.

    bug 
    opened by drhelius 1
  • Bilinear filtering causes undesired texture wrapping

    Bilinear filtering causes undesired texture wrapping

    (You've done great work! This debugger is amazing.)

    Just a small rendering artifact: when bilinear filtering is enabled and you've got the screen large enough that it's being scaled up, the bottom/top row of pixels can bleed onto each other.

    Fixing it should just take changing the wrap mode for the output screen texture from "repeat" to "clamp-to-edge".

    bug 
    opened by npiegdon 1
  • error on

    error on "make"

    g++ 4.9

    git clone https://github.com/drhelius/Gearcoleco.git Clonage dans 'Gearcoleco'... remote: Enumerating objects: 616, done. remote: Counting objects: 100% (616/616), done. remote: Compressing objects: 100% (458/458), done. remote: Total 616 (delta 295), reused 456 (delta 143), pack-reused 0 Réception d'objets: 100% (616/616), 5.00 MiB | 1.58 MiB/s, fait. Résolution des deltas: 100% (295/295), fait. Vérification de la connectivité... fait. [email protected]:~/dev$ cd Gearcoleco/ [email protected]:~/dev/Gearcoleco$ cd platforms/linux/ [email protected]:~/dev/Gearcoleco/platforms/linux$ make g++ -I../ -I../../ -Wall -Wextra -Wformat -std=c++11 -DEMULATOR_BUILD=""d341487"" -DNDEBUG -O3 -flto sdl2-config --cflags -c -o main.o ../desktop-shared/main.cpp g++ -I../ -I../../ -Wall -Wextra -Wformat -std=c++11 -DEMULATOR_BUILD=""d341487"" -DNDEBUG -O3 -flto sdl2-config --cflags -c -o emu.o ../desktop-shared/emu.cpp g++ -I../ -I../../ -Wall -Wextra -Wformat -std=c++11 -DEMULATOR_BUILD=""d341487"" -DNDEBUG -O3 -flto sdl2-config --cflags -c -o gui.o ../desktop-shared/gui.cpp g++ -I../ -I../../ -Wall -Wextra -Wformat -std=c++11 -DEMULATOR_BUILD=""d341487"" -DNDEBUG -O3 -flto sdl2-config --cflags -c -o gui_debug.o ../desktop-shared/gui_debug.cpp g++ -I../ -I../../ -Wall -Wextra -Wformat -std=c++11 -DEMULATOR_BUILD=""d341487"" -DNDEBUG -O3 -flto sdl2-config --cflags -c -o application.o ../desktop-shared/application.cpp g++ -I../ -I../../ -Wall -Wextra -Wformat -std=c++11 -DEMULATOR_BUILD=""d341487"" -DNDEBUG -O3 -flto sdl2-config --cflags -c -o config.o ../desktop-shared/config.cpp g++ -I../ -I../../ -Wall -Wextra -Wformat -std=c++11 -DEMULATOR_BUILD=""d341487"" -DNDEBUG -O3 -flto sdl2-config --cflags -c -o renderer.o ../desktop-shared/renderer.cpp g++ -I../ -I../../ -Wall -Wextra -Wformat -std=c++11 -DEMULATOR_BUILD=""d341487"" -DNDEBUG -O3 -flto sdl2-config --cflags -c -o imgui_impl_sdl.o ../desktop-shared/imgui/imgui_impl_sdl.cpp g++ -I../ -I../../ -Wall -Wextra -Wformat -std=c++11 -DEMULATOR_BUILD=""d341487"" -DNDEBUG -O3 -flto sdl2-config --cflags -c -o imgui_impl_opengl2.o ../desktop-shared/imgui/imgui_impl_opengl2.cpp g++ -I../ -I../../ -Wall -Wextra -Wformat -std=c++11 -DEMULATOR_BUILD=""d341487"" -DNDEBUG -O3 -flto sdl2-config --cflags -c -o imgui.o ../desktop-shared/imgui/imgui.cpp g++ -I../ -I../../ -Wall -Wextra -Wformat -std=c++11 -DEMULATOR_BUILD=""d341487"" -DNDEBUG -O3 -flto sdl2-config --cflags -c -o imgui_demo.o ../desktop-shared/imgui/imgui_demo.cpp g++ -I../ -I../../ -Wall -Wextra -Wformat -std=c++11 -DEMULATOR_BUILD=""d341487"" -DNDEBUG -O3 -flto sdl2-config --cflags -c -o imgui_draw.o ../desktop-shared/imgui/imgui_draw.cpp ../desktop-shared/imgui/imgui_draw.cpp: In function ‘bool ImFontAtlasBuildWithStbTruetype(ImFontAtlas*)’: ../desktop-shared/imgui/imgui_draw.cpp:2103:31: warning: missing initializer for member ‘stbtt_pack_context::user_allocator_context’ [-Wmissing-field-initializers] stbtt_pack_context spc = {}; ^ ../desktop-shared/imgui/imgui_draw.cpp:2103:31: warning: missing initializer for member ‘stbtt_pack_context::pack_info’ [-Wmissing-field-initializers] ../desktop-shared/imgui/imgui_draw.cpp:2103:31: warning: missing initializer for member ‘stbtt_pack_context::width’ [-Wmissing-field-initializers] ../desktop-shared/imgui/imgui_draw.cpp:2103:31: warning: missing initializer for member ‘stbtt_pack_context::height’ [-Wmissing-field-initializers] ../desktop-shared/imgui/imgui_draw.cpp:2103:31: warning: missing initializer for member ‘stbtt_pack_context::stride_in_bytes’ [-Wmissing-field-initializers] ../desktop-shared/imgui/imgui_draw.cpp:2103:31: warning: missing initializer for member ‘stbtt_pack_context::padding’ [-Wmissing-field-initializers] ../desktop-shared/imgui/imgui_draw.cpp:2103:31: warning: missing initializer for member ‘stbtt_pack_context::skip_missing’ [-Wmissing-field-initializers] ../desktop-shared/imgui/imgui_draw.cpp:2103:31: warning: missing initializer for member ‘stbtt_pack_context::h_oversample’ [-Wmissing-field-initializers] ../desktop-shared/imgui/imgui_draw.cpp:2103:31: warning: missing initializer for member ‘stbtt_pack_context::v_oversample’ [-Wmissing-field-initializers] ../desktop-shared/imgui/imgui_draw.cpp:2103:31: warning: missing initializer for member ‘stbtt_pack_context::pixels’ [-Wmissing-field-initializers] ../desktop-shared/imgui/imgui_draw.cpp:2103:31: warning: missing initializer for member ‘stbtt_pack_context::nodes’ [-Wmissing-field-initializers] g++ -I../ -I../../ -Wall -Wextra -Wformat -std=c++11 -DEMULATOR_BUILD=""d341487"" -DNDEBUG -O3 -flto sdl2-config --cflags -c -o imgui_widgets.o ../desktop-shared/imgui/imgui_widgets.cpp g++ -I../ -I../../ -Wall -Wextra -Wformat -std=c++11 -DEMULATOR_BUILD=""d341487"" -DNDEBUG -O3 -flto sdl2-config --cflags -c -o ImGuiFileBrowser.o ../desktop-shared/FileBrowser/ImGuiFileBrowser.cpp g++ -I../ -I../../ -Wall -Wextra -Wformat -std=c++11 -DEMULATOR_BUILD=""d341487"" -DNDEBUG -O3 -flto sdl2-config --cflags -c -o Audio.o ../../src/Audio.cpp g++ -I../ -I../../ -Wall -Wextra -Wformat -std=c++11 -DEMULATOR_BUILD=""d341487"" -DNDEBUG -O3 -flto sdl2-config --cflags -c -o Cartridge.o ../../src/Cartridge.cpp In file included from ../../src/miniz/miniz.c:1:0, from ../../src/Cartridge.cpp:24: ../../src/miniz/miniz.c: In function ‘mz_bool mz_zip_validate_file(mz_zip_archive*, mz_uint, mz_uint)’: ../../src/miniz/miniz.h:547:49: warning: dereferencing type-punned pointer will break strict-aliasing rules [-Wstrict-aliasing] #define MZ_READ_LE32(p) *((const mz_uint32 *)(p)) ^ ../../src/miniz/miniz.c:5353:19: note: in expansion of macro ‘MZ_READ_LE32’ has_id = (MZ_READ_LE32(descriptor_buf) == MZ_ZIP_DATA_DESCRIPTOR_ID); ^ g++ -I../ -I../../ -Wall -Wextra -Wformat -std=c++11 -DEMULATOR_BUILD=""d341487"" -DNDEBUG -O3 -flto sdl2-config --cflags -c -o GearcolecoCore.o ../../src/GearcolecoCore.cpp g++ -I../ -I../../ -Wall -Wextra -Wformat -std=c++11 -DEMULATOR_BUILD=""d341487"" -DNDEBUG -O3 -flto sdl2-config --cflags -c -o Input.o ../../src/Input.cpp g++ -I../ -I../../ -Wall -Wextra -Wformat -std=c++11 -DEMULATOR_BUILD=""d341487"" -DNDEBUG -O3 -flto sdl2-config --cflags -c -o Memory.o ../../src/Memory.cpp ../../src/Memory.cpp:371:10: error: #elif with no expression #elif ^ ../desktop-shared/Makefile.common:93: recipe for target 'Memory.o' failed make: *** [Memory.o] Error 1

    opened by masrourmouad 1
  • Audio: TI SN76489AN vs Sega PSG

    Audio: TI SN76489AN vs Sega PSG

    The TI chip does not double the noise channel's volume, so removing * 2 here will make it more accurate: https://github.com/drhelius/Gearcoleco/blob/003b5c9b562db6736363f47c7cb5ffef30bf4561/src/audio/Sms_Apu.cpp#L109

    Tapped bits for ColecoVision (and SG-1000) are 0x0003, not 0x0009: https://github.com/drhelius/Gearcoleco/blob/003b5c9b562db6736363f47c7cb5ffef30bf4561/src/audio/Sms_Apu.cpp#L211

    LFSR is one bit shorter on the TI chip (same on SG-1000) vs the Sega PSG, this should be 15 rather than 16: https://github.com/drhelius/Gearcoleco/blob/003b5c9b562db6736363f47c7cb5ffef30bf4561/src/audio/Sms_Apu.cpp#L212

    There is also the issue of PCM samples having too high a pitch. In Sewer Sam and Squish'em Sam, you can see this exhibited. I have not truly figured out the answer to this entire question, but it does have to do with not flipping the waveform when the length counter reload value is 1, or in the case of Squish'em Sam, 16 seems to be the magic number. There is also the write delay to keep in mind when writing data to the PSG. Here are some references from JollyCV that explain a bit of this: https://gitlab.com/jgemu/jollycv/-/blob/master/core/jcv_psg.c#L152 https://gitlab.com/jgemu/jollycv/-/blob/master/core/jcv_memio.c#L100

    I think the SMS APU code you're using currently is doing PCM samples correctly, since I do hear the samples, but the pitch is wrong. I think you can get away with simply introducing a delay on writes to fix the pitch.

    Hope this helps!

    opened by carmiker 1
  • Keypad numbers 9 and 0 not implemented

    Keypad numbers 9 and 0 not implemented

    There's no way to map keypad numbers 9 or 0 from the standard controller. This should be a relatively simple matter, since there are already all the other controls available to map. This removes from playable games anything that uses two of the buttons on the main keypad, so I would suggest making this a higher priority.

    In particular, I'm trying to play 2010: Graphical Action Game and I can't make the ship take off, because that's done by pressing 0 on the keypad.

    bug 
    opened by NixieLake 3
  • Super Action Controller buttons

    Super Action Controller buttons

    I couldn't find the option to assign the two extra buttons from a Super Action Controller in your core. It only shows the left and right buttons from a standard controller. Games like SA Baseball, Football, Rocky, Frontline, and Star Trek use all 4 buttons during game play.

    feature 
    opened by midd33 1
  • Game unsoported...

    Game unsoported...

    Beamider 1983 (activision): the controllers stop working after the selection of player, in android. In "windows" the entire core crashes immediately by priced a selection number.

    core 1.0.1 Retroarch 1.12.0 Android 8.1.0 Windows 10

    (BlueMSX runs the beamrider well)

    bug 
    opened by Alejo808 1
  • Disassembler off?  Not catching code?

    Disassembler off? Not catching code?

    In an instance it outputs as RET LD ($7148), HL CALL $1FB2 Above this line is correct from the amount I checked, below is what occurred after. CALL $1FA6 CALL $1FA6 CALL $1F8B CALL $1F8B CALL $1F8B CALL $1F8B CALL $1F8B -------------------------this is where it corrected itself CALL $1FA6

    The actual code is after CALL $1FB2 is: FD,85,48,71.........

    Which translates to FD85 ADD A, IYL 48 LD C, B 71 LD (HL), C ............. I know this is not a whole lot to go on but is it my setting? Am I missing something? Could it be the undocumented Opcode IYL?

    opened by KPreston2900050 3
  • Unsupported games

    Unsupported games

    Destructor (1984) (Coleco) 50% (2.8.1) Controls: Driving Controller emulation required

    Size: 32768, MD5: ec72a0e3bebe07ba631a8dcb750c1591, SH1: 35283c51f448d877625049266c0c4687bf57ab42

    Donkey Kong Arcade (Oct 25) (2005) (Eduardo Mello) 50% (2.8.1) Other: Requires Opcode Memory Extension emulation

    Size: 32768, MD5: e602e72072766ec2159cf13469e7ef15, SH1: 6a754455ec9f6f9811f2fb947c5ac750474dc8e8

    Dukes of Hazzard, The (1984) (Warner Bros) [!] 50% (2.8.1) Controls: Steering wheel emulation required

    Size: 32768, MD5: dbd4f21702be17775e84b2fb6c534c94, SH1: 162c7ad3266e02aa88983fa4ece7a77bc1cb9c7a

    Pac-Man Collection Demo by Opcode (2006) (PD) 10% (2.8.1) Stuck: Stuck on home screen

    Size: 32768, MD5: 0021c6f3f52cc6a55a3c14bab8a6339e, SH1: d6b67e8f43afe666cdd79a718ddf808e27d6512d

    Slither (1983) (Century II) 50% (2.8.1) Controls: Requires Roller Controller emulation

    Size: 16384, MD5: 7cdc148dff40389fa1ad012d4734ceed, SH1: b11de2476f867c7c4efb2977777e12fcb454f10b

    Super Action Controller Test Cartridge (1983) (Nuvatec) 50% (2.8.1) Controls: Requires Super Action Controller emulation

    Size: 16384, MD5: 1210396cb9af270285d25c66fa9c6f6a, SH1: 0c6840b7bc24a36529f0a80ccef85ee9f409a972

    Turbo (1982) (Sega) 50% (2.8.1) Controls: Steering wheel emulation required

    Size: 16384, MD5: f042ba432716b58d2f5858abcce81b9f, SH1: 732d1f3b2f24895a1f79d15d830aa989ea12fe5e

    Yolk's on You, The (1983) (20th Century Fox) (Prototype) 50% (2.8.1) Controls: Steering wheel emulation required

    Size: 16384, MD5: c10aaca46d063771339d3e5a0582baad, SH1: 9b5bfb69d37042d131a5c9576f927e09f44f9666

    feature 
    opened by AngelofMe 2
  • RetroArch pause button bug

    RetroArch pause button bug

    Pac-Man (USA) (Proto) #is pause button but i pressed it again nothing happened and right button became the pause button I tried FBNeo and blueMSX so you made a button bug

    bug 
    opened by AngelofMe 1
Releases(1.0.0)
Owner
Ignacio Sanchez Gines
Architect at Red Hat, Indie Game Dev at home and Retro Gamer at heart. Creator of Gearboy, Gearsystem and Gearcoleco emulators.
Ignacio Sanchez Gines
A modern cross-platform low-level graphics library and rendering framework

Diligent Engine A Modern Cross-Platform Low-Level 3D Graphics Library Diligent Engine is a lightweight cross-platform graphics API abstraction library

Diligent Graphics 2.6k Nov 28, 2022
Cross-platform 2D and 3D game engine.

Urho3D Urho3D is a free lightweight, cross-platform 2D and 3D game engine implemented in C++ and released under the MIT license. Greatly inspired by O

null 4.2k Nov 24, 2022
Cross-platform, sophisticated frontend for the libretro API. Licensed GPLv3.

RetroArch RetroArch is the reference frontend for the libretro API. Popular examples of implementations for this API includes video game system emulat

null 7.2k Nov 19, 2022
A small cross-platform graphics library made in C

minigfx Small graphics library made in C Intended to be: Simple to understand Intuitive Fun to use Features Cross platform: Windows and Linux. To see

Laurentino Luna 27 Jul 18, 2021
Ksnip is a Qt-based cross-platform screenshot tool that provides many annotation features for your screenshots.

Ksnip is a Qt-based cross-platform screenshot tool that provides many annotation features for your screenshots.

ksnip 1.5k Nov 24, 2022
Android studio native project template using cross platform raylib graphics library.

rayturbo Android studio native project template using cross platform raylib graphics library. https://www.raylib.com/ This project use Android Studio

Ciapas Linux 10 Mar 5, 2022
A low-level, cross-platform GPU library

vgpu is cross-platform low-level GPU library. Features Support for Windows, Linux, macOS. Modern rendering using Vulkan and Direct3D12. Dependencies U

Amer Koleci 9 Jul 28, 2022
Cocos2d-x is a suite of open-source, cross-platform, game-development tools used by millions of developers all over the world.

Cocos2d-x is a suite of open-source, cross-platform, game-development tools used by millions of developers all over the world.

cocos2d 16.6k Nov 23, 2022
Open-source, cross-platform, C++ game engine for creating 2D/3D games.

GamePlay v3.0.0 GamePlay is an open-source, cross-platform, C++ game framework/engine for creating 2D/3D mobile and desktop games. Website Wiki API De

gameplay3d 3.9k Nov 19, 2022
Dust3D is a cross-platform open-source 3D modeling software

Dust3D is a cross-platform open-source 3D modeling software. Auto UV unwrapping, auto rigging with PBR Material support, pose and motion authoring all in one.

Jeremy HU 2.5k Nov 28, 2022
DirectX shader bytecode cross compiler

HLSLcc DirectX shader bytecode cross compiler. Originally based on https://github.com/James-Jones/HLSLCrossCompiler. This library takes DirectX byteco

Unity Technologies 734 Nov 15, 2022
A multi-platform library for OpenGL, OpenGL ES, Vulkan, window and input

GLFW Introduction GLFW is an Open Source, multi-platform library for OpenGL, OpenGL ES and Vulkan application development. It provides a simple, platf

GLFW 9.8k Nov 19, 2022
Open 3D Engine (O3DE) is an Apache 2.0-licensed multi-platform AAA Open 3D Engine

Open 3D Engine (O3DE) is an Apache 2.0-licensed multi-platform 3D engine that enables developers and content creators to build AAA games, cinema-quality 3D worlds, and high-fidelity simulations without any fees or commercial obligations.

O3DE 5.7k Nov 24, 2022
PainterEngine is a application/game engine with software renderer,PainterEngine can be transplanted to any platform that supports C

PainterEngine is a application/game engine with software renderer,PainterEngine can be transplanted to any platform that supports C

DBinary 1.6k Nov 18, 2022
rlottie is a platform independent standalone c++ library for rendering vector based animations and art in realtime

rlottie rlottie is a platform independent standalone c++ library for rendering vector based animations and art in realtime. Lottie loads and renders a

Samsung 759 Nov 27, 2022
Horde3D is a small 3D rendering and animation engine. It is written in an effort to create an engine being as lightweight and conceptually clean as possible.

Horde3D Horde3D is a 3D rendering engine written in C++ with an effort being as lightweight and conceptually clean as possible. Horde3D requires a ful

Volker Vogelhuber 1.3k Nov 19, 2022
A library for high-performance, modern 2D graphics with SDL written in C.

SDL_gpu, a library for making hardware-accelerated 2D graphics easy. by Jonathan Dearborn SDL_gpu is licensed under the terms of the MIT License. See

Jonathan Dearborn 1.1k Nov 17, 2022
Linux/X11 tool for intercepting mouse events and executing commands. Written in Kotlin Native.

XMG XMG (X11 Mouse Grabber) is a Linux/X11 tool for intercepting mouse button press events and triggering actions. It's a way of making use of the ext

Eduardo Fonseca 12 Sep 11, 2021
SoL (for Speed of Light, or sun in Spanish) is a Physically-based rendering library written in modern C++

SoL (for Speed of Light, or sun in Spanish) is a small rendering library written in C++20. Its goal is to strike a good balance between performance and usability, and allow easy experimentation for rendering researchers.

Arsène Pérard-Gayot 10 May 19, 2022