4 Разработка структуры микро-эвм на базе гипотетического микропроцессора
4.1 Структурная схема микро-ЭВМ
На базе спроектированного микропроцессора можно построить микро-ЭВМ, структурная схема которой, как и схема самого микропроцессора, в значительной мере отражает функциональные возможности системы команд микропроцессора. Шинный интерфейс будет состоять из шины данных (16 бит), шины адреса (20 бит), шины управления (4 бита).
Структурная схема микро-ЭВМ приведена на рисунке 4.1.
ШД
ША
ШУ
Рисунок 4.1 – Структурная схема микроЭВМ
МП - микропроцессор;
ГСС и НУ - генератор синхросигналов начального устройства;
ОЗУ - оперативное запоминающее устройство;
ША - шина адреса;
ШУ - шина управления;
ШД - шина данных.
Выполняемая микропроцессором программа хранится в оперативной памяти (ОЗУ).
4.2 Микропрограмма работы устройства управления
Устройство управления синхронизирует и координирует функционирование всех остальных составляющих частей микропроцессора, посылая соответствующие управляющие сигналы и реагируя на различные осведомительные сигналы с других устройств. В соответствии с осведомительными сигналами осуществляется ветвление алгоритма работы устройства управления.
Микропрограмма работы устройства управления представлена на рисунке 4.2.
На рисунке 4.2 микропрограммы выполнения команд РUSH и IMUL, а также прибавления к регистрам IP и SP константы, в явном виде отсутствуют (они заменены соответствующими блоками) с целью облегчения визуального восприятия схемы. Эти микропрограммы представлены ниже на рисунках 4.3, 4.4, 4.5.
5 Разработка программы-эмулятора работы микро-эвм на базе гипотетического микропроцессора
5.1 Общая характеристика программы эмуляции
Программа эмуляции предназначена для наглядной демонстрации работы гипотетического микропроцессора и визуализации процесса выполнения команд. Программа предусматривает пошаговый и автоматический режимы демонстрации работы микропроцессора.
Главное окно программы содержит структурную схему гипотетического микропроцессора (рис. 3.1). В процессе работы программа отображает содержимое регистров процессора, сегмента кода, стекового сегмента, а также регистра флагов.
5.2 Описание работы программы эмуляции
При создании программы эмуляции, для отображения схемы были использованы компоненты среды разработки Borland C++ Builder 5.
Демонстрация функционирования процессора работает следующим образом:
при нажатии кнопки “Следующий шаг” выполняется процедура прорисовки следующего шага NextStep() (номеру шага соответствует глобальная переменная Step, которая инкрементируется после выполнения каждого шага);
при выборе автоматического режима вызов процедуры NextStep() происходит автоматически по истечении некоторого промежутка времени.
Все арифметические операции выполняются программно в соответствии с алгоритмом выполнения той или иной программы.
5.3 Переменные процедуры и функции, используемые в программе
Программа-эмулятор является объектно-ориентированной и содержит множество визуальных компонентов. Значения регистров хранятся в свойстве Tag того объекта, который представляет тот или иной регистр.
Основная процедура программы – NextStep(), отвечает за прорисовку процесса выполнения конкретного шага, используя при этом глобальную переменную Step, как номер шага.
Все начальные значения устанавливает функция-конструктор главной формы MainForm().
Существует также множество других вспомогательных переменных, процедур и функций, отвечающих за выполнение подзадач прорисовки элементов структуры микропроцессора.
ЗАКЛЮЧЕНИЕ
В ходе выполнения данного проекта была спроектирована структура АЛУ по принципу обобщенных микроопераций. Реализованное АЛУ позволяет выполнять операции алгебраического сложения, умножения со знаком, инверсии. Была также разработана структура гипотетического микропроцессора, позволяющего выполнять операции IMUL, NOT, PUSH и JNS, на базе которого впоследствии спроектирована структура микро-ЭВМ. Для демонстрации работы разработанной микро-ЭВМ создан программный эмулятор.
В перспективе можно расширить набор операций, исполняемых спроектированным микропроцессором (принцип обобществленных микроопераций позволяет это сделать без особых изменений в структуре).
В целом же в процессе разработки данного проекта были изучены многие вопросы из области разработки микропроцессоров, а также приобретён огромный опыт работы с микропроцессорными системами.
ПЕРЕЧЕНЬ ССЫЛОК
Брамм П. Брамм Д. Микропроцессор 80386 и его программипрование / Пер. с англ. А.И.Шереметьева 448 с. : илл.
Толковый словарь по вычислительным системам / Под ред. В. Иллингуорта и др.: Пер. с англ. А.К. Белоцкого и др.; Под ред. Е.К. Масловского. – М.: Машиностроение, 1991. – 560 с.: ил.
Л. Скэнлон Персональные ЭВМ IBM PC и XT. Программирование на языке ассемблера /Пер с англ И. Емелин.: - М.:”Радио и связь”, 1989.- 336 c.
Конспект лекций по дисциплине «ЭВМ и МПС» (2002г).
Приложение А
ТЕХНИЧЕСКОЕ ЗАДАНИЕ НА ПРОЕКТИРОВАНИЕ МИКРОЭВМ
А.1 Общие сведения
Полное наименование курсового проекта (КП) - «Разработка структуры гипотетического микропроцессора на основе микропроцессора-прототипа i8086. Специальная часть: эмуляция команд IMUL, PUSH, NOT и JNS».
КП проектируется студентом 3-го курса Донецкого государственного института искусственного интеллекта (ДГИИИ), факультета СКИТ, группы ПО-20, Малокуцко Евгением Николаевичем.
Задание выдано кафедрой технической информатики (ТИ).
Плановый срок начала работы 28 октября 2002 года, срок окончания – 27 декабря 2002 года.
А.2 Назначение и цели создания проекта
КП предназначен для приобретения разработчиком практических навыков в сфере создания микропроцессорных систем.
Цель создания курсового проекта: исследовать алгоритмы выполнения заданного набора команд, структуру микропроцессора.
А.3 Требования к КП
А.3.1 Требования к КП в целом
В целом КП должен выполнять следующие требования:
разработанная структурная схема микропроцессора должна быть совместима с процессорами семейства i8086;
обеспечивать правильное выполнение каждой команды из заданного набора;
А.3.2 Требования к задачам и функциям КП
А.3.2.1 Требования к микро-ЭВМ
К разработке микроЭВМ выдвигаются следующие требования:
разработать алгоритм выполнения заданных команд;
тип ОА АЛУ – ОА с обобществленными микрооперациями;
реализовать реальный режим адресации;
разрядность шины данных – 16 бит;
разрядность шины адреса – 20 бит.
А.3.2.2 Описание набора команд
В данном КП реализуются следующие команды:
арифметическая операция NOT – инвертирование всех битов операнда;
арифметическая операция IMUL – умножение операндов со знаком ;
команда перехода JNS – переход, если нет знака; выполняет ветвление по адресу, если SF=0, в противном случае выполняется следующая команда;
посылочная операция PUSH – копирует в память указанный операнд (регистр или переменная), уменьшает значение SP на размер операнда в байтах. Команда PUSH обратна команде POP, в паре с которой они часто используются.
А.3.2.3 Требования к функциональным характеристикам процессора
Требуется разработать структуру микроЭВМ со структурной схемой, представленной на рисунке А.1.
Пояснения к схеме:
БАД – буфер адреса данных;
СФА – сумматор физического адреса;
МУУ – микропрограммное устройство управления;
УУ и С – устройство управления и синхронизации;
АЛУ – 16-разрядное арифметико-логическое устройство;
A/D15...A/D0 – младшие разряды входного сигнала;
A19/S6...A16/S3 – старшие разряды входного сигнала;
AX,BX,CX,DX – регистры общего назначения;
SP,BP – регистры указателей;
SI,DI – регистры индексов;
CS,DS,ES,SS – сегментные регистры;
РК – регистр команд;
РФ – регистр флагов;
IP – регистр адреса команды;
GDT – таблица глобальных дескрипторов;
LDT – таблица локальных дескрипторов.
Устройство управления дешифрирует коды команд и формирует необходимые управляющие сигналы. Арифметико-логическое устройство осуществляет необходимые арифметические и логические преобразования данных. В блоке преобразования адресов формируются физические адреса данных, расположенных в основной памяти. Регистры используются для хранения управляющей информации: адресов и данных.
Рисунок А.1 –
Структура гипотетического микропроцессора
А.3.2.4 Требования к организации основной памяти микропроцессора семейства i8086
Требуется разработать структуру микро-ЭВМ со следующей организацией и характеристиками оперативной памяти.
Минимальной адресуемой единицей основной памяти ПЭВМ является байт. Доступ к байтам памяти осуществляется по номерам (номер байта является ого физическим адресом в устройстве памяти). Для адресации в микропроцессоре i8086 предусматриваются 20-битные адреса. Физический адрес формируется из 16-битового смещения и содержимого 16-битового сегментного регистра, сдвинутого влево на 4 бита: CS<<4+IP.
Для размещения программ и данных в памяти выделяются специальные области - сегменты. Адреса этих областей хранятся в специальных сегментных регистрах. Каждый из четырех сегментных регистров используется для хранения адреса определенного сегмента:
сегмента кода (CS), т. е. области программы;
сегмента данных(DS), т. е. области размещения данных; дополнительного сегмента данных(ES), используемого некоторыми командами;
сегмента стека(SS), т.е. области размещения стека.
Стек представляет собой специальным образом организованную область памяти, допускающую последовательную запись элементов данных длиной 2 байта (слово) и чтение их в порядке, обратном порядку записи. Для хранения адреса последнего слова, занесенного в стек, служит регистр-указатель стека SР.
А.3.2.5 Требования к технической документации
Организационное обеспечение должно включать пояснительную записку со следующими приложениями:
техническое задание 1, 2;
руководство пользователя;
экранные формы программы-эмулятора;
А.4 Стадии и этапы разработки КП
Стадии и этапы разработки КП представлены в таблице А.4.1.
Таблица А.4.1- Стадии и этапы разработки КП
№ |
Этапы работы |
Срок выполнения (недели) |
1. |
Анализ структуры и алгоритмов выполнения заданных команд в микропроцессоре прототипе. Выяснение задания. |
1 |
2. |
Составление технического задания 1,2. |
2 |
3. |
Разработка структуры АЛУ для выполнения арифметических операций. |
3 |
4. |
Разработка алгоритма выполнения арифметических операций. |
4 |
5. |
Разработка структуры микроЭВМ. |
5 |
6. |
Разработка алгоритма выполнения команд. |
6 |
7. |
Разработка эмулятора выполнения заданных команд. |
7-8 |
8. |
Отладка эмулятора. |
9-10 |
9. |
Тестирование эмулятора. |
11-12 |
10. |
Написание пояснительной записки и графических материалов. |
13 |
11. |
Защита проекта. |
14 |
Приложение Б
ТЕХНИЧЕСКОЕ ЗАДАНИЕ НА ПРОГРАММУ-ЭМУЛЯТОР
А.1 Общие сведения
Полное наименование проектируемого курсового проекта (КП): «Разработка структуры гипотетического микропроцессора на основе микропроцессора-прототипа i8086. Специальная часть: эмуляция команд NOT, IMUL, PUSH, JNS».
Курсовой проект проектируется студентом 3-го курса факультета СКИТ Донецкого государственного института искусственного интеллекта (ДГИИИ), группы ПО – 20б, Малокуцко Евгением Николаевичем в соответствии с заданием на курсовой проект, выданным кафедрой технической информатики (ТИ) ДонГИИИ по дисциплине «ЭВМ и микропроцессорные системы». Плановый срок начала работы по созданию курсового проекта: 28 октября 2002 г. Плановый срок защиты курсового проекта: 27 декабря 2002 г.
А.2 Назначение и цели создания КП
Целью данного курсового проекта является эмуляция выполнения заданного набора команд, структуры микропроцессора.
Данный КП используется для демонстрации структуры микропроцессора и алгоритмов выполнения заданных команд.
А.3 Требования к задачам и функциям КП
А.3.1 Требования к микро-ЭВМ
К разработке микроЭВМ выдвигаются следующие требования:
разработать алгоритм выполнения команд заданного подмножества;
разрядность микроЭВМ – 16 бит;
реализовать реальный режим адресации;
разрядность шины данных – 16 бит;
разрядность шины адреса – 20 бит.
Необходимо также предусмотреть режимы пошагового и автоматического выполнения команд с изображением динамики исполнения на структурной схеме.
А.3.2 Требования к видам обеспечения
А.3.2.1 Требования к программному обеспечению
Для функционирования программного эмулятора микропроцессора требуется операционная система Microsoft Windows 9x/ME/NT/2000/XP.
А.3.2.3 Требования к техническому обеспечению
Для нормальной работы системы требуется персональный компьютер, совместимый с одной из вышеуказанных операционных систем.
А.3.2.4 Требования к технической документации
Организационное обеспечение должно включать пояснительную записку со следующими приложениями:
техническое задание 1, 2;
руководство пользователя;
экранные формы.
А.3.3 Требования к программе эмулятору
Программа эмуляции работы гипотетического микропроцессора должна демонстрировать на экране последовательность выполнения заданного подмножества команд, как в пошаговом режиме, так и автоматически.
Реализуется гипотетический микропроцессор с обобщенными микрооперациями, поэтому необходимо предусмотреть возможность добавления новых команд.
А.4 Стадии и этапы разработки ПП
Стадии и этапы разработки ПП представлены в таблице А.4.1.
Таблица А.4.1- Стадии и этапы разработки ПП
№ |
Этапы работы |
Срок выполнения (недели) |
1. |
Анализ структуры и алгоритмов выполнения заданных команд в микропроцессоре прототипе. Выяснение заданий. |
1 |
2. |
Составление технического задания. |
2 |
3. |
Разработка структуры АЛУ для выполнения арифметических операций. |
3 |
4. |
Разработка алгоритма выполнения арифметических операций. |
4 |
5. |
Разработка структуры микро-ЭВМ. |
5 |
6. |
Разработка алгоритма выполнения команд. |
6 |
7. |
Разработка эмулятора выполнения заданных команд. |
7-8 |
8. |
Отладка эмулятора. |
9-10 |
9. |
Тестирование эмулятора. |
11-12 |
10. |
Написание пояснительной записки и графических материалов. |
13 |
11. |
Защита проекта. |
14 |
Приложение В
РУКОВОДСТВО ПОЛЬЗОВАТЕЛЯ
Чтобы начать работу с программой, необходимо запустить файл KursProject.exe. После этого вы увидите главное окно программы (см. рис. Г.1).
Данная программа позволяет демонстрировать выполнение команд в двух режимах: пошаговом и автоматическом. Чтобы начать выполнение команд нажмите кнопку «Следующий шаг». Будет выполнено действие. В строке статуса (внизу окна) выводится краткое описание выполняемой операции. Для продолжения выполнения команд нажимайте кнопку «Следующий шаг».
Автоматический режим позволяет выполнять операции без вмешательства пользователя. Для его активации выберете радиокнопку «Автоматическое» на панели «Выполнение». Выполнение операций будет происходить автоматически по истечении 750 мс. Для того чтобы вернуться к пошаговому режиму выберете радиокнопку «Пошаговое» на панели «Выполнение».
Для получения справки по сокращениям на схеме и набору команд нажмите кнопку «Справка».
Приложение Г
ЭКРАННЫЕ ФОРМЫ
Рисунок Г.1 – Главная форма программы
Приложение Д
ЛИСТИНГ ПРОГРАММЫ
//---------------------------------------------------------------------------
#include <vcl.h>
#include <math.h>
#pragma hdrstop
#include "Unit1.h"
#include "Unit2.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
int Count=0;
int Step=0;
int Temp=0;
int IPpoint=1;
int SPpoint=255;
int j;
int SF=0;
int ComLen;
int Flag=1;
int Jmp;
AnsiString StrBuf;
AnsiString ComBuf1;
AnsiString ComBuf2;
AnsiString Com[6][2];
AnsiString RGs[5][2];
AnsiString Operand1;
AnsiString Operand2;
char Simbols[16]={'0','1','2','3','4','5','6','7','8','9','A','B','C','D','E','F'};
TMainForm *MainForm;
//---------------------------------------------------------------------------
__fastcall TMainForm::TMainForm(TComponent* Owner)
: TForm(Owner)
{
}
//---------------------------------------------------------------------------
void __fastcall TMainForm::Memory(TObject *Sender)
{
int i;
AnsiString C;
char *c;
Stack->Cells[0][0]="Адрес";
Stack->Cells[1][0]="Значение";
for(i=1;i<=256;i++)
{
C=C.IntToHex(i-1,4);
C+='h';
Stack->Cells[0][i]=C;
}
}
//---------------------------------------------------------------------------
void __fastcall TMainForm::Exit1Click(TObject *Sender)
{
MainForm->Close();
}
//---------------------------------------------------------------------------
void __fastcall TMainForm::MoveCommand(TObject *Sender, char &Key)
{
if(Key=='\r')
{
AnsiString String;
AnsiString Str;
AnsiString OP1;
AnsiString OP2;
int i,c,id=0,j;
Com[1][1]="IMUL";Com[1][2]="69";
Com[2][1]="NOT";Com[2][2]="0F6";
Com[3][1]="PUSH";Com[3][2]="50";
Com[4][1]="JNS";Com[4][2]="70";
Com[5][1]="MOV";Com[5][2]="0F0";
RGs[1][1]="AX";RGs[1][2]="0A";
RGs[2][1]="BX";RGs[2][2]="0B";
RGs[3][1]="CX";RGs[3][2]="0C";
RGs[4][1]="DX";RGs[4][2]="0D";
String=Command->Text;
String=String.UpperCase();
String=String.TrimLeft();
for(i=1;i<=6;i++)
{
Str=Com[i][1];
c=String.Pos(Str);
if(c!=0)
{
Stack->Cells[1][++Count]=Com[i][2];
String=String.Delete(1,Str.Length());
String=String.TrimLeft();
id=i;
break;
}
}
if(id!=0)
{
switch(id)
{
case 1:
for(i=1;i<=5;i++)
{
Str=RGs[i][1];
c=String.Pos(Str);
if(c!=0)
{
Stack->Cells[1][Count]=Stack->Cells[1][Count]+RGs[i][2];
String=String.Delete(1,Str.Length());
break;
}
}
Stack->Cells[1][Count]=Stack->Cells[1][Count]+'h';
if(String[1]==',')
{
String=String.Delete(1,1);
Count++;
i=4;
if((String[1]=='0')&&((String[2]=='A')||(String[2]=='B')||(String[2]=='C')||(String[2]=='D')||(String[2]=='E')||(String[2]=='F')))
i++;
for(j=0;j<=16;j++)
{
if(String[1]==Simbols[j])
{
Stack->Cells[1][Count]=Stack->Cells[1][Count]+String[1];
String=String.Delete(1,1);
j=-1;
i--;
if(i==0)
{
break;
}
}
}
Stack->Cells[1][Count]=Stack->Cells[1][Count]+'h';
if(!String.IsEmpty())
{
if(Count!=0)
Stack->Cells[1][Count--]="";
if(Count!=0)
Stack->Cells[1][Count--]="";
}
}
else
Stack->Cells[1][Count--]="";
break;
case 2:
for(i=1;i<=5;i++)
{
Str=RGs[i][1];
c=String.Pos(Str);
if(c!=0)
{
Stack->Cells[1][Count]=Stack->Cells[1][Count]+RGs[i][2];
String=String.Delete(1,Str.Length());
break;
}
}
if(!String.IsEmpty())
Stack->Cells[1][Count]=Stack->Cells[1][Count]+"00";
Stack->Cells[1][Count]=Stack->Cells[1][Count]+'h';
if(String.IsEmpty())
break;
Count++;
i=4;
if((String[1]=='0')&&((String[2]=='A')||(String[2]=='B')||(String[2]=='C')||(String[2]=='D')||(String[2]=='E')||(String[2]=='F')))
{
i++;
if(String.Length()==4)
i--;
}
for(j=0;j<=16;j++)
{
if(String[1]==Simbols[j])
{
Stack->Cells[1][Count]=Stack->Cells[1][Count]+String[1];
String=String.Delete(1,1);
j=-1;
i--;
if(i==0)
{
break;
}
}
}
Stack->Cells[1][Count]=Stack->Cells[1][Count]+'h';
if(!String.IsEmpty())
{
if(Count!=0)
Stack->Cells[1][Count--]="";
if(Count!=0)
Stack->Cells[1][Count--]="";
}
break;
case 3:
for(i=1;i<=5;i++)
{
Str=RGs[i][1];
c=String.Pos(Str);
if(c!=0)
{
Stack->Cells[1][Count]=Stack->Cells[1][Count]+RGs[i][2];
String=String.Delete(1,Str.Length());
break;
}
}
Stack->Cells[1][Count]=Stack->Cells[1][Count]+'h';
if(!String.IsEmpty())
{
if(Count!=0)
Stack->Cells[1][Count--]="";
}
break;
case 4:
int num;
if(String[1]=='+')
{
String=String.Delete(1,1);
num=String.ToIntDef(num);
if((num>127)||((IPpoint+num)>127))
{
Stack->Cells[1][Count--]="";
break;
}
Jmp=num;
String=String.IntToHex(num,2);
Stack->Cells[1][Count]=Stack->Cells[1][Count]+String;
Stack->Cells[1][Count]=Stack->Cells[1][Count]+'h';
break;
}
if(String[1]=='-')
{
String=String.Delete(1,1);
num=String.ToIntDef(num);
if((num>127)||((Count+num)<1))
{
Stack->Cells[1][Count--]="";
break;
}
Jmp=-num;
String=String.IntToHex(128+num,2);
Stack->Cells[1][Count]=Stack->Cells[1][Count]+String;
Stack->Cells[1][Count]=Stack->Cells[1][Count]+'h';
break;
}
Stack->Cells[1][Count--]="";
break;
case 5:
for(i=1;i<=5;i++)
{
Str=RGs[i][1];
c=String.Pos(Str);
if(c!=0)
{
Stack->Cells[1][Count]=Stack->Cells[1][Count]+RGs[i][2];
String=String.Delete(1,Str.Length());
break;
}
}
Stack->Cells[1][Count]=Stack->Cells[1][Count]+'h';
if(String[1]==',')
{
String=String.Delete(1,1);
Count++;
i=4;
if((String[1]=='0')&&((String[2]=='A')||(String[2]=='B')||(String[2]=='C')||(String[2]=='D')||(String[2]=='E')||(String[2]=='F')))
{
i++;
if(String.Length()==4)
i--;
}
for(j=0;j<=16;j++)
{
if(String[1]==Simbols[j])
{
Stack->Cells[1][Count]=Stack->Cells[1][Count]+String[1];
String=String.Delete(1,1);
j=-1;
i--;
if(i==0)
{
break;
}
}
}
Stack->Cells[1][Count]=Stack->Cells[1][Count]+'h';
if(!String.IsEmpty())
{
if(Count!=0)
Stack->Cells[1][Count--]="";
if(Count!=0)
Stack->Cells[1][Count--]="";
}
}
else
Stack->Cells[1][Count--]="";
break;
}
}
Command->Text="";
}
}
//---------------------------------------------------------------------------
void AnalizCommand()
{
int i;
for(i=1;i<=6;i++)
{
if(ComBuf1.Pos(Com[i][2])!=0)
break;
}
switch(i)
{
case 1:
Step=3; //IMUL
ComLen=2;
break;
case 2:
Step=4; //NOT
break;
case 3:
Step=5; //PUSH
break;
case 4:
Step=6; //JNS
break;
case 5:
Step=7; //MOV
Operand2=ComBuf2;
ComLen=2;
break;
case 6:
Operand2=ComBuf1;
break;
}
ComBuf1.Delete(1,Com[i][2].Length());
ComBuf1.Delete(3,1);
if(ComBuf1=="0A")
Operand1="AX";
else if(ComBuf1=="0B")
Operand1="BX";
else if(ComBuf1=="0C")
Operand1="CX";
else if(ComBuf1=="0D")
Operand1="DX";
else if(ComBuf1=="00")
Operand1=ComBuf2;
else
{
int c1,c2,c;
switch(ComBuf1[1])
{
case 'A':
c1=10;
break;
case 'B':
c1=11;
break;
case 'C':
c1=12;
break;
case 'D':
c1=13;
break;
case 'E':
c1=14;
break;
case 'F':
c1=15;
break;
default:
c1=ComBuf1[1]-48;
break;
}
switch(ComBuf1[2])
{
case 'A':
c2=10;
break;
case 'B':
c2=11;
break;
case 'C':
c2=12;
break;
case 'D':
c2=13;
break;
case 'E':
c2=14;
break;
case 'F':
c2=15;
break;
default:
c2=ComBuf1[2]-48;
break;
}
c=c1*16+c2;
if(c>127)
c=128-c;
Operand1=c;
}
}
//---------------------------------------------------------------------------
void __fastcall TMainForm::Run(TObject *Sender)
{
AnsiString S,S1,S2;
int i,l;
long c,c1=0,c2=0;
switch(Step)
{
case 0: //Begin
switch(Temp)
{
case 0:
Cshin->Brush->Color=clRed;
Button1->Caption="Следующий шаг";
Temp++;
break;
case 1:
Cshin->Brush->Color=clBlack;
CShin_Sfa_SegmRG1->Pen->Color=clRed;
CShin_Sfa_SegmRG2->Pen->Color=clRed;
Sfa_SegmRG2->Pen->Color=clRed;
SfaToSegmRG2->Font->Color=clRed;
IP->Color=clRed;
CS->Color=clRed;
StrBuf=IP->Text;
Temp=0;
Step++;
break;
}
break;
case 1: //IP - Memory
switch(Temp)
{
case 0:
CShin_Sfa_SegmRG1->Pen->Color=clBlack;
CShin_Sfa_SegmRG2->Pen->Color=clBlack;
Sfa_SegmRG2->Pen->Color=clBlack;
SfaToSegmRG2->Font->Color=clBlack;
IP->Color=clRed;
CS->Color=clRed;
Sfa_SegmRG1->Pen->Color=clRed;
SegmRGToSfa1->Font->Color=clRed;
Sfa_SegmRG2->Pen->Color=clRed;
SegmRGToSfa2->Font->Color=clRed;
SFA->Font->Color=clRed;
Temp++;
break;
case 1:
Sfa_SegmRG1->Pen->Color=clBlack;
Sfa_SegmRG2->Pen->Color=clBlack;
SegmRGToSfa1->Font->Color=clBlack;
SegmRGToSfa2->Font->Color=clBlack;
IP->Color=clWhite;
CS->Color=clWhite;
SFA->Font->Color=clBlack;
CShin_Sfa->Pen->Color=clRed;
SfaToCShin->Font->Color=clRed;
Cshin->Brush->Color=clRed;
Temp++;
break;
case 2:
CShin_Sfa->Pen->Color=clBlack;
SfaToCShin->Font->Color=clBlack;
Cshin->Brush->Color=clBlack;
Bad_Cshin->Pen->Color=clRed;
CShinToBad->Font->Color=clRed;
Bad->Font->Color=clRed;
Temp++;
break;
case 3:
Bad_Cshin->Pen->Color=clBlack;
CShinToBad->Font->Color=clBlack;
Bad->Font->Color=clBlack;
ShD_Bad->Pen->Color=clRed;
BadToShA->Font->Color=clRed;
Temp++;
break;
case 4:
ShD_Bad->Pen->Color=clBlack;
BadToShA->Font->Color=clBlack;
ShA->Brush->Color=clRed;
Mem_ShA->Pen->Color=clRed;
if(Stack->Cells[1][IPpoint]=="")
{
Timer1->Enabled=false;
Button2->Caption="Àâòî";
Application->MessageBox("В памяти отсутствует следующая команда","Ошибка",MB_OK+MB_ICONWARNING);
ShA->Brush->Color=clBlack;
Mem_ShA->Pen->Color=clBlack;
Step=1;
Temp=0;
break;
}
else
{
ComBuf1=Stack->Cells[1][IPpoint];
ComBuf2=Stack->Cells[1][IPpoint+1];
if((ComBuf1.Pos("50")!=0)||(ComBuf1.Pos("70")!=0)||((ComBuf1.Pos("0F6")!=0)&&(ComBuf1[5]!='0')))
ComBuf2="";
ComBuf1=ComBuf1.Delete(4,3);
if((ComBuf1.Pos("50")==0)&&(ComBuf1.Pos("70")==0)&&(ComBuf1.Pos("0F6")==0)&&(ComBuf1.Pos("69")==0)&&(ComBuf1.Pos("0F0")==0))
{
ComBuf1=Stack->Cells[1][IPpoint-1];
ComBuf2=Stack->Cells[1][IPpoint];
Flag=0;
}
else
ComBuf1=Stack->Cells[1][IPpoint];
}
Temp=0;
Step++;
break;
}
break;
case 2: //Memory - OK
switch(Temp)
{
case 0:
ShA->Brush->Color=clBlack;
Mem_ShA->Pen->Color=clBlack;
Mem_ShD->Pen->Color=clRed;
ShD->Brush->Color=clRed;
Temp++;
break;
case 1:
Mem_ShD->Pen->Color=clBlack;
ShD->Brush->Color=clBlack;
ShD_Bad->Pen->Color=clRed;
ShAToBad->Font->Color=clRed;
Bad->Font->Color=clRed;
Temp++;
break;
case 2:
ShD_Bad->Pen->Color=clBlack;
ShAToBad->Font->Color=clBlack;
Bad->Font->Color=clBlack;
Bad_Cshin->Pen->Color=clRed;
BadToCShin->Font->Color=clRed;
Cshin->Brush->Color=clRed;
Temp++;
break;
case 3:
Bad_Cshin->Pen->Color=clBlack;
BadToCShin->Font->Color=clBlack;
Cshin->Brush->Color=clBlack;
CShin_OK->Pen->Color=clRed;
CShinToOK->Font->Color=clRed;
OK3->Text=" "+ComBuf1;
ComLen=1;
if(!ComBuf2.IsEmpty())
{
OK2->Text=" "+ComBuf2;
OK2->Color=clRed;
ComLen=2;
}
OK3->Color=clRed;
Temp++;
break;
case 4:
CShin_OK->Pen->Color=clBlack;
CShinToOK->Font->Color=clBlack;
OK3->Color=clWhite;
OK2->Color=clWhite;
OK3->Text=" "+ComBuf2;
OK2->Text="";
RK->Color=clRed;
RK->Text=" "+ComBuf1;
OK_RK->Pen->Color=clRed;
OKToRK->Font->Color=clRed;
Temp=0;
AnalizCommand();
break;
}
break;
case 3: //IMUL
switch(Temp)
{
case 0:
OK_RK->Pen->Color=clBlack;
OKToRK->Font->Color=clBlack;
RK->Color=clWhite;
RK_AShin->Pen->Color=clRed;
RKToAShin->Font->Color=clRed;
Ashin->Brush->Color=clRed;
Temp++;
break;
case 1:
RK_AShin->Pen->Color=clBlack;
RKToAShin->Font->Color=clBlack;
Ashin->Brush->Color=clBlack;
AShin_CommonRG->Pen->Color=clRed;
AShinToCommonRG->Font->Color=clRed;
StrBuf=Operand1;
switch(StrBuf[1])
{
case 'A':
AX->Color=clRed;
StrBuf=AX->Text;
j=1;
break;
case 'B':
BX->Color=clRed;
StrBuf=BX->Text;
j=2;
break;
case 'C':
CX->Color=clRed;
StrBuf=CX->Text;
j=3;
break;
case 'D':
DX->Color=clRed;
StrBuf=DX->Text;
j=4;
break;
}
Temp++;
break;
case 2:
AShinToCommonRG->Font->Color=clBlack;
CommonRGToAShin->Font->Color=clRed;
Temp++;
break;
case 3:
CommonRGToAShin->Font->Color=clBlack;
AShin_CommonRG->Pen->Color=clBlack;
switch(j)
{
case 1:
AX->Color=clWhite;
break;
case 2:
BX->Color=clWhite;
break;
case 3:
CX->Color=clWhite;
break;
case 4:
DX->Color=clWhite;
break;
}
Ashin->Brush->Color=clRed;
AShin_ALU1->Pen->Color=clRed;
AShinToALU1->Font->Color=clRed;
P1->Text=StrBuf;
P1->Color=clRed;
Temp++;
break;
case 4:
Ashin->Brush->Color=clBlack;
AShin_ALU1->Pen->Color=clBlack;
AShinToALU1->Font->Color=clBlack;
P1->Color=clWhite;
StrBuf=OK3->Text;
OK3->Color=clRed;
OK_RK->Pen->Color=clRed;
OKToRK->Font->Color=clRed;
Temp++;
break;
case 5:
OK3->Color=clWhite;
OK_RK->Pen->Color=clBlack;
OKToRK->Font->Color=clBlack;
OK3->Text="";
RK->Text=StrBuf;
RK->Color=clRed;
RK_AShin->Pen->Color=clRed;
RKToAShin->Font->Color=clRed;
Ashin->Brush->Color=clRed;
Temp++;
break;
case 6:
RK->Color=clWhite;
RK_AShin->Pen->Color=clBlack;
RKToAShin->Font->Color=clBlack;
Ashin->Brush->Color=clBlack;
AShin_ALU2->Pen->Color=clRed;
AShinToALU2->Font->Color=clRed;
P2->Text=" "+RK->Text;
P2->Color=clRed;
Temp++;
break;
case 7:
AShin_ALU2->Pen->Color=clBlack;
AShinToALU2->Font->Color=clBlack;
P2->Color=clWhite;
S1=P1->Text;
S2=P2->Text;
S1=S1.TrimLeft();
S2=S2.TrimLeft();
S1=S1.Delete(S1.Length(),1);
S2=S2.Delete(S2.Length(),1);
if(S1.Length()==5)
S1=S1.Delete(1,1);
if(S2.Length()==5)
S2=S2.Delete(1,1);
for(i=1;i<=4;i++)
{
switch(S1[1])
{
case 'A':
c=10;
break;
case 'B':
c=11;
break;
case 'C':
c=12;
break;
case 'D':
c=13;
break;
case 'E':
c=14;
break;
case 'F':
c=15;
break;
default:
c=S1[1]-48;
break;
}
c1+=c*pow(16,4-i);
S1=S1.Delete(1,1);
}
for(i=1;i<=4;i++)
{
switch(S2[1])
{
case 'A':
c=10;
break;
case 'B':
c=11;
break;
case 'C':
c=12;
break;
case 'D':
c=13;
break;
case 'E':
c=14;
break;
case 'F':
c=15;
break;
default:
c=S2[1]-48;
break;
}
c2+=c*pow(16,4-i);
S2=S2.Delete(1,1);
}
c=c1*c2;
S=S.IntToHex(c,8);
if(((S[1]-48)>7)||(((S[1]-48)==0))&&((S[2]-48)>9))
SF=1;
else
SF=0;
S=" "+S+"h";
PP->Text=S;
PP->Color=clRed;
ALU_MUU->Pen->Color=clRed;
ALUToMUU->Font->Color=clRed;
MUU->Font->Color=clRed;
Temp++;
break;
case 8:
PP->Color=clWhite;
ALU_MUU->Pen->Color=clBlack;
ALUToMUU->Font->Color=clBlack;
MUU_RF->Pen->Color=clRed;
MUUToRF->Font->Color=clRed;
RF->Font->Color=clRed;
IndexRG_MUU->Pen->Color=clRed;
IndexRG_CommonRG1->Pen->Color=clRed;
IndexRG_CommonRG2->Pen->Color=clRed;
IndexRGToCommonRG->Font->Color=clRed;
AX->Color=clRed;
BX->Color=clRed;
S=PP->Text;
S=S.TrimLeft();
S1=S;
S1=S1.Delete(5,5);
S2=S.Delete(1,4);
AX->Text=" "+S1+"h";
BX->Text=" "+S2;
Temp++;
break;
case 9:
MUU_RF->Pen->Color=clBlack;
MUUToRF->Font->Color=clBlack;
RF->Font->Color=clBlack;
IndexRG_MUU->Pen->Color=clBlack;
IndexRG_CommonRG1->Pen->Color=clBlack;
IndexRG_CommonRG2->Pen->Color=clBlack;
IndexRGToCommonRG->Font->Color=clBlack;
AX->Color=clWhite;
BX->Color=clWhite;
MUU->Font->Color=clBlack;
RF->Font->Color=clBlack;
Cshin->Brush->Color=clRed;
Temp=0;
Step=8;
break;
}
break;
case 4: //NOT
switch(Temp)
{
case 0:
OK_RK->Pen->Color=clBlack;
OKToRK->Font->Color=clBlack;
RK->Color=clWhite;
RK_AShin->Pen->Color=clRed;
RKToAShin->Font->Color=clRed;
Ashin->Brush->Color=clRed;
Temp++;
break;
case 1:
RK_AShin->Pen->Color=clBlack;
RKToAShin->Font->Color=clBlack;
Ashin->Brush->Color=clBlack;
if(ComLen==1)
{
AShin_CommonRG->Pen->Color=clRed;
AShinToCommonRG->Font->Color=clRed;
S=Operand1;
switch(S[1])
{
case 'A':
j=1;
AX->Color=clRed;
break;
case 'B':
j=2;
BX->Color=clRed;
break;
case 'C':
j=3;
CX->Color=clRed;
break;
case 'D':
j=4;
DX->Color=clRed;
break;
}
}
else
{
CShin_AShin->Pen->Color=clRed;
CShinToAShin->Font->Color=clRed;
Cshin->Brush->Color=clRed;
CShin_OK->Pen->Color=clRed;
CShinToOK->Font->Color=clRed;
OK3->Color=clRed;
OK_RK->Pen->Color=clRed;
OKToRK->Font->Color=clRed;
}
Temp++;
break;
case 2:
if(ComLen==1)
{
AShinToCommonRG->Font->Color=clBlack;
CommonRGToAShin->Font->Color=clRed;
}
else
{
CShin_AShin->Pen->Color=clBlack;
CShinToAShin->Font->Color=clBlack;
Cshin->Brush->Color=clBlack;
CShin_OK->Pen->Color=clBlack;
CShinToOK->Font->Color=clBlack;
OK3->Color=clWhite;
OK_RK->Pen->Color=clBlack;
OKToRK->Font->Color=clBlack;
RK->Text=OK3->Text;
OK3->Text="";
RK->Color=clRed;
RK_AShin->Pen->Color=clRed;
RKToAShin->Font->Color=clRed;
}
Temp++;
break;
case 3:
if(ComLen==1)
{
CommonRGToAShin->Font->Color=clBlack;
AShin_CommonRG->Pen->Color=clBlack;
AX->Color=clWhite;
BX->Color=clWhite;
CX->Color=clWhite;
DX->Color=clWhite;
switch(j)
{
case 1:
P1->Text=AX->Text;
break;
case 2:
P1->Text=BX->Text;
break;
case 3:
P1->Text=CX->Text;
break;
case 4:
P1->Text=DX->Text;
break;
}
}
else
{
RK->Color=clWhite;
RK_AShin->Pen->Color=clBlack;
RKToAShin->Font->Color=clBlack;
P1->Text=RK->Text;
}
Ashin->Brush->Color=clRed;
AShin_ALU1->Pen->Color=clRed;
AShinToALU1->Font->Color=clRed;
P1->Color=clRed;
Temp++;
break;
case 4:
Ashin->Brush->Color=clBlack;
AShin_ALU1->Pen->Color=clBlack;
AShinToALU1->Font->Color=clBlack;
P1->Color=clWhite;
S=P1->Text;
S=S.TrimLeft();
S=S.Delete(S.Length(),1);
if(S.Length()==5)
S=S.Delete(1,1);
for(i=S.Length();i>=1;i--)
{
for(l=0;l<=15;l++)
{
if(S[i]==Simbols[l])
{
S[i]=Simbols[15-l];
break;
}
}
}
if((S[1]=='A')||(S[1]=='B')||(S[1]=='C')||(S[1]=='D')||(S[1]=='E')||(S[1]=='F'))
S="0"+S;
PP->Text=" "+S+"h";
PP->Color=clRed;
Temp++;
break;
case 5:
PP->Color=clWhite;
ALU_AShin1->Pen->Color=clRed;
ALU_AShin2->Pen->Color=clRed;
ALU_AShin3->Pen->Color=clRed;
ALUToAShin->Font->Color=clRed;
Temp++;
break;
case 6:
ALU_AShin1->Pen->Color=clBlack;
ALU_AShin2->Pen->Color=clBlack;
ALU_AShin3->Pen->Color=clBlack;
ALUToAShin->Font->Color=clBlack;
Ashin->Brush->Color=clRed;
AShin_CommonRG->Pen->Color=clRed;
AShinToCommonRG->Font->Color=clRed;
if(ComLen==2)
j=1;
switch(j)
{
case 1:
AX->Color=clRed;
AX->Text=PP->Text;
break;
case 2:
BX->Color=clRed;
BX->Text=PP->Text;
break;
case 3:
CX->Color=clRed;
CX->Text=PP->Text;
break;
case 4:
DX->Color=clRed;
DX->Text=PP->Text;
break;
}
Temp++;
break;
case 7:
Ashin->Brush->Color=clBlack;
AShin_CommonRG->Pen->Color=clBlack;
AShinToCommonRG->Font->Color=clBlack;
AX->Color=clWhite;
BX->Color=clWhite;
CX->Color=clWhite;
DX->Color=clWhite;
Cshin->Brush->Color=clRed;
Step=8;
Temp=0;
break;
}
break;
case 5: //PUSH
switch(Temp)
{
case 0:
OK_RK->Pen->Color=clBlack;
OKToRK->Font->Color=clBlack;
RK->Color=clWhite;
MUU_UUiS->Pen->Color=clRed;
UUiSToMUU->Font->Color=clRed;
MUU->Font->Color=clRed;
Temp++;
break;
case 1:
MUU_UUiS->Pen->Color=clBlack;
UUiSToMUU->Font->Color=clBlack;
MUU->Font->Color=clBlack;
IndexRG_MUU->Pen->Color=clRed;
MUUToIndexRG->Font->Color=clRed;
SP->Color=clRed;
Temp++;
break;
case 2:
IndexRGToMUU->Font->Color=clBlack;
MUUToIndexRG->Font->Color=clBlack;
IndexRG_CommonRG1->Pen->Color=clRed;
IndexRGToAShin->Font->Color=clRed;
Ashin->Brush->Color=clRed;
Temp++;
break;
case 3:
IndexRG_CommonRG1->Pen->Color=clBlack;
IndexRGToAShin->Font->Color=clBlack;
Ashin->Brush->Color=clBlack;
IndexRG_MUU->Pen->Color=clBlack;
SP->Color=clWhite;
CShin_AShin->Pen->Color=clRed;
AShinToCShin->Font->Color=clRed;
Cshin->Brush->Color=clRed;
Temp++;
break;
case 4:
CShin_AShin->Pen->Color=clBlack;
AShinToCShin->Font->Color=clBlack;
Cshin->Brush->Color=clBlack;
CShin_Sfa_SegmRG1->Pen->Color=clRed;
CShin_Sfa_SegmRG2->Pen->Color=clRed;
Sfa_SegmRG2->Pen->Color=clRed;
SegmRGToSfa2->Font->Color=clRed;
SS->Color=clRed;
Sfa_SegmRG1->Pen->Color=clRed;
SegmRGToSfa1->Font->Color=clRed;
SFA->Font->Color=clRed;
Temp++;
break;
case 5:
CShin_Sfa_SegmRG1->Pen->Color=clBlack;
CShin_Sfa_SegmRG2->Pen->Color=clBlack;
Sfa_SegmRG2->Pen->Color=clBlack;
SegmRGToSfa2->Font->Color=clBlack;
SS->Color=clWhite;
Sfa_SegmRG1->Pen->Color=clBlack;
SegmRGToSfa1->Font->Color=clBlack;
SFA->Font->Color=clBlack;
CShin_Sfa->Pen->Color=clRed;
SfaToCShin->Font->Color=clRed;
Cshin->Brush->Color=clRed;
Temp++;
break;
case 6:
CShin_Sfa->Pen->Color=clBlack;
SfaToCShin->Font->Color=clBlack;
Cshin->Brush->Color=clBlack;
Bad_Cshin->Pen->Color=clRed;
CShinToBad->Font->Color=clRed;
Bad->Font->Color=clRed;
Temp++;
break;
case 7:
Bad_Cshin->Pen->Color=clBlack;
CShinToBad->Font->Color=clBlack;
Bad->Font->Color=clBlack;
ShD_Bad->Pen->Color=clRed;
BadToShA->Font->Color=clRed;
ShA->Brush->Color=clRed;
Mem_ShA->Pen->Color=clRed;
Temp++;
break;
case 8:
ShD_Bad->Pen->Color=clBlack;
BadToShA->Font->Color=clBlack;
ShA->Brush->Color=clBlack;
Mem_ShA->Pen->Color=clBlack;
S=Operand1;
switch(S[1])
{
case 'A':
AX->Color=clRed;
break;
case 'B':
BX->Color=clRed;
break;
case 'C':
CX->Color=clRed;
break;
case 'D':
DX->Color=clRed;
break;
}
AShin_CommonRG->Pen->Color=clRed;
CommonRGToAShin->Font->Color=clRed;
Ashin->Brush->Color=clRed;
Temp++;
break;
case 9:
AX->Color=clWhite;
BX->Color=clWhite;
CX->Color=clWhite;
DX->Color=clWhite;
AShin_CommonRG->Pen->Color=clBlack;
CommonRGToAShin->Font->Color=clBlack;
Ashin->Brush->Color=clBlack;
CShin_AShin->Pen->Color=clRed;
AShinToCShin->Font->Color=clRed;
Cshin->Brush->Color=clRed;
Temp++;
break;
case 10:
CShin_AShin->Pen->Color=clBlack;
AShinToCShin->Font->Color=clBlack;
Cshin->Brush->Color=clBlack;
Bad_Cshin->Pen->Color=clRed;
CShinToBad->Font->Color=clRed;
Bad->Font->Color=clRed;
Temp++;
break;
case 11:
Bad_Cshin->Pen->Color=clBlack;
CShinToBad->Font->Color=clBlack;
Bad->Font->Color=clBlack;
ShD_Bad->Pen->Color=clRed;
BadToShA->Font->Color=clRed;
ShD->Brush->Color=clRed;
Mem_ShD->Pen->Color=clRed;
switch(Operand1[1])
{
case 'A':
S=AX->Text;
break;
case 'B':
S=BX->Text;
break;
case 'C':
S=CX->Text;
break;
case 'D':
S=DX->Text;
break;
}
S=S.TrimLeft();
Stack->Cells[1][SPpoint]=S;
Temp++;
break;
case 12:
ShD_Bad->Pen->Color=clBlack;
BadToShA->Font->Color=clBlack;
ShD->Brush->Color=clBlack;
Mem_ShD->Pen->Color=clBlack;
SP->Color=clRed;
IndexRG_MUU->Pen->Color=clRed;
IndexRG_CommonRG1->Pen->Color=clRed;
IndexRGToAShin->Font->Color=clRed;
Ashin->Brush->Color=clRed;
Temp++;
break;
case 13:
SP->Color=clWhite;
IndexRG_MUU->Pen->Color=clBlack;
IndexRG_CommonRG1->Pen->Color=clBlack;
IndexRGToAShin->Font->Color=clBlack;
Ashin->Brush->Color=clBlack;
AShin_ALU1->Pen->Color=clRed;
AShinToALU1->Font->Color=clRed;
P1->Text=SP->Text;
P1->Color=clRed;
Temp++;
break;
case 14:
AShin_ALU1->Pen->Color=clBlack;
AShinToALU1->Font->Color=clBlack;
P1->Color=clWhite;
SPpoint--;
S=S.IntToHex(SPpoint-129,4);
PP->Text=" "+S+"h";
PP->Color=clRed;
Temp++;
break;
case 15:
PP->Color=clWhite;
ALU_MUU->Pen->Color=clRed;
ALUToMUU->Font->Color=clRed;
MUU->Font->Color=clRed;
Temp++;
break;
case 16:
ALU_MUU->Pen->Color=clBlack;
ALUToMUU->Font->Color=clBlack;
MUU->Font->Color=clBlack;
IndexRG_MUU->Pen->Color=clRed;
MUUToIndexRG->Font->Color=clRed;
SP->Text=PP->Text;
SP->Color=clRed;
Temp++;
break;
case 17:
IndexRG_MUU->Pen->Color=clBlack;
MUUToIndexRG->Font->Color=clBlack;
SP->Color=clWhite;
Cshin->Brush->Color=clRed;
Temp=0;
Step=8;
break;
}
break;
case 6: //JNS
switch(Temp)
{
case 0:
OK_RK->Pen->Color=clBlack;
OKToRK->Font->Color=clBlack;
RK->Color=clWhite;
MUU_UUiS->Pen->Color=clRed;
UUiSToMUU->Font->Color=clRed;
MUU->Font->Color=clRed;
Temp++;
break;
case 1:
MUU_UUiS->Pen->Color=clBlack;
UUiSToMUU->Font->Color=clBlack;
MUU->Font->Color=clBlack;
MUU_RF->Pen->Color=clRed;
MUUToRF->Font->Color=clRed;
RF->Font->Color=clRed;
Temp++;
break;
case 2:
MUU_RF->Pen->Color=clBlack;
MUUToRF->Font->Color=clBlack;
RF->Font->Color=clBlack;
if(SF==1)
{
ComLen=1;
Cshin->Brush->Color=clRed;
Temp=0;
Step=8;
}
else
{
RK->Color=clRed;
RK_AShin->Pen->Color=clRed;
RKToAShin->Font->Color=clRed;
Ashin->Brush->Color=clRed;
Temp++;
}
break;
case 3:
RK->Color=clWhite;
RK_AShin->Pen->Color=clBlack;
RKToAShin->Font->Color=clBlack;
Ashin->Brush->Color=clBlack;
CShin_AShin->Pen->Color=clRed;
AShinToCShin->Font->Color=clRed;
Cshin->Brush->Color=clRed;
Temp++;
break;
case 4:
CShin_AShin->Pen->Color=clBlack;
AShinToCShin->Font->Color=clBlack;
Cshin->Brush->Color=clBlack;
CShin_Sfa_SegmRG1->Pen->Color=clRed;
CShin_Sfa_SegmRG2->Pen->Color=clRed;
Sfa_SegmRG2->Pen->Color=clRed;
SfaToSegmRG2->Font->Color=clRed;
IP->Color=clRed;
Temp++;
break;
case 5:
CShin_Sfa_SegmRG1->Pen->Color=clBlack;
CShin_Sfa_SegmRG2->Pen->Color=clBlack;
Sfa_SegmRG2->Pen->Color=clBlack;
SfaToSegmRG2->Font->Color=clBlack;
IP->Color=clWhite;
SegmRG_RO->Pen->Color=clRed;
SegmRGToRO->Font->Color=clRed;
RO->Text=IP->Text;
RO->Color=clRed;
Temp++;
break;
case 6:
SegmRG_RO->Pen->Color=clBlack;
SegmRGToRO->Font->Color=clBlack;
RO->Color=clWhite;
RO_AShin->Pen->Color=clRed;
ROToAShin->Font->Color=clRed;
Ashin->Brush->Color=clRed;
Temp++;
break;
case 7:
RO_AShin->Pen->Color=clBlack;
ROToAShin->Font->Color=clBlack;
Ashin->Brush->Color=clBlack;
AShin_ALU1->Pen->Color=clRed;
AShinToALU1->Font->Color=clRed;
P1->Text=RO->Text;
P1->Color=clRed;
Temp++;
break;
case 8:
AShin_ALU1->Pen->Color=clBlack;
AShinToALU1->Font->Color=clBlack;
P1->Color=clWhite;
IPpoint+=Jmp;
PP->Text=" "+PP->Text.IntToHex(IPpoint-1,4)+"h";
PP->Color=clRed;
Temp++;
break;
case 9:
PP->Color=clWhite;
ALU_AShin1->Pen->Color=clRed;
ALU_AShin2->Pen->Color=clRed;
ALU_AShin3->Pen->Color=clRed;
ALUToAShin->Font->Color=clRed;
Ashin->Brush->Color=clRed;
Temp++;
break;
case 10:
ALU_AShin1->Pen->Color=clBlack;
ALU_AShin2->Pen->Color=clBlack;
ALU_AShin3->Pen->Color=clBlack;
ALUToAShin->Font->Color=clBlack;
Ashin->Brush->Color=clBlack;
RO_AShin->Pen->Color=clRed;
AShinToRO->Font->Color=clRed;
RO->Color=clRed;
RO->Text=PP->Text;
Temp++;
break;
case 11:
RO_AShin->Pen->Color=clBlack;
AShinToRO->Font->Color=clBlack;
RO->Color=clWhite;
SegmRG_RO->Pen->Color=clRed;
ROToSegmRG->Font->Color=clRed;
IP->Color=clRed;
IP->Text=RO->Text;
Temp++;
break;
case 12:
SegmRG_RO->Pen->Color=clBlack;
ROToSegmRG->Font->Color=clBlack;
IP->Color=clWhite;
Temp=0;
Step=1;
break;
}
break;
case 7: //MOV
switch(Temp)
{
case 0:
OK_RK->Pen->Color=clBlack;
OKToRK->Font->Color=clBlack;
RK->Color=clWhite;
RK_AShin->Pen->Color=clRed;
RKToAShin->Font->Color=clRed;
Ashin->Brush->Color=clRed;
Temp++;
break;
case 1:
RK_AShin->Pen->Color=clBlack;
RKToAShin->Font->Color=clBlack;
Ashin->Brush->Color=clBlack;
CShin_AShin->Pen->Color=clRed;
AShinToCShin->Font->Color=clRed;
Cshin->Brush->Color=clRed;
Temp++;
break;
case 2:
CShin_AShin->Pen->Color=clBlack;
AShinToCShin->Font->Color=clBlack;
Cshin->Brush->Color=clBlack;
CShin_OK->Pen->Color=clRed;
CShinToOK->Font->Color=clRed;
OK3->Color=clRed;
Temp++;
break;
case 3:
CShin_OK->Pen->Color=clBlack;
CShinToOK->Font->Color=clBlack;
OK3->Color=clWhite;
OK3->Color=clWhite;
OK_RK->Pen->Color=clRed;
OKToRK->Font->Color=clRed;
RK->Color=clRed;
RK->Text=OK3->Text;
OK3->Text="";
Temp++;
break;
case 4:
OK_RK->Pen->Color=clBlack;
OKToRK->Font->Color=clBlack;
RK->Color=clWhite;
RK_AShin->Pen->Color=clRed;
RKToAShin->Font->Color=clRed;
Ashin->Brush->Color=clRed;
Temp++;
break;
case 6:
AShin_CommonRG->Pen->Color=clBlack;
AShinToCommonRG->Font->Color=clBlack;
AX->Color=clWhite;
BX->Color=clWhite;
CX->Color=clWhite;
DX->Color=clWhite;
Cshin->Brush->Color=clRed;
Temp=0;
Step=8;
break;
case 5:
RK_AShin->Pen->Color=clBlack;
RKToAShin->Font->Color=clBlack;
Ashin->Brush->Color=clBlack;
AShin_CommonRG->Pen->Color=clRed;
AShinToCommonRG->Font->Color=clRed;
S=Operand1;
switch(S[1])
{
case 'A':
AX->Text=" "+Operand2;
AX->Color=clRed;
break;
case 'B':
BX->Text=" "+Operand2;
BX->Color=clRed;
break;
case 'C':
CX->Text=" "+Operand2;
CX->Color=clRed;
break;
case 'D':
DX->Text=" "+Operand2;
DX->Color=clRed;
break;
}
Temp++;
break;
}
break;
case 8: //IP = IP + 2
switch(Temp)
{
case 0:
Cshin->Brush->Color=clBlack;
CShin_Sfa_SegmRG1->Pen->Color=clRed;
CShin_Sfa_SegmRG2->Pen->Color=clRed;
Sfa_SegmRG2->Pen->Color=clRed;
SfaToSegmRG2->Font->Color=clRed;
IP->Color=clRed;
Temp++;
break;
case 1:
CShin_Sfa_SegmRG1->Pen->Color=clBlack;
CShin_Sfa_SegmRG2->Pen->Color=clBlack;
Sfa_SegmRG2->Pen->Color=clBlack;
SfaToSegmRG2->Font->Color=clBlack;
IP->Color=clWhite;
SegmRG_RO->Pen->Color=clRed;
SegmRGToRO->Font->Color=clRed;
RO->Color=clRed;
RO->Text=IP->Text;
Temp++;
break;
case 2:
SegmRG_RO->Pen->Color=clBlack;
SegmRGToRO->Font->Color=clBlack;
RO->Color=clWhite;
RO_AShin->Pen->Color=clRed;
ROToAShin->Font->Color=clRed;
Ashin->Brush->Color=clRed;
Temp++;
break;
case 3:
RO_AShin->Pen->Color=clBlack;
ROToAShin->Font->Color=clBlack;
Ashin->Brush->Color=clBlack;
AShin_ALU1->Pen->Color=clRed;
AShinToALU1->Font->Color=clRed;
P1->Color=clRed;
P1->Text=RO->Text;
Temp++;
break;
case 4:
AShin_ALU1->Pen->Color=clBlack;
AShinToALU1->Font->Color=clBlack;
P1->Color=clWhite;
if((ComLen==2)&&(Flag==1))
IPpoint++;
Flag=1;
PP->Text=" "+PP->Text.IntToHex(IPpoint,4)+"h";
IPpoint++;
PP->Color=clRed;
ALU_AShin1->Pen->Color=clRed;
ALU_AShin2->Pen->Color=clRed;
ALU_AShin3->Pen->Color=clRed;
ALUToAShin->Font->Color=clRed;
Temp++;
break;
case 5:
PP->Color=clWhite;
ALU_AShin1->Pen->Color=clBlack;
ALU_AShin2->Pen->Color=clBlack;
ALU_AShin3->Pen->Color=clBlack;
ALUToAShin->Font->Color=clBlack;
Ashin->Brush->Color=clRed;
RO_AShin->Pen->Color=clRed;
ROToAShin->Font->Color=clRed;
RO->Text=PP->Text;
RO->Color=clRed;
Temp++;
break;
case 6:
Ashin->Brush->Color=clBlack;
RO_AShin->Pen->Color=clBlack;
ROToAShin->Font->Color=clBlack;
RO->Color=clWhite;
SegmRG_RO->Pen->Color=clRed;
ROToSegmRG->Font->Color=clRed;
IP->Text=RO->Text;
IP->Color=clRed;
Temp++;
break;
case 7:
SegmRG_RO->Pen->Color=clBlack;
ROToSegmRG->Font->Color=clBlack;
IP->Color=clWhite;
Temp=0;
Step=1;
break;
}
break;
}
}
//---------------------------------------------------------------------------
void __fastcall TMainForm::AutoRun(TObject *Sender)
{
if(Timer1->Enabled==true)
{
Timer1->Enabled=false;
Button2->Caption="Àâòî";
}
else
{
Timer1->Enabled=true;
Button2->Caption="Ñòîï";
}
}
//---------------------------------------------------------------------------
void __fastcall TMainForm::Clear(TObject *Sender)
{
int i;
Timer1->Enabled=false;
Button2->Caption="Àâòî";
Button1->Caption="Ïóñê";
AX->Text=" 0000h";
BX->Text=" 0000h";
CX->Text=" 0000h";
DX->Text=" 0000h";
IP->Text=" 0000h";
SP->Text=" 007Eh";
RO->Text="";
OK3->Text="";
OK2->Text="";
RK->Text="";
P1->Text="";
P2->Text="";
PP->Text="";
Count=0;
Step=0;
Temp=0;
IPpoint=1;
SPpoint=255;
SF=0;
Flag=1;
for(i=1;i<256;i++)
Stack->Cells[1][i]="";
Mem_ShA->Pen->Color=clBlack;
Mem_ShD->Pen->Color=clBlack;
Mem_ShU->Pen->Color=clBlack;
ShA->Brush->Color=clBlack;
ShD->Brush->Color=clBlack;
ShU->Brush->Color=clBlack;
BadToShA->Font->Color=clBlack;
ShD_Bad->Pen->Color=clBlack;
ShAToBad->Font->Color=clBlack;
CShinToBad->Font->Color=clBlack;
Bad_Cshin->Pen->Color=clBlack;
BadToCShin->Font->Color=clBlack;
Cshin->Brush->Color=clBlack;
SfaToCShin->Font->Color=clBlack;
CShin_Sfa->Pen->Color=clBlack;
CShinToSfa->Font->Color=clBlack;
CShin_Sfa_SegmRG1->Pen->Color=clBlack;
CShin_Sfa_SegmRG2->Pen->Color=clBlack;
Sfa_SegmRG1->Pen->Color=clBlack;
Sfa_SegmRG2->Pen->Color=clBlack;
SegmRGToSfa1->Font->Color=clBlack;
SegmRGToSfa2->Font->Color=clBlack;
SfaToSegmRG1->Font->Color=clBlack;
SfaToSegmRG2->Font->Color=clBlack;
ROToSegmRG->Font->Color=clBlack;
SegmRG_RO->Pen->Color=clBlack;
SegmRGToRO->Font->Color=clBlack;
AShinToRO->Font->Color=clBlack;
RO_AShin->Pen->Color=clBlack;
ROToAShin->Font->Color=clBlack;
CShin_AShin->Pen->Color=clBlack;
CShinToAShin->Font->Color=clBlack;
AShinToCShin->Font->Color=clBlack;
CShin_OK->Pen->Color=clBlack;
CShinToOK->Font->Color=clBlack;
OK_RK->Pen->Color=clBlack;
OKToRK->Font->Color=clBlack;
RK_AShin->Pen->Color=clBlack;
RKToAShin->Font->Color=clBlack;
Ashin->Brush->Color=clBlack;
CommonRGToAShin->Font->Color=clBlack;
AShin_CommonRG->Pen->Color=clBlack;
AShinToCommonRG->Font->Color=clBlack;
IndexRGToAShin->Font->Color=clBlack;
IndexRGToCommonRG->Font->Color=clBlack;
MUUToIndexRG->Font->Color=clBlack;
IndexRG_CommonRG1->Pen->Color=clBlack;
IndexRG_CommonRG2->Pen->Color=clBlack;
IndexRG_MUU->Pen->Color=clBlack;
ALUToAShin->Font->Color=clBlack;
ALU_AShin1->Pen->Color=clBlack;
ALU_AShin2->Pen->Color=clBlack;
ALU_AShin3->Pen->Color=clBlack;
AShin_ALU1->Pen->Color=clBlack;
AShin_ALU2->Pen->Color=clBlack;
AShinToALU1->Font->Color=clBlack;
AShinToALU2->Font->Color=clBlack;
ALU_MUU->Pen->Color=clBlack;
ALUToMUU->Font->Color=clBlack;
IndexRGToMUU->Font->Color=clBlack;
RFToMUU->Font->Color=clBlack;
MUU_RF->Pen->Color=clBlack;
MUUToRF->Font->Color=clBlack;
UUiSToMUU->Font->Color=clBlack;
MUU_UUiS->Pen->Color=clBlack;
MUUToUUiS->Font->Color=clBlack;
Bad->Font->Color=clBlack;
SFA->Font->Color=clBlack;
MUU->Font->Color=clBlack;
RF->Font->Color=clBlack;
CS->Color=clWhite;
SS->Color=clWhite;
IP->Color=clWhite;
RO->Color=clWhite;
OK3->Color=clWhite;
OK2->Color=clWhite;
RK->Color=clWhite;
AX->Color=clWhite;
BX->Color=clWhite;
CX->Color=clWhite;
DX->Color=clWhite;
SP->Color=clWhite;
P1->Color=clWhite;
P2->Color=clWhite;
PP->Color=clWhite;
}
//---------------------------------------------------------------------------
void __fastcall TMainForm::About2Click(TObject *Sender)
{
AboutForm->Show();
}
//---------------------------------------------------------------------------
