Форум программистов, компьютерный форум CyberForum.ru

[VM] Реализация аппаратных прерываний - C++

Восстановить пароль Регистрация
 
Koncord
5 / 5 / 1
Регистрация: 27.09.2012
Сообщений: 65
03.08.2014, 15:07     [VM] Реализация аппаратных прерываний #1
Доброго времени суток, CyberForum. Уже как 2 месяца я пишу свой велосипед - эмулятор платформы Intel 80286. Реализовал некоторые команды, память, загрузку программ в память. В данный момент я ищу любую информацию по аппаратным прерываниям, например, деление на ноль, как ведет себя процессор, что происходит с регистрами и т.д. желательно информацию на русском языке, английский знаю не уверенно.
Кому интересно, вот список оппкодов:

Opcodes.hpp
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
#ifndef OPCODES_HPP
#define OPCODES_HPP
 
 
// Версия опкодов
#define VER_MAJOR 0
#define VER_MINOR 1
#define VER_FIX 0
 
 
 
namespace FLAGS
{
    enum
    {
        OF = 1,         // Переполнение
        DF = 2,         // Направление
        IF = 4,         // Прерывание
        TF = 8,         // Пошаговый режим
        SF = 16,        // Знак
        ZF = 32,        // Ноль
        AF = 64,        // Внешний перенос
        PF = 128,       // Контроль четности, паритета
        CF = 256        // Перенос
    };
}
 
namespace REG
{
    enum
    {
        AX = 0,         // Аккумулятор
        BX,             // Базовый регистр
        CX,             // Счетчик
        DX,             // Данные
 
        SI,             // Индекс источника
        DI,             // Индекс назначения
 
        SP,             // Стековый указатель
        BP,             // Базовый указатель
 
        CS,             // Регистр сегмента кода
        DS,             // Регистр сегмента данных
        SS,             // Ркгистр сегмента стека
        ES,             // Дополнительный сегментный регистр 
        IP,              // Командный указатель
 
        FLAGS = 65534  // Регистр флагов
    };
}
 
namespace MOD
{
    enum
    {
        OP = 0,         // Непосредственная адресация
        REG = 1,        // Регистровая адресация
        MEM = 2         // Косвенная адресация
    };
}
 
namespace COM
{
    enum
    {
    /*  КОМАНДА         //  АРГУМЕНТЫ   /   РЕГИСТРЫ    /   ФЛАГИ     /    КОММЕНТАРИЙ     */
        NOP = 0,        //              /               /             /
        ADD,            //  DEST, SRC   /               /             /
        JMP,            //  DEST        /               /             /
        HLT,            //              /               /             /
        JO,             //  DEST        /               /             /
        JNO,            //  DEST        /               /             /
        JE,             //  DEST        /               /             /
        JZ,             //  DEST        /               /             /
        JNE,            //  DEST        /               /             /
        JNZ,            //  DEST        /               /             /
        JS,             //  DEST        /               /             /
        JNS,            //  DEST        /               /             /
        SUB,            //  DEST, SRC   /               /             /
        MOV,            //  DEST, SRC   /               /             /
        MUL,            //  DEST        /   AX,DX       /             /
        DIV,            //  DEST        /   AX,DX       /             / Нет прерываний (INT 0h)
        NEG,            //  DEST        /               /             /
        INC,            //  DEST        /               /             /
        DEC,            //  DEST        /               /             /
        INT             //  DEST        /               /             / Не реализовано
    };
}
 
#endif  /* OPCODES_HPP */
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Avazart
03.08.2014, 19:38
  #2

Не по теме:

А зачем под каждое перечисление свое пространство?

DrOffset
6785 / 3996 / 917
Регистрация: 30.01.2014
Сообщений: 6,816
03.08.2014, 19:49     [VM] Реализация аппаратных прерываний #3

Не по теме:

Цитата Сообщение от Avazart Посмотреть сообщение
А зачем под каждое перечисление свое пространство?
Эмуляция enum classes.



Добавлено через 4 минуты
Koncord, ну попробуй тут посмотреть.
Но вообще это все фигня. Вот тот документ, который тебе нужен.
Avazart
03.08.2014, 19:49
  #4

Не по теме:

Зачем такое счастье нужно?

DrOffset
03.08.2014, 19:54
  #5

Не по теме:

Цитата Сообщение от Avazart Посмотреть сообщение
Зачем такое счастье нужно?
Вот.

Koncord
5 / 5 / 1
Регистрация: 27.09.2012
Сообщений: 65
03.08.2014, 20:37  [ТС]     [VM] Реализация аппаратных прерываний #6
Цитата Сообщение от DrOffset Посмотреть сообщение
Эмуляция enum classes.

Не по теме:

Не совсем, в enum classes возникла проблема строгой типизации, получался некрасивый код, например нельзя было бы так сделать:

C++
1
2
3
4
5
6
7
8
9
switch (cell.mod)
{
case MOD::REG:
    return *reg->GetRegister(cell.addr);
case MOD::MEM:
    return ram->GetWord(cell.addr);
case MOD::OP:
    return cell.addr;
}
А если просто использовать enum, то будет конфликт повторного декларирования

Avazart
03.08.2014, 20:53
  #7

Не по теме:

Повторно декларирование чего ? чет не вижу тут конфликтов.

Koncord
03.08.2014, 21:41  [ТС]
  #8

Не по теме:

Avazart, попробуйте скомпилировать код вида
enum E1
{
A=1,
B=2,
C=3
};
enum E2
{
A=2,
B=3,
C=4
};

Avazart
Нарушитель
6953 / 5191 / 256
Регистрация: 10.12.2010
Сообщений: 22,769
Записей в блоге: 17
03.08.2014, 21:51     [VM] Реализация аппаратных прерываний #9
Я вроде не заметил конфликтов имен в коде приведенном в первом посте.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
03.08.2014, 21:55     [VM] Реализация аппаратных прерываний
Еще ссылки по теме:

C++ Обработчик прерываний
C++ Реализация вектора
Обработка прерываний C++
Обработка прерываний с клавиатуры на С++ с применением библиотеки dos.h C++
C++ Литература для написания обработчика прерываний MS DOS

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
Koncord
03.08.2014, 21:55  [ТС]     [VM] Реализация аппаратных прерываний
  #10

Не по теме:

Видимо когда я писал этот хедер, я пребывал в астрале

Yandex
Объявления
03.08.2014, 21:55     [VM] Реализация аппаратных прерываний
Ответ Создать тему
Опции темы

Текущее время: 15:14. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru