ZX Format #06
29 июля 1997

IS-DOS - the programmer: a short course - programming in IS-DOS.

<b>IS-DOS</b> - the programmer: a short course - programming in IS-DOS.
 Category "IS-DOS - programmers" No 6.

music by Ironman
(C) Leont'ev, AG
_______________________________

 SHORT COURSE
PROGRAMMING ENVIRONMENT IS-DOS.


  (Under the general editorship Eliseev VA)

 Continued from the No 5.

 From the Editor.

Hello, dear readers!
Today, under the heading "IS-DOS - the programmers," we 
continue to publish a new book by A. Leontiev, begun in the 
last issue of the magazine. For those who still do not know 
announce that Alexey Leontiev is a leading systems programmer 
Division IS-DOS, a recognized authority in the field of our 
system, one of the Fathers "IS-DOS.


     We hope that this book will help you
in the development of programming vsrede
IS-DOS and joins the ranks of programmers,
able to write under the IS-DOS, new talents, and our range of 
programs - new developments, including, among Incidentally, 
there may be yours. 

- So:

 Leontiev


   WHAT TO DO?

                   or

   How to Stop Worrying and Start

        Program in ISDOSE

6. WAS IST DOS?

 or lowest level
 (0th level, he is "DOS.SYS")

The lower level of the system in the iS-DOS
(Restarts from # 00 to # 1F) works with the cache,
block and character devices, channels and interrupts. This 
level is not know any of the files or the command line, or 
about the windowing technology. All these engaged in higher 
levels. 

So, more on the restart:

The first 7 (from # 00 to # 06) Restarts
the level of "DOS" working the so-called
"Cache", so first a few
words about what it actually is.

     So the cache block devices - it
system buffer is used exclusively for blocks (256 bytes) of 
which all block devices. 

     A cache is created restart $ creat (# 00).
The system automatically creates it for
loading, as well as the output of the system to
restart $ shel0 (# 80) or RET'u with values ​​# F6 # F7 or in 
the register and the processor. 

     His re-creates some batch files, such as copiers. They do 
so mainly to reduce cache size, and thus win

a few kilobytes of memory for the buffers, and
also to return after the cache
former state.

     As mentioned at the outset
books, the system iS-DOS occupies memory ZX
top to bottom, and the cache that is created in the last turn 
is under the system. Top it limited to the channels. Top 
address of the cache can get out of vector system configuration 
g_cnf, using the restart $ g_cnf (# 10) offset 32: 

LD C, # 10; $ g_cnf, returns

       RST # 10; HL 'address vector

       EXX; address - in the HL

LD DE, 32; add an offset
ADD HL, DE

LD E, (HL); get in DE

       INC HL; desired upper

       LD D, (HL); address cache

Low address cache, of course, depends on the upper address. If 
you have a catastrophic shortage of memory, you can remove 
unnecessary residents (this will help you with the key set.com 
/ e). You can also podsokratit range of channels that can

do channel.com. This will cause the displacement of the entire 
cache area up and, consequently, raise and lower its boundary, 
freeing up memory for your purposes. However, of your program 
the easiest way to reduce cache.


     Cache size, which is installed by
default, lies in the vector g_cnf offset +7. Address the lower 
boundary of the cache is in the same vector with the 
displacement +5 And +6. If necessary, it can be calculated 
using the formula (1): 

CACHE = DGCHN - CSIZE * 260 (1)

where CACHE - the desired address is the lower boundary
cache, DGCHN - the start address of channels, and CSIZE - cache 
size in blocks. 

At this location is the cache directory as an array descriptor 
blocks (4 bytes for each block of cache) after which the blocks 
are located. 


  The structure of the cache:


Bias Size Description
of


  0 EDSIZ * 4 cache directory is

                 4-byte description
                 carriers of blocks:


  0 4 Descriptor Unit 1

  April 4 handle 2-Unit

  April 8 descriptor third block
 . . . . . . . .

  EDSIZ * 4256 1 st block

        256 2 nd block

        256 3rd Block
 . . . . . this is actually a body

                 cache, the address of storage
                 nitsya Vector g_cnf

                 offset -5.


where EDSIZ - cache size.

Descriptor block imeetsleduyuschuyu
structure:


Mixed-Time-Description
alkaline-measures
of

0 1 status register block

  combined with the number of devices
  properties. Bits:

   7 - modified unit (1)

     6 - block protected (1)

   5 - block exists (1)

   4 - not used

   3 .. 0 - number of the device

  who owns the block.

January 1 the reference count to the block

February 2 block number on the device.


ММММММММММММММММММММММММММММММММинимальный cache size is 6 
blocks. Optimal in the iS-DOS Classic - 20 to 30, in CHIC - 40.


     Cache is required for file
service. Through it, the system accesses
devices, ie reads and writes file descriptors directory, a map 
of occupied blocks of devices, device headers, etc. If there is 
insufficient space in the cache is sacrificed oldest schitanye 
block. 

     Record also carried out through
cache, and the system and has no other buffers, so the unit 
just modified, I mean is modified directly in the cache, and in 
the descriptor cache is set to one seventh bit. 

     With the accumulation of modified
blocks their record on the device, and bit
modification reset. This action
called "automatic flush" or "auto-flush" (flush in English 
"sink", not be confused with the flash - flash - the "flash", 
and also flesh - flesh - "flesh". Please

say from a purely Oxford prononsom!)

 And finally, restarts:


   # 00 - $ creat

Creates and recreates the cache. The required size of the 
blocks must be submitted in register A. The contents of other 
registers for work do not affect the restart. 

     At the exit check flag C. In the case of an error it will 
be set to "1" The only possible error - Error 130

- Lack of memory, ie, input value
register A is so large that the cache does not fit above the 
address Utop (User Top). 

     Get address Utop you can apply restart $ g_cnf (# 10) 
(offset +3 vector g_cnf). Utop serves mainly

fuse from lowering the cache so
low that the program is in the process set.com
work would kill them myself. Therefore,
usually Utop = 26676.

     Restarting $ creat (# 00) clears the blocks
size of 256 bytes for the lower boundary
of channels ($ g_cnf (# 10), offset
+32) In the amount indicated in the register
A, and creates a cache directory (by 4 bytes
each block).

     Work with a cache size of at least 4
blocks unsafe (the program at this
simply not designed). Recommended sizes from 6 .. 10 blocks at 
least (if you want to win more memory for buffers for programs 
or data) to 30 or even may 70 (in iS-DOS Chic, of course).


     Although increasing the cache after 20 blocks almost never 
gives a significant gain in speed of the program. To restore 
the size of the cache by default suggest primerchik this here:


LD C, # 10; $ g_cnf

       RST 1916

       EXX; in HL - address of the vector

       LD BC, -6; offset -6, here

       ADD HL, BC; stored cache size

                    By default

LD A, (HL); put the size of A

       LD C, # 10; $ creat

       RST 16; recreates the cache

       RET C

When calculating the amount produced
cache, if you know the upper and lower bounds of it, you can 
use the formula (2) logically follows from the formula (1):


             DGCHN - CACHE
 CSIZE = -------------- (2)

                  260

where CSIZE - the desired cache size, DGCHN -
the lower boundary of the channel, it -
upper limit of the cache, and CACHE - lower
boundary of the cache.

Example:

LD C, # 10; $ g_cnf

       RST 1916

       EXX; in HL - address of the vector

       LD BC, 32, offset 32

       ADD HL, BC

       LD E, (HL); in DE - address the top

       INC HL; border Cache

       LD D, (HL)

       LD HL, CACHE; it - the required lower
                    ; Lower boundary cache

                    , Below which all parameters
                    ; Crease can be used
                    ; Use your

                    ; Program

EX DE, HL; subtract CACHE

       SBC HL, DE; of DGCHN

XOR A

       LD DE, 260; divide the result
A $ SBC HL, DE; 260

       INC A

       JR NC, $ 1

DEC A; check, did not

       CP 6; whether CSIZE less

       JR NC, $ 2, 6 blocks

LD A, 130; No room! Output from

       RET; error 130

                    , The error code in reg. A

2 $ LD C, # 00; $ creat

       RST 16; recreates the cache

       RET C

...


   # 01 - $ clear

Clearing the cache on blocks of the current device. This 
operation is necessary for changes in the floppy drive or 
abandonment unloading the disk blocks modified restarts $ modwr 
(# 03), $ modo (# 2E), $ Wpart (# 2A), when the auto-flush has 
not occurred, as well as in writing to the disk by cache 
blocks, read through a cache, so that disk cache and match.

When rakbote restart all the information
available in the cache is lost.

     If the cache contains modified
blocks, and you want to save them, then restart ne 
redochistkoyvyzovite $ Flush (# 02). Errors after a call to be

be. No input parameters.

Example using $ clear restart
taken from the program format.com:

This - the beginning of the procedure format. Perhaps, before 
formatting was changed disc. Therefore, the cache must be 
cleared restart $ clear (# 01). This example also

will be useful for better understanding of restarts $ g_blk (# 
13), $ g_drv (# 14) $ Binit (# 0F), which will be considered

us further.

     First, using $ g_blk (# 13), we find the current block 
device and obtain the address of the body corresponding driver.


     Next, check whether this is
drayverdrayveromfloppi drive
sys_driv.blk, ie whether it is possible to format the device 
via TRDOS. 

     Then we try to open the device as a block device IS-DOS
restarts $ binit (# 0F) and $ open (# 20) so that
prevent accidental reformatting existing disk:


       LD C, # 13; $ g_blk

       RST 16; get in a room

                    , The current block

                    ; Device

       INC C; $ g_drv

       RST 16; know the address of its

       RET C; driver

       EXX; in HL - address of the body

                    ; Driver current

                      ; Block device

And here we check whether this is
; Driver drive

LD BC, 9
ADD HL, BC

       LD (DRCSR +1), HL

       RES 7, (HL)

; Not call $ erdrv (1F) for errors in the
; Drive

LD C, # 01; $ clear

       RST 16; clear the cache

LD C, # 0F; $ binit

       RST 16; initialize

                    ; Device

       JR C, FOR_1; transition at about
                    ; Cedure Format
                    ; Tion, if the device
                    , The set does not exist

LD C, # 20; $ open

       RST 16; try to open

                    ; Device

       JR C, FOR_1; dropping down to the
                    ; Screening, if not

                    , Opens

...

FOR_1; located here

                    ; File formats
                    ; Derivations drive

       ...


   # 02 - $ flush

Restarting $ flush (# 02) is required for
fixation on any block device
(Disks or electronic disk)
changes made in the cache after recording restarts with $ modwr 
(# 03) $ Modo (# 2E), $ wpart (# 2A), $ crfil (# 23)

$ Erfil (# 24), etc.

     All of the above restarts modifitsirut blocks in the 
cache, it is natural that these changes must eventually be on 
the disk. 

     The fact that the cache block device has been created 
firstly to accelerate the work of lower levels of the system, 
so twice and three times not to read from the device

the same blocks. In addition, the system was
need a buffer for his work with directories and files.

     In this regard, the record on a device, in most cases it 
carries out directly and not climbing with each new block on 
the disk, and marks the block in the cache as "modified" that 
is, set to 1 one of the bits of the descriptor blocks in the 
cache. 

     When a certain number of modified blocks (usually
it is equal to the size of the cache divided by 2
or cache size minus 3) an automatic flush. In this case, 1 is 
set first bit 1 of the first byte of the vector block device.


Input parameters of this restart
no. Various error at the output,
For example:

Cache errors:

 61 - the specified block is not found
 62 - the actual number of modified

      blocks does not correspond to the values
      Niya system variable ($ QNMOD)
 63 - the sector is protected
 64 - Cache protected
 65 - There is no place in the cache
 66 - reading prohibited
 67 - entry prohibited

Mistakes block driver sys_driv.blk:


  6 - no disk

  7 - read / write error
 20 - disk accesses aborted

If the modified blocks in the cache
the current (!) device is not, then restart does nothing.

     Suggest cause $ flush (# 02) at the end of your program 
before exiting to the shell, as well as before starting from 
your programs in some sistemnyhutilit

(Copy25.com, for example) and before peresosdaniem cache memory 
when released. 

     If your program is written through the cache
several different block device
(Example: current T:, the system S:, quick Q:), then do not 
forget to flush on Each of these devices, switching to

them with the restart of $ swblk (# 1C) or
$ G_sta (# 37).

an example of output from the program, modifying the blocks on 
multiple devices at once, say, Q, S and T: 

LD A, "Q"; device "Q"

       CALL FLUSH; subroutine call

       RET C

LD A, "S"; device "S"

       CALL FLUSH; subroutine call

       RET C

LD A, "T"; device "T"

       CALL FLUSH; subroutine call

       RET C

And here is the restoration of the environment,
, Which was at the time of launch

LD C, # 41; $ fmrst

       RST # 10; call restart

       RET C

, Output in the shell with a reprint of the screen
, The standard method

XOR A

       LD A, # F4

       RET

; Routine FLUSH

, First transform the logical name
; Device ("S", "Q", "T") in physical
F; number (0 .. 7)

FLUSH LD C, # 4A; $ dvtrn
RST # 10

       LD B, A; device number

                    ; Put in the reg. B

, Switch to the appropriate
F; device

LD C, # 1C; $ swblk
RST # 10

       RET C

Behold now, actually, flush

LD C, # 02; $ flush
RST # 10

       RET; return from

                    ; Routines


   # 03 - $ modwr

Write one block (256 bytes) to the address filed with the HL to 
the current block device and block number filed in

DE. Entry occurs through a cache, ie
First released in the cache location - Kicks oldest schitanye 
block - and in its place are transferred set 256

bytes.

     New unit gets its own number and unit number (0 to 7) and 
immediately flagged as modified. If you overfill the modified 
blocks in this did not happen, then it all and ends

otherwise, there is an automatic flush,
ie physical record of modified
blocks on the current device (by means
  property driver access).



     When working a restart may fail,
so that after his call, we recommend checking flag C. Error 
codes are the same as in $ Flush (# 02).


     Restarting $ modwr (# 03) is convenient when working 
directly with the device (bypassing file). Do not forget 
tolkovyzvat $ Flush (# 02) at the end of the program!


      Primerizzhizni: program
arzt +. com, to be exact - to a portion in which the recording 
device is altered table occupied units: 

$ MODWR LD HL, $ BUFF; address worker

                         ; Put buffer

  , In ref. HL

       LD DE, 1; Room 1

                         ; Block - in DE

       LD A, ($ MLTRD +2); the number of blocks

       LD B, A; put in B,

                         ; It - the counter

                         ; Later

                         ; Cycle


       LD C, # 03; $ modwr

3 $ RST # 10

       RET C

       INC DE; call in the loop

       INC H; for all blocks

       DJNZ $ 3, in turn,

RET


   # 04 - $ unird

Doubles the previous restart - reading a single block device 
cache. In HL put the address in DE - block number on the device.


     If the unit is not in the cache, the procedure
reads it from the driver. Flag C on
output reports unsuccessfully held
operation. Error codes, as in the previous two cases, the 
essence of the error codes cache driver (their description, see 
$ flush (# 02)). 

     In real life, this restart is not widely applied, so as an 
example, read the 0-th block of the device to the buffer BUFF, 
clearing the front of this on Just in case (if you change the 
disk) cache 

LD C, # 01; $ clear

       RST # 10, clearing the cache

LD DE, 0, block number = 0

       LD HL, BUFF; buffer address

       LD C, # 04; $ unird

       RST # 10

       RET C

...


   # 05 - $ mltrd

Almost the same, but read just
several blocks. The number of blocks is given in
register B. First, these blocks are searched in the cache and 
copied to the designated address, then just go where ordered 
read through the driver, missing blocks, already then copied 
into the cache. 

     If the number of read blocks exceeds the cache size in 
half, then going on by reading the cache, so as not to knock 
him out of such units is often required as a directory block 
and the header device, and thus do not slow down 

  system work with directories.

     Directly read the blocks are
also in the presence of a cache of modified
blocks. You can always get to work
This restart directly with the driver, dropping the seventh bit 
of the 0-th byte of the vector block devices.


     This uses the restart restart
Reading the file $ rpart (# 29), c through which in turn runs 
all com-files system. 

     Just in case, analyze the flag C
output. Error codes are the same as that of the
$ Flush (# 02).

Example is, again, from arzt +. Com:
Card reading device occupied blocks in the buffer $ BUFF. Byte 
$ MLTRD +2 wages it is filled with the size of card: 

LD C, # 35; $ bkfcb

       RST # 10; read the descriptor

       EXX; drive and find a

       LD BC, -6; its size card

       ADD HL, BC

, Round up to whole units:
, And put at $ MLTRD +2

LD A, (HL)

       INC HL

       OR A

       LD A, (HL)

       JR Z, $ +3

       INC A

       LD ($ MLTRD +2), A

       ...

       CALL $ MLTRD; subroutine call

       ....

; Routine using $ mltrd (# 05)

$ MLTRD LD BC, # 05; $ mltrd

       LD HL, $ BUFF; buffer address - the HL
LD DE, 1

       RST # 10

       RET

$ BUFF; it - the buffer


   # 06 - $ quard

Almost the same thing as $ unird (# 04), but
block is read only in the cache (or is it). Therefore, the HL 
register input is not used, but the output

in HL 'return address block in the cache,
DE '- the address block header in the directory
cache (required for later use $ modo (# 2E)).

     At the entrance to the block number is filed DE
device.

     There are various errors (the same as
that of the restart $ flush (# 02)), therefore
Check the flag C. Convenient for residents or programs that 
wish buffers block. 

     This example is taken from the program date.com:

, Consider the 0th block device. It was there
; Stored date of loading of the system:

LD DE, 0, block number = 0

       LD C, # 06; $ quard
RST # 10

       RET C

       EXX

And to save the address read by the block (HL) and
,; Address descriptor of the block in the cache (DE):

LD (TMPHL +1), HL

       LD (TMPDE +1), DE

...
; ... Print, and change the date ...
, (These procedures are omitted here
; As unnecessary)

       ...

, Output from the program:

; In DE submits a new date value.
And compare it with stored in the 0th block
; Device and, if they differ,
, We set a new date in the 0th block and conservation; them on 
your device restarts 

  ; $ Modo (# 2E) and $ flush (# 02):

TMPHL LD HL, 0, in this empty bytes

                    ; Placed vysheupo
                    ; Myanuty address assumed
                    ; Spontaneous unit

       LD BC, 30

       ADD HL, BC

LD C, (HL)

       INC HL

       LD B, (HL)

; In BC now - the old date, few
F; from the device

EX DE, HL

       XOR A

         PUSH HL; new date

       SBC HL, BC; comparison

       POP HL

       EX DE, HL

       JR Z, SVSTYL; dates are equal. Bypass

; If the date is not equal to - put a new
; Over the old one right into the cache:

LD (HL), D

       DEC HL

       LD (HL), E

; Promodifitsiruem block in the cache:

TMPDE LD DE, 0

; In the empty bytes after DE, as you remember
, And we previously put the address of a descriptor block
; In the cache, resulting from the restart $ quard (6)
; A few lines above.
; This email address is required for $ modo.

LD C, # 2E; $ modo
RST # 10

       RET C

LD C, # 02; $ flush
RST # 10

       RET C

SVSTYL

       ...

The following 3 restart $ key (# 07)
$ Kwait (# 08) and $ ktest (# 09) with the keyboard:


    # 07 - $ key

Entered via the keyboard. Drawn
right in the first entry point keyboard driver. URL of this 
entry point lies in the driver with offset 2). If the buffer

driver is empty, then the driver turns to
ports for keyboard and waits until the key is not
is pressed.

     The output value is returned in register A. It is Avis of 
keystrokes and on the mode in which the device

input.

     The regime is determined by a null byte
vector character ustroystvavvoda
g_key, which can be obtained by contacting the
restart $ g_key (# 11).

0th byte vector.
Bits (0 / 1):

     0 - lowercase / UPPERCASE

     1 - latin / Russian

     2 - text / pseudographics

     3 - do not wait for release the keys when

           $ Kwait (8), applied to

         macros in the editor,

         reset itself when emptied

         buffer driver.

With the flag is not important. As
an example, the routine of a text editor edit.com, ignited and
An anti-cursor to the current coordinates and
pull-based keyboard with the expectation or
without (controlled by the fifth bit in edcsr):

; Switch the keyboard into the regime of small
,; Latin to get the code management
; Keys, which does not depend on the current state; yaniya. 
Third bit (macro) is masked by the eight; yardstick in order to 
preserve it, bits 0,1,2 , Reset:


$ KEY LD C, # 11; $ g_key
RST # 10

       EXX

       LD A, (HL)

       AND 8

       LD (HL), A; lat

, Switching to the current output driver
; On the screen (t42/t64):

CALL $ TYCUR

       RET C

; Positioning. Recalculate the coordinates
; In the text of xc in position on the screen and poloF; bench 
YX in HL: 

LD H, (IX + ys)

       LD A, (IX + ys-1)

       ADD A, (IX + xc)

       SUB (IX + X_skip)

       LD L, A
L_FLD C, # 0C; $ typos
RST # 10

; Light a flashing cursor in the text. position:

LD C, # 76; $ y___
RST # 10

       LD C, # 08; $ kwait

; Bypassing standby key is released:

BIT 5, (IX + edcsr)

       JR Z, $ +3
RST # 10

DEC C; 7 = $ key - input

       RST # 10; keys

PUSH AF; keep the code

       LD C, # 77; $ n___

       RST # 10; repay the cursor

POP AF; restore code

       RET


   # 08 - $ kwait

Waiting for release of keys. Restart
necessary in some cases, when
the risk of accidental double-pressed (hold) the key, for 
example at the beginning programs, called key, and also

polling the keyboard, using the previous restart.

     This - the second entry point into the driver
(Address it is in the driver offset 4). Used vrestartah
$ Smbgt (# 6E), $ edstr (# 7F), $ menu (# 91). On
Output can be anything. Example
- See the previous restart.

     This procedure is called, say,
block overlay ed0 +. ovr with the expectation of releasing the 
key before restarting $ analy (7E) after printing the bottom 
line overlay function and the function call , requires 
confirmation. 

     This call is reliable.
However, at around the block the same procedure
call without waiting for release, that
lets celebrate the big blocks by holding down and using the 
auto-repeat. 

     This restart when you call empties
buffer keyboard drivers, thus driver
"Forget" all the keys before calling the restart button. If 
this function driver does not turn off to the third bit register

state of the keyboard macros would work
only to the first $ kwait.


   # 09 - $ ktest

This restart - the third entry point into the
keyboard driver. It defines, at least one key is pressed on the 
keyboard or no. Exit at the flag Z:


- Is not pressed,
NZ - pressed.

As well as $ key (# 07), primarily
interrogates the buffer drivers where they can accumulate 
rapidly keystrokes, and which used for macros or emulation

pressed.

     This restart is useful for polling the keyboard without 
waiting for, for example interrupting the cycle. When you press 
flag on the output - NZ, and the key code will be in register 
A, as well as in the buffer driver where it is necessary to 
extract restart $ Key (# 07), otherwise it encounters another

anyone.

Example:

; This routine will return with the flag Z,
And if the key pressed was not

  , And with the flag of NZ and key code
And in case A, otherwise.

KTEST LD C, # 09; $ ktest
RST # 10

       RET Z

LD C, # 07; $ key

       RST # 10; extract "extra"

                      ; The code from the buffer drei
                    ; Faith keyboard

       OR A

       RET

The following three restarts are
for a character to display or printer, it is $ type (# 0A), $ 
tycpl (# 0B) and $ Typos (# 0C):



    # 0A - $ type

Print a character from the register A of the current symbolic O 
device (screen or printer). 

     Selecting the device (screen or printer)
can be achieved by restarting
$ Svtyp (# 1B).

     Flag of the output for printing on the screen
plays no role. Turning to the printer we can shlopotat the 
following errors: 

150 - error or printer is not ready

   151 - Printing aborted.

The latest version print.com
do not use the restart.

Print on the screen is the current position, which is stored in 
bytes 1 .. 4 of the vector character of the output device. 
Vector can take it with a restart $ g_typ (# 12). 

Bytes:

- The position of the press in line

     2 - The line number on the screen

These 2 bytes are fed into the input HL
Restart $ typos (# 0C), which transmits them
in register BC's third entry point into the driver (shift 6).


   3,4 - Address printing on the screen

It's - the upper-left byte characters. For example # 4000 for 
0-th position in the 0th row). 

Here these bytes kladutrestarty
$ Typos (# 0C) and $ wtpos (# 6B), It takes
them for printing the next character restart
$ Type (# 0A). Here he has them, and returns
after printing.

     Restart refers to the first entry point of the driver 
(offset 2 from the beginning of the driver), and the address 
printed on the screen is fed into the register DE '. This 
restart Restarts enjoy higher levels, such as $ str (# 6C), $ 
smbgt (# 6E) and etc.



   # 0B - $ tycpl

Sets the inverse / normal
print modes on the screen in accordance with
contents of register A:

<> 0 - Inverse Printing

     A = 0 - Normal mode

Do not use the printer drivers. Flag C at the outlet does not 
matter. 

     Restart using the new version
text editor for block-mark
as well as program demon.com. Drawn
in the second entry point into the driver (address of
shift 4).


   # 0C - $ typos

Specifying print position on the screen for
subsequent restarts print $ type (# 0A),
$ Str (# 6C), $ lnstr (# 6D), $ smbgt (# 6E),
$ Edstr (# 7F).

     Coordinates print specified in the register HL:

- Line number

     L - position in string.

For positioning relative to
window can also be used restart
$ Wtpos (# 6B). Flag of the C output value is not
has. This restart is using the third point
entrance to the driver (shift 6).

     The old printer drivers, this point has not been used in 
new, it is responsible for printing a symbol from the register 
A without conversion.


Here's how to use restarts $ typos and
$ Type program exebat.com Print command prompt from the system 
clipboard: 

; Check for 8-th channel (channel
; Driver symbol O), because prog; Ramm should work even when
; Print nothing:

PRINT LD A, 8; ty42

       LD C, # 16; $ stchn

       RST # 10

       RET C

; Positioning:

SBC HL, HL; HL = 0: upper row

       LD C, # 0C; $ typos

       RST # 10

LD C, # 45; $ g_com

       RST 1916

       EXX

; HL = address of the system buffer

LD BC, # 2A0A; $ type

; B = # 2A = 42, so the letters placed in a
; Line on the screen, # 0A - $ type

; Print the string to the character # D:

1 $ LD A, (HL)

       CP # D

       JR Z, $ 2

RST # 10

       INC HL

       DJNZ $ 1

       RET

; Overprinting gaps:

F2 $ LD A, ""

       RST 16; C = $ type (see above)

       DJNZ $ 2

       RET

Three restart, to the driver
block device:


    # 0D - $ read

Reading blocks directly to the driver
the current block device.

HL - address
DE - number of the block device
 B - number of blocks.

Flag C at the outlet - a sign of failure.
Errors, only those that gives the driver. So
RAM disk driver usually does not give errors, though nothing 
prevents integrate into the test, say, the numbers

unit at too great a number or the number of
read blocks to 0, or insert checksum block.

In the driver sys_driv.blk possible
errors are as follows:


  6 - no disk

    7 - Sector not read
 20 - reading is interrupted.

Typically, the driver floppy disk work out these situations 
referring to restart $ Erdrv (# 1F) (see below). Restart refers 
to the first entry point to the driver. 

This example is taken from the life of copiers:
beginning of the working cycle of the program abc.com.
In bytes INDSK +2 and OUTDSK +2 placed numbers of input and 
output devices. 

; B = number of blocks to read / write

COPY PUSH BC
INDSK LD BC, # 1C; $ swblk

       RST # 10

       POP BC

       RET C

LD HL, BUFF; buffer copying

       LD C, # 0D; $ read

       RST # 10

       RET C

PUSH BC
OUTDSK LD BC, # 021C; $ swblk - to C

       RST # 10

       POP BC

       RET C

LD C, # 0E; $ write

       RST # 10

       RET C

...


   # 0E - $ write

Recording B address block to the current HL block device 
(floppy disk, RAM disk or hard drive) from

Loka number DE.

     In IS-DOS any block device
consists of a logical block size 256
(# 100 hex) bytes, which is very convenient for
calculations in the assembly.

     Recalculation of the unit number to track the direction 
and the sector is engaged in the driver. Driver floppy disk is 
configured to format IS-DOS floppy disk itself restart $ binit 
(# 0F). This - the second entry point into the driver.


     Since this is a direct appeal to the device without going 
through the cache, it is recommended immediately after calling 
this restartavyzvat $ Clear (# 01) or $ creat (# 00) in order 
to avoid confusion in the cache blocks and blocks on the device!


     The situation with the possible errors is the same as that 
of the $ read (# 0D). Example also see above.



   # 0F - $ binit

AutoConfig driver floppy disk
the format of the IS-DOS disk. Reads the 0-th
unit disk, check for signs
"DSK" at offset 10. If there is no sign,
then exits with an error 9. Otherwise - is configured on the 
parameters of the disc lying on Displacement:



22 Number of cylinders
23 disc type (number of sides)
24 Sector size (1/2/4: 256/512/1024)

   bytes
25 Number of sectors per track
64 rooms sectors (up to 16 pieces)


It is also possible error 10 - an attempt to
work with two-sided disc on a single drive or from the 80-track 
on 40-track. This third entry in the driver.

Is not commonly used in electronic driver disk and hard drive 
(there put "caps" for compatibility). 

     This restart is useful to call for
first address to the new block device driver to configure the 
disk and to make sure that this is

IS-DOS device. In addition to errors 9 and 10
may issue an error reading: 6, 7 and 20.

The driver can be configured to work
formats with TR-DOS and MS-DOS, but restart
here is not much help.

     In such cases it is better to find a driver
by restarting the $ g_drv (# 14), make sure that this is the 
driver floppy disk, and the displacement of 34 (dec) Change 
sector size, number of sectors and Table Sectors.


     As an example, we recommend passage of format.com given 
after the description of the restart $ clear (# 01). 


  Structure descriptor

           device (disk)


  0th BLOCK: (0th sector 0th track)


mixing-length comments
G slit on
of

 0 2 Not Used
 August 2 Device Name
March 10 Symptom iS-DOS: "DSK"
May 13 Not used
Feb. 18 Unit size

  (In blocks of 256 bytes)
February 20 number of 0-th block of the main

  Catalog
January 22 Tracks on the Device.
January 23 disc type. Bits (0 / 1):

       0 - 40/80 tracks

    1 - 1 / 2 sides
January 24 Sector Size:

  1/2/4: 256/512/1024 bytes
January 25 sectors in the dor.
January 26 Not used
January 27 Rear. $ 32 byte

    Descriptor ????_ dos.sys
Feb. 28 Not used
February 30 Date
32 32 descriptor ????_ dos.sys
64 16 Table number of sectors

  on track


1st Block: Bit-map of the device.

           1 bit / block: 0-svoboden/1-zanyat

Descriptor ????_ dos.sys offset
32 placed in the 0th blokprogrammoy
con.com ischityvaetsyazagruzchikom
boot.sys.

Well, that's all for today. In the next issue we will continue 
to publish books Leont'eva. Next will be considered by the 
remaining restarts Level DOS.SYS numbered from # 10 to # 1F.


     We will be glad to hear your feedback
and suggestions, as well as you noticed errors, ambiguities and 
errors are inevitable in the writing and preparation of such 
texts. 

     Write, call us or to the Editor
magazine, remember that it is due
your interest in our system, it is up to
still exists and develops.

_______________________________





Other articles:

Today in the room - the contents of the magazine.

Authors - The authors of the journal ZX-Format No.6

From the authors - the long awaited event finally happened ...

Toys - The last iron (short story on the game 48 irons).

Toys - Many Adventures of Winnie the Pooh. Part Two.

Toys - the game description The Crypt (Castle Master 2).

Toys - description editor Adeventyur - PAW (Part 1).

Toys - description editor Adeventyur - PAW (Part 2).

Toys - description editor Adeventyur - PAW (Part 3).

Toys - description editor Adeventyur - PAW (part 4).

Toys - description editor Adeventyur - PAW (Part 5).

Programmers - Beta Basic: continued talking about BASIC (Part 2).

Programmers - General Sound: Programming Guide.

Programmers - MMD - the driver. Description of the structure of the modem driver for the terminal program MMD.

Programmers - AI on B. Mednonogova. A detailed description of the "wave of the algorithm" trace (automatic calculation of optimal) path, with an example implementation at Basic.

Programmers - Artificial Intelligence. Continuation of a series of articles about "AI". General basis for finding the way to goal.

Programmers - Tr-Dos for programmers. Max Petrov concludes his story about nontraditional methods of work with the disk.

Programmers - sharing experiences: "3-colour". Description of the effect of colors on 8-point ", help to the viewer, and how many words on the conversion of images in format "3-colour".

Programmers - sharing experiences: "3-colour". A few words about converting images in the format of RGB.

Programmers - the exchange of experience: programming Multicolor effects.

IS-DOS - users: how to personalize your system IS-DOS on a specific model of ZX Spectrum-compatible PC and to perform your tasks.

IS-DOS - users: how to copy the system disk IS-DOS and stay with the dead.

IS-DOS - the programmer: a short course - programming in IS-DOS.

IS-DOS - news: new software IS-DOS.

Iron - A short story about the capabilities of the processor Z-180.

Iron - Multiviewer. Description dorabotochki allowing to measure the speed of programs to curb without climbing in the codes - an easy push of a button.

Iron - A new project the firm Peters - "Sprinter". New Spectrum-compatible PC with a new generation of Speccy.

Iron - Opinions about skorpionovskom controller IDE HDD - SMUC.

Iron - SuperSpectrum: one project Spectrum-compatible machines. Its feature is compatible with the PC.

Iron - X-Trade FAQ. Answers to frequently asked questions on the GS and XTR-modem.

Premiere - Flash tracker. Description 4-channel editor of digital music, working with SoundDrive, from the author SoundDrive - Flash Inc.

Premiere - Description of the latest version of the universal terminal program used in SpbZxNet.

Premiere - Mortal Kombat: what awaits you in the full version of the game and some comments to the demo version.

Premiere - XReversy: presentation of a new toy from the popular family of "Solve puzzle - see the picture."

Interview - An interview with one of the most famous spektrumistov - Andrew Larchenko.

It was you - The story "Absolute Power".

It was you - The story "The Road".

It was you - Lord of the teeth: a parody of a popular trilogy ...

Mail - Contact us: an e-mail Alex'a from Nizhny Tagil, exhibited in the last room at the Corner of lamer. "

Mail - Letters from readers: Andrei Yakovlev, Denis Tokarchuk, Alex Garkulim, Alexander Gordeev, Evgenii Shumilov Nitochkin Vadim, Michael Larkin.

Mail - free advertising and announcements.

Miscellaneous - Scarecrow.: Nemo talks about the place of the PC and Spectrum in the modern Russia.

Miscellaneous - Review of Nemo in the book on digital circuitry. For anyone who has ever ever been tempted to turn on the soldering iron and ...

Miscellaneous - Questionnaire: Results of our poll spektrumistov.

Miscellaneous - Competition. A brief account of our contests.

Miscellaneous - The problems of the software market: when zagnetsya Spectrum. All over whether to blame hackers?

Miscellaneous - Outlook software. A brief overview of the forthcoming software: Fast Tracker, Pro Sound Creator, Black Crow.

Miscellaneous - Outlook software. Adventyura From Beyond or outside. "

Miscellaneous - A Memoir of the Peter modem network for ZX Spectrum - SPbZXNet.

Amiga Club - Between Us, by users: a comparison of characteristics of the Amiga 1200 with the IBM PC.

Amiga Club - compare the performance of Amigo and PC. As far as Amiga relevant in today's games?


Темы: Игры, Программное обеспечение, Пресса, Аппаратное обеспечение, Сеть, Демосцена, Люди, Программирование

Similar articles:
Our news - A couple of comments the newspaper X-FILES.
Contacts - List of Honored Members AC Edit.

В этот день...   29 April