Может и будет, БК-шка ведь уже есть. Хотя особого энтузиазма в направлении DEC-совместимых компьютеров пока нет.
Вид для печати
Может и будет, БК-шка ведь уже есть. Хотя особого энтузиазма в направлении DEC-совместимых компьютеров пока нет.
b2m, а было бы здорово.
Лучше ДВК (хотя бы 3М) - его ещё никто не эмулировал!!! Ну и БК эмуляцию оттточить назло всем буржуям ;)
да эмулятор ДВК это было бы нечто...
эх мечты, мечты.
Запустил на реале тест by Ivan Gorodetsky
вот результаты
Вложение 17005 - реал
Вложение 17006 - b2m
вот диск с тестом
Вложение 17008
и исходник
Вложение 17007
ну и в виде таблички (набирал руками) ...
Вложение 17010
собственно там надо еще посчитать точно такты до начала теста самих комманд
но они ж постоянны для всех тестов (TestDataInit:)
esl, спасибо за результаты с реала. Я не анализировал схему, но судя по всему у Корвета в кадре не 312, а 306 строк. В последнем случае результаты в эмуляторе "почти совпадают", с точностью до пары-тройки команд. Где-то ivagor уже говорил про этот недостаток эмулятора.
---------- Post added at 15:29 ---------- Previous post was at 15:15 ----------
Выложил эмулятор с данным исправлением.
А у меня из результатов eslа получилось 314 строк :confused: (если считать, что у Корвета в строке 160 тактов, или это не так?).
---------- Post added at 17:49 ---------- Previous post was at 17:22 ----------
Похоже b2m посчитал по 164 такта на строку.
Я не считал такты, я поделил значения с реала на свои и умножил на 312 строк (которые были в эмуляторе).
---------- Post added at 17:07 ---------- Previous post was at 16:52 ----------
Кстати, да, период строчных импульсов у меня 65.6 мс, что соответствует 164 тактам при частоте 2.5МГц. Переделал, когда с таймером разбирались. Это было предыдущее изменение в эмуляции Корвета :)
---------- Post added at 18:05 ---------- Previous post was at 17:07 ----------
Ради совпадения результатов теста с реалом укоротил кадр на 6 тактов :)
Новая версия на сайте.
Интересно, откуда берутся эти 6 тактов? Почему процессор в Корвете при возникновении прерывания простаивает 6 тактов? Например в ПК8002 аналогичная ситуация, но там только 4 такта...
---------- Post added at 18:10 ---------- Previous post was at 18:05 ----------
У меня, конечно, есть предположение: если выполнялась команда HLT, то процессор не может сразу после прерывания возобновить исполнение и считать команду RST или CALL, команда HLT должна завершить цикл, но это же не 6 тактов!
[/COLOR]У меня, конечно, есть предположение: если выполнялась команда HLT, то процессор не может сразу после прерывания возобновить исполнение и считать команду RST или CALL, команда HLT должна завершить цикл, но это же не 6 тактов![/QUOTE]
ну после прерывания PIC подсовывает процу CALL, надо бы глянут сколько это занимает ...
или я не про то ?
кстати, еще нашел, не работает DEFLECTOR
запускаеш игру, а там в любом случае заканчивается энергия и смерть
и на сайте все еще старая версия ...
Нет, это учитывается: CALL - 17, RST - 11
А я думал, что я просто не успеваю сделать то, что надо. А как должно быть по-нормальному?
Попробуй очистить кеш браузера, на народе бывает непонятка с датой и браузер думает, что файл не изменился.
кстате о растактовке корвета
из документации
частота кадровой похоже
49.8166746373346
20мгц/16=1.25мгц
1.25мгц/164=7.62кгц
7.62кгц/153=49.8166746373346
~hbl = 1(64T=51.2мкс)0(18T=14.1мкс)
~vbl = 0(25T)1(128T)
и еще цитата
"при обращении МП к УВВ формируется один такт ожидания"
УВВ это все бисы
и еще похоже (но не уверен) что при форимровании CALL от контроллера прерываний на каждый байт добавляем по такту ожидания ....
может это что-то объяснит ?
Ну в принципе, и у меня почти также, только я считаю по-другому, исходя из тактовой частоты процессора:
2.5МГц / 164 / 306 = 49.8166...Гц
Насчёт hbl они где-то общитались: 51.2+14.1=65.3мкс, а если по тактам посчитать 164/2.5Мгц = 65.6мкс
А, понял, 18Т=14.4мкс :)
А насчёт vbl я вообще не понял, почему они считают в половину меньше, стандартная ТВ развёртка 625 чересстрочная, то есть в кадре 312,5 строк, с учётом Корветовской развёртки 306, а у них только 153...
Один такт ожидания при обращении к УВВ - это только +1 такт в тесте, т.к. там только одна команда обращения к PIC. Насчёт такта ожидания при формировании CALL я сомневаюсь.
А вот сколько тактов тратится на выход из режима HLT, мне неизвестно. На данный момент этот выход у меня мгновенный, и в этом, видимо, главная причина.
---------- Post added at 13:26 ---------- Previous post was at 13:13 ----------
Если порассуждать про команду HLT, то получится следующее.
Циклы МП могут быть 3,4 и 5 тактов. Первый цикл М1 - всегда 4 такта (я так думаю), по документации HLT выполняется за 7 тактов (минимум), т.е. это 4 такта цикла M1 и скорее всего 3 такта цикла ожидания прерывания. Если в начале цикла ожидания обнаруживается запрос на прерывание, то происходит выход из HLT за те-же 3 такта. Однако собственно запрос может возникнуть и на 1-2 такта раньше. Получается на выход из HLT потратится 4-5 тактов. Плюс один такт на обращение к УВВ описанный выше. Итого 5-6 тактов, что подтверждается результатами теста: я пробовал укорачивать размер кадра на 5 тактов, а не на 6 - результат не изменился.
еще про корвет, нашел ответ Скурихина на вопрос по таймеру
Цитата:
=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
From: A.Skurikhin <sk@------->
To: Sergey Erokhin <[email protected]>
Date: Wednesday, May 21, 2003, 1:51:27 PM
Subject: PK8020, новая версия winbeta1
Files: <нет>
--====----====----====----====----====----====----====----====----====----===--
> какая точно частота подавалась на вход 2-го канала корвета ?
Сколько помню, есть две модификации Корвета. В исходной версии подвалось
50гц (VBL). Но очень быстро выяснилось, что для практических применений
гораздо лучше иметь на входе таймера строчную частоту(64мкс), а
веритикальный синхронизирующий импульс подавать на вход управления этого же
таймера. Такая схема позволяет настроить таймер в режим, когда по сигналу
вертикального синхроимпульса таймер сбрасывается, затем отсчитывает заданное
количество строк и генерит прерывание.
Используя эту технологию, можно обеспечить "гладкий" вывод на экран.
уточнение
~vbl = 0(25T1)1(128T1)
период Т1 = 164Т = 131.2 мксек
и цитата из Технического описания
Цитата:
Нам осталось разобраться с обработкой прерываний, т.е. с сигналом INTA. При формировании контроллером прерываний D8(12.4) сигнала INT процессор заканчивает выполнение команды и начинает выполнять трехбайтную команду "CALL", которую он принимает из контроллера прерываний, при условии, что прерывания разрешены командой "EI".
Как это делается? Попробуем разобраться без наглядной иллюстрации. В первом цикле процессор выполняет цикл М10, который отличается от М1 наличием единицы в разряде D0 шины данных. Кроме этого вводится такт ожидания, потому при обращении к контроллеру прерываний вырабатывается сигнал CSDEV. Положительным фронтом сигнала на тактовом входе С триггера D15 (3.25) единица в D0 устанавливает выход триггера D15 (5 ножка) в единицу. На рисунке 5 сигнал на тактовом входе D15 показан.
Изменить состояние D15 теперь можно двумя способами. Первый: с приходом следующего положительного перепада на тактовый вход сигнал на линии D0 должен низкий уровень. Но такая ситуация может наступить после выполнения полностью команды "CALL". Второй способ: подать на вход R (RESET) сигнал низкого уровня. Из рисунка 5 видно, что это возможно при выполнении цикла записи (М3 или М5).
Итак, триггер D15 находится в состоянии единица. Сигнал высокого уровня с выхода триггера поступает на дешифратор адресов, запрещая его работу, и на микросхему D18 (3.27) - И. Поэтому сигнал INTA будет инвертированным сигналом DBIN. Сигнал INTA выбирает контроллер прерываний и в цикле М10 в процессор вводится код команды CALL из контроллера.
Команда "CALL" выполняется за пять машинных циклов, из которых первые три связаны с вводом команды в процессор, а два последних с записью в стек текущего адреса прерванной команды. Первый цикл (М10), мы уже разобрали. Затем выполняется два раза подряд цикл М8, отличающийся от М2 только единицей в разряде D0 шины данных. В первом цикле М8 читается младший байт адреса, а во втором цикле М8 - старший байт адреса перехода на программу обработки прерываний. В конце цикла М8 будет вырабатываться сигнал INTA, который и обеспечивает чтение из контроллера.
В четвертом и пятом циклах будет выполняться цикл М5, обеспечивающий запись в стек старшего и младшего байта адреса прерванной программы. Отрицательный сигнал с выхода регистра D27 (3.26) сбросит триггер D15 в нуль. Поэтому в четвертом и пятом циклах команды CALL сигнал INTA формироваться не будет.
---------- Post added at 13:06 ---------- Previous post was at 13:05 ----------Цитата:
При обращении к УВВ низкий уровень сигнала CSDEV появляется на выходе D24 и процессор переходит в режим ожидания, устанавливая на выходе WI сигнал WAIT высокого уровня.
во первых обещался, во вторых информация от авторов вполне интересна сама по себе :)
Запустил тест на реале
sta/lda
0DFA - при записи в регистры БИС
0F0D - при записи в обычную память
добавил в TestDataInit еще один sta
сталоЦитата:
mvi a,020h
sta 0FB28h
sta 0FB28h
ei
0DF9 - при записи в регистры БИС
0F0С - при записи в обычную память
а для
nop
1x 30e7
2x 30e7
3x 30e3
соответсвенно 1,2,3 sta
есть предложение
по результатам ваших коллективных эксперементов над процом
вышли мне детали, а я сведу в табличку, чтоб осталось в доступе
esl, интересно бы еще потестировать быстродействие записи в графическое и символьное ВидеоОЗУ и чтения оттуда (если в документации или еще где не написано, например, что доступ полностью прозрачный).
запись/чтение в ACZU и область клавиатуры и LUT совпадает с обычной памятью
это я проверял
судя по описанию в VRAM не должно быть торможения
но проверить надо бы конечно, но эт не скоро
надо тест переписать и опять железку достать ....
кстати, прогнал сегодня на корвете 8080 CPU Exerciser (KR580VM80A)
с вполне ожидаемым OK :)
какой точно стоит проц - не знаю, он под радиатором ...
а в доке вот что
Цитата:
Рассмотрим теперь сигнал 1READY, который через разъем XS3 поступает на вход RA (готовность) процессора. Он формируется на выходе микросхемы D24 (ИЛИ). На вход D24 подаются два сигнала CSDEV и WAIT. CSDEV - это сигнал обращения к УВВ (при обращении он имеет низкий уровень). Когда обращения к УВВ нет, то на выходе 1READY сигнал высокого уровня и процессор, анализируя этот сигнал в такте Т2, не переходит в режим ожидания. При обращении к УВВ низкий уровень сигнала CSOEV появляется на выходе D24 и процессор переходит в режим ожидания, устанавливая на выходе WI сигнал WAIT высокого уровня. Сигнал WAITЕ формирует сигнал 1READY высокого уровня, поэтому, пропустив после такта Т2 один такт - такт ожидания, процессор продолжает работу с выполнения такта Т3. Таким образом при обращении к УВВ процессор автоматически вставляет один такт ожидания между тактами Т2 и Т3. Эта хитрость применена для надежного обращения к УВВ. На рисунке 5 такт ожидания не показан. Заметим только, что в случае появления такта ожидания сигнал DBIN автоматически расширяется до 800 нсек.
---------- Post added at 15:30 ---------- Previous post was at 15:26 ----------
кстати, могу выполнить любые ваши тесты :)
эт батник, компилит ваш тест и сразу пишет на диск для эмулятора :)Код:tasm -b -85 vst.asm
@copy vst.obj A.COM
@xkorvet d disk.kdi A.COM >nul
@xkorvet a disk.kdi A.COM >nul
esl, если я правильно понимаю, "ширина" активной области изображения корвета 51,2 мкс, а большинство ТВ отображают максимум примерно 48 мкс. Старые ТВ и мониторы имели регулировки развертки, которыми (почти всегда) можно было сжать изображение. Была (есть) проблема с обрезанием краев изображения корвета? Как было на старых мониторах, есть ли опыт подключения к новым ТВ (у которых нужных регулировок, как правило, нет)?
Сам я сидел за реальным корветом буквально несколько минут, про края изображения ничего не помню.
ivagor, те корветы с которыми я работал? были с ЧБ мониторами на основании телевизоров Юность 405, причем половина из них даже имела антены и ПТК, а вторая половина без этого добра,
у них все было ОК с картинкой
у нас еще был клас БК0010-01Ш, с цветными мониторами (и надписями про работу не более 30 минут в день :)
подключали их, там тоже было все ок
к контуру был такой квадратный цветой монитор (такой был к агатам)
там тоже было все ок ....
а сейчас я подключал через НедоPC Кодер (RGB->Composite,S-Video)! rev B через S-Video
на экран не влазит (телевизор CRT 25" Panasonic 100HZ)
причем с правой стороны не влазит знакоместа 4
и левая часть первого символа тоже не влазит
нашел как войти в сетап телевизора, пробовал настраивать, но правый край так и не смог вытянуть правый край (но сколько точно не вытянулось не помню)
может именно по названой вами причине
b2m, можно ли в режиме эмуляции MSX при загрузке из ROM разблокировать запись в область памяти картриджа 0x4000-0xBFFF ? Это нужно для тестирования рекомпилированных программ, позволит использовать самомодифицирующиеся макросы для замены команд Z80, в результате чего полученный код рекомпиляций будет более корректным, коротким и быстрым.
Вообще-то, запись в эту область означает смену страницы ROM-маппера. Хотя, ясно, что хеш-сумма рекомпилированной проги вряд-ли совпадёт с какой-либо из имеющихся в базе и будет использован маппер "по-умолчанию", и в этом случае можно предусмотреть опцию в конфиге.
---------- Post added at 19:17 ---------- Previous post was at 19:13 ----------
Кстати, можно же грузить прямо в ОЗУ, чем не устраивает такой вариант?
---------- Post added at 19:27 ---------- Previous post was at 19:17 ----------
Вот, к примеру, такое дополнение emu.ext
Тогда файлы с расширением *.msx будут грузиться в область 4000h, а bios их сразу будет запускать.Код:msx : loader {
config="MSX"
loadaddr=4000
cmd[0].start=no
}
Привет b2m:!
в теме про БК ты напискл
"вывод я сделал через ВВ51, он у меня в сокет перенаправляется)"
а реально ли сделать сеть в Корвете ?
т.е. в конфиге добавить номер рму (ну это совсем просто, биты на ВВ55)
и сделать чтоб две копии эмулятора могли друг с другом по сети обмениваться ...
типа в конфиге РМУ уазать номер порта и ip РМП ...
насколько это реализуемо ?
Дык в Башкирии-2М это уже сделано! Просто нужно в конфиге порт сервера указать, а у клиента ещё и адрес сервера. Клиента нужно запускать вторым, естесственно. Он соеденится с сервером и получит от него один байт - номер машины, который можно считать через netid. Например, дисковый вариант Башкирии - это сервер, центральная машина, номер которой всегда ноль, а варианты с rom-диском - клиенты.
---------- Post added at 14:06 ---------- Previous post was at 12:12 ----------
Кстати, поскольку номер машины у Корвета в порту инверсный, если будешь пробовать, измени строчку:
наКод:portA[4-7]=rom[30]
Это фича такая у меня есть, номера бит 8-F соответствуют инверсным 0-7 :)Код:portA[C-F]=lan.netid
А почему было rom[30] объясню - просто по этому адресу в ПЗУ байт 0FFh, что после инверсии соответствовало номеру ноль. Иначе, как я понял, биос даже не пытается загрузиться с диска.
b2m, Пока не получилось
правлильно ли я делаю
в РМП
в РМУЦитата:
lan : K580ww51 {
port=15015
}
все ли правильно ?Цитата:
ppa1 : K580ww55 {
portA[1]=vid.vrtc
portA[3]=vid.attr
portA[C-F]=lan.netid
portB[0]=dsk.drive[0].on
portB[1]=dsk.drive[1].on
portB[2]=dsk.drive[2].on
portB[3]=dsk.drive[3].on
portB[4]=dsk.side
portC[0-1]=vid.page
portC[2]=font.frame[0].page
portC[3]=vid.widechar
portC[4-5]=vid.attrmask
portC[6-7]=mmgraph.page
}
lan : K580ww51 {
port=15015
server="127.0.0.1"
}
и кстати, lan.netid выдается по мере коннекта 1,2,3,... ?
---------- Post added at 13:27 ---------- Previous post was at 13:25 ----------
а почему нельзя было просто написать в конфиге 0 ?
в теории в разных ПЗУ там может не всегда быть FF :)
Вроде бы всё правильно. Серверу тоже можно lan.netid вместо rom[30] назначить.
Да, выдаётся первый свободный номер.
Потому что нет такого девайса "0", хотя можно было бы и сделать псевдоустройство, которое при чтении выдавало бы всегда указанную константу. Но поскольку это употребляется очень редко, я пока и не сделал.
А как работать с сетью?
---------- Post added at 15:59 ---------- Previous post was at 15:52 ----------
Блин, мы же про прерывание забыли :)
Код:intctl : K580wn59 {
irq[3]=lan.irq
irq[4]=vid.irq
мини баг
в корвете похоже размер экрана чуть чуть неправильно ставится
см скриншот
верхний эмулятор - по дефолту
нижний - в меню выбрано 1:1
Вложение 17648 Вложение 17649
Вложение 17647
похоже экран чуть чуть больше и маштабируется ...
работает очень старнно и очень частично
в аттаче Вложение 17656 два диска и конфиги
один cpm
там есть программа sender.com
она передает com файл на все рму и запускат (эт для игрушек)
ее особенность - она только маленький загрузчик передает через "стандартный" сетевой пртокол, но даже его без контроля чего бы то нибыло
при ее запуске на рму появляется надпись RECEIVE
и после передачи должно запустится, игры с диска можно передавать
в Б2М очень интересно
с первый РМУ не работатет
со всеми остальными запущенными запускается
(кстати было бы полезно для РМУ в заголовке писать их номер в скобках)
причем первый рму после передачи сендером виснет на ресет
а на микродосовском диске родная программа для обмена с РМУ
называется STS
она вообще виснит при запуске, похоже чегойто ждет в порту
она умеет разное передавать и принимать
например на диске етсь тест kt.bin если правилно помню его надо передать на рму с адреса толи 9000 толи 8000
ну и что-то бейсиковское там есть
при старте вроде писало "не отвечают следующие рму"
То есть у тебя так: ты выбираешь 1:1, закрываешь программу, а когда снова запускаешь, размер окна немного другой? По идее, размер и позиция окна должны сохраняться в .ini файле и восстанавливаться после повторного запуска той-же конфигурации (т.е. размер и позиция сохраняется для каждой конфигурации). Может ты напутал чего, у тебя ведь сейчас целых три конфигурации Корвета? :) Если ты делал скриншоты через меню, то после 1:1 размер должен был бы быть 512х256. Между прочим, у меня аналогичная бяка при запуске эмулятора в VMware Player, ты случайно не в нём тестируешь?
Вот кстати, когда у меня был ещё PII-400, две копии эмулятора грузили проц на 100%, и чтобы проверить работу РМУ Башкирии, я написал небольшую программу-сервер, которая могла засылать файл на квазидиск, т.е. фактически аналог РМП. Так вот, первая попытка пересылки тоже всегда была ошибочной, а вторая - успешно. Я пытался разобраться, но с наскоку не вышло, и я плюнул на это дело - со второго раза ведь грузилось :) К тому же программа РМП передавала нормально, но она сначала тестирует все РМУ, т.е. посылает как минимум 15 тестовых пакетов.
Спасибо за образы, будет чем вечерком заняться...
---------- Post added at 18:41 ---------- Previous post was at 18:22 ----------
Посмотрел, чего висит: ждёт 85h из порта состояния, а там 5. Глянул в исходники ВВ51 - старший бит нигде не устанавливается :) Буду курить доки, когда этот старший бит надо устанавливать...
Кстати, первый РМУ висит на аналогичной процедуре. К тому-же после сброса буфер сокета не очищается, вот он и дёргается постоянно, но после достаточного количества сбросов уже не виснет :)
b2m Огромное спасибо за доделку БК - наконец-то она заработала с нормальной скоростью!!!
Спасибо nzeemin-у, что напомнил о тестах и подтолкнул меня победить свою лень и заняться БК-шкой :)
Заодно нашёл баг в контроллере дисковода. Я знал, что он там есть, т.к. работало нестабильно и сильно зависело от скорости эмуляции. Тем не менее, всё это хоть как-то, но всё-же работало. А после исправления ошибок в процессоре я был просто вынужден заняться поиском этого бага, потому что контроллер дисковода вообще перестал работать.
Я рад, что не зря потратил время, и всё-таки есть благодарные пользователи моего эмулятора БК. А то у меня складывается впечатление, что сообщество БК-шников как-то игнорирует мой эмулятор.
Кстати, AO-DOS 2.1 пишет, что она работает под эмулятором Савельева :) С одной стороны, лестно, что она путает мой с одним из лучших на данный момент, с другой стороны жаль, что она всё-таки определяет, что это эмулятор...
А как у БК-эмуляторов принято делать загрузку .bin-файлов обычно? Просто загрузить в память по адресу из заголовка и сделать туда jmp? А как работают всякие стремные .bin-ы, которые затирают собой при загрузке стек и автозапускаются?
Всегда рад поддержать! :v2_clap2:
Кстати, на радостях поробовал запустить БК-шный Boulder Dash, а он не работает - вернее, загружается и стартует нормально, а вот при старте игры она тут же вылетает обратно в меню. На остальных эмуляторах нормально всё работает...
Остальные игры потестил (Десантник например) - всё шикарно бегает :)
P.S: А под реалом AO-DOS 2.1 интересно что пишет? У меня такие подозрения, что это тоже Савельев :v2_tong2:
Не надо jmp. Автозапуск делается как обычно - методом загрузки в область стека, благо он непосредственно перед самой программой, которая располагается по адресу 01000. Запуск происходит при возврате из EMT.
Мне вот тоже интересно, почему он не работает. Но с этим, я так думаю, я разберусь ещё не скоро.
esl, есть и для тебя новости: я сделал установленным по-умолчанию в 1 значение старшего бита статуса сети, новая версия на сайте. Теперь sender работает отлично, рассылает на все машины, а вот в sts иногда выскакивает ошибка "помехи" :) С чем связано - непонятно. Я уж и скорость передачи повысил, и отправку данных сделал без ожидания (по-умолчанию сокет некоторое время накапливает данные), но всё бестолку.
в эмуляторе есть поддержка винчестеров для Вектор 06ц, нельзя ли границы CHS как нибудь изменять? сечас у всех винтов количество секторов равно 63-м, а тут всего 18
Для Ориона это сделано примерно так:
В примере - 144 cyl 16 heads 16 sec.Код:hdd : cf-ide {
drive[0].image="Orion\dos-hdd.ohi"
drive[0].geometry=144C16H16S
---------- Post added at 17:09 ---------- Previous post was at 17:03 ----------
Да, кстати, если не указывать геометрию (т.е. удалить строчку), то по-умолчанию будет 1024 C 63 H 255 S.
Может быть уже все-таки завести вики какую-нибудь с описанием b2m'a? Я не представляю как кто-нибудь, кто только что нашел этот эмулятор, сможет найти как в нем чего-то настроить. Вся эта информация в форуме -- пустая трата сил, найти чего бы то ни было в ветке из 40 страниц невозможно.