Сегодня произвёл серьёзный рефакторинг код, выделив все повторяющиеся части всех логических и арифметических операций в отдельные функции в ущерб и так никакой производительности скрипта. Несколько раз самым внимательным образом сравнил собственную эмуляцию с эталонным эмулятором. Но ALUOP NN, как и прежде, выдаёт ошибку. Даже не знаю в какую сторону копать. Наверное просто глаз замылился и я что-то упускаю.
Ну вот, например, так сейчас у меня выглядит эмуляция команды ORI на Python:
А вот для сравнения как эмуляция той же команды выглядит в эталонном эмуляторе на С:Код:def or_a(reg): global reg_a, flag_p, flag_h, flag_c, flag_z, flag_s reg_a |= reg flag_s = bool(reg_a & 0b10000000) flag_z = not reg_a flag_h = False flag_p = parity[reg_a] flag_c = False fflag_n(False) fflag_3(bool(reg_a & 0b00001000)) fflag_5(bool(reg_a & 0b00100000)) return def b11110110(): # OR A,d global pc, ticks or_a(read_mem(inc_pc())) pc = inc_pc2() ticks += 7 return
Как видите, на выходе получилось практически идентично. И всё равно тест проваливается.Код:#define ORA(val) \ { \ A |= (val); \ S_FLAG = ((A & 0x80) != 0); \ Z_FLAG = (A == 0); \ CLR(H_FLAG); \ P_FLAG = PARITY(A); \ CLR(C_FLAG); \ } case 0xF6: /* ori data8 */ cpu_cycles = 7; work8 = RD_BYTE(PC++); ORA(work8); break;




Ответить с цитированием