Initial put

This commit is contained in:
Ben N
2014-06-14 13:53:43 -05:00
commit ded6b82878
54 changed files with 19240 additions and 0 deletions
+6
View File
@@ -0,0 +1,6 @@
copy *.c backup
copy *.h backup
copy *.asm backup
copy *.prj backup
copy *.dsk backup
copy _*.obj backup
BIN
View File
Binary file not shown.
BIN
View File
Binary file not shown.
BIN
View File
Binary file not shown.
+2
View File
@@ -0,0 +1,2 @@
fgrab /ega ted.nsc
copy egalatch.ted _tedchar.ega
+12
View File
@@ -0,0 +1,12 @@
//////////////////////////////////////
//
// Graphics DEFINE file for .TED
// FGRAB-ed on Thu Aug 08 17:33:46 1991
//
//////////////////////////////////////
//
// Thank you for using FGRAB!
//
+97
View File
@@ -0,0 +1,97 @@
TED 5.0 Features
---------------------------------------------------------------------------
__ Handles all current tile types with ease of expansion for future sizes.
Current sizes are: 8x8,16x16,32x32. Only one tile size is permitted per
map set.
__ Handles any amount of tiles that will fit in EMS memory. If EMS is not
present, you can't use TED 5.0!
__ Handles masked and non-masked tiles.
__ Each map has 3 planes: background tiles, foreground tiles, and extra
info. The extra info plane will blit icons for values 0-63 (?), higher
values will be printed as hex. Planes will be selected upon project
creation.
__ Must have ability to turn on/off each individual plane so all planes
can be on or off at once.
__ Video modes supported will be CGA 320x200, EGA 320x200/640x480/800x600,
VGA 320x200 256-color.
__ Map Morph feature will allow user to select a block area and make snap-
shots of it, modify the area, make another snapshot, etc. until the
morph process is completed. Full editing capabilities will include:
DELETE FRAME, INSERT FRAME, MAKE SNAPSHOT.
__ TileInfo feature will allow user to edit tile attributes. Editing capa-
bilities will include: ADD, DELETE, CHANGE NAME.
__ TED editing feature will include:
__ Flood Fill
__ Block Fill
__ Copy Block (from tile maps as well) with SparseTile handling
__ Paste (with floating corners)
__ Draw
__ Line
__ Other features:
__ Info Bar (on/off)
__ Tile Search
__ Map Info
__ ScrollKeys (SHIFT for full screen moves)
__ Right-Button tile-pickup
__ Map Resizing (with Edge Selection)
__ X,Y coords in Hex & Dec
__ All numeric input will support HEX,DEC,BIN
__ Map files will be saved as either MAPTEMP.ext for the RLEW-only
(development) version, or GAMEMAPS.ext for the HUFF/RLEW version.
__ Dialogs will be implemented.
__ Project selection.
__ Map selection by name!
__ Create ApplePreferred or ILBM Map dumps
Map Header Struct
-------------------------------------------------------------------
size what description
-------------------------------------------------------------------
unsigned HeaderSize size of the entire map header
unsigned MapType how many planes the map has. If there
are 3, you have back/foreground & info.
If there are 2, you have back & info, If
there is 1, you have background.
unsigned TileSize size of tiles map is made for
(1=8,2=16,3=32)
long TileInfoOff offset to TILEINFO data
long TileInfoMOff offset to MASKED TILEINFO data
unsigned RLEWtag RLEW tag byte
unsigned Dictionary offset to Huff dictionary. 0 if RLEW only.
unsigned DataOffsets offset to MapOffset list
...
long MapOffsets offsets to Maps in map file
Map Structure
-------------------------------------------------------------------
size what description
-------------------------------------------------------------------
long Plane 0 offset to plane 0
long Plane 1 offset to plane 1 (0 if none)
long Plane 2 offset to plane 2 (0 if none)
char Name Map name (16 chars)
...
unsigned MapData all map data is in WORDs
+1287
View File
File diff suppressed because it is too large Load Diff
+26
View File
@@ -0,0 +1,26 @@
typedef struct
{
unsigned bit0,bit1; // 0-255 is a character, > is a pointer to a node
} huffnode;
extern long counts[256];
extern huffnode nodearray[256];
void CountBytes (unsigned char huge *start, long length);
void Huffmanize (void);
void OptimizeNodes (huffnode *table);
long HuffCompress (unsigned char huge *source, long length,
unsigned char huge *dest);
void HuffExpand (unsigned char huge *source, unsigned char huge *dest,
long length,huffnode *hufftable);
void RLEWExpand (unsigned huge *source, unsigned huge *dest,long length,
unsigned rlewtag);
long RLEWCompress (unsigned huge *source, long length, unsigned huge *dest,
unsigned rlewtag);
void RLEBExpand (unsigned char huge *source, unsigned char huge *dest,
long length, unsigned char rlebtag);
long RLEBCompress (unsigned char huge *source, long length,
unsigned char huge *dest, unsigned char rlebtag);
long CarmackCompress (unsigned far *source,long length,
unsigned far *dest);
BIN
View File
Binary file not shown.
+1011
View File
File diff suppressed because it is too large Load Diff
+42
View File
@@ -0,0 +1,42 @@
typedef enum {CGA,EGA1,EGA2,VGA,TEXT} video;
#define ESCOUT 0xdeaf
void Quit(char *string);
void WaitVBL(int times);
int input(char *string,int max);
void SetupKBD ();
void ShutdownKBD ();
void clearkeys (void);
int MouseInit(void);
void MouseHide(void);
void MouseShow(void);
int MouseButton(void);
void MouseCoords(int *x,int *y);
void printhex(unsigned value);
void printbin(unsigned value);
unsigned inputint(int numchars);
int input(char *string,int max);
void print (const char *str);
void fprint (const char huge *str);
void printhexb(unsigned char value);
void printint(unsigned value);
void bar (int xl, int yl, int xh, int yh, int ch);
int get(void);
void drawwindow (int xl, int yl, int xh, int yh);
void erasewindow (void);
void centerwindow (int width, int height);
void expwin (int width, int height);
void expwinh (int width, int height);
void expwinv (int width, int height);
void SaveFile(char *filename,char huge *buffer, long size,long offset);
unsigned long LoadFile(char *filename,char huge *buffer,long offset,long size);
void LoadIn(char *filename,void _seg **baseptr);
void MouseOrigin(int x,int y);
void MouseLimits(int xmin,int xmax,int ymin,int ymax);
extern int win_xl,win_yl,win_xh,win_yh,screencenterx,screencentery;
extern unsigned char keydown[256];
extern unsigned sx,sy,xormask,MouseStatus,leftedge;
long filelen(char *filename);
BIN
View File
Binary file not shown.
+259
View File
@@ -0,0 +1,259 @@
;====================================================
;
; Library ASM code
;
;====================================================
IDEAL
P386N
MODEL medium,C
extrn xormask:WORD,yshift:WORD,CGAfont:WORD,VGAfont:WORD
DATASEG
SCindex = 3c4h
SCmapmask = 2
GCindex = 3CEh
GCreadmap = 4
GCmode = 5
a = 0
LABEL CGAlookup WORD
PUBLIC CGAlookup
REPT 100
dw a,a XOR 2000h
a = a+80
ENDM
a = 0
LABEL EGA1lookup WORD
PUBLIC EGA1lookup
REPT 200
dw a
a = a+40
ENDM
a = 0
LABEL EGA2lookup WORD
PUBLIC EGA2lookup
REPT 480
dw a
a = a+80
ENDM
a = 0
LABEL VGAlookup WORD
PUBLIC VGAlookup
REPT 200
dw a
a = a+320
ENDM
CODESEG
;====================================================
;
; Draw CGA chars
;
;====================================================
PROC CGAcharout
PUBLIC CGAcharout
ARG x:WORD,y:WORD,chr:BYTE
USES si,di,ds
mov bx,[y]
shl bx,1
shl bx,1
shl bx,1
shl bx,1
mov di,[CGAlookup+bx]
mov ax,[x]
shl ax,1
add di,ax
mov al,[chr]
xor ah,ah
shl ax,1
shl ax,1
shl ax,1
shl ax,1
mov si,ax
mov ax,0b800h
mov es,ax
mov ds,[CGAfont]
cld
cmp [ss:xormask],0
ja @@1
REPT 4
movsw
add di,2000h-2
movsw
sub di,2000h-78
ENDM
jmp @@exit
@@1:
REPT 4
lodsw
xor ax,0ffffh
stosw
add di,2000h-2
lodsw
xor ax,0ffffh
stosw
sub di,2000h-78
ENDM
@@exit:
ret
ENDP
;====================================================
;
; Draw EGA chars
;
;====================================================
PROC EGAcharout
PUBLIC EGAcharout
ARG x:WORD,y:WORD,chr:BYTE,video:WORD
USES si,di,ds,bp
mov dx,GCindex
mov ax,GCmode
out dx,ax
mov bx,[y]
shl bx,1
shl bx,1
shl bx,1
add bx,[yshift]
shl bx,1
cmp [video],1
jne @@0
mov cx,39
mov di,[EGA1lookup+bx]
jmp @@1
@@0:
mov cx,79
mov di,[EGA2lookup+bx]
@@1:
add di,[x]
mov ax,0a000h
mov es,ax
mov ds,ax
mov si,0f000h
mov al,[chr]
xor ah,ah
shl ax,1
shl ax,1
shl ax,1
add si,ax
cld
cmp [ss:xormask],0
ja @@2
mov dx,GCindex
mov ax,GCmode OR 100h
out dx,ax
mov dx,SCindex
mov ax,SCmapmask OR 0f00h
out dx,ax
REPT 8
movsb
add di,cx
ENDM
jmp @@exit
@@2:
ga = 100h
gb = 0
mov bp,si
mov bx,di
REPT 4
mov dx,SCindex
mov ax,SCmapmask OR ga
out dx,ax
mov dx,GCindex
mov ax,GCreadmap OR gb
out dx,ax
REPT 8
lodsb
xor al,0ffh
stosb
add di,cx
ENDM
mov di,bx
mov si,bp
ga = ga*2
gb = gb+100h
ENDM
@@exit:
mov dx,GCindex
mov ax,GCmode
out dx,ax
ret
ENDP
;====================================================
;
; Draw VGA chars
;
;====================================================
PROC VGAcharout
PUBLIC VGAcharout
ARG x:WORD,y:WORD,chr:BYTE
USES si,di,ds
mov bx,[y]
shl bx,1
shl bx,1
shl bx,1
add bx,[yshift]
shl bx,1
mov di,[VGAlookup+bx]
mov ax,[x]
shl ax,1
shl ax,1
shl ax,1
add di,ax
mov ah,[chr]
xor al,al
shr ax,1
shr ax,1 ;[chr]*64!
mov si,ax
mov ax,0a000h
mov es,ax
mov ds,[VGAfont]
cmp [ss:xormask],0
ja @@1
REPT 8
REPT 4
movsw
ENDM
add di,320-8
ENDM
jmp @@exit
@@1:
REPT 8
REPT 4
lodsw
xor ax,0ffffh
stosw
ENDM
add di,320-8
ENDM
@@exit:
ret
ENDP
END
BIN
View File
Binary file not shown.
+781
View File
@@ -0,0 +1,781 @@
#include "ted5.h"
#pragma hdrstop
#define EMSINT 0x67
#define SPACEFREE 0x2000 // how much mem to leave alone in farheap
#define EXTRASTACKSIZE 0x2000
#define MAXBLOCKS 1000
#define LOCKBIT 0x8000 // if set in attributes, block cannot be moved
#define PURGEBITS 3 // 0-3 level, 0= unpurgable, 3= purge first
#define BASEATTRIBUTES 0 // unlocked, non purgable
unsigned totalmem; // total paragraphs available with 64k EMS
int EMSpresent,XMSpresent;
long TTLMainMem;
void far *farheap;
void *nearheap;
int numblocks;
struct {
unsigned start; // in paragraphs
unsigned length;
unsigned attributes;
memptr *useptr;
} blocks[MAXBLOCKS],tempblock;
//==========================================================================
//
// local prototypes
//
void CheckForEMS (void);
int FindBlock (memptr *ptr);
void RemoveBlock (int block);
void InsertBlock (int block);
//
// public prototypes
//
void MMStartup (void);
void MMShutdown (void);
void MMMapEMS (void);
void MMGetPtr (memptr *baseptr,unsigned size);
void MMFreePtr (memptr *baseptr);
void MMSetPurge (memptr *baseptr, int purge);
void MMSortMem (void);
void MMBlockDump (void);
unsigned MMUnusedMemory (void);
unsigned MMTotalFree (void);
//==========================================================================
//
// CheckForEMS
//
// Routine from p36 of Extending DOS
//
void CheckForEMS (void)
{
char emmname[9] = "EMMXXXX0";
asm mov dx,OFFSET emmname
asm mov ax,0x3d00
asm int 0x21 // try to open EMMXXXX0 device
asm jc error
asm mov bx,ax
asm mov ax,0x4400
asm int 0x21 // get device info
asm jc error
asm and dx,0x80
asm jz error
asm mov ax,0x4407
asm int 0x21 // get status
asm jc error
asm or al,al
asm jz error
asm mov ah,0x3e
asm int 0x21 // close handle
asm jc error
//
// EMS is good
//
return;
error:
//
// EMS is bad
//
EMSpresent = 0;
}
//==========================================================================
//
// FindBlock
//
int FindBlock (memptr *ptr)
{
int i;
for (i=1;i<numblocks;i++)
if (blocks[i].useptr == ptr)
return i;
Quit ("Memory manager error: Block not found!");
return -1;
}
//
// RemoveBlock
// 0 the pointer, close the block array down, and decrement numblocks
//
void RemoveBlock (int block)
{
void far *source, far *dest;
unsigned length;
*blocks[block].useptr = NULL;
if (block!=numblocks-1)
{
source = &blocks[block+1];
dest = &blocks[block];
length = (numblocks-1-block)*sizeof(blocks[0]);
movedata (FP_SEG(source),FP_OFF(source),FP_SEG(dest),FP_OFF(dest),length);
}
numblocks--;
}
//
// InsertBlock
// Inserts space in the block array AFTER parameter and increments numblocks
//
void InsertBlock (int block)
{
unsigned source,dest,length;
if (block!=numblocks-1)
{
source = ((unsigned)&blocks[numblocks])-2;
dest = ((unsigned)&blocks[numblocks+1])-2;
length = (numblocks-1-block)*sizeof(blocks[0])/2;
asm mov cx,length
asm mov si,source
asm mov di,dest
asm mov ax,ds
asm mov es,ax
asm std
asm rep movsw
asm cld
}
if (++numblocks>=MAXBLOCKS)
Quit ("Memory manager error: Too many blocks!");
}
// check numblocks<MAXBLOCKS
//==========================================================================
/*
===================
=
= MMStartup
=
= Initializes the memory manager and returns the total
= allocatable free space.
=
= Grabs all space from turbo with farmalloc
=
===================
*/
void MMStartup (void)
{
unsigned long length;
void far *start;
unsigned nearstart,farstart,EMSstart,seg,i;
unsigned nearlength,farlength,emslength,xmslength;
//
// get all available near conventional memory
//
length=coreleft();
start = (void far *)(nearheap = malloc(length-SPACEFREE));
//
// paragraph align it and figure size
//
length -= 16-(FP_OFF(start)&15);
length -= EXTRASTACKSIZE;
nearlength = length / 16; // now in paragraphs
nearstart = FP_SEG(start)+(FP_OFF(start)+15)/16;
//
// get all available far conventional memory
//
length=farcoreleft();
start = farheap = farmalloc(length);
//
// paragraph align it and figure size
//
if (FP_OFF(start))
{
length -= 16-FP_OFF(start);
start = (void far *)MK_FP(FP_SEG(start)+1,0);
}
farlength = length / 16; // now in paragraphs
farstart = FP_SEG(start);
totalmem = nearlength + farlength;
//
// detect EMS and allocate 64K at page frame
//
CheckForEMS();
if (EMSpresent)
{
EMSstart = 0xffff;
totalmem += 0x1000; // 64k of EMS
MMMapEMS(); // map in used pages
}
else
{
EMSstart = 0xffff;
}
//
// set up locked blocks
//
numblocks = 0;
blocks[numblocks].start = 0;
blocks[numblocks].length = nearstart;
blocks[numblocks].attributes = LOCKBIT;
numblocks++;
blocks[numblocks].start = nearstart+nearlength;
blocks[numblocks].length = farstart-(nearstart+nearlength);
blocks[numblocks].attributes = LOCKBIT;
numblocks++;
blocks[numblocks].start = farstart+farlength;
blocks[numblocks].length = EMSstart-(farstart+farlength);
blocks[numblocks].attributes = LOCKBIT;
numblocks++;
TTLMainMem=16L*MMTotalFree();
}
//==========================================================================
/*
====================
=
= MMShutdown
=
= Frees all conventional, EMS, and XMS allocated
=
====================
*/
void MMShutdown (void)
{
int i;
//
// 0 the pointers (if any)
//
for (i=0;i<numblocks-1;i++)
*blocks[i].useptr=NULL;
farfree (farheap);
free (nearheap);
}
//==========================================================================
/*
====================
=
= MMMapEMS
=
= Maps the 64k of EMS used by memory manager into the page frame
= for general use.
=
====================
*/
void MMMapEMS (void)
{
}
//==========================================================================
/*
====================
=
= MMGetPtr
=
= Allocates an unlocked, unpurgable block
= Start looking at the top of memory
=
====================
*/
void MMAllocate(memptr *baseptr,long size)
{
MMGetPtr(baseptr,(unsigned)((size+15)/16));
TTLMainMem=16L*MMTotalFree();
}
void MMGetPtr (memptr *baseptr,unsigned size)
{
int i,j,k,try;
unsigned start,end;
//
// try a normal scan, then compress if not found
//
for (try=0;try<2;try++)
{
for (i=0;i<numblocks-1;i++)
{
if (blocks[i].attributes & PURGEBITS )
continue;
//
// blocks[i] cannot be written over, so try to allocate the
// new block right after it
//
start = blocks[i].start + blocks[i].length;
end = start + size;
j=i+1;
while (blocks[j].start < end)
{
if (!(blocks[j].attributes & PURGEBITS))
{
i = j-1;
goto lookmore; // a non purgable block is in the way
}
j++;
}
//
// purge the blocks in the way
//
for (k=i+1;k<j;j--)
RemoveBlock(k);
//
// allocate the new block
//
InsertBlock(i);
*(unsigned *)baseptr = start;
blocks[i+1].start = start;
blocks[i+1].length = size;
blocks[i+1].useptr = baseptr;
blocks[i+1].attributes = BASEATTRIBUTES;
return;
lookmore:;
}
//
// didn't find any space, so compress and try again
//
if (try==0)
MMSortMem();
}
//puts("");
//MMBlockDump(); // DEBUG
Quit ("Memory manager error: Out of memory!");
}
//==========================================================================
/*
=====================
=
= MMFreePtr
=
= Frees up a block and NULL's the pointer
=
=====================
*/
void MMFreePtr (memptr *baseptr)
{
RemoveBlock(FindBlock (baseptr));
TTLMainMem=16L*MMTotalFree();
}
//==========================================================================
/*
=====================
=
= MMSetPurge
=
= Sets the purge level for a block
=
=====================
*/
void MMSetPurge (memptr *baseptr, int purge)
{
int block;
unsigned attr;
block = FindBlock (baseptr);
attr = blocks[block].attributes;
attr &= 0xffff - PURGEBITS;
attr |= purge; // set bits in attributes
blocks[block].attributes = attr;
}
/*
=============================================================================
MMSortMem
=============================================================================
*/
//
// MoveParas
//
void MoveParaBase (unsigned source, unsigned dest, unsigned words)
{
asm mov cx,words
asm xor si,si
asm xor di,di
asm mov ax,source
asm mov bx,dest
asm mov ds,source
asm mov es,dest
asm rep movsw
asm mov ax,ss
asm mov ds,ax
}
void MoveParaBaseUp (unsigned source, unsigned dest, unsigned words)
{
asm mov cx,words
asm mov si,cx
asm dec si
asm shl si,1
asm mov di,si
asm mov ax,source
asm mov bx,dest
asm mov ds,source
asm mov es,dest
asm rep movsw
asm mov ax,ss
asm mov ds,ax
}
void MoveParas (unsigned source, unsigned dest, unsigned paragraphs)
{
if (source>dest)
{
asm cld
while (paragraphs>0xfff)
{
MoveParaBase (source,dest,0xfff*8);
source += 0xfff*8;
dest += 0xfff*8;
paragraphs -= 0xfff;
}
MoveParaBase (source,dest,paragraphs*8);
}
else
{
asm std
source+=paragraphs;
dest+=paragraphs;
while (paragraphs>0xfff)
{
source-=0xfff;
dest-=0xfff;
MoveParaBaseUp (source,dest,0xfff*8);
paragraphs -= 0xfff;
}
source-=paragraphs;
dest-=paragraphs;
MoveParaBaseUp (source,dest,paragraphs*8);
asm cld
}
}
/*
======================
=
= MMSortMem
=
= Sorts all non locked blocks so lower purge levels are lower in memory
= and all free space is at the top
=
======================
*/
int keyblock;
//
// PushUp
//
// Pushes the block (purgeable) as high in memory as possible
// must be BELOW keyblock
// If it can't fit above keyblock it will be freed
//
void PushUp (int move)
{
unsigned source,dest,size;
int i;
size = blocks[move].length;
source = blocks[move].start;
for (i=numblocks-1;i>keyblock;i--)
{
//
// if the block can fit under this block, move it
//
dest = blocks[i].start - size;
if (blocks[i-1].start+blocks[i-1].length <= dest)
{
//
// make a copy of block 'move' under block 'i'
//
InsertBlock (i-1);
blocks[i] = blocks[move];
blocks[i].start = dest;
*(blocks[i].useptr) = (void _seg *)dest; // modify the pointer to the new spot
MoveParas (source,dest,size);
break;
}
}
//
// erase original position
//
RemoveBlock (move);
keyblock--; // because a block below it was removed
}
//
// PushDown
//
// Push keyblock (unpurgable) as low in memory as possible
//
void PushDown (void)
{
unsigned source,dest,size,end,lowblock,checkblock,i;
size = blocks[keyblock].length;
source = blocks[keyblock].start;
//
// find the lowest space it can be moved into
//
for (lowblock = 0;lowblock<keyblock;lowblock++)
if (!(blocks[lowblock].attributes & PURGEBITS) ||
blocks[lowblock].attributes & LOCKBIT)
{
//
// found a locked or nonpurgable block below keyblock
//
// see if there is enough space to move block
//
dest = blocks[lowblock].start + blocks[lowblock].length;
end = dest+size;
//
// see if any of the blocks in the middle can be moved away
//
checkblock = lowblock+1;
while (checkblock < keyblock && blocks[checkblock].start<end)
{
if (!(blocks[checkblock].attributes & PURGEBITS) )
goto nofit; // can't fit between two locked blocks
//
// push the block up or remove it, in either case dropping
// keyblock and changing blocks[checkblock]
//
PushUp (checkblock);
}
//
// move it!
//
if (dest != source)
{
MoveParas (source,dest,size);
blocks[keyblock].start = dest;
*(blocks[keyblock].useptr) = (void _seg *)dest; // modify the pointer to the new spot
if (lowblock<keyblock-1)
{
//
// reorder the block records
//
tempblock = blocks[keyblock];
for (i=keyblock;i>lowblock+1;i--)
blocks[i]=blocks[i-1];
blocks[lowblock+1] = tempblock;
}
//MMBlockDump(); // DEBUG
}
return;
nofit:; // keep looking...
}
}
//
// MMSortMem
//
void MMSortMem (void)
{
unsigned i,source,dest;
keyblock = 0;
do
{
keyblock++;
//
// non-purgable, unlocked blocks will be pushed low in memory
//
if ( !(blocks[keyblock].attributes & PURGEBITS) &&
!(blocks[keyblock].attributes & LOCKBIT) )
PushDown ();
} while (keyblock<numblocks-1);
for (i=numblocks-2;i>0;i--)
{
//
// push all purgable blocks as high as possible
// Currently they are NOT moved around locked blocks!
//
if ( blocks[i].attributes & PURGEBITS )
{
source= blocks[i].start;
dest= blocks[i+1].start-blocks[i].length;
if (source!=dest)
{
MoveParas (source,dest,blocks[i].length);
blocks[i].start = dest;
*(blocks[i].useptr) = (void _seg *)dest; // modify the pointer to the new spot
}
}
}
PatchPointers(); // let the main program fix up any
// internal references
}
//==========================================================================
/*
=======================
=
= MMBlockDump
=
= Dewbug tool
=
=======================
*/
void MMBlockDump (void)
{
int i;
unsigned free;
fprintf (stdprn,"-------------\n");
for (i=0;i<numblocks;i++)
{
fprintf (stdprn,"Start:%4X\tLength:%4X\tAttr:%4X\tPtr:%p\n"
,blocks[i].start,blocks[i].length,blocks[i].attributes,blocks[i].useptr);
if (i<numblocks-1)
{
free = blocks[i+1].start - (blocks[i].start+blocks[i].length);
if (free)
fprintf (stdprn,"### Free:%X\n",free);
}
}
puts("");
}
//==========================================================================
/*
======================
=
= MMUnusedMemory
=
= Returns the total free space without purging
=
======================
*/
unsigned MMUnusedMemory (void)
{
int i;
unsigned free;
free = 0;
for (i=0;i<numblocks;i++)
{
if (i<numblocks-1)
free += blocks[i+1].start - (blocks[i].start+blocks[i].length);
}
return free;
}
//==========================================================================
/*
======================
=
= MMTotalFree
=
= Returns the total free space with purging
=
======================
*/
unsigned MMTotalFree (void)
{
int i;
unsigned free;
free = 0;
for (i=0;i<numblocks;i++)
{
if (blocks[i].attributes & PURGEBITS)
free += blocks[i].length;
if (i<numblocks-1)
free += blocks[i+1].start - (blocks[i].start+blocks[i].length);
}
return free;
}
//==========================================================================
+28
View File
@@ -0,0 +1,28 @@
typedef void _seg * memptr;
extern long TTLMainMem;
extern unsigned totalmem; // total paragraphs available with 64k EMS
extern int EMSpresent,XMSpresent;
//==========================================================================
//
// public prototypes
//
void MMStartup (void);
void MMShutdown (void);
void MMMapEMS (void);
void MMAllocate(memptr *baseptr,long size);
void MMGetPtr (memptr *baseptr,unsigned size);
void MMFreePtr (memptr *baseptr);
void MMSetPurge (memptr *baseptr, int purge);
void MMSortMem (void);
void MMBlockDump (void);
unsigned MMUnusedMemory (void);
unsigned MMTotalFree (void);
void PatchPointers (void); // must be present in the main program
BIN
View File
Binary file not shown.
+1877
View File
File diff suppressed because it is too large Load Diff
+78
View File
@@ -0,0 +1,78 @@
/////////////////////////////////////////////////////////////////
//
// Pull-Down menu interface .H file
//
/////////////////////////////////////////////////////////////////
typedef struct { char *item_name;
void (*routine)(void);
char shiftflag;
char hotkey;
} MenuDef;
typedef struct { int num_items;
MenuDef *menu_def;
char *menu_name;
} MBarDef;
typedef struct { int menux;
int menunamelen;
int menuwidth;
} MInfoType;
typedef struct { char *text;
int xoff,yoff,border;
} btype;
typedef struct { char *text;
int width,height,numbuttons;
btype *buttons;
void (*hook)(int x,int y);
} DialogDef;
typedef struct { int x,y,w,h;
void _seg *buffer;
} BackSaveStr;
#define SCindex 0x3C4
#define SCmapmask 2
#define GCindex 0x3CE
#define GCreadmap 4
#define GCmode 5
#define crtcaddr 0x3d4
#define NUMFLASHES 10
#define ALT 0x38
#define CTRL 0x1d
#define MAXFDNAMES 40
extern struct ffblk f; // more info from GetPath
void extern InitDesktop(MBarDef *menubar,int initmouse);
void extern DeskEventLoop(void (*UserRoutine)(void),void (*ConstantRoutine)(void));
void extern ClearScreen(void);
void extern RedrawDesktop(void);
void extern SaveBackground(int x,int y,int w,int h);
void extern RestoreBackground(void);
int extern DoDialog(DialogDef *TheDialog);
void extern ErrDialog(char *string,char *bstring);
void extern DrawBorder(int x,int y,int w,int h,int b);
int extern CheckButtons(DialogDef *TheDialog);
int extern CheckButtonsRet(DialogDef *TheDialog);
void extern DrawDialog(DialogDef *TheDialog,int saveback);
void extern GetButtonXY(DialogDef *TheDialog,int button,unsigned *x,unsigned *y);
void extern GetDialogXY(DialogDef *TheDialog,unsigned *x,unsigned *y);
int extern CheckList(int x,int y,int w,int h,void (*oncode)(),void (*offcode)(),int blink);
int extern Message(char *mstring);
//
// RETURNS 0=OK,-1=NO FILES MATCH FILTER,-2=CANCELED
//
extern char NameList[MAXFDNAMES][13];
int GetPath(char *string,char *filter,char *path);
int GetList(char *string,int numnames);
static void FDon(int x,int y,int w);
static void FDoff(int x,int y,int w);
static void CancelOn(int x,int y);
static void CancelOff(int x,int y);
BIN
View File
Binary file not shown.
+13
View File
@@ -0,0 +1,13 @@
Ted 5.0
=======
The Ted source code needs to be compiled with Borland C/C++ 3.1. It will
probably compile with 4.0 but there are a few OBJ's that are linked in and
not built (the vgapalette, the tedfont etc.).
This code was written by John Romero of Id Software Inc. A screen blanker
was added and a scrolling bug was fixed by Mark Dochtermann of Apogee
Software Ltd.
Do not contact Apogee or id regarding any questions on this software. It
is provided "AS IS" with no warranty.
+4
View File
@@ -0,0 +1,4 @@
cd test
td386 ..\ted5
cd ..
bcx
BIN
View File
Binary file not shown.
+7
View File
@@ -0,0 +1,7 @@
start chars
load chars
grab 128
save ted
.
+2089
View File
File diff suppressed because it is too large Load Diff
BIN
View File
Binary file not shown.
+2184
View File
File diff suppressed because it is too large Load Diff
BIN
View File
Binary file not shown.
+2033
View File
File diff suppressed because it is too large Load Diff
BIN
View File
Binary file not shown.
+2633
View File
File diff suppressed because it is too large Load Diff
BIN
View File
Binary file not shown.
+2779
View File
File diff suppressed because it is too large Load Diff
BIN
View File
Binary file not shown.
BIN
View File
Binary file not shown.
+356
View File
@@ -0,0 +1,356 @@
#define IDSTRING "TED5v1.0"
#define TITLESTR "TED5 vD.IP"
#define IDSTSTR " "TITLESTR
#include <stdio.h>
#include <process.h>
#include <io.h>
#include <dos.h>
#include <alloc.h>
#include <dir.h>
#include <mem.h>
#include <string.h>
#include <stdlib.h>
#include <conio.h>
#include <fcntl.h>
#include "lib.h"
#include "memmgr.h"
#include "menu.h"
#include "jhuff.h"
#include "xms.h"
#define SGN(x) (x>0?1:x<0?-1:0)
#define OFF3(m,i) (*(long huge *)((char huge *)m+(i)*3)&0xffffff)
//
// Defs for TED5
//
typedef enum {TILES,MASKED,ICONS} screentype;
typedef enum {DATA,CODE,FARDATA} segtype; // FOR MAKEOBJ ONLY
#define SCindex 0x3C4
#define SCmapmask 2
#define GCindex 0x3CE
#define GCreadmap 4
#define GCmode 5
#define crtcaddr 0x3d4
//
// STRUCTURE OF TED5 TEMPFILE WHILE LAUNCHING
//
typedef struct {
video lastmode;
char ext[4];
} TempStruct;
//
// STRUCTURE OF THE "TEDINFO.EXT" FILE THAT TED5 CREATES
//
typedef struct {
int level,lastvid,lastx,lasty,tsize;
int OldCgaXMS,OldEgaXMS,OldVgaXMS;
long OldCgaXMSsize,OldEgaXMSsize,OldVgaXMSsize;
int CgaXMSlook,EgaXMSlook,VgaXMSlook;
char permicon,pflags;
int oscrx,oscry;
char parmstring[64],launchname[14];
char BackgndColor;
char ImportPath[64];
} InfoStruct;
//
// STRUCTURE OF THE "GFXINFO?.EXT" FILE THAT IGRAB CREATES
//
typedef struct {
int num8,num8m,num16,num16m,num32,num32m;
int off8,off8m,off16,off16m,off32,off32m;
int numpics,numpicm,numsprites;
int offpic,offpicm,offsprites;
int offpicstr,offpicmstr,offsprstr;
int numexterns,offexterns;
} GfxStruct;
//
// TED5 LOADS & SAVES THIS HEADER FOR INTERNAL MAPFILE USAGE
//
typedef struct { unsigned maptype; //bit 0=bkgnd/1=frgnd/2=info
unsigned tsize; //1=8/2=16/3=32
unsigned numtplanes,oldtilenum;
long tileinfooff[10];
unsigned tileinfolen[10];
char tnames[10][8];
unsigned numtmplanes,oldtilemnum;
long tileinfomoff[10];
unsigned tileinfomlen[10];
char tmnames[10][8];
unsigned RLEWtag;
long dataoffsets[100];
long datalengths[100];
int NumIconRows;
} MapFileHeaderStr;
//
// TED5 SAVES THIS MAPFILE HEADER FOR THE GAME
//
typedef struct {
unsigned RLEWtag;
long dataoffsets[100];
} OutputHeadStr;
//
// EACH AND EVERY MAP HAS THIS HEADER (IF THE MAP EXISTS)
//
typedef struct { long mapbkgndpl;
long mapfrgndpl;
long mapinfopl;
unsigned mapbkgndlen;
unsigned mapfrgndlen;
unsigned mapinfolen;
unsigned width,height;
char name[16];
} MapHeaderStr;
//
// SPECIFY WHAT, WHEREFROM, AND HOW TO COPY A REGION
//
typedef struct {
char PlanesCopied; // use BPLANE,FPLANE,IPLANE to mask
int MapOrTileSelect; // 0:map,1:tileselect
int x,y,w,h; // from map or tileselect
} CopyStr;
//
// UNDO REGION
//
typedef struct {
int x,y,w,h;
} UndoStr;
//
// LAST-BUILT "VIEWMAP"
//
typedef struct {
unsigned step,built_flag,EGAseg,maxpack;
} VMapStr;
//
// HEADER FOR APPLE-PREFERRED FILES
//
typedef struct { long length;
char Kind[5];
int MasterMode;
int PixelsPerLine;
int NumColorTables;
int ColorTable[16];
int NumScanLines;
} ApPrefStr;
#define CREATED 1
#define NOTCREATED 2
#define ANYLIST 3
#define BPLANE 1
#define FPLANE 2
#define IPLANE 4
#define O_FGNDBACK 4
#define ICONBACK 3
#define TINFOWIDTH 3
#define TINFOHEIGHT 7
#define TINFOHEIGHTEGA2 25
extern MBarDef TED5MenuBar[];
extern DialogDef DoCreated;
extern UndoStr UndoRegion;
extern CopyStr TileCopy;
extern MapFileHeaderStr _seg *MapFileHeader;
extern char _seg *Tinfo[10],_seg *TMinfo[10],_seg *GraphHeader;
extern long _seg *XMSlookup,_seg *CgaXMSlookup,_seg *EgaXMSlookup,_seg *VgaXMSlookup;
extern int _seg *MapBkgnd,_seg *MapFrgnd,_seg *MapInfoPl,
_seg *CutBkgnd,_seg *CutFrgnd,_seg *CutInfoPl;
extern MapHeaderStr MapHeader;
#if 0
extern char far TOM; // JOKE SHIT!
#endif
extern TempStruct LaunchInfo;
extern InfoStruct _seg *TEDInfo;
extern GfxStruct _seg *GfxInfo;
extern video lastvideo,videomode;
extern screentype whichscreen;
extern VMapStr VMapData;
extern char launchname[64],ext[4],format[2],projname[64],mapname[64],planes,
infoname[64],mapheadname[64],tdata,MapNames[100][16],parmstring[64];
extern char SM_name[64],SM_loadname[64],BkgndColor;
extern unsigned temp,whichmap,numtplanes,tilenum,tilemnum,numtmplanes,left,
DirtyFlag,tilelen,tilemlen,whicht,whichtm,whichi,
tsize,infoy,infomaxw,mapwidth,mapheight,screenw,usingbat,
screenh,planeton,planemon,planeion,maxiconrows,lasticon,firsticon,
viewton,viewmon,viewion,XMSundoB,XMSundoF,XMSundoI,XMSmaps,
EgaXMS,CgaXMS,VgaXMS,xmshandle,GridMode,SnapMode,snapx,snapy,
snapxsize,snapysize,writeH,F3_flag,NoAbout;
extern int tilebase,tilembase,infobaron,xbase,ybase,scrnbot,scrnrgt,
FillMode,PasteMode,SelectMode,SelX1,SelY1,PasteOK,SelX2,SelY2,pixelx,pixely,
selectcols,px,py,lastmap,TIybase,TIymbase,TIxbase,TIxmbase,BfillMode,
Plotting,TsearchMode;
extern long CgaXMSsize,EgaXMSsize,VgaXMSsize;
extern void far *XMSdriver;
//
// FUNCTION PROTOTYPES
//
//
// LIB_A.ASM
//
extern void CGAcharout(int x,int y,char ch);
extern void EGAcharout(int x,int y,char ch,video vid);
extern void VGAcharout(int x,int y,char ch);
//
// TED5_A.ASM
//
extern unsigned EGA1lookup[200];
extern unsigned EGA2lookup[200];
extern void DrawTile(int x,int y,int tile);
extern void CopyCGA(int srcx,int srcy,int width,int height,int destx,int desty);
extern void CopyEGA(int srcx,int srcy,int width,int height,int destx,int desty);
extern void CopyVGA(int srcx,int srcy,int width,int height,int destx,int desty);
extern void Overlay(int tsize);
//
// TED5
//
void FindGraphFile(void);
void HandleEvent(void);
void Continuous(void);
void LoadInfoFile(void);
int LoadGraphStuff(int rtn,video newvid);
void LoadMapHeader(void);
void ParseCmdline(void);
void InitTed5(void);
void CallDesktop(void);
void SelectTiles(int screen);
void STnot(int x,int y);
void DrawProjBord(int x,int y);
void DrawInfoBar(void);
void PrintCoords(void);
void FigureScreenEdges(void);
void errsound(void);
void DrawMap(void);
void CheckSelectEdges(int x,int y,int i,int j);
int InputIconAmount(void);
//
// TED5-1
//
void Item_InputInfoplane(void);
void Item_SelectTile(void);
void Item_EditTinfoNames(void);
void Item_BlockFill(void);
void Item_TileSearch(void);
void Item_Launch(void);
void Item_Undo(void);
void Item_TINFOCopy(void);
void CreateMap(int exitok);
int SelectMap(int exitok,int createflg,char *title);
int PickMorePlanes(void);
void DoBlockFill(void);
void RemoveUndoBuffers(void);
void AllocateUndoBuffers(void);
void RestoreUndo(void);
void SaveUndo(int x,int y,int w,int h);
void CopyUndoRegion(void);
void SaveOutputHeader(void);
void SaveTEDInfo(void);
void BackupFile(char *filename);
void TInfoNon(int x,int y,int b);
void TInfoNoff(int x,int y,int b);
void TInfoMNon(int x,int y,int b);
void TInfoMNoff(int x,int y,int b);
void TIDoneOn(int x,int y);
void TIDoneOff(int x,int y);
//
// TED5-2
//
void Item_About(void);
void Item_ModeSwitch(void);
void Item_DeleteMap(void);
void Item_EditMap(void);
void Item_SaveMap(void);
void Item_CreateMap(void);
void Item_Quit(void);
void Item_MapStats(void);
void Item_ToggleInfo(void);
void Item_Amputate(void);
void Item_SwitchMap(void);
void Item_EditMapNames(void);
void Item_Copy(void);
void Item_Paste(void);
void Item_LastVideo(void);
void Item_FloodFill(void);
void Item_LastMap(void);
void Item_CountTiles(void);
int CheckForMapSave(void);
void DoFloodFill(int x,int y,int whichb);
void DrawTileSelect(int deltarows,int *numrows,int *numcols);
void DrawUnused(int deltarow);
void DrawCurrentTiles(void);
void ZeroModes(void);
//
// TED5-3
//
void Item_EditMapEdges(void);
void Item_PrintMem(void);
void Item_Huffman(void);
void CheckInfoValues(int i,int j,int tilei);
void PrintMem(int x,int y);
void EraseFloatPaste(void);
void DrawFloatPaste(void);
void CopyScreen(int srcx,int srcy,int width,int height,int destx,int desty);
void Item_LAUNCHname(void);
void Item_PARMstring(void);
void Item_ChangeIconRows(void);
void Item_ChangeLaunchIcon(void);
void Item_ChangeBkgndColor(void);
//
// TED5-4
//
void SignalSound(void);
void Item_GraphicDump(void);
void Item_EditTinfoValues(void);
void Item_ProjectReSelect(void);
void Item_AddDelTinfo(void);
void Item_GridMode(void);
void Item_SnapTog(void);
void Item_ViewMap(void);
void Item_ReviewMap(void);
void Item_ImportMaps(void);
void Item_VisitDOS(void);
void Item_POtog(void);
void Do_ViewMap(int how);
int MakeOBJ(char *filename,char *destfilename,char *public,segtype whichseg,char *farname);
void DrawTinfoScreen(int thescreen,int deltax,int deltay);
void EnterTinfoValue(int whichtinfo,int mx,int my,int H_or_V);
void UseTinfoValue(int whichtinfo,int mx,int my,int PickupOrDrop);
+37
View File
@@ -0,0 +1,37 @@
Start Stop Length Name Class
00000H 03D85H 03D86H _TEXT CODE
03D86H 075F3H 0386EH TED5_TEXT CODE
075F4H 0AAB4H 034C1H TED5-1_TEXT CODE
0AAB5H 0DF0EH 0345AH TED5-2_TEXT CODE
0DF0FH 11A7EH 03B70H TED5-3_TEXT CODE
11A7FH 155C6H 03B48H TED5-4_TEXT CODE
155C8H 15F88H 009C1H TED5_A_TEXT CODE
15F89H 18B31H 02BA9H MENU_TEXT CODE
18B32H 1998FH 00E5EH LIB_TEXT CODE
19990H 1A2B3H 00924H MEMMGR_TEXT CODE
1A2B4H 1A55FH 002ACH XMS_TEXT CODE
1A560H 1B034H 00AD5H JHUFF_TEXT CODE
1B038H 1B3D8H 003A1H LIB_A_TEXT CODE
1B3E0H 1DB46H 02767H EMU_PROG CODE
1DB50H 1E117H 005C8H E87_PROG CODE
1E120H 1E120H 00000H _FARDATA FAR_DATA
1E120H 1F11FH 01000H TEDcharset FAR_DATA
1F120H 1F120H 00000H _FARBSS FAR_BSS
1F120H 1F120H 00000H _OVERLAY_ OVRINFO
1F120H 1F120H 00000H _1STUB_ STUBSEG
1F120H 25277H 06158H _DATA DATA
25278H 25279H 00002H _CVTSEG DATA
2527AH 2527AH 00000H _SCNSEG DATA
2527AH 2527AH 00000H _CONST CONST
2527AH 25291H 00018H _INIT_ INITDATA
25292H 25292H 00000H _INITEND_ INITDATA
25292H 25297H 00006H _EXIT_ EXITDATA
25298H 25298H 00000H _EXITEND_ EXITDATA
25298H 29B6BH 048D4H _BSS BSS
29B6CH 29B6CH 00000H _BSSEND BSSEND
29B70H 29BEFH 00080H _STACK STACK
Program entry point at 0000:0000
BIN
View File
Binary file not shown.
BIN
View File
Binary file not shown.
BIN
View File
Binary file not shown.
View File
+1385
View File
File diff suppressed because it is too large Load Diff
BIN
View File
Binary file not shown.
+6
View File
@@ -0,0 +1,6 @@
copy ted5.exe ..
lcd keen4
ted5
lcd ted5
bcx
+200
View File
@@ -0,0 +1,200 @@
////////////////////////////////////////////////////
//
// XMS routines - uses the MENU.C & LIB.C routines for output
//
////////////////////////////////////////////////////
#include "ted5.h"
#pragma hdrstop
long TTLxms;
unsigned XMSavail;
void far *XMSdriver;
////////////////////////////////////////////////////
//
// CALL the XMSdriver with a function #
//
////////////////////////////////////////////////////
void CallXMS(char func)
{
asm mov ah,[func]
asm call [DWORD PTR XMSdriver]
}
////////////////////////////////////////////////////
//
// Initialize the XMS memory
//
////////////////////////////////////////////////////
void InitXMS(void)
{
//
// See if XMS driver is present...
//
asm mov ax,0x4300
asm int 0x2f
asm cmp al,0x80 // installed?
asm je Present
ErrDialog("You poor bastard! I refuse\n"
"to work without Extended\n"
"Memory! Goodbye!"," I Suck ");
Quit("No Extended Memory Driver found!");
//
// YES! We found an XMS driver! Now we
// need to get the XMS driver's entry address...
//
Present:
asm mov ax,0x4310
asm int 0x2f
asm mov WORD PTR XMSdriver,bx
asm mov WORD PTR XMSdriver+2,es
XMSTotalFree();
}
////////////////////////////////////////////////////
//
// Report an XMS error, if any
//
////////////////////////////////////////////////////
void XMSerror(void)
{
if (_AX==0)
switch(_BL)
{
case 0x80: Quit("Function not implemented!");
case 0x81: Quit("VDISK device driver was detected!");
case 0x82: Quit("A20 error occurred!");
case 0x8e: Quit("General driver error!");
case 0x8f: Quit("Unrecoverable driver error!");
case 0x90: Quit("High memory area does not exist!");
case 0x91: Quit("High memory area already in use!");
case 0x92: Quit("DX is less than /HMAMIN= parameter!");
case 0x93: Quit("High memory area not allocated!");
case 0x94: Quit("A20 line still enabled!");
case 0xa0: Quit("Not enough Extended Memory available!");
case 0xa1: Quit("Extended memory handles exhausted!");
case 0xa2: Quit("Invalid handle!");
case 0xa3: Quit("Invalid source handle!");
case 0xa4: Quit("Invalid source offset!");
case 0xa5: Quit("Invalid destination handle!");
case 0xa6: Quit("Invalid destination offset!");
case 0xa7: Quit("Invalid length!");
case 0xa8: Quit("Invalid overlap in move request!");
case 0xa9: Quit("Parity error detected!");
case 0xaa: Quit("Block is not locked!");
case 0xab: Quit("Block is locked!");
case 0xac: Quit("Lock count overflowed!");
case 0xad: Quit("Lock failed!");
case 0xb0: Quit("Smaller UMB is available!");
case 0xb1: Quit("No UMBs are available!");
case 0xb2: Quit("Invalid UMB segment number!");
default: Quit("Unknown XMS Memory Error! I'm totally stumped!");
}
}
////////////////////////////////////////////////////
//
// Allocate XMS memory
//
////////////////////////////////////////////////////
int XMSAllocate(long size)
{
#if 0
static int allocnum=0;
_MouseHide();
sx=0;
sy=1;
print("XMS allocation #");
printint(allocnum++);
print(":");
printint((1023L+size)/1024L);
print("K");
while(!keydown[0x1c]);
clearkeys();
_MouseShow();
#endif
_DX=(size+1023)/1024;
CallXMS(9);
XMSerror();
asm push dx
TTLxms=1024L*XMSTotalFree();
asm pop dx
return _DX;
}
////////////////////////////////////////////////////
//
// Free XMS memory
//
////////////////////////////////////////////////////
void XMSFreeMem(int handle)
{
_DX=handle;
CallXMS(10);
XMSerror();
TTLxms=1024L*XMSTotalFree();
}
////////////////////////////////////////////////////
//
// Return XMS memory available
//
////////////////////////////////////////////////////
unsigned XMSTotalFree(void)
{
CallXMS(8);
XMSerror();
XMSavail=_DX;
return XMSavail;
}
////////////////////////////////////////////////////
//
// Move XMS memory
//
////////////////////////////////////////////////////
void XMSmove(int srchandle,long srcoff,int desthandle,long destoff,long size)
{
struct { long bsize;
int shandle;
long soff;
int dhandle;
long doff;
} XMSparms;
unsigned DSreg,SIreg;
XMSparms.bsize=size+(size&1);
XMSparms.shandle=srchandle;
XMSparms.dhandle=desthandle;
XMSparms.soff=srcoff;
XMSparms.doff=destoff;
DSreg=FP_SEG(&XMSparms);
SIreg=FP_OFF(&XMSparms);
asm push ds
asm push si
asm mov si,SIreg
asm mov ds,DSreg
CallXMS(11);
asm pop si
asm pop ds
XMSerror();
}
+8
View File
@@ -0,0 +1,8 @@
void InitXMS(void);
int XMSAllocate(long size);
unsigned XMSTotalFree(void); // returns KB free
void XMSFreeMem(int handle);
void XMSmove(int srchandle,long srcoff,int desthandle,long destoff,long size);
extern unsigned XMSavail;
extern long TTLxms;
BIN
View File
Binary file not shown.
BIN
View File
Binary file not shown.
BIN
View File
Binary file not shown.
BIN
View File
Binary file not shown.
BIN
View File
Binary file not shown.
BIN
View File
Binary file not shown.
BIN
View File
Binary file not shown.