Просьба подкорректировать название темы, если оно не правильное )
FASM - это flat assembler, вроде есть и под ДОС, и под Винду, и под Линукс.
Товарищ Flyman512 его типа немного поднастроил, и теперь на нём можно писать под спектрум, причем код генерится прям в TRD.
Ниже привожу авторское описание. Если что не так - сильно не пинайте, просто закройте тему или перенесите куда-нибудь.
Flyman512:
Fasm - любимый кодогенератор.
1. Немного предистории.
Предистория, предЫстория. Пред история. История Перед. Да какая разница. Пусть у меня будет предистория, хотя похоже это "не правильно". Где-то между 2000-2013 годах я периодически делал небольшие попытки начать программировать не под спектрум, а под винду. Начиная с 2013 у меня наконец-то что-то получилось. И один из факторов, благодаря которому это произошло - это FASM. FASM - это, как я помню, Flat Assembler. Писишный компиллятор ассемблерного кода. В меру навороченный, написанный на самом себе (что уже вызывает бурю эмоций и размышления о парадоксах). То есть у него есть исходники самого себя, которые этот fasm может откомпиллировать в exe, который им и будет являться. Это круто. Так что я его еще улучшил под себя. Как можно писать код без SS+Q (удаление строки под курсором) и SS+W (раздвигание строк)? Так что как в alasm'е. Добавил "продвинутую раскрасску", но об этом потом. Самое главное - нет "лишних телодвижений". Ты просто пишешь текст программы, жмешь CTRL-F9 - и fasm компилирует текст в зависимости от содержания текста. В моем случае - exe файл. Никаких линковок, ключиков - просто пишешь текст и компиллируешь, как на спектруме. При желании можно и obj файл сгенерировать, но в этом надобности нет. С этими TASM'ами и MASM'ами, постоянно какие-то проблемы были. Надо что-то сначала делать промежуточное, потом линковать - дичь какая-то. А тут все просто.
2. Fasm, компилирует спектрумовский код прямо в trd!
Как я уже упомянул, Fasm в меру навороченный. Один из его наворотов в том, что у него есть гибкая и сложная система макросов. Можно даже переопределить комманды, которые уже используются (типа ret, nop). Fasm "забывает" одно и "обучается" делать вместо этого другое. Например после такого вот кода:
Fasm начинает генерировать спектрумовский код.Код:macro nop {db 0} ;code 000 - nop macro rlca {db 7} ;code 007 - rlca macro exa {db 8} ;code 008 - exa (ex af,af') macro rrca {db 15} ;code 015 - rrca macro rla {db 23} ;code 023 - rla macro rra {db 31} ;code 031 - rra macro daa {db 39} ;code 039 - daa macro cpl {db 47} ;code 047 - cpl macro scf {db 55} ;code 055 - scf macro ccf {db 63} ;code 063 - ccf macro halt {db 118} ;code 118 - halt macro exx {db 217} ;code 217 - exx macro di {db 243} ;code 243 - di macro ei {db 251} ;code 251 - ei
macro ldir {db 237,176} ;code 237,176 - ldir
Есть макроопределения и посложнее. А для LD - так там такая простыня из if'ов...
После такого изощрения, fasm начинает для команды ret генерировать не писишный код, а спектрумовский. А у спектрума если у ret'а нет переменной, то это код 201, если указан флаг типа z, c, nc, то код уже другой.Код:macro ret op1 { pc=$ if op1 eq db 201 ;code 201 - ret else conv_oper_to_numb zx_r1,op1,nz,z,nc,c,po,pe,p,m if zx_r1<=7 db zx_r1*8+192 ;code 192,200,208,216,224,232,240,248 - ret f else display "wrong ret condition!",13,10 zx_error_(ret) endif endif }
Ах да. Еще не сказал. Я хочу поделиться своей версией Fasm'а, который может генерировать спетрумовский код, просто подключая файл с набором макросов. И исходники некоторых, относительно "законченных" программ. Причем обоего типа: и win32 и под zx.
Одно из моих достижений. Это файл "zx_macro.inc". Пример простейшей программы:
Этот код сгенерирует trd файл. Там будет boot файл, вам нужно будет просто сделать RUN в TR-DOS'е. Вы попадете в STS, где весь ваш код будет уже загружен в память по разным страничкам. В данном примере код будет RET по адресу 25000, так что в STS'е можно сделать CALL 25000.Код:include "..\zx_macro.inc" bank 16,25000 ret endtrd
Я поначалу просто прикололся, когда определил макросами пару простейших комманд. Потом, сделал еще и еще. Потом ввел все комманды, которые знал. Если чего и пропустил, то это какие-то супер-бупер недокументированные сверх секретные. Если что, можно будет их потом добавить. Под конец я сам и офигел. Писишный ассемблер генерирует спектрумовский код, но не просто генерирует, а делает trd'шник, из которого этот код можно сразу и стартануть. Смотрите исходники!
Если я когда-нибудь что-нибудь и напишу для спектрума, это будет из-под fasm'а. Огромные поля для меток, огромные тексты, комментарии - хоть поэмы сочиняй, больше не нужно экономить место исходника, чтобы не вылезал за 16 Кб из странички. Больше не нужно дробить огромный текст на отдельные странички. Рай. Правда есть некоторые отличия, которые нужно учитывать.
После меток нужно двоеточие, считывание из памяти теперь не круглыми скобками, а квадратными, и значек шеснадцатеричности не "#", а "$". Может еще чего по мелочи.
bla_bla_label: ld hl,[$4000] ;lots of comments, very huge amount of text...
Зато столько всего, чего на спектруме и не было. Тут я много могу говорить, и может быть еще поговорим, было бы у меня ощущение, что это кому-то надо. А пока скажу, что есть подробный мануал по assembler'у вместе с fasm'ом. Т.е. читая этот мануал (он на английском, но я его легко понимаю, если чего - могу помочь разбираться) вы выучите не только как пользоваться fasm'ом, но и сам ассемблер. А если чего там нет, то у меня на полке справочник по всем командам.
Вам при желании будет легче разбираться, поскольку у вас еще будут исходники реально работающих программ (сам проверял, сам писал, работают, сам пользуюсь).
Что-то я засиделся. Уже несколько часов текст набираю. Ну ничего, в худшем случае будет что в будущем почитать. :-] Зато в лучшем случае, кто-то это прочитает и ему будет хорошо. Так, что дальше?.. Так пойду накидаю исходников поприличнее, позаконченнее...
3. Исходники.
fasm.7z - текущая версия fasm'а, я по мелочи что-то добавляю ингода.
asm.7z - исходники.
macroses.inc - файл необходим для pc программ. Там такие макросы, без которых я уже не представляю программирования, периодически добавляю, но все реже и реже. Отдельная тема.
zx_macro.inc - файл необходим для компилляции trd'шников.
boot.bin - файл необходим для компилляции trd'шников.
sts6_2.bin - файл необходим для компилляции trd'шников.
zx_hookworms - живой пример того, что я взял и перевел все из alasm'а, в Fasm. Это такая игра, 6 питонов, битва, не буду об игре. Важно, что вы можете ее от-ассемблировать прямо в trd, запустить и поиграть, остальные zx-поделки для fasm'а не такие полные. И если я буду делать дальше Cash Remember, то исходники уже будут для fasm'а скорее всего.
zx_desocobanizator - тоже относительно законченная прога, но по сравнению с писишным вариантом ОЧЕНЬ медленная, даже если в эмуляторе врубить "полный вперед" на "максимальных оборотах" :-] Но как вариант разбираться как программировать в fasm'е Под spectrum может вполне помочь.
zx_supaplex - нет, это не то что вы могли подумать. Исходников у меня не сохранилось, это лишь декомпилляция выводилки (мелкая часть игрушки), но она компиллируется и запускается. Можно посмотреть на код. Именно с "быстрой" выводилки участка лабиринта supaplex и начался.
zx_alasm_to_txt - тут нужно разбираться, но не сейчас. Скажу лишь, что с помощью этого, я перетягиваю (потом все равно приходится "подправлять") исходники из alasm'а в текст для fasm'а.
Теперь немного о pc'шных исходниках.
keytester - что на zx, что на pc. Я начинаю все с keytester'а. Это своеобразный hello world. Так что это самая "простая" программа. С нее я думаю надо начинать эксперименты с программированием на ассемблере. Все что она делает - это показывает какие кнопки винда думает, что нажаты. Каждая клавиатура имеет свои особенности (комбинации клавиш, которые можно нажать одновременно без того, чтобы комп начал би-бикать, мол много клавиш нажато сразу).
xor - это пример консольной программы. Довольно навороченная на данным момент. Ее можно считать законченной, хотя в данный момент много чего "недописано" (help например). Это типа rar'а или 7z'а, но оно не сжимает, а дико ксорит файлы. Представте, мегабайт рубится по битам, и каждый бит прыгает в случайное место. Никто никогда не расшифрует. Можно ксорить в придачу и по какому-нибудь файлу. А еще вы можете сделать свою уникальную xor. Там есть место для дополнительных преобразований. Ваша задача "замучать" мегабайтный буфер по-своему (только чтобы можно было его "размучать"). И только ваша xor'илка сможет разксорить. Плюс еще пароль. А еще можно прилеплять данные xor-архива к avi'шкам, pdf'кам, rar'ам, еще к чему-нибудь, чтобы никто не догадался, что у вас там архивчик на пару мегабайт лишних... "Почувствуй себя конспиратором"! Ха-ха. Сам себя насмешил. :-]
hookworms - писишный вариант спектрумовской игры. Ой, сколько времени мы игрались в 2000-х годах. Ведь уникальная игра была (я сейчас про спектрумовскую версию). 6 человек могло в реалтайме. 6 червяков/питонов друг друга подрезают, жрут еду, удлинняют хвост, в конце должен остаться только один... Ксати, сравните zx_hookworms и этот виндовый hookworms. Многое сделано по образу и подобию спектрумовского. Да и чувствуется некоторая спектрумовская атмосфера. Я сижу под WinXP, вроде подкрутил для Win7, а "восьмерка" вроде как XP - все работает, но что-то могу и не знать. Откуда мне... "ни ответа, ни привета". "Сижу я в темнице (довольно светлая кстати комната)..." (оффтоп, что-то начинаю я с себя дуреть: какого я лешего сижу в фаре текст набираю (раскладка спектрумовская, кстати, фонетическая) и уже вечереет. Ну да ладно, приступы спектрумизма наверное. А вот я-то в свое время о-о-о...)... Так где это я.
desocobanizator - о. Десокобанизатор. В процессе написания. Сейчас он больше декериксонизатор, чем десокобанизатор. А ему все одно какие варианты просчитывать. Значит цель этой программы взять исходное состояние закодированное в 1 Кб (матрица 32 на 32), вызвать подпрограмму сканирования вариантов (то, что из исходной ситуации можно сделать), проверить вариант (победили, проиграли), отсеять тупиковые варианты, записать если такой вариант еще не был записан, повторить до полного удовлетворения автора (меня). А там варианты Socoban'а или Kerixer'а - уже не важно. Может в будущем что-то еще прикручу, просто прикольно как прога работает, графики всякие рисует, циферки бегуд, прямо заглядение, попробуйте сами. F5 - save, F8 - load, F9 - screen shot.
hview - на всякий случай редактор asm'а/hex'а.
equates - ну там всякие переменные иногда подсмотреть, типа чему равно VK_ESCAPE, VK_SPACE, или YES, NO, TRUE, FALSE.
fasm_docs - manual'ки, которые надо читать, чтобы разобраться, а потом в качестве справочника. Там еще win32api есть, очень нужная вещь. Главное помнить, что все api'шные функции это всего-лишь напушивание параметров в обратом порядке, и колл в квадратных скобках. Т.е.
push parameter3
push parameter2
push parameter1
call [super_buber_win32api_function]
А ответ прийдет в eax'е. А параметры - это dword'ы (32 битные числа). В fasm'е заменяется на что-то типа (это макроса такая) Invoke super_buper_function,parameter1,parameter2,paramet er3
P.S. Ссылка на архив.