Разработка и ромхакинг > Ромхакинг и программирование
[NES] Не могу разобраться с палитрами и атрибутами на асм
<< < (2/2)
MC68k:
УМВР

А так гадать, что за ошибки и "не работает" можно долго.

var1, var2 ячейка памяти же
Guyver(X.B.M.):
Т.е. для примера STA $0500 и STA $0501?

П.С. Вижу, у меня что-то видимо страница не прогрузилась сперва...
MC68k:
можно и так, но когда переменных больше десятка, лучше чтобы они были более читабельны.

--- Цитата ---П.С. Вижу, у меня что-то видимо страница не прогрузилась сперва...
--- Конец цитаты ---
это я добавил очевидное :)
Guyver(X.B.M.):
Теперь понятно почему не получалось, были перепутаны местами значения переменных.


--- Код: --- lda #%10011010
 jsr Playsound3
     LDA #$FF
     STA $0700
     LDA #0
     STA $0701
 loop:DEC $0700
     BNE loop
     DEC $0701
     BNE loop
 LDA #%11111010
 jsr Playsound3
 RTS
--- Конец кода ---

Добавлено позже:

--- Код: ---Playsound:
   lda #$FF
   sta $4000
   lda #%10011010
   sta $4001
   lda #$C5
   sta $4002
   lda #$CB
   sta $4003
   lda #%00000001
   sta $4015
   rts


Timer:
     LDA #$FF
     STA $0700
     LDA #0
     STA $0701
 loop:DEC $0700
     BNE loop
     DEC $0701
     BNE loop
 RTS

 jsr Playsound
 jsr Timer
 jsr Playsound
 jsr Timer
 jsr Timer
 jsr Playsound
 jsr Timer
 jsr Timer
 jsr Timer
 jsr Playsound
--- Конец кода ---

Теперь можно даже мелодию бипером написать. Грубо, грабли, но для моих целей хватит...
MC68k:
Посмотри мой пример внимательно. У тебя же тон прибит мертво в подпрограмме. Еще таймер можно на прерываниях, мерять тики. И вот еще тэг code, пользуйся


--- Код: ---      NOP

--- Конец кода ---
Guyver(X.B.M.):
Я знаю. Это я для пробы - другие тоны просто у меня не заканчиваются ещё, а уже таймер закончился... Взял самый короткий звук...

upd: Набил для пробы классическую мелодию на заставке игры 20-ти секундной продолжительности - всё работает. Осталось теперь как-то её отключить, когда старт нажимаешь не дослушав её до конца. Надеюсь, дотумкаю... :wall:
Guyver(X.B.M.):
Парни, подскажите ещё по звуку.

К примеру, я в игре использовал первый звук:

--- Код: ---   lda #%00000001
   sta $4015
   lda #%10100111
   sta $4000
   lda #$D5
   sta $4002
   lda #$00
   sta $4003
   rts
--- Конец кода ---

А потом использую спецэффект (звук волшебства):


--- Код: ---   lda #$FF
   sta $4000
   lda #%11011011
   sta $4001
   lda #$A5
   sta $4002
   lda #$AB
   sta $4003
   lda #%00000001
   sta $4015
   rts
--- Конец кода ---

Так вот. Если я после этого использую опять первый звук - он получается искажённым сильно. Т.е. что-то после второго звука сбилось и все звуки в игре, кроме волшебного, звучат уже не так красиво, а как-то скомканно. Что я делаю не так и как это исправить?
MC68k:

--- Цитата ---Так вот. Если я после этого использую опять первый звук - он получается искажённым сильно.
--- Конец цитаты ---

--- Код: ---   lda #%11011011
   sta $4001
--- Конец кода ---
Guyver(X.B.M.):
А как сделать звук волшебства без этой части?
MC68k:
Ты что-то неправильно делаешь изначально. Смотри, что у тебя в $4001 при первом звуке и восстанавливай это значение.
Guyver(X.B.M.):
Ну ясно. Надо просто восстановить первоначальное значение. Попробую угадать (как посмотреть я не знаю, но по-умолчанию я его не менял)

Ага, оно было lda #%00000001 - восстановил его и всё стало ОК. Спасибо.

Теперь осталось побороть вот ещё что. У меня длинная мелодия, допустим. 20 секунд. Я нажал кнопку - и она играет. Но если через 5 секунд после начала проигрывания нажать кнопку ещё раз - то звук продолжает играть как ни в чем не бывало. А когда мелодия заканчивается - она звучит сразу же ещё раз, но без первых 5 секунд мелодии. Надо как-то стопорить звуки и не "накапливать" их. Пока не знаю как это сделать...

Как-то можно "обнулить" все звуки вообще?
MC68k:
Запретить вывод звука. Почему "там играет, а тут нет", давай выкатывай код, будем разбирать.
Guyver(X.B.M.):
Стыдно, он такой гадский у меня :lol:

Добавлено позже:

--- Код: ---MusicOver: ;;Музыка конец игры

 jsr NotaLa
 jsr Timer
 jsr NotaLa
 jsr Timer
 jsr NotaLa
 jsr Timer
 jsr NotaFa
 jsr Timer
 jsr NotaStop
 jsr Timer
 jsr NotaStop
 jsr Timer
 jsr NotaStop
 jsr Timer
 jsr NotaSo
 jsr Timer
 jsr NotaSo
 jsr Timer
 jsr NotaSo
 jsr Timer
 jsr NotaMi
 jsr Timer
 jsr NotaStop
 rts

NotaStop:
  lda #%00000000
   sta $4015
   lda #%00000000
   sta $4000
                 lda #$00
   sta $4002
   lda #$05
   sta $4003
   lda #%00000000
   sta $4001
   rts

NotaLa:
   lda #%00000001
   sta $4015
   lda #%10100111
   sta $4000
                 lda #$90
   sta $4002
   lda #$00
   sta $4003
   rts

NotaSo:
   lda #%00000001
   sta $4015
   lda #%10100111
   sta $4000
                 lda #$A0
   sta $4002
   lda #$00
   sta $4003
   rts

NotaFa:
   lda #%00000001
   sta $4015
   lda #%10100111
   sta $4000
                 lda #$B2
   sta $4002
   lda #$00
   sta $4003
   rts

NotaMi:
   lda #%00000001
   sta $4015
   lda #%10100111
   sta $4000
                 lda #$BD
   sta $4002
   lda #$00
   sta $4003
   rts

;;;;;;;;;;;;;;;;;;;;

Timer:
     LDA #1
     STA $0700
     LDA #0
     STA $0701
 loop:DEC $0700
     BNE loop
     DEC $0701
     BNE loop
 RTS

;;;;;;;;;;;;;;;;;;;

  lda currentpage; конец игры
  cmp #$03
  bne Hell1
  jsr MusicOver
Hell1:

--- Конец кода ---

А страница у меня подгружается при нажатии на кнопку определённую. Подгружаю я страницу сразу 2 раза - и звук доиграет до конца, а потом опять начинает, но не с начала, а с момента когда я нажал кнопку второй раз. Видимо, надо в личку кидать весь код...
MC68k:
Все когда-то начинали.

Не понятно, зачем в середине мелодии многократно отключать звук? Что с прерываниями, как сделан опрос кнопок?

Кидать в личку можешь, на на будущее причесывай, чтобы было читабельно, без порчи зрения.
Guyver(X.B.M.):
С музыкой и звуками разобрался (как мог). Подскажите с другим вопросом, что-то не получается.

NESASM3


--- Код: ---  lda currentpage ; считываем номер текущей комнаты
  cmp #$08 ; проверка номера комнаты с числом 8
  bne Pal08
  LDA palettes4, y ; загрузка палитры комнаты
  STA $2007 ; запись в PPU
  RTS
Pal08:
--- Конец кода ---

Этот код приведён для проверки комнаты 8, а как написать то же самое для проверки диапазона комнат?

К примеру, комнаты от 3 до 9 и у них будет одна палита - palettes4... Помогите кодом...

Чтобы избавиться от подобных конструкций (и вместо палитры для каждой комнаты забить в 4 палитры 4 набора комнат):


--- Код: ---  cmp #$08 ; комната 08
  bne Pal08
  LDA palettes4, y
  STA $2007
  RTS
Pal08:

  cmp #$07 ; комната 07
  bne Pal07
  LDA palettes2, y
  STA $2007
  RTS
Pal07:

  cmp #$06 ; комната 06
  bne Pal06
  LDA palettes3, y
  STA $2007
  RTS
Pal06:

...
--- Конец кода ---
Марат:
cmp #$3
beq page3
cmp #$4
beq page4
cmp #$n
beq pagen
Guyver(X.B.M.):
Сделал так:


--- Код: ---  cmp #$05
  BCC Palitra3 ; если номер комнаты больше либо равен 05, то палитра 3
  LDA palettes3, y
  jmp LoadPall
Palitra3:

  cmp #$02
  BCC Palitra4 ; если номер комнаты больше либо равен 02, то палитра 4
  LDA palettes4, y
  jmp LoadPall
Palitra4:

И т.д. от большего к меньшему, т.е. сделал несколько цветовых диапазонов для комнат
--- Конец кода ---

Вроде работает...
Навигация
Главная страница сообщений
Предыдущая страница

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