| Разработка и ромхакинг > Ромхакинг и программирование |
| Нужна помощь по командам M68k |
| << < (2/6) > >> |
| r57shell:
--- Цитата ---Scc Set According to Condition Scc --- Конец цитаты --- 277 страница M68000PRM.pdf на самой странице внизу написано --- Цитата ---MOTOROLA M68000 FAMILY PROGRAMMER’S REFERENCE MANUAL 4-173 --- Конец цитаты --- Если я не прав, значит доки врут :lol: |
| GManiac:
--- Цитата: r57shell от 13 Сентябрь 2012, 17:46:56 ---И ещё вопрос: GManiac - ты это сейчас написал? или откуда-то скопипастил, ато надоже было столько на флудить o_0. --- Конец цитаты --- Учись :lol: --- Цитата: r57shell от 13 Сентябрь 2012, 17:57:35 ---добавлю ещё на счёт прямого кода. ............ --- Конец цитаты --- Поэтому я и говорю, всегда надо думать об обратном коде. А числа, близкие к 0 снизу, т.е. всякие $FFxx, - это как правило, отрицательные числа. |
| Ti_:
--- Цитата: DrMefistO от 13 Сентябрь 2012, 18:00:20 ---Как это все учитывать? И приведите пример ситуации с нулем, и какой результат будет. --- Конец цитаты --- Значит для отрицательных чисел $00 вписывает, а для положительных $FF. На сеге обратный код? Числа от 0000 до $7FFF положительные. От $8000 до $FFFF - отрицательные. Никаких минуснулей нету. Ноль считается за положительное. |
| DrMefistO:
Спасибо) Ti_, я так и думал) |
| r57shell:
ах, окей на странице выше --- Цитата ---Description: Tests the specified condition code; if the condition is true, sets the byte specified by the effective address to TRUE (all ones). --- Конец цитаты --- на той странице где читал --- Цитата ---NOTE A subsequent NEG.B instruction with the same effective address can be used to change the Scc result from TRUE or FALSE to the equivalent arithmetic value (TRUE = 1, FALSE = 0). In the MC68000 and MC68008, a memory destination is read before it is written. --- Конец цитаты --- ну короче, понятно $FF действительно. Понимаешь, смотря чего тебе надо. если хочешь регистр обновить как должно быть, или хочешь просто результат операции. Добавлено позже: окей, допустим тебе пришел int d0 с любым мусором, то код тогда такой d0 = (d0 & (~0xFF)) | (d0&0x8000?0xFF:0); окей?) |
| DrMefistO:
Дальше идет команда: --- Код: ---ROM:00005AF6 tst.w d0 ROM:00005AF8 slt d0 ROM:00005AFA and.w #1,d0 --- Конец кода --- Я хочу чтобы у меня в d0 было бы то же самое, что и на моторолке. |
| r57shell:
короче LT так честно и не понятно, в доке написано V XOR N но судя по твоему примеру из отладчика, наоборот !(V XOR N) ну короче попробуй два кода это если не врёт дока d0 = (d0 & (~0xFFFF)) | (d0&0x8000?0x1:0); и если врёт d0 = (d0 & (~0xFFFF)) | (d0&0x8000?0x0:1); |
| DrMefistO:
Вопрос: если d0 = 0, то при вычитании 1 (.w) в d0 будет $8000? Тогда в некотором моем коде это возможно не учитывается. Я уже запутался с этими отрицательными числами. |
| r57shell:
:lol: FFFF будет, в младшем word. |
| DrMefistO:
Еще непонятнее. Ti_ писал, что: --- Код: ---Числа от 0000 до $7FFF положительные. От $8000 до $FFFF - отрицательные. --- Конец кода --- Т.е. я понимаю так, что $8000 - "-1" $FFFF - "-32767" Не так? |
| r57shell:
я вроде популярно объяснил ЗЫ: в M68k обратный код. Добавлено позже: :lol: Ты ещё поблагодари нас, что мы не стали говорить о Big-Endian, Little-Endian, и float и double :D. Тебе бы это вообще мозг разорвало :wacko: |
| DrMefistO:
Про BE, LE я вроде знаю) |
| Ti_:
-32768 -1 0 1 32767 $8000 $FFFF 0 1 7FFF |
| GManiac:
--- Цитата: DrMefistO от 13 Сентябрь 2012, 18:00:20 ---Вот что дает отладчик: Если в d0 имеется число 3C46, к примеру, то после SLT в d0 будет $3CFF, а если $8001, то в d0 будет $8000. Как это все учитывать? И приведите пример ситуации с нулем, и какой результат будет. --- Конец цитаты --- Кривой у тебя отладчик. Сначала твои результаты сбили с толку, т.к. под рукой ничего не было. По той доке на зофаре: --- Цитата --- Condition Codes set after CMP D0,D1 Instruction. Relationship Unsigned Signed D1 < D0 CS - Carry Bit Set LT - Less Than --- Конец цитаты --- TST d0 аналогично CMP #0, d0 Так вот, LT должно быть истина (т.е. SLT поставит $FF), если D1 меньше нуля. У тебя наоборот. Так же, как из поста --- Цитата ---а carry flag это когда из меньшего вычли большее. --- Конец цитаты --- следует, что CS (то бишь LT) будет тру, если второй операнд, т.е. d0, меньше первого, т.е. нуля. Щас написал проверочный код и запустил в генсе. Генс делает, как ожидается. |
| DrMefistO:
--- Цитата: GManiac ---Кривой у тебя отладчик. --- Конец цитаты --- Отладчик от r57Shell'а. Все вопросы к нему) Добавлено позже: Странно. На твоем примере оно пашет как ты и говорил. Может быть я не дал всю ситуацию? Чуть позже я дам значения xnzvc. Добавлено позже: Итак: 1) xnzvc - все по нулям; 2) в d0 у нас C64C; 3) tst.w d0 устанавливает N в 1; 4) slt d0 устанавливает d0 в C6FF; |
| r57shell:
Ну, всё окей. А ну не гнать на мой отладчик :lol:. |
| DrMefistO:
В смысле "окей"? Должно же быть наоборот, не? |
| r57shell:
--- Цитата: DrMefistO от 13 Сентябрь 2012, 18:00:20 ---Вот что дает отладчик: Если в d0 имеется число 3C46, к примеру, то после SLT в d0 будет $3CFF, а если $8001, то в d0 будет $8000. --- Конец цитаты --- Вот тут было что-то подозрительное, а в том что ты сейчас написал, всё окей. |
| GManiac:
--- Цитата: DrMefistO от 14 Сентябрь 2012, 09:02:50 ---2) в d0 у нас C64C; 3) tst.w d0 устанавливает N в 1; 4) slt d0 устанавливает d0 в C6FF; --- Конец цитаты --- Тут всё верно. C64C - отрицательное число. Поэтому ставится FF. |
| DrMefistO:
Тьфу, а мне чего-то взбрело в голову, что оно положительное) Спасибо за пояснения. Кстати, темку можно продолжать всем желающим, на случай каких-то вопросов. Ее и закрепить можно было бы. |
| Навигация |
| Главная страница сообщений |
| Следующая страница |
| Предыдущая страница |