The day before yesterday I finished lesson 6 through 12. It was fairly straight forward and everything is still very familiar to me because of my previous knowledge. The Assembly (Assembler) language Subroutine is now a Method, Libraries are practically still Libraries and Strings are still Strings, Structures are for instance Arrays and so forth. I’ll elaborate on that at another time. Bob Tabor is great to listen to and Golnaz as well as Clint Rutkas deserve credit for this series. The pacing is right and it encourages you to write the code for yourself as you go along. You get to know what you specifically should take away with you from a lesson and there is well thought out repetition throughout. You are eased into the IDE and what that is. You get to write the Hello World code that is easy to understand early on, which is a good motivator. All the while not going too far into the why and whatnot.
There is a lot of technical terminology and syntax to learn and even though I haven’t been too enthusiastic about learning technical terminology or syntax specifically before, it sort of came naturally, there is a lot of benefit from knowing them obviously. While pausing back and forth, I noted everything down in Notepad with my own words. You learn them as you go by. I also took notes on tips and tricks of the IDE and so forth. Early on, you also get introduced to commenting the code. I used to do that a lot while I was programming the ARexx and Assembly language. I used it for the purpose of readability. I comment on what code does, why it’s there and to mark up the code. It’s good practice and it makes it easier to return to the code later.
I won’t go into what you get to learn as much as I will document what I can do with C# from day to day as I progress through the series and then a subsequent book or another video series. Ultimately, I will document programming an actual application and publishing it, making the source code freely available. Yesterday I had a first attempt at my own C# code using what I got from Day 1 and 2. A Console Application which prompts you for your rent, electrical bill, and so forth, while all of the fixed monthly reoccurring expenses are pre-programmed. It returns my total as well as my fiancée’s total, where we split some of the bills while others we don’t. It also formats correctly to display in local currency. It doesn’t incorporate everything of what I have learned so far, far from it, but I won’t be needing the calculator every end of the month from now on. (Not that it was too complicated to start with, otherwise I would have used Excel in the first place.)
The C# Console Application at the first prompt.
Here’s an addition to the nostalgia of yester-post. I was sixteen when I wrote the following Assembly language code (don’t ask why I hated Includes (?) and excuse the language):
;ClassicArc (c) by BigBang/Independent 1997, LHA/LZX Stripper/Adder/Checker.
;-----------------÷[ The Variables, Includes & Structures! ]÷----------------÷]
Incdir 'Include:'
Include 'Daydream.i' ;I just hate Includes.
Include 'Exec_lib.i'
Include 'Dreamdoor_lib.i'
Include 'Exec/Exec.i'
Include 'Dos_lib.i'
Include 'Dos/Dos.i'
STRUCTURE Globals,0
ULONG Data_FileStrip,1
ULONG Data_FileAdd,1
ULONG Lenght_Strip,1 ;A lot of shit.
ULONG Lenght_Add,1
ULONG Temporary_File,1
ULONG ClassicKeyfile,1
ULONG Keyfile_Buffer,1
APTR DayLib_Base,1
APTR DosLib_Base,1
APTR DD_DIF,1
APTR Openfile_Store,1
STRUCT Structures,dp_SIZEOF
STRUCT Work_Buffer,500
STRUCT Read_Buffer,16000
STRUCT LZX_ExecuteNew,100
STRUCT LZX_ExeAddStrip,100
STRUCT LHA_ExeStrip,100
STRUCT ARC_Check,100
STRUCT LHA_ExeAdd,100
STRUCT String_Pause,200
STRUCT String_BlockCheck,200
STRUCT String_BlockAdd,200
STRUCT String_BlockStrip,200
STRUCT String_BlockDupe,200
STRUCT String_MainPos,100
STRUCT String_EndPos,100
STRUCT String_FilePos,100
STRUCT String_FillItUp,100
STRUCT String_Progress,50
STRUCT String_Table,80
STRUCT File_Name,20
STRUCT Add_Name1,100
STRUCT Add_Name2,100
STRUCT Add_Name3,100
STRUCT Add_Name4,100
STRUCT Add_Name5,100
STRUCT Add_Name6,100
STRUCT Add_Name7,100
STRUCT CFGPath_Buffer,120
UBYTE CFG_FullBar,1
UBYTE CFG_Pause,1
UBYTE CFG_NewLZX,1
UBYTE LoopRead_Flag,1
UBYTE Log_Failed,1
UBYTE Keyfile_Flag,1
UBYTE Memory_Flag,1
UBYTE Found_Flag,1
UBYTE Finished_Flag,1
UBYTE Archive_Flag,1
UBYTE Progress_Count,1
UBYTE Dupe_Counter,1
LABEL Variables_SIZEOF
;--------------------÷[ Store commandline parameter! ]÷----------------------÷]
Run: Movea.L a0,a4
Move.L d0,d4
;-----------------÷[ Allocate required mem for structures! ]÷----------------÷]
Alloc: Movea.L 4.W,a6
Move.L #Variables_SIZEOF,d0
Move.L #MEMF_PUBLIC!MEMF_CLEAR,d1
Jsr _LVOAllocMem(a6)
Movea.L d0,a5
Beq.W CleanUp
;-------------------÷[ Open libraries and check argument! ]÷-----------------÷]
Init: Moveq #36,d0
Lea DosLib(PC),a1
Jsr _LVOOpenLibrary(a6)
Move.L d0,DosLib_Base(a5)
Beq.W CleanUp
Moveq #5,d0
Lea DayLib(PC),a1
Jsr _LVOOpenLibrary(a6)
Move.L d0,DayLib_Base(a5)
Beq.W CleanUp
Clr.B -1(a4,d4.L)
Tst.B (a4) ;Was Argument supplied?
Beq.W CleanUp
;--------------------------÷[ Read Configuration! ]÷-------------------------÷>
ReadCFG: Movea.L DosLib_Base(a5),a6 ;Get path to and open CFG.
Move.L #Variable,d1
Lea CFGPath_Buffer(a5),a0
Moveq #0,d4
Move.L a0,d2
Moveq #119,d3
Jsr _LVOGetVar(a6)
Tst.L d0
Bmi.W CleanUp
Lea CFGPath_Buffer(a5),a0
Move.L a0,d1
Move.L #Config,d2
Moveq #119,d3
Jsr _LVOAddPart(a6)
Tst.L d0
Beq.W CleanUp
Lea CFGPath_Buffer(a5),a0
Move.L a0,d1
Move.L #MODE_OLDFILE,d2
Jsr _LVOOpen(a6)
Move.L d0,d4
Beq.W CleanUp
Lea LZX_ExecuteNew(a5),a0 ;Read first line from CFG.
Moveq #100,d3
Bsr.W .Read
Lea LZX_ExeAddStrip(a5),a0
Moveq #100,d3
Bsr.W .Read
Lea LHA_ExeStrip(a5),a0
Moveq #100,d3
Bsr.W .Read
Lea LHA_ExeAdd(a5),a0
Moveq #100,d3
Bsr.W .Read
Lea ARC_Check(a5),a0
Moveq #100,d3
Bsr.W .Read
Lea String_BlockStrip(a5),a0
Move.L #200,d3
Bsr.B .Read
Lea String_BlockAdd(a5),a0
Move.L #200,d3
Bsr.B .Read
Lea String_BlockCheck(a5),a0
Move.L #200,d3
Bsr.B .Read
Lea String_BlockDupe(a5),a0
Move.L #200,d3
Bsr.B .Read
Lea String_FilePos(a5),a0
Moveq #100,d3
Bsr.B .Read
Lea String_EndPos(a5),a0
Moveq #100,d3
Bsr.B .Read
Lea String_MainPos(a5),a0
Moveq #100,d3
Bsr.B .Read
Lea String_FillItUp(a5),a0
Moveq #100,d3
Bsr.B .Read
Lea String_Progress(a5),a0
Moveq #50,d3
Bsr.B .Read
Lea String_Table(a5),a0
Moveq #80,d3
Bsr.B .Read
Lea String_Pause(a5),a0
Move.L #200,d3
Bsr.B .Read
Lea CFG_FullBar(a5),a1
Bsr.B .ReadS
Lea CFG_Pause(a5),a1
Bsr.B .ReadS
Lea CFG_NewLZX(a5),a1
Bsr.B .ReadS ;Read last line in CFG.
Bra.B .Close
.Read Move.L a0,d2
Move.L d4,d1
Jsr _LVOFGets(a6)
Movea.L d0,a0
Beq.W CleanUp
.Loop Cmpi.B #10,(a0)+
Beq.B .Clear
Bra.B .Loop
.Clear Clr.B -(a0)
Rts
.ReadS Lea Work_Buffer(a5),a0
Move.L a0,d2
Move.L d4,d1
Moveq #5,d3
Jsr _LVOFGets(a6)
Movea.L d0,a0
Beq.W CleanUp
Move.B (a0),(a1)
Rts
.Close Move.L d4,d1 ;Close Configuration.
Jsr _LVOClose(a6)
;-------------÷[ Initialize door & Get structure pointers! ]÷----------------÷]
InitDoor: Movea.L DayLib_Base(a5),a6
Movea.L a4,a0
Jsr _LVOInitDoor(a6)
Move.L d0,DD_DIF(a5)
Beq.W CleanUp
Lea Structures(a5),a0
Jsr _LVOInquirePointers(a6)
;-----------------------÷[ The door preparation code! ]÷---------------------÷]
Prepare: Moveq #17,d0
Movea.L dp_DoorParams+Structures(a5),a1
Lea File_Name(a5),a0
.Loop Move.B (a1)+,(a0)+ ;Get filename.
Tst.B (a1)
Beq.W .CheckKey
Dbf d0,.Loop
.CheckKey Movea.L DosLib_Base(a5),a6
Move.L #GlobalKeyfile,d1 ;Check for keyfile.
Move.L #MODE_OLDFILE,d2
Jsr _LVOOpen(a6)
Move.L d0,ClassicKeyfile(a5)
Beq.B .NoKeyfile
Move.L ClassicKeyfile(a5),d1
Lea Keyfile_Buffer(a5),a0
Move.L a0,d2
Moveq #4,d3
Jsr _LVORead(a6) ;Check if keyfile is legal.
Move.L Keyfile_Buffer(a5),d0
Move.L KeyNum(PC),d1
Cmp.L d0,d1
Bne.B .FalseKey
Lea Work_Buffer(a5),a0
Move.L a0,d2
Moveq #30,d3
Move.L ClassicKeyfile(a5),d1
Jsr _LVOFGets(a6)
Movea.L d0,a3
Beq.W Quick
Move.L dp_DayDream+Structures(a5),d0
Addi.L #CFG_SYSOPNAME,d0
Move.L d0,a4
.1 Cmpm.B (a3)+,(a4)+
Bne.B .FalseKey
Tst.B (a4)
Beq.B .Continue
Cmpi.B #10,(a3)
Beq.B .Continue
Bra.B .1
.NoKeyfile Move.B #1,Keyfile_Flag(a5) ;If no keyfile was found!
Bra.B .Continue
.FalseKey Movea.L DayLib_Base(a5),a6 ;If keyfile is illegal!
Lea IllegalKey(PC),a0
Bsr.W Sendit
Move.L DD_DIF(a5),d0
Moveq #0,d1
Moveq #3,d2
Jsr _LVOFetchKey(a6)
Move.L DD_DIF(a5),d0
Jsr _LVODisconnect(a6)
Bra.W Quick
.Continue Cmpi.B #"N",CFG_FullBar(a5) ;Use fullbar feature or not?
Beq.B .NameCheck
Cmpi.B #"n",CFG_FullBar(a5)
Beq.B .NameCheck
Move.B #1,CFG_FullBar(a5)
Bra.B .Skip
.NameCheck Movea.L DayLib_Base(a5),a6
Clr.B CFG_FullBar(a5)
.Skip Moveq #29,d0
Lea File_Name(a5),a0
.First1 Cmpi.B #".",(a0)+
Beq.B .Second1
Dbf d0,.First1
Bra.W Quick
.Second1 Move.B (a0)+,d0 ;Check if filename = #?.LHA
Cmpi.B #"l",d0
Beq.B .Third1
Cmpi.B #"L",d0
Beq.B .Third1
Bra.W .Next
.Third1 Move.B (a0)+,d0
Cmpi.B #"h",d0
Beq.B .Fourth1
Cmpi.B #"H",d0
Beq.B .Fourth1
Bra.W .Next
.Fourth1 Move.B (a0)+,d0
Cmpi.B #"a",d0
Beq.W PreMain
Cmpi.B #"A",d0
Beq.W PreMain
.Next Moveq #29,d0
Lea File_Name(a5),a0
.First2 Cmpi.B #".",(a0)+
Beq.B .Second2
Dbf d0,.First2
Bra.W Quick
.Second2 Move.B (a0)+,d0 ;Check if filename = #?.LZX/LZH
Cmpi.B #"l",d0
Beq.B .Third2
Cmpi.B #"L",d0
Beq.B .Third2
Bra.W Quick
.Third2 Move.B (a0)+,d0
Cmpi.B #"z",d0
Beq.B .Fourth2
Cmpi.B #"Z",d0
Beq.B .Fourth2
Bra.W Quick
.Fourth2 Move.B (a0)+,d0
Cmpi.B #"x",d0
Beq.W .LZX
Cmpi.B #"X",d0
Beq.B .LZX
Cmpi.B #"h",d0
Beq.W PreMain
Cmpi.B #"H",d0
Beq.W PreMain
Bra.W Quick
.LZX Move.B #1,Archive_Flag(a5)
.CountIt Movea.L DosLib_Base(a5),a6 ;Count lenght of external
Move.L #DataStrip,d1 ;Add files for progress bar.
Move.L #MODE_OLDFILE,d2
Jsr _LVOOpen(a6)
Move.L d0,Data_FileStrip(a5)
Beq.W Quick
Move.L #DataAdd,d1
Move.L #MODE_OLDFILE,d2
Jsr _LVOOpen(a6)
Move.L d0,Data_FileAdd(a5)
Beq.W Quick
Moveq #0,d5
Move.L Data_FileStrip(a5),d4
Bsr.B .Read
Move.L #175,d0 ;Calculate.
Divu d5,d0
Ext.L d0
Move.L d0,Lenght_Strip(a5) ;Store counted & calculated
Moveq #0,d5 ;Lenghts.
Move.L Data_FileAdd(a5),d4
Bsr.B .Read
Move.L #175,d0
Divu d5,d0
Ext.L d0
Move.L d0,Lenght_Add(a5)
Move.L Data_FileStrip(a5),d1
Jsr _LVOClose(a6)
Move.L Data_FileAdd(a5),d1
Jsr _LVOClose(a6)
Bra.B .GetData
.Read Lea Work_Buffer(a5),a0 ;Count lenght.
Move.L a0,d2
Moveq #5,d3
Move.L d4,d1
Jsr _LVOFGets(a6)
Addq.L #1,d5
Tst.L d0
Beq.B .Finito
Bra.B .Read
.Finito Rts
.GetData Movea.L DosLib_Base(a5),a6
Move.L #DataStrip,d1 ;Open data files.
Move.L #MODE_OLDFILE,d2
Jsr _LVOOpen(a6)
Move.L d0,Data_FileStrip(a5)
Beq.W Quick
Move.L #DataAdd,d1
Move.L #MODE_OLDFILE,d2
Jsr _LVOOpen(a6)
Move.L d0,Data_FileAdd(a5)
Beq.W Quick
PreMain: Movea.L DayLib_Base(a5),a6
;--------------------÷[ The main add/strip/check code! ]÷--------------------÷]
Main: Tst.B Keyfile_Flag(a5) ;Disable LZX feature if no key!
Beq.B .Continue
Tst.B Archive_Flag(a5)
Beq.B .Continue
Bra.W Quick
.Continue Move.L DD_DIF(a5),d0
Lea External(PC),a0 ;Send door layout.
Move.L #DDF_ADDEXTENSION,d1
Jsr _LVODisplayFile(a6)
Move.L DD_DIF(a5),d0
Jsr _LVOHideCursor(a6)
Lea String_FilePos(a5),a0
Bsr.W Sendit
Lea File_Name(a5),a0
Bsr.W Sendit
Lea String_MainPos(a5),a0
Bsr.W Sendit
Move.L DD_DIF(a5),d0
Lea Activity1(PC),a0
Jsr _LVOChangeActivity(a6)
Movea.L DosLib_Base(a5),a6
Tst.B Archive_Flag(a5)
Bne.W .LZX
Lea String_Table(a5),a4
.LHAStrip Bsr.W .DoIt
Lea String_Progress(a5),a0
Move.W #" ",16(a0)
Lea LHA_ExeStrip(a5),a0 ;Strip LHA archive.
Bsr.W .Format
Bsr.W .DoIt
Bsr.W .Execute
Bsr.W .DoIt
Movea.L DayLib_Base(a5),a6
Tst.B CFG_FullBar(a5)
Beq.B .G1
Bra.B .G2
.G1 Lea String_FillItUp(a5),a0
Bsr.W Sendit
.G2 Lea String_BlockStrip(a5),a0
Bsr.W Sendit
Lea String_MainPos(a5),a0
Bsr.W Sendit
Tst.B CFG_FullBar(a5)
Beq.B .A1
Bra.B .A2
.A1 Lea String_FillItUp(a5),a0
Move.B #"4",11(a0)
Bsr.W Sendit
Lea String_FillItUp(a5),a0
Move.B #"5",11(a0)
.A2 Move.L DD_DIF(a5),d0
Lea Activity2(PC),a0
Jsr _LVOChangeActivity(a6)
Movea.L DosLib_Base(a5),a6
Tst.B CFG_FullBar(a5)
Beq.B .B1
Bra.B .LHAAdd
.B1 Lea String_Table(a5),a4
Lea String_Progress(a5),a0
Move.W #"0%",16(a0)
.LHAAdd Bsr.W .DoIt
Lea String_Progress(a5),a0
Move.W #" ",16(a0)
Lea LHA_ExeAdd(a5),a0 ;Add to LHA archive.
Bsr.W .Format
Bsr.W .DoIt
Bsr.W .Execute
Bsr.W .DoIt
Movea.L DayLib_Base(a5),a6
Tst.B CFG_FullBar(a5)
Beq.B .F1
Bra.B .F2
.F1 Lea String_FillItUp(a5),a0
Bsr.W Sendit
.F2 Lea String_BlockAdd(a5),a0
Bsr.W Sendit
Lea String_MainPos(a5),a0
Bsr.W Sendit
Bra.W .Check
.LZX Cmpi.B #"Y",CFG_NewLZX(a5)
Beq.W .NewLZX
Cmpi.B #"y",CFG_NewLZX(a5)
Beq.W .NewLZX
Lea String_Table(a5),a4
.LZXStrip Move.L Data_FileStrip(a5),d4 ;Strip adds from LZX archive.
Bsr.W .GetNames
Lea LZX_ExeAddStrip(a5),a0
Bsr.W .ClearData
Bsr.W .Format
Bsr.W .Execute
Move.L Lenght_Strip(a5),d5
Subq.L #1,d5
Bpl.B .1
Moveq #0,d5
.1 Tst.B Memory_Flag(a5)
Beq.B .4
Lea String_Progress(a5),a0
Move.W #" ",16(a0)
.4 Lea String_Progress(a5),a0
Move.W (a4)+,5(a0)
Movea.L DayLib_Base(a5),a6
Bsr.W Sendit
Move.B #1,Memory_Flag(a5)
Addq.B #1,Progress_Count(a5)
Cmpi.B #24,Progress_Count(a5)
Bne.B .2
Lea String_Progress(a5),a0
Move.W #"10",16(a0)
.2 Cmpi.B #25,Progress_Count(a5)
Bne.B .3
Lea String_Progress(a5),a0
Move.W #"0%",16(a0)
.3 Dbf d5,.1
Movea.L DosLib_Base(a5),a6
Tst.B Finished_Flag(a5)
Beq.W .LZXStrip
Movea.L DayLib_Base(a5),a6
Tst.B CFG_FullBar(a5)
Beq.B .X1
Bra.B .X2
.X1 Lea String_FillItUp(a5),a0
Bsr.W Sendit
.X2 Lea String_BlockStrip(a5),a0
Bsr.W Sendit
Lea String_MainPos(a5),a0
Bsr.W Sendit
Move.L DD_DIF(a5),d0
Lea Activity2(PC),a0
Jsr _LVOChangeActivity(a6)
Tst.B CFG_FullBar(a5)
Beq.B .Y1
Bra.B .Y2
.Y1 Lea String_FillItUp(a5),a0
Move.B #"4",11(a0)
Bsr.W Sendit
Lea String_FillItUp(a5),a0
Move.B #"5",11(a0)
.Y2 Movea.L DosLib_Base(a5),a6
Lea String_Progress(a5),a0
Move.W #" ",16(a0)
Clr.B Memory_Flag(a5)
Lea LZX_ExeAddStrip(a5),a0
Move.B #"a",23(a0)
Clr.B Finished_Flag(a5)
Tst.B CFG_FullBar(a5)
Beq.B .O1
Bra.B .LZXAdd
.O1 Lea String_Table(a5),a4
.LZXAdd Move.L Data_FileAdd(a5),d4 ;Add adds to LZX archive.
Bsr.W .GetNames
Lea LZX_ExeAddStrip(a5),a0
Bsr.W .ClearData
Bsr.W .Format
Bsr.W .Execute
Move.L Lenght_Add(a5),d5
Subq.L #1,d5
Bpl.B .5
Moveq #0,d5
.5 Tst.B Memory_Flag(a5)
Beq.B .6
Lea String_Progress(a5),a0
Move.W #" ",16(a0)
.6 Lea String_Progress(a5),a0
Move.W (a4)+,5(a0)
Movea.L DayLib_Base(a5),a6
Bsr.W Sendit
Move.B #1,Memory_Flag(a5)
Addq.B #1,Progress_Count(a5)
Cmpi.B #24,Progress_Count(a5)
Bne.B .7
Lea String_Progress(a5),a0
Move.W #"10",16(a0)
.7 Cmpi.B #25,Progress_Count(a5)
Bne.B .8
Lea String_Progress(a5),a0
Move.W #"0%",16(a0)
.8 Dbf d5,.5
Lea String_Progress(a5),a0
Move.W #" ",16(a0)
Movea.L DosLib_Base(a5),a6
Tst.B Finished_Flag(a5)
Beq.W .LZXAdd
Movea.L DayLib_Base(a5),a6
Lea String_BlockAdd(a5),a0
Bsr.W Sendit
Lea String_MainPos(a5),a0
Bsr.W Sendit
Tst.B CFG_FullBar(a5)
Beq.B .Z1
Bra.B .Z2
.Z1 Lea String_FillItUp(a5),a0
Bsr.W Sendit
.Z2 Bra.B .Check
.NewLZX Bsr.W .DoIt
Lea String_Progress(a5),a0
Move.W #" ",16(a0)
Move.B #2,Archive_Flag(a5)
Move.L Data_FileAdd(a5),d4
Bsr.W .GetNames
Bsr.W .DoIt
Lea LZX_ExecuteNew(a5),a0 ;Strip and add to LZX archive.
Bsr.W .Format
Bsr.W .DoIt
Bsr.W .Execute
Bsr.W .DoIt
Movea.L DayLib_Base(a5),a6
Tst.B CFG_FullBar(a5)
Beq.B .H1
Bra.B .H2
.H1 Lea String_FillItUp(a5),a0
Bsr.W Sendit
.H2 Lea String_BlockStrip(a5),a0
Bsr.W Sendit
Lea String_BlockAdd(a5),a0
Bsr.W Sendit
Lea String_MainPos(a5),a0
Bsr.W Sendit
Move.B #1,Archive_Flag(a5)
.Check Tst.B Archive_Flag(a5)
Beq.B .Ok
Cmpi.B #"N",CFG_NewLZX(a5) ;No Fullbar if no NewLZX.
Beq.W .Change
Cmpi.B #"n",CFG_NewLZX(a5)
Beq.W .Change
Bra.B .Ok
.Change Clr.B CFG_FullBar(a5)
.Ok Bsr.W .DoIt
Movea.L DayLib_Base(a5),a6 ;For LHA/LZH/LZX archives.
Move.L DD_DIF(a5),d0
Lea Activity3(PC),a0
Jsr _LVOChangeActivity(a6)
Tst.B CFG_FullBar(a5)
Beq.B .C1
Bra.B .C2
.C1 Lea String_FillItUp(a5),a0
Move.B #"4",11(a0)
Bsr.W Sendit
Movea.L DosLib_Base(a5),a6
Lea String_FillItUp(a5),a0
Move.B #"5",11(a0)
Lea String_Progress(a5),a0
Move.W #"0%",16(a0)
.C2 Tst.B CFG_FullBar(a5)
Beq.B .D1
Bra.B .D2
.D1 Lea String_Table(a5),a4
.D2 Bsr.W .DoIt ;Check archive.
Lea String_Progress(a5),a0
Move.W #" ",16(a0)
Lea ARC_Check(a5),a0
Tst.B Archive_Flag(a5)
Beq.B .GoOn
Move.L #":LZX",1(a0)
.GoOn Lea File_Name(a5),a1
Move.L a1,d0
Bsr.W RawDoFmt
Bsr.W .DoIt
Bsr.W .Execute
Bsr.W .DoIt
Move.L #Temporary,d1 ;Open file with check result.
Move.L #MODE_OLDFILE,d2
Jsr _LVOOpen(a6)
Move.L d0,Temporary_File(a5)
Beq.W Quick
.More Move.L Temporary_File(a5),d1 ;Read 16kb from result file.
Lea Read_Buffer(a5),a0
Move.L a0,d2
Move.L #16000,d3
Jsr _LVORead(a6)
Tst.L d0
Bmi.W Quick
Tst.L d0
Beq.B .Prepare
Move.B #1,LoopRead_Flag(a5)
Bra.B .Prep
.Prepare Clr.B LoopRead_Flag(a5)
.Prep Bsr.W .DoIt
Lea Read_Buffer(a5),a0
Move.W #16000-1,d7
.Compare Tst.B (a0) ;Check if archive failed.
Beq.W .Cont
Cmpi.B #"f",(a0)+
Beq.B .NextA
Dbf d7,.Compare
Bra.W .Cont
.NextA Cmpi.B #"a",(a0)+
Beq.B .NextB
Subq.L #1,a0
Bra.B .Compare
.NextB Cmpi.B #"i",(a0)+
Beq.B .NextC
Subq.L #1,a0
Bra.B .Compare
.NextC Cmpi.B #"l",(a0)+
Beq.B .NextD
Subq.L #1,a0
Bra.B .Compare
.NextD Cmpi.B #"e",(a0)+
Beq.B .NextE
Subq.L #1,a0
Bra.B .Compare
.NextE Cmpi.B #"d",(a0)+
Beq.B .NextF
Subq.L #1,a0
Bra.B .Compare
.NextF Move.B #1,Log_Failed(a5) ;Set flag if filecheck fail!
.Cont Tst.B LoopRead_Flag(a5)
Bne.W .More
Movea.L DayLib_Base(a5),a6
Tst.B CFG_FullBar(a5)
Beq.W .I1
Bra.W .I2
.I1 Lea String_FillItUp(a5),a0
Bsr.W Sendit
.I2 Lea String_BlockCheck(a5),a0
Bsr.W Sendit
Lea String_MainPos(a5),a0
Bsr.W Sendit
.Dupe Bsr.W .DoIt
Movea.L DayLib_Base(a5),a6 ;Check for a duplicate file!
Move.L DD_DIF(a5),d0
Lea Activity4(PC),a0
Jsr _LVOChangeActivity(a6)
Tst.B CFG_FullBar(a5)
Beq.B .J1
Bra.B .J2
.J1 Lea String_FillItUp(a5),a0
Move.B #"4",11(a0)
Bsr.W Sendit
Movea.L DosLib_Base(a5),a6
Lea String_FillItUp(a5),a0
Move.B #"5",11(a0)
Lea String_Progress(a5),a0
Move.W #"0%",16(a0)
.J2 Tst.B CFG_FullBar(a5)
Beq.B .K1
Bra.B .K2
.K1 Lea String_Table(a5),a4
.K2 Bsr.W .DoIt
Lea String_Progress(a5),a0
Move.W #" ",16(a0)
Move.L #UploadLog,d1
.NewFile Move.L #MODE_OLDFILE,d2
Jsr _LVOOpen(a6)
Move.L d0,Openfile_Store(a5)
Beq.W Quick
.ReRead Move.L Openfile_Store(a5),d1
Lea Read_Buffer(a5),a0
Move.L a0,d2
Move.L #16000,d3
Jsr _LVORead(a6)
Tst.L d0
Bmi.W Quick
Tst.L d0
Beq.B .Prepare2
Move.B #1,LoopRead_Flag(a5)
Bra.B .Prep2
.Prepare2 Clr.B LoopRead_Flag(a5)
.Prep2 Bsr.B .CheckOut ;Dupe check in opened file.
Tst.B Found_Flag(a5)
Bne.B .Cont2
.NotFound Tst.B LoopRead_Flag(a5) ;If duplicate was not found.
Bne.B .ReRead
.PreRead Bsr.W .DoIt
Addq.B #1,Dupe_Counter(a5) ;Ready to check dupe in another
Cmpi.B #2,Dupe_Counter(a5) ;File!
Beq.B .CheckConf
Move.L Openfile_Store(a5),d1
Jsr _LVOClose(a6)
Move.L #DownloadLog,d1
Bra.B .NewFile
.CheckConf Nop ;Check if file in current conf!
.Cont2 Tst.B Found_Flag(a5) ;Delete file if duplicate.
Beq.B .NoDel
Lea File_Name(a5),a0
Move.L a0,d1
Jsr _LVODeleteFile(a6)
.NoDel Movea.L DayLib_Base(a5),a6 ;End the dupe checking..
Lea String_FillItUp(a5),a0
Bsr.W Sendit
Lea String_BlockDupe(a5),a0
Bsr.W Sendit
Lea String_MainPos(a5),a0
Bsr.W Sendit
Bra.W EndDoor
.CheckOut Lea Read_Buffer(a5),a0 ;Does File_Name(a5) exist in
Move.W #16000-1,d7 ;The Read_Buffer(a5)?
Lea File_Name(a5),a1
Movea.L a1,a3
.X Move.B (a0)+,d0
Cmp.B (a1),d0
Bne.B .Z
Movea.L a0,a2
Addq.L #1,a1
.Y Move.B (a1)+,d0
Tst.B d0
Beq.B .Found
Cmp.B (a2)+,d0
Beq.B .Y
Movea.L a3,a1
.Z Dbf d7,.X
Clr.B Found_Flag(a5)
Rts
.Found Move.B #1,Found_Flag(a5)
Rts
.GetNames Lea Add_Name1(a5),a0 ;Get add names from specified
Bsr.W .Read ;Data file.
Lea Add_Name2(a5),a0
Bsr.B .Read
Lea Add_Name3(a5),a0
Bsr.B .Read
Lea Add_Name4(a5),a0
Bsr.B .Read
Lea Add_Name5(a5),a0
Bsr.B .Read
Lea Add_Name6(a5),a0
Bsr.B .Read
Lea Add_Name7(a5),a0
Bsr.B .Read
Rts
.Format Lea File_Name(a5),a1 ;Fix string to execute.
Move.L a1,d0
Tst.B Archive_Flag(a5)
Beq.B .Skip
Lea Add_Name1(a5),a1
Move.L a1,d1
Cmpi.B #2,Archive_Flag(a5)
Beq.B .Skip
Lea Add_Name2(a5),a1
Move.L a1,d2
Lea Add_Name3(a5),a1
Move.L a1,d3
Lea Add_Name4(a5),a1
Move.L a1,d4
Lea Add_Name5(a5),a1
Move.L a1,d5
Lea Add_Name6(a5),a1
Move.L a1,d6
Lea Add_Name7(a5),a1
Move.L a1,d7
.Skip Bsr.W RawDoFmt
Rts
.Execute Movea.L DayLib_Base(a5),a6 ;Execute fixed string.
Move.L DD_DIF(a5),d0
Lea Work_Buffer(a5),a0
Jsr _LVOFifoExecute(a6)
Movea.L DosLib_Base(a5),a6
Rts
.Read Move.L a0,d2 ;Read line from data file.
Moveq #100,d3
Move.L d4,d1
Jsr _LVOFGets(a6)
Movea.L d0,a0
Beq.B .Finito
.Again Cmpi.B #10,(a0)+
Bne.B .Again
Clr.B -(a0)
Rts
.Finito Move.B #1,Finished_Flag(a5)
Rts
.ClearData Moveq #0,d0 ;Clear all data registers.
Move.L d0,d1
Moveq #0,d2
Move.L d2,d3
Moveq #0,d4
Move.L d4,d5
Moveq #0,d6
Move.L d6,d7
Rts
.DoIt Lea String_Progress(a5),a0 ;Send a block to progress bar!
Move.W (a4)+,5(a0)
Movea.L DayLib_Base(a5),a6
Bsr.W Sendit
Movea.L DosLib_Base(a5),a6
Rts
EndDoor: Movea.L DosLib_Base(a5),a6 ;End the door..
Tst.B Log_Failed(a5)
Beq.B .3
Lea File_Name(a5),a0
Move.L a0,d0
Lea ArcFailure(PC),a0
Bsr.W RawDoFmt
Movea.L DayLib_Base(a5),a6
Lea Work_Buffer(a5),a0
Move.L DD_DIF(a5),d0
Jsr _LVOWriteLog(a6)
.3 Movea.L DayLib_Base(a5),a6
Cmpi.B #"Y",CFG_Pause(a5)
Beq.B .2
Cmpi.B #"y",CFG_Pause(a5)
Bne.B .1
.2 Lea String_Pause(a5),a0
Bsr.W Sendit
Move.L DD_DIF(a5),d0
Moveq #0,d1
Moveq #3,d2
Jsr _LVOFetchKey(a6)
.1 Lea String_EndPos(a5),a0
Bsr.W Sendit
Quick: Movea.L DayLib_Base(a5),a6
Move.L DD_DIF(a5),d0
Jsr _LVOShowCursor(a6)
Move.L DD_DIF(a5),d0 ;Quit the shit quickly.
Jsr _LVOCloseDoor(a6)
;------------------------÷[ Hasta la' vista.. baby! ]÷-----------------------÷]
CleanUp: Movea.L DosLib_Base(a5),a6 ;Close and deallocate.
Tst.L Openfile_Store(a5)
Beq.B .Z
Move.L Openfile_Store(a5),d1
Jsr _LVOClose(a6)
.Z Tst.L Temporary_File(a5)
Beq.B .Y
Move.L Temporary_File(a5),d1
Jsr _LVOClose(a6)
Move.L #Temporary,d1
Jsr _LVODeleteFile(a6)
.Y Tst.L ClassicKeyfile(a5)
Beq.B .X
Move.L ClassicKeyfile(a5),d1
Jsr _LVOClose(a6)
.X Tst.L Data_FileStrip(a5)
Beq.B .0
Move.L Data_FileStrip(a5),d1
Jsr _LVOClose(a6)
.0 Tst.L Data_FileAdd(a5)
Beq.B .1
Move.L Data_FileAdd(a5),d1
Jsr _LVOClose(a6)
.1 Movea.L 4.W,a6
Tst.L DosLib_Base(a5)
Beq.B .2
Movea.L DosLib_Base(a5),a1
Jsr _LVOCloseLibrary(a6)
.2 Tst.L DayLib_Base(a5)
Beq.B .3
Movea.L DayLib_Base(a5),a1
Jsr _LVOCloseLibrary(a6)
.3 Tst.L (a5)
Beq.B .Dasvedanja
Movea.L a5,a1
Move.L #Variables_SIZEOF,d0
Jsr _LVOFreeMem(a6)
.Dasvedanja Moveq #0,d0
Rts ;Back to reality.
;------------------------÷[ Format string %s codes! ]÷-----------------------÷]
RawDoFmt: Movem.L d0-d7,-(sp)
Movea.L 4.W,a6
Lea Work_Buffer(a5),a3
Movea.L SP,a1
Lea PutChar(PC),a2
Jsr _LVORawDoFmt(a6)
Movem.L (sp)+,d0-d7
Rts
PutChar: Move.B d0,(a3)+
Rts
;------------------------÷[ Send the string routine! ]÷----------------------÷]
Sendit: Move.L DD_DIF(a5),d0
Jsr _LVOSendString(a6)
Rts
;---------------------------÷[ Strings and shit! ]÷--------------------------÷]
Cnop 0,4
KeyNum: Dc.L 999,0
DosLib: Dc.B 'dos.library',0
DayLib: Dc.B 'dreamdoor.library',0
Config: Dc.B 'classicarc.cfg',0
Variable: Dc.B 'dreamutils',0
External: Dc.B 'classicarc',0
DownloadLog: Dc.B 'daydream:logfiles/downloadlog.dat',0
UploadLog: Dc.B 'daydream:logfiles/uploadlog.dat',0
Temporary: Dc.B 't:classicarc.tmp',0
GlobalKeyfile: Dc.B 's:classictools.key',0
DataStrip: Dc.B 'daydream:data/filestrip.dat',0
DataAdd: Dc.B 'daydream:data/fileadd.dat',0
ArcFailure: Dc.B 'ULoad: %s, failed archive testing.',10,0
Activity1: Dc.B 'Stripping File!',0
Activity2: Dc.B 'Adding Adds To File!',0
Activity3: Dc.B 'Checking File!',0
Activity4: Dc.B 'Dupe Checking File!',0
IllegalKey: Dc.B 12,10,27,'[0m This System Is Using An Illegal Copy Of The ClassicTools KeyFile!',10
Dc.B ' Please Concider Registration And Support The ClassicTools Development!',10,' Disconnecting..',10,10,0
Version: Dc.B '$VER: ClassicArc v1.00 (c) by BigBang/Independent (03.01.97)',10,0
Even
It is regrettable that this is the only assembly language source code I have managed to save. Prior to the above code, I wrote practically the same application in the ARexx language (I apologize about all the actual code being on one line. I will try to get the proper formatting back):
/*****************************************************************************/
/* */
/* lNS & dSY pRESENTz aNOTHER */
/* - --+-----------__--/\--________--________--___--________-----------+-- - */
/* | / \/ \_\_____ \/ _____/_/ \/ _____/_ tOOL! | */
/* | _ __ _/ \/ \ ____ \_ \____ \_ \_ \ \_ __ _ | */
/* | .\\\\_\\____/ \_________/_________/____/_________//_////. | */
/* - --+------------/_______/-sox--------------------------------------+-- - */
/* */
/* mAGiC-aRC version 1.80 Coded.. by dAvE / lUNAtICS / dESTiNY */
/* (c) 1996 dAvE/lNS^dSY Design. by dAvE / lUNAtICS / dESTiNY */
/* */
/*****************************************************************************/
/* - -- --- ----÷{ dON'T tOUCH aNYTHiNG bELOW tHiS liNE!! }÷--- --- -- - */
parse arg node;Options results;nodeid = "DREAMREXX"node;address value nodeid;signal on error;signal on syntax;signal on ioerr;if ~exists("ENV:DreamUtils") then call END;call open(DU,"ENV:DreamUtils",'R');do;DreUti=ReadLn(DU);end;call Close(DU);call open(CFG,''DreUti'lNS-MagicArc.CFG','R');do;c1 = STRIP(readln(CFG));c2 = STRIP(readln(CFG));c3 = STRIP(readln(CFG));c4 = STRIP(readln(CFG));c5 = STRIP(readln(CFG));chk = STRIP(readln(CFG));adds = STRIP(readln(CFG));add1 = STRIP(readln(CFG));add2 = STRIP(readln(CFG));add3 = STRIP(readln(CFG));srp0 = STRIP(readln(CFG));srp1 = STRIP(readln(CFG));srp2 = STRIP(readln(CFG));srp3 = STRIP(readln(CFG));srp4 = STRIP(readln(CFG));srp5 = STRIP(readln(CFG));srp6 = STRIP(readln(CFG));srp7 = STRIP(readln(CFG));srp8 = STRIP(readln(CFG));srp9 = STRIP(readln(CFG));srpA = STRIP(readln(CFG));srpB = STRIP(readln(CFG));srpC = STRIP(readln(CFG));srpD = STRIP(readln(CFG));srpE = STRIP(readln(CFG));srpF = STRIP(readln(CFG));srpG = STRIP(readln(CFG));srpH = STRIP(readln(CFG));srpI = STRIP(readln(CFG));srpJ = STRIP(readln(CFG));srpK = STRIP(readln(CFG));srpL = STRIP(readln(CFG));srpM = STRIP(readln(CFG));srpN = STRIP(readln(CFG));srpO = STRIP(readln(CFG));srpP = STRIP(readln(CFG));srpQ = STRIP(readln(CFG));srpR = STRIP(readln(CFG));srpS = STRIP(readln(CFG));srpT = STRIP(readln(CFG));srpU = STRIP(readln(CFG));srpV = STRIP(readln(CFG));srpW = STRIP(readln(CFG));srpX = STRIP(readln(CFG));srpY = STRIP(readln(CFG));ddir = STRIP(readln(CFG));dir1 = STRIP(readln(CFG));dir2 = STRIP(readln(CFG));dir3 = STRIP(readln(CFG));dir4 = STRIP(readln(CFG));dir5 = STRIP(readln(CFG));adda = STRIP(readln(CFG));call Close(CFG);systeminfo 3;file=result;nl=newline;tr=transmit;ex=fifoexecute;ce=call END;tr1="[4;24H[45;30m__[0m "c1".."c5"Adds stripped from file..";tr2="[5;24H[45;30m__[0m "c1".."c5"Adds added to the file..";tr3="[6;24H[45;30m__[0m "c1".."c5"File has been checked..";pth="Daydream:Temporary/";y=0;if lastpos('.',file)=0 then ce;what=strip(upper(substr(file,lastpos('.',file),(length(file)-(lastpos('.',file)-1)))));if what=".LHA" | what=".LZH" | what=".LZX" | what=".ZIP" | what=".TXT" | what=".NFO" | what=".DOC" then y=1
if y=0 then ce;INTCOMMAND "CLS";nl;tr ""c3" -"c4"-+-"c3"-"c4"-"c1"-"c3"---"c1"--"c3"--"c1"--"c3"--"c1"---"c3"-"c1"-"c3" -"c1"---"c3"-"c1"-- --"c3"-"c1"---- ----- ---- --- -- -- -";tr ""c4" |"c5" Current File"c1" : [45;30m__[0m "c1".. [ "c4""file""c1" ]";tr ""c3" :"c5" Strip Status"c1" : [44;30m__[0m";tr ""c3" :"c5" Add Status "c1" : [44;30m__[0m";tr ""c4" |"c5" Check Status"c1" : [44;30m__[0m";tr ""c3" -"c4"-+"c3"-"c4"-"c1"-"c3"--"c1"-"c3"--"c1"----"c3"-"c1"----"c3"-"c1"-"c3"-"c4" --+"c3"-"c1"--"c3"-"c1"---"c3"--"c1"--- --"c3"-"c1"-- ---- --- -- -- -";tr ""c4" |"c5" mAGiC-aRC v"c4"1"c5"."c4"8"c5" bY dAvE"c4"/"c5"lNS"c4"^"c5"dSY";tr ""c3" --"c4"+-"c3"--"c1"-"c3"-"c1"- --"c3"-"c1"-- --"c3"-"c1"- --- -- -";if node=1 then call ND1;if node=2 then call ND2;if node=3 then call ND3;if node=4 then call ND4;if node=5 then call ND5;ce;ND1:;if what=".LHA" | what=".LZH" then call LHA;if what=".LZX" then call LZX;if what=".ZIP" then call ZIP;if what=".TXT" | what=".NFO" | what=".DOC" then call TXT;ce;ND2:;if what=".LHA" | what=".LZH" then call LHA;if what=".LZX" then call LZX;if what=".ZIP" then call ZIP;if what=".TXT" | what=".NFO" | what=".DOC" then call TXT;ce;ND3:;if what=".LHA" | what=".LZH" then call LHA;if what=".LZX" then call LZX;if what=".ZIP" then call ZIP;if what=".TXT" | what=".NFO" | what=".DOC" then call TXT;ce;ND4:;if what=".LHA" | what=".LZH" then call LHA;if what=".LZX" then call LZX;if what=".ZIP" then call ZIP;if what=".TXT" | what=".NFO" | what=".DOC" then call TXT;ce;ND5:;if what=".LHA" | what=".LZH" then call LHA;if what=".LZX" then call LZX;if what=".ZIP" then call ZIP;if what=".TXT" | what=".NFO" | what=".DOC" call TXT;ce;END:;nl;nl;nl;shutdown;exit;LHA:;if adds = "1" then call 1LHA;if adds = "2" then call 2LHA;if adds = "3" then call 3LHA;ce;1LHA:;ex "LHA d >NIL: "pth"Node"node"/"file" #?.Displayme #?.Add "srp0" "srp1" "srp2" "srp3" "srp4" "srp5" "srp6" "srp7" "srp8" "srp9" "srpA" "srpB" "srpC" "srpD" "srpE" "srpF" "srpG" "srpH" "srpI" "srpJ" "srpK" "srpL" "srpM" "srpN" "srpO" "srpP" "srpQ" "srpR" "srpS" "srpT" "srpU" "srpV" "srpW" "srpX" "srpY""
tr ""tr1"";nl;nl;nl;nl;nl;if adda = "N" then call CTA1;ex "LHA a >NIL: "pth"Node"node"/"file" "add1"";tr ""tr2"";nl;nl;nl;nl;CTA1:;if ddir = "N" then call CHKLHA;ex "LHA d >NIL: "dir1" "dir2" "dir3" "dir4" "dir5"";if chk = "Y" then call CHKLHA;else;ce;2LHA:;ex "LHA d >NIL: "pth"Node"node"/"file" #?.Displayme #?.Add "srp0" "srp1" "srp2" "srp3" "srp4" "srp5" "srp6" "srp7" "srp8" "srp9" "srpA" "srpB" "srpC" "srpD" "srpE" "srpF" "srpG" "srpH" "srpI" "srpJ" "srpK" "srpL" "srpM" "srpN" "srpO" "srpP" "srpQ" "srpR" "srpS" "srpT" "srpU" "srpV" "srpW" "srpX" "srpY"";tr ""tr1"";nl;nl;nl;nl;nl;if adda = "N" then call CTA2;ex "LHA a >NIL: "pth"Node"node"/"file" "add1" "add2"";tr ""tr2"";nl;nl;nl;nl;CTA2:;if ddir = "N" then call CHKLHA;ex "LHA d >NIL: "dir1" "dir2" "dir3" "dir4" "dir5"";if chk = "Y" then call CHKLHA;else;ce;3LHA:;ex "LHA d >NIL: "pth"Node"node"/"file" #?.Displayme #?.Add "srp0" "srp1" "srp2" "srp3" "srp4" "srp5" "srp6" "srp7" "srp8" "srp9" "srpA" "srpB" "srpC" "srpD" "srpE" "srpF" "srpG" "srpH" "srpI" "srpJ" "srpK" "srpL" "srpM" "srpN" "srpO" "srpP" "srpQ" "srpR" "srpS" "srpT" "srpU" "srpV" "srpW" "srpX" "srpY"";tr ""tr1"";nl;nl;nl;nl;nl;if adda = "N" then call CTA3;ex "LHA a >NIL: "pth"Node"node"/"file" "add1" "add2" "add3"";tr ""tr2"";nl;nl;nl;nl;CTA3:;if ddir = "N" then call CHKLHA;ex "LHA d >NIL: "dir1" "dir2" "dir3" "dir4" "dir5"";if chk = "Y" then call CHKLHA;else;ce;CHKLHA:;ex "LHA t >NIL: "pth"Node"node"/"file"";tr ""tr3"";nl;nl;nl;ce;LZX:;if adds = "1" then call 1LZX;if adds = "2" then call 2LZX;if adds = "3" then call 3LZX;ce;1LZX:;ex "LZX d >NIL: "pth"Node"node"/"file" #?.Displayme #?.Add "srp0" "srp1" "srp2" "srp3" "srp4" "srp5" "srp6" "srp7" "srp8" "srp9" "srpA" "srpB" "srpC" "srpD" "srpE" "srpF" "srpG" "srpH" "srpI" "srpJ" "srpK" "srpL" "srpM" "srpN" "srpO" "srpP" "srpQ" "srpR" "srpS" "srpT" "srpU" "srpV" "srpW" "srpX" "srpY"";tr ""tr1"";nl;nl;nl;nl;nl;if adda = "N" then call CTB1;ex "LZX af -1 >NIL: "pth"Node"node"/"file" "add1"";tr ""tr2"";nl;nl;nl;nl;CTB1:;if ddir = "N" then call CHKLZX;ex "LZX d >NIL: "dir1" "dir2" "dir3" "dir4" "dir5"";if chk = "Y" then call CHKLZX;else;ce;2LZX:
ex "LZX d >NIL: "pth"Node"node"/"file" #?.Displayme #?.Add "srp0" "srp1" "srp2" "srp3" "srp4" "srp5" "srp6" "srp7" "srp8" "srp9" "srpA" "srpB" "srpC" "srpD" "srpE" "srpF" "srpG" "srpH" "srpI" "srpJ" "srpK" "srpL" "srpM" "srpN" "srpO" "srpP" "srpQ" "srpR" "srpS" "srpT" "srpU" "srpV" "srpW" "srpX" "srpY"";tr ""tr1"";nl;nl;nl;nl;nl;if adda = "N" then call CTB2;ex "LZX af -1 >NIL: "pth"Node"node"/"file" "add1" "add2"";tr ""tr2"";nl;nl;nl;nl;CTB2:;if ddir = "N" then call CHKLZX;ex "LZX d >NIL: "dir1" "dir2" "dir3" "dir4" "dir5"";if chk = "Y" then call CHKLZX;else;ce;3LZX:;ex "LZX d >NIL: "pth"Node"node"/"file" #?.Displayme #?.Add "srp0" "srp1" "srp2" "srp3" "srp4" "srp5" "srp6" "srp7" "srp8" "srp9" "srpA" "srpB" "srpC" "srpD" "srpE" "srpF" "srpG" "srpH" "srpI" "srpJ" "srpK" "srpL" "srpM" "srpN" "srpO" "srpP" "srpQ" "srpR" "srpS" "srpT" "srpU" "srpV" "srpW" "srpX" "srpY"";tr ""tr1"";nl;nl;nl;nl;nl;nl;if adda = "N" then call CTB3;ex "LZX af -1 >NIL: "pth"Node"node"/"file" "add1" "add2" "add3"";tr ""tr2"";nl;nl;nl;nl;CTB3:;if ddir = "N" then call CHKLZX;ex "LZX d >NIL: "dir1" "dir2" "dir3" "dir4" "dir5"";if chk = "Y" then call CHKLZX;else;ce;CHKLZX:;ex "LZX t >NIL: "pth"Node"node"/"file"";tr ""tr3"";nl;nl;nl;ce;ZIP:;if adds = "1" then call 1ZIP;if adds = "2" then call 2ZIP;if adds = "3" then call 3ZIP;ce;1ZIP:;ex "ZIP >NIL: -d -q "pth"Node"node"/"file" #?.Displayme #?.Add "srp0" "srp1" "srp2" "srp3" "srp4" "srp5" "srp6" "srp7" "srp8" "srp9" "srpA" "srpB" "srpC" "srpD" "srpE" "srpF" "srpG" "srpH" "srpI" "srpJ" "srpK" "srpL" "srpM" "srpN" "srpO" "srpP" "srpQ" "srpR" "srpS" "srpT" "srpU" "srpV" "srpW" "srpX" "srpY"";tr ""tr1"";nl;nl;nl;nl;nl;nl;if adda = "N" then call CTD1;ex "ZIP >NIL: -1 -q "pth"Node"node"/"file" "add1"";tr ""tr2"";nl;nl;nl;nl;CTD1:;if ddir = "N" then call CHKZIP;ex "ZIP >NIL: -d -q "dir1" "dir2" "dir3" "dir4" "dir5"";if chk = "Y" then call CHKZIP;ce;2ZIP:;ex "ZIP >NIL: -d -q "pth"Node"node"/"file" #?.Displayme #?.Add "srp0" "srp1" "srp2" "srp3" "srp4" "srp5" "srp6" "srp7" "srp8" "srp9" "srpA" "srpB" "srpC" "srpD" "srpE" "srpF" "srpG" "srpH" "srpI" "srpJ" "srpK" "srpL" "srpM" "srpN" "srpO" "srpP" "srpQ" "srpR" "srpS" "srpT" "srpU" "srpV" "srpW" "srpX" "srpY""
tr ""tr1"";nl;nl;nl;nl;nl;nl;if adda = "N" then call CTD2;ex "ZIP >NIL: -1 -q "pth"Node"node"/"file" "add1" "add2"";tr ""tr2"";nl;nl;nl;nl;CTD2:;if ddir = "N" then call CHKZIP;ex "ZIP >NIL: -d -q "dir1" "dir2" "dir3" "dir4" "dir5"";if chk = "Y" then call CHKZIP;ce;3ZIP:;ex "ZIP >NIL: -d -q "pth"Node"node"/"file" #?.Displayme #?.Add "srp0" "srp1" "srp2" "srp3" "srp4" "srp5" "srp6" "srp7" "srp8" "srp9" "srpA" "srpB" "srpC" "srpD" "srpE" "srpF" "srpG" "srpH" "srpI" "srpJ" "srpK" "srpL" "srpM" "srpN" "srpO" "srpP" "srpQ" "srpR" "srpS" "srpT" "srpU" "srpV" "srpW" "srpX" "srpY"";tr ""tr1"";nl;nl;nl;nl;nl;nl;if adda = "N" then call CTD3;ex "ZIP >NIL: -1 -q "pth"Node"node"/"file" "add1" "add2" "add3"";tr ""tr2"";nl;nl;nl;nl;CTD3:;if ddir = "N" then call CHKZIP;ex "ZIP >NIL: -d -q "dir1" "dir2" "dir3" "dir4" "dir5"";if chk = "Y" then call CHKZIP;ce;CHKZIP:;ex "ZIP -T "pth"Node"node"/"file"";tr ""tr3"";nl;nl;nl;ce;TXT:;ex "Join "add1" "file" AS Ram:MagicArc.temp";ex "Join Ram:MagicArc.temp "add1" AS "file"";ex "Delete Ram:MagicArc.temp QUIET";tr ""tr2"";ce;error:;syntax:;ioerr:;ce