просто интересно, чтобы ты сказал о других классических биперах, как-то: cybernoid-2, last ninja, robin of the wood, sooty and sweep, hate, renegade, soldier of fortune, flying shark… для необразованного меня в те года все движки делились на два типа: «вхам» и «не-вхам» (и этот второй еще на две разновидности: «тихие» и «громкие»)))
Это когда пошли процессоры заточенные под стековую адресацию.
локальные переменные — необязательно стековые, могут быть ведь и статические, где можно
На MOS6502 адресовать стек легко невозможно. На Z80 даже вроде бы при наличии адресации через IX/IY+offset такие инструкции дают приличный пенальти на работу со словами. Поэтому максимально быстрый код писался на глобальных переменных.
максимально быстрый код для восьмибиток пишется с удобным размещением данных
собс-но, в идеале что для локальных, что для глобальных адресов часто только младший байт изменяется
Семь слов если на стеке (и загрязнение трёх регистров). Против четырёх слов без загрязнения регистров у глобальных переменных.
ну вот, а у z80 — три байтика)))
вообще выигрыш у тебя больше за счёт 16-битности там, где от z80 ты тоже требуешь 16-битных операций
а на байтовых (например, при обработке текста) уже не всё так однозначно с твоим отказом от байта
Пример: берём три глобальных переменных var1, var2 и var3 и прокручиваем с ними на Си операцию:
всё же чаще в прикладных полезных программах оперируют локальными переменными
а глобальные — компиляторы стараются группировать с одной базой и адресовать потом по смещению
так вот другой пример, на локальные — сложить два числа с верхушки стека, что будет здесь? ;)
1. Означает. Абсурд — это утверждать, что один моно-канал лучше двух (которые на амиге очевидно получаются установкой одинаковой громкости в каждой паре левого-правого)
2. По ссылке вижу один пост страданий одного-единственного амижника с подключением амиги к чему-то-там. И не вижу каким образом несовершенство аудиосистемы амиги означает, что она хуже еще более несовершенного саундбластера.
3. Было сказано, что 16-битный звук на пц появился намного позже, а до этого б0льшую часть данной эпохи было 8 против 8 (и даже 8 против 14) при разнице по каналам минимум вдвое.
4. Так зачем же ты её начинал?
В моно и такого нет, тем и лучше; а если нужно моно, то имеем на амиге два моно-канала при равной громкости. И какого именно «эффекта» тут еще предполагается добиться «отдельными аппаратными микшерами»??
Большим шагом вперёд, в плане звука на PC, стало появление Sound Blaster производства Creative Labs. Он проигрывал цифровой звук (поначалу — моно 8 бит, позднее — стерео 16 бит), меньше грузил процессор и, в целом, был вполне сопоставим по качеству со звуком на Amiga, а при некоторых программных ухищрениях и превосходил — например, по числу каналов.
Это как так? Насколько помню, у SB был один аппаратный канал цифрового звука, против четырёх амижных аппаратных каналов. Ну да, можно смешивать несколько программных каналов в один сэмпл для одного аппаратного, ну так и амига могла такое. Мощности амиге не хватало на сжатый звук.
да, [pc] конечно, что-то перемкнуло меня) главное, что ты понял верно
по сдвигам надо бы всё тщательно взвесить, одинарный сдвиг для быстрой арифметики маловато
насчёт асма, на мой взгляд, задятые достаточно заметно отделяют операнды (особенно на шрифтах фиксированной ширины), ну, и если хочется, никто же после них пробелы не запрещает! и второе, нужны ли вообще квадратные скобки? префикс в большинстве случаев лаконичней:
просмотрел очень бегло, но сразу же несколько замечаний и предложений:
1) куча пробелов выглядит хуже пары запятых и занимает больше места в исходнике
2) интересный вопрос, как устанавливаются флаги, когда приёмник — psw (как регистр) :)
3) не хватает прокрутки ЧЕРЕЗ перенос, а также сдвигов — для ускорения арифметики и возможной битовой графики
4) хорошо бы еще один регистр с автоинкрементами — для шитого кода (мб включать автоинкременты для регистров спецфлагами?)
5) зачем тратить опкод на отдельную команду cmp? когда можно принять запись в [psw] за игнор результата, и она появляется «бесплатно», так же как test и прочие логические аналоги (плюс тогда мб даже имеет смысл сделать сохраняющие результат обычные and/or/xor не устанавливающими флаги)
А вот я категорически не согласен с местами 1 и 2. На обеих лица неузнаваемы, потерялось именно характерное. Ящитаю, первые два места за 3 и 5 — даже несмотря на то, что к 5 таки есть за что придраться (изменена форма лица), всё равно она осталась самой похожей. Насчёт третьего места возможны варианты, но тоже не 1 и 2 скорее всего.
Не голосовал, есичо — как-то пропустил, завертевшись, хотя объявление раньше видел.
кошкин ёж, не тот код запостил во втором варианте, там должно быть
ld de,$XX20☺
add hl,de
ld e,h
ld a,(de)
ld h,a
Хотя уже неважно, ведь оказалось, можно еще быстрее. Я как-то проглядел, что там же в аккумуляторе хранится исходный младший байт адреса! В связи с этим можно переписать:
...
ld a,l
jp _loop3
_xrow1 ld b,8
_xrow2 add 32
ld l,h
ld h,$XX
ld h,(hl)
jp nc,_loop2
ld h,l
_loop1 inc h
_loop2 ld l,a
_loop3 DUP...EDUP
djnz _loop1
dec c
jp p,_xrow1
ld l,a
exa
ld b,a
ld a,l
jr nz,_xrow2
ld sp,0
ret
«чистый» код down_hl (с _xrow2 по _loop1 включительно) на всю высоту экрана сожрёт 1493 такта
если жаба не задушит продублировать кусок _loop2...djnz — можно сократить заменой jp на jr до 1398
это с маленькой таблицей, а без таблиц у меня теперь получилось 1556 «чистых» тактов:
...
_xrow2 add 32
jr c,_loop1
ld l,a
ld a,h
sub b
ld h,a
ld a,l
_loop1 inc h
...
а как любые переменные пихают куда-нибудь, между процедурами, например?
кстати, там рабочую инфу по спрайтам можно хранить — снаружи цикла половина адреса уже в d
мимо-то он точно пройти не мог
и как архив без телеграма скачать?
а я говорил — «с верхушки» и не говорил про запись — так будет три
но вот не всегда они оправданы и нужны
максимально быстрый код для восьмибиток пишется с удобным размещением данных
собс-но, в идеале что для локальных, что для глобальных адресов часто только младший байт изменяется
ну вот, а у z80 — три байтика)))
вообще выигрыш у тебя больше за счёт 16-битности там, где от z80 ты тоже требуешь 16-битных операций
а на байтовых (например, при обработке текста) уже не всё так однозначно с твоим отказом от байта
а глобальные — компиляторы стараются группировать с одной базой и адресовать потом по смещению
так вот другой пример, на локальные — сложить два числа с верхушки стека, что будет здесь? ;)
2. По ссылке вижу один пост страданий одного-единственного амижника с подключением амиги к чему-то-там. И не вижу каким образом несовершенство аудиосистемы амиги означает, что она хуже еще более несовершенного саундбластера.
3. Было сказано, что 16-битный звук на пц появился намного позже, а до этого б0льшую часть данной эпохи было 8 против 8 (и даже 8 против 14) при разнице по каналам минимум вдвое.
4. Так зачем же ты её начинал?
почему не назовёшь? всё равно это лучше чем один неразведённый моно, как ни крути
не «уже», а "только лишь в 1992", аж через 7 лет после первой амиги
когда, собс-но, комодор уже загибался, потому амига и осталась с 8/14
плюс вопрос качества аудиотракта — дисциплина для отдельной олимпиады
да и не такая уж там и разница по камням во времена саундбластеров
по сдвигам надо бы всё тщательно взвесить, одинарный сдвиг для быстрой арифметики маловато
насчёт асма, на мой взгляд, задятые достаточно заметно отделяют операнды (особенно на шрифтах фиксированной ширины), ну, и если хочется, никто же после них пробелы не запрещает! и второе, нужны ли вообще квадратные скобки? префикс в большинстве случаев лаконичней:
скобки только для сложных выражений:
хотя при наличии запятых необязательны и они, префикc действует на всё выражение:
также, void как по мне длинновато, может, применять какой-то другой значок или даже «пустое выражение»?
ну, или просто псевдами выражать (те же cmp, test...)
1) куча пробелов выглядит хуже пары запятых и занимает больше места в исходнике
2) интересный вопрос, как устанавливаются флаги, когда приёмник — psw (как регистр) :)
3) не хватает прокрутки ЧЕРЕЗ перенос, а также сдвигов — для ускорения арифметики и возможной битовой графики
4) хорошо бы еще один регистр с автоинкрементами — для шитого кода (мб включать автоинкременты для регистров спецфлагами?)
5) зачем тратить опкод на отдельную команду cmp? когда можно принять запись в [psw] за игнор результата, и она появляется «бесплатно», так же как test и прочие логические аналоги (плюс тогда мб даже имеет смысл сделать сохраняющие результат обычные and/or/xor не устанавливающими флаги)
Не голосовал, есичо — как-то пропустил, завертевшись, хотя объявление раньше видел.
Хотя уже неважно, ведь оказалось, можно еще быстрее. Я как-то проглядел, что там же в аккумуляторе хранится исходный младший байт адреса! В связи с этим можно переписать:
«чистый» код down_hl (с _xrow2 по _loop1 включительно) на всю высоту экрана сожрёт 1493 такта
если жаба не задушит продублировать кусок _loop2...djnz — можно сократить заменой jp на jr до 1398
это с маленькой таблицей, а без таблиц у меня теперь получилось 1556 «чистых» тактов:
а как любые переменные пихают куда-нибудь, между процедурами, например?
кстати, там рабочую инфу по спрайтам можно хранить — снаружи цикла половина адреса уже в d