Да, SAA в ветке TSL работает - не хватает только бегунка громкости.
Вид для печати
Да, SAA в ветке TSL работает - не хватает только бегунка громкости.
Скачал тестовую версию эмуля с поддержкой 128К-ROM для ATM-1 по ссылке, данной в другой ветке обсуждения. Не пашет. При попытке выбрать вторую половинку ПЗУ через "честный" OUT значения %00000100 в порт #FDFD (а точнее, вывод в бейсике OUT 65021,4) получаем зависание эмуля (именно эмуля, а не эмулируемого компа - т.е. даже флэш курсора мерцать перестает), а при попытке ресета - выброс в винду с ошибкой.
Для проверок работоспособности кидаю 128Кб-прошивку для АТМ-1, изготовленную исключительно для опытов для определения работоспособности расширенного ПЗУ (т.е. ничего нового там пока нет).
Вложение 50381
Что она из себя представляет и как с ней работать:
Нижние 64Кб - это стандартная прошивка с BIOS 1.041R (которую я выкладывал на днях), а верхние это палалледбно наложенные по аналогии с нижними страницами - вместо странички с CP/M - место забито FF, бейсики 48 и 128 аналогично параллельно стоят на своих местах. А вот TR-DOS иное - если в нижних страницах стоит стандартная для прошивок АТМ-1 версия 5.03, то в верхних страницах я поставил версию 5.04.
А так можно проверить рабочесть 128К ПЗУ через эту прошивку:
Из стартового меню с картой (даже при нынешнем глюке в эмуле по ресету в него выходим без проблем) выходим в бейсик-48 (хотя можно и в бейсик-128, просто так проще). Блокировка порта #7FFD при этом неважна - порт #FDFD при любом раскладе должен функционировать.
А далее в бейсике можем выбрать любую половинку ПЗУ:
OUT 65021,0 - нижняя (стандартная) половинка ПЗУ
OUT 65021,4 - верхняя половинка ПЗУ
При этом после выбора каждой половинки делаем USR 0 и заходим в TR-DOS через USR 15616.
Если все работает правильно, то после OUT 65021,0 мы должны попасть в TR-DOS v5.03, а после OUT 65021,4 - в TR-DOS v5.04
Вот такие дела. Жду результатов! :v2_dizzy_bye:
Да, эту багу мы заметили на днях. Какой-то регрешн из свежих. Пофиксается.
Пофиксалось.
Фигово пофиксалось. ну да , тактов 12 ты подвинул. но из 10 раз запуска одного и того же файла, 3-5 раз точно на такт туда сюда гуляет. и не на одном таком файле.
Все познается в сравнении. со снапшотами - так и не работают, не все, но некоторые - точно.. (если что - я их просто драгдропаю на эмуль). ну еще нашел. Там просто не хватает тактов.
out(c),0 надеюсь по тактам то не изменился в меньшую сторону?
Регрешн пролез, когда добавилась поцикловая эмуляция ОЗУ. Делал это не я, потому сходу не асиливаю сказать, где сломалось. Квик-н-дирти хак не помог, но и не рассчитывалось особо.
На пентеве ОЗУ работает в циклах, частота которых 7МГц, следовательно в строке их 448. Циклы разделены между:
- цпу
- видео
- ТСУ (с видеоконтроллером никак не связан, отдельный девайс)
- ДМА.
Каждый девайс может обратиться к ОЗУ в порядке своей очереди. Например, ДМА имеет наименьший приоритет. Все было кое-как, пока к ДМА не прикрутили INT. Он приходит по окончанию транзакции, а следовательно в эмуляции необходимо учесть всю цепочку событий, иначе невозможно этот инт сгенерить вовремя.
Поэтому сейчас все девайсы, потенциально могущие запрашивать ОЗУ, обрабатываются после каждого машцикла цпу, в порядке приоритета. Например, цикл RM (чтение из ОЗУ, 3 такта, название условное). Если процессор работает на частоте большей, чем частота циклов ОЗУ, он тормозится. Его клок "растягивается" до момента, когда ОЗУ может выдать данные. В эмуле к счетчику тактов прибавляется некая константа, а счетчик выравнивается на некоторую фазу (напомню, что счетчик дробный: 3.5МГц до запятой, и 8 бит - после). К окончанию машцикла счетчик тактов содержит новою "отметку времени" в котором живет проц. Мы знаем, сколько циклов ОЗУ прошло за период машцикла. Если проц работает на 7МГц, он не тормозится, и в этом самом простом случае прошло 3 такта = 3 цикла ОЗУ, из которых проц отхавал 1. Т.е. осталось 2. После этого мы вызываем видео и смотрим, были ли за данный период машцикла обращения видеоконтроллера, если были, отнимаем их. Потом вызываем TSU, отнимаем его циклы (если есть свободные еще циклы); если ТСУ неактивен - лесом. И только тогда вызываем ДМА и отдаем ему все, что упало со стола. И вот тогда мы только сможем узнать, когда закончится транзакция ДМА и когда нам формировать прерывание.
Как несложно догадаться, вся это прелесть оформлена в виде FSM не первой простоты и быстродействия.