更改代码页
斯拉夫语(Latin II)代码页852不包含除ß(Beta)之外的希腊字符,ß常用于德语中。
解决显示希腊字符的方法之一是使用DOS切换代码页。DOS标准代码页437包含一些希腊字符。
如果未安装NLSFUNC:
- 您可以从命令提示符中使用
mode con cp select=437
。
如果已安装NLSFUNC:
- 您可以从命令提示符中使用
chcp 437
。
- 在应用程序内部,您可以使用DOS.SetGlobalCodePage函数6602h。
无论哪种方式,系统都需要正确的配置才能支持多个代码页。以下是我的配置文件摘录:
CONFIG.SYS:
DEVICE=C:\DOS\DISPLAY.SYS CON=(EGA,850,2)
COUNTRY=032,850,C:\DOS\COUNTRY.SYS
INSTALL=C:\DOS\NLSFUNC.EXE
AUTOEXEC.BAT:
C:\DOS\MODE.COM CON CODEPAGE PREPARE=((437 850) C:\DOS\EGA.CPI)
C:\DOS\MODE.COM CON CODEPAGE SELECT=850
C:\DOS\KEYB.COM BE,850,C:\DOS\KEYBOARD.SYS
下面是一个演示程序,展示了如何在应用程序内部切换到代码页437。该程序清楚地证明了从哪里获取字符(通过DOS,BIOS或VRAM)并不重要。切换立即生效,甚至已经显示在屏幕上的字符也会相应地更改。
ORG 256
xor bx, bx
mov ax, 1400h
int 2Fh
cmp al, 0FFh
jne Print
mov ax, 6601h
int 21h
jc Print
cmp bx, 437
je Print
push bx
mov bx, 437
mov ax, 6602h
int 21h
pop bx
jc Print
call Greek
mov ax, 6602h
int 21h
jmp Exit
Print: call Greek
Exit: mov ax, 4C00h
int 21h
Greek: pusha
mov dx, .msg1
mov ah, 09h
int 21h
mov dl, 224
.a: mov ah, 02h
int 21h
inc dl
cmp dl, 240
jb .a
mov dx, .msg2
mov ah, 09h
int 21h
mov al, 224
.b: mov ah, 0Eh
int 10h
inc al
cmp al, 240
jb .b
mov dx, .msg3
mov ah, 09h
int 21h
mov bh, 0
mov ah, 03h
int 10h
mov al, 160
mul dh
mov dh, 0
add ax, dx
add ax, dx
mov di, ax
push es
mov ax, 0B800h
mov es, ax
mov ax, 0EE0h
.c: stosw
inc al
cmp al, 240
jb .c
pop es
mov dx, .msg4
mov ah, 09h
int 21h
mov ah, 00h
int 16h
popa
ret
.msg1 db 13, 10, 'DOS : $'
.msg2 db 13, 10, 'BIOS : $'
.msg3 db 13, 10, 'VRAM : $'
.msg4 db 13, 10, 'Press any key', 13, 10, '$'
不要移除BIOS.GetKeyboardKey
调用。如果这样做,你将没有机会实际看到希腊字符...
int 21h/ax=6602h
,并将bx = dx = 437
,但我从未使用过(不确定是否有效)。无论如何,我认为你的教授只是希望你在在ASCII表中找到该代码后将7C03h
更改为7CE0h
。CP852在东欧很常见,但是表格和示例通常是针对美国本土的,所以你和你的教授可能使用不同的CP或者他们根本没有考虑过CP。 - Margaret Bloomint 10h
服务来更改CP,我认为它太高级了。你可以更改VGA字体,但这绝对不是你的教授希望你花时间去做的事情。我建议,将其保留原样并继续前进 :) - Margaret Bloom0xB8000
中进行写入:在这种情况下,您写入的字节将根据“视频BIOS代码页”映射为相应的字符,该代码页很可能是CP437,但如果是,则写入0x7CE0
就可以正常工作了。你是在真实硬件上运行吗?因为DOSBox的行为符合预期,即会打印出实际的α
。 - Daniel Kamil Kozarint 21h/ax=6602h
调用起作用,字符串必须使用 DOS API 打印,因此最可能使用int 21h/ah=09h
等。另一方面,为了使其工作,DOS 必须知道 VBIOS 的 CP 并执行即时翻译,将 DOS CP 转换为 VBIOS CP,我相信这不是我们可以依靠的东西。 - Daniel Kamil Kozar7C03h
中的7C
等内容的优秀文章。 - Daniel Kamil Kozar