Chief-NET

Информация о пользователе

Привет, Гость! Войдите или зарегистрируйтесь.


Вы здесь » Chief-NET » Программирование » AddIntroGen


AddIntroGen

Сообщений 41 страница 60 из 99

41

Пример из Gentile

Код:
* Init VDP

        lea         GFXCTRL,a0         ; GFX Control
        move        #$8016,(a0)        ; reg. 80, Enable Hor. Sync
        move        #$8174,(a0)        ; reg. 81, Enable Ver. Sync + Fast transfer
        move        #$8238,(a0)        ; reg. 82, A plane left half location = $E000
        move        #$8338,(a0)        ; reg. 83, A plane right half location = $E000
        move        #$8405,(a0)        ; reg. 84, B plane location = $E000
        move        #$8560,(a0)        ; reg. 85, Sprite data table $C000
        move        #$8600,(a0)        ; reg. 86, ?
        move        #$8700,(a0)        ; reg. 87, Background color #16
        move        #$8801,(a0)        ; reg. 88, ?
        move        #$8901,(a0)        ; reg. 89, ?
        move        #$8a01,(a0)        ; reg. 8a, 
        move        #$8b00,(a0)        ; reg. 8b, enabled interrupt 2
        move        #$8c00,(a0)        ; reg. 8c, 40 cells mode 
        move        #$8d2e,(a0)        ; reg. 8d,
        move        #$8f02,(a0)        ; reg. 8f, 
        move        #$9000,(a0)        ; reg. 90,
        move        #$9100,(a0)        ; reg. 91,
        move        #$92ff,(a0)        ; reg. 92,

        move.w      (sp)+,sr 

* Fill the palette

        move.l    #$c0000000,GFXCTRL  
        move.w     #15,d0
        lea        rick_pal,a0
loopp:  move.w     (a0)+,GFXDATA
        dbf        d0,loopp

* Load the tiles

        move.l     #$40000000,GFXCTRL
        move.w     #$1f30,d0              ; (spoutnick:11936 bytes+rick:1728 bytes)/4
        lea        rick_tiles,a0
loopt:  move.l     (a0)+,GFXDATA
        dbf        d0,loopt       

* Fill the tile map

        move.l      #$60000003,GFXCTRL
        move.w      #$640,d0               ;counter : 32*28=896 tiles
        lea        spk_map,a0
loopm:
        move.l  (a0)+,GFXDATA                                    
        dbf	d0,loopm 
Код:
       
        move        #$8238,(a0)        ; reg. 82, A plane left half location = $E000

Здесь устанавливается адрес расположения карты тайлов для Плана А в видеопамяти.

Код:
        move        #$8338,(a0)        ; reg. 83, A plane right half location = $E000

Здесь на самом деле для Окна.

Код:
        move        #$8405,(a0)        ; reg. 84, B plane location = $E000

Здесь для плана Б

Код:
        move        #$8560,(a0)        ; reg. 85, Sprite data table $C000

Здесь для аттрибутов спрайтов.

Код:
        move        #$8700,(a0)        ; reg. 87, Background color #16

В этом месте устанавливается номер цвета заднего фона в палитре

Код:
       move        #$8c00,(a0)        ; reg. 8c, 40 cells mode 

А здесь устанавливается режим 40 тайлов по горизонтали

Код:
* Fill the palette

            move.l    #$c0000000,GFXCTRL ; 
            move.w     #15,d0; размер палитры в байтах
            lea        rick_pal,a0;загружаем адрес палитры в роме
loopp:   move.w     (a0)+,GFXDATA; цикл с передачей данных
            dbf        d0,loopp
Код:
* Load the tiles

          move.l     #$40000000,GFXCTRL; адрес в видеопамяти куда будем копировать графику тайлов
          move.w     #$1f30,d0              ; (spoutnick:11936 bytes+rick:1728 bytes)/4 размер графики делённый на 4
          lea        rick_tiles,a0; адрес графики в роме
loopt:  move.l     (a0)+,GFXDATA
          dbf        d0,loopt 
Код:
* Fill the tile map

           move.l      #$60000003,GFXCTRL;адрес в видеопамяти куда будем копировать карту тайлов
           move.w      #$640,d0               ;counter : 32*28=896 tiles
           lea        spk_map,a0;      адрес карты тайлов в роме
loopm:
           move.l  (a0)+,GFXDATA                                    
           dbf	d0,loopm

42

Ох. Сложно-то как...

Марат, а ты сможешь добавить очистку экрана перед загрузкой лого, чтобы можно было делать несколько лого подряд. Это сложно сделать? Или всего 1 команду надо дописать?

43

Можно добавить. Правда, я ещё такое не делал. Но, думаю, это не сложно.

44

А то один экран работает без проблем, а несколько вставишь - артефакты'с...

45

"Очистка" - это, если не ошибаюсь, заполнение диапазона нолями. Нужно просто сделать цикл который будет в нужные диапазоны ноль записывать. На SNES есть команда STZ N, которая пишет ноль в аргумент N, если на SEGA нет подобной команды, то нужно явно задать запись ноля в память. Опять же, зная асм - это довольно несложно.

46

Можно, наверное, отловить код в эмуляторе, когда в каком-нибудь роме заставки идут друг за другом. Как там всё работает-то?

47

Перезалил файл, исправил ошибку при импорте/экспорте палитры, убрал лишние ячейки в палитре, теперь их 32, по 16 на каждую палитру.

Маратыч, не пропадай :*( Чуток же осталось доделать ;о)))

48

Да я не пропадаю. Я просто застрял на нейро квантовании палитры. Никак не пойму, почему а сишном варианте изображение из 16 цветов нормальное, а на паскалевском отстой.

49

Ты, кстати, откуда код взял? Что-то там так nop дофина и адресов разных.

50

Это код из хака нашего перевода с сайта - у пиратов этот порт называется "Diablo". Но там он, судя по всему, взят вообще с какой-то третьей игры, много там лишнего ещё, графика какая-то. Я потёр её...

Вот ром: http://www.rusega.org

Отредактировано Guyver (2014-03-16 13:57:26)

51

Скинь мне проект, я попробую добавить очистку экрана.

52

Эммм.... Какой проект? Что именно?

По ссылке в шапке темы ты можешь скачать самую последнюю версию программы, весь код в псевдо-dll файле. Это бинарный модифицированный кусок рома, с изменениями, убирающими все косяки... Его и надо править...

Потом просто:
1. Открываем любой ром. Вставляем лого и поинтер.
2. Открываем ещё раз его же. Вставляем лого и поинтер.

Смотрим на результат, исчезли баги при загрузке второго лого или нет...

Отредактировано Guyver (2014-03-16 16:02:41)

53

оффтоп
Обнаружил у себя в дельфи такой косяк: если отрицательное число сдвинуть вправо на n бит, то получится положительно. Например сдвигаю -61440 на 12 бит вправо, а результат получается положительным 1 048 561, хотя должно быть -15. У всех так или только у меня?

Отредактировано Марат (2014-03-16 16:45:26)

54

Эммм.... Какой проект? Что именно?

По ссылке в шапке темы ты можешь скачать самую последнюю версию программы, весь код в псевдо-dll файле. Это бинарный модифицированный кусок рома, с изменениями, убирающими все косяки... Его и надо править...

Потом просто:
1. Открываем любой ром. Вставляем лого и поинтер.
2. Открываем ещё раз его же. Вставляем лого и поинтер.

Смотрим на результат, исчезли баги при загрузке второго лого или нет...

Ясно. Поглядим.

55

В новом дельфи вообще косяки, там в некоторых случаях вообще жесть, true может превратиться в false и наоборот. Глюки...

56

У меня это на дельфи 7 и дельфи 2005. Дня 3 из-за этого  потерял.  Сам код-то взял из библиотеки imageen.

57

Тут это, знающие люди говорят про очистку экрана так:

"Вам какая очистка нужна? Если перед интро, ее не может быть впринципе, просто экран нужно включать после её загрузки."

58

Ну, нам не перед интро, а между. На счет включения была такая мысль. Но код как-то я не заметил. Ну ничего надо посмотреть а в скуби ду. Там как раз несколько интро подряд идут.

59

Действительно, есть регистр, который включает/отключает дисплей. Надо будет попробовать его применить.

60

Маратыч, на тебя одна надежда...

Я смотрел демки на сегу, там правда сделан компилятор кода бейсика в код сега. И есть демка с заставками. которые переключаются друг за другом. В коде бейсика там между ними тоже включается и отключается дисплей.


Вы здесь » Chief-NET » Программирование » AddIntroGen