Date: Thursday, 7 January 1988 From: Mark Dapoz Re: Z80DOS Bug Report The distributed versions of Z80DOS (both version 1.0 and 1.1) have a slight problem when a read or write error occurs. When a disk error occurs, your machine will most likely crash (if you're lucky) but in some instances it will continue to run, but with unpredictable results. An examination of the code within Z80DOS reveals a rather serious bug within the error recovery/ reporting routine. As can be seen from the code in example 1 (taken from the Z80DDISK.Z80 file), the HL register pair is loaded with the contents of the address specified by the RDERR (or WRTERR) label. Later, in the error recovery routine, execution is passed to the address contained in the HL register pair. This clearly does not work as it has the result of performing a double indirect jump whereas what was really intended was a single indirect jump. To fix the problem, you must modify the code to read as in example 2. It would be appreciated if this information could be passed on to the author so that it may be included in any future releases. -Mark Example 1 - Original code with bug present ; ; Read sector from drive ; ; readr and writer modified to give separate error message--b.h. ; READR: CALL READ ; BIOS call read sector LD HL,(RDERR) JR WRITE0 ; Test exit code ; ; Write sector on drive ; WRITER: CALL WRITE ; BIOS call write sector LD HL,(WRTERR) WRITE0: OR A ; Test exit code RET Z ; Exit if ok LD (RETFLG),A ; Allow retry for read/write errors JP (HL) ; DOS error on d: write error Example 2 - New code with bug fixed ; ; Read sector from drive ; ; readr and writer modified to give separate error message--b.h. ; readr: call read ; BIOS call read sector ld hl,rderr ; Fix indirect load - MD jr write0 ; Test exit code ; ; Write sector on drive ; writer: call write ; BIOS call write sector ld hl,wrterr ; Fix indirect load - MD write0: or a ; Test exit code ret z ; Exit if ok ld (retflg),a ; Allow retry for read/write errors jp (hl) ; DOS error on d: write error