Made by Vasiliy Pupkin, или паяем девайс для компа
Спецвыпуск Xakep, номер #012, стр. 012-125-4
Деееее - баг!
Еще раз убедись, что все спаяно правильно. И даже еще раз =). Проверь, что никакие контакты не замыкаются друг на друга. Ты уверен? Надежность - это сверхважно, ты сам понимаешь. Проверь все еще раз =). Аккуратно всунь плату в слот. Под микросхемы подложи какую-нибудь бумажку или свежий номер спеца, дабы на корпус не замыкало. Осторожно включи комп. Если в первую секунду работы не раздался взрыв и не полетели искры - то, значит, еще не все потеряно ;))! Уже сейчас, по идее, должны начать мигать светодиоды. Ежели они того не желают делать - многочасовая проверка и перепайка тебе помогут =). В противном случае можешь прыгать по всей комнате, хлопать в ладоши и помирать от внеземного счастья :))). Можешь смело нацарапать на плате что-нибудь вроде: "Made by C()0oJI ][axOp". Веселье кончилось.
Рутина: драйвер
Ну, писать мы будем не совсем драйвер, а просто прогу, которая будет управлять нашим с тобой творением. Прога сия будет представлять некий сырец на Борланд-Си для ДОСа с небольшими вкраплениями ассемблера. Собственно, вот ее исходник:
#include //Тут зарыта inport
void main() //тут начинаем
{char j=3; // это все равно что mov j, 00000011b
while (inport (0x60)!=1) //Пока не нажат ескейп
{for (unsigned int i=0; i<50000; i++) //особый вид задержки =)
{asm {//Вкрапления ассемблера
mov al,j //Заносим в al значение из j
mov dx,31337 //в dx - какой-нибудь несуществующий порт
out dx,al //выводим на плату... Хехехе... ;)))
}}
asm{ //еще вкрапления
rol j,1 //битовый сдвиг j влево
}}} //тут кончаем =).
Что это было? Ну вы, блин, даете...
Объясняю, что это было. Данная фигня, если ее набрать, закомпилить и запустить, будет показывать светодиодами нашего ультра-девайса бегущие огни =). Работает оно так: сначала в некую переменную j мы заносим значение 00000011, где единицы - это горящие светодиоды. Таким образом, у нас будут "бежать" рядом два "огонька". А далее - цикл, который повторяется, пока не нажат ескейп. Дело в том, что функция inport вводит значение из порта, указанного единственным параметром. А порт 0x60 - это порт контроллера клавиатуры. Он возвращает нажатую клавишу не в виде табличного значения, а в виде так называемого скан-кода. Ты уже просек, что скан-код ескейпа равен единице. Далее - особый вид задержки. Если бы мы сразу поставили вывод на плату, то мы бы получили беспорядочное мигание: глаз просто не успевал бы замечать, как загораются светодиоды. Как вывод сделан, я думаю, понятно. А вот что есть rol? Rol - это инструкция, которая выполняет битовый сдвиг влево. К примеру, в j лежит число 01100000, мы его сдвигаем, получаем 11000000, далее 10000001, а затем 00000011. Теперь ясно? Вот и славно. Компиль, запускай, наслаждайся ;))!
Засим я и закругляюсь
Вот так, теперь у тебя есть твоя собственная плата для компа. Можешь повесить ее на стенку и молиться на нее по утрам =). Все! Я пошел спать! =))))
З.Ы. Ушел. И обещал вернуться! =))
З.З.Ы. Слабо сделать еще проверку на адрес платы? =)
Назад на стр. 012-125-3 Содержание
|