Тогда синхронизации с кадрами не будет. И некоторые прерывания будут пропадать. Если музыка на прерываниях, то звук поганый будет.
В режиме IM 2?
Вид для печати
Мелкий шрифт 64х24 меня не устраивает, тем более в интернетике валом исходников его реализации.
А вот как быть с кириллицей хотя бы 8х8 ? Не все клоны оснащены русификацией.
Подкиньте, пожалуйста, процедурок вывода русифицированного текста, с нарисованными в DEFB символами.
А если будет 8х16 или 16х16 то ваще суперово.
Главное чтоб простота использования. Ну, то есть в регистровую пару координаты текста. В отдельный массив DEFB сам текст.
Andrew771, я заметил, что процедуру умножения можно подсакротить.
СейчасУбирая повторы получимКод:***
mul_n50 add hl,hl
ld d,h
ld e,l
add hl,hl
add hl,hl
add hl,hl
ld b,h
ld c,l
add hl,hl
add hl,bc
add hl,de
ret
mul_n64 add hl,hl
add hl,hl
add hl,hl
add hl,hl
add hl,hl
add hl,hl
ret
mul_n100 add hl,hl
add hl,hl
ld d,h
ld e,l
add hl,hl
add hl,hl
add hl,hl
ld b,h
ld c,l
add hl,hl
add hl,bc
add hl,de
ret
mul_n128 add hl,hl
add hl,hl
add hl,hl
add hl,hl
add hl,hl
add hl,hl
add hl,hl
ret
И это только для образца, там выше тоже сокращается.Код:***
mul_n100 add hl,hl
mul_n50 add hl,hl
mul_n25 ld d,h
ld e,l
add hl,hl
add hl,hl
add hl,hl
ld b,h
ld c,l
add hl,hl
add hl,bc
add hl,de
ret
mul_n128 add hl,hl
mul_n64 add hl,hl
mul_n32 add hl,hl
mul_n16 add hl,hl
mul_n8 add hl,hl
mul_n4 add hl,hl
mul_n2 add hl,hl
ret
есть здесь
В библиотеке много чего можно пооптимизировать, т.к. писалось иногда второпях и на первом попавшемся образце :)
да, в режиме IM 2.
Вырезку из этой книги про использование RST16 я знаю
Но там архаичный способ. Графика символов заносятся через DATA.
Я прост думал, может за столько лет появились готовые опубликованные решения, где достаточно просто асм-процедурку воткнуть ctrl-c, ctrl-v.
В исходнике ZXOOM есть печать символов 8х8 (и 4х8 тоже), но там по-моему только заглавные буквы, цифры и некоторые знаки препинания. В инструментах разработки там же конвертер текста на русском в коды для асма.
Я в свою уже занёс :)
как нарисовать линию?
Не обязательно быструю процедуру.
Можно и вызовом из ПЗУ.
Вроде по адресу CALL 9146 расположена команда DRAW. Но пока не понял, как задать начало линии (PLOT) да и в принципе какими регистрами передаются параметры.
Как написать игру на ассемблере для ZX Spectrum
Цитата:
Прямые линии
Продвинемся еще на один шаг вперед и научимся проводить прямые линии. Для этого потребуется сперва указать начальные координаты, поставив точку, от которой протянется линия, а затем задать величины смещения по горизонтали и вертикали до конечной точки линии. В Бейсике это должно выглядеть примерно так:
PLOT 120,80: DRAW 35,-60
Оператор DRAW реализует подпрограмма ПЗУ, находящаяся по адресу 9402. Перед обращением к ней в регистры C и B необходимо последовательно занести значения параметров, взятые по абсолютной величине, то есть в C в нашем примере помещается число 35, а в B нужно загрузить не -60, а 60. Но чтобы не потерять знаки, их следует разместить на регистрах E и D. Это значит, что в регистр E заносится единица, а в D - минус единица (или, что то же самое, 255). Таким образом, приведенная выше строка Бейсика на ассемблере запишется так:
Код:LD BC,#5078 ;C = 120 (#78), B = 80 (#50)
CALL 8933
LD BC,#3C23 ;C = 35 (#23), B = 60 (#3C)
LD DE,#FF01 ;E = 1 (#01), D = -1 = 255 (#FF)
CALL 9402
RET
По поводу музла.
Может надо push-ами сохранять состояния всех регистров, флагов перед вызовом процедуры плеера.
Или Asm команда пасцаля сама фигачит такой набор?
П.С. с линиями понятно.
А вот с их атрибутами сложновато.
Так и не понял как их изменить. Всё время рисуется чёрный инк, белый пэйпер.
ALKO, в той же книге есть про атрибуты ;-)
Я попробовал вот эту комбинацию прямо перед вызовом рисовалки.
Ничё не поменялось.Цитата:
LD A,70 ;байт атрибутов
LD (23693),A ;помещаем в системную переменную ATTR_P
В принципе, уже не нужно. Я заливку сделал отдельной процедурой.
Да и те линии мне нужны были лишь для менюшки, я её полностью процедурно решил рисовать. Рамки в цикле, заливка тоже.
И текст скейлится. Ещё думаю, может и сам спрайт Алисы отскейлить процедурно вдвое. У Эндрю вроде были процедурки в ZXoom. Или нет, уже не помню.
https://sun9-38.userapi.com/c850424/...zZIQAIJT3I.jpg
- - - Добавлено - - -
Музон пашет, но порой подлагивает, когда обрабатывает перемещения спрайта с клавиатуры.
- - - Добавлено - - -
Может его можно как-то высоко-приоритетными прерываниями синхронизировать?
Таким образом сгладил темп музона. Но оно, естественно, жрёт драгоценные фпс-ы.
Цитата:
MUSPLAY
call 88BDh
call 88BDh
HALT
ret
Перед вызовом процедуры плей пробовал и запрещать прерывания, и разрешать.
В цикле опроса клавы такты сжыраются, видимо.
И это... Reobne, вижу в замедленном действии процедура скролла нижний ряд скипает с шагом не то 16, не то 32 пикселя.
А можно её переделать так, шоба нижний ряд скроллился 8 пикселей, а верхний ряд смещался на 8 лишь на каждый второй тик нижнего ряда?
А то в замедленном действии эта дёрганность не комильфо.
Уже ответили, что не сжираются. У тебя, скорее всего, где-то кто-то запрещает прерывания на какое-то время. Найди и уничтожь. У лайк-Паскаля только одна процедура запрещает прерывания - SoundEffect, если ее используешь. Процедура чтения клавиш прерывания не запрещает. Значит, кто-то еще у тебя запрещает.
да тут мне кажется, что не в прерываниях дело вовсе. А в излишнем израсходовании тактов на процедуру, где срабатывает проверка клавиатуры.
Хорошо, сейчас сделаю и пришлю на почту.
Ты автор, как скажешь, так и будет.
А то что верх скроллируется на 8 пикселей, а низ на 16 пикселей, это я специально сделал, когда ты попросил параллакс.
А так, как ты просишь, я бы никогда сам не догадался сделать. Это-ж как получиться, верх будет скроллироваться с одним fps, а низ с удвоенным fps. В моём понимании, это как раз и есть дёрганность вверху. Я себе не представляю, чтобы разные части сцены с разным fps были. :)
Ты вот честно скажи, ты IM 2 включил или нет? А то Andrew771 уже пошёл за тебя спрашивать вопросы, как будто уверен, что у тебя IM 2 работает. А я что-то не уверен.
Но это таки классический метод параллаксов.
Техническая Алиса же будет постепенно разгоняться. А в медленном режиме как раз дёрганность будет именно внизу. Всё-таки скип в 16 пикселей куда более рвано выглядят, чем 8. Однако почему-то большинство разрабов любят именно по 16 скипать.
К тому же у меня далее по плану после этой аркадки приступить к квесту-предисловию (а-ля Буратина), раз уж на метроидванию никто не отзывается. А там всё время будет камера медленно ездить.
IM2 я не трогал. А на каком этапе его надо врубить?
Вот добавь это
call MusicPlay - это вызов музыкального игруна.Код:Im2Init
xor a
ld l,a
ld a,0+((LastAddr+255)>>8)
ld i,a
ld h,a
ld d,a
ld e,l
inc e
ld bc,256
inc a
ld (hl),a
ldir
ld h,a
ld l,a
ld (hl),0c3h
ld de,Im2Go
inc hl
ld (hl),e
inc hl
ld (hl),d
im 2
ei
ret
Im2Go
push af
push hl
push de
push bc
ex af,af'
exx
push af
push hl
push de
push bc
push ix
push iy
call MusicPlay
ld hl,FrameCounter
inc (hl)
pop iy
pop ix
pop bc
pop de
pop hl
pop af
ex af,af'
exx
pop bc
pop de
pop hl
pop af
ei
ret
FrameCounter
defb 0c9h
В самом конце файла вставь метку "LastAddr"
А в начале, когда уже можно будет играть музыку(после её инициализации(ты как-то писал, что инициализируешь её)), вызови Im2Init. А из основного цикла программы всю музыку убери. Она сама будет играться, от прерываний.
На первых порах тебе пойдёт. Потом, на финишной обработке можно будет уплотнить. Убрать пустоты. А пока что - лишь бы правильно работала, памяти хватает.
- - - Добавлено - - -
Нажал редактировать - увидел своё сообщение. Сохранил.
Насколько я знаю, программы создания музыки выдают для вставки в свои проги две процедуры. Первая - инициализация (как раз устанавливает режим IM2), вторая - сама музыка. Обе нужно по одному разу вызвать в начале программы, дальше музыка сама играет в прерываниях. Прерывания автоматически вызываются сами 50 раз в секунду, если не запрещены (это ликбез такой :) ).
Хм. Это как музыкант пишет конституцию страны. Это государственное дело, и должно решаться на государственном уровне, а не музыкантишкой.
Так и в программе, программист должен решать когда включить IM 2, когда выключить. И что у него там будет обрабатываться. Не только музыка, но и подсчёт времени, клавиатура/джойстик, фактор случайности, отображение минирадара, переключение страниц экрана для мультиколора, игра на атрибутах, рисование на бордере, и прочее, прочее, прочее. Так что если музыкальный модуль самостоятельно делает таблицу вектора прерываний, включает IM 2, и обрабатывает прерывания играя музыку, то это какой-то режим для новичков, которые пишут в бейсике.
Я даже помню, что в бейсике приходилось писать:
100 PAUSE 1:RANDOMIZE USR MusPlay: GOTO 100
Чтобы послушать музыку.
А вообще, может ты и прав, только не надо так однозначно. Надо посмотреть конкретно, что за музыкальный редактор использует ALKO и там уже всё увидим.
ALKO, Напомни, в каком редакторе музыку пишешь.
Vortex tracker.
У него на выходе получаются две функции (инит, и плэй, причём плэй надо самому каждый раз вызывать через CALL с частотой 50 герц). А шоб оно само по себе за счёт тактов прерываний играло, даж не знаю как это делается :\
Выше описанный код я ещё не пробовал переварить.
LastAddr - это уже где массив данных самого модуля заканчивается? И надо ставить эту метку аккурат на последний байт данных? Или где начинается уже первый NOP ? Сложновато.. ух и сложновато.
Вот, я так и думал!
То что я тебе прислал, оно как раз и будет вызывать плэй.
В самом конце текста, уже после всех данных и кода.
При инициализации IM 2, по классике, нужно сделать таблицу в 257 байт. Вот это как раз для этой таблицы. Она заведётся в свободной памяти, после кода и данных. Так же нужно код поместить по адресу с одинаковым старшим и младшим байтами. Сейчас я просто ставлю JP в следующем секторе памяти, считая и его свободным. Если памяти будет не хватать, а код более менее устаканится, то можно будет переписать, приспособив к существующему коду, менее расточительно.
- - - Добавлено - - -
Вот тут не забудь вставить адрес игруна музыки.
Таво самого про которого ты писал:
Тээк-с.
Всё сделал согласно ваших указаний по шаманству над interrupt-музоном.
Работает, но как и прежде - проседает фпс/темп музла именно при обработке клавы.
Наглядно на реале (он у меня даже чутка быстрее эмуля, но даже на нём появляются такие просадки)
https://vk.com/wall-145919754_676
Да, странная лабуда. Вряд ли именно графика просаживает. Потому что алиса даже будучи на одном месте анимируется, да и столбики разной высоты должны вызывать ощутимые скачки. Но ощутимо почему-то именно при нажатии...
- - - Добавлено - - -
Подскажите по пресетам ZX-paintbrush. Из него же можно в нужном виде для ZX-паскаля экспортнуть массив данных под спрайты?
https://sun9-69.userapi.com/c851028/...S308kKdo8s.jpg
- - - Добавлено - - -
можно же как-то выделить даже нужный ректангл для экспорта?
Не я не про графику говорил. Тут интересно как работает контроллер клавиатуры (если он есть) на твоём реале и как эмулируется на эмуляторе. Тормозит при нажатии любой клавиши или только тех которые используются ? Если есть правый синклер джойстиком, попробуй завести через него [98760] и сравнить через джойстик и клаву.
Если джойстик не тормозит а клава тормозит, значит проблема аппаратная - тормозится сам процессор на момент работы контроллера.
Контроллер клавиатуры? На Горбатом? Нонсенс.
У меня не АТМ турбо, и не пент-евы. Обычный ленин. Да и эмулятор в режиме обычного 48к.
По-моему там просто крест-накрест линии ввода-вывода Z80 на клавиатуре сидят (грубо говоря. Если не учитывать всякие регистры-буферы для развязки).
Reobne,Именно так я и сделал. (фигурные скобочки - это "комментарии" на паскале, если чё).Цитата:
Значит ещё раз, что нужно сделать:
1. Убрать все вызовы музыкального плейера, кроме как в
функции Im2Go
2. Сделать вызов Im2Init после инициализации музыки.
Код:{Главный цикл}
begin
asm(MUSINIT);
asm(Im2Init);
Color(41);
ClrScr;
game_state:=0;
init_menu_f:=0;
while 1<2 do {бесконечный цикл, условие всегда выполняется}
begin
case game_state of
0 : menu;
1 : init_game;
2 : begin
drawAlice;
enemyMove;
Asm(SCROLL3);
Asm(SCROLL3);
drawBarrier;
{Asm(MUSPLAY);}
end;
end;
end;
end.
Нафига эти оба? Второе только нужно.Цитата:
asm(MUSINIT);
asm(Im2Init);