Версия для печати темы

Нажмите сюда для просмотра этой темы в обычном формате

Форум «Всё о Паскале» _ Задачи _ Новый символ

Автор: manhunt 19.01.2011 19:49

Для программы нужен красивый символ)). Возможно ли создать в паскале символ notx4 токо чтоб было не так "notx4", а Х в нижнем регистре 4 и над иксом отрицание. Возможно ли такое и с помощю каких средств? Спасибо.

Автор: volvo 19.01.2011 20:01

Можно попробовать (если Турбо-Паскаль, разумеется) через $10 прерывание (если не ошибаюсь, функция $11), там есть возможность загрузить пользовательский шрифт или его часть... Для этого надо будет описать символ в виде последовательности байтов (одна строка матрицы символа = один байт).

У Фроловых в БСП был пример для ассемблера, так же и на Паскале реализуется...

Автор: volvo 20.01.2011 0:36

Вот так, например:

uses Dos;

procedure Reg_Table (var Table; Where : Integer);
var
Regs : Registers;
begin
with Regs do
begin
AX := $1100;
BX := $0E00;
CX := 1;
DX := Where;
BP := Ofs (Table);
ES := Seg (Table);
Intr ($10, Regs);
end;
end;

const
New_Sym : array[1 .. 14] of Byte =
( $FF, $00, $88, $50, $20, $55, $57, $89,
$00, $00, $00, $00, $00, $00 );

begin
Reg_Table (New_Sym, 254);
WriteLn(Chr(254));
end.
, из-под DOSBox-а выглядит чем-то напоминающим отрицание X4 (художник из меня - никакой, да и в 14 линий по 8 пикселов вряд-ли можно что-то сверхкрасивое уложить. Попробуй, может у тебя получится)

DOSBox:
Прикрепленное изображение

Напрямую из проводника, естественно, работать не будет...

Автор: manhunt 20.01.2011 1:10

Цитата
Попробуй, может у тебя получится

Извините за нелепый вопрос, но где можно прочесть об етом, возможно есть какието разделы о создании новых символов или ето нужно рисовать в модуле graph??

Автор: -TarasBer- 20.01.2011 1:29

> var
> Regs : Registers;

Никогда не понимал смысл этой конструкции. Код вызова прерывания выглядит с ней ну очень по-уродски. Как раз тут асм и нужен. Это конструкцию ввели какие-то ярые асмофобы.

Автор: volvo 20.01.2011 1:33

Никакой модуль граф не нужен. Если тебе нужен символ в текстовом режиме - то делаешь так: берешь лист бумаги в клетку, и очерчиваешь область размером 8 (ширина) на 14 (высота) клеток. И потом в ней рисуешь. Вот что у меня получилось (точки - пустые пиксели, звездочки - закрашенные) :


********
........
*...*...
.*.*....
..*.....
.*.*.*.*
.*.*.***
*...*..*
........
........
........
........
........
........
(я сначала нарисовал 8 на 8, потом вспомнил, что надо 14 строк, а перерисовывать не хотелось, я просто обнулил все линии). А потом, когда нарисовал все, что хотел, надо перевести это в нужный формат. Каждая строка - байт, т.е., 8 бит. Есть точка - 1, нет точки - 0.

Первая строка: 8 единиц = 11111111 - это $FF.
Вторая строка - 8 нулей, это $00. Третья - 10001000, переводим в 16-ричную форму - получаем $88, и так далее... Записываешь результаты в массив и запускаешь программу, смотришь, что получилось...

Добавлено через 4 мин.
Цитата
Как раз тут асм и нужен
Асм (встроенный) вообще нигде не нужен. Только полностью ассемблерные программы. Он непереносим (ни между ОСями, ни между компиляторами), следовательно очень неудобен... А что больше выглядит по-уродски - Intr($10, Regs) или программа на Паскале, состоящая наполовину из asm/mov/add/sub - это еще подумать надо. По-моему - как раз второе...

Автор: -TarasBer- 20.01.2011 1:51

> Он непереносим (ни между ОСями, ни между компиляторами), следовательно очень неудобен...

Это код почти прямого обращения к функциям системы. Обёртка только - функция Intr. В других компиляторах есть другие её реализации, например, эмулирующие всю таблицу прерываний через функции из dll?

> или программа на Паскале, состоящая наполовину из asm/mov/add/sub

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