SecondReality/JPLOGO/JP.C
2017-09-24 01:45:36 +02:00

227 lines
3.3 KiB
C

#include <stdio.h>
#include <string.h>
#include "..\dis\dis.h"
FILE *f1;
#include "readp.c"
extern char pic[];
char *vram=(char *)0xa0000000L;
char rowdata1[200][186];
char rowdata2[200][186];
char *row[400];
char pal2[768];
char palette[768];
char rowbuf[640];
extern int sin1024[];
int framey1[200];
int framey2[200];
int framey1t[800];
int framey2t[800];
int lasty[400];
int lasts[400];
void scrolly(int y)
{
int a;
a=y*80;
_asm
{
mov dx,3d4h
mov al,0dh
mov ah,byte ptr a[0]
out dx,ax
mov dx,3d4h
mov al,0ch
mov ah,byte ptr a[1]
out dx,ax
}
}
char *shiftstatus=(char *)0x0417;
int waitb()
{
return(dis_waitb());
}
int calc(int y,int c)
{
_asm
{
mov ax,y
sub ax,400
add ax,c
mov dx,400
imul dx
mov cx,c
idiv cx
}
}
void doit(void)
{
int frame=0,halt=0,storea=0,ysb=0;
int a,b,c,y,ysz,ysza,xsc,spd=10,la,y1,y2;
while(!dis_exit() && dis_musplus()<4);
while(!dis_exit() && frame<700)
{
if(*shiftstatus&16) setborder(0);
c=waitb();
if(*shiftstatus&16) setborder(127);
frame+=c;
if(frame>511) c=400;
else
{
y1=framey1t[frame]/16;
y2=framey2t[frame]/16;
}
xsc=(400-(y2-y1))/8;
for(y=0;y<400;y++)
{
if(y<y1 || y>=y2)
{
linezoom(vram+y*80,NULL,0);
}
else
{
b=(long)(y-y1)*400L/(long)(y2-y1);
a=184+(sin1024[b*32/25]*xsc+32)/64;
a&=~1;
if(lasty[y]!=b || lasts[y]!=a)
{
linezoom(vram+y*80,row[b],a);
lasty[y]=b;
lasts[y]=a;
}
}
}
}
}
main()
{
int frame,halt=0,storea=0;
int a,b,c,d,y,ya,ysz,ysza,xsc,spd=10,la;
int y1,y2,y1a,y2a,ly1a,mika;
dis_partstart();
for(a=0;a<200;a++) row[a]=rowdata1[a];
for(a=0;a<200;a++) row[a+200]=rowdata2[a];
frame=0;
ysz=400*16; ysza=-460/6;
y=0;
y1=0; y1a=500;
y2=399*16; y2a=500;
mika=1;
for(frame=0;frame<200;frame++)
{
if(!halt)
{
y1+=y1a;
y2+=y2a;
y2a+=16;
if(y2>400*16)
{
y2-=y2a;
y2a=-y2a*mika/8;
if(mika<4) mika+=3;
}
y1a+=16;
la=a;
a=(y2-y1)-400*16;
if((a&0x8000)^(la&0x8000))
{
y1a=y1a*7/8;
}
y1a+=a/8;
y2a-=a/8;
}
if(frame>90)
{
if(y2>=399*16)
{
y2=400*16;
halt=1;
}
else y2a=8;
y1=y2-400*16;
}
framey1[frame]=y1;
framey2[frame]=y2;
}
for(a=0;a<800;a++)
{
b=a/4;
c=a&3;
d=3-c;
framey1t[a]=(framey1[b]*d+framey1[b+1]*c)/3;
framey2t[a]=(framey2[b]*d+framey2[b+1]*c)/3;
}
_asm mov ax,13h
_asm int 10h
inittwk();
_asm
{
mov dx,3c0h
mov al,11h
out dx,al
mov al,255
out dx,al
mov al,20h
out dx,al
}
readp(palette,-1,pic);
palette[64*3+0]=0;
palette[64*3+1]=0;
palette[64*3+2]=0;
for(y=0;y<400;y++)
{
readp(rowbuf,y,pic);
memcpy(row[y],rowbuf+70,184);
row[y][184]=65;
}
setpalarea(palette,0,256);
for(a=0;a<400;a++)
{
for(b=0;b<184;b++) if(row[a][b]==0) row[a][b]=64;
}
for(y=0;y<400;y++) lasty[y]=lasts[y]=-1;
dis_waitb();
scrolly(400);
dis_waitb();
for(y=0;y<400;y++)
{
linezoom(vram+y*80,row[y],184);
}
a=64; y=400*64;
while(y>0)
{
y-=a;
a+=6;
if(y<0) y=0;
scrolly(y/64);
dis_waitb();
}
storea=a;
dis_waitb();
doit();
//_asm mov ax,3
//_asm int 10h
//printf("%i\n",storea);
return(0);
}