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  Содержание