Last active
March 2, 2024 17:57
-
-
Save bobbicodes/7c8f8ceb6f91a99a0b20627aabc26dee to your computer and use it in GitHub Desktop.
NSF Driver - Assembles an NES ROM from music data
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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