VESA编程问题,麻烦懒虫易水斑竹了

mailxt 2004-11-14 11:43:37
我在易水的编程网站看到了懒虫易水斑竹的实模式下高速绘图的实现一文,深感大有收获,对易水斑竹的敬仰之情如……(省略若干熟知的吹捧之词),不过在实际运用时发现4F02调用返回的物理地址是F0000000H,即使在保护模式下如果不使用分页机制的话也是无法访问的地址,更不用说在实模式下了,不知易水斑竹是如何做到的,还望易水斑竹不吝指点一二,谢谢!
...全文
103 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
mailxt 2004-11-16
  • 打赏
  • 举报
回复
果然是有,看样子是我的程序有点问题,谢谢易水斑竹啦
Areslee 2004-11-15
  • 打赏
  • 举报
回复
无所谓
你是用什么方法访问的?是写不了显存还是什么?
mailxt 2004-11-15
  • 打赏
  • 举报
回复
偶开启了呀,不过还是不行啊,有一个问题,是先开启DOS下访问4GB内存功能还是先调用VBE
Areslee 2004-11-15
  • 打赏
  • 举报
回复
偶不是说明了吗,要先开启DOS下访问4GB内存功能才行啊
Areslee 2004-11-15
  • 打赏
  • 举报
回复
CX的值太大,超出了16位表示的范围
改成4000试试先
Areslee 2004-11-15
  • 打赏
  • 举报
回复
应该会有显示才对
mailxt 2004-11-15
  • 打赏
  • 举报
回复
.386P

INCLUDE PROTECT.INC

DATA SEGMENT USE16

GDTS DESC <>

CodeSel = $ - GDTS
CodeDes DESC <0FFFFH, , , 9AH, >

DataSel = $ - GDTS
DataDes DESC <0FFFFH, , , 0CF92H, >

GDTLEN = $ - GDTS

GDTPTR PDESC <GDTLEN - 1, >

OLDMODE DB 0

VESAMSG DB 'VESA'

VBEINFO DB 512 DUP(0)

CRTINFO DB 56 DUP(0)

MINFO DB 256 DUP(0)

DATA ENDS

STACK SEGMENT STACK
DB 512 DUP(0)
STACK ENDS

CODE SEGMENT USE16
ASSUME CS:CODE, DS:DATA, SS:STACK

MAIN PROC NEAR

XOR EAX, EAX
MOV AX, DATA
MOV DS, AX
MOV ES, AX

CALL MAKE4G

MOV AH, 0FH
INT 10H

MOV [OLDMODE], AL

MOV AX, 0A000H
MOV GS, AX

MOV AX, 4F00H
MOV DI, OFFSET VBEINFO
INT 10H

CMP AX, 004FH
JNE EXIT

MOV SI, OFFSET VESAMSG

XOR CX, CX

LOOP1:
MOV BL, [SI]
CMP ES:[DI], BL
JNE EXIT
INC SI
INC DI
INC CX
CMP CX, 4
JNE LOOP1

MOV AX, 4F02H
MOV BX, 4115H
MOV DI, OFFSET CRTINFO
INT 10H

CMP AX, 4FH
JNE EXITMODE

MOV AX, 4F01H
MOV CX, 115H
MOV DI, OFFSET MINFO
INT 10H

CMP AX, 4FH
JNE EXITMODE

MOV DX, WORD PTR [MINFO + 6]

MOV EDI, DWORD PTR [MINFO + 40]

MOV CX, 240000

LOOPX:
MOV BYTE PTR FS:[EDI], 255
INC EDI
MOV BYTE PTR FS:[EDI], 0
INC EDI
MOV BYTE PTR FS:[EDI], 0
INC EDI
DEC CX
CMP CX, 0
JE PREPAREEXIT
JMP LOOPX

PREPAREEXIT:
MOV AH, 08H
INT 21H

EXITMODE:
MOV AH, 00H
MOV AL, BYTE PTR [OLDMODE]
INT 10H

EXIT:
MOV AX, 4C00H
INT 21H

MAIN ENDP

MAKE4G PROC

PUSH DS
PUSH ES

PUSHAD
PUSHFD

SHL EAX, 4
LEA EAX, [EAX + GDTS]
MOV DWORD PTR GDTPTR.BASE, EAX

XOR EAX, EAX
MOV AX, CS
SHL EAX, 4
ROL EAX, 8
MOV CodeDes.Baseh, AL
MOV AL, BYTE PTR CodeDes.Attrib
ROR EAX, 8
MOV DWORD PTR CodeDes.Basel, EAX

CLI

LGDT FWORD PTR GDTPTR

MOV EAX, CR0
OR EAX, 1
MOV CR0, EAX

JUMP16 CodeSel, <OFFSET Protect>

Protect:
MOV AX, DataSel
MOV FS, AX
MOV EAX, CR0
AND EAX, 0FFFFFFFEH
MOV CR0, EAX
JUMP16 <SEG Real>, <OFFSET Real>

Real:
STI

POPFD
POPAD

POP ES
POP DS

RET

MAKE4G ENDP

CODE ENDS
END MAIN

这只是一段小小的测试代码,先在这里谢谢易水斑竹啦:)
Areslee 2004-11-15
  • 打赏
  • 举报
回复
写显存的代码发上来看看
mailxt 2004-11-15
  • 打赏
  • 举报
回复
是写不了显存,我的测试用机是128M内存,显卡支持VESA2.0+,有8M显存,我先开启DOS下访问4GB内存功能,段选择子在FS中,4F01调用返回的物理地址是F0000000,4F02调用的模式号是4115,然后我向FS:[F0000000]写入数据,结果屏幕上没有什么反应,PS:是不是调用VESA的程序退出后,对线性抵制的映射就结束了,因为我在程序退出后用工具查看F0000000处没有任何内容。

21,458

社区成员

发帖
与我相关
我的任务
社区描述
汇编语言(Assembly Language)是任何一种用于电子计算机、微处理器、微控制器或其他可编程器件的低级语言,亦称为符号语言。
社区管理员
  • 汇编语言
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧