!!!это черновик!!!
Реализация палитры в ПЗУ и бейсике:
Code:
ROM:DE06 ; Задание конкретного цвета переднего плана, цвета фона
ROM:DE06 ; и необходимой палитры цветов осуществляется оператором COLOR.
ROM:DE06
ROM:DE06 ; Формат этого оператора:
ROM:DE06
ROM:DE06 ; <номер строки> COLOR [<цвет>] [,<фон>] [,<палитра>]
ROM:DE06
ROM:DE06 ; где <цвет> - номер цвета переднего плана. Параметр должен
ROM:DE06 ; принимать значения от 0 до 3 (значение 0 задает цвет фона).
ROM:DE06 ; Этот параметр задает цвет, которым будет выводиться текстовая
ROM:DE06 ; информация, а также графическая информация, если в графических
ROM:DE06 ; операторах цвет переднего плана не был установлен;
ROM:DE06
ROM:DE06 ; <фон> - номер цвета фона. Параметр должен принимать значения
ROM:DE06 ; в диапазоне от 0 до 7;
ROM:DE06
ROM:DE06 ; <палитра> - номер палитры. Параметр должен принимать значения
ROM:DE06 ; в диапазоне от 0 до 6.
ROM:DE06
ROM:DE06 ; Параметры <цвет>, <фон> и <палитра> кодируются в соответствии
ROM:DE06 ; с таблицей 1.
ROM:DE06
ROM:DE06 ; Все параметры должны быть выражениями числового типа,
ROM:DE06 ; если значение выражения нецелое, то используется только
ROM:DE06 ; целая часть значения. Неуказанные параметры по умолчанию
ROM:DE06 ; принимают ранее заданные значения. Если значения параметров
ROM:DE06 ; выходят за указанные пределы, то для задания параметров
ROM:DE06 ; используются младшие разряды их двоичных представлений.
ROM:DE06
ROM:DE06 ; Цвет окантовки экрана соответствует второму номеру
ROM:DE06 ; цвета переднего плана.
ROM:DE06
ROM:DE06 ; =============== S U B R O U T I N E =======================================
ROM:DE06
ROM:DE06
ROM:DE06 OP_COLOR: ; DATA XREF: RAM:00DD↑o
ROM:DE06 FE 2C cpi ','
ROM:DE08 CA 1C DE jz COLOR_BACKGROUND
ROM:DE0B
ROM:DE0B ; это [<цвет>] [,<фон>] [,<палитра>]
ROM:DE0B CD B9 0F call PARSE_BYTE ; Распарсить 8-битовое число в A
ROM:DE0E
ROM:DE0E
ROM:DE0E F5 push psw
ROM:DE0F E6 03 ani 3 ; Цвет текста от 0 до 3 (т.е. по модулую 4)
ROM:DE11 32 52 BE sta GRF_COLOR ; цвет графич. объекта
ROM:DE14 3D dcr a ; Перекодируем цвет в формат переменной
ROM:DE14 ; 0, 1, 2, 3 => 0FFh, 0, 1, 2
ROM:DE15 32 36 BE sta TXT_COLOR ; цвет текста
ROM:DE18 F1 pop psw
ROM:DE19
ROM:DE19
ROM:DE19 CA 3C DE jz COLOR_IMPL ; Установка цветовой палитры (PALETTE, GROUND)
ROM:DE1C
ROM:DE1C ; это [,<фон>] [,<палитра>]
ROM:DE1C
ROM:DE1C COLOR_BACKGROUND: ; CODE XREF: OP_COLOR+2↑j
ROM:DE1C CF rst 1 ; Убедиться, что следующий символ memb[PC+1], HL=входной поток, A=символ за следующим
ROM:DE1C ; ---------------------------------------------------------------------------
ROM:DE1D 2C .text ","
ROM:DE1E ; ---------------------------------------------------------------------------
ROM:DE1E 2B dcx h
ROM:DE1F D7 rst 2 ; Перейти к следующему символу и проверить, а цифра ли это? (HL=входной поток)
ROM:DE20 FE 2C cpi ','
ROM:DE22 CA 32 DE jz COLOR_PALETTE
ROM:DE25
ROM:DE25
ROM:DE25 CD B9 0F call PARSE_BYTE ; Распарсить 8-битовое число в A
ROM:DE28 F5 push psw
ROM:DE29 E6 07 ani 7 ; Цвет фона от 0 до 7 (т.е. по модулую 8)
ROM:DE2B 32 C1 BE sta GROUND ; цвет фона
ROM:DE2E F1 pop psw
ROM:DE2F CA 3C DE jz COLOR_IMPL ; Установка цветовой палитры (PALETTE, GROUND)
ROM:DE32
ROM:DE32 ; это [,<палитра>]
ROM:DE32
ROM:DE32 COLOR_PALETTE: ; CODE XREF: OP_COLOR+1C↑j
ROM:DE32 CF rst 1 ; Убедиться, что следующий символ memb[PC+1], HL=входной поток, A=символ за следующим
ROM:DE32 ; ---------------------------------------------------------------------------
ROM:DE33 2C .text ","
ROM:DE34 ; ---------------------------------------------------------------------------
ROM:DE34 CD B9 0F call PARSE_BYTE ; Распарсить 8-битовое число в A
ROM:DE37
ROM:DE37 ; ОШИБКА: задокументированы только цвета палитр 0-6 в таблице палитр,
ROM:DE37 ; но аргумент операцией ANI ограничивается значениями 0-7 и
ROM:DE37 ; значение 7 никак не отбрасывают, как ошибочное. Но тут есть интересная
ROM:DE37 ; особенность - в таблице палитр есть лишний столбец на этой позиции.
ROM:DE37 ; Он вставлен для упрощения операции индексирования по палитре
ROM:DE37 ; (умножить на 8 проще, чем на 7) и заполнен значениями самого первого
ROM:DE37 ; столбца. Однако значения палитр израсходованы не полностью и этот
ROM:DE37 ; столбец вполне можно было бы заполнить осмысленными значениями,
ROM:DE37 ; см. реализацию COLOR_IMPL.
ROM:DE37
ROM:DE37 E6 07 ani 7 ; Цвет палитры от 0 до 7 (т.е. по модулую 8)
ROM:DE39 32 C0 BE sta PALETTE ; палитра
ROM:DE39 ; End of function OP_COLOR
ROM:DE39
ROM:DE3C
ROM:DE3C ; 2.3.8 Установка цветовой палитры ( COLOR )
ROM:DE3C
ROM:DE3C ; Входные параметры: PALETTE : Палитра (0-6);
ROM:DE3C ; GROUND : Цвет фона (0-7).
ROM:DE3C ; Выполняется установка заданной палитры и фона путем вывода
ROM:DE3C ; в порт C1 (193) ( Канал B ППА D30 ) соответствующего кода.
ROM:DE3C
ROM:DE3C ; =============== S U B R O U T I N E =======================================
ROM:DE3C
ROM:DE3C ; Установка цветовой палитры (PALETTE, GROUND)
ROM:DE3C
ROM:DE3C COLOR_IMPL: ; CODE XREF: OP_COLOR+13↑j
ROM:DE3C ; OP_COLOR+29↑j
ROM:DE3C ; ROM:COLOR↓j
ROM:DE3C 3A C1 BE lda GROUND ; цвет фона
ROM:DE3F 07 rlc
ROM:DE40 07 rlc
ROM:DE41 07 rlc
ROM:DE42 4F mov c, a ; C = GROUND * 8
ROM:DE43
ROM:DE43
ROM:DE43 3A C0 BE lda PALETTE ; палитра
ROM:DE46 81 add c ; Индекс в таблице палитр:
ROM:DE47 4F mov c, a ; GROUND * 8 + PALETTE
ROM:DE48 06 00 mvi b, 0
ROM:DE4A
ROM:DE4A ; value = PALETTE_TABLE[GROUND * 8 + PALETTE]
ROM:DE4A EB xchg
ROM:DE4B 21 54 DE lxi h, PALETTE_TABLE
ROM:DE4E 09 dad b ; PALETTE_TABLE + GROUND * 8 + PALETTE
ROM:DE4F 7E mov a, m
ROM:DE50 EB xchg
ROM:DE51
ROM:DE51 ; Программируем порт цвета: port[C1] = value
ROM:DE51 D3 C1 out 0C1h ; Все значения палитр содержат в себе
ROM:DE51 ; флаг "Звук включен", т.е. после отработки
ROM:DE51 ; этой процедуры звук начнёт работать,
ROM:DE51 ; если был заблокирован
ROM:DE53 C9 ret
ROM:DE53 ; ---------------------------------------------------------------------------
ROM:DE54 ; Таблица 1
ROM:DE54 ; ┌───────┬─────────────────────────────────────────┬───────────┐
ROM:DE54 ; │ Номер │ Номер палитры │ Номер │
ROM:DE54 ; │ фона ├─────┬─────┬─────┬─────┬─────┬─────┬─────┤ цвета │
ROM:DE54 ; │ │ 0 │ 1 │ 2 │ 3 │ 4 │ 5 │ 6 │ переднего │
ROM:DE54 ; │ │ │ │ │ │ │ │ │ плана │
ROM:DE54 ; ├───────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┼───────────┤
ROM:DE54 ; │ │ ЧЕР │ ЧЕР │ ЧЕР │ ЧЕР │ ЧЕР │ ЧЕР │ ЧЕР │ 0 │
ROM:DE54 ; │ ЧЕР │ ЗЕЛ │ ЗЕЛ │ ЗЕЛ │ ЗЕЛ │ ГОЛ │ ГОЛ │ БЕЛ │ 1 │
ROM:DE54 ; │ 0 │ СИН │ СИР │ СИН │ СИР │ КРА │ КРА │ КРА │ 2 │
ROM:DE54 ; │ │ КРА │ КРА │ ЖЕЛ │ ЖЕЛ │ СИР │ БЕЛ │ СИН │ 3 │
ROM:DE54 ; ├───────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┼───────────┤
ROM:DE54 ; │ │ КРА │ КРА │ КРА │ КРА │ КРА │ КРА │ КРА │ 0 │
ROM:DE54 ; │ КРА │ ЗЕЛ │ ЗЕЛ │ ЖЕЛ │ ЖЕЛ │ ГОЛ │ ГОЛ │ БЕЛ │ 1 │
ROM:DE54 ; │ 1 │ СИН │ СИР │ СИР │ СИН │ ЧЕР │ ЧЕР │ ЧЕР │ 2 │
ROM:DE54 ; │ │ ЖЕЛ │ ЖЕЛ │ ЧЕР │ ЧЕР │ СИР │ БЕЛ │ СИН │ 3 │
ROM:DE54 ; ├───────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┼───────────┤
ROM:DE54 ; │ │ СИН │ СИН │ СИН │ СИН │ СИН │ СИН │ СИН │ 0 │
ROM:DE54 ; │ СИН │ ЗЕЛ │ ЗЕЛ │ ЖЕЛ │ ГОЛ │ ГОЛ │ ГОЛ │ ГОЛ │ 1 │
ROM:DE54 ; │ 2 │ СИР │ СИР │ СИР │ ЧЕР │ КРА │ ЧЕР │ КРА │ 2 │
ROM:DE54 ; │ │ КРА │ ЖЕЛ │ ЧЕР │ СИР │ СИР │ БЕЛ │ БЕЛ │ 3 │
ROM:DE54 ; ├───────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┼───────────┤
ROM:DE54 ; │ │ СИР │ СИР │ СИР │ СИР │ СИР │ СИР │ СИР │ 0 │
ROM:DE54 ; │ СИР │ ЗЕЛ │ ЗЕЛ │ ЖЕЛ │ ГОЛ │ ГОЛ │ БЕЛ │ БЕЛ │ 1 │
ROM:DE54 ; │ 3 │ СИН │ СИН │ СИН │ ЧЕР │ КРА │ КРА │ ЧЕР │ 2 │
ROM:DE54 ; │ │ КРА │ ЖЕЛ │ ЧЕР │ БЕЛ │ БЕЛ │ СИН │ СИН │ 3 │
ROM:DE54 ; ├───────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┼───────────┤
ROM:DE54 ; │ │ БЕЛ │ БЕЛ │ БЕЛ │ БЕЛ │ БЕЛ │ БЕЛ │ БЕЛ │ 0 │
ROM:DE54 ; │ БЕЛ │ СИР │ СИР │ СИН │ СИН │ КРА │ КРА │ ЧЕР │ 1 │
ROM:DE54 ; │ 4 │ ЖЕЛ │ ЗЕЛ │ ЗЕЛ │ ЖЕЛ │ ГОЛ │ ГОЛ │ ГОЛ │ 2 │
ROM:DE54 ; │ │ ГОЛ │ ГОЛ │ СИР │ СИР │ ЗЕЛ │ ЧЕР │ ЖЕЛ │ 3 │
ROM:DE54 ; ├───────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┼───────────┤
ROM:DE54 ; │ │ ГОЛ │ ГОЛ │ ГОЛ │ ГОЛ │ ГОЛ │ ГОЛ │ ГОЛ │ 0 │
ROM:DE54 ; │ ГОЛ │ СИР │ СИР │ СИН │ СИН │ КРА │ КРА │ ЧЕР │ 1 │
ROM:DE54 ; │ 5 │ ЖЕЛ │ ЗЕЛ │ ЗЕЛ │ ЖЕЛ │ БЕЛ │ БЕЛ │ БЕЛ │ 2 │
ROM:DE54 ; │ │ СИН │ СИН │ БЕЛ │ БЕЛ │ ЗЕЛ │ ЧЕР │ ЖЕЛ │ 3 │
ROM:DE54 ; ├───────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┼───────────┤
ROM:DE54 ; │ │ ЗЕЛ │ ЗЕЛ │ ЗЕЛ │ ЗЕЛ │ ЗЕЛ │ ЗЕЛ │ ЗЕЛ │ 0 │
ROM:DE54 ; │ ЗЕЛ │ СИР │ СИР │ СИН │ ЧЕР │ ЧЕР │ КРА │ КРА │ 1 │
ROM:DE54 ; │ 6 │ ЖЕЛ │ ЖЕЛ │ ЖЕЛ │ ГОЛ │ БЕЛ │ БЕЛ │ ГОЛ │ 2 │
ROM:DE54 ; │ │ ГОЛ │ СИН │ БЕЛ │ ЖЕЛ │ ЖЕЛ │ ЧЕР │ ЧЕР │ 3 │
ROM:DE54 ; ├───────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┼───────────┤
ROM:DE54 ; │ │ ЖЕЛ │ ЖЕЛ │ ЖЕЛ │ ЖЕЛ │ ЖЕЛ │ ЖЕЛ │ ЖЕЛ │ 0 │
ROM:DE54 ; │ ЖЕЛ │ СИР │ СИР │ СИН │ КРА │ КРА │ КРА │ КРА │ 1 │
ROM:DE54 ; │ 7 │ ЗЕЛ │ ЗЕЛ │ ЗЕЛ │ БЕЛ │ ГОЛ │ БЕЛ │ ГОЛ │ 2 │
ROM:DE54 ; │ │ ГОЛ │ СИН │ БЕЛ │ ЧЕР │ ЧЕР │ ЗЕЛ │ ЗЕЛ │ 3 │
ROM:DE54 ; └───────┴─────┴─────┴─────┴─────┴─────┴─────┴─────┴───────────┘
ROM:DE54
ROM:DE54 ; Примечания:
ROM:DE54 ; 1. Для фона номер 7 и палитр 5 и 6 фон будет зеленого цвета.
ROM:DE54 ; 2. Цвет окантовки назначается по умолчанию для каждой
ROM:DE54 ; конкретной комбинации цвета фона и номера палитры
ROM:DE54 ; и соответствует второму номеру цвета переднего плана.
ROM:DE54 ; 3. В таблице применяются такие сокращения:
ROM:DE54 ; ЧЕР - черный
ROM:DE54 ; БЕЛ - белый
ROM:DE54 ; КРА - красный
ROM:DE54 ; ГОЛ - голубой
ROM:DE54 ; СИН - синий
ROM:DE54 ; ЗЕЛ - зеленый
ROM:DE54 ; СИР - сиреневый
ROM:DE54 ; ЖЕЛ - желтый
ROM:DE54
ROM:DE54 ; ОШИБКА: Примечание 1 не соответствует действительности!
ROM:DE54 ; В таблице также было много других ошибок! Поэтому таблица
ROM:DE54 ; была полностью перегенерирована по данным из ПЗУ,
ROM:DE54 ; смотри PALETTE_TABLE
ROM:DE54
ROM:DE54 ; Для того, чтобы уйти от умножения на 7 и упростить
ROM:DE54 ; вычисление индекса, в таблицу добавили фиктивный 8-й столбец,
ROM:DE54 ; он полностью копирует первый и никак не используется
ROM:DE54
ROM:DE54
ROM:DE54 8F 8E 8D+PALETTE_TABLE: .db 8Fh, 8Eh, 8Dh, 8Ch, 0CAh, 0C8h, 0D3h, 8Fh
ROM:DE54 8C CA C8+ ; DATA XREF: COLOR_IMPL+F↑o
ROM:DE5C 85 84 9F+ .db 85h, 84h, 9Fh, 9Eh, 0C3h, 0C1h, 0DAh, 85h
ROM:DE64 8A 88 93+ .db 8Ah, 88h, 93h, 0CFh, 0CEh, 0CDh, 0CCh, 8Ah
ROM:DE6C 83 81 9A+ .db 83h, 81h, 9Ah, 0C5h, 0C4h, 0DFh, 0DEh, 83h
ROM:DE74 FF FE E5+ .db 0FFh, 0FEh, 0E5h, 0E4h, 0BAh, 0B8h, 0A3h, 0FFh
ROM:DE7C F5 F4 EF+ .db 0F5h, 0F4h, 0EFh, 0EEh, 0B3h, 0B1h, 0AAh, 0F5h
ROM:DE84 F3 F1 EA+ .db 0F3h, 0F1h, 0EAh, 0AFh, 0AEh, 0B5h, 0B4h, 0F3h
ROM:DE8C FA F8 E3+ .db 0FAh, 0F8h, 0E3h, 0BDh, 0BCh, 0BFh, 0BEh, 0FAh
ROM:DE8C BD BC BF+; End of function COLOR_IMPL
ROM:DE8C BE FA
ROM:DE8C ; ВАЖНО: Существует ещё 24 набора цветов, в которых как минимум
ROM:DE8C ; все цвета различны и которые отсутствуют в таблице палитр:
ROM:DE8C ;
ROM:DE8C ; 0xD1 ЧЕР БЕЛ КРА ГОЛ
ROM:DE8C ; 0x94 ЧЕР ЖЕЛ СИН ЗЕЛ
ROM:DE8C ; 0x95 ЧЕР ЖЕЛ СИР ЗЕЛ
ROM:DE8C
ROM:DE8C ; 0x9C КРА ЖЕЛ СИН ЗЕЛ
ROM:DE8C ; 0x9D КРА ЖЕЛ СИР ЗЕЛ
ROM:DE8C ; 0xD8 КРА БЕЛ ЧЕР ГОЛ
ROM:DE8C
ROM:DE8C ; 0x91 СИН ЖЕЛ СИР ЗЕЛ
ROM:DE8C ; 0xD4 СИН БЕЛ ЧЕР ГОЛ
ROM:DE8C ; 0xD5 СИН БЕЛ КРА ГОЛ
ROM:DE8C
ROM:DE8C ; 0x98 СИР ЖЕЛ СИН ЗЕЛ
ROM:DE8C ; 0xDC СИР БЕЛ ЧЕР ГОЛ
ROM:DE8C ; 0xDD СИР БЕЛ КРА ГОЛ
ROM:DE8C
ROM:DE8C ; 0xA1 БЕЛ ЧЕР ГОЛ КРА
ROM:DE8C ; 0xFC БЕЛ СИР ЗЕЛ СИН
ROM:DE8C ; 0xFD БЕЛ СИР ЖЕЛ СИН
ROM:DE8C
ROM:DE8C ; 0xA8 ГОЛ ЧЕР БЕЛ КРА
ROM:DE8C ; 0xEC ГОЛ СИН ЖЕЛ СИР
ROM:DE8C ; 0xED ГОЛ СИН ЗЕЛ СИР
ROM:DE8C
ROM:DE8C ; 0xAC ЗЕЛ ЧЕР БЕЛ КРА
ROM:DE8C ; 0xAD ЗЕЛ ЧЕР ГОЛ КРА
ROM:DE8C ; 0xE8 ЗЕЛ СИН ЖЕЛ СИР
ROM:DE8C
ROM:DE8C ; 0xA4 ЖЕЛ ЧЕР БЕЛ КРА
ROM:DE8C ; 0xA5 ЖЕЛ ЧЕР ГОЛ КРА
ROM:DE8C ; 0xE1 ЖЕЛ СИН ЗЕЛ СИР
ROM:DE8C
ROM:DE8C ; ... А так-же ещё 48 наборов в которых один цвет дублируется
ROM:DE8C ; 2 раза в разных позициях. На этой особенности можно реализовать
ROM:DE8C ; быструю анимацию палитрой.
ROM:DE8C
Как-то так....