Preview
ÛÛÛÛÛÛ ÛÛÛÛÛ ÛÛÛÛÛßÛÛÛÜÜ ÜÛÛÛÛßÛÛÛÜ ÜÜÛÛÛÛÛÜÜ ÛÛÛÛÛßÛÛÜ ÜÜÛÛÛßÛÛÛÜÜ
ÛÛÛÛÛÛ ÛÛÛÛÛ ÛÛÛÛÛ ÛÛÛÛÛÛ ÛÛÛÛÛ ÛÛÛÛ ÛÛÛÛÛ ÛÛÛÛÛ ÛÛÛÛÛ ÛÛÛÛ ÛÛÛÛÛÛ ÛÛÛÛÛÛ
ÛÛÛÛÛÛ ÛÛÛÛÛ ÛÛÛÛÛ ÛÛÛ²ÛÛ ÛÛÛ²Û ÛÛÛÛ ÛÛÛÛÛ ÛÛÛÛÛ ÛÛÛÛÛ ÛÛÛÛÝ ÛÛÛÛÛÛ ÛÛÛ²ÛÛ
ÛÛÛÛÛÛ ÛÛÛÛÛ Û²ÛÛÛ ÛÛÛÛÛÛ ÛÛÛ²Û ÛÛÛÛ Û²ÛÛÛ ÛÛÛÛÛ ÛÛÛ²Û ÛÛÛÛÛ ÛÛ²ÛÛÛ ÛÛÛÛÛÛ
ÞÛ²ÛÛÛ ÛÛÛÛÝ Û²ÛÛÛ ÛÛÛÛÛÛ ÛÛÛÛÛ ÛÛÛÛ Û²ÛÛÛ ÛÛÛÛÛ ÛÛÛ²Û ÛÛÛÛÛ ÛÛ²ÛÛÛ ßßßÛÛÛ Ý
Ý ÛÛÛÛÛ ÛÛÛÛ Û²ÛÛÛÛÛÛÛÛÛß ÛÛÛÛÛ ÛÛÛÛ Û²ÛÛÛ ÛÛÛÛÛ ÛÛÛ²Û ÛÛÛÛÛ ÛÛ²ÛÛÛÛÛÛÛÜÜ
ßÛÛÛÜÛÛß ÛÛÛÛÛßÛÛÛÜ ÛÛÛÛÛ ÛÛÛÛ ÛÛÛÛÛ ÛÛÛÛÛ ÛÛÛÛÛ ÛÛÛÛÛ ßßßßßßßÛÛÛÛÛÛ
ܲÛÛÛ ÛÛÛÜ ÛÛÛÛÛ ÛÛÛÛÛ ÜÛÛÛÛÛ ÛÛÛÛÜÜÜÜÜÜÜÛÛÛÛÛ ÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜ ÛÛÛÛÛÛ Ý
ÞÛ²ÛÛÛ ÛÛÛÛÝ ÛÛÛÛÛ ÛÛÛÛÛÝ ÛÛÛ²Û ÛÛÛÛ ÜÜÜÜÜ ÛÛÛÛÛ ÜÜÜÜÜ ÜÜÜÜÜ ÛÛÛÛÛÛ ÛÛÛÛÛÛ Ý
ÝÛÛ²ÛÛÛ ÛÛÛÛÛ Û²ÛÛÛ ÛÛÛ²ÛÛ ÛÛÛ²Û ÛÛÛÛ ÛÛÛÛÛ ÛÛÛÛÛ ÛÛÛÛÛ ÛÛÛÛÛ ÛÛ²ÛÛÛ ÛÛÛ²ÛÛ Ý
ÝÛÛÛÛÛÛ ÛÛÛÛÛ Û²ÛÛÛ ÛÛÛ²ÛÛ ÛÛÛ²Û ÛÛÛÛ Û²ÛÛÛ ÛÛÛÛÛ ÛÛÛ²Û ÛÛÛÛÛ ÛÛ²ÛÛÛ ÛÛÛ²ÛÛ Ý
ÛÛÛÛÛÛ ÛÛÛÛÛ ÛÛÛÛÛ ÛÛÛÛÛÛ ÛÛÛÛÛ ÛÛÛÛ Û²ÛÛÛ ÛÛÛÛÛ ÛÛÛ²Û ÛÛÛÛÛ ÛÛÛÛÛÛ ÛÛÛÛÛÛ Ý
ÝÛÛÛÛÛÛ ÛÛÛÛÛ ÛÛÛÛÛ ÛÛÛÛÛÛ ÛÛÛÛÛ ÛÛÛÛ Û²ÛÛÛ ÛÛÛÛÛ ÛÛÛ²Û ÛÛÛÛÝ ÞÛÛÛÛÛ ÛÛÛÛÛÛ Ý
ÝÛÛÛÛÛÛ ÛÛÛÛÛ ÛÛÛÛÛ ÛÛÛÛÛÛ ÛÛÛÛÛÛÛÛÛÛ ÛÛÛÛÛ ÛÛÛÛÛ ÛÛÛÛÛ ÛÛÛß Ü ßÛÛÛÛÛÛÛÛÛÛß Ý
Ýßßßßßß ßßßßß ßßßßß ßßßßßß ßßßßßßßß ßßßßß ßßßßß ßßßßßßßß Üß ßÜ ßßßßßß ÜÜß
ßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßß ßSQUiZZYß
ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿
ÖÄÄÄÄÄÄ[³ [ x R O A D s 1 9 9 7 ! ] ³]ÄÄÄÄÄÄ·
ÚÄĺÄÄÄÄÄÄÄÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÄÄÄÄÄÄÄĺÄÄÄ¿
³ º º ³
³ º The Desire Development Pack #1 by Rapido/xROADs º ³
³ º º ³
ÀÄĺÄÄÄÄÄÄÄÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÄÄÄÄÄÄÄĺÄÄÄÙ
ÓÄÄÄÄÄÄij ³ÄÄÄÄÄÄÄĽ
ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ
Contents
1. How to get started
2. The Doorkit Explained
3. The Newuser Application Viewer 1.1 (Full Pascal Source included!)
4. Notes
ÚÄÄÄÄÄÄÄÄÄÄÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÄÄÄÄÄÄÄÄÄÄÄÄ¿
³ º º ³
³ º 1. How to get started º ³
³ º º ³
ÀÄÄÄÄÄÄÄÄÄÄÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÄÄÄÄÄÄÄÄÄÄÄÄÙ
What you need is: Borland Pascal 7.0 and the Desire Doorkit 1.2 (or the most
recent version). The Desire Doorkit consists of a set of UNITS for Borland
Pascal 7.0, these are:
Deskit.TPU this is the 'main' unit. You always need to 'include' this one!
(uses Dos,Crt,Deskit,.....;)
Desstr.TPU for operations on strings, chars, time, date.
This one you can use if you want to use the desire own
string/date/time operations, but is not neccessary!
Desuart.TPU this one is only by Deskit.TPU for the UART communications.
but forget this, you don't need this.
Desfos.TPU this one too is only used by Deskit.TPU for the FOSSIL
communications, you don't need this one either!
Maybe you did some coding for System/X before where you
needed 2 different .TPU-files for UART and FOSSIL ?
Well Desire supports both at one time, no need to make
a FOSSIL and a seperate UART version! Desire doors are
both FOSSIL and UART!
Dessys.TPU Some System&Keyboard routines, only of you want to use it!
ÚÄÄÄÄÄÄÄÄÄÄÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÄÄÄÄÄÄÄÄÄÄÄÄ¿
³ º º ³
³ º 2. The Doorkit Explained º ³
³ º º ³
ÀÄÄÄÄÄÄÄÄÄÄÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÄÄÄÄÄÄÄÄÄÄÄÄÙ
= Deskit.TPU ==============================================================
A unit contains VARS, TYPES, PROCEDURES and FUNCTIONS you can access in
your program called a 'DOOR'
Const
-----
Const Version='1.2';
Const STRLINES=200; { number of strings in STRSx.x }
Types
-----
TYPE
ConfigRec = RECORD (* C:\DESIRE\CONFIG.<Node> *)
LastCall = RECORD (* C:\BBS\DATA\LASTCALL.DAT *)
BBSrecord = Record (* C:\BBS\DATA\BBS<node>.DAT *)
ConfUserRecord = RECORD (* C:\BBS\CONFDIR\USERS.CNF *)
TransferRecord = RECORD (* C:\BBS\DATA\TRANSFER.xxx *)
MultiNodeRecord = RECORD (* C:\BBS\DATA\NODE.xxx *)
DoorRecord = RECORD (* C:\BBS\DATA\SXDOOR.xxx *)
MsgRecord = RECORD (* C:\BBS\MSGBASE\HEADERS.DAT*)
FlagRecord = RECORD (* C:\BBS\FILEFLAG.xx *)
XferLogRecord = RECORD (* C:\BBS\LOGFILES\UPLOAD.DAT*)
StringRecord = RECORD (* C:\BBS\STRSx.xxx *)
GlobalFlagRecord = Record
{ all the above RECORDS structures can be found in STRUCTS.130, in
this case STRUCT.130 because Doorkit version 1.2 supports the
structures of Desire Version 1.3 (at this point not yet released),
and is compatible with any next version of Desire!
}
InternalRec = RECORD { used internal }
StringBaseArray1 = Array[1..50] of StringRecord;
StringBaseArray2 = Array[51..99] of StringRecord;
StringBaseArray3 = Array[100..150] of StringRecord;
StringBaseArray4 = Array[151..STRLINES] of StringRecord;
{ the above contain all the menuset strings!, as they appear
in STRDES.TXT or in the MENUSET.EXE editor! you can access
all these strings by the function GetString(Nr:Integer):String;
}
TYPE MCIRptr = ^MCIRecord;
MCIRecord = Record
{ the above are to pass information into a @MCIx@ MCI-code!
If you want to show you own .PCB-file which has variable
fields in it, you can build up a list of values for all the
@MCIx@-codes that should appear on that position (up to 10 max.)
When we show a .PCB-file with the Procedure
TypeMCIFile(Name:String) the doorkit looks if there exists
a list Control^.MCI^ (or in other words: if Control^.MCI^<>NIL)
(Be carefull: Control^.MCI points to the MCIRECORD which hold
a pointer to the first element Control^.MCI^^, thats why there
is an extra ^ !)
For instance: (see NAV.PAS, included in this PACK!)
-------------------------------------------------------------------
Var AidMCI:MCIRPTR;
Begin
GetMem(Control^.MCI^,SizeOf(MCIRecord));
{ here it creates the first element of a list }
AidMCI:=Control^.MCI^;
{ AidMCI now points to that first element }
AidMCI^.Mcistr:='RAPIDO';
{ now fill the 1st record with a string, in this case
@MCI1@ will be replaced by RAPIDO! }
AidMCI^.NExt:=NIL;
{ ok, tell the doorkit this was the last element in the list!
}
TypeMCIFile('NAVSRCH.PCB');
{ show the file, @MCI1@ in that file will now be replaced with
'RAPIDO' }
AidMCI:=Control^.MCI^;
FreeMem(Control^.MCI^,SizeOf(MCIRECORD));
{ now free the 1st MCIRECORD, becarefull and don't forget
the ^ in Control^MCI^ <---- because it's the 1st element
we are removing and NOT the Control^.MCI }
CloseAll;
End;
}
TYPE EventRecord = RECORD
Time:String[5]; {HH:MM}
Action:Byte;
{ Set Bit 7 OFF-HOOK
Bit 6 ON-HOOK
Bit 5 ONLINE
Bit 4 OFFLINE
Bit 3..0 = 0..31 Actions
Actions:
0 IDLE
1 RESET DAYSTATS
2 EXIT + <Errorlevel>
3 RUN DOOR + <Filename>
4 CD PLAY + <Track>
5 CD STOP
6 TYPE + <Filename>
7 RUN UTIL + <Filepath>
8 BEEP + <# Times>
9 LOGOFF
}
Extern:String[30]; { DOORNAME }
End;
{ The eventrecord contains a time and a action byte. The action
byte contains the information about which action should occure and
whether or not the modem should be turned on- or off-hook or
if the action may only occur if the bbs is off- or online.
the 4 least significant bytes represent the action number
as show above.
This data is read from the EVENTS.x, for instance:
----------------------------------
05:40 TYPE WARNING
05:45 OFFHOOK
06:00 RUN NETMAIL
06:15 ONHOOK
----------------------------------
This could be an event-script for the NETMAIL-door. At 5.40 a door
is executed while a user might be online. At 5.45 the BBS goes
actually OFFLINE. at 6.00 a door called NETMAIL is started.
This door could actually take over the modem to communicate with
another remote NETMAIL-server/BBS. At 6.15 the board goes online again.
Commands for events:
TYPE <filename> for showing textfiles from the TEXT-dir online.
RUN <filename> for executing programs offline.
RUNDOOR <filename> for executing programs online.
OFFHOOK for modem-offhook (busy.)
ONHOOK for modem-onhook (online.)
CDPLAY <track> for playing a cd-track.
CDSTOP for stopping the cd.
RESET for BBS-reset (usually at 00:00)
EXIT for exiting the bbs (reset)
QUIT for quiting the bbs (shutdown)
While creating a EVENTS.x file make sure you put the line :
----------------------------------
RESET xx:xx
----------------------------------
(Where xx:xx indicates the time of the day statistics reset)
Otherwise the statistics reset will be ignored!
}
TYPE InternalRec = RECORD
PosInUserBase : LongInt; { for use with msgindex }
{ the position of this user in the userbase }
CheckPause : Boolean;
{ check when length of screen is reached ? }
Ypos:Byte;
{ the current number of lines enter without a pause }
SysopHangup : Boolean;
{ ALT - H pressed ? }
UserLockOut: Boolean;
{ ALT - L pressed ? }
CorrectLogon:Boolean;
{ Is this a correct logon ? }
Node:Byte;
{ The current node }
Commands:Array [1..MaxDosKey] of String[30];
{ The last 20 commands }
CommandPtr:Byte;
{ current command }
BaudStr:String;
{ baudstr returned by modem }
Lines:Byte;
{ howmany lines available on the screen
with or without the statistics bar etc. }
TimeExpiredWarning:Boolean;
{ Did we have a warning yet ? }
TimeLeft:LongInt; {original timeleft for a user}
{ Timeleft at start }
NextEvent:EventRecord; { HH:MM }
{ When is the next event ? (see above) }
LastEvent:EventRecord; { HH:MM }
{ What was the last event ? (see above) }
StatBarType:Byte; { 1..9 }
{ which statbar is on ? }
InputAvail:Byte; { 0 none , 1 = local , 2 = remote }
MainPrompt:String;
{ what's the current mainprompt in Desire ? }
ForceLogoff:Boolean;
{ Force logoff after event ? }
StopOutput:Boolean;
{ Stop output after 'More Y/N/NS = N' }
SysopLogon:Boolean;
{ Sysoplogin ? }
DontSendInit:Boolean;
{ -L as parameter for Desire ? }
DontCheckInit:Boolean;
{ -DONTCHECK as parameter for Desire ? }
DontHangUp:Boolean;
{ -D as parameter for Desire ? }
NoDirCheck:Boolean;
{ -C as parameter for Desire ? }
CheckCarrier:Boolean;
{ Is carrier checked now ? }
CheckTime:Boolean;
{ Check for timeleft ? }
LastLocalAction:String[8]; { HH:MM:SS }
{ Last time input from keyboard locally }
SaveScreen:Boolean; { screensave active ?>! }
{ Screensaver active ? }
DontShowFiles:Boolean;
{ Is flag G (ALT-G) Up or Down ? }
CDTrackPlaying:Integer;
{ Which CD track is been played now ? }
StatBarHelpPos:Byte;
{ Which help is shown ? }
CaptureStart:Boolean;
{ Is capture on ? }
End;
PROCEDURES and FUNCTIONS
------------------------
{ PUBLIC FUNCTIONS: }
Function GetAreaName(No:Byte):String;
{ get the name of the current CONFERENCE! }
Procedure Pause;
{ prints a Pause, the pause directly from the menuset of the current
user! }
Procedure More;
{ prints a More prompt Yes/No/Nonstop etc..
If 'N' then Control^.Int^.StopOutput is set TRUE !
If 'NS' then Control^.Int^.CheckPause is set FALSE!
}
Function Default(YesIsDefault:Boolean):boolean;
{ Waits for input (y/n).
YesIsDefault means if the key that is pressed
was NOT a 'N' (but for instance an Enter) then Default gets TRUE!
and the other way around!
If Default is set TRUE then 'Yes' appears on the screen and 'NO'
otherwise.
}
{ OUTPUT LOCAL : }
Procedure LocalWrite(f:string);
Procedure LocalWriteln(f:string); { local screen }
{ Writes locally, including PCB-codes!}
Procedure LocalCls;
{ just a ClrScr }
Function TypeMCIFile(filename:string):Boolean;
{ to show a .PCB file with MCI-codes and ANSI-codes allowed }
Function TypeTXTFile(filename:string):Boolean;
{ to show a plain textfile with no MCI/ANSI-codes allowed }
{ INPUT LOCAL & REMOTE : }
Function AllReadln(Size:Integer):string;
{ reads input remote&local with a max. Size }
Function AllRead(Size:Integer):string;
{ idem, now it only doesn't enter to the next line }
Function AllReadlnFill(Size:Integer;Fill:Char):string;
{ does the same as AllReadln but fills spaces with Fill-chars,
for instance 'ú' }
Function AllGetCh:byte;
{ Waits for input! is used by Function Getch:Byte which does not wait! }
Function AllKeypressed:Boolean;
{ gives True if ANY input is available from remote or local keyboard }
Function GetCh:byte;
{ gives 0 when no key is pressed and the ASCII-value otherwise }
Function Edit_String(f:string;size:integer;LF:Boolean):String;
{ let's you Edit a string.
It prints the string on the current position and lets you edit it
using Backspace and checks for the maximum size and finally enters
if LF is true.
}
{ OUTPUT LOCAL & REMOTE : }
Procedure AllBackSpace(L:Byte);
{ Moves the cursor and Deletes the last L charachters }
Procedure Allmoveleft(i:integer);
{ Moves the cursor left i positions }
Procedure AllmoveRight(i:integer);
{ Moves the cursor right i positions }
Procedure Allmoveup(i:integer);
{ Moves the cursor up i positions }
Procedure Allmovedown(i:integer);
{ Moves the cursor down i positions }
Procedure AllCursorXY(x,y:integer);
{ Moves the cursor to (X,Y) from the top left position }
Procedure AllWrite(f:string); { both local & com }
{ Prints a string f, MCI and ANSI-codes allowed }
Procedure AllWriteln(f:string); { both local & com }
{ Prints a string f with a line-feed, MCI and ANSI-codes allowed }
Procedure AllWriteNonMCI(f:string); { both local & com }
{ Prints a string f, but no MCI/ANSI-codes allowed }
Procedure AllWritelnNonMCI(f:string); { both local & com }
{ Prints a string f with a line-feed, but no MCI/ANSI-codes allowed }
Procedure CWriteMCI(f:string); { both local & com }
{ same as AllWrite, for System/X compatibility }
Procedure CWriteMCIln(f:string); { both local & com }
{ same as AllWriteln, for System/X compatibility }
Procedure CWrite(f:string); { both local & com }
{ same as AllWriteNonMCI, for System/X compatibility }
Procedure CWriteln(f:string); { both local & com }
{ same as AllWritelnNONMCI, for System/X compatibility }
{ OUTPUT REMOTE }
Procedure Com_string(f:string);
{ sends string f to the modem }
Function Com_stringcheck(f:string):boolean;
{ sends string f to the modem, and checks if the modem is receiving
it, in case of Com_string the system would hang until the modem
receives the string }
Procedure Com_stringcrlf(f:string);
{ same a Com_string but gives an enter after it }
{ INPUT REMOTE }
Function Com_receive:Char;
{ wait's for remote input }
Function Com_inputavail:boolean;
{ is set TRUE if the remote user has pressed a key }
{ COMFUNCTIONS }
Procedure Allinit;
{ Do not use this! it's called once at the start of the doorkit
by Deskit.TPU itself to init the comport }
Procedure Com_flush;
{ Flush the comport }
Procedure Com_hangup;
{ Drop the carrier }
Procedure Com_Atcmd(f:string);
{ Send an AT-command to the modem }
Procedure CloseAll; (* Always use this as last command !! *)
{ Close the comport, Always call this last! in your doors!! }
{ DATAFILES }
Procedure WriteDropFile;
{ Write the current DOOR-record (in memory) to disk
If you change values in this DOOR-record and you write it back to
disk with WriteDropFile then Desire will notice that it's data
has been changed and will read the DOOR-record and will take
over it's values!
}
Procedure ReadDropFile;
{ read the DOOR-record (user data), this is already read in by
Deskit.TPU, so there is no need to execute this procedure unless you
intend to
}
Procedure WriteNodeFile(Status:Byte;ExtStatus:String);
{ Write's the NODE-file, to tell other nodes what this node is doing.
for instance if you made a WHO-door you could call this at the
beginning of the door:
WriteNodeFile(18,'');
0 - Node Inactive ExtStatus: -
1 - Waiting for Call ExtStatus: -
2 - Ring Detected ExtStatus: -
3 - Receiving Call ExtStatus: -
4 - Logging on ExtStatus: -
5 - Scanning Mail ExtStatus: -
6 - Normal BBS Use/IDLE ExtStatus: -
7 - Account Sequence ExtStatus: -
8 - MultiNode Chat ExtStatus: -
9 - Newuser ExtStatus: NewUserName
10 - Uploading ExtStatus: FileName <Number>
11 - Downloading ExtStatus: FileName <Number>
12 - Beginning Upload ExtStatus: -
13 - Beginning Download ExtStatus: -
14 - FileCheck ExtStatus: FileName
15 - FileID ExtStatus: FileName
16 - Logging Off ExtStatus: -
17 - Chatting with Sysop ExtStatus: -
18 - WHO ExtStatus: -
19 - Joining Conference ExtStatus: -
20 - Viewing Bulletins ExtStatus: -
21 - Viewing TextFile ExtStatus: -
22 - Sysop Viewing File ExtStatus: -
23 - Viewing Userlist ExtStatus: -
24 - Editing User Setups ExtStatus: -
25 - Posting Message ExtStatus: <ToWho>
26 - Reading Messages ExtStatus: -
27 - Viewing Filelist ExtStatus: -
28 - Scanning New Files ExtStatus: -
29 - Paging Sysop ExtStatus: -
30 - Requested Relogon ExtStatus: -
31 - ZipScan ExtStatus: -
32 - Flagging Files ExtStatus: -
}
Procedure LogAction(Comment:String);
{ LogAction logs a comment into the LOGFILE of the current node,
LogAction('xROADs' NEWUSERAPPLICATIONVIEWER 1.1 executed.');
results in a line like this:
--------------------------------------------------------
14:00:22 xROADs' NEWUSERAPPLICATIONVIEWER 1.1 executed.
--------------------------------------------------------
LogAction('') { with an empty string }
results in a line like this:
-------------------------03-29-97 14:00:10-----------------------------
Function GetString(Nr:Integer):String;
{ Gives a MENUSET string
When the normal Desire menuset(s) are used, GetString(73) would
return the string:
'@X07Sysop Jumped to DOS, please wait...'
and GetString(74) would be: '@X07thanx for waiting...'
Now, AllWrite(Getstring(73)) would print:
@X07Sysop Jumped to DOS, please wait...
See the STRDES.TXT or MENUSET.EXE for the corresponding numbers!
}
Function GetConferencePath(ConfNumber:Integer):String;
{ returns the current FULL path to the conference like this:
'C:\DESIRE\CONF1'
}
= Desstr.TPU ==============================================================
Function ShortTIME:string;
{ prints the time like this: 10:00 }
Function DATE:string;
{ print the date like this: MM-DD-YY }
Function TIME:string;
{ prints the time like this: 10:00:00 }
Function StrToInt(Str:string):integer;
{ converts a string to an integer }
Function CutSpacesOff(str:string):string;
{ cuts the last spaces from a string }
Function ToLowcase(Str:String):string;
{ converts al chars in a string to lowercase }
Function LongToStr(i:longint;Width:Integer):String;
{ converts a LongInt i to a string with a particular Width }
Function intToStr(i:integer;Width:Integer):String;
{ converts a Integer i to a string with a particular Width }
Function DoubleToStr(i:double;Width:Integer):String;
{ converts a Double i to a string with a particular Width and no
fraction }
Function ToUpcase(Str:String):string;
{ converts the string Str tp uppercase }
Function chobstring(source:string;from_length, to_length:integer;fill:boolean):string;
{ chobs a part of a string source which had a length of from_length and
needs to be resized (either bigger or smaller) to to_length and
if it needs to be bigger add it with characters of fill }
Function Parameter(f:string;N:byte):String;
{ returns the f-th parameter in a string, that is the f-th word
surrounded by spaces }
Function swildcard(name:string):string;
{ converts a string (filename or username) to a string with length 30
where 'FILE*' would result in 'FILE??????????????????????????'
to see if two strings are the same if they are wildcarded
(with equal)
}
Function swildcardsused(f:string):boolean;
{ return TRUE if f contains a '*' or a '?' }
Function equal(name1,name2:string):boolean;
{ checks if two wildcarded strings are equal to each other
Equal(Swildcard('FI*'),Swildcard('*')) = true
}
Function fwildcard(name:string):string;
{ same as before, now for files
fwildcard ('FIL*.TXT') = 'FIL?????.TXT'
}
Function fwildcardsused(f:string):boolean;
Function FExpandFile(name1:String):String;
{ shapes a filename 'BLA*.*' into 8.3 ('BLA* .* ') }
Function Fequal(name1,name2:string):boolean;
{ return TRUE if two wildcardeds filenames are the same:
Fequal(FWildcard('FIL*'),FWildcard('F*')) = True;
}
Function LeadingSpace(w : Longint;Width:Byte) : String;
{ converts a LongInt to a string with a Width an aligns it to the
right }
Function TimeUsed(LcLogonTime,LastTime:String):
LongInt;
{ returns the amount of seconds between two time-strings :
TimeUsed('09:00:00','10:00:00') = 3600
}
Function LeadingZerof(w : LongInt) : String;
{ converts a LongInt to a string and puts zeros in front }
LeadingZerof(8) = '00000008'
}
Function Stripmcicode(var str:string):string;
{ removes @X00-codes from a string }
Function CompileTab(Var f:string):String;
{ converts #9 into 8 spaces }
Function RemoveUnderScore(f:string):String;
{ removes _ and replaces them by a space ' ' }
Function DateToDays(DateSt:String):LongInt;
{ converts a date to a number of days from 00-00-00 }
Function KillEndSlash(f:string):string;
{ removes the last \ that occurs in filepaths }
Function CharInString(St:String;Ch:Char):Boolean;
{ returns true if character Ch occurs in string St }
= Dessys.TPU ==============================================================
Procedure Pageon;
{ turns the screen on from PageOff }
Procedure Pageoff;
{ turns the screen output of and the screen appears black }
Function CapsOn: Boolean;
{ return TRUE when Capslock is on }
Function NumOn: Boolean;
{ return TRUE when Numlock is on }
Function ScrollOn: Boolean;
{ return TRUE when Scrolllock is on }
Procedure Set_Caps(On : boolean);
{ sets Capslock (and the led) on/off }
Procedure Set_Num(On : boolean);
{ sets Numlock (and the led) on/off }
Procedure Set_Scroll(On : boolean);
{ sets Scrolllock (and the led) on/off }
ÚÄÄÄÄÄÄÄÄÄÄÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÄÄÄÄÄÄÄÄÄÄÄÄ¿
³ º º ³
³ º Example: 3. The xROADS Newuser Application Viewer 1.1 (FULL SOURCE) º ³
³ º º ³
ÀÄÄÄÄÄÄÄÄÄÄÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÄÄÄÄÄÄÄÄÄÄÄÄÙ
This code is not Optimized and still contains bugs! Find them :)
-----------------------------------------------------------------------------
Program NewuserAppViewer;
Uses Deskit,Files,DesStr;
Var Username,Input,Temp_Str:String;
{ input strings Temp_Str and Input
{ output string Username as @MCI1@ in NAVFND.PCB }
EndSubLoop,EndLoop:Boolean;
{ variables to end loops lile WHILE/DO and
REPEAT/UNTIL }
SearchNode:Byte; { which ANSWERx.TXT file are we reading ? }
Found:Boolean; { we just found a user }
F:Text; { for textfiles }
i:integer; { aid counter }
C:Byte; { to read a byte from the user }
AidMCI:MCIRPTR; { for the @MCIx@-codes }
ShowCont:Boolean;
EverFound, { did we ever find a user ? }
JustShown:Boolean; { did we just have a user on the screen or
were we looking for one ?
to estimate the amount of enters at
the end
}
Begin
EverFound:=false;
If ParamStr(2)<>'' then
If Door.SecLvl<StrToInt(ParamStr(2)) then
Begin
AllWriteln('No rights to execute this door.');
AllWriteln('');
CloseAll;
Exit;
End;
TypeMCIFile('NAVTOP.PCB');
Input:=Allreadln(30);
If Input='' then
Begin;
EndSubLoop:=True;
Endloop:=True;
TypeMCIFile('NAVBORT.PCB');
End else
Begin;
GetMem(Control^.MCI^,SizeOf(MCIRecord));
AidMCI:=Control^.MCI^;
AidMCI^.mcistr:=ToUpcase(Input);
AidMCI^.NExt:=NIL;
TypeMCIFile('NAVSRCH.PCB');
AidMCI:=Control^.MCI^;
AidMCI:=Control^.MCI^;
FreeMem(Control^.MCI^,SizeOf(MCIRECORD));
End;
EndLoop:=False;SearchNode:=1;Found:=False;
ShowCont:=True;
JustShown:=False;
While not EndLoop do
Begin
If Exists(Config.Scripts+'\ANSWER'+IntToStr(SearchNode,0)+'.TXT') then
Begin;
{ ok, list exists }
Assign(f,Config.Scripts+'\ANSWER'+IntToStr(SearchNode,0)+'.TXT');
Reset(f);
Readln(f,Temp_str);
EndSubLoop:=False;
While not EndSubLoop do
Begin
If Eof(f) then EndSubLoop:=True else
If (Chobstring(Temp_str,5,5,false)='\----') then
Begin { this is a string, the next line gives the username }
Readln(f,Temp_str);
Username:='';
i:=11;
While (i<=Length(Temp_Str)) and (Temp_str[i]<>',') do
Begin
Username:=Username+Temp_str[i];
Inc(i);
End;
For i:=1 to (Length(Username)-Length(Input))+1 do
If ToUpcase(Copy(Username,i,Length(Input)))=
ToUpcase(Input) then
Begin { found! }
{ show it! }
EverFound:=True;
GetMem(Control^.MCI^,SizeOf(MCIRecord));
AidMCI:=Control^.MCI^;
AidMCI^.mcistr:=Username;
AidMCI^.NExt:=NIL;
TypeMCIFile('NAVFND.PCB');
AidMCI:=Control^.MCI^;
AidMCI:=Control^.MCI^;
FreeMem(Control^.MCI^,SizeOf(MCIRECORD));
C:=AllGetch;
If Upcase(Chr(C))='Q' then
Begin;
EndLoop:=True;
EndSubLoop:=True;
AllWriteln('Quit');
AllWriteln('');
AllWriteln('');
End else
If Upcase(Chr(C))<>'N' then
Begin
JustShown:=True;
AllWriteln('Yes');
AllWriteln('');
AllWriteln('');
TypeMCIFile('NAVHDR.PCB'); { header }
Found:=True;
While (Chobstring(Temp_str,5,5,false)<>'\----') and (not Eof(F)) do
Begin
AllWriteln(Temp_Str);
Readln(f,Temp_Str);
End;
{Show;}
TypeMCIFile('NAVCONT.PCB'); { continue searching ? }
C:=AllGetch;
If (ToUpcase(Chr(C))<>'N') and (ToUpcase(Chr(C))<>'Q') then
Begin
Allwrite('Yes');
AllWriteln('');
AllWriteln('');
Found:=False;
GetMem(Control^.MCI^,SizeOf(MCIRecord));
AidMCI:=Control^.MCI^;
AidMCI^.mcistr:=ToUpcase(Input);
AidMCI^.NExt:=NIL;
TypeMCIFile('NAVSRCH.PCB');
AidMCI:=Control^.MCI^;
AidMCI:=Control^.MCI^;
FreeMem(Control^.MCI^,SizeOf(MCIRECORD));
End else
Begin
Allwrite('No');
AllWriteln('');
AllWriteln('');
EndSubloop:=True;
EndLoop:=True;
End;
End else
Begin;
ShowCont:=False;
Found:=False;
AllWriteln('No');
AllMoveUp(3);
JustShown:=False;
End;
End
End else Readln(f,Temp_str);
End; { sub }
Close(f);
End; { exist }
Inc(SearchNode);
If SearchNode>Config.Howmanynodes then EndLoop:=True;
end; {endloop }
If not Found then
Begin
If (not JustShown) and (Input<>'') and EverFound then
Begin
AllWriteln('');
AllWriteln('');
AllWriteln('');
AllWriteln('');
End;
TypeMCIFile('NAVNOT.PCB');
End;
CloseAll;
End.
-----------------------------------------------------------------------------
ÚÄÄÄÄÄÄÄÄÄÄÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÄÄÄÄÄÄÄÄÄÄÄÄ¿
³ º º ³
³ º 4. Notes º ³
³ º º ³
ÀÄÄÄÄÄÄÄÄÄÄÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÄÄÄÄÄÄÄÄÄÄÄÄÙ
If you have any valuable information that you want to share with other
developers, send it to xroads@stack.nl and we'll publish it in the next
issue!
Thankz, Rapido
-----------------------------------------------------------------------------
ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿
ÖÄÄÄÄÄÄÄÄÄÄÄÄ[³ [*] LEADING FORCE [*] ³]ÄÄÄÄÄÄÄÄÄÄÄÄÄ·
ÚÄĺÄÄÄÄÄÄÄÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÄÄÄÄÄÄÄĺÄÄÄ¿
³ º Rapido Alibabba º ³
ÀÄĺÄÄÄÄÄÄÄÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÄÄÄÄÄÄÄĺÄÄÄÙ
ÓÄÄÄÄÄÄÄÄÄÄÄÄÄÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙÄÄÄÄÄÄÄÄÄÄÄÄÄĽ
ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿
ÖÄÄÄÄÄÄÄÄÄÄÄÄ[³ [*] ACTIVE MEMBERS [*] ³]ÄÄÄÄÄÄÄÄÄÄÄÄÄ·
ÚÄĺÄÄÄÄÄÄÄÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÄÄÄÄÄÄÄĺÄÄÄ¿
³ º Alibabba, Ampsul, Breakdown, Gannon, Grim, Highl/\nder, Inm º ³
³ º Ken8, The Killer, Mexx, Mr Bungle, Mushroom, Nighty, Omen, º ³
³ º Ooze, Pascal, Phreak Klass, Phasia, Predator, Rapido, Ripper, º ³
³ º Sludge, Squizzy, Star, Thc, Voyage, Wasted º ³
ÀÄĺÄÄÄÄÄÄÄÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÄÄÄÄÄÄÄĺÄÄÄÙ
ÓÄÄÄÄÄÄÄÄÄÄÄÄÄÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙÄÄÄÄÄÄÄÄÄÄÄÄÄĽ
ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿
ÖÄÄÄÄÄÄÄÄÄÄÄÄ[³ [*] CODING DIVISION [*] ³]ÄÄÄÄÄÄÄÄÄÄÄÄÄ·
ÚÄĺÄÄÄÄÄÄÄÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÄÄÄÄÄÄÄĺÄÄÄ¿
³ º Rapido, Alibabba, Ampsul, Pascal ,Gannon, Inm º ³
ÀÄĺÄÄÄÄÄÄÄÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÄÄÄÄÄÄÄĺÄÄÄÙ
ÓÄÄÄÄÄÄÄÄÄÄÄÄÄÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙÄÄÄÄÄÄÄÄÄÄÄÄÄĽ
ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿
ÖÄÄÄÄÄÄÄÄÄÄÄÄ[³ x R O A D s H E A D Q U A R T E R S ³]ÄÄÄÄÄÄÄÄÄÄÄÄÄ·
ÚÄĺÄÄÄÄÄÄÄÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÄÄÄÄÄÄÄĺÄÄÄ¿
³ º Eternal Damnation .......1 Node......+31...Davadian........WORLD HQ º ³
³ º Mystical Places .........6 Nodes.....+31...Thc............. EURO HQ º ³
³ º Rest In Peace ...........1 Node......+54...Sludge.......... ARG HQ º ³
³ º Central Park ............3 Nodes.....+61...Mr. Bungle........ OZ HQ º ³
³ º Point Break .............7 Nodes.....+49...Voyage........ GERMAN HQ º ³
³ º Magic Affair ............4 Nodes.....+7....Omen......... RUSSIAN HQ º ³
³ º Dead On Time ............2 Nodes.....+47...Nighty..... NORWEGIAN HQ º ³
³ º High Resolution .........1 Node......+44...Pascal............ UK HQ º ³
³ º Dark Forces .............3 Nodes.....+46...Gannon/Phasia SWEDISH HQ º ³
³ º Killertown ..............7 Nodes.....+32...The Killer... BELGIUM HQ º ³
³ º Unknown Area ............1 Node .....+48...Vibr8......... POLISH HQ º ³
³ ºÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄĺ ³
³ º x R O A D s M E M B E R S I T E S º ³
³ ºÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄĺ ³
³ º Sector Seven ............2 Nodes.....+46...Inm/Rawlock. SWEDISH MBR º ³
³ º Tresor ..................1 Node......+46...Ken8........ SWEDISH MBR º ³
³ º Fireball ................2 Nodes.....+49...Star......... GERMAN MBR º ³
ÀÄĺÄÄÄÄÄÄÄÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÄÄÄÄÄÄÄĺÄÄÄÙ
ÓÄÄÄÄÄÄÄÄÄÄÄÄÄÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙÄÄÄÄÄÄÄÄÄÄÄÄÄĽ
ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿
ÖÄÄÄÄÄÄÄÄÄÄÄÄ[³ T H A N K S G R E E T S N O T E S ³]ÄÄÄÄÄÄÄÄÄÄÄÄÄ·
ÚÄĺÄÄÄÄÄÄÄÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÄÄÄÄÄÄÄĺÄÄÄ¿
³ º xROADs thanks & greets the following groups/persons: º ³
³ º º ³
³ º Food, Goodspeed, Motiv8, Stf and many others º ³
³ º º ³
³ ºÄÄÄÄÄÄÄÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÄÄÄÄÄÄÄĺ ³
³ º xROADs thanks & greets the following individuals : º ³
³ º º ³
³ º Davadian, Darktrooper, Inm, Nighty, Mtl, Cyberkid, The Best º ³
³ º and all others in #FOOD and #STF º ³
³ º º ³
³ ºÄÄÄÄÄÄÄÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÄÄÄÄÄÄÄĺ ³
³ º N O T E S º ³
³ ºÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄĺ ³
³ º º ³
³ º xROADs is looking for talented people like you for coding doors, º ³
³ º managing the xROADs doors coding division and for art work. º ³
³ º if you're interested in getting xROADs back up again email º ³
³ º to: xroads@stack.nl or join #xroads on Efnet and contact º ³
³ º one of the leaders! º ³
³ º º ³
³ º xROADs changed WHQ! Our new world headquarters will be º ³
³ º Eternal Damnation +31-765-600721 º ³
³ º º ³
³ º Visit us on the Efnet on #XROADS º ³
³ º and contact one of the council members º ³
³ º º ³
³ º You can contact us via E-mail : xroads@stack.nl º ³
³ º or call the xROADs WHQ at º ³
³ º +31-765-600721 (28K8) º ³
³ º º ³
³ º All new releases can be downloaded from our www-page at º ³
³ º www.stack.nl/~xroads º ³
³ º º ³
³ ºÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄĺ ³
³ º Nfo & Xrd Logo By SQUiZZY. Nfo Last Updated By RaPiDo on 03/23/97 º ³
ÀÄĺÄÄÄÄÄÄÄÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÄÄÄÄÄÄÄĺÄÄÄÙ
ÓÄÄÄÄÄÄÄÄÄÄÄÄij ³ÄÄÄÄÄÄÄÄÄÄÄÄÄĽ
³ Please report bugs! By reporting bugs ³
³ you help us to improve our work! ³
³ ³
ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ
@BEGIN_FILE_ID.DIZ
ÛÛÛ ° ° °
Ä ÄÛ²ÛÄ--Ä[Desire Development Mag #1]Ä--
° Û²Û ° ° ± ° ° ± ° ° ° ° ± ° °
±ÜÜÜÜÜÜ ÜÜÜÜÜÜÜ ÜÜÜÜÜÜ ÜÜÜ ÜÜÜÜÜÜ ÜÜÜÜÜÜÜ
ÛÛÛßßßß ÛÛÛßßßß ÛÛ²ÛÛÛÛ ßßß ÛÛÛßÛÛÛ ÛÛÛßßßß
Û²Û Û²Û Û²Ûßßß Û²±ÛÜÜÜ ÛÛÛ Û²ÛÜÛÛß Û²Ûßßß°
Û²Û Û²Û Û²Û Û²Û ÜÜÜ Û²Û Û²Û Û²Û Û²Û Û²Û Û²Û
Û²Û Û²Û Û²Û Û²Û Û²Û Û²Û Û²Û Û²Û Û²Û Û²Û Û²Û
±ßßßßßß ±ßßßßßß° ßßßßßß°ßßß° ßß°ßßß± ßßßßßß
°.-------------------------------------.sQZ
| Desire Development Magazine #1 |² ±
| Download XRD-DEV1.ZIP too! |±
`-------------------------------------'
@END_FILE_ID.DIZ