Более подробно библиотека dos.h
Сейчас, товарищи грешники, мы рассмотрим некоторые очень хорошие функции библиотеки dos.h Только ВНИМАНИЕ!!! С некоторыми из них лучше не баловаться, иначе пиздой накроется ваш компутцэр. Всё, предупредил... теперь буду мучится, что не спалил столько компов 8( Конкретно, мы рассмотрим функции delay(), sound(), nosound(), peek(), peekb(), poke(), pokeb(), inport(), inportb(), outport(), outportb() и иже с ними.
Сначала мы будем насиловать бипер. Нет, мальчик, я не извращенец (может только чуть-чуть). Извращенцы насилуют маленьких девочек в лифте. 8)) Сразу предупрежу ещё вот о чём, все эти функции пашут только на DOS платформе. Для винды разговор совсем другой, он у нас ещё будет. Пример:
#include <dos.h>
main() {
sound(14000);
delay(10000);
nosound();
}
В данном случае функция sound(14000); выдаёт через системный динамик (aka бипер) звук с частотой 14000 Hz (aka "звон в ушах"), а функция delay(10000); приостанавливает работу программы на 10000 милисекунд, дабы дать нам наслодится этим звуком. После чего, функция nosound(); вырубает бипер. Как говорится, концерт окончен - скрипки в печку :)) Усложним задачку:
#include <dos.h>
main() {
int x;
for(x=0;x<=13000;x++){
sound(x);
delay(100);
}
nosound();
}
Весело правда? :)) Когда я её тестил у меня предки орали истошнее бипера :)))) Таксь, далее на повестке дня работа с памятью. Вот вам примерчик... я надеюсь, что вы знаете что статус "лампочек" клавиатуры хранится в памяти по адресу 0х0417:
#include <dos.h>
#include <conio.h>
main() {
poke(0x0000,0x0417,16);
}
Разъясняю: функция poke(0x0000,0x0417,16); записала в память по адресу 0000:0417 значение 70, тем самым включив все лампочки. Вот вам пример на использование функции peek():
#include <dos.h>
#include <stdio.h>
main() {
int x;
x=peek(0x0000,0x0417);
if(x==0x00) printf("All lights off");
if(x==0x20) printf("Num lock on");
if(x==0x40) printf("Caps lock on");
if(x==0x10) printf("Scroll lock on");
if(x==0x70) printf("All lights on");
delay(300);
}
Элементарно. А теперь смертельный номер, работа с портами... Но сначала, краткий экскурс в компутцерные кишки: Все устройства компа принято делить на внутрение и внешние.Внутрение устройства - это сам процессор и оперативная память, а внешние - это все остальные устройства (клава, монитор, принтер, HDD и т.п.). Поэтому под вводом-выводом подрозумевается обмен информацией между процом и внешним устройством. Передача этой информации происходит через порты. Порт - это некоторый регистр размером в байт (иногда два соседних регистра считаются портом размером в слово) находящийся вне пределов проца. Порты нумеруются от 0х00 до 0хFFFF. С каждым внешним устройством связан порт или несколько портов, их номера заранее известны. Как и проц внешнее устройство может записывать информацию в порт и может считывать. Соответствено ввод-вывод для ясности рассчитываются со стороны процессора - ввод это считывание из порта в проц, а вывод - запись из проца в порт. И хотя сценарий вводы-вывода через порты зависит от специфики того устройства с которым идёт обмен данными, всё же типичным является следующий сценарий. Проц связан с внешним устройством (к примеру с принтером) двумя портами - портом управления и портом данных. Когда проц хочет начать обмен с устройством данными он записывает в управляющий порт призыв к установлению связи. Если устойство функционирует и не занято, оно записывает в порт сигнал готовности. Проц считав этот сигнал записывает в порт данных данные :)) (например код символа), а впорт управления коменду "читать". Внешние устройство считывает эту коменду, записывает в порт управления сигнал занято, считывает из порта данных код символа и начинает его печатать. Проц в это время опрашивает в цикле порт управления. Пока устройство не запишет в порт сигнал об успешном завершении работы или сигнал об ошибке (бумага порвалась). Вот вам пример на считывание данных из порта:
#include <stdio.h>
#include <dos.h>
main() {
int result;
int port = 0x70;
result = inport(port);
printf("Word read from port %d = 0x%X\n", port, result);
getchar();
}
А вот пример на запись:
#include <conio.h>
#include <stdio.h>
main() {
int port = 0;
int value = 'C';
outport(port, value);
printf("Value %d sent to port number %d\n", value, port);
}
И в первом и во втором случае всё просто и понятно. Функции peekb(), pokeb(), inportb(), outportb() отличаются от функций peek(), poke(), inport(), outport() только тем, что первые работают с байтами, а вторые со словами (2 байта).