Разработка и ромхакинг > Ромхакинг и программирование
Ищу информацию и уроки
(1/1)
Cyb3rM4n:
Люди, поделитесь, пожалуйста, информацией и уроками по программированию под SNES.
gegmopo3:
http://en.wikibooks.org/wiki/Super_NES_Programming

Вот я по этому раньше разбирал, остальное головой додумывать, и все будет ок=)
Ti_:
Есть кусок код с Снеса и есть Сеги, надо глянуть отличие есть тут или нет, кто знает:


--- Код: ---$80/9B0F A9 FF       LDA #$FF                A:1D18 X:0001 Y:0000 P:envMXdizc
$80/9B11 8D C6 0B    STA $0BC6  [$80:0BC6]   A:1D18 X:0001 Y:0000 P:envMXdizc ; move.b  #$FF,car_posby_Ztmp+1-mm(a4)

.....

$80/9B46 20 53 9D    JSR $9D53  [$80:9D53]   A:1D18 X:0001 Y:0000 P:envMXdizc  ; bsr.w   jumping_phys_sub2

.....



$80/9D53 9C C3 0B    STZ $0BC3  [$80:0BC3]   A:1D1C X:0002 Y:0000 P:envMXdizC
$80/9D56 AD BB 0B    LDA $0BBB  [$80:0BBB]   A:1D1C X:0002 Y:0000 P:envMXdizC   car_updown_tm2
$80/9D59 8D C4 0B    STA $0BC4  [$80:0BC4]   A:1D1C X:0002 Y:0000 P:envMXdizC
$80/9D5C 10 03       BPL $03    [$9D61]      A:1D1C X:0002 Y:0000 P:envMXdizC
$80/9D5E CE C3 0B    DEC $0BC3  [$80:0BC3]   A:1D1C X:0002 Y:0000 P:envMXdizC
$80/9D61 A0 05       LDY #$05                A:1D1C X:0002 Y:0000 P:envMXdizC
$80/9D63 0E C4 0B    ASL $0BC4  [$80:0BC4]   A:1D1C X:0002 Y:0000 P:envMXdizC
$80/9D66 2E C3 0B    ROL $0BC3  [$80:0BC3]   A:1D1C X:0002 Y:0000 P:envMXdizC
$80/9D69 88          DEY                     A:1D1C X:0002 Y:0000 P:envMXdizC
$80/9D6A D0 F7       BNE $F7    [$9D63]      A:1D1C X:0002 Y:0000 P:envMXdizC
$80/9D6C AD C6 0B    LDA $0BC6  [$80:0BC6]   A:1D1C X:0002 Y:0000 P:envMXdizC car_posby_Ztmp+1
$80/9D6F 18          CLC                     A:1D1C X:0002 Y:0000 P:envMXdizC
$80/9D70 6D C4 0B    ADC $0BC4  [$80:0BC4]   A:1D1C X:0002 Y:0000 P:envMXdizC
$80/9D73 8D C6 0B    STA $0BC6  [$80:0BC6]   A:1D1C X:0002 Y:0000 P:envMXdizC   car_posby_Ztmp+1
$80/9D76 AD C5 0B    LDA $0BC5  [$80:0BC5]   A:1D1C X:0002 Y:0000 P:envMXdizC
$80/9D79 6D C3 0B    ADC $0BC3  [$80:0BC3]   A:1D1C X:0002 Y:0000 P:envMXdizC
$80/9D7C 8D C5 0B    STA $0BC5  [$80:0BC5]   A:1D1C X:0002 Y:0000 P:envMXdizC car_posby_Ztmp
$80/9D7F 60          RTS                     A:1D1C X:0002 Y:0000 P:envMXdizC





ROM:0000DB52 jumping_phys_sub2:                      ; CODE XREF: JUMPING_PHYS+94p
ROM:0000DB52                 move.b  car_updown_tm2-mm(a4),d0 ;       $4e8e(a4)
ROM:0000DB56                 ext.w   d0
ROM:0000DB58                 asl.w   #5,d0 ; * 32
ROM:0000DB5A                 move.w  d0,car_posbyZ_nu-mm(a4) ;        $4e96(a4) (not used)
ROM:0000DB5E                 add.w   d0,car_posby_Ztmp-mm(a4) ;       $4e98(a4) byte
ROM:0000DB62                 rts                                  ;   $4e99(a4)=car_posby_Ztmp+1
--- Конец кода ---
gegmopo3:
Так кто нет, только в СНЕС еще есть "car_posby_Ztmp"

$80/9D76 AD C5 0B    LDA $0BC5  [$80:0BC5]
$80/9D79 6D C3 0B    ADC $0BC3  [$80:0BC3]
$80/9D7C 8D C5 0B    STA $0BC5  [$80:0BC5]

Где ROL $0BC3 происходило тоже 5 раз.
Ti_:

--- Цитата: gegmopo3 от 16 Май 2011, 05:40:00 ---Так кто нет, только в СНЕС еще есть "car_posby_Ztmp"
Где ROL $0BC3 происходило тоже 5 раз.

--- Конец цитаты ---
$4e96 = $0BC3
$4e97 = $0BC4
$4e98 = $0BC5
$4e99 = $0BC6
; так на Снес bc3/bc4 нужны как память для доп расчета, снес не может сделать asl.W  ?   ; на Сеге они не используются потом.
gegmopo3:
REP #$30 ;acc - 16 bit
ASL $0BC3 - будет тебе сдвиг 16-битный.
Мог бы кусок побольше скинуть, а то я не вижу, какой флаг у процессора 8 или 16 бит.

Тогда так-то нет различий.
Ti_:

--- Цитата: gegmopo3 от 16 Май 2011, 13:03:30 ---REP #$30 ;acc - 16 bit
ASL $0BC3 - будет тебе сдвиг 16-битный.

--- Конец цитаты ---
Спасибо, может так и сделать тогда на Снес,  а потом обратно надо в 8? И ext.w как сделать.
И там уже видно будет есть или нет.-
то есть эта строчка на smd роли не играет :
--- Код: ---move.w  d0,car_posbyZ_nu-mm(a4) ;        $4e96(a4) (not used)
--- Конец кода ---
, и на снес туда не записывать.
gegmopo3:


--- Код: ---org $809D56
  LDA $0BBB 
  STA $0BC4
  BPL positive

  DEC $0BC3 
positive:
  rep #$20 ; (  чтобы Y и Х был 8-бит, а ACC - 16-бит)
  LDY #$05
cycle:
  ASL $0BC3 
  DEY                 
  BNE cycle

  LDA $0BC5 
  CLC             
  ADC $0BC3 
  STA $0BC5
  SEP #$30 ;(Асс, X, Y 8-бит)
  RTS               
--- Конец кода ---
     
Насчет "ext.w", что оно выполняет? Я просто сеговский асм как-то не очень знаю.
Ti_:

--- Цитата ---Насчет "ext.w", что оно выполняет? Я просто сеговский асм как-то не очень знаю.

--- Конец цитаты ---
перевод из byte в word с учетом знака +-.
gegmopo3:
$80/9D53 9C C3 0B    STZ $0BC3  обнуляем $bc3
                              LDA $0BBB
$80/9D59 8D C4 0B    STA $0BC4  [$80:0BC4]   A:1D1C X:0002 Y:0000 P:envMXdizC
$80/9D5C 10 03       BPL $03    [$9D61]    
( т.к. у нас 8-бит идет, если $BC4<=$7F, то прыгаем по адресу [$9D61], если нет, то будет $BC3=$FF, то есть word будет отрицательным)
DEC $0BC3

Это тот же самый ext.w =)
GManiac:
Только щас глянул код. Ужас. 5 строчек там и 17 строчек там (не считая RTS). Это при том, что на СНЕСЕ делали более сложные игры (как мне кажется).
Ti_:

--- Цитата: GManiac от 16 Май 2011, 17:43:27 ---Только щас глянул код. Ужас. 5 строчек там и 17 строчек там (не считая RTS). Это при том, что на СНЕСЕ делали более сложные игры (как мне кажется).

--- Конец цитаты ---
хах)) это не первое что я увидел, есть еще такое: (угадайте что это, на сеге 1строчка)

--- Код: ---$80/9DC8 8E BC 0B    STX $0BBC  [$80:0BBC]   A:1E00 X:00EE Y:0000 P:envMXdiZc
$80/9DCB 8E BF 0B    STX $0BBF  [$80:0BBF]   A:1E00 X:00EE Y:0000 P:envMXdiZc
$80/9DCE 8C BD 0B    STY $0BBD  [$80:0BBD]   A:1E00 X:00EE Y:0000 P:envMXdiZc
$80/9DD1 A9 00       LDA #$00                A:1E00 X:00EE Y:0000 P:envMXdiZc
$80/9DD3 A2 08       LDX #$08                A:1E00 X:00EE Y:0000 P:envMXdiZc
$80/9DD5 0A          ASL A                   A:1E00 X:00EE Y:0000 P:envMXdiZc
$80/9DD6 0E BF 0B    ASL $0BBF  [$80:0BBF]   A:1E00 X:00EE Y:0000 P:envMXdiZc
$80/9DD9 90 04       BCC $04    [$9DDF]      A:1E00 X:00EE Y:0000 P:envMXdiZc
$80/9DDB 18          CLC                     A:1E00 X:00EE Y:0000 P:envMXdiZc
$80/9DDC 6D BD 0B    ADC $0BBD  [$80:0BBD]   A:1E00 X:00EE Y:0000 P:envMXdiZc
$80/9DDF CA          DEX                     A:1E00 X:00EE Y:0000 P:envMXdiZc
$80/9DE0 D0 F3       BNE $F3    [$9DD5]      A:1E00 X:00EE Y:0000 P:envMXdiZc
$80/9DE2 AE BC 0B    LDX $0BBC  [$80:0BBC]   A:1E00 X:00EE Y:0000 P:envMXdiZc
$80/9DE5 AC BD 0B    LDY $0BBD  [$80:0BBD]   A:1E00 X:00EE Y:0000 P:envMXdiZc
$80/9DE8 60          RTS                     A:1E00 X:00EE Y:0000 P:envMXdiZc
--- Конец кода ---

Вот еще чуть попроще:



--- Код: ---$80/9D24 20 4B 9D    JSR $9D4B  [$80:9D4B]   A:1E00 X:00EE Y:0000 P:envMXdiZc
$80/9D27 20 4B 9D    JSR $9D4B  [$80:9D4B]   A:1E00 X:00EE Y:0000 P:envMXdiZc


$80/9D4B 4A          LSR A                   A:1E00 X:00EE Y:0000 P:envMXdiZc
$80/9D4C C9 40       CMP #$40                A:1E00 X:00EE Y:0000 P:envMXdiZc
$80/9D4E 90 02       BCC $02    [$9D52]      A:1E00 X:00EE Y:0000 P:envMXdiZc
$80/9D50 49 80       EOR #$80                A:1E00 X:00EE Y:0000 P:envMXdiZc
$80/9D52 60          RTS                     A:1E00 X:00EE Y:0000 P:envMXdiZc
--- Конец кода ---
gegmopo3:
А с этим кодом что надо?
GManiac:
1. Умножение Y = X * Y?
2. Так и не догнал. Если посмотреть на два JSR, то выходит, что там делается два сдвига вправо, и если после очередного сдвига получилось меньше $40 (или наоборот, вечно путаюсь в Bxx-сравнениях), прибавляется $80.
А, стоп. Если прибавление делается в случае, когда A > $40, то это уже похоже на арифметический сдвиг (с сохранением знака).
Ti_:

--- Цитата: gegmopo3 от 17 Май 2011, 08:07:45 ---А с этим кодом что надо?

--- Конец цитаты ---
Нет, спасибо ничего.  Для уроков полезно будет)

--- Цитата: GManiac от 17 Май 2011, 10:03:21 ---1. Умножение Y = X * Y?
2. Так и не догнал.А, стоп. Если прибавление делается в случае, когда A > $40, то это уже похоже на арифметический сдвиг (с сохранением знака).

--- Конец цитаты ---
1. да. :)
2. да, asr.w #2
gegmopo3:

--- Цитата: GManiac ---1. Умножение Y = X * Y?
--- Конец цитаты ---
Можно еще

--- Код: ---   tya
  sta $4202 ;множимое
  txa
  sta $4203 ; множитель
  lda $2134 ; результат
  tay

--- Конец кода ---
GManiac:
Эмм, а где там умножение? Это какие-то особые адреса? :)
gegmopo3:
Регистр $4202 умножается на регистр $4203, как бы фича процессора, которую выполняют эти регистры.
Результат выводится с помощью регистра $2134.  :)

Блин,я в пьяном угаре даже обманул тебя)


--- Код: ---  sty $4202 ;множимое
  stx $4203 ; множитель
  ldy $2134 ; результат
 
--- Конец кода ---
Навигация
Главная страница сообщений

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