Skip to content

Instantly share code, notes, and snippets.

@bobbicodes
Last active March 2, 2024 17:57
Show Gist options
  • Save bobbicodes/7c8f8ceb6f91a99a0b20627aabc26dee to your computer and use it in GitHub Desktop.
Save bobbicodes/7c8f8ceb6f91a99a0b20627aabc26dee to your computer and use it in GitHub Desktop.
NSF Driver - Assembles an NES ROM from music data
const nsfFormat = [0x4e, 0x45, 0x53, 0x4d, 0x1a]
const version = 1
let totalSongs = 1
let startingSong = 1
const loadAdr = [0x00, 0x80]
const initAdr = [0x00, 0x80]
const playAdr = [0x09, 0x80]
function pad32(string) {
let name = []
for (let i = 0; i < 32; i++) {
if (i < string.length) {
name.push(string.charCodeAt(i))
} else {
name.push(0)
}
}
return name
}
let songName = pad32("Untitled")
let artist = pad32("Unknown")
let copyright = pad32("")
let ntscSpeed = [0xff, 0x40]
let banking = [0,0,0,0,0,0,0,0]
let palSpeed = [0x1d, 0x4e]
let playMode = 3
let expansionAudio = 0
let prgLength = 0
let header = nsfFormat
header.push(version, totalSongs, startingSong);
header = header.concat(loadAdr, initAdr, playAdr,
songName, artist, copyright, ntscSpeed, banking,
palSpeed, playMode, expansionAudio, prgLength)
const load = [0x20, 0x0B, 0x80, 0x20, 0x39, 0x80, 0x60, 0x20, 0x88, 0x80, 0x60];
const init = [0xA9, 0x0F, 0x8D, 0x15, 0x40, 0xA9, 0x00, 0x8D, 0x00, 0x02,
0xA9, 0xFF, 0x8D, 0x03, 0x02, 0x8D, 0x04, 0x02];
const silence = [0xA9, 0x30, 0x8D, 0x05, 0x02, 0x8D, 0x09, 0x02,
0x8D, 0x11, 0x02, 0xA9, 0x80, 0x8D, 0x0D, 0x02, 0x60];
const soundLoad = [
// Offset 0x000000B9 to 0x00000107
0x8D, 0x01, 0x02, 0x0A, 0xA8, 0xB9, 0x27, 0x82, 0x85, 0x00, 0xB9, 0x28,
0x82, 0x85, 0x01, 0xA0, 0x00, 0xB1, 0x00, 0x8D, 0x02, 0x02, 0xC8, 0xB1,
0x00, 0xAA, 0xC8, 0xB1, 0x00, 0x9D, 0x1B, 0x02, 0xF0, 0x20, 0xC8, 0xB1,
0x00, 0x9D, 0x21, 0x02, 0xC8, 0xB1, 0x00, 0x9D, 0x33, 0x02, 0xC8, 0xB1,
0x00, 0x9D, 0x27, 0x02, 0xC8, 0xB1, 0x00, 0x9D, 0x2D, 0x02, 0xA9, 0x01,
0x9D, 0x45, 0x02, 0x9D, 0x4B, 0x02, 0xC8, 0xAD, 0x01, 0x02, 0x9D, 0x15,
0x02, 0xCE, 0x02, 0x02, 0xD0, 0xC9, 0x60
];
const playFrame = [
// Offset 0x00000108 to 0x00000132
0xAD, 0x00, 0x02, 0xD0, 0x25, 0x20, 0x1D, 0x80, 0xA2, 0x00, 0xBD, 0x1B,
0x02, 0x29, 0x01, 0xF0, 0x11, 0xDE, 0x45, 0x02, 0xD0, 0x09, 0xBD, 0x4B,
0x02, 0x9D, 0x45, 0x02, 0x20, 0xB3, 0x80, 0x20, 0x8D, 0x81, 0xE8, 0xE0,
0x06, 0xD0, 0xE3, 0x20, 0xC2, 0x81, 0x60
];
const fetchByte = [
// Offset 0x00000133 to 0x000001E0
0xBD, 0x27, 0x02, 0x85, 0x00, 0xBD, 0x2D, 0x02, 0x85, 0x01, 0xA0, 0x00,
0xB1, 0x00, 0x10, 0x68, 0xC9, 0xE0, 0x90, 0x23, 0xC9, 0xF0, 0x90, 0x32,
0xC9, 0xF4, 0x90, 0x42, 0xBD, 0x1B, 0x02, 0x29, 0xFE, 0x9D, 0x1B, 0x02,
0xBD, 0x21, 0x02, 0xC9, 0x02, 0xF0, 0x04, 0xA9, 0x30, 0xD0, 0x02, 0xA9,
0x80, 0x9D, 0x33, 0x02, 0x4C, 0x52, 0x81, 0x29, 0x7F, 0x8C, 0x01, 0x02,
0xA8, 0x9D, 0x4B, 0x02, 0x9D, 0x45, 0x02, 0xAC, 0x01, 0x02, 0xC8, 0x4C,
0xBF, 0x80, 0x29, 0x0F, 0x8D, 0x02, 0x02, 0xBD, 0x33, 0x02, 0x29, 0xF0,
0x0D, 0x02, 0x02, 0x9D, 0x33, 0x02, 0xC8, 0x4C, 0xBF, 0x80, 0x29, 0x03,
0x2A, 0x2A, 0x2A, 0x2A, 0x2A, 0x2A, 0x8D, 0x02, 0x02, 0xBD, 0x33, 0x02,
0x29, 0x3F, 0x0D, 0x02, 0x02, 0x9D, 0x33, 0x02, 0xC8, 0x4C, 0xBF, 0x80,
0x8D, 0x02, 0x02, 0xBD, 0x21, 0x02, 0xC9, 0x03, 0xD0, 0x03, 0x20, 0x61,
0x81, 0xAD, 0x02, 0x02, 0x8C, 0x01, 0x02, 0x0A, 0xA8, 0xB9, 0x29, 0x82,
0x9D, 0x39, 0x02, 0xB9, 0x2A, 0x82, 0x9D, 0x3F, 0x02, 0xAC, 0x01, 0x02,
0x20, 0x77, 0x81, 0xC8, 0x98, 0x18, 0x7D, 0x27, 0x02, 0x9D, 0x27, 0x02,
0x90, 0x03, 0xFE, 0x2D, 0x02, 0x60
];
const doNoise = [
// Offset 0x000001E1 to 0x000001F6
0xAD, 0x02, 0x02, 0x29, 0x10, 0xF0, 0x08, 0xAD, 0x02, 0x02, 0x09, 0x80,
0x8D, 0x02, 0x02, 0xAD, 0x02, 0x02, 0x9D, 0x39, 0x02, 0x60
];
const checkRest = [
// Offset 0x000001F7 to 0x0000020C
0xB1, 0x00, 0xC9, 0x5E, 0xD0, 0x07, 0xBD, 0x1B, 0x02, 0x09, 0x02, 0xD0,
0x05, 0xBD, 0x1B, 0x02, 0x29, 0xFD, 0x9D, 0x1B, 0x02, 0x60
];
const setTempPorts = [
// Offset 0x0000020D to 0x00000241
0xBD, 0x21, 0x02, 0x0A, 0x0A, 0xA8, 0xBD, 0x33, 0x02, 0x99, 0x05, 0x02,
0xA9, 0x08, 0x99, 0x06, 0x02, 0xBD, 0x39, 0x02, 0x99, 0x07, 0x02, 0xBD,
0x3F, 0x02, 0x99, 0x08, 0x02, 0xBD, 0x1B, 0x02, 0x29, 0x02, 0xF0, 0x10,
0xBD, 0x21, 0x02, 0xC9, 0x02, 0xF0, 0x04, 0xA9, 0x30, 0xD0, 0x02, 0xA9,
0x80, 0x99, 0x05, 0x02, 0x60
];
const setApu = [
// Offset 0x00000242 to 0x000002A6
0xAD, 0x05, 0x02, 0x8D, 0x00, 0x40, 0xAD, 0x06, 0x02, 0x8D, 0x01, 0x40,
0xAD, 0x07, 0x02, 0x8D, 0x02, 0x40, 0xAD, 0x08, 0x02, 0xCD, 0x03, 0x02,
0xF0, 0x06, 0x8D, 0x03, 0x40, 0x8D, 0x03, 0x02, 0xAD, 0x09, 0x02, 0x8D,
0x04, 0x40, 0xAD, 0x0A, 0x02, 0x8D, 0x05, 0x40, 0xAD, 0x0B, 0x02, 0x8D,
0x06, 0x40, 0xAD, 0x0C, 0x02, 0xCD, 0x04, 0x02, 0xF0, 0x06, 0x8D, 0x07,
0x40, 0x8D, 0x04, 0x02, 0xAD, 0x0D, 0x02, 0x8D, 0x08, 0x40, 0xAD, 0x0F,
0x02, 0x8D, 0x0A, 0x40, 0xAD, 0x10, 0x02, 0x8D, 0x0B, 0x40, 0xAD, 0x11,
0x02, 0x8D, 0x0C, 0x40, 0xAD, 0x13, 0x02, 0x8D, 0x0E, 0x40, 0xAD, 0x14,
0x02, 0x8D, 0x0F, 0x40, 0x60
];
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment