Автор Тема: [NES] Не могу разобраться с палитрами и атрибутами на асм  (Прочитано 6799 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Оффлайн baralgin1003

  • Пользователь
  • Сообщений: 51
    • Просмотр профиля
День добрый! еще остались тут знатоки асма 6502? в общем ситуация такая: разобрался как грузить тайлы, а как их красить понять не могу. Может как то можно подключать палитру через .incbin ? логику работы атрибутов не понял вообще...

Оффлайн Ti_

  • Пользователь
  • Сообщений: 3265
  • Пол: Мужской
    • ВКонтакте
    • Youtube
    • Просмотр профиля
День добрый! еще остались тут знатоки асма 6502? в общем ситуация такая: разобрался как грузить тайлы, а как их красить понять не могу. Может как то можно подключать палитру через .incbin ? логику работы атрибутов не понял вообще...
Ну как понять красить? Палитра в $3F00 загружена? Экран(бекграунд) включил?
Или проблема только в выборе палитры для нужного блока.
Ее можно выставлять только для 4 тайлов сразу (блок 2x2 тайла) . Как я понимаю первые 2 бита в памяти атрибут соотвествуют 1-ому блоку - ну и так далее.  Хотя лучше доки почитай -  могу врать.  :lol:
Ещё смотри там фон кривой по вертикали. Надо -8 смещение выставить, а не 0.




Оффлайн baralgin1003

  • Пользователь
  • Сообщений: 51
    • Просмотр профиля
как я понял, атрибутами мы выставляем цвет из палитры, а по какому принципу и в какой последовательности это делать, я не пойму.
палитра загружена, бекграунд включен. блок получается 2х2 тайла? это 16х16 пикселей. неужели такую область можно закрастить только одним цветом?

Оффлайн Ti_

  • Пользователь
  • Сообщений: 3265
  • Пол: Мужской
    • ВКонтакте
    • Youtube
    • Просмотр профиля
как я понял, атрибутами мы выставляем цвет из палитры, а по какому принципу и в какой последовательности это делать, я не пойму.
палитра загружена, бекграунд включен. блок получается 2х2 тайла? это 16х16 пикселей. неужели такую область можно закрастить только одним цветом?
Ну, не одним цветом, а одной палитрой. То есть 3 цвета + ещё 4-ый цвет фона, общий для всех. То есть всего имеем до 13 цветов на фон.
В атрибутах и указываешь номер палитры - от 1-ой до 4-ой для этого блока.

http://wiki.nesdev.com/w/index.php/Attribute_table

Оффлайн baralgin1003

  • Пользователь
  • Сообщений: 51
    • Просмотр профиля
ну да, начинаю разбираться)))
 вот еще вопрос: как мне в фон загрузить большую картинку? размером 16х16 тайлов, чтоб была в середине экрана.
сейчас делаю по-деревенски:

background:

 
.db $0,$0,$0,$0,$0,$0,$0,$0,$00,$01,$02,$03,$04,$05,$06,$07,$08,$09,$0A,$0B,$0C,$0D,$0E,$0F,$0,$0,$0,$0,$0,$0,$0,$0
.db $0,$0,$0,$0,$0,$0,$0,$0,$10,$11,$12,$13,$14,$15,$16,$17,$18,$19,$1A,$1B,$1C,$1D,$1E,$1F,$0,$0,$0,$0,$0,$0,$0,$0
.db $0,$0,$0,$0,$0,$0,$0,$0,$20,$21,$22,$23,$24,$25,$26,$27,$28,$29,$2A,$2B,$2C,$2D,$2E,$2F,$0,$0,$0,$0,$0,$0,$0,$0
.db $0,$0,$0,$0,$0,$0,$0,$0,$30,$31,$32,$33,$34,$35,$36,$37,$38,$39,$3A,$3B,$3C,$3D,$3E,$3F,$0,$0,$0,$0,$0,$0,$0,$0
.db $0,$0,$0,$0,$0,$0,$0,$0,$40,$41,$42,$43,$44,$45,$46,$47,$48,$49,$4A,$4B,$4C,$4D,$4E,$4F,$0,$0,$0,$0,$0,$0,$0,$0
.db $0,$0,$0,$0,$0,$0,$0,$0,$50,$51,$52,$53,$54,$55,$56,$57,$58,$59,$5A,$5B,$5C,$5D,$5E,$5F,$0,$0,$0,$0,$0,$0,$0,$0
.db $0,$0,$0,$0,$0,$0,$0,$0,$60,$61,$62,$63,$64,$65,$66,$67,$68,$69,$6A,$6B,$6C,$6D,$6E,$6F,$0,$0,$0,$0,$0,$0,$0,$0
.db $0,$0,$0,$0,$0,$0,$0,$0,$70,$71,$72,$73,$74,$75,$76,$77,$78,$79,$7A,$7B,$7C,$7D,$7E,$7F,$0,$0,$0,$0,$0,$0,$0,$0
.db $0,$0,$0,$0,$0,$0,$0,$0,$80,$81,$82,$83,$84,$85,$86,$87,$88,$89,$8A,$8B,$8C,$8D,$8E,$8F,$0,$0,$0,$0,$0,$0,$0,$0
.db $0,$0,$0,$0,$0,$0,$0,$0,$90,$91,$92,$93,$94,$95,$96,$97,$98,$99,$9A,$9B,$9C,$9D,$9E,$9F,$0,$0,$0,$0,$0,$0,$0,$0
.db $0,$0,$0,$0,$0,$0,$0,$0,$A0,$A1,$A2,$A3,$A4,$A5,$A6,$A7,$A8,$A9,$AA,$AB,$AC,$AD,$AE,$AF,$0,$0,$0,$0,$0,$0,$0,$0
.db $0,$0,$0,$0,$0,$0,$0,$0,$B0,$B1,$B2,$B3,$B4,$B5,$B6,$B7,$B8,$B9,$BA,$BB,$BC,$BD,$BE,$BF,$0,$0,$0,$0,$0,$0,$0,$0
.db $0,$0,$0,$0,$0,$0,$0,$0,$C0,$C1,$C2,$C3,$C4,$C5,$C6,$C7,$C8,$C9,$CA,$CB,$CC,$CD,$CE,$CF,$0,$0,$0,$0,$0,$0,$0,$0


и дальше в цикле загружаю

LoadBackgroundLoop:
 
 LDA background, x     ; считаем данные  (background + the value in x)
  STA $2007             ; запишем их в PPU 
  INX   ; X = X + 1
  CPX #$FF            ; сравним X со значением $FF,
  BNE LoadBackgroundLoop  ; переход к LoadBackgroundLoop если нет совпадения


то есть, мне не хватает FF, чтоб перебрать всю директорию .db.

Оффлайн Ti_

  • Пользователь
  • Сообщений: 3265
  • Пол: Мужской
    • ВКонтакте
    • Youtube
    • Просмотр профиля
ну да, начинаю разбираться)))
 вот еще вопрос: как мне в фон загрузить большую картинку? размером 16х16 тайлов, чтоб была в середине экрана.
сейчас делаю по-деревенски:

Ну как-то так можно (карту закидываешь в ром $8000) :
 LDY #$00    ; адрес карты тайлов младший
 STY 0
 LDA #$80  ; адрес карты тайлов старший
 STA 1
 LDX #4   ; повторить 4 раза

copy:
 LDA (0),Y
 STA $2007
 INY
 BNE copy  ;  256 байт.
 INC 1       ; увеличиваем верхний байт
 DEX        ; счетчик повторений
 BNE copy
     ; всего закинули 4раза по 256 = 1024 байта

размером 16х16 тайлов, чтоб была в середине экрана.
Сделай лучше полную (32x30), можно будет закинуть целиком, не придется сбрасывать адрес после каждых 16 байт.  А где нужно просто сам пропиши тайлы.
Плюс такую можно будет открывать в редакторе NESSt (1024 байт полная с атрибутами, 960 без атрибут).


« Последнее редактирование: 17 Август 2013, 13:27:59 от Ti_ »

Оффлайн baralgin1003

  • Пользователь
  • Сообщений: 51
    • Просмотр профиля
сделал, не грузит в PPU  :(
серый экран, хотя тайлы приземлились по $8000 (молестером смотрел). почти полный экран сделал (256х191)

пардон, ступил. ща попробую выровнить картинку

не грузит почему то... в PPU картинка сидит, а вот грузит он (скорее всего) так же до FF, при том один тайл. логика программы вроде правильна
« Последнее редактирование: 19 Август 2013, 08:11:35 от baralgin1003 »

Оффлайн evgeny

  • Пользователь
  • Сообщений: 1390
  • Пол: Мужской
    • Просмотр профиля
Не Y надо увеличивать, а младший байт.

Оффлайн baralgin1003

  • Пользователь
  • Сообщений: 51
    • Просмотр профиля
действительно, изменив на
copy:
LDA (0),Y
STA $2007
INC 0
BNE copy  ;  256 байт.
DEX        ; счетчик повторений
BNE copy
стала показываться картинка, которая лежит в бекграунд зоне, то, что попало в спрайтовую зону PPU - не отображается

Оффлайн Ti_

  • Пользователь
  • Сообщений: 3265
  • Пол: Мужской
    • ВКонтакте
    • Youtube
    • Просмотр профиля
Не Y надо увеличивать, а младший байт.

действительно, изменив на
стала показываться картинка,

С чего бы это?  У меня работает, пруф:

Оффлайн baralgin1003

  • Пользователь
  • Сообщений: 51
    • Просмотр профиля
у меня NESASM, перенес твой код туда

PPU вообще пустой. из-за разных асмов может быть такое? подскажи еще, плиз, чем графику лучше делать? твоя картинка в молексе по-другому смотрится, блоки по-разному расположены у нас. из бмп перегонял прогой Map Image. YY-CHR обрезает картинку

Оффлайн Ti_

  • Пользователь
  • Сообщений: 3265
  • Пол: Мужской
    • ВКонтакте
    • Youtube
    • Просмотр профиля
Цитата: baralgin1003 link=topic=67195.msg971201#msg971201
PPU вообще пустой. из-за разных асмов может быть такое?

подскажи еще, плиз, чем графику лучше делать?
Предположу что nesasm воспринимает (0),Y  как 0,Y . 
Может там другая форма записи нужна вроде [0],Y.  Вообще лучше не юзай его, там есть как минимум один баг - он мне попался когда делал сборщик объектов к хаку котов: длинные строчки 'обрезаются' - при этом никаких ошибок не пишет.

Картинки можно в Nes Screen Tool как вариант. Там есть импорт из БМП.
Насчет спрайтов yy-chr возможностей хватает вроде.
« Последнее редактирование: 19 Август 2013, 23:26:12 от Ti_ »

Оффлайн baralgin1003

  • Пользователь
  • Сообщений: 51
    • Просмотр профиля
юзаю nesasm, потому что нашел по нему туториал ^_^

выдержка из доки:
Цитата
   
 Operand syntax
    --------------

        A        accumulator
        #i       immediate
        <n       zero page
        <n,X     zero page indexed by X
        <n,Y     zero page indexed by Y
        [n]      indirect (*)
        [n,X]    indirect pre-indexed by X (*)
        [n],Y    indirect zero page post-indexed by Y
        r        relative
        n        absolute
        n,X      absolute indexed by X
        n,Y      absolute indexed by Y

        (*) can be zero page or absolute
похоже действительно надо заменить скобки

еще отличия:
Цитата
You can start with NESASM. When you get some basics, you can move to another assembler. You can even continue with NESASM for quite long time, I made two games with it without much troubles. I guess it will start to be problematic with a large scale project.

Some differences are:

- NESASM's local labels are starting with . (dot) while Asm6 local labels starting with @. So .label turns into @label.
- NESASM has LOW and HIGH words to get LSB and MSB of a 16-bit value; Asm6 uses < and > symbols instead. So, lda #LOW(n) turns into lda #<n
- NESASM uses [ ] brackets for relative addressing while Asm6 uses ( ) brackets. So lda [TEMP],y turns into lda (TEMP),y
- Asm6 does not use . before .db, .dw, .byte, .word keywords. Just remove the dot.

погуглив, решил таки перебраться на асм6.

а нет ли случайно исходников бегущей строки? хотелось бы поиграться
« Последнее редактирование: 20 Август 2013, 12:33:21 от baralgin1003 »

Оффлайн Guyver(X.B.M.)

  • Пользователь
  • Сообщений: 2398
  • Пол: Мужской
  • Уничтожим Кронос!
    • Facebook
    • Twitter
    • ВКонтакте
    • Youtube
    • Просмотр профиля
Товарищи, подскажите. NESASM3

В игре при нажатии кнопки у меня короткий выводится звук:

Цитата
   lda #%00000001
   sta $4015 ;enable square 1

   lda #%01010111 ;Duty 10, Volume F
   sta $4000

   lda #$C9    ;0C9 is a C# in NTSC mode
   sta $4002
   lda #$03
   sta $4003

Как сделать два последовательных звука с задержкой между ними? Подскажите примером... Очень нужно.

Оффлайн Shredder

  • Пользователь
  • Сообщений: 583
  • Пол: Мужской
  • Ninja Master
    • Просмотр профиля
Как сделать два последовательных звука с задержкой между ними? Подскажите примером... Очень нужно.

Проиграй звук #1, затем загрузи положительное число в одну из ячеек оперативы и поставь на эту ячейку обратный отсчёт. Сделай, чтобы состояние счётчика проверялось постоянно, независимо от нажатий кнопок. Когда счётчик станет меньше 0, проиграй звук #2 и установи 0 в счётчик.
Если интервал между звуками большой, то может понадобиться 2 связанных счётчика.

Оффлайн Guyver(X.B.M.)

  • Пользователь
  • Сообщений: 2398
  • Пол: Мужской
  • Уничтожим Кронос!
    • Facebook
    • Twitter
    • ВКонтакте
    • Youtube
    • Просмотр профиля
Эх, голая теория :о) Я даже просто счётчик с трудом сделаю...

Оффлайн Shredder

  • Пользователь
  • Сообщений: 583
  • Пол: Мужской
  • Ninja Master
    • Просмотр профиля
После проги проигрывания звука добавь:
LDA 7F ; это максимальное число со знаком "+" (положительные: интервал 00-7F, отрицательные: 80-FF)
STA 0500 ; загрузка числа 7F в ячейку оперативы #0500, вместо 0500 используй любую свободную ячейку

Далее добавляешь в код в любом месте игры, который выполняется постоянно:
$0000 - LDA 0500 ; проверяем состояние нашей ячейки, загружая её содержимое в аккумулятор
$0001 - BEQ 0007 ; если в ячейке был 0, то пропускаем весь следующий добавленный нами код, словно его нет :)
$0002 - DEC 0500 ; если в ячейке не 0, то вычитаем из счётчика единицу
$0003 - BPL 0007 ; пропускаем загрузку звука #2, если знак предыдущей операции - "плюс"; а если в результате операции получился "минус" (счётчик достиг FF), то устанавливаем счётчик в 0 и прыгаем на любой выбранный адрес с прогой для проигрывания звука #2
$0004 - LDA 00 ; загружаем в аккумулятор 0
$0005 - STA 0500 ; устанавливаем счётчик в 0
$0006 - ; старт загрузки звука #2
$0007

Оффлайн Guyver(X.B.M.)

  • Пользователь
  • Сообщений: 2398
  • Пол: Мужской
  • Уничтожим Кронос!
    • Facebook
    • Twitter
    • ВКонтакте
    • Youtube
    • Просмотр профиля
Допустим, у меня 2 звука, каждый в своей подпрограмме:

Playsound1:  ;;звук 1
   lda #$FF
   sta $4000
   lda #%10011010
   sta $4001
   lda #$C5
   sta $4002
   lda #$CB
   sta $4003
   lda #%00000001
   sta $4015
   rts

Playsound2:  ;;звук 2
   lda #$FF
   sta $4000
   lda #%11111010
   sta $4001
   lda #$35
   sta $4002
   lda #$3B
   sta $4003
   lda #%00000001
   sta $4015
   rts

Так я их вызывать буду в нужный момент:

  jsr Playsound1
  jsr Playsound2

Непонятен счётчик - я не могу привести его к виду, который понимает NESASM3, вылазит куча ошибок... Помогите с синтаксисом...
« Последнее редактирование: 21 Август 2017, 09:55:20 от Guyver(X.B.M.) »

Оффлайн MC68k

  • Пользователь
  • Сообщений: 118
    • Просмотр профиля
Цитата
Допустим, у меня 2 звука, каждый в своей подпрограмме:
var1 EQU $0700
var2 EQU $0701

lda #%10011010
JSR beep
;здесь задржка. сделать можно по-разному, например
     LDA #0
     STA var1
     LDA #9
     STA var2
loop:DEC var1
     BNE loop
     DEC var2
     BNE loop

LDA #%11111010
JSR beep
RTS
beep:STA $4001
     LDA #$FF
     STA $4000
     #$C5
     STA $4002
     LDA #$CB
     STA $4003
     LDA #1
     STA $4015
     RTS
« Последнее редактирование: 21 Август 2017, 10:20:51 от MC68k »

Оффлайн Guyver(X.B.M.)

  • Пользователь
  • Сообщений: 2398
  • Пол: Мужской
  • Уничтожим Кронос!
    • Facebook
    • Twitter
    • ВКонтакте
    • Youtube
    • Просмотр профиля
Чегой-то не работает. Что есть var1 и var2, можно для примера?

Оффлайн MC68k

  • Пользователь
  • Сообщений: 118
    • Просмотр профиля
УМВР

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

var1, var2 ячейка памяти же

Оффлайн Guyver(X.B.M.)

  • Пользователь
  • Сообщений: 2398
  • Пол: Мужской
  • Уничтожим Кронос!
    • Facebook
    • Twitter
    • ВКонтакте
    • Youtube
    • Просмотр профиля
Т.е. для примера STA $0500 и STA $0501?

П.С. Вижу, у меня что-то видимо страница не прогрузилась сперва...

Оффлайн MC68k

  • Пользователь
  • Сообщений: 118
    • Просмотр профиля
можно и так, но когда переменных больше десятка, лучше чтобы они были более читабельны.
Цитата
П.С. Вижу, у меня что-то видимо страница не прогрузилась сперва...
это я добавил очевидное :)

Оффлайн Guyver(X.B.M.)

  • Пользователь
  • Сообщений: 2398
  • Пол: Мужской
  • Уничтожим Кронос!
    • Facebook
    • Twitter
    • ВКонтакте
    • Youtube
    • Просмотр профиля
Теперь понятно почему не получалось, были перепутаны местами значения переменных.

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

Теперь можно даже мелодию бипером написать. Грубо, грабли, но для моих целей хватит...
« Последнее редактирование: 21 Август 2017, 13:05:27 от Guyver(X.B.M.) »

Оффлайн MC68k

  • Пользователь
  • Сообщений: 118
    • Просмотр профиля
Посмотри мой пример внимательно. У тебя же тон прибит мертво в подпрограмме. Еще таймер можно на прерываниях, мерять тики. И вот еще тэг code, пользуйся

      NOP

Оффлайн Guyver(X.B.M.)

  • Пользователь
  • Сообщений: 2398
  • Пол: Мужской
  • Уничтожим Кронос!
    • Facebook
    • Twitter
    • ВКонтакте
    • Youtube
    • Просмотр профиля
Я знаю. Это я для пробы - другие тоны просто у меня не заканчиваются ещё, а уже таймер закончился... Взял самый короткий звук...

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

Оффлайн Guyver(X.B.M.)

  • Пользователь
  • Сообщений: 2398
  • Пол: Мужской
  • Уничтожим Кронос!
    • Facebook
    • Twitter
    • ВКонтакте
    • Youtube
    • Просмотр профиля
Парни, подскажите ещё по звуку.

К примеру, я в игре использовал первый звук:
   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

  • Пользователь
  • Сообщений: 118
    • Просмотр профиля
Цитата
Так вот. Если я после этого использую опять первый звук - он получается искажённым сильно.
   lda #%11011011
   sta $4001

Оффлайн Guyver(X.B.M.)

  • Пользователь
  • Сообщений: 2398
  • Пол: Мужской
  • Уничтожим Кронос!
    • Facebook
    • Twitter
    • ВКонтакте
    • Youtube
    • Просмотр профиля
А как сделать звук волшебства без этой части?

Оффлайн MC68k

  • Пользователь
  • Сообщений: 118
    • Просмотр профиля
Ты что-то неправильно делаешь изначально. Смотри, что у тебя в $4001 при первом звуке и восстанавливай это значение.