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

Кстати, темку можно продолжать всем желающим, на случай каких-то вопросов. Ее и закрепить можно было бы.
Навигация
Главная страница сообщений
Следующая страница
Предыдущая страница

Перейти к полной версии