Create successful ePaper yourself
Turn your PDF publications into a flip-book with our unique Google optimized e-Paper software.
246 volume VI os16<br />
Script e sorgenti del kernel 247<br />
«<br />
«<br />
«<br />
«<br />
1040024 | int #0x10<br />
1040025 | popa<br />
1040026 | popf<br />
1040027 | leave<br />
1040028 | ret<br />
104.5.5 kernel/ibm_i86/_int10_02.s<br />
Si veda la sezione 103.4.<br />
1050001 |.global __int10_02<br />
1050002 |;-----------------------------------------------------------------------<br />
1050003 |.text<br />
1050004 |;-----------------------------------------------------------------------<br />
1050005 |; INT 0x10 - video - set cursor position<br />
1050006 |; AH = 0x02<br />
1050007 |; BH = page number:<br />
1050008 |; 0-7 in modes 0 and 1<br />
1050009 |; 0-3 in modes 2 and 3<br />
1050010 |; DH = row (0x00 is top)<br />
1050011 |; DL = column (0x00 is left)<br />
1050012 |;-----------------------------------------------------------------------<br />
1050013 |.align 2<br />
1050014 |__int10_02:<br />
1050015 | enter #0, #0 ; No local variables.<br />
1050016 | pushf<br />
1050017 | cli<br />
1050018 | pusha<br />
1050019 | mov ah, #0x02<br />
1050020 | mov bh, #0x00<br />
1050021 | mov bh, 4[bp] ; 1st arg (page).<br />
1050022 | mov dx, 6[bp] ; 2nd arg (pos).<br />
1050023 | int #0x10<br />
1050024 | popa<br />
1050025 | popf<br />
1050026 | leave<br />
1050027 | ret<br />
104.5.6 kernel/ibm_i86/_int10_05.s<br />
Si veda la sezione 103.4.<br />
1060001 |.global __int10_05<br />
1060002 |;-----------------------------------------------------------------------<br />
1060003 |.text<br />
1060004 |;-----------------------------------------------------------------------<br />
1060005 |; INT 0x10 - video - select active display page<br />
1060006 |; AH = 0x05<br />
1060007 |; AL = new page number (0x00 is the first)<br />
1060008 |;-----------------------------------------------------------------------<br />
1060009 |.align 2<br />
1060010 |__int10_05:<br />
1060011 | enter #0, #0 ; No local variables.<br />
1060012 | pushf<br />
1060013 | cli<br />
1060014 | pusha<br />
1060015 | mov ah, #0x05<br />
1060016 | mov bh, 4[bp] ; 1st arg (page).<br />
1060017 | int #0x10<br />
1060018 | popa<br />
1060019 | popf<br />
1060020 | leave<br />
1060021 | ret<br />
104.5.7 kernel/ibm_i86/_int12.s<br />
Si veda la sezione 103.4.<br />
1070001 |.global __int12<br />
1070002 |;-----------------------------------------------------------------------<br />
1070003 |.text<br />
1070004 |;-----------------------------------------------------------------------<br />
1070005 |; INT 12 - bios - get memory size<br />
1070006 |; Return:<br />
1070007 |; AX = kilobytes of contiguous memory starting at absolute address<br />
1070008 |; 0x00000<br />
1070009 |;<br />
1070010 |; This call returns the contents of the word at absolute address<br />
1070011 |; 0x00413.<br />
1070012 |;-----------------------------------------------------------------------<br />
1070013 |.align 2<br />
1070014 |__int12:<br />
1070015 | enter #2, #0 ; 1 local variable.<br />
1070016 | pushf<br />
1070017 | cli<br />
1070018 | pusha<br />
1070019 | int #0x12<br />
1070020 | mov -2[bp], ax ; save AX.<br />
1070021 | popa<br />
1070022 | popf<br />
1070023 | mov ax, -2[bp] ; AX is the function return value.<br />
1070024 | leave<br />
1070025 | ret<br />
104.5.8 kernel/ibm_i86/_int13_00.s<br />
Si veda la sezione 103.4.<br />
1080001 |.global __int13_00<br />
1080002 |;-----------------------------------------------------------------------<br />
1080003 |.text<br />
1080004 |;-----------------------------------------------------------------------<br />
1080005 |; INT 0x13 - disk - reset disk system<br />
1080006 |; AH = 0x00<br />
1080007 |; DL = drive (if bit 7 is set both hard disks and floppy disks<br />
1080008 |; reset)<br />
1080009 |; Return:<br />
1080010 |; AH = status<br />
1080011 |; CF clear if successful (returned AH=0x00)<br />
1080012 |; CF set on error<br />
1080013 |;-----------------------------------------------------------------------<br />
1080014 |.align 2<br />
1080015 |__int13_00:<br />
1080016 | enter #2, #0 ; 1 local variable.<br />
1080017 | pushf<br />
1080018 | cli<br />
1080019 | pusha<br />
1080020 | mov ah, #0x00<br />
1080021 | mov dl, 4[bp] ; 1st arg.<br />
1080022 | int #0x13<br />
1080023 | mov al, #0x00<br />
1080024 | mov -2[bp], ax ; save AX.<br />
1080025 | popa<br />
1080026 | popf<br />
1080027 | mov ax, -2[bp] ; AX is the function return value.<br />
1080028 | leave<br />
1080029 | ret<br />
104.5.9 kernel/ibm_i86/_int13_02.s<br />
Si veda la sezione 103.4.<br />
1090001 |.global __int13_02<br />
1090002 |;-----------------------------------------------------------------------<br />
1090003 |.text<br />
1090004 |;-----------------------------------------------------------------------<br />
1090005 |; INT 0x13 - disk - read sectors into memory<br />
1090006 |; AH = 0x02<br />
1090007 |; AL = number of sectors to read (must be nonzero)<br />
1090008 |; CH = cylinder number (0-255)<br />
1090009 |; CL bit 6-7 =<br />
1090010 |; cylinder number (256-1023)<br />
1090011 |; CL bit 0-5 =<br />
1090012 |; sector number (1-63)<br />
1090013 |; DH = head number (0-255)<br />
1090014 |; DL = drive number (bit 7 set for hard disk)<br />
1090015 |; ES:BX -> data buffer<br />
1090016 |; Return:<br />
1090017 |; CF set on error<br />
1090018 |; CF clear if successful<br />
1090019 |; AH = status (0x00 if successful)<br />
1090020 |; AL = number of sectors transferred (only valid if CF set for<br />
1090021 |; some BIOSes)<br />
1090022 |;-----------------------------------------------------------------------<br />
1090023 |.align 2<br />
1090024 |__int13_02:<br />
1090025 | enter #2, #0 ; 1 local variable.<br />
1090026 | pushf<br />
1090027 | cli<br />
1090028 | pusha<br />
1090029 | mov ax, ds ; Set ES the same as DS.<br />
1090030 | mov es, ax ;<br />
1090031 | mov ax, 8[bp] ; 3rd arg (cylinder). It must be splitted and<br />
1090032 | mov ch, al ; assigned to the right registers.<br />
1090033 | mov cl, ah ;<br />
1090034 | shl cl, 1 ;<br />
1090035 | shl cl, 1 ;<br />
1090036 | shl cl, 1 ;<br />
1090037 | shl cl, 1 ;<br />
1090038 | shl cl, 1 ;<br />
1090039 | shl cl, 1 ;<br />
1090040 | add cl, 12[bp] ; 5th arg (sector).<br />
1090041 | mov dl, 4[bp] ; 1st arg (drive).<br />
1090042 | mov al, 6[bp] ; 2nd arg (sectors to be read).<br />
1090043 | mov dh, 10[bp] ; 4th arg (head).<br />
1090044 | mov bx, 14[bp] ; 6th arg (buffer pointer).<br />
1090045 | mov ah, #0x02<br />
1090046 | int #0x13<br />
1090047 | mov -2[bp], ax ; save AX.<br />
1090048 | popa<br />
1090049 | popf<br />
1090050 | mov ax, -2[bp] ; AX is the function return value.<br />
1090051 | leave<br />
1090052 | ret<br />
104.5.10 kernel/ibm_i86/_int13_03.s<br />
Si veda la sezione 103.4.<br />
1100001 |.global __int13_03<br />
1100002 |;-----------------------------------------------------------------------<br />
1100003 |.text<br />
1100004 |;-----------------------------------------------------------------------<br />
1100005 |; INT 0x13 - disk - write sectors to disk<br />
1100006 |; AH = 0x03<br />
1100007 |; AL = number of sectors to write (must be nonzero)<br />
1100008 |; CH = cylinder number (0-255)<br />
1100009 |; CL bit 6-7 =<br />
1100010 |; cylinder number (256-1023)<br />
1100011 |; CL bit 0-5 =<br />
1100012 |; sector number (1-63)<br />
1100013 |; DH = head number (0-255)<br />
1100014 |; DL = drive number (bit 7 set for hard disk)<br />
1100015 |; ES:BX -> data buffer<br />
1100016 |; Return:<br />
1100017 |; CF set on error<br />
1100018 |; CF clear if successful<br />
1100019 |; AH = status (0x00 if successful)<br />
1100020 |; AL = number of sectors transferred (only valid if CF set for<br />
1100021 |; some BIOSes)<br />
1100022 |;-----------------------------------------------------------------------<br />
1100023 |.align 2<br />
1100024 |__int13_03:<br />
1100025 | enter #2, #0 ; 1 local variable.<br />
1100026 | pushf<br />
1100027 | cli<br />
1100028 | pusha<br />
1100029 | mov ax, ds ; Set ES the same as DS.<br />
1100030 | mov es, ax ;<br />
1100031 | mov ax, 8[bp] ; 3rd arg (cylinder). It must be splitted and<br />
1100032 | mov ch, al ; assigned to the right registers.<br />
1100033 | mov cl, ah ;<br />
1100034 | shl cl, 1 ;<br />
1100035 | shl cl, 1 ;<br />
1100036 | shl cl, 1 ;<br />
«<br />
«