home *** CD-ROM | disk | FTP | other *** search
- {///////////////////////////////////////////////////////////////////////////}
- { Ca y est... je me suis décidé à mettre le source de TEXTURE dans le
- domaine public! A mon point de vue, c'est un petit programme assez
- important, et c'est a priori c'est susceptible d'intéresser quelques uns
- d'entre vous. Il reprend certaines parties de la démo de mon CV (SBAL01)
- du SBAL_Kit (chez DP Tool). Je sais... il y'a 50% de BASM, mais il faut ce
- qu'il faut pour être rapide! Voilà!, sachez donc tirer profit de ce petit
- cadeau et évitez de faire partie du club très large des LAMERS en
- "pompant" bêtement le code...
-
- Pour de plus amples informations, d'éventuelles suggestions, ou tout
- simplement pour le fun, vous pouvez m'écrire à l'adresse suivante:
-
- Patrick Ruelle
- 43, av. de Grande Bretagne
- 98000 Monaco
- Principauté de Monaco
-
- Evidemment je n'ai pas pris la décision de diffuser ce source dans le
- but de demander de l'argent, mais il va de soit que toutes sortes de dons
- sont acceptés (carte postale, matos, argent, spécialités locales, docs,
- etc...). N'oubliez pas non plus que cette diffusion ne m'enlève nullement
- mes droits d'auteur de cette mmm... de démo; ce petit package peut être
- diffusé librement à condition de rester sous sa forme initiale:
-
- TEXTURE .EXE 11/08/94 12928 L'exécutable de la démo
- TEXTURE .PAS 11/08/94 26596 Le source de la démo
- TEXTURE .RAW 10/08/94 64768 L'image brute (pal+bitmap)
- ------
- TOTAL 104292
-
- La version actuelle est remaniée exprès pour la diffusion de ce package,
- mais en fait ce programme date de début 1994...
-
- Patrick Ruelle (Monac) / GRYPHAEA }
- {///////////////////////////////////////////////////////////////////////////}
- {-------------------------------------------------------}
- { Le code 80386 concernant les affichages ultra-rapides}
- { est disponible auprès de l'auteur moyennant 50FF... }
- {-------------------------------------------------------}
- PROGRAM TEXTURE;
-
-
- USES Crt,DOS;
-
-
- CONST centerx =0;
- centery =0;
- centerz =-160;
-
-
- VAR F :FILE;
- minbuf,maxbuf :WORD;
- a1,a2,a3 :Integer;
- back :Pointer;
- anzi,zoom :Integer;
- times,picture_ofs,segp,
- picture2_ofs,segp2 :WORD;
- loader,loader2,buffer :Pointer;
- way,mx,my,angle,di,i :Integer;
- maxx,lminy,lmaxy :WORD;
- tcos,tsin :ARRAY[0..500] OF Integer;
- buffer2,paltmp :Pointer;
- gy,dist,zl1 :Integer;
- l1,l2 :ARRAY[0..500] OF Integer;
- regs :Registers;
- int_truc,old_int_truc :Pointer;
-
-
- PROCEDURE Buf2Scrn;ASSEMBLER;{pour 286; le code pour 386 est disponible}
- ASM {sur demande auprès de l'auteur contre}
- push ds {l'envoi de 50FF (code 2 x plus rapide!!!)}
- lds si,buffer
- mov ax,0A000h
- mov es,ax
- mov di,minbuf
- add si,minbuf
- mov cx,32000
- shr minbuf,2
- sub cx,minbuf
- shr maxbuf,2
- sub cx,maxbuf
- cld
- rep movsw
- pop ds
- END;
-
-
- PROCEDURE ClrBuf;ASSEMBLER;{pour 286; idem ici plus haut}
- ASM
- push ds
- les di,buffer
- add di,minbuf
- mov cx,32000
- shr minbuf,2
- sub cx,minbuf
- shr maxbuf,2
- sub cx,maxbuf
- cld
- xor ax,ax
- rep stosw
- pop ds
- END;
-
-
- PROCEDURE Nothing;Interrupt;
- BEGIN
- END;
-
-
- PROCEDURE LineAsm(decal:WORD;x1,y1,x2,y2:Integer;buffer,back:Pointer);
- VAR zl,zi :WORD;
- co :BYTE;
- S1,S2,S4:WORD;
- pixel :WORD;
- BEGIN
- IF (x1>319) OR (x2>319) OR (y1>199) OR (y2>199) OR
- (x1<0) OR (x2<0) OR (y1<0) OR (y2<0) THEN Exit;
- IF Abs(y2-y1)>Abs(x2-x1) THEN
- pixel:=abs(y2-y1)
- ELSE
- pixel:=Abs(x2-x1);
- IF pixel=0 THEN
- zi:=0
- ELSE
- zi:=(maxx*64) DIV pixel;
- zl:=0;
- back:=Ptr(Seg(back^),Ofs(back^)+decal);
- ASM
- push ds
- MOV AX,X2
- SUB AX,X1
- JNS @@LAB1
- NEG AX
- @@LAB1:
- MOV BX,Y2
- SUB BX,Y1
- JNS @@LAB2
- NEG BX
- @@LAB2:
- CMP AX,BX
- JGE @@LAB3A
- JMP @@LAB20
- @@LAB3A:
- MOV CX,X1
- CMP CX,X2
- JG @@LAB4
- MOV CX,1
- JMP @@LAB5
- @@LAB4:
- MOV CX,-1
- @@LAB5:
- MOV DX,Y1
- CMP DX,Y2
- JG @@LAB6
- MOV DX,320
- JMP @@LAB7
- @@LAB6:
- MOV DX,-320
- @@LAB7:
- MOV ds,CX
- MOV S2,DX
- ADD BX,BX
- MOV si,BX
- SUB BX,AX
- MOV CX,BX
- SUB CX,AX
- MOV S4,CX
- {affiche pixel!!!}
- MOV CX,X1
- MOV DX,Y1
- mov ax,dx
- xor dx,dx
- shl ax,6
- add dx,ax
- shl ax,2
- add dx,ax
- les di,back
- mov ax,zl
- shr ax,5
- add di,ax
- mov ax,es:[di]
- les di,buffer
- add di,cx
- add di,dx
- mov es:[di],ax {2 pixels d'un coup!}
- mov ax,zi
- add zl,ax
- @@LAB8:
- CMP CX,X2
- JZ @@LAB3
- mov ax,ds
- ADD CX,ax
- OR BX,BX
- JNS @@LAB10
- ADD BX,si
- JMP @@LAB11
- @@LAB10:
- ADD BX,S4
- ADD DX,S2
- @@LAB11:
- {Traitement couleur}
- les di,back
- mov ax,zl
- shr ax,5
- add di,ax
- mov ax,es:[di]
- les di,buffer
- add di,cx
- add di,dx
- mov es:[di],ax {2 pixels d'un coup!}
- @@wei1:
- mov ax,zi
- add zl,ax
- JMP @@LAB8
- @@LAB20:
- MOV CX,Y1
- CMP CX,Y2
- JG @@LAB12
- MOV CX,1
- JMP @@LAB13
- @@LAB12:
- MOV CX,-1
- @@LAB13:
- MOV DX,X1
- CMP DX,X2
- JG @@LAB14
- MOV DX,1
- JMP @@LAB15
- @@LAB14:
- MOV DX,-1
- @@LAB15:
- MOV S1,CX
- MOV S2,DX
- ADD AX,AX
- MOV si,AX
- SUB AX,BX
- MOV CX,AX
- SUB CX,BX
- MOV S4,CX
- MOV BX,AX
- mov ax,y1
- mov y1,0
- shl ax,6
- add y1,ax
- shl ax,2
- add y1,ax
- mov ax,y2
- mov y2,0
- shl ax,6
- add y2,ax
- shl ax,2
- add y2,ax
- mov ax,s1
- mov s1,0
- shl ax,6
- add s1,ax
- shl ax,2
- add s1,ax
- {Affiche pixel!!!}
- MOV CX,X1
- MOV DX,Y1
- les di,back
- mov ax,zl
- shr ax,5
- add di,ax
- mov ax,es:[di]
- les di,buffer
- add di,cx
- add di,dx
- mov es:[di],ax
- mov ax,zi
- add zl,ax
- @@LAB16:
- CMP DX,Y2
- JZ @@LAB3
- ADD DX,s1
- OR BX,BX
- JNS @@LAB18
- ADD BX,si
- JMP @@LAB19
- @@LAB18:
- ADD BX,S4
- ADD CX,S2
- @@LAB19:
- {Affiche pixel!!!}
- les di,back
- mov ax,zl
- shr ax,5
- add di,ax
- mov ax,es:[di]
- les di,buffer
- add di,cx
- add di,dx
- mov es:[di],ax
- mov ax,zi
- add zl,ax
- JMP @@LAB16
- @@LAB3:
- Pop ds
- END;
- END;
-
-
- PROCEDURE LineAsmQuadro(decal:WORD;x1,y1,x2,y2:Integer;buffer,back:Pointer;maxx:WORD);
- VAR zl,zi :WORD;
- co :BYTE;
- S1,S2,S4:WORD;
- pixel :WORD;
- BEGIN
- IF (x1>319) OR (x2>319) OR (y1>199) OR (y2>199) OR
- (x1<0) OR (x2<0) OR (y1<0) OR (y2<0) THEN Exit;
- IF Abs(y2-y1)>Abs(x2-x1) THEN
- pixel:=Abs(y2-y1)
- ELSE
- pixel:=Abs(x2-x1);
- IF pixel=0 THEN
- zi:=0
- ELSE
- zi:=(maxx*64) DIV pixel;
- zl:=0;
- back:=Ptr(Seg(back^),Ofs(back^)+decal);
- ASM
- push ds;
- MOV AX,X2
- SUB AX,X1
- JNS @@LAB1
- NEG AX
- @@LAB1:
- MOV BX,Y2
- SUB BX,Y1
- JNS @@LAB2
- NEG BX
- @@LAB2:
- CMP AX,BX
- JGE @@LAB3A
- JMP @@LAB20
- @@LAB3A:
- MOV CX,X1
- CMP CX,X2
- JG @@LAB4
- MOV CX,1
- JMP @@LAB5
- @@LAB4:
- MOV CX,-1
- @@LAB5:
- MOV DX,Y1
- CMP DX,Y2
- JG @@LAB6
- MOV DX,320
- JMP @@LAB7
- @@LAB6:
- MOV DX,-320
- @@LAB7:
- MOV ds,CX
- MOV S2,DX
- ADD BX,BX
- MOV si,BX
- SUB BX,AX
- MOV CX,BX
- SUB CX,AX
- MOV S4,CX
- MOV CX,X1
- MOV DX,Y1
- mov ax,dx
- xor dx,dx
- shl ax,6
- add dx,ax
- shl ax,2
- add dx,ax
- mov ax,zi
- add zl,ax
- @@LAB8:
- CMP CX,X2
- JZ @@LAB3
- mov ax,ds
- ADD CX,ax
- OR BX,BX
- JNS @@LAB10
- ADD BX,si
- JMP @@LAB11
- @@LAB10:
- ADD BX,S4
- ADD DX,S2
- @@LAB11:
- les di,back
- mov ax,zl
- shr ax,5
- add di,ax
- mov ax,es:[di]
- les di,buffer
- add di,cx
- add di,dx
- mov es:[di],ax {2+2+2 pixels d'un coup!}
- add di,320
- mov es:[di],ax
- add di,320
- mov es:[di],ax
- @@wei1:
- mov ax,zi
- add zl,ax
- JMP @@LAB8
- @@LAB20:
- MOV CX,Y1
- CMP CX,Y2
- JG @@LAB12
- MOV CX,1
- JMP @@LAB13
- @@LAB12:
- MOV CX,-1
- @@LAB13:
- MOV DX,X1
- CMP DX,X2
- JG @@LAB14
- MOV DX,1
- JMP @@LAB15
- @@LAB14:
- MOV DX,-1
- @@LAB15:
- MOV S1,CX
- MOV S2,DX
- ADD AX,AX
- MOV si,AX
- SUB AX,BX
- MOV CX,AX
- SUB CX,BX
- MOV S4,CX
- MOV BX,AX
- mov ax,y1
- mov y1,0
- shl ax,6
- add y1,ax
- shl ax,2
- add y1,ax
- mov ax,y2
- mov y2,0
- shl ax,6
- add y2,ax
- shl ax,2
- add y2,ax
- mov ax,s1
- mov s1,0
- shl ax,6
- add s1,ax
- shl ax,2
- add s1,ax
- MOV CX,X1
- MOV DX,Y1
- mov ax,zi
- add zl,ax
- @@LAB16:
- CMP DX,Y2
- JZ @@LAB3
- ADD DX,s1
- OR BX,BX
- JNS @@LAB18
- ADD BX,si
- JMP @@LAB19
- @@LAB18:
- ADD BX,S4
- ADD CX,S2
- @@LAB19:
- les di,back
- mov ax,zl
- shr ax,5
- add di,ax
- mov ax,es:[di]
- les di,buffer
- add di,cx
- add di,dx
- mov es:[di],ax
- add di,320
- mov es:[di],ax {2 pixels d'un coup!}
- add di,320
- mov es:[di],ax {et 2 autres la ligne en dessous!}
- mov ax,zi
- add zl,ax
- JMP @@LAB16
- @@LAB3:
- Pop ds
- END;
- END;
-
-
- PROCEDURE LineAsmHoz(decal:WORD;x1,x2,y1:Integer;buffer,back:Pointer);
- VAR zl,zi :WORD;
- co :BYTE;
- S1,S2,S4:WORD;
- pixel :WORD;
- BEGIN
- IF (x1>319) OR (x2>319) OR (y1>199) OR
- (x1<0) OR (x2<0) OR (y1<0) THEN Exit;
- pixel:=Abs(x2-x1);
- IF pixel=0 THEN
- zi:=0
- ELSE
- zi:=(maxx*256) DIV pixel;
- zl:=0;
- back:=Ptr(Seg(back^),Ofs(back^)+decal);
- ASM
- push ds
- {Affiche pixel!!!}
- MOV CX,X1
- MOV DX,Y1
- mov ax,dx
- xor dx,dx
- shl ax,6
- add dx,ax
- shl ax,2
- add dx,ax
- les di,back
- mov ax,zl
- shr ax,5
- add di,ax
- mov ax,es:[di]
- les di,buffer
- add di,cx
- add di,dx
- mov es:[di],ax {2 pixels d'un coup!}
- mov ax,zi
- add zl,ax
- lds si,buffer
- add si,cx
- add si,dx
- mov bx,zl
- @@LAB8:
- CMP CX,X2
- JZ @@LAB3
- inc cx
- inc si
- les di,back
- mov ax,bx
- shr ax,7
- add di,ax
- mov ax,es:[di]
- mov ds:[si],ax {2 pixels d'un coup!}
- add bx,zi
- JMP @@LAB8
- @@LAB3:
- Pop ds
- END;
- END;
-
-
- PROCEDURE Line2(x1,y1,x2,y2:WORD;feld:Pointer;VAR m:WORD);
- VAR S2,S4,zi:WORD;
- BEGIN
- zi:=0;
- ASM
- push ds;
- MOV AX,X2
- SUB AX,X1
- JNS @@LAB1
- NEG AX
- @@LAB1:
- MOV BX,Y2
- SUB BX,Y1
- JNS @@LAB2
- NEG BX
- @@LAB2:
- CMP AX,BX
- JGE @@LAB3A
- JMP @@LAB20
- @@LAB3A:
- MOV CX,X1
- CMP CX,X2
- JG @@LAB4
- MOV CX,1
- JMP @@LAB5
- @@LAB4:
- MOV CX,-1
- @@LAB5:
- MOV DX,Y1
- CMP DX,Y2
- JG @@LAB6
- MOV DX,1
- JMP @@LAB7
- @@LAB6:
- MOV DX,-1
- @@LAB7:
- MOV ds,CX
- MOV S2,DX
- ADD BX,BX
- MOV si,BX
- SUB BX,AX
- MOV CX,BX
- SUB CX,AX
- MOV S4,CX
- MOV CX,X1
- MOV DX,Y1
- les di,feld
- mov ax,zi
- add di,ax
- add di,ax
- add di,ax
- add di,ax
- mov es:[di],cx
- add di,2
- mov es:[di],dx
- add ax,1
- mov zi,ax
- @@LAB8:
- CMP CX,X2
- JZ @@LAB3
- mov ax,ds
- ADD CX,ax
- OR BX,BX
- JNS @@LAB10
- ADD BX,si
- JMP @@LAB11
- @@LAB10:
- ADD BX,S4
- ADD DX,S2
- @@LAB11:
- les di,feld
- mov ax,zi
- add di,ax
- add di,ax
- add di,ax
- add di,ax
- mov es:[di],cx
- add di,2
- mov es:[di],dx
- add ax,1
- mov zi,ax
- JMP @@LAB8
- @@LAB20:
- MOV CX,Y1
- CMP CX,Y2
- JG @@LAB12
- MOV CX,1
- JMP @@LAB13
- @@LAB12:
- MOV CX,-1
- @@LAB13:
- MOV DX,X1
- CMP DX,X2
- JG @@LAB14
- MOV DX,1
- JMP @@LAB15
- @@LAB14:
- MOV DX,-1
- @@LAB15:
- MOV ds,CX
- MOV S2,DX
- ADD AX,AX
- MOV si,AX
- SUB AX,BX
- MOV CX,AX
- SUB CX,BX
- MOV S4,CX
- MOV BX,AX
- MOV CX,X1
- MOV DX,Y1
- les di,feld
- mov ax,zi
- add di,ax
- add di,ax
- add di,ax
- add di,ax
- mov es:[di],cx
- add di,2
- mov es:[di],dx
- add ax,1
- mov zi,ax
- @@LAB16:
- CMP DX,Y2
- JZ @@LAB3
- mov ax,ds
- ADD DX,ax
- OR BX,BX
- JNS @@LAB18
- ADD BX,si
- JMP @@LAB19
- @@LAB18:
- ADD BX,S4
- ADD CX,S2
- @@LAB19:
- les di,feld
- mov ax,zi
- add di,ax
- add di,ax
- add di,ax
- add di,ax
- mov es:[di],cx
- add di,2
- mov es:[di],dx
- add ax,1
- mov zi,ax
- JMP @@LAB16
- @@LAB3:
- Pop ds
- END;
- m:=zi;
- END;
-
-
- PROCEDURE coordconv(VAR x1,y1:Integer);
- VAR w,xx1,yy1,xs,ys:Integer;
- sinu,cosi :Integer;
- BEGIN
- w:=angle MOD 360;
- sinu:=tsin[w];
- cosi:=tcos[w];
- xs:=x1;
- ys:=y1;
- ASM
- mov ax,cosi
- mov bx,xs
- sub dx,dx
- imul bx
- mov cl,ah
- mov ch,dl
- mov ax,sinu
- mov bx,ys
- sub dx,dx
- imul bx
- mov al,ah
- mov ah,dl
- sub cx,ax
- mov xx1,cx
- END;
- x1:=xx1;
- ASM
- mov ax,cosi
- mov bx,ys
- sub dx,dx
- imul bx
- mov cl,ah
- mov ch,dl
- mov ax,sinu
- mov bx,xs
- sub dx,dx
- imul bx
- mov al,ah
- mov ah,dl
- add cx,ax
- mov yy1,cx
- END;
- y1:=yy1;
- END;
-
-
- PROCEDURE Init(segp,picture_ofs:WORD);
- BEGIN
- ASM
- push ds
- mov ax,$13
- int $10
- mov ax,segp
- mov es,ax
- mov ds,ax
- mov dx,picture_ofs
- mov ax,$1012
- xor bx,bx
- mov cx,256
- int $10
- pop ds
- END;
- END;
-
-
- PROCEDURE CopperA(buffer:Pointer;miny,maxy:WORD);
- {Copie du tampon vers l'écran sans VBL!}
- BEGIN
- minbuf:=miny;
- maxbuf:=maxy;
- Buf2Scrn;
- END;
-
-
- PROCEDURE ClearBuffer(buffer:Pointer;miny,maxy:WORD);
- {Efface le tampon!}
- BEGIN
- minbuf:=miny;
- maxbuf:=maxy;
- ClrBuf;
- END;
-
-
- PROCEDURE Cube(x1,y1,x2,y2,x3,y3,x4,y4,myy,mxx:Integer);
- {carré!}
- VAR decal,inc1,z,pixel1,pixel2,maxy,inc2:WORD;
- BEGIN
- maxx:=mxx;
- maxy:=myy;
- FOR i:=0 TO 200 DO
- l1[i]:=-2;
- FOR i:=0 to 200 DO
- l2[i]:=-2;
- Line2(x1,y1,x4,y4,Ptr(Seg(l1),Ofs(l1)),pixel1);
- Line2(x2,y2,x3,y3,Ptr(Seg(l2),Ofs(l2)),pixel2);
- IF pixel1>pixel2 THEN
- BEGIN
- IF pixel1>0 THEN
- BEGIN
- inc1:=(maxy*200) DIV pixel1;
- inc2:=(pixel2*100) DIV pixel1;
- END
- ELSE
- BEGIN
- inc1:=0;
- inc2:=0;
- END;
- z :=0;
- decal:=0;
- FOR i:=0 TO pixel1 DO
- BEGIN
- LineAsm((decal DIV 200)*320,l1[i*2],l1[i*2+1]
- ,l2[(z DIV 100)*2],l2[(z DIV 100)*2+1],buffer,back);
- z:=z+inc2;
- IF z DIV 100>pixel2-1 THEN
- z:=(pixel2-1)*100;
- decal:=decal+inc1;
- END;
- END
- ELSE
- BEGIN
- IF pixel2>0 THEN
- BEGIN
- inc1:=(maxy*200) DIV pixel2;
- inc2:=(pixel1*100) DIV pixel2;
- END
- ELSE
- BEGIN
- inc1:=0;
- inc2:=0;
- END;
- z :=0;
- decal:=0;
- FOR i:=0 TO pixel2 DO
- BEGIN
- LineAsm((decal DIV 200)*320,l1[(z DIV 100)*2],l1[(z DIV 100)*2+1]
- ,l2[i*2],l2[i*2+1],buffer,back);
- z:=z+inc2;
- IF z DIV 100>pixel1-1 THEN
- z:=(pixel1-1)*100;
- decal:=decal+inc1;
- END;
- END;
- maxx:=158;
- END;
-
-
- PROCEDURE Cube3(x1,y1,z1,x2,y2,z2,x3,y3,z3,x4,y4,z4,nx,ny,nz:Integer;VAR done:Integer);
- {cube!}
- BEGIN
- angle:=a1;
- coordconv(x1,y1);
- coordconv(nx,ny);
- angle:=a2;
- coordconv(y1,z1);
- coordconv(ny,nz);
- angle:=a3;
- coordconv(x1,z1);
- coordconv(nx,nz);
- done:=0;
- IF nz<z1-15 THEN
- BEGIN
- done:=1;
- angle:=a1;
- coordconv(x2,y2);
- coordconv(x3,y3);
- coordconv(x4,y4);
- angle:=a2;
- coordconv(y2,z2);
- coordconv(y3,z3);
- coordconv(y4,z4);
- angle:=a3;
- coordconv(x2,z2);
- coordconv(x3,z3);
- coordconv(x4,z4);
- x1:=(centerX*(z1+dist)-centerZ*x1) DIV ((z1+dist)-centerZ)+mx;
- y1:=(centerY*(z1+dist)-centerZ*y1) DIV ((z1+dist)-centerZ)+my;
- x2:=(centerX*(z2+dist)-centerZ*x2) DIV ((z2+dist)-centerZ)+mx;
- y2:=(centerY*(z2+dist)-centerZ*y2) DIV ((z2+dist)-centerZ)+my;
- x3:=(centerX*(z3+dist)-centerZ*x3) DIV ((z3+dist)-centerZ)+mx;
- y3:=(centerY*(z3+dist)-centerZ*y3) DIV ((z3+dist)-centerZ)+my;
- x4:=(centerX*(z4+dist)-centerZ*x4) DIV ((z4+dist)-centerZ)+mx;
- y4:=(centerY*(z4+dist)-centerZ*y4) DIV ((z4+dist)-centerZ)+my;
- Cube(x1,y1,x2,y2,x3,y3,x4,y4,198,158);
- END;
- Inc(anzi);
- END;
-
-
- PROCEDURE LineRain(i:WORD;buffer:Pointer);
- BEGIN
- i:=i*320;
- ASM
- push ds
- les di,buffer
- add di,i
- xor cx,cx
- mov al,10
- mov ah,10
- @@l1:
- mov es:[di],ax
- inc al
- inc ah
- inc cx
- add di,2
- cmp cx,160
- jne @@l1
- @@l2:
- mov es:[di],ax
- dec al
- dec ah
- inc cx
- add di,2
- cmp cx,320
- jne @@l2
- pop ds
- END;
- END;
-
-
- PROCEDURE Anim3(buffer:Pointer);
- VAR az1,az2,az3,az4,ax1,ay1,ax2,ay2,ax3,ay3,ax4,ay4:Integer;
- bz1,bz2,bz3,bz4,bx1,by1,bx2,by2,bx3,by3,bx4,by4:Integer;
- cz1,cz2,cz3,cz4,cx1,cy1,cx2,cy2,cx3,cy3,cx4,cy4:Integer;
- dz1,dz2,dz3,dz4,dx1,dy1,dx2,dy2,dx3,dy3,dx4,dy4:Integer;
- ez1,ez2,ez3,ez4,ex1,ey1,ex2,ey2,ex3,ey3,ex4,ey4:Integer;
- fz1,fz2,fz3,fz4,fx1,fy1,fx2,fy2,fx3,fy3,fx4,fy4:Integer;
- anx,any,anz:Integer;
- bnx,bny,bnz:Integer;
- cnx,cny,cnz:Integer;
- dnx,dny,dnz:Integer;
- enx,eny,enz:Integer;
- done,fnx,fny,fnz:Integer;
- mx,my,anzi,dim :Integer;
- BEGIN
- dist :=100;
- dim :=50;
- a1 :=0;
- a2 :=0;
- a3 :=0;
- ax1 :=-50;
- ay1 :=-50;
- ax2 :=50;
- anx :=-50;
- any :=-50;
- anz :=160;
- ay2 :=-50;
- ax3 :=50;
- ay3 :=50;
- ax4 :=-50;
- ay4 :=50;
- az1 :=dim;
- az2 :=dim;
- az3 :=dim;
- az4 :=dim;
- bx1 :=-50;
- by1 :=-50;
- bx2 :=50;
- bnx :=-50;
- bny :=-50;
- bnz :=-160;
- by2 :=-50;
- bx3 :=50;
- by3 :=50;
- bx4 :=-50;
- by4 :=50;
- bz1 :=-dim;
- bz2 :=-dim;
- bz3 :=-dim;
- bz4 :=-dim;
- cx1 :=-50;
- cy1 :=-dim;
- cx2 :=50;
- cnx :=-50;
- cny :=-160;
- cnz :=50;
- cy2 :=-dim;
- cx3 :=+50;
- cy3 :=-dim;
- cx4 :=-50;
- cy4 :=-dim;
- cz1 :=50;
- cz2 :=50;
- cz3 :=-50;
- cz4 :=-50;
- dx1 :=-50;
- dy1 :=dim;
- dx2 :=50;
- dy2 :=dim;
- dnx :=-50;
- dny :=160;
- dnz :=50;
- dx3 :=50;
- dy3 :=dim;
- dx4 :=-50;
- dy4 :=dim;
- dz1 :=50;
- dz2 :=50;
- dz3 :=-50;
- dz4 :=-50;
- ex1 :=dim;
- ey1 :=-50;
- ex2 :=dim;
- enx :=160;
- eny :=-50;
- enz :=50;
- ey2 :=-50;
- ex3 :=dim;
- ey3 :=50;
- ex4 :=dim;
- ey4 :=50;
- ez1 :=50;
- ez2 :=-50;
- ez3 :=-50;
- ez4 :=50;
- fx1 :=-dim;
- fy1 :=-50;
- fx2 :=-dim;
- fnx :=-160;
- fny :=-50;
- fnz :=50;
- fy2 :=-50;
- fx3 :=-dim;
- fy3 :=50;
- fx4 :=-dim;
- fy4 :=50;
- fz1 :=50;
- fz2 :=-50;
- fz3 :=-50;
- fz4 :=50;
- times:=0;
- REPEAT
- ClearBuffer(buffer,0*320,0*320);
- mx :=155;
- my :=120;
- anzi:=0;
- done:=4;
- Cube3(ax1,ay1,az1,ax2,ay2,az2,ax3,ay3,az3,ax4,ay4,az4,anx,any,anz,done);
- IF done=0 THEN
- Cube3(bx1,by1,bz1,bx2,by2,bz2,bx3,by3,bz3,bx4,by4,bz4,bnx,bny,bnz,done);
- Cube3(cx1,cy1,cz1,cx2,cy2,cz2,cx3,cy3,cz3,cx4,cy4,cz4,cnx,cny,cnz,done);
- IF done=0 THEN
- Cube3(dx1,dy1,dz1,dx2,dy2,dz2,dx3,dy3,dz3,dx4,dy4,dz4,dnx,dny,dnz,done);
- Cube3(ex1,ey1,ez1,ex2,ey2,ez2,ex3,ey3,ez3,ex4,ey4,ez4,enx,eny,enz,done);
- IF done=0 THEN
- Cube3(fx1,fy1,fz1,fx2,fy2,fz2,fx3,fy3,fz3,fx4,fy4,fz4,fnx,fny,fnz,done);
- CopperA(buffer,0*320,0*320);
- Inc(times);
- a1:=a1+6;
- a3:=a3+5;
- IF a1>=360
- THEN a1:=a1-360;
- IF a3>=360
- THEN a3:=a3-360;
- UNTIL (times=500);
- END;
-
-
- PROCEDURE Anim2;
- VAR ans2,i,y,mx,d,my,x1,y1,x2,y2,ans:Integer;
- BEGIN
- ans :=0;
- ans2 :=0;
- angle:=0;
- mx :=110;
- my :=60;
- REPEAT
- ClearBuffer(buffer,0*320,0*320);
- FOR y:=0 TO 66 DO
- BEGIN
- i :=y*1;
- x1:=-40;
- x2:=40;
- y2:=i-35;
- y1:=i-35;
- d :=x2;
- IF ans=0 THEN
- BEGIN
- coordconv(x1,d);
- coordconv(x2,d);
- END
- ELSE
- IF ans=1 THEN
- BEGIN
- coordconv(x1,y1);
- coordconv(x2,y1);
- END
- ELSE
- IF ans=2 THEN
- BEGIN
- coordconv(x1,y2);
- coordconv(x2,y2);
- END
- ELSE
- IF ans=3 THEN
- BEGIN
- coordconv(x1,y1);
- coordconv(x2,y1);
- END
- ELSE
- IF ans=4 THEN
- BEGIN
- coordconv(x1,y2);
- coordconv(x2,y2);
- END
- ELSE
- IF ans=5 THEN
- BEGIN
- coordconv(x1,x2);
- coordconv(x2,y1);
- END
- ELSE
- IF ans=6 THEN
- BEGIN
- coordconv(x1,y1);
- coordconv(x2,x2);
- END
- ELSE
- IF ans=7 THEN
- BEGIN
- coordconv(x1,y1);
- coordconv(x2,x1);
- END;
- IF ans=8 THEN
- BEGIN
- coordconv(x1,y1);
- coordconv(x2,x1);
- END
- ELSE
- IF ans=9 THEN
- BEGIN
- coordconv(x1,y2);
- coordconv(x2,y2);
- END;
- Inc(x1,40+mx);
- Inc(x2,40+mx);
- Inc(y1,35+my);
- Inc(y2,35+my);
- LineAsmQuadro(i*3*320,x1,y1,x2,y2,buffer,back,150);
- END;
- CopperA(buffer,0*320,0*320);
- Inc(angle,6);
- IF angle>360 THEN
- BEGIN
- angle:=angle-360;
- Inc(ans);
- IF ans=10 THEN
- BEGIN
- ans:=0;
- Inc(ans2);
- END;
- END;
- UNTIL (ans2=1);
- END;
-
-
- PROCEDURE Anim1;
- VAR mx,my,m,alpha:WORD;
- ans,w,dist,z1,z2,z3,z4,x1,y1,x2,y2,x3,y3,x4,y4:Integer;
- r1,r2,r3:Boolean;
- BEGIN
- mx :=155;
- my :=92;
- dist :=100;
- m :=60;
- alpha:=0;
- times:=0;
- r1 :=False;
- r2 :=False;
- r3 :=False;
- ans :=0;
- REPEAT
- x1:=-60;
- y1:=-60;
- x2:=60;
- y2:=-60;
- x3:=60;
- y3:=60;
- x4:=-60;
- y4:=60;
- z1:=0;
- z2:=0;
- z3:=0;
- z4:=0;
- angle:=alpha;
- IF r1 THEN
- BEGIN
- coordconv(x1,y1);
- coordconv(x2,y2);
- coordconv(x3,y3);
- coordconv(x4,y4);
- END;
- IF r2 THEN
- BEGIN
- coordconv(x1,z1);
- coordconv(x2,z2);
- coordconv(x3,z3);
- coordconv(x4,z4);
- END;
- IF r3 THEN
- BEGIN
- coordconv(y1,z1);
- coordconv(y2,z2);
- coordconv(y3,z3);
- coordconv(y4,z4);
- END;
- x1:=(centerX*(z1+dist)-centerZ*x1) DIV ((z1+dist)-centerZ)+mx;
- y1:=(centerY*(z1+dist)-centerZ*y1) DIV ((z1+dist)-centerZ)+my;
- x2:=(centerX*(z2+dist)-centerZ*x2) DIV ((z2+dist)-centerZ)+mx;
- y2:=(centerY*(z2+dist)-centerZ*y2) DIV ((z2+dist)-centerZ)+my;
- x3:=(centerX*(z3+dist)-centerZ*x3) DIV ((z3+dist)-centerZ)+mx;
- y3:=(centerY*(z3+dist)-centerZ*y3) DIV ((z3+dist)-centerZ)+my;
- x4:=(centerX*(z4+dist)-centerZ*x4) DIV ((z4+dist)-centerZ)+mx;
- y4:=(centerY*(z4+dist)-centerZ*y4) DIV ((z4+dist)-centerZ)+my;
- ClearBuffer(buffer,0*320,0*320);
- Cube(x1,y1,x2,y2,x3,y3,x4,y4,197,158);
- CopperA(buffer,0*320,0*320);
- alpha:=alpha+6;
- Inc(times);
- IF alpha>360 THEN
- BEGIN
- alpha:=alpha-360;
- w :=Random(5);
- IF w=2 THEN
- r1:=False
- ELSE
- r1:=True;
- w :=random(5);
- IF w=2 THEN
- r2:=False
- ELSE
- r2:=True;
- w :=random(5);
- IF w=2 THEN
- r3:=False
- ELSE
- r3:=True;
- Inc(ans);
- END;
- UNTIL ans=13;
- END;
-
-
- PROCEDURE Start;
- BEGIN
- InLine($FA);
- GetIntVec($1B,old_int_truc);
- int_truc:=Ptr(Seg(Nothing),Ofs(Nothing));
- SetIntVec($1B,int_truc);
- InLine($FB);
- MemW[$40:$1A]:=MemW[$40:$1C];
- ClrScr;
- Init(segp2,picture2_ofs);
- Move(back^,MEM[$A000:$0],64000);
- Delay(2000);
- ClearBuffer(buffer,0*320,0*320);
- CopperA(buffer,0*320,0*320);
- move(loader2^,loader^,64000);
- ClearBuffer(buffer,0*320,0*320);
- CopperA(buffer,0*320,0*320);
- Anim1;
- Anim2;
- Anim3(buffer);
- ASM
- mov ax,0003
- int $10
- END;
- FreeMem(paltmp,768);
- FreeMem(buffer,64000);
- FreeMem(buffer2,64000);
- FreeMem(loader,64000);
- FreeMem(loader2,64000);
- InLine($FA);
- SetIntVec($1B,old_int_truc);
- InLine($FB);
- END;
-
-
- BEGIN
- Randomize;
- GetMem(loader,64800);
- GetMem(loader2,64800);
- Assign(f,'texture.raw');
- Reset(f,1);
- BlockRead(f,loader^,64768);
- Close(f);
- move(loader^,loader2^,64768);
- picture2_ofs:=ofs(loader^);
- segp2 :=seg(loader^);
- back :=Ptr(segp2,picture2_ofs+768);
- GetMem(buffer,64000);
- GetMem(buffer2,64000);
- times:=0;
- FOR i:=0 TO 500 DO
- BEGIN
- tsin[i]:=Round(Sin(i/180*PI)*256.0);
- tcos[i]:=Round(Cos(i/180*PI)*256.0);
- END;
- lminy:=0;
- lmaxy:=0;
- angle:=10;
- di:=5;
- GetMem(paltmp,768);
- maxx:=150;
- mx :=130+25;
- my :=60+25;
- way :=1;
- zl1 :=0;
- gy :=0;
- maxx:=158;
- Start;
- END.