You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多
文档控制台
免费开始使用

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

火山引擎 最新活动