MOS-technologie CIA - MOS Technology CIA
De 6526/8520 Complex Interface Adapter ( CIA ) was een geïntegreerde schakeling gemaakt door MOS Technology . Het diende als een I/O-poortcontroller voor de 6502- familie van microprocessors, en bood parallelle en seriële I/O-mogelijkheden, evenals timers en een Time-of-Day (TOD) klok. Het meest prominente gebruik van het apparaat was in de Commodore 64 en Commodore 128 (D) , die elk twee CIA-chips bevatten. De Commodore 1570 en Commodore 1571 diskettestations bevatten elk één CIA. Verder gebruikten de Amiga thuiscomputers en de Commodore 1581 floppy disk drive een aangepaste variant van het CIA circuit genaamd 8520. 8520 is functioneel equivalent aan de 6526 behalve de vereenvoudigde TOD circuits.
Parallelle I/O
De CIA had twee 8-bits bidirectionele parallelle I/O-poorten. Elke poort had een bijbehorend Data Direction Register, waardoor elke datalijn afzonderlijk kon worden ingesteld op invoer- of uitvoermodus. Een lezing van deze poorten gaf altijd de status van de individuele lijnen terug, ongeacht de datarichting die was ingesteld.
Seriële I/O
Een intern bidirectioneel 8-bits schuifregister stelde de CIA in staat om seriële I/O te verwerken . De chip kan seriële invoer accepteren die is geklokt van een externe bron, en kan seriële uitvoer verzenden die is geklokt met een van de ingebouwde programmeerbare timers. Er werd een interrupt gegenereerd wanneer een 8-bits seriële overdracht was voltooid. Het was mogelijk om een eenvoudig " netwerk " te realiseren door het schuifregister en de klokuitgangen van meerdere computers met elkaar te verbinden. De maximale bitrate is 500 kbit/s voor de 2 MHz-versie.
De CIA heeft een oplossing voor een bug in het seriële schuifregister in de eerdere 6522 VIA opgenomen . De CIA was oorspronkelijk bedoeld om snelle communicatie met een diskdrive mogelijk te maken, maar kon uiteindelijk niet worden gebruikt vanwege de wens om diskdrive-compatibiliteit met de VIC-20 te behouden ; in de praktijk moest de firmware van de 1541- drive zelfs langzamer worden gemaakt dan zijn Vic-20-voorganger om een gedrag van de videoprocessor van de C64 te omzeilen , die bij het tekenen van het scherm de CPU elke 512 microseconden 40 microseconden en in die tijd uitschakelde kan niet naar de bus luisteren, met het risico iets te missen.
Intervaltimers
Er waren twee programmeerbare intervaltimers beschikbaar, elk met een precisie van minder dan een microseconde . Elke timer bestond uit een 16-bits alleen-lezen vooraf instelbare teller en een bijbehorende 16-bits alleen - schrijven latch . Telkens wanneer een timer werd gestart, werd de vergrendeling van de timer automatisch gekopieerd naar zijn teller, en de teller zou dan met elke klokcyclus afnemen tot onderstroom, waarbij een onderbreking zou worden gegenereerd als de CIA was geconfigureerd om dit te doen.
De timer kan ofwel in "one-shot" modus lopen, stoppend na onderstroom, of in "continue" modus, waarbij de vergrendelingswaarde opnieuw wordt geladen en de timercyclus opnieuw wordt gestart. Naast het genereren van interrupts, kan de timeruitgang ook worden gepoort naar de tweede I/O-poort.
Zoals geconfigureerd in de Commodore 64 en Commodore 128 , werd de timing van de CIA gecontroleerd door de Ø2-systeemklok, nominaal één MHz . Dit betekende dat de timers met tussenpozen van ongeveer een microseconde werden verlaagd, waarbij de exacte tijdsperiode werd bepaald door het feit of het systeem de NTSC- of PAL- videostandaard gebruikte. In de C-128 werd de klok uitgerekt, zodat de timing van de CIA niet werd beïnvloed door het feit of het systeem in de LANGZAAM of SNELLE modus draaide.
Het was mogelijk om relatief lange timing-intervallen te genereren door timer B te programmeren om de underflows van timer A te tellen. Als beide timers werden geladen met de maximale intervalwaarde van 65.535, zou een timinginterval van één uur, 11 minuten en 34 seconden resulteren.
Tijd-van-dag (TOD) klok
In de CIA is een realtime klok ingebouwd, die een tijdwaarnemingsapparaat biedt dat beter aansluit bij de menselijke behoeften dan de microsecondenprecisie van de intervaltimers. De tijd wordt bewaard in het Amerikaanse 12-uurs AM / PM-formaat. De TOD-klok bestaat uit vier lees-/schrijfregisters: uren (waarbij bit 7 fungeert als de AM/PM-vlag), minuten, seconden en tienden van een seconde. Alle registers worden uitgelezen in BCD- formaat, waardoor het codeer-/decodeerproces wordt vereenvoudigd.
Als u uit de registers leest, wordt altijd de tijd van de dag weergegeven. Om een carry-fout tijdens het ophalen van de tijd te voorkomen, zal het lezen van het urenregister het bijwerken van het register onmiddellijk stoppen, zonder effect op de interne nauwkeurigheid van de tijdwaarneming. Zodra het tiendenregister is gelezen, wordt het bijwerken hervat. Het is mogelijk om elk ander register dan het urenregister "on the fly" uit te lezen, waardoor het gebruik van een lopende TOD-klok als timer een praktische toepassing is. Als het urenregister wordt uitgelezen, is het echter essentieel om het tiendenregister achteraf uit te lezen. Anders blijven alle TOD-registers "bevroren".
Het instellen van de tijd houdt in dat de juiste BCD-waarden in de registers worden geschreven. Een schrijftoegang tot het urenregister zet de klok volledig stil. De klok start pas weer als er een waarde in het tiendenregister is geschreven. Vanwege de volgorde waarin de registers in de geheugenmap van het systeem verschijnen , is een eenvoudige lus voldoende om de registers in de juiste volgorde te schrijven. Het is toegestaan om alleen naar het tiendenregister te schrijven om de klok in actie te "duwen", waarbij de klok na een hardware-reset om 1:00:000.0 begint.
Naast de tijdwaarnemingsfuncties kan de TOD worden geconfigureerd om als wekker te fungeren , door ervoor te zorgen dat deze op elk gewenst moment een onderbrekingsverzoek genereert . Vanwege een bug in veel 6526's (zie ook errata hieronder), zou de alarm-IRQ niet altijd optreden wanneer de secondencomponent van de alarmtijd precies nul is. De oplossing is om de tiendenwaarde van het alarm in te stellen op 0,1 seconde.
Het interne circuit van de TOD-klok is ontworpen om te worden aangedreven door een sinusgolfsignaal van 50 of 60 Hz . Zoals gebruikt in de C-64 en C-128(D), leverde de voeding van de computer een dergelijk signaal van het lichtnet, wat resulteerde in een stabiele tijdwaarnemer met weinig drift op de lange termijn. De mogelijkheid om met beide netfrequenties te werken, maakte het mogelijk om een enkele versie van de 6526 te gebruiken in computers die werden gebruikt in landen met een vermogen van 50 of 60 Hz. Het is belangrijk op te merken dat, in tegenstelling tot wat vaak wordt gedacht, NTSC- of PAL- videostandaarden niet direct gekoppeld zijn aan de netstroomfrequentie. Bovendien ontleenden sommige computers hun TOD-klokfrequentie niet aan het lichtnet. Zowel NTSC- als PAL- varianten van de Commodore SX-64 gebruiken bijvoorbeeld een 60 Hz TOD-klok die wordt geleverd door een speciaal kristal. Het KERNAL- besturingssysteem in de Commodore 64 bepaalt bijvoorbeeld de videostandaard tijdens het opstarten van het systeem, maar probeert noch de geleverde TOD-klokfrequentie te identificeren, noch de CIA's correct te initialiseren op 50 Hz aangedreven machines. Het is dus de verantwoordelijkheid van elke applicatiesoftware die de TOD-functie van de CIA wil gebruiken om de geleverde frequentie te bepalen en de CIA-vlag dienovereenkomstig in te stellen. Als u dit niet doet, kan de klok snel afwijken van de juiste tijd.
De 8520-revisie van de CIA, zoals gebruikt in de Amiga en de Commodore 1581 diskdrive, wijzigde de tijdklok in een 24-bits binaire teller, ter vervanging van het BCD- formaat van de 6526. Ander gedrag was echter vergelijkbaar. .
Versies
De CIA was beschikbaar in versies van 1 MHz (6526), 2 MHz (6526A) en 3 MHz (6526B). Het pakket was een JEDEC- standaard 40-pins keramische of plastic DIP . De 8520 CIA, met zijn aangepaste tijdklok, werd gebruikt in de Amiga- computers.
Commodore embedded gereduceerde (slechts 4 registers) CIA-achtige logica voor de verlaagde Commodore 1571 in de C128DCR (zie Commodore 128 ) in een poortarray genaamd 5710 die ook andere functies bevat. De 5710 CIA heeft de seriële klok voor de snelle seriële interface vast aangesloten op een CIA6526 equivalent Timer A-waarde van 5, wat leidt tot een per-bit tijd van 5μs bij verzending. Dit is anders dan wat een Timer A-waarde van 6 was in de 6526 CIA in de originele Commodore 1571 . De 5710 CIA bevat geen timer- of timercontroleregisters. Het bevat slechts twee poortregisters en het register om de seriële shifter en zijn gebeurtenis te besturen.
Errata
Naast de eerder genoemde wekker-interrupt-bug, vertoonden veel CIA's een defect waarbij het onderdeel geen timer B-hardware- interrupt zou genereren als het interrupt control register (ICR) één of twee klokcycli werd gelezen vóór het tijdstip waarop de interrupt zou moeten plaatsvinden. daadwerkelijk hebben plaatsgevonden. Dit defect, evenals logische fouten in het door Commodore geleverde (8 bit) besturingssysteem, veroorzaakten frequente pseudo- RS-232- fouten in de Commodore 64 en Commodore 128 computers bij hogere baudrates .
Referenties
Externe links
- MOS 6526 CIA-gegevensblad (GIF-formaat, gezipt)
- MOS 6526 CIA-gegevensblad (PDF-formaat)