关于文本模式字符发生器

one_add_one 2000-06-29 10:13:00
在文本模式下修改ASCII码字模的资料如下:

文本模式字符发生器
中断 10h
调用时的寄存器:AH=11h
AL=00h,10h:装载用户指定的字模
ES:BP--->用户表
CX=要储存的字模计数
DX=进入映象2块中的字符偏移量
BL=映射2中装载的块
BH=每个字符式样的字节数

我用QBASIC写能通过,但在TC下就得不到想要的结果!
不知是哪里错了!由于小弟我才开始学C,请大虾们指点一二!

小弟在TC2.0下的程序如下:

#include <dos.h>
#include <stdio.h>

char font[]
={1,1,2,4,8,16,47,193,1,31,1,17,9,5,127,0,0,0,128,
64,32,80,238,4,0,240,0,16,32,72,252,0,1,6,24,239,
1,31,5,63,16,40,124,147,124,16,84,254,0,192,48,238
,0,240,64,248,16,40,124,146,124,16,84,254};

main()
{
union REGS regs;
struct SREGS segregs;
regs.x.ax = 0x1100;regs.x.bx = 0x1010;
regs.x.cx = 4;regs.x.dx = 192;
segregs.es = FP_SEG(font);
segregs.ds = FP_OFF(font);
int86x(0x10,®s,®s,&segregs);
printf("%c%c%c%c",192,193,194,195);
}
...全文
244 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
holyfire 2001-06-11
  • 打赏
  • 举报
回复
regs.x.bp = FP_OFF(font);
主要是这里但是普通的中断函数不能操作bp,而且tc不支持内嵌汇编,只好麻烦一点了

结果是两个汉字金什么来着,呵呵,拼音不行啊。
holyfire 2001-06-11
  • 打赏
  • 举报
回复
//文件int10.h
#ifndef _INT10_H_
#define _INT10_H_

union myregs{
struct WREGS{
unsigned short ax,bx,cx,dx,bp,di,es;
}x;
struct BREGS{
unsigned char al,ah,bl,bh,cl,ch,dl,dh;
}h;
};

void far int10( union myregs far * reg );
#endif

//文件int10.asm
.model small
.code
public _int10

_int10 proc far
push bp
mov bp,sp
push si
push di
push ds
lds si,[bp]+6

mov ax,[si]+0
mov bx,[si]+2
mov cx,[si]+4
mov dx,[si]+6
mov bp,[si]+8
mov di,[si]+10
mov es,[si]+12

push si
int 10h
pop si

mov [si],ax
mov [si]+2,bx
mov [si]+4,cx
mov [si]+6,dx
mov [si]+8,bp
mov [si]+10,di
mov [si]+12,es

pop ds
pop di
pop si
pop bp

retf
_int10 endp

end

//文件char.c
#include "int10.h"
#include <dos.h>
#include <stdio.h>

char font[]={
1,1,2,4,8,16,47,193,1,31,1,17,9,5,127,0,
0,0,128,64,32,80,238,4,0,240,0,16,32,72,252,0,
1,6,24,239,1,31,5,63,16,40,124,147,124,16,84,254,
0,192,48,238,0,240,64,248,16,40,124,146,124,16,84,254
};

void main()
{
union myregs regs;
regs.x.ax = 0x1100;
regs.x.bx = 0x1010;
regs.x.cx = 4;
regs.x.dx = 192;
regs.x.es = FP_SEG(font);
regs.x.bp = FP_OFF(font);
int10(®s);
printf("%c%c%c%c",192,193,194,195);
}


用TASM编译int10.asm
tasm/ml int10.asm
tlib int10.lib+int10.obj
生成一个int10.prj
加入
char.c
int10.lib
编译运行

我已经做好寄给你了。
csdyb 2001-06-10
  • 打赏
  • 举报
回复
segregs.es = FP_SEG(font);
segregs.ds = FP_OFF(font);
错了!
SCUM 2000-07-08
  • 打赏
  • 举报
回复
!
one_add_one 2000-07-07
  • 打赏
  • 举报
回复
是否能给我一个完整的原程序?
谢谢!
qutemouse 2000-07-04
  • 打赏
  • 举报
回复
补充:
好象你的int86x()的使用有问题!请查看TC20的帮助!
qutemouse 2000-07-04
  • 打赏
  • 举报
回复
#include <dos.h>
#include <stdio.h>

char font[]
={1,1,2,4,8,16,47,193,1,31,1,17,9,5,127,0,
0,0,128,64,32,80,238,4,0,240,0,16,32,72,252,0,
1,6,24,239,1,31,5,63,16,40,124,147,124,16,84,254,
0,192,48,238,0,240,64,248,16,40,124,146,124,16,84,254};

main()
{
union REGS regs;
struct SREGS segregs;
regs.x.ax = 0x1100;regs.x.bx = 0x1010;
regs.x.cx = 4;regs.x.dx = 192;
segregs.es = FP_SEG(font);
segregs.ds = FP_OFF(font); /* ERROR! */
int86x(0x10,®s,®s,&segregs);
printf("%c%c%c%c",192,193,194,195);
}
注意是ES:BP指向FONT数组
你的程序中哪里把FONT的地址偏移赋值给BP了?

one_add_one 2000-06-30
  • 打赏
  • 举报
回复
谁能帮帮我?
用于windows下面的vim编辑器。 给喜欢vim的人使用。详细如下: 好吧,详细点,这里写出一些基本的命令: 【什么是vi】 vi就是linux命令行下的最著名的编辑器之一,(编辑器就是类似windows记事本的功能,不过vi功能比记事本强大无限倍!^_^),现在实际使用的都是vim,它是vi的改进版本,所以现在的vi基本上就是vim了。 【vi能做什么】 第一个功能不用多说,vi可以编辑文本文件。至于其他的功能,多得无法列举,我只说我所知的一些典型的功能应用: (1)编辑文本文件 (2)方便地阅读程序源代码 (3)当文件目录浏览器来用 (4)提供编程、调试环境 (5)利用vi执行一些脚本文件(vi有自己的脚本文件语法) (x)等等等等...... 【vi的操作模式】   vi具有两种基本模式,为输入模式(或插入模式、编辑模式)和指令模式(或命令模式)。输入模式下输入字符文本就会显示在屏幕上;而指令模式下输入字符就解释为一个输入命令并执行,而不会显示相应的字符。理解指令模式最简单方式就是想象平时剪切、复制以及粘贴数据时所发生的情况。 使用[Esc]键可以停止当前操作(插入或者命令)重新回到指令模式,准备接受新的指令。如果本来就在指令模式下面,将会响铃一下。 【最基本的使用】 这里提供了使用vi得最基本的操作,能够实现大多数的编辑目的。如果你肯花几分钟把“最基本的使用”的内容都实践一下,那么你至少可以独立地在vim中朝你想要得方向“前进”了。如果你不想学习,那么就把它当作一个“字典”吧。 *用vi打开一个文件: 输入“vi filename”. 这里,filename就是你要打开的文件的名字,默认打开文件后vi处于指令模式。 *进入编辑模式编辑打开的文件: 输入“i”. 或输入“a”. 进入编辑模式后,你可以直接敲入想要输入的字符到文件,两者的区别是i在当前字符前面开始插入,a在当前字符后面开始插入。 *退出编辑模式: 输入“[Esc]”. 这样,将返回指令模式,准备接收你要传达给vi的指令并执行,如果之前已经在指令模式下,那么系统将响铃提醒一下。 **以下命令都是在命令模式下进行: *撤销修改: 输入“u”. 这里,相比以前的vi来说,vim支持多步撤销。 *恢复修改: 输入“[Ctrl]r”. 这里,和撤销命令相反,是撤销的撤销,也可多步。 *复制行到剪切板: 输入“yy”. *复制选定内容到剪切板: (1)输入“v”。 (2)按方向键将高亮选择的内容。 (3)输入“y”。 这里,开始输入v使vi临时进入了一个"选择模式",输入方向键可以选择,输入y将选择的内容复制剪切板。 *删除行: 输入“dd”. 注意,vi的删除等价于剪切,删除的内容会保存到剪切板中。 *删除选定内容: (1)输入“v”。 (2)按方向键将高亮选择的内容。 (3)输入“d”。 这里,开始输入v使vi临时进入了一个“选择模式”,输入方向键可以选择,输入d将选择的内容删除。 *粘贴: 输入“p”. 这样会将剪切板的内容粘贴到光标位置或者光标下一行。 *查找字符并定位到第一个匹配处: 输入“/character”. 这里character是待查找的字符,只要先输入/,再输入待查字符,最后回车即可定位到第一个匹配的字符处。 *定位到匹配查找的下一个字符处: 输入“n”. *定位到匹配查找的上一个字符处: 输入“N”. *保存文件: 输入“:w”. 注意w前面的':',输入':'之后,vim会将':'之后的输入解释为待执行的指令。 *退出: 输入“:q”. 这里,如果文件没有保存,将提示无法退出,除非你强制退出,不保存文件,或者保存退出。 *强制退出: 输入“:q!”. *保存退出: 输入“:wq”. 或输入“ZZ”. *察看帮助 输入":help". ** 另外还有一个简易的教程: 输入命令:vimtutor.

69,371

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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