dusting off the NES

NES mini
About the 72 pin ZIF connector
Dealing with the 72 pin connector
- Blowing on cartridges
- Cleaning cartridges
- Game Geine
- New aftermarket 72 pin ZIF connector
- Blinking Light Win
- NESedge
- Making an NES CIC
Upconversion
Everdrive N8 pro
Light-GunVerter

I don't care about any of this, just take me to the info for the final design of the NESedge
[Picture of NES mini]

NES mini

In November 2016, Nintendo released the Nintendo Entertainment System: NES Classic Edition in the US and the Nintendo Classic Mini: Nintendo Entertainment System in Europe. My wife was excited that she found the perfect Christmas gift, and asked me if I wanted to get one. I said nope, and 20 minutes later I had found and brought up my original NES-001 from my childhood.

About the 72 pin ZIF connector

[Picture of NES 72 pin connector] I had forgotten how annoying it was when the 72 pin Zero Insert Force (ZIF) connector wouldn't line up just right with the cartridge. The NES-001 has a hinged flap, with a front loading 72 pin Zero Insertion Force (ZIF) connector. The NES was modeled to look like VCR in line with it being branded as an "entertainment system" rather than a game console. This why it was also sold with R.O.B. the Robotic Operating Buddy to further distinguish it from game consoles.

This is very different than the Famicom, its Japanese cousin, that has a top loading 60 pin edge connector and two fixed controllers (one of which has a microphone). The new ZIF connector was used due to fear of static electricity shorting out consoles in some of the more arid parts of the US.
https://www.nintendolife.com/news/2020/02/nes_creator_reveals_the_shocking_story_behind_that_infamous_flap

The NES ZIF connecter was widened from 60 pins to 72 pins in order to allow for an additional four pins to support the 10NES, a Checking Integrated Circuit (CIC) lockout chip which would prevent unlicensed cartridges from working on the NES. This was added because it was widely thought that the Atari 2600 failed due to the large number of poor quality "unauthorized" third party games. The additional 10 pins were added to provide the cartridge direct access to the accessory port. Nintendo intended on releasing a disk drive, and a modem, as well as other peripherals, but never did. This is another departure from the Famicom that had many accessories including: Famicom Disk system, Famicom 3D System, Data Recorder (tape drive), Fami-Corder (writing games onto blank carts), Karaoke Studio, StudyBox (a small tape player by Fukutake Publishing Co, LTD.).
https://famicomworld.com/system/other/

Famicom also had systems integrated into TVs such as the Sharp C1 and its successor, the stand alone Sharp Tilter, and the Famicom box which was a system made for hotels where a player could play one of fifteen titles for 10 to 20 minutes for 100 Yen.
http://kevtris.org/mappers/famicombox/

Dealing with the 72 pin connector

Blowing On the Cartridge

Apparently blowing on the cartridge doesn't help, and just ends up getting the contacts wet, which encourages corrosion. So I bought a Nintendo screwdriver, opened the cartridges and cleaned the contacts with an eraser, a Q-tip, and alcohol. That helped a bit. I also tried my old trick of putting the cartridge in just a tiny bit too shallow so it hits the front part of the tray as you push down. (By the way this is also not a good idea as it tends to bend the pins on the 72 pin ZIF connector out of alignment.)

Game Genie

All of this still had mixed results, so I finally resorted to using a Game Genie. Although the Game Genie was successful, it is also not recommended. First the printed circuit board of the Game Genie is thicker than a Nintendo cartridge, and secondly you end up wedging the Game Genie and cartridge in at an angle. Both of these put extra wear and tear on the 72 pin ZIF, and cause more bent pins.

[Picture of NES connector on Aliexpress]

New aftermarket 72-pin connector

You can buy a reproduction 72 pin ZIF connector fairly easily, and simply replace the connector with the bent pins with a new connector. Many of the reproduction connectors are too tight and work without needing to push the cartridge down, and make it difficult to extract the cartridge from the connector's death grip.

Some of these are a Shen Zen special, which are often made from lower quality steel and don't last as long as the original connector, so be sure to keep your original connector if you go this route.

Boiling the Connector

[Picture of NES connector on Aliexpress] Simply find an old pot that you no longer use for cooking, fill it with water and your 72 pin connector and bring it to a rolling boil for 20-30 minutes. This will not only clean the pins, but also bring some of the more minor bent pins back into their original configuration. Remember to allow it to fully dry prior to reinstalling it.

Manual Cleaning

If boiling doesn't work, you can always try a manual approach with some Q-Tips, Isopropyl alcohol, and some dental picks to carefully straighten and lift up the pins. Often this method will result in pins that grip too tightly on the cartridge.

Design Flaw

Neither a new connector, nor boiling, nor manual cleaning and bending will fix the original design flaw of the 72 pin ZIF connector. First when the cartridge is pressed down it places force on the pins which will eventually cause them to wear out and bend. Second without the insertion and extraction friction, the pins of the connector and the cartridge do not get cleaned. One way to solve this problem is to simply replace the 72 pin ZIF connector with a 72 pin edge connector.

[Picture of Blinking Light Win]

Blinking Light Win

Blinking Light Win is a small circuit board with two 72 pin edge connectors, one to connect to the NES mainboard and the other for connecting the cartridge. The existing spring loaded cartridge tray is removed, and a new plastic tray is installed which allows the cartridge to slide flat into the edge connector. For good measure, a CIC chip is directly added to the connector so that mis-timing of the lock and key does not cause resets. As a bonus, you can also play unliscensed cartridges. The final touch is a sticker that says "Keep calm and don't press down".

There are many reports of of the Blinking Light Win having a death grip on the cartridge, and many have reported an inability to remove their cartridge. The first run had a edge connector that was way to tight. The second run was much better. The cartridges take a significant amount of force but are not hard to remove.

It works extremely well, but...
Between not pushing down, and the plastic not feeling quite right, it hits me squarely in the middle of my nostalgia and undermines the reason to play on an authentic console as opposed to an emulator.

Also, it is not currently in production so you can only buy it second hand at extraordinarily high prices. Normally it sells from ArcadeWorks for $30.00. It was last available in 2020. When it does come in stock, they tend to only make 1-2 dozen a quarter.
https://www.arcadeworks.net/products/blw?variant=36483581116569I

NESedge

Surely someone has figured out how to mount an edge connector in the moving NES cartridge tray. I searched and searched and could not find one.

[Picture of NES with edge conneaector] I did find one example of an NES with an edge connector, but it seems the owner has no plans of mounting the connector in the console, as they are only interested in playing a single game. This attempt was successfully completed after I had already produced the NESedge.
reddit post

[Picture of NES with edge conneaector] Then there is this gem that was purchased from Goodwill. It has an edge connector that is way too small in depth, and is mounted with screws that further prevernt the cart from being inserted all the way in. It also prevents the cartridge tray from being able to be pushed down.

Luckily, this failed attempt was made after I had already produced the NESedge, so it did not discourage me.
reddit post


[Picture of NES Toaster inside] Which proved that an edge connector would function when connected to the NES mainboard with 22 AWG solid-core wire. So I got inspired... and set to thinking about how to make a better NES 72 pin connector.

My requirements were: [Picture of NES tray with front removed I managed to meet all the requirements, but sadly I needed to trim away most of the front part of the cartridge tray to make room for the edge connector.
The ZIF connector is about half as tall as the edge connector. In order to make room for the larger edge connector, I had to cut away almost all of the bottom front flap of the cartridge tray.
[Picture of NES tray with front removed I used a small serrated knife to cut a vertical slice about 9 mm from the edge on each side. I cut the slice just 1mm short of the bottom. I then used a dremel with a rotery blade to cut horrizontally between the vertical slices. This left a 1mm lip across the front of the cartridg tray. Lastly I sanded down the cut edges.

[Picture of NES plate] [Picture of two part NES plate] I started by 3D printing a panel that slipped into the metal slot on top of the cartridge tray. I then began to design legs that would extend down and trap the edge connector between it and the moving part of tray. I tried a few designs but in the end concluded I was not going to be able to reinstall the moving part of the tray and the arms without cutting away the tray's top support bar. I even tried to add an up slanting part to the top plate to get up and over the tray's top support bar. There simply wasn't enough space between the cartridge tray's top support bar and the cartridge tray's bottom front for a clip that moves with the tray.
[Picture of NES U clip]
I then started to design a U shaped metal clip that would slip down over the hinge pin in between the moving and fixed part of the tray. I made some mock ups out of thin plastic, again the space between the cartridge tray's top and bottom supports left a small and flimsy bracket.

[Picture of NES bracket w/ 90 degree ribbon cable connector] I finally had the idea to make a bracket that would simply trap a free floating edge connector up against the rounded edge of the moving part of the tray. The first design had little spring rockers, but the springs were so small that they did not print well. Initially I also had a large opening on the back at the top, leaving space for the pins to stick out of the bottom side of the PCB, and a hole on the bottom anticipating a 90 degree connector to accept a ribbon cable.

[Picture of NES bracket 180 degree ribbon cable connector] It turned out that the edge connector to the NES mainboard did not leave enough clearance for a 90 degree connector, so I ended up making the hole for the ribbon connector on the bottom of the back, and adding a small plate for support on the top covering the opening for the pins that extend beyond the PCB. I made about 16 revisions, getting the holes in just the right place, lengthening the front to back dimension so that it sits flush with the cartridge tray, and thickening the top cross bar for strength, cutting out notches for the hinging mechanism on the cartridge tray, and lengthening the front to back dimension of the top bar to act as a stop and keep the connector from moving upward more than the required 6 degrees. I made a prototype of the connector and the board and printed it on the 3D printer.

I designed the PCB boards in Eagle CAD. I made a tiny PCB with the 72 pin edge connector (facing the cartridge) and a 72 pin shrouded header for a ribbon cable. I made a larger PCB with a 72 pin edge connector (facing the NES mainboard), and a 72 pin shrouded header for the ribbon cable. I also added an ATtiny13A for the 10NES CIC chip. I also added a status LED for the CIC programming status, and the appropriate resistor so that light (and not smoke comes out of the LED). I added a jumper block to select if the local / cartridge / both CICs are connected.

I also added a 74K Ohm resistor for mixing the Famicom and NES audio. Since there is no standard pin for mixing the Famicom and NES audio I added a jumper block to select which pin carries the Famicom Audio and which pin carried the NES audio. The PCB has the markings for the typically used pins, expansion pin 6 for Famicom audio and expansion pin 9 for NES aux audio in. I have another jumper block to choose mixing the Famicom and NES audio with or without a 47K Ohn resistor.
Note: if you have already modified the console to support Famicom audio, do not place jumpers on any of these pins.

Lastly I added a 2x10 jumper block with one side representing the expansion pins 0-9 on the cartridge and the other side representing expansion pins 0-9 on the console. This allows for maximum flexibility to isolate expansion port pins from the cartridge, or remap expansion port pins between the cartridge and console.
Note: under normal conditional these pins are just jumpered together.

I used a Kingworld 72 pin edge connector. I had to measure the overall size of the connector, the size and location of the holes, and the placement of the pins in order to make the part in an Eagle CAD library. I built the part, printed out its footprint on paper, and crammed the pins through the paper. It was a perfect fit. Unfortunately I got the pins backward. I had referenced the following information:

Cart Pinouts
https://wiki.nesdev.com/w/index.php/Cartridge_connector
NES
              -------
      +5V -- |36   72| -- GND
 CIC toMB <- |35   71| <- CIC CLK
CIC toPak -> |34   70| <- CIC /RST
   PPU D3 <> |33   69| <> PPU D4
   PPU D2 <> |32   68| <> PPU D5
   PPU D1 <> |31   67| <> PPU D6
   PPU D0 <> |30   66| <> PPU D7
   PPU A0 -> |29   65| <- PPU A13
   PPU A1 -> |28   64| <- PPU A12
   PPU A2 -> |27   63| <- PPU A10
   PPU A3 -> |26   62| <- PPU A11
   PPU A4 -> |25   61| <- PPU A9
   PPU A5 -> |24   60| <- PPU A8
   PPU A6 -> |23   59| <- PPU A7
CIRAM A10 <- |22   58| <- PPU /A13
  PPU /RD -> |21   57| -> CIRAM /CE
    EXP 4    |20   56| <- PPU /WR
    EXP 3    |19   55|    EXP 5
    EXP 2    |18   54|    EXP 6
    EXP 1    |17   53|    EXP 7
    EXP 0    |16   52|    EXP 8
     /IRQ <- |15   51|    EXP 9
  CPU R/W -> |14   50| <- /ROMSEL (/A15 + /M2)
   CPU A0 -> |13   49| <> CPU D0
   CPU A1 -> |12   48| <> CPU D1
   CPU A2 -> |11   47| <> CPU D2
   CPU A3 -> |10   46| <> CPU D3
   CPU A4 -> |09   45| <> CPU D4
   CPU A5 -> |08   44| <> CPU D5
   CPU A6 -> |07   43| <> CPU D6
   CPU A7 -> |06   42| <> CPU D7
   CPU A8 -> |05   41| <- CPU A14
   CPU A9 -> |04   40| <- CPU A13
  CPU A10 -> |03   39| <- CPU A12
  CPU A11 -> |02   38| <- M2
      GND -- |01   37| <- SYSTEM CLK
             ---------
https://wiki.nesdev.com/w/index.php/CIC_lockout_chip_pinout
ATtiny13A pinout

                       --------
                       |*     |
                       |1    8| ---------- +5V NES 36
NES 71- CLK----------<-|2    7|->----/RESET -- NES 70
NSE 1 - GND -- LED-----|3    6|-<---/DATAIN -- NES 34
NES 1 - GND -----------|4    5|->--/DATAOut -- NES 35
                       --------

+5V, GND, and reset should connect to cart
the diagram has the accompanying text:
"On a front-loader, pins 01-36 are the top side of the connector. Pins 36-01 are on the label side of the cartridge, left to right."

I imagined holding the cartridge, label side up about to slide it into the NES-001 and put pin 36 as the left most pin on the top counting down to pin 1. Unfortunately it was not obvious to me that the description meant you should be holding the cartridge like you are reading the label, not like you are about to place it into the console.

I got the first board, version 1.3.1f, and soldered and resoldered and resoldered the connectors and couldn't seem to make it work (because the pins were reversed). I programed and reprogrammed and programmed again the Attiny13A. After a month of fiddling, and continuity testing every pin, I got the bright idea that maybe I had the pins swapped. I got my nintendo screwdriver, cracked open a cartridge and read the numbering off the PCB board, and confirmed my suspicion. I had reversed the numbering from left to right.
[NESedge-v1.3.1f PCB front side] [NESedge-v1.3.1f PCB back side]
[NESedge-v1.3.1f cart PC ] I had planned the boards prior to ordering any parts, so I referenced an IDE ribbon cable I had lying around. I noticed the bump was on the same side of both connectors and concluded that the cable was straight through. The ribbon cable comes out the back of the first PCB, goes behind the second PCB, wraps around it and plugs in on the far side. I had convinced myself that because the ribbon cable wraps a round, that the top and bottom are inverted. While this is strictly speaking true, it means the bump, and ordering of the rows, will be the same and not inverted as I had planned. Some how I missed the fact that a straight through IDE ribbon cable does have a bump on the same side, but when you fold it over into a U shape, the bumps are oppsite of each other.

So not only did I get the connector inverted left to right, but I also flipped the top and bottom row. That meant I could test the board facing the NES mainboard by plugging it in upside down. Sure enough the the board worked and the CIC made its hand shake and I got a solid red light on the console.

There was another issue, while the board certainly wouldn't fit inverted, it also wouldn't fit in the correct orientation. While I had printed on card stock and ensured it would fit in the available space, I never though to try and put the EMF shield on, and sure enough that was hitting the top left corner of the board facing the NES mainboard.

So I regrouped, made a new set of boards V2 with the pins in the right place. I changed the ordering of the pins on the 72 pin edge connector in my Eagle CAD library, and applied the updated part to the circuit. The traces were a jumble, so I deleted all those traces and redrew them.
[NESedg v2 PCB front] [NESedg v2 PCB back]
Finally I got this board fabrcated, and installed and the 10NES CIC made its handshake, but all I got was a green screen, like it was not seeing the cartridge at all. After continuity testing, I still could not figure out the issue. I was beginning to feel defeated, then I compared my circuit to the Blinking Light Win. One of the things I did differently was to tie pin 1 and pin 72 together since they were both ground. I grabbed a dental pict and vigorously scratched a groove separating pin 1 and 72 on both PCBs, and with that simple modification it worked.

[NESedg v2 PCB front] [NESedg v2 PCB back]
[Picture of NESdge bent jumper pins] Unfortunately the jumper block for the expansion port plug board had one row that was hitting a post that holds the NES mainboard. Since this pin is unused, it didn't matter that the jumper pin was bent and the jumper clip ripped off. I made two simple changes in version 3, relocating the expansion port jumper block,and separating pins 1 and 72.
[Picture of NES bracket w/ 6 degree uprights]
I used version 2 for quite a while. The only issue was there was not enough clearance to push down the Everdrive Pro cartridge without momentarily catching on the reset button and/or the micro SD card that stick out an extra 1 mm.

So when I finally got around to ordering the new board in order to make a connector for a friend, I, yet again, redesigned the bracket changing the uprights to be 1 mm thinner and to have a 6 degree slant.

[NESedge logo] The final version of the NESedge is version 3. The NESedge connctor is farily expensive at about $95.00.
This reflects pricing increases due to supply chain issues as of April 2022.
The high cost is primarily drivn by the 72-pin ribbon cable that at last check was priced at $25.00. The shrouded riser that the ribbon cable plugs into was prices at $13.00 each at last check. Those three parts account for more than half the price of the connector.

The 72-pin ribbon cable is a non-stocked item and can be ordered from mouser.com with a 16-week lead time. I have a few ribbon cables on order and expect them around the end of July 2022.

I am currently investigating lower priced options such as the Sumida PANTA flex jumpers, but it seems like I would need to secure about 100 pre-orders to make this cost effective.
[NESedg v3 PCB front] [NESedg v3 PCB back]
[NESedg v3 cart PCB] [NESedg v3 cart PCB in bracket]


If you you would like to pre-order an NESedge connector, click here

If you would like to make your own:
You will also need the following parts:
vendor Part number Quantity Board label Dscription URL
OSHpark NESedge-v3-mb-2021-12-28 1 NESedge circuit board that connects to the NES mainboard https://oshpark.com/shared_projects/j9K7wmCq
OSHpark NESedge-v3-cart 1 NESedge circuit board that connects to the NES cartridge https://oshpark.com/shared_projects/jmgx1wnL
Samtec HCSD-36-D-05.00-01-N-G-P72 1 connects to JB1-mb, JB1-cart IDC ribbon cable, 72-pin, dual row, straight through, 4 inch, 2.54 pitch https://www.mouser.com/ProductDetail/200-IDSD36D0400G
Samtec TST-136-02-G-D 2 JB1-mb, JB1-cart 72-pin, dual row, shrouded, IDC PCB header 2.54mm pitch, through hole https://www.mouser.com/ProductDetail/200-TST13602GD
Kingworld 32827561164 2 EC1-mb, EC1-cart 72-pin, dual row, edge connctor 2.50mm pitch, through hole https://www.aliexpress.com/item/32827561164.html
TE Connectivity 5-146269-1 1 J1 4-pin, dual row, (2x2) straight, through hole, 2.54mm pitch header https://www.mouser.com/ProductDetail/571-5-146269-1
TE Connectivity 826632-5 2 J2-J3 10-pin, dual row, (5x2) straight, through hole, 2.54mm pitch header https://www.mouser.com/ProductDetail/571-826632-5
TE Connectivity 826632-5 5 J4-J8 6-pin, dual row, (3x2) straight, through hole, 2.54mm pitch header https://www.mouser.com/ProductDetail/649-77313-101-06LF
TE Connectivity 826632-5 1 J9 20-pin, dual row, (10x2) straight, through hole, 2.54mm pitch header https://www.mouser.com/ProductDetail/649-77313-118-10LF
Vishay / Beyschiag MBA02040C4702FRP00 1 R1 1/8 watt Metal Film Resistor, Through Hole 0.4watt 47KOhms 1% 3.6mm long https://www.mouser.com/ProductDetail/594-5063JD47K00FT
Vishay / Beyschiag RN55D3300FB14 1 R2 1/8 watt Metal Film Resistor, 330 Ohm 1%m Resistor, Through Hole 0.4watt 47KOhms 1% 3.6mm long https://www.mouser.com/ProductDetail/71-RN55D3300F
VRLite-On LTL17KTBS3KS 1 LED1 Standard LEDs - Through Hole Blue/ Water Clear 464-476nm1500mcd https://www.mouser.com/ProductDetail/859-LTL17KTBS3KS
Mill-Max 110-41-308-41-001000 1 IC1 IC & Component Sockets 8 PIN SKT 200u Sn https://www.mouser.com/ProductDetail/575-11041308410010
Microchip Technology / Atmel ATTINY13A-PU 1 IC1 8-bit Microcontrollers - MCU 1KB In-system Flash 20MHz 1.8V-5.5V hhttps://www.mouser.com/ProductDetail/556-ATTINY13A-PU

You will also need an AVR programmer to load the CIC code on the ATtiny13a-pu chip.
I used the Adafruit USBtinyISP AVR v2.0 at last check, it was only $22.00, but soldering and assembly is required.
You will also need a small breadboard and some male jumpers.

Making an NES CIC

Download latest version of NES avrciczz for AVR MCU from github https://github.com/krikzz/avrciczz (Oct 19, 2021)

Install avrdude

Flash the ATtiny13A with your pocket AVR

  • Wire up the pocket AVR to the ATtiny13A
    ATtiny13A Pin AVR pin purpose
    1 5 Reset
    2 not connected
    3 not connected
    4 6 Ground
    5 4 MOSI
    6 1 MISO
    7 3 SCK
    8 2 VCC

avrdude -c usbtiny -p t13
avrdude: AVR device initialized and ready to accept instructions
Reading | ################################################## | 100% 0.01s
avrdude: Device signature = 0x1e9007 (probably t13)
avrdude: safemode: Fuses OK (E:FF, H:FF, L:6A)
avrdude done. Thank you.

avrdude -c usbtiny -p t13 -U flash:w:avrciczz.elf:e
avrdude: AVR device initialized and ready to accept instructions

Reading | ################################################## | 100% 0.01s

avrdude: Device signature = 0x1e9007 (probably t13)
avrdude: NOTE: "flash" memory has been specified, an erase cycle will be performed
To disable this feature, specify the -D option.
avrdude: erasing chip
avrdude: reading input file "avrciczz.elf"
avrdude: writing flash (912 bytes):

Writing | ################################################## | 100% 0.80s

avrdude: 912 bytes of flash written
avrdude: verifying flash memory against avrciczz.elf:
avrdude: load data flash data from input file avrciczz.elf:
avrdude: input file avrciczz.elf contains 912 bytes
avrdude: reading on-chip flash data:

Reading | ################################################## | 100% 1.94s

avrdude: verifying ...
avrdude: 912 bytes of flash verified

avrdude: safemode: Fuses OK (E:FF, H:FF, L:6A)

avrdude done. Thank you.

avrdude -c usbtiny -p t13 -U lfuse:w:0x70:m -U hfuse:w:0xfb:m
avrdude: AVR device initialized and ready to accept instructions

Reading | ################################################## | 100% 0.01s

avrdude: Device signature = 0x1e9007 (probably t13)
avrdude: reading input file "0x70"
avrdude: writing lfuse (1 bytes):

Writing | ################################################## | 100% 0.02s

avrdude: 1 bytes of lfuse written
avrdude: verifying lfuse memory against 0x70:
avrdude: load data lfuse data from input file 0x70:
avrdude: input file 0x70 contains 1 bytes
avrdude: reading on-chip lfuse data:

Reading | ################################################## | 100% 0.00s

avrdude: verifying ...
avrdude: 1 bytes of lfuse verified
avrdude: reading input file "0xfb"
avrdude: writing hfuse (1 bytes):

Writing | ################################################## | 100% 0.02s

avrdude: 1 bytes of hfuse written
avrdude: verifying hfuse memory against 0xfb:
avrdude: load data hfuse data from input file 0xfb:
avrdude: input file 0xfb contains 1 bytes
avrdude: reading on-chip hfuse data:

Reading | ################################################## | 100% 0.00s

avrdude: verifying ...
avrdude: 1 bytes of hfuse verified

avrdude: safemode: Fuses OK (E:FF, H:FB, L:70)

avrdude done. Thank you.

Upconversion

So you want to play your NES on a modern high definition television? That is a bit of a complicated proposition. The NES outputs NTSC 240p composite video. If your TV has a composite video in, then this is likely mistakenly interpreted as 480i, as a result you get a nice clear image when things are not moving, but when things move, you get the scan lines of the even frame interlaced with scan lines of the odd frame, causing a jagged edge. Literally every other line is one frame behind. RetroRGB has a nice write up on this problem at:
https://www.retrorgb.com/240p.html.

[Picture of NES bracket w/ 6 degree uprights] If you are looking for an inside the console solution, then Kevtris Hi-Def NES is probably what you want:
https://www.game-tech.us/product/hi-def-nes/
It has a hi-def daughter board that fits under the RF module in the front loader NES-001, that connects via two ribbon cables to the shim PCB that sits between the PPU and GPU and the NES mainboard. It adds an HDMI port just below the RF out port. It is priced at just under $200. There are two draw backs to this solution, first at the current time, it is sold out. Second, If you want to upscale more than one game system, each system will need its own upscaler.

There is also an RGB version. NES-RGB.
[Picture of NES bracket w/ 6 degree uprights]
If you are looking for an external upscaler the RetroTINK-5X Pro is an easy to use, FPGA based upscaler, that supports composite video, component video, RGB, and s-video. It line doubles 240p with zero lag, and can autodetect 240p and 480i, and also supports 288p/576i, 480p, and chroma-limited 720p and 1080i. Simply set the input type composite/componet/RGB/s-video/SCART and plug any game console in and play. You can also resize, stretch or crop the video to fill an HD-TV, as well as mask the unused screen (including over write pixels). There are also some image finishing options, like simulating a CRT, or interpolating and smoothing pixels. The RetroTINK-5x Pro is $300. As a cheaper alternative the RetroTink-2x series will also work (as long as they accept composite video in), but the hardware is not FPGA based, and there is not likely to be future development of these platforms.
RetroTINK-5x pro.
[Picture of rad2x cable]
Other alternatives include RAD2x cables which are basically a purpose built RetroTink-2x, just make sure it is the one with composite video in.
https://www.retrorgb.com/unveiling-the-rad2x-hdmi-cables.html
[Picture of Open Source Scan Converter]
The Open Source Scan Converter is a good option for zero lag line doubling and upconversion, but it does not support composite video in, and therefore not suitable for a stock US NES-001. While it does work out of the box, it requires quite a lot of console specific tweaking to look good for each particular system.
https://videogameperfection.com/products/open-source-scan-converter/


Everdrive N8 Pro

[Picture of Everdrive N8 Pro cartridge] The Everdrive N8 Pro is an FPGA based NES cartridge emulator. It emulates the memory structure of the NES cartridge then through a menu driven interface, you can load the ROM into the simulated memory structure. This allows you to load multiple game ROMs and even save the game state to reload later. You can down load your entire library of cartridges and even program your own ROMs.
https://krikzz.com/our-products/cartridges/everdrive-n8-pro-72pin.html

Light-GunVerter

[Picture of Everdrive N8 Pro cartridge] So you want to play those old light gun games on a modern TV? The light guns such as the NES Zapper, rely on the timing of each scan line of a Cathode Ray Tube (CRT). When you pull the trigger of the NES zapper, the screen is blanked out, then a white square is drawn in the location of each target. If the gun detects white at the time a target is being drawn, then the appropriate hit is registered. Since modern TVs draw the screen one screen at time, it has to buffer all of the scan lines, and then resize the entire image to fit the pixels of the TV. This means the game has completely finished drawing the screen before the TV ever displays it, so by the time the light is detected it has missed the target.

Light-GunVerter https://www.lightgunverter.com/ has an open source project to solve this problem https://github.com/charcole/LCDZapper. It reads the NTSC stream for the timing of when the white targets are drawn, and interpolates the screen location by counting scan lines and time from the start of each scan line. It leverages a Wiimote to determine what part of the screen the light gun is pointing at. If the two intersect, then a hit is registered.