大约15年前,我曾经自娱自乐,并通过编写直接修改显示器上文本的错误代码来惹恼我的CS老师.这可以通过在配备VGA的PC兼容机上访问0xB8000的视频内存来轻松完成.
快进到今天,我决定通过调试端口尝试我的旧技巧,让我可以访问读取物理内存.令我满意的是,它仍然在我尝试过的第一个平台上工作.然后,令人沮丧的是,我发现它不适用于许多其他系统.它似乎不适用于所有系统都有UMA(共享内存)图形.
因此,对于所有BIOS编写者,低级操作系统人员和视频驱动程序专家的问题 - 如果我在具有共享图形内存的PC兼容系统上的常规80x25颜色文本模式,在实模式下,以及0xb8000 - 0xB8FFF都是0xFF,而不是给我屏幕上的内容,屏幕缓冲区在哪里?
DOS中字符表的地址是什么,我们可以通过操纵每个字符的像素来创建新的字体和符号?
我知道用BIOS中断来改变它,但是我只需要dos中字符表的内存地址来直接访问.
当您将一个字节(例如(0x31)存储到物理线性地址的VGA 文本(模式 03)帧缓冲区中时),在以 16 位传统 BIOS MBR 模式启动的现代 PC 硬件上究竟发生了什么? 将该地区的MTRR设置为 UC的商店有多慢? (在一台 Kaby Lake iGPU 笔记本电脑上的实验测试表明,WC 上的 clflushopt 与 VGA 内存的 UC 速度大致相同。但没有 clflushopt,存储到 WC 内存永远不会离开 CPU 并且根本不更新屏幕,运行速度超快.)'1'B8000mov [es:di], eaxmov
如果它不是每个商店的 SMI,是否有任何方法可以在用户空间中的一块 WB 内存上估算此成本,以进行性能实验而无需实际重新启动到实模式?(例如,使用 BSS 页面作为实际上并不在任何地方显示的假装帧缓冲区)。
相应的字体字形在下一次刷新时出现在屏幕上,但硬件扫描是否真的从 VRAM(或 iGPU 的 DRAM)读取该 ASCII 字符并动态映射到位图字体字形?或者每个存储或每个 vblank 都有一些软件拦截,所以真正的硬件只需要处理位图帧缓冲区?
众所周知,传统 BIOS 引导使用系统管理模式 (SMM)将 USB kbd/鼠标模拟为 PS/2 设备。我想知道它是否也用于 VGA 文本模式帧缓冲区。我认为它是用于VGA的I …
我有一个被调用的变量,average在我的 中DATASEG,它每次都会改变,因为用户每次输入不同的输入。我想要做的是转到图形模式(VGA),然后在那里打印您的平均值是:然后平均值我知道如何更改为这样的图形模式:
mov ax, 13h
int 10h
Run Code Online (Sandbox Code Playgroud)
打印平均值后,如果平均值高于 75,我想打印在下面你是个好学生,继续努力,如果不是。别担心,你会好起来的!提前致谢。
我正在尝试使用Terasic的一些书籍和Altera DE1开发套件来学习VHDL编程.
这里的问题是我正在尝试编程一个VGA控制器,分辨率为640x480(虽然我的屏幕是一台1280x1024的TFT LCD).
我在使用代码时遇到了一些问题.
我使用FSM来制作垂直和水平信号,另一个块用于驱动RGB输入,还有一个来自DE1的27 MHz时钟.
我认为代码有问题,因为我在屏幕上打印的图像尺寸不正确(640x480)但更大(约1174x980).
到现在为止,我试图在屏幕上放一个唯一的颜色来简化它,直到我发现错误.
我的项目有3个文件,1个用于块RGB,1个用于FSM,另一个用于实例化它们.
我会很感激某种帮助来解决这个问题,因为我已经努力想出来,但我看不出错误在哪里.
非常感谢!
奥马尔
VGA控制器文件
library ieee;
use ieee.std_logic_1164.all;
entity VGA_controller is
port(clk, reset : in std_logic;
Hsync,Vsync : out std_logic;
R,G,B : out std_logic_vector(3 downto 0));
end entity;
architecture arch of VGA_controller is
component FSM_sync is
port(clk,reset : in std_logic;
Hsync,Vsync,VIDON : out std_logic;
Vcount,Hcount : out integer range 0 to 799);
end component;
component VGA_display is
port(hcount,vcount : in integer range 0 to 799;
r,g,b : out std_logic_vector(3 downto …Run Code Online (Sandbox Code Playgroud) 嗨,您好,
我正在尝试使用UIScreen在iPad上使用VGA加密狗来驱动单独的屏幕.
这是我在根视图控制器的viewDidLoad中得到的:
//Code to detect if an external display is connected to the iPad.
NSLog(@"Number of screens: %d", [[UIScreen screens]count]);
//Now, if there's an external screen, we need to find its modes, itereate through them and find the highest one. Once we have that mode, break out, and set the UIWindow.
if([[UIScreen screens]count] > 1) //if there are more than 1 screens connected to the device
{
CGSize max;
UIScreenMode *maxScreenMode;
for(int i = 0; i < [[[[UIScreen screens] …Run Code Online (Sandbox Code Playgroud) 我在 DosBox 0.74 上用 TASM 3.0 编写,我正在尝试在模式 x(调整 13h,未链接模式 13)中编写,但在这里您可以在图像中看到,它不太正确。似乎平面 1(第二个平面)根本没有打印,所有其他平面的顺序都不正确。我知道这里的代码效率低下,但我想让它工作然后清理它。
proc showBMP
push cx
mov ax, 0A000h
mov es, ax
mov cx, [BMPHeight]
mov ax, [BMPWidth]
xor dx, dx
mov si, 4
div si
mov bp, dx
mov dx, [BMPX]
showBMP_nextLine:
call VGAPlaneStartBMP
push cx
push dx
mov di, cx
add di, [BMPY]
mov cx, di
shl cx, 6
shl di, 8
add di, cx
add di, dx
mov ah, 3fh
mov cx, [BMPWidth]
add …Run Code Online (Sandbox Code Playgroud) 1我在 DosBox 0.74 上用 TASM 3.0 写,我想用模式 x(调整 13h,非链接模式 13)写,我遇到了一个问题,你如何在图像中看到,每一行都被打印出来,但是在每行,每组四个像素只打印第一个像素的颜色,这是在VRAM中的不同空间打印图像进行双缓冲后,因此所有四个平面都有第一个平面的数据。
这是图像的打印方式(这是没有双缓冲区的直接打印,是的,计时器有问题,但没关系)

这是使用双缓冲打印图像的方式
我确实认为问题在于模式x时VGA端口中的数据与读写不同,这里是选择VGA平面的代码
proc VGAPlaneSelect
push ax
push dx
push cx
mov al, 02h
mov dx, 03C4h
out dx, al
VGAPlaneSelect_start:
mov ax, 1
mov cl, [VGAPlane]
shl ax, cl
cmp [VGAPlane], 4
jne VGAPlaneSelect_end
mov [VGAPlane], 0
jmp VGAPlaneSelect_start
VGAPlaneSelect_end:
mov dx, 03C5h
out dx, al
pop cx
pop dx
pop ax
ret
endp VGAPlaneSelect
Run Code Online (Sandbox Code Playgroud)
如果输出不是问题,这里是内存传输的代码:
proc DoubleBuffer
mov ax, 0A000h
mov es, ax …Run Code Online (Sandbox Code Playgroud) 我想编写一个软件,当监视器与D-sub连接器连接时,该软件会弹出,并要求用户镜像监视器或扩展监视器.
但是当d-sub连接时我没有发现任何事件.在Windows Vista上,如果连接显示器,vista可以弹出一个软件到同一个东西.
有谁知道如何检测d-sub连接事件并在linux中处理它?
非常感谢!