| Разработка и ромхакинг > Ромхакинг и программирование |
| [NES] Ассемблер перевести в понятный код |
| << < (3/3) |
| Ti_:
LDA не влияет на carry, поэтому иногда в коде CMP может и раньше быть - через строчку или даже несколько. Вот примеры использования: --- Код: ---BANK0:8C22 LDA Objects_X_speed,X BANK0:8C25 CMP #$FF BANK0:8C27 LDA #$18 BANK0:8C29 BCS loc_0_8C57 --- Конец кода --- --- Код: ---BANK0:8951 LDA Level_ID BANK0:8953 CMP #4 BANK0:8955 LDA bike_frames_ids - $38,Y BANK0:8958 BCC loc_0_895D BANK0:895A LDA bike_frames_ids2 - $38,Y BANK0:895D BANK0:895D loc_0_895D BANK0:895D STA Obj_anim_frame,X BANK0:8960 RTS --- Конец кода --- |
| teremochek:
Посмотрел что есть в верху кода. Где все переменные. В основном встречаются 3 типа: 1. numplayers .byt 0 Просто байтовая переменная, в конце которой стоит "0". Не знаю что он обозначает. 2. chrdest .word 0 Строковая переменная. Тоже вконце стоит "0". 3. velocity_bullet_x .dsb 24,0 dsb - Data Storage of Bytes, очевидно массив. Из 24 Байт. И опять "0". numplayers : BYTE chrdest : STRING velocity_bullet_x : BYTE [ 24 ] Попробовал перевести еще одну функцию. Код. --- Код: --- l_player_width = local5 l_player_left_edge = local6 l_cur_bullet = local7 ProcessAllBullets: JSR ProcessPlayerBullet LDA #7 STA l_cur_bullet LDY #0 LDX #0 NextEnemyBullet: CLC ; loop 7 times LDA velocity_bullet_x,y ADC spr_buf(33,xcoo),x STA spr_buf(33,xcoo),x ; sprite33..sprite39 (enemy bullets) CLC LDA spr_buf(33,ycoo),x ; if Y coordinate of bullet is 0 BNE skp018 STA spr_buf(33,xcoo),x ; reset X coordinate BEQ DoneWithThisBullet skp018: ADC #2 STA spr_buf(33,ycoo),x ; move enemy bullets down at 2pixels/vsync INC PlayerDiedThisVsync DEC PlayerDiedThisVsync ; test PlayerDiedThisVsync without modifying A BNE DoneWithThisBullet SEC SBC #202 ; bulletY-202 CMP #5 ; bulletY-202 <=> 5? BCC skp019 CMP #17 ; bulletY-202 <=> 17? BCS DoneWithThisBullet LDA player_x_pos ADC #119 STA l_player_left_edge ; player_x_pos + 119 = left edge LDA #11 STA l_player_width ; 11 = width JMP skp020 skp019: LDA player_x_pos ADC #122 STA l_player_left_edge ; player_x_pos + 122 = left edge LDA #5 STA l_player_width ; 5 = width skp020: SEC LDA spr_buf(33,xcoo),x SBC l_player_left_edge ; did it collide with the ship? CMP l_player_width BCS DoneWithThisBullet LDA #1 STA PlayerDiedThisVsync JSR StartPlayerDiedSound LDA #0 STA spr_buf(33,ycoo),x DoneWithThisBullet: INY INX INX INX INX DEC l_cur_bullet BNE NextEnemyBullet RTS --- Конец кода --- Избавляемся от загрузки, сохранения регистров. --- Код: ---l_player_width = local5 l_player_left_edge = local6 l_cur_bullet = local7 Function ProcessAllBullets() ProcessPlayerBullet() l_cur_bullet = 7 y = 0 x = 0 # NextEnemyBullet ; loop 7 times velocity_bullet_x[ y ] += spr_buf(33+x,xcoo) spr_buf(33+x,xcoo) = velocity_bullet_x[ y ] if spr_buf(33+x,xcoo) <> 0 Then GoTo skp018 spr_buf(33+x,xcoo) = 0 if spr_buf(33+x,xcoo) == 0 Then Goto DoneWithThisBullet # skp018: spr_buf(33+x,ycoo) +=2 If PlayerDiedThisVsync <> 0 Then Goto DoneWithThisBullet spr_buf(33+x,ycoo) -= 202 If spr_buf(33+x,ycoo) - 5 < 0 Then Goto skp019 ;BCC If spr_buf(33+x,ycoo) - 17 >= 0 Then Goto DoneWithThisBullet ;BCS l_player_left_edge = player_x_pos + 119 l_player_width = 11 Goto skp020 # skp019 l_player_left_edge = player_x_pos + 122 l_player_width = 5 # skp020 spr_buf(33+x,xcoo) -= l_player_left_edge if spr_buf(33+x,xcoo) - l_player_width >= 0 Then Goto DoneWithThisBullet PlayerDiedThisVsync = 1 StartPlayerDiedSound() spr_buf(33+x,ycoo) = 0 # DoneWithThisBullet y +=1 x +=4 l_cur_bullet -=1 If l_cur_bullet <> 0 Then GoTo NextEnemyBullet End Function --- Конец кода --- Избавляемся от меток. --- Код: ---Function ProcessAllBullets() ProcessPlayerBullet() l_cur_bullet = 7 y = 0 x = 0 Do velocity_bullet_x[ y ] += spr_buf(33+x,xcoo) spr_buf(33+x,xcoo) = velocity_bullet_x[ y ] if spr_buf(33+x,xcoo) <> 0 else spr_buf(33+x,xcoo) = 0 if spr_buf(33+x,xcoo) == 0 y +=1 x +=4 l_cur_bullet -=1 If l_cur_bullet <> 0 Then Continue endif endif spr_buf(33+x,ycoo) +=2 If PlayerDiedThisVsync <> 0 else spr_buf(33+x,ycoo) -= 202 If spr_buf(33+x,ycoo) - 5 < 0 l_player_left_edge = player_x_pos + 122 l_player_width = 5 spr_buf(33+x,xcoo) -= l_player_left_edge if spr_buf(33+x,xcoo) - l_player_width >= 0 else PlayerDiedThisVsync = 1 StartPlayerDiedSound() spr_buf(33+x,ycoo) = 0 endif y +=1 x +=4 l_cur_bullet -=1 If l_cur_bullet <> 0 Then Continue endif If spr_buf(33+x,ycoo) - 17 >= 0 else l_player_left_edge = player_x_pos + 119 l_player_width = 11 spr_buf(33+x,xcoo) -= l_player_left_edge if spr_buf(33+x,xcoo) - l_player_width >= 0 else PlayerDiedThisVsync = 1 StartPlayerDiedSound() spr_buf(33+x,ycoo) = 0 endif endif endif y +=1 x +=4 l_cur_bullet -=1 If l_cur_bullet <> 0 Then Continue break loop End Function --- Конец кода --- Надо-бы подумать, как можно проверить работоспособность этих функции.. |
| JAM:
А вот как ты их проверишь-то? Массивы xcoo и ycoo, ты, допустим задал. А их адреса в роме? --- Код: ---STA l_cur_bullet --- Конец кода --- Это даже без перевода на C работать не будет. В исходном коде был адрес, заменённый на переменную l_cur_bullet где-то в самом начале кода. Не указав его, куда прикажешь сохранять? Нельзя просто так выдрать из рома кусок кода с переменными, не расшифровав их. Вернее можно, но работать код не будет =) |
| teremochek:
--- Цитата: JAM от 06 Апрель 2013, 00:04:13 ---А вот как ты их проверишь-то? Массивы xcoo и ycoo, ты, допустим задал. А их адреса в роме? --- Конец цитаты --- Не понимаю, зачем нужны их адреса. За место спрайтов использовал квадраты. Хочу разобраться, как Графику рома приделать.. (chr). Вроде там 64 плитки. Вот только как именно они загружаются в память.. подряд, или в опр. порядке. На худой конец можно скопировать из эмулятора буфер VRAM. --- Цитата: JAM от 06 Апрель 2013, 00:04:13 --- --- Код: ---STA l_cur_bullet --- Конец кода --- Это даже без перевода на C работать не будет. В исходном коде был адрес, заменённый на переменную l_cur_bullet где-то в самом начале кода. Не указав его, куда прикажешь сохранять? Нельзя просто так выдрать из рома кусок кода с переменными, не расшифровав их. Вернее можно, но работать код не будет =) --- Конец цитаты --- как написано перед функцией. l_cur_bullet = local7 Вроде так можно делать, два имени у одной переменной. Если нельзя. То просто заменить все l_cur_bullet на local7. Перевел еще две простенькие функции. --- Код: ---IsPlayerMoving: LDA PlayerDiedThisVsync BNE ret18 JSR IsPlayerGoingLeft LDA activejoykeys AND #JOY_RIGHT BEQ ret19 LDA player_x_pos CMP #106 ; normalized 234 BEQ ret19 INC player_x_pos ret19: RTS ;------------------------------------------------------------------------------- IsPlayerGoingLeft: LDA activejoykeys AND #JOY_LEFT BEQ ret19 LDA player_x_pos CMP #<-106 ; clip player to no further left than -106 (normalized 22) BEQ ret20 DEC player_x_pos ret20: RTS --- Конец кода --- Перевод: --- Код: ---Function IsPlayerMoving() IF PlayerDiedThisVsync <> 0 Then Return ; BNE ret18 IsPlayerGoingLeft() if activejoykeys AND #JOY_RIGHT == 0 Then Return if player_x_pos == 106 Then Return ;BEQ 234 normalized player_x_pos:+1 end function ;------------------------------------------------------------------------------- Function IsPlayerGoingLeft() if activejoykeys AND #JOY_LEFT == 0 Then Return if player_x_pos == -106 Then Return ;(normalized 22) player_x_pos:-1 end function --- Конец кода --- |
| JAM:
--- Цитата: teremochek от 11 Апрель 2013, 10:01:38 --- if player_x_pos == 106 Then Return ;BEQ 234 normalized --- Конец цитаты --- Тогда уж не 106, а 262. Хотя ХЗ, там Hex в твоём коде или нет |
| teremochek:
(оффтоп) Такая мысль пришла. Легче сделать видео, чем игру. Сначала записать видео на эмуляторе. А потом по верх него положить 3Д модели в Блендере. |
| s1nka:
teremochek, выглядит офигенно. |
| teremochek:
Сложность в том, что объекты в NES нарисованы в Ортографическом виде. Но что-бы нам показать трехмерность нужен перспективный вид. Такая мысли пришла, смоделировать объект в перспективном виде, но что-бы он выглядел так, как в ортографическом. Это для игр типа Zelda. Где картинка статична, и перемещается лишь при переходе на другой экран. |
| Навигация |
| Главная страница сообщений |
| Предыдущая страница |