#include <stdlib.h>
#include <stdio.h>
#include <conio.h>
#include <graphics.h>
#include <dos.h>
void ChangeSymbol(int , unsigned char *);
void OutText (char * , int);
void SetActiveTable (int ntab);
void Set88 (int ntab);
void main () {
int numb_col[]={10,12,9};
char txt1[]="234H LIFE IS GOOD 234H";
char txt2[]="12345H 23456H 34567H";
char txt3[]="223344HH TRY TO CATCH ME!";
unsigned char two[]={0x66,0xff,0xff,0xff,
0x7e,0x3e,0x1c,0x08};
unsigned char three[]={0x18,0x3c,0x7e,0xff,
0xff,0x7e,0x3c,0x18};
unsigned char four[]={0x18,0x3c,0x7e,0xff,
0xff,0x66,0x18,0x3c};
unsigned char ch_H[]={0x3c,0x99,0xff,0xff,
0x99,0x18,0x18,0x3c};
clrscr();
SetActiveTable(1);
Set88(1);
OutText(txt1,numb_col[0]);
OutText(txt2,numb_col[1]);
OutText(txt3,numb_col[2]);
ChangeSymbol(1, two);
getchar();
SetActiveTable(0);
getch();
}
void ChangeSymbol(int ntab, unsigned char *newsmb)
{ struct REGPACK rp;
rp.r_ax=0x1100;
rp.r_bx=8<<8|ntab;
rp.r_cx=1;
rp.r_dx='2';
rp.r_es=FP_SEG(newsmb);
rp.r_bp=FP_OFF(newsmb);
intr(0x10,&rp);
}
void Set88 (int ntab)
{ union REGS rg;
rg.h.ah=0x11;
rg.h.al=0x12;
rg.h.bl=ntab;
int86(0x11,&rg,&rg);
}
void SetActiveTable (int ntab)
{ union REGS rg;
rg.h.al=0x1103;
rg.h.bl=ntab|ntab<<2;
int86(0x10,&rg,&rg);
}
void OutText (char * text, int col)
{ char *ps=text;
int cl=col;
while(*ps!='\0') {
textcolor(cl);
putch(*ps++);
}
putch('\r');
putch('\n');
}
Программирование знакогенератора(11h прерывание) на Borland C++
Вот часть кода, что уже сделала. В общем, идет только вывод текста на экран.
Код:
Обьясните пожалуйста, почему не идет изменение размера символов на 8х8 и замена их разработанными образами. И еще: как переписать функцию ChangeSymbol под int86(). Не могу разобраться с регистрами...
Помогите пожалуйста, или обьясните, катастрофически не успеваю. Также буду благодарна, если подскажет литературу по этому.
Методичка по лабораторным работам ;-) Кстати, пробовала читать?
Borland C on-line help
Ralph Brown interrupt list
Попробую помочь
Примерно так
Код:
#include <stdio.h>
#include <conio.h>
#include <dos.h>
void SetVideomode (unsigned char mode)
{
union REGS rg;
rg.h.al=mode;
rg.h.ah=0;
int86(0x10,&rg,&rg);
}
void SetVGAResolution (unsigned char res)
{
union REGS rg;
if (res!=0 && res!=1 && res!=2) return;
rg.h.al=res; // Число строк: 0=200 1=350 2=400
rg.h.ah=0x12; // Номер подф-ции
rg.h.bl=0x30; // Номер подф-ции
int86(0x10,&rg,&rg);
}
void LoadChargen8x8 ( unsigned short char *fontab,
unsigned short int count,
unsigned short int firstsym)
{
struct REGPACK rg;
rg.r_ax=0x1100; // Номер ф-ции
rg.r_bp=FP_OFF(fontab); // Смещение таблицы шрифта
rg.r_bx=0x0800; // Режим
rg.r_cx=count; // Число символов
rg.r_dx=firstsym; // Начальный символ
rg.r_es=FP_SEG(fontab); // Сегмент таблицы шрифта
intr(0x10,&rg);
}
char txt1[]="234H LIFE IS GOOD 234H";
char txt2[]="12345H 23456H 34567H";
char txt3[]="223344HH TRY TO CATCH ME!";
unsigned char group234[]={
0x00,0x38,0x08,0x38,0x20,0x38,0x00,0x00, // 2
0x00,0x38,0x08,0x38,0x08,0x38,0x00,0x00, // 3
0x00,0x28,0x28,0x38,0x08,0x08,0x00,0x00}; // 4
unsigned char grouph[]={
0x00,0x28,0x28,0x38,0x28,0x28,0x00,0x00}; // H
void main () {
SetVideomode(3); // Начальная установка 80x25x16
puts(txt1);
puts(txt2);
puts(txt3);
getch(); // 3 режим
SetVGAResolution(0); // 8x8 шрифт
SetVideomode(0x83);
getch(); // Режим 80x25
LoadChargen8x8(group234,3,'2');
LoadChargen8x8(grouph,1,'H');
getch(); // Знакогенератор изменен
SetVGAResolution(2); // vga шрифт
SetVideomode(0x83);
getch(); // 3 режим
}
#include <conio.h>
#include <dos.h>
void SetVideomode (unsigned char mode)
{
union REGS rg;
rg.h.al=mode;
rg.h.ah=0;
int86(0x10,&rg,&rg);
}
void SetVGAResolution (unsigned char res)
{
union REGS rg;
if (res!=0 && res!=1 && res!=2) return;
rg.h.al=res; // Число строк: 0=200 1=350 2=400
rg.h.ah=0x12; // Номер подф-ции
rg.h.bl=0x30; // Номер подф-ции
int86(0x10,&rg,&rg);
}
void LoadChargen8x8 ( unsigned short char *fontab,
unsigned short int count,
unsigned short int firstsym)
{
struct REGPACK rg;
rg.r_ax=0x1100; // Номер ф-ции
rg.r_bp=FP_OFF(fontab); // Смещение таблицы шрифта
rg.r_bx=0x0800; // Режим
rg.r_cx=count; // Число символов
rg.r_dx=firstsym; // Начальный символ
rg.r_es=FP_SEG(fontab); // Сегмент таблицы шрифта
intr(0x10,&rg);
}
char txt1[]="234H LIFE IS GOOD 234H";
char txt2[]="12345H 23456H 34567H";
char txt3[]="223344HH TRY TO CATCH ME!";
unsigned char group234[]={
0x00,0x38,0x08,0x38,0x20,0x38,0x00,0x00, // 2
0x00,0x38,0x08,0x38,0x08,0x38,0x00,0x00, // 3
0x00,0x28,0x28,0x38,0x08,0x08,0x00,0x00}; // 4
unsigned char grouph[]={
0x00,0x28,0x28,0x38,0x28,0x28,0x00,0x00}; // H
void main () {
SetVideomode(3); // Начальная установка 80x25x16
puts(txt1);
puts(txt2);
puts(txt3);
getch(); // 3 режим
SetVGAResolution(0); // 8x8 шрифт
SetVideomode(0x83);
getch(); // Режим 80x25
LoadChargen8x8(group234,3,'2');
LoadChargen8x8(grouph,1,'H');
getch(); // Знакогенератор изменен
SetVGAResolution(2); // vga шрифт
SetVideomode(0x83);
getch(); // 3 режим
}
От вызова intr избавиться просто так нельзя, ибо функция загрузки знакогенератора принимает адрес в регистре bp, который функция int86 не загружает.
А на счет методичок, то у нас с этим дело неважное. Единственная, которую дали - по 33-му прерыванию..А так только конспект и милое предложение "ищите дальше сами".