Автор: Andrew Pennell
Год: 1984
Издатели: Your Spectrum
Языки:
Английский
Формат:
TAP лента
Требования:
ZX Spectrum 48K
Ссылки:
Страница на ZXArt
Страница на World Of Spectrum
Страница на Spectrum Computing
Год: 1984
Издатели: Your Spectrum
Языки:
Формат:
Требования:
Ссылки:
ALL CHANGE!
(from Your Spectrum 6, Aug.1984)
Ever wanted to rename a Microdrive file? Providing the code to create
the necessary new command, Andrew Pennell brings Microdrives one step
nearer the expensive disk systems they emulate.
Although Sinclair Research's Interface 1 unit allows good use of the
Microdrives from Basic, there is one command noticeable only by its
absence - that of RENAME. It's provided by most disk operating systems
and associated Basics, but not for the dear old Speccy. Here, therefore,
is the machine code you've been waiting for - although, I'm afraid that
it's for 48K owners only.
Listing 1 shows the Basic loader to create the machine code; enter it
with great care - the checksum should spot most typing errors, but some
may slip through. After entering and executing, SAVE the program in case
it's wrong. To test it, enter RANDOMIZE USR 28000, which enables it.
Then, with an unimportant cartridge, try to rename a file; the syntax to
use is
*R1;"oldname" TO "newname"
where 'TO' is the keyword (and 'r' is also accepted). Naturally, '1' in
the example can be replaced with any drive number, up to '8' (should you
be lucky enough to have that many!). Having entered the command, the
file 'oldname' will be renamed to' newname', although there are a couple
of limitations. Firstly, data files (that is, those created with
OPEN/PRINT/CLOSE) will not be renamed, and will produce the error 'Wrong
file type'. A second limitation is that the file 'oldname' must be under
about 37K in length - otherwise it'll be flagged 'Out of memory'.
The program has been written so that if any error occurs during the
process (except perhaps a power cut!) then the file will remain intact,
under one of the names. If you try to rename a non- existent file,
you'll come across the 'File not found' message, and an attempt to
define a new name that's already present on the cartridge will force
'Writing to a read file'.
The source code is shown in Listing 2, and uses the facility of the
Interface 1 to add commands to the Basic interpreter. The remainder of
this explanation assumes a basic knowledge of machine code with the
Microdrives, and of how to add commands; for this I suggest you read
chapters eight and nine respectively of Master your ZX Microdrive - and
Toni Baker's Extending Basic article (see issue 3). [yr03_43.htm]
The code is placed at 28000 decimal, to give some room for small Basic
programs, and over 37K to store the file. The routine SETUP is the one
entered directly from Basic, and the first creates the Interface system
variables, using hook code #31, then alters VECTOR to point to the new
command routine. It then calls WATROM using hook code #32, before
RETurning to Basic. The routine WATROM actually modifies the program to
suit the ROM in the Interface 1. As you may be aware, Interface 1 will
shortly be sporting a new ROM which has most of its routines in
different places. To cater for this, the tables OLDROM and NEWROM allow
the program to modify itself to suit either, using location #16DA to
test the ROM's type. It had to be called indirectly via hook code #32
because the Shadow ROM must be in place for it to work.
Location SYNERR is just a jump to #28 in the Shadow ROM which produces a
syntax error when in the line editor. NEWSYN is the new command handler,
which first ensures that the command starts with *R or *r. That done,
the drive number is scanned, a semi-colon checked for, then the old
filename scanned. Next, the character following it (that is, the TO
token) is checked, then the routine SWOP called. This is explained
later, and only has significance during 'run-time'.
The new name is scanned, and a check made to ensure that there's no more
to the statement. Control only passes to line 2200 during 'run-time',
which again calls SWOP. This routine swaps the parameters (start address
and length) for the old and new names, which are stored in N_STR1,
T_STR1 and N_STR3, T_STR3. The Shadow ROM routines act on the parameters
in the former two.
The next action taken is for OPEN_M to be called, while preserving
T_STR1. As the Shadow ROM is in place, hook codes cannot be used, so
routines vary according to ROM type. OPEN_M takes identical action to
hook code #22 - that is, create an 'M' channel addressed by IX. The old
file is then checked to see if it exists, whether it's a PRINT file, and
whether the cartridge is write-protected or not. If it passes all the
criterion the nine-byte file header is copied to FREE, and the length of
the file is tested to see if there's room for it and if not an error is
produced. The shadow routine LDBYTS is called which loads the rest of
the file into locations FREE+9 onwards, and then the channel is closed.
Next, the header is copied back from FREE to HD-00 to HD-11, and the
bytes SAVEd on to the required cartridge. Routine SVBYTS does a lot of
the fiddly bits for you, like opening an 'M' channel, setting the PRINT
file flag and testing to see if it's already there. Finally, the old
file is erased - by calling ERASEM - and an exit made via #05C1 (which
is the same in both ROMs, thankfully).
Listing 1 (above): The Basic loader to create the RENAME machine code.
Listing 2 (below): The disassembled listing, roughly split into five
columns: address, Hex code, line numbers (unique to the disassembler
used), labels and mnemonics.
(from Your Spectrum 6, Aug.1984)
Ever wanted to rename a Microdrive file? Providing the code to create
the necessary new command, Andrew Pennell brings Microdrives one step
nearer the expensive disk systems they emulate.
Although Sinclair Research's Interface 1 unit allows good use of the
Microdrives from Basic, there is one command noticeable only by its
absence - that of RENAME. It's provided by most disk operating systems
and associated Basics, but not for the dear old Speccy. Here, therefore,
is the machine code you've been waiting for - although, I'm afraid that
it's for 48K owners only.
Listing 1 shows the Basic loader to create the machine code; enter it
with great care - the checksum should spot most typing errors, but some
may slip through. After entering and executing, SAVE the program in case
it's wrong. To test it, enter RANDOMIZE USR 28000, which enables it.
Then, with an unimportant cartridge, try to rename a file; the syntax to
use is
*R1;"oldname" TO "newname"
where 'TO' is the keyword (and 'r' is also accepted). Naturally, '1' in
the example can be replaced with any drive number, up to '8' (should you
be lucky enough to have that many!). Having entered the command, the
file 'oldname' will be renamed to' newname', although there are a couple
of limitations. Firstly, data files (that is, those created with
OPEN/PRINT/CLOSE) will not be renamed, and will produce the error 'Wrong
file type'. A second limitation is that the file 'oldname' must be under
about 37K in length - otherwise it'll be flagged 'Out of memory'.
The program has been written so that if any error occurs during the
process (except perhaps a power cut!) then the file will remain intact,
under one of the names. If you try to rename a non- existent file,
you'll come across the 'File not found' message, and an attempt to
define a new name that's already present on the cartridge will force
'Writing to a read file'.
The source code is shown in Listing 2, and uses the facility of the
Interface 1 to add commands to the Basic interpreter. The remainder of
this explanation assumes a basic knowledge of machine code with the
Microdrives, and of how to add commands; for this I suggest you read
chapters eight and nine respectively of Master your ZX Microdrive - and
Toni Baker's Extending Basic article (see issue 3). [yr03_43.htm]
The code is placed at 28000 decimal, to give some room for small Basic
programs, and over 37K to store the file. The routine SETUP is the one
entered directly from Basic, and the first creates the Interface system
variables, using hook code #31, then alters VECTOR to point to the new
command routine. It then calls WATROM using hook code #32, before
RETurning to Basic. The routine WATROM actually modifies the program to
suit the ROM in the Interface 1. As you may be aware, Interface 1 will
shortly be sporting a new ROM which has most of its routines in
different places. To cater for this, the tables OLDROM and NEWROM allow
the program to modify itself to suit either, using location #16DA to
test the ROM's type. It had to be called indirectly via hook code #32
because the Shadow ROM must be in place for it to work.
Location SYNERR is just a jump to #28 in the Shadow ROM which produces a
syntax error when in the line editor. NEWSYN is the new command handler,
which first ensures that the command starts with *R or *r. That done,
the drive number is scanned, a semi-colon checked for, then the old
filename scanned. Next, the character following it (that is, the TO
token) is checked, then the routine SWOP called. This is explained
later, and only has significance during 'run-time'.
The new name is scanned, and a check made to ensure that there's no more
to the statement. Control only passes to line 2200 during 'run-time',
which again calls SWOP. This routine swaps the parameters (start address
and length) for the old and new names, which are stored in N_STR1,
T_STR1 and N_STR3, T_STR3. The Shadow ROM routines act on the parameters
in the former two.
The next action taken is for OPEN_M to be called, while preserving
T_STR1. As the Shadow ROM is in place, hook codes cannot be used, so
routines vary according to ROM type. OPEN_M takes identical action to
hook code #22 - that is, create an 'M' channel addressed by IX. The old
file is then checked to see if it exists, whether it's a PRINT file, and
whether the cartridge is write-protected or not. If it passes all the
criterion the nine-byte file header is copied to FREE, and the length of
the file is tested to see if there's room for it and if not an error is
produced. The shadow routine LDBYTS is called which loads the rest of
the file into locations FREE+9 onwards, and then the channel is closed.
Next, the header is copied back from FREE to HD-00 to HD-11, and the
bytes SAVEd on to the required cartridge. Routine SVBYTS does a lot of
the fiddly bits for you, like opening an 'M' channel, setting the PRINT
file flag and testing to see if it's already there. Finally, the old
file is erased - by calling ERASEM - and an exit made via #05C1 (which
is the same in both ROMs, thankfully).
Listing 1 (above): The Basic loader to create the RENAME machine code.
Listing 2 (below): The disassembled listing, roughly split into five
columns: address, Hex code, line numbers (unique to the disassembler
used), labels and mnemonics.