мнемоники опкодов и их формат - это специфическая часть какого-то конкретного ассемблера. могут быть некоторые стандарты на наименование опкодов, но всякие там спецсимволы - это каждый ассемблер может делать как хочет. и запись мнемоники зависит от того, какой ты ассемблер возьмешь. вот это STA D,LABEL,X не более чем идентификатор, явно указывающий ассемблеру, какой именно опкод генерировать. при использовании STA LABEL,X тупой ассемблер может в лучшем случае генерить 16-битные опкоды, так что ему надо указывать иногда, какой конкретно опкод ты хочешь.
вот у
https://bisqwit.iki.fi/source/snescom.html#opsize этого ассемблера, эти модификаторы ставятся перед лейблом и могут быть "!", "@" и просто #. на таком асме написан F-ZERO.
в исохдниках, которые я тебе дал, почти везде (я покрайне мере навскидку не нашел), используется тупо "STA LABEL,X" везде, но в листингах бывают и 24-битные и 16-битные опкоды сгенерены. т.е. там все отдано на откуп только ассемблеру.
ну как пример, мой любмый DASM для денди, сам определяет, 16-битный операнд или 8-битный ставить в зависимости от записи числа или просто от его размера - все, что меньше 256, будет в 8-битный операнд сгенерено по умолчанию. но иногда тебе надо 16битный опкод явно там, где операнд меньше 256, тогда ты ставишь STA.W LABEL,X и это специфика этого конкретного ассемблера, причем ида такого синтаксиса конечно же не знает и кстати вообще не отражает в опкодах размер операндов по умолчанию, что иногда дает глюки при пересборке, потому что порой некоторые игры на денди написаны как-то вручную и там рандомно могут встречаться 16-битные операнды, там, где можно и надо ставить 8-битные.
в общем, если сделать в иде асмовый файл и потом удалить "D," по всему тексту, ты получишь код, который съест любой ассемблер. (кстати, ида генерит опять же для денди опкоды свдигов с явным операндом А всегда, хотя это не характерно для обычных асмов, которые подразумевают, что А там всегда и его просто не воспринимают - т.е. опкод вообще везде обычно без операнда, а тут он как бы есть!)
Добавлено позже:короче конкретный пример. игра F-ZERO
оригинальный код:
;=============== Check pass word =======================================
Check_passwd200
LDY #0004H
Check_passwd210
LDA !Pass_word_data,Y
CMP >Backup_RAM,X
BNE Check_passwd300 ; different pass word
DEX
DEY
BPL Check_passwd210
;-----------------------------------------------------------------------
INC <param0
RTS
;
;=============== Copy pass word ========================================
Check_passwd300
Check_passwd310
LDA !Pass_word_data,Y
STA >Backup_RAM,X
DEX
DEY
BPL Check_passwd310
RTS
дизасм иды
.A8
.I16
; =============== S U B R O U T I N E =======================================
sub_82C4E9:
LDY #4
loc_82C4EC:
LDA aFzero, Y
CMP byte_700000, X
BNE loc_82C4FC
DEX
DEY
BPL loc_82C4EC
INC D, word_7E00F8
RTS
; ---------------------------------------------------------------------------
loc_82C4FC:
LDA aFzero, Y
STA byte_700000, X
DEX
DEY
BPL loc_82C4FC
RTS
; End of function sub_82C4E9
смотрим внимательно. в асме
LDA !Pass_word_data,Y
CMP >Backup_RAM,X
разного размера операнды - ! - 16-битный, > - полный 24-битный.
в иде между ними нет разницы, только по хексу можно посмотреть, какого размера операнд
в иде
INC D, word_7E00F8
в асме
INC <param0
т.е. модификатор 8-битного операнда - <.
автозамена "D," на "<" дает тебе ассемблируемый код при условии, что асм сам определит, какие опкоды сделать 16, а какие 24битными (а он сможет, если будет знать, какой текущий банк данных используется)
в данном конкретном случае, банк кода 82, а банк данных 00, т.е. для программы ниже 8000 адреса - это банк программы 80. значит 16-битный операнд будет из 82 банка ссылаться всегда в 80. а вот офсет бекаповой рамы в банке 70 он уже не достанет. так что 24-битный офсет указан явно программистом.