Skip to content

Instantly share code, notes, and snippets.

View ISSOtm's full-sized avatar
🦀
Rewriting RGBDS... In Rust!

Eldred Habert ISSOtm

🦀
Rewriting RGBDS... In Rust!
View GitHub Profile
@ISSOtm
ISSOtm / rotate.asm
Last active December 18, 2024 14:38
Function(s) for rotating a tile clockwise 90 degrees on Game Boy.
INCLUDE "hardware.inc"
SECTION "Size-optimised", ROM0
RotateTileClockwise:
ld hl, wTileBuf.bp0
ld c, 8
.loop
REPT 2 ; Once for each bitplane.
ld a, [de]
@ISSOtm
ISSOtm / vblank_handler.asm
Last active January 3, 2024 10:24
Fancy VBlank handler skeleton for Game Boy, with detailed explanation
SECTION "VBlank vector", ROM0[$0040] ; (address as required by the hardware.)
push af ; Avoid overwriting registers, that would mess up the code being interrupted!
; Always restore registers from their shadows, to reset parameters even in the presence
; of raster effects. (This does imply that those registers should be written as late as
; possible during a frame's processing.)
ldh a, [hLCDC]
ldh [rLCDC], a
jr VBlankHandler
VBlankHandlerJump:
SECTION "VBlank handler", ROM0 ; See at the end of this section for its placement.
// Note: requires Nightly Rust as of 2023-11-03.
use std::alloc::{Allocator, System};
/// Object allowing access to the system allocator.
static SYSTEM: System = System;
fn main() {
let layout = Layout::from_size_align(2, 1).unwrap();
@ISSOtm
ISSOtm / configure.sh
Created February 8, 2023 10:01
Fragment of a `./configure.sh` I wrote that generates a `build.ninja`
#!/bin/bash
# shellcheck disable=SC2016 # Dollar signs in single quotes are destined to Ninja, not Bash.
# Safety belt, even if not perfect. Combined with Shellcheck, we should be okay.
set -euo pipefail
cd "$(dirname "$0")" # Go to the script's directory.
BUILD_DIR="build"
CFLAGS="-D_GNU_SOURCE -pthread $(pkg-config --cflags sdl2)"
@ISSOtm
ISSOtm / shell.session
Created November 5, 2022 21:03
Macro definition polyfill for RGBDS 0.4.2+
issotm@sheik-kitty ~% rgbasm - -Dm1=MACRO -Dm2= <<EOF
m1 duck{m2}
PRINTLN "Quack!"
ENDM
duck
EOF
Quack!
issotm@sheik-kitty ~% rgbasm - -Dm1= -Dm2=:MACRO <<EOF
m1 duck{m2}
@ISSOtm
ISSOtm / map_to_sym.awk
Created September 25, 2021 13:23
Awk script for generating a Game Boy SYM file from a RGBDS map file
#!/usr/bin/awk -f
/^[^ \t]+[ \t]bank #([0-9]+):$/ {
bank = substr($3, 2)
sub(/:/, "", bank)
}
/^[ \t]*\$[0-9A-Fa-f]{4}[ \t]+=[ \t]+/ {
printf "%02x:%s %s\n", bank, substr($1, 2), $3
}
@ISSOtm
ISSOtm / maze.py
Created September 5, 2021 16:08
"Clever" assembly for NANDGame maze escape mission (not really Python, just for approximate syntax highlighting)
# Start of main loop
loop:
# Wait until everything is settled before doing anything
A = 0x600
D = A
wait_init:
A = 0x7FFF
# D has its bits get progressively cleared as exit conditions become true
# (since we're not instructing the robot to move, it won't suddenly start doing so)
@ISSOtm
ISSOtm / metasprite_defs.asm
Created July 29, 2021 23:21
Metasprite animation definition
MACRO nb_cels
REDEF NB_CELS equs "_NB_CELS\@"
db {NB_CELS}
DEF {NB_CELS} = 0
ENDM
MACRO cel
db (\1) ; Amount of frames to display this cel during
REDEF {NB_CELS} = {NB_CELS} + (\1)
dw (\2) ; Ptr to cel
ENDM
@ISSOtm
ISSOtm / u256.rs
Created May 24, 2021 14:33
Short, very incomplete implementation of u256 to showcase the use of `u128::overflowing_add`
use std::fmt::{self, Display, Formatter};
use std::ops::Add;
#[derive(Debug, Clone)]
struct u256 {
lo: u128,
hi: u128,
}
impl Add<u256> for u256 {
@ISSOtm
ISSOtm / csvtomap.py
Last active May 22, 2021 21:28
CSV → Binary tilemap converter
#!/usr/bin/env python3
import sys
def main(argv):
if len(argv) != 3:
print(f"Usage: {argv[0} -(0|1) file.csv", file=sys.stderr)
return 1
if argv[1] == "-0":
bounds = (-128, 127)