Главная страница Случайная страница КАТЕГОРИИ: АвтомобилиАстрономияБиологияГеографияДом и садДругие языкиДругоеИнформатикаИсторияКультураЛитератураЛогикаМатематикаМедицинаМеталлургияМеханикаОбразованиеОхрана трудаПедагогикаПолитикаПравоПсихологияРелигияРиторикаСоциологияСпортСтроительствоТехнологияТуризмФизикаФилософияФинансыХимияЧерчениеЭкологияЭкономикаЭлектроника |
Листинг 9.1. Выделение памяти для CT-VOICE.DRV.
/////////////////////////////////////////////////////////////// void Voc_Load_Driver(void) // загрузить ct-voice.drv int driver_handle; unsigned errno, segment, offset, num_para, bytes_read; // открыть файл драйвера _dos_open(" CT-VOICE.DRV", _O_RDONLY, & driver_handle); // выделить память num_para = 1 + (filelength(driver_handle))/16; _dos_allocmem(num_para, & segment); //установить указатель на область данных драйвера _FE_SEG(driver_ptr) = segment; _FP_OFF(driver_ptr) = 0; // загрузить код драйвера data_ptr = driver_ptr; do { _dos_read(driver_handle, data_ptr, 0х4000, & bytes_read); data_ptr += bytes_read; } while (bytes_read==0x4000); // закрыть файл _dos_close(driver_handle); } // конец функции Мы можем разбить функцию из Листинга 9.1 на три части: § Вначале мы открываем файл CT-VOICE.DRV в чисто двоичном режиме.Мы не должны делать никаких преобразований символов - это было бы катастрофой! Мы же читаем реальный код, а не ASCII-файл; § Затем программа вычисляет длину файла и выделяет под него соответствующее количество памяти. Отметим, что мы резервируем память блоками, причем каждый блок — это параграф из 16 байт; § Наконец, драйвер загружается по 32К за один прием. Эта одно из замечательных отличий функции _dos_read () от стандартной функции getch(): мы можем читать большие куски кода за один раз. Теперь, после загрузки драйвера мы должны сохранить указатель так, чтобы впоследствии можно было найти начало драйвера. Этот указатель мы будем хранить в виде глобальной переменной с именем driver_ptr. (Я думаю, что это имя достаточно содержательно.) Замечание Давайте немного отвлечемся. Когда вы пишете компьютерные игры (или любое другое программное обеспечение), пожалуйста, используйте такие имена файлов и функций, которые несут смысловую нагрузку и отражают назначение объекта. Постарайтесь избегать таких имен, как t, j, k и им подобных. Используйте имена типа index_1, sprite_alive и так далее. Поверьте моему опыту: когда вы закончите писать компьютерную игру и вернетесь к ней через неделю, вы подумаете: «Не Фон Нейман ли это написал, да здесь сам черт ногу сломит!» Ведь если вы используете иероглифы вместо имен, кто кроме специалиста по иероглифам сможет в.них разобраться? Правильно? Тогда вернемся к нашим баранам. Верите вы или нет, но загрузка драйвера была самой трудной частью. Посмотрим на код для загрузки VOC-файла. Он выглядит точно так же, как и функция загрузки драйвера. То есть мы должны: § Открыть файл в бинарном режиме; § Отвести под него память; § Загрузить VOC-файл в отведенный буфер. Это делает функция Листинга 9.2.
|