This project has one goal - a compatible re-implementation of the Famicom Disk System BIOS under an OSS license. Unlike the Famicom console itself, which has no program ROM built-in, the Famicom Disk System includes an 8 KiB PRG-ROM containing disk I/O routines, VRAM transfer routines, joypad reading code, an animation featuring Mario and Luigi when no disk is present in the drive, and more. The code, data, graphics, music, and animation contained in the original BIOS are copyrighted by Nintendo.
FreeDiskSysROM aims to provide a replacement for the original FDS BIOS that can be freely redistributed and that is capable of running all published FDS software.
Famicom and NES emulators historically require a dump of the Famicom Disk System BIOS to be able to emulate FDS titles. Emulators can ship FreeDiskSysROM with their installers instead of requiring end-users to either copy the ROM out of their own FDS hardware or breaking copyright law by downloading a BIOS rip from elsewhere on the Internet.
Modern hardware clones of the FDS RAM Adapter or FPGA re-implementations of the entire Famicom Disk System also need a BIOS.
Address | Name | # of Games | Implemented |
---|---|---|---|
$e149 | Delay131 | ✅ | |
$e153 | Delayms | ✅ | |
$e161 | DisPFObj | ✅ | |
$e16b | EnPFObj | ✅ | |
$e171 | DisObj | ✅ | |
$e178 | EnObj | ✅ | |
$e17e | DisPF | ✅ | |
$e185 | EnPF | ✅ | |
$e18b | NMI | ✅ | |
$e1b2 | VINTWait | ✅ | |
$e1c7 | IRQ | ✅ | |
$e1f8 | LoadFiles | ||
$e237 | AppendFile | ||
$e239 | WriteFile | ||
$e2b7 | CheckFileCount | ||
$e2bb | AdjustFileCount | ||
$e301 | SetFileCount1 | ||
$e305 | SetFileCount | ||
$e32a | GetDiskInfo | ||
$e3da | AddYtoPtr0A | ||
$e3e7 | GetHardCodedPointers | ||
$e3ea | GetHardCodedPointersWriteProtected | ||
$e445 | CheckDiskHeader | ||
$e484 | GetNumFiles | ||
$e492 | SetNumFiles | ||
$e4a0 | FileMatchTest | 0 | |
$e4da | SkipFiles | 0 | |
$e4f9 | LoadData | ||
$e506 | ReadData | ||
$e5b5 | SaveData | ||
$e64d | WaitForDriveReady | ||
$e685 | StopMotor | ||
$e68f | CheckBlockType | ||
$e6b0 | WriteBlockType | ||
$e6e3 | StartXfer | ||
$e706 | EndOfBlockRead | ||
$e729 | EndOfBlkWrite | ||
$e778 | XferDone | ||
$e794 | Xfer1stByte | ||
$e7a3 | XferByte | ||
$e7bb | VRAMStructWrite | ✅ | |
$e844 | FetchDirectPtr | ✅ | |
$e86a | WriteVRAMBuffers | ✅ | |
$e8b3 | ReadIndividualVRAMBytes | ✅ | |
$e8d2 | PrepareVRAMString | ✅ | |
$e8e1 | PrepareVRAMStrings | ✅ | |
$e94f | GetVRAMBufferByte | ✅ | |
$e97d | Pixel2NamConv | ✅ | |
$e997 | Nam2PixelConv | ✅ | |
$e9b1 | Random | ✅ | |
$e9c8 | SpriteDMA | ✅ | |
$e9d3 | CounterLogic | ✅ | |
$e9eb | ReadPads | ✅ | |
$ea1a | ReadDownPads | ✅ | |
$ea1f | ReadOrDownPads | ✅ | |
$ea36 | ReadDownVerifyPads | ✅ | |
$ea4c | ReadOrDownVerifyPads | ✅ | |
$ea68 | ReadDownExpPads | ✅ | |
$ea84 | VRAMFill | ✅ | |
$ead2 | MemFill | ✅ | |
$eaea | SetScroll | ✅ | |
$eafd | JumpEngine | ✅ | |
$eb13 | ReadKeyboard | 0 | |
$ebaf | LoadTileset | ✅ | |
$ec22 | unk_EC22 | ||
$ee17 | StartMotor |
To build, use asm6f.
asm6f freedisksys.asm
The -l
flag is very useful for development - it shows the addresses assigned
to each instruction, so you can easily see how much room remains for a given
subroutine.
Rules:
- Do not even look at a disassembly of the original FDS BIOS.
- Only contribute code to which you hold the copyright or which is already under a compatible license.
FreeDiskSysROM is licensed under the GNU LGPL v3. The intent in using this license is to allow anyone to replace the 8 KiB official FDS BIOS with FreeDiskSysROM, whether for commerical or non-commercial purposes, so long as the source of FreeDiskSysROM (including any modifications) is made available to the end-user under the same license.
Although the Famicom does not have an OS or any concept of dynamic linking, the FDS BIOS is analogous to a system library in practice. FDS titles, FDS emulators, and FDS clone systems are all permitted to utilize FreeDiskSysROM without regard to or changes to the licenses of their own code.