{"id":50358674,"url":"https://github.com/dagrigorev/gw-basic-cpp","last_synced_at":"2026-05-30T00:01:34.580Z","repository":{"id":352965408,"uuid":"1217387110","full_name":"dagrigorev/gw-basic-cpp","owner":"dagrigorev","description":"Rewritten version of GW-BASIC in C++20","archived":false,"fork":false,"pushed_at":"2026-05-16T17:19:51.000Z","size":723,"stargazers_count":3,"open_issues_count":0,"forks_count":0,"subscribers_count":0,"default_branch":"main","last_synced_at":"2026-05-16T19:14:59.491Z","etag":null,"topics":["basic","cmake","cpp","cpp20","easter","gwbasic","snake"],"latest_commit_sha":null,"homepage":"","language":"C++","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/dagrigorev.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2026-04-21T20:46:25.000Z","updated_at":"2026-05-16T17:19:54.000Z","dependencies_parsed_at":null,"dependency_job_id":null,"html_url":"https://github.com/dagrigorev/gw-basic-cpp","commit_stats":null,"previous_names":["dagrigorev/gw-basic-cpp"],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/dagrigorev/gw-basic-cpp","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/dagrigorev%2Fgw-basic-cpp","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/dagrigorev%2Fgw-basic-cpp/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/dagrigorev%2Fgw-basic-cpp/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/dagrigorev%2Fgw-basic-cpp/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/dagrigorev","download_url":"https://codeload.github.com/dagrigorev/gw-basic-cpp/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/dagrigorev%2Fgw-basic-cpp/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":33675019,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-05-26T15:22:16.424Z","status":"online","status_checked_at":"2026-05-29T02:00:06.066Z","response_time":107,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["basic","cmake","cpp","cpp20","easter","gwbasic","snake"],"created_at":"2026-05-30T00:01:33.863Z","updated_at":"2026-05-30T00:01:34.571Z","avatar_url":"https://github.com/dagrigorev.png","language":"C++","funding_links":[],"categories":[],"sub_categories":[],"readme":"# GW-BASIC (Modern Cross-Platform Rewrite)\n\nA modern, cross-platform rewrite of the classic **GW-BASIC interpreter**, implemented in **C++20** with a real-time execution model and hardware-accelerated graphics.\n\nThis project aims to preserve the simplicity and spirit of GW-BASIC while providing a clean, extensible architecture suitable for modern systems.\n\n---\n\n## ✨ Features\n\n### 🧠 Language Support\n\n* Line-numbered BASIC programs\n* Immediate mode (REPL) + file execution\n* Control flow:\n\n  * `IF ... THEN ... ELSE`\n  * `GOTO`, `GOSUB`, `RETURN`\n  * `FOR/NEXT`\n  * `WHILE/WEND`\n* Variables:\n\n  * Numeric + string\n  * Arrays (`DIM`, `ERASE`, `OPTION BASE`)\n  * Default typing (`DEFINT`, `DEFSTR`, etc.)\n* Expressions:\n\n  * Arithmetic\n  * Exponentiation (`^`)\n  * Integer division (`\\`) and `MOD`\n  * Logical (`AND`, `OR`, `NOT`)\n  * User-defined `DEF FN` functions\n* Functions:\n\n  * `ABS`, `INT`, `LEN`, `VAL`\n  * `FIX`, `CINT`, `CLNG`, `CSNG`, `CDBL`, `SGN`, `SQR`, `SIN`, `COS`, `TAN`, `ATN`, `EXP`, `LOG`\n  * `RND`\n  * `DATE$`, `TIME$`, `TIMER`\n  * String functions (`LEFT$`, `RIGHT$`, `MID$`, `UCASE$`, `LCASE$`, etc.)\n\n---\n\n### 🎮 Real-Time Engine\n\n* Frame-based execution model\n* Non-blocking input (`INKEY$`)\n* Engine tick integration\n* Batch rendering for high-performance drawing\n* Suitable for games and simulations\n\n---\n\n### 🖥 Graphics\n\n#### Rendering Backends\n\n* **Windows** → Direct3D 11\n* **Linux** → OpenGL (X11)\n* **Headless** mode for testing / CI\n\n#### Graphics API\n\n* `SCREEN`\n* `CLS`\n* `COLOR`\n* `LOCATE`\n* `PSET`, `LINE`, `CIRCLE`\n* `PAINT`, `DRAW`\n* `GET` / `PUT` (graphics blocks)\n* `VIEW`, `WINDOW`, `PMAP`\n* `PALETTE`, `PALETTE USING`\n\n#### Features\n\n* Pixel canvas abstraction\n* Palette remapping\n* Viewport and world-coordinate transforms\n* Hardware-accelerated presentation\n* Aspect-preserving window scaling\n* Automatic batching for performance\n\n#### Examples \n\n Here is example of graphics \n\n \n  `tan(x^2 + y^2) = 1` graph example:\n\n ![tan](./tan.png)\n\n\n  `snake game` example:\n\n ![snake](./snake.png)\n\n\n `easter card` example:\n\n ![easter](./easter.png)\n\n \n `y=sin(x), y=cos(x)` graphs:\n\n ![sincos](./sincos.png)\n\n\n `norton commaner` inspired example:\n\n ![commander](./commander.png)\n\n---\n\n### 📁 File I/O\n\n* `OPEN`, `CLOSE`\n* `INPUT#`, `PRINT#`, `WRITE#`\n* `LINE INPUT#`\n* `EOF`, `LOF`, `LOC`\n* `KILL`, `NAME`, `MKDIR`, `RMDIR`\n\n---\n\n### 🎹 Input\n\n* `INKEY$` (non-blocking)\n* Keyboard input from:\n\n  * Console\n  * Native graphics window (Win32 / X11)\n\n---\n\n## 🚀 Getting Started\n\n### Build\n\n#### Requirements\n\n* C++20 compiler\n* CMake ≥ 3.16\n\n#### Linux\n\n```bash\ncmake --preset debug\ncmake --build --preset debug\nctest --preset debug\n```\n\n#### Windows (MSVC)\n\n```powershell\ncmake --preset debug\ncmake --build --preset debug --config Debug\nctest --preset debug -C Debug\n```\n\n---\n\n## ▶️ Usage\n\n### Run interpreter (REPL)\n\n```bash\ngwbasic\n```\n\n### Run BASIC file\n\n```bash\ngwbasic --file ./examples/snake.bas\n```\n\n### Console editor\n\n```bash\ngwbasic --edit ./examples/snake.bas\n```\n\nThe editor accepts numbered BASIC lines directly and supports commands such as\n`RUN`, `CHECK`, `LIST`, `OPEN \u003cfile\u003e`, `SAVE [file]`, `EDIT \u003cline\u003e`,\n`DEL \u003cline\u003e`, `RENUM`, `NEW`, and `QUIT`.\n\n### Headless mode (no graphics window)\n\n```bash\ngwbasic --headless --file ./examples/snake.bas\n```\n\n### Syntax check without running\n\n```bash\ngwbasic --check --file ./examples/snake.bas\n```\n\nInside the REPL or a BASIC program, text source can be persisted with:\n\n```basic\nSAVE \"program.bas\"\nLOAD \"program.bas\"\n```\n\n---\n\n## 🧪 Example\n\n### Snake Game\n\n```bash\ngwbasic --file ./examples/snake.bas\n```\n\nFeatures:\n\n* real-time gameplay\n* keyboard control via graphics window\n* hardware-accelerated rendering\n\nMore examples are listed in [examples/README.md](./examples/README.md).\n\n---\n\n### Math Plot\n\n```basic\n10 SCREEN 2\n20 CLS\n30 COLOR 15,0\n40 CX = 320: CY = 100\n50 SX = 0.03: SY = 0.03\n60 FOR PY = 0 TO 199\n70 FOR PX = 0 TO 639\n80 X = (PX - CX) * SX\n90 Y = (PY - CY) * SY\n100 IF ABS(TAN(X*X+Y*Y)-1) \u003c 0.05 THEN PSET (PX,PY), 10\n110 NEXT PX\n120 NEXT PY\n130 END\n```\n\n---\n\n## 📚 Compatibility\n\nSee [docs/compatibility.md](./docs/compatibility.md) for the current supported\nGW-BASIC statements/functions, known differences, and test coverage.\n\n### API Documentation\n\nIf Doxygen is installed, generate developer API docs with:\n\n```bash\ncmake --preset docs\ncmake --build --preset docs\n```\n\n---\n\n## 🏗 Architecture\n\n### Core Components\n\n#### Interpreter\n\n* Lexer → Parser → AST → Execution\n* Line-numbered program storage\n* Immediate + stored execution modes\n\n#### Runtime\n\n* Variable storage\n* Array memory\n* File handles\n* Graphics state\n* Engine tick integration\n\n#### Graphics\n\n* In-memory pixel canvas\n* Platform-specific presenter:\n\n  * D3D11 (Windows)\n  * OpenGL (Linux)\n* Batch rendering system\n\n#### Engine Loop\n\n* Cooperative execution\n* Frame pacing (~60 FPS)\n* Event pumping\n* Input polling\n\n---\n\n## ⚡ Performance Notes\n\n* Rendering is **batched**, not per-pixel immediate\n* Large plots are now significantly faster than naive implementations\n* Still an interpreter → heavy numeric loops can be slow\n* Prefer:\n\n  * coarse stepping\n  * analytical drawing (e.g., circles instead of brute-force)\n\n---\n\n## ⚠️ Limitations\n\n* Not a 100% GW-BASIC clone\n* Graphics are **portable abstractions**, not exact hardware emulation\n* Some legacy quirks are not implemented\n* Floating-point math is modernized (not 8087-compatible)\n* Performance depends on interpreter speed\n\n---\n\n## 🛠 Roadmap\n\n* Fixed-timestep VM scheduler\n* More BASIC compatibility edge cases\n* Improved parser tolerance\n* Sound subsystem (`PLAY`, `SOUND`) improvements\n* Better console emulation\n* Optional SDL backend\n* Debug / trace mode\n\n---\n\n## 🤝 Contributing\n\nContributions are welcome.\n\nFocus areas:\n\n* language compatibility\n* performance improvements\n* platform backends\n* test coverage\n\n---\n\n## 📜 License\n\nUnder MIT license\n\n---\n\n## 🎯 Vision\n\nThis project is not just a clone.\n\nIt’s a **modern BASIC runtime**:\n\n* simple like the original\n* powerful enough for real-time programs\n* portable across platforms\n* clean and extensible in design\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fdagrigorev%2Fgw-basic-cpp","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fdagrigorev%2Fgw-basic-cpp","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fdagrigorev%2Fgw-basic-cpp/lists"}