Разработка и ромхакинг > Программирование
Ребенок изучает asm [SMD]
SPOT:
Кто поможет разобраться с асмом 6502
Есть две команды CLC и SEC, они включают и выключают флаг переноса (Carry Flag).
Допустим есть значение
--- Код: ---CLC
ADC #$10
--- Конец кода ---
и
--- Код: ---SEC
ADC #$10
--- Конец кода ---
Какая между ними разница?
Rumata:
--- Цитата: SPOT от 19 Июль 2023, 22:10:35 ---Какая между ними разница?
--- Конец цитаты ---
--- Цитата: SPOT от 19 Июль 2023, 22:10:35 ---они включают и выключают флаг переноса
--- Конец цитаты ---
CLC = Clear Carry, C -> 0
SEC = Set Carry, C -> 1
SPOT:
Я не понимаю, что происходит с числом при применение этих флагов.
Допустим у нас есть 250, мы его загружаем в "аккумулятор"
LDA #$FA
После чего, хотим добавить к нему 10
ADC #$0A
Таким образом у нас должно получится число 260, но поскольку, как я думаю, "аккумулятор" 8-битный, то мы получим 4.
Но как я понимаю, если использовать SEC то результат будет 16-битным, но как он сохранится в 8-битный аккумулятор?
Марат:
Если вы выставляете флаг C (carry flag) с помощью команды SEC, то при сложении командой ADC, к итоговому числу добавляется 1. Никакое 16 битное число не получается. Все старшие биты отпадут просто напросто, так как не поместятся в аккумулятор. Максимум будет выставлен overflow flag (флаг переполнения).
Просто при работе с числами больше 8 бит, которые хранятся в памяти, вы должны учитывать carry flag. И если carry flag выставлен в результате сложения, вы должны добавить единицу к старшему разряду в памяти. Или отнять, если делаете вычитание
Добавлено позже:
Это как в школе учили сложение столбиком 14 + 17. Сначала складываем младшие разряды 7+4 = 11. 1 пишем, 1 в уме. Вот этот carry flag и выполняет функцию запоминания "1 в уме". Дальше мы складываем 1 + 1 + "1 в уме".
А на языке ассемблера последняя команда записывается как adc.
SPOT:
Марат, спасибо, кажется я понял.
Cyneprepou4uk:
SPOT, поскольку предыдущий выполненный код может поменять состояние флага C на неопределенное, в большинстве случаев тебе надо записывать CLC перед ADC, и SEC перед SBC, чтобы гарантированно ничего лишнего не прибавилось/не отнялось, а было прямолинейное сложение/вычитание.
Во всех остальных случаях ты специально не делаешь CLC/SEC, рассчитывая на то, что предыдущий код поставит тебе нужное состояние флага C. Например при сложении 16-битных чисел, когда остаток от сложения младших байтов переносится на сложение старших байтов.
SeregaZ:
так ладно. все забыл правда уже и не доделал... ну это как я всегда делаю и бросаю на половине. хочу тут кой чо другое сделать :) в начале понятно нужен заголовок и вроде как он 512 байт... это я потом иденить накопаю что там в заголовке должно быть. а вот дальше хотелось бы рисовать картинку и наверное из 2 слоев. что-то типа:
--- Код: ---512 байт заголовка
pal: ; запоминаем адрес где лежит палитра
incbin "pal.bin" ; загрузить палитру
tileset:
incbin "ts.bin" ; тайловый сет
tilemap1:
incbin "tm1.bin" ; тайловая карта 1 слоя
tilemap2:
incbin "tm2.bin" ; тайловая карта 2 слоя
; некая процедура
procedure
перевести режим экрана в какой-то там ; 320×224 хотелось бы
загрузить палитру из адреса pal
загрузить тайловый сет из адреса tileset
загрузить 1 тайловую карту из адреса tilemap1
загрузить 2 тайловую карту из адреса tilemap2
отрисовать на экране
rts ; rts - видимо конец процедуры
; произвести вызов процедуры
call procedure
--- Конец кода ---
если с загрузкой файлов все понятно. как забабахать указанную логику, чтоб ASM68K.EXE её понял? конец процедуры вроде понятно - rts . прочее как сделать? и наверное нужна пауза, чтоб эта картинка удерживалась на экране?
а вызов процедуры видимо jsr ?
Ti_:
--- Цитата: SeregaZ от 23 Сентябрь 2023, 23:08:35 ---если с загрузкой файлов все понятно. как забабахать указанную логику, чтоб ASM68K.EXE её понял? конец процедуры вроде понятно - rts . прочее как сделать? и наверное нужна пауза, чтоб эта картинка удерживалась на экране?
--- Конец цитаты ---
Ну это уже не вопрос про асм, а про то как создать ром sega md с картинкой используя асм?
Например, можно так:
SeregaZ:
тут, я так понимаю, только один слой загружается? и не понятно насчет палитры. то место, где она вроде как загружается - закомменчено, что несколько сбивает с толку :)
--- Код: --- ;lea pic_palette,a0
--- Конец кода ---
ну и возвращаясь ко второму слою - надо будет расскоментить эти строки и тогда второй слой заработает?
--- Код: ---; lea pic_map1,a0
; move.l #$40000003,(a2) ; VDP PORT ADDRESS VRAM $C000 - MAP1
; move.w #$0001,d3
; bsr.s load_map_40x28
--- Конец кода ---
да, заработало. руль.
вот тут тоже вроде бы понятно - ожидание 5 секунд, пока отрисована картинка:
--- Код: --- move.w #5*60,d0 ; 5 seconds
wait
bsr wait_next_frame
dbf d0,wait
--- Конец кода ---
60 типа герц в секунду, поэтому 5 * 60. дальше идет видимо отключение экрана.
а как можно включить следующий кадр? скопировать всю часть выше начиная с @load_vdp_params и до dbf d0,wait с добавлением новых меток из датасекции снизу с данными второго кадра?
SeregaZ:
я так понимаю, что код, рожаемый IDA'ой мягко говоря не совсем совместим с ASM68K.EXE ? то есть нужно еще дополнительно парсер сделать, чтобы из идовского асм кода текст переформатировал в ASM68K.EXE совместимый?
а то я тут мальца запнулся:
move a6,usp ; 0x4E66
в моей недосистеме 0х4E66 расшифровывает как:
4E66 movem.l -(a6), a7/a6/a5/a3/d6/d3/d2/d1
понятно что где-то видимо накосячил. IDA и еще одна досовская приблуда показывает как move a6,usp
но на этот usp - ругается ASM68K.EXE и не хочет собирать.
оказалось надо не голый move, а move.l
move.l a6,usp
еще брыкается на всякие типа:
align $10
но там видимо ошибочное распознавание и надо видимо пропускать, без дизасма - типа как данные какие-то. графика там к примеру.
дальше IDA, скатина, видимо недописывает FF к значению:
clr.w ($FFF006).w - ASM68K.EXE ругается. правильно должно быть:
clr.w ($FFFFF006).w
SeregaZ:
проблема в том, что иногда в комментах проскальзывают спецсимволы и в результате файл выгрузки асм файла в моем случае читается не верно. то есть должно читать построчно, а по факту бывает берет и жрет две строки, как одну... из-за чего путанница частенько происходит. вот есть ли возможность в иде (6.8 в моем случае) оставить комментарии, где прям много текста, и прибить где односимвольные комментарии ида добавляет. типа '?' вот такого рода комменты портят мне все дело :(
Добавлено позже:
хы... и оно даже запустилось после всех измывательств :)))) правда повисло сразу после нажатия старт...
DrMefistO:
--- Цитата: SeregaZ от 04 Февраль 2024, 00:09:26 ---я так понимаю, что код, рожаемый IDA'ой мягко говоря не совсем совместим с ASM68K.EXE ? то есть нужно еще дополнительно парсер сделать, чтобы из идовского асм кода текст переформатировал в ASM68K.EXE совместимый?
а то я тут мальца запнулся:
move a6,usp ; 0x4E66
в моей недосистеме 0х4E66 расшифровывает как:
4E66 movem.l -(a6), a7/a6/a5/a3/d6/d3/d2/d1
понятно что где-то видимо накосячил. IDA и еще одна досовская приблуда показывает как move a6,usp
но на этот usp - ругается ASM68K.EXE и не хочет собирать.
оказалось надо не голый move, а move.l
move.l a6,usp
еще брыкается на всякие типа:
align $10
но там видимо ошибочное распознавание и надо видимо пропускать, без дизасма - типа как данные какие-то. графика там к примеру.
дальше IDA, скатина, видимо недописывает FF к значению:
clr.w ($FFF006).w - ASM68K.EXE ругается. правильно должно быть:
clr.w ($FFFFF006).w
--- Конец цитаты ---
В smd_ida_tools_v2 есть экспортёр в код, собираемый различными ассемблерами m68k.
SeregaZ:
так. ладно, с начала.
1. запускать надо 32 битную версию ИДЫ я так понял.
2. предварительно засунув в нужные папки из архива tools v2 - loaders и plugins
3. при загрузке рома выбирать нужно варианты:
Sega Genesis/MegaDrive Rom v.2
Motorola MC68xxx universal emulator (или все-таки обычный MC68000 а не универсальный?)
при этом выборе будет выбивать сообщения х32 и CD сегменты - шлем их нафиг и отказываемся? там третий еще диалог будет FDC и Time сегменты какие-то. тоже слать их лесом и отказываться?
4. когда уже окно программы иды откроется - надо будет выбрать окошко дебаггера. и я так понимаю надо выбрать пункт GensIDA Debugger plugin. и тогда вылезет окошко, что типа ожидается Gens... который я понятное дело не смог куда надо установить. хотя там вроде мелькало какое-то сообщение, что дескать надо в exceptions.cfg что-то там добавить, но я его открыл, посмотрел бараньими глазами и закрыл. не понятно как туда добавлять...
вот значится на пока остаются следующие вопросы:
как доустановить эти папки gens и script из архива с тулсами v2
нахрена нужен питон, на который ида все время ругается
почему выбор варианта выгрузки в LCT рожает файл три часа, выписывая по байтно в строчку. понятно видимо сначала код нужно было разобрать... но все равно бред. выгрузка в ASM работает практически моментально. другое дело что там бывают ошибки...
DrMefistO:
1. Да
2. Да
3. Rom, он сам выберен нужный проц. На остальные вопрос отвечать в зависимости от того, использует ли ром эти регионы. Если ром не 32X и не SegaCD, или ты не уверен, можно выбирать Yes на все.
4. Отладчик идёт в архиве с остальным. Но для экспорта тебе он не нужен. Можно и статично всё разметить, после чего выгрузить.
Добавлено позже:
3-й питон нужен иде.
SeregaZ:
--- Цитата ---4. Отладчик идёт в архиве с остальным. Но для экспорта тебе он не нужен. Можно и статично всё разметить, после чего выгрузить.
--- Конец цитаты ---
а есть инструкция четко по пунктам на пальцах куда что добавить, исправить и вписать, чтобы этот самый отладчик Gens заработал? в 6.8 то работает и эмулятор запускается. причем походу версия круче или новее, чем та которая у меня - звук сэмплов там получше. а вот в 7.7 или 8.3 ничего не запускается. надо как-то втолковать Иде где лежит этот самый Gens.
--- Цитата ---3-й питон нужен иде.
--- Конец цитаты ---
насколько критично его отсутствие? я просто не пользуюсь этим питоном... вроде ж старая 6.8 все разбирает в роме и без него. это 7.7 и 8.3 брыкаются. если таевский баттл сити все разбирает вроде бы нормально, то вот немезисовский мк3 в 6.8 разбирается и видит кучу кода, а в новых идах не хочет. в начале только чуток разберет и бросает.
я так полагаю надо запустить отладчик и там поиграть чтобы код увиделся и добавился?
--- Цитата ---No i/o port definitions for device 'sega_md' are found
Feel free to add them to exceptions.cfg
--- Конец цитаты ---
Добавлено позже:
ааааа... то есть она не умеет запускать эмулятор сама, как 6.8 ида? понятно теперь.
Добавлено позже:
и в этой v2 видимо эмулятор говнее, так как в v1 звук лучше чем в этой версии.
Добавлено позже:
и все-таки что-то у меня видимо работает не так. выгрузка lst работает меееееедленно. три часа так может выгружать. впрочем asm тоже. в 6.8 такого не было. быстро выгружало.
Беларус:
SeregaZ, у тебя Винда 32-х битная или 64? Вроде бы на 32 что-то не идёт или глючит.
SeregaZ:
64 Win 7.
DrMefistO:
Эмулятор тот же самый, один в один. Настройки звука можешь поиграться.
Ты же говорил, что выгрузка работает нормально.
Выгружать нужно не под отладкой, а после или до.
Запускать gens нужно из папки, которую ты качал. Качал ты с github же?
SeregaZ:
ну черт знает. надписи в эмуляторах чуть различаются. настройки звука одинаковые в них обоих. но в одном прям ярко звучит (из старой иды 6.8), а во втором (и в той версии что у меня эмулятор генс для игр на компе) как будто из бочки. плюс стартовая мелодия на выборе бойца бьет с ошибкой барабан. примерно как в комикс зоне одна из мелодий играет не верно - вот та-же фигня и тут со звуком. помню мы решали в GEMS эмуляторе такую-же проблему... ну как решали... я там присутствовал :) там какой-то множитель кароче "не тот" типа он выставлен под какую-то там сеговскую частоту... а на компе то 44100. и поэтому звучит отвратно. а чтобы звучало правильно - надо эту там какую-то циферку влепить другую. то есть по отношению к приставке код будет не точным, но зато на компе будет играть более сочно. https://www.emu-land.net/forum/index.php/topic,83239.msg1444575.html#msg1444575
ничего я не понял с этой отладкой чего отключать где как... ничего не включая чистую иду открою, загрузить готовый idb файл, выбираю LST... и понеслась моча по трубам три часа выгружает при сохранении. ASM сохранение чуть быстрее, но все равно один фиг три часа ждать. 6.8 ида выгружала ASM почти молниеносно.
запускал из папки, которую я скачал. v2.
v1 в старой иде он сам там откуда-то эмулятор запускает...
DrMefistO:
--- Цитата: SeregaZ от 07 Февраль 2024, 02:11:21 ---ну черт знает. надписи в эмуляторах чуть различаются. настройки звука одинаковые в них обоих. но в одном прям ярко звучит (из старой иды 6.8), а во втором (и в той версии что у меня эмулятор генс для игр на компе) как будто из бочки. плюс стартовая мелодия на выборе бойца бьет с ошибкой барабан. примерно как в комикс зоне одна из мелодий играет не верно - вот та-же фигня и тут со звуком. помню мы решали в GEMS эмуляторе такую-же проблему... ну как решали... я там присутствовал :) там какой-то множитель кароче "не тот" типа он выставлен под какую-то там сеговскую частоту... а на компе то 44100. и поэтому звучит отвратно. а чтобы звучало правильно - надо эту там какую-то циферку влепить другую. то есть по отношению к приставке код будет не точным, но зато на компе будет играть более сочно. https://www.emu-land.net/forum/index.php/topic,83239.msg1444575.html#msg1444575
ничего я не понял с этой отладкой чего отключать где как... ничего не включая чистую иду открою, загрузить готовый idb файл, выбираю LST... и понеслась моча по трубам три часа выгружает при сохранении. ASM сохранение чуть быстрее, но все равно один фиг три часа ждать. 6.8 ида выгружала ASM почти молниеносно.
запускал из папки, которую я скачал. v2.
v1 в старой иде он сам там откуда-то эмулятор запускает...
--- Конец цитаты ---
Можешь заснять видео, в котором долгий экспорт показан?
Насчёт звука - вполне может быть, что что-то не так, т.к. он заточен в первую очередь на отладку, а не на точность эмуляции в плане звука.
Навигация
Перейти к полной версии