ZX Format #06
29 июля 1997 |
|
IS-DOS - 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:
Similar articles:
В этот день... 23 November