<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
	<channel>
		<title><![CDATA[ПЭВМ "Агат" 7-9: Форум &mdash; Баги ИКП-ДОС]]></title>
		<link>https://forum.agatcomp.ru//viewtopic.php?id=167</link>
		<atom:link href="https://forum.agatcomp.ru/extern.php?action=feed&amp;tid=167&amp;type=rss" rel="self" type="application/rss+xml" />
		<description><![CDATA[Недавние сообщения в теме «Баги ИКП-ДОС».]]></description>
		<lastBuildDate>Tue, 06 Aug 2019 01:11:07 +0000</lastBuildDate>
		<generator>PunBB</generator>
		<item>
			<title><![CDATA[Re: Баги ИКП-ДОС]]></title>
			<link>https://forum.agatcomp.ru//viewtopic.php?pid=2952#p2952</link>
			<description><![CDATA[<p>Насколько я могу понять: FP - это сокращение от Float Point - переключение в AppleSoft-бейсик, ну а противоположная команда - INT - переключение в Integer Basic.</p><p>Обе команды выполняются DOS&#039;ом.</p><p>В то время как команда NEW - это команда бейсика.</p><p>Что конкретно они делают - точно не знаю, но предполагаю, что new - это только сброс состояния интерпретатора, в то время как FP и INT - сброс состояния как бейсика так и дос.</p><p>В Агате INT выпилен (не следует путать его с функцией &quot;INT(&quot;) , причем если в Бейсик-60 сама команда ещё есть, но она даёт загадочную (для Агата), хотя и документированную ошибку &quot;язык не доступен&quot;, то в ИКП её уже нет совсем.</p><p>А вот FP в ИКП, кроме прочего, проверяет целостность ДОСа и Бейсика в ОЗУ и может выдать ошибку &quot;Система испорчена&quot;.</p><p>Фактически, FP действительно чистит больше, чем New, причем даже много больше.<br />Это было заметно и на семёрке, ещё в Бейсик-60.<br />Например, я столкнулся со следующим приколом в ИКП:<br />в наследство от эпла ДОС имеет две входных точки: $3D0 и $3D3.<br />Первая - завершение двоичной программы - в общем-то почти аналогична последнему RTS внутри функции main(). Разве что RTS в ДОСе не всегда срабатывает (в отличие от ДОК и BTK).<br />Вторая - перезапуск ДОС.</p><p>Так вот если программа занимает диапазон памяти от $1900 (регион бейсик- программы) или использует что-то в нулевой странице, то после её завершения по $3D0 бейсик приходит в довольно нестабильное состояние:<br />например, любая синтаксическая ошибка в командной строке вполне может его убить так, что приходится выключать машину.</p><p>А если вернуть управление на $3D3, то стабильность восстанавливается, но, правда, со спецэффектом: судя по всему, ДОС пытается запустить файл &quot;HELLO&quot;, так же, как это происходит при загрузке.<br />Но поскольку у автозапуска имя хардкодед в буфере имени файла, а он меняется любыми командами<br />RUN/BRUN/LOAD... то получается, что дос пытается запустить последнюю запущенную программу, но<br />командой RUN. А так как последняя программа имеет тип B - возникает ошибка &quot;ОШ. ТИП ФАЙЛА&quot;.</p><p>Такие вот пирожки ...<br />с котятами......<br />А я теперь раздумываю, какой же выход лучше использовать для своих прог.</p><p>Вообще, ИКП - вроде бы развитие от Бейсика-60, но уж очень многое там было приведено в несколько нелогичное состояние. Или добавлено новое, но чуть-чуть недоделано.</p>]]></description>
			<author><![CDATA[null@example.com (Voldemar0)]]></author>
			<pubDate>Tue, 06 Aug 2019 01:11:07 +0000</pubDate>
			<guid>https://forum.agatcomp.ru//viewtopic.php?pid=2952#p2952</guid>
		</item>
		<item>
			<title><![CDATA[Re: Баги ИКП-ДОС]]></title>
			<link>https://forum.agatcomp.ru//viewtopic.php?pid=2951#p2951</link>
			<description><![CDATA[<p>Может, не совсем по теме, но - чем отличается FP от NEW? Когда я только начинал баловаться Басиком, мне сразу объяснили, что FP действует круче NEW, лучше очищает память. И я пользовался FP, совершенно не думая о её отличиях от NEW. И вот, увидев упоминание, спустя три десятка лет, решил спросить :)</p>]]></description>
			<author><![CDATA[null@example.com (AlexBel)]]></author>
			<pubDate>Mon, 05 Aug 2019 17:02:28 +0000</pubDate>
			<guid>https://forum.agatcomp.ru//viewtopic.php?pid=2951#p2951</guid>
		</item>
		<item>
			<title><![CDATA[Re: Баги ИКП-ДОС]]></title>
			<link>https://forum.agatcomp.ru//viewtopic.php?pid=2950#p2950</link>
			<description><![CDATA[<p>Всё, можно выдохнуть... </p><p>Это не баг в досе, это просто странное поведение + количество моих костылей стало немного плохо управляемым.</p><p>Да, ДОС при обращении к своим процедурах сохраняет и восстанавливает состояние памяти.<br />Т.е. если у вас сегментная карта 01234567 и вы делаете запрос на чтение в регион 8000.., <br />то файл прочитается именно в 4й сегмент, несмотря на то, что досу нужен сегмент C в регионе 8000...<br />Но она&nbsp; его включит на нужное время и потом, уже при фактическом чтении, выключит.</p><p>Тут, вероятно, произошло наложение моих процедур, которые должны выполняться<br />в конфигурации памяти &quot;пользователь&quot; с процедурами дос, которые работают в своей карте.</p><p>Библиотечку поправил, ещё одна новая прога закончена.</p><p>Но вылез -то этот сюрприз (и не вылезал до сих пор) именно потому, что, в зависимости <br />от некоторых действий пользователя (NEW, FP, CALL-151, BLOAD и может быть чего-то ещё)<br />программа, которую запускают по BRUN, может начать работу в разных конфигурациях памяти.<br />Я видел нередко варианты 01234567 и 0123CD67, но, вероятно, в каких-то случаях,<br />могут быть и другие варианты (может, в зависимости от версии ИКП).</p><p>Надо либо самому конфигурировать память в начале работы проги (но тогда надо знать, какие сегменты кем используются) или быть очень осторожным.</p><p>Провозился с этим багом почти весь день... Отпуск, называется :( Главное - пока не разберешся же - ни на что другое уже переключиться не можешь. Завтра будет расслабон - пойду в гараж, буду маслосъёмные колпачки менять. Там хоть сильно думать не надо :) Мот дымит, как будто стал двухтактным.</p>]]></description>
			<author><![CDATA[null@example.com (Voldemar0)]]></author>
			<pubDate>Mon, 05 Aug 2019 15:00:48 +0000</pubDate>
			<guid>https://forum.agatcomp.ru//viewtopic.php?pid=2950#p2950</guid>
		</item>
		<item>
			<title><![CDATA[Re: Баги ИКП-ДОС]]></title>
			<link>https://forum.agatcomp.ru//viewtopic.php?pid=2949#p2949</link>
			<description><![CDATA[<p>Всё ж хорошо было, и вот опять оно вылезло.</p><p>Что делает следующая команда на девятке ?</p><p>bload test,A$8000</p><p>Она как бы читает файл в область $8000.<br />Она таки его читает, да.</p><p>Вопрос: а где эта область находится в физической памяти ? Мы ж помним - у девятки память сегментирована.<br />ДОС/Бейсик/Сисмон очень любят её переключать. По поводу и без.</p><p>Загрузите ИКП и поглядите одним глазком в эмуляторе: карта памяти во время мигания курсора в командной строке будет простой: 0 1 2 3 4 5 6 7. Т.е. физическая память соответствует логической.<br />Потом сделайте call-151, и из сисмона выполните, например, команду &quot;L&quot;.<br />Память внезапно переключится&nbsp; в состояние 0123CD67 (на адресах 8000-BFFF подключает физическая память $18000.$1BFFF).<br />Это видно только в эмуляторе, потому что сисмон на запрос C100.C17F скажет что всё окей, 01234567.<br />Это легко проверить: попробуйте переключить банк C14C:0, а потом прочитайте снова C100.C17F - опять<br />будут лакированные 01234567. Плевать сисмон хотел на ваши переключения, он всё ставит обратно.</p><p>Но проблема вот в чём: эти переключения происходят внезапно. Т.е. возврат в бейсик на самом деле не возвращает память в дефолтное состояние. Он помнит какое оно включено&nbsp; и даже если что-то переключает, всё возвращает обратно. Так же, обычно, поступает и ДОС. И только по команде FP память реально встаёт в состояние 01234567. До следующих фантазий то ли сисмона, то ли кого-то ещё.</p><p>Получается, что если вы используете сисмон, бейсик, дос, вы вообще-то не знаете, какой сегмент вам вернётся подключенным. Но bload будет срабатывать именно на текущий выбранный сегмент... </p><p>Как-то так. Я вряд ли буду копать эту проблему до причин, скорее всего просто буду подгонять workaround.</p><p>--=--</p><p>Объясню, почему это может быть важно:<br />Если бы в доках на систему было чётко заявлено: любые вызовы приводят к случайным переключениям<br />контроллера ОЗУ, восстаналивайте свою карту памяти - это было бы понятно.<br />Если бы в доках на систему было чётко заявлено: любые вызовы возвращают состояние памяти (или не изменяют его) - тоже понятно.</p><p>Но в доках не сказано вообще ничего.</p><p>Тогда начинаем гадать и пробовать. При многих вызовах состояние памяти, обычно, восстанавливается.<br />Т.е. сама механниках сохранения/восстановления есть.<br />И это очень правильно: если моя прога, например, выполняется из адресов $8000 или выше, то при несохранённом состоянии возврат управления на этот регион просто попадёт на какой-то мусор, вместо моей программы. Но, как показала практика, срабатывает это восстановление, почему-то не всегда и от чего-то зависит.</p><p>Т.е. я , например, в своей программе читаю файл в буфер $6000..$9000, а потом обнаруживаю, что через несколько операций регион 8000-9000 заполнен чем-то не тем, чем надо.<br />Сам я памятью не управляю, расчитываю на то, что она изначально включена в какое-то фиксированное состояние и почти не трогаю его (за исключением обращения к ИКП-ДОС - она без этого не умеет). Но я широко использую обращения к сисмону, и где-то оно там, видимо , что-то подгаживает. А может это RWTS... А может кто-то ещё.</p>]]></description>
			<author><![CDATA[null@example.com (Voldemar0)]]></author>
			<pubDate>Sun, 04 Aug 2019 16:49:37 +0000</pubDate>
			<guid>https://forum.agatcomp.ru//viewtopic.php?pid=2949#p2949</guid>
		</item>
		<item>
			<title><![CDATA[Re: Баги ИКП-ДОС]]></title>
			<link>https://forum.agatcomp.ru//viewtopic.php?pid=1857#p1857</link>
			<description><![CDATA[<p>Объехал в итоге этот баг чтением VTOC (17/0) в свой буфер (память дополнительную не нужно, так как для драйвера ФС всё равно нужно выделить два секторных буфера). Запрос делаю без флажка отложенности, так что дочитывает всё из очереди и вроде без внезапных сюрпризов. Сделал это только для команды чтения файла, с записью проблем нет. Тесты проходят.</p>]]></description>
			<author><![CDATA[null@example.com (Voldemar0)]]></author>
			<pubDate>Tue, 10 Apr 2018 01:40:58 +0000</pubDate>
			<guid>https://forum.agatcomp.ru//viewtopic.php?pid=1857#p1857</guid>
		</item>
		<item>
			<title><![CDATA[Re: Баги ИКП-ДОС]]></title>
			<link>https://forum.agatcomp.ru//viewtopic.php?pid=1850#p1850</link>
			<description><![CDATA[<div class="quotebox"><cite>USR пишет:</cite><blockquote><p>Вот я чувствовал, что с этими очередями обязательно будут косяки.</p></blockquote></div><p>Решение одной проблемы всегда порождает две новых :)</p>]]></description>
			<author><![CDATA[null@example.com (Voldemar0)]]></author>
			<pubDate>Mon, 09 Apr 2018 00:32:19 +0000</pubDate>
			<guid>https://forum.agatcomp.ru//viewtopic.php?pid=1850#p1850</guid>
		</item>
		<item>
			<title><![CDATA[Re: Баги ИКП-ДОС]]></title>
			<link>https://forum.agatcomp.ru//viewtopic.php?pid=1848#p1848</link>
			<description><![CDATA[<div class="quotebox"><cite>Voldemar0 пишет:</cite><blockquote><p>Привет!</p><p>А вот неожиданность: ошибка в драйвере RWTS.<br />Не частая, не редкая.<br />Суть в обработке очереди команд.</p></blockquote></div><p>Вот я чувствовал, что с этими очередями обязательно будут косяки.</p>]]></description>
			<author><![CDATA[null@example.com (USR)]]></author>
			<pubDate>Sun, 08 Apr 2018 16:28:54 +0000</pubDate>
			<guid>https://forum.agatcomp.ru//viewtopic.php?pid=1848#p1848</guid>
		</item>
		<item>
			<title><![CDATA[Re: Баги ИКП-ДОС]]></title>
			<link>https://forum.agatcomp.ru//viewtopic.php?pid=1847#p1847</link>
			<description><![CDATA[<p>Поймал себя на том, что захожу на форум чаще чем обычно именно чтоб посмотреть нет ли продолжения в темах про ДОСы и бейсики....</p>]]></description>
			<author><![CDATA[null@example.com (garnizon)]]></author>
			<pubDate>Sun, 08 Apr 2018 05:41:47 +0000</pubDate>
			<guid>https://forum.agatcomp.ru//viewtopic.php?pid=1847#p1847</guid>
		</item>
		<item>
			<title><![CDATA[Баги ИКП-ДОС]]></title>
			<link>https://forum.agatcomp.ru//viewtopic.php?pid=1846#p1846</link>
			<description><![CDATA[<p>Привет!</p><p>Ещё этому ДОСу косточки пока не мыли. Бейсику ИКП-шному мыли, но ведь с ним вместе живёт и ДОС.</p><p>Про мороку с драйвером файловой системы я писал и писать буду в соседней ветке.</p><p>А вот неожиданность: ошибка в драйвере RWTS.<br />Не частая, не редкая.<br />Суть в обработке очереди команд.</p><p>Логика различных агатовских драйверов с отложенным исполнением, обычно, похожа. Очередной запрос проверяется на следующее:<br />1) Есть ли задания в очереди ?<br />2) Касается ли этот запрос текущего трека (того, над которым сейчас висит головка) ?<br />3) Является ли запрос отложенным ?<br />4) Был ли уже отложенный запрос на данный сектор ?<br />Если запрос касается трека очереди либо очередь пуста, запрос ставится в очередь.<br />Если нет - то очередь уходит на исполнение, очищается и запрос добавляется к пустой очереди.</p><p>Косяк в пункте 4: он проверяется тут:</p><div class="codebox"><pre><code>0FA9 -   A0 05 ..   &quot; .&quot;    LDY   #05
0FAB -   B1 48 ..   &quot;1h&quot;    LDA   (48), Y
0FAD -   AA .. ..   &quot;*&quot;     TAX   
0FAE -   BD 00 07   &quot;=..&quot;   LDA   0700, X
0FB1 -   F0 05 ..   &quot;ð.&quot;    BEQ   0FB8
0FB3 -   20 82 0C   &quot;...&quot;   JSR   0C82</code></pre></div><p>по адресу (48),5 задаётся номер сектора, а в таблице по адресу 700 лежит массив операций, которые нужно выполнить для каждого сектора. Если для запрошенного сектора не было отложенных запросов - всё хорошо. Иначе запускается процедура 0C82. А косяк в том, что она в регистре X ожидает номер слоты, умноженный на $10. А вовсе не номер сектора. Дальше залип и завис.</p><p>Обычно, такой ситуации не бывает: всякие дисковые редакторы не запрашивают отложенных операций, а внутри файлового драйвера отложенные операции вызываются только для не-последнего сектора файла (но об этом чуть позже). Поэтому эту ошибку не заметили.</p><p>Проверить просто: постройте файл, у которого в TSL будет указан несколько раз один и тот же сектор. BLOAD/LOAD в ИКП зависнет либо будут какие-нибудь непредсказуемости. Учтите, что число секторов в каталоге должно быть больше или соответствовать числу секторов в TSL.</p><p>-=-</p><p>А как на неё вышел я?<br />Тут дело в логике работы стандартного процессора комстроки и моего врапера:<br />- стандартный процессор на операции чтения файла LOAD/BLOAD выполняет такую последовательность вызовов (для B-типа, например):<br />&nbsp; 1) fopen, fclose. Здесь проверяется тип файла (соответствие запрошенному B).<br />&nbsp; 2) fopen, fread(2 байта) - смещение, fread(2 байта) - размер, fread(размер), fclose.<br />Т.е. процессор знает размер файла и запрашивает только нужное число байт.<br />- у меня враппер действует по другому:<br />&nbsp; fopen, fread($FF00 байт), fclose.<br />fread даёт ошибку &quot;чтение после конца данных&quot;, но меня это не колышет, я могу узнать фактическое число прочитанных байт из возвращаемого file control block.<br />Проблема в том, что в file driver есть некоторый косячок: он все запросы к RWTS на чтение блоков данных файла посылает с флагом &quot;отложенный&quot;. Кроме последнего запроса, который считается последним исходя из _запрошенного_ объёма данных. И не учитывает, что TSL-то уже закончился, т.е. достигнут EOF. Ну а в fclose никто и не подумал вызвать закрытие очереди (а зачем ?).</p><p>Хотел объехать это, просто вызвав сброс очереди перед fclose, но, похоже, явной команды для этого RWTS не предусматривает и, в любом случае, проверяет поле номера сектора. А дальше срабатывает ошибка в RWTS и он зависает. Можно попробовать менять номер сектора на любой другой или вообще запрашивать другой трек, но костыль-то получается знатный...</p><p>PS Я прям чувствую, как мозги теплеют после 4-8 часов работы над такими задачками.<br />В следующий выходной надо нафиг это всё бросать и в гараж, уже снег стает совсем, выкачу мопедку, поеду весенние говны месить куда нибудь.</p>]]></description>
			<author><![CDATA[null@example.com (Voldemar0)]]></author>
			<pubDate>Sat, 07 Apr 2018 17:46:32 +0000</pubDate>
			<guid>https://forum.agatcomp.ru//viewtopic.php?pid=1846#p1846</guid>
		</item>
	</channel>
</rss>
