【问题标题】:FreePascal console video rows and columnsFreePascal 控制台视频行和列
【发布时间】:2014-11-06 10:22:00
【问题描述】:

我正在寻找一种方法来获取 FPC 下的控制台视频行数和列数。我正在寻找最便携的方式,但至少有一种可以在 Windows 下运行(最好也可以在 Linux 下运行)的方式。

从旧的 Turbo Pascal 时代开始,我编写了以下函数,但它们无法在 FPC 下编译,并且在汇编程序中它们不是很便携。

//Return the number of video rows
function GetVideoY: Byte; assembler;
asm
  mov     ax,$40
  mov     es,ax
  mov     al,es:$84
  inc     al
end; { GetVideoY }

//Return the number of video columns
function GetVideoX: Byte; assembler;
asm
  mov     ax,$40
  mov     es,ax
  mov     al,es:$4A
end; { GetVideoX }

更新: 根据正确答案的建议,上述例程变为:

//Return the number of video rows
function GetVideoY: Byte;
begin
  GetVideoY := WindMaxY - WindMinY + 1;
end;

//Return the number of video columns
function GetVideoX: Byte;
begin
  GetVideoX := WindMaxX - WindMinX + 1;
end;

我在 Windows 和 Linux 上都试过了,它们似乎都可以正常工作。谢谢。

【问题讨论】:

  • 您的 asm 函数无法编译,因为未指定汇编程序模式:{$ASMMODE intel}。它们看起来像是在 16 位时代编写的。尝试转换寄存器:ax->**eax**, es->**esp**。 al 仍然可以,因为它与结果大小(8 位)匹配。否则你可以看看 crt 单元。
  • @user3661500 转换 es->esp 是错误的,因为 es 是一个段寄存器并且段寄存器名称没有改变。 OP 正在尝试读取 ROM-BIOS 数据区 (webpages.charter.net/danrollins/techhelp/0093.HTM) 中绝对内存地址 40:004A 和 40:0084 处的字节
  • 原始代码使用 BIOS 地址来获取此信息。但这无关紧要,因为重要的是具有等效的功能,而不是如何实现。例如,可能存在为控制台提供列和行的 Windows 和/或 Linux API 调用。

标签: linux windows console screen freepascal


【解决方案1】:

从旧的 Turbo Pascal 时代开始,发生了很大变化的是,从 ROM-BIOS 数据区域读取文本屏幕分辨率几乎只在准系统操作系统中才有意义,其中Dan Rollins's TECH Help! 绝对地址仍然保留并且 Free Pascal您的代码转换看起来像

function GetVideoY: Byte;
begin
  GetVideoY := mem[$40:$84] + 1;
end;

function GetVideoX: Byte;
begin
  GetVideoX := mem[$40:$4a];
end;

在具有图形用户界面的操作系统下运行的控制台应用程序通常不直接与其他应用程序共享屏幕,也不使用 BIOS 视频调用在屏幕上绘图。相反,它们通常在虚拟化 API 后面运行。

Free Pascal 具有Crt 单元形式的控制台应用程序兼容性 API

来源:http://www.freepascal.org/docs-html/rtl/crt/index.html

.. Free Pascal 的 CRT 单元,在 dos linux 和 Windows 下。该单元最初是由 Florian klaempfl 为 dos 编写的。该单元由 Mark May 移植到 linux,并由 Michael Van Canneyt 和 Peter Vreman 增强。它适用于 linux 控制台,以及 X-Windows 下的 xterm 和 rxvt 窗口。两者的功能是一样的..

您可以在

处查看其表面(便携式 API)的内容

你可以看到里面的东西

当前屏幕分辨率的等效表达式应该是

WindMaxY - WindMinY + 1

WindMaxX - WindMinX + 1

阅读 GotoXY 周围的文档可能是一个不错的起点,在源代码文件中搜索文本 ScreenWidthScreenHeight 可以告诉您您可能想知道的任何其他信息

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-08-07
    • 2011-04-04
    • 1970-01-01
    • 1970-01-01
    • 2012-04-30
    • 2021-04-10
    相关资源
    最近更新 更多