home *** CD-ROM | disk | FTP | other *** search
/ FreeWare Collection 2 / FreeSoftwareCollection2pd199x-jp.img / inu / inu.c next >
Text File  |  1990-06-14  |  4KB  |  219 lines

  1. #include <stdlib.h>
  2. #include <stdio.h>
  3. #include <dos.h>
  4.  
  5. #pragma check_stack(off)
  6.  
  7. void(interrupt far *int40org)();
  8. void(interrupt far *int95org)();
  9.  
  10. static unsigned char inupat[2048];
  11. static unsigned char sav[512];
  12. static int xmin,xmax,xx,yy,sx,sy,speed;
  13.  
  14.  
  15. void vramsav(x,y)
  16.     int x,y;
  17.     {
  18.     char far *vram;
  19.     int cx,cy,cp;
  20.     
  21.     vram=(char far *)0xc0000000L;
  22.     for(cp=0;cp<4;cp++)
  23.         {
  24.         outp(0xff81,(cp << 6));
  25.         for(cy=0;cy<32;cy++)
  26.             for(cx=0;cx<4;cx++)
  27.                 sav[cp*128+cy*4+cx] = *(vram+(cx+x)+0x80*(cy+y));    
  28.         }
  29.     }
  30.         
  31. void vramset(x,y,pat)
  32.     int x,y,pat;
  33.     {
  34.     char far *vram;
  35.     int cx,cy,cp;
  36.     unsigned char vdata;
  37.     
  38.     vram=(char far *)0xc0000000L;
  39.     
  40.     for(cp=0;cp<4;cp++)
  41.         {
  42.         outp(0xff81,(1 << cp)+(cp <<6));
  43.         for(cy=0;cy<32;cy++)
  44.             for(cx=0;cx<4;cx++)
  45.                 {
  46.                 vdata = *(vram+(cx+x)+0x80*(cy+y));    
  47.                 *(vram+(cx+x)+0x80*(cy+y))=((~inupat[pat*128+cy*4+cx]) & vdata) ;
  48.                 }
  49.             }
  50.     }
  51.  
  52. void vramret(x,y)
  53.     int x,y;
  54.     {
  55.     char far *vram;
  56.     int cx,cy,cp;
  57.     
  58.     vram=(char far *)0xc0000000L;
  59.     for(cp=0;cp<4;cp++)
  60.         {
  61.         outp(0xff81,(1 << cp));
  62.         for(cy=0;cy<32;cy++)
  63.             for(cx=0;cx<4;cx++)
  64.                 *(vram+(cx+x)+0x80*(cy+y)) = sav[cp*128+cy*4+cx];    
  65.         }
  66.     }
  67.  
  68.                  
  69. void interrupt far int40hook()
  70. {
  71. static int pat=0,vx=1,vpat=1;
  72. static char cond=0;
  73. static int a=-1;
  74.  
  75. a++;
  76. if((a % speed)!=0)    _chain_intr(int40org);
  77. if(a==1024) a=0;
  78. if(a==0) {
  79.     cond=0;
  80.     pat=0;
  81.     }
  82.     
  83. if(a==256) {
  84.     cond=1;
  85.     if(vx>0) pat=8;
  86.         else   pat=12;
  87.     }
  88.     
  89.  
  90.  
  91. switch(cond)
  92.     {
  93.     case 0: /* 静止 */
  94.         pat++;
  95.         if(pat==8) pat=0;
  96.         break;
  97.         
  98.  
  99.     case 1: /* 歩き */
  100.         pat=pat+vpat;
  101.         if((vx>0) && ((pat==7) || (pat==12))) {
  102.             vpat=-vpat;
  103.             pat=pat+vpat;
  104.             }
  105.         if((vx<0) && ((pat==11) || (pat==16))) {    
  106.             vpat=-vpat;
  107.             pat=pat+vpat;
  108.             }
  109.         xx=xx+vx;
  110.         if((xx==xmin) | (xx==xmax)) {
  111.             vx=-vx;
  112.             if(vx>0) pat=8;
  113.             else pat=12;
  114.             }
  115.         break;
  116.     }
  117.     vramret(sx,sy);
  118.     sx=xx;
  119.     sy=yy;
  120.     
  121.     vramsav(xx,yy);
  122.     vramset(xx,yy,pat);
  123.  
  124.     _chain_intr(int40org);
  125.     
  126. }
  127.  
  128.  
  129. char *title="PUPPY in TOWNS MENU !!";
  130.  
  131.  
  132. long adrsdiff;
  133. #define Access(t,p)(*(t far *)((long)(char far *)&p - adrsdiff))
  134.  
  135.  
  136. int main(int ac,char*av[])
  137. {
  138.     int keepsiz;
  139.     extern end;
  140.     FILE *fp;
  141.     int c,c1;
  142.     
  143.     cputs(title);
  144.     if(ac==1) {
  145.  
  146.  
  147.     /* help */
  148.  
  149.     printf("\n\n");
  150.     printf("[使用方法]\n");
  151.     printf("inu [アイコンファイル名] [アニメーションパターンの最初のデータの順序]\n");
  152.     printf("        [X1(0-79)] [X2(0-79)] [Y(0-239)] [speed(1-8)]\n");
  153.     printf("\n\n");
  154.     printf("これをTOWNS-MENU上で実行すると、X1とX2の範囲をアイコンがうろうろ\n");
  155.     printf("動きます。\n");
  156.     printf("常駐中にもう一度実行すると常駐解除します。\n");
  157.     printf("\n");
  158.     printf("[使用例]\n");
  159.     printf("inu \\tmenu.icn 32 40 76 56 5\n\n");
  160.     printf("                    ステゴ(NAC02027)\n");
  161.     }
  162.  
  163.  
  164.  
  165.  
  166.  
  167.  
  168.     int40org = _dos_getvect(0x40); /* INT 40のベクタ取得 */
  169.     adrsdiff = (long)int40hook - (long)int40org;
  170.     if (check_stay())
  171.         {
  172.         _dos_setvect(0x40,(void(interrupt far *)())Access(void far *,int40org));
  173.         printf("解除しました");
  174.         _dos_freemem(Access(unsigned,_psp));
  175.         }
  176.         else
  177.         {
  178.         if((fp=fopen(av[1],"rb"))==NULL) exit(-1);
  179.         fseek(fp,(long)(atoi(av[2])*256),SEEK_SET);
  180.         for(c=0;c<16;c++)
  181.             {
  182.             fread(inupat+c*128,128,1,fp);
  183.             fseek(fp,(long)128,SEEK_CUR);
  184.             }
  185.         fclose(fp);
  186.         xx=atoi(av[3]);
  187.         xmin=xx;
  188.         sx=xx;
  189.         xmax=atoi(av[4]);
  190.         yy=atoi(av[5]);
  191.         sy=yy;
  192.         speed=(1 << atoi(av[6]));
  193.         
  194.         vramsav(xx,yy);
  195.         
  196.         
  197.         _dos_freemem(*(unsigned far *)(((long)_psp <<16)|0x002c));
  198.         keepsiz = ((char huge *)&end - (char huge *)((long)_psp << 16)+15)/16;
  199.         _dos_setvect(0x40,int40hook);
  200.         printf("常駐しました");
  201.         _dos_keep(0,keepsiz);
  202.         }
  203.         return(0);
  204.     }
  205.  
  206. int check_stay()
  207.     {
  208.     register char *s,far *t;
  209.     
  210.     if (adrsdiff & 0xffff != 0) return(0);
  211.     
  212.     s=title;
  213.     t=(char far *)((long)(char far *)title - adrsdiff);
  214.  
  215.     while(*s){
  216.         if(*(s++)!=*(t++)) return(0);
  217.         }
  218.     return(1);
  219.     }