Запиляторный DJ!
По мере появления большого количества писем от ААА с новыми запилами, я понял — новое мегадемо — это будет скучно.
Надо трекмо!
Исходные данные:
Большинство средств исходник запила представляет, добавляем в него переключение страниц TS и…
Формируем DJ-лоадер:
Сам вызов DMA:
ld hl,copy_pages
call set_ports
copy_pages у нас хранит последовательно: старший байт порта, данные для него
а теперь вопрос!
Почему в copy_main набор портов в начале закомментирован?
Лоадер действующий и использован в Pixel trackmo :)
PS: От себя хочу добавить, что при желании — довольно несложно переделать этот лоадер на другой менеджер памяти.
Надо трекмо!
Исходные данные:
- 20 частей, из них 18 занимают все страницы 128 спектрума, и 2 немного меньше.
- Все части приходят с исходниками в духе «ящик Нюкокода», которые легко компилируются.
- Будет 2 музыки на части + часть-эпилог.
- Имеем TS конфигурацию, которая построена на базе обычного Pentagon и имеет дополнительные плюшки, которые облегчат и ускорят работу — DMA (для быстрого переноса блока памяти) и сборщик в SPG формат.
- удалить установку стека
- настроить воспроизведение необходимой музыки в отдельной странице
- добавить блок подсчёта проигрывания паттернов для синхронизации под музыку
- добавить выход в блок для загрузки следующей части
Большинство средств исходник запила представляет, добавляем в него переключение страниц TS и…
Формируем DJ-лоадер:
device zxspectrum128
org #5e00
start
ld c,#b0
ld a,(base_page+1)
cp #50-8
jr c,int_mus_first
inc c
int_mus_first ld a,c
ld (int_mus+1),a
; музыка для первой части у нас лежит в паге #b0, для второй - #b1
; по этому счётчику переключаем банк с музыкой для части
ld bc,SYSCONFIG
ld a,6
out (c),a
inc b
ld a,%00001110
out (c),a
; включаем 14 Мгц и кеш, а так-же включаем страницу 0 (которая находится с адреса #0
; как RAM) - это использовалось в варианте с ldir
ld sp,#5fff
xor a
out (#fe),a
ld hl,#5800
ld de,#5801
ld bc,#2ff
ld (hl),l
ldir
ld hl,int_loader
ld (#5cff),hl
; стандартный запилятор располагает в этом адресе адрес обработки прерываний, подменяем
ld hl,pages128
ld (page_7ffd+1),hl
base_page ld a,8 ;#50-8
add 8
ld (base_page+1),a
ld (cps+1),a
; каждая новая часть находится по адресу страницы, кратной 8, начиная с #10-й
ld b,5
page_ldir push bc
page_7ffd ld hl,pages128
ld a,(hl)
inc hl
ld (page_7ffd+1),hl
ld (cpd+1),a
ld hl,copy_pages
call set_ports
ld hl,cps+1
inc (hl)
pop bc
djnz page_ldir
; заполняем необходимые страницы данными. разбор данных в copy_pages смотрите далее
/*
; первоначальный вариант с медленным ldir, позже заменён на DMA
ld b,5
page_ldir push af
push bc
ld bc,PAGE0 ;#0000
out (c),a
ld bc,#7ffd
page_7ffd ld hl,pages128
ld a,(hl)
inc hl
ld (page_7ffd+1),hl
out (c),a
ld hl,#0000
ld de,#c000
ld bc,#4000
ldir
pop bc
pop af
inc a
djnz page_ldir
; здесь используется возможность TS размещения с 0 страницы RAM.
; Впрочем, DMA быстрее в 4 раза, оставлено как пример :)
*/
; имеем загруженными банки памяти, начинаем перенос основных блоков, размером около 40кб
ld bc,#1eaf
ld a,#60
out (c),a
; устанавливаем DMADAddrH (адрес приёмника, старший), в младшем у нас 0
; результатом имеем, что полный адрес приёмника будет #6000
ld a,16-1
ld (cmd_len+1),a
ld a,5
ld (cmd+1),a
; грязно хачим данные :)
ld hl,copy_main
call set_ports
; переброс первого блока в #2000 байт
ld a,32-1
ld (cmd_len+1),a
ld a,2
ld (cmd+1),a
ld hl,copy_main
call set_ports
; переброс второго блока, #4000 байт
ld a,0
ld (cmd+1),a
ld hl,copy_main
call set_ports
; переброс последнего блока, #4000 байт, вместе - 40960 байт
/*
; пример переброски при использовании ldir
ld a,(cps+1)
ld (cms+1),a
exx
ld bc,PAGE0 ;#0000
out (c),a
exx
ld hl,#0000
ld de,#6000
ld bc,#4000
ldir
inc a
exx
out (c),a
exx
ld hl,#0000
ld b,#40
ldir
inc a
exx
out (c),a
exx
ld hl,#0000
ld b,#20
ldir
*/
ld bc,#7ffd
ld a,#10
out (c),a
; устанавливаем стандартную страницу и стартуем часть
jp #6000
; магическая процедура, которая принимает старший байт порта
; и бросает туда данные пока не встретит признак конца - #FF
set_ports ld c,#AF
.m1 ld b,(hl)
inc hl
inc b
jr z,dma_stats
outi
jr .m1
dma_stats ld b,high DMASTATUS
in a,(c)
AND #80
jr nz,$-4
ret
PT3PLAY equ #c000
mus_page equ #f0
; инт, который отрабатывает при перегрузке памяти
int_loader di
push hl
push de
push bc
push af
int_mus ld a, mus_page
ld bc,PAGE3 : out(c), a
call PT3PLAY + 5
pop af
pop bc
pop de
pop hl
ei
ret
; стандартный набор!
pages128 db #1,#3,#4,#6,#7
copy_pages db #1a,0
db #1b,0 ; откуда? #c000
cps db #1c,0 ; страница из которой будет передача данных
db #1d,0
db #1e,0 ; куда? #c000 !
cpd db #1f,0 ; страница памяти привычного спека
db #26,#ff ; перебрасывается 512 байт
db #28,32-1 ; перебразывается 32 раза = 16384 байта
db #27,DMA_RAM + DMA_DALGN +DMA_ASZ ; набор, описывающий способ перебрасывания данных
db #ff
copy_main ;db #1a,0
;db #1b,0
;cms db #1c,0
;db #1d,0
;db #1e,#60
cmd db #1f,05
db #26,#ff
cmd_len db #28,16-1
db #27,DMA_RAM + DMA_DALGN +DMA_ASZ
db #ff
end
include "tsconfig.asm"
SAVEBIN "_spg/loader.bin",start, end-start
Сам вызов DMA:
ld hl,copy_pages
call set_ports
copy_pages у нас хранит последовательно: старший байт порта, данные для него
а теперь вопрос!
Почему в copy_main набор портов в начале закомментирован?
Лоадер действующий и использован в Pixel trackmo :)
PS: От себя хочу добавить, что при желании — довольно несложно переделать этот лоадер на другой менеджер памяти.
50 комментариев
тут совсем мало о том, что я три дня все части перебирал да пересматривал/перекомпиливал/фиксил :)))
Вовча, где твои любимые ДМА??7777
заметил этот знак: /*
; пример переброски при использовании ldir
но начиналось именно с ldir, как тест.
а сама переброска вот:
ld hl,copy_pages
call set_ports
понятнее принцип будет.
Что хотел сказать автор?
НОРМАЛЬНОЕ :)
например,
www.youtube.com/watch?v=KKS9E8nMY4s
взгляды у всех разные, поэтому я просто валю с дискуссии.
Да, это красивей чем у меня, красивей чем все что было на спектруме, но блин, это же ААА, он же дурачок.
И до сих пор, нет ни одного запила, где обработка спрайтов хотя бы близка подошла к моему уровню. И я скажу почему, потому что это очень, очень нудно и трудно. Кодом сделать проще? конечно! Я это говорю, потому что Инвитатион делали кодом, 8 бит трах кодом. Там можно было тупо спрайт делить на два, зеркалить и выводить. В два раза выше скорость в два раза больше памяти. Там можно спрайт выводить так и наперекосяк, тут нет, одно за другим. Хочешь чтобы волос кртился и так и такю. рисуй, сука 170 фаз. В кодах достаточно 30, чтобы крытить его во всех плоскостях.
запилятор вещь простая в использовании, но ужасно трудная в полготовке. Это кодер не поймет, потмоу что мысли кодера о цифре. Но художник, который хоть раз сам рисовал спрайты поймет меня и оценит. Хотя с кем я говорю…
кто тут говорил что это всё весело и не стоит воспринимать нашу сцену серьёзно?
Оригинальный +2 при использовании im2 в этой области памяти будет гнать пургу на экран.
ну и AAA привет по пути, ибо запилить из двадцати частей трахму — подвиг не из легких :)
это будет уже совсем другая дема)
ну и пусть) удачи!
К психиатр-р-р-р-ру!
Нет ни одного довода в пользу тап. Полоски загрузки можно писать одной командой поке. Зачем нужно тап?
Им пользуются в Европе))) А мы то тут при чем? Наш формат трд. Мы придумали тр дос. Мы придумали стандарт Пентагон. У нас свой инт. Зачем нам тап, если он не наш в любом раскладе.
Врут? ;)
Конечно же фирма АААБант постоянно работает над производством демонстраций. Это и перевод не спековские дем на спектрум, Этим занимается самый сильный кодер России — Тибох. И производство демо под тс коконфу, этим занимается человек года — VBI.
AAA трудится над новым коротеньким трахмо, рабочее название Trahing Introspect. А настоящее время написано 4 эффекта. В качестве картинок будут браться работы исключительно тех художников, что не разрешали брать свою графику. Санд и тому подобное, а итак же графика из новых игр. Музыка, возможно тс спринтера.
И вот как здорово сделал ААА:
Сегодня с тибохом добрались до диска 2 нашего мегадемо. Перепелил +2 части заново. Добавил смелости ))
Для себя уяснил, что сделать из трах мо мегадемо, это заново перепелить все части. Потому что абсолютно разно представление для трахмо и мегадемы. Теперь я знаю досканально что есть в мегадемо и чего нет в трахме. Два разных жанра и два разных подхода. Не жалею что убил свой месяц и месяц тибоха на эту работу, потому что мегадемо выглядит всё же лучше трахмо. странно, но факт.
Comming Soon, как говорится, скорее всего на этой недели!
Исправлено 20 частей. Полностью переделано 5.