grafX2/dat/MAKEDAT.PAS
Adrien Destugues 306a004e36 First upload of the code.
git-svn-id: svn://pulkomandy.tk/GrafX2/trunk@2 416bcca6-2ee7-4201-b75f-2eb2f807beb1
2007-04-14 20:18:30 +00:00

739 lines
20 KiB
Plaintext
Raw Blame History

program makedat;
type tpalette=array[0..767] of byte;
var palette:tpalette;
{****************************************************************************}
{****************************************************************************}
{****************************************************************************}
Procedure XMODE;assembler;
const
X360Y270 : array[0..18] of word =
( $12E7, $6B00, $5901, $5A02, $8E03, $5E04, $8A05, $3006, $F007, $0008,
$6109, $2010, $A911, $1B12, $2D13, $0014, $1F15, $2F16, $E317 );
asm
push ds
mov ax,13h
int 10h
mov dx,3c4h
mov ax,0604h
out dx,ax
mov ax,0100h
out dx,ax
lea si,X360Y270
lodsb
or al,al
jz @@DontSetDot
mov dx,3C2h
out dx,al
@@DontSetDot:
mov dx,3C4h
mov ax,0300h
out dx,ax
mov dx,3D4h
mov al,11h
out dx,al
inc dx
in al,dx
and al,07fh
out dx,al
dec dx
cld
xor cx,cx
lodsb
mov cl,al
@@SetCRTParmsLoop:
lodsw
out dx,ax
loop @@SetCRTParmsLoop
mov dx,3C4h
mov ax,0f02h
out dx,ax
mov ax,0A000h
mov es,ax
sub di,di
sub ax,ax
mov cx,8000h
rep stosw
mov dx,3D4h
mov al,13h
out dx,al
inc dx
mov ax,90
shr ax,1
out dx,al
pop ds
end;
Procedure pixel(x,y : word;coul : byte);assembler;
asm
mov dx,3C4h
mov ax,0102h
mov cx,x
and cx,3
shl ah,cl
out dx,ax
mov ax,0A000h
mov es,ax
mov ax,y
mov bx,90
mul bx
mov bx,x
shr bx,2
add ax,bx
mov di,ax
mov al,coul
stosb
end;
Function lit_pixel(x,y : word):byte;
var a : byte;
begin
asm
mov ax,0A000h
mov es,ax
mov ax,y
mov bx,90
mul bx
mov bx,x
mov cl,bl
and cl,3
shr bx,2
add ax,bx
mov di,ax
mov dx,3CEh
mov al,4
mov ah,cl
out dx,ax
mov al,[es:di]
mov a,al
end;
lit_pixel:=a;
end;
procedure set_palette; assembler;
asm
push ds
lea si,palette
mov dx,3C8h
xor al,al
out dx,al
inc dl
mov cx,768
rep outsb
pop ds
end;
{----------------------------------------------------------------------------}
{----------------------------------------------------------------------------}
{----------------------------------------------------------------------------}
type t_os_tampon=array[0..63999] of byte;
var os_index:word;
var os_tampon:^t_os_tampon;
function octet_suivant(var f:file):byte;
var effect_result:word;
begin
inc(os_index);
if (os_index>=64000) then
begin
{$I-}
blockread(f,os_tampon^,64000,effect_result);
{$I+}
os_index:=0;
end;
octet_suivant:=os_tampon^[os_index];
end;
procedure init_os;
begin
new(os_tampon);
os_index:=64000;
end;
procedure close_os;
begin
dispose(os_tampon);
end;
{----------------------------------------------------------------------------}
var eo_index:word;
var eo_tampon:^t_os_tampon;
procedure ecrire_octet(var f:file; octet:byte);
var
effect_result:word;
begin
eo_tampon^[eo_index]:=octet;
inc(eo_index);
if (eo_index>=64000) then
begin
blockwrite(f,eo_tampon^,64000,effect_result);
eo_index:=0;
end;
end;
procedure init_eo;
begin
new(eo_tampon);
eo_index:=0;
end;
procedure close_eo(var f:file);
var effect_result:word;
begin
if eo_index>0 then blockwrite(f,eo_tampon^,eo_index,effect_result);
dispose(eo_tampon);
end;
{----------------------------------------------------------------------------}
{----------------------------------------------------------------------------}
{----------------------------------------------------------------------------}
{--------------------- DEPACKER une IMAGE au format PKM ---------------------}
procedure load_PKM(nom_fichier:string);
{errcode retourn<72>: 0=OK , 1=pas un PKM , 2=taille incorrecte}
type
header = record {taille: 780 octets}
ident : array[1..3] of char; { cha<68>ne "PKM" }
methode : byte; { m<>thode de compression: }
{ 0 = compression en ligne (c)KM }
{ autres = inconnues pour le moment }
Recon1 : byte; { octet de reconnaissance sur 1 octet }
Recon2 : byte; { octet de reconnaissance sur 2 octets }
longx : word; { taille de l'image en X }
longy : word; { taille de l'image en Y }
palette : tpalette; { palette RVB 256*3 }
jump : word; { taille du saut entre le header et l'image }
end;
var
TailleX,TailleY:word;
errcode:byte;
coul,octet:byte;
taille_fichier:word;
i,j,k:word;
c:longint;
offsX,offsY,X,Y:word;
fich:file;
head: header;
taille_image: longint;
begin
offsX:=0;
offsY:=0;
assign(fich,Nom_Fichier);
reset(fich,1);
taille_fichier:=filesize(fich);
blockread(fich,head,SizeOf(Header));
if Head.LongY>270 then Head.LongY:=270;
if (head.ident<>'PKM') then
begin
errcode:=1;
exit;
end;
if (head.longX>360) then
begin
errcode:=2;
exit;
end;
{ d<>finition de la palette }
Palette:=head.palette;
set_palette;
TailleX:=Head.LongX;
TailleY:=Head.LongY;
taille_image:=Head.LongX;
taille_image:=taille_image*Head.LongY;
Seek(fich,SizeOf(Header)+Head.Jump);
init_os;
j:=0;
octet:=octet_suivant(fich);
c:=0;
while (c<taille_image) and (j<taille_fichier-SizeOf(Header)-Head.Jump) do
begin
if (octet<>Head.Recon1) and (octet<>Head.Recon2)
then
begin
X:=c mod head.longX;
Y:=c div head.longX;
if (X<360) and (Y<270) then
pixel(X,Y,octet);
inc(j);
octet:=octet_suivant(fich);
inc(c);
end
else
begin
if octet=Head.Recon1
then
begin
inc(j);
octet:=octet_suivant(fich);
coul:=octet;
inc(j);
octet:=octet_suivant(fich)-1;
for i:=0 to octet do
begin
X:=(c+i) mod head.longX;
Y:=(c+i) div head.longX;
if (X<360) and (Y<270) then
pixel(X,Y,coul);
end;
c:=c+octet+1;
inc(j);
octet:=octet_suivant(fich);
end
else
begin
inc(j);
octet:=octet_suivant(fich);
coul:=octet;
inc(j);
octet:=octet_suivant(fich);
k:=(octet shl 8)+octet_suivant(fich);
for i:=0 to (k-1) do
begin
X:=(c+i) mod head.longX;
Y:=(c+i) div head.longX;
if (X<360) and (Y<270) then
pixel(X,Y,coul);
end;
c:=c+k;
j:=j+2;
octet:=octet_suivant(fich);
end;
end;
end;
close_os;
close(fich);
errcode:=0;
end;
{****************************************************************************}
{****************************************************************************}
{****************************************************************************}
var Crypt_curseur:byte;
const Crypt_cle:string[13]='Sunset Design';
function crypt(octet:byte):byte;
begin
crypt:=octet xor ord(Crypt_cle[Crypt_curseur]);
Crypt_curseur:=(Crypt_curseur mod 13)+1;
end;
procedure Ecrire_palette(var Fichier:file);
var i:word;
begin
for i:=0 to 767 do ecrire_octet(Fichier,crypt(palette[i]));
end;
procedure Lire_et_ecrire_sprite(var Fichier:file; x1,y1,x2,y2:word);
var i,j:word;
begin
for j:=y1 to y2 do
for i:=x1 to x2 do
ecrire_octet(Fichier,crypt(lit_pixel(i,j)));
end;
procedure Ecrire_trames_predefinies(var Fichier:file);
var
n,i,j:word;
Octet:byte;
Pixel_lu:byte;
begin
for n:=0 to 11 do {Pour chaque trame pr<70>d<EFBFBD>finie}
begin
for j:=0 to 15 do
begin
Octet:=0;
for i:=0 to 7 do
begin
Octet:=(Octet shl 1);
Pixel_lu:=lit_pixel(9+(17*n)+i,196+j);
if Pixel_lu>0 then
inc(Octet);
end;
ecrire_octet(Fichier,crypt(Octet));
Octet:=0;
for i:=0 to 7 do
begin
Octet:=(Octet shl 1);
Pixel_lu:=lit_pixel(1+(17*n)+i,196+j);
if Pixel_lu>0 then
inc(Octet);
end;
ecrire_octet(Fichier,crypt(Octet));
end;
end;
end;
procedure Rajouter_fichier(var Fichier:file;Nom_fichier:string;Crypter:boolean);
var
Fichier_a_ajouter:file;
Taille :word;
Indice :word;
begin
assign (Fichier_a_ajouter,Nom_fichier);
reset (Fichier_a_ajouter,1);
Taille:=filesize(Fichier_a_ajouter);
init_os;
if (Crypter) then
for Indice:=1 to Taille do
ecrire_octet(Fichier,crypt(octet_suivant(Fichier_a_ajouter)))
else
for Indice:=1 to Taille do
ecrire_octet(Fichier,octet_suivant(Fichier_a_ajouter));
close_os;
close(Fichier_a_ajouter);
end;
procedure Coder_partie_de_fonte(var Fichier:file;Pos_X,Pos_Y,Nb_char:word);
var
X,Y:word;
Indice_char:word;
Couleur_temporaire:byte;
begin
for Indice_char:=1 to Nb_char do
begin
for X:=0 to 5 do
for Y:=0 to 7 do
begin
Couleur_temporaire:=lit_pixel(Pos_X+X,Pos_Y+Y);
if not (Couleur_temporaire in [25,7,15])
then Couleur_temporaire:=0;
ecrire_octet(Fichier,crypt(Couleur_temporaire));
end;
inc(Pos_X,6);
end;
end;
var
Fichier:file;
Position_de_depart_de_la_section_d_aide:longint;
Nombre_de_lignes_d_aide :word;
Nombre_d_octets_utilises:word;
procedure Demarrer_section_d_aide;
begin
Nombre_de_lignes_d_aide :=0;
Nombre_d_octets_utilises:=0;
assign(Fichier,'GFX2.DAT');
reset (Fichier,1);
Position_de_depart_de_la_section_d_aide:=filesize(Fichier);
seek(Fichier,Position_de_depart_de_la_section_d_aide);
{On <20>crit temporairement des valeurs erron<6F>es dans le fichier:}
blockwrite(Fichier,Nombre_de_lignes_d_aide ,2); {Nb de lignes}
blockwrite(Fichier,Nombre_d_octets_utilises,2); {Nb d'octets utilis<69>s}
end;
procedure Terminer_section_d_aide;
begin
seek (Fichier,Position_de_depart_de_la_section_d_aide);
{On <20>crit d<>finitivement les valeurs correctes dans le fichier:}
blockwrite(Fichier,Nombre_de_lignes_d_aide ,2); {Nb de lignes}
blockwrite(Fichier,Nombre_d_octets_utilises,2); {Nb d'octets utilis<69>s}
close (Fichier);
end;
const
TITRE = 1;
SOUS_TITRE = 2;
NORMAL = 3;
T = TITRE;
S = SOUS_TITRE;
N = NORMAL;
{$I TABLES}
procedure Ecrire_ligne_d_aide(De_type:byte;Chaine:string);
var
Code:byte; {Code <20> inscrire dans le fichier}
Indice:byte; {Indice de balayage de la cha<68>ne}
begin
if length(Chaine)>44 then
begin
close (Fichier);
asm
mov ax,3
int 10h
end;
writeln('ERREUR DANS L''AIDE !!! Il y a une ligne qui est trop longue !!!');
halt(1);
end;
case De_type of
TITRE :
begin
{1<>re ligne:}
{On code la taille de la 1<>re ligne cha<68>ne:}
Code:=(length(Chaine) shl 1) or $80;
blockwrite(Fichier,Code,1);
{On code la 1<>re ligne de la cha<68>ne selon la table des caract<63>res}
{de titrage:}
for Indice:=1 to length(Chaine) do
begin
Code:=TABLE_TITRE[ord(Chaine[Indice])];
blockwrite(Fichier,Code,1);
inc(Code);
blockwrite(Fichier,Code,1);
end;
{On met <20> jour les compteurs:}
inc(Nombre_de_lignes_d_aide);
inc(Nombre_d_octets_utilises,(length(Chaine) shl 1)+1);
{2<>me ligne:}
{On code la taille de la 2<>me ligne cha<68>ne:}
Code:=(length(Chaine) shl 1) or $80;
blockwrite(Fichier,Code,1);
{On code la 2<>me ligne de la cha<68>ne selon la table des caract<63>res}
{de titrage:}
for Indice:=1 to length(Chaine) do
begin
Code:=TABLE_TITRE[ord(Chaine[Indice])];
if Chaine[Indice] in ['A'..'V']
then inc(Code,44)
else inc(Code,40);
blockwrite(Fichier,Code,1);
inc(Code);
blockwrite(Fichier,Code,1);
end;
{On met <20> jour les compteurs:}
inc(Nombre_de_lignes_d_aide);
inc(Nombre_d_octets_utilises,(length(Chaine) shl 1)+1);
end;
SOUS_TITRE :
begin
{On code la taille de la cha<68>ne:}
Code:=length(Chaine);
blockwrite(Fichier,Code,1);
{On code la cha<68>ne selon la table des sous-titres:}
for Indice:=1 to length(Chaine) do
begin
Code:=TABLE_SOUS_TITRE[ord(Chaine[Indice])];
blockwrite(Fichier,Code,1);
end;
{On met <20> jour les compteurs:}
inc(Nombre_de_lignes_d_aide);
inc(Nombre_d_octets_utilises,length(Chaine)+1);
end;
NORMAL :
begin
{On code la taille de la cha<68>ne:}
Code:=length(Chaine);
blockwrite(Fichier,Code,1);
{On code la cha<68>ne selon la table des caract<63>res normaux:}
for Indice:=1 to length(Chaine) do
begin
Code:=TABLE_NORMAL[ord(Chaine[Indice])];
blockwrite(Fichier,Code,1);
end;
{On met <20> jour les compteurs:}
inc(Nombre_de_lignes_d_aide);
inc(Nombre_d_octets_utilises,length(Chaine)+1);
end;
end;
end;
{$I HLP_GRET}
{$I HLP_CRDT}
{$I HLP_RGST}
BEGIN
XMODE;
Load_PKM('GFX2.PKM');
assign(Fichier,'GFX2.DAT');
rewrite(Fichier,1);
init_eo;
Crypt_curseur:=1;
Ecrire_palette(Fichier);
Lire_et_ecrire_sprite(Fichier, 1, 1,254, 44); {Menu}
Lire_et_ecrire_sprite(Fichier, 2, 47, 15, 60); {Shade}
Lire_et_ecrire_sprite(Fichier, 19, 47, 32, 60); {Colorize}
Lire_et_ecrire_sprite(Fichier, 36, 47, 49, 60); {Smooth}
Lire_et_ecrire_sprite(Fichier, 53, 47, 66, 60); {Tiling}
Lire_et_ecrire_sprite(Fichier, 70, 47, 83, 60); {Stencil}
Lire_et_ecrire_sprite(Fichier, 87, 47,100, 60); {Sieve}
Lire_et_ecrire_sprite(Fichier,104, 47,117, 60); {Grid}
Lire_et_ecrire_sprite(Fichier,121, 47,134, 60); {Mask}
Lire_et_ecrire_sprite(Fichier,138, 47,151, 60); {Smear}
Lire_et_ecrire_sprite(Fichier, 1, 85, 15, 99); {Fleche}
Lire_et_ecrire_sprite(Fichier, 17, 85, 31, 99); {Viseur}
Lire_et_ecrire_sprite(Fichier, 65, 85, 79, 99); {Viseur pipette}
Lire_et_ecrire_sprite(Fichier, 33, 85, 47, 99); {Sablier}
Lire_et_ecrire_sprite(Fichier, 49, 85, 63, 99); {Multidirectionnel}
Lire_et_ecrire_sprite(Fichier, 81, 85, 95, 99); {Horizontal}
Lire_et_ecrire_sprite(Fichier, 97, 85,111, 99); {Viseur fin}
Lire_et_ecrire_sprite(Fichier,113, 85,127, 99); {Viseur pipette fin}
Lire_et_ecrire_sprite(Fichier, 2,102, 15,115); {Dessin continu}
Lire_et_ecrire_sprite(Fichier, 19,102, 32,115); {Dessin interrompu}
Lire_et_ecrire_sprite(Fichier, 36,102, 49,115); {Dessin point}
Lire_et_ecrire_sprite(Fichier, 53,102, 66,115); {Pinceau-brosse}
Lire_et_ecrire_sprite(Fichier, 70,102, 83,115); {Courbe 3 pts}
Lire_et_ecrire_sprite(Fichier, 87,102,100,115); {Courbe 4 pts}
Lire_et_ecrire_sprite(Fichier,104,102,117,115); {Ligne}
Lire_et_ecrire_sprite(Fichier,121,102,134,115); {K-Line}
Lire_et_ecrire_sprite(Fichier,138,102,151,115); {Lignes concentiques}
Lire_et_ecrire_sprite(Fichier, 1,120, 16,135); {Pinceau 1}
Lire_et_ecrire_sprite(Fichier, 18,120, 33,135); {Pinceau 2}
Lire_et_ecrire_sprite(Fichier, 35,120, 50,135); {Pinceau 3}
Lire_et_ecrire_sprite(Fichier, 52,120, 67,135); {Pinceau 4}
Lire_et_ecrire_sprite(Fichier, 69,120, 84,135); {Pinceau 5}
Lire_et_ecrire_sprite(Fichier, 86,120,101,135); {Pinceau 6}
Lire_et_ecrire_sprite(Fichier,103,120,118,135); {Pinceau 7}
Lire_et_ecrire_sprite(Fichier,120,120,135,135); {Pinceau 8}
Lire_et_ecrire_sprite(Fichier,137,120,152,135); {Pinceau 9}
Lire_et_ecrire_sprite(Fichier,154,120,169,135); {Pinceau 10}
Lire_et_ecrire_sprite(Fichier,171,120,186,135); {Pinceau 11}
Lire_et_ecrire_sprite(Fichier,188,120,203,135); {Pinceau 12}
Lire_et_ecrire_sprite(Fichier, 1,137, 16,152); {Pinceau 13}
Lire_et_ecrire_sprite(Fichier, 18,137, 33,152); {Pinceau 14}
Lire_et_ecrire_sprite(Fichier, 35,137, 50,152); {Pinceau 15}
Lire_et_ecrire_sprite(Fichier, 52,137, 67,152); {Pinceau 16}
Lire_et_ecrire_sprite(Fichier, 69,137, 84,152); {Pinceau 17}
Lire_et_ecrire_sprite(Fichier, 86,137,101,152); {Pinceau 18}
Lire_et_ecrire_sprite(Fichier,103,137,118,152); {Pinceau 19}
Lire_et_ecrire_sprite(Fichier,120,137,135,152); {Pinceau 20}
Lire_et_ecrire_sprite(Fichier,137,137,152,152); {Pinceau 21}
Lire_et_ecrire_sprite(Fichier,154,137,169,152); {Pinceau 22}
Lire_et_ecrire_sprite(Fichier,171,137,186,152); {Pinceau 23}
Lire_et_ecrire_sprite(Fichier,188,137,203,152); {Pinceau 24}
Lire_et_ecrire_sprite(Fichier, 1,154, 16,169); {Pinceau 25}
Lire_et_ecrire_sprite(Fichier, 18,154, 33,169); {Pinceau 26}
Lire_et_ecrire_sprite(Fichier, 35,154, 50,169); {Pinceau 27}
Lire_et_ecrire_sprite(Fichier, 52,154, 67,169); {Pinceau 28}
Lire_et_ecrire_sprite(Fichier, 69,154, 84,169); {Pinceau 29}
Lire_et_ecrire_sprite(Fichier, 86,154,101,169); {Pinceau 30}
Lire_et_ecrire_sprite(Fichier,103,154,118,169); {Pinceau 31}
Lire_et_ecrire_sprite(Fichier,120,154,135,169); {Pinceau 32}
Lire_et_ecrire_sprite(Fichier,137,154,152,169); {Pinceau 33}
Lire_et_ecrire_sprite(Fichier,154,154,169,169); {Pinceau 34}
Lire_et_ecrire_sprite(Fichier,171,154,186,169); {Pinceau 35}
Lire_et_ecrire_sprite(Fichier,188,154,203,169); {Pinceau 36}
Lire_et_ecrire_sprite(Fichier, 1,171, 16,186); {Pinceau 37}
Lire_et_ecrire_sprite(Fichier, 18,171, 33,186); {Pinceau 38}
Lire_et_ecrire_sprite(Fichier, 35,171, 50,186); {Pinceau 39}
Lire_et_ecrire_sprite(Fichier, 52,171, 67,186); {Pinceau 40}
Lire_et_ecrire_sprite(Fichier, 69,171, 84,186); {Pinceau 41}
Lire_et_ecrire_sprite(Fichier, 86,171,101,186); {Pinceau 42}
Lire_et_ecrire_sprite(Fichier,103,171,118,186); {Pinceau 43}
Lire_et_ecrire_sprite(Fichier,120,171,135,186); {Pinceau 44}
Lire_et_ecrire_sprite(Fichier,137,171,152,186); {Pinceau 45}
Lire_et_ecrire_sprite(Fichier,154,171,169,186); {Pinceau 46}
Lire_et_ecrire_sprite(Fichier,171,171,186,186); {Pinceau 47}
Lire_et_ecrire_sprite(Fichier,188,171,203,186); {Pinceau 48}
Lire_et_ecrire_sprite(Fichier, 1,188, 7,194); {Diskette 3"<22>}
Lire_et_ecrire_sprite(Fichier, 9,188, 15,194); {Diskette 5"<22>}
Lire_et_ecrire_sprite(Fichier, 17,188, 23,194); {HDD}
Lire_et_ecrire_sprite(Fichier, 25,188, 31,194); {CD-ROM}
Lire_et_ecrire_sprite(Fichier, 33,188, 39,194); {Network}
Lire_et_ecrire_sprite(Fichier, 1,213,231,268); {Logo GrafX2}
Ecrire_trames_predefinies(Fichier);
Rajouter_fichier(Fichier,'FONTE1.FNT',true); {Fonte syst<73>me}
Rajouter_fichier(Fichier,'FONTE2.FNT',true); {Fonte exotique}
Load_PKM('FONTS.PKM');
Coder_partie_de_fonte(Fichier,0,121,45); {Petites fontes}
Coder_partie_de_fonte(Fichier,0,129,45);
Coder_partie_de_fonte(Fichier,0,137,45);
Coder_partie_de_fonte(Fichier,0,145,12);
Coder_partie_de_fonte(Fichier,0,153,44); {Grosse fonte}
Coder_partie_de_fonte(Fichier,0,161,44);
Coder_partie_de_fonte(Fichier,0,169,40);
Coder_partie_de_fonte(Fichier,0,177,40);
close_eo(Fichier);
close (Fichier);
asm
mov ax,3
int 10h
end;
Generer_l_aide_Credits;
Generer_l_aide_Register;
Generer_l_aide_Greetings;
reset(Fichier,1);
seek(Fichier,filesize(Fichier));
init_eo;
Rajouter_fichier(Fichier,'GFX2.INI',false);
close_eo(Fichier);
writeln('Le fichier GFX2.DAT est cr<63><72>. (taille = ',filesize(Fichier),' octets)');
close(Fichier);
END.