<?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=534</link>
		<atom:link href="https://forum.agatcomp.ru/extern.php?action=feed&amp;tid=534&amp;type=rss" rel="self" type="application/rss+xml" />
		<description><![CDATA[Недавние сообщения в теме «Применение платы палитр в софте.».]]></description>
		<lastBuildDate>Thu, 21 Aug 2025 13:36:23 +0000</lastBuildDate>
		<generator>PunBB</generator>
		<item>
			<title><![CDATA[Re: Применение платы палитр в софте.]]></title>
			<link>https://forum.agatcomp.ru//viewtopic.php?pid=7972#p7972</link>
			<description><![CDATA[<p>Вот как-то так:</p><div class="codebox"><pre><code>5 BUF%=$1F00

100 *$30A:

REM   Получаем адрес таблицы параметров RWTS
110 ! JSR $3E3
120 ! STA $E1
130 ! STY $E0

REM   Сохраняем состояние 5 сегмента ОЗУ
140 ! LDX $C150

REM   Вытаскиваем из таблицы параметров адрес последнего сектора, запрошенного у RWTS
150 ! LDY #8
160 ! LDA ($E0),Y
170 ! PHA
180 ! INY
190 ! LDA ($E0),Y
200 ! STA $E1
210 ! PLA
220 ! STA $E0

REM   Переливаем последний прочитанный сектор в BUF%
230 ! LDY #0
240 ! STA $C15D
250 ! L:LDA ($E0),Y
260 ! STA BUF%,Y
270 ! INY
280 ! BNE L

REM   Восстанавливаем состояние 5 сегмента ОЗУ
290 ! STA $C100,X

REM   Fin
300 ! RTS
310 !:

500 HOME
510 ? &quot;Выберите файл-картинку:&quot;
520 ?:?CHR$(4)&quot;BLOAD?,A$2000&quot;
530 CALL $30A

600 ? CHR$(30+128) : ?
610 IF PEEK(BUF% + 4) &lt;&gt; ASC(&quot;V&quot;) THEN 900
620 IF PEEK(BUF% + 5) &lt;&gt; ASC(&quot;R&quot;) THEN 900

700 FOR L = 4 TO 15
710   FOR C = 0 TO 15
720     S% = PEEK(BUF% + L * 16 + C)
730     ? CHR$(S%);
740   NEXT C
750   ?
760 NEXT L
770 STOP

900 ? &quot;В этом файле нет VR-расширения&quot;
910 STOP</code></pre></div>]]></description>
			<author><![CDATA[null@example.com (Voldemar0)]]></author>
			<pubDate>Thu, 21 Aug 2025 13:36:23 +0000</pubDate>
			<guid>https://forum.agatcomp.ru//viewtopic.php?pid=7972#p7972</guid>
		</item>
		<item>
			<title><![CDATA[Re: Применение платы палитр в софте.]]></title>
			<link>https://forum.agatcomp.ru//viewtopic.php?pid=7971#p7971</link>
			<description><![CDATA[<p>Т.е. после загрузки файла еще одно обращение к диску для чтения хвоста?</p>]]></description>
			<author><![CDATA[null@example.com (garnizon)]]></author>
			<pubDate>Mon, 18 Aug 2025 20:47:15 +0000</pubDate>
			<guid>https://forum.agatcomp.ru//viewtopic.php?pid=7971#p7971</guid>
		</item>
		<item>
			<title><![CDATA[Re: Применение платы палитр в софте.]]></title>
			<link>https://forum.agatcomp.ru//viewtopic.php?pid=7970#p7970</link>
			<description><![CDATA[<p>А может быть вообще по другому зайти: когда читается файл, последним будет прочитан этот последний сектор. Значит в таблице параметров RWTS будет его адрес (как Т/С так и адрес в ОЗУ). Адрес таблицы параметров RWTS в любом ДОСе из числа DOS3.3 и его наследников можно узнать через вектора в регионе $3Fx.</p>]]></description>
			<author><![CDATA[null@example.com (Voldemar0)]]></author>
			<pubDate>Tue, 12 Aug 2025 17:06:41 +0000</pubDate>
			<guid>https://forum.agatcomp.ru//viewtopic.php?pid=7970#p7970</guid>
		</item>
		<item>
			<title><![CDATA[Re: Применение платы палитр в софте.]]></title>
			<link>https://forum.agatcomp.ru//viewtopic.php?pid=7968#p7968</link>
			<description><![CDATA[<p>&gt; ONERR GOTO</p><p>У этой штуки очень много приколов и хитростей (один только доступ к статусам через PEEK чего стоят). Про неё уже где-то писали интересное, в 90-х (возможно, у Волкова или у Серкова).</p><p>п1 как бы даже не удивляет. Не тот уровень разработки, а виласапет новый.<br />&quot;Танк секретный, физики могли не знать&quot; :)</p><p>п2 ... так же как и добавить новых багов.</p><p>Понятно, что раз они перетаскивали всё на новые адреса, исходники у них были.<br />И мы даже примерно представляем себе - какие.<br />Не то, чтобы подробные, но это не мешало их править во все стороны.</p><p>В ИКП, например, команда BLOAD умеет читать текстовые файлы. В DOS3.3 такое даже вообразить невозможно было.</p><p>----</p><p>Однажды, когда нибудь, я причешу все эти исходники и разберу их по частям.<br />Но не в этом десятилетии, видимо :(</p>]]></description>
			<author><![CDATA[null@example.com (Voldemar0)]]></author>
			<pubDate>Fri, 18 Jul 2025 04:25:38 +0000</pubDate>
			<guid>https://forum.agatcomp.ru//viewtopic.php?pid=7968#p7968</guid>
		</item>
		<item>
			<title><![CDATA[Re: Применение платы палитр в софте.]]></title>
			<link>https://forum.agatcomp.ru//viewtopic.php?pid=7967#p7967</link>
			<description><![CDATA[<div class="quotebox"><cite>Voldemar0 пишет:</cite><blockquote><p>И после любого IF с проверкой ошибочной ситуации стоит просто LDA#&lt;код ошибки&gt; / JMP на эту точку.</p></blockquote></div><p>Кажется, все сложнее. Например, в коде LOAD есть принудительное закрытие всех открытых файлов, поэтому RUN и LOAD будут работать корректно.</p><p>К своему стыду обнаружил, что никогда не читал файлы на Агатовском Бейсике :) Пришлось повозиться с написанием тестовой программки, которая открывает 4 файла неправильных типов. Без ONERR GOTO этого не сделать (программа вылетает), но RESUME передает управление в то место, где возникла ошибка, поэтому файл начинает открываться до бесконечности. Плюс, у ONERR GOTO какие-то странные отношения с циклом FOR. Но ничего, выкрутился. Программка тоже отработала корректно - открытые файлы не накапливаются. По крайней мере, у OPEN проблем нет.</p><p>Интересный момент - это то, что в тексте кода BLOAD есть комментарий &quot;(CHANGED 11/1/78 FOR TYPE MISMATCH)&quot;. Дело в том, что к 1 ноября 1978 разработчик ДОС над ней больше работал - он еще летом передал код Apple. То есть, эту проверку типов добавляли программисты Apple. И, видно, что-то пошло не так :)</p><p>И еще два наблюдения навеянные этой багой:<br />1) Если в современных операционках написать программу на C, которая открывает два раза один и тот же файл, то получится два разных дескриптора. Используя их, можно, например, читать файл из разных точек. Но если попытаться то же самое сделать в ДОС (например, через вызовы файлового менеджера), то в момент второго вызова OPEN ранее открытый файл закроется и первый дескриптор станет недействителен. То есть в ДОС в принципе другой подход (один файл - один дескриптор).</p><p>2) Файл-менеджер для ИКП явно переделывали - структуры данных для открытых файлов больше по размеру и устроены иначе. То есть, исходники у разработчиков были достаточно подробные и поправить баг они в теории могли.</p>]]></description>
			<author><![CDATA[null@example.com (avivanov76)]]></author>
			<pubDate>Wed, 16 Jul 2025 20:41:49 +0000</pubDate>
			<guid>https://forum.agatcomp.ru//viewtopic.php?pid=7967#p7967</guid>
		</item>
		<item>
			<title><![CDATA[Re: Применение платы палитр в софте.]]></title>
			<link>https://forum.agatcomp.ru//viewtopic.php?pid=7966#p7966</link>
			<description><![CDATA[<p>Возможно, где-то в ДОСе есть код, который называется как-то вроде &quot;вывод сообщения об ошибке и завершение операции&quot;. И после любого IF с проверкой ошибочной ситуации стоит просто LDA#&lt;код ошибки&gt; / JMP на эту точку. В результате рессурсы, которые должны были быть освобождены при нормальном завершении, остаются брошенными.</p><p>Если так, то не только ошибка &quot;Mismatch type file&quot; будет приводить к незакрытым файлам, но и другие, связанные с открытием/закрытием файлов. LOAD, RUN, OPEN, READ, WRITE...</p><p>Но, в рамках топика, это всё равно возвращает к тому, что нужно выкопать указатель на последний выделенный блок и работать от него. Либо воткнуть в начало проги &quot;MAXFILES 3&quot;.</p>]]></description>
			<author><![CDATA[null@example.com (Voldemar0)]]></author>
			<pubDate>Tue, 15 Jul 2025 02:15:57 +0000</pubDate>
			<guid>https://forum.agatcomp.ru//viewtopic.php?pid=7966#p7966</guid>
		</item>
		<item>
			<title><![CDATA[Re: Применение платы палитр в софте.]]></title>
			<link>https://forum.agatcomp.ru//viewtopic.php?pid=7963#p7963</link>
			<description><![CDATA[<p>Баг, похоже, застарелый :)<br />Он есть в Apple DOS 3.3, он есть в ДОС, который идет с Бейсик-60, он есть в ALV DOS, ИКП-7, ИКП-9 и ИКП-90 (который с поддержкой сети).</p>]]></description>
			<author><![CDATA[null@example.com (avivanov76)]]></author>
			<pubDate>Mon, 14 Jul 2025 20:08:14 +0000</pubDate>
			<guid>https://forum.agatcomp.ru//viewtopic.php?pid=7963#p7963</guid>
		</item>
		<item>
			<title><![CDATA[Re: Применение платы палитр в софте.]]></title>
			<link>https://forum.agatcomp.ru//viewtopic.php?pid=7962#p7962</link>
			<description><![CDATA[<p>Значит надо порыться и посмотреть, во всех ли версиях Бейсик-ИКП-9 есть эта ошибка.<br />А заодно и по другим архитектурам и НЕ-ИКП тоже пошерстить.<br />Даже, наверное, стоило бы начать от эпловского бейсика/ДОСа.<br />Может к ним есть упоминание такой проблемы ?</p>]]></description>
			<author><![CDATA[null@example.com (Voldemar0)]]></author>
			<pubDate>Mon, 14 Jul 2025 07:41:55 +0000</pubDate>
			<guid>https://forum.agatcomp.ru//viewtopic.php?pid=7962#p7962</guid>
		</item>
		<item>
			<title><![CDATA[Re: Применение платы палитр в софте.]]></title>
			<link>https://forum.agatcomp.ru//viewtopic.php?pid=7961#p7961</link>
			<description><![CDATA[<p>Надо бы Игоря спросить, какой ему нужен результат.<br />Есть несколько вариантов что с этой ошибкой делать:<br />1) с кодом ничего не делать, просто повесить предупреждение, что при попытке загружать вместо картинок какие-то другие файлы программа сломается вдребезги пополам, поэтому лучше и не пытаться. Самый простой вариант.</p><p>2) попытаться найти указатель на последний используемый буфер. Мне этот вариант не очень нравится, потому что ошибочно выбранный файл остается открытым. А если пользователь три раза ошибется, то программа все равно сломается.</p><p>3) попробовать обработать ошибку и закрыть файл. Как оказалось, команда MAXFILES принудительно закрывает все открытые файлы, поэтому можно добавить такой обработчик ошибок:<br /></p><div class="codebox"><pre><code>96 ONERR GOTO 5000

5000 ER = PEEK(222)
5010 IF ER = 6 THEN STOP
5020 IF ER &lt;&gt; 13 THEN GOTO 5050
5030 PRINT &quot;НЕВЕРНЫЙ ТИП ФАЙЛА&quot;: GET A$
5040 PRINT: PRINT CHR$(4)&quot;MAXFILES 3&quot;
5050 RESUME</code></pre></div><p>В ячейке 222 лежит код ошибки ДОС. В строке 5010 сделана проверка на код ошибки &quot;файл не найден&quot;. Я сделал тут выход из программы если вместо выбора файла нажали &quot;РЕД&quot;. Если такая проверка не нужна, можно эту строку убрать.<br />В строке 5020 сделана проверка на код ошибки &quot;Неверный тип файла&quot;, в строке 5030 вывод текста ошибки, а в строке 5040 - собственно выполнение команды MAXFILES.</p><p>Понятно, что костыль, и лучше бы исправить ДОС, но это уж очень тяжелый вариант.</p><p>Вообще, пора уже как у Майкрософта базу знаний багов заводить (Knowledge Base). И все ошибки туда под номерами складывать, а то информация растекается по разным темам форума и фиг ее потом найдешь.</p>]]></description>
			<author><![CDATA[null@example.com (avivanov76)]]></author>
			<pubDate>Sun, 13 Jul 2025 20:42:26 +0000</pubDate>
			<guid>https://forum.agatcomp.ru//viewtopic.php?pid=7961#p7961</guid>
		</item>
		<item>
			<title><![CDATA[Re: Применение платы палитр в софте.]]></title>
			<link>https://forum.agatcomp.ru//viewtopic.php?pid=7960#p7960</link>
			<description><![CDATA[<p>короче, надо найти какой-то указатель на последний используемый буфер ?</p>]]></description>
			<author><![CDATA[null@example.com (Voldemar0)]]></author>
			<pubDate>Sun, 13 Jul 2025 14:49:11 +0000</pubDate>
			<guid>https://forum.agatcomp.ru//viewtopic.php?pid=7960#p7960</guid>
		</item>
		<item>
			<title><![CDATA[Re: Применение платы палитр в софте.]]></title>
			<link>https://forum.agatcomp.ru//viewtopic.php?pid=7959#p7959</link>
			<description><![CDATA[<div class="quotebox"><blockquote><p>Видимо, проблемы именно с закрытием файла, использующего первый буфер.</p></blockquote></div><p>А, нет. Неправильно проверил :)</p><p>Я выбирал для BLOAD один и тот же файл. И похоже, что ДОС видит, что такой файл уже открыт и не пытается выделять ему новый буфер.</p><p>Но если попытаться через BLOAD загрузить 3 <em>разных</em> файла типа A, то буфера тоже будут использоваться разные. И после трех ошибок подряд на очередную попытку загрузки ДОС выдает ошибку &quot;МНОГО ОТКРЫТЫХ ФАЙЛОВ&quot;.</p><p>Так что BLOAD файла типа A просто оставляет незакрытым файл. Независимо от номера буфера.</p>]]></description>
			<author><![CDATA[null@example.com (avivanov76)]]></author>
			<pubDate>Sat, 12 Jul 2025 20:38:12 +0000</pubDate>
			<guid>https://forum.agatcomp.ru//viewtopic.php?pid=7959#p7959</guid>
		</item>
		<item>
			<title><![CDATA[Re: Применение платы палитр в софте.]]></title>
			<link>https://forum.agatcomp.ru//viewtopic.php?pid=7958#p7958</link>
			<description><![CDATA[<div class="quotebox"><cite>Voldemar0 пишет:</cite><blockquote><p>Так если его можно менять через MaxFiles - это и есть динамическая память.</p></blockquote></div><p>Динамическая она с некоторой натяжкой. Хоть там и связанный список, но реально выделяется сплошная область памяти с фиксированного адреса. Причем, вся эта динамичность происходит только при запуске ДОС или вызове MAXFILES.<br />В тот момент, когда происходит ошибка в примере выше - никакая память не выделяется и не освобождается.</p><p>Насколько я понимаю, происходит следующее.<br />При старте ДОС создает набор буферов под 3 одновременно открытых файла. (3 - это настройка MAXFILES по умолчанию.)<br />Под каждый файл выделяется примерно 600 байт места (буфер данных, буфер TSL, имя файла и что-то еще).<br />При каждой операции с файлом ДОС выбирает свободный буфер. Если нет других открытых файлов, то этот буфер один и тот же, в данном случае $B107.<br />Но когда в примере выше происходит ошибка, то ДОС после этого по какой-то непонятной причине в качестве свободного выбирает следующий буфер, с адреса $B35A. И дальше пользуется им.</p><p>ДОС, как я понимаю, для освобождения буфера записывает нуль в первый байт имени файла. Как я вижу в эмуляторе, после ошибки имя файла, вызвавшего ошибку, сохраняется (адрес $B334). То есть, кажется файл не закрывается. Но в то же время, если спровоцировать ошибку еще несколько раз, то все продолжает работать, исчерпания количества открытых файлов не происходит. Видимо, проблемы именно с закрытием файла, использующего первый буфер.</p><div class="quotebox"><cite>Voldemar0 пишет:</cite><blockquote><p>лишь бы у нас версии ДОС совпали</p></blockquote></div><p>Я проверял под ИКП-9.</p>]]></description>
			<author><![CDATA[null@example.com (avivanov76)]]></author>
			<pubDate>Sat, 12 Jul 2025 17:49:51 +0000</pubDate>
			<guid>https://forum.agatcomp.ru//viewtopic.php?pid=7958#p7958</guid>
		</item>
		<item>
			<title><![CDATA[Re: Применение платы палитр в софте.]]></title>
			<link>https://forum.agatcomp.ru//viewtopic.php?pid=7957#p7957</link>
			<description><![CDATA[<p>Так если его можно менять через MaxFiles - это и есть динамическая память.</p><p>Я помню ошибку с очисткой таких же буферов под Школьницей.<br />На форуме писал, несколько лет назад.</p><p>В ДОС же можно открыть файл и не закрывать его в одной операции. Сколько таких файлов будет - заранее неизвестно. Во всяком случае текстовых - легко. Другие типы - тоже можно, но посложнее (через FileMan).</p><p>Т.е. под один файл выделяется какой-то один кусок, под другой файл будет уже выделятся другой кусок.<br />Пусть даже формально этот кусок как будто и так зарезервирован ДОСом, но важно то, что некий произвольный по счёту файл может попасть в разные адреса памяти.</p><p>Будет время - я гляну куда там что девается, по описанному тобой сюжету, лишь бы у нас версии ДОС совпали, их же несколько разных.</p>]]></description>
			<author><![CDATA[null@example.com (Voldemar0)]]></author>
			<pubDate>Sat, 12 Jul 2025 11:38:58 +0000</pubDate>
			<guid>https://forum.agatcomp.ru//viewtopic.php?pid=7957#p7957</guid>
		</item>
		<item>
			<title><![CDATA[Re: Применение платы палитр в софте.]]></title>
			<link>https://forum.agatcomp.ru//viewtopic.php?pid=7956#p7956</link>
			<description><![CDATA[<div class="quotebox"><cite>Voldemar0 пишет:</cite><blockquote><p>какой-то блок памяти забывают освободить</p></blockquote></div><p>Прикол в том, что у ДОС даже диспетчера памяти нет. Практически все данные размещены статически, поэтому ничего не выделяется и не освобождается.<br />Есть только связанный список буферов файлов, размер которого можно поменять через MAXFILES. Но и этот список размечается либо в момент инициализации ДОС, либо в момент вызова команды MAXFILES, а потом никак не меняется.</p>]]></description>
			<author><![CDATA[null@example.com (avivanov76)]]></author>
			<pubDate>Fri, 11 Jul 2025 20:36:23 +0000</pubDate>
			<guid>https://forum.agatcomp.ru//viewtopic.php?pid=7956#p7956</guid>
		</item>
		<item>
			<title><![CDATA[Re: Применение платы палитр в софте.]]></title>
			<link>https://forum.agatcomp.ru//viewtopic.php?pid=7955#p7955</link>
			<description><![CDATA[<p>Я помню, что в dos33 была интересная особенность: сразу после загрузки с Бейсик-60 можно было дать любую ошибочную команду ДОС (например, LOAD с именем несуществующего файла) и ДОС не сообщала о каких-либо ошибках.<br />Но если дать команду, которая завершится правильно, то на следующие неправильные команды сообщения об ошибках уже появлялись.</p><p>Адрес буфера в этом софте вряд ли будет зависеть от большого количества случайностей, как у нынешних систем.<br />Если его адрес просто так меняется, это может косвенно свидетельствовать о какой-то ошибке управления памятью.<br />Например, если был запрос неверного типа файла и операция срывается, то какой-то блок памяти забывают освободить. И поэтому выделяют новый.</p>]]></description>
			<author><![CDATA[null@example.com (Voldemar0)]]></author>
			<pubDate>Fri, 11 Jul 2025 07:40:59 +0000</pubDate>
			<guid>https://forum.agatcomp.ru//viewtopic.php?pid=7955#p7955</guid>
		</item>
	</channel>
</rss>
