[repair] Pong clone Olympic Tennis (1973)

Door sebastius op maandag 19 mei 2014 17:54 - Reacties (9)
Categorie: Knutselen, Views: 4.295

Even een paar dagen pauze in Space Invaders (heb je de nieuwste blog niet gelezen nog, klik!), maar het bloed kruipt waar het niet gaan kan...

Zoals je ondertussen wel weet houd ik wel van spelletjes, retro-elektronica en knutselen. Zo heb ik jaren terug een flinke collectie arcade-games gehad, met eerst een losse monitor en later in een echte kast. Maar ja, zodra alles werkt is de lol er af, projecten pakken nooit echt lekker door zodra de 'puzzel' is gekraakt en de rest gewoon boekhouden is.

Alle arcadegames zijn al lang verkocht, op 1 board na. Ik heb een keer in 2004 een Pong kloon aangeschaft, wetende dat hij niet zou werken. In 2004 had ik niet echt de kennis en de middelen om dit board goed te diagnosticeren, zodoende heeft het jarenlang dienst gedaan als decoratie:

http://i166.photobucket.com/albums/u91/sjieto/IMG_1690.jpg

Ook jaren terug kwam ik de blog tegen van DanBoris, die in een rustig tempo heel het schema van Pong had uitgelegd. Maar ja, ik heb geen Pong, maar een kloon, Olympic Tennis... Het schema kwam dus niet overeen en zodoende is het board wel steeds meeverhuisd, maar niet echt bekeken. Alle chips vervangen was (zeker toen, maar nu nog steeds) een dure hobby en je gaat niet rŁcksichtslos alles vervangen (nou ja, soms doe ik dat wel, maar bij dit karwei was het echt geen leuke klus qua tijd en financiŽn).

http://i166.photobucket.com/albums/u91/sjieto/IMG_6768_zps2f4fc3fa.jpg
Het board van Olympic Tennis. Geen processor, geen RAM, geen ROM, wel een spel!

In 2004 had ik al beeld: ik zag de scoreteller, de boven en onderlijn, het net en de batjes van speler 1 en 2 (volgens mij is dit een 4speler board, maar hoe weet ik nog niet). Ook zag ik een storing waarvan ik dacht dat het de bal misschien zou kunnen zijn, maar dan heeeeel snel over het scherm.

http://i166.photobucket.com/albums/u91/sjieto/IMG_6767_zps709c5ad4.jpg

Gisteravond in een inspiratieloos moment de blog van DanBoris erbij gepakt en mijn print. Ik merkte dat sommige chips op dezelfde plaats zaten. En met de multimeter kwam ik er achter dat een aantal chips ook nog eens op dezelfde manier verbonden zaten! Dit is niet zomaar een kloon, het is bijna een kopie!

Als je er over nadenkt is dat ook logisch. Deze kloon stamt uit 1973. Geen hulp van een computer, je wilt snel geld verdienen en op schema's krijg je geen copyright. De makers van mijn board hebben dus hele stukken 1 op 1 overgenomen en hun aanpassingen (zoals 4 spelers) gedaan.

Dus ik ben gaan zoeken. Ik had beeld, dus de timing voor het horizontale en verticale deel was in orde. Ik zag het net, de batjes en de boven en onderlijn. Scheelt een hoop werk!

Ik richtte mijn aandacht op de bal. Nu moet je wel weten hoe Pong (en consorten) werken. Eigenlijk draait alles om tellertjes. De bal heeft een horizontale en een verticale positie. Zodra het horizontale tellertje van de bal overeenkomt met het tellertje dat bijhoudt bij welke beeldlijn we zijn gaat deze een signaaltje geven. De verticale doet dat ook. Combineer die twee (als Horizontaal ťn Verticaal overeenkomen, dŠn geven we een seintje naar de monitor).

Met wat meten ontdekte ik dat er met deze tellertjes en de weergave van de bal niks mis was. Maar waarom vliegt ie dan als een bezetene over het scherm?

Pong heeft een variabele bal-snelheid. De bal gaat bij elke tik die hij krijgt van een batje steeds sneller. Dat gebeurt gedeeltelijk hier:

http://i166.photobucket.com/albums/u91/sjieto/blog-184-1175728871_zps18a2ff69.jpg

Rechts zie je het signaal 'move'. Dat zegt tegen de horizontale teller dat de bal een stukje verder mag. Als hij uit staat, staat ie stil, staat ie aan, beweegt de bal. Dat doen we natuurlijk niet vol open, maar dat doen we stapje voor stapje. Daarvoor zit de aansturing er omheen.

Dit signaaltje Move wordt gemaakt door een NAND, die twee stuursignalen samenvoegt en inverteert.

http://i166.photobucket.com/albums/u91/sjieto/IMG_6772_zps3efa22f1.jpg
Hier zie je die specifieke NAND aangesloten op de Logic Analyser.

http://i166.photobucket.com/albums/u91/sjieto/screenshotLA_zpsdc08d23d.png

Q1 komt van de 74107 die links zit, Q2 komt van de 74107 die rechts zit. Output is het signaal Move.

En hier zie je meteen het probleem: mijn NAND schakelt niet meer! Hij staat vol open. Kunstmatig 'laag' maken leverde een bal op die alleen verticaal bewoog, dus op en neer. Gevonden!

http://i166.photobucket.com/albums/u91/sjieto/IMG_6770_zpsa2deeca9.jpg
Geen batjes, het spel staat in 'attract' modus. Je ziet de bal als witte stip rechts op het scherm.

Tijd om eindelijk te doen wat ik al jaren wil doen: repareren!

http://i166.photobucket.com/albums/u91/sjieto/IMG_6773_zps8f593cf1.jpg
Deze moet er uit! In dit soort gevallen hanteer ik: de print is waardevol, het component is waardeloos. Het component mag dus stuk, de print niet.

http://i166.photobucket.com/albums/u91/sjieto/IMG_6775_zps6b2b3cb3.jpg
Met een scherp mes de pootjes losgesneden.

http://i166.photobucket.com/albums/u91/sjieto/IMG_6774_zpse1ee2900.jpg

http://i166.photobucket.com/albums/u91/sjieto/IMG_6776_zps3f091781.jpg
De pootjes voorzichtig uit de print gehaald.

http://i166.photobucket.com/albums/u91/sjieto/IMG_6778_zps39833b90.jpg
En met litze-draad (zuigdraad) de gaatjes vrijgemaakt.

http://i166.photobucket.com/albums/u91/sjieto/IMG_6779_zpsfe879428.jpg
En natuurlijk de nieuwe chip er in.

Tijd voor de test:



Nou dit is een flinke verbetering!

Ik ben nog niet klaar: ik mis nog natuurlijk controllers (ik beweeg de batjes nu met de calibratie-potmeters) en het spel gaat oneindig lang door op 1 muntje. Ook moet ik de vier-spelermodus nog achterhalen en (administratieve klus) een leuke behuizing maken voor het geheel.

Dus naast Space Invaders ga je ook Olympic Tennis af en toe zien op de blog!

[buildlog] Space Invaders RAM adressering en isolatie

Door sebastius op zaterdag 17 mei 2014 21:26 - Reacties (2)
Categorie: -, Views: 4.596

http://i166.photobucket.com/albums/u91/sjieto/SpaceInvaders_zps075851bd.gif


Dit is de derde post over mijn Space Invaders project.

Vorige posts:Temidden van een drukke periode op school (nou ja, wanneer is het eigenlijk rustig...) met CITO toetsjes en nog veel meer klussen is een beetje ontspanning best fijn. Mijn 'mancave'/werkkamer is inmiddels voorzien van een fijne muziek-installatie, gebaseerd op een gedoneerde defecte versterker en een paar speakers van de rommelmarkt. Er staat dus nu een mooie Marantz PM7000 (wederom: als je oude versterker defect is, check de solderingen!!!) en die drijft een viertal Jamo Compact 500 speakertjes aan. Soms betalen gokjes zichzelf goed uit.

Maar goed, daar komen jullie niet voor! Het is weer tijd voor een stukje Space Invaders. De vorige keer heb ik vrij kort door de bocht het volledige timing en video-gedeelte laten zien. Er was een wit beeld verkregen en alles is klaar om het spel echt te gaan bouwen.

Vandaag beschrijf ik het volgende stukje, het RAM en alles wat er omheen zit. Helaas kan ik niet iets 'werkends' laten zien, daarvoor moeten we wachten op de CPU en nog wat aanverwante stukjes. Ook zul je in de foto's nog niet alles aangesloten zien. Ik ben hard aan het werk met bouwen ;)

Ik ga proberen iets meer uitleg te geven en iets minder tegelijk te vertellen. Ik hoop dat je het kan volgen :)

Situatie

In het vorige deel had ik het al kort er over: de RAM wordt door zowel de CPU als het video-gedeelte gebruikt. Je kan je voorstellen dat als dat precies tegelijk gebeurt dat dat problemen oplevert. Bedenk je dat je samen met iemand een boek probeert te lezen, maar allebei op een andere pagina ;). Daarvoor hebben we in het vorige deel al voorzieningen getroffen met de diverse timing-signalen met als belangrijkste CPU-Wait, die de processor als het ware even 'in de wacht' zet.

Nu zitten we nog met een probleem, hoe weet het RAM waar (op welke bladzijde) hij moet zijn? De oplossing is best vernuftig (wederom, ik bedenk het niet, ik bouw het na en leg het uit): we maken voor de adres-lijnen (een chip heeft een x-aantal adreslijnen, in dit geval van A0 tot A12) een soort schakelbord van 74157 chips. Met ťťn schakeldraad kan ik per chip 4 adreslijnen schakelen (tussen CPU en GFX bijvoorbeeld).

Het een en ander heb ik weer in een schema getekend. Niet supernetjes maar ik hoop dat je met mijn uitleg het wel snapt. Klik hem maar weer open in een nieuw raampje en zet het even naast de post.

http://i166.photobucket.com/albums/u91/sjieto/ba378dc1-55eb-49c7-a4e1-85dd36d089cc_zpscd8880e3.jpg

Links van het RAM zie je 4x een 74157 getekend. De bovenste drie heb ik 'samengevat', daar moet je denken dat er 4x een A- en 4x een B-ingang en 4x een Y-uitgang opzitten. Die krijgen hun signalen vanuit de VID-adresbus en de CPU-adresbus. De eerste chip krijgt A0-A3, de tweede A4-A7, de derde A8-A11. De vierde chip heb ik niet samengevat omdat deze meer taakjes krijgt. Ook hier zit een adreslijn op, A12.

Wat gebeurt er? Zodra de videokaart iets nodig heeft uit het RAM dan wordt de lijn RAM-videocontrol gebruikt om de adresbus van het videogedeelte aan het RAM te knopen. (er gebeurt nog meer, dat komt zo). De data wordt dan op de databus gezet (bovenaan de RAMchip) naar de 74166 van de videokaart (vorige post, rechtsboven in het schema). Er komt dan een rijtje pixels in beeld. Dan gaat de aansturing weer uit tot de videokaart weer een rijtje pixels nodig heeft.

Nu wil nog een andere partij bij het RAM en dat is de CPU. Dat werkt bijna op dezelfde manier. Wat er anders is is dat de CPU soms ook wil schrijven. Daarvoor zit een extra stukje logica toegevoegd, linksonder in het schema.

De CPU-databus is geÔsoleerd met een 74245 (rechtsboven in het schema) tov het RAM. Dat zorgt ervoor dat je geen storingen in het beeld krijgt als de CPU iets doet op de databus. En andersom ook: als de videokaart bezig is, kan de CPU best nog iets doen. Twee voorlezers tegelijk naast je hoofd zou jij ook gek van worden ;)

Rechts zie je nog zielig en alleen de ROM zitten. Ook deze hangt gewoon aan de adres en databus. De A13lijn van de processor hangt aan de ChipSelect-lijn (_CS) van de ROM. Dat is een vernuftige, want deze hangt ook aan het RAM bij de CS lijn. Het verschil zit in de underscore (_). Dat betekent, net zoals de / voor sommige signalen dat het signaal geÔnverteerd is. Omgekeerd. Een hoog signaal op de bus betekent een laag signaal voor de chip, en andersom. Dus als A13 hoog is, staat het RAM aan, als A13 laag is, staat het ROM aan.

Uiteraard heb ik weer wat bouwfoto's geschoten:

http://i166.photobucket.com/albums/u91/sjieto/IMG_6736_zpsc8c334cf.jpg

De RAM chip en de 74245. De pennetjes zijn om de verbinding met de videokaart te maken. De lijntjes die je ziet zijn de 8 databits.

http://i166.photobucket.com/albums/u91/sjieto/IMG_6737_zps8cbda059.jpg

Hier zie je de twee boards naast elkaar aangesloten met behulp van kabeltjes die ik gesponsord heb gekregen van Opencircuit.nl, een andere knutseltweaker.

http://i166.photobucket.com/albums/u91/sjieto/IMG_6739_zps5c1dc97e.jpg

Hier zie je het meeste van het schema al in aanbouw. De eerste drie 74157's zijn toegevoegd, samen met pennen om straks op de video-adresbus aangesloten te worden.

http://i166.photobucket.com/albums/u91/sjieto/IMG_6760_zpse949c481.jpg

En hier ben ik alvast verder aan het proberen hoe ik de layout van de rest van de print ga vormgeven. De komende tijd ben ik nog wel zoet met deze kaart verder te bouwen...

Tot de volgende keer!

[buildlog] Space Invaders: Timing and Video

Door sebastius op donderdag 1 mei 2014 22:29 - Reacties (18)
Categorie: -, Views: 6.011

http://i166.photobucket.com/albums/u91/sjieto/SpaceInvaders_zps075851bd.gif


Dit is een tweede post (technisch gezien de derde) over mijn Space Invaders project.

Vorige posts:Heb je je riemen vast? We gaan eens even lekker knallen! Ik ben nog een schrijfstijl aan het zoeken waarin ik een goede mix van uitleg en tempo hanteer, dus soms zullen er wat ruwe kantjes aan zitten.

Theorie van Space Invaders

Ik heb even het blokdiagram van mijn voorbeeld geleend om duidelijk te maken hoe het spel in elkaar zit.

http://i166.photobucket.com/albums/u91/sjieto/BlockDiagram_zps8d465018.jpg
Drawing by Grant Searle

Het is goed om te beginnen bovenin, bij de klok. Die regelt door het hele spel heen alle timing van de verschillende functies (zoals cpu, spel-logica, video etc). Hij geeft ook aan wanneer iets moet gebeuren (bv een byte uit het ram richting het scherm duwen op het juiste moment, of de CPU even laten wachten omdat je iets met het beeld aan het doen bent).

Vanaf de klok gebeuren er twee belangrijke dingen: de processor en het video-gedeelte gaan aan het werk.

Het videogedeelte is een relatief dom ding. Hij telt en pakt op de juiste momenten een byte uit het ram geheugen en mikt dat richting het beeldscherm. Ook verzorgt het de synchronisatie voor het beeld (h-sync en vsync). Dit alles zie je boven en rechts van het RAM blokje.

De processor heeft wat meer te doen. Deze draait het spel en zet bijvoorbeeld het actuele beeld in het RAM. Maar ook de geluidjes, inputs en alles worden beheerd. Ook stuurt deze de 'shifter' aan, een slim stukje hardware dat eigenlijk een soort accelerator is zoals de GPU's nu doen. Hardware-acceleration, het bestond toen al (en was erg noodzakelijk!). Over de shifter komt een aparte blog zodra ik hem gebouwd heb :).

Wat ik niet heb besproken nog zijn de losse kleine blokjes die er tussen hangen. Die ga je vanzelf ontdekken. Met name de isolatoren en de I/O selector zijn wel interessant om even te onthouden.

Op basis van functies heb ik het spel in vier delen opgedeeld:

- Timing en video
- CPU, RAM, ROM, I/O
- Shifter
- Geluid

En omdat je ergens moet beginnen, en het fijn is snel te kunnen zien of een onderdeel z'n werk goed doet kies ik ervoor om als eerste me met de klok en de video bezig te houden.

Timing

Als eerste moet dit spel lopen. De CPU, een Z80, wil graag 3mhz. De videokaart heeft oa 15,625khz nodig voor het beeld (basisfrequentie voor een PAL scherm). En zo zijn er nog wel wat dingen die allemaal hun eigen ritme hanteren. Vooral de samenwerking tussen de CPU en het videogedeelte is sterk afhankelijk van timing.

Dit spel is opgebouwd met 1 RAM blok. In moderne systemen heb je apart video-geheugen, hier nog niet. En dat geeft een probleem. Als de CPU iets leest uit het RAM, dan is het niet beschikbaar om uitgelezen te worden door het videogedeelte. Dit zou, zonder maatregelen, leiden tot bv sneeuw in het beeld.

Wat mijn voorganger heeft bedacht (en voor hem de mensen die Space Invaders hebben ontwikkeld) is een slim timing-schema dat precies op het moment dat een byte nodig is voor het video-gedeelte (om 8 pixels te genereren) de processor even in de wacht gezet wordt.

Hieronder zie je dat weergegeven:

http://i166.photobucket.com/albums/u91/sjieto/timinglogic_zps697a4772.jpg

Bovenaan zie je de 3mhz klokfrequentie. WR-disable zet het schrijven naar het RAM uit, dan neemt RamVidcontrol de 'macht' over en dan mag er een byte ingelezen worden (S/I). In dit overzichtje mist nog de echte 'wait' lijn, die komt bij het processorboard.

Het is tijd om al deze theorie om te zetten in de praktijk. Ik heb het schema van Grant nagetekend zodat het wat beter leesbaar is:

http://i166.photobucket.com/albums/u91/sjieto/schematic_SI_display_zps4c78a2df.png

(zet deze even in een raampje naast de tekst zodat je de uitleg bij het schema kunt gebruiken.

We beginnen onze reis linksboven bij een 12mhz klokfrequentie. Deze drijft 3 programmeerbare 4bit-tellertjes aan, de 74191's. Deze zijn aan elkaar gekoppeld dmv de Ripple en Enable aansluitingen, dat ervoor zorgt dat ze elkaar opvolgen en je effectief een 12bit teller krijgt:

http://i166.photobucket.com/albums/u91/sjieto/IMG_6658_zpsa49699fa.jpg

Deze tellers zorgen voor de horizontale frequentie. Zodra de teller op 768 staat (uitgang A en B van de 3e chip) dan wordt de NAND (inverterende AND) laag en reset hij de horizontale teller via de LD-aansluitingen. Dit noemen we Hreset.

De B lijn van die 3e chip doet nog iets belangrijks, hij geeft het Hblank-signaal af. Dat betekent dat de beeldlijn klaar is en dat de TV naar de volgende lijn moet. Daarmee tikt ook automatisch de tweede groep tellers een lijntje verder, aangezien zij het verticale deel verzorgen.

De verticale teller is in de basis exact hetzelfde. De instellingen verschillen wat maar verder is er niet zoveel spannends aan. Deze maakt ook nog het Vblank signaal dat samen met Hblank weer zorgt voor een signaal dat we 'VideoActive' noemen. Juist, dat zorgt er voor dat de volgende chip weet dat het tijd is om iets te doen met het beeld.

Dan komen we bij de 74138. Ik denk dat je die het beste kan omschrijven als de grote aansturing. Deze zorgt ervoor dat de diverse wachtsignalen waar ik het eerder over had plaats vinden en dat de beeldchip een opdracht krijgt. Het is net een soort precisie-choreografie.

In het laatste stukje praten we niet meer over timing maar over video. De 74166 doet iets gaafs: hij pakt een byte die hij van het RAM krijgt aangeleverd en mikt die over 1 lijntje naar buiten. Hier is de video-data die we nodig hebben! We hebben zwart-witbeeld, dus het gaat alleen om aan en uit.

Maar met alleen videodata ben je er nog niet. Een beeldbuis heeft signalen nodig om zich op te synchroniseren (vroeger werd letterlijk de elektronenstraal hiermee naar de juiste plaats gedirigeerd). Daarvoor is het blokje rechtsonderin. Dat neemt de diverse timingsignalen en maakt er eerst Hsync en Vsync van, en daarna wordt daar een Composite-Sync gemaakt door deze signalen samen te voegen.

Als allerlaatste, helemaal onderaan de pagina worden de Csync en Video-data samengevoegd tot een composite-video signaal.

Bouwen!

Dit hele stuk van het schema heb ik inmiddels gebouwd (op het blokje rechtsbovenin van de CPU-wait na).

Ik begon simpel met alleen het horizontale tel-gedeelte:

http://i166.photobucket.com/albums/u91/sjieto/IMG_6646_zpsf74dfbe1.jpg

Bovenin het midden zie je een glimmend blokje, dat is mijn 12mhz klok. Links zie je de drie horizontale tellers, rechts de verticale. In het midden zit een 7400 NAND chip die dient als 'glue logic', het verbindende elementje dat je ook vaak in het schema ziet.

http://i166.photobucket.com/albums/u91/sjieto/IMG_6642_zpsdfce1025.jpg

Vrij snel in het begin ben ik ook gaan meten met een low-budget Logic Analyser. Je hebt hierboven al een paar screenshots gezien. Op deze manier check ik of wat ik bouw ook echt iets doet.

http://i166.photobucket.com/albums/u91/sjieto/IMG_6691_zpsbb3990ca.jpg

Een tweede fase, de verticale chips zijn aangesloten en ik ben verder met de 74138 (de 'baas' van alle timing' en de twee flipflopjes die er bij horen. Ook zie je in de tweede kolom een inverter erbij, een 7404, die wederom als 'lijm' dient.

En uiteindelijk ben ik hier uitgekomen:

http://i166.photobucket.com/albums/u91/sjieto/IMG_6701_zpsdcc08683.jpg
Dit is het gehele schema (minus de twee weerstanden en de eerder genoemde CPU-wait functie).

http://i166.photobucket.com/albums/u91/sjieto/si_video_chips_zps1ab00e3d.png
Blauw zijn de twee telgroepen (horizontaal en verticaal). Rood is de 'lijm', Groen is de 'baas', Geel zijn de flipflops voor de diverse functies en Oranje zijn de chips die voor het daadwerkelijke beeld zorgen. De boel zit rechts een beetje krap omdat ik eerst dacht die laatste kolom op een aparte print te plaatsen. Ach... Het werkt :P

Tijdens het solderen had ik professionele assistentie:
http://i166.photobucket.com/albums/u91/sjieto/IMG_6693_zps1d76ee47.jpg

(overigens eigenlijk af te raden, een kat is een flinke bron van statische elektriciteit :P )

Resultaat

Wat levert al dit werk op? Ik heb een schermpje aangesloten (zwart-wit tv van de koningsdagrommelmarkt, 50cent :P ) en kreeg het volgende:
http://i166.photobucket.com/albums/u91/sjieto/IMG_6696_zpsa152e480.jpg

Ziet er niet zo spannend uit natuurlijk (even de schuine lijnen negeren), maar eigenlijk is dit fantastisch! Je ziet een keurig afgemeten beeld, helemaal wit (want er is nog geen data aangeleverd aan de 74166). Maar de synchronisatie (Hsync, Vsync etc) is prima, en daar ging het mij om.

En wat nou als ik even vals speel? Ik heb nog geen spel maar ik kan best wat bitjes op die chip hoog en laag maken zodat er wat moet veranderen:
http://i166.photobucket.com/albums/u91/sjieto/IMG_6697_zps29d9f691.jpg

De zwarte verticale lijnen komen van het laag maken van 1 bitje op de 74166. Eigenlijk kun je nu wel stellen: het werkt! Er is een werkend timing en video-gedeelte, klaar voor de rest van het project!

De volgende stappen

Ik heb het spel in 4 brokken opgedeeld: timing/video, cpu/ram/rom/logic, shifter en geluid. Het eerste brok is nu klaar en ik ga door met het volgende deel. Ik denk dat ik nu aan de slag ga met de CPU, vooral omdat deze direct verbonden gaat zijn met het timing/video gedeelte en mogelijk al snel een rudimentair beeld gaat geven (het spel werkt natuurlijk niet zonder de shifter, maar ik moet IETS kunnen zien verwacht ik).

Voor de volgende boards moet ik wel even wachten. Ik heb wat flatcable besteld uit China om makkelijk 8 bits tegelijk te verbinden op een nette manier. Daarom sluit ik af met twee previews van hoe ik denk dat de boards gelayout gaan worden:

CPU board
http://i166.photobucket.com/albums/u91/sjieto/IMG_6698_zps4dde2aee.jpg

Shifter
http://i166.photobucket.com/albums/u91/sjieto/IMG_6699_zps09fb425c.jpg
(en ja er is een reden waarom het zo raar is opgesteld :P )

Schaamteloze reclame

Ik heb altijd een doorgaande stroom van computertjes. Er komt wat binnen, ik speel er mee, knap het op en verkoop het weer. Zo ook nu, ik heb drie toffe systemen in de aanbieding: een iMac, een HP laptop en een EEETop Touchscreen PC.

http://tweakers.net/aanbod/user/12601/