home *** CD-ROM | disk | FTP | other *** search
/ The Party 1994: Try This At Home / disk_image.bin / source / chaos4k / 4k.c next >
C/C++ Source or Header  |  1994-11-27  |  18KB  |  907 lines

  1. #include <dos.h>
  2. #define codex
  3. #define CLI
  4. //#define INTR
  5.  
  6.  
  7. int _seg *a=(int _seg *)0xa000;
  8. //int stopped=0;
  9. #ifdef codex
  10. unsigned char *endtext="4kb Intro 'Chaos' (c) 1994\n\n\rCoding: Codex/Extend\n\n\rGreetings to: Future Crew, Silents, Virtual Visions, Paranoids.\n\n\r$";
  11. #endif
  12. #ifndef codex
  13. unsigned char *endtext="4kb Intro 'Chaos' (c) 1994\n\n\rAt Assembly'94, Helsinki\n\n\rGreetings to: Future Crew, Silents, Virtual Visions, Paranoids.\n\n\r$";
  14. #endif
  15.  
  16.  
  17. #define plot(x,y,color) *(char far *)( ((char _seg *)a)+320*(y)+(x))=(color)
  18. #define plota(as) *(char far *)((char _seg *)a+(as))^=0x80
  19. #define plotb(as,bit) *(char far *)((char _seg *)a+(as))=(bit)
  20. #define plot4(as) plota(as); plota(as+1); plota(as+321); plota(as+320);
  21. #define abs(x) ((x)<0?-(x):(x))
  22.  
  23. #define plots(x,y,color) *(char far *)( ((char _seg *)a)+320*(y)+(x))=(color)
  24. //void plotbc(int x,int y,int bit) { if ((y)>=0) if ((y)<=200) if ((x)>=0) if ((x)<=320) plots(x,y,bit); }
  25. //void plotc(int x,int y) { if ((y)>=0) if ((y)<=200) if ((x)>=0) if ((x)<=320) plota((x)+(y)*320); }
  26.  
  27. #define xmax 318
  28. #define xmin 0
  29.  
  30. int ymin=0,ymax=199;
  31. #define vari 0
  32. int mode=0,mode2=0,textplace;
  33. int stage=0,count=0,count1=0;
  34. //int ymin=0,ymax=199,xmax=318,xmin=0;
  35. int sin[1025];
  36. unsigned int linepattern=0xffff;
  37.  
  38. //unsigned int patterns[]=
  39. //{
  40. //0xffff,0xfffe,0xfefe,0xeeee,0xb6d3,0xaaaa,0x4924,0x1111,0x1010,0x1000,0,
  41. //0,0,0,0,0,0,0
  42. //};
  43.  
  44.  
  45. #define xp 1
  46. #define yp 2
  47. #define zp 4
  48. #define xm 8
  49. #define ym 16
  50. #define zm 32
  51. #define dr 64
  52. #define end_vec -1
  53. #define origo -2
  54. #define subitem -3
  55. #define displace -4
  56.  
  57. char vec1[]={            // cube
  58.     displace,0,xm+dr,ym+dr,xp+dr,yp+dr,
  59.     zm+dr,
  60.     xm+dr,ym+dr,xp+dr,yp+dr,
  61.     ym,zp+dr,
  62.     xm,zm+dr,
  63.     yp,zp+dr,end_vec
  64.  
  65.     };
  66. /*
  67. char vec2[]={            // trek
  68.  
  69.     0,
  70.     ym+xm+dr,
  71.     yp+dr,
  72.     ym+xm,
  73.     xm+dr,
  74.     xm+dr,
  75.     xp,
  76.     yp+dr,
  77.     yp+dr,
  78.     xp,xp,
  79.     ym+dr,
  80.     xp+dr,
  81.     xm,
  82.     xp+yp+dr,
  83.     xp+ym,
  84.     yp+dr,
  85.     xp+dr,
  86.     ym,
  87.     xm+dr,
  88.     ym+dr,
  89.     xp+dr,
  90.     xp,
  91.     yp+dr,
  92.     yp+dr,
  93.     xp,
  94.     xm+ym+dr,
  95.     xp+ym+dr,-1
  96. };
  97. */
  98. char vec2[]=
  99. {
  100.     0,
  101.     xm+dr,yp+dr,yp+dr,xm,ym+dr,ym+dr,yp,xm+dr,
  102.     yp,ym+dr,ym+dr,xm,xm+dr,yp+dr,yp+dr,xp+dr,
  103.     xp,xp,xp+ym,xp+dr,yp+dr,ym,ym+dr,
  104.     xp,yp+dr,yp+dr,xp+dr,ym+dr,ym+dr,xm+dr,xp,xp,
  105.     xp,xm+dr,yp+dr,xp+dr,yp+dr,xm+dr,end_vec
  106.  
  107. };
  108.  
  109.  
  110. /*
  111. char vec3[]={
  112.   displace,yp,
  113.   ym+dr,ym+dr,xm+dr,yp+dr,yp+dr,
  114.   xp+dr,xp+dr,xp+dr,
  115.  
  116.   //ym+dr,ym+dr,ym+dr,yp,yp,yp,
  117.  
  118.   zm+dr,zm+dr,
  119.  
  120.   //ym+dr,ym+dr,ym+dr,yp,yp,yp,
  121.  
  122.   xm+dr,xm+dr,xm+dr,xm+dr,xm+dr,
  123.  
  124.   //ym+dr,ym+dr,ym+dr,yp,yp,yp,
  125.  
  126.   zp+dr,zp+dr,
  127.  
  128.   //ym+dr,ym+dr,ym+dr,yp,yp,yp,
  129.  
  130.   xp+dr,xp+dr,
  131.  
  132.   ym,ym,ym,
  133.   xp+dr,xp+dr,xp+dr,
  134.   ym+zm+dr,yp+zm+dr,
  135.   xm+dr,xm+dr,xm+dr,xm+dr,xm+dr,
  136.   zp+ym+dr,zp+yp+dr,
  137.   xp+dr,xp+dr,
  138.   xm+zm+ym,xm,
  139.   xp+dr,xp+dr,xp+dr,xp+dr,xp+dr,
  140.  
  141.   yp,yp+zm+xm,xm+dr,yp+dr,xp+dr,ym+dr,
  142.   xm,xm,
  143.   xm+dr,yp+dr,xp+dr,ym+dr,
  144.   end_vec
  145. };
  146. */
  147. char *vec[]={vec1,vec2};
  148.  
  149. #undef xp 1
  150. #undef yp 2
  151. #undef zp 4
  152. #undef xm 8
  153. #undef ym 16
  154. #undef zm 32
  155. #undef dr 64
  156. // number= new picture +waittime
  157. // -1, wait, repeat = moving blocks
  158. // -2, num= change ashift
  159. // -3, wait = STARS!!! needs blank screen
  160. // -4, ystart,yend=linecut
  161. // -5, ystart,yend = horiz-eor-line
  162. // -6, colornum(0/1/2), colorset(0=0x0000,1=0xffff,2=random)
  163. // -7, wait  = simple wait
  164. // -8, palette = vaihda paletti
  165. // -9, WAIT = LINETUNNEL
  166. // -10,wait,object num,xspeed+yspeed*256 = vectorlines
  167. // -11,ystart,yend = move vector y-coord...
  168. // -12,xstart,xend = move vector x-coord...
  169. // -15,xspeed+yspeed*256 = vector rotation control
  170. #define f_vector -10
  171. #define f_vecspeed -15
  172. #define f_hline -5
  173. #define f_ltunnel -9
  174. #define f_block -1
  175. #define f_end 0
  176. #define f_x -12
  177. #define f_y -11
  178. #define f_z -13
  179. #define f_maxy -3
  180. #define f_linecut -4
  181. #define f_wait -7
  182. #define f_cont -14
  183. #define f_ashift -2
  184. #define f_endblock -6
  185. #define f_sinscroll -8
  186.  
  187. #define ZMIN 2
  188. #define shift  (7)
  189. #define zshift (9)
  190. #define cosadd (256) //196
  191.  
  192. int frames[]={
  193.  
  194. f_hline,0,199,
  195. f_wait,200,
  196.  
  197. f_sinscroll,
  198. f_wait,687,
  199. f_sinscroll,
  200.  
  201.  
  202. f_ashift,2,
  203. f_x,-30,160,
  204. f_y,0,0,
  205. f_z,1500,200,
  206. f_cont,1000,
  207. f_vector,1200,1,(5+0*256),   // chaos-text
  208. f_y,0,350,
  209.  
  210. f_ashift,1,
  211.  
  212. f_x,-100,520,
  213. f_y,100,100,
  214. f_z,60,60, // 50,50,
  215.  
  216. f_vector,620,0,(5+3*256),   // cube
  217.  
  218. f_sinscroll,
  219. f_wait,520,
  220. f_sinscroll,
  221.  
  222. //f_ashift,2,
  223.  
  224. //f_x,160,160,
  225. //f_y,-70,100,
  226. //f_z,150,150, // 50,50,
  227. //f_cont,500,
  228. //f_vector,800,2,(4+0*256),   // house
  229. //f_x,160,480,
  230.  
  231. //f_wait,100,
  232.  
  233.  
  234. f_x,160,160,
  235. f_y,100,100,
  236. f_linecut,100,0,
  237. f_wait,1,
  238. f_cont,250,
  239. f_ltunnel,350,
  240. f_linecut,0,100,
  241.  
  242. f_block,2,60,
  243.  
  244. f_wait,1550,
  245. f_endblock,
  246. f_hline,199,0,
  247.  
  248. f_wait,250,
  249. f_end
  250. };
  251.  
  252.  
  253.  
  254. #define cut(dd,do,dist) ((do)*(dist)/(dd))
  255.  
  256.  
  257. void line(int x1,int y1,int x2,int y2)
  258. {
  259. int i,deltax,deltay,numpixels,d,dinc1,dinc2,c,xinc1,xinc2,y,yinc1,yinc2,scr;
  260. int ainc1,ainc2,scr1,num1;
  261.  
  262. next:
  263. if (y1<ymin && y2<ymin) return;
  264. if (y1>ymax && y2>ymax) return;
  265. if (x1>xmax && x2>xmax) return;
  266. if (x1<xmin && x2<xmin) return;
  267.  
  268. if (x2<xmin)
  269. {
  270. y2=y1-cut(x1-x2,y1-y2,x1-xmin); x2=xmin; goto next;
  271. }
  272. if (y2<ymin)
  273. {
  274. x2=x1-cut(y1-y2,x1-x2,y1-ymin); y2=ymin; goto next;
  275. }
  276. if (x1<xmin)
  277. {
  278. y1=y2-cut(x2-x1,y2-y1,x2-xmin); x1=xmin; goto next;
  279. }
  280. if (y1<ymin)
  281. {
  282. x1=x2-cut(y2-y1,x2-x1,y2-ymin); y1=ymin; goto next;
  283. }
  284. if (x2>xmax)
  285. {
  286. y2=y1+cut(x1-x2,y1-y2,xmax-x1); x2=xmax; goto next;
  287. }
  288. if (x1>xmax)
  289. {
  290. y1=y2+cut(x2-x1,y2-y1,xmax-x2); x1=xmax; goto next;
  291. }
  292.  
  293. if (y2>ymax)
  294. {
  295. x2=x1+cut(y1-y2,x1-x2,ymax-y1); y2=ymax; goto next;
  296. }
  297. if (y1>ymax)
  298. {
  299. x1=x2+cut(y2-y1,x2-x1,ymax-y2); y1=ymax; // goto next;
  300. }
  301.  
  302.  
  303. deltax=abs(x2-x1);
  304. deltay=abs(y2-y1);
  305.  
  306.     if (deltax>=deltay)
  307.     {
  308.         numpixels=deltax+1;
  309.         d=(deltay<<1) - deltax;
  310.         dinc1=deltay<<1;
  311.         dinc2=(deltay-deltax)<<1;
  312.         xinc1=xinc2=yinc2=1; yinc1=0;
  313.     } else {
  314.         numpixels=deltay+1;
  315.         d=(deltax<<1)-deltay;
  316.         dinc1=deltax<<1;
  317.         dinc2=(deltax-deltay) << 1;
  318.         xinc1=0; xinc2=yinc1=yinc2=1;
  319.     }
  320.     if (x1>x2) { xinc1=-xinc1; xinc2=-xinc2; }
  321.     if (y1>y2) { yinc1=-yinc1; yinc2=-yinc2; }
  322.     ainc1=xinc1+yinc1*320; ainc2=xinc2+yinc2*320;
  323.     _BX=x1+y1*320; _DI=x2+y2*320;
  324.     //_DI=linepattern;
  325.     _ES=(int)a;
  326.     _CX=(numpixels-2)>>1;
  327.     if ((int)_CX<=0) return;
  328.     _DX=d+16384; if (_DX<16384) _DI-=ainc1; else _DI-=ainc2;
  329.     _SI=linepattern;
  330.     //for(i=1;i<=num1;i++)
  331.     //{
  332.     nextpixel:
  333.         asm ror si,1
  334.         asm jnc nopixel
  335.  
  336.         //if (_DI&0x1)
  337.         //{
  338.         asm xor byte ptr es:[bx],80h
  339.         asm xor byte ptr es:[di],80h
  340.         //}
  341.         nopixel:
  342.         if (_DX<16384) { _DX+=dinc1; _DI-=ainc1;
  343.         _BX+=ainc1; } else
  344.              { _DX+=dinc2; _DI-=ainc2;
  345.              _BX+=ainc2; }
  346.  
  347.     asm loop nextpixel
  348.     asm ror si,1
  349.     asm jnc nopixel1
  350.     if (_DI!=_BX) {
  351.         asm xor byte ptr es:[bx],80h
  352.         }
  353.         asm xor byte ptr es:[di],80h
  354.     nopixel1: ;
  355.     //}
  356. }
  357.  
  358.  
  359.  
  360.  
  361. volatile unsigned int seed1=0x0,seed2=0xa001;
  362. unsigned int aseed1=0x1234,aseed2=0x1234;
  363.  
  364. volatile unsigned int random()
  365. {
  366. unsigned int temp;
  367. temp=seed1;seed1+=seed2; seed2=temp;
  368. _AX=seed1;
  369. asm ror ax,8
  370. return seed1=_AX;
  371. }
  372.  
  373. #ifdef INTR
  374.  
  375. void interrupt far _loadds stupidinterruptroutine()
  376. {
  377. int key=inportb(0x60);
  378. if (key==1) stopped=1;
  379. _CL=inportb(0x61);
  380. _CL|=128;
  381. outportb(0x61,_CL);
  382. _CL&=0x7f;
  383. outportb(0x61,_CL);
  384. outportb(0x20,0x20);
  385. }
  386. #endif
  387.  
  388.  
  389.  
  390.  
  391. void shade(int start,int end,int add)
  392. {
  393. int c;
  394. for (;start!=end;start+=add)
  395. {
  396. _CX=768-3;
  397. _DX=0x03c8;
  398. _AX=1;  // 0
  399. asm out dx,al
  400. _DX++;
  401. _AX=start;
  402. uusi:
  403. asm out dx,al
  404. asm loop uusi
  405.  
  406.  
  407. for (c=0;c<=2;c++)
  408. {
  409.     while (0==(inportb(0x3da)&8));
  410.     while ((inportb(0x3da))&8);    //waittof
  411. }
  412. }
  413.  
  414. }
  415.  
  416. unsigned int teksti[]=
  417. {
  418. 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
  419. 0x1108,0x3108,0x3108,0x514e,0xf989,0x1149,0x112e, // 4kb
  420. 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
  421. 0xe000,
  422. 0x4000,
  423. 0x4000,  // I
  424. 0x4000,
  425. 0xe000,
  426. 0,
  427. 0x1200,
  428. 0x1a00,
  429. 0x1600, // N
  430. 0x1200,
  431. 0x1200,
  432. 0,
  433. 0x03e0,
  434. 0x0080,
  435. 0x0080, // T
  436. 0x0080,
  437. 0x0080,
  438. 0,
  439. 0x0070,
  440. 0x0048,
  441. //0x0048,
  442. 0x0070,  // R
  443. 0x0048,
  444. 0x0048,
  445. 0,
  446. 0x0006,
  447. 0x0009,
  448. 0x0009,  // O
  449. 0x0009,
  450. 0x0006,
  451.  
  452.  
  453. 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
  454.  
  455.  
  456.  
  457. 0xaaaa,0x5555,0xaaaa,0x5555,0xaaaa,0x5555,0xaaaa,0x5555,
  458. 0xaaaa,0x5555,0xaaaa,0x5555,0xaaaa,0x5555,0xaaaa,0x5555,
  459. 0xaaaa,0xcccc,0x3333,0x3333,0xcccc,0xcccc,0x3333,0x3333,
  460. 0xcccc,0xcccc,0x3333,0x3333,0xcccc,0xcccc,0x3333,0x3333,
  461. 0xcccc,0xcccc,0x3333,0x3333,0xcccc,0xcccc,0x3333,0x3333,
  462. 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
  463.  
  464.  
  465. };
  466.  
  467. void main()
  468. {
  469. char pal[256][3];
  470. int placex[150],placey[150],blockcount[150];
  471. int sx[150],sy[150],pl,pl1;
  472. int b,c,c1,c2,c3,c4,d,f,e,e1,o,re,re1,xpl,xpl1,ypl,ypl1,plc,m,n;
  473. int g;
  474. char *oldobj;
  475. unsigned int mode1,xdim,ydim,yscroll;
  476. int hstart,hend,vstart,vend,bstart,etemp,ymin1,ymin2,ymax1,ymax2;
  477. int vx2,vy2,alfa,beta,Vvar,alfa1,beta1,r,fx,fy,fz,fx1,fy1,fz1;
  478. int vx,vy,vz,vx1,vy1,vz1;
  479. int ca,cb,sa,sb,c0,ca1,cb1,sa1,sb1,zadd,xadd,yadd,zstart,zend,ystart,yend,xadd1,yadd1,zadd1,flg1,addalfa,addbeta;
  480. int ashift;
  481. int oldx[40],oldy[40];
  482. char apu;
  483. char *obj;
  484. unsigned int pointer1,pointer2,ga,sincount,apointer1,apointer2;
  485. int *frame=(int *)&frames;
  486. int matrix[9],oldmatrix[9];
  487. int bcount=-2;
  488. int offset;
  489. int *textptr,text,etext,acounter;
  490. int wd,wdadd,intoff,intseg;
  491. d=mode1=offset=bstart=yscroll=0;
  492. textptr=(int *)teksti;
  493. addalfa=4; addbeta=7; ashift=3;
  494. zadd=150; xadd=160; yadd=100;
  495.  
  496. #ifdef INTR
  497. _AL=9; _AH=0x35; geninterrupt(0x21);
  498. intoff=_BX; intseg=_ES;
  499. _DS=FP_SEG(stupidinterruptroutine);
  500. _DX=FP_OFF(stupidinterruptroutine);
  501. _AL=9; _AH=0x25; geninterrupt(0x21);
  502. #endif
  503. #ifdef CLI
  504.     asm cli
  505. #endif
  506.  
  507. for (b=0;b<=255;b++)
  508. {
  509.     pal[b][0]=pal[b][2]=random()&0x1f;
  510.     pal[b][1]=0;
  511. }
  512.  
  513. _AX=0x13; geninterrupt(0x10);
  514.  
  515.  
  516. c=128; // accleration 64
  517. d=0;
  518. for (b=0;b<1024;b++)
  519. {
  520. sin[b]=d+=c;
  521.     if (!(b&1))
  522.     {
  523.         if (d>0) c-=1; else c+=1;
  524.     }
  525. }
  526.  
  527. //_SI=(int)(pal+d);
  528. //_DX=0x3c8; _AL=0;
  529. //asm out dx,al
  530. //_CX=128*3;
  531. //_DX++;
  532. //asm rep outsb
  533.  
  534. _CX=768;
  535. _DX=0x03c8;
  536. _AX=0;  // 0
  537. asm out dx,al
  538. _DX++;
  539. uusi:
  540. asm out dx,al
  541. asm loop uusi
  542.  
  543. for (b=0;b<=31999;b++)
  544. {
  545.     plota(b);
  546.     plota((unsigned int)b+32000);
  547. }
  548.  
  549. shade(0,0x3f,1);
  550.  
  551. for (b=0;b<=31999;b++)
  552. {
  553.     plotb(b,random()%127+1); plota(b);
  554.     plotb((unsigned int)b+32000,random()%127+1); plota((unsigned int)b+32000);
  555. }
  556.  
  557.  
  558.  
  559. loop:
  560.     //if (stopped==1) goto endprog;
  561.     if (bcount==-1)
  562.     {
  563.     bcount=-2; e=etemp; goto loop1;
  564.     } else mode=0;
  565. loopagain:
  566.     e=*frame++;
  567.     switch(-e)
  568.     {
  569.     case 0: endprog:
  570.     shade(0x3f,0,-1);
  571.     _AX=0x3; geninterrupt(0x10);
  572.     _DX=(int)endtext; _AH=9; geninterrupt(0x21);
  573. #ifdef INTR
  574. _DS=intseg;
  575. _DX=intoff;
  576. _AL=9; _AH=0x25; geninterrupt(0x21);
  577. #endif
  578. #ifdef CLI
  579.     asm sti
  580. #endif
  581.     return;
  582.     case 1:         placex[offset]=-30;
  583.                 placey[offset]=0; blockcount[offset]=0;
  584.                 sx[offset]=1;sy[offset]=1;
  585.                  mode=1; e=*frame;
  586.                 if (frame[1]) { offset++; frame[1]--; frame--; } else { frame+=2; }
  587.     break;
  588.  
  589.     case 2: ashift=*frame++; goto loop;
  590.     case 6: offset=0; goto loop;
  591.     case 5: mode1|=1; goto label9;
  592.     case 4: mode1|=128; label9: vstart=*frame++; vend=*frame++; goto loop;
  593.     case 7: mode=-1; e=*frame++; break;
  594.     case 8: mode1^=32; goto loop;
  595.     case 9: mode=9; e=*frame++; break;
  596.     case 10: mode=10; e=*frame++; alfa=beta=0; Vvar=*frame++; // ei break-komentoa!!
  597.     case 15:
  598.         addalfa=*frame++; addbeta=addalfa&0xff; addalfa>>=8; break;
  599.     case 11: mode1|=4; yadd=ystart=*frame++; yend=*frame++; goto loop;
  600.     case 12: mode1|=8; xadd=hstart=*frame++; hend=*frame++; goto loop;
  601.     case 13: mode1|=16; zadd=zstart=*frame++; zend=*frame++; goto loop;
  602.     case 14: bcount=*frame++; goto loop;
  603.   default: textplace=*frame++;
  604. }
  605.  
  606. loop1:
  607.     for (b=bstart;b<=e;b++) {
  608.     if (b==bcount) {
  609.     bcount=-1; bstart=b; etemp=e; goto loopagain;
  610.     }
  611.     bstart=0;
  612.  
  613.  
  614.     if (mode==9)
  615.     {
  616.         //if (b<80) { tunnelstart=(80-b)>>3; }
  617.         //if (b>e-80) { tunnelstart=(b-e+80)>>3; }
  618.         for (f=0;f<=30;f+=2) {    //26
  619.  
  620.  
  621.             re=((((-b*512)&0x7ff)+f*0x400)>>5)+4;
  622.             re1=(((((-b)*512-512)&0x7ff)+f*0x400)>>5)+4;
  623.             xpl=(sin[(b*8-cosadd)&0x3ff])/((re>>3)+256)+xadd1;    // re=32-f
  624.             ypl=(sin[(b*8)&0x3ff])/((re>>3)+(256))+yadd1;
  625.             xpl1=(sin[((b+1)*8-cosadd)&0x3ff])/((re1>>3)+256)+xadd;
  626.             ypl1=(sin[((b+1)*8)&0x3ff])/((re1>>3)+(256))+yadd;
  627.  
  628.             f<<=1;
  629.                 for(g=0;g<=7;g++)
  630.                 {
  631.                  oldx[g]=(( sin[( (g<<7)    -((b)<<3)       +f)&0x3ff])/re)+xpl;
  632.                  oldy[g]=(((sin[( (g<<7)    -((b)<<3)+cosadd+f)&0x3ff])/re))+ypl;
  633.  
  634.                     ymin=ymin2; ymax=ymax2;
  635.             //linepattern=patterns[(f>>3)];
  636.             line( oldx[g],
  637.                   oldy[g],
  638.                    (( sin[(((g+1)<<7) -((b)<<3)       +f)&0x3ff])/re)+xpl,
  639.                   (((sin[(((g+1)<<7) -((b)<<3)+cosadd+f)&0x3ff])/re))+ypl);
  640.  
  641.             oldx[g+16]=(( sin[( (g<<7)    -((b+1)<<3)       +f)&0x3ff])/re1)+xpl1;
  642.             oldy[g+16]=(((sin[( (g<<7)    -((b+1)<<3)+cosadd+f)&0x3ff])/re1))+ypl1;
  643.  
  644.             //linepattern=patterns[(f>>3)];
  645.             ymin=ymin1; ymax=ymax1;
  646.             line(  oldx[g+16],
  647.                    oldy[g+16],
  648.                    (( sin[(((g+1)<<7) -((b+1)<<3)       +f)&0x3ff])/re1)+xpl1,
  649.                    (((sin[(((g+1)<<7) -((b+1)<<3)+cosadd+f)&0x3ff])/re1))+ypl1);
  650.  
  651.  
  652.             if (f>=4)
  653.             {
  654.             //linepattern=patterns[(f>>3)];
  655.             ymin=ymin2; ymax=ymax2;
  656.                line(oldx[g],oldy[g],oldx[g+8],oldy[g+8]);
  657.             ymin=ymin1; ymax=ymax1;
  658.             //linepattern=patterns[(f>>3)];
  659.                line(oldx[g+16],oldy[g+16],oldx[g+24],oldy[g+24]);
  660.             }
  661.             oldx[g+8]=oldx[g];
  662.             oldy[g+8]=oldy[g];
  663.             oldx[g+24]=oldx[g+16];
  664.             oldy[g+24]=oldy[g+16];
  665.             }
  666.             f>>=1;
  667.         }
  668.     //tunnelend=tunnelstart;
  669.  
  670.     }
  671.  
  672.  
  673.     if (mode==10)
  674.     {
  675.  
  676.         c0=sin[cosadd]>>shift;
  677.  
  678.         alfa+=addalfa; beta+=addbeta;
  679.  
  680.         sa=sin[(alfa)&0x3ff]>>shift;
  681.         sb=sin[(beta)&0x3ff]>>shift;
  682.         ca=sin[((alfa)+cosadd)&0x3ff]>>shift;
  683.         cb=sin[((beta)+cosadd)&0x3ff]>>shift;
  684.  
  685.         matrix[0]=(ca*cb)>>ashift;
  686.         matrix[1]=(sa*cb)>>ashift;
  687.         matrix[2]=(sb*c0)>>zshift;
  688.  
  689.         matrix[3]=((-sa)*c0)>>ashift;
  690.         matrix[4]=((ca)*c0)>>ashift;
  691.         matrix[5]=0;
  692.  
  693.         matrix[6]=((-ca)*sb)>>ashift;
  694.         matrix[7]=((-sa)*sb)>>ashift;
  695.         matrix[8]=(cb*c0)>>zshift;
  696.         oldobj=0;
  697.         vz=zadd;
  698.         vz1=zadd1;
  699. label2:
  700.         obj=vec[Vvar];
  701.  
  702. label1:
  703.         vx=vx1=vy=vy1=0;
  704.  
  705.         vz+=(matrix[2]+matrix[5]+matrix[8]>>1);
  706.         vz1+=(oldmatrix[2]+oldmatrix[5]+oldmatrix[8]>>1);
  707.         vy+=matrix[1]+matrix[4]+matrix[7]>>1;
  708.         vy1+=oldmatrix[1]+oldmatrix[4]+oldmatrix[7]>>1;
  709.         vx+=matrix[0]+matrix[3]+matrix[6]>>1;
  710.         vx1+=oldmatrix[0]+oldmatrix[3]+oldmatrix[6]>>1;
  711.  
  712. label3:
  713.     for(;;)
  714.     {
  715. foragain:
  716.        switch (-(apu=*obj++))
  717.        {
  718.         case 1: goto endfor;
  719.         case 2: goto label1;
  720.         case 3:
  721.         apu=*obj++; oldobj=obj; obj=vec[apu]; goto foragain;
  722.         case 4:
  723.  
  724.  
  725.         goto foragain;
  726.  
  727.        }
  728.         if (apu&1) { vx+=matrix[0]; vy+=matrix[1]; vz+=matrix[2];
  729.              vx1+=oldmatrix[0]; vy1+=oldmatrix[1]; vz1+=oldmatrix[2]; }
  730.         if (apu&2) { vx+=matrix[3]; vy+=matrix[4]; vz+=matrix[5];
  731.              vx1+=oldmatrix[3]; vy1+=oldmatrix[4]; vz1+=oldmatrix[5]; }
  732.         if (apu&4) { vx+=matrix[6]; vy+=matrix[7]; vz+=matrix[8];
  733.              vx1+=oldmatrix[6]; vy1+=oldmatrix[7]; vz1+=oldmatrix[8]; }
  734.         if (apu&8) { vx-=matrix[0]; vy-=matrix[1]; vz-=matrix[2];
  735.              vx1-=oldmatrix[0]; vy1-=oldmatrix[1]; vz1-=oldmatrix[2]; }
  736.         if (apu&16) { vx-=matrix[3]; vy-=matrix[4]; vz-=matrix[5];
  737.              vx1-=oldmatrix[3]; vy1-=oldmatrix[4]; vz1-=oldmatrix[5]; }
  738.         if (apu&32) { vx-=matrix[6]; vy-=matrix[7]; vz-=matrix[8];
  739.              vx1-=oldmatrix[6]; vy1-=oldmatrix[7]; vz1-=oldmatrix[8]; }
  740.  
  741.         if (apu&64)
  742.         {
  743.         linepattern=0xffff;
  744.         if (Vvar!=1) { if (vz>73 || fz>73) linepattern=0x8888; }
  745.         line(vx/vz+xadd,vy/vz+yadd,fx/fz+xadd,fy/fz+yadd);
  746.         linepattern=0xffff;
  747.         if (Vvar!=1) { if (vz1>73 || fz1>73) linepattern=0x8888; }
  748.         if (b!=0) line(vx1/vz1+xadd1,vy1/vz1+yadd1,fx1/fz1+xadd1,fy1/fz1+yadd1);
  749.         }
  750.         fx=vx; fx1=vx1; fy=vy; fy1=vy1; fz=vz; fz1=vz1;
  751.     }
  752. endfor:
  753.     if (oldobj!=0) { obj=oldobj; oldobj=0; goto label1; }
  754.  
  755.     for (f=0;f<=8;f++) oldmatrix[f]=matrix[f];
  756.  
  757.     linepattern=0xffff;
  758.  
  759.     }
  760.  
  761.         zadd1=zadd; yadd1=yadd; xadd1=xadd;
  762.  
  763.  
  764.     if (mode1&4)
  765.     {
  766.     if (ystart==yend) mode1&=~4;
  767.     yadd=(ystart+=((ystart>yend) ? -1 : 1));
  768.     }
  769.     if (mode1&8)
  770.     {
  771.     if (hstart==hend) mode1&=~8;
  772.     xadd=(hstart+=((hstart>hend) ? -1 : 1));
  773.     }
  774.     if (mode1&16)
  775.     {
  776.     if (zstart==zend) mode1&=~16;
  777.     zadd=zstart+=((zstart>zend) ? -2 : 2);
  778.     }
  779.  
  780.     if (mode1&1)
  781.     {
  782.     g=320*vstart;
  783.     for (f=0;f<=319;f++) { plota(g+f); }
  784.     if (vstart==vend) mode1&=0xfe;
  785.     vstart+=(vstart>vend) ? -1 : 1;
  786.     }
  787.  
  788.     ymin2=ymin1;
  789.     ymax2=ymax1;
  790.     if (mode1&128)
  791.     {
  792.     if (vstart==vend) mode1&=0x7f;
  793.     vstart+=(vstart>vend) ? -1 : 1;
  794.     ymin1=vstart;
  795.     ymax1=199-vstart;
  796.     }
  797.  
  798.  
  799.     if (mode1&32)
  800.     {
  801.     if (yscroll) yscroll--; else { yscroll=7; textptr++; }
  802.     pointer1=yscroll*320+160;
  803.     _ES=(int)a;
  804.     for (f=0;f<=24;f++)
  805.     {
  806.     etext=textptr[f-1];
  807.     text=textptr[f];
  808.     wdadd=200+(sin[(((f<<3)+yscroll)<<3)&0x3ff]>>8);
  809.     wd=-(wdadd)<<3;           //width[(f<<3)+yscroll])<<4;
  810.     ga=0x8000;
  811.     for (g=0;g<16;g++)
  812.     {
  813.         if ((etext&ga)!=(text&ga))
  814.         {
  815.         _BX=(wd>>4); pointer2=_CX=(((wd+wdadd)>>4)-_BX);
  816.         _CX>>=1;
  817.         _BX+=pointer1;
  818.         _SI=0x8080;
  819.  
  820.         again1:
  821.         asm xor es:[bx],si
  822.         asm add bx,2
  823.         asm loop again1
  824.  
  825.         if (pointer2&1) plota(_BX);
  826.  
  827.         }
  828.         ga>>=1;
  829.         wd+=wdadd;
  830.     }
  831.  
  832.     pointer1+=320*8;
  833.  
  834.  
  835.     }
  836.  
  837.     }
  838.  
  839.  
  840.     if (offset!=0)
  841.     {
  842.     acounter++;
  843.     for (f=0;f<offset;f++) {
  844.     pl1=placex[f]+(sin[(acounter+(f<<4)<<3)&0x3ff]>>11)+(placey[f]+(sin[cosadd+((acounter-(f<<2))<<3)&0x3ff]>>11))*320-1284;
  845.     o=e1=0x8080;
  846.     if (placex[f]<=10||blockcount[f]>=1520) e1=0;
  847.     blockcount[f]++; if (blockcount[f]>=1520) o=0;
  848.     placex[f]+=sx[f]; if (placex[f]<=10) { sx[f]=1; o=0;}
  849.               if (placex[f]>=307) sx[f]=-1;
  850.     placey[f]+=sy[f]; if (placey[f]<=10) sy[f]=1;
  851.               if (placey[f]>=190) sy[f]=-1;
  852.     pl=placex[f]+(sin[(acounter+1+(f<<4)<<3)&0x3ff]>>11)+((sin[cosadd+((acounter+1-(f<<2))<<3)&0x3ff]>>11)+placey[f])*320-1284;    _ES=(int)a; _BX=pl; _DI=pl1;
  853.     for(_AX=0;_AX<=5;_AX++)
  854.     {
  855.         _CX=3;
  856.         again:
  857.         asm add bx,2
  858.         asm mov si,o
  859.         asm xor es:[bx],si
  860.  
  861.         asm add di,2
  862.         asm mov si,e1
  863.         asm xor es:[di],si
  864.         asm loop again
  865.  
  866.         _BX+=(314); _DI+=(314);
  867.     }
  868.  
  869.  
  870.  
  871.  
  872.         }
  873.  
  874.     }
  875.  
  876.  
  877.  
  878.  
  879.     while (0==(inportb(0x3da)&8));
  880.     while ((inportb(0x3da))&8);    //waittof
  881.  
  882.  
  883. d=random()&0x7f;
  884. c1=pal[d+vari][0];c2=pal[d+vari][1];c3=pal[d+vari][2];
  885. pal[d+vari][0]=pal[d+vari][1]=pal[d+vari][2]=0;
  886.  
  887. _SI=(int)(pal+d);
  888. _DX=0x3c8; _AL=0;
  889. asm out dx,al
  890. _CX=128*3;
  891. _DX++;
  892. asm rep outsb
  893.  
  894. pal[d+vari][0]=c1;pal[d+vari][1]=c2;pal[d+vari][2]=c3;
  895.  
  896.  
  897. }
  898.  
  899.  
  900.  
  901. goto loop;
  902. }
  903.  
  904.  
  905.  
  906.  
  907.