Look at this block in the bios:
mov ah, 0
cpu 186
shl ax, 9
extended_read_disk
shr ax, 9
cpu 8086
mov ah, 0x02 ; Put read code back
cmp al, 0
je rd_error
The extended_read_disk instruction writes the error to AL. But right after the read we shift AX back 9 bits to right (shr ax, 9) which overrides AL. So what's even the point of cmp al, 0 and setting AL in extended_read_disk?
And even when you fix the bios, the read function in 8086tiny.c is still wrong. You use AX as length to read. But read() returns, for example 512, which is 0 inside AL because of the overflow. So even if we don't shift bits after the read AL indicates "error".
Look at this block in the bios:
The
extended_read_diskinstruction writes the error toAL. But right after the read we shiftAXback 9 bits to right (shr ax, 9) which overridesAL. So what's even the point ofcmp al, 0and settingALinextended_read_disk?And even when you fix the bios, the read function in
8086tiny.cis still wrong. You useAXas length to read. Butread()returns, for example 512, which is0insideALbecause of the overflow. So even if we don't shift bits after the readALindicates "error".