Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Программирование знакогенератора(11h прерывание) на Borland C++

44K
08 января 2009 года
NamelessEndless
3 / / 08.01.2009
Пишу лабораторную по програмированию знакогенератора при помощи прерывния 11h. В общем, немного я запуталась. Задание такое : Разработать собственные образы символов, размером 8х8, для "2","3","4" и "Н". Записать их как последовательность 16-х цыфр. Занести в массивы. Вывести на экран любой текст, содержащий эти символы. Загрузить в таблицу знакогенератора №1 стандартный набор изображений символов, соответственно размером 8х8 . Изменить в этой таблице стандартные символы на пользовательские, использовав для этого подфункцию 0h. Сделать таблицу с изменеными символами активной, при этом экранные изображения символв должны изменится на разработанные. При завершении работы программы обязательно возобновить стандартную нулевую таблицу. Можно использовать только int86(), int86x().
Вот часть кода, что уже сделала. В общем, идет только вывод текста на экран.
Код:
#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');
  }

Обьясните пожалуйста, почему не идет изменение размера символов на 8х8 и замена их разработанными образами. И еще: как переписать функцию ChangeSymbol под int86(). Не могу разобраться с регистрами...

Помогите пожалуйста, или обьясните, катастрофически не успеваю. Также буду благодарна, если подскажет литературу по этому.
1.6K
09 января 2009 года
Vov4ick
476 / / 01.02.2007
Литаратура:
Методичка по лабораторным работам ;-) Кстати, пробовала читать?
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 режим
}

От вызова intr избавиться просто так нельзя, ибо функция загрузки знакогенератора принимает адрес в регистре bp, который функция int86 не загружает.
44K
10 января 2009 года
NamelessEndless
3 / / 08.01.2009
Vov4ick, спасибо :)
А на счет методичок, то у нас с этим дело неважное. Единственная, которую дали - по 33-му прерыванию..А так только конспект и милое предложение "ищите дальше сами".
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог