Поправил в эмуляторе подсчет тактов. Сейчас такты ПДП считаются точно (по крайней мере в том тесте):
Скрытый текст
[свернуть]
На днях выложу обновленную версию.
Да нет эти параметры сами по себе не дадаут выравнивание
они просто сделают так что все фреймы будут идти одинаковыми
а вот какой будет из 3-х вариантов фрейма...
нужна будет еще процедура которая определит в каком мы сейчас фрейме (думаю простой счетчик насчитает разное число в каждом из них...)
и сбросит вг75 так чтобы все устаканилось так как нам нужно
- - - Добавлено - - -
а в Апогее INTE не заведен на бипер???
- - - Добавлено - - -
А кто нибудь может подкинуть сохранялку в RK для sjasm-а??
дето она проплывала тут по моему...
По поводу работу ПДП в РК.
Пересылка байт из ОЗУ в ВГ75 происходит следующим образом. После торможения процессора, контроллер ПДП выставляет адрес на шину адреса и формирует сигнал чтения для ОЗУ через выход /MEMW. Появившиеся данные на шине данных ПДП проталкивает в ВГ75 сигналом /IORD. То есть по факту ВТ57 в себя не загружает эти данные, они просто находятся на шине данных.
Подробнее можно прочитать в книжке "Домашний компьютер" от авторов РК, на стр. 45.
SegaBoy, ПДП не только в РК так делает, он это делает @design. Смысл в том, что ПДП при приходе DRQ (будем считать, что канал настроен и прочее) запрашивает шину у ЦП, и как только ЦП подтвердит, что шина свободна, ПДП формирует полный адрес памяти для доступа и активирует шины управления памятью MEMRD/MEMWR а так же подтверждает доступ устройству DACK. Устройство изначально настроено так, чтобы при приходе DACK сразу выдавать данные на шину либо принимать их с нее, в зависимости от направления передачи. У устройства могут быть несколько DACK и, соответственно, несколько DRQ, которые могут быть настроены на разные режимы. К примеру популярная SB16 использует 2 DMA канала, одна для 8ми битной передачи и вторая для 16ти битной. Либо сразу для дуплексного режима (одновременно воспроизведение и запись).
Таким образом да, ПДП выступает в качестве арбитра, который связывает приемник и передатчик на шине, минуя процессор. Более сложный ПДП умеет копирование памяти, для этого он имеет регистр хранения данных и формирует он 2 операции (одну запись и одно чтение).
Но особенность работы ПДП 8257 именно в РК заключается в особом подключении выводов MEMRD/MEMWR и IORD/IOWR самого контроллера. Поэтому операция при программировании выглядит не логичной.
Но это все только из-за упрощения схемы самого РК, логику работы самого ПДП оно не нарушает.
Последний раз редактировалось HardWareMan; 15.03.2017 в 17:27.
С любовью к вам, Yandex.Direct
Размещение рекламы на форуме способствует его дальнейшему развитию
HardWareMan, спасибо!
Ну да, я это и имел в виду. Полезно иногда проговаривать в слух очевидные для одних вещи, не очевидные для других. На форуме полно тем, где многие нюансы раскрыты не до конца и максимум предлагается пойти и почитать. По-любому интерес к ВГ75 и ВТ57 возникнет не один раз, а читать книжки не всегда получается с пониманием. Даташиты и мануалы же везде разложены, но язык там такой непривычный, что люди постоянно переспрашивают - как это работает = ))
Не понял, что имеется в виду по "кривым" заголовком? Если отсутствие в конце файла контрольной суммы, то просто добавьте в конец что-то типа:
db 00h, 0e6h, 00h, 00h
И файл будет грузиться в любом эмуляторе. Пусть даже выдавая ошибку КС.
А что касается Emu80, я так понял, что желательно убрать проверку наличия КС при загрузке из командной строки?
ладно тогда напишу сам и потом выложу...
Подсчет контрольной суммы я уже выкладывал в составе исходника позавчера, честно говоря не думал что для кого то это может быть проблемой.
Раз такое дело положу темплейт полностьюКод:cs = 0 lua pass3 mems=_c("binBegin") meme=_c("binEnd") cs=0 for i=mems,meme-2 do cs=(cs+sj.get_byte(i)*257) end cs=(cs-cs%256+(cs+sj.get_byte(meme-1))%256)%65536 _pl("cs = "..cs) endlua display cs db 0,0,#e6,cs/#100,cs&#ff
Скрытый текст
Код:device zxspectrum48 org #0000 rkBegin db progBegin/#100,progBegin&#ff db (progEnd-1)/#100,(progEnd-1)&#ff binBegin disp #0000 progBegin ;------------------------------------------- ; code here jp $ ;------------------------------------------- progEnd ent binEnd cs = 0 lua pass3 mems=_c("binBegin") meme=_c("binEnd") cs=0 for i=mems,meme-2 do cs=(cs+sj.get_byte(i)*257) end cs=(cs-cs%256+(cs+sj.get_byte(meme-1))%256)%65536 _pl("cs = "..cs) endlua display cs db 0,0,#e6,cs/#100,cs&#ff rkEnd savebin "prog.rk",rkBegin,rkEnd-rkBegin[свернуть]
Последний раз редактировалось krt17; 15.03.2017 в 22:09.
Эту тему просматривают: 1 (пользователей: 0 , гостей: 1)