С любовью к вам, Yandex.Direct
Размещение рекламы на форуме способствует его дальнейшему развитию
Свирепый агрессивно-депрессивный мордовец!
Не уверен - не напрягай!
Не сдавайся. Дыши?
Virtual TR-DOS
Свирепый агрессивно-депрессивный мордовец!
Не уверен - не напрягай!
Не сдавайся. Дыши?
Virtual TR-DOS
У него ХР.
Личка заполнена! И чистить я ее не буду! Пользуйтесь адекватными средствами связи! Спасибо.
Seamos realistas y hagamos lo imposible!
Ernesto Che GuevaraПереехал сюда: SteinBlume (ex ATM CP/M Explorer)
http://era-cg.su
Свирепый агрессивно-депрессивный мордовец!
Не уверен - не напрягай!
Не сдавайся. Дыши?
Virtual TR-DOS
Подскажите, как быстро переходить по строке вверх/вниз на расширенном экране скорпиона?
У него все строчки по порядку идут, каждая 80 байт.
Знаю, что на тех компах, где между соседними строчками ровно 2048 байт, пользуются командами типа
set 3,d
res 3,d
А тут как? Вот самый простой и медленный вариант, для ширины спрайта 6 байт:
;de - адрес на экране
;hl - адрес спрайта
ldi ;скопировали байт
ldi
... ;перенесли одну строчку спрайта
push hl ; теперь на строку ниже
ld hl,80-6 ;ширина строки минус ширина спрайта
add hl,de ;перешли на след. строку
ex de,hl
pop hl ;восстановили hl
Есть способы побыстрее?
Скрытый текст
https://drive.google.com/drive/folde...xZ83juCuaBe32I
Scorpion ZS 256 Turbo+/GMX 2MB/SMUC v1.3 OP/CF-IDE 2GB/TS ARM/Covox #DD/FDD 5'25/FDD 3'5/AT Kbrd & Mouse Ctrl v2.5/Universal PS/2 Kbrd Ctrl/ZX WiFi
Leningrad 1/Sega Joy Adapter
DivGMX
ZX Spectrum +2A
ZX Evolution rev. C
TCK Computer 486DX2-66/512K Tridend 9000i/8MB SIMM72/CF-IDE 512MB/ESS 1869/CNet CN200/FDD 5'25/FDD 3'5
[свернуть]
Давно спрашивали, но ответа не было... пускай будет))
Условимся, что машина без циклов wait. Считаем такты в исходном примере: 11+10+11+4+10 = 46, длина 7 байт.
Без использования стека как хранилища/приемника данных вариантов немного. Первый, без каких-либо опций со стеком:
ld hl ,from
ld de ,to
ld bc ,80-ширина спрайта ; b=0, c=смещение
ld a,с ; аккум хранит смещение, задается один раз перед выводом спрайта
ldi ldi ldi сколько надо
------ сама процедура перевода строки:
ld c,a ; восстанавливаем регистр
ex de, hl
add hl, bc
ex de, hl
------ все, дальше опять пошло ldi ldi ldi
Итого: 4+4+11+4 = 23 такта, 4 байта. Используем аккум, зато в 2 раза ускоряем процедуру.
Если код вывода свернут в цикл, счетчик можно организовать в половинке IX либо в альт. регистре
Второй способ нестандартный, используем регистр SP как константу:
ld (savesp+1), sp ; сохраняем стек
ld sp, смещение ; (80-ширина) грузим смещение в SP и больше его не трогаем
; задаем hl и de. аккумулятор не задействуется
ldi ldi ldi сколько надо
------ сама процедура перевода строки:
ex de, hl
add hl, sp
ex de, hl
------ все, дальше опять пошло ldi ldi ldi
savesp ld sp, 0 ; восстанавливаем sp, конец вывода
Итого 19 тактов, 3 байта. Разница с первым вариантом минимальна, но все зависит от конкретных условий применения.
Сразу видно ограничение: можно юзать только при запрещенных прерываниях, поскольку sp будет указывать в ПЗУ.
Однако можно красиво обойти его при одном условии: строки спрайта хранятся наоборот, от нижних к верхним, и выводятся так же.
В таком случае смещение задается отрицательное, т.к. нужно вернуться "назад" по экранным адресам, зато регистр sp будет указывать
на самый верх ОЗУ (#FFXX), который можно спокойно затереть (скажем, верхние 256 байт памяти резервируем и не трогаем).
Сама процедура аналогична предыдущей, можно юзать при разрешенных прерываниях.
izzx(09.07.2021), Oleg N. Cher(09.07.2021)
Скрытый текст
https://drive.google.com/drive/folde...xZ83juCuaBe32I
Scorpion ZS 256 Turbo+/GMX 2MB/SMUC v1.3 OP/CF-IDE 2GB/TS ARM/Covox #DD/FDD 5'25/FDD 3'5/AT Kbrd & Mouse Ctrl v2.5/Universal PS/2 Kbrd Ctrl/ZX WiFi
Leningrad 1/Sega Joy Adapter
DivGMX
ZX Spectrum +2A
ZX Evolution rev. C
TCK Computer 486DX2-66/512K Tridend 9000i/8MB SIMM72/CF-IDE 512MB/ESS 1869/CNet CN200/FDD 5'25/FDD 3'5
[свернуть]
Именно, думаете)) вся соль в начальном задании пары BC как нуля (B) и ширины спрайта в C.
Если кол-во команд LDI равно ширине спрайта - LDI будет менять только С, а после каждой строки BC будет равно нулю (до перевода строки).
После вывода спрайта HL=адрес след. спрайта, если лежат последовательно, - может пригодиться.
Счетчик, как указывал, можно организовать в половинках IX/IY либо в AF', а можно развернуть код (если память не жмет).
Эту тему просматривают: 1 (пользователей: 0 , гостей: 1)