De meeste projecten van mij kosten vele jaren. Niet continu, want op een gegeven moment loop ik vast en pak ik een ander – soms nieuw – project weer op. Dankzij de vondst van een unieke 6502 experimenteersysteem op een zolder, heb ik de laatste weken mijn ‘dode computer’ project weer opgepakt.

hetlab logo
Henk van de Kamer

 

Tijdens het helpen van een vriend met het leegmaken van een ouderlijk huis vonden we de nodige interessante computerspullen. In deze aflevering ga ik de Promax MI-650C μ-instructor (http://retro.hansotten.nl/6502-sbc/promax-mi-650-trainer) uitzoeken. Dit exemplaar was lang geleden besteld, maar tijdens zijn reis opeens niet meer te traceren. Een tweede exemplaar kwam wel aan en staat bij mijn vriend. Blijkbaar heeft de eerste uiteindelijk zijn bestemming alsnog bereikt om vervolgens op zolder te verdwijnen..

337 promax l 2
                Promax MI-650C μ-instructor


6502

Omdat een tweede exemplaar weinig nut heeft en ik nog steeds bezig ben met mijn “dode computer” (zie PC-Active #328) idee, kreeg ik dit tweede exemplaar. De μ-instructor is in de jaren tachtig en negentig op Spaanse scholen gebruikt als lesmateriaal voor het leren programmeren van de 6502 processor in machinetaal.

Oud gedienden weten dat ik in 1986 een cursus machinetaal (https://www.hetlab.tk/embedded/6502-machinetaal) voor de Commodore 64 heb gevolgd. Deze heeft een 6510 processor, maar die is niets anders dan een verkapte 6502 met als extra een 8 pins – zes bruikbare – I/O poort. Via deze kunnen onder andere de verschillende ROM-chips worden uitgeschakeld zodat bijna de volledige 64 kilobyte aan geheugen gebruikt kan worden. Qua machinetaal zijn beide identiek, ofwel ik zou zonder problemen de 6502 moeten kunnen programmeren mits ik mijn kennis wat opfris.

Chips

Op de genoemde website zijn twee varianten gefotografeerd en wordt een MI-650B genoemd. De documentatie van mijn versie is de meest uitgebreide en bevat zeer veel oefeningen voor studenten. Ik vermoed dat dit het dictaat is dat tijdens de lessen werd gebruikt. Helaas is het geheel in het Spaans en is een scan van mindere kwaliteit. Deze is via OCR voorzien van een tekstversie, zodat knippen en plakken van tekst in Google Translate tot de mogelijkheden behoort. Gelukkig is ook zonder kennis van Spaans het nodige te begrijpen dankzij de figuren, machinetaal en aanduiding van knoppen. Dit alles is niet optimaal, maar ik heb geen online dienst gevonden die de 483 pagina’s omzet naar een Engelse tekst...

Op de printplaat zijn twee 28 pins chips te vinden met een sticker. Die met de opdruk OPC-650 BOOT V1.0 is een SGS-Thomson – tegenwoordig afgekort als ST – Microelectronics TS 27C64A. Dit is een 8 kilobyte grote UV-wisbare EPROM – Electrically Programmable ROM – en bevat onder andere het monitorprogramma. De andere heeft als opdruk MI-650C v1.02 en is een ST – inderdaad zelfde fabrikant – M2764AFI. De eerste gebruikt de CMOS-technologie en de andere het oudere NMOS. Waarom beide niet hetzelfde type zijn, is mij onduidelijk. Als ik het Spaans goed begrijp, bevat deze laatste de uitwerking van alle opdrachten.

Tot slot hebben we nog een HM6264LP-12 en dat is 8 kilobyte SRAM – Static RAM – geheugen van Hitachi. Er zijn nog meer chips, maar voor nu zijn deze belangrijk.

Bootstrap?

Het wissen via UV-licht – de genoemde stickers dus niet verwijderen – is tegenwoordig minder gebruikelijk. In plaats daarvan gebruiken we een EEPROM – Electrically Erasable / Programmable ROM. Hoe dat handmatig – zonder computer! – kan, heb ik ondertussen uitgezocht (https://www.hetlab.tk/embedded/eeprom-handmatig-programmeren). Omdat alle drie aanwezige chips dezelfde pinout hebben als het exemplaar in genoemd experiment, moet ik deze volgens mij kunnen uitwisselen. Zo ja, dan heb ik nu een experimenteeromgeving om het geheel te bootstrappen: verwijder beide EPROM’s en vervang deze door een EEPROM met daarin een handmatig geprogrammeerde bootstrap.

Klinkt simpel? Niet helemaal. De hamvraag is hoe gemakkelijk – lees hoeveel bytes in machinetaal – kunnen we de in- en uitvoer aansturen. De MI-650C gebruikt zes stuks zeven segment displays: vier voor de adresbus en twee voor de databus. De 6502 kan maximaal 64 kilobyte adresseren ofwel zestien bits, wat neerkomt op vier hexadecimale karakters in het display. En omdat het geheel een 8 bits processor is, zijn twee hexadecimale karakters afdoende voor de data op een bepaalde adreslocatie. Uiteraard moeten we die via de aanwezige toetsen doorgeven.

Het aansturen van het toetsenbord en display is het absolute minimum dat nodig is om de rest op het systeem zelf te kunnen programmeren. Dat kan in het SRAM-geheugen die het programma bewaard zolang het systeem onder spanning staat. Uiteraard is de volgende klus code om dat geheugen te kunnen bewaren via de aanwezige cassettepoort of het vervangen van de handmatige signalen door computergestuurde signalen om een EEPROM verder te programmeren.

7-segmentdisplay

Het aansturen van een 7-segmentdisplay kan op twee manieren. Het geheel bevat zeven leds in de vorm van het cijfer acht. De cijfers 0 t/m 9 zijn gemakkelijk zelf te bedenken. Voor de A t/m F moeten we hoofd- en kleine letters door elkaar gebruiken. Het resultaat is te zien in figuur 1. Ofwel door de juiste segmenten van een spanning te voorzien, kunnen we het gewenste hexadecimale cijfer tonen.

337 hexdigits 2
Representatie van alle hexadecimale cijfers

Het voorzien van een spanning kan continu, maar dat vraagt een stroom door gemiddeld 4,9 segmenten. De benodigde stroom is afhankelijk van het gebruikte display, maar 10 milliampère is vrij gebruikelijk. Voor de zes stuks komen we dan op bijna 300 mA, hetgeen een probleem op zich kan zijn. De andere truc is gebruikmaken van de eigenschappen van het menselijk oog. De meeste van ons zien een stilstaand beeld als een led zo’n 25 keer per seconde even wordt aangezet. Het oplichten en vervolgens weer uitdoven is dan niet meer waarneembaar en het geheel lijkt continu aan te staan. Tezamen hebben we 42 segmenten maal 25 keer schakelen is 1050 keer per seconde één segment wel (70% kans) of niet (30% kans) aanzetten. Waarmee de gemiddeld benodigde stroomsterkte terugvalt naar slechts 7 mA.

Reset vector

Welke methode – en binnen deze zijn weer variaties mogelijk – door de MI-650C wordt gebruikt, is mij op dit moment niet duidelijk. De oplossing is de machinetaalcode te bestuderen in de EPROM’s. Diens inhoud is te vinden in appendix D (pagina 443 t/m 476) van de gevonden handleiding. Daarin de weg vinden, lijkt moeilijk, maar is dat niet. Zodra de 6502 onder spanning wordt gezet, wordt diens interne PC – Program Counter – voorzien van de waarde op adreslocatie $FFFC en $FFFD ofwel de reset vector. De PC vertelt de processor op welke locatie de volgende instructie gelezen moet worden. De MI-650C heeft als waarde:

    FFFC    71 FF

De 6502 gebruikt little-endian ofwel de laagste waarde eerst. De PC krijgt dus de waarde $FF71. We kunnen dit controleren door het indrukken van de toetsen RESET en MEM. De eerste toont kort 650 C en dan - - - - - -. De tweede toets – mijn versie reageert soms pas na een paar keer – toont een adreslocatie met een punt achter elk hexadecimaal cijfer. Die punt geeft aan dat we nu een adres in kunnen tikken, ofwel toets F, F, F en C. Als alles correct is, drukken we op de FIN-toets, waarna op de databus de waarde op deze geheugenlocatie verschijnt. Wederom met punten, ofwel we kunnen nu de waarde aanpassen. Omdat het adres naar een ROM-locatie verwijst, heeft dat weinig nut. De complete procedure herhalen – moet nog uitzoeken of het niet handiger kan – met F, F, F en D als adres bevestigd bovenstaande.

Reset

Aangezien de gevonden locatie aangeroepen wordt na een reset – of natuurlijk  direct na het aanzetten – mag duidelijk zijn wat hier gedaan wordt. De instructies beginnen met:

    FF71    A2 FF       LDX #0FFH

    FF73    9A          TXS

    FF74    D8          CLD

    FF75    20 27 F1    JSR M_PATCH2

De eerste kolom is het geheugenadres, gevolgd door de machinetaalinstructies. Dat is het deel wat in de EPROM te vinden is en wat de 6502 processor begrijpt. De derde kolom is een leesbare versie, ofwel de assembly code. De LDX staat voor LoaD X register – een tijdelijke opslag in de processor zelf – en het deel daarachter is de notatie die de gebruikte assembler vertelt dat we deze willen vullen met een $FF-byte. De A2 is de opcode – machinetaalinstructie – van deze variant hoe het X-register van een waarde kan worden voorzien. De FF spreekt voor zich. Toch?

Tot slot

Helaas moet ik op dit punt stoppen. Het commentaar in de gedocumenteerde versie geeft aan dat de vierde regel onderdeel is van het initialiseren van de 65C22-chip. Dat is een bekende I/O-chip die vaak gecombineerd wordt met de 6502-processor.