DOSBox中x86汇编开发Kahoot风格游戏:视频与文本模式切换难题
DOSBox下x86汇编保留视频模式界面的简易方案
以下是针对你的场景的最简解决方案,均为DOS环境下原生实现方式:
方案1:显存备份与恢复(兼容性最好)
这是最通用的方法,核心是提前把视频模式下的画面存入内存缓冲区,需要时再恢复:
- 在视频模式绘制完问题画面后,将显存内容复制到预分配的内存缓冲区:
; 示例针对VGA 320x200 256色模式(显存地址0xA000:0000,大小64000字节) mov ax, 0xA000 mov ds, ax ; DS指向显存段 xor si, si ; SI指向显存起始 mov ax, seg video_buf mov es, ax ; ES指向缓冲区段 mov di, offset video_buf ; DI指向缓冲区起始 mov cx, 64000 ; 显存总字节数 rep movsb ; 批量复制 - 切换到文本模式处理输入/选项:
mov ah, 0x00 mov al, 0x03 ; 切换到80x25文本模式 int 0x10 ; 此处执行文本模式下的操作(打印选项、读取输入等) - 需要回到视频模式显示问题时,先切换回视频模式,再把缓冲区内容复制回显存:
; 切换回视频模式 mov ah, 0x00 mov al, 0x13 int 0x10 ; 恢复显存内容 mov ax, seg video_buf mov ds, ax mov si, offset video_buf mov ax, 0xA000 mov es, ax xor di, di mov cx, 64000 rep movsb - 注意:根据你使用的视频模式调整显存大小(比如640x480模式需要307200字节),缓冲区要提前在数据段分配足够空间。
方案2:利用VGA页面翻转(代码更简洁)
部分VGA显卡支持多显示页面,可将问题画面绘制到备用页面,切换模式后无需重新绘制:
; 初始化视频模式为0x13(320x200) mov ah, 0x00 mov al, 0x13 int 0x10 ; 切换到备用页面1 mov ah, 0x05 mov al, 0x01 int 0x10 ; 在页面1绘制问题画面... ; 切换到文本模式 mov ah, 0x00 mov al, 0x03 int 0x10 ; 处理文本模式操作... ; 切回视频模式并直接显示页面1 mov ah, 0x00 mov al, 0x13 int 0x10 mov ah, 0x05 mov al, 0x01 int 0x10
- 注意:DOSBox默认模拟的VGA支持多页面,但部分老显卡可能不兼容,优先测试方案1。
方案3:文本模式模拟图形(无需模式切换)
如果你的问题画面元素简单,直接在文本模式用扩展ASCII字符绘制,彻底避免模式切换的麻烦:
; 直接操作文本模式显存(0xB800:0000) mov ax, 0xB800 mov es, ax mov di, 0 mov al, 0xDB ; 用方块字符模拟图形块 mov ah, 0x4F ; 洋红底白字属性 stosw ; 写入字符和属性 ; 继续绘制其他元素...
内容的提问来源于stack exchange,提问作者yali sommer




