【发布时间】: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