Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.97/70: Рейтинг темы: голосов - 70, средняя оценка - 4.97
В астрале
Эксперт С++
8049 / 4806 / 655
Регистрация: 24.06.2010
Сообщений: 10,562
1

Эмулятор CHIP-8

10.08.2010, 06:34. Показов 14423. Ответов 90
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Мы с fasked написали простенький эмулятор для платформы CHIP-8.
CHIP-8
Остались вопросы по графике и клавиатуре. Если кто знает как реализовать - помогите, пожалуйста.
Так же приглашаем для участия в доработке этого проекта, а так же следующих проектах всех, кто желает учиться и трудиться.
Кому интересна работа эмулятора все вопросы к fasked)
Полный проект в прикрепленном архиве в сообщении ниже

CHIP8
types.h
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
/**************************************************************
* TYPES.H                                                     *
* Emulator CHIP-8                                             *
*                                                             *
* basic typedef and constants                                 *
*                                                             *
* LAST UPD: 09/08/2010                                        *
*                                                             *
* by Lavroff and fasked (c)                                   *
**************************************************************/
 
#ifndef HEADER_TYPES_H
#define HEADER_TYPES_H
 
typedef unsigned char  BYTE;
typedef unsigned short WORD;
 
#define DATA_REG_SIZE   16
#define ADDR_REG_SIZE   4096
#define STACK_SIZE      16
 
#define SCREEN_VER_SIZE 32
#define SCREEN_HOR_SIZE 64 
 
#define VIDEO_MEM_SIZE (SCREEN_HOR_SIZE * SCREEN_VER_SIZE)
 
#endif /* HEADER_TYPES_H */


chip-8.h
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
92
93
94
95
96
/**************************************************************
* CHIP8.H                                                     *
* Emulator CHIP-8                                             *
*                                                             *
* basic declarations                                          *
*                                                             *
* LAST UPD: 09/08/2010                                        *
*                                                             *
* by Lavroff and fasked (c)                                   *
**************************************************************/
 
#ifndef _HEADER_CHIP8_H_
#define _HEADER_CHIP8_H_
 
#include "types.h"
 
//Declaration of global variables and arrays
static BYTE dataRegisters[DATA_REG_SIZE];
static BYTE addrRegisters[ADDR_REG_SIZE];
 
static WORD stackMemory[STACK_SIZE];
static BYTE videoMemory[VIDEO_MEM_SIZE];
 
static BYTE soundTimer;
static BYTE delayTimer;
 
static WORD iRegister;
 
static BYTE stackCounter;
static WORD offsetMemory;
 
const static BYTE font[80] = { 
   0xF0, 0x90, 0x90, 0x90, 0xF0, // 0
   0x20, 0x60, 0x20, 0x20, 0x70, // 1
   0xF0, 0x10, 0xF0, 0x80, 0xF0, // 2
   0xF0, 0x10, 0xF0, 0x10, 0xF0, // 3
   0x90, 0x90, 0xF0, 0x10, 0x10, // 4
   0xF0, 0x80, 0xF0, 0x10, 0xF0, // 5
   0xF0, 0x80, 0xF0, 0x90, 0xF0, // 6
   0xF0, 0x10, 0x20, 0x40, 0x40, // 7
   0xF0, 0x90, 0xF0, 0x90, 0xF0, // 8
   0xF0, 0x90, 0xF0, 0x10, 0xF0, // 9
   0xF0, 0x90, 0xF0, 0x90, 0x90, // A
   0xE0, 0x90, 0xE0, 0x90, 0xE0, // B
   0xF0, 0x80, 0x80, 0x80, 0xF0, // C
   0xE0, 0x90, 0x90, 0x90, 0xE0, // D
   0xF0, 0x80, 0xF0, 0x80, 0xF0, // E
   0xF0, 0x80, 0xF0, 0x80, 0x80  // F
};
 
//Declaration of macro
#define START_OFFSET 200
 
#define DATA_REG_VX(n)\
   (dataRegisters[(0x0F00 & n) >> 8])
 
#define DATA_REG_VY(n)\
   (dataRegisters[(0x00F0 & n) >> 4])
 
#define DATA_REG_VF\
   (dataRegisters[0xF])
 
#define DATA_REG_V0\
   (dataRegisters[0x0])
 
//Declaration of functions
void InitialiseEmulator();
void EmulatorRun();
 
void LoadOpcodes(WORD * opcodes);
 
WORD GetOpcode();
void ExecuteOpcode (WORD opcode);
 
void ExecuteOpcode0(WORD opcode);
void ExecuteOpcode1(WORD opcode);
void ExecuteOpcode2(WORD opcode);
void ExecuteOpcode3(WORD opcode);
void ExecuteOpcode4(WORD opcode);
void ExecuteOpcode5(WORD opcode);
void ExecuteOpcode6(WORD opcode);
void ExecuteOpcode7(WORD opcode);
void ExecuteOpcode8(WORD opcode);
void ExecuteOpcode9(WORD opcode);
void ExecuteOpcodeA(WORD opcode);
void ExecuteOpcodeB(WORD opcode);
void ExecuteOpcodeC(WORD opcode);
void ExecuteOpcodeD(WORD opcode);
void ExecuteOpcodeE(WORD opcode);
void ExecuteOpcodeF(WORD opcode);
 
void RedrawScreen();
void Delay();
void SoundPlay();
 
#endif /* HEADER_CHIP8_H */


chip8.cpp
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
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
#include <iostream>
#include <windows.h>
#include "chip8.h"
 
void RedrawScreen()
{
   system("cls");
   for(int i = 0; i < SCREEN_HOR_SIZE; ++i)
   {
      for(int j = 0; j < SCREEN_VER_SIZE; ++j)
      {
         if(videoMemory[i * SCREEN_HOR_SIZE + j])
            printf("*");
         else
            printf(" ");
      }
 
      printf("\n");
   }
}
 
void Delay()
{
   if(delayTimer)
   {
      Sleep(delayTimer*1000);
   }
}
 
void SoundPlay()
{
   if(soundTimer)
   {
      for(int i=0;i<soundTimer;++i)
         std::cout<<'\a'<<std::endl;
   }
}
 
void InitialiseEmulator()
{
   stackCounter = 0;
   soundTimer = 0;
   delayTimer = 0;
 
   offsetMemory = START_OFFSET;
   iRegister = START_OFFSET;
 
   memset(dataRegisters, 0, DATA_REG_SIZE * sizeof(BYTE));
   memset(addrRegisters, 0, ADDR_REG_SIZE * sizeof(BYTE));
   memset(videoMemory, 0, VIDEO_MEM_SIZE * sizeof(BYTE));
   memset(stackMemory, 0, STACK_SIZE * sizeof(WORD));
   memcpy(addrRegisters, font, 80);
}
 
void LoadOpcodes(WORD * opcodes)
{
   memcpy(addrRegisters + offsetMemory, opcodes, ADDR_REG_SIZE * sizeof(BYTE));
}
 
WORD GetOpcode()
{
   return *(WORD*)(addrRegisters + offsetMemory); // TODO исправить на более правильный вариант
}
 
void EmulatorRun()
{
   WORD opcode = 0;
   for(;;)
   {
      opcode = GetOpcode();
//#ifdef _DEBUG
//      printf("%s: %#0.4x | %s: %#0.4x\n", "OFFSET", offsetMemory, "OPCODE", opcode);
//#endif
 
      if(opcode == 0)
         break;
 
      ExecuteOpcode(opcode);
 
      offsetMemory += 2;
 
      SoundPlay();
      Delay();
      //RedrawScreen();
   }
}
 
void ExecuteOpcode0(WORD opcode)
{
   if((opcode & 0x00FF) == 0xE0)
      memset(videoMemory, 0, VIDEO_MEM_SIZE * sizeof(BYTE)); // 0x00E0: Clear the Screen
   
   else if((opcode & 0x00FF) == 0xEE)
   {
      --stackCounter;
      offsetMemory = stackMemory[stackCounter];
   }
 
   else if((opcode & 0xF000) == 0)
   {
      //TODO 0NNN-Opcode
   }
}
 
void ExecuteOpcode1(WORD opcode)
{
   offsetMemory = opcode & 0x0FFF;
}
 
void ExecuteOpcode2(WORD opcode)
{
   if(stackCounter < 16)
   {
      stackMemory[stackCounter] = offsetMemory;
      ++stackCounter;
   }
 
   offsetMemory = opcode & 0x0FFF;
}
 
void ExecuteOpcode3(WORD opcode)
{
   if(DATA_REG_VX(opcode) == (opcode & 0x00FF))
      offsetMemory += 2;
}
 
void ExecuteOpcode4(WORD opcode)
{
   if(DATA_REG_VX(opcode) != (opcode & 0x00FF))
      offsetMemory += 2;
}
 
void ExecuteOpcode5(WORD opcode)
{
   if(DATA_REG_VX(opcode) == DATA_REG_VY(opcode))
      offsetMemory += 2;
}
 
void ExecuteOpcode6(WORD opcode)
{
   DATA_REG_VX(opcode) = 0x00FF & opcode;
}
 
void ExecuteOpcode7(WORD opcode)
{
   DATA_REG_VX(opcode) += 0x00FF & opcode;
}
 
void ExecuteOpcode8(WORD opcode)
{
   if((opcode & 0xF) == 0x0)
      DATA_REG_VX(opcode) = DATA_REG_VY(opcode);
   
   else if((opcode & 0xF) == 0x1)
      DATA_REG_VX(opcode) |= DATA_REG_VY(opcode);
 
   else if((opcode & 0xF) == 0x2)
      DATA_REG_VX(opcode) &= DATA_REG_VY(opcode);
 
   else if((opcode & 0xF) == 0x3)
      DATA_REG_VX(opcode) ^= DATA_REG_VY(opcode);
 
   else if((opcode & 0xF) == 0x4)
   {
      WORD t = DATA_REG_VX(opcode) + DATA_REG_VY(opcode);
      DATA_REG_VX(opcode) = (BYTE)t;
      DATA_REG_VF = (BYTE)(t & 0x100); 
   }
 
   else if((opcode & 0xF) == 0x5)
   {
      WORD t = DATA_REG_VX(opcode) - DATA_REG_VY(opcode);
      DATA_REG_VX(opcode) = (BYTE)t;
      DATA_REG_VF = (BYTE)((t & 0x100) >> 8);
   }
 
   else if((opcode & 0xF) == 0x6)
   {
      DATA_REG_VF = DATA_REG_VX(opcode) & 1;
      DATA_REG_VX(opcode) >>= 1;
   }
 
   else if((opcode & 0xF) == 0x7)
   {
      WORD t= DATA_REG_VY(opcode)- DATA_REG_VX(opcode);
      DATA_REG_VX(opcode) = (BYTE)t;
      DATA_REG_VF = (BYTE)((t & 0x100) >> 8);
   }
 
   else if((opcode & 0xF) == 0xE)
   {
      DATA_REG_VF = DATA_REG_VX(opcode) & 0x80;
      DATA_REG_VX(opcode) <<= 1;
   }
}
 
void ExecuteOpcode9(WORD opcode)
{
   if(DATA_REG_VX(opcode) != DATA_REG_VY(opcode))
      offsetMemory+=2;  
}
 
void ExecuteOpcodeA(WORD opcode)
{
   iRegister = opcode & 0x0FFF;
}
 
void ExecuteOpcodeB(WORD opcode)
{
   offsetMemory = (opcode & 0x0FFF) + dataRegisters[0];
}
 
void ExecuteOpcodeC(WORD opcode)
{
   DATA_REG_VX(opcode) = (BYTE)(rand()) & (opcode & 0x00FF);
}
 
void ExecuteOpcodeD(WORD opcode)
{
   // TODO D-opcode
   WORD x = DATA_REG_VX(opcode);
   WORD y = DATA_REG_VY(opcode);
   WORD h = opcode & 0x000F;
 
   for(int i = 0; i < h; ++i)
   {
      WORD data = addrRegisters[i + iRegister];
      
      for(int j = 0; j < 8; ++j)
      {
         if((data & (0x80 >> i)) != 0)
         {
            if(videoMemory[j + x + (( y + i ) * SCREEN_HOR_SIZE)] == 1)
               DATA_REG_VF = 1;
            else
               DATA_REG_VF=0;
 
            videoMemory[j + x + (( y + i ) * SCREEN_HOR_SIZE)] ^= 1;
         }
      }
   }
}
 
void ExecuteOpcodeE(WORD opcode)
{
  if((opcode & 0x00FF) == 0x9E)
  {
     // TODO EX9E-Opcode. Keyboard
  }
  else if((opcode & 0x00FF) == 0xA1) 
  {
     // TODO EXA1-Opcode. Keyboard
  }
}
 
void ExecuteOpcodeF(WORD opcode)
{
  if((opcode & 0x000F) == 0x7)
     DATA_REG_VX(opcode) = delayTimer;
 
  else if((opcode & 0x000F) == 0xA)
  {
     //TODO FX0A opcode
  }
  
  else if((opcode & 0x00FF) == 0x15)
     delayTimer = DATA_REG_VX(opcode);
  
  else if((opcode & 0x00FF) == 0x18)
     soundTimer = DATA_REG_VX(opcode);
  
  else if((opcode & 0x00FF) == 0x1E)
     iRegister += DATA_REG_VX(opcode);
  
  else if((opcode & 0x00FF) == 0x29)
  {
     iRegister=DATA_REG_VX(opcode);
  }
  
  else if((opcode & 0x00FF) == 0x33)
  {
     addrRegisters[iRegister] = DATA_REG_VX(opcode) / 100;
     addrRegisters[iRegister + 1] = (DATA_REG_VX(opcode) % 100) / 10;
     addrRegisters[iRegister + 2] = DATA_REG_VX(opcode) % 10;
  }
  
  else if((opcode & 0x00FF) == 0x55)
  {
     for(int i = 0; i < ((opcode & 0x0F00) >> 8); ++i)
        addrRegisters[i + iRegister] = dataRegisters[i];  
  }
  
  else if((opcode & 0x00FF) == 0x65)
  {
     for(int i = 0; i < ((opcode & 0x0F00) >> 8); ++i)
        dataRegisters[i] = addrRegisters[i + iRegister];
  }
} 
 
void ExecuteOpcode(WORD opcode)
{
  WORD opcodeGroup = opcode >> 12; // выделить старшие 4 бита
 
  switch(opcodeGroup)
  {
  case 0x0:
     ExecuteOpcode0(opcode);
     break;
  case 0x1:
     ExecuteOpcode1(opcode);
     break;
  case 0x2:
     ExecuteOpcode2(opcode);
     break;
  case 0x3:
     ExecuteOpcode3(opcode);
     break;
  case 0x4:
     ExecuteOpcode4(opcode);
     break;
  case 0x5:
     ExecuteOpcode5(opcode);
     break;
  case 0x6:
     ExecuteOpcode6(opcode);
     break;
  case 0x7:
     ExecuteOpcode7(opcode);
     break;
  case 0x8:
     ExecuteOpcode8(opcode);
     break;
  case 0x9:
     ExecuteOpcode9(opcode);
     break;
  case 0xA:
     ExecuteOpcodeA(opcode);
     break;
  case 0xB:
     ExecuteOpcodeB(opcode);
     break;
  case 0xC:
     ExecuteOpcodeC(opcode);
     break;
  case 0xD:
     ExecuteOpcodeD(opcode);
     break;
  case 0xE:
     ExecuteOpcodeE(opcode);
     break;
  case 0xF:
     ExecuteOpcodeF(opcode);
     break;
  }
}


main.cpp
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
#include "chip8.h"
 
int main()
{
   // массив опкодов
   // в дальнейшем должны читаться из файлов 
   // специально откомпилированнынх под CHIP-8
   WORD opcodes[ADDR_REG_SIZE] = { 0x6000, 0x6100, 0xA222, 0xC201, 
                                   0x3201, 0xA2E1, 0xD014, 0x7004, 
                                   0x3040, 0x1204, 0x6000, 0x7104, 
                                   0x3120, 0x1204, 0x121C, 0x8040, 
                                   0x2010, 0x2040, 0x8010, 0x0000
   };  
 
   // Инициализация ЦПУ эмулятора
   // очистка памяти, сброс счетчиков и таймеров
   InitialiseEmulator();
 
   // Загрузка опкодов в память эмулятора
   LoadOpcodes(opcodes);
 
   // Запуск эмулятора
   EmulatorRun();
 
   return 0;
}
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
10.08.2010, 06:34
Ответы с готовыми решениями:

Эмулятор. На С, С++
Здравствуйте уважаемые читатели форума! У меня такой вопрос: (СРАЗУ ПРЕДУПРЕЖДАЮ Я НЕ ОЧЕНЬ ХОРОШО...

Эмулятор телефона. С++
Эмулятор работы телефона. Телефон живёт своей жизнью может садиться батарея, а когда она...

Эмулятор мышки
Здравствуйте все. Хотелось бы узнать, как можно на компьютере1 управлять курсором с помощью...

Эмулятор SetTimer
Ребята, подскажите, как написать функцию на подобие SetTimer. Дело в том, что используя...

90
1080 / 1007 / 106
Регистрация: 28.02.2010
Сообщений: 2,889
25.08.2010, 19:46 81
Author24 — интернет-сервис помощи студентам
А у меня UFO.С8 играется
Только вот в коде нужно кое-где поправить.
Обработчик EXA1 опкода не нашел. Нашел для EX1A (такого не должно быть) на 304 строке cpu.cpp.
Еще такой вопрос: в эмуляторе после нажатия клавиши она остается нажатой до нажатия другой клавиши или нет?

Добавлено через 8 минут
Предложение: может быть папку src перенесем в trunc? Все равно все изменения идут по ривизиям. А отдельные стабильные версии будем выкладывать в tags т.к. эта папка как раз для этого предназначена.
И еще вопрос:
Это зачем, если никогда она не появится:
C++
1
2
3
        std::cerr << "Unknown Opcode: " << opc << "\n"
                  << "Memory Offset: " << programCounter
                  << std::endl;
Добавлено через 3 минуты
Alex Sabaka, попробуй скомпилировать диссассемблированый файл с помощью CHIPPER.

Добавлено через 36 минут
Добавил звук в эмулятор. Для этого исправил функцию Run() (cpu.cpp) и почти весь файл processor.cpp. См. вложение.
И еще вопрос: чем отличаются cpu.cpp от processor.cpp? Дело в том, что лексическое значение названий файлов одно и тоже.
Вложения
Тип файла: zip src.zip (6.0 Кб, 21 просмотров)
1
Эксперт С++
5043 / 2622 / 241
Регистрация: 07.10.2009
Сообщений: 4,310
Записей в блоге: 1
27.08.2010, 11:21 82
Цитата Сообщение от Евгений М. Посмотреть сообщение
Обработчик EXA1 опкода не нашел. Нашел для EX1A (такого не должно быть) на 304 строке cpu.cpp.
Поправил
Цитата Сообщение от Евгений М. Посмотреть сообщение
Предложение: может быть папку src перенесем в trunc? Все равно все изменения идут по ривизиям. А отдельные стабильные версии будем выкладывать в tags т.к. эта папка как раз для этого предназначена.
Поподробнее, пожалуйста. Я не совсем понял структуру. Что, куда и сколько
Цитата Сообщение от Евгений М. Посмотреть сообщение
Это зачем, если никогда она не появится:
Ну, например, если файл программы неправильный.
Цитата Сообщение от Евгений М. Посмотреть сообщение
И еще вопрос: чем отличаются cpu.cpp от processor.cpp? Дело в том, что лексическое значение названий файлов одно и тоже.
Да, название не очень удачное. Правильнее было бы, наверное, написать что-то вроде chip8api вместо cpu.
То есть в cpu находятся функции для доступа и управления глобальными переменными. А processor собственно сам поток.
Еще такой вопрос: в эмуляторе после нажатия клавиши она остается нажатой до нажатия другой клавиши или нет?
Да, до нажатия другой клавиши.
0
1080 / 1007 / 106
Регистрация: 28.02.2010
Сообщений: 2,889
27.08.2010, 11:48 83
Цитата Сообщение от fasked Посмотреть сообщение
Поподробнее, пожалуйста. Я не совсем понял структуру. Что, куда и сколько
Вот когда у эмулятора появится свое уникальное название, сам эмулятор будет стабилен т.е. уже можно с обычными пользователями делится, создадим папку tags\1.0 туда положим исходники этой версии. Пройдет месяц, выявятся какие-нибудь недочеты, добавили новые функции, ускорится работа и т.д., это будет уже в версии 1.1. Создадим новую папку tags\1.1 туда положим исходники. Это удобнее в отличии от просто деления с помощью ревизий.

Цитата Сообщение от fasked Посмотреть сообщение
Ну, например, если файл программы неправильный.
Я это понял. Только вот я не понял, как узнать какие неизвестные опкоды попались (тогда быстрее узнали бы про EXA1)?

Цитата Сообщение от fasked Посмотреть сообщение
chip8api вместо cpu
Я не думаю, что это будет логично. api - на мой взгляд это взаимодейтсвие между приложениями, а не блоками одного приложения. А вообще класс Proceesor использует функции из CPU. Лучше просто поменять имя у этого класса (например в CPU) и засунуть его в cpu.cpp.
0
Эксперт С++
5043 / 2622 / 241
Регистрация: 07.10.2009
Сообщений: 4,310
Записей в блоге: 1
27.08.2010, 12:03 84
Цитата Сообщение от Евгений М. Посмотреть сообщение
Вот когда у эмулятора появится свое уникальное название, сам эмулятор будет стабилен т.е. уже можно с обычными пользователями делится, создадим папку tags\1.0 туда положим исходники этой версии. Пройдет месяц, выявятся какие-нибудь недочеты, добавили новые функции, ускорится работа и т.д., это будет уже в версии 1.1. Создадим новую папку tags\1.1 туда положим исходники. Это удобнее в отличии от просто деления с помощью ревизий.
Надо сначала добраться до стабильной версии
Цитата Сообщение от Евгений М. Посмотреть сообщение
Я это понял. Только вот я не понял, как узнать какие неизвестные опкоды попались
Перенаправить поток cerr в файл например. Я просто опять же этим не занимался - виноват.
Цитата Сообщение от Евгений М. Посмотреть сообщение
Я не думаю, что это будет логично. api - на мой взгляд это взаимодейтсвие между приложениями, а не блоками одного приложения. А вообще класс Proceesor использует функции из CPU. Лучше просто поменять имя у этого класса (например в CPU) и засунуть его в cpu.cpp.
Не соглашусь. На мой взгляд, все, что лежит в файлах подключенных в chip8.h - это некоторая абстракция эмулятора. А тот класс из файла processor - это уже программная адаптация этой абстракции. То есть API - это набор функций с жесктим контрактом, который позволяет обеспечить взаимодействие независимо от того, как реализована сама абстракция. Грубо говоря, это прослойка, медиатор. Асбтракцией может быть, как аппаратный, так и программный модуль - но взаимодействие с верхней частью будет обеспечиватьяс с помощью одного API. Пример, конечно, грубый.
С помощью этого же API кстати должен работать и отладчик. И клавиатура. Как и processor (скорее уж у этого класса имя неудачное И все будущие прибамбасы.
0
1080 / 1007 / 106
Регистрация: 28.02.2010
Сообщений: 2,889
27.08.2010, 12:06 85
Ладно. Убедили.
0
0 / 0 / 3
Регистрация: 13.04.2011
Сообщений: 91
Записей в блоге: 1
01.09.2011, 16:50 86
а можно скинуть исходники который на данный момент уже есть? очень заинтересовало..

Добавлено через 12 минут
и такой вопросик еще: а на DevC++ он компилится? а то ошибку выбивает у меня по исходникам которые в шапке
0
1080 / 1007 / 106
Регистрация: 28.02.2010
Сообщений: 2,889
01.09.2011, 16:56 87
Исходники здесь: http://svn2.xp-dev.com/svn/chip8/
Пока недоступен. Ждите fasked или ForEveR. Может быть у них остались.
Для компиляции установите Qt и научитесь как компилировать с Qt.
0
Эксперт С++
5043 / 2622 / 241
Регистрация: 07.10.2009
Сообщений: 4,310
Записей в блоге: 1
01.09.2011, 20:46 88
Цитата Сообщение от Евгений М. Посмотреть сообщение
Пока недоступен
Странно, у меня все открывается
Вложения
Тип файла: zip chip8-v0-0-4-src.zip (12.1 Кб, 24 просмотров)
0
Эксперт С++
2381 / 1665 / 279
Регистрация: 29.05.2011
Сообщений: 3,399
01.09.2011, 21:01 89
Цитата Сообщение от fasked Посмотреть сообщение
Странно, у меня все открывается
FF6.0:
Ошибка загрузки таблицы стилей: Произошла неизвестная ошибка (805303f4)
http://svn2.xp-dev.com/svnindex.xsl
0
Эксперт С++
5043 / 2622 / 241
Регистрация: 07.10.2009
Сообщений: 4,310
Записей в блоге: 1
01.09.2011, 21:03 90
Chromium
Эмулятор CHIP-8
0
1080 / 1007 / 106
Регистрация: 28.02.2010
Сообщений: 2,889
02.09.2011, 10:00 91
Цитата Сообщение от grizlik78 Посмотреть сообщение
Ошибка загрузки таблицы стилей: Произошла неизвестная ошибка (805303f4)
Я обратился к службе поддержки. Они сказали что все ссылки теперь начинаются по другому.
http://xp-dev.com/svn/chip8/
2
02.09.2011, 10:00
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
02.09.2011, 10:00
Помогаю со студенческими работами здесь

Эмулятор клавиатуры
Привет. Нужно сделать програму которая при нажатии глобальных клавиш писала какойта текст. Как...

Эмулятор трёхадресной машины.
В общем, имеется задача &quot;Эмулятор трёхадресной машины&quot;. Каждая инструкция имеет следующий...

Эмулятор Вебки под Seven
Всем привет. Я проект пишу на С++, свой первый, более мене серьезный. Мне нужен эмулятор Веб...

Реализовать эмулятор командной строки
Реализовать эмулятор командной строки. Программа должна выполнять следующие функции: Создание...


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

Или воспользуйтесь поиском по форуму:
91
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru