Ну, я ж на писи делаю образы дисков. Возможно, что-то случайно закинул. Не знаю что это. А экзешники Maptest, ZXBMap, ZXMap нормально запускаются? У Maptest на железе, не скажешь, какое время?
Вид для печати
Да - нормально запускаются - чуть позже видосик сниму на телефон
А вообще если акселем копировать на экран, то весь экран копируется за 1.2 инта (т.е. в пределе 41 кадр в секунду) - вот код, который копирует из одной области видеопамяти в другую (можно сделать с нахлёстом, тогда будет типа скролл):
Код:; display page was opened from the #C000 already
LD HL,#C000 ; Address of the beginning of a line of first screen
LD DE,#C180 ; Address of the beginning of a line of second screen
LD BC,#140 ; The width of the screen
DI ; Disable interrupt
LD D,D ; Switch the Accelerator to define block size mode
LD A,0 ; Set block size to 256 bytes
LD A,A ; Switch the Accelerator to copying a graphic data block mode
LDIR ; Copying
LD B,B ; Switch the Accelerator off
EI ; Enable interrupt
Shaos, попробую акселератор,но у него есть недостаток - при копировании адреса из приемника в источник, адреса обоих возрастают. Это увеличивает расход памяти на хранение спрайтов, из-за невозможности их мирроринга, так как при копировании с инкреметом адресов невозможно копирование с зеркалированием цепочки байт. Если бы был ещё режим - инкремент адреса приёмника, декремент адреса источника, то расхода памяти для спрайтов можно было бы избежать.
Мне интересно как в игре TITD идёт работа со срайтами. Очень там гладко всё - уровень SNES. Где-то читал, что в этой игре есть модуль с прошивкой ФПГА на лету для ускорения спрайтового вывода. Мне нужен этот модуль и программный интерфейс к нему.
К сожалению информация по прошивке для Тхундера полностью утеряна (как и исходники) - насколько я знаю там была возможность крутить (скролить?) тайлы с точностью до 1 пиксела
Я написал процедуру вывода тайла через ускоритель, так как тайловая карта строится последовательно по тайлам. Теперь время теста составляет 14 секунд, или 18.25 экранов в секунду.
Сделал образ диска с экзешными файлами:
SpMap - тест вывода 255 экранов на время;
Scroll - скролл карты с потайловым шагом.
Ссылка https://dropmefiles.com/IHCTU
Тестировал ещё потом вывод спрайтов без клиппинга. Вот такие результаты получил для спрайтов в 16 на 16 пикселей при их выводе за 1/50 секунду с учётом восстановления фона:
- Вывод спрайта программно с программным прозрачным цветом - около 17 спрайтов( как при прямом, так и при зеркальном выводе);
- Вывод спрайта программно с аппаратным прозрачным цветом - около 25 спрайтов при прямом выводе и 23 спрайта при зеркальном выводе ;
- Вывод спрайта акселератором с аппаратным прозрачным цветом - около 80 спрайтов.
При клиппировании эти результаты, однозначно, будут меньше, но я клиппирование ещё не проверял.
Недостаток вывода спрайтов акселератором - отсутствие зеркалирования. Но этот недостаток можно сгладить, если при запуске игры заранее сделать зеркальные копии спрайтов в памяти специальной процедурой.
Shaos, если делать свой диспетчер прерываний для обработки нажатий клавиатуры, то этот пример кода для обработки нажатий на клавиатуре будет полезен?
http://sprinter8.org/blocks/z84c15/keyboard
Хочу сделать опрос клавиатуры в программе, но на своём диспетчере прерываний. От обычного спектрума процесс установки своей процедуры обработки прерывания чем-нибудь отличается на спринтере?
Справочная информация по прерываниям обычного спектрума https://zxpress.ru/article.php?id=1615
Да, поможет. В принципе достаточно только второго листинга из статьи, п/п READ_KBD. Инициализацию порта делает DSS.
Если хочешь сэкономить такты и не нужны функциональные клавиши и пр..., то можешь опрашивать спектрумовские порты клавиатуры - они доступны (в эмуляторе возможно потребуется добавить устройство Common Spectrum Keyboard).
Начал писать движок игры. Тут такое дело возникло: выделяю в программе память, в конце программы освобождаю память, а в ОС по окончании программы нет выхода. Где я напутал?
Выделяю память так:
Освобождаю память так:Цитата:
;сохранение старых значений страниц в окнах 0,1,3
IN A,(0x82)
LD (OldWin0Page),A
IN A,(0xa2)
LD (OldWin1Page),A
IN A,(0xE2)
LD (OldWin3Page),A
;выделение памяти
;для окон 0 и 3
;получение блока памяти на две страницы
ld b, 2
ld c,61
rst 0x10
ld (memblock),a; сохраним номер блока
;получим номера физических страниц в блоке
;в акк уже есть ном. блока
ld b, 0
ld c,196
call 15635
ld (Win0Page),a
ld a,(memblock)
ld b, 1
ld c,196
call 15635
ld (Win3Page),a
;отключение прерываний
di
ld a,i
ld (OldIREG),a
ld (OldSP),sp
;Установка новых значений страниц в окнах 0,1,3
Ld a,(Win0Page)
out (0x82),a
LD A,0x54; в 1 странице видеопамять
OUT (0xa2),A
Ld a,(Win3Page)
out (0xe2),a
;УСТАНАВЛИВАЕ СТЕК
ld sp,61000
Вот исходный код во вложении( Пасмо ассемблер).Вложение 75996Цитата:
di
ld a,(OldIREG)
ld i,a
im 1
;Установка старых значений страниц в окнах 0,1,3
Ld a,(OldWin0Page)
out (0x82),a
LD A,(OldWin1Page)
OUT (0xa2),A
Ld a,(OldWin3Page)
out (0xe2),a
;УСТАНАВЛИВАЕМ СТАРЫЙ СТЕК
ld sp,(OldSP)
;ei Включал прерывания - не помогло. В ОС нет выхода
;освобождаем память
ld a,(memblock)
ld c,62
rst 0x10
Скомпилированная программа:
https://dropmefiles.com/1IaUY
Лучше пользоваться RST 8 для этого, там хоть и стоит заглушка, которая перенаправляет на #0008, но все же так быстрее и понятнее.
Что касается проблемы - с виду все норм, не заметил ничего критичного. Попробую подебажить - посмотрим.
Кстати, многие не знают, но в ZXMAK2 есть Debugger, который может здорово помочь в отладке!