Студопедия

Главная страница Случайная страница

КАТЕГОРИИ:

АвтомобилиАстрономияБиологияГеографияДом и садДругие языкиДругоеИнформатикаИсторияКультураЛитератураЛогикаМатематикаМедицинаМеталлургияМеханикаОбразованиеОхрана трудаПедагогикаПолитикаПравоПсихологияРелигияРиторикаСоциологияСпортСтроительствоТехнологияТуризмФизикаФилософияФинансыХимияЧерчениеЭкологияЭкономикаЭлектроника






Листинг 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.


Поделиться с друзьями:

mylektsii.su - Мои Лекции - 2015-2024 год. (0.005 сек.)Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав Пожаловаться на материал