home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
HOT Scene Stuff
/
hotscenestuffzyklop1996.iso
/
demos
/
sunknown
/
flamscrl.cpp
< prev
next >
Wrap
C/C++ Source or Header
|
1994-04-07
|
12KB
|
696 lines
// FLAMSCRL /////////////////////////////////////////////////////////////////
// Andreas 0.
// INCLUDES /////////////////////////////////////////////////////////////////
#include <string.h>
#include <fstream.h>
#include <conio.h>
#include <stdlib.h>
#include <dos.h>
#include <stdio.h>
#include "seg.h"
#include "xgraf.h"
#include "timer.h"
// DEFINES //////////////////////////////////////////////////////////////////
#define MINSPEED 150
#define ABSMIN 90
#define WIDTH 40
#define HEIGHT 100
#define SCREEN 88
#define PAGEBASE (2*16000)
#define FLAME 1
#define FONTPOS (WIDTH*(HEIGHT+10))
#define MASKPOS (WIDTH*(HEIGHT+10)+8200)
#define LETTERSTART 4
#define FLAMSTART 0
#define FLAMEND 4
#define MOVSB mov al,[si]; asm mov es:[di],al; asm inc si; asm inc di
// EXTERNALS ////////////////////////////////////////////////////////////////
// FUNCTIONS
extern "C" void movef32(void);
extern "C" void smidigo(void);
// VARS
extern byte rgb[768],
*pressed,
callmidi,
guson;
extern int relspeed;
extern timer_C timer;
// PROTOTYPES ///////////////////////////////////////////////////////////////
void compilemask(byte *stripe,byte *res);
void setpalette(void);
void xoffset(word xoff);
void setlogwidth(word w);
void fade(byte *plt);
// FUNCTIONS ////////////////////////////////////////////////////////////////
// FLAMSCRL
void flamscrl(void)
{
char text[]=" WELCOME TO THE SUPERUNKNOWN ";
int tempdi,
tempax,
tempbx,
tempcx,
tempdx,
tempsi;
byte tempch,
fadepal[64*3],
size=0,
doit=1,
dec_it=0,
bokstavnr=0,
blockpos=0,
maskpos=0,
index=0,
blapal[768],
randtab[256],
frame_byte=0;
word startframe=10,
aa=0,
pb=0,
bokstavln=0,
adr=0,
frames=0;
int x,
y,
delta;
for(x=0;x<256;x++)
randtab[x]=random(2)*16+48;
seg_C flammeseg;
byte *flamme=flammeseg.ptr;
long p_P= (long) flamme;
seg_C dataseg;
byte *data=dataseg.ptr;
long data_P= (long) data;
seg_C lineseg(20);
byte *linja=lineseg.ptr;
word b;
for(b=0;b<65535;b++)
flamme[b]=0;
FILE *brixfil = fopen(BRIXFILE, "rb" );
byte cc;
for(int yy=0;yy<16*14;yy++)
for(int xx=0;xx<16;xx++)
{
fread(&cc,1,1,brixfil);
data[adr]=cc;
adr++;
}
fclose(brixfil);
FILE *palfil = fopen(FLAMEPAL,"rb");
fread(&rgb,1,32,palfil);
fread(&rgb,1,768,palfil);
fclose(palfil);
for(x=0;x<768;x++) rgb[x]>>=2;
adr=WIDTH*(HEIGHT+10);
FILE *maskfil = fopen(MASKFILE,"rb");
for(yy=0;yy<15*28;yy++)
for(int xx=0;xx<19;xx++)
{
fread(&cc,1,1,maskfil);
if (xx<16 && xx)
{
flamme[adr]=cc;
data[adr]=cc;
adr++;
}
}
fclose(maskfil);
outport(SC_INDEX,0x0f02);
frame();
asm mov ax,0xa000
asm mov es,ax
asm xor ax,ax
asm xor di,di
asm mov cx,32768
asm rep stosb
asm mov cx,32768
asm rep stosb
setlogwidth(320+32);
setpalette();
seg_C rleseg(35);
byte *rle = rleseg.ptr;
rle[0]=0;
rle[1]=0;
rle[2]=0;
rle[3]=16;
rle[4]=0;
rle[6]=0;
rle[5]=3*SCREEN;
rle[7]=2*16;
rle[8]=64;
for(x=0;x<80;x++)
for(y=0;y<31;y++)
flamme[MASKPOS+y+x*31]=rle[y];
while (text[size]!='\0')
{
if (text[size]==' ') text[size]='@';
size++;
}
while(bokstavnr<size-1)
{
frames++;
frame_byte+=17;
pb^=PAGEBASE;
doit^=1;
if(doit)
{
dec_it^=1;
asm mov bh,dec_it
asm push ds
asm mov cx,((HEIGHT)+2)*WIDTH
asm lds di,p_P
asm add di,WIDTH
D1:
asm mov ax,[di]
asm add ah,al
asm mov al,ah
asm add ah,[di-1]
asm add ah,[di+WIDTH]
asm jz alla
asm sub ah,bh
asm shr ah,2
alla:
asm xor bh,1
asm add al,[di+2]
asm add al,[di+WIDTH+1]
asm jz ahla
asm sub al,bh
asm shr al,2
ahla:
asm cmp al,64
asm ja al_over
asm jmp check_ah
al_over:
asm mov al,63
check_ah:
asm cmp ah,64
asm ja ah_over
asm jmp D2
ah_over:
asm mov ah,63
D2:
asm xchg al,ah
asm mov [di-WIDTH],ax
asm add di,2
asm sub cx,2
asm jz D3
asm jmp D1
D3:
asm pop ds
for(int j=0;j<WIDTH/2+1;j++)
{
asm mov ax,j
asm add al,frame_byte
asm mov index,al
if(frames>startframe && bokstavnr<(size-7))
delta=randtab[index];
else
delta=0;
flamme[(HEIGHT+1)*WIDTH+(j<<1)+1]=delta;
flamme[(HEIGHT+1)*WIDTH+(j<<1)] =delta;
}
}
blockpos=aa%4;
if(!blockpos)
{
bokstavln++;
bokstavln%=15;
if(!bokstavln)
{
bokstavnr++;
bokstavnr%=size;
}
bokstavln+=(text[bokstavnr]-64)*15l;
}
if(!(blockpos))
{
maskpos++;
maskpos%=15;
adr=maskpos*15l+((text[bokstavnr]-64)*15*15);
if (!adr)
adr=15;
for(y=0;y<12;y++)
linja[y]=flamme[FONTPOS+adr+y+3-15];
compilemask(linja,rle);
}
for(y=0;y<31;y++)
{
flamme[MASKPOS+y+81*31]=rle[y];
flamme[MASKPOS+y+80*31]=rle[y];
}
asm pusha
asm push ds
asm lds si,flamme
asm add si,MASKPOS
movef32(); // From ASMZOOM.ASM
asm pop ds
asm popa
callmidi=0;
if (guson)
smidigo();
frame();
callmidi=guson;
byte startplan=0;
byte sluttplan=1;
byte span=3;
for(byte plan=startplan; plan<=sluttplan; plan++)
{
byte ahmask=span<<(plan*2);
for(byte start=FLAMSTART;start<FLAMEND;start++)
{
int retn = 2-4*(start&1);
int plussi=plan*(retn/2)+(WIDTH-1)*(start&1);
asm mov di,aa
asm add di,2
asm add di,pb
asm add di,SCREEN*240-SCREEN*HEIGHT*2
asm xor ax,ax
asm mov al,start
asm mov bl,WIDTH/2
asm mul bl
asm add di,ax
asm mov tempdi,di
asm mov ax,0xa000
asm mov es,ax
asm pusha
asm push ds
asm lds si,p_P
asm mov bx,si
asm add bx,MASKPOS
asm add si,plussi
asm xor ah,ah
asm mov al,start
asm mov dx,31*WIDTH/2
asm mul dx
asm add bx,ax
asm mov al,2
asm mov ah,ahmask
asm mov dx,SC_INDEX
asm out dx,ax
asm mov dh,WIDTH/2
asm mov tempch,ch
asm cld
s_newline:
asm mov ch,[bx]
asm or ch,ch
asm jnz okay
asm add di,1
asm add si,retn
asm add bx,31
asm dec dh
asm jz nomore
asm jmp s_newline
okay:
asm mov tempbx,bx
asm inc bx
asm mov tempdi,di
asm mov tempsi,si
s_newmask:
asm mov ax,[bx]
asm add di,ax
asm add bx,2
asm mov ax,[bx]
asm shr ax,1
asm add si,ax
asm add bx,2
asm mov cl,[bx]
asm inc bx
asm mov al,[bx]
asm inc bx
s_newpix:
asm mov ah,[si]
asm add si,WIDTH
asm or ah,al
asm mov es:[di],ah
asm add di,SCREEN
asm mov es:[di],ah
asm add di,SCREEN
asm dec cl
asm jnz s_newpix
asm dec ch
asm jnz s_newmask
asm mov bx,tempbx
asm add bx,31
asm mov si,tempsi
asm add si,retn
asm mov di,tempdi
asm inc di
asm dec dh
asm jnz s_newline
nomore:
asm pop ds
asm popa
}
}
if((blockpos<2))
{
word tempsomething;
asm mov ax,15
asm mov bx,bokstavln
asm mul bx
asm push ds
asm lds si,data_P
asm mov tempsomething,ax
asm mov di,SCREEN-LETTERSTART
asm add di,aa
asm add di,pb
asm mov ax,0xa000
asm mov es,ax
asm mov ax,0x0102
asm mov dx,SC_INDEX
asm mov cl,0
new_mask:
asm mov dx,SC_INDEX
asm mov al,02
asm out dx,ax
b0:
asm mov ch,0
b1:
asm mov dl,16
asm mov bx,WIDTH*(HEIGHT+10)
asm add bl,ch
asm add bx,tempsomething
asm mov si,bx
asm mov dh,[si]
asm cmp dh,'.'
asm jne b1_1
asm mov dh,0xc
asm jmp b2
b1_1:
asm cmp dh,' '
asm jne b1_2
asm mov dh,0xd
asm jmp b2
b1_2:
asm sub dh,49
asm cmp dh,10
asm jb b2
asm sub dh,7
b2:
asm mov bl,dh
asm xor bh,bh
asm shl bx,8
asm add bl,cl
asm mov si,bx
new_b_pix:
asm MOVSB
asm add si,3
asm MOVSB
asm add si,3
asm MOVSB
asm add si,3
asm MOVSB
asm add si,3
asm add di,SCREEN-4
asm dec dl
asm jnz new_b_pix
asm inc ch
asm cmp ch,15
asm jne b1
asm cmp ah,8
asm je nomore2
asm sub di,SCREEN*240
asm shl ah,1
asm inc cl
asm jmp new_mask
nomore2:
asm pop ds
pb^=PAGEBASE;
asm mov ax,15
asm mov bx,bokstavln
asm mul bx
asm push ds
asm lds si,data_P
asm mov tempsomething,ax
asm mov di,SCREEN-LETTERSTART
asm add di,aa
asm add di,pb
asm mov ax,0xa000
asm mov es,ax
asm mov ax,0x0102
asm mov dx,SC_INDEX
asm mov cl,0
new_mask2:
asm mov dx,SC_INDEX
asm mov al,02
asm out dx,ax
b02:
asm mov ch,0
b12:
asm mov dl,16
asm mov bx,WIDTH*(HEIGHT+10)
asm add bl,ch
asm add bx,tempsomething
asm mov si,bx
asm mov dh,[si]
asm cmp dh,'.'
asm jne b1_12
asm mov dh,0xc
asm jmp b22
b1_12:
asm cmp dh,' '
asm jne b1_22
asm mov dh,0xd
asm jmp b22
b1_22:
asm sub dh,49
asm cmp dh,10
asm jb b22
asm sub dh,7
b22:
asm mov bl,dh
asm xor bh,bh
asm shl bx,8
asm add bl,cl
asm mov si,bx
new_b_pix2:
asm MOVSB
asm add si,3
asm MOVSB
asm add si,3
asm MOVSB
asm add si,3
asm MOVSB
asm add si,3
asm add di,SCREEN-4
asm dec dl
asm jnz new_b_pix2
asm inc ch
asm cmp ch,15
asm jne b12
asm cmp ah,8
asm je nomore22
asm sub di,SCREEN*240
asm shl ah,1
asm inc cl
asm jmp new_mask2
nomore22:
asm pop ds
pb^=PAGEBASE;
}
aa++;
aa++;
b++;
b%=(256/4);
xoffset(aa+pb);
}
thend:
outport(SC_INDEX,0x0f02);
frame();
asm mov ax,0xa000
asm mov es,ax
asm xor ax,ax
asm xor di,di
asm mov cx,32768
asm rep stosb
asm mov cx,32768
asm rep stosb
setlogwidth(320);
xoffset(0);
}
// SETPALETTE
void setpalette()
{
int i;
_SI = (word)&rgb[0];
asm mov cx,768
asm mov dx,0x03c8
asm xor al,al
asm out dx,al
asm inc dx
l1:
asm outsb
asm dec cx
asm jnz l1
}
// XOFFSET
void xoffset(word xoff)
{
asm mov ax,xoff
asm mov bh,al
asm mov ch,ah
asm mov bl,0x0d
asm mov cl,0x0c
asm mov ah,8
asm mov dx,CRTC_INDEX
asm mov ax,bx
asm cli
asm out dx,ax
asm mov ax,cx
asm out dx,ax
asm sti
}
// SETLOGWIDTH
void setlogwidth(word w)
{
asm mov cx,w
asm mov dx,CRTC_INDEX
asm mov al,0x13
asm out dx,al
asm inc dx
asm mov ax,cx
asm shr ax,3
asm out dx,al
}
// STRIPTYPE
byte striptype(byte in)
{
if (in=='.')
return 64;
if (in==' ')
return 0;
return 255;
}
// COMPILEMASK
void compilemask(byte *stripe,byte *res)
{
byte here;
int treff=0;
word last_one=0;
word last_onef=0;
for (int scan=0; scan<12; scan++)
{
here=striptype(stripe[scan]);
if (relspeed<ABSMIN)
here=255;
if (here<255 && (here || relspeed>MINSPEED))
{
word adr=SCREEN*16*(scan)+SCREEN*8;
word adrf=WIDTH*16*(scan)+WIDTH*8;
res[1+treff*6]=(adr-last_one);
res[2+treff*6]=(adr-last_one)>>8;
res[3+treff*6]=(adrf-last_onef);
res[4+treff*6]=(adrf-last_onef)>>8;
byte len=0;
while (striptype(stripe[scan])==here && scan<12)
{
len++;
scan++;
}
res[5+treff*6]=len*8;
res[6+(treff++)*6]=here;
last_one=adr+SCREEN*len*16;
last_onef=adrf+WIDTH*len*16;
}
}
res[0]=treff;
}
// FADE
void fade(byte *plt)
{
_SI = (word) &plt[0];
asm mov cx,64*3
asm mov dx,0x03c8
asm mov al,64
asm xor ah,ah
asm out dx,al
asm inc dx
l1:
asm outsb
asm dec cx
asm jnz l1
}