Модераторы: Poseidon
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> [C] Моделирование гипотетического процессора Н6809, Смоделировать работу процессора 
:(
    Опции темы
Питерский
  Дата 28.1.2010, 00:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 2
Регистрация: 27.1.2010

Репутация: нет
Всего: нет



Необходимо Смоделировать на Си, работу процессора 6809 фирмы Motorola

1.1 Задача, решаемая программой

Организация процессора с одним аккумулятором. Создание программной модели процессора фирмы Motorola 6809. 

1.2 Метод решения 

Содержимое входного файла копируется во внутренний массив, исполняющий роль памя-ти процессора.
Организуется цикл выборки. В начале цикла в регистр IR заносится команда из памяти. Далее эта команда анализируется, затем выводится результат обработки команды и со-стояние PC, A, X,SP, Z. Переходим к следующей команде. Цикл продолжается до тех пор, пока не будет достигнут адрес возврата в операционную систему.

1.3 Требование к входным данным

На входе программе передаётся двоичный файл. Файл имеет следующую структуру:


Стартовый адрес (Start Address)


Адрес загрузки блока 1 (Block 1 Load Address)
Длина блока 1 (Block 1Length)
Тело блока 1 (Block 1 body)

.    .    .

Адрес загрузки блока N (Block N Load Address)
Длина блока N (Block N Length)
Тело блока N (Block N body)


Программа начинается со стартового адреса (2 байта). Следующие 2 байта –адрес загруз-ки (2 байта), за ним следует длина (2 байта). В случае отсутствия файла программа вы-даст соответствующее сообщение, и выполнение программы будет прервано.

1.4 Выходные данные

Программа по записанным двоичным последовательностям восстанавливает команду и ис-полняет её. Результат исполнения выводится на экран в зависимости от заданного режи-ма, так же создается текстовой файл отчета. Вывод памяти может осуществляться много-кратно, притом адреса могут так же быть изменены пользователем.

2.1Подробное описание метода решения

Программа запускается с параметрами командной строки. Первый параметр должен присутствовать всегда, это путь к входному файлу. Если входной параметр не задан или описан некорректно, выдается сведение об ошибке. В случае верной инициализации не-обходимого файла на экран выводится стартовый адрес и адрес загрузки, после чего пользователю предлагается меню, которое содержит следующие варианты дальнейших действий:
1    Regular run (полная прогонка программы)
2    Stepped run (пошаговая прогонка программы), 
3    Exit (Выход)
Режимы выполнения программы 1-2, в свою очередь содержать одинаковые подменю:
0     Breakpoint menu (меню только для полной прогонки, работает с точками
остановки - запись, добавление, удаление)
1  Print RAM  (печать памяти - от одного заданного пользователем адреса до другого)
2  Go (Полное/пошаговое исполнение)
3  Exit (Выход)
и вывод на экран содержимого PC,A,X, IR, EAR, SP, Z и аккумулятора на каждом шаге/в начале и конце прокрутки (в зависимости от режима исполнения).
В основе исполнения программы лежит функция Execute, в которой непосредственно идёт сравнение команд считанных из файла  со стандартными командами процессора H6809. Идёт проверка на совпадение с командами, и дальнейшее их выполнение. Цикл исполняется до тех пор, пока не будет достигнут адрес возврата в операционную систему, который определён как кон-станта 1000h

вот мой исходник, совсем чуть чуть:
Код


# include<stdio.h>
# include<conio.h>
# include <string.h>
//мнемоника операнды для машинных команд
        #define NOP 0x12
        #define CLRA 0x4F
        #define COMA 0x43
        #define NEGA 0x40
        #define LDA1 0x86
        #define LDA2 0xA6
        #define LDA 0xB6
        #define STA2 0xA7
        #define STA 0xB7
        #define ADDA1 0x8B
        #define ADDA 0xBB
        #define ANDA1 0x84
        #define ANDA 0xB4
        #define CMPA1 0x81
        #define CMPA 0xB1
        #define LDX1 0x8E
        #define LDX 0xBE
        #define STX 0xBF
        #define CMPX1 0x8C
        #define CMPX 0xBC
        #define ADDX1 0x30
        #define ADDX 0x31
        #define LDS1 0x8F
        #define BNE 0x26
        #define BEQ 0x27
        #define BRA 0x20
        #define JMP 0x7E
        #define JSR 0xBD
        #define RTS 0x39
// Адрес, переход по которому означает окончание программы
        #define EXIT_ADDRESS  0x1000
// описания регистров и памяти
unsigned short  EAR, SP, PC, X;
unsigned char   IR;
unsigned char     A;
unsigned char   Z;
unsigned char   RAM[65535];
unsigned short breakpoint[65536],key,lbr;
FILE *LOG, *TEMP;
// адрес, начиная с которого исполняется программа
unsigned short StartAddress = 0 ;


unsigned char MEM(unsigned short MP) // чтение байта из памяти
{
    return RAM[MP];
}

void MEMByte(unsigned short MP, unsigned char DATA) // запись байта в память
{
    RAM[MP]=DATA;
}
unsigned short MEMW(unsigned short MP) // чтение слова из памяти
{
    return (((unsigned short)RAM[MP])>>(sizeof(char)*8))|RAM[MP+1];
}
void MEMWord(unsigned short MP, unsigned short DATA) // запись слова в память
{
    RAM[MP]=(unsigned char)(DATA<<(sizeof(char)*8));
    RAM[MP+1]=(unsigned char)DATA;
}

void TestByte(unsigned char Data) // установка триггера для байта
{
    Z=(Data==0);
}
void TestWord(unsigned short Data) // установка триггера для слова
{
    Z=(Data==0);
}

unsigned short NextWord(void) // следущее слово в памяти
{
    unsigned short adress;
    adress=PC;
    PC+=2;
    return MEM(adress);
}
unsigned char NextByte(void) // следующий байт в памяти
{
    unsigned short adress;
    adress=PC;
    PC++;
    return MEM(adress);
}

void FetchAddr(void)
{
    unsigned char x,y;
    x=NextByte;
    y=NextByte;
    EAR=((unsigned short) x<<8)|y;
}


/*Функции машины H6809:*/
void nop(void)      // нет операции
{
    fprintf(LOG,"NOP  --> ");
    ;
}
void clra(void)
{    fprintf(LOG,"CLRA  --> ");
    A=0;
    TestByte(A);
}
void coma(void)
{    
    fprintf(LOG,"COMA  --> ");
    A=~A;
    TestByte(A);
}
void nega(void)
{    fprintf(LOG,"NEGA  --> ");
    A=-A;
    TestByte(A);
}
void lda1(void)
{    fprintf(LOG,"LDA  --> ");
    A=NextByte;
    TestByte(A);
}
void lda2(void)
{
    A=MEM(X);
    TestByte(A);
}
void lda(void)
{
    FetchAddr();
    A=MEM(EAR);
    TestByte(A);
}
void sta(void)
{
    FetchAddr();
    MEMByte(EAR, A);
}
void sta2(void)
{
    MEMByte(X, A);
}
void adda1(void)
{    
    unsigned char x;
    x=NextByte;
    A=A+x;
    TestByte(A);
}
void adda(void) 
{
    FetchAddr();
    A=A+MEM(EAR);
    TestByte(A);
}
void anda1(void)
{
    A=A&&NextByte; 
    TestByte(A);
}
void anda(void)
{
    FetchAddr();
    A=A&&(MEM(EAR));
    TestByte(A);
}
void cmpa1(void)
{    unsigned char x;
    x=NextByte;
    TestByte(A-x);
}
/*Главные функции:*/
void Fetch()
{
IR=RAM[PC];
PC++;
}
// Чтение программы из файла
/*  void read( char *fileName )
   {
    unsigned int BlockLoadAddress = 0 ;
    int NumberOfBlocks = 0, BlockLength = 0, i = 0 ;
    FILE *f=fopen( fileName,"rb");
    if (f==0)
    {
        printf ("No file\n");
        exit(1);
    }

    // программа начинается с адреса START_ADDRESS
    fscanf ( f, "%x", &StartAddress);
    fscanf ( f, "%d", &NumberOfBlocks);
    for (i = 0; i < NumberOfBlocks; i++)
    {
        fscanf ( f, "%x", &BlockLoadAddress);
        fscanf ( f, "%d", &BlockLength);

        for( ; BlockLength != 0 ; --BlockLength )
            fscanf( f, "%x", &memory[BlockLoadAddress++]);
    }

    fclose(f);
} */


//главный исполнительный цикл (функции и Execute)


void Execute()
{
// оператор case,  - выбор команды (прочитали из массива, определили и выполняем)
}

// главный модуль
void main(void)
{
    // загрузка программы в память (в массив)

    PC=0;
    Fetch();
    Execute();
}


-------------
я не знаю как создать файл, и чтоб инфа из него читалась и забивалась в массив (память)
не знаю, как будет происходить чтение данных из массива, с последующим выполнением поределённых команд.
не знаю, как сделать менюшки.
не знаю как сделать ЛОГ-файл, в который будет всё отправляться.

Есть исходники с подробным описанием моделирования на Паскале, И есть готовые варианты моделей для процессора Н8000 фирмы Zilog, там используются Регистры Общего Назначения (РОНы).

Буду рад всем идеям и предложениям!
Спасибо, тем, кто дочитал до конца  smile 

Это сообщение отредактировал(а) Питерский - 28.1.2010, 10:42
PM MAIL Skype   Вверх
cardinal
Дата 28.1.2010, 02:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Инженер
****


Профиль
Группа: Экс. модератор
Сообщений: 6003
Регистрация: 26.3.2002
Где: Германия

Репутация: 15
Всего: 99



Для начала: пользуйся на форуме тегом "код" (см. над боксом, в котором сообщение пишешь)...


--------------------
Немецкая оппозиция потребовала упростить натурализацию иммигрантов
В моем блоге: Разные истории из жизни в Германии

"Познание бесконечности требует бесконечного времени, а потому работай не работай - все едино".  А. и Б. Стругацкие
PM   Вверх
Питерский
Дата 28.1.2010, 10:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 2
Регистрация: 27.1.2010

Репутация: нет
Всего: нет



Сделал, что дальше?
PM MAIL Skype   Вверх
Stalbker
Дата 31.1.2010, 02:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 18
Регистрация: 29.5.2009

Репутация: нет
Всего: нет



ап!
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Центр помощи"

ВНИМАНИЕ! Прежде чем создавать темы, или писать сообщения в данный раздел, ознакомьтесь, пожалуйста, с Правилами форума и конкретно этого раздела.
Несоблюдение правил может повлечь за собой самые строгие меры от закрытия/удаления темы до бана пользователя!


  • Название темы должно отражать её суть! (Не следует добавлять туда слова "помогите", "срочно" и т.п.)
  • При создании темы, первым делом в квадратных скобках укажите область, из которой исходит вопрос (язык, дисциплина, диплом). Пример: [C++].
  • В названии темы не нужно указывать происхождение задачи (например "школьная задача", "задача из учебника" и т.п.), не нужно указывать ее сложность ("простая задача", "легкий вопрос" и т.п.). Все это можно писать в тексте самой задачи.
  • Если Вы ошиблись при вводе названия темы, отправьте письмо любому из модераторов раздела (через личные сообщения или report).
  • Для подсветки кода пользуйтесь тегами [code][/code] (выделяйте код и нажимаете на кнопку "Код"). Не забывайте выбирать при этом соответствующий язык.
  • Помните: один топик - один вопрос!
  • В данном разделе запрещено поднимать темы, т.е. при отсутствии ответов на Ваш вопрос добавлять новые ответы к теме, тем самым поднимая тему на верх списка.
  • Если вы хотите, чтобы вашу проблему решили при помощи определенного алгоритма, то не забудьте описать его!
  • Если вопрос решён, то воспользуйтесь ссылкой "Пометить как решённый", которая находится под кнопками создания темы или специальным флажком при ответе.

Более подробно с правилами данного раздела Вы можете ознакомится в этой теме.

Если Вам помогли и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, Poseidon, Rodman

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Центр помощи | Следующая тема »


 




[ Время генерации скрипта: 0.0592 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.