Microcomputers
Hardware adressen
Blogberichten
Root » TechTalk » Historisch perspectief » Eerste microcomputers

Eerste microcomputers

De eerste microcomputers bestonden uit niet veel meer dan een processor met een 8 bits databus en een 16 bits addressbus. Het beschikbaar geheugen was beperkt tot bijvoorbeeld 48kB want een paar adressen waren gereserveerd (hardware adressen).

De microprocessor heeft een aantal registers, dat zijn interne geheugenplaatsen. Dit zijn de voornaamste registers:
  • de accumulator: daarin wordt het resultaat van een bewerking opgeslagen. De accumulator dient eveneens als bron bij de meeste operaties. De accumulator is even breed als de databus, dus 8 bits.

  • de program counter: is een teller die aangeeft waar dat de volgende instructie opgehaald moet worden. De teller loopt automatisch op, zodat de instructies in volgorde uitgevoerd worden, maar speciale instructies kunnen de program counter wijzigen (jump instructies). De program counter is 16 bits breed.

  • de stackpointer: dit is een pointer die gebruikt wordt bij interruptafhandeling. Na de afhandeling moet het programma verder verlopen, daarom wordt het adres van de instructie dat onderbroken werd in de stack opgeslagen. Omdat een interrupt zelf onderbroken kan worden is dit geen intern register, maar een gebied in het geheugen. De stackpointer wijst naar de volgende vrije plaats. De software moet controleren dat de stack voldoende groot gemaakt wordt.

  • een statusregister die bit per bit kan worden getest. De meeste instructies zetten een bit in de statusregister: overflow, interrupt, kleiner dan nul, nul. De processor test niet de inhoud van de accumulator, maar een statusbit.

  • Een aantal registers voor intern gebruik, om tijdelijke resultaten op te slaan, om indirecte adressering toe te passen (indexregisters). De registers zijn 8 bits breed, maar twee indexregisters kunnen samen gebruikt worden om een geldig adres te vormen. Soms wordt de waarde van een 8 bits indexregister opgeteld bij een adres (offset).

Videogeheugen

Een deel van het RAM geheugen was voorbehouden aan het videogeheugen. Iedere positie op het scherm kwam overeen met een bepaalde geheugenpositie. Door op die specifieke geheugenposities te schrijven werden de tekens zichtbaar op het scherm. De BASIC instructie PRINT "Hello World!" doet niet veel meer dan de tekens in het videogeheugen te schrijven. De eerste computers die een display hadden van bijvoorbeeld 24 regels van 64 tekens hadden genoeg met 1536 bytes voor het videogeheugen.

Omdat er met het ASCII alfabet gewerkt werd (128 tekens) konden de overblijvende 128 kodes gebruikt worden voor bijvoorbeeld speciale grafische tekens of de normale tekens, maar dan invers.

Een andere mogelijkheid was één byte voorzien voor het teken en één byte voorzien voor het attribuut (kleur van het teken en van het achtergrond). Zo kon men beschikken over 16 kleuren voor het teken en 16 kleuren voor de achtergrond (dit was een standaard in de meeste BASIC versies). Hier worden de codes vanaf 128 gebruikt voor speciale tekens (letters met accenten, grafische tekens en andere symbolen).

De decoder las iedere geheugenpositie in (in ons voorbeeld 1536 bytes) in en bouwde het corresponderend beeld regel per regel op. Het inlezen van het teken op een bepaalde geheugenpositie gebeurde tussen twee processor-opdrachten door (interleave), want het geheugen kon geen twee opdrachten simultaan uitvoeren. De beeldopbouw gebeurde synchroon met de weergave op het scherm.

De eerste microcomputers hadden natuurlijk geen grafische mogelijkheden, maar door verder te bouwen op het systeem van de memory mapping kon men een grafisch videogeheugen voorzien. Het standaard VGA scherm heeft 640 punten en 480 lijnen, dat wilt zeggen dat er 37.5kB nodig waren voor een monochroom beeld (640 / 8 = 80 bytes per lijn, 80 * 480 lijnen = 38.400 bytes). Kleur was dus niet mogelijk met de eerste computers, er was gewoon te weinig geheugen beschikbaar!

Processor configuratie

Een microprocessor heeft een addressbus (16 bits), een databus (8 bits) en een paar controle-lijnen:
  • Een kloksignaal om de periferie te synchroniseren
  • Een R/W signaal om aan te geven of de databus als input of output werkt (inlezen van data naar de processor of uitsturen van data op de databus). Dit signaal wordt door de microprocessor gegenereerd.
  • Een hoofdinterrupt signaal (NMI: non-masquable interrupt) die de processor reset (ingang van de processor)
  • Een normaal interrupt signaal om de processor te vertellen dat er een event gebeurt is (de gebruiker heeft bijvoorbeeld een toets ingedrukt)
  • Een halt signaal om de processor kortstondig stil te leggen (de videodecoder moet toegang krijgen tot het geheugen om een byte te lezen)

De addressbus is unidirectionneel en komt van de microprocessor. Als de videodecoder het geheugen moet lezen, dan wordt de microprocessor stilgelegd en zet de videodecoder een adres op de bus.

De databus is bidirectionnel: de processor kan data uitsturen (plaatsen van data in het geheugen) en data inlezen (plaatsen van data in de accumulator).

Hardware addressen

De processor heeft echter te weinig aansluitingen om verschillende opdrachten uit te sturen. Daarbij kunnen de opdrachten verschillend zijn naargelang de toepassing. Een spelcomputer zal bijvoorbeeld de positie van de joystick inlezen, terwijl een computer voor meer zakelijke toepassingen zal het toetsenbord inlezen.

Om de processor verschillende commando's te laten uitsturen gebruikt men hardware adressen. Dit zijn adressen die niet overeenkomen met fysische adressen (er is geen geheugen gedefinieerd op deze positie), maar door een speciale decoder omgezet wordt naar signalen. Na het uitsturen van een commando wordt de processor vaak in "halt" gezet, zodat de periferie de informatie kan terugmelden via de databus.

De adressen $FFF0 tot $FFFF worden bijvoorbeeld als hardware adressen gebruikt (de processor kan dus 16 verschillende opdrachten geven).

Een voorbeeld is het inlezen van het toetsenbord. Als de gebruiker een toets indrukt wordt de data in een buffer opgeslagen en een interrupt gegenereerd. De interrupt routine zal een speciale waarde op de addressbus plaatsen om opdracht te geven aan de keyboard decoder om de kode van de toets op de databus te plaatsen. Direct daarna wordt de processor stilgelegd, zodat enkel de keyboard decoder gegevens op de databus kan zetten. De processor wordt weer opgestart en leest wat er op de databus staat. De data wordt gecontroleerd (bijvoorbeeld soft reset), in het geheugen opgeslagen voor verdere verwerking en de interrupt routine wordt verlaten.

De hardware adressen worden voor uiteenlopende opdrachten gebruikt: starten van de motor van de cassetterecorder, schrijven van één byte naar de cassetterecorder of een input/output poort (serieele of parallele verbinding), lezen van een inputbuffer, enz. Het resultaat van de operatie wordt op de adresbus gezet, want het is de enige bus die bidirectionnel is.

Werkgeheugen

Het werkgeheugen (RAM) van de microcomputers was beperkt tot 48kB. Een deel van dat geheugen was gereserveerd voor de firmware (ROM). In het ROM geheugen zat het (beperkte) operating system, vaak een basic interpreter en basic instructies voor het lezen van de randapparatuur. Als er in latere versies een schijfstation gebruikt werd (dat waren floppies van 120kB), dan werd de Disk Operating System (DOS) in RAM geladen.

Er waren echter ook microcomputers die de limiet van 64kB (totaal geheugen) konden omzeilen door speciale technieken zoals bank switching. Met een addressbus van 16 bits is het maximum geheugenbereik beperkt tot 64kB.

Er bestaan twee soorten memory bank switching.

  • Waarbij het volledig geheugen geschakeld wordt. Ieder bank moet dan een deel systeem-routines bevatten (interrupt afhandeling en bank switching), maar verder is ieder bank volledig gescheiden en het copieren van data van de ene bank naar de andere is niet voorzien. Een dergelijk systeem kan bij minicomputers gebruikt worden bij multitasking, waarbij iedere gebruiker zijn eigen geheugen heeft.

  • Waarbij een deel van het werkgeheugen (bijvoorbeeld 16k) wordt geschakeld. De banken kunnen gebruikt worden voor data-opslag. Als de data nodig is, wordt die gecopieerd naar een deel van het hoofdgeheugen of wordt er direct in de bank gewerkt (bijvoorbeeld om te controleren of een bepaalde datastring aanwezig is). Bij Apple kon er van bank geschakeld worden om over te gaan van applesoft basic naar de basic integer interpreter.
Hier ook wordt een hardware address gebruikt voor de bank switching. Indien men 8 banks van 16k heeft wordt het werkgeheugen uitgebreid tot 131.072 bytes. Het is echter geen lineair geheugen, men kan geen gegevens uit een bank vergelijken of copiëren naar een andere bank, men moet steeds via het hoofdgeheugen passeren, en die is in ons geval beperkt tot minder dan 48kB.

Maar hoeveel is 64k? Om deze afbeelding (200 * 271 pixels) te bewerken of te tonen heb je 54.200 bytes nodig als we één byte voorzien per pixel (GIF met 256 kleuren). Werken we in "true color" (24 bits/pixel), dan hebben we driemaal zoveel geheugen nodig om de foto te bewerken.

Het is dan ook normaal dat de beeldresolutie van de eerste computers heel beperkt was. Ofwel koos men voor een relatief hoge resolutie (768 * 768 pixels), maar dan was het beeld monochroom (één bit per pixel), ofwel een middelmatige resolutie (256 * 256 pixels) en 16 kleuren (VGA-norm). Grafische toepassingen zouden pas mogelijk worden als de computers met méér dan 1MB uitgerust werden. Vaak zat er op de videokaart extra geheugen, zodat de beeldopbouw volledig op de videokaart kon gebeuren en er geen rekentijd van de processor nodig was.

Bij de opslag wordt de foto gecomprimeerd opgeslagen (JPEG formaat), waarbij het bestand kleiner wordt, van 162.600 bytes naar 33.600 bytes.

Links to relevant pages - Liens vers d'autres pages au contenu similaire - Links naar gelijkaardige pagina's