24.01.2014 Views

Codice

Codice

Codice

SHOW MORE
SHOW LESS

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

Hooray! Your file is uploaded and ready to be published.

Saved successfully!

Ooh no, something went wrong!