explain this code

Question about which tools to use, bugs, the best way to implement a function, etc should go here. Don't forget to see if your question is answered in the wiki first! When in doubt post here.
Post Reply
adeelmahmood1

explain this code

Post by adeelmahmood1 »

hi
can some one plz explain this code for me .. may be its self explainatory for u but not for me coz i m a beginner so plz explain every line in it ...boot loader is using this code to load kenel ....
here it goes...

read:
mov ax, 1000h ; ES:BX = 1000:0000
mov es, ax
mov bx, 0
mov ah, 2 ; Load disk data to ES:BX
mov al, 5
mov ch, 0
mov cl, 2
mov dh, 0
mov dl, 0
int 13h ; Read!

jc read ; ERROR => Try again

thanx for ur help
dronkit

Re:explain this code

Post by dronkit »

This code just calls BIOS int 13h, which handles disks, and floppys

ah holds the function you want to access, the other registers are loaded with other parameters needed by the function.

ah=2 is for reading sectors from disk into memory.

From: http://www.ctyme.com/intr/rb-0607.htm
DISK - READ SECTOR(S) INTO MEMORY
AH = 02h
AL = number of sectors to read (must be nonzero)
CH = low eight bits of cylinder number
CL = sector number 1-63 (bits 0-5)
high two bits of cylinder (bits 6-7, hard disk only)
DH = head number
DL = drive number (bit 7 set for hard disk)
ES:BX -> data buffer
Return:
CF set on error if AH = 11h (corrected ECC error), AL = burst length CF clear if successful AH = status (see #00234) AL = number of sectors transferred (only valid if CF set for some BIOSes) Notes:
Errors on a floppy may be due to the motor failing to spin up quickly
enough; the read should be retried at least three times, resetting
the disk with AH=00h between attempts.
Most BIOSes support "multitrack" reads, where the value in AL
exceeds the number of sectors remaining on the track, in which
case any additional sectors are read beginning at sector 1 on
the following head in the same cylinder; the MSDOS CONFIG.SYS command
MULTITRACK (or the Novell DOS DEBLOCK=) can be used to force DOS to
split disk accesses which would wrap across a track boundary into two
separate calls.
The IBM AT BIOS and many other BIOSes use only the low four bits of
DH (head number) since the WD-1003 controller which is the standard
AT controller (and the controller that IDE emulates) only supports
16 heads.
AWARD AT BIOS and AMI 386sx BIOS have been extended to handle more
than 1024 cylinders by placing bits 10 and 11 of the cylinder number
into bits 6 and 7 of DH.
Under Windows95, a volume must be locked (see INT 21/ AX=440Dh/CX=084Bh)
in order to perform direct accesses such as INT 13h reads and writes.
All versions of MS-DOS (including MS-DOS 7 [Windows 95]) have a bug
which prevents booting on hard disks with 256 heads (FFh), so many
modern BIOSes provide mappings with at most 255 (FEh) heads.
Some cache drivers flush their buffers when detecting that DOS is
bypassed by directly issuing INT 13h from applications. A dummy
read can be used as one of several methods to force cache
flushing for unknown caches (e.g. before rebooting).
BUGS:
When reading from floppies, some AMI BIOSes (around 1990-1991) trash
the byte following the data buffer, if it is not arranged to an even
memory boundary. A workaround is to either make the buffer word
aligned (which may also help to speed up things), or to add a dummy
byte after the buffer..
MS-DOS may leave interrupts disabled on return from this function..
Apparently some BIOSes or intercepting resident software have bugs
that may destroy DX on return or not properly set the Carry flag.
At least some Microsoft software frames calls to this function with
PUSH DX, STC, INT 13h, STI, POP DX..
On the original IBM AT BIOS (1984/01/10) this function does not disable
interrupts for harddisks (DL >= 80h). On these machines the MS-DOS/
PC DOS IO.SYS/ IBMBIO.COM installs a special filter to bypass the
buggy code in the ROM (see CALL F000h:211Eh)
See Also:
AH=03h - AH=0Ah - AH=06h"V10DISK.SYS" - AH=21h"PS/1" - See Also:
INT 21/AX=440Dh/CX=084Bh - INT 4D/ AH=02h
Category: Bios
- Int 13h
- D
Tom

Re:explain this code

Post by Tom »

hmmm I think that's my code...I'll change the comments on the next release...

That loads a C kernel, mine if that's the FritzOS code.
all that stuff tells the BIOS to load the next sector on the disk. The first sector is the bootsector, the sector after that is the FritzOS C kernel
adeelmahmood1

Re:explain this code

Post by adeelmahmood1 »

yup tom thats ur code and its good but u didnt wrote much comments thats why i posted it again to see how it works ..
well thanx for explaining this code both of u .. thanx
Post Reply