TR DOS FOR BEGINNERS
(C) VA Sirotkin
Continued. Start see the ZX
REVIEW 1996 NN 1-2, 4-5, 6, 7-8;
ZX REVIEW 1997 NN 1-2, 3-4.
PROGRAMMING THE CONTROLLER
Now we explain a few
specific examples.
! Needed a reminder:
Do not forget that for the different versions TRDOS must exhibit
their addresses routines!
Before the loader starts, the program must
identify and correct version TRDOS address challenges.
To determine the version and configure
bootstrap function is most conveniently
TRDOS C = # 13. We will miss this
part of the program, as in Chapter
'FUNCTION TRDOS' for details on how to do it.
Example 1. Boot files
140.
; Base addresses are given for ROM version 5.01 *
; In angle brackets will be given an address for 3.5 *
, Head of the boot
ORG ADRESS; starting address of the bootloader
DI; disable the interrupt
LD HL, # 5800; paint the screen black Atri
; Butami
; On the screen we will have a buffer
LD DE, # 5801; to read the latest
; Sector file to the RAM
; Move the right amount
; Bytes
, As well as a buffer for the read
; Tion disk directory
LD BC, # 01FF
LD (HL), L
LDIR
;-----------------
CALL LOAD_CAT; find the file on disk
, And its attributes (routine returns as a result; Giustra
'D'-track number in the' E '- number sects; RA' HL 'load
address in RAM; in' BC'-length) ;-----------------
PUSH BC; hide the file length
DEC B; reduce the length of 1 sector
;------------------
CALL LOAD_SEK; file without the last
2-x sectors (if the 'C' = 0,
, Then without 1 last)
; Downloaded from the address of 'HL'
;------------------
PUSH HL; hide subsequent address
; RAM for the remaining 2,
, (1) sector
LD HL, # 4800; buffer address for sector
LD B, 2; two sectors
CALL LOAD_SEK; get to the two # 4800
; Last sector
POP DE; get the address of the RAM for the remaining
; Shihsya sectors / sector
POP BC; get the length of the entire file
LD B, 1, one sector is likely, and
The residue length of the 'C'
LD HL, # 4800; move out of the screen
LDIR; addressed to 'DE'
EI;
RET; return to the program
;--------------------------; Subroutine reads the directory and
the definition ; File attributes
LOAD_CAT LD DE, 0000 Zero Track and Sector
LOAD PUSH DE; hide
LD HL, # 4800; address of a buffer in RAM
; Sector
PUSH HL; hide
LD B, 1; One Sector
CALL LOAD_SEK; assume sector number
; Of 'E'
; With ZERO track, ie
; From the directory of the disk
POP HL; beginning buffer address
LD B, # 10; meter titles (at
; Sector of 16)
CIKL PUSH HL; hide the address of the beginning
LD DE, FILENAME; address in RAM, where NAME
; File
; You want to download
LD C, 08; counter letter file name
NAME_F INC HL; miss the first letter in the
; Name
; File in a matter of khat
, Log
LD A, (DE); letter of the name
CP (HL); comparable with the letter of the NAME
; File read from disk
JR NZ, ZAGOLOW; no coincidence - the transition
INC DE; coincided - the next letter
; Name
DEC C; reduce the count of letters
; Name
JR NZ, NAME_F; all the letters? - None - Returns
; The cycle test
POP DE; Yes, the name and file type
; Match!
POP DE; stack pointer will return to
, The initial state
INC HL; go to the attributes
; File
LD E, (HL); ml.bit Load address
; File
INC HL
LD D, (HL); st.bit Load address
INC HL
LD C, (HL); ml.bit LENGTH
INC HL
LD B, (HL); st.bit LENGTH
INC HL; skip byte volume
; Sectors
INC HL;
LD A, (HL); Number of the first Sector
; File
INC HL
LD H, (HL); Track Number
LD L, A
EX DE, HL; in HL-load address in RAM
; In DE - track / sector
; In BC - the length of zgruzhaemogo
; Block
RET; back
;--------------------------; Meter titles and directory sectors
ZAGOLOW POP HL; return address of the current
; Title
LD DE, # 0010; header length
ADD HL, DE; proceed to the next
; Title
DJNZ CIKL; if not the entire sector -
; Repeat
POP DE; return and increase the number
INC DE; sector
BIT 3, E; all 7 sectors of the directory
JR Z, LOAD; not - repeat
JP ERROR; yes, the entire catalog,
, But no files were found:
; Go to the processing
; Error situation
;--------------------------; File name to search the directory
FILENAME DEFM 'FNAME_0'; filename without the 1-st
; Letters
DEFM 'C'; file type CODE
;---------------------------
; Routine boot disk
LOAD_SEK LD IX, # 2F1B <# 2F65>; address Subprogramme
And we in the ROM
; 'RECOVERY, ie a track 0
S address is input in the middle of the procedure
; # 2EF0 <# 2F3A> (see annex)
CALL TRDOS; perform routine
; In ROM
TREK PUSH BC; hide block length
PUSH; and track number with
; Sector
LD A, D; track number
OR A; transform a room
; CYLINDER
RRA; and the disc
LD C, A; copy number of the cylinder
And in 'C' for the ROM
JR NC, UP_TREK; was a 'transfer'? Number was
, Even?
LD A, # 2C; if odd -
; Readiness 'NIH'
JR FIND_TRK; go on 'Finding
; Track '
UP_TREK LD A, # 3C; number is even -
; Readiness 'TOP'
FIND_TRK LD IX, # 2F03 <# 2F4D>; address in the ROM;
, "Search"
, This address is the entrance to the middle of the procedure
; # 2EF0 <# 2F3A> (see annex to chapter)
CALL TRDOS; find the cylinder and
, Pressed to the desired direction
; Drive
POP DE; extract track number,
; Sector
POP BC; and block length
N_SECTOR PUSH BC; hide
, (Here are already in the process
PUSH DE; downloads will be ongoing
; Rates
; Tracks and sectors)
LD IX, # 2ED1 <# 2F1B>; load sector
; Number
; Of 'E', the address of 'HL'
CALL TRDOS; execute
POP DE; extract track number
, And SECTOR
; Already loaded
INC H; increase the buffer address
; RAM 1 sector,
, Ie rose to 256
INC E; increase the number of sectors
BIT 4, E; all sectors on the track?
JR Z, ALL_SEC; NO, continue to boot
LD E, 00; YES - zero the number
; Sector
INC D; increase the track number
POP BC; see the rest
; Length
DJNZ TREK; reduce it to 256
; (1 sector)
Or rather, if not all
; Loaded
RET; downloaded all that is needed
, Output
;-------------------- ALL_SEK POP BC; see the rest
; Length
DJNZ N_SECTOR; reduce it to 256
; (1 sector)
; Zgruzhaem Track
; Further, if not all
RET; downloaded all you need -
; Go
;-------------------- TRDOS PUSH IX; address for execution
; Procedures ROM TRDOS
JP # 3D2F; call the procedure indirectly
To the address on the stack
;------------------------------------------------- - 2
This program does not need any system variables and can work
even in the display area. It can be downloaded as the head of a
program and load the next levels. The only drawback
this boot - is that
all files on the disk in the directory
should have its real length
and the load address. If you do
for some reason is not appropriate (for example,
you want to protect their programs), then adding the program has
several commands and applying the method of encryption length
and address file during its creation, it is possible to solve
this problem. But this call for a separate chapter.
As we see, most of
places in the program is searching
file on the disk and determine its
attributes (length, start, number
track and sector number).
Program can significantly
reduced if all this is to define the beginning, when there is
an initial load of BASIC. While memory is free and the area
system variables TRDOS not
blocked codes. It is more convenient
make the function DOS, and the data
the file transfer then to the main program, saving them up to
for the time being in the space of memory.
Example 2
Consider just the case when the data file (which should be
loaded as the next level of play or state of the game) were
transferred into program while it downloads.
140.
* Boot * use the routine
; TRDOS # 3F00 <# 3F0A>
; Programa starts with the label START
And the data file are in the addresses of RAM
; Sector number and track number - the address
; 'ATRIBUT'
The length of the file at 'DLINN'
, The load address at 'ADR_LO'
;----------------
ATRIBUT NOP; here to convey sector number
NOP; here refer Track Number
DLIN NOP; here to convey the length of load
NOP
ADR_LO NOP; here to pass the load address
NOP
;------- Routine procedure call DOS --------- TRDOS PUSH IX;
call subroutine
; TRDOS
JP # 3D2F; address of the 'IX'
;-------------------------------------------------
;............... START ..............................
START LD BC, (ATRIBUT); take the track number and
; Sector
LD HL, (# 5CFE); keep changing cells
PUSH HL; RAM in the system
LD HL, (# 5D00)
PUSH HL
LD HL, (# 5C00)
PUSH HL
LD A, 0; (# 5C00) should be 0
LD (# 5C00), 0
LD A, C; Number sector
LD C, B
LD (# 5CFF), A; Record N. Sector
PUSH BC; retain N. Track
LD IX, # 2EF0 <# 2F3A>; find the track on
CALL TRDOS; drive
LD BC, 00; linger
WAIT DJNZ WAIT; and
DEC C; wait
JR NZ, WAIT
POP BC; extract N. Track
LD IX, # 2EF0 <# 2F3A>; as we head
, Entered the appropriate place
CALL TRDOS; then giving 'Search' to the same track
And we just push the head to
; Disk drive and promote the
LD IX, # 3F00 <# 3F0A>; disk spins, the head
; Pressed, now -
; Team read Sector
LD HL, (ADR_LO); take the load address and
LD (# 5D00), HL; place to work
CALL TRDOS; assume one sector to drive
, The address of RAM
............
etc., followed by code conversion
, How much is left to upload,
; Which sectors and tracks.
;------------------------------------------------ 2
I think the continuation of this
program, you can append
themselves (the algorithm can be taken from
previous example). Do not forget to return when leaving the
program from the stack all the saved values in the area of
system variables.
A few words about
Written to disk. If in the above examples call 'READING
SECTOR 'replace' ENTRY IN
SECTOR 'and slightly alter
program, then you will have the
Finished in routine RECORD
fixed file. (See Chapter TRDOS functions, an example of the
conservation state of the game 'Elite').
You create a file from the BASIC
desired value for subsequent
write to data from a working program. Convey
attributes of this file during
Download the program into the body where
you have located your routine 'ZAPISI'-all.
It's the easiest way to solve the problem. If you want to
write a complete program
'Save', then the rules for writing
the file to disk remain the
same as in the chapter 'Options TRDOS'.
And the information that you have already learned - will be
enough to do it quite professionally.
Now, when we learned how to
write - read from disk and
how to write a subroutine that does it, talk about
where to put this subroutine in
Reinvent program.
Little about it has been said
in the chapter 'Options TRDOS', but
As we have already reached the level of
programming the controller, then
we have and opportunities appeared
more.
How to build a decent
FULL 'loader / sohranitel' in a program that uses all the
memory your computer if, moreover, does not want out
This program is nothing to throw, and do not want to ruin the
screen?? There is a way!
Stuff This can have many different options, but
are the same: a remake
The program integrates a small sub-loader
(Only a few bytes), which is designed to keep
of RAM with address # 5C00 to address, for example, # 5FFF (4
sectors, we hopefully will be enough) in the fixed the file,
and for this a place to download a file from another fixed up -
image of system variables and
BASIC loader, which
will carry out major work
read / write.
After the end of the main loader must pass
Management at the little routine to restore
Reserved area of RAM from the first file in its place.
This is called the overlay
DOWNLOADING or 'pulling himself by his hair. " You are looking
at disk space as an area of more memory with the hard-coded
addresses and pumped into it, or out of it what you need at the
moment. Step by step it may look like this:
Create two teams BASIC
File type CODE.
> RANDOMIZE USR 15619: REM: SAVE
"BUFFER" CODE any address, 1024
This is a file to save the RAM area of the body Reinvent
program during its operation.
> RANDOMIZE USR 15619: REM:
SAVE "SYSBOOT" CODE 23552,1024
This image file system
variables and the main routine of the disk.
Choose to Reinvent
program area for the placement of the auxiliary loader
and enter its code at this place.
The file 'SYSBOOT' after copies
the entire range of system variables and buffer area is entered
our main routine of the disk.
Now in the process of starting Reinvent program we must pass
in the area of satellite boot all 4 parameters:
- Number of first sector of file
"BUFFER",
- Number of the first track of this
file
- Number of first sector of file
"SYSBOOT",
- Number of the first track of this
file.
The length of the transfer is not necessary, so
as it is known initially.
While working Reinvent the program, if it goes
the process of loading or saving, start the auxiliary
loader that first save area RAM address # 5C00
by # 5FFF in the file "BUFFER", and then it is place in the
memory load from the file "SYSBOOT" copy of system variables and
MAIN routine work with
drive and pass control to it.
Since all system variables and SOS TRDOS and restore, the
main routine can work with the disk through any
FEATURES TRDOS. This means that
you have fallen away all the problems with
find a file on disk and
the recalculation of track numbers and
sectors - while reading from disk, while recording - the
problem of recording the information on file in the directory
and in the 8-th sector of the system!
Do not forget to register for IY
You must have a value of # 5C3A,
and set interrupt 1. A
also - re-install the stack, if it was set to the area, which
remains at disk.
After its completion the main routine should
pass control back to
auxiliary loader which restore from file "BUFFER"
the entire area of the program stored on the disk, the old
place in the RAM.
The only downside to this method - it is a necessity
have all other files
program is also our 2 file.
You can abandon the files
if you put a buffer conservation
and the main routine of working with
disk in specific sectors,
specific track disc. For example, you can use an empty sector
to the zero track. Recall that a directory on our
the first seven sectors, the system
sector - the eighth, and the remaining
sector are free and the system does not
used (their uses routine ROM TRDOS during
save magico-file).
If you do so,
then you get a program that will run only on
this disk. On the one hand, this
create problems when copying this software on another drive. It
will be necessary to copy the program files are not
interpreted, but the sector ZERO track
where you will have written the basic routine of the disk.
On the other hand, the module
work with discs recorded on
these sectors, can use several applications at once, and
the programs themselves will be protected from
unauthorized copying from your hard drive as a boot module on
the zero track while trying to 'blow out' you program will
uncopied.
Such a disk can be copied only in its entirety TRACK
Copiers.
And if you go ahead and place the sector with our routine on
track specifically labeled with the number of such 161, on
which the system will be just do not know what to fully copy
the disc can not no copyist. But the protection of CDs, we will
talk a little later.
Now consider those aspects of programming the controller,
hitherto mentioned
only in passing.
FORMATTING
The formatting process - it
account some special
sequence codes for the selected CYLINDER and side of the disc.
The largest number of cylinders on
drive depends primarily on
drive, as some have drive-stop, heads, stands at 80, while in
others it can stand on 86 (limiter
purely mechanical).
TRDOS formats the drive for 80
cylinders, writing in the 8 th sector 0 track
information-signanalizator - what is the drive and how much
free sectors on the disk.
The procedure for formatting
one track is in ROM on
at # 1FC1 <# 1FFD>. Before this
heads must be brought to
desired cylinder and pinned to the top (even) or bottom (odd)
side of the disc. Next comes the command 'TRACK RECORD' # F4.
Formatting is
the following sequence
bytes (these bytes are fed into
Port # 7F in routine at # 2075 <# 20B1>).
For illustrative purposes, the table - that served to record
to disk, and that is recorded on
disk, as some bytes in the
team 'TRACK RECORD' interpretation
preted chip VG93,
as nested subcommands.
TABLE ARRAY FOR ONE SECTOR
THAT SERVED IN PORT FOR RECORDING THAT RECORD
10 bytes # 4E (beginning of the space)
12 bytes of zeros
3 times the code # F5 (initialization code # A1, label
counter kontr.summy) top IAM
code # FE (Address index mark)
Track number of bytes
(NOTE! Track number is written on the disk TRDOS
Vaeth and on the top and bottom of the disc with the OAG
Nakov - Room CYLINDER. Definition,
what a track of 160 where there is, there is
purely programmatically).
Byte of the disk
(NOTE! TRDOS and upper and lower side
disc marks byte 0, the definition of which side
drive to be a member of the 160 tracks are
purely programmatically).
Byte sector number (counting from 1 to 16)
Byte sector size (in TRDOS = 1, ie 256 bytes)
Byte # F7 (subcommand - Two bytes
written as computed k.summu) konrolnoy amount
22 bytes # 4E (space before the data)
12 bytes of zeros
3 times the code # F5 (initialization code # A1, top
counter kontr.summy) data labels
Code # FB (address label data)
256 zeros
(This data field)
Byte # F7 (subcommand - Two bytes
written as computed checksum k.summu
50 bytes # 4E (remaining space)
Once all 16 sectors per track are marked, the remaining
space is filled with tracks Code # 4E.
This array format
designed to drive
Dual density. For single-density disk drives will be different.
For the double-density disk drives (Mode Modified
Frequency modulation) in the process of executing the "RECORD
WALK "chip receives and considers a subcommand following bytes:
B # F5 - entry code # A1, and for
Start counter con
trolnoy amount;
B # F6 - write code C2;
B # F7 - record counted
checksum
disc.
In the process of programming a
You might want to format the individual tracks
on the drive differently. For example, in
the process of establishing secure
disks or hidden boot. No problem!
You can format,
For example, the 163rd track on its
drive with only one sector
length of 1024 bytes and the system number 223, and this will
only know your program, working with this track, and you
themselves.
When you try someone else read your secret track and sector
are likely to it will fail, because
that someone would not know the system facilities in this
sector. IC VG93 it just does not
finds on the track, not to mention
about trying to read the content.
(When you read this book
to the end and spend some efforts you can easily copy any such
CDs Any Boolean
Protection).
Formatting the tracks can be
run through the other sub TRDOS, namely # 3FC0
<# 3FCA> (see above). Formed in
of RAM, the entire array of tracks,
how it should be on a disk,
can one go to record information from RAM to disk on the track,
and thus reformatting it.
Calculate the table as
bytes of RAM it will take us all
array:
376 bytes - it is one
sector and 376 * 16 = 6016 bytes per
the whole track (plus appendage,
about 200 bytes).
When you format a track
their format, you must take this into account, and the length
of the entire array of your size should not exceed this figure.
Extra information is simply not recorded on the track.
DEFINITION Partitioning
In some cases you may need to determine
marked as one or the other drive
(Eg, for 'opening' protected discs or discs labeled
nonstandard). The system VG93 teams have a team: 'Reading the
address', but it is designed to properly labeled disks, ie
without any frills.
With it you can read the tag and index address TRDOSovskih
and MSDOS-disk-native, and CP / M disks, but if you try to read
an indexed address the label on the disk, where on one track,
there are sectors with different lengths and numbers taken from
the ceiling - that you will read the label of one sector, but
to learn which sectors, how many and what are their numbers,
you are unlikely to able. For this purpose there
'Clever' way.
Recall. We have in reserve
left the team VG93 'READING
WALK IN WHOLE '. When this command reads the chip to track
everything: the tags, and sync bytes, and data - in short,
everything, everything, everything. Only drawback of this team
- this is that when reading data from
Disk read bytes are not sampled. But we do not interfere.
So what? Imagine you got to
CD with suspicious markings.
Displays drive heads to
any path (usually
zero), pulls the head to
surface, give the command 'Read Track' and exit the subroutine
TRDOS # 3FDB <# 3FE5> - Reading an array from the data port in
e M (HL) (of course, before
that you should reserve
buffer to read data
size of approximately 6,300
bytes, you can even on the screen).
Repeat this process 2-3 times in a row reading for more
reliable reading, as bytes are not accompanied by a clock. And
here you have the buffer will be an array of data of an entire
track with all the official tags. And then quite simply.
Recall, from which bytes begins IAM - Indexed address label.
That's right - with bytes # A1 and # FE (who does not remember
- See previous table, the array format). (For CDs
with single-density bytes before the code # FE will be another
(maybe 00, and # C9, and # FF - in Depending on the initial
array format).
We find these bytes in the buffer, and
after them, please, all data of one sector: track number, side,
number and length of the sector. Remember these data in some
kind of memory cells. Looking for The following two bytes # A1
and # FE; and so until the entire buffer is not over. After
that we will hold all the trumps, no matter what
was a dodgy format on the track. Scan the entire disk, we
obtain a map format for all tracks and sectors. But it is
usually sufficient to scan 02/04 tracks.
To be continued