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.
Содержание
- 1 Функции TPCrt
- 1.1 FrameWindow
- 1.2 WhereXAbs
- 1.3 WhereYAbs
- 1.4 WhereXY
- 1.5 ScreenX
- 1.6 ScreenY
- 1.7 FastWrite
- 1.8 SetFrameChars
- 1.9 WhereXYdirect
- 1.10 GetCrtMode
- 1.11 GotoXYAbs
- 1.12 SetVisiblePage
- 1.13 ScrollWindowUp
- 1.14 ScrollWindowDown
- 1.15 CursorTypeSL
- 1.16 CursorStartLine
- 1.17 CursorEndLine
- 1.18 SetCursorSize
- 1.19 NormalCursor
- 1.20 FatCursor
- 1.21 BlockCursor
- 1.22 HiddenCursor
- 1.23 ReadCharAtCursor
- 1.24 ReadAttrAtCursor
- 1.25 GetCursorState
- 1.26 RestoreCursorState
- 1.27 FastWriteWindow
- 1.28 FastText
- 1.29 FastTextWindow
- 1.30 FastVert
- 1.31 FastVertWindow
- 1.32 FastFill
- 1.33 FastFillWindow
- 1.34 FastCenter
- 1.35 FastFlush
- 1.36 FastRead
- 1.37 FastReadWindow
- 1.38 ReadAttribute
- 1.39 ReadAttributeWindow
- 1.40 WriteAttribute
- 1.41 WriteAttributeWindow
- 1.42 ChangeAttribute
- 1.43 ChangeAttributeWindow
- 1.44 MoveScreen
- 1.45 FlexWrite
- 1.46 FlexWriteWindow
- 1.47 SaveWindow
- 1.48 RestoreWindow
- 1.49 StoreWindowCoordinates
- 1.50 RestoreWindowCoordinates
- 1.51 PackWindow
- 1.52 DispPackedWindow
- 1.53 DispPackedWindowAt
- 1.54 MapPackedWindowColors
- 1.55 DisposePackedWindow
- 1.56 WritePackedWindow
- 1.57 ReadPackedWindow
- 1.58 CreateLibrary
- 1.59 OpenLibrary
- 1.60 CloseLibrary
- 1.61 PackLibrary
- 1.62 AddWindowToLibrary
- 1.63 ReadWindowFromLibrary
- 1.64 DeleteWindowFromLibrary
- 1.65 MapColor
- 1.66 SetBlink
- 1.67 SetCrtBorder
- 1.68 Font8x8Selected
- 1.69 SelectFont8x8
- 1.70 HercPresent
- 1.71 SwitchInColorCard
- 1.72 HercGraphicsMode
- 1.73 HercModeTestWorks
- 1.74 SetHercMode
- 1.75 ReadKeyWord
- 1.76 CheckKbd
- 1.77 KbdFlags
- 1.78 StuffKey
- 1.79 StuffString
- 1.80 ReInitCrt
- 1.81 SetSafeCPSwitching
- 1.82 SetUseACP
- 1.83 AssignConToCrt
- 1.84 ClrScr
- 1.85 TextBackground
- 1.86 TextColor
- 1.87 Window
- 1.88 GotoXY
- 1.89 WhereX
- 1.90 WhereY
- 1.91 ClrEol
- 1.92 KeyPressed
- 1.93 ReadKey
- 1.94 TextMode
- 1.95 InsLine
- 1.96 DelLine
- 1.97 LowVideo
- 1.98 HighVideo
- 1.99 NormVideo
- 1.100 Delay
- 1.101 Sound
- 1.102 NoSound
- 1.103 AssignCrt
- 1.104 PlaySound
- 1.105 GetLastMode
Функции 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 | Win16 personality • MVM/DOS/Win16 personality |
| Разработка | Получение исходных кодов • Сборка • Отладка • Отправка отчетов |
| API | TPCrt • FamilyAPI • Win16API • VIO API • MVM API |
| Сообщество | IRC |
| OS/2 | Presentation Manager • IFS • Петиции к IBM |