home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
FreeWare Collection 2
/
FreeSoftwareCollection2pd199x-jp.img
/
inu
/
inu.c
next >
Wrap
Text File
|
1990-06-14
|
4KB
|
219 lines
#include <stdlib.h>
#include <stdio.h>
#include <dos.h>
#pragma check_stack(off)
void(interrupt far *int40org)();
void(interrupt far *int95org)();
static unsigned char inupat[2048];
static unsigned char sav[512];
static int xmin,xmax,xx,yy,sx,sy,speed;
void vramsav(x,y)
int x,y;
{
char far *vram;
int cx,cy,cp;
vram=(char far *)0xc0000000L;
for(cp=0;cp<4;cp++)
{
outp(0xff81,(cp << 6));
for(cy=0;cy<32;cy++)
for(cx=0;cx<4;cx++)
sav[cp*128+cy*4+cx] = *(vram+(cx+x)+0x80*(cy+y));
}
}
void vramset(x,y,pat)
int x,y,pat;
{
char far *vram;
int cx,cy,cp;
unsigned char vdata;
vram=(char far *)0xc0000000L;
for(cp=0;cp<4;cp++)
{
outp(0xff81,(1 << cp)+(cp <<6));
for(cy=0;cy<32;cy++)
for(cx=0;cx<4;cx++)
{
vdata = *(vram+(cx+x)+0x80*(cy+y));
*(vram+(cx+x)+0x80*(cy+y))=((~inupat[pat*128+cy*4+cx]) & vdata) ;
}
}
}
void vramret(x,y)
int x,y;
{
char far *vram;
int cx,cy,cp;
vram=(char far *)0xc0000000L;
for(cp=0;cp<4;cp++)
{
outp(0xff81,(1 << cp));
for(cy=0;cy<32;cy++)
for(cx=0;cx<4;cx++)
*(vram+(cx+x)+0x80*(cy+y)) = sav[cp*128+cy*4+cx];
}
}
void interrupt far int40hook()
{
static int pat=0,vx=1,vpat=1;
static char cond=0;
static int a=-1;
a++;
if((a % speed)!=0) _chain_intr(int40org);
if(a==1024) a=0;
if(a==0) {
cond=0;
pat=0;
}
if(a==256) {
cond=1;
if(vx>0) pat=8;
else pat=12;
}
switch(cond)
{
case 0: /* 静止 */
pat++;
if(pat==8) pat=0;
break;
case 1: /* 歩き */
pat=pat+vpat;
if((vx>0) && ((pat==7) || (pat==12))) {
vpat=-vpat;
pat=pat+vpat;
}
if((vx<0) && ((pat==11) || (pat==16))) {
vpat=-vpat;
pat=pat+vpat;
}
xx=xx+vx;
if((xx==xmin) | (xx==xmax)) {
vx=-vx;
if(vx>0) pat=8;
else pat=12;
}
break;
}
vramret(sx,sy);
sx=xx;
sy=yy;
vramsav(xx,yy);
vramset(xx,yy,pat);
_chain_intr(int40org);
}
char *title="PUPPY in TOWNS MENU !!";
long adrsdiff;
#define Access(t,p)(*(t far *)((long)(char far *)&p - adrsdiff))
int main(int ac,char*av[])
{
int keepsiz;
extern end;
FILE *fp;
int c,c1;
cputs(title);
if(ac==1) {
/* help */
printf("\n\n");
printf("[使用方法]\n");
printf("inu [アイコンファイル名] [アニメーションパターンの最初のデータの順序]\n");
printf(" [X1(0-79)] [X2(0-79)] [Y(0-239)] [speed(1-8)]\n");
printf("\n\n");
printf("これをTOWNS-MENU上で実行すると、X1とX2の範囲をアイコンがうろうろ\n");
printf("動きます。\n");
printf("常駐中にもう一度実行すると常駐解除します。\n");
printf("\n");
printf("[使用例]\n");
printf("inu \\tmenu.icn 32 40 76 56 5\n\n");
printf(" ステゴ(NAC02027)\n");
}
int40org = _dos_getvect(0x40); /* INT 40のベクタ取得 */
adrsdiff = (long)int40hook - (long)int40org;
if (check_stay())
{
_dos_setvect(0x40,(void(interrupt far *)())Access(void far *,int40org));
printf("解除しました");
_dos_freemem(Access(unsigned,_psp));
}
else
{
if((fp=fopen(av[1],"rb"))==NULL) exit(-1);
fseek(fp,(long)(atoi(av[2])*256),SEEK_SET);
for(c=0;c<16;c++)
{
fread(inupat+c*128,128,1,fp);
fseek(fp,(long)128,SEEK_CUR);
}
fclose(fp);
xx=atoi(av[3]);
xmin=xx;
sx=xx;
xmax=atoi(av[4]);
yy=atoi(av[5]);
sy=yy;
speed=(1 << atoi(av[6]));
vramsav(xx,yy);
_dos_freemem(*(unsigned far *)(((long)_psp <<16)|0x002c));
keepsiz = ((char huge *)&end - (char huge *)((long)_psp << 16)+15)/16;
_dos_setvect(0x40,int40hook);
printf("常駐しました");
_dos_keep(0,keepsiz);
}
return(0);
}
int check_stay()
{
register char *s,far *t;
if (adrsdiff & 0xffff != 0) return(0);
s=title;
t=(char far *)((long)(char far *)title - adrsdiff);
while(*s){
if(*(s++)!=*(t++)) return(0);
}
return(1);
}