пофигу какое окно активно, выборка идёт всё равно из медленной памяти.
с другой стороны ЧВ на байте работает довольно шустро, так что не думаю что стоит заострять на медленной памяти сильно много внимания.
Вид для печати
пофигу какое окно активно, выборка идёт всё равно из медленной памяти.
с другой стороны ЧВ на байте работает довольно шустро, так что не думаю что стоит заострять на медленной памяти сильно много внимания.
ну просто Machined фиксил под эмулятором под медленный комп - разница с пентагоном неземная =( вроде на 90% попал, но все равно на пенте смотреть приятнее намного...
вспоминая чему меня учили мэтры когда я ещё был маленьким - никогда не ставить ренистр I в медленную память, ибо тормоз на процентов 20 обеспечен ;)
[offtop]
кстати Machined - классная демка.
[/offtop]
я был бы очень благодарен тому, кто сможет ответить на следующие вопросы:
1. насколько долго вообще переключаются банки памяти?
2. как быстро можно перебросить буфер на экран при включенных прерываниях? по моему опыту - примерно за 100 000 тактов, но программист из меня не лучший.
за 100 000 тактов можно совершить примерно 3000 раз down hl, чего, по моим представлениям, обычно хватает для полного отстраивания тайлового фона и 4-5 спрайтов.
поправьте меня, если ошибаюсь.
> 1. насколько долго вообще переключаются банки памяти?
в зависимости от комманд которые используешь. это ж не PC чтоб что-то тормозило отличное от проца :)
например так
ld a,#17
ld bc,#7ffd
out (c),a
можешь сам посчитать сколько тактов
спасибо, именно это и надо было знать :) как-то в литературе этот вопрос не освещается, подразумевая, видимо, что программист помимо асма еще и в железе разбирается.
Добавлено через 2 минуты
есть ли какие-нибудь готовые примеры реализации? я просто над этой задачей бьюсь сейчас, и лишние идеи, честно говоря, не повредили бы.
и еще, если запортить область после #5b00, trdos работать будет?
ну начинается ликбез :-) ладно как модеру мне положено это делать :-)
Если есть область данных неизвестной заранее структуры, тогда используются по простому
1) классика
ld hl,откуда
ld de,куда
ld bc,сколько
ldir
в итоге для больших массивов начальные установки можно считать 0 длительности, около 21 такт на байт, это наиболее очевидная и древняя конструкция, использовалась для переброса во всех первых играх
2) классика 2
ld a,количество_строк
ld hl,откуда
ld de,куда
metka:
ldi
ldi
..
ldi ; заданное количество раз
dec a
jr nz,metka
итого около 16 тактов на 1 байт, использовалось в robocop и многих других программах
3) классика 3
ld sp,откуда
pop hl
pop de
pop bc
pop af
exx
pop hl
pop de
pop bc
; сюда же можно записать и pop ix pop iy, однако это не так эффективно
ld sp,куда+количество_регистро ых_пар*2
push bc
push de
push hl
exx
push af
push bc
push de
push hl
; и заново переустанавливать стек
Эта конструкция использовалась в Satisfaction и часто в других демках. Длина - около 12 тактов на байт, за это приходится расплачиваться тем что такие конструкции не сделаешь в цикле, итого огромный размер перебросчика буфера (около 1,5 байта на 1 байт перебрасываемой области, для одного экрана около 10 кбайт).
Итого 12 тактов * 6912 байт = около 80 тыщ тактов.
Если экран обрезан по краям (например есть рамка, которую нет смысла каждый раз выводить), тогда можно уложиться и в прерывание (опять тот же Satisfaction, где карта Киева), можно даже посчитать - вместо 32*24*8 надо прорисовать 30*20*8 байт, это 4080 байт, около 60 тыщ тактов на прорисовку, даже есть время прорисовать атрибуты и сделать бегущую строчку и проиграть фоновую музыку.
Быстрее можно только если экранная область будет кривая, то есть например расположена внутри кода её выводящего -классическая для мультиколора процедура
ld hl,nn
push hl
ld hl,mm
push hl
и т.д.
nn и mm - те самые данные.
В этом случае около 11 тактов на 1 байт (меньше невозможно).