Русский
English |
Так склалося, що мiкропроцесор Intel 8080, що з'явився на свiт божий 1 квiтня 1974 р., зiграв дуже велику роль на визначеному етапi розвитку ОТ у СРСР. Причин тому було трохи: на вiдмiну вiд досить твердої архiтектури 16-розрядного мiкропроцесора LSI 11, що йшла вiд мiнiкомпютерiв, 8-розрядний 8080 був дивно простий. Студенти старших курсiв Фiзтеха, що проходили практику в мене в лабораторiї в iнститутi проблем керування (IПК), збирали на ньому одноплатнi комп'ютери в себе в гуртожитку. З елементною базою в лабораторiї завжди було непогано, i ми навiть заохочували подiбнi речi - так студент швидше починав розумiти, що до чого.
На цьому процесорi, i його аналогах, сумiсних з ним, були зробленi такi мiкро-ЕОМ:
Єдиний iстотний недолiк - процесор вимагав трьох рiвнiв напруги живлення.
Система команд 8080 нараховувала 79 iнструкцiй (см. Довiдник по системi команд мiкропроцесора Intel 8080).
Київське НВО "Кристал" в кiнцi 70-х рокiв випустило мiкропроцесорний комплект К580, в який входили наступнi мiкросхеми:
На жаль, у мене описи цих мiкросхем не збереглися, тому буду вдячний усiм, хто надiшле опис програмування зазначених БIС.
Вiдзначу, що в корпорацiї Intel для 8080/85 випускалася мiкросхема арифметичного прискорювача. Однак тому що 8080 складав реальну погрозу просуваємому Мепом мiкропроцесору "Електронiка-60", те ця мiкросхема в СРСР нiколи не вiдтворювалася.
Лiтература:
|
||
Регiстровий файл |
Тому що адресний простiр всього 64 Кб, то повна адреса займає 2 байти. Команди цього процесора бувають одно-, двох- i трьохбайтними. У першому байтi завжди мiститься код операцiї. Єдиний iстотний недолiк - процесор вимагав трьох рiвнiв напруги живлення.
Команди цього процесора бувають одне-, двох- i трьохбайтними. У першому байтi завжди мiститься код операцiї.
Позначення.
A, B, ..., L - назва 8-розрядних регiстрiв.
BC, DE, HL - назва регiстрових пар, що утворять 16-розряднi регiстри.
SP - 16-розрядний покажчик стеку.
PSW - слово стану програми, мiстить регiстр прапорiв.
a16 - двобайтова адреса.
d8 - байт безпосереднiх даних.
d16 - два байти безпосереднiх даних.
pp - номер порту вводу-виводу.
|
Команди пересилання даних мiж регiстрами кодуються в одному байтi (це типовий випадок реєстрової адресацiї) у такий спосiб:
01DDDSSSгде DDD - номер регiстру призначення; SSS - номер регiстру приймача. Вiдповiдно 01 - код операцiї пересилки. Нiяких флагiв команди пересилання не встановлюють. На виконання команди витрачається один машинний цикл.
Пересилання з комiрки пам'ятi в регiстр i з регiстра в пам'ять здiйснюються за допомогою побiчно реєстрової адресацiї. Це означає, що адреса комiрки пам'ятi завантажується в реєстрову пару HL, а в командах типу MOV A,M (такi команди кодуються як 01DDD110) у регiстрA буде завантажений вмiст комiрки пам'ятi, адреса якого мiститься в HL. Тому що в таких командах потрiбно звертання до пам'ятi, то на їхнє виконання потрiбно два машинних цикли. Система команд процесора дуже економiчна - вона не розрахована на пiдтримку мов високого рiвня. Усе це з'явиться в Intel-процесорах пiзнiше.
Зауважу, що середня довжина команди в типовiй програмi дорiвнює двом байтам, а для програм бiльш пiзнiх 16-розрядних процесорiв типу 8086 вона дорiвнює 4,1. Тому на логiчних програмах 8-розряднi процесори не сильно поступалися 16-розрядним.
Аналогiчно працюють i команди запису в пам'ять.
Команди безпосереднього пересилання двубайтовi. У першому байтi кодуються код операцiї i регiстр, а другий мiстить байт даних, що пересилається:
00DDD110 XXXXXXXXОчевидно, що для виконання команди потрiбно два цикли.
Бiльш цiкава версiя цiєї команди MVI data, коли байт безпосереднiх даних пишеться в пам'ять.MVI data, коли байт безпосереднiх даних пишеться в пам'ять.
Вона кодується так:
00110110 ХХХХХХХХВиконання займає три цикла.
Дуже корисна група командLXIбезпосереднього завантаження реєстрових пар безпосереднiм значенням. Вона дозволяє однiєю командою перемiстити вiдразу два байти даних i широко використовується програмiстами як в операцiях адресної арифметики, так i при виконаннi цiлочисельних обчислень.
Команда кодується так:
00RP0001 xxxxxxxx zzzzzzzz где RP - регiстрова пара; хххххххх - молодший байт даних, zzzzzzzzz - старший байт даних.
При виконаннi команди, що вимагає трьох машинних циклiв, старший байт даних вантажиться в старший регiстр реєстрової пари, а молодший байт - у молодший регiстр. Назва старшого регiстра стоїть в назвi пари першою.
Команда прямого завантаження акумулятора дозволяє завантажити в нього данi, на якi вказує адреса, що мiститься в самiй командi.
Довжина команди три байта. Кодується она так:
001110010 хххххххх zzzzzzzz де xxxxxxxx - молодша частина адреси; zzzzzzzz - старша частина адреси.
Виконання займає машинних чотири цикли.
Симетрична по дiї команда STA.
Команда LHLD addr (мнемонiка розшифровується Load H and L Direct) завантажує в L вмiст комiрки пам'ятi за адресою, кодуємому в другому i третьому байтах команди (тобто адресацiя пряма). В H завантажується байт з комiрки addr+1.
Команда виконується за п'ять машинних циклiв. Зворотна їй по дiї командаSHLD (Store H and L Direct).
Команда LDAX reg (мнемонiка от Load accumulator indirect). Вмiст комiрки пам'ятi, адресуємої реєстровою парою BC чи DE, за два цикли завантажується в акумулятор.
Зворотна по дiї команда STAX reg.
Дуже корисна команда XCHG. (H)<->(D), (L)<->(E). Виконується за один цикл.
Почнемо з додавання. Скласти акумулятор iз вмiстом регiстра ADD reg
Кодування: 10000RRR
Виконується за один цикл. Звернiть увагу, що всi арифметичнi команди змiнюють флаги: Z,S,P,CY,AC.
Для виконання багатобайтового додавання необхiдно враховувати перенос. Тому молодшi байти доданкiв складаються за допомогою команди ADD, а всi наступнi за допомогою команди ADC reg. Вона враховує при додаваннi вмiст флагу переносу. Зрозумiло, що в цiй системi команд легко написати арифметику, що буде працювати з цiлими числами довжиною декiлька кiлобайт (що i було зроблено в системi muMATH-80).
Аналогiчно улаштованi команди вирахування.
Рiзновидом команди додавання є команда iнкремента регiстра, необхiдна для адресної арифметики й органiзацiї циклiв.
INR reg
Кодування: 00ККК100
Установлюються всi флаги, за винятком CY.
Зворотна по дiї командаDCR reg.
Досить рiдко використовується командаDAA (мнемонiка от Decimal Adjust Accumulator) виконує наступнi дiї: якщо вмiст молодшого напiвбайта (нибла) акумулятора менше 9 чи встановлений флаг CY, то (A) + 6, якщо значення старшого напiвбайта бiльше 9 чи встановлений флаг CY, то 6 додається до вмiсту старшого напiвбайта.
При цьому установлюються всi флаги.
ANA reg
Флаг CY знiмається, а AC встановлюється (в 8085). У мiкропроцесорi 8080 на цi флаги впливає результат операцiї над третiми бiтами операндiв.
В командах груп XRA i ORA флаги CY та AC знiмаються.
CMP reg - порiвняти регiстр (Compare register), вiднiмає вмiст регiстра з акумулятора. Вмiст акумулятора не змiнюється. Флаги встановлюються як при вирахуваннi. Z=1, якщо (A) = (reg). CR = 1, якщо (A) < (reg) CR = 1, если (A) < (reg).
Циклiчне зрушення влiво RCL працює в такий спосiб. Вмiст акумулятора зрушується на одну позицiю влiво, тобто кожен старший бiт одержує значення молодшого бiта, що стоїть поруч з ним. Вмiст сьомого бiта переходить у нульовий бiт акумулятора:
(CY) <-(b7).
RRC - зрушує вмiст акумулятора вправо. (CY)<- {b0}, (b7)<-(b0).
RAL - (Rotate Left trough Carry). Спочатку (CY) заноситься в молодший бiт акумулятора, а потiм в CY записується вмiст старшого його бiта.
Формально: (b0)<-(CY), (CY)<-(b7).
Аналогiчно зi зрушенням вправо: (Bn)<-(Bn+1), (CY)<-(b0), (b7)<-(CY).
Команда CMA (мнемонiка вiд Complement Accumulator) iнвертує кожен бiт акумулятора, тобто 0 стає 1 i навпаки. Флаги не встановлюються.
Команда CMC iнвертує вмiст флагу переносу. Iншi флаги не встановлюються.
По командах керування варто вiдзначити виконання команди виклику пiдпрограми.
CALL addr - при її виконаннi в стек записується адреса наступної за CALL команди, значення покажчика стека двiчi декрементується, а керування передається по зазначенiй адресi.
Команда повернення з пiдпрограми записує в лiчильник команд адресу з вершини стека, збiльшує покажчик стека на 2 i передає керування на нову адресу. Тому якщо модифiкувати адресу повернення в стецi, то можна перейти зовсiм в iнше мiсце.
Для цього є, утiм, бiльш зручна можливiсть - команда PCHL. Вона дозволяє передати керування за адресою в реєстровiй парi HL.
Iнодi в системних програмах використовується команда зупинки HLT. Процесор зупиняється, регiстри i флаги не встановлюються. Для запуску важливо подати сигнал Reset.
IN port - данi з порту з зазначеним номером зчитуються в акумулятор. Циклiв 3. Флаги не змiнюються.
OUT port - вмiст акумулятора мiститься на шину даних для запису в зазначений у командi порт.
Як бачимо, система команд проста i невигадлива. Її легко освоювали навiть електронщики. Написано безлiч емуляторiв системи 8080, 8085 i Z-80 для PC, а також навчальних програм для студентiв.
Звичайно, через двадцять рокiв можна i Бейсiк забути. Тому, можливо, якiсь моменти я пропустив. Буду щиро вдячний усiм надiславшим на адресу chief@pcweek.ru свої доповнення i зауваження, приклади навчальних програм i т.п.