Create successful ePaper yourself
Turn your PDF publications into a flip-book with our unique Google optimized e-Paper software.
254 volume VI os16<br />
Script e sorgenti del kernel 255<br />
«<br />
«<br />
1290015 | dsk_table[1].heads = 2;<br />
1290016 | dsk_table[1].sectors = 18;<br />
1290017 | dsk_table[1].retry = 3;<br />
1290018 | dsk_reset (2);<br />
1290019 | dsk_table[2].bios_drive = 0x80; // C: like a 2880 Kibyte floppy disk.<br />
1290020 | dsk_table[2].cylinders = 80;<br />
1290021 | dsk_table[2].heads = 2;<br />
1290022 | dsk_table[2].sectors = 36;<br />
1290023 | dsk_table[2].retry = 3;<br />
1290024 | dsk_reset (3);<br />
1290025 | dsk_table[3].bios_drive = 0x81; // D: like a 2880 Kibyte floppy disk.<br />
1290026 | dsk_table[3].cylinders = 80;<br />
1290027 | dsk_table[3].heads = 2;<br />
1290028 | dsk_table[3].sectors = 36;<br />
1290029 | dsk_table[3].retry = 3;<br />
1290030 |}<br />
104.5.30 kernel/ibm_i86/dsk_table.c<br />
Si veda la sezione 103.4.<br />
1300001 |#include <br />
1300002 |//----------------------------------------------------------------------<br />
1300003 |dsk_t dsk_table[DSK_MAX];<br />
104.5.31 kernel/ibm_i86/dsk_write_bytes.c<br />
Si veda la sezione 103.4.<br />
1320025 | buffer, n_sectors - remaining);<br />
1320026 | }<br />
1320027 | return (status);<br />
1320028 | }<br />
1320029 | else<br />
1320030 | {<br />
1320031 | for (retry = 0; retry < dsk_table[drive].retry; retry++)<br />
1320032 | {<br />
1320033 | status = int13_03 (dsk_table[drive].bios_drive, n_sectors,<br />
1320034 | chs.cylinder, chs.head, chs.sector,<br />
1320035 | buffer);<br />
1320036 | status = status & 0x00F0;<br />
1320037 | if (status == 0)<br />
1320038 | {<br />
1320039 | break;<br />
1320040 | }<br />
1320041 | else<br />
1320042 | {<br />
1320043 | dsk_reset (drive);<br />
1320044 | }<br />
1320045 | }<br />
1320046 | }<br />
1320047 | if (status == 0)<br />
1320048 | {<br />
1320049 | return (0);<br />
1320050 | }<br />
1320051 | else<br />
1320052 | {<br />
1320053 | return (-1);<br />
1320054 | }<br />
1320055 |}<br />
«<br />
1310001 |#include <br />
1310002 |#include <br />
1310003 |#include <br />
1310004 |#include <br />
1310005 |#include <br />
1310006 |//----------------------------------------------------------------------<br />
1310007 |size_t<br />
1310008 |dsk_write_bytes (int drive, off_t offset, void *buffer, size_t count)<br />
1310009 |{<br />
1310010 | unsigned char *data_buffer = (unsigned char *) buffer;<br />
1310011 | int status;<br />
1310012 | unsigned int sector;<br />
1310013 | unsigned char sector_buffer[DSK_SECTOR_SIZE];<br />
1310014 | int i;<br />
1310015 | int j = 0;<br />
1310016 | size_t k = 0;<br />
1310017 | size_t m = 0;<br />
1310018 |<br />
1310019 | sector = offset / DSK_SECTOR_SIZE;<br />
1310020 | i = offset % DSK_SECTOR_SIZE;<br />
1310021 | status = dsk_read_sectors (drive, sector, sector_buffer, 1);<br />
1310022 |<br />
1310023 | if (status != 0)<br />
1310024 | {<br />
1310025 | return ((size_t) 0);<br />
1310026 | }<br />
1310027 |<br />
1310028 | while (count)<br />
1310029 | {<br />
1310030 | m = k;<br />
1310031 | for (; i < DSK_SECTOR_SIZE && count > 0;<br />
1310032 | i++, j++, k++, count--, offset++)<br />
1310033 | {<br />
1310034 | sector_buffer[i] = data_buffer[j];<br />
1310035 | }<br />
1310036 | status = dsk_write_sectors (drive, sector, sector_buffer, 1);<br />
1310037 | if (status != 0)<br />
1310038 | {<br />
1310039 | return (m);<br />
1310040 | }<br />
1310041 | if (count)<br />
1310042 | {<br />
1310043 | sector = offset / DSK_SECTOR_SIZE;<br />
1310044 | i = offset % DSK_SECTOR_SIZE;<br />
1310045 | status = dsk_read_sectors (drive, sector, sector_buffer, 1);<br />
1310046 | if (status != 0)<br />
1310047 | {<br />
1310048 | return (m);<br />
1310049 | }<br />
1310050 | }<br />
1310051 | }<br />
1310052 | return (k);<br />
1310053 |}<br />
1310054 |<br />
1310055 |<br />
104.5.32 kernel/ibm_i86/dsk_write_sectors.c<br />
Si veda la sezione 103.4.<br />
1320001 |#include <br />
1320002 |#include <br />
1320003 |#include <br />
1320004 |#include <br />
1320005 |#include <br />
1320006 |//----------------------------------------------------------------------<br />
1320007 |int<br />
1320008 |dsk_write_sectors (int drive, unsigned int start_sector, void *buffer,<br />
1320009 | unsigned int n_sectors)<br />
1320010 |{<br />
1320011 | int status;<br />
1320012 | unsigned int retry;<br />
1320013 | unsigned int remaining;<br />
1320014 | dsk_chs_t chs;<br />
1320015 | dsk_sector_to_chs (drive, start_sector, &chs);<br />
1320016 | remaining = dsk_table[drive].sectors - chs.sector + 1;<br />
1320017 | if (remaining < n_sectors)<br />
1320018 | {<br />
1320019 | status = dsk_write_sectors (drive, start_sector,<br />
1320020 | buffer, remaining);<br />
1320021 | if (status == 0)<br />
1320022 | {<br />
1320023 | status = dsk_write_sectors (drive,<br />
1320024 | start_sector + remaining,<br />
104.5.33 kernel/ibm_i86/irq_off.c<br />
Si veda la sezione 103.4.<br />
1330001 |#include <br />
1330002 |#include <br />
1330003 |#include <br />
1330004 |#include <br />
1330005 |#include <br />
1330006 |//----------------------------------------------------------------------<br />
1330007 |void<br />
1330008 |irq_off (unsigned int irq)<br />
1330009 |{<br />
1330010 | unsigned int mask;<br />
1330011 | unsigned int status;<br />
1330012 | if (irq > 7)<br />
1330013 | {<br />
1330014 | return; // Only XT IRQs are handled.<br />
1330015 | }<br />
1330016 | else<br />
1330017 | {<br />
1330018 | mask = (1 7)<br />
1340013 | {<br />
1340014 | return; // Only XT IRQs are handled.<br />
1340015 | }<br />
1340016 | else<br />
1340017 | {<br />
1340018 | mask = ~(1