Patron, А может-ли эмулятор работать с реальными дисководами?
Patron, А может-ли эмулятор работать с реальными дисководами?
Обновилась текущая сборка "эмулятора ДВК": DVK_Emulator_19.12.13_00-19
Изменения:
1. Внесены изменения, описанные ЗДЕСЬ.
2. Добавлена возможность управления встроенным дизассемблером, для чего:
2.1. В объект 1801VM1 добавлены:
2.1.1. Состояние DisAsm, которое включает/выключает встроенный дизассемблер.
2.1.2. Состояние StepMode, которое включает/выключает режим пошагового выполнения команд. При включении StepMode - всегда включается DisAsm. При выключении DisAsm - всегда выключается StepMode.
2.1.3. Текстовый порт DisAsm, в который выводится листинг дизассемблирования исполняемых команд.
2.1.4. Параметры DisAsmBottomAddr и DisAsmTopAddr, позволяющие задать нижнюю и верхнюю границы окна дизассемблирования.
2.1.5. Скрытый параметр MaxLoopCommandsToHide ( значение по умолчанию 24 ), управляющий "сжатием" листинга циклов. В пошаговом режиме сжатие листинга циклов отключается.
3. В модуль CPU_module добавлен объект CPUCSR, создающий на шине отладочный порт по адресу, задаваемому параметром CPUCSR_Address ( значение по умолчанию 0177724 ). Бит 00 этого порта управляет состоянием DisAsm, а бит 01 - управляет состоянием StepMode подключенного к шине процессора.
4. В комплект поставки включён файл конфигурации DisAsm.cfg, выводящий листинг дизассемблирования в отдельное окно.
5. В образ HDSYS.DSK добавлены файлы CPUCSR.MAC и CPUCSR.SAV, содержащие пример взаимодействия отлаживаемой программы с отладочным портом. Для отключения дизассемблирования тела обработчика EMT - в файле конфигурации DisAsm.cfg нужно изменить параметр DisAsmTopAddr c 0177776 на ( например ) 040000.
Последний раз редактировалось Patron; 19.12.2013 в 15:45.
Изменение эмулируемой конфигурации.
Использование встроенного дизассемблера.
---------------------------------------------------------------
Файл конфигурации DisAsm.cfg содержит пример использования дизассемблера, встроенного в эмулятор процессора. Для отображения листинга дизассемблирования создаётся дополнительная консоль DisAsm, которая находится в отдельном окне:
Скрытый текст
Код:[objects] DisAsm = Ядро:Console [links] CPU [DisAsm] > DisAsm [DisAsm.ini] TabTitle="" SeparateWindow_X0_px=0 SeparateWindow_Y0_px=0 SeparateWindow_DX_px=800 SeparateWindow_DY_px=600 InitialStateOf[SeparateWindow]=1 SaveChangesFor[SeparateWindow]=1 InitialStateOf[ControlBar]=0 SaveChangesFor[ControlBar]=1 InitialStateOf[StatusBar]=1 SaveChangesFor[StatusBar]=1 DumpMode=1 PrinterMode=0 InitialStateOf[Log]=0 SaveChangesFor[Log]=1
[свернуть]
На полосе окна DisAsm находятся виджеты кнопок, подключенных к состояниям объектов CPU и bus:
Скрытый текст
Код:[objects] DisAsm_Button = Ядро:SB_StatePushButton StepMode_Button = Ядро:SB_StatePushButton Step_Button = Ядро:SB_StateFlashButton DisAsmLog_Button = Ядро:SB_StateFlashButton CLS_Button = Ядро:SB_StatePushButton [links] DisAsm + ( DisAsm_Button + CPU ) | ( StepMode_Button + CPU ) | ( Step_Button + bus ) DisAsm + ( DisAsmLog_Button + DisAsm ) | ( CLS_Button + DisAsm ) [DisAsm_Button.ini] SB_Part_Data=nPosition[1] | nPriority[0] | bHidden[0] TextFieldWidth_Px=0 TextFieldText= ButtonPushMode = 2 IsInverted = 0 ButtonON_Text = "DisAsm" ButtonOFF_Text = "DisAsm" ButtonWidth = 70 ButtonHeight = 18 ButtonFontSize = 12 ButtonFontWeight = 600 StateName = "DisAsm" [StepMode_Button.ini] SB_Part_Data=nPosition[2] | nPriority[0] | bHidden[0] TextFieldWidth_Px=0 TextFieldText= ButtonPushMode = 2 IsInverted = 0 ButtonON_Text = "Step Mode" ButtonOFF_Text = "Step Mode" ButtonWidth = 90 ButtonHeight = 18 ButtonFontSize = 12 ButtonFontWeight = 600 StateName = "StepMode" [Step_Button.ini] SB_Part_Data=nPosition[3] | nPriority[0] | bHidden[0] TextFieldWidth_Px=0 TextFieldText= ButtonPushMode = 2 IsInverted = 0 ButtonON_Text = "Step" ButtonOFF_Text = " " StateName = Pause ButtonWidth = 60 ButtonHeight = 18 ButtonFontSize = 12 ButtonFontWeight = 600 PushedButton_Text_X_Offset_Px = 0 PushedButton_Text_Y_Offset_Px = 3 PoppedButton_Text_X_Offset_Px = 0 PoppedButton_Text_Y_Offset_Px = 3 ButtonON_TextColor = 0,0,0 ButtonOFF_TextColor = 0,0,0 ButtonON_Background = 210,210,110 ButtonOFF_Background = 1,0,0 Is_PoppedButton_Border_ButtonLike = 0 Is_PushedButton_Border_ButtonLike = 0 DoCenterAlignButtonText = 1 LightsOFF_StateName=Power [DisAsmLog_Button.ini] SB_Part_Data=nPosition[4] | nPriority[0] | bHidden[0] TextFieldWidth_Px=0 TextFieldText= ButtonPushMode = 2 IsInverted = 0 ButtonON_Text = "Log" ButtonOFF_Text = "Log" StateName = Log ButtonWidth = 60 ButtonHeight = 18 ButtonFontSize = 17 ButtonFontWeight = 600 PushedButton_Text_X_Offset_Px = 0 PushedButton_Text_Y_Offset_Px = 1 PoppedButton_Text_X_Offset_Px = 0 PoppedButton_Text_Y_Offset_Px = 0 ButtonON_TextColor = 0,0,0 ButtonOFF_TextColor = 0,0,0 ButtonON_Background = 160,205,160 ButtonOFF_Background = 1,0,0 Is_PoppedButton_Border_ButtonLike = 1 Is_PushedButton_Border_ButtonLike = 1 DoCenterAlignButtonText = 1 LightsOFF_StateName=Power [CLS_Button.ini] SB_Part_Data=nPosition[5] | nPriority[0] | bHidden[0] TextFieldWidth_Px=0 TextFieldText= ButtonPushMode = 1 IsInverted = 0 ButtonON_Text = "Clear" ButtonOFF_Text = "Clear" ButtonWidth = 60 ButtonHeight = 18 ButtonFontSize = 12 ButtonFontWeight = 600 StateName = "ClearScreen"[свернуть]
В пошаговом режиме эмуляция ставится на паузу после выполнения процессором каждой следующей команды. Кнопка [ Шаг ] - это просто иначе оформленная кнопка [ Пауза ], поэтому она активируется не только в пошаговом режиме процессора, но и при любой постановке эмуляции на паузу:
Слева в листинге дизассемблера указаны значения PC и PSW, потом мнемоника команды и в поле комментариев - содержимое операндов до выполнения команды.
При нажатии кнопки [ Лог ] - листинг начинает писаться в файл DisAsm.log, при этом в листнг попадают только те строки, которые были выведены на консоль когда кнопка [ Лог ] уже была нажата. Чтобы сохранить строки, выведенные на консоль до этого - их можно скопировать в буфер обмена, нажав клавишу <PrintScreen> ( при этом копируются все строки от верхней, видимой на экране, до последней, выведенной на консоль, поэтому, чтобы скопировать в буфер обмена весь текстовый буфер консоли - нужно сначала промотать содержимое экрана до самого верха при помощи полосы прокрутки или колеса мыши ).
В данной конфигурации на шине присутствует отладочный порт, создаваемый объектом CPUCSR:
Код:[objects] CPUCSR = CPU_module:CPUCSR [links] bus & CPU | CpuBoard | TerminalPort | PrinterPort bus & Booter | TerminalPort2 | MX | HD | CPUCSR [CPUCSR.ini] CPUCSR_Address = 0177724
Пример взаимодействия отлаживаемой программы с отладочным портом эмулятора находится на системном диске в файлах CPUCSR.SAV и CPUCSR.MAC:
Код:; ; Тест отладочного регистра эмулятора процессора ( 0177724 ). ; ; ; Бит 01 включает/выключает дизассемблер ; ( при выключении - выключает и пошаговый режим ). ; ; Бит 02 включает/выключает пошаговый режим ; ( при включении - включает и дизассемблер ). ; ; .MCall .Exit START: Mov #2, @#177724 ; Включает дизассемблер в пошаговом режиме. Mov #100., R0 Mov #10., R1 Mov #4, R2 Clr R3 BiC #2, @#177724 ; Выключает пошаговый режим. 1$: Inc R3 SOB R0, 1$ BiS #2, @#177724 ; Включает пошаговый режим. Inc R1 EMT 341 Inc R2 Inc R3 Mov #0, @#177724 ; Выключает дизассемблер. ;================================ Dec R1 Dec R2 Dec R3 ;================================ Mov #1, @#177724 ; Включает дизассемблер в потоковом режиме. Mov #12., R0 2$: Dec R0 BEq 3$ Cmp R0, #5 BLE 2$ SOB R0, 2$ 3$: ;================================ 22$: Inc R1 Inc R2 Inc R3 Inc PC Br 22$ ;================================ Mov #0, @#177724 ; Выключает дизассемблер. .Exit .End START ;
Запуск CPUCSR.SAV осуществляется в окне терминала, по команде:
Код:.R CPUCSR
Чтобы в листинг не включался текст системного обработчика команды EMT - в файле конфигурации DisAsm.cfg нужно изменить верхнюю границу окна дизассемблирования:
Код:[CPU.ini] CPU_Frequency_KHz = 5300 CPU_SpeedLimit_KIPS =True DisAsmBottomAddr = 0 DisAsmTopAddr = 040000 ;; DisAsmTopAddr = 0177776 InitialStateOf[DisAsm]=0 SaveChangesFor[DisAsm]=1 InitialStateOf[StepMode]=0 SaveChangesFor[StepMode]=1
Последний раз редактировалось Patron; 19.12.2013 в 15:57.
Что это за штука, которая ТРАПиться? )Код:CPUCSR.MAC 3 19-Dec-2013 1597 CPUCSR.SAV 2 19-Dec-2013 1600 < UNUSED > 143 1602 51 Files, 1588 Blocks 143 Free blocks .CPUCSR ?MON-F-Trap to 4 001006 .
И ещё кажется что-то обновилось в SYS файлах на системном
разделе? Нет?
Есть ли планы полноценного WEB-ресурса посвящённого
эмулятору или об этом пока рано говорить?
И конечно огромная благодарность за развитие и поддержку лучшего в мире эмулятора ДВК! )
Отладочный регистр есть на шине только тогда, когда в конфиге создан и подключен к шине объект CPUCSR. Это делается только в конфиге DisAsm.cfg. Если загрузить конфиг DisAsm.cfg и запустить там CPUCSR.SAV - обращения по адресу 0177724 пройдут успешно. Во всех остальных случаях - будет Trap_To_04.
Patron, Что-то тест не проходит. Запускаю эмулятор в конфиге DisAsm, нажимаю сброс 2 раза, набираю T0 ,enter. Тест доходит до набора "1 2 3 4 j c u k" и когда я набираю j после 1234 он пишет 000404 , @J?,@160556
Последний раз редактировалось MiX; 23.12.2013 в 15:24.
Это из-за того, что встроенные тесты ДВК не дружат с прерыванием таймера. Если выключить таймер до набора T0 - всё проходит.
---------- Post added at 14:44 ---------- Previous post was at 14:41 ----------
До сих пор никто так и не понял - что именно там портится при включённом таймере. Можно записать листинг прохождения встроенного теста при включённом таймере, сравнить с листингом при выключенном таймере и попробовать найти причину вылета.
Раньше вроде бы проскакивал\определял? Или это норм?
И терминал в [hold] автоматом уходит! )Код:Адрес Модуль Длина ------ ------ ------- 167426 HD 117. 160000 IOPAGE 1931. 156220 RMON 440. 153550 EM 660. 147230 SL 1128. 137226 USR 2049. 001000 ..BG.. 24139. .SYS RT-11SJ V05.04 G .TTINQ c?TTINQ-W-Unknown terminal type .Z !UCL-E-Bad command or file name . . .TTINQ c?TTINQ-W-Unknown terminal type
Код:BCC 50$ ;IF CC WE GOT AN ANSWER 20$: .PRINT #EFAIL ;IF CS INQUIRE FAILED BISB #WARN$,@#$USRRB ;SET EXIT STATUS 30$: CALL TTVIS ;VISUALIZE ANSWERBACK STRING BCS 40$ ;IF CS NO ANSWER RECEIVED .PRINT #TTANS ;PRINT ANSWER STRING .PRINT #BUFF ; 40$: .EXIT ;EXIT 50$: MOV #IDTAB,R3 ;POINT TO TERMINAL ID TABLE MOV #IDSIZ,R2 ;SET TABLE SIZE 60$: CMP R1,(R3)+ ;FOUND TERMINAL ID? BEQ 70$ ;YES TST (R3)+ ;SKIP TERMINAL NAME ADDRESS DEC R2 ;MORE IDS AVAILABLE? BNE 60$ ;YES, GO FOR NEXT BR 20$ ;NO, TERMINAL TYPE UNKNOWN
Эту тему просматривают: 1 (пользователей: 0 , гостей: 1)