2VGA - consolized retro portable game systems

Disclaimer : I’m a perfect dummy on electronics and FPGA. I’m a software not a hardware man. So anything in this document could be totally wrong ;) Feel free to correct me so I could learn !

Introduction

Portable game systems use LCD, each one with its own resolution, colors and refresh rate.

The main problem is that this LCD will fail whatever you do.

Hint : beware of the sun at all cost!

Since they are specific to a system, no replacement exists and the system often finished on eBay in category “for parts”.

Add to this that some screen has no backlight and you have the perfect reason to find “another way” to play your games.

The most known alternative is emulation but it’s not perfect...because its emulation.

So let me add another solution : connect it to an external screen !

It’s no longer portable but at least, between this and the trash or ebay…..

So which external screen ?

We have to avoid specific or difficult to buy or too expensive one : let’s use the TV or computer screen.

Nowaday, TV/LCD accept several signals as input

LCD game screen

As seen previously, portable game systems use specific LCD.

It’s not the same LCD you have on your flat TV.

It’s a LCD defined by its fixed resolution, fixed (?) colors count and fixed frame rate.

Most of the time, it was made especially for the system and it’s also why it’s difficult to find a replacement.

Source: https://www.pocketgamer.com/articles/002850/how-handheld-consoles-have-evolved-over-the-last-20-years/

For example, the GameBoy Fat is 160x144, 4 colors and is refreshed almost 60 times/second.

Its LCD can’t draw anything else.

The protocol used to transfer a video frame to the LCD is dedicated to support this, it’s not generic.

From what I learnt (), the basis of this protocol is always the same

Each system has its own clocks and you first need to find them before trying anything.

It seems easy but it’s only the ‘basis’, it could be very difficult to decode a frame from these signals.

On most of the LCD screens I get details about, you have to handle the blanking time.

It means, for example, that the time defined by the line clock is not exactly the time to draw 240 pixels on a GBA screen. There is some blank included, perhaps to let the LCD actually draw the line? Same thing on vertical sync of course.

Developers use this blanking time a lot to compute data for next line or next screen, even more on system where CPU or data bus is no longer busy talking with LCD (faster!)

Source : https://www.coranac.com/tonc/text/video.htm

VGA screen

VGA is ...well...see Wikipedia, everything is explained there

https://en.wikipedia.org/wiki/Video_Graphics_Array

Yes, VGA is not only related to this connector

What you have to understand is that this connector allows a lot of resolutions, from 640x480 to ...very high definition:

Source : https://en.wikipedia.org/wiki/Display_resolution

And since color value is an analog value, it can handle millions of them!

So VGA signal is defined by its dynamic resolution, dynamic colors count and dynamic frame rate.

Great so VGA accepts any kind of data, like the one of our LCD ?

Helas no. “Dynamic” here means you can select one of the available resolution/frame rate.

See http://tinyvga.com/vga-timing for some (if not all) of them.

Hopefully, the protocol is well known, and it’s why the connector is always the same

 

Pin

Signal

Description

Pin 1

RED

Red video (75 ohm, 0.7 V p-p)

Pin 2

GREEN

Green video (75 ohm, 0.7 V p-p)

Pin 3

BLUE

Blue video (75 ohm, 0.7 V p-p)

Pin 4

ID2/RES

Reserved since E-DDC, formerly monitor id. bit 2

Pin 5

GND

Ground (HSync)

Pin 6

RED_RTN

Red return (Red Ground)

Pin 7

GREEN_RTN

Green return (Green Ground)

Pin 8

BLUE_RTN

Blue return (Blue Ground)

Pin 9

KEY/PWR

+5 V DC (powers EDID EEPROM chip on some monitors), formerly key

Pin 10

GND

Ground (VSync, DDC)

Pin 11

ID0/RES

Reserved since E-DDC, formerly monitor id. bit 0

Pin 12

ID1/SDA

I²C data since DDC2, formerly monitor id. bit 1

Pin 13

HSync

Horizontal sync

Pin 14

VSync

Vertical sync

Pin 15

ID3/SCL

I²C clock since DDC2, formerly monitor id. bit 3

Source : https://en.wikipedia.org/wiki/VGA_connector

So we have

You’ll notice there is absolutely nothing on resolution and color count…

Screen auto detect it from several things (mainly hsync/vsync)

If you want to know more, check https://www.epanorama.net/faq/vga2rgb/measuring.html

But it also means you have to be very very careful on the signals you use : one mistake and the screen thinks you’re using another resolution.

And unfortunately, it’s even more complex.

Not so far of the LCD’s, VGA uses several timings before/after hvsync:

on 640x480, HSync is not the time to draw 640 pixels and Vsync to draw 480 lines.

Source : https://www.digikey.com/eewiki/pages/viewpage.action?pageId=15925278#VGAController(VHDL)-SignalTiming

But, good news, thes timings are fixed for each resolution.

Again, see http://tinyvga.com/vga-timing for more details.

And you can’t make a mistake: screen detect the wanted resolution from this timing.

While it seemed difficult at first, if you select a resolution, you’re no longer on a dynamic system but a fixed one.

The more difficult is in fact to select the right resolution…

LCD to VGA signal conversion - theory

Resolution

If we want to draw a LCD frame to a VGA screen, we can’t just rely on the original LCD resolution.

Imagine playing 160x144 GameBoy on a 1280x800 screen...even if it’s centered, I doubt you’ll be able to see anything….

source:https://www.howtogeek.com/341543/why-do-old-game-consoles-look-so-bad-on-modern-tvs/

If it’s not playable on a high resolution, just use the smallest resolution available : 640x480.

Well, sorry, but it will still be a thumb on a big screen, with black borders larger than the frame itself.

You have to scale the frame to fill the screen and not use the native LCD resolution!

And to scale the frame, you only have to draw a pixel like a square.

And be careful, not a rectangle, a square.

If you don’t use the same size for height and width of your pixel, you’ll distort the frame...

The size of this square gives you the ratio (ex: a 4x4 pixel is a ratio of 4)

But then, you have to find the resolution which match with the wanted ratio.

Let’s try with a ratio of 4 on the GameBoy Fat on a 640x480 resolution

640/4 = 160  -> great a ratio of 4 is perfect for the GameBoy Fat, with fill the width of the screen

480/4 = 120 -> 24 lines are missing

If height is the problem, start for there:  you need at least 144x4 = 576

A valid VGA resolution of 576 height is 768x576

If you use this resolution, the video will be full height but you’ll need to center it at (768-160x4)/2 = 64

Another more common VGA resolution is 800x600, which set the 640x576:4 GameBoy screen to (80,12)

What about a ratio of  3 ?

160x3 = 480

144x3 = 432

Which means  a resolution of 640x480, starting at (80, 24)

It’s not better or worse, the 2 resolutions have pros and cons.

For ex : ratio3 makes the screen more blurry which could be great for a retro effect but it also makes it difficult to use the scanlines effect (see below).

It’s your choice if you design a 2vga system but it’s also your choice if you want to buy one and several models exist.

VGA resolution will rarely be a perfect match of LCD resolution x ratio.

Define the ratio you want, select the resolution accordingly and compute the frame coordinate to start drawing frame on screen. Nothing more.

FrameRate

(thanks to Furrtek for pointing me this issue which I totally missed)

Like explained before, LCD have their own refresh rate.

It means they are refreshed/redrawn N times per seconds.

On the other side, VGA supports some specific frame rate : 50/60/75/….

Unless you are lucky and your system uses a standard frame, you’ll probably have to adapt refresh rate.

And, sorry, there is no ‘perfect’ solution to this problem.

A picture is more efficient than a thousand words so

On Google search, tap “y=sin(60*x*2π ),y=sin(50*x*2π )” for a 60hz/50Hz comparison

On this graph, 2 values are plotted :

And so, the first problem happens at the first refresh : VGA is refreshed BEFORE buffer is even full. Congratulations, you meet your first lag.

It’s small : buffer is filled at 0.02s and is flushed on screen at 0.033s

If you look what happen after some refresh, you’ll notice another problem

0,016        (empty) buffer is flushed to VGA

0,02          Buffer is filled

        13ms

0,033         Buffer is flushed

0,04        Buffer is filled

        9ms

0,049        Buffer is flushed

0,06        Buffer is filled

        6ms

0,066        Buffer is flushed

0,08        Buffer is filled

        2ms

0,082        Buffer is flushed

0,098        Buffer is flushed   ⬅  !!

0,100        Buffer is filled

        14ms

0,114        Buffer is flushed

0,120        Buffer is filled

        10ms

0,130        Buffer is flushed

...

2 flush arised and delay between fill and flush high-to-low. It’s not technically a problem but it could be “felt” by the player when it happens too often.

Since VGA refresh rate is higher than system LCD refresh rate, obviously

1/ first VGA refresh occurs BEFORE LCD one

2/ VGA refresh may occur too fast between 2 LCD one

To avoid this, the 2 refresh rates must be as close as possible.

And you have to test it yourself, to feel if it’s a problem or not

Another way to minimize this even more is to flush line, no screen

But it requires a more complex design, perhaps even too much for the gain.

CPU or Logic device ?

  ( not confident about what I wrote)

With Arduino-clones and other cheap CPU-based solutions available, you could think the choice is easy to make.

Did you notice at which rate you’ll need to decode LCD frame and, in parallel, generate VGA signals ?

And higher is the resolution or bigger is the LCD frame, the more you’ll need to do to handle/generate a frame.

It’s clearly not doable with an Arduino.

A CPU executes instruction one by one.

A logic device reacts to signal and so everything that is linked to a signal is triggered ‘at the same time’.()

The only solution is a CPLD/FPGA, but I clearly don’t yet know the exact difference between the two apart the limited capacity of the CPLD.

A CPLD is cheaper than a FPGA so if possible, prefer a CPLD ;)

Decode LCD frame

To decode a LCD frame, you should first identify how to get it.

Remember the basis of the protocol LCD screen use ?

You first need to find

1/ where are these signals  (pinouts)

2/ what clocks values are used (and if they include blanking time)

3/ what other data is needed to fully decode a frame

This will give you the number of signals you have to handle, to select the right CPLD/FPGA

A perfect example is available here, for the GameBoy Fat : http://www.flashingleds.net/nintendOscope/nintendoscope.html

Craig explains how he did it (from get the pinout to decode a frame) and which mistakes to avoid

I really liked this one : “They're 5V logic levels, but watch out for the -30V DC contrast signal!”

So be sure to test every signal with a multimeter before attempting to sniff them!

GameBoy is simple :

Every CLOCK, read DATA1/DATA0 to get the grey ID and increment X.

Every HSYNC, increment Y

Use VSYNC to reset X,Y

It’s a perfect system for a first try.

Store in buffer

Of course, you need a buffer/memory.

Each system has its own BPP : Bits per pixel.

So

1 pixel = 1 byte for a 8BPP,

2 pixel = 1 byte for a 4BPP (if you want to optimize your buffer use, 1=1 else)

2 pixel = 3 bytes for 12 BPP (if you want to optimize your buffer use , 1 = 2 else)

If you target a <256colors system, for a standard buffer you need Height * Width * pixel weight

Ex: to store an unoptimized GameBoy frame, you need 160x144x1 = 23040bytes.

If you use bram, don’t forget it’s also used for your variables so get it too short !

Of course, you could need more if you want to make some effects but it’s beyond this document.

But there is a problem : you can’t write AND read at the same time

More details on https://electronics.stackexchange.com/a/269235

And unfortunately, since you could write and read a pixel (on a very extreme case, the SAME one) , you have to handle this constraint.

 I’m not totally sure about the real solution there.

Making some research and based on my own, I found several answers

In this version of the document, I’ll go with the double buffer way.

Which means you need twice the size of the buffer. (+ a few bytes needed for some vars)

Generate VGA signals

I could explain how to do it...but everything is already available here

http://www.cs.ucr.edu/~jtarango/cs122a_lab4.html

Perhaps less scholar there

https://www.digikey.com/eewiki/pages/viewpage.action?pageId=15925278

Another one I like a lot is Xess’s one, which I’ll probably base my design on

http://www.xess.com/blog/vga-the-rest-of-the-story/

Updated in http://www.xess.com/projects/an-103005-vgagen-project/

What you have to remember:

Colors

LCD color information is digital.

It could be id of color in system fixed pal or R, G and B values.

If colors is coded on 9bit, it’s mostly 3bit for R, 3bit for G, 3bit for B.

(be careful, sometimes B uses less bits than others)

VGA color is analog.

Signal levels are between 0 (completely dark) and 0.7 V (maximum brightness) control the intensity of each color component (R,G,B), which combine to make the final color of a pixel on the monitor screen.

So you have to find a way to convert a Red value from 0 to 0x7 (if 3bit)  to 0 to 0.7v :

A digital-to-analog converter or simply DAC.

https://www.digikey.com/en/articles/techzone/2017/sep/adc-dac-tutorial

Never forget 0.7v is required on “monitor side”, so if your DAC doesn’t output 0.7v at max, you have to add a resistor to create a voltage divider circuit.

The most useful page about this subject is https://chipnetics.com/tutorials/understanding-75-ohm-video-signals/

 From what I read impedance of the circuit should also be 75 ohm but impedance is my worst nightmare : I don’t understand a thing about it :(

So nothing on this subject for now, sorry

Binary Weighted Resistor DAC

Introduction

https://www.youtube.com/watch?v=PoOm_G4s1dE

http://www.pyroelectro.com/tutorials/fpga_vga_resistor_dac/theory.html

Formula

(based on from https://electronics.stackexchange.com/a/453444)

0.7v = max value on full brightness (or anything higher value if you use a voltage divider)

Input = 5V/3.3V/….

75ohm = impedance

Rx = parallel combination of the N resistances

Ry = voltage divider

0.7V = input * Ry/(Rx+Ry)  

or Ry = Rx/((input/0.7)-1)

Rx | Ry = 75ohm/2

or Ry = 37.5*Rx/(Rx-37.5)

=> Rx = 37.5+(input/0.7)-1)*37.5

=> Ry = 1/(1/Rx+1/75-1/37.5)

1/Rx = 1/(R1*1)+1/(R1*2)+1/(R1*4)+...+1/(R1*2^x)

=> R1 = Rx+(Rx/2)+(Rx/4)+....+(Rx/2^x)

=> R2 = 2*R1

=> R3 = 4*R1

=> Rn = 2^(n-1)*R1

Cons :

R-2R Ladder DAC

Introduction

https://www.youtube.com/watch?v=Pc1aFloxSMw

https://fr.tek.com/blog/tutorial-digital-analog-conversion-r-2r-dac

If you have a box of N resistors at 1% tolerance, whatever is the value : go for it !

Formula

Based on https://create.arduino.cc/projecthub/instrumentation-system/dac-8-bit-using-r-2r-ladder-964837

With Vomax, you can then compute the value of the resistor needed for your voltage divider

With Vin = Vomax, Vout = 0.7v, R1 = your resistor R …. So R2 is the resistor value to add in parallel of monitor 75ohm terminator

   another formula I’m not sure about…

Pros :

need 2 values of resistor only (down to 1 if you use them is serial)

Cons :

1% resistors to ensure the ladder works correctly.

12 to 13 bits maximum (see http://www.freepatentsonline.com/7362253.html)

Video DAC IC

A video DAC is very powerful.

If you browse Analog’s one, you’ll find cheap to expensive IC

https://www.analog.com/en/parametricsearch/11355

The difference of price is defined by

So you have to select what you really want to output to be able to select the right IC.

But be careful to your BOM list ! And note that your PCB design will be more complex.

Cons :

Price

complex IC needs some ticks to process data, resulting in some delays

See http://www.eecg.toronto.edu/~tm4/rgbout.html

Design

LCD signal defines a LCD frame, pixel per pixel, based on the clock signals.

We store this pixel data in a buffer, at the right entry.

When the buffer is full, the buffer is swapped and LCD frame restarts at (0,0).

The full buffer is used to generate the right RGB values, based on VGA clock signals and using a R-2R ladder DAC.

https://www.element14.com/community/message/225571/l/re-neo-geo-pocket-color-video-out-dacfpga#225571

Pseudo code

On Start

        LCD_idx = 0

        VGA_idx = 0

        Active_buffer = 0

        Buffer = [2][buffer_size]

On LCDPixelClock

        Buffer[active_buffer][LCD_idx] = LCD_pixel

        LCD_idx++

On LCDVSync

        Active_buffer = (active_buffer+1)%2

        LCD_idx = 0

On VGAClock

        (handle timing)

        VGA_RGB = buffer[active_buffer^1][VGA_idx]

        VGA_idx++

On VGAVSync

        VGA_idx = 0

I didn’t use HSync clocks...it seems I didn”t really need it...

 active_buffer is set by LCD core, so based on refresh rate issue, we could start to draw from a buffer and finish from another...no way to handle it ?!

More

If you want to consolize a handled system, several choices need to be done first

Input :

Enclosure

Power

Video

Input

NES controller

TODO : FPGA core

TODO : connector

SNES controller

TODO : FPGA core

TODO : connector

SMS controller

TODO : FPGA core

SMS controller use a DB9 connector so it’s easy to get one

MD controller

TODO : FPGA core

MD controller use a DB9 connector so it’s easy to get one

PSX controller

TODO : FPGA core

TODO : connector

Bluetooth controller

If you use bluetooth pad, you’ll need a bluetooth receiver of mod side

TODO : FPGA cores

TODO : Bluetooth receiver IC

TODO : pairing

TODO : power

Bluetooth emitter on system case

If you transform your system as input bluetooth controller, you’ll need a bluetooth receiver of mod side and a custom emitter on system side, probably on a custom PCB or hacking system PCB

See Bluetooth pad for receiver and pairing details

TODO : FPGA cores

TODO : Bluetooth emetter IC

TODO : power

RF

TODO : no RF pad, like bluetooth ?

TODO : RF emitter / receiver

TODO : pairing

TODO : power

Power options

Introduction

Whatever option you choose, you have to be very careful on signal level between system and mod.

If system and mod don’t use same signal power (like the infamous 5V vs 3.3V), you’ll need to use some level xxx like the TXB by Texas Instrument on each signal, and share the ground.

You also need to answer these questions :

What power (volt/current) deliver the system ? TODO

What current it REALLY need ? TODO

What power (volt/current) need the mod ? TODO

System powered

TODO

Separate power

See introduction

Common AC input

TODO (raw comment without electronic confirmation, to heavily challenge!)

Based on system and mod needs, you’ll be able to select the unique power input needed

If system and mod don’t use the same voltage, you’ll need to keep in mind the power lost on voltage transform.

So

V : max(system V, mod V)

A : system’s current +  mod’s current + current lost on volt transformation

Video options

Scanline

If you want to give a retro style to video, you can’t bypass scanline generator

Scanline generator adds a dark line every 2 lines.

TODO : dark = black / not draw / dark gray? See GBA Consolize options

Very easy to add : just draw the same value on even (or odd line).

Perhaps more efficient with an even ratio ?

Source : http://www.smallcab.net/generateur-scanline-slg3000-p-307.html

Gridlines

I recently discovered the gridlines.

While the scanlines mimics the CRT output, gridlines mimics LCD structures.

Scaling

Keep original aspect ratio or fill screen

Smooth

TODO

Dont-know-how-it-is-called

Some LCD keeps a ‘blurred’ previous frame, which means you frame drawing is not draw/clean/draw/….but some sort of draw/xor/draw

Some games even use it to trick and be able to simulate more colors (palette change each frame)

TODO

Debug

I don’t know a thing about debugging FPGA.

My approach for now is to

Saleae dumps

TODO

Errors log

Here is a list of the errors I met and how I fixed them, perhaps it will help you…

COMING SOON…(perhaps)


System 1 : GameBoy DMG FAT

Informations

Resolution

160x144

Colors

4 colors - 2 bits

Buffer size

23040 bytes

Using one byte per pixel

It’s possible to use less story 4 pixels per byte

Saleae dump

Dump :

Screen :

Igor pro script :

From game XXXX

Power

LCD data are 5V logic level

GameBoy is 6V 0.7W via 4xAA batteries or AC Adapter

Pinout

21: GND

17: HSync

16: DATA1

15: DATA0

14: Pixel clock

12: VSync

Cable used is a FDC ribbon cable

awm 20624 80c 60v vw-1

21pin -  pitch xxx mm

Pixel clock

4.194304MHz

HSync

9.2KHz

VSync

60Hz

Probably 59.7Hz

Protocol

On each pixel clock rising edge, pixel value is inserted via DATA0 and DATA1

HSync isn’t needed since pixel clock stops while in blanking period.

VSync isn’t needed but it’s a good point to use it to reset current pixel counter...and you could use it use as rate for VGA if you want.

Selected VGA resolution

Ratio : 4

Resolution : 800x600@60Hz

Timings :  http://tinyvga.com/vga-timing/800x600@60Hz

Coordinate : (80,12)

Implementation

TODO : details

TODO : board

TODO : code

Similar projects

Porchie by BennVenn

Link : https://bennvenn.myshopify.com/products/porchie-the-vga-out-board-for-your-dmg?variant=20483149319

Source : n/a

Price : 37$

Resolution : 640x480 / ratio 2 (!)

FPGA : Altera

Connection : soldering

Remark :

Easy_VGA by Kitsch Bent

Link : https://store.kitsch-bent.com/product/easy_vga

Source : https://github.com/uXeBoy/VGA1306

Price : 38$

Resolution : 640x480 /  ratio 2

Connection : soldering

FPGA : iCE40HX1K-EVB (?)

Remark :

DMTV by GameBox

https://www.gamebox.systems/products/dmtv-pcb-gameboy-vga-controller-replacement-board

Source : n/a

Price : 67$

Connection : cable

Remark :

Custom by Longhorn Engineer

Link : http://longhornengineer.com/category/projects/hardware/gameboy-dmg-01-vga/

Source : https://github.com/LonghornEngineer/DE0_GameBoy_DMG-01_VGA

Price : n/a

Resolution : 1280x1024@60Hz / ratio ?

Connection : ?

FPGA : DE0 Digital IO Wing

Remark :

GBVGA by Antti Huhtala

Link : https://kiedontaa.blogspot.com/2019/12/gameboy-to-vga.html

Source : https://github.com/ahhuhtal/gbvga

Price : n/a

Resolution : 800x600 @ 60 Hz / ratio 4

Connection : ?

FPGA : Cyclone 1

Remark :

Gameboy VGA Adapter by ackspace

Link : https://ackspace.nl/wiki/Gameboy_VGA_adapter

Source : n/a

Price : n/a

Resolution : 768x576@59,7Hz

Connection : ?

FPGA : Altera Cyclone 2

Remark :

GB output by djtransformer

Link : http://djtransformer.com/shop/product.php?id_product=50

Source : n/a

Price : 100L / too much

Resolution : ?

Connection : ?

FPGA : ?

Remark :

Gameboy2VGA by Snesy

Link : https://snesy.wordpress.com/2011/02/12/gameboy-vga/

Source : n/a

Price : n/a

Resolution : ?

Connection : ?

FPGA : ?

Remark :

Hdmyboy

Link : http://www.hdmyboy.com/play/

Source : n/a

Price : ?

Resolution : 1120x1007 or 1920x1007

Connection : cable, in sandwich between back and front

FPGA : ?

Remark :

Others solutions

Super GameBoy

https://www.retrorgb.com/supergameboy.html

GameCube GameBoy player

https://www.retrorgb.com/gameboyinterface.html

GBA projects

Some GBA projects also handle GB/GBC, see below

DemoVision by Nintendo (?)

http://www.chrismcovell.com/demovision.html

Wideboy by ?

http://www.chrismcovell.com/wideboy.html

Kiosks

https://twitter.com/kelslewin/status/963569660254924800

Consolized system example

GB in NES mini

https://www.reddit.com/r/Gameboy/comments/bo9e0l/saw_this_awesome_mod_on_instagram_and_was/

GB in Pocket case

Seems to use Porchie

https://atariage.com/forums/topic/276525-consolized-dmg-orig-gameboy/

Custom GB Kiosk

http://france.retrogaming.fr/tutoriaux/fabrication-borne-demonstration-game-boy/

System 2 : GameBoy Pocket / Light

Informations

Similar to GameBoy FAT.

Resolution

160x144

Colors

4 colors - 2 bits

Buffer size

23040 bytes

Using one byte per pixel

It’s possible to use less story 4 pixels per byte

Saleae dump

See GameBoy FAT

Power

LCD data are 5V logic level

Pocket:

3 AAA

3V, 2.35mm x 0.75mm DC jack

Light:

2 AA

3V, xxxxx

Pinout pocket

4: HSync

5: DATA0

6: DATA1

7: Pixel clock

13: VSync

Cable used is …

P2-LD0 : DATA0

P2-LD1 : DATA1

P2-ST  : HSync

P2-S  : VSync

P2-CP  : Clock

P2-CPG : LCD enable

Pinout light

Pixel clock

4.194304MHz

HSync

9.259kHz

VSync

59.7275Hz

Not exactly 60Hz

More details on each PIN at http://forum.gameboyre.com/thread/209-%E6%8A%9B%E7%A0%96%E5%BC%95%E7%8E%89-gbp%E6%94%B9%E8%83%8C%E5%85%89%EF%BC%8C%E7%9B%B4%E6%8E%A5%E6%8D%A2%E5%B1%8F%EF%BC%8C%E7%AD%89%E4%B8%93%E5%AE%B6%E9%A3%9E%E7%BA%BF/

Protocol

Similar to GameBoy FAT

Selected VGA resolution

Similar to GameBoy Fat

Implementation

TODO : LCD pinout converter board if needed (light, pocket, fat in one)

Similar projects

Gameboy vga adapter by RivalCorp

Link : https://web.archive.org/web/20110217020511/http://www.rival-corp.com/2010/12/02/gameboy-vga-adapter-2/

Source : n/a

Price : n/a

Resolution : ?

Connection : ?

FPGA : Altera Cyclone II

Remark : https://www.youtube.com/watch?v=NUIWsUHntf8&feature=emb_logo

Custom by zlakomanoff

Link : https://www.youtube.com/watch?v=wUWLFWUJgus-Pocked-VGA-video-output

Source : https://github.com/zlakomanoff/gameboy-vga-vhdl

Price : ?

Resolution : 768 x 576 @ 60 Hz

Connection : ?

FPGA : Cyclone 2

Remark :

Others solutions

Same as GameBoy FAT

Consolized system example

TODO

System 3 : GameBoy Color

Informations

Resolution

160×144

Colors

32768 - 15bit (5 per channel)

But only up to 56 at the same time on screen

Buffer size

76800

2bytes per pixel

Saleae dump

Dump :

Screen :

Igor pro script :

Power

3V 2AA
3V DC 0.6W (2.35mm×0.75mm)

Pinout

See test point:

LDR0-4 : red

LDG0-4 : green

LDB0-4 : blue

SPL : HSync

SPS : VSync

DCK :  pixel clock

Pixel clock

HSync

VSync

Protocol

TODO

Selected VGA resolution

Ratio : ?

Resolution : ?x?@?Hz

Timings :  http://tinyvga.com/vga-timing/?x?@?Hz

Coordinate : (?,?)

Implementation

TODO

Similar projects

Rival Corp

Link : https://web.archive.org/web/20101218141357/http://www.rival-corp.com/2010/12/07/

Source : n/a

Price : n/a

Resolution : n/a

FPGA : Cyclone 2 (Altera DE1 board)

Connection : n/a

Remark :

McWill Backlit GBC Screen Kit

Link : https://www.retrorgb.com/mcwill-backlit-gbc-screen-kit.html

Source : n/a

Price : 75$

Resolution : 640×480 @ 60Hz

FPGA : n/a

Connection : 2 solder points and cable

Remark :

Others solutions

GameCube Gameboy player

https://www.retrorgb.com/gameboyinterface.html

GBA projects

Some GBA projects also handle GB/GBC (see below)

Consolized system example

TODO


System 4 : GameBoy advance / SP / Micro

Informations

Resolution

240x160

Colors

32768 - 15bit (5 per channel)

Buffer size

76800

2bytes per pixel

Saleae dump

Dump :

Screen :

Igor pro script :

Power

GBA:

3V (2xAA)

GBA SP:

Battery Li Ion

Pinout

http://problemkaputt.de/gbatek.htm#pinoutslcdcables

GBA 40

40 pin connector

3 : Pixel Clock

8-12 : Red 1-5

13-17 : Green 1-5

19-23 : Blue 1-5

24 : HSync

26 : VSync

Test points:

DCK : Pixel Clock

SPL : HSync

SPS : VSync

LDR1-5 : Red

LDG1-5 : Green

LDB1-5 : Blue

GBA 32

? : Pixel Clock

?-? : Red 1-5

?-? : Green 1-5

?-? : Blue 1-5

? : HSync

? : VSync

Test points (see GBA 40)

GBA SP

34 pin connector

2 : Pixel Clock

7-11 : Red 1-5

12-16 : Green 1-5

18-22 : Blue 1-5

23 : HSync

25 : VSync

Test points

DCK : Pixel Clock

SPL : HSync

SPS : VSync

LDR1-5 : Red

LDG1-5 : Green

LDB1-5 : Blue

GBA Micro

34 pin connector

13 : Pixel Clock ?

4-8 : Red 1-5 ?

15-19 : Green 1-5 ?

21-25 : Blue 1-5 ?

12 : HSync ?

27 : VSync ?

 

Test points:

TODO

Pixel clock

16.78MHz

?

HSync

16.620KHz

VSync

59.737Hz

http://problemkaputt.de/gbatek.htm#lcddimensionsandtimings

Protocol

https://www.insidegadgets.com/2019/08/08/playing-around-with-the-gba-lcd/

Selected VGA resolution

Ratio : ?

Resolution : ?x?@?Hz

Timings :  http://tinyvga.com/vga-timing/?x?@?Hz

Coordinate : (?,?)

Implementation

TODO

Similar projects

AdvanceVGA by Inside Gadgets

Link : https://shop.insidegadgets.com/product/advancevga/

Source : n/a

Price : 65$

Resolution : 800×600@59.73Hz

FPGA : Altera Max10

Connection : solder and cable

Remark :

GBA Consolizer by GameTech

Link : https://www.game-tech.us/product/gba-consolizer/

Source : 150$

Price : n/a

Resolution : 1280×720

FPGA : Xilinx ? (since use .MCS firmware)

Connection : n/a

Remark :

VGAdvance by BennVenn

Link : https://www.facebook.com/BennVennElectronics/videos/1285539328226184/

Source : ??$

Price : n/a

Resolution : 640x480@59Hz

FPGA : Altera Max2

Connection : ?

Remark :

Others solutions

http://www.konlabs.com/articles_data/gba_transverter/index.htm

https://www.retrorgb.com/gbatv.html

https://www.retrorgb.com/gbacompare.html

Consolized system example

GBA in MD2

http://www.sega-16.com/forum/showthread.php?24995-Let-s-consolize-a-GameBoy-Advance

System 5 : Wonderswan

Informations

Resolution

224x144

Portrait / Landscape mode

Colors

8 or 16 shades of grey - 4bit

Buffer size

32256

1byte per pixel

/2 if 2pixel per byte

Saleae dump

Dump :

Screen :

Igor pro script :

Power

1 AA

Pinout

? : Pixel Clock

? : Grey 0

? : Grey 1

? : Grey 2

? : Grey 3

? : HSync

? : VSync

Pixel clock

3.072MHz

HSync

12KHz

VSync

75.47Hz

http://daifukkat.su/docs/wsman/#hw_dispcon

Protocol

TODO

LCD icons send on LCD Signal

Portrait / Landscape mode

Selected VGA resolution

Ratio : ?

Resolution : ?x?@?Hz

Timings :  http://tinyvga.com/vga-timing/?x?@?Hz

Coordinate : (?,?)

Implementation

TODO

Similar projects

None on Classic (see Color is back compatible with Classic game)

Others solutions

None on Classic

Consolized system example

None


System 6 : Wonderswan Color / Crystal

Informations

Resolution

224x144

Portrait / Landscape mode

Colors

4096 (12 bit)

WS Mode available

Buffer size

64512

2 bytes per pixel

Saleae dump

Dump :

Screen :

Igor pro script :

Power

1 AA

Pinout

TODO : same value on RGB on WS mode ?

WSC

24 pin connector

? : Red 0

? : Red 1

? : Red 2

? : Red 3

? : Green 0

? : Green 1

? : Green 2

? : Green 3

? : Blue 0

? : Blue 1

? : Blue 2

? : Blue 3

? : Pixel Clock

? : HSync

? : VSync

No test points

Crystal

30 pin connector

? : Red 0

? : Red 1

? : Red 2

? : Red 3

? : Green 0

? : Green 1

? : Green 2

? : Green 3

? : Blue 0

? : Blue 1

? : Blue 2

? : Blue 3

? : Pixel Clock

? : HSync

? : VSync

No test points

Pixel clock

3.072MHz

HSync

12KHz

VSync

75.47Hz

Protocol

TODO

3 x 240 columns mode (à la Lynx)

Portrait / Landscape mode

LCD icon on LCD signal

https://twitter.com/furrtek/status/1191770777802215425

To enable icons, pixel #224 blue level must be 0. To show the battery icon for ex., pixel #229 red level must be max.

Selected VGA resolution

Ratio : ?

Resolution : ?x?@?Hz

Timings :  http://tinyvga.com/vga-timing/?x?@?Hz

Coordinate : (?,?)

Implementation

TODO

Similar projects

Furrtek

Link : https://www.yaronet.com/topics/167922-tv-out

Source : n/a

Price : n/a

Resolution : n/a

FPGA : n/a

Connection : n/a

Remark :

Others solutions

https://twitter.com/TheONiLX/status/1030822600925036547?s=09

Interesting support for portrait and landscape mode

Consolized system example

None


System 7 : NGP

Informations

Resolution

160x152

Colors

16 Grey level - 4 bits

/!\Not sure about this one

Buffer size

24320

Half if 2 pixels/byte

Saleae dump

Dump :

Screen :

Igor pro script :

Power

3V 0.2W

2xAAA

Pinout

24 pin connector

? : Grey 0

? : Grey 1

? : Grey 2

? : Grey 3

? : Pixel clock

? : HSync

? : VSync

DI0-DI3 : pixel color 4 bits

EPCLK : pixel clock ?

? : HSync

? : VSync

Pixel clock

HSync

VSync

Protocol

TODO

Selected VGA resolution

Ratio : ?

Resolution : ?x?@?Hz

Timings :  http://tinyvga.com/vga-timing/?x?@?Hz

Coordinate : (?,?)

Implementation

TODO

Similar projects

none

Others solutions

none

Consolized system example

None


System 8 : NGPC

Informations

Resolution

160x152

Colors

4096 12 bits

146 on screen
20 on compatibility mode

Buffer size

48640

2bytes per pixel

Saleae dump

Dump :

Screen :

Igor pro script :

Power

3V 0.2W

2 AA

Pinout

36 pin connector

Test points

R0~3 is 4bit red

G0~3 is 4bit green

B0~3 is 4bit blue

DCLK is the pixel clock

SPL is horizontal sync

SPS is frame sync

Pixel clock

3.06MHz

≃6.144MHz /2

HSync

120.2KHz ?

VSync

60Hz

Protocol

TODO

Selected VGA resolution

Ratio : ?

Resolution : ?x?@?Hz

Timings :  http://tinyvga.com/vga-timing/?x?@?Hz

Coordinate : (?,?)

Implementation

TODO

Similar projects

None

Even if LCD replacement are available

Others solutions

K2 Video by SNK

https://www.youtube.com/watch?v=qG64QlZuzdg

Super NeoGeo Pocket by Furrtek

http://furrtek.free.fr/?a=superngpc

Consolized system example

Wozzle NGPC

https://www.youtube.com/watch?v=Wr3jlyaQcTM&feature=youtu.be

http://stephens-projects.com/projects/neo-geo-pocket-color-console/


System 9 : Watara Supervision

Informations

Resolution

160x160

Colors

4 colors - 2 bit

Buffer size

25600

/4 if 4 pixels per byte

Saleae dump

Dump :

Screen :

Igor pro script :

Power

Pinout

12 pin connector

- Data 0

- Data 1

- Data 2

- Data 3

- Pixel Clock

- Line Latch / HSync

- Frame Latch / VSync

- Frame Polarity/bright control

- Power Control

Test points

To confirm based on

https://circuit-board.de/forum/index.php/Thread/12277-Watara-Hartung-SuperVision-Backlight-Umbau-Hilfe-Infos/

Pixel clock

4MHz

HSync

16.26KHz ?

Based on KevTris info

VSync

50.81Hz

Source : https://github.com/GrenderG/supervision_reveng_notes

Protocol

TODO

2 fields per frame so, need 2 refresh to draw a frame : similar to draw 320 lines

Selected VGA resolution

Ratio : ?

Resolution : ?x?@?Hz

Timings :  http://tinyvga.com/vga-timing/?x?@?Hz

Coordinate : (?,?)

Implementation

TODO

Similar projects

None

Others solutions

TV Link by Watara

https://www.diskman.com/presents/supervision/tvlink.htm

NTSC or PAL

(?) need the 1st version of the Supervision

Consolized system example

None

System 10 : Atari Lynx 1/2

Informations

Resolution

160x102

Portrait / Landscape mode ?

Colors

4096 (12-bit)

16 colors on screen, apart on Shadow of the Beast (24)

Buffer size

32640

2 bytes per pixel needed

Saleae dump

Dump :

Screen :

Igor pro script :

Power

9V ( 6AA)

Pinout

Lynx I

soldered cable which make it hard to hack

Test points available in front of several pin soldered, no label

Lynx II

26 pin connector

3-8 : Magic LCD Timing Signals

  9 : HSync

11 : Pixel Clock A        (Idles HIGH)

 12 : Pixel Clock An        (Idles LOW)

 13 : Pixel Clock B

 14 : Pixel Clock Bn

 15 : Pixel Clock C

 16 : Pixel Clock Cn

 17 : Pixel Data 1

 18 : Pixel Data 3

 19 : Pixel Data 0

 20 : Pixel Data 2

Pixel clock

HSync

Set by software ?

VSync

50, 60,  (70) or 75Hz (or anything)

Set by software

TODO : could be changed during gameplay or only on boot ?

More detail on dynamic frame rate on:

https://archive.org/details/Atari_Lynx_Specification_aka_Handy_Rev_P_Aug_9_1989/page/n9

Pinout source :

https://atarigamer.com/pages/atari-lynx-hardware-notes#lcd_screen

Protocol

TODO

3 blocks draw at the “same” time, each one with its own clock (hence 3 Pixel Clock) : R, G, B

https://atariage.com/forums/topic/202203-psychicall-lynx-lcd-dimension/?do=findComment&comment=2596992

TODO : what about raster effect and color effect explained on http://mag.mo5.com/actu/58759/adaptateur-tv-les-25-ans-lynx/

Dynamic HSync, VSync

Orientation ? (see Klax and Gauntlet)

Selected VGA resolution

Ratio : ?

Resolution : ?x?@?Hz

Timings :  http://tinyvga.com/vga-timing/?x?@?Hz

Coordinate : (?,?)

Implementation

TODO

Similar projects

McWill’s LCD replacement with VGA

Link : https://atariage.com/forums/topic/230579-tv-out-under-the-christmas-tree-2014/page/4/?tab=comments#comment-3125094

Source : n/a

Price : 95euro

Resolution : n/a @73Hz

FPGA : Xilinx ?

Connection : solder and cable

Remark :

Lynx to VGA by Candle

Link : https://atariage.com/forums/topic/202796-lynx-to-vga/

Source : n/a

Price : n/a

Resolution : n/a

FPGA : Cyclone 2 (Altera DE1 board)  then lattice machxo2 to handle LCD

Connection : solder and cable

Remark :

Lynx Mod by Furrtek

Link : https://www.yaronet.com/topics/167987-tv-out-pour-lynx

Source : n/a

Price : 115$

Resolution : 640x480 60Hz

FPGA : Cyclone 2 (Altera DE1 board)  

Connection : solder and cable

Remark :

Others solutions

Lynx TV

https://www.youtube.com/watch?v=3XsjHWGUVf4&feature=emb_logo

Consolized system example

Consolized Atari Lynx by

https://www.youtube.com/watch?v=spnS3X-K-o4

https://www.youtube.com/watch?v=bsCzxh4wcdg

https://www.youtube.com/watch?v=VT7PHMNbB2o

Lynx 1-UP

https://atariage.com/forums/topic/282545-consolized-atari-lynx-1-with-mcwill-vga-controller/


System 11 : Sega GameGear

Informations

Resolution

160x144

Colors

4096 - 12bits

32 on screen

Buffer size

46080

2bytes per pixel

Saleae dump

Dump :

Screen :

Igor pro script :

Power

Pinout

1 ASIC

2 ASIC

V0

Majesco VA4 VA5

68pin soldered to PCB

  • Some signals beween LCD connection and LCD “hole”

18: D0

16: D1

39: D2

57: D3

20: DW

9 : CL2

Test points available before each cable pin solder, no label

Pixel clock

HSync

VSync

Protocol

TODO

https://www.smspower.org/forums/post68683#68683

SMS/GG mode

Scaling

https://www.smspower.org/forums/9562-GameGearSMSModeVideoScaling

Selected VGA resolution

Ratio : ?

Resolution : ?x?@?Hz

Timings :  http://tinyvga.com/vga-timing/?x?@?Hz

Coordinate : (?,?)

Implementation

Similar projects

A lot of projects are based on GGTV by Viletim

https://etim.net.au/ggtv/ggtv.htm

If you want to ouput composite, it’s the right way to do

If you want VGA, it”s not ;)

GGTV to Scart

Link : https://www.smspower.org/forums/11931-ConnectYourGameGearToATV

Source : n/a

Price : n/a

Resolution : n/a

FPGA : n/a

Connection : solder

Remark :

McWill’s LCD upgrade

Link : https://www.retromodding.com/products/mcwills-sega-game-gear-lcd-upgrade

Source : n/a

Price : 120$

Resolution : n/a

FPGA : Xilinx ?

Connection : solder

Remark :

GGLCD

Link : http://gglcd.bufsiz.jp/?utm=rc&page=gglcd

Source : n/a

Price : n/a

Resolution : n/a

FPGA : n/a

Connection : solder

Remark :

GGHD

Link : http://stephens-projects.com/projects/gghdmi/

Source : n/a

Price : n/a

Resolution : 1280x720p

FPGA : n/a

Connection : solder

Remark :

Others solutions

GGTV by Sega

Consolized system example

Best Sega GameGear System ever

Include a Mark3 adapter

http://www.lcv.ne.jp/~mgs1987/sega/gg.html

http://www.lcv.ne.jp/~mgs1987/sega/gg2.html

http://www.lcv.ne.jp/~mgs1987/sega/gg3.html

http://www.lcv.ne.jp/~mgs1987/sega/gg4.html

http://www.lcv.ne.jp/~mgs1987/sega/gg5.html

http://www.lcv.ne.jp/~mgs1987/sega/gg6.html

http://www.lcv.ne.jp/~mgs1987/sega/gg7.html

http://www.lcv.ne.jp/~mgs1987/sega/gg8.html

http://www.lcv.ne.jp/~mgs1987/sega/gg9.html

http://www.lcv.ne.jp/~mgs1987/sega/gg10.html

GameGear/MasterSystem

Updated SMS with updated GG inside a SMS1, with GGTV

https://www.youtube.com/watch?v=FQLIq6mjjCk

https://vintageisthenewold.com/custom-sega-master-system-with-built-in-game-gear-cart-slot/

GGTV Console

GGTV powered

https://16picsel.wordpress.com/category/game-gear/

Omp version

Based on GGTV

https://www.smspower.org/forums/post59589#59589

Tmee

GG in a SMS

https://forums.sonicretro.org/index.php?threads/3-years-ago-i-sent-tmee-a-game-gear-to-mod.36267/

Sega Game Gear Consolized GGTV Installed w/Modded NES Controller

GG in a MD2

https://atariage.com/forums/topic/284142-sega-game-gear-consolized-ggtv-installed-wmodded-controller/

Trash GG

Based on GGTV,

http://www.sega-16.com/forum/showthread.php?22763-Let-s-consolize-and-old-dirty-broken-Game-Gear-found-in-the-trash

Consolized GameGear

Base on GGTV

https://www.beharbros.com/consolized-game-gear

GameGear Console

Based on GGTV

https://imgur.com/t/gaming/xXmlE

SMS2 GG

https://circuit-board.de/forum/index.php/Thread/4171-Game-Gear-f%C3%A4higes-SMS2-aka-consolized-Sega-Game-Gear/

System 12 : CougarBoy  / MegaDuck

Informations

Resolution

160×144

Colors

4 grayscale (2 bit)

Buffer size

Saleae dump

Dump :

Screen :

Igor pro script :

Power

4x AA batteries

AC adapter 6 VDC / 300 mA

Pinout

Pixel clock

HSync

VSync

59.732155 Hz

Protocol

TODO

From Wikipedia but without really clear source

“The Video Display Controller of the Mega Duck/Cougar Boy has one special feature, the display logic uses two "display planes" that are used to create parallax scrolling backgrounds, as if the picture is drawn on two sheets of which the top sheet is partly transparent.”

Selected VGA resolution

Ratio : ?

Resolution : ?x?@?Hz

Timings :  http://tinyvga.com/vga-timing/?x?@?Hz

Coordinate : (?,?)

Implementation

TODO

Similar projects

None

Others solutions

None

Consolized system example

None

Thanks

Evan Amos for all his awesome HD pictures

https://commons.wikimedia.org/wiki/User:Evan-Amos

Furrtek for everything he made and shared (and still doing)

https://twitter.com/furrtek

http://furrtek.org

RetroRGB for reviewing a lot of existing mods, from user and engineer point of view

https://www.retrorgb.com

McWill for his awesome LCD upgrades which, when you know how to read installation manuals, let you learn a lot of things...since he rarely shares his technical details, unfortunately ($$).