NSF2: Difference between revisions
Rainwarrior (talk | contribs) (i will update this very soon, but leaving a note just to make it clear the current article isn't up to date) |
Rainwarrior (talk | contribs) (WIP draft, still need to describe IRQ and non-returning INIT) |
||
Line 2: | Line 2: | ||
[[Category:File formats]] | [[Category:File formats]] | ||
''' | '''NSF2''' is an extension of the [[NSF]] file format, first publicly implemented in 2019, with the following additions: | ||
* Backward compatibility with the original NSF format where the new features are optional. | |||
* Extensible metadata through incorporation of the [[NSFe]] format, of both optional and mandatory varieties. | |||
* A programmable timer IRQ, as well as explicit access to the existing [[APU DMC|DMC]] and [[APU Frame Counter|Frame Counter]] IRQ devices. | |||
* An alternative non-returning INIT paradigm for playback. | |||
== File Format == | |||
This header is the same as the original [[NSF#Header Overview|NSF header]], but with the following additions: | |||
offset # of bytes Function | |||
---------------------------- | |||
$005 1 BYTE Version number, equal to 2 | |||
$07C 1 BYTE [[#Flags|NSF2 flags]] | |||
bits 0-3: reserved, must be 0 | |||
bit 4: if set, this NSF may use the [[#IRQ Support|IRQ support]] features | |||
bit 5: if set, the [[#Non-Returning INIT|non-returning INIT]] playback feature will be used | |||
bit 6: if set, the [[#Suppressed PLAY|PLAY subroutine]] will not be used | |||
bit 7: if set, the appended [[#Metadata|NSFe metadata]] may contain a mandatory chunk required for playback | |||
$07D 3 BYTES 24-bit length of the NSF program data, allowing [[#Metadata|metadata]] to follow the data | |||
If a non-zero value appears in $7D-7F, NSFe [[#Metadata|metadata]] may be appended to the file immediately following the end of the data. | |||
Non-mandatory metadata is available even in the original [[NSF|version 1 NSF]] by using these bytes to indicate a data length, | |||
but older players will assume that this metadata is part of the program ROM. | |||
Since NSF playback is mostly deterministic, it's reasonable to ensure that misinterpreted appended data isn't used by the NSF | |||
and won't harm playback. For this reason if the metadata is optional information (e.g. track names), | |||
and no other NSF2 features are required, it may be preferable to leave the version as 1. | |||
If the file version is 1, any flags in byte $7C should be ignored. | |||
== IRQ Support == | |||
Still being written, see reference below. | |||
== | == Non-Returning INIT == | ||
Still being written, see reference below. | |||
== Suppressed PLAY == | |||
If this bit is set, the PLAY routine will never be called. This is mostly intended for use with the non-returning INIT feature, allowing it to continue uninterrupted. | |||
Hardware player implementations may reserve the need to still execute brief NMI interruptions during non-returning INIT, even if suppressed, to allow its player program to remain responsive to user interaction. Ideally, however, the non-returning INIT should not be interrupted at all if PLAY is disabled. | |||
This bit does not by itself imply NMI-driven PLAY, even though the non-returning INIT does. | |||
This | |||
== Metadata == | == Metadata == | ||
Optional metadata may be appended immediately following the data. It appears at a file offset of the 24-bit data length at $7D-7F (little-endian) plus $80 for the length of the NSF header. | |||
It is identical to the format described at [[NSFe]], but with the following differences: | |||
* | * There is no 'NSFE' fourCC at the start of the NSF2 metadata. The first byte begins the first contained chunk header. | ||
* Chunks that are already part of the NSF format must not be included. 'INFO', 'DATA', 'BANK' and 'NSF2' chunks should not be used. | |||
The 'RATE' and 'regn' chunks, while partially redundant, may be included to provide additional Dendy region playback information. The redundant parts should match with the NSF header. | |||
If bit 7 of header byte $7C is set, parsing the metadata becomes ''mandatory''. This means that the appended metadata contains a mandatory chunk, indicated by a fourCC of capital letters, that must be parsed and understood by the player to be able to play back the file. | |||
The mandatory bit is intended for cases where extra information may be needed for correct emulation. Examples: | |||
* A 'VRC7' chunk can be used to substitute VRC7 with the related but not compatible YM2413 chip. | |||
* A chip with embedded sample data could be provided in an appropriate chunk. | |||
This format | This mandatory indication allows future expansion to the format without having to redefine the NSF header. | ||
== Reference == | == Reference == | ||
* [//forums.nesdev.org/viewtopic.php?f=6&t=7304 NSF 2.0 forum discussion] - original proposal | * [//forums.nesdev.org/viewtopic.php?f=6&t=7304 NSF 2.0 forum discussion] - original proposal | ||
* [//forums.nesdev.org/viewtopic.php?f=6&t=17704 2018 forum discussion] - updated proposal | * [//forums.nesdev.org/viewtopic.php?f=6&t=17704 2018 forum discussion] - updated proposal |
Revision as of 04:35, 3 March 2019
NSF2 is an extension of the NSF file format, first publicly implemented in 2019, with the following additions:
- Backward compatibility with the original NSF format where the new features are optional.
- Extensible metadata through incorporation of the NSFe format, of both optional and mandatory varieties.
- A programmable timer IRQ, as well as explicit access to the existing DMC and Frame Counter IRQ devices.
- An alternative non-returning INIT paradigm for playback.
File Format
This header is the same as the original NSF header, but with the following additions:
offset # of bytes Function ---------------------------- $005 1 BYTE Version number, equal to 2 $07C 1 BYTE NSF2 flags bits 0-3: reserved, must be 0 bit 4: if set, this NSF may use the IRQ support features bit 5: if set, the non-returning INIT playback feature will be used bit 6: if set, the PLAY subroutine will not be used bit 7: if set, the appended NSFe metadata may contain a mandatory chunk required for playback $07D 3 BYTES 24-bit length of the NSF program data, allowing metadata to follow the data
If a non-zero value appears in $7D-7F, NSFe metadata may be appended to the file immediately following the end of the data.
Non-mandatory metadata is available even in the original version 1 NSF by using these bytes to indicate a data length, but older players will assume that this metadata is part of the program ROM. Since NSF playback is mostly deterministic, it's reasonable to ensure that misinterpreted appended data isn't used by the NSF and won't harm playback. For this reason if the metadata is optional information (e.g. track names), and no other NSF2 features are required, it may be preferable to leave the version as 1.
If the file version is 1, any flags in byte $7C should be ignored.
IRQ Support
Still being written, see reference below.
Non-Returning INIT
Still being written, see reference below.
Suppressed PLAY
If this bit is set, the PLAY routine will never be called. This is mostly intended for use with the non-returning INIT feature, allowing it to continue uninterrupted.
Hardware player implementations may reserve the need to still execute brief NMI interruptions during non-returning INIT, even if suppressed, to allow its player program to remain responsive to user interaction. Ideally, however, the non-returning INIT should not be interrupted at all if PLAY is disabled.
This bit does not by itself imply NMI-driven PLAY, even though the non-returning INIT does.
Metadata
Optional metadata may be appended immediately following the data. It appears at a file offset of the 24-bit data length at $7D-7F (little-endian) plus $80 for the length of the NSF header.
It is identical to the format described at NSFe, but with the following differences:
- There is no 'NSFE' fourCC at the start of the NSF2 metadata. The first byte begins the first contained chunk header.
- Chunks that are already part of the NSF format must not be included. 'INFO', 'DATA', 'BANK' and 'NSF2' chunks should not be used.
The 'RATE' and 'regn' chunks, while partially redundant, may be included to provide additional Dendy region playback information. The redundant parts should match with the NSF header.
If bit 7 of header byte $7C is set, parsing the metadata becomes mandatory. This means that the appended metadata contains a mandatory chunk, indicated by a fourCC of capital letters, that must be parsed and understood by the player to be able to play back the file.
The mandatory bit is intended for cases where extra information may be needed for correct emulation. Examples:
- A 'VRC7' chunk can be used to substitute VRC7 with the related but not compatible YM2413 chip.
- A chip with embedded sample data could be provided in an appropriate chunk.
This mandatory indication allows future expansion to the format without having to redefine the NSF header.
Reference
- NSF 2.0 forum discussion - original proposal
- 2018 forum discussion - updated proposal