В стандартных входах РК есть п/п-мма ввод массива, которая полностью реализует директиву I. Не знаю как в клонах, а в самом РК это работает так. Сначала вызывается подпрограмма ввода двух байтов с поиском синхробайта (в роли которого E6 или его побитовая инверсия). Она пропускает любое число байтов, любых кроме E6 (или его инверсии). Любые байты передавать можно, если только из двух соседних байтов при их сдвигах в аккумуляторе не возникнет Е6.Сообщение от NEO SPECTRUMAN
Как только синхробайт найден, он тоже откидывается и дальше всё работает синхронно, - вводятся заказанные два байта. Затем вызывается подпрограмма ввода 2-х байтов уже без поиска синхробайта. Это будут 4 байта адресов загрузки. Далее зыпускается цикл ввода байтов до тех пор, пока текущий адрес ввода не станет равен конечному.
И вот тогда наступает момент, который Вас интересует. РК86 снова вызывает подпрограмму ввода 2-х байтов с поиском синхробайта. Таким образом, число байтов между концом блока и синхробайтом Е6 может быть любым, при условии, что среди этого потока битов нет байта Е6. Мне кажется, что байт 0 перед Е6 тоже не обязателен. Происходит сдвиг принятых битов, пока не возникнет Е6. Так что, если идут 2 байта 60 и 0Е, то по ним тоже произойдёт синхронизация. Это из-за того, что в этом формате нет побайтовой синхронизации (а в формате MSX есть). Именно поэтому перед синхробайтом выдают длинный пилотон, т.е блок из 256 (а иногда и более) нулей, чтобы человек услышав звук, мог нажать на <ВК>. Если пилотон не выдавать, а сразу начинать передачу с Е6, то шумы с выхода МГ могут сформировать ложный синхробайт.
Так, т.е с любым числом нулей до СБ контрольной суммы и любой паузой, сделано в РК86. Но в ОРИОНЕ претендующем на МГ-совместимость - не так. Там паузу вообще нельзя ввести, сразу возникает ТАЙМ-АУТ и уход на подпрограмму ERR_MG (ошибки чтения с МГ). И ОРИОН ожидает ровно 3 байта, причём в данном случае, точно не обязательно 2 нулевых и третий синхробайт Е6. Эти 3 байта могут быть любыми, т.к ОРИОН не сихронизируется по синхробайту, чтобы считать КС, он просто пропускает 3 байта и считывает 2 следующих, которые и оказываются контрольной суммой.
В СПЕЦИАЛИСТЕ контрольная сумма примыкает прямо к блоку данных. И никакой новой синхронизации по Е6 не делается. КС является как-бы частью блока, в смысле, что вводится с той же синхронизацией, отчего пауза перед КС недопустима.
Кстати, блок с КС может вводиться с инверсией. То есть вторым синхробайтом может служить байт являющийся побитовой инверсией E6 (это 19) и КС тогда надо тоже передавать в инверсии. Такой трюк сработает на РК86, т.к при второй синхронизации будет правильно поставлен флаг инверсии сигнала с МГ. А вот в ОРИОНЕ такой трюк не пройдёт. Т.о, это способ иметь формат РК86 несовместимый с ОРИОНОМ. Впрочем, для этого даже не надо исхитряться, достаточно добавить на один ноль больше или меньше перед КС.
Думаю, что в РК86 введётся и без (двух или иного числа) нулевых байтов между блоком и Е6, но пусть кто-нибудь проверит. Я могу сделать такую запись, если есть эмулятор, умеющий делать запись.
Я тут недавно узнал, что можно вводить МГ-записи в РК86 без гашения изображения на экране. Так что никто не хочет сделать для РК86 новый "монитор", где экран не будет гаснуть? Это теперь можно сделать, т.к пару месяцев назад в теме "РК86 на Z80" я освободил в ПЗУ РК86 КР580, если верно помню, ~80 ячеек. Этого должно Вам хватить на модернизацию подпрограммы чтения байта с МГ. Чтобы это сделать, надо сначала "кракнуть" коммерческую защиту от копирования и извлечь из неё подпрограмму чтения.




Ответить с цитированием