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.
Изменение эмулируемой конфигурации.
Использование встроенного дизассемблера.
---------------------------------------------------------------
Файл конфигурации DisAsm.cfg содержит пример использования дизассемблера, встроенного в эмулятор процессора. Для отображения листинга дизассемблирования создаётся дополнительная консоль DisAsm, которая находится в отдельном окне:
Скрытый текст
http://s5.hostingkartinok.com/upload...39312ad8b1.pngКод:[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"
[свернуть]
В пошаговом режиме эмуляция ставится на паузу после выполнения процессором каждой следующей команды. Кнопка [ Шаг ] - это просто иначе оформленная кнопка [ Пауза ], поэтому она активируется не только в пошаговом режиме процессора, но и при любой постановке эмуляции на паузу:
http://s6.hostingkartinok.com/upload...88cc746e1b.png
Слева в листинге дизассемблера указаны значения 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
Что это за штука, которая ТРАПиться? )Код: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
Это из-за того, что встроенные тесты ДВК не дружат с прерыванием таймера. Если выключить таймер до набора 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
http://savepic.net/4129263.png
:confused_std:Код: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