2

我试图在图形模式下打印一个字符。通常当我打印一个我正在做的角色时:


mov ah,14   ; ah=14
mov al,'x' 
int 10h     ; print the character

这次不行了。我想问题是我切换到图形模式:


push ax
mov ah, 0
mov al, 13h
int 10h
pop ax
ret

那么我怎样才能仍然使用图形模式(我需要它)并打印一个字符?我正在使用 nasm 编译器、bochs 调试器和 8086 平台。

非常感谢!

4

2 回答 2

8

随时准备好 Ralf Brown 中断列表

该服务int 10h/AH=0Eh需要 中的页码BH和要使用的颜色BL

这个片段有效

mov ah, 0eh           ;0eh = 14
mov al, 'x'
xor bx, bx            ;Page number zero
mov bl, 0ch           ;Color is red
int 10h

在文本模式下BL不使用,但在图形模式下使用。
没有正确设置它可能最终会写成“黑底黑字”。

于 2016-06-27T11:22:29.563 回答
0

你必须画它(至少如果你想修饰它的外观)。

IIRC BIOS 或 DOS 中断实际上能够在 gfx 模式下打印字符,但是字体很难看,而且它确实破坏了周围的其他内容,所以当我确实需要在 13h 模式下打印文本时,我不得不自己做.

如果您是新手,请这样开始:

  1. 用一些图片创建 6x8 字节数组 ( *1 )
  2. 绘制它 = 创建 PutSprite(source, width=6, height=8, posx=10, posy=10) 函数
  3. 创建 6x8 256 颜色的基本 ASCII 字体(或在互联网上搜索一些固定大小的 asm 字体)
  4. 创建您自己的“打印”函数,使用正确的字体字形调用 PutSprite,并为每个字符移动目标坐标。
  5. (可选)如果你想有比例字体,你必须将每个字形的宽度与字体图形一起存储,并根据它推进位置
  6. (可选)扩展 PutSprite 以检查定义的透明度颜色,例如 255,因此它将仅复制非透明像素的源字节。

*1) 第一步,您可以像这样使用一些调试 gfx(使用默认 DOS 调色板):

testSprite:   ; testing gfx glyph, size 6x8 pixels for 13h mode
    times 6 db 15 ; white line at top
    times 6*6 db 2 ; dark green middle
    times 6 db 13 ; violet line at bottom

在第二步中,您必须将值从源地址复制到 0xA000:320*posy+posx 内存区域,正确推进指针:复制每个字节后的源++,单行的目标++(对于宽度字节),然后目标+=320-宽度推进到下一行的高度线。

于 2016-06-27T11:32:09.497 回答