// (c)2000 Wega(2:5055/141.10@FidoNet)
// (c)2000 Hard change by Din(2:5055/141.11@Fidonet)

#warning FALSE

:byte Font1Spr=FROM "font1.spr"; // Фонт №1 (10x11)
:byte Font2Spr=FROM "font2.spr"; // Фонт №2 (6x8)

byte FontTable[128]={
 0, 0, 0, 0, 0,   0, 0, 0, 0, 0,     0, 0, 0, 0, 0,   0, 0, 0, 0, 0, //20
 0, 0, 0, 0, 0,   0, 0, 0, 0, 0,     0, 0, 54,44,0,   0, 0, 0, 0, 0, //40
51,52, 0, 0,47,  48,46,53,32,33,    34,35,36,37,38,  39,40,41,49,50,  //60
 0, 0, 0,45, 0,   0, 1, 2, 3, 4,     5, 6, 7, 8, 9,  10,11,12,13,14,  //80
15,16,17,18,19,  20,21,22,23,24,    25, 0, 0, 0, 0,   0, 0, 0, 1, 2,  //100
 3, 4, 5, 6, 7,   8, 9,10,11,12,    13,14,15,16,17,  18,19,20,21,22, //120
23,24,25, 0, 0,   0, 0, 0}; //128

/*  Таблица кодировки встроеного фонта
╔══════╤═══════╤═══════╤═══════╤══════╗
║A 000 │ L 011 │ W 022 │ 1 033 │ ! 044║
║B 001 │ M 012 │ X 023 │ 2 034 │ ? 045║
║C 002 │ N 013 │ Y 024 │ 3 035 │ . 046║
║D 003 │ O 014 │ Z 025 │ 4 036 │ , 047║
║E 004 │ P 015 │   026 │ 5 037 │ - 048║
║F 005 │ Q 016 │   027 │ 6 038 │ : 049║
║G 006 │ R 017 │   028 │ 7 039 │ ; 050║
║H 007 │ S 018 │   029 │ 8 040 │ ( 051║
║I 008 │ T 019 │   030 │ 9 041 │ ) 052║
║J 009 │ U 020 │   031 │   042 │ / 053║
║K 010 │ V 021 │ 0 032 │   043 │   054║
╚══════╧═══════╧═══════╧═══════╧══════╝*/

// Вывод символа встроеным шрифтом №1
// Параметры: word x,y, byte <код символа>
:fastcall WriteCharFont1(BX,DX,CL)
{
 ECX=CL;ESI=FontTable[ECX]*110+#Font1Spr;
 EAX=DX*320+BX+VideoBuf;EDX=EAX;
 CL=11;
 loop(CL)
 {
  CH=10;
  loop(CH)
  {
   ESBYTE[EDX]=DSBYTE[ESI];
   ESI++;EDX++;
  }
  EDX+=310;
 }
}


// Вывод строки встроеным шрифтом №1
// Параметры: word x,y, dword <смещение строки>
:fastcall WriteStrFont1(BX,CX,ESI)
{
 do{
   $push BX,CX,ESI
   WriteCharFont1(BX,CX,byte DSBYTE[ESI]);
   $pop ESI,CX,BX
   ESI++;BX+=10;
 }while(DSBYTE[ESI]<>0);
}


// Вывод символа встроеным шрифтом №1 с учетом прозрачности
// Параметры: word x,y, byte <код символа>
:fastcall WriteTrCharFont1(BX,DX,CL)
{
 ECX=CL;ESI=FontTable[ECX]*110+#Font1Spr;
 EAX=DX*320+BX+VideoBuf;EDX=EAX;
 CL=11;
 loop(CL)
 {
  CH=10;
  loop(CH)
  {
   IF (DSBYTE[ESI]<>0) ESBYTE[EDX]=DSBYTE[ESI];
   ESI++;EDX++;
  }
  EDX+=310;
 }
}


// Вывод строки №1 встроеным шрифтом с учетом прозрачности
// Параметры: word x,y, dword <смещение строки>
:fastcall WriteTrStrFont1(BX,CX,ESI)
{
 do
 {
  $push BX,CX,ESI
  WriteTrCharFont1(BX,CX,DSBYTE[ESI]);
  $pop ESI,CX,BX
  ESI++;BX+=10;
 }while(DSBYTE[ESI]<>0);
}


// Вывод символа встроеным шрифтом №2
// Параметры: word x,y, byte <код символа>
:fastcall WriteCharFont2(BX,DX,CL)
{
 ECX=CL;ESI=FontTable[ECX]*48+#Font2Spr;
 EAX=DX*320+BX+VideoBuf;EDX=EAX;
 CL=8;
 loop(CL)
 {
  CH=6;
  loop(CH)
  {
   ESBYTE[EDX]=DSBYTE[ESI];
   ESI++;EDX++;
  }
  EDX+=314;
 }
}


// Вывод строки встроеным шрифтом №2
// Параметры: word x,y, dword <смещение строки>
:fastcall WriteStrFont2(BX,CX,ESI)
{
 do
 {
  $push BX,CX,ESI
  WriteCharFont2(BX,CX,DSBYTE[ESI]);
  $pop ESI,CX,BX
  ESI++;BX+=4;
 }while(DSBYTE[ESI]<>0);
}


// Вывод символа встроеным шрифтом №2 с учетом прозрачности
// Параметры: word x,y, byte <код символа>
:fastcall WriteTrCharFont2(BX,DX,CL)
{
 ECX=CL;ESI=FontTable[ECX]*48+#Font2Spr;
 EAX=DX*320+BX+VideoBuf;EDX=EAX;
 CL=8;
 loop(CL)
 {
  CH=6;
  loop(CH)
  {
   IF (DSBYTE[ESI]<>0) ESBYTE[EDX]=DSBYTE[ESI];
   ESI++;EDX++;
  }
  EDX+=314;
 }
}


// Вывод строки встроеным шрифтом №2 с учетом прозрачности
// Параметры: word x,y, dword <смещение строки>
:fastcall WriteTrStrFont2(BX,CX,ESI)
{
 do
 {
  $push BX,CX,ESI
  WriteTrCharFont2(BX,CX,DSBYTE[ESI]);
  $pop ESI,CX,BX
  ESI++;BX+=4;
 }while(DSBYTE[ESI]<>0);
}


// Вывод числа типа word встроеным шрифтом №1
// Параметры: word x,y, number
:WriteWordFont1(word x,y,n)
{
 AX=-1;$push AX
 do
 {
  AX=n%10;
  $push AX
  n=n/10;
 }while(n>0);
 do
 {
  $pop AX
  IF(AX!=-1)
  {
   $pushad
   WriteTrCharFont1(x,y,AL+'0');
   $popad
   x+=10;
  }
 }while(AX!=-1);
}


// Вывод числа типа word встроеным шрифтом №2
// Параметры: word x,y, number
:WriteWordFont2(word x,y,n)
{
 AX=-1;$push AX
 do
 {
  AX=n%10;
  $push AX
  n=n/10;
 }while(n>0);
 do
 {
  $pop AX
  IF(AX!=-1)
  {
   $pushad
   WriteTrCharFont2(x,y,AL+'0');
   $popad
   x+=4;
  }
 }while(AX!=-1);
}

:void fastcall WriteLongFont2(DX,BX,EAX)
 word x,y;
{
  x=DX; y=BX;
  IF (long EAX<0){
     $push EAX
      WriteCharFont2(word x,word y, byte '-');
     $pop EAX -EAX;
     x+=4;
  }

  ECX=10;

  loop(ECX){
    $push ECX
     EAX=EAX/10;
    $pop ECX
    $push DX
  }

 ECX=10;
 loop(){
   $pop AX
   IF (AL!=0)||(ECX==1) BREAK;
   ECX--;
 }
 $push AX
 loop(ECX){
   $pop AX
   $push ECX
    WriteCharFont2(word x,word y, byte AL+'0');
   $pop ECX
   x+=4;
 }
}
