SecondReality/FOREST/READ.PAS
2017-09-24 01:45:36 +02:00

218 lines
No EOL
4.6 KiB
ObjectPascal

uses crt,aos1,aos2,aos3,bgr;
const veke = 2800;
procedure setrgb(c,r,g,b:byte);
begin
port[$3c8] := c;
port[$3c9] := r;
port[$3c9] := g;
port[$3c9] := b;
end;
var frames : word;
w : word;
procedure waitr;
begin
asm
mov bx,1
int 0fch
mov frames,ax
end;
end;
function dis_exit:boolean;
var a : byte;
begin
asm
mov bx,2
int 0fch
mov a,al
end;
if a = 0 then dis_exit := false else dis_exit := true;
end;
var f : file;
inx : word;
y,x,t : word;
pal : array[0..768] of byte;
font : array[0..320*31] of byte;
fpal,tmppal : array[0..768] of byte;
scp,sss:word;
{$L routines.obj}
{ dx = Bground seg,
ax = pos seg,
si = pos ofs,
cx = font seg,
bx = font ofs }
procedure putrouts;far;external;
procedure scr(pos:byte);
begin
case pos of
0:asm
mov dx,seg hback
mov ax,seg posi1
mov si,offset posi1
mov cx,seg font
mov bx,offset font
add bx,scp
call putrouts
end;
1:asm
mov dx,seg hback
mov ax,seg posi2
mov si,offset posi2
mov cx,seg font
mov bx,offset font
add bx,scp
call putrouts
end;
2:asm
mov dx,seg hback
mov ax,seg posi3
mov si,offset posi3
mov cx,seg font
mov bx,offset font
add bx,scp
call putrouts
inc scp
end;
end;
end;
var frame : word;
quit : word;
ch : char;
perse : boolean;
fadeout : boolean;
fp : byte;
begin
asm
mov ax,$13
int $10
xor bx,bx
int 0fch
end;
assign(f,'o.sci');
reset(f,1);
for x := 0 to 30 do
begin
seek(f,x*320+778);
blockread(f,font[x*237],237);
end;
close(f);
for x := 0 to sizeof(font) do if font[x] > 0 then inc(font[x],128);
move(mem[seg(hback):ofs(hback)+10],pal,768);
move(mem[seg(hback):ofs(hback)+778], mem[seg(hback):ofs(hback)], 64000);
for x := 0 to 255 do setrgb(x,0,0,0);
move(mem[seg(hback):ofs(hback)],mem[$a000:0],64000);
move(pal,tmppal,768);
fillchar(tmppal,32*3,#0);
fillchar(tmppal[128*3],32*3,#0);
fillchar(fpal,768,#0);
w := 1; { Wait raster routine }
for y := 0 to 63 do
begin
waitr;
for x := 0 to 255 do setrgb(x,fpal[x*3+0],fpal[x*3+1],fpal[x*3+2]);
for x := 0 to 255 do
begin
if fpal[x*3+0] < tmppal[x*3+0] then inc(fpal[x*3+0]);
if fpal[x*3+1] < tmppal[x*3+1] then inc(fpal[x*3+1]);
if fpal[x*3+2] < tmppal[x*3+2] then inc(fpal[x*3+2]);
end;
end;
move(pal,tmppal,768);
move(pal,fpal,768);
fillchar(fpal,32*3,#0);
fillchar(fpal[128*3],32*3,#0);
for x := 0 to 255 do setrgb(x,fpal[x*3+0],fpal[x*3+1],fpal[x*3+2]);
asm
@a: mov ax,0
mov bx,6
int 0fch
cmp dx,0
jl @a
end;
for y := 0 to 150 do waitr;
sss := 0;
scp := 0;
for y := 0 to 63*2 do
begin
waitr;
scr(sss);
if sss = 2 then sss := 0 else inc(sss);
if y and 1 = 1 then
begin
for x := 0 to 176 do setrgb(x,fpal[x*3+0],fpal[x*3+1],fpal[x*3+2]);
for x := 0 to 176 do
begin
if fpal[x*3+0] < tmppal[x*3+0] then inc(fpal[x*3+0]);
if fpal[x*3+1] < tmppal[x*3+1] then inc(fpal[x*3+1]);
if fpal[x*3+2] < tmppal[x*3+2] then inc(fpal[x*3+2]);
end;
end;
end;
fillchar(tmppal,768,#0);
{ Loppu looppi }
frame := 0;
w := 0;
ch := #0;
quit := 0;
repeat
waitr;
scr(sss);
if sss = 2 then sss := 0 else inc(sss);
{ inc(frame);}
asm
mov ax,0
mov bx,6
int 0fch
cmp dx,-11
jnz @a
mov fadeout,1
@a: end;
if fadeout then
begin
if fp = 64 then quit := 1 else inc(fp);
for x := 0 to 255 do
begin
setrgb(x,fpal[x*3+0],fpal[x*3+1],fpal[x*3+2]);
if fpal[x*3+0] > tmppal[x*3+0] then dec(fpal[x*3+0]);
if fpal[x*3+1] > tmppal[x*3+1] then dec(fpal[x*3+1]);
if fpal[x*3+2] > tmppal[x*3+2] then dec(fpal[x*3+2]);
end;
end;
until dis_exit or (frame = veke) or (quit = 1);
end.