S_V_B скомпилировал проигрыватель MOD/STM авторства RDC. Я запустил на эмуляторе, посмотрел что он пишет в LPT-порт 161032. Нужна поддержка Covox в эмуляторе! А то как же так? Софт под Covox есть, а послушать не на чем.
Вид для печати
S_V_B скомпилировал проигрыватель MOD/STM авторства RDC. Я запустил на эмуляторе, посмотрел что он пишет в LPT-порт 161032. Нужна поддержка Covox в эмуляторе! А то как же так? Софт под Covox есть, а послушать не на чем.
А на своем реале не пробовал?
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 это не учитывает.
nzeemin, собственно на этот вопрос вы сами и ответили. После STEP обязательно выполнится команда нового процесса. А вот после START ничего не выполнится и сразу же перейдём в режим HALT. Тут ещё надо учитывать, что у радиального прерывания HALT приоритет равен пяти и если есть более приоритетные прерывания, то выполнятся они. Ну при START прерываний TRAP4 и TRAP10 не будет, а вот T-разряд и ACLO могут быть.
Я думаю, что @Alex_K уже все прояснил)
- - - Добавлено - - -
Только почему ты делаешь шаг командой 'm0'? Шаг - это просто Enter. А m0 - это запись памяти в файл.
Titus, ещё вопрос про загрузку с дискеты.
У себя я вижу что загружается 512 байт первого сектора, но загрузчик выглядит довольно странно. Так и задумано? Или этот код вообще не предназначен для исполнения?
Код:001000 NOP
001002 BR 001036
001004 HALT
001006 HALT
001010 HALT
001012 HALT
001014 HALT
001016 HALT
001020 HALT
001022 HALT
001024 HALT
001026 HALT
001030 HALT
001032 BIC (R4), (R0)+
001034 MOVB 000400(R0), (R0)+
001040 JMP @#000574
001044 HALT
001046 HALT
001050 HALT
001052 HALT
Тоже не могу пояснить, потому что основательно подзабыл.
Думаю, @Alex_K и тут лучше меня подскажет.