Фак программисту. Или как понять свой старый код

Не так давно я вернулся к разработке zifi. Этот код был позаброшен больше 9 месяцев назад, и тогда я… устал продолжать :)
Но — не забываю, есть старые проблемы, есть вновь найденные неудобства. Надо фиксить, надо развивать.
Оболочка полезная вышла.
Но, ччёрт, столько времени прошло…
Как понять свой старый код через год? И как писать так, что-бы его можно было пОнять позже?

Я выложу свои идеи по этому поводу, но хотелось бы услышать Ваши стандарты разработки.

Итак, мои личные рекомендации:

1. Не пишите код в линию.
ld a,h, b,l,d,i: or a: jr z,milf — это замечательно, и настолько лаконично… но двояко, для меня лично.
Это крайне слабо читаемо. Да, я понимаю — «сгущение» (не подберу другого слова) смысла в строках.
Но читаемость кода, на мой взгляд — падает основательно. Из-за приёмов, подобных «ld a,h, b,l,d,i».
Возможно, этот метод только лично мне не привычен, ок.
Но код в строчку — читать не могу.

2. Разделяйте процедуры переносами строк.
когда вы видите сплошную ленту дизасемблера — это одно. тут уж увы, не поформатишь, пожинай логику байтами.
но в СВОЁМ коде — отделяйте блоки и процедуры друг от друга.
визуальное восприятие блоками — резко повышает читаемость и восприятие логики каждой части программы.
мало пары переносов — да пожалуйста, используй свои разделители в комментариях.
важнее всего здесь — визуальное разделение блоков кода.
Тебе его потом отлаживать.

3. Применяйте понятные метки.
Время 8-ми байтовых меток давно ушло. Экономить не обязательно, не ZEUS.
Для важных процедур стоит использовать метки, максимально описывающие — что делает процедура.
Важно выделять важные места в программе, стараясь максимально понятно их называя:
change_page   ld bc,#7ffd
...

Но! для незначащих переходов — стоит использовать короткие метки перехода sjasm — 1b, 1f:

2 ld de,0
jr 1f
jr 2b
...
1 ld hl,0

на всякий: 1 — это номер метки, b / f — это сторона перехода — back или forward: назад к метке 1, или вперёд по коду к ней.
Естественно, злоупотреблять ними не стоит; но я нахожу им отличное применение — вместо ненужных «названиефункции1» или «названиефункции3».

3.1. equ для меток
Об этом нельзя сказать ничего плохого, но есть метод проще. Вместо чего-то типа:

ololo 
 equ $+1
ld hl,0

заюзайте вариант попроще:
ld (ololo+1),hl

3.2. Ох, я намешал этих 2b / 1f, теряюсь!
Сделай себе понятнее. Определи понятные метки вместо временных для тех, которые ВАЖНЫ.
ибо временные метки важными не являются по определению. и хер ты на нужную сможешь сослаться.

4. Протестил — оформь процедурой.
Всё обычно начинается с наброска, с теста — заработает ли, выйдет ли что-нибудь из этой затеи?
но если уж всё получается — выдели этот блок, с умным и понятным именем в отдельную процедуру.
что это даст?

упрощение отладки:
start
		ld sp,#bfff
		call all_init
 		call set_256c_mode		
		call sd_init

по сути — три щелчка по f8, и ты из прошёл.
и если есть проблема — тут же ясно в какой именно процедуре зараза :)
и да, давай процедуру с процедурами, окей?

5. Да всё понятно это, банальные вещи тулишь. Что делать с упрощением доступа к данным из асма, типа где IX+56 и т.д.?
Замечательная проблема, приводящая к постоянной автозамене.
Господа, юзайте структуры.
вкратце:
ld а,(ix+sprite.size_x) — здесь мы получаем доступ к необходимой ячейке по её имени с приставкой, к чему именно она принадлежит.
описание её выглядит вот так (справедливо для sjasmplus):
struct sprite
y		byte
size_y		byte
x		byte
size_x		byte
tnum		byte
spal		byte	
	ends

для себя отмечаем, что эта структура — 6 байт в длину :)
это даёт понятный код, и огромную простоту при переделке.

6. Хочу много одинаковых повторяющихся кодов и данных вперемешку, потому что у меня тьюринг! МАШЫНА!
отлично!
есть хорошее средство обьединить код и данные в группу — макросы.
вместо определения макроса в код будет подставлено его содержимое.
при этом — для макроса можно задавать входные параметры, что очень удобно.
параметры и содержимое макроса будет лежать в памяти точно так-же, как и привычный код.
Представь себе — что это подпрограмма, в которой можно заменить параметры описанные в заголовке.

приведу макрос, юзаемый мною в демах. он — без кода, и предназначен для указания, какая именно процедура будет вызываться в основном цикле. значимо здесь — номер команды (2), и адрес передаваемой процедуры:

MACRO	_play	addr
		db	2
		dw	addr
		ENDM
  • avatar
  • [просмотров: 10375]
  • +18

102 комментария

avatar
Про 1. — резко нет. Чем дальше пишу, тем больше кода мне хочется иметь на экране.
Так вот. Проблема не коде в строчку. Проблема в неудобных мнемониках и каше из разных частей кода в строке.
Т.е., твои примеры «неправильные». К коду в строку отношения не имеющие.

Задумайся сам, зачем тратить на это 7 строк:
ShortLine:	ld a,e : sub l : jr nc,Left2Right
		ld a,l : sub e : ex de,hl
Left2Right:	ld e,a					; l=X0, e=DX (always draw left-to-right)
avatar
Вообще, это мой интерес.
Вопрос — как писать, сверху-вниз или слева-направо напрямую относится к психологии восприятия человеком, к работе ума. Тут не все так просто, не только вопрос удобства.

Логическая аргументация такова:
Ход вычислений — сверху вниз. И когда мы располагаем их слева-направо, это осложняет нам восприятие хода вычислений, так как приходится постоянно «переключаться» от сверху-вниз к слева-направо. Это может быть аргументированно там где требуется и общепринято, например при вычислении выражений, но если особой ДОСТАТОЧНОЙ на то необходимости не имеется, лучше этого избегать.

Это «удобно» до той поры, когда ты «в теме», пока тебе заранее известно что происходит в данном фрагменте текста программы. Но как только ты утеряешь это представление, и тебе надлежит РАЗБИРАТЬСЯ (вот в чем разница), подобная запись немного, но осложняет восприятие. Является маленьким препятствием, местом преткновения.
Вплоть до того что я иногда на автомате enter'ом возвращаю сложные строки обратно к представлению в столбец.

Ну и последняя аргументация. Если бежать и создавать к каждой строке комментарии отдельным столбцом, то подобные строки слишком широки и не дают нормально написать комментарии. К тому же, если будет столбец сплошных строк-комментариев, он «маскирует» такую длинную строку.

Так что… любой «выверт» имеет свою цену… :)
avatar
Есть много теорий по этому поводу. Например, есть такая теория, что любой конечный кусок кода должен более-менее помещаться в экран, без скроллингов и т.п. Опять же, любая техника быстрого чтения как раз о том, чтобы не бегать глазами по строкам, а видеть целиком.

Я думаю, что большинство таких рассуждений — чисто размышлизмы. Но на практике, запись в столбик придумывали на экранах 30-40 символов в ширину. Не знаю насчёт тебя, а я сижу сейчас напротив экрана, который даёт мне в терминале 210 символов в ширину. Ты всерьёз думаешь, что сможешь убедить меня потратить 3/4 этого пространства на пустое место?
avatar
Не вполне размышлизмы, с моей стороны это напротив, хардкорная практика, практика, практика.
Сейчас конкретно я сижу перед браузером :) А вообще, бывает, работаю с кодом открывая три и даже четыре окна параллельно рядом друг с другом. Почему окна открываются слева-направо, четырьмя столбцами окон? Почему там код в столбец? Почему они не открываются друг-под-другом? (ну ок, два окна еще можно). И почему я матюгаюсь, скроллируя окошко влево-вправо, когда какой-то деятель нафигачил длинных строк? :)

Всерьез убеждаю тебя освоить редактирование с параллельным открытием нескольких окошек рядом… Дико удобно, да и если кто-нибудь видит, немедленно оценит твою крутизну :))))
avatar
Выходит, у разных людей разная практика…
avatar
А ведь ещё можно монитор вертикально повернуть! :) Ну это у тех моделей, где подставка позволяет. Я в таком режиме документацию обычно читаю в *.pdf
avatar
Забыл еще написать (но думал об этом), что когда мы увидим дизассемблер, то команды идущие подряд в строке будут развернуты.
А когда кто-то напишет нормальный IDE — как ставить брейкопинты и степать прям по коду?
avatar
Ну серьёзно, просто сочиняешь что попало уже.
avatar
Написать «сочиняешь что попало» хорошая такая аргументация, ага. Перейдем от сущностей на людей ;)
avatar
Ну просто сидя в каком-нибудь Intellisense редакторе, ты всерьёз будешь мне говорить что может возникнуть проблема от того что у кого-то 5 команд в строке? Ну да, чуть другой интерфейс понадобится, но несерьёзно это как аргумент выдавать.

Напомню, в C разрешено больше одной команды в строке. И мы все до сих пор живы.
avatar
Я, кстати, в С очень часто обработку ошибок в одну строчку пишу, чтобы простыни снизу равной кол-ву основного кода не было когда с вложением проверки делаешь. Метку «error» использую в качестве аналога деструктора, если до этой проверки были выделены ресурсы (инициализированы драйвера, аллоцирована память (да, я пользуюсь динамическим выделением памяти)).
Типа:
...
if (OS_NULL == queue_hd) { s = S_INVALID_QUEUE; OS_LOG_S(L_WARNING, s); goto error; }
...
error:
    //free allocated resources
    return s;
avatar
Посыпаю голову пеплом, мне не удалось объяснить =) Я про дебаг, не про intellisence.
Дебаггером в отладке не простепаешь по statements в строке.
Дебаг-инфа сохраняется в виде адрес->строчка исходного кода.
avatar
Я понимаю. Но С-то мы как-то дебажим, хотя там запросто строка в несколько строк ассемблера может трансформироваться. Или наоборот, если очень хочется, можно наверняка и редактор научить показывать нам одно, дебаггеру другое и всё это согласовывать.
avatar
я пишу в sjasm код, получается .sna, для отладки ставится jr $, далее ставятся бряки сами.
avatar
Про номер 3 язык уже сбил. Самый важный пункт.

Номер 3.1 — вкусовщина. Раньше я всегда писал (ololo+1), сейчас мне кажется, что это путает. Чаще ввожу специально явную ссылку. Но вообще, обычно у меня в одном исходнике обычно можно найти и так и эдак. Когда-нибудь преодолею…

Номер 4 — вкусовщина.

Номер 6 требует в качестве подпункта ссылку на макро-библиотеку Flying, которая не содержит ни одного компилируемого байта:
zxpress.ru/article.php?id=3614

Реальный дзен и, если чуть серьёзнее, там и правда есть несколько хороших идей.

Хотя у меня всё не так! :)
avatar
вкусовщина.
приемлемо только по началу — одноразовое исполнение, но что делать потом?
с кучей ссылок на ссылки и данными оттуда, которые ссылаются на данные.

либо же — быстрый но рабочий набросок за один вечер, который абсолютно был не описан но сегодня для тебя имеет значение как особенная реализация стандартной процедуры
avatar
я прошу прощения, но я пару дней ел АY формат :)
avatar
Это ты про 3.1 «приемлемо только по началу — одноразовое исполнение, но что делать потом?
с кучей ссылок на ссылки и данными оттуда, которые ссылаются на данные»? Ну да, ссылок больше. Но есть одно достоинство — ты не путаешь метки с данными. Пример из моего кода:
trb_play
track_pos	equ $+1
	ld hl,0
	ld a,(hl) : add a : jp m,plx1

Видишь? Мне не нравится писать ld (trb_play+1),hl, потому что я начал рефактор, добавил команду и получил чудесные глюки.
Да, это больше меток и труда. Но это реально лучше код.
avatar
А вот с точки зрения рефакторинга — это хорошая, блестящая аргументация, которая бьет все остальное.

я кажется делал так: вводил две метки, одну на строке с командой, чтобы нельзя было ничего вписать между меткой, а вторую ставил вне строки. Т.е.
trb_play
track_pos:  ld hl,0

Соответственно, первая метка это имя функции для call/jump, вторая чисто для данных. Да, ее нельзя использовать «где-то там» без контроля, и это плохо, error-prone.
Плохо уже помню, но кажется конструкций вида label equ $+1 в некоторый момент просто не было… Сейчас лучше использовать label equ $+1, еще и потому на других машинах встретится именно это.
avatar
хех, а я вообще под fasm вот такую дичь умудрялся делать:

@@f7:
        cmp al, 0x7 ; Function 07h - Set/Get Display Start
        jnz @invoke
        ; clear "wait for retrace" flag
        db 0x82, 0xCB ; or bl, ?
sds_or  db 0x00
        db 0x82, 0xE3 ; and bl, ?
sds_and db 0xFF


потом уже понял что это ну совсем не дело :)
avatar
тебя венда еще не избаловала (:
avatar
У меня в старом коде из 1990х такого добра навалом. Во-первых, из-за того, что я не всегда умел работать с $. Во-вторых потому, что я написал много старого кода в Zeus, и любые недокументированные команды приходилось вводить точно так же, байтами. В-третьих, я тогда сидел в своём собственном отладчике, без дизассемблера, и помнил кучу команд наизусть, так что писать хексами мне было легко :)

Только отладчик у меня был в десятичной системе и команды я помнил в десятичной системе…
avatar
И эти люди травили Михипа!
avatar
Zeus с отладчиком? муахахах, STS хватает.
avatar
VBI мне импонирует тем что у него упрощенный и правильный взгляд на мир. Все должно быть устроено просто.
Нет, ну в самом деле, конструкция
ololo 
 equ $+1
ld hl,0

вызывает кратковременное преткновение ума, необходимо пусть хоть и кратковременно, но все же понять что означает эта метка, вычислить ее значение в уме. Вместо equ $+1 для других команд там должно быть equ $+2 и даже equ $+3, а это уже error-prone.

Это основное.
Такжке для логической аргументации можно упомянуть нарушение принципа verbosity в командах которые используют эту метку.
ld (label+1),reg мне явно показывает что это само-модифицирующийся код, тогда как ld (label),reg такого не показывает, скрывает это от меня.
avatar
Всё должно быть устроено ровно настолько сложно, насколько нужно! :)

Это не всегда означает просто, увы.
avatar
Я скорее о том что существуют два вектора — люди в сторону усложнения, и люди в сторону упрощения.
(Эйнштейн) «Все должно быть изложено так просто, как только возможно, но не проще.»

С этим тесно связан закон достаточного основания. Любая сложность должна быть весомо аргументирована. Но это уже из области построения систем, как таковых.
avatar

3.1. equ для меток
Об этом нельзя сказать ничего плохого, но есть метод проще. Вместо чего-то типа:
equ $+1
ololo ld hl,0

Так пишут только мудаки!

Время 8-ми байтовых меток давно ушло. Экономить не обязательно, не ZEUS.
ага и zeus отменили, да? Помести см себя на место другого, который будет использовать твой код на другом ассемблере.

1. Не пишите код в линию.
ld a,h, b,l,d,i: or a: jr z,milf — это замечательно, и настолько лаконично… но двояко, для меня лично.
а теперь сравни время набора такого кода и форматированного сырка. Учись читать, короче.

фак сам себе написал короче.
avatar
о портах — офигенное замечание, даже не задумывался никогда о таком.
но всё таки — это всё связано удобством для себя, в прошлом и будующем, а так-же для остальных.
с кратким кодом не согласен, но я знаю — это вкусовщина.
avatar
Дима, зевса твоего давно уже проапдейтили под XXI век: www.desdes.com/products/oldfiles/zeus.htm!!!
avatar
в курсе. мало интересного там.
avatar
Ты неправ, интересного там очень много, но слишком всё самобытно сделано…
avatar
согласен, но способ запуска cp/m еще тот. Меня интересовал путный ассемблер и отладчик.
avatar
Так пишут только мудаки!
И я :)
Про метки — я бы ещё локальные, с точкой которые, упомянул бы. Нравятся они мне, не засоряют неймспейс )
сравни время набора такого кода
Мне кажется, дешевле всё же набрать по-человечески, чем потом сушить мозги.
Хотя я тоже люблю пхать в строку короткие смысловые блоки типа or a: jr z, milf.
avatar
а я, оказывается, о них и не в курсе.
расскажи плиз, о .1
avatar
Проще показать:


do_some_stuff
	ld a, b
	or a: jr z, .leave
.loop
	add hl, hl
	djnz .loop
.leave
	dec hl
	ret

do_other_stuff
	ld b, a
.loop
	sbc hl, de
	djnz .loop
	ret


Код, само собой, от балды и смысла не несёт, оптимизировать не надо )
Штука в том, что метки с точкой «видны» только внутри блока, до следующей «обыкновенной» метки. Внутри второй процедуры я спокойно могу использовать имя .loop повторно, и ничего мне за это не будет )
Однако к такой метке можно при желании доступиться и извне, указав полный путь типа jp do_some_stuff.leave.
Т. е. такая себе более удобная / приятная для понимания альтернатива вот этим вот всем 1b / 2f.
avatar
Я иногда использую локальные метки и они, кстати, периодически незаменимы (в макросах).
Но у меня как-то мышление неправильно под них выстраивается, и я начинаю психовать, когда пытаюсь писать с ними систематически. Особенно, видимо, мешает как раз их локальность, т.к. номерки скачут через другие метки, а локальные — не могут и меня это как-то очень деморализует.
avatar
Ага, есть такое дело. Но мне вот как-то сразу они зашли, и потребность прыгнуть выше головы не деморализует обычно ) Скорее, воспринимаю как намёк на то, что, возможно, надо бы для себя чуток по-другому реструктурировать данные или иначе разбить на процедуры.
avatar
У меня было смешнее даже. Я впервые увидел их в исходниках биперных движков Shiru, и долго психовал, зачем он это наворотил там. А потом, в процессе работы над Rain, мне пришлось в какой-то момент разложить внутренний цикл биперного движка и там было такое кол-во самомодифицирующего кода, что мне вначале думалось что я повешусь. Именно в этот момент до меня дошло зачем нужны метки с точечками, просто реально спасло там. Поэтому, не очень даже любя их, знаю что вещь иногда совершенно незаменимая.
avatar
-for whom how
— MGIMO fininshed?
= ask!
avatar
Ах учись читать .?. Значит когда мы изучаем скорость исполнения умножателе-делителей, то позволять себе тестировать не оптимизированный код типа вот такого:
MULTI   LD   H,MULTAB/512
        ADD  HL,HL
        LD   C,(HL)
        INC  HL
        LD   B,(HL)

это нормально? Это я так понимаю всё ради компилятора не способного дать возможность построить таблицу чисел не подряд байтик за байтиком, а +256. И самое главное проводятся тесты, да ещё и плакать начинаем, что лишние 512 байт памяти в дырки ноликов превратились. А тестировать надо только оптимизированный код, вот такой:
MULTI   LD   H,HIGH(MULTAB)
        LD   C,(HL)
        INC  H
        LD   B,(HL)
...
        ALIGN 256
MULTAB
DEFW_XX MUL0
DEFW__X MUL10
DEFW__X MUL11
DEFW___ MUL120
DEFW___ MUL121
DEFW___ MUL122
DEFW___ MUL123
DEFW___ MUL124
DEFW___ MUL125
DEFW___ MUL126
DEFW___ MUL127
DEFW___ NEG128
DEFW___ NEG127
DEFW___ NEG126
DEFW___ NEG125
DEFW___ NEG124
DEFW___ NEG123
DEFW___ NEG122
DEFW___ NEG121
DEFW___ NEG120
DEFW_SX NEG11
DEFW_SX NEG10
DEFW_SX NEG09
DEFW_SX NEG08
DEFW_SX NEG07
DEFW_SX NEG06
DEFW_SX NEG05
DEFW_SX NEG04
DEFW_SX NEG03
DEFW_SX NEG02
DEFW_SX NEG01
DEFW___ NEG009
DEFW___ NEG008
DEFW___ NEG007
DEFW___ NEG006
DEFW___ NEG005
DEFW___ NEG004
DEFW___ NEG003
DEFW___ NEG002
DEFW___ NEG001

Вот это читаемо LD H,HIGH(MULTAB), а так тестируют только мудаки LD H,MULTAB/512, тратящие место и главное такты на ограниченность компилятора. Слово мудаки я использовал только по отношению к тому кто его написал.
avatar
Суров! Там кстати INC HL тоже не был нужен; INC L вполне прокатил бы.

Но меня заинтересовало другое. Умножение. У тебя что, тоже есть такая дрянь раскрянченая? Или ты вообще?

И, в любом случае, было бы здорово, если бы ты поделился, даже не самими процедурами своими, но примерно порядком — сколько, как ты считаешь, должно занимать знаковое умножение 8*8->8 и 8*8->16?
avatar
high или [ есть не во всех ассемблерах.
avatar
парни, я вижу противостояние кода в линию против кода в строку.
и считаю что оба этих метода — удобны. и знаю последователей — вас, psndcj.
но мне просто удобнее мой, привычый :)
  • VBI
  • 0
avatar
7. Просто документируй.
avatar
кстати-кстати. сложные места лучше описать в каменте — что именно делается.
avatar
Вспомнил ещё один мега-важный пункт.

Люди. Складывайте библиотеки в модули. Это реально упрощает жизнь.
avatar
Неистово плюсую. Дядя Вова, вот очень бы хотелось код взаимодействия с зифой в отдельный модуль, например!
Глядишь, поборол бы наконец лень и написал себе синхрилку папки с PC, а то слот SD скоро в ноль сотрётся ;)
avatar
kowalski, Следите за нашим журналом!
В следующем выпуске!
Только у нас!
Всего неделя!
По одной в руки!
avatar
Писал в строку, пишу и буду писать, и в лицо всех знавал своею пылкостью молодецкой, кто мне будет говорить, что так не надо! И вообще, дядь вов, банальные вещи тулишь!
  • sq
  • +3
avatar
avatar
Интересная фишка, реализованная во многих ассемблерах для 6502 — безымянные метки. То есть просто :, а переходить к ним можно по :- или :+. Если надо через одну-две-три — можно менять количество минусов и плюсов. Это очень удобная альтернатива нашим привычным $+N для коротких прыжков типа обхода одной-двух команд, позволяет легко вставлять команды и не думать об их размере. Почему-то в ассемблерах для Z80 я подобную возможность не встречал.
avatar
это популярно скорее всего на комодоре. Видел я подобный код распаковки LZ4. пришлось просить помощи разработчика, код просто собирался неправильно.

Кстати, еще одно правило: не пишите бгомерзкий код на Alasm.
avatar
добавлю ещё такую фишку, подсмотренную в коде у Грачёва — переменные компилятора:

x=#e0
	dup 16
		_poke sinpage_start+2,x
x=x+1
	edup
  • VBI
  • 0
avatar
ты моего кода не видел(:


;-----------------output sprite
outspr:
 ld (backsp+1),sp
 ld sp,hl

n=0
 dup 4

 dup 8
 ld de,(sq+n),bc,(sq+2+n)

 dup 2
 dup 8
 push bc,de
edup

 ld hl,0-16*6
 add hl,sp
 ld sp,hl

edup

n=n+4
edup
;-------------------8 линий дубль 2
 ld hl,$7E0
 add hl,sp
 ld sp,hl

edup


backsp:ld sp,0
 ret
avatar


:)))

(шутка, shinilb0g!)
avatar
avatar
Дядечка очень в тему топика получился. Зажог и смотрит.

  • nyuk
  • +3
avatar
ld a,h, b,l,i,a,d,e,b,a,n,a,v,r,o,t: or a: jr z,milf

Если это прочитать быстро то можно вызвать демона :) Чем продолжительней строка тем круче демон.
avatar
нет, ну это край, конечно(:


dec bc:ld a,b:or c:jp nz,m1

вполне логическая связка, годная для быстроты ввода.
avatar
Дело не только в скорости, а ещё и в том, что у тебя строка делает ЧТО-ТО ОДНО. Это как одна команда в каком-то языке чуть посложнее. Считай, ты макрос ввёл.

Потому что мы все имеем опыта программирования на более высоком уровне, выделение строки для каждой команды слишком «разбавляет» код. Да, я тоже терпеть не могу вереницы присваиваний
ld hl,#4000,de,#4001,bc,6911,(hl),l:ldir

Но пора перестать мешать в кучу код в строку (нормальная идея) от синтаксиса шторма — это не одно и то же.

Голова не обязательно должна кружиться от кода в строчку:
ld hl,#4000 : ld de,#4001 : ld bc,6911 : ld (hl),l : ldir

Разумеется, любую, даже самую хорошую идею можно довести до абсурда. Но что это доказывает? Правильно, ничего.
avatar
мне нравится.
именно вариант с: нравится.
avatar
Если так всё радужно и прекрасно писания в строчку, то почему вы так «заминусовали» паренька, который что-то там делал на WCT? Я могу ошибаться, вообщем он утверждал, что пишет закорючками прямо в машинном коде. И главное, он пишет всё в строчку! О… Да у него в одну строчку вмещается так много кода, что вообще кайф. А не хотите ввести запись в формате BASE64? Шикарная штука 6 бит на 8 бит, да при 80-ти символах в строке можно 60 символов текста впихнуть, а сколько кода можно нагородить? НЕТ? А почему нет? Это выходи за пределы ваших правил? А ваших ли? — Не ваших? А… Кто-то это в популярном компиляторе реализовал .?.. Да — точно… Это истина высшей инстанции, только так теперь и надо воспринимать «асм», а то, что это не ассемблер Z80 — уже не важно. Правила языка спускаем на классную фичу. Не важно, что тема ЧИТАЕМОСТЬ кода, «фича» навязанная компилятором важнее. Теперь кто не так пишет как другие называется — «мудак», не важно, что не читается, не важно, что до этого пишем про «давайте писать код так, что бы другой мог заюзать», тут же налепили в строчку, и так удивлённо, — «а вы чего читать не умете, не можете понять ???». Ну тогда компилируйте вот такой код:
LD A,STRAT_ENCODE:LD B,8:LD HL,DATA:XOR (HL),LD (HL),A:INC HL:DJNZ $
И теперь угадываем DJNZ $ на какую из команд должен указывать, предлагаю в компиляторе делать значение адреса $ делать по RND на каждое двоеточие?
Код в строку не читаем. Да ляпать по клавиатуре меньше, да макросы как не использовали, так и не используем, но это не важно, главное это «фича» — в строку писать.
XOR A:LD HL,A:LD ($+3),A:JP (HL)
У вас такой команды LD HL,A нет, сделайте — будет, фича ведь, меньше клавиш нажимать, и модно как. А ($+3) генерируем по-рандому. Но ещё лучше записываем вот так
OzaKW4aECH488n4B1f3J412AaioCfmIGwe4KWW2ICb2
… Смотрите, какая компактная запись, а как читается? Ну просто прекрасно. От того что в СИ можно писать в строчку не значит что код будет читаем, это не значит, что так надо писать. От тог что в русском языке есть набор унижающих других слов, не значит что их надо применять, иначе давайте возвращайте забанненых тролей назад, они просто писали в строчку слова которые вы не можете правильно прочитать, а некоторые не могут прочитать потому что «мудаки». Про «мудака» — то про меня, конечно же. Вот по этой причине я и не выкладываю свои стати, я ведь «мудак» пишу на своём асаме, да в масоне.
avatar
Чо злой-то?
avatar
Robus, ну просто убери $ и все твои примеры станут сразу нормальными.

Т.е. проблема опять в том, что ты утрируешь немного. И хочешь писать по-своему. Но пойми, Вова напал на нас первый и мы (многокомандвстрочники) просто защищались. Я же не говорю всем как писать, я говорю что имею право писать и мне так удобно. И есть свои достоинства, далеко всё не чёрно-белое. А разные люди приходят и говорят, что ld b,c,d,e — плохая команда, и что $ в строке непонятно к чему привязать. А то, что у меня в коде нет ни первого и не второго видимо спросить забыли.
avatar
Я не хочу что бы это называлось ЧИТАЕМЫЙ КОД! Это не читаемо, это не по правилам и не может нигде и не при каких обстоятельствах назваться читаемым. Называй это как хочешь, «фича», «супер удача», «невероятный прорыв мысли», но только никак не читаемый код. Читаемый это когда понятно что конкретно делает кусок кода. Я не говорю о том, что бы он был прост, а том что бы он был читаемым. А главное во всём этом совсем другое, это возможность инструмента, которым ты пользуешься. Возможность располагать больше кода на экране достигается выбором монитора с расширением и редактором способным работать с фонтом 6х7 пикселей, а не компилятором который даст тебе писать текст змейкой. Вот смотри я использую текстовый редактор только тот, который мне позволит работать с блоками текста, для построения таблиц. Я вообще не рассматриваю ни один редактор который не даёт мне такую возможность. Мне очень важно умеет ли он раскрашивать текст, но давать мне возможность отметить блок и порисовать в тексте на скорую руку картинки это важнее. Так что мне написать компилятор, что бы мог воспринимать магическую запись текстового редактора ради таблиц? Или тот же ALIGN, да всё равно что пишется текст спиралькой, это не экономит ни место в памяти ни такты процессора, без ALIGN для меня вообще нет компилятора. Он у меня вообще везде, и после ALIGN стоят не только 256, а 16, если таблица на 16 байт. А если надо что бы ALIGN не тёр до границы ноликами есть ORGALI, я на этом всём пишу прошивки для флешек, где надо генерировать HEX файлы, в которых нужно делать дыры из ничего вообще, просто пространство. Эти инструменты важнее на порядок записи в строчку. И речь идёт не о том, что ты пишешь не верно, а том, что этот код не читаем. ALIGN 256 это чёткое описание твоего желания, а ORG ((($-1)/256)+1)*256 это частный случай с учётом повезёт тебе с округлением или нет, и что бы ты не говорил это не читаемо. Можешь написать туда MOD, это так же не читаем. Это всё равно что описывать «if» через «for», поверь, я могу тебе сделать анализатор-генератор СИшного кода и поменяю местами все if и for, и это откомпилирует, но опять таки это не читаемо. Я понимаю, если бы вы обсуждали макросы, что-то типа вот такого:

INT:  PUSHA
      ...
      MUSIC.OUT
      CALL EFFECT
      MUSIC.STREAM
      MUSIC.PLAY
      ...
      THREAD.SWITCH
      POPA
      INT.END

Я верю, что каждый может в строчку написать сто-тыщ операций, но это не читаемо. Читаемы слова, объясняющие что ты там на прерываниях делаешь. И потом когда будет происходить «дебаг», править надо будет только макрос, в котором через двоеточие, по спиральке, змейкой и крестиком пиши как угодно. Опять-таки я не говорю про простой код, пусть он будет сложный, пусть будет ветвистый и выжатый до последнего такта, но максимально читаемый. А каждый пример который был тут приведён не несёт оптимизации, и не несёт информативность, он несёт только фичу.
И я ещё раз говорю, слово «мудак» я применяю только к тому, кто его применил ко мне. И да, я очень сильно разозлился, кода прочитал что я «мудак» только лишь потому, что кто-то вышивает крестиком, да ещё постыдно это называет читаемый код.
avatar
Ну вообще-то мудаком в упомянутом тобой случае оказался и я тоже, так что непонятно даже.

А про код… ну я на самом деле сейчас в некотором недоумении, потому что тут просто удивительно сколько людей поругались сейчас из-за удивительно ничтожного повода. Ну вот я внимательно прочёл. Вертикальные блоки. Макросы. Ну если очень коротко, у нас разное понимание что такое читаемость. У Raidera одна, у тебя — другая, у меня как видишь третья оказалась. Не знаю что делать по этому поводу. Для начала, наверное, нужно перестать по этому поводу ссориться.
avatar
Лёша, я ссорюсь только с одним человеком, веся моя язва направлена на того, кто назвал другого «мудаком» по сути по-религиозным причинам. Я тут ни разу не влазил ни в чей монастырь, поэтому и не писал какую я использую процедуру умножения. Я не понимаю вообще зачем считать сколько она весит в данном случае, так же не понимаю зачем нужна самая быстрая точка на планете. Ведь я точно знаю, что я не буду её использовать в этом виде, обе процедуры видоизменятся до не узнаваемости в зависимости от того какой будет эффект. Ну ведь точками шарики да кубики уже рисовали-перерисовали-зарисовали всё что только можно. Каждый стремится придумать то чего нет, а точки уже есть лет 20 как. Вот как только будет статься о рисовании пиксельной фигуры не точками, а например, кусками блоков, паперами, рассуловиание алгоритмов заливки, тут же моментально умножение сольётся с десятком процедур. Вот я и не лез в этот монастырь. Мой вариант какой-то, который мигрировал с 1994-ого года

        .8
         ADD HL,HL
         JR NC,$+3
         ADD HL,DE
        ..

Но боюсь на него CALL бывает очень редко.
avatar
вот вариант, который не требует понимания:


 INC h:LD A,h
 AND 7:jr nz,$+12
 LD A,L:ADD A,#20:LD L,A:jr c,$+6
 LD A,H:SUB 8:LD H,A


haters gonna hate
avatar
Нее… Я — мудак, не понимаю шо там такое написано, вы Д'артаньян, всё ок, молимся вам, пишем код змейкой…
IzcOrD788LMOaLcSDNUvWuYBk0otWm!ya3kwi0Ixb3oxktEwi3k#WWlxW8Fui3YyWhkxb3IxW#Ewn3Uxkp28YlF843Eyo3Ux#tEBW8Uyu2Yxgp28ix!wepUy#3YuWpEBWyEwuNExWekxa3oviNUwgxUwWuYBkKR5IzcOrD786zsRqLcS
avatar
Сударь, довольно оскорбительны Ваши слова.
avatar
Я нихуя не понял
avatar
не дано значит
avatar
А для чего я постоянно пищу фразу «слово мудак я использую только по отношению к тому, кто его написал»? Ты же мне не предлагал научиться читать и быть мудкаом, лишь потому что я не пишу в строку? Но только один человек это затронул, я и начал так себя вести, но только по отношению к одному конкретному человеку.
avatar
Robus, плиз, перестань разговаривать с каким-то воображаемым человеком, при этом ещё и ругаясь с ним.
мы то не в курсе с кем ты говоришь. а читаем именно мы а не он :)

но!
LD A,32,(DE),A:INC E:DJNZ $-2 === IzcOrD788LMOaLcSDNUvWuYBk0otWm!ya3
а это — кусок кода из wild player, подпрограмма PRLIN
т.е. нужно дополнительное и немалое усилие что-бы прочитать что здесь, особенно если весь стиль — такой.
другими словами — такой код нужно сразу приводить к стандартным мненоникам, а потом только разбираться и тестить и ИСКАТЬ ГДЕ НЕ ВЕРНО СКОНВЕРТИЛ К СТАНДАРТНЫМ МНЕМОНИКАМ z80!
нахер эти головоломки дополнительные?

с другой стороны —
ld hl,#4000: ld de,#4001: ld bc,6911: ld (hl),l: ldir гораздо легче воспринимается.
благодаря тому что ЕСТЬ КОМАНДЫ, А НЕ какая-то МЕТАКОМАНДА LD, и они отделены пробелами и двоеточием.

если учесть что для некоторых асмов нужно писать XOR A,A а для других эта же запись на выходе выглядит как XOR A: XOR A, то дополнительно себе устраивать дебаг ещё и по этому поводу я вообще не пойму.

В общем — любой дебаггер выводит по команде в строку, не смешивая. это показывает как код выполняется процессором.
и поэтому, это — нормальная запись.
avatar
Лёша, проблема не в записи в строчку, а в системе. О чём пишет Вова, что он прошёл какой-то путь, что попробовал так, сяк, шмяк, и напоролся на то, что со временем стал путаться в своём коде. И он описывает, что ему не хватает системы. И я уверен что главное с чем он столкнулся, что предыдущая система, в данном случае «фича-строка» замылила его глаз, и простая ошибка что-то испортила. И я уверен, что если систематизировать свой код, придумать читаемую форму записи, то простые ошибки не будут портить тебе жизнь. И так же со временем ты сможешь проще и быстрее вникать в то, что сам написал. Мало того твой код легче и проще будет мигрировать от проекта к проекту. Вот форма записи в строчку это самая не систематизированная запись. Пока проект состоит из скролла и летающих точек система не особо нужна, лучше, что бы так же была, но крайне принципиально систематизировать, когда ты пишешь что-то, что собирается в 20-30 эффектов, и каждый эффект переплетается в памяти с соседом, или завязан на общих процедурах, в топу «фичу», важнее в 20-ти метрах кода не допустить ошибок, что бы в один прекрасный день, ты не сел над глючной демкой, и понял, что где-то при сборке вылез баг в модной форме записи «строчка». Это важнее в десять раз, это даёт возможность делать лаконичные библиотеки, а не пихать туда просто скопом всё, что было наработано за 20-30 лет.
avatar
Лёша, так вот я пишу кучу ассемблерного кода и у меня тоже вырабатывается система. Вова пробовал что-то своё и сделал свои выводы. А у меня другой путь и я пришёл к нему тоже не от досужих размышлений, а работая. У меня код весь мигрирует от проекта к проекту. У меня ОЧЕНЬ систематизированная запись, и, что самое парадоксальное, я прошёл за последние 4 года от полного неприятия кода в строчку, к очень регулярному его использованию. Я пишу вроде не совсем тривиальные демы. Не только летающие точки и скроллеры. Мои исходники документированы в разы лучше чем 99% спектрумовского опен-сорса.

И невзирая на всё это, у меня выработались другие предпочтения.

Твоё знание не абсолютно. Так же как и моё разумеется. У нас разный дзен, Лёша. Не о чем спорить.
avatar
Не у нас с тобой разный «дзен», а у меня с вообще всеми взятыми. Как раз твой «дзен» очень схож с Вовиным, у вас лишь полюса разные, а представление очень схоже. Именно поэтому вы каждый пишете статьи и каждый общаетесь друг с другом, спорите ссоритесь обсуждаете, обожаете и ненавидите. Я не пишу не потому что не хочу, а потому что понимаю, что это выстрел в небо из рогатки с надеждой познакомиться с иными цивилизациями. И не потому, что никто не поймёт, а потому, что всё что я делаю, до мелочей взбесит каждого без исключения. Я до невероятности выбешиваю людей своим подходом. Ты не представляешь как я издевался над людьми на собеседованиях, особенно на тех, где предлагают тестовые задания делать. Я от них не отказываюсь чисто из спортивного интереса поиздеваться. Я за последние 8 лет привык на собеседования ходить с бутылкой «виски», они очень любят спорить на «виски», крутые программеры-перцы пьют только виски. Прости это статистика. Так что, поверь, я просто ни о чём не спорю вообще. И что бы не раздражать никого я привык молчать. Вообще не понимаю чего я влез в эту дискуссию?
avatar
Лёш, я улыбаюсь, значит что-то мы друг о друге всё же узнали. Контакт инопланетных цивилизаций :)

А теперь пошли спать!
avatar
Какие же вы весёлые. Посоны, кто что использует пробел или табуляцию? Что правильнее и кто мудак?

avatar
В одном из гарнизонов, где служил мой отец, один полковник развёлся с женой из-за того, что она отказывалась ставить зубные щётки в ванной щетиной в одну сторону.
avatar
ща и ты получишь :)
Деня, твой звин сильно расхолаживает.
Есть большой смысл ставить метки в начале строки — так ты визуально отделяешь начало подпрограммы от кода:
ld a,(lives)
	or a
	jr nz,notGameOver
	;
	ld a,GS_GAMEOVER
	ld (gameState),a
	ret
	notGameOver
	ld a,GS_LOADING
	ld (gameState),a


«notGameOver», деня! а не " notGameOver"
почему? потому что другие асмы воспринимают эту метку иначе.
отсюда же:

setVirusFlag

ex af,af'
ld a,1
ld (mapVirus),a
ld a,virusDelay
ld (mapNoVirusCount),a
call putVirusToRadar
ex af,af'
ret

минимум — пробел в начале строки перед кодом, и никаких пробелов для меток, переменных.
В общем, все две твои игры которые я портировал, начинались с того что я приводил текст в нормальный вид, я, блин, ФОРМАТИРОВАЛ КОД с начала.
зачем? да он не компилируется!

и да, я пользуюсь двумя-тремя табами перед каждой строкой кода :)
avatar
Я сейчас ещё хуже пишу ;) Хотя Lirus ваще богомерзкий, я там извращался, написал всё на основных регистрах, зарелизил. А потом такой, блин, ix+32 даст мне сразу клетку под точкой, а я там ld bc,32: add hl,bc #fuckfuckfuckafterthis
avatar
и да, я пользуюсь двумя-тремя табами перед каждой строкой кода :)
ДА КАК ТЫ МОЖЕШЬ! ТЫ НЕ ИМЕЕШЬ ПРАВА! ТЫ ОБЯЗАН ИСПОЛЬЗОВАТЬ ОДИН ТАБ! ЛУЧШЕ ВООБЩЕ НЕ КОДЬ, ЧЕМ ТАК! СЖЕЧЬ ВЕДЬМУ!
  • sq
  • +3
avatar
Я все понимаю, кроме одного: почему я по вашему мнению не имею права писать так, как мне удобно и как мне хочется? Откуда иакая уверенность в своем методе, как в единственно правильном?
  • sq
  • +2
avatar
Ты ведь понимаешь, что речь тут шла не о том, как правильно\неправильно писать, а о том, как писать так, чтобы через месяц-год-десятилетие с лёгкостью прочитать свой код (а в идеале и чужой) и понять его.
avatar
Илья, если честно, то не понимаю. Как не понимаю проблемы «как понять свой код» вообще, в принципе. Как можно не понять свой код спустя хоть сколько угодно лет, и уж тем более — как в этом может помочь написание в столбик? Если ты не можешь разобраться в своем собственном коде — ты определенно что-то делаешь неправильно, и код в строку тут ни про чем. И можете считать меня эгоистом, но меня в самую последнюю очередь заботит то, чтобы кто-то разбирался в моем коде.
avatar
Ну, хз, из топика я именно так понял. Наверное, надо другие тайм-зоны почитать )))
avatar
Мне думается так: пиши для себя что угодно, но если писать статью здесь или в журналах, то лучше отойти от sjasm/STORM синтаксиса и потрудиться написать комментарии.
С похожим я тоже столкнулся, когда выложил сырки под Enterprise128 — пользователь написал, что непонятно и неясно, каким ассемблером пользоваться. тем же исходником я тоже столкнулся и долго вспоминал, что было написано год назад.
avatar
уверенность только в том, что хорошо оформленный исходник ты сам сможешь довольно быстро понять при первой необходимости.
я отлично запомнил метку для подпрограммы у Коши:
GROB

что делает эта процедура? ;)
avatar
Вова, это всё потому что метка в строку написана!
Надо было написать:
G
R
O
B

чтобы тебе понятнее было!
  • sq
  • +3
avatar
я напомню:
avatar
Вова, прочти метку задом наперёд и всё станет прямо-таки очевидно.
avatar
отсылка к известному кодеру ROB G? ;)
avatar
1 команда в строке — good
особенно — в интрах, когда начинается оптимизация — там такая жесть по перетасовке всего и вся начинается…
avatar
на отличненько все ебанулись :)
avatar
Я пишу в столбик. И метки не значащие, так что понимаю потом с трудом.
<br />
VOOO:
	CALL DRAWROT  ;AAAAAAAAAA
AARIO:
	LD HL,(STEP)
	INC HL
	LD (STEP),HL
	LD A,H
	CP 3
	JR NZ,VEVER
	LD A,L
	CP 0
	JR NZ,VEVER
	LD HL,MAV
	LD (VEGAS-2),HL
	LD HL,VEGAS+3
	LD (VEGAS+1),HL
	JP VSIO
VEVER:
	LD A,H
	CP 6
	JR NZ,KLEVER
	LD A,L
	CP 16
	JR NZ,KLEVER
	LD A, $CD
	LD (GOVR),A
	LD HL,GOVOR
	LD (GOVR+1),HL
KLEVER:
	LD A,H
	CP 9
	JR NZ,SERVER
	LD A,L
	CP 0
	JR NZ,SERVER
	LD A, 2
	LD (VSIO+1),A
	XOR A
	LD (VOOO),A
	LD HL,0
	LD (VOOO+1),HL


SERVER:
	LD A,H
	CP 12
	JR NZ,QSERVER
	LD A,L
	CP 0
	JR NZ,QSERVER
	LD HL,DRAWSHUM1
	LD (GOLOVA+1),HL
	LD A, 3
	LD (VSIO+1),A

	LD A,$CD
	LD (MANIVLPRAVO),A
	LD HL,IZMENKO
	LD (MANIVLPRAVO+1),HL
	LD HL, MOUTH+18
	CALL DRAWROT
	LD HL,EYES
	CALL DRAWGLAZA

QSERVER:
VSIO:
	LD A,5
	OUT (254),A
	EI 
	RET

VOTOR:
.BYTE 0
GLAGOL:
.BYTE 0
ROVON:
.WORD ROPOS-1
ROPOS:
.BYTE 0,0,0,0,0,0,0,0,0,0,0,0
.BYTE 0,1,1,1,1,1,1,1,1,1,1,1,0
.BYTE 0,3,3,3,3,3,3,3,3,3,0,1,1
.BYTE 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0

avatar
VOOO, VSIO. IZMENKO!
avatar
надобно DRAWGLAZA в библиотеку добавить
avatar
DRAWROT — это адрес процедуры с Сашей Грей?
avatar
Сублимация, diver4d, от неё не спастись :)
Только зарегистрированные и авторизованные пользователи могут оставлять комментарии.