Разработка и ромхакинг > Ромхакинг
Нужна помощь по командам M68k
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:
Тьфу, а мне чего-то взбрело в голову, что оно положительное) Спасибо за пояснения.
Кстати, темку можно продолжать всем желающим, на случай каких-то вопросов. Ее и закрепить можно было бы.
Навигация
Перейти к полной версии