#include "complex.h" void fgstr(word_s,word_s,word_s,char *); void setfont(word_s); void freefont(void); unsigned char w_rv; unsigned char w_rg; unsigned char w_r; unsigned char w_d; unsigned char * w_im; typedef struct { word_s kol; long eofs; struct { unsigned char nazv[12]; unsigned char rv; unsigned char rg; long nsm; } fon[]; } tit; tit *pff; word_s font_yes=0; /*--------------------------------------------------------------------*/ #if (FONT==1) void fgstr(word_s c,word_s x,word_s y,char *str) /* для шpифта 8 х 10 */ { word_s k,i,m,n,p; unsigned char *pc,*p0,*p1; volatile unsigned char s; pc=(char*)(0xa0000L+(long)((y<<6)+(y<<4))+(long)(x>>3)); /* y*80+x/8 */ n=x&7; if(n) p=8-n; outp(0x3ce,8); /* 8 - это индекс pегистpа маски битов (обpащ. по 0x3CF) */ outp(0x3c4,2); /* 2 - это индекс pегистpа маски каpт (обpащ. по 0x3C5) */ k=0; while(str[k]) { p0=pc; m=str[k]*10; for(i=0; i<10; i++,m++,p0+=80) { s=*p0; /* чтение в задвижки */ outp(0x3cf,n?im[m]>>n:im[m]); /* маска битов */ outp(0x3c5,15); /* маска каpт - все */ *p0 = 0x00; /* чистка */ outp(0x3c5,c); /* маска каpт - цвет */ *p0 = 0xff; /* запись цвета */ if(n) { p1=p0+1; s=*p1; /* чтение в задвижки */ outp(0x3cf,im[m]<> 3; p0=pc+(x>>3); /* + x/8 */ n=x&7; p=8-n; for(i=0; i>((w_rg-d)>>1); */ a+=8; wc >>= n; outp(0x3cf,wc); /* маска битов */ outp(0x3c5,15); /* маска каpт - все */ *p0 = 0x00; /* чистка */ outp(0x3c5,c); /* маска каpт - цвет */ *p0++ = 0xff; /* запись цвета */ s=*p0; /* чтение в задвижки */ wc=*im; wc <<= p; outp(0x3cf,wc); /* маска битов */ outp(0x3c5,15); /* маска каpт - все */ *p0 = 0x00; /* чистка */ outp(0x3c5,c); /* маска каpт - цвет */ *p0 = 0xff; /* запись цвета */ } x+=d; /* x+=w_rg; */ } outp(0x3cf,0xff); /* восст.маски битов */ outp(0x3c5,15); /* маска каpт - все */ } #endif /*--------------------------------------------------------------------*/ void setfont(word_s f) { word_s fh; if(!font_yes) { if ((fh=sopen("dfon.ozu",O_BINARY|O_RDWR,SH_DENYNO)) == 0xFFFFFFFF) { _setvideomode(_TEXTC80); fprintf(stderr, "Не могу открыть файл dfon.ozu.\n"); exit(3); } pff=(tit *)malloc((unsigned)filelength(fh)); if(pff==NULL) { printf("Мало памяти для шрифтов\n"); exit(3); } read(fh,pff,(unsigned)filelength(fh)); close(fh); font_yes=1; } w_rv=pff->fon[f].rv; w_rg=pff->fon[f].rg; w_im=(unsigned char *)pff+(unsigned)pff->fon[f].nsm; w_r=(w_rg+7) >> 3; w_d=w_rv*w_r+1; } /*--------------------------------------------------------------------*/ void freefont(void) { free(pff); } /*--------------------------------------------------------------------*/