OSFree TPCrt
TPCrt — это специализированный модуль для работы с текстовым экраном, созданный для программ на Turbo Pascal. В контексте osFree он играет роль «моста», который позволяет старым приложениям, написанным для DOS, напрямую и эффективно использовать видеоресурсы современной системы, не переписывая их код.
Изначально Crt — это стандартный модуль в составе Turbo Pascal, предоставляющий программисту простые инструменты для управления текстовым выводом: очистку экрана, установку цвета, позиционирование курсора, работу с окнами и клавиатурой.
TPCrt (Turbo Pascal Crt) — это, по сути, расширенная или адаптированная версия этого модуля. Он включает в себя как стандартные процедуры (ClrScr, GotoXY, TextColor), так и множество нестандартных, расширенных возможностей. Например, функции для прямой записи в видеопамять в обход BIOS (FastWrite, FastFill), чтобы избежать «снега» на экране и увеличить скорость, а также низкоуровневые операции с курсором (SetCursorSize) и даже работа с библиотеками упакованных окон (PackWindow).
osFree — это проект по созданию свободной операционной системы, совместимой с OS/2, но построенной на современном микроядре L4. Ключевая идея проекта — бинарная совместимость: возможность запускать старые приложения OS/2 и DOS без их перекомпиляции.
Вот тут и появляется TPCrt. Приложения, написанные на Turbo Pascal для DOS, используют этот модуль для вывода на экран. Вместо того чтобы заставлять программу обращаться к устаревшему оборудованию или эмулировать его медленно через BIOS, osFree может предоставить TPCrt как системный сервис (персоналию), который напрямую транслирует вызовы в графическую подсистему самой osFree.
Это дает несколько преимуществ:
- Скорость: Прямая работа с видеоресурсами хоста быстрее, чем полная программная эмуляция видеокарты.
- Совместимость: Старые DOS-программы, активно использующие экран, будут работать корректно и быстро.
- Гибкость: Это еще один пример «персоналии» — изолированного сервера, который реализует конкретный API (в данном случае, API модуля Crt) поверх микроядра.
Проще говоря, TPCrt в osFree — это не просто библиотека, а адаптер, который позволяет устаревшему коду Turbo Pascal «разговаривать» с современной графической системой osFree так же легко, как он когда-то разговаривал с видеокартой DOS.
Функции TPCrt
Модуль TPCrt.
FrameWindow
procedure FrameWindow(LeftCol, TopRow, RightCol, BotRow, FAttr, HAttr : Byte; Header : shortstring);
Рисует рамку вокруг окна.
WhereXAbs
function WhereXAbs: Byte;
Возвращает абсолютную координату курсора по столбцу.
WhereYAbs
function WhereYAbs: Byte;
Возвращает абсолютную координату курсора по строке.
WhereXY
function WhereXY: Word;
Возвращает абсолютные координаты курсора.
ScreenX
function ScreenX: Byte;
Возвращает абсолютную координату курсора по столбцу.
ScreenY
function ScreenY: Byte;
Возвращает абсолютную координату курсора по строке.
FastWrite
procedure FastWrite(St : string; Row, Col, Attr : Byte);
Записывает St в позицию Row, Col с атрибутом Attr (видеоатрибут) без «снега».
SetFrameChars
procedure SetFrameChars(Vertical, Horizontal, LowerRight, UpperRight, LowerLeft, UpperLeft : Char);
Задаёт символы рамки, используемые в последующих вызовах FrameWindow.
WhereXYdirect
procedure WhereXYdirect(var X, Y : Byte);
Считывает текущее положение курсора напрямую из контроллера CRT.
GetCrtMode
function GetCrtMode : Byte;
Возвращает текущий видеорежим. Также повторно инициализирует внутренние переменные. Может сбросить: CurrentMode, ScreenWidth, ScreenHeight, CurrentPage и VideoSegment.
GotoXYAbs
procedure GotoXYAbs(X, Y : Byte);
Перемещает курсор в столбец X, строку Y. Проверка ошибок не выполняется.
SetVisiblePage
procedure SetVisiblePage(PageNum : Byte);
Устанавливает текущую видеостранцу.
ScrollWindowUp
procedure ScrollWindowUp(XLo, YLo, XHi, YHi, Lines : Byte);
Прокручивает указанное окно вверх на заданное число строк.
ScrollWindowDown
procedure ScrollWindowDown(XLo, YLo, XHi, YHi, Lines : Byte);
Прокручивает указанное окно вниз на заданное число строк.
CursorTypeSL
function CursorTypeSL : Word;
Возвращает слово. Старший байт содержит начальную строку развёртки, младший — конечную.
CursorStartLine
function CursorStartLine : Byte;
Возвращает начальную строку развёртки курсора.
CursorEndLine
function CursorEndLine : Byte;
Возвращает конечную строку развёртки курсора.
SetCursorSize
procedure SetCursorSize(Startline, EndLine : Byte);
Устанавливает начальную и конечную строки развёртки курсора.
NormalCursor
procedure NormalCursor;
Устанавливает нормальные строки развёртки курсора в зависимости от текущего видеорежима.
FatCursor
procedure FatCursor;
Устанавливает увеличенные строки развёртки курсора в зависимости от текущего видеорежима.
BlockCursor
procedure BlockCursor;
Устанавливает строки развёртки для блочного курсора.
HiddenCursor
procedure HiddenCursor;
Скрывает курсор.
ReadCharAtCursor
function ReadCharAtCursor: Char;
Возвращает символ в текущей позиции курсора на выбранной странице.
ReadAttrAtCursor
function ReadAttrAtCursor: Byte;
Возвращает атрибут в текущей позиции курсора на выбранной странице.
GetCursorState
procedure GetCursorState(var XY, ScanLines: Word);
Возвращает текущее положение и размер курсора.
RestoreCursorState
procedure RestoreCursorState(XY, ScanLines: Word);
Восстанавливает курсор в положение и размер, сохранённые с помощью GetCursorState.
FastWriteWindow
procedure FastWriteWindow(St: string; Row, Col, Attr: Byte);
Записывает строку, используя координаты относительно окна.
FastText
procedure FastText(St: string; Row, Col: Byte);
Записывает St в позицию Row, Col без изменения нижележащего видеоатрибута.
FastTextWindow
procedure FastTextWindow(St: string; Row, Col: Byte);
Записывает St в позицию Row, Col окна без изменения нижележащего видеоатрибута.
FastVert
procedure FastVert(St: string; Row, Col, Attr: Byte);
Записывает St вертикально в позицию Row, Col с атрибутом Attr (видеоатрибут).
FastVertWindow
procedure FastVertWindow(St: string; Row, Col, Attr: Byte);
Записывает строку вертикально, используя координаты относительно окна.
FastFill
procedure FastFill(Number: Word; Ch: Char; Row, Col, Attr: Byte);
Заполняет Number символов Ch в позиции Row, Col с атрибутом Attr (видеоатрибут) без «снега».
FastFillWindow
procedure FastFillWindow(Number: Word; Ch: Char; Row, Col, Attr: Byte);
Заполняет Number символов Ch в позиции Row, Col окна с атрибутом Attr (видеоатрибут) без «снега».
FastCenter
procedure FastCenter(St: string; Row, Attr: Byte);
Записывает St с центрированием по строке Row окна с атрибутом Attr (видеоатрибут) без «снега».
FastFlush
procedure FastFlush(St: string; Row, Attr: Byte);
Записывает St с выравниванием по правому краю по строке Row окна с атрибутом Attr (видеоатрибут) без «снега».
FastRead
procedure FastRead(Number, Row, Col: Byte; var St: string);
Считывает Number символов с экрана в St, начиная с позиции Row, Col.
FastReadWindow
procedure FastReadWindow(Number, Row, Col: Byte; var St: string);
Считывает Number символов с экрана в St, начиная с позиции Row, Col окна.
ReadAttribute
procedure ReadAttribute(Number, Row, Col: Byte; var St: string);
Считывает Number атрибутов с экрана в St, начиная с позиции Row, Col.
ReadAttributeWindow
procedure ReadAttributeWindow(Number, Row, Col: Byte; var St: string);
Считывает Number атрибутов с экрана в St, начиная с позиции Row, Col окна.
WriteAttribute
procedure WriteAttribute(St: String; Row, Col: Byte);
Записывает строку атрибутов St в позицию Row, Col без изменения символов.
WriteAttributeWindow
procedure WriteAttributeWindow(St: String; Row, Col: Byte);
Записывает строку атрибутов St в позицию Row, Col окна без изменения символов.
ChangeAttribute
procedure ChangeAttribute(Number: Word; Row, Col, Attr: Byte);
Изменяет Number видеоатрибутов на Attr, начиная с позиции Row, Col.
ChangeAttributeWindow
procedure ChangeAttributeWindow(Number: Word; Row, Col, Attr: Byte);
Изменяет Number видеоатрибутов на Attr, начиная с позиции Row, Col окна.
MoveScreen
procedure MoveScreen(var Source, Dest; Length : Word);
Перемещает Length слов из Source в Dest без «снега».
FlexWrite
procedure FlexWrite(St : string; Row, Col : Byte; var FAttrs : FlexAttrs);
Записывает St в позицию Row, Col с гибкой обработкой цветов.
FlexWriteWindow
procedure FlexWriteWindow(St :string; Row, Col: Byte; var FAttrs: FlexAttrs);
Записывает строку гибко, используя координаты относительно окна.
SaveWindow
function SaveWindow(XLow, YLow, XHigh, YHigh : Byte; Allocate : Boolean; var Covers : Pointer) : Boolean;
Выделяет буферное пространство, если запрошено, и сохраняет содержимое окна.
RestoreWindow
procedure RestoreWindow(XLow, YLow, XHigh, YHigh : Byte; Deallocate : Boolean; var Covers : Pointer);
Восстанавливает содержимое экрана и освобождает буферное пространство, если запрошено.
StoreWindowCoordinates
procedure StoreWindowCoordinates(var WC : WindowCoordinates);
Сохраняет координаты окна для активного окна.
RestoreWindowCoordinates
procedure RestoreWindowCoordinates(WC : WindowCoordinates);
Восстанавливает ранее сохранённые координаты окна.
PackWindow
function PackWindow(XLow, YLow, XHigh, YHigh : Byte) : PackedWindowPtr;
Возвращает указатель на упакованное окно или nil, если недостаточно памяти.
DispPackedWindow
procedure DispPackedWindow(PWP : PackedWindowPtr);
Отображает упакованное окно, на которое указывает PWP.
DispPackedWindowAt
procedure DispPackedWindowAt(PWP : PackedWindowPtr; Row, Col : Byte);
Отображает упакованное окно, на которое указывает PWP, в позиции Row, Col. При необходимости координаты корректируются, чтобы оно поместилось на экране.
MapPackedWindowColors
procedure MapPackedWindowColors(PWP : PackedWindowPtr);
Сопоставляет цвета в упакованном окне для улучшения внешнего вида на монохромных/чёрно-белых дисплеях.
DisposePackedWindow
procedure DisposePackedWindow(var PWP : PackedWindowPtr);
Уничтожает упакованное окно, устанавливая PWP в nil при выходе.
WritePackedWindow
procedure WritePackedWindow(PWP : PackedWindowPtr; FName : string);
Сохраняет упакованное окно, на которое указывает PWP, в FName.
ReadPackedWindow
function ReadPackedWindow(FName : string) : PackedWindowPtr;
Считывает упакованное окно, сохранённое в FName, в память.
CreateLibrary
function CreateLibrary(var F : file; Name : string; Entries : Byte) : DirectoryPtr;
Создаёт библиотеку с указанным числом элементов каталога.
OpenLibrary
function OpenLibrary(var F : file; Name : string) : DirectoryPtr;
Открывает указанную библиотеку и возвращает указатель на её каталог.
CloseLibrary
procedure CloseLibrary(var F : file; var DP : DirectoryPtr);
Закрывает библиотеку F и освобождает её каталог.
PackLibrary
procedure PackLibrary(LName : string);
Упаковывает библиотеку для удаления удалённых элементов.
AddWindowToLibrary
procedure AddWindowToLibrary(PWP : PackedWindowPtr; var F : file; DP : DirectoryPtr; WinName : LibName);
Добавляет упакованное окно в указанную библиотеку.
ReadWindowFromLibrary
function ReadWindowFromLibrary(var F : file; DP : DirectoryPtr; WinName : LibName) : PackedWindowPtr;
Считывает упакованное окно из библиотеки.
DeleteWindowFromLibrary
procedure DeleteWindowFromLibrary(var F : file; DP : DirectoryPtr; WinName : LibName);
Удаляет упакованное окно из указанной библиотеки.
MapColor
function MapColor(c : Byte) : Byte;
Сопоставляет видеоатрибут для видимости на монохромных/чёрно-белых дисплеях.
SetBlink
procedure SetBlink(Status : Boolean);
Включает мерцание атрибутов текстового режима, если On равно True.
SetCrtBorder
procedure SetCrtBorder(Attr : Byte);
Устанавливает цвет границы в цвет фона, если тип карты и режим это позволяют.
Font8x8Selected
function Font8x8Selected : Boolean;
Возвращает True, если активна EGA или VGA и используется шрифт 8×8.
SelectFont8x8
procedure SelectFont8x8(Status : Boolean);
Включает или выключает шрифт 8×8.
HercPresent
function HercPresent : Boolean;
Возвращает True, если присутствует графическая карта Hercules.
SwitchInColorCard
procedure SwitchInColorCard(ColorOn : Boolean);
Активирует или деактивирует цвета на карте Hercules InColor.
HercGraphicsMode
function HercGraphicsMode : Boolean;
Возвращает True, если карта Hercules находится в графическом режиме.
HercModeTestWorks
function HercModeTestWorks : Boolean;
Возвращает True, если HercGraphicsMode будет работать.
SetHercMode
procedure SetHercMode(GraphMode : Boolean; GraphPage : Byte);
Устанавливает карту Hercules в графический или текстовый режим и активирует указанную графическую страницу (при переключении в графический режим).
ReadKeyWord
function ReadKeyWord : Word;
Ожидает нажатия клавиши, затем возвращает скан-код и код символа вместе.
CheckKbd
function CheckKbd(var KeyCode : Word) : Boolean;
Возвращает True (и коды клавиш), если ожидается нажатие клавиши.
KbdFlags
function KbdFlags : Byte;
Возвращает флаги состояния клавиатуры в виде битово-кодированного байта.
StuffKey
procedure StuffKey(W : Word);
Помещает одну клавишу в буфер клавиатуры.
StuffString
procedure StuffString(S : string);
Помещает содержимое S в буфер клавиатуры.
ReInitCrt
procedure ReInitCrt;
Повторно инициализирует внутренние переменные модуля CRT. Для TSR или программ с оболочками DOS. Может сбросить: CurrentMode, ScreenWidth, ScreenHeight, WindMin/WindMax, CurrentPage, CurrentDisplay, CheckSnow и VideoSegment.
SetSafeCPSwitching
procedure SetSafeCPSwitching(F: Boolean);
SetUseACP
procedure SetUseACP(F: Boolean);
AssignConToCrt
procedure AssignConToCrt;
ClrScr
procedure ClrScr;
Очищает экран и возвращает курсор в левый верхний угол.
TextBackground
procedure TextBackground(Color: Byte);
Выбирает цвет фона.
TextColor
procedure TextColor(Color: Byte);
Выбирает цвет символов переднего плана.
Window
procedure Window(X1,Y1,X2,Y2: Byte);
Определяет текстовое окно на экране.
GotoXY
procedure GotoXY(X,Y: Byte);
Перемещает курсор в заданные координаты в пределах экрана.
WhereX
function WhereX: Byte;
Возвращает координату X текущего положения курсора.
WhereY
function WhereY: Byte;
Возвращает координату Y текущего положения курсора.
ClrEol
procedure ClrEol;
Очищает все символы от позиции курсора до конца строки, не перемещая курсор.
KeyPressed
function KeyPressed: Boolean;
Определяет, была ли нажата клавиша на клавиатуре, и возвращает True, если клавиша была нажата.
ReadKey
function ReadKey: Char;
Считывает символ с клавиатуры и возвращает символ или расширенный скан-код.
TextMode
procedure TextMode (Mode: word);
InsLine
procedure InsLine;
Вставляет пустую строку в позиции курсора.
DelLine
procedure DelLine;
Удаляет строку, содержащую курсор.
LowVideo
procedure LowVideo;
Выбирает символы низкой интенсивности.
HighVideo
procedure HighVideo;
Выбирает символы высокой интенсивности.
NormVideo
procedure NormVideo;
Выбирает символы нормальной интенсивности.
Delay
procedure Delay(MS: Word);
Sound
procedure Sound(Hz: Word);
NoSound
procedure NoSound;
AssignCrt
procedure AssignCrt(var F: Text);
Связывает текстовый файл с устройством CRT.
PlaySound
procedure PlaySound(Freq,Duration: Longint);
GetLastMode
procedure GetLastMode;
Устанавливает координаты окна.
| OSFree | ||
|---|---|---|
| osFree | Архитектура • План работ • Компоненты • Используемые проекты • Связанные проекты • Экраны • FreePM • L4 • Скриншоты | |
| Загрузчик | [ Последовательность загрузки: поток выполнения • изменение карты памяти ] • Загрузочный сектор • L4Ka::Kickstart | |
| Personalities | OS/2 personality | VIO API • FamilyAPI |
| Win16 personality | Win16API | |
| MVM | MVM API | |
| Разработка | Получение исходных кодов • Сборка • Отладка • Отправка отчетов | |
| API | TPCrt | |
| Сообщество | IRC • Новости проекта | |
| OS/2 | Presentation Manager • IFS • Петиции к IBM | |
| Статьи | Микроядро L4 как основа ядра ОС | |
| Родственные проекты | os2host32 • NeptuneOS | |
