关于文本模式字符发生器

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);
}
...全文
245 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
  • 打赏
  • 举报
回复
谁能帮帮我?

69,372

社区成员

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

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