Titus, пытаюсь дописать свой эмулятор Союз-Неона до хоть какого-то рабочего состояния. Сравниваю с твоим.
Вот такой вопрос - это бага эмулятора или так и задумано? Проверял на EmuStudio 0.15n.
Запускаем эмулятор, на проверке памяти выходим в отладчик - F8.
Доходим до 001000 (0x0200) в режиме USER:
Дальше как видим обращение к эмулируемому регистру -- как мы знаем, на NOP будет прерывание.Код:r200 HALT MMU: 000, 000, 000, 000, 002, 004, 000, 000 USER MMU: 006, 008, 00A, 00C, 002, 004, 000, 000 SNDC2R = 36458 PPIC = IH-0 PPIB = HI10 PIC_IRQM = --5----- PICMR = 76543210 R0=8202 R4=0000 PSW =0000 0200 15DF 0003 F86A MOV #$0003,(#$F86A) R1=0000 R5=0000 PSW'=0000 0206 00A0 NOP R2=0000 SP=0000 PC' =0200 0208 15C2 040E MOV #$040E,R2 R3=0000 PC=0200 Ctr=047188 020C 11C6 MOV PC,SP Flags = U-------- CPU (Main) 020E 09DF 0402 JSR (#$0402)
Делаем шаг:
Странно, что мы сразу провалились в прерывание, не дойдя до NOP.Код:m0 HALT MMU: 000, 000, 000, 000, 002, 004, 000, 000 USER MMU: 006, 008, 00A, 00C, 002, 004, 000, 000 SNDC2R = 36467 PPIC = IH-0 PPIB = HI10 PIC_IRQM = --5----- PICMR = 76543210 R0=8202 R4=0000 PSW =0180 0368 11BF 7CA2 MOV SP,@($800E) R1=0000 R5=0000 PSW'=0000 036C 17C6 800E MOV (#$800E),SP R2=0000 SP=0000 PC' =0200 0370 1166 PUSH R5 R3=0000 PC=0368 Ctr=047152 0372 1126 PUSH R4 Flags = HP------- CPU (Main) 0374 10E6 PUSH R3
Теперь пропустим всё прерывание:
Мы опять на адресе 0200.Код:r200 HALT MMU: 000, 000, 000, 000, 002, 004, 000, 000 USER MMU: 006, 008, 00A, 00C, 002, 004, 000, 000 SNDC2R = 320 PPIC = IH-0 PPIB = H-10 PIC_IRQM = -------- PICMR = 76543210 R0=8202 R4=0000 PSW =0000 0200 15DF 0003 F86A MOV #$0003,(#$F86A) R1=0000 R5=0000 PSW'=0000 0206 00A0 NOP R2=0000 SP=0000 PC' =0200 0208 15C2 040E MOV #$040E,R2 R3=0000 PC=0200 Ctr=045404 020C 11C6 MOV PC,SP Flags = U-------- CPU (Main) 020E 09DF 0402 JSR (#$0402)
Делаем два шага:
Теперь мы упали в прерывание на NOP, причём в PPIB по-другому выставлены EF0/EF1.Код:m0 HALT MMU: F86, 000, 000, 000, 002, 004, 000, 000 USER MMU: 006, 008, 00A, 00C, 002, 004, 000, 000 SNDC2R = 334 PPIC = IH-0 PPIB = H--0 PIC_IRQM = -------- PICMR = 76543210 R0=8202 R4=0000 PSW =0000 0206 00A0 NOP R1=0000 R5=0000 PSW'=0000 0208 15C2 040E MOV #$040E,R2 R2=0000 SP=0000 PC' =0200 020C 11C6 MOV PC,SP R3=0000 PC=0206 Ctr=045350 020E 09DF 0402 JSR (#$0402) Flags = U-------- CPU (Main) 0212 0A00 CLR R0 m0 HALT MMU: F86, 000, 000, 000, 002, 004, 000, 000 USER MMU: 006, 008, 00A, 00C, 002, 004, 000, 000 SNDC2R = 343 PPIC = IH-0 PPIB = H--0 PIC_IRQM = -------- PICMR = 76543210 R0=8202 R4=0000 PSW =0180 0368 11BF 7CA2 MOV SP,@($800E) R1=0000 R5=0000 PSW'=0000 036C 17C6 800E MOV (#$800E),SP R2=0000 SP=0000 PC' =0206 0370 1166 PUSH R5 R3=0000 PC=0368 Ctr=045314 0372 1126 PUSH R4 Flags = HP------- CPU (Main) 0374 10E6 PUSH R3
Это точно правильное поведение, что на одну запись в эмулируемый регистр мы отрабатываем прерывание дважды?
Возможно, первое прерывание здесь связано с выставленным INT5 в PIC, но там же маска его запрещает, нет?
@Alex_K, если радиальный сигнал HALT установлен до перехода в режим USER, то при переходе в USER сразу отрабатывает прерывание HALT, или сначала успевает отработать одна команда и только затем отрабатывает прерывание HALT?
Тут же ещё всё сложнее. Переход в режим USER тут выполняется командой STEP, после которой не происходит обработки прерываний до выполнения следующей команды. Тогда выглядит так, что Titus это не учитывает.




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