Важная информация

User Tag List

Показано с 1 по 6 из 6

Тема: Для спектрума можно писать на FASM

  1. #1
    Guru Аватар для ZX_NOVOSIB
    Регистрация
    24.12.2006
    Адрес
    р.п. Маслянино, Новосибирская обл.
    Сообщений
    5,547
    Спасибо Благодарностей отдано 
    233
    Спасибо Благодарностей получено 
    258
    Поблагодарили
    178 сообщений
    Mentioned
    5 Post(s)
    Tagged
    0 Thread(s)

    Post Для спектрума можно писать на FASM

    Просьба подкорректировать название темы, если оно не правильное )

    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 "забывает" одно и "обучается" делать вместо этого другое. Например после такого вот кода:
    Код:
    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
    Fasm начинает генерировать спектрумовский код.

    macro ldir {db 237,176} ;code 237,176 - ldir

    Есть макроопределения и посложнее. А для LD - так там такая простыня из if'ов...
    Код:
    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 начинает для команды ret генерировать не писишный код, а спектрумовский. А у спектрума если у ret'а нет переменной, то это код 201, если указан флаг типа z, c, nc, то код уже другой.

    Ах да. Еще не сказал. Я хочу поделиться своей версией Fasm'а, который может генерировать спетрумовский код, просто подключая файл с набором макросов. И исходники некоторых, относительно "законченных" программ. Причем обоего типа: и win32 и под zx.

    Одно из моих достижений. Это файл "zx_macro.inc". Пример простейшей программы:

    Код:
                    include "..\zx_macro.inc"
    
                    bank 16,25000
                    ret
    
                    endtrd
    Этот код сгенерирует trd файл. Там будет boot файл, вам нужно будет просто сделать RUN в TR-DOS'е. Вы попадете в STS, где весь ваш код будет уже загружен в память по разным страничкам. В данном примере код будет RET по адресу 25000, так что в STS'е можно сделать CALL 25000.

    Я поначалу просто прикололся, когда определил макросами пару простейших комманд. Потом, сделал еще и еще. Потом ввел все комманды, которые знал. Если чего и пропустил, то это какие-то супер-бупер недокументированные сверх секретные. Если что, можно будет их потом добавить. Под конец я сам и офигел. Писишный ассемблер генерирует спектрумовский код, но не просто генерирует, а делает 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. Ссылка на архив.
    Куплю корпус и материнку от Spectrum +2/+3

  2. #1
    С любовью к вам, Yandex.Direct
    Размещение рекламы на форуме способствует его дальнейшему развитию

  3. #2
    Master
    Регистрация
    24.05.2005
    Адрес
    г. Запорожье, Украина
    Сообщений
    992
    Спасибо Благодарностей отдано 
    571
    Спасибо Благодарностей получено 
    364
    Поблагодарили
    239 сообщений
    Mentioned
    2 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    а чем он принципиально лучше sjasm ?

  4. #3
    Guru Аватар для ZX_NOVOSIB
    Регистрация
    24.12.2006
    Адрес
    р.п. Маслянино, Новосибирская обл.
    Сообщений
    5,547
    Спасибо Благодарностей отдано 
    233
    Спасибо Благодарностей получено 
    258
    Поблагодарили
    178 сообщений
    Mentioned
    5 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    shurik-ua, х.з., я не в курсе ) Лучше об этом спросить у автора. Вот как с ним можно связаться:

    Так буду закругляться. С'copypast'чу последнюю часть из хелпа к Cash Remember v2.01. {Контакты.

    Bit Message (это такой p2p почтовик): BM-2cU8efQ9TMgohJjepn997pbiirKp9HSgc8

    Также ищите меня в ZeroNet'е (это такой p2p интернет). Я там частенько нахожусь, хоть и с переменной регулярностью. Проще всего привлечь мое внимание прокомментировав одно из последних моих сообщений на страничке ZeroMe.

    Cell-Phone. В v2.00 я публиковал свой телефон. В данный момент я считаю это плохой идеей.
    }

    Да... неожиданный поворот. Сначала я опубликовал свой cell-phone в версии 2.00 как единственный способ, который я смог представить чтобы кто-то смог ко мне "достучаться". В версии 2.01 я решил, что {это плохая идея}. А вышло оно вот как. Ну во-первых ничего "ужасного" не случилось с 2013-го года. А во-вторых я был приятно удивлен вчера получив sms'ку со ссылкой почитать статью. Сегодня почитал статью. И вот почти целый день пишу вот этот текст. Прямо чукча сегодня писатель какой-то (а не читатель, как обычно; и не в игры игратель и пр.)

    Если буду делать 2.02, то опять телефон посчитаю хорошей идеей, может кто еще чего напишет. :-]

    А еще лучше (по крайней мере для меня), если спектрумисты обратят внимание на ZeroNet, где никакой цензуры, никаких копирастов. Страницы раздаются пользователями, распределенными по всему шарику (земному). Копирасты бессильны. Пиши что хочешь, даже сайт можно свой сделать, никому платить не надо, и будешь сам себе хозяин. И никто "забанить" не сможет. Правда и люди могут выбирать что им поддерживать, а что - нет.

    В зеронете есть самая популярная социальная сеть - ZeroMe. Я там, как вы догадываетесь - Flyman. Буду теперь регулярно постить приглашение для спектрумистов. Т.е. самое последнее от меня сообщение часто будет про zx. Надеюсь, там и соберемся. Ато я как-то не хочу (и никогда не делаю) "регистрироваться", помнить какие-то пароли, логиниться, иметь собаковую почту со спамом и анти-спамом. ZeroNet - это своеобразная находка. "Пиртупир", генерируешь сколько надо ID (мне одного хватает). И оно как-то работает, как-то меня от других отличает. Приходишь на новый сайт с чатом или форум какой-то, говоришь - я Flyman (выбираешь ID), и оно работает!

    Ладно. Я понимаю, что что-то я забыл упомянуть, но не буду поддаваться синдрому перфекционизма (когда не можешь закончить, потому что нужно проверить чтобы все было безупречно). Буду закругляться. Итак наговорил гараздо больше, чем планировал.

    Мысль-то простая - "используйте мои исходники, приходите в ZeroNet". Нет, взял, да написал кучу всего. :-]
    Куплю корпус и материнку от Spectrum +2/+3

  5. #4
    Guru Аватар для Shiny
    Регистрация
    19.01.2017
    Адрес
    г. Арзамас
    Сообщений
    2,121
    Записей в дневнике
    36
    Спасибо Благодарностей отдано 
    0
    Спасибо Благодарностей получено 
    21
    Поблагодарили
    10 сообщений
    Mentioned
    3 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    видел другие версии ассемблера - не понравились. Fasm удобен, если писать 256b под мсдос, а под Спектрум все же удобнее приличный редактор и ассемблер - pasmo или ужясм.


    \

  6. #5
    Guru Аватар для NEO SPECTRUMAN
    Регистрация
    22.05.2011
    Адрес
    г. Дзержинск, Украина
    Сообщений
    6,832
    Спасибо Благодарностей отдано 
    479
    Спасибо Благодарностей получено 
    656
    Поблагодарили
    511 сообщений
    Mentioned
    10 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Цитата Сообщение от ZX_NOVOSIB Посмотреть сообщение
    После такого изощрения, fasm начинает для команды ret генерировать не писишный код, а спектрумовский.
    и что?
    при развитых макросах любой асм такое сможет

    с таким же успехом
    если бы sjasm поддерживал переменное количество параметров для макросов и еще некоторые плюшки
    можно было бы сделать чтоб он компилировал х86

    - - - Добавлено - - -

    Цитата Сообщение от shurik-ua Посмотреть сообщение
    а чем он принципиально лучше sjasm ?
    тем кто умеет кодить в фасм-е
    просто не нужно будет изучать команды sjasm-а
    и привыкать к его глюкам и тонкостям

  7. #6
    Activist
    Регистрация
    10.01.2010
    Адрес
    Смоленская обл.
    Сообщений
    423
    Спасибо Благодарностей отдано 
    131
    Спасибо Благодарностей получено 
    123
    Поблагодарили
    59 сообщений
    Mentioned
    0 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Вообще говоря для спека было бы логичнее использовать не fasm а fasmg от того же автора. Он почти идентичен по управляющим директивам но изначально вообще не содержит команд ни для какого процессора, в этом его универсальность - все команды описываются макросами и подгружаются инклюдами ( не тащит переопределяемые писишные коды, которые могут вдруг где-нибудь выскочить), есть плюшки перед fasmом с макросами и наименованиями локальных меток, возможно еще с чем нибудь, перед sjasmом думается более гибкая обработка условных компиляций
    В fasm есть директивы fix и match, позволяющие создавать например подгрузки инклюдов по шаблону, типа :
    Код:
    lang fix ru
    
    
    match =ru, lang { include "local/ru/lc.inc" }
    match =en, lang { include "local/en/lc.inc" }
    А в fasmg инклюды похоже вообще можно в макросы пихать. Пример с форума:

    Код:
    macro cpu? type* 
      eval 'include "arch/',`type,'.inc"' 
    end macro
    
    cpu 8086
    Минусы - нет инструкции на русском и в sjasm есть опция --dos866 а что скомпилят fasmы с например db "чето на русском" даже представить боюсь )))

Информация о теме

Пользователи, просматривающие эту тему

Эту тему просматривают: 1 (пользователей: 0 , гостей: 1)

Похожие темы

  1. Пакет для i8080: WinAsm Studio + fasm g
    от shoorick в разделе Разное
    Ответов: 35
    Последнее: 21.04.2018, 19:39
  2. Ответов: 6
    Последнее: 04.03.2016, 23:32
  3. Ответов: 31
    Последнее: 08.08.2014, 23:47
  4. Ответов: 21
    Последнее: 23.02.2005, 20:56

Ваши права

  • Вы не можете создавать новые темы
  • Вы не можете отвечать в темах
  • Вы не можете прикреплять вложения
  • Вы не можете редактировать свои сообщения
  •