Как я мог эмулировать 6502 JMP, ветвление и подпрограмму на C ++?

У меня есть программа, которая должна полностью эмулировать процессор MOS Technologies 6502. Я почти полностью реализовал весь набор инструкций в функциях C ++, включая математические, побитовые функции. Я даже могу подражать тактовой частоте. Единственные инструкции, которые я не реализовал успешно, - это JMP и все инструкции ветвления, а также инструкции подпрограмм. Это потому, что я не знаю, как сделать цикл, подобный goto, для C ++. Поскольку мой заголовок слишком велик, чтобы поместить его в блок кода, я связал его как файл «6502.h». Любая пошаговая помощь будет принята с благодарностью.

https://drive.google.com/file/d/0B1j1lbKWU98iQ1dyVGNCVzRzdDA/view?usp=sharing 6502.h


person Mason Watmough    schedule 15.05.2015    source источник
comment
Еще несколько советов: постарайтесь лучше понять, какие преобразования и т. Д. Компилятор сделает за вас, чтобы избежать избыточного кода. Ваша функция bit7 может просто быть return ((x & 128) == 128), поскольку == дает bool. Или верните (x & 128), так как это будет преобразовано в bool. Или верните (x & (1 ‹< 7)), поскольку магическое число не требует пояснений. Также попробуйте следовать принципу DRY (Don't Repeat Yourself), выделив общий код, например if (emulateClockSpeed) и т. Д. В любом случае, получайте удовольствие. Эмуляция - хороший способ отточить свои навыки.   -  person Nick Westgate    schedule 16.05.2015


Ответы (2)


Часть меня хочет закрыть это как не по теме - вопросы типа «закончить мой код за меня» и «почему этот код не работает» нежелательны для SO.

Однако сегодня пятница, я должен написать несколько отзывов персоналу, и это долгожданное отвлечение. Я не буду давать вам код, но дам вам пару советов:

  1. У вас нет переменной ПК (счетчика программ).
  2. BxC, BxS, JSR, JMP, RTI, RTS и BRK - все работают, внося изменения в ПК.

(кстати, вы можете посмотреть на описания опкодов PHP / PLP более внимательно)

person Eight-Bit Guru    schedule 15.05.2015
comment
Спасибо, я чувствовал, что мне почти сойдет с рук, просто сделав так, чтобы ветвление, подпрограмма и прерывание просто возвращали истинные или ложные значения, с которыми пользователь мог просто делать все, что угодно. Я просто подумал, что добавление счетчика программ будет немного сложным для моих навыков. Попробую реализовать ПК и поправлю по инструкции. инструкции PHP и PLP, которые я тоже исправлю. - person Mason Watmough; 15.05.2015
comment
Вы уже управляете SP с помощью кодов операций PHx / PLx; управление компьютером - это нечто подобное, только немного более сложное. - person Eight-Bit Guru; 16.05.2015

Псевдокод, чтобы дать представление;

// Emulation loop
opcode = memory[pc++]
switch(opcode)
case JMP
  target = memory[pc] | memory[pc+1]<<8
  pc = target
case JSR
  target = memory[pc] | (memory[pc+1]<<8)
  stack[sp--] = pc<<8
  stack[sp--] = pc&0xff
  pc = target
case RTS
  pc = stack[sp+1] | (stack[sp+2]<<8)
  sp += 2
...
person Sasq    schedule 20.05.2015