1
0
Fork 0
mirror of https://github.com/imjasonh/nescript synced 2026-07-08 08:55:38 +00:00
No description
Find a file
Claude adf50aaa7f
IR codegen: on_enter handlers, frame handler return-to-main-loop
- Initial program boot calls the start state's on_enter handler if it exists
- Transition IR op now JSRs the target state's on_enter handler after
  updating current_state and before jumping to the main dispatch loop
- Frame handlers translate their Return(None) terminator to
  JMP __ir_main_loop instead of RTS (they're not called via JSR)
- Added function_exists() helper and function_names HashSet for quick lookup
- Added in_frame_handler flag to track context during terminator emission

All 271 tests still pass, all 7 examples still compile through --use-ir.

https://claude.ai/code/session_01W6eQFStA66EuMKHUFo2rx3
2026-04-12 10:36:31 +00:00
.github/workflows Add example builds to CI, document sprite name behavior 2026-04-11 22:55:43 +00:00
docs Update future-work.md to reflect IR codegen completion 2026-04-12 10:24:12 +00:00
examples Add README, LICENSE, examples, fix draw parser lookahead 2026-04-12 00:38:19 +00:00
fuzz Add fuzz testing and parser edge case regression tests 2026-04-12 00:52:35 +00:00
scripts Implement NEScript compiler Milestone 1 ("Hello Sprite") 2026-04-11 22:07:56 +00:00
src IR codegen: on_enter handlers, frame handler return-to-main-loop 2026-04-12 10:36:31 +00:00
tests IR codegen: state dispatch, multi-OAM, and transition support 2026-04-12 10:33:58 +00:00
.gitignore Implement NEScript compiler Milestone 1 ("Hello Sprite") 2026-04-11 22:07:56 +00:00
Cargo.lock M3: Asset pipeline, sprite/palette/background declarations, debug symbols 2026-04-12 00:09:47 +00:00
Cargo.toml M3: Asset pipeline, sprite/palette/background declarations, debug symbols 2026-04-12 00:09:47 +00:00
LICENSE Add README, LICENSE, examples, fix draw parser lookahead 2026-04-12 00:38:19 +00:00
plan.md Create initial engineering design document for NEScript 2026-04-11 17:42:43 -04:00
README.md Add README, LICENSE, examples, fix draw parser lookahead 2026-04-12 00:38:19 +00:00
spec.md Add NEScript language specification draft 2026-04-11 17:42:59 -04:00

NEScript

A statically-typed, compiled programming language for NES game development.

NEScript compiles .ne source files directly into playable iNES ROM files, with no external assembler or linker dependencies. The compiler handles everything from source text to a ROM you can run in any NES emulator.

Quick Start

# Build the compiler
cargo build --release

# Compile an example
cargo run -- build examples/hello_sprite.ne

# Run the output ROM in an emulator
# (produces examples/hello_sprite.nes)

Hello World

game "Hello" {
    mapper: NROM
}

var px: u8 = 128
var py: u8 = 120

on frame {
    if button.right { px += 2 }
    if button.left  { px -= 2 }
    if button.down  { py += 2 }
    if button.up    { py -= 2 }

    draw Smiley at: (px, py)
}

start Main

Features

  • Game-aware syntax -- states, sprites, palettes, and input are first-class constructs
  • Full type system -- u8, i8, u16, bool, fixed-size arrays (u8[N])
  • Functions -- with parameters, return types, inline hint, recursion detection
  • State machines -- state with on enter, on exit, on frame handlers
  • Compile-time safety -- call depth limits, recursion detection, type checking
  • Optimizer -- constant folding, dead code elimination, strength reduction
  • Multiple mappers -- NROM, MMC1, UxROM, MMC3
  • Asset pipeline -- PNG-to-CHR conversion, palette definitions, inline tile data
  • Debug support -- --debug flag, source maps, Mesen-compatible symbol export
  • Single binary -- no dependencies on ca65, Python, or any external tools

Documentation

Examples

Example Features demonstrated
hello_sprite.ne D-pad input, sprite drawing
bouncing_ball.ne Automatic movement, edge detection
coin_cavern.ne Multi-state game, functions, constants, gravity
arrays_and_functions.ne Arrays, functions, while loops, inline functions
state_machine.ne State transitions, on enter/exit, timers
sprites_and_palettes.ne Inline CHR data, palettes, scroll, type casting
mmc1_banked.ne MMC1 mapper, bank declarations, multiply

Compiler Commands

# Compile to ROM
nescript build game.ne

# Compile with custom output path
nescript build game.ne --output my_game.nes

# Type-check only (no ROM output)
nescript check game.ne

# View generated 6502 assembly
nescript build game.ne --asm-dump

# Enable debug mode
nescript build game.ne --debug

Emulator Compatibility

Output ROMs are standard iNES format and work with any NES emulator:

Project Status

NEScript implements all five planned milestones:

Milestone Status Key Features
M1: Hello Sprite Done Full compiler pipeline, assembler, ROM builder
M2: Game Loop Done Functions, arrays, IR, optimizer, call graph analysis
M3: Asset Pipeline Done PNG-to-CHR, sprites, palettes, debug symbols
M4: Optimization Done Strength reduction, ZP promotion, type casting, asm-dump
M5: Bank Switching Done MMC1/UxROM/MMC3, bank declarations, software mul/div

210 tests across 14 modules, with CI running fmt, clippy, test, and example compilation on every push.

License

MIT