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

Эмулятор CHIP-8

10.08.2010, 06:34. Показов 14421. Ответов 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
Эксперт С++
5043 / 2622 / 241
Регистрация: 07.10.2009
Сообщений: 4,310
Записей в блоге: 1
10.08.2010, 06:43 2
За ночь мы немного переутомились, поэтому ZIP с исходниками приклеить с первой попытки не получилось.
Вот добавляю обещанный архивчик.

В принципе в этом архиве тот же самый код, что и в сообщении выше, за пожалуй совсем небольшими исключеняими вроде комментариев - все таки мы на большом расстоянии друг от друга находимся и полную синхронизацию оказалось обеспечить не так просто
Вложения
Тип файла: zip CHIP-8.ZIP (3.7 Кб, 93 просмотров)
0
1080 / 1007 / 106
Регистрация: 28.02.2010
Сообщений: 2,889
10.08.2010, 07:00 3
Эээээ... Скомпилировал. Запустил. А что должно появится?
0
Эксперт С++
5043 / 2622 / 241
Регистрация: 07.10.2009
Сообщений: 4,310
Записей в блоге: 1
10.08.2010, 07:07 4
Цитата Сообщение от Евгений М. Посмотреть сообщение
Эээээ... Скомпилировал. Запустил. А что должно появится?
Пока еще ничего, так как графическая не реализована. Соответственно ничего увидеть и нельзя.
К тому же опкоды сейчас (тот самый массив, что в main.cpp) подобраны ручным образом для проверки логики. В будущем эти опкоды должны содержать программу в бинарном виде.

Мы приносим свои извинения за недоработки, но собственно по этой причине и обратились с вопросами по поводу графической части и части, обеспечивающей взаимодействие с клавиатурой.

Конкретно интересует следующее:
- С помощью каких библиотек можно реализовать данные задачи.
- Какие библиотеки удобнее или даже проще для понимания (мы же только учимся).

Может быть кто-то уже имеет опыт работы с графикой и клавиатурой.

Просим всех оказать посильное содействие и всяческую помощь

Не по теме:

мой тысячный пост ^_^

0
1080 / 1007 / 106
Регистрация: 28.02.2010
Сообщений: 2,889
10.08.2010, 08:00 5
Лучший ответ Сообщение было отмечено как решение

Решение

Цитата Сообщение от fasked Посмотреть сообщение
Просим всех оказать посильное содействие и всяческую помощь
Ладно. Попробую.

На консоле будет сложно всю графику рисовать. Для этого Вам нужно переключится на графический режим и т.д.. Как это делать я не знаю. Поэтому будем создавать с помощью окон используя интерфейс WinAPI. На эту тему читаем это.

Если лень читать объясню по-своему. В моем шаблоне по созданию оконных приложений (см. вложения) я создал функции OnCreate, OnKeyDown, OnPaint.
OnCreate вызывает когда окно только-что была создана.
OnKeyDown вызывает когда нажали на клавишу в клавиатуре.
OnPaint вызывает когда окно рисуется. Эта функция будет все время вызываться пока окно не закроется. Эту функцию применяют, чтобы рисовать что-нибудь свое (например эллипс).

Если Вы будете рисовать все "точки из монитора" CHIP8 с помощью пикселей, тогда Ваша основаная функция будет SetPixel.
Если Вы будете рисовать все "точки из монитора" CHIP8 с помощью квадратиков, тогда Ваши основаные функции будут CreateRectRgn, CreateSolidBrush, FillRgn.
Про эти функции читаем в MSDN-e.

Для компиляции шаблона в командной строке с помощью GCC наберите
g++ win181.cpp -o win181.exe -mwindows
Для компиляции шаблона в командной строке с помощью MSVC наберите
cl user32.lib gdi32.lib win181.cpp

Теперь один из важных вопросов, который я должен был спросить до того как все это начал писать.
Вы на какой платформе (ОС) эмулятор будете писать?
Вложения
Тип файла: 7z win181.7z (1.4 Кб, 41 просмотров)
3
В астрале
Эксперт С++
8049 / 4806 / 655
Регистрация: 24.06.2010
Сообщений: 10,562
10.08.2010, 13:35  [ТС] 6
Евгений М., Под винду заточено. Хотя можно сделать и кроссплатформенным с помощью Qt
0
Мат в 32 хода
237 / 172 / 18
Регистрация: 10.09.2009
Сообщений: 1,096
10.08.2010, 13:46 7
Lavroff, а ты знаешь Qt?
0
В астрале
Эксперт С++
8049 / 4806 / 655
Регистрация: 24.06.2010
Сообщений: 10,562
10.08.2010, 13:54  [ТС] 8
nikkka, Не сильно) Но разобраться можно.
0
Эксперт С++
5043 / 2622 / 241
Регистрация: 07.10.2009
Сообщений: 4,310
Записей в блоге: 1
10.08.2010, 19:24 9
Евгений М., Спасибо. Однако Ваш архив почему-то упорно отказывается у меня распаковываться.

Поправил работу с видеопамятью. Ниже прилагаю демонстрационную версию под Windows (на Winapi) в виде приложения. На экран последовательно выводится несколько цифр.

Вы на какой платформе (ОС) эмулятор будете писать?
Вообще не очень хотелось бы писать на Winapi только под Windows. Наверное, действительно будем делать на Qt для обеспечения кроссплатформенности.
Вложения
Тип файла: zip CHIP8_VIDEO_TEST.zip (5.4 Кб, 60 просмотров)
0
1080 / 1007 / 106
Регистрация: 28.02.2010
Сообщений: 2,889
10.08.2010, 20:45 10
Цитата Сообщение от fasked Посмотреть сообщение
оправил работу с видеопамятью.
Это уже небольшой прогресс. Только вот хотелось бы кое-что узнать.
В CHIP8 как экран рисуется? Отдельным потоком проверяется видеопамять или после вызова опкода в определенной части экрана моментально ставится точка?

Цитата Сообщение от fasked Посмотреть сообщение
Наверное, действительно будем делать на Qt для обеспечения кроссплатформенности.
Вижу проект довольно серьезный, а не для "просто поучится". Каким он будет? Open Source или просто Freeware?
0
Эксперт С++
5043 / 2622 / 241
Регистрация: 07.10.2009
Сообщений: 4,310
Записей в блоге: 1
10.08.2010, 21:47 11
Цитата Сообщение от Евгений М. Посмотреть сообщение
Вижу проект довольно серьезный, а не для "просто поучится". Каким он будет? Open Source или просто Freeware?
Вообще не думали по этому поводу, скорее всего открытый код. Мы решили заняться этим ради повышения собственного навыка. А платформу CHIP-8 взяли именно из-за простоты, чтобы посмотреть и ощутить на собственном опыте, как вообще это делается.
Цитата Сообщение от Евгений М. Посмотреть сообщение
В CHIP8 как экран рисуется? Отдельным потоком проверяется видеопамять или после вызова опкода в определенной части экрана моментально ставится точка?
Видео-память представлена отдельным байтовым массивом. Запись в видеопамять производится по нахождению определенной комбинацией опкодов, в которых передаются координаты и размер спрайта.

Сама же отрисовка экрана производится в отдельном потоке, пока что мы выделили для этого специальную функцию, которая вызывается каждый цикл чтения опкода. То есть на данный момент экран обновляется один раз за каждый такт работы эмулятора. Конечно так часто отрисовывать экран совершенно не обязательно. Этот момент в будущем легко исправить.

В общем, да - отдельным потоком.
Цитата Сообщение от Евгений М. Посмотреть сообщение
Это уже небольшой прогресс.
В принципе я ничего не менял, но для наглядности ощутимо
0
В астрале
Эксперт С++
8049 / 4806 / 655
Регистрация: 24.06.2010
Сообщений: 10,562
11.08.2010, 06:51  [ТС] 12
Начали делать интерфейс в Qt - вошли в ступор. Проблема с объединением реализации логики и интерфейса программы. Непонятно как отрисовывать спрайты на виджете и собственно откуда вызывать функцию инициализации памяти и запуска эмулятора. Переменные принимают немыслимые значения, с клавиатурой тоже ничерта не ясно. И вообще ад. Как это возможно реализовать, всмысле совместить графику Qt-шную с написанным кроме графики и клавы эмулятором?
0
1080 / 1007 / 106
Регистрация: 28.02.2010
Сообщений: 2,889
11.08.2010, 07:49 13
Цитата Сообщение от Lavroff Посмотреть сообщение
собственно откуда вызывать функцию инициализации памяти и запуска эмулятора.
Прямо в main().
Насчет вывода (монитора). В этом же main() создай новый поток (читайте про класс QThread), который будет отвечать за монитор (а может бы и за нажатые клавиши).

Цитата Сообщение от Lavroff Посмотреть сообщение
И вообще ад.
Эй, хорош. Никто не говорил в жизни будет все идеально.

Не по теме:

Че-то мне кажется Вы либо плохо либо вообще спали, судя по сегодняшней проблемы со столицей. Если у Вас дома нет кондиционера, попробуйте найти родственников у кого есть. Все-таки спать тоже нужно. Иначе бредить будете (проверено).

2
В астрале
Эксперт С++
8049 / 4806 / 655
Регистрация: 24.06.2010
Сообщений: 10,562
11.08.2010, 07:51  [ТС] 14
Евгений М., Совмещать проект и графику как Qt проект, или мутить какую-то вставку в IDE? Или это вообще не важно?
Просто сейчас мы с fasked-ом пытались вызывать главную функцию (инциализацию и запуск) по нажатию кнопки Run в меню.
Происходили определенные проблемы. Например считывание бинарного файла, который когда проект был только С/C++ абсолютно нормально читался. Сейчас ftell выдает значение около 1000, ранее выдавал около 50. Файл не менялся. Почему такое может происходить? Пробовали и через счетчик. До конца файла. В конце цикла - i было равно 500+. Хотя такого впринципе не может быть, ибо файл размера меньшего. Чтение через fread соответственно.

Не по теме:

А про ад это так. Для красоты

0
1080 / 1007 / 106
Регистрация: 28.02.2010
Сообщений: 2,889
11.08.2010, 08:01 15
Ну... Вообще можно обойтись с IDE на котором Вы пишите все время (т.е. не только проги на Qt). Т.е. прям в main.cpp вставить #include <QApplication> и т.д.. Компилировать через командную строку. На мой взгляд это намного удобнее.
1
В астрале
Эксперт С++
8049 / 4806 / 655
Регистрация: 24.06.2010
Сообщений: 10,562
11.08.2010, 08:04  [ТС] 16
Евгений М., Библиотеки у Qt открытые?
Хм. Про значения переменных был не прав. Как было так и осталось. Извиняюсь
0
1080 / 1007 / 106
Регистрация: 28.02.2010
Сообщений: 2,889
11.08.2010, 08:07 17
Если Вы имеете ввиду есть ли исходники то вроде да.
0
В астрале
Эксперт С++
8049 / 4806 / 655
Регистрация: 24.06.2010
Сообщений: 10,562
11.08.2010, 08:09  [ТС] 18
Евгений М., Через сам Qt как я понимаю тоже можно сделать? Там тоже вызывать в самом main или все таки по выбору соотвествующей опции в менюшке, что по идее более логично?
0
1080 / 1007 / 106
Регистрация: 28.02.2010
Сообщений: 2,889
11.08.2010, 08:16 19
Цитата Сообщение от Lavroff Посмотреть сообщение
Через сам Qt как я понимаю тоже можно сделать?
Не понял вопрос.

Цитата Сообщение от Lavroff Посмотреть сообщение
Там тоже вызывать в самом main или все таки по выбору соотвествующей опции в менюшке, что по идее более логично?
Тоже не понял.

Если Вы имеете ввиду взять исходники Qt и добавить туда свой код эмулятора, то это не логично, т.к. Qt - это библиотека и должна присоединятся с нашему проекту через #include.

PS: На Qt я не профи. SDK и книгу скачал вчера, сегодня с утра начал все компилировать.
1
В астрале
Эксперт С++
8049 / 4806 / 655
Регистрация: 24.06.2010
Сообщений: 10,562
11.08.2010, 08:18  [ТС] 20
Евгений М., Спасибо. Вечером будем смотреть.
0
11.08.2010, 08:18
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
11.08.2010, 08:18
Помогаю со студенческими работами здесь

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

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

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

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


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

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