PDA

Просмотр полной версии : Как пользоваться функцией PAINT через BIOS?



vinxru
16.12.2012, 03:15
В справке написано, что надо записать цвет границы в переменную BRD_COLOR. Но её нет.

Описал и проверил все нужные функции BIOS. Не рабоатет только PAINT.



// BIOS компьютера Львов ПК01

char getch() @ 0xF803; // F803 Ввод символа с клавиатуры с отработкой специальных функций
char getch2() @ 0xF806; // F806 Ввод символа без отработки специальных функций
char kbhit() @ 0xF812; // F812 Статус клавиатуры (FF=нажата, 0=не нажата)
void putch(char c) @ "lvov/putch.c"; // F809 Вывод символа на экран
void putchPrinter(char c) @ "lvov/putchprinter.c"; // F80C Вывод символа на принтер
void putchAll(char c) @ "lvov/putchall.c"; // F80F Вывод символа на экран и/или принтер
void puts(const char*) @ 0xE4A4; // E4A4 Вывод на экран текстового сообщения
void putHexByte(uchar) @ 0xFFD6; // FFD6 Вывод на экран содержимого регистра A в шестнадцатеричном виде
void putHexWord(uint) @ 0xFFD1; // FFD1 Вывод на экран содержимого регистровой пары HL в шестнадцатеричном виде
void putCrc(void* start, void* end) @ "lvov/putcrc.c"; // F815 Вывод на экран контрольной суммы блока
void locate(uchar x, uchar y, uchar cursor) @ "lvov/locate.c"; // F82D Позиционирование курсора (cursor=0 показать курсор, cursor=FF скрыть курсор)
void clrscr() @ 0xF836; // F836 Очистка экрана
void pset(uchar x, uchar y, uchar c) @ "lvov/pset.c"; // F821 Вывод на экран точки
void preset(uchar x, uchar y) @ "lvov/preset.c"; // F020 Стирание точки
void line(uchar x0, uchar y0, uchar x1, uchar y1, uchar c) @ "lvov/line.c"; // F824 Вывод на экран линии
void rect(uchar x0, uchar y0, uchar x1, uchar y1, uchar c) @ "lvov/rect.c"; // F827 Вывод на экран прямоугольника
void fillRect(uchar x0, uchar y0, uchar x1, uchar y1, uchar c) @ "lvov/fillrect.c"; // F82A Вывод закрашенного прямоугольника
void paint(uchar x, uchar y, uchar c, uchar borderColor) @ "lvov/paint.c"; // F830 Закраска замкнутой фигуры
void color(uchar palette, uchar bgcolor) @ "lvov/color.c"; // F833 Установка цветовой палитры (palette=0-6, bgcolor=0-7)
void copy() @ 0xE627; // E627 Копирование экрана на принтере
void beep() @ 0xF81B; // F81B Короткий звуковой сигнал ( BEEP ).
void sound(uchar note, uchar delay) @ "lvov/sound.c"; // F81E Управляемый звуковой сигнал ( SOUND ).
uint vaddr(uchar x, uchar y) @ "lvov/vaddr.c"; // F818 Вычисление экранного адреса по координатам ( VADDR ).

// Функции записи и чтения с магнитофона не описаны

// E2BE Передача бита "0"
// E2C5 Передача бита "1"
// E2D5 Передача периода меандра.
// E42B WR_PILOT Передача пилот-сигнала
// E437 WR_BYTE Передача байта
// DD86 WR_WORD Передача слова
// E3E4 WR_HEAD Передача заголовка файла
// DD31 BSAVE Передача кодового файла
// E4D0 Прием пилот-сигнала ( RD_PILOT )
// E4BE Прием байта ( RD_BYTE ).
// DDCA Прием слова ( RD_WORD ).
// E443 Прием заголовка файла ( RD_HEAD ).
// DDBC Прием блока ( RD_BLOCK ).
// DD94 Прием кодового файла ( BLOAD ).

// Переменные

#define KEYB_CODE (*(uchar*)0xBE10) // код нажатой клавиши
#define KEYB_STAT (*(uchar*)0xBE14) // состояние клавиатуры
#define KEYB_MODE (*(uchar*)0xBE1D) // режим клавиатуры
#define KEYB_BEEP (*(uchar*)0xBE1E) // звук клавиатуры

#define TEXT_ADDR (*(uchar*)0xBE30) // адрес вывода символа (только чтение)
#define TEXT_COL (*(uchar*)0xBE32) // X позиция вывода текста (только чтение)
#define TEXT_ROW (*(uchar*)0xBE33) // Y позиция вывода текста (только чтение)
#define TEXT_COLOR (*(uchar*)0xBE36) // Цвет текста
#define BORDER_COLOR (*(uchar*)0xBE38) // Байт заполнения рамки
#define SCROLL_LOCK (*(uchar*)0xBE39) // Cкроллинг авт./ожид.
#define CURSOR_HIDDEN (*(uchar*)0xBE3C) // Курсор скрыт (только чтение)
#define PALETTE (*(uchar*)0xBEC0) // Выбранная палитра (только чтение)
#define GROUND_COLOR (*(uchar*)0xBEC1) // Цвет фона (только чтение)

#define PRN_SHIFT (*(uchar*)0xBE40) // Принтер. Смещение букв кириллицы.
#define PRN_XOR (*(uchar*)0xBE41) // Принтер. Инверсный вывод.
#define DISP_OUT (*(uchar*)0xBE1B) // 0 если putchAll должна выводить на экран, иначе FFh
#define PRN_OUT (*(uchar*)0xBEF3) // 80h если putchAll должна выводить на принтер, иначе 0

// Переменные записи и чтения с магнитофона не описаны

// BE80/BE81 WR0PERIOD длит.периода сигн."0"
// BE82/BE83 WR1PERIOD длит.периода сигн."1"
// BE84 PILOT_DUR длительность пилота
// BE85 - параметры чтения МЛ
// BE86 L (опред. автоматич.)
// BE87 FILE_TYPE идентификат.типа файла
// BE88/BE89 BASFL_ORG начало BASIC-файла
// BE8A/BE8B BASFL_END конец BASIC-файла
// BE8C-BE91 SAVE_NAME имя файла запись/эталон
// BE92-BE97 LOAD_NAME считанное имя файла
// BEA3 AUTOSTART признак автостарта
// BEA4/BEA5 CODFL_ORG начало CODE-файла
// BEA6/BEA7 CODFL_END конец CODE-файла
// BEA9/BEAA CODFL_RUN старт CODE-файла
// BEAB/BEAC OFFSET смещение CODE-файла
// BEF1/BEF2 LOAD_ERR адр.перех. по ОШИБ.В/В

John North
16.12.2012, 04:19
когда у меня еще не было спектрума, знакомый дядька купил такой вот комп..
помню, приходили к нему играца..
так вот он был черно-белый, вернее, черно-зеленый..
о каких то цветах и речи не было..

---------- Post added at 04:19 ---------- Previous post was at 04:12 ----------

пс: вроде тока он назывался «Львив».. через I вроде даже.

vinxru
16.12.2012, 14:16
Тот о котором я читаю 8 цветный, причем использовать можно только 4 цвета одновременно.

Это его стартовый экран

http://lvovpc.ho.ua/lvivpc.gif

---------- Post added at 13:16 ---------- Previous post was at 13:14 ----------



пс: вроде тока он назывался «Львив».. через I вроде даже.

Мне удобнее воспринимать русское нзвание, оно у меня с Львами ассоциируется. Типа как Арати Ягуар, Атари Рысь. :)

Так ли принципиально писать Львiв?

vinxru
17.12.2012, 12:39
Кстати на корпусе Львов написано.

Zelya
17.12.2012, 13:32
vinxru,
Насчет PAINT - очень интересная тема. Пока нет времени дизассемблировать, попробовал просто потыкать этот оператор в эумле. Так он вобще странно работает! Я зарисовывал прямоугольник с левым верхним углом (10,10). Так вот, если PAINT`у указать стартовую точку (15, 15) то он будет зарисовывать только от нее, т.е. не весь прямоугольник, а как бы вправо и вниз. Надо будет попозже поиграться детальнее.

Насчет названия - как Вам угодно. Единственное, что хотелось бы, так это выработать общее латынское написание. Сейчас таких есть 4 шутки:
1. PC-01 Lvov
2. PK-01 Lvov
3. PC-01 Lviv
4. PK-01 Lviv
Я отдаю предпочтение №3. Основная дискуссия тута (http://lvovpc.ho.ua/forum/viewtopic.php?f=13&t=109).

ПС Надеюсь отсутствие не самого важного оператора не охладит Ваш пыл по Великим свершениям на ПК-01? ;)

vinxru
17.12.2012, 13:49
Вот то, на чем я проверял.

Работает нормально, только выбран всегда цвет границы 1. Может стоит поискать значение 1 в памяти?

P.S. Компилятор раздолбан и может неадекватно работать.. Я там опять затеял изменения.

Выгрузил, что бы интересующиеся потыкали библиотеку. Я там вынес некоторые переменные в файл lvov/bda.h. Их нужно заполнять только перед вызовами функций BIOS, т.е. это аргументы этих функций. А я вызовы оформил как line(x,y,x1,y1,c).

vinxru
18.12.2012, 02:19
По коду дальше видно, что 0хBEA3 действительно может принимать независимое значение.

Так что, все сходится. Переменная BRD_COLOR прописана по адресу 0хBEA3, по которому одновременно проживает и AUTOSTART. Такая вот коммуналка.

Наличие явной баги составители доки отметили, но проблему в результате решили без затей: просто удалили описание процедуры PAINT. Это по-нашенски. Зато PAINT теоретически можно было бы использовать для создания каких-либо неожиданных эффектов при работе с магнитофоном. :D

(c) lvovpc.ho.ua