This section details some ideas about where the direction of USB-NES product development is going based on typical customer feedback.
USB-NES Terminal (Late 2022)
USB-NES Terminal is an up-and-coming firmware product and community project that will be compatible with all existing USB-NES and NES-BACKUP units. It turns USB-NES into a generic full-speed USB serial device that can be served simple text-based line commands to deposit and query data to and from the cartridge on a byte-level basis. This provides a much lower level interface to the NES cartridge interface than what is possible with the default mass-storage-class based USB-NES firmware.
With USB-NES Terminal, the know-how to detect and read out NES and Famicom boardset hardware into a monolithic .NES file is now provided by the host, stored as command-line scripts which can be managed with some kind of front end. The advantages to this system are as follows:
- The host can provide virtually limitless storage resources to store command scripts and properly identify a vast amount of NES and Famicom boardset hardware far beyond what is currently possible with the current MSC firmware.
- The intelligence (i.e., command-line scripts) required to identify and read out boardsets is open-sourced, so community members as well as customers may have the unconstrained hands-on technical access to contribute and expand the ability for USB-NES to work with new and future NES/Famicom carts.
- The USB-NES Terminal firmware will be much easier to maintain because of the simpler low-level interface and no longer require an update for every newly discovered boardset.
Example of a typical USB-NES Terminal command set is as follows:
- READ CPU_bus $ADDR, #CNT
- WRITE CPU_bus $ADDR+1, #CNT, data_stream8
- READ PPU_bus6 $ADDR+1, #CNT
- WRITE PPU_bus6 $ADDR, #CNT, data_stream8
- READ IRQ_port7
- READ NT.A10_port7
- DELAY #micro_seconds
- M2_CLOCKRATE2 [NTSC|PAL]3
- FORCEON4 [ON|OFF]
- READ SECURITY_BIN5
- WRITE FIRMWARE_BIN5, data_stream8
- WARMUP_DELAY9 #mili_seconds
- IDLE_TIMEOUT10 #mili_seconds
- The plus symbol character “+” is an optional operator that indicates the bus ADDR register is to increment its value after every byte transfer; this is typically how reading or writing a bank of data is done.
- The M2_CLOCKRATE setting determines the byte access speed of back-to-back CPU or PPU bus operations. When idling in-between commands, the cart M2 line will be clocked @ CPU $0000 to simulate a continuous monotonic clock source on M2.
- Arbitrary frequency values are not possible here due to the design of the tightly-written ASM bus-engine code.
- Forcing the power ON will keep the cartridge powered until the unit is explicitly told to turn OFF or the USB power is cut. Normally power is enabled to the cartridge when any bus access is detected and is cut after half a second of idle activity.
- The typical SECURITY.BIN and FIRMWARE.BIN files are now accessed through serial commands and serial data stream.
- M2 clocking is suspended during PPU bus access.
- Bit 0 of the data byte returned here contains the signal; all other bit positions return 0.
- Data stream consists of raw binary data immediately following an “=” (equals sign) character; otherwise it consists of big-endian-organized hexadecimal byte strings where whitespace is ignored and any illegal characters prematurely terminate any counting loop functions during a multi-byte write operation.
- Time between when the cartridge is first powered up and when initial boardset buswork requests are invoked; default is 100 mS.
- Time to cut power off following the last boardset bus access request; default is 500 mS. (only if FORCEON = OFF)
One main goal for the USB-NES Terminal project is to design a bus-access engine that will as closely as possible match the bus timings of a real NES/Famicom M2 clock line. This will ensure that any boardset sound hardware relying on the M2 line for a clock source will function properly, and allow USB-NES Terminal to double up as some sort of a synth audio device with those particular enhanced audio Famicom carts as well as any of the NES MMC5 games.
Using ARM assembly it is possible to design a bus access engine within the 40 clock cycle1 timing constraint using indirect jump tables and a lot of unrolled buswork handling routines. The engine will be monitoring the status of the serial buffer instead of using interrupts to avoid breaking the continuity of the M2 clock.
Moreover, the bus engine will be broken down into these operations per M2 cycle:
- Any NES/Famicom 8-bit bus operation and loop counting
- Any inter-word machine state and/or serial buffer data transfers
- Any 8-bits-at-a-time hexadecimal-to-binary string conversions
- Any command parameter interpretation / machine state setup
- Micro-opcode navigation
This firmware is currently under development in the BTTD Group’s laboratory, slated with a late December release date.
- Typical USB-NES STM32F103 microcontroller clocked @ 72 MHz, divided by the typical NTSC NES clock rate (1.789773 MHz).
USB-NES Twin (Expected 2023)
- Play Famicom and NES Games without any adapters on USB-NES; dual opposite-faced dust-cover door hinges expanding on original USB-NES Lite design
- Same low-profile unit dimensions and aesthetic style as original
- USB-C connectivity
- Pushbutton power switch for improved media reset control
- Deeper cartridge slot pins to resolve existing physical cart issues
- HID-compliant 1 millisecond-responsive gamepad and light-gun authentic 7-pin NES accessory support (two NES gamepad ports fully supported for now, and the 15-pin Famicom expansion port)
- Redesigned power circuit to support modern NES boardsets
- Larger file system support for NES games > 32 MB
- Improved console lamp visibility for USB + cart power LEDs
- Better file system handling and management
- Implementation of text-readable dumper scrips (Kazzo)
- 100% compatibility with original USB-NES Lite design spec
NES/Famicom Arcade (2024?)
- 100% new design; beefier micro, more GPIO
- Standalone console; plays NES/FC games itself
- Cartridge eject buttons
- Micro SD Card slot
- Built-in operating system, hardware NES emulator
- Simultaneous NES + Famicom cart slot use support
- Four NES gamepad ports supported
- HUB75E video output support (256x256x60.1 @ 21.48 MHz)
- Stereo analog output with pulse channel separation
- Stereo noise channels
- USB-MIDI for carts with expansion sound hardware????
- WS2812B LED strip lighting aesthetics for parties
- Wifi, Bluetooth (don’t ask why but it’s there anyway)