nedoPC.org

Electronics hobbyists community established in 2002
Atom Feed | View unanswered posts | View active topics It is currently 31 Mar 2023 12:37



Reply to topic  [ 47 posts ]  Go to page Previous  1, 2, 3, 4  Next
ZX Spectrum 42 символа в строке 
Author Message
Supreme God
User avatar

Joined: 21 Oct 2009 08:08
Posts: 7777
Location: Россия
Reply with quote
Shaos wrote:
А твой старый проект ведь про программную генерацию видеосигнала на КР580ВМ80А?
Ты там можешь ведь сам только 6 битов от каждого символа выталкивать, не?

Нет, не могу... Придётся "месить", именно это я и хочу увидеть, как "месили" на Спектрум.
Пока я знаю только алгоритм от А.Волкова, который мы здесь на форуме разбирали и раскритиковали
как неоптимальный и довольно медленный...

Ну... А.Волкову, я думаю, простительно - он как тот пианист "играл как умел"... но мы-то в 2023 году уже" :wink:

_________________
iLavr


24 Jan 2023 13:27
Profile
Admin
User avatar

Joined: 08 Jan 2003 23:22
Posts: 21077
Location: Silicon Valley
Reply with quote
А где мы его здесь на форуме разбирали и раскритиковали? Я вообще не помню...

P.S. Вот сгенерил картинку с разными фонами в соседних знакоместах, чтобы было лучше видно "месилово" символов между знакоместами:


Attachments:
FONTS_42_colored.png
FONTS_42_colored.png [ 15.22 KiB | Viewed 570 times ]

_________________
:dj: https://mastodon.social/@Shaos
24 Jan 2023 20:17
Profile WWW
Admin
User avatar

Joined: 08 Jan 2003 23:22
Posts: 21077
Location: Silicon Valley
Reply with quote
Посмотрел внимательно алгоритм от Алоне - очень хитрый алгоритм, но скорее компактный, чем "быстрый":
Code:
; DE - address
; A - character
; C - offset 7,5,3,1
     PUSH DE
     LD L,A
     LD B,C
     LD A,2
     RRCA
     DJNZ $-1
     LD (PRN+1),A
     LD H,'FONT
     LD B,8
PRGO PUSH HL
     LD L,(HL)
PRN  LD H,1
PR1  ADD HL,HL
     ADD HL,HL
     JR NC,PR1
     LD A,(DE)
     OR H
     LD (DE),A
     INC E
     LD A,L
     LD (DE),A
     DEC E
     INC D
     POP HL
     INC H
     DJNZ PRGO
     POP DE
Он придумал вращать символ сразу в 16-битном пространстве через ADD HL,HL !!!
Выводимый символ складывается с тем, что было на экране по OR (а второй байт просто копируется в следующее знакоместо, даже если символ полностью умещается в одном),
т.е. подразумевается, что экран был заранее очищен перед выводом (значит о выводе символа в произвольное место экрана речи не идёт).
Ну и кто-то снаружи должен вычислить закодированное смещение символа, записав его в регистр C перед каждым выводом очередной буквы.
И в одном месте программа даже модифицирует саму себя в зависимости от этого смещения :o
Менять значение C на входе предлагается так:
Code:
     LD A,C
     SUB 6
     JR NC,$+5
     INC E
     AND 7
     LD C,A
т.е. 7 превращается в 1 потом в 3 (с инкрементом E), потом в 5 (тоже с инкрементом E) ну и потом снова в 7 (опять же с инкрементом E)
Ну и ещё надо со стороны притянуть код, превращающий экранные координаты в адрес видеопамяти (Алоне печатает в адрес, а не в координаты), например вот такой:
Code:
   ;=========координаты -> scr adr========
   ;in: D - Y координата, E - X координата
   ;out:DE - screen adress
           LD A,D
           AND 7
           RRCA
           RRCA
           RRCA
           OR E
           LD E,A
           LD A,D
           AND 24
           OR 64
           LD D,A


Можно попробовать поработать с этим для получения чуть более расширенного компактного варианта, который пишет в произвольное место экрана со стиранием того, что там было...

_________________
:dj: https://mastodon.social/@Shaos


24 Jan 2023 23:13
Profile WWW
Supreme God
User avatar

Joined: 21 Oct 2009 08:08
Posts: 7777
Location: Россия
Reply with quote
Shaos wrote:
А где мы его здесь на форуме разбирали и раскритиковали? Я вообще не помню...

Железный Дровосек писал, видимо, он и снёс этот свой пост. :-?
Но поскольку я сам тогда не разбирал процедуру вывода символа на экран, то прочитал внимательно.

Только сейчас структура экрана более близка к Спектруму, а не к Специалисту...


P.S. Я даже вспомнил где это было. :wink: Огрызок-цитата застряла здесь:
http://www.nedopc.org/forum/viewtopic.php?p=89033#p89033

_________________
iLavr


25 Jan 2023 07:27
Profile
Admin
User avatar

Joined: 08 Jan 2003 23:22
Posts: 21077
Location: Silicon Valley
Reply with quote
Дык тебе поди ещё и в кодах 8080 надо? ;)

P.S. Наладил тест на скорость - буду мерять бордюром - мой алгоритм выводит 21 букву пока луч пробегает вдоль графического экрана (за весь фрейм должно быть порядка 35 т.е. весь экран выводится за чуть больше, чем полсекунды) - теперь надо замерять другие алгоритмы...


Attachments:
FONTS_42_timings.png
FONTS_42_timings.png [ 1.82 KiB | Viewed 570 times ]

_________________
:dj: https://mastodon.social/@Shaos
25 Jan 2023 10:44
Profile WWW
Supreme God
User avatar

Joined: 21 Oct 2009 08:08
Posts: 7777
Location: Россия
Reply with quote
Shaos wrote:
Дык тебе поди ещё и в кодах 8080 надо? ;)

Мне алгоритм интересен, а коды я и сам писать умею. :wink:

_________________
iLavr


25 Jan 2023 11:11
Profile
Admin
User avatar

Joined: 08 Jan 2003 23:22
Posts: 21077
Location: Silicon Valley
Reply with quote
Дык алгоритм зависит от системы команд - если какие-то инструкции z80 позволяют сделать что-то быстрее, то люди ради оптимизации будут использовать именно их - ухудшая понимабельность кода…

_________________
:dj: https://mastodon.social/@Shaos


25 Jan 2023 13:13
Profile WWW
Supreme God
User avatar

Joined: 21 Oct 2009 08:08
Posts: 7777
Location: Россия
Reply with quote
Ты мне просто глаза открыл! :o

Я тебе отвечу взаимностью! :roll:

Алгоритм - вещь универсальная, а реализация его в кодах - аппаратно-зависимая... :ebiggrin:

_________________
iLavr


25 Jan 2023 14:44
Profile
Admin
User avatar

Joined: 08 Jan 2003 23:22
Posts: 21077
Location: Silicon Valley
Reply with quote
Не - алгоритм может быть совсем другим если скажем надо например заполнять память задом наперёд через PUSH вместо обычного заполнения от младших адресов к старшим…

_________________
:dj: https://mastodon.social/@Shaos


25 Jan 2023 15:01
Profile WWW
Supreme God
User avatar

Joined: 21 Oct 2009 08:08
Posts: 7777
Location: Россия
Reply with quote
Shaos wrote:
Не - алгоритм может быть совсем другим если скажем надо например заполнять память задом наперёд через PUSH вместо обычного заполнения от младших адресов к старшим…

Объясняю:"надо заполнить память задом наперёд" - это алгоритм, мы на понятном себе языке
уяснили задачу.

Реализация алгоритма для 8080:
1 вариант: Через MOV M,A; DCX H
2 вариант: Через PUSH ...; DCX ...

Для z80 есть еще варианты...

_________________
iLavr


25 Jan 2023 16:10
Profile
Admin
User avatar

Joined: 08 Jan 2003 23:22
Posts: 21077
Location: Silicon Valley
Reply with quote
Ну суть в том, что на процессоре, где Пуш не быстрее побайтового копирования, работать с памятью задом наперёд ненужно - т.е. там нужен будет другой (обычный) алгоритм. Я про то, что универсальных алгоритмов в общем случае небывает - надо смотреть на конкретную систему команд процессора и уже от неё плясать. Даже если речь идёт о языках высокого уровня типа Си - например в конце 90х все знали, что цикл for(i=0;i<10;i++) работает на x86 чуть медленнее, чем for(i=9;i>=0;i—) т.к. там была единая инструкция вычесть 1 и проверить на 0 (как собственно и в z80) - отсюда была необходимость менять алгоритм, если нужно…

_________________
:dj: https://mastodon.social/@Shaos


25 Jan 2023 16:51
Profile WWW
Supreme God
User avatar

Joined: 21 Oct 2009 08:08
Posts: 7777
Location: Россия
Reply with quote
Я совсем о другом говорю - сначала нужно точно представлять конкретный алгоритм.
Т.е. чтобы самому было понятно что нужно сделать и как.

А потом дополнительно оценить ещё и обстоятельства аппаратные.

Но что-то мне писать всё неохота ибо это написано в известных книжках:

Quote:
Элфринг Г. Программирование на языке ассемблера для микроЭВМ. Издательство: Радио и связь Год: 1987 Страниц: 170

Л. Левенталь, У. Сэйвилл Программирование на языке ассемблера для микропроцессоров 8080 и 8085. Перевод с английского А.А. Батнера. Москва: Издательство «Радио и связь», 1987 Страниц: 448


В данный момент алгоритм вывода 42 символа в строке с учетом аппаратных особенностей
я представляю довольно смутно. :-?

_________________
iLavr


25 Jan 2023 17:40
Profile
Admin
User avatar

Joined: 08 Jan 2003 23:22
Posts: 21077
Location: Silicon Valley
Reply with quote
Ну что тут непонятного то? ;)
Code:
|1111 1122|2222 3333|3344 4444|

В каждые 3 байта умещается 4 символа в разрезе - соответственно надо уметь сдвигать знаки по горизонтали в 4 разные позиции:
1. буква прижата к левому краю - символ целиком влазит в знакоместо (обычно это копия буквы из шрифта как есть);
2. буква сдвинута вправо на 6 пикселов от левого края и разрезана на две части в 2 и 4 пиксела, занимая 2 знакоместа;
3. буква сдвинута вправо на 4 пиксела от левого края и разрезана на две части в 4 и 2 пиксела, занимая 2 знакоместа;
4. буква сдвинута вправо на 2 пиксела от левого края - символ целиком влазит в знакоместо.

Вращать символ можно в пределах 8 битов вправо через RRCA (4 такта на пиксел), беря затем по маске 2 части если буква расползается на 2 знакоместа (как в моём примере).
Также можно вращать символ в пределах 16 битов влево через ADD HL,HL (11 тактов на пиксел), печатая получившиеся 2 байта в видеопамять по OR (как у Алоне).
А можно сразу держать в памяти 4 копии шрифта где буквы уже повёрнуты на нужное количество бит (так я хочу сделать).

Ещё один способ ускорения (подсмотренный в одной из статей ZXDN) заключается в расположении знакогенератора в памяти не по буквам по 7 байт каждая (как в моём примере), а по разрезам - сначала первые плашки всех 256 символов, потом вторые плашки, потом третьи и т.д. до 7й плашки - в этом случае не придётся умножать на 7 при поиске нужного символа в шрифте по коду - просто сразу отступаем на код символа и печатаем плашки инкрементируя старший байт в адресе (похоже именно так шрифт у Алоне расположен в памяти, но в его статье про это ни слова).

_________________
:dj: https://mastodon.social/@Shaos


25 Jan 2023 21:02
Profile WWW
Supreme God
User avatar

Joined: 21 Oct 2009 08:08
Posts: 7777
Location: Россия
Reply with quote
Shaos wrote:
Ну что тут непонятного то? ;)

Да я и не говорю, что непонятное что-то там, просто я пока занят аппаратной частью и программу ни одну не смотрел ещё. :roll:
За развёртку алгоритма - спасибо.

Просто у меня ещё будет трудность с позиционированием графических образов в экранном ОЗУ.
Развёртка же для упрощения программно-аппаратная, поэтому структура ОЗУ не сплошная
ну или нелинейная.
Каждый третий параграф видео-ОЗУ не отображается на экране, а формирует строчный гасящий импульс.

Я поэтому и говорю, что в целом я всю процедуру пока ещё плохо представляю.

_________________
iLavr


26 Jan 2023 03:29
Profile
Supreme God
User avatar

Joined: 21 Oct 2009 08:08
Posts: 7777
Location: Россия
Reply with quote
А насчёт реализации алгоритма я вот что хотел сказать.

У А.Волкова в оригинале - одна ПЗУ 2048 байт.

В ней сразу большое место занимает знакогенератор - самый обычный, на кусочки не порезанный.

Там же у него - процедура вывода символа на экран, и там же - ввод с магнитофона. Обе процедуры сложные.

Очистка видео-ОЗУ у него тоже есть, поскольку при старте в видео-ОЗУ случайные значения.

Ввод с магнитофона - это заполнение области ОЗУ байтом из порта (грубо).
Очистка видео-ОЗУ - это заполнение области ОЗУ байтом 00Н или 0FFH.
При ограниченном объёме памяти я бы, пожалуй, совместил в этих задачах указанную процедуру.

Хотя, безусловно, через PUSH ... PUSH очистка видео-ОЗУ работает быстрее, но под неё может банально
места не хватить в ограниченных условиях.

_________________
iLavr


26 Jan 2023 03:56
Profile
Display posts from previous:  Sort by  
Reply to topic   [ 47 posts ]  Go to page Previous  1, 2, 3, 4  Next

Who is online

Users browsing this forum: No registered users and 1 guest


You cannot post new topics in this forum
You cannot reply to topics in this forum
You cannot edit your posts in this forum
You cannot delete your posts in this forum
You cannot post attachments in this forum

Search for:
Jump to:  

Powered by phpBB® Forum Software © phpBB Group
Designed by ST Software.