Digitale techniek: SC/MP (1977)
SC/MP-gebaseerde microcomputer voor datacollectie
Toen in 1977 de eerste type microprocessoren op de markt kwamen, begon TNO met het onderzoeken van de mogelijkheden om deze apparaten te gebruiken voor het meten van fysische parameters en het verzamelen van gegevens uit meetopstellingen. De eerste microprocessor waarmee we experimenteerden was een SC/MP oftewel ISP.8A/600D. Die microprocessor werd geproduceerd door National Semiconductors (tegenwoordig Texas Instruments) met de voor die tijd indrukwekkende specificaties van een 4 MHz-processor en 64 kB geheugen.
De OEM-productinformatie van de SC/MP die we ontvingen bestond uit:
- Een beschrijving van de SC/MP microprocessor
- Een folder over de voordelen van het gebruik van een SC/MP microprocessor en de mogelijke toepassingen daarvan
- Beschrijving van de Input/Output signalen van de microprocessor
- Een functionele beschrijving van de SC/MP microprocessor, en
- Een handleiding over hoe de SC/MP microprocessor gebruikt moest worden.
1019/5000
Met behulp van een artikel geschreven door Dan Grove, een microcomputer-instructeur uit Santa Clara, is een microcomputer ontwikkeld om bij TNO besturings- en datacollectie-experimenten uit te voeren.
De SC/MP microcomputer
In een niet-standaard behuizing met een 220 V-aansluiting en een 5V gelijkstroomtransformator is een wire-wrap bord van 12 bij 15 cm geplaatst. Op het bord met pennen zijn daarna IC-connectoren (Integrated Circuit) gemonteerd. De SC/MP-processor vereiste een 40 polige wire-wrap IC-connector. Twee 256 woorden van vier bits Random Access Memory (RAM) waren beschikbaar voor gebruikersprogramma(s). Het besturingssysteem (OS), een programma voor het besturen van de microcomputer, werd in drie Read Only Memory (ROM)-chips van elk 32 8-bits woorden gebrand. Geheugen was overigens op dat moment heel duur (het minimaliseren van het geheugengebruik veroorzaakte de latere millenniumproblemen).
De wire-wrap-verbindingen werden gemaakt met een wire-wrap pen of met een elektrisch gereedschap op batterijen. Wire-wrapping betekende: de isolatie van een geïsoleerde massieve koperen kerndraad werd gestript over anderhalve tot twee centimeter en gewikkeld rond een vierkant pin. De microcomputer, de geheugen-IC’s, de besturingselektronica en de invoer- en uitvoerschakelingen werden zo allemaal op het bord gemonteerd. De wire-wrap-verbindingen waren gasdicht; alle wire-wrap verbindingen werken nog steeds foutloos.
De 8-bits parallelle gegevensinvoer voor de microcomputer werd uitgevoerd met acht schakelaars en een gegevensinvoer-drukknoppen op het voorpaneel van de microcomputer. De uitvoer naar de gebruiker gebeurde door middel van acht LED’s op het voorpaneel.
De uitvoering van een gebruikersprogramma door het microprocessorsysteem kon worden beïnvloed door vier bedieningsschakelaars op het bedieningspaneel:
- INIT/ABORT-drukknop stopt de uitvoering van het programma, initialiseert vervolgens de microprocessor en stelt de programmateller terug op nul. </ li>
- PROG HALT-schakelaar: als een HALT-instructie was geprogrammeerd, werd die instructie herkend. De verdere uitvoering van het programma stopte maar kon deze opnieuw worden gestart met behulp van de RUN-schakelaar </ li>
- SINGLE INSTR-schakelaar: indien ingeschakeld (aan de kant van de afgedrukte tekst), dan ging het gebruikersprogramma één instructiestap verder bij iedere keer dat de RUN-knop werd ingedrukt. </ li>
- RUN: na elke onderbreking in de uitvoering van een programma (door de INIT/ABORT-schakelaar, na een HALT of door de SINGLE INSTR.-functie), ging het interne ROM-programma (besturingssysteem) of de uitvoering van de gebruikersprogramma verder.
In het ontwerp hierboven zijn de acht uitgangsleds te herkennen. Ze werden geadresseerd door de adreslijnen AD08 en AD09. De signaalleiding WDS (Write Strobe Output) wordt onder de diodes weergegeven. De acht data-invoerschakelaars (links) zijn voorzien van een bufferschakeling om het klapperen van de signalen te voorkomen.
Het ROM ‘besturingssysteem’ dat ingegeven instructies leest van het schakelpaneel
Object code | Symbolische code | Beschrijving | |
---|---|---|---|
.TITLE PANEL | |||
08 | NOP | No operation | |
C401 | LDI 1 | ACCumulator-register=1 (Address switches) | |
37 | XPAH 3 | Put this (1) into pointer register 3 High | |
C403 | LDI 3 | ACCumulator-register 3 | |
31 | XPAL 1 | Put this (3) into pointer register 1 Low | |
C403 | LDI 3 | ACCumulator- register 3 | |
01 | XAE | Exchange (3 words to fetch) with Extension Register | |
06 | TEST: | CSA | ACCumulator=switch LOAD DATA (SR) |
D420 | ANI X’20 | AND this with 20HEX | |
98FB | JZ TEST | Loop TEST, if the switch is not served (value=0) | |
06 | WAIT: | CSA | ACCumulator=switch LOAD DATA (SR) |
D420 | ANI X’20 | AND this with 20HEX | |
9CFB | JNZ WAIT | Loop until the switch is released (value#0) | |
31 | XPAL 1 | ACCumulator=0 | |
982B | JZ LDDATA | Fetch 8-bit data (word) from switches | |
31 | XPAL 1 | Exchange Pointer-Register 1 Low | |
C403 | LDI 3 | ||
60 | XRE | OR with ACCumulator=3 | |
980A | JZ STHI | Store first word | |
C402 | LDI 2 | ||
60 | XRE | OR with ACCumulator=2 | |
980D | JZ STLO | Store second word | |
C401 | LDI 1 | ||
60 | XRE | OR with ACCumulator=1 | |
9813 | JZ CNT | ||
C300 | STHI: | LD (3) | Read Servicepanel (switches) |
36 | XPAH 2 | for RAM address to pointer 2 High | |
C402 | LDI 2 | Initialise a second word to fetch | |
01 | XAE | ||
90DB | JMP TEST | ||
C300 | STLO: | LD (3) | Read Servicepanel (switches) |
32 | XPAL 2 | for address within RAM to pointer Low | |
C300 | LD (3) | ||
35 | XPAH 1 | and to pointer 1 High | |
C401 | LDI 1 | ||
01 | XAE | ||
90D0 | JMP TEST | Fetch third word (8-bits) | |
C400 | CNT: | LDI 0 | Initialize fetching of user-program |
31 | XPAL 1 | ||
C300 | LD (3) | Fetch number of words user-program | |
01 | XAE | ||
90C8 | JMP TEST | ||
31 | LDDATA: | XPAL 1 | |
C300 | LD(3) | Fetch data from switches | |
CE01 | ST @ 1 (2) | Store data into RAM (pointed by 2) | |
C4FF | LDI -1 | ACCumulator= -1 | |
02 | CCL | CY/L flag is cleared in Status Register | |
70 | ADE | ACC=ACC+E+CY/L (algebraically) | |
9803 | JZ EXC | All data for the user-program fetched; execute it |
|
01 | XAE | ||
90BA | JMP TEST | ||
35 | EXC: | XPAH 1 | Restore the start address of the user-program |
32 | XPAL 2 | within RAM into pointer 2 Low | |
9200 | JMP (2) | Start program | |
.END | |||
ACC=Accumulator, E=Extension Register CY/L flag = Carry/Link flag in Status Register |
Een voorbeeldprogramma: een teller
Symbolische code | Object code | Beschrijving |
---|---|---|
NOP | 08 | No operation |
LDI 3 | C4 | Initialize RAM pointer (3) by |
03 | exchanging ACCumulator and | |
XPAH 1 | 35 | Pointer 1-High (one of three) |
LDI 0 | C4 | Start with value: zero |
00 | ||
ST COUNT | C8 | in COUNT (RAM address) |
09 | ||
LOOP: ILD COUNT | A8 | COUNT = COUNT + 1 |
07 | ||
ST @ 0 (1) | C9 | Show this value (1) on LED |
00 | display (indirectly from COUNT) | |
DLY: FF | 8F | Wait maximum delay time FF |
FF | (delay instruction DLY) | |
JMP LOOP | 90 | Jump back to LOOP |
F8 | Increment value in COUNT | |
address of COUNT | . COUNT |