Trackmolinker V1.2 
Look for downloads on external sites:
Submitted by Mr Wegi on 12 February 2013
|Some changes to this version.|
- Incorrectly saved 2nd byte of a sector link when file length is zero (mod 254 = 0).
1. New command line parameter added for setting up interleave value - default $0a. This will be set for whole disk and not single file only.
In order to change it simply use: hex "-interleave $xx"
or dec "-interleave xx"
2. Files in size over 255 blocks can now be saved on disk but they are not compatible with built in deterministic loader.
3. Loaders code has been changed for Jiffy Dos compatibility (JSR $f82b).
4. Trackmolinker script that is generating *.INC file has been modified so it gives variables only and does not take additional space in code.
These variables are: start track, start sector, file blocks length and LO/HI load address.
5. "Bind C64LINK files button added. This function allows to merge your D64 projects saved in C64LINK format. In order to use bind function please run Trackmolinker with administrative rights as it need to access registry.
6. "build CMD" button added. Function will generate command line text.
7. Procedure for calling loader has been changed (API).
8. New loader functions added:
- Two different types of changedisk engines .
- Loading silent directory to C64 memory.
9. Added code relocator for loader and installer with step of $0100.
1. Use GUI to build your own D64 trackmo disk then save project and make compilation from command line.
2. Trackmolinker has been built for full compatibility with 1541 normal file system. It can be extended to fast file system by using built-in deterministic loader.
3. Files will be stored on disk with requested interleave in order from track 1,2,3... to 35 excluding track 18.
4. Trackmolinker will generate data file "*.INC" after compilation which includes info about all files on disk. Needed if you want to use deterministic loader. Program can deal with 50 files per disk side. This info-data is also stored on track 18 sector 02 (18,2) in order:
OFFSET 0 - FILE START TRACK
OFFSET 50 - FILE START SECTOR
OFFSET 100 - FILE BLOCKS LENGTH
OFFSET 150 - FILE LOAD ADDRESS LO BYTE
OFFSET 200 - FILE LOAD ADDRESS HI BYTE
As you see deterministic loader require 5 bytes of info about each file. Trackmoliker script can sort and save info about up to 50 files on each disk side. Should this be enough?
Please note "*.INC" file can be easily included to your code in TASM so there is no need for using silent dir from disk (18,2). This way loading process is significantly improved.
5. Command line parameters:
"filename.c64link" - name of your D64 project
-SILENT - hide error messages
-interleave $xx (or -interleave xx) - set hex/dec interleave value for whole disk,
-L0 - create D64 without Dirloader
-L1 - create D64 with Dirloader V1 (special option for hoxs64)
-L2 - create D64 with Dirloader V2 (special option for hoxs64)
-DIRENT - files will be placed in DIRECTORY without loader
and info block (18,2)
-FF - link to trackmo start file will be set on first file in D64 project,
use only with L0 or L1 or L2
-LF - like FF but pointer is set to last file
-INC "filename" - make file with info data for deterministic loader,
-D64 "filename" - set D64 file name
-DISKNAME "NAME OF DISK" - this can be max. 16 chars long
-DISKID "ID..." - this can be max. 5 chars long
"trackmolinker.exe" "LINKNEW.C64LINK" -iNC "TRACKS DATA.INC" -L0 -LF -D64 "DETERMINISTICLOAD"
This will open project LINKNEW, save file with info "TRACKS DATA.INC", make d64 file named "DETERMINISTICLOAD.D64" without Dirloader and start file link in the dir will be set to last file.
- Check out the batch file "createsample.bat".
When creating trackmo you can predict, assume and most important intend many things. This is due to fact that you know what you want to achieve, you got some kind of plan or structure in your mind of how things in your demo should roll. Part of that are all files with your effects, graphics, music, tables that you want to put together. There is no guessing here I believe. You know which bank in RAM has been released and how much of a rastertime is free at certain point. You also exactly know what kind of stuff should be loaded to memory at what time. File name, file length, load address... All that is a base for my deterministic loader.
Idea is pretty simple yet very efficient. Let say you could create a list of all files that should be on your disk. List that apart of file names stores also data about start tracks and start sectors, file lengths and load addresses. What are the advatages of having all these sorted that way? Well this is what makes my loader deterministic as it has list of info about all files on disk. This way we do not lose 0.2 sec on every one of 35 tracks for scanning. We also do not have to wait for first block of the file with it's load address and that is another 0.1 sec per file on average. When there is more than one file on track we do not lose yes again 0.2 for scanning the same track again. Time savings are massive and all just because we know where our files are placed before we even try to load them!
Some additional optimizations for deterministic loader:
- Function called WITHOUT STOP MOTOR will save some time on re-accelerating floppys motor...
- Files should be saved with interleave factor 4. It's the best choice for small or partial files and it assures smooth loading. For example if file has only 3 blocks of data you do not have to wait 0.2 sec for next sector as all has been saved optimally.
- In case when your program can free just part of memory needed for next file due to low rastertime or because part of RAM is still in use you have not much choice but to split that file.
Option SPLIT FILE in Trackmolinker will make your life easier. It allows you to change load addresses of each file. To divade file more than once simply save, load and split again and again...
Simple explanation of how to use Det. Loader:
First procedure is an installer and you have to use it at the start. This will just initialize the drive by simply calling:
Number of a device can be set in $BA - it usually already contain last drive used anyway. First procedure will check which unit is present.
IMPORTANT: Loader will use one block of RAM as a buffer (default $0100) for arriving data. If needed this can be altered in code see BUFER1.
Loader functions can be called from a jump table below:
;PROC2 - LOAD FILE AND STOP MOTOR
;PROC2+3 - DISCONNECT LOADER
;PROC2+6 - LOAD FILE WITHOUT STOPPING MOTOR
;PROC2+9 - TURN OFF THE MOTOR
;PROC2+12 - SEND BYTE FROM ACC TO THE DRIVE
For example to load file into $C000 from Track 1 Sector 0 do this:
;LDA #<LENFILE - This is a Lo/Hi pointer to 5 bytes file info-data
;LDY #>LENFILE (please see IMPORTANT INFO #4)
;JSR PROC2 ;or JSR PROC2+6
;BCS * - LOAD ERROR - DEMO CRASHED
When LOAD is completed you'll find vector pointer to end of data in A and X reg (Lo/Hi) for you decruncher. Add +1 for exomizer.
;LENFILE .BYTE LENBLK_FILE0
;VECADR .WORD $C000
;STRTTRK .BYTE $01
;STRTSEC .BYTE $00
Check out my simple demo added to project.
See change disk engine for special options. Using it you can send your own programs to drive and then run them after...
I hope you'll like this little tool. Please feel free to ask any questions or to give suggestions. Constructive criticism is always welcome.
· Hidden Parts