Отправляет email-рассылки с помощью сервиса Sendsay
  Все выпуски  

Разработка и реализация эмулятора семейства архитектур ПК


Информационный Канал Subscribe.Ru


Рассылка "Разработка и реализация эмулятора семейства
архитектур ПК" (comp.soft.prog.tmc).

Выпуск 1.

Доброе время суток, уважаемые читатели!

Первый выпуск своей рассылки я хотел бы посвятить описанию того,
что же такое TMC, каковы были предпосылки его создания и
что планируется в будущем.

Мысли по поводу этого необычного проекта стали приходить ко мне в
феврале 2001 года, когда я сдал свою первую сессию в университете и стал
искать себе интересную задачку по программированию. На тот момент я мог
выделить у себя два стремления: к низкоуровневому программированию (я
очень люблю язык ассемблера для x86 :) ) и объектно-ориентированному. Что
касается первого, то этим я начал увлекаться еще в школе, далее в 11 классе
была попытка создать операционную систему, но об этом как-нибудь в другой
раз. А вот со вторым я познакомился всего за полгода до того. Я всегда считал,
что ООП пошло от лени. Я рассуждал примерно следующим образом:
программисты пытаются запихнуть свой код, написанный совершенно для
другого, в новый проект: Это вместо того, чтобы написать более подходящий
именно для этой системы. Сейчас я осознаю, насколько был близорук. Оно и
понятно - тогда у меня было полно времени на многократное переписывание и
"вылизывание" кода, да и программы были слишком маленькими.

Однако, в июне 2000 года (как раз в лето поступления в университет) я
познакомился с Алексеем Фрунзе ( http://alexfru.narod.ru/ ). Хотелось бы много
чего хорошего сказать об этом человеке, и как-нибудь в другой раз я это
сделаю, а сейчас скажу, что это именно он изменил мое восприятие ООП. Все
началось с Turbo Vision, а затем он познакомил меня с трудами такого
интересного человека, как Гради Буч. Его книга "Объектно-ориентированный
анализ и проектирование" долгое время являлась моей настольной. В то время я
умел обращаться лишь с ассемблером (для x86) и Turbo Pascal-ем,
соответственно на последнем я и пытался применить ООП. И это имело смысл,
как мне кажется, потому что было бы тяжело изучать C++ вместе с ООП.
Впрочем, некоторые подвиги в сторону C++ я все же сделал - начал учить язык
C. Я не собирался на нем останавливаться, просто хотел освоить все в
хронологическом порядке.

В общем, сложилась такая ситуация, что мне одновременно
интересовали две полярные вещи: ассемблер и ООП. Идея как их примирить
возникла почти сразу, когда я осознал это противоречие. Действительно, а
почему бы и нет? Эмулятор! Эмулятор собственной архитектуры. Теперь у меня
не IBM PC на базе x86, а свой собственный Top's Micro Computer (TMC) на базе
собственного CPU ;). Разумеется, задачка игрушечная (это было уже тогда
вполне очевидно), но она позволит мне попрактиковаться в ООП. Так я думал
тогда, также я думаю и сейчас. Сам процесс создания я описывать не стану,
поскольку он, скорее всего, интересен только мне :). Скажу лишь, что первую
версию я закончил к концу мая этого же года (2001).

Ну ладно, довольно истории. Перейду теперь к тому, что же такое TMC
сейчас. После завершения первой версии можно сказать, что это объектно-
ориентированная система, которая представляет архитектуру некоторого класса
Персональных Компьютеров (ПК) с точки зрения программиста этой
архитектуры. Фактически, получилось изобразить только программную модель,
хотя некоторые детали намекают на аппаратную реализацию этого. Например,
механизм Interrupt ReQuest (IRQ).

Эта модель была запрограммирована (правда, если соблюдать
хронологию следует сказать, что проектирование и реализация на Языке
Высокого Уровня - ЯВУ происходили одновременно, что вполне логично) на
языке Turbo Pascal (для компилятора Borland Pascal 7.0). В состав базовых
абстракций вошли такие понятия как память, шина, пространство портов ввода-
вывода, периферийные устройства, центральный процессор (ЦП, CPU), а также
контроллер прерываний. Затем на основе этого базового набора, через
наследование, был реализован ЦП и несколько периферийных устройств. Затем
были написаны программы начальной загрузки получившегося "компьютера"
для это процессора. Это и явилось апогеем моего творения. Я программировал в
машинном коде собственный процессор, пусть и виртуальный. Понимаю,
ребячество все это, но, во-первых, я еще не очень-то вырос (а тогда тем
более :) ), а, во-вторых, ничего не могу с собой поделать:

Хочется чуть подробнее сказать о получившемся виртуальном монстре.
Попытаюсь сделать это кратко и сухим техническим языком. К сожалению, я
пока не знаю уровень подготовки аудитории для которой это пишу, но
писать мне хочется более технически направленные выпуски, нежели
научно-популярные :).

(цитата из моей курсовой. Полный текст можно взять на
http://tmc2.narod.ru/download/tmc1_kurs.zip (430kb) в формате .PDF):

С точки зрения пользователя ПЭВМ TMC состоит из следующих частей:

     - Системная шина
     - Микропроцессор TMC BST1
     - Память
     - Программируемый Контроллер Прерываний
     - Видеоадаптер
     - Системный таймер
     - КМОП-память (CMOS)

Теперь немного подробнее о каждой из составляющих:

1. Системная шина

Состоит из трех шин: адреса, данных и портов. Шина адреса 16 битная, данных
-16 битная (с дроблением по 8), портов - 8 битная.

2. Микропроцессор TMC BST1

16 битный процессор. Частота не определена, и ее регулирование остается на
совести эмулятора. По набору команд можно сказать, что процессор CISC
архитектуры.

Поддерживаемые команды:

Арифметические: add, and, cmp, or, shl, shr, test, sub, xor, dec,
inc, neg, not

Управление состоянием: clc, cld, cli, stc, std, sti, hlt

Пересылки данных: push, pop, mov, in, out

Передачи управления: into, iret, ret, call, Jcc, jmp

Прочее: ud2, nop

Регистры:

Общего назначения (16 бит): R0, R1, R2, R3, R4, R5, R6, R7

Общего назначения (8 бит, перекрывают первые четыре 16 битных): R00, R01,
R10, R11, R20, R21, R30, R31

Адресные (16 бит): AR0, AR1, AR2, AR3, AR4, AR5, AR6, AR7

Прочие (16 бит): IP, FLAGS

3. ОЗУ и ПЗУ:

Адресное пространство - 16 бит. Карта распределения памяти:

+-----------+---------+-------------+
|  Адреса   | Размер  | Назначение  |
|-----------+---------+-------------|
| 0000-BFFF |  48k    |    ОЗУ      |
| C000-EFFF |  12k    |    ПЗУ      |
| F000-FFFF |   4k    | Видеопамять |
+-----------+---------+-------------+

Устройства ввода-вывода:

Программируемый Контроллер Прерываний
8 линий. Используется одна - 0-ая для таймера. Связан через INTR с
микропроцессором.

Видеоадаптер
Единственный видеорежим - текстовый, одноцветный, 40х25. Страницы не
поддерживаются.

Системный таймер
Частота 18.2 (тиков в минуту). Вызывает IRQ0.

КМОП-память (CMOS)
128 байт энергонезависимой памяти. Доступ осуществляется через порты.



Как из всего этого видно, получилось достаточно правдоподобно. На
тот момент для меня было самое главное, чтобы все это заработало. Сейчас
цели и задачи я определил немного по-другому. Мне хочется провести
некоторые исследования.

Надеюсь, мне удалось немного обрисовать то, что получилось в версии
1.0 . И теперь хочется немного поговорить о том, какие были затеяны
программные проекты, связанные с TMC.

Где-то через год, в марте 2002 года один из моих приятелей, студент из
параллельной группы, Константин Огренич, заинтересовавшись моим
проектом, изъявил желание написать ассемблер для получившегося процессора.
Процесс его разработки растянулся во времени и продолжается по сей день,
однако было несколько промежуточных версий, в которых удалось осуществить
поддержку безоперандных и одно-операндных команд. Не буду подробнее
рассказывать про эту работу. Во-первых, потому что она не моя :) и я не очень-
то и в курсе что и как с ней. Во-вторых, я надеюсь, что Костя напишет
отдельный выпуск в эту рассылку про свой ассемблер, а также (разумеется)
доведет до логического завершения сам ассемблер: Вот что еще могу сказать,
ассемблер этот с самого начала уже писался на C++.

Также примерно в это же время, я решил взяться за написание
дизассемблера к своему процессору. Это оказалось совсем простой задачей,
которую после обдумывания я запрограммировал полностью за два дня. Тоже
не хочу подробнее останавливаться на этой работе, потому что планирую
посвятить этому отдельный выпуск. Скажу только, что здесь я использовал уже
C++, причем программа написана таким образом, что исходные тексты
компилируются как Microsoft Visual C++ 6.0, так и на GNU C++. Сразу отмечу,
что далее я всегда планирую использовать для TMC именно такой стиль
программирования, чтобы не зависеть от ОС и архитектуры машины, на
которой будет выполняться программа эмулятора.

Ну что ж, думаю, что достаточно рассказал о том, что сделано и пришло
время сказать о том, что только разрабатывается. Версия 2 будет иметь
серьезные отличия от первой. Во-первых, я применяю уже более-менее
последовательный подход к проектированию, используя UML. Во-вторых, вся
реализация пишется на C++. В-третьих, за это время я прочитал и просмотрел
около полутора десятка книг по архитектурам и микропроцессорам. В-
четвертых, на этот раз я решил вести разработку публично и привлечь к ней как
можно больше людей. Последний довод требует пояснения. Дело в том, что при
всей кажущейся объемности проделанной работы, она носит игрушечный
характер. Мне хочется применения для TMC. Я знаю, что таких способов масса,
но они не реализованы. Посему всех заинтересовавшихся работой я приглашаю
пообщаться по электронной почте (petrenko@jeo.ru?subject="рассылка").
Полагаю, что первый выпуск рассылки можно считать завершенным.
Дальнейшие выпуски я планирую строить на более подробном описании того,
что было реализовано в TMC 1.0 и параллельно заниматься разработкой TMC
2.0. С момента основания второй версии проекта, основные классы менялись
уже раз пять, поэтому хочу подождать пока все это немного устоится и я смогу
обосновать именно такое распределение обязанностей между классами. Тогда и
напишу об этом в рассылке.

Надеюсь, вам было интересно это прочитать. Получилось много воды и
отвлеченных рассуждений. Далее я беру курс на техническое описание TMC.

До свидания.

Автор рассылки: Victor Petrenko aka Top

http://subscribe.ru/
E-mail: ask@subscribe.ru
Отписаться
Убрать рекламу

В избранное