ZXNet эхоконференция «code.zx»


тема: Единый графический формат



от: Alexander Bondarenko
кому: All
дата: 23 Apr 2004
*** Послано также в ZX.GRAFIX (Типа графон) *** Послано также в CODE.ZX (Для тех, кто кодить умеет...) *** Послано также в ZXNET.SOFT (Софтина...) Здравствуйте, All! Есть идейка замутить на Спеке сабж. Ориентировочно это - картинки любого размера (меньше, или больше экрана), с любым количеством (1, 2, или 3) планов, с атрибутами или без. Можно даже не зацикливаться на спековских атрибутах, а сделать возможность мультиколора. Здесь нужно просто выдумать для этого формата стандарт на header и опубликовать библиотечку для его использования. Кто за? С уважением, Alexander.

от: Kirill Frolov
кому: Alexander Bondarenko
дата: 05 May 2004
Hемедленно нажми на RESET, Alexander Bondarenko! On Fri, 23 Apr 04 22:57:14 +0400, Alexander Bondarenko wrote: AB> Здесь нужно просто выдумать для этого формата стандарт на header AB> и опубликовать библиотечку для его использования. AB> Кто за? Долой форматы, XML наше всё! Hе, ну действительно парсер для спека сделать элементарно. Только getch() нужно, больше ничего. Ещё аллокатор памяти. С этим проблемы...

от: Aleksey Senilov
кому: Kirill Frolov
дата: 06 May 2004
Привет тебе, _/Kirill/_! 05 мая 2004 19:34, Kirill Frolov писал(а) Alexander Bondarenko: KF> Долой форматы, XML наше всё! Hе, ну действительно парсер для спека KF> сделать элементарно. Только getch() нужно, больше ничего. Ещё KF> аллокатор памяти. С этим проблемы... Вот аллокатор памяти действительно бы очень неплохо, сам его изобретал уже несколько раз, для разных целей. Вариантов собственно два - либо таблица блоков, либо в самих блоках заголовки 3х-байтовые (что не совсем удобно при мелких блоках). И вопрос еще, приплетать ли сюда верхнюю память, или же на нее свой постраничный аллокатор. В случае процессов тут надо еще учитывать кто берет память, а так же критические секции. Hо это уже для ОС, а не программ. До новых встреч! С уважением, Тхэнн.

от: Kirill Frolov
кому: Aleksey Senilov
дата: 09 May 2004
Hемедленно нажми на RESET, Aleksey Senilov! On Thu, 06 May 04 11:38:17 +0400, Aleksey Senilov wrote: KF>> Долой форматы, XML наше всё! Hе, ну действительно парсер для спека KF>> сделать элементарно. Только getch() нужно, больше ничего. Ещё KF>> аллокатор памяти. С этим проблемы... AS> Вот аллокатор памяти действительно бы очень неплохо, сам его изобретал AS> уже несколько раз, для разных целей. Вариантов собственно два - либо AS> таблица блоков, либо в самих блоках заголовки 3х-байтовые (что не совсем AS> удобно при мелких блоках). И то, и другое. Тот который с таблицей удобен для выделения блоков фиксированного и относительно большого размера. Hо не обязательно, что выделенное пространство непрерывно. Традиционный C-шный malloc() оперирует с кучей, где все выделенные части имеют разный и чаще небольшой размер. Hет, на самом деле наиболее выгоден комбинированный подход, так совсем мелкие участки памяти более выгодно будет выделять на стеке организованном вмутри одного более крупного блока... У меня кстати по 6 байт на блок получается: байт назначение 0, 1 метка, признак начала блока (для большей дуракоустойчивости) 2, 3 размер в байтах 4..N+4 данные... N+5, N+6 размер в байтах, отрицательный (для перебора кучи в обратном направлении, за этими двумя байтами лежит следующий блок и они адресуются относительно его начала) Возможен и другой вариант, с указателями. Минимум -- 4 байта на блок (двусвязный список, указатель на следующий и предыдущий). С меткой, а она очень полезна для профилактики предотвращения ошибок, будет 6. Можно и односвязный список, но тогда куча будет просматриваться всегда с одного места, с начала -- это плохо. Обычно куча каждый раз просматривается со следующего блока, циклически, это предотвращает скапливание большого числа мелких блоков /и неиспользуемой памяти/ с одного края кучи. AS> И вопрос еще, приплетать ли сюда верхнюю память, или же на нее AS> свой постраничный аллокатор. Постраничный, или поблочный. Для страничной памяти именно так лучше, потому как зачастую весьма желательно выделить какую-то часть памяти целиком и ни одного байта отдать нельзя. А внутри блоков выделенных поблочным аллокатором можно создавать кучи для выделения более мелких кусков нефиксированного размера. AS> В случае процессов тут надо еще учитывать кто берет память, а так же AS> критические секции. Hо это уже для ОС, а не программ. Расскажу как сделать семафор на 8 позиций: scf rl (hl) jr nc, свободно ; занято (все 8) свободно: ... ... or a rr (hl) ; освободили ресурс. примерно так... Для двоичного варианта инициирующее значение == -2.

от: Alexander Bondarenko
кому: Aleksey Senilov
дата: 10 May 2004
*Здравствуй, Aleksey!* Лови мои идеи по поводу сабжа "Единый графический формат", о котором трещала в 06 May 2004 твоя портянка к тов. Kirill Frolov. KF>> Долой форматы, XML наше всё! Hе, ну действительно парсер для KF>> спека сделать элементарно. Только getch() нужно, больше ничего. KF>> Ещё аллокатор памяти. С этим проблемы... AS> Вот аллокатор памяти действительно бы очень неплохо, сам его AS> изобретал уже несколько раз, для разных целей. Вариантов собственно AS> два - либо таблица блоков, либо в самих блоках заголовки 3х-байтовые AS> (что не совсем удобно при мелких блоках). И вопрос еще, приплетать ли AS> сюда верхнюю память, или же на нее свой постраничный аллокатор. В AS> случае процессов тут надо еще учитывать кто берет память, а так же AS> критические секции. Hо это уже для ОС, а не программ. Hy вот, я же говоpю - всё yпиpается в ОСЬ.... /Вот и всё, Aleksey, можешь листать дальше.../

от: Ivan Roshin
кому: Kirill Frolov
дата: 11 May 2004
Hello, Kirill! 9 May 2004 you wrote: KF> Возможен и другой вариант, с указателями. Минимум -- 4 KF> байта на блок (двусвязный список, указатель на следующий KF> и предыдущий). Двусвязный список можно реализовать, используя для каждого элемента не указатели на предыдущий и следующий элементы, а только одну переменную такой же длины, как указатель. То есть в данном случае можно тратить не 4 байта на элемент списка, а только 2. С уважением, Иван Рощин.

от: Kirill Frolov
кому: Ivan Roshin
дата: 12 May 2004
Hемедленно нажми на RESET, Ivan Roshin! On Tue, 11 May 04 04:26:06 +0400, Ivan Roshin wrote: KF>> Возможен и другой вариант, с указателями. Минимум -- 4 KF>> байта на блок (двусвязный список, указатель на следующий KF>> и предыдущий). IR> Двусвязный список можно реализовать, используя для каждого IR> элемента не указатели на предыдущий и следующий элементы, а IR> только одну переменную такой же длины, как указатель. То есть IR> в данном случае можно тратить не 4 байта на элемент списка, а IR> только 2. В таком случае сохраняется XOR указателей на предыдущий и следующий блоки, так? Этот метод применим только для последовательного перебора элементов в одном направлении -- при этом всегда известен указатель на предыдущий (следующий) элемент, и адрес следующего (предыдущего) можно вычислить "проксорив" его с адресом текущего элемента. Hо в случае, когда для наугад выбранного из списка элемента требуется найти и следующий, и предыдущий элементы, например для исключения текущего из цепочки (при освобождении блока), данным метод неприемлем. Фактически, список организованный подобным методом двусвязным не является. По сути он односвязный, но одновременно в двух направлениях...

от: Kirill Frolov
кому: Alexander Bondarenko
дата: 12 May 2004
Hемедленно нажми на RESET, Alexander Bondarenko! On Sun, 09 May 04 23:29:21 +0400, Alexander Bondarenko wrote: KF>>> Долой форматы, XML наше всё! Hе, ну действительно парсер для KF>>> спека сделать элементарно. Только getch() нужно, больше ничего. KF>>> Ещё аллокатор памяти. С этим проблемы... AS>> Вот аллокатор памяти действительно бы очень неплохо, сам его AS>> изобретал уже несколько раз, для разных целей. Вариантов собственно AS>> два - либо таблица блоков, либо в самих блоках заголовки 3х-байтовые AS>> (что не совсем удобно при мелких блоках). И вопрос еще, приплетать ли AS>> сюда верхнюю память, или же на нее свой постраничный аллокатор. В AS>> случае процессов тут надо еще учитывать кто берет память, а так же AS>> критические секции. Hо это уже для ОС, а не программ. AB> Hy вот, я же говоpю - всё yпиpается в ОСЬ.... Для совместимости с TR-DOS программами можно предложить выделять им память в... RAM-диске. Выделенная память просто представляется файлом в каталоге, и таком образом защищается от изменений другими программами, как использующими RAM-диск, так и одновременно решается проблема распределения памяти. При достаточном объёме RAM-диска реализуется даже "многозадачность" как это было в MagOS (для Scorpion). Типично, память в пределах 128КБ используется программами полностью, а всё что сверх зачастую выделяется под RAM-диск. Hапример, в KAY так, за тем лишь исключением, что под RAM-диск отдаётся память сверх 256КБ. А возвращаясь к вопросу об аллокаторе, хотел сказать тогда, там должно быть как минимум 3 аргумента: запрашиваемый минимальный размер выделяемой области памяти (обязательный аргумент), физический адрес памяти (опциональный аргумент), допустимый адрес, от и до, для микропроцессора (опциональный аргумент). Второе нужно для специальных случаев, вроде драйвера какой-либо аппаратуры. Третье -- потому, что памяти значительно больше чем адресов у Z80, и иногда требуется чтобы выделенная память не пересекалась по адресам, иначе говоря была одновременно доступна без необходимости переключения страниц.

от: Ivan Roshin
кому: Kirill Frolov
дата: 13 May 2004
Hello, Kirill! 12 May 2004 you wrote: KF>>> Возможен и другой вариант, с указателями. Минимум -- 4 KF>>> байта на блок (двусвязный список, указатель на следующий KF>>> и предыдущий). IR>> Двусвязный список можно реализовать, используя для IR>> каждого элемента не указатели на предыдущий и следующий IR>> элементы, а только одну переменную такой же длины, как IR>> указатель. То есть в данном случае можно тратить не 4 IR>> байта на элемент списка, а только 2. KF> В таком случае сохраняется XOR указателей на предыдущий KF> и следующий блоки, так? При реализации на ассемблере Z80, видимо, удобнее сохранять не XOR, а сумму или разность указателей, т.к. команды сложения и вычитания могут работать сразу с 16-битными операндами, в отличие от XOR. KF> Этот метод применим только для последовательного перебора KF> элементов в одном направлении -- при этом всегда известен KF> указатель на предыдущий (следующий) элемент, и адрес KF> следующего (предыдущего) можно вычислить "проксорив" его KF> с адресом текущего элемента. То есть, если известны указатели на два соседних элемента, можно двигаться по списку в любом направлении. KF> Hо в случае, когда для наугад выбранного из списка KF> элемента требуется найти и следующий, и предыдущий KF> элементы, например для исключения текущего из цепочки KF> (при освобождении блока), данным метод неприемлем. Если известен только адрес этого элемента, то да. KF> Фактически, список организованный подобным методом KF> двусвязным не является. По сути он односвязный, но KF> одновременно в двух направлениях... С уважением, Иван Рощин.

от: Aleksey Senilov
кому: Kirill Frolov
дата: 14 May 2004
Привет тебе, _/Kirill/_! 09 мая 2004 12:00, Kirill Frolov писал(а) Aleksey Senilov: AS>> Вот аллокатор памяти действительно бы очень неплохо, сам его AS>> изобретал уже несколько раз, для разных целей. Вариантов AS>> собственно два - либо таблица блоков, либо в самих блоках AS>> заголовки 3х-байтовые (что не совсем удобно при мелких блоках). KF> И то, и другое. Тот который с таблицей удобен для выделения блоков KF> фиксированного и относительно большого размера. Hо не обязательно, что KF> выделенное пространство непрерывно. Традиционный C-шный malloc() KF> оперирует с кучей, где все выделенные части имеют разный и чаще KF> небольшой размер. Hет, на самом деле наиболее выгоден комбинированный KF> подход, так совсем мелкие участки памяти более выгодно будет выделять KF> на стеке организованном вмутри одного более крупного блока... KF> У меня кстати по 6 байт на блок получается: А у меня получилось 5. Байт на флаг занятости+владелец, 2 байта длина, и 2 байта адрес предыдущего блока. Да вне зависимости от структуры, интерфейс остается одинаковым - настройка на расположение кучи и ее инициализация (init), alloc, free и realloc. KF> Возможен и другой вариант, с указателями. Минимум -- 4 байта на блок KF> (двусвязный список, указатель на следующий и предыдущий). С меткой, KF> а она очень полезна для профилактики предотвращения ошибок, будет 6. KF> Можно и односвязный список, но тогда куча будет просматриваться KF> всегда с одного места, с начала -- это плохо. Да, односвязный точно плохо. А насчет профилактики ошибок, то можно ведь (хотя это и дольше по скорости) проверить предыдущий и следующий блок, сходятся ли длины/указатели. Тогда не надо метки. KF> Обычно куча каждый раз KF> просматривается со следующего блока, циклически, это предотвращает KF> скапливание большого числа мелких блоков /и неиспользуемой памяти/ с KF> одного края кучи. То есть запоминается адрес последнего выделенного блока, и при следующем alloc ищется не сначала, а после него? Да, пожалуй верно. AS>> И вопрос еще, приплетать ли сюда верхнюю память, или же на нее AS>> свой постраничный аллокатор. KF> Постраничный, или поблочный. Для страничной памяти именно так лучше, KF> потому как зачастую весьма желательно выделить какую-то часть памяти KF> целиком и ни одного байта отдать нельзя. А внутри блоков выделенных KF> поблочным аллокатором можно создавать кучи для выделения более мелких KF> кусков нефиксированного размера. Тогда получается что функциям аллокатора надо передавать еще и адрес/размер кучи. Hе слишком ли? А то что верхняя память постранично, это да, наиболее удобный и наименее ресурсоемкий вариант. Таблица занятости - битовая маска, либо если надо владельцев учитывать, то по байту на страницу. AS>> В случае процессов тут надо еще учитывать кто берет память, а AS>> так же критические секции. Hо это уже для ОС, а не программ. KF> Расскажу как сделать семафор на 8 позиций: KF> scf KF> rl (hl) KF> jr nc, свободно KF> ; занято (все 8) KF> свободно: KF> ... KF> ... KF> or a KF> rr (hl) ; освободили ресурс. KF> примерно так... Для двоичного варианта инициирующее значение == -2. Это все понятно, но к чему оно было сказано? Причем тут критические секции? По мне, так лучше не двоичный, а простой однобайтовый счетчик. Если он 0, значит свободно. До новых встреч! С уважением, Тхэнн.

от: Aleksey Senilov
кому: Kirill Frolov
дата: 14 May 2004
Привет тебе, _/Kirill/_! 09 мая 2004 12:00, Kirill Frolov писал(а) Aleksey Senilov: AS>> Вот аллокатор памяти действительно бы очень неплохо, сам его AS>> изобретал уже несколько раз, для разных целей. Вариантов AS>> собственно два - либо таблица блоков, либо в самих блоках AS>> заголовки 3х-байтовые (что не совсем удобно при мелких блоках). KF> И то, и другое. Тот который с таблицей удобен для выделения блоков KF> фиксированного и относительно большого размера. Hо не обязательно, что KF> выделенное пространство непрерывно. Традиционный C-шный malloc() KF> оперирует с кучей, где все выделенные части имеют разный и чаще KF> небольшой размер. Hет, на самом деле наиболее выгоден комбинированный KF> подход, так совсем мелкие участки памяти более выгодно будет выделять KF> на стеке организованном вмутри одного более крупного блока... KF> У меня кстати по 6 байт на блок получается: А у меня получилось 5. Байт на флаг занятости+владелец, 2 байта длина, и 2 байта адрес предыдущего блока. Да вне зависимости от структуры, интерфейс остается одинаковым - настройка на расположение кучи и ее инициализация (init), alloc, free и realloc. KF> Возможен и другой вариант, с указателями. Минимум -- 4 байта на блок KF> (двусвязный список, указатель на следующий и предыдущий). С меткой, KF> а она очень полезна для профилактики предотвращения ошибок, будет 6. KF> Можно и односвязный список, но тогда куча будет просматриваться KF> всегда с одного места, с начала -- это плохо. Да, односвязный точно плохо. А насчет профилактики ошибок, то можно ведь (хотя это и дольше по скорости) проверить предыдущий и следующий блок, сходятся ли длины/указатели. Тогда не надо метки. KF> Обычно куча каждый раз KF> просматривается со следующего блока, циклически, это предотвращает KF> скапливание большого числа мелких блоков /и неиспользуемой памяти/ с KF> одного края кучи. То есть запоминается адрес последнего выделенного блока, и при следующем alloc ищется не сначала, а после него? Да, пожалуй верно. AS>> И вопрос еще, приплетать ли сюда верхнюю память, или же на нее AS>> свой постраничный аллокатор. KF> Постраничный, или поблочный. Для страничной памяти именно так лучше, KF> потому как зачастую весьма желательно выделить какую-то часть памяти KF> целиком и ни одного байта отдать нельзя. А внутри блоков выделенных KF> поблочным аллокатором можно создавать кучи для выделения более мелких KF> кусков нефиксированного размера. Тогда получается что функциям аллокатора надо передавать еще и адрес/размер кучи. Hе слишком ли? А то что верхняя память постранично, это да, наиболее удобный и наименее ресурсоемкий вариант. Таблица занятости - битовая маска, либо если надо владельцев учитывать, то по байту на страницу. AS>> В случае процессов тут надо еще учитывать кто берет память, а AS>> так же критические секции. Hо это уже для ОС, а не программ. KF> Расскажу как сделать семафор на 8 позиций: KF> scf KF> rl (hl) KF> jr nc, свободно KF> ; занято (все 8) KF> свободно: KF> ... KF> ... KF> or a KF> rr (hl) ; освободили ресурс. KF> примерно так... Для двоичного варианта инициирующее значение == -2. Это все понятно, но к чему оно было сказано? Причем тут критические секции? По мне, так лучше не двоичный, а простой однобайтовый счетчик. Если он 0, значит свободно. До новых встреч! С уважением, Тхэнн.

от: Aleksey Senilov
кому: Alexander Bondarenko
дата: 14 May 2004
Привет тебе, _/Alexander/_! 10 мая 2004 00:29, Alexander Bondarenko писал(а) Aleksey Senilov: AB> Hy вот, я же говоpю - всё yпиpается в ОСЬ.... Так что же мешает её создать? Груз прошлого софта? Разобщенность попыток написания? До новых встреч! С уважением, Тхэнн.

от: Kirill Frolov
кому: Aleksey Senilov
дата: 15 May 2004
Hемедленно нажми на RESET, Aleksey Senilov! On Fri, 14 May 04 14:26:05 +0400, Aleksey Senilov wrote: KF>> целиком и ни одного байта отдать нельзя. А внутри блоков выделенных KF>> поблочным аллокатором можно создавать кучи для выделения более мелких KF>> кусков нефиксированного размера. AS> Тогда получается что функциям аллокатора надо передавать еще и AS> адрес/размер кучи. Hе слишком ли? Один указатель на объект-кучу, в котором всё что нужно и хранится. KF>> Расскажу как сделать семафор на 8 позиций: KF>> scf KF>> rl (hl) KF>> jr nc, свободно KF>> ; занято (все 8) KF>> свободно: KF>> ... KF>> ... KF>> or a KF>> rr (hl) ; освободили ресурс. KF>> примерно так... Для двоичного варианта инициирующее значение == -2. AS> Это все понятно, но к чему оно было сказано? Причем тут критические AS> секции? Более традиционный способ предполагает запрещение прерываний. Hеприемлемо при отсчёте времени по кадровому прерыванию (легко его пропустить) и сложно реализуемо при работе с модемами подключенными по кондратьевской схеме (там NMI, запрещается выводом в порт...) AS> По мне, так лучше не двоичный, а простой однобайтовый счетчик. Если он 0, AS> значит свободно. Проблема в том, как проверить что он 0, и установить в не 0, если он был 0... Даже для этого придётся или запрещать прерывания, или использовать команду сдвига.

от: Aleksey Senilov
кому: Kirill Frolov
дата: 17 May 2004
Привет тебе, _/Kirill/_! 15 мая 2004 00:54, Kirill Frolov писал(а) Aleksey Senilov: AS>> Тогда получается что функциям аллокатора надо передавать еще и AS>> адрес/размер кучи. Hе слишком ли? KF> Один указатель на объект-кучу, в котором всё что нужно и хранится. Впрочем да... просто в системе этот параметр может проставляться автоматом, перед вызовом непосредственно alloc. AS>> Это все понятно, но к чему оно было сказано? Причем тут AS>> критические секции? KF> Более традиционный способ предполагает запрещение прерываний. KF> Hеприемлемо при отсчёте времени по кадровому прерыванию (легко его KF> пропустить) и сложно реализуемо при работе с модемами подключенными KF> по кондратьевской схеме (там NMI, запрещается выводом в порт...) Тогда да, правильный вариант. AS>> По мне, так лучше не двоичный, а простой однобайтовый счетчик. AS>> Если он 0, значит свободно. KF> Проблема в том, как проверить что он 0, и установить в не 0, если он KF> был 0... Даже для этого придётся или запрещать прерывания, или KF> использовать команду сдвига. А что насчет inc/dec (hl) и проверки флага Z? Свободное значение тогда скорее #FF, но все же. До новых встреч! С уважением, Тхэнн.




Темы: Игры, Программное обеспечение, Пресса, Аппаратное обеспечение, Сеть, Демосцена, Люди, Программирование

Похожие статьи:
Дискуссия - Многозадачность и ОС.
Ликбез - Аккумуляторы. Практическое применение различных типов.
Parties?! - FunTop'99 vs Chaos Construction'99: Точка зрения.
Сплошные приколы - 4 прикола. Сборник высказываний советских офицеров (продолжение).
Юмор - анекдоты.

В этот день...   8 мая