PDA

Просмотр полной версии : Вопросы по программированию



Willy
06.04.2017, 21:05
Всем привет.

Прочитав документацию, не смог понять несколько моментов:

1. Правильно ли я понимаю, что нет режимов записи в ГЗУ, при котором туда можно положить содержимое байта сразу, за один проход, с нулями и единицами ?
И в цветовом и в плоскостном режиме записываемый байт играет роль маски, и нули не пишутся в ячейку ГЗУ, а оставляют биты на своих местах не тронутыми.
Т.е. чтобы записать байт данных в одну из плоскостей ГЗУ, надо сделать две операции записи: одну для нулевых битов, другую для единичных ?

2. Установка физического цвета в ЛУТ: в документации написано, что четвертым компонентом цвета будет интенсивность (I), которая берётся из текстового экрана.
Т.е. чтобы получить I = 1, надо что-то записать в ячейку АЦЗУ, которая содержит символ в нужном месте экрана.
Но ведь текст всегда выводится поверх графики ? Т.е. символ будет перекрывать то, что отображает ГЗУ, какой в этом смысл ?
Или я что-то не так понял ?

bars_z
22.04.2017, 03:59
Привет.
1. да
2. Маска логического цвета определяется битами, соответствующими одной точке на экране в каждом из слоев ГЗУ (R, G, B) и АЦЗУ (I), физический цвет отображения берется из т. н. просмотровой таблицы (LUT). Допустим, в верхней левой точке экрана в каждом слое ГЗУ (со смещением N*0x4000+0, бит 7) установлены единицы, а в АЦЗУ по адресу 0 записан тоже 0, в этом случае логический цвет этой точки - 0x7. Если в АЦЗУ по адресу 0 записан символ, содержащий включенный бит в верхнем левом углу (или инвертированный символ, его не содержащий), то логический цвет точки (0,0) станет 0xF. Таблица LUT определяет соответствие логического цвета физическому (R, G, B, I). Для побитного (попиксельного) рисования доступны всего 7 логических цветов, т.к. в четвертом слое можно рисовать только средствами АЦЗУ (например, псевдографикой в основном знакогенераторе 0x80..0xBF).
Смысл в том, что фактически у "Корвета" 16-цветная графика, однако один из слоев отдан аппаратному АЦЗУ и формирует очень быструю текстовую информацию и недоступен для побитного рисования. Символ в АЦЗУ не "перекрывает" ГЗУ: если настроить LUT так, чтобы логический цвет соответствовал физическому, символы АЦЗУ будут "просвечивать" и делать пиксели под символами ярче, если в двух словах)

AlexS58
13.05.2018, 01:20
Всем доброго времени суток!
Возник вопрос по Паскалю. Есть процедура перемещения курсора
GotoXY(X,Y). Существует ли процедура управления отображением курсора?
Например, в Бейсик Корвет 2.0 есть команда
LOCATE X,Y,C, где X - координата по горизонтали, Y - по вертикали, C - отображение курсора (0 - нет, 1 - да).
Частично вопрос для себя решил (в одном примере видел), можно вываливать в консоль управляющие коды или ESC-коды, но как-то оно "не комильфо"..

УПРАВЛЯЮЩИЕ ДЕЙСТВИЕ
СИМВОЛЫ:


01H,X,Y => Перемещение курсора в позицию с номером строки
(x-20h) и номером столбца (y-20h)
04H => Стирание символов от позиции курсора до конца
экрана
07H => Выдача звукового сигнала
08H => Возврат курсора на одну позицию назад
0АH => Перемещение курсора в начало следующей строки
(с роллингом)
0BH => Удаление строки, на которой находится курсор
(оставшиеся до конца экрана строки сдвигаются
вниз, последняя строка пропадает)
0CH => Перемещение курсора в первую позицию первой
строки экрана
0DH => Перемещение курсора в первую позицию текущей
строки
10H,X => Символ x выводится на экран и не считается
управляющим символом
15H => Стирание символов от позиции курсора до конца
строки
18H => Перемещение курсора вправо
19H => Перемещение курсора вверх
1AH => Перемещение курсора вниз
1CH => Вставка пробела на место курсора (остаток
строки сдвигается вправо, последний символ
строки пропадает)
1DH => Удаление символа из позиции курсора (остаток
строки сдвигается влево, в последнюю позицию
строки заносится пробел)
1EH => Вставка пустой строки на место курсора
(оставшиеся до конца экрана строки сдвигаются
вверх, на место последней строки заносится
пустая строка)
1FH => Очистка всего экрана

УПРАВЛЯЮЩИЕ ДЕЙСТВИЕ
ПОСЛЕДОВА-
ТЕЛЬНОСТИ:

1BH,'0' => Включение основного набора символов
знакогенератора
1BH,'1' => Включение дополнительного набора символов
знакогенератора
1BH,'2' => Включение нормальной ширины символов
1BH,'3' => Включение удвоенной ширины символов
1BH,'6' => Включение режима инверсного отображения
символов
1BH,'7' => Выключение режима
инверсного отображения символов
1BH,':' => Разрешение отображения курсора
1BH,';' => Запрет отображения курсора
1BH,'<' => Включение режима автоматического перехода к
новой строке экрана по достижению конца
текущей строки
1BH,'=' => Выключение режима автоматического перехода к
новой строке экрана по достижению конца
текущей строки (переход к новой строке
выполняется только по управляющим символам)
1BH,'@' => Вставка пробела на место курсора (остаток
строки сдвигается вправо, последний символ
строки пропадает)
1BH,'A' => Перемещение курсора вверх
1BH,'B' => Перемещение курсора вниз
1BH,'C' => Перемещение курсора вправо
1BH,'D' => Перемещение курсора влево
1BH,'E' => Очистка всего экрана
1BH,'F' => Перемещение курсора в начало следующей строки,
а из последней строки экрана в первую
1BH,'G' => Перемещение курсора в начало текущей строки
1BH,'H' => Перемещение курсора в первую позицию первой
строки экрана
1BH,'J' => Стирание символов от позиции курсора до конца
экрана
1BH,'K' => Стирание символов от позиции курсора до конца
строки
1BH,'L' => Вставка пустой строки на место курсора
(оставшиеся до конца экрана строки сдвигаются
вниз, последняя строка пропадает)
1BH,'M' => Удаление строки, на которой находится курсор
(оставшиеся до конца экрана строки сдвигаются
вверх, на место последней строки экрана
заносится пустая строка)
1BH,'P' => Удаление символа из позиции курсора (остаток
строки сдвигается влево, в последнюю позицию
строки заносится пробел)
1BH,'Y',X,Y => Перемещение курсора в позицию с номером строки
(x-20h) и номером столбца (y-20h)

Willy
05.12.2021, 23:38
В процессе опытов с программированием таблицы LUT наткнулся на следующий нюанс.
Во всех источниках, которые описывают устройство графического контроллера Корвета, которые я нашёл, говорится только, что LUT - это таблица соответствия логического и физического цветов.
Младший полубайт - логический цвет, старший полубайт - физический.
Т.е. если туда записать байт 11h, то логическому цвету с номером 1 будет соответствовать цвет из плоскости B, т.е. синий.

Всё бы ничего, но, как оказалось, это правило работает только для логических цветов с номером больше 0.
По этому правилу байт 10h должен бы превратить цвет с номером 0 в синий, т.е. вместо чёрного, фон должен стать синим, но этого не происходит.
Вернее происходит, но только в эмуляторах :)
На реале чёрный остаётся чёрным, а вот вместо, на пример, белого, появляется какой-то то ли желтоватый, то ли жёлто-зелёный.

Оказалось, что ячейка таблицы с номером 0 имеет особенное значение. Она содержит цвета, которые ВЫЧИТАЮТСЯ из всех остальных цветов при формировании изображения.
Т.е. если туда положить значение 80h, то вся палитра сразу потеряет яркостную составляющую. А если туда положить значение F0h, то перестанут отображаться вообще все цвета.
Видимо, этот трюк сделали, чтобы реализовать возможность мгновенного гашения всего изображения путём переброски всего одного байта.

Для тестов использовалась следующая программа на Express Pascal:

program test;
var i : integer;
begin
clrgscr;
for i := 0 to 7 do begin
setcolor(i);
rectangle(64*i,0,64*(i+1),200,true);
end;
repeat until keypressed;
mem[$fafb] := $10;
end.

Если её запустить в эмуляторах (проверял в b2m, SovietPC, эмулятор Ерохина), то чёрный фон превращается в синий, на реале поведение совсем другое.
Если вместо $10 поставить $F0, то на реале всё изображение гаснет.

Sancho45
06.12.2021, 10:31
Это фото с реального Корвета (https://zx-pk.ru/threads/2597-korvet-obshchie-voprosy.html?p=1074675&viewfull=1#post1074675)

b2m
06.12.2021, 10:59
Оказалось, что ячейка таблицы с номером 0 имеет особенное значение. Она содержит цвета, которые ВЫЧИТАЮТСЯ из всех остальных цветов при формировании изображения.
Есть такое понятие, как "уровень чёрного". Я думаю, цвет бордюра был принят телевизором/монитором как этот самый уровень, отсюда и понижение яркости всех цветов.

Willy
06.12.2021, 19:41
Есть такое понятие, как "уровень чёрного". Я думаю, цвет бордюра был принят телевизором/монитором как этот самый уровень, отсюда и понижение яркости всех цветов.
Похоже, вы правы.
Потому что
Это фото с реального Корвета - у меня картинка другая.

Я к монитору подключаюсь через GBS/VGA, может быть из-за этого такая реакция на привязку к чёрному.
Надо будет попробовать к SCART подключиться, может быть что-то поменяется.

Но вот остаётся вопрос, стоит ли использовать нулевую ячейку в собственных целях. Неизвестно, какое подключение будет использоваться у Корвета, на котором будет запущен этот софт.

Sancho45
08.12.2021, 11:23
Я когда портировал диззи на корвет тоже менял лут под спековский, но от идеи микса с яркостным сигналом пришлось отказаться, много заморочек.
Вот пример теста, здесь решал в какой гамме делать, в итоге сделал без яркостного.
https://poster4.radikal.ru/2112/f0/7dadfeca2aec.jpg (https://radikal.ru/video/1l27gWh0qRU)1

Willy
08.12.2021, 12:05
Я когда портировал диззи на корвет тоже менял лут под спековский, но от идеи микса с яркостным сигналом пришлось отказаться, много заморочек.
Можно глянуть на результат или работа ещё не завершена ? :v2_dizzy_botan:

Я тут тоже в процессе доделки одной игры.
Завязался на дефолтный фон в нулевой ячейке, а тут вон какая засада.


Вот пример теста, здесь решал в какой гамме делать, в итоге сделал без яркостного.
Ну и вообще говоря не обязательно же на всю палитру делать одинаковую яркость. Можно какие-то цвета яркими оставить, а какие-то приглушить.
Другой вопрос, если нужен тот же красный и яркий и не яркий, но опять же, можно использовать текстовый слой. Хотя тут очень сильно всё зависит от организации хранения графики и подхода к использованию цветов.

Sancho45
08.12.2021, 12:12
Проект под z80, но т.к. никто не собрал, я забросил проект. Там осталось толькотперемещение диззи сделать, код на область видео озу накладывается, надо переместить, но .... энтузиазма нет))

Willy
08.12.2021, 12:16
А какая карта памяти используется ?
Я делаю для 6С, там 48к до начала ГЗУ. У меня пока около 10к свободно остаётся, должно хватить.
Неужели 48к не хватило на код ?

Sancho45
08.12.2021, 15:14
я использую конфигурацию 0Ch, все 64кб озу. Я для z80 ввёл доп логический элемент, который подключается в разрез выхода дешифратора адресов на 556рт2, это позволяет обращаться к системному регистру через OUT, что сильно упрощает жизнь)))
Загрузчик сначала выводит заставку из файла, которая сама по себе занимает прилично озу, потом подгружается тело игры. Через Out включаю конфиг с видео озу для вывода, потом переключаю на конфиг 0Ch

litwr
31.01.2022, 19:01
Кстати, тоже ещё со времен конца 80-х начала 90-х мне было вбито, что текст и графика независимы. Почему так упорно дезинформировали публику?! Фактически Корвет имеет 8 свободных цветов и 8 цветов с клашингами, как на Спектруме. Но на Спектруме зона клашинга 8х8, а на Корвете может быть заметно меньше (типовой размер 4х8). Жутко представить, если кто-то попытается написать идеальный конвертор картинок с использованием всех 16 цветов - работа очень немаленькая. Можно наверное только сопоставить по трудности с попытками атаристов оптимально задействовать 256 цветов.
Рискну предположить, что для рисования спрайтов использование всех 16 цветов - это ничего сложного. Жаль, что Корветов сделали так мало и они были не очень бюджетны. Игры могли бы быть очень хороши.

litwr
01.02.2022, 13:01
Оказалось, что ячейка таблицы с номером 0 имеет особенное значение. Она содержит цвета, которые ВЫЧИТАЮТСЯ из всех остальных цветов при формировании изображения.
Т.е. если туда положить значение 80h, то вся палитра сразу потеряет яркостную составляющую. А если туда положить значение F0h, то перестанут отображаться вообще все цвета.
Видимо, этот трюк сделали, чтобы реализовать возможность мгновенного гашения всего изображения путём переброски всего одного байта.

Может я что-то не понял, но получается, что на Корвете можно менять палитры. Получается 16 разных палитр... Но это совсем никак не документировано. :(

Willy
01.02.2022, 13:41
Может я что-то не понял, но получается, что на Корвете можно менять палитры. Получается 16 разных палитр... Но это совсем никак не документировано. :(

Да нет, это не палитры, это такой side-эффект.

reddie
01.02.2022, 14:33
Для различных видеоэффектов вполне сойдет. Демки на Корвете, интересно, есть?)) Вот в них эту фичу и можно применять.

litwr
02.02.2022, 18:40
Да нет, это не палитры, это такой side-эффект.
Хорошо бы собрать данные с реальных Корветов. Вот программка, которая крупно рисует палитру Корвета с разными значениями LUT 0.


const
b = 3; (* block *)
var
i,p:byte;
c:char;
begin
clrscr;
clrgscr;
for i:=0 to 15 do
mem[$fafb] := i*17;
for i:=0 to 31 do
for p:=0 to 7 do
mem[$fc20+p*64+i]:=b;
for i:=0 to 7 do begin
setcolor(i);
rectangle(i*32, 0, i*32+31, 127, true);
rectangle(i*32+256, 0, i*32+287, 127, true)
end;
p := 0;
repeat
gotoxy(9,9);write(' ');gotoxy(1,9);
write('black is ', p);
mem[$fafb] := p*16;
p := (p+1)and 15;
c := readkey
until ord(c) != 27;
clrscr
end.

Вот так это выглядит в emu80 для значений 0 и 7.
https://s1.hostingkartinok.com/uploads/images/2022/02/7c82ff4855bcdd4663010c5a48dab400.png
https://s1.hostingkartinok.com/uploads/images/2022/02/acd4077d442d1572f5b09608374c021c.png
Прикрепил зазипованный СОМ-файл - 76965
Похоже, что интересный эффект возник только из-за особенностей подключения к монитору. Но если кто-то обнаружит что-то необычное, то было бы ценно получить скриншоты.

Willy
02.02.2022, 21:55
Похоже, что интересный эффект возник только из-за особенностей подключения к монитору. Но если кто-то обнаружит что-то необычное, то было бы ценно получить скриншоты.

Нууу, эмуляторы не в счёт. Проверять надо только на реале, а там много нюансов - способ подключения, тип монитора.
У меня есть рабочий колокольчик, хоть и чёрно-белый, но некоторые цвета можно и на нём проверить, попробую на выходных.

AlexS58
09.04.2025, 21:14
Хорошо бы собрать данные с реальных Корветов. Вот программка, которая крупно рисует палитру Корвета с разными значениями LUT 0.
Немного поизвращался над Вашей прогой:

PROGRAM PALET3;
CONST
B = 3; (* BLOCK *)
VAR
I,P:BYTE;
C:CHAR;
BEGIN
CLRSCR;
CLRGSCR;
WRITE(#27'1');
FOR I:=0 TO 15 DO
MEM[$FAFB] := I*17;
MEM[$FAFB] := $78;
FOR I:=0 TO 31 DO
FOR P:=0 TO 7 DO
MEM[$FC20+P*64+I]:=B;
FOR I:=0 TO 7 DO BEGIN
SETCOLOR(I);
RECTANGLE(I*32, 0, I*32+31, 127, TRUE);
RECTANGLE(I*32+256, 0, I*32+287, 127, TRUE)
END;
WRITE(#27'6');
FOR I:=1 TO 16 DO WRITE('Test');
WRITE(#27'7');
FOR I:=1 TO 16 DO WRITE('Test');
FOR I:=1 TO 128 DO WRITE(#16#$AE);
FOR I:=1 TO 128 DO WRITE(#16#$81);
P :=0;
REPEAT
GOTOXY(9,9);WRITE(#27'6 ');GOTOXY(1,9);
WRITE('BLACK IS ', P);
GOTOXY(9,10);WRITE(#27'7 ');GOTOXY(1,10);
WRITE('BLACK IS ', P);
MEM[$FAFB] := P*16;
P := (P+1)AND 15;
C := READKEY
UNTIL ORD(C) = 27;
CLRSCR
END.https://i.ibb.co/qL2MZMPv/Screenshot-20250409-205307.png (https://ibb.co/Gfrvhvbq)
82177

yevrowl
13.10.2025, 01:20
Подскажите пожалуйста, каким способом можно загрузить исходник на Бейсике в эмуляторе Emu80?

Pyk
13.10.2025, 23:47
Подскажите пожалуйста, каким способом можно загрузить исходник на Бейсике в эмуляторе Emu80?
Если исходник в виде обычного текста, то проще всего копипастом: View - Paste text / Отображение - Вставить текст, Alt-Shift-V
Возможны ошибки при вставке, если ошибок окажется слишком много, могу попробовать поиграться таймингами.

AlexS58
14.10.2025, 11:45
Если исходник в виде обычного текста
Да, действительно ошибки возникают. Когда-то пробовал таким способом "набирать" текст программы :) Можно попробовать вставлять порциями по несколько строк. Или сохранить исходник в виде текстового файла с раширением BSC (например, - ну чтобы не спутать с BAS), закинуть его в образ дискеты .KDI, а в Бейсике загрузить с параметром A: LOAD "PRIMER1.BSC",A

Pyk
14.10.2025, 14:10
действительно ошибки возникают
Можно попробовать увеличить задержки вот в этих параметрах в korvet.conf:

kbdTapper.pressTime = 40
kbdTapper.releaseTime = 40
kbdTapper.crDelay = 100
Но через файл, конечно, надежней.

yevrowl
14.10.2025, 14:30
закинуть его в образ дискеты .KDI
Сделал образ дискеты .DSK (от MSX) — Emu80, кажется, принимает. Как делать образы .KDI — не знаю.


в Бейсике загрузить с параметром A: LOAD "PRIMER1.BSC",A
Попробовал, увы, не получилось:

82948

Willy
14.10.2025, 18:41
Это Бейсик из ПЗУ, похоже. Он не умеет работать с дисками, нужен дисковый Бейсик.
Можно поискать на форуме образы дисков для Корвета, там много чего было.

AlexS58
14.10.2025, 20:04
Это Бейсик из ПЗУ, похоже.
Так и есть.
Да и для дискового команда была набрана неверно:
A: LOAD "BT.BAS", A
Нужно:
LOAD "BT.BAS", A


Можно поискать на форуме образы дисков для Корвета, там много чего было.
Да, KDI-образов много, софта разного прилично. Кстати, Бейсик дисковый есть и с командой DRAW и без.. И компилер попадался (вопрос был в теме по Васику). А вот "кушает" ли он исходники для интерпретатора - вопрос...

- - - Добавлено - - -


Попробовал, увы, не получилось

Это Бейсик из ПЗУ
ПЗУ-шный умеет только с кассеты:
LOAD "CAS:BT.BAS", A