41554 blogs · [ { "id": "01a0bb54-71ad-70f2-8056-a98038001e79", "title": "Making a game for the GBA and PC from the same codebase", "url": "https://mattgreer.dev/blog/making-a-game-for-gba-and-pc", "published_at": "2026-09-17T00:00:00+00:00" }, { "id": "01a087a1-ce7d-7149-8552-a4740bf48218", "title": "Game Boy Advance Dev: Logging to the console", "url": "https://mattgreer.dev/blog/gba-dev-logging", "published_at": "2026-07-04T00:00:00+00:00" }, { "id": "01a087a1-ce7d-7149-8552-a4740c51b1cd", "title": "Game Boy Advance Dev: RAM vs ROM", "url": "https://mattgreer.dev/blog/gba-dev-ram-vs-rom", "published_at": "2026-05-08T00:00:00+00:00" }, { "id": "01a087a1-ce7d-7149-8552-a4740ca58fea", "title": "Game Boy Advance Dev: Link Cable Networking", "url": "https://mattgreer.dev/blog/gba-dev-link-cable-networking", "published_at": "2026-05-03T00:00:00+00:00" }, { "id": "01a087a1-ce7d-7149-8552-a4740d1ffeb8", "title": "Game Boy Advance Dev: Making Music", "url": "https://mattgreer.dev/blog/gba-dev-making-music", "published_at": "2026-03-27T00:00:00+00:00" }, { "id": "01a087a1-ce7d-7149-8552-a4740d478ac6", "title": "Game Boy Advance Dev: Blending Pixels", "url": "https://mattgreer.dev/blog/gba-dev-blending-pixels", "published_at": "2026-03-23T00:00:00+00:00" }, { "id": "01a087a1-ce7d-7149-8552-a4740d6242b8", "title": "Game Boy Advance Dev: Drawing Pixels", "url": "https://mattgreer.dev/blog/gba-dev-drawing-pixels", "published_at": "2026-02-10T00:00:00+00:00" }, { "id": "01a087a1-ce7d-7149-8552-a4740e3ff2c9", "title": "E-Reader Card Types", "url": "https://mattgreer.dev/blog/ereader-card-types", "published_at": "2026-01-23T00:00:00+00:00" }, { "id": "01a087a1-ce7d-7149-8552-a4740e7ec237", "title": "Hacking My Own E-Reader Game", "url": "https://mattgreer.dev/blog/hacking-my-own-ereader-game", "published_at": "2025-11-09T00:00:00+00:00" }, { "id": "01a087a1-ce7d-7149-8552-a4740e7fbe54", "title": "E-Reader z80 Dev Tutorial: Part 1", "url": "https://mattgreer.dev/blog/ereader-z80-tutorial-part1", "published_at": "2025-10-19T00:00:00+00:00" }, { "id": "01a087a1-ce7d-7149-8552-a4740f787196", "title": "Ensuring an E-Reader Game Has (Hopefully) No Bugs", "url": "https://mattgreer.dev/blog/ensuring-an-ereader-game-has-hopefully-no-bugs", "published_at": "2025-10-10T00:00:00+00:00" }, { "id": "01a087a1-ce7d-7149-8552-a4740f7e15d8", "title": "Figuring Out an E-Reader Function", "url": "https://mattgreer.dev/blog/figuring-out-an-ereader-function", "published_at": "2025-09-10T00:00:00+00:00" }, { "id": "01a087a1-ce7d-7149-8552-a474103db080", "title": "Making a Clock for the Nintendo E-Reader", "url": "https://mattgreer.dev/blog/making-a-clock-for-the-ereader", "published_at": "2025-08-06T00:00:00+00:00" }, { "id": "01a087a1-ce7d-7149-8552-a47410b5e514", "title": "Neo Geo ROM Hacking: SMA Encrypted P ROMs", "url": "https://mattgreer.dev/blog/neo-geo-rom-hacking-sma-encrypted-proms", "published_at": "2025-07-20T00:00:00+00:00" }, { "id": "01a087a1-ce7d-7149-8552-a474115aba09", "title": "Fixing Up a Used LP-2844-Z Thermal Printer", "url": "https://mattgreer.dev/blog/fixing-up-a-used-lp2844z-thermal-printer", "published_at": "2025-06-24T00:00:00+00:00" }, { "id": "01a087a1-ce7d-7149-8552-a474117574ac", "title": "E-Reader Cards Production Run: Mistakes Were Made", "url": "https://mattgreer.dev/blog/ereader-cards-production-run-mistakes-were-made", "published_at": "2025-06-20T00:00:00+00:00" }, { "id": "01a087a1-ce7d-7149-8552-a4741205ad70", "title": "Balatro for the Nintendo E-Reader", "url": "https://mattgreer.dev/blog/balatro-for-the-nintendo-ereader", "published_at": "2025-05-23T00:00:00+00:00" }, { "id": "01a087a1-ce7d-7149-8552-a474126be86c", "title": "Making a Shooter for the Nintendo E-Reader", "url": "https://mattgreer.dev/blog/making-a-shooter-for-the-ereader", "published_at": "2025-05-15T00:00:00+00:00" }, { "id": "01a087a1-ce7d-7149-8552-a4741329fd55", "title": "Printing Nintendo E-Reader Cards: Part 4, troubleshooting", "url": "https://mattgreer.dev/blog/printing-ereader-cards-part-4", "published_at": "2025-04-23T00:00:00+00:00" }, { "id": "01a087a1-ce7d-7149-8552-a47413712aaa", "title": "Finding Neo Geo Tiles", "url": "https://mattgreer.dev/blog/finding-neo-geo-tiles", "published_at": "2025-02-12T00:00:00+00:00" }, { "id": "01a087a1-ce7d-7149-8552-a47413ef34c2", "title": "Printing Nintendo E-Reader Cards: Part 3", "url": "https://mattgreer.dev/blog/printing-ereader-cards-part-3", "published_at": "2025-02-09T00:00:00+00:00" }, { "id": "01a087a1-ce7d-7149-8552-a474145645f1", "title": "An E-Reader Mystery", "url": "https://mattgreer.dev/blog/an-ereader-mystery", "published_at": "2025-01-30T00:00:00+00:00" }, { "id": "01a087a1-ce7d-7149-8552-a47414b55643", "title": "Nintendo E-Reader: Simple Fixed Point", "url": "https://mattgreer.dev/blog/ereader-simple-fixed-point", "published_at": "2024-12-15T00:00:00+00:00" }, { "id": "01a087a1-ce7d-7149-8552-a4741556b502", "title": "Printing Nintendo E-Reader Cards, More Learnings", "url": "https://mattgreer.dev/blog/printing-ereader-cards-more-learnings", "published_at": "2024-11-13T00:00:00+00:00" }, { "id": "01a087a1-ce7d-7149-8552-a474158b9b84", "title": "Cramming Solitaire onto a Nintendo E-Reader card", "url": "https://mattgreer.dev/blog/cramming-solitaire-onto-a-nintendo-ereader-card", "published_at": "2024-10-28T00:00:00+00:00" }, { "id": "01a087a1-ce7d-7149-8552-a474161c8a90", "title": "Printing Nintendo E-Reader Cards", "url": "https://mattgreer.dev/blog/printing-ereader-cards", "published_at": "2024-10-08T00:00:00+00:00" }, { "id": "01a087a1-ce7d-7149-8552-a474165b4771", "title": "Balatro Planet Growth", "url": "https://mattgreer.dev/blog/balatro-planet-growth", "published_at": "2024-09-27T00:00:00+00:00" }, { "id": "01a087a1-ce7d-7149-8552-a4741741536d", "title": "Balatro Score Growth", "url": "https://mattgreer.dev/blog/balatro-score-growth", "published_at": "2024-09-23T00:00:00+00:00" }, { "id": "01a087a1-ce7d-7149-8552-a474179a5db8", "title": "CPU Driving Part 3: Multiple Cars", "url": "https://mattgreer.dev/blog/cpu-driving-part-3-multiple-cars", "published_at": "2024-09-14T00:00:00+00:00" }, { "id": "01a087a1-ce7d-7149-8552-a4741860720b", "title": "CPU Driving Part 2: Drifting", "url": "https://mattgreer.dev/blog/cpu-driving-part-2-drifting", "published_at": "2024-09-13T00:00:00+00:00" }, { "id": "01a087a1-ce7d-7149-8552-a47418e0b192", "title": "CPU Driving Part 1: Waypoints", "url": "https://mattgreer.dev/blog/cpu-driving-part-1-waypoints", "published_at": "2024-09-12T00:00:00+00:00" }, { "id": "01a087a1-ce7d-7149-8552-a47419231cb4", "title": "Neo Geo Dev: Fixed Point Numbers", "url": "https://mattgreer.dev/blog/neo-geo-dev-fixed-point", "published_at": "2024-08-19T00:00:00+00:00" }, { "id": "01a087a1-ce7d-7149-8552-a4741a1fa84a", "title": "ROM Hacking Learnings", "url": "https://mattgreer.dev/blog/rom-hacking-learnings", "published_at": "2024-05-21T00:00:00+00:00" }, { "id": "01a087a1-ce7d-7149-8552-a4741acc930e", "title": "Neo Geo ROM Hacking: Digging Into MAME Traces", "url": "https://mattgreer.dev/blog/neo-geo-rom-hacking-digging-into-mame-traces", "published_at": "2024-04-05T00:00:00+00:00" }, { "id": "01a087a1-ce7d-7149-8552-a4741b0991b9", "title": "MAME Lua for Better Retro Dev", "url": "https://mattgreer.dev/blog/mame-lua-for-better-retro-dev", "published_at": "2024-03-05T00:00:00+00:00" }, { "id": "01a087a1-ce7d-7149-8552-a4741b45e6ed", "title": "Neo Geo ROM Hacking Guide Part 3: Changing Logic", "url": "https://mattgreer.dev/blog/neo-geo-rom-hacking-guide-part-3", "published_at": "2024-02-15T00:00:00+00:00" }, { "id": "01a087a1-ce7d-7149-8552-a4741bc14a6d", "title": "Neo Geo ROM Hacking Guide Part 2: Changing Graphics", "url": "https://mattgreer.dev/blog/neo-geo-rom-hacking-guide-part-2", "published_at": "2024-02-10T00:00:00+00:00" }, { "id": "01a087a1-ce7d-7149-8552-a4741c42b674", "title": "Neo Geo ROM Hacking Guide Part 1: Intro and Background", "url": "https://mattgreer.dev/blog/neo-geo-rom-hacking-guide-part-1", "published_at": "2024-02-09T00:00:00+00:00" }, { "id": "01a087a1-ce7d-7149-8552-a4741cc9166a", "title": "MAME Debugging", "url": "https://mattgreer.dev/blog/mame-debugging", "published_at": "2024-02-02T00:00:00+00:00" }, { "id": "01a087a1-ce7d-7149-8552-a4741d5bc4ee", "title": "Discerning the Super Metroid Map with BizHawk and Lua", "url": "https://mattgreer.dev/blog/discerning-the-super-metroid-map-with-bizhawk-and-lua", "published_at": "2021-09-24T00:00:00+00:00" }, { "id": "01a087a1-ce7d-7149-8552-a4741df395b5", "title": "Why I always use setTimeout, and never setInterval", "url": "https://mattgreer.dev/blog/why-i-always-use-settimeout", "published_at": "2021-05-03T00:00:00+00:00" }, { "id": "01a087a1-ce7d-7149-8552-a4741e2ef475", "title": "Tracking down a strange React warning", "url": "https://mattgreer.dev/blog/tracking-down-a-strange-react-warning", "published_at": "2021-03-10T00:00:00+00:00" }, { "id": "01a087a1-ce7d-7149-8552-a4741f083537", "title": "Using Google Drive for form submissions", "url": "https://mattgreer.dev/blog/using-google-drive-for-form-submissions", "published_at": "2021-01-26T00:00:00+00:00" }, { "id": "01a087a1-ce7d-7149-8552-a4741f1592aa", "title": "How I built this static site with Next.JS", "url": "https://mattgreer.dev/blog/how-i-built-this-static-site-with-nextjs", "published_at": "2021-01-07T00:00:00+00:00" }, { "id": "01a087a1-ce7d-7149-8552-a4741f960156", "title": "Extracting Neo Geo Emulator Graphics Data to Create Animated gifs", "url": "https://mattgreer.dev/blog/extracting-neo-geo-emulator-graphics-data-to-create-animated-gifs", "published_at": "2020-05-13T00:00:00+00:00" }, { "id": "01a087a1-ce7d-7149-8552-a4741fae33f8", "title": "Squeezing the Arduboy For Every Byte", "url": "https://mattgreer.dev/blog/squeezing-the-arduboy-for-every-byte", "published_at": "2018-09-10T00:00:00+00:00" }, { "id": "01a087a1-ce7d-7149-8552-a474202c71b7", "title": "MATE and i3", "url": "https://mattgreer.dev/blog/mate-and-i3", "published_at": "2017-11-30T00:00:00+00:00" }, { "id": "01a087a1-ce7d-7149-8552-a474207883c2", "title": "React Internals Part Five: Transactions", "url": "https://mattgreer.dev/blog/react-internals-part-five-transactions", "published_at": "2017-08-12T00:00:00+00:00" }, { "id": "01a087a1-ce7d-7149-8552-a4742117917a", "title": "React Internals Part Four: setState", "url": "https://mattgreer.dev/blog/react-internals-part-four-setState", "published_at": "2017-07-17T00:00:00+00:00" }, { "id": "01a087a1-ce7d-7149-8552-a474211eb524", "title": "React Internals Part Three: Basic Updating", "url": "https://mattgreer.dev/blog/react-internals-part-three-basic-updating", "published_at": "2017-07-16T00:00:00+00:00" }, { "id": "01a087a1-ce7e-7051-80c3-61776532e99c", "title": "React Internals Part Two: component­Will­Mount and component­Did­Mount", "url": "https://mattgreer.dev/blog/react-internals-part-two-componentWillMount-and-componentDidMount", "published_at": "2017-07-15T00:00:00+00:00" }, { "id": "01a087a1-ce7e-7051-80c3-6177661dfe50", "title": "React Internals Part One: Basic Rendering", "url": "https://mattgreer.dev/blog/react-internals-part-one-basic-rendering", "published_at": "2017-07-14T00:00:00+00:00" }, { "id": "01a087a1-ce7e-7051-80c3-617766bcba91", "title": "Electron, Redux and Persistence", "url": "https://mattgreer.dev/blog/electron-redux-and-persistence", "published_at": "2016-01-31T00:00:00+00:00" }, { "id": "01a087a1-ce7e-7051-80c3-617767b90215", "title": "The Sega Saturn and Transparency", "url": "https://mattgreer.dev/blog/sega-saturn-and-transparency", "published_at": "2016-01-23T00:00:00+00:00" }, { "id": "01a087a1-ce7e-7051-80c3-6177683bba3c", "title": "Impromptu Web Scraping", "url": "https://mattgreer.dev/blog/impromptu-web-scraping", "published_at": "2015-07-04T00:00:00+00:00" }, { "id": "01a087a1-ce7e-7051-80c3-617768ce246e", "title": "JavaScript is a pass by value language", "url": "https://mattgreer.dev/blog/javascript-is-a-pass-by-value-language", "published_at": "2015-03-03T00:00:00+00:00" }, { "id": "01a087a1-ce7e-7051-80c3-617769b0eb3f", "title": "Embedding SVG Into a Reagent Component", "url": "https://mattgreer.dev/blog/embedding-svg-into-a-reagent-component", "published_at": "2015-02-09T00:00:00+00:00" }, { "id": "01a087a1-ce7e-7051-80c3-61776a869654", "title": "A Game Made With Reagent", "url": "https://mattgreer.dev/blog/a-game-made-with-reagent", "published_at": "2015-02-03T00:00:00+00:00" }, { "id": "01a087a1-ce7e-7051-80c3-61776b83dba6", "title": "ClojureScript Internals: Vectors", "url": "https://mattgreer.dev/blog/clojurescript-internals-vectors", "published_at": "2015-01-26T00:00:00+00:00" }, { "id": "01a087a1-ce7e-7051-80c3-61776c05e15d", "title": "Reagent Rocks!", "url": "https://mattgreer.dev/blog/reagent-rocks", "published_at": "2015-01-24T00:00:00+00:00" }, { "id": "01a087a1-ce7e-7051-80c3-61776ce19139", "title": "Pair Programming Is Not a Panacea", "url": "https://mattgreer.dev/blog/pair-programming-is-not-a-panacea", "published_at": "2014-08-27T00:00:00+00:00" }, { "id": "01a087a1-ce7e-7051-80c3-61776db2d809", "title": "JavaScript Promises ... in Wicked Detail", "url": "https://mattgreer.dev/blog/promises-in-wicked-detail", "published_at": "2014-02-04T00:00:00+00:00" }, { "id": "01a087a1-ce7e-7051-80c3-61776eb2c550", "title": "Dynamic Lighting and Shadows In My 2D Game", "url": "https://mattgreer.dev/blog/dynamic-lighting-and-shadows", "published_at": "2012-10-17T00:00:00+00:00" }, { "id": "01a087a1-ce7e-7051-80c3-61776f54b8ea", "title": "Waking Up At 5am To Code", "url": "https://mattgreer.dev/blog/waking-up-at-5am-to-code", "published_at": "2012-01-23T00:00:00+00:00" } ] posts Claim your blog
Back to mattgreer.dev
Blog · corpus.blog/blogs/mattgreer.dev/posts

mattgreer.dev

mattgreer.dev

2026

2025

2024

2021

2020

2018

2017

2016

2015

2014

2012