Последние записи
- Исходник программы «азбука Морзе»
- Рассылка. Выпуск 139
- Как в коснольном приложении открыть диалог сохранения?
- Поддержка drag and drop для Tlistview?
- Создание структуры бд для рерайтера
- Получить набираемое слово в memo
- Записать StringGrid1 в двумерный массив
- Вычислить контрольную сумму строки
- Программный подсчёт комбинаций и вероятностей в покере, создание покер бота
- Завтра отменят службу в армии. А вы еще служите или служили. вам обидно будет?
15th
Июн
3D НЕБО в DELPHI
Здравствуйте уважаемые программисты, я пишу 3D движок и столкнулся с проблемой, как делать небо?
Если можно, то скажите как рисуется небо в авиа симуляторах?
Метод CubeMap, берешь 6 картиночек CubeMap, грузишь их при создании сцены и обрабатываешь типа:
Код:
procedure DrawSkyBox; begin glColor3f(0.3,0.3,0.3); glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE);
glPushMatrix; glTranslatef(Scene1.Player.x,Scene1.Player.y,Scene1.Player.z);
glBindTexture(GL_TEXTURE_2D,Tex[SB_BACK]);
glBegin(GL_QUADS);
glTexCoord2f(1, 0); glVertex3f(-SkyRad, -SkyRad, SkyRad);
glTexCoord2f(0, 0); glVertex3f(SkyRad, -SkyRad, SkyRad);
glTexCoord2f(0, 1); glVertex3f(SkyRad, SkyRad, SkyRad);
glTexCoord2f(1, 1); glVertex3f(-SkyRad, SkyRad, SkyRad);
glEnd;
glBindTexture(GL_TEXTURE_2D,Tex[SB_FRONT]);
glPushMatrix;
glRotatef(180, 0, 1, 0);
glBegin(GL_QUADS);
glTexCoord2f(1, 0); glVertex3f(-SkyRad, -SkyRad, SkyRad);
glTexCoord2f(0, 0); glVertex3f(SkyRad, -SkyRad, SkyRad);
glTexCoord2f(0, 1); glVertex3f(SkyRad, SkyRad, SkyRad);
glTexCoord2f(1, 1); glVertex3f(-SkyRad, SkyRad, SkyRad);
glEnd;
glPopMatrix;
glBindTexture(GL_TEXTURE_2D,Tex[SB_LEFT]);
glPushMatrix;
glRotatef(-90, 0, 1, 0);
glBegin(GL_QUADS);
glTexCoord2f(1, 0); glVertex3f(-SkyRad, -SkyRad, SkyRad);
glTexCoord2f(0, 0); glVertex3f(SkyRad, -SkyRad, SkyRad);
glTexCoord2f(0, 1); glVertex3f(SkyRad, SkyRad, SkyRad);
glTexCoord2f(1, 1); glVertex3f(-SkyRad, SkyRad, SkyRad);
glEnd;
glPopMatrix;
glBindTexture(GL_TEXTURE_2D,Tex[SB_RIGHT]);
glPushMatrix;
glRotatef(90, 0, 1, 0);
glBegin(GL_QUADS);
glTexCoord2f(1, 0); glVertex3f(-SkyRad, -SkyRad, SkyRad);
glTexCoord2f(0, 0); glVertex3f(SkyRad, -SkyRad, SkyRad);
glTexCoord2f(0, 1); glVertex3f(SkyRad, SkyRad, SkyRad);
glTexCoord2f(1, 1); glVertex3f(-SkyRad, SkyRad, SkyRad);
glEnd;
glPopMatrix;
glBindTexture(GL_TEXTURE_2D,Tex[SB_TOP]);
glPushMatrix;
glRotatef(-90, 1, 0, 0);
glBegin(GL_QUADS);
glTexCoord2f(0, 0); glVertex3f(-SkyRad, -SkyRad, SkyRad);
glTexCoord2f(0, 1); glVertex3f(SkyRad, -SkyRad, SkyRad);
glTexCoord2f(1, 1); glVertex3f(SkyRad, SkyRad, SkyRad);
glTexCoord2f(1, 0); glVertex3f(-SkyRad, SkyRad, SkyRad);
glEnd;
glPopMatrix;
glBindTexture(GL_TEXTURE_2D,Tex[SB_BOTTOM]);
glPushMatrix;
glRotatef(90, 1, 0, 0);
glBegin(GL_QUADS);
glTexCoord2f(1, 1); glVertex3f(-SkyRad, -SkyRad, SkyRad);
glTexCoord2f(1, 0); glVertex3f(SkyRad, -SkyRad, SkyRad);
glTexCoord2f(0, 0); glVertex3f(SkyRad, SkyRad, SkyRad);
glTexCoord2f(0, 1); glVertex3f(-SkyRad, SkyRad, SkyRad);
glEnd;
glPopMatrix;
glPopMatrix;
end;
end.
А т.н. окружение сцены можно делать просто скроллом картинок по небу, можно добавить 3Д анимацию. много можно чего…
14th
Июн
Анимация на ассемблере.
Смотрим идущего человечка.
code segment
ASSUME CS:code, DS:DATA_SEG, ES:NOTHING, SS:STACK_SEG
start:
MOV AX,DATA_SEG
MOV DS,AX
MOV AX,STACK_SEG
MOV SS,AX
MOV SP, OFFSET TOP_OF_STACK
MOV AX,13h
INT 10h
MOV AX,0A000h
MOV ES,AX
CLD
MOV DI,320*12
MOV BH, 48
MOVE_MASK:
MOV AL, NOM_KADR
CMP AL,0
JNZ KADR2
MOV NOM_KADR, 1
MOV SI, OFFSET H1
JMP SHOW_KADR
KADR2:
MOV NOM_KADR, 0
MOV SI, OFFSET H2
SHOW_KADR:
PUSH DI
MOV BL,13
DRAW_H:
MOV CX,12
REP MOVSB
ADD DI,320-12
DEC BL
JNZ DRAW_H
POP DI
INC DI
READ_KEY:
MOV AH,08h
INT 21h
cmp al,0 ; Проверка на расш.коды
JZ READ_KEY
cmp al, 'q'
JNZ MOVE_MASK
MOV AX,3
INT 10h
MOV AH,4Ch
INT 21h
DATA_SEG SEGMENT
H1 DB 0,0,0,0,0,9,9,9,9,0,0,0
DB 0,0,0,0,0,9,9,9,9,0,0,0
DB 0,0,0,0,0,9,9,0,0,0,0,0
DB 0,0,0,9,9,9,9,9,9,0,0,0
DB 0,0,0,9,9,9,9,9,9,0,0,0
DB 0,9,9,0,0,9,9,0,0,9,9,0
DB 0,9,9,0,0,9,9,0,0,9,9,0
DB 0,0,0,0,0,9,9,0,0,0,0,0
DB 0,0,0,0,0,9,9,0,0,0,0,0
DB 0,0,0,9,9,0,0,9,9,0,0,0
DB 0,0,0,9,9,0,0,9,9,0,0,0
DB 0,9,9,0,0,0,0,0,0,9,9,0
DB 0,9,9,0,0,0,0,0,0,9,9,0
H2 DB 0,0,0,0,0,9,9,9,9,0,0,0
DB 0,0,0,0,0,9,9,9,9,0,0,0
DB 0,0,0,0,0,9,9,0,0,0,0,0
DB 0,0,0,9,9,9,9,9,9,0,0,0
DB 0,0,0,9,9,9,9,9,9,0,0,0
DB 0,9,9,0,0,9,9,0,0,9,9,0
DB 0,9,9,0,0,9,9,0,0,9,9,0
DB 0,0,0,0,0,9,9,0,0,0,0,0
DB 0,0,0,0,0,9,9,9,9,0,0,0
DB 0,0,0,9,9,0,0,9,9,0,0,0
DB 0,0,0,9,9,0,0,9,9,0,0,0
DB 0,9,9,0,0,0,0,9,9,0,0,0
DB 0,9,9,0,0,0,0,0,0,0,0,0
NOM_KADR DB 0
DATA_SEG ENDS
STACK_SEG SEGMENT
DB 64 DUP('STACK')
TOP_OF_STACK DW ?
STACK_SEG ENDS
code ends
end start
end
14th
Разгон USB модемов
Частенько создаются темы связанные с разгоном usb- модемов, мобильных телефонов(также, используемых в качестве модемов). Здесь я предлагаю выкладывать статьи по разгону. Итак, начну первый:
Что влияет на скорость трафика? и Как повысить его скорость?
Отрицательно на скорость трафика влияют следующие показатели:
1) Погодные условия, такие как сильный снегопад, дождь, гроза, облачность, туман.
При этих условиях связь становиться хуже, так как данные явления имеют свойство поглощать часть энергии радиоволн и их отражать.
2) Зона покрытия радиоантенн(GPRS-вышек). Мощность излучения таких антенн не велика до нескольких километров в радиусе. Поэтому, там, где зона покрытия нескольких антенн – перекрещивается сигнал ОТЛИЧНЫЙ. В самой зоне сигнал так же на уровне хорошо – отлично. Так же в городе могут присутствовать и мертвые зоны, но это как правило зоны по площади незначительны и ими можно пренебречь при составлении карт покрытия GPRS. Естественно, чем Вы ближе к границе покрытия вышки, тем связь ХУЖЕ. Решением проблемы будет купить мобильник с мощным усилителем радиосвязи или же для 3G модема собрать собственный усилитель связи, в сборке он не сложный. Тут я увидел идею про то, чтобы удлинить антенну приёма, что ж, тоже сойдёт и работать будет, но не так существенно.
, поэтому3) Настройки ПК. Windows как и человек тоже любит Интернет для себя родной ворует у нас часть трафика. По умолчанию забирает 20 процентов пропускной способности в независимости от типа соединения. Для чего, Вы спросите у ProgaBita? Да ведь и так понятно для апгрейта (т.е. для автоматического обновления). Чтобы это ИСПРАВИТЬ делаем следующее:
- ПУСК
- Выполнить
- В строке набираете команду gpedit.msc
- Появиться окно «Групповая политика», в этом окне выбираете «Административные шаблоны»
- Далее «Сеть»
- Тут выбираете «Диспетчер пакетов QoS»
- Выбираете «Ограничить резервную пропускную способность»
- Появится окно «Свойств». В этом окне выбираете из трех пунктов «ВКЛЮЧЕН,» а в строке «Ограничение пропускной способности в (%)» укажите ноль.
- Далее «Применить» и потом «Ок».
Обратите внимание на то, что состояние данного свойства теперь включено. Закройте окно.
И так мы с вами увеличили скорость на 20%! Но это еще не всё!
Выбираем
- ПУСК
- Выполнить
- В строке набираете команду regedit.exe
- Появиться моё любимое окно «Редактор реестра» Windows, в нём перейдите по следующему пути
[HKEY_LOCAL_MACHINE\SYSTEM\CurrentCo ntrolSet\Services\Tcpip\Parameters]
Там найдите параметр “TcpWindowSize” (RWIN), которое определяет какой максимальный размер (в байтах) TCP/IP-пакета мы сможем принять. Чтобы не экспериментировать и подобрать оптимальное значение, нужно исходить из того, каким способом Вы подключаетесь к Интернету смотрите таблицу, которую я составил для Вас:
DSL, cabel modem:
до 512 Кбит ————-RWIN = 10164 и MTU = 1492
512 Кбит и выше —— RWIN = 13068 и MTU = 1492
1 Мбит и выше ——– RWIN = 24684 и MTU = 1492
2 Мбит и выше ——– RWIN = 47916 и MTU = 1492
3 Мбит и выше ——– RWIN = 71148 и MTU = 1492
6 Мбит и выше ——– RWIN = 140844 и MTU = 1492
16 Мбит и выше ——- RWIN = 1374616 и MTU = 1492
25 Мбит и выше ——- RWIN = 585156 и MTU = 1492
50 Мбит и выше ——- RWIN = 1168860 и MTU = 1492
100 Мбит и выше —— RWIN = 2337720 и MTU = 1492Dial-up соединение:
Интернет телефон модем (56 Кбит) —— RWIN = 7300 и MTU = 1492
ISDN один канал (64 Кбит, стандарт)—– RWIN = 2920 и MTU = 1492
ISDN два канала (128 Кбит) —————- RWIN = 4380 и MTU = 1492
GPRS (2G, 2.5G) ———————– RWIN = 10052 и MTU = 1476
EDGЕ он же E- GPRS(2.75G) ——- RWIN = 28720 и MTU = 1476
UMTS(3G) —————————— RWIN = 189552 и MTU = 1476
HSDPA(3G+, 3.5G) ——————- RWIN = 377668 и MTU = 1476
WiMax(4G) —————————– RWIN = 1176084 и MTU = 1476
Домашняя сеть (LAN) ————— RWIN = 2064440 и MTU = 1500
Значение MTU, определяет какой максимально допустимый размер (в байтах) TCP/IP-пакета, мы сможет отправить с нашего компьютера. Вообще это значение можно ставить и больше, скажем 10000 байт. Для того чтобы установить значение MTU перейдите по этому пути
[HKEY_LOCAL_MACHINE\SYSTEM\CurrentCo ntrolSet\Services\Tcpip\Parameters\ Interfaces]
А для того чтобы Винда сама автоматически определяла MTU, сделаёте следующее: переёдите по этому пути
[HKEY_LOCAL_MACHINE\SYSTEM\CurrentCo ntrolSet\Services\Tcpip\Parameters]
Найдите параметр EnablePMTUDiscovery и установите его в 1.
Перед тем как взяться за настройку пропускной способности хочу сказать вот что: подходите к делу творчески и главное разумно. Вряд ли модем рассчитанный на 56 Кбит сможет принять пакет в 10000 Кбит сразу, так Вы только затрачиваете дополнительное время на обработку запроса. Не надо весь трафик убивать только на загрузку данных, надо же что-то оставить и на запрос!
13th
Июн
Кое-что о ремонте…
Почти несерьезная статья о серьезной работе: аппаратном ремонте компьютера. Коротко рассказано об основных неисправностях компьютера, и методах их устранения. Приведены основные направления поиска неисправностей, в основном статья предназначена для начинающих ремонтников, а также тех, кто хочет отремонтировать свой компьютер, но не знает, с чего начать…
Дмитрий Дмитренко
ddn.research@gmail.com
Скажу сразу: полностью «спалить» компьютер можно только в печке, если что-то в нем выходит со строя, то обычно какая-то отдельная часть, блок, который вполне возможно восстановить собственными силами, в крайнем случае – купить. Так что, если паяльник Вы держите в руках без заметного волнения, то «лечение» Вашего доброго помощника, советчика, а для некоторых, и «сожителя», Вам очень даже по плечу! Дело за малым: определить, какая именно часть «тела» Вашего «друга» отказала.
Краткий экскурс…
Я не занимаюсь специализированным ремонтом компьютеров, сфера моей деятельности немного не та [1, если кому интересно], но у меня есть много знакомых, друзей и родственников, у которых есть компьютеры, имеющие дурную привычку ломаться. Поэтому я решил описать здесь большинство поломок, имеющих наглость встречаться лично мне. Конечно, можно было бы привести кучу скопированного текста с разных сайтов и умных книжек, но я ограничусь своим собственным мнением на эту тему.
Лично я разделяю проявления неисправностей компьютеров на следующие группы:
- Компьютер не включается (не запускается) – при этом не подаются никакие признаки жизни, максимум, что можно от него «добиться», это включения и последующего отключения. Как ни странно, но для меня такого рода поломки – одни из самых легких, хотя, частенько бывают самые материалозатратные…
- Компьютер включается, но останавливается на стадии BIOS, то есть зависает при появлении информации о системе, или до начала загрузки операционной системы на экране появляются различные сообщения с ключевыми словами «failure» или «failed», или, наконец, раздаются различные кодированные сигналы внутренним динамиком. Такие неисправности также удачно «лечатся», если знать особенности Вашей материнской платы (я имею виду расшифровки этих самых звуковых сигналов).
- Не запускается операционная система. Это, конечно, тяжелый случай, но исправимый. Если операционка не грузится, а в общем компьютер проявляет все радости жизни, то, вероятнее всего, виноваты Вы, когда беспардонно лазя по Интернету или всовывая в порты флешки и диски непроверенные антивирусом, поймали вирус, также, как и, когда удаляли какую-нибудь архисложную программу, удалили вместе с ней очень важный системный файл… Да много еще чего может быть! Я в таких случаях восстанавливаю систему, в крайнем случае – переустанавливаю. Но эту неисправность паяльником не вылечить, поэтому здесь рассматривать не будем.
- Сбои во время работы. Самая сложная неисправность, причин может быть много, но, зная принципы возникновения этих причин, а также физические свойства полупроводников, проводников и диэлектриков, можно с легкостью одолеть и их.
Что ж, начнем…
С радостью прибежав с работы, наспех разувшись и раздевшись, не поевши и не поздоровавшись с родными, с мыслями о вчерашней «недобитой» игре, недописанному сообщении друзьям, недоперенабранной давеча статье, подходите к компьютеру, включаете его, нажимаете заветные кнопки, и… Нет повести печальнее на свете, чем время, проведенное не в нете! Что делать, спросите Вы? Конечно, можно и повеситься, но не сейчас!
Для начала давайте проверим, а поступает ли вообще напряжение на наш компьютер. При наличии тестера это сделать проще простого, вплоть до того, что замерять напряжение на штекере питания компа. Если напруга есть – идем дальше*. Снимаем крышку корпуса и смотрим умоляющими глазами на это разобранное безобразие. Скорее всего, сейчас Вам понадобиться пылесос. Не побрезгуйте, сделайте милость Вашему помощнику – почистите его. Кстати, очень рекомендую как можно чаще чистить внутренности компьютеру, развитие передовых технологий в наше время привело к тому, что даже пыль может влиять на стабильность работы любого электронного прибора…
Ну вот, и почистили его, и поумоляли, и с бубном потанцевали, а он молчит, гад! Сейчас сразу определимся: Ваш комп вообще не включается, так как если он включается, даже на короткое время, а потом отключается, то это уже может быть другая причина.
Значится так, придется опять брать в руки тестер, если Вы его уже брали до этого… Будем измерять выходные напряжения питания.
Выходные – в смысле, не потому, что отдыхают, а потому что на выходе.
Находим разъем питания на материнской плате, его можно издалека заметить, он немаленький, и практически все идущие от него провода далеко не худенькие. Сейчас появилось множество стандартов разводки разъемов блока питания, значения напряжений на нем можно посмотреть в инструкции к материнке, поэтому я здесь конкретно останавливаться на этом не буду. Вот, например, на рисунке 1 приведены чертежи разводки некоторых особенно часто встречающихся в последнее время разъемов. Ну как, измерили? Здесь возможны три с половиной варианта: все напряжения отсутствуют, одно-два (но не все) из напряжений не соответствует номинальному значению (номинальное значение на должно отклоняться более чем на 5%), или вообще отсутствует, все напряжения в норме. Сразу скажу, что последний вариант не рассматриваю, потому что это – практически из области фантастики, очень редкий случай! По поводу первых двух вариантов немного Вас огорчу – придется разбирать блок питания. Естественно, возможны и повышенные значения напряжений, но это довольно редкий и опасный случай, который встречается чаще всего у некачественных блоков питания в основном из-за выхода из строя цепей обратной связи (оптопара и ее обвязка) или микросхемы управления. В таком случае вся надежда на «здоровье» материнки и периферии: смогут ли они выдержать повышенное напряжение, или нет, есть ли у них защита от повышенного напряжения питания, или нет…
Рисунок 1. Разъем источника питания
Стоп! Забыл… Если отсутствуют все напряжения, кроме 5 и (или) 3,3 Вольта, например, цепи 5VSB, то еще проверьте сигнал включения источника питания PS_ON (чаще всего он зеленого цвета), поступающий с процессора. Если его нет – проверьте цепь, в крайнем случае – откиньте этот провод от материнки, и подайте на него «общий» питания, или «массу». Если блок питания (не компьютер!!!) запустился, об этом судят по запуску его вентилятора, то, вероятно, у Вас тяжелый случай – что-то с процессором или материнкой… Если же этот номер оказался «дохлым», с чем Вас пока и поздравляю, то переходим к следующему этапу – разборке источника питания.
Следует обратить ваше внимание на опасность статического электричества для компьютерных комплектующих. И хоть времена КМОП без защитных диодов на входе отошли, но лучше перестраховаться. Прежде чем прикасаться к чему-либо внутри компьютера, избавьтесь от заряда статического электричества, прикоснувшись к неокрашенной металлической поверхности, например к металлической части на задней панели.
В процессе работы периодически дотрагивайтесь до неокрашенных металлических поверхностей на корпусе компьютера для снятия статического напряжения, которое может повредить внутренние компоненты. Отсоедините компьютер и все подключенные к нему устройства от электросети. Также отключите от компьютера все телефонные и телекоммуникационные линии. Это уменьшает риск несчастного случая или удара электрическим током.
Кроме того, придерживайтесь следующих правил техники безопасности… При отключении кабеля от сети беритесь за вилку или за специальную петлю на вилке. Не тяните за кабель. Некоторые кабели имеют фиксаторы на разъемах. Чтобы отсоединить такие кабели, нужно предварительно нажать на эти фиксаторы. Разъединяя разъемы, держите их прямо, чтобы не погнуть контакты. Аналогично, перед подключением кабеля убедитесь в правильной ориентации и соответствии частей разъемов. При работе с компонентами и платами соблюдайте осторожность. Не касайтесь компонентов и контактов плат. Держите плату за края или за металлические кронштейны. Держите компоненты, например микропроцессор, за края, не дотрагиваясь до контактов.
Проверьте наличие коротких замыканий в самой схеме компа. Отключите разъем, подайте «массу» на вывод включения источника питания PS_ON, и измерьте напряжения (или именно то напряжение, которое отсутствовало). Если все чудесным образом пришло в норму, или оказалось несколько завышено (такое бывает при работе блока питания на «холостом ходу»), то Вам следует искать причину в самом компьютере, а блок питания пока не трогать. Но об этом позже. А сейчас…
Разобрали? Опять пыль? Пылесос в студию! Первым делом проверьте предохранитель. Целый? Тогда нам опять не повезло…
Практически все источники питания собраны по идентичным схемам, впрочем, как и все остальные импульсные блоки питания. Поначалу кажущийся таким сложным, он состоит из высоковольтной и низковольтной частей, и трансформатора. Не будем вникать в технические и технологические подробности, начнем ремонтировать. Только помните – ремонт производят при отключенном от сети устройстве!
Я не буду останавливаться на нюансах ремонта блоков питания, так же, как и на подробных принципах их работы, это тема отдельного и очень длинного разговора, я дам лишь краткие сведения, без описания физических данных блоков, коих сейчас выпущено так много, что всех их и не рассмотришь и не опишешь.
Сначала производим внешний осмотр. Если не выявлено явных повреждений в виде «горелых», оплавленных, треснутых от кропотливой работы деталей, переходим к следующей стадии ремонта, если выявлены, то определяем вышедшую из строя запчасть, и… переходим к следующей стадии ремонта.
Проверяем низковольтную часть на наличие пробитых выпрямительных диодов. Это – самая частая неисправность. В качестве таких диодов используют мощные высокочастотные диоды Шоттки**. На рисунке 2 изображен стандартный разобранный блок питания, все основные элементы подписаны, диоды тоже. Измерять обычным тестером, как обычные диоды, они проводят ток в одном направлении, в другом – не проводят.
Затем проверяем высоковольтную часть: входные диоды, задающий транзистор. Я не буду расска- зывать, как их проверять, скажу только, что лучше их проверять выпаянными из платы. Затем на очереди – конденса- торы фильтра питания.
Также можно проверить микросхему, и оптопару, если она присутствует, и их обвязку. Для некоторых, конечно, это высший пилотаж, значения напряжений на выводах микросхемы можно посмотреть только в инструкции к блоку питания, или в datasheet на эту микросхему. В общем – Google рулит! Также проверяем трансформатор на наличие обрывов и, если есть чем измерять, короткозамкнутых витков. Впрочем, если «вылетел» трансформатор, в большинстве случаев придется покупать новый блок питания, хотя, если у Вас есть друзья на «разборке», или Вы специалист по перематыванию импульсных трансформаторов с кучей свободного времени, то Вам невероятно повезло… И, напоследок, проверка емкостей фильтра на выходах. Они бывают как обрывной, потерявшие емкость, так и короткозамкнутые. Конденсаторы, которые не соответствуют стандартным, «строгим», размерам (например, раздутые до неприличия, или с подтеками какой-то желтой жидкости), должны быть проверены тщательнейшим образом!
Ну вот, в принципе, и все, что я хотел сказать про блок питания…
Теперь поговорим о случае, когда при- сутствует замыка- ние по шине питания в самом компьютере, а блок питания вполне исправен.
Сразу оговоримся, что если КЗ «распо- ложено» на материн- ской плате, то у Вас ничего не получится! Но попытаемся…
Рисунок 2. Ремонтируем жесткий диск
Рецепт прост: отклю- чаем сеть, отключаем по одному устройству и включаем компью- тер. Очередность приблизительно такая: винчестер (очень часто встречается, во многих винчестерах установлен защитный стабилитрон на входе питания, который при, даже маленьком, превышении значения напряжения питания сразу «коротит» шину питания на землю), приводы CDDVD- флоппи (причина та же, что и у «винтов»), периферия, расположенная на самой материнке (видеокарта, TV-тюнер и прочее).
Если после отключения какого-либо устройства компьютер заработал или хотя бы включился вентилятор процессора, то виновник видимо определен. Кстати, совсем забыл о USB, COM и прочих портах. Отключите их в самую первую очередь. Никаких флешек, принтеров, джойстиков!
Сейчас немного отвлекусь от темы и расскажу, что можно сделать, если все-таки вышел из строя защитный стабилитрон. На рисунке 3 изображен жесткий диск производства Samsung (не новый, правда). Измеряем сопротивление стабилитрона, если он «коротит», то есть проводит ток во всех направлениях, притом его сопротивление приближается к нулю, то это он, 100%! Что можно сделать? Да выпаять его, и все тут! Работать будет, но… мало ли, от чего произошел перепад напряжения, из-за чего этот стабилитрон закоротило… Лучше поставить другой, необязательно такой же, просто смотрим, какое напряжение выло закорочено, и, в зависимости от этого ставим новый. Если закорочена пятивольтовая шина – стабилитрон на 6.3В, можно и 5,6В, если двенадцативольтовая – 12.6 или 13.2В. Если после замены стабилитрона и движений бубном устройство не заработало, то имеет смысл его покрасить в синий цвет, и выбросить.
Рисунок 3. Блок питания ПК
Если виновник торжества – видеокарта, или прочая периферия, то тут делать нечего, скорее всего придется покупать новую, а старую похоронить с почестями и салютом. Все, по первому пункту я уже все, что знал – рассказал. Переходим ко второму…
Начнем с теории
Как известно, прежде операционной системы в компьютере запускается встроенная в чип материнской платы программа BIOS (Base Input/Output System, основная система ввода- вывода). Назначение этого небольшого (256 Кб) программного кода – свести к «общему знаменателю» аппаратные различия компьютерного оборудования. Параметры настройки BIOS хранятся в энергозависимой CMOS RAM, которая питается от батарейки на материнской плате. Отсюда вывод: если у вас часто «слетают» установки компьютера или «вредничают» часы – скорее всего, пора менять батарейку. После включения питания напряжение подается на центральный процессор и другие микросхемы материнской платы. «Проснувшись», CPU запускает из микросхемы программу BIOS – и начинается процедура POST (Power On Self Test, инициализация при первом включении). Ее задача – просканировать и настроить все «железо». Прежде всего формируется логическая архитектура компьютера. Подается питание на все чипсеты, в их регистрах устанавливаются нужные значения. Затем определяется объем ОЗУ (этот процесс можно наблюдать на экране), включается клавиатура, распознаются LPT- и COM- порты. На следующем этапе определяются блочные устройства – жесткие диски IDE и SCSI, флоп-дисководы. Для устройств SCSI процедура несколько усложняется наличием собственной BIOS, которая берет на себя работу с соответствующим оборудованием и имеет собственную программу настройки. На заключительной стадии происходит отображение итоговой информации.
После окончания работы POST, BIOS ищет загрузочную запись. Эта запись, в зависимости от настройки, находится на первом или втором жестком диске, флоп-диске, ZIP или CDROM. После того как загрузочная записи найдена, она загружается в память и управление передается ей [2].
Если во время работы POST будут обнаружены ошибки, устройство попытается пользователя об этом предупредить. При этом вполне вероятна полная остановка работы компьютера. Задача пользователя – расшифровать сигналы ошибок, передаваемые POST, перевести их на человеческий язык. Для этого существуют специальные POST-карты. Диагностика материнской платы с помощью индикатора POST кодов, превращается в простое и увлекательное дело. Действительно, что может быть проще: вставил POST карту в слот (ISA, часто встречающаяся в «немолодых» компьютерах, или PCI) запустил плату и смотри на результат. В зависимости от модели POST-card коды ошибок выводятся в десятичном или шестнадцатеричном виде на цифровом индикаторе или простыми светодиодами. На некоторых современных материнских платах уже встроены функции заменяющие POST-карту и коды отображаются на находящемся на материнской плате индикаторе.
Но имейте в виду, что POST-карта не может являтся спасением от всех бед, так как она отображает только результат выполнения тестовой процедуры которая находится внутри микросхемы BIOS и при каждом включении и перезагрузке компьютера запускает функции самотестирования основных компонентов и подсистем ПК (таких как процессор, память, чипсет, видеокарту, клавиатуру, жесткие и гибкие диски и т.д.). Если в ходе выполнения обнаружена ошибка, система выдает звуковой сигнал и выводит сообщение на экран (конечно только в случае, если ошибка не была обнаружена раньше, чем например, видеоадаптер). Соответственно, POST карта не покажет полезной информации при неисправности самой микросхемы BIOS, ее обвязке, системах запуска и питания материнской платы. В других, не особенно тяжких, случаях с материнской платой диагностическая POST карта может существенно упро- стить поиск неисправности компонента платы или других деталей компь- ютера. Таблицы POST кодов можно легко скачать с сайтов производителей микросхем BIOS. Также можно их посмотреть в источниках [2, 3]. Единс- твенная проблема – наличие собственно этой POST-карты. Если вы не занимаетесь специализированным ремонтов компьютеров, то она Вам нужна, как собаке пятая нога, тем более в денежном выражении она «нормально стоит». Поэтому остановимся на другой индикации ошибок POST – звуковой. Если во время самотестирования BIOS не может вывести информацию на монитор, используется звуковой сигнал или голос, воспроизводимый при помощи встроенного динамика.
Для различных материнских плат применяется различная звуковая «кодировка». Остановимся только на самых распространенных [4], и тех, что мне встречались чаще всего (см. табл.1-3**).
Звуковые коды в данном случае представлены в количестве звуковых сигналов. Например, 1-2-2 означает 1 звуковой сигнал, пауза, 2 звуковых сигнала, снова пауза, и опять 2 звуковых сигнала.
таблица 1
таблица 2
Все, пожалуй, хватит на сегодня…
Как пользоваться данными таблицами? Ну вот, например, при включении Вы услышали один повторяющийся длинный «пик» динамика, и Вы знаете точно, что у вас Award BIOS. Разбираем компьютер и смотрим ОЗУ, это такая планка, «память» иногда называется (как оказалось в нашем случае – не вечная). Можно попытаться ее вынуть из разъема и почистить контакты, например, обычным ластиком, и снова поставить на место, иногда помогает. А теперь переходим к самому «страшному» пункту моей классификации неисправнос- тей – четвер- тому. Сбой во время работы – это и испор- ченные нервы, и, нередко, разбитый мо- нитор! Поэто- му с этим нужно что-то делать.
Определить причину та- кого сбоя непрофессио- налу можно, в основном, то- лько методом «научного ты- ка». К приме- ру, у меня был случай, когда во время работы ком- пьютер просто «виснул» без всяких при- чин. Причина выяснялась довольно до- лго, пока, во время работы компьютера, я случайно не задел рукой шлейф жесткого диска. Оказалось, окислился контакт, заменил шлейф и «зависания» прошли. Еще когда-то принесли ноутбук, у которого при включении было видно, что загрузка идет, а экран как был темным, так и оставался, только подсветка немного светила. Такое, как оказалось позже, часто встречается при перегреве чипсета видеокарты. В том случае проблема решилась просто: я снял радиатор с этого чипсета, включил компьютер и немного подождал, пока не сработала защита от перегревания, такая защита есть практически у всех компьютеров и ноутбуков.
таблица 3
И, о чудо, при последующем включении все чудесным образом заработало! Конечно, ненадолго, но причина была установлена быстро и дешево – видеоплата. Ведь до этого в сервисном центре предлагали поменять не только видеокарту, но и ОЗУ. Непонятно только – зачем?
Так что, экономия – на лице… заказчика. Вообще, практически все спецэффекты, иьтаситьтаскоторые могут наблюдаться на экране монитора, будь то квадратики-ромбики или цветовые «галлюцинации» происходят по вине видеокарты, а уж затем среди виноватых ищем оперативку или даже процессор.
Заключение
Кстати, перегревания не такая уж редкость в наше пыльное время. И чтобы этого не произошло, и Вам действительно ценно здоровье Вашего компьютера, производите хотя бы раз в полгода- год плановые «медосмотры» с присутствием острого глаза и пылесоса. Подправьте все разъемы, уложите провода, затяните гайки и болты. Не поленитесь также, я уже об этом говорил, очистить от пыли все внутренности, и будет Вам счастье в виде незабываемых минут с развлечениями или работой без нервов и «зависаний»!
Очень полезны в плане ремонта и обслуживания сайты [5-8, 10], есть что почитать, а если нужное не нашли, то можно и лично вопрос задать. В данной статье я, в основном, описал методику поиска простейших, наиболее часто встречающихся неисправностей, которые можно выявить с помощью отвертки и обычного мультиметра и устранить с помощью обычных рук и обычного паяльника. Для более сложных поломок я и рекомендую эти сайты, иногда полезнее воспользоваться чьим-то опытом, чем нарабатывать свой. Это может слишком дорого стоить…
А вообще – опыт приходит с годами, главное – не бояться и соблюдать меры предосторожности, особенно при работе с металлическими предметами (отвертками, пинцетами) под напряжением. И, я уверен, у Вас все получится.
Диод Шоттки – полупроводниковый диод с малым падением напряжения при прямом включении. Назван в честь немецкого физика Вальтера Шоттки. Диоды Шоттки используют переход металл- полупроводник в качестве барьера Шоттки (вместо p-n перехода, как у обычных диодов). Допустимое обратное напряжение промышленно выпускаемых диодов Шоттки ограничено 250 В (MBR40250 и аналоги), на практике большинство диодов Шоттки применяется в низковольтных цепях при обратном напряжении порядка единиц и нескольких десятков вольт.
Оптопара (оптрон) – электронный прибор, состоящий из излучателя света (обычно — светодиод, в ранних изделиях — миниатюрная лампа накаливания) и фотоприемника (биполярных и полевых фототранзисторов, фотодиодов, фототиристоров, фоторезисторов), связанных оптическим каналом и как правило объединенных в общем корпусе. Принцип работы оптрона заключается в преобразовании электрического сигнала в свет, его передаче по оптическому каналу и последующем преобразовании обратно в электрический сигнал. В оптроне входная и выходная цепи гальванически развязаны между собой… Нижняя рабочая частота оптрона не ограничена – оптроны могут работать в цепях постоянного тока. Верхняя рабочая частота оптронов, оптимизированных под высокочастотную передачу цифровых сигналов, достигает сотен МГц / Википедия.
Источники и ссылки
- Сайт автора статьи http://ddn.at.ua
- Программирование под Windows http://www.ru-coding.com
- Ремонт материнских плат http://materinki.narod.ru
- Звуковые коды BIOS http://www.umopit.ru/CompLab/BIOSbeeps.htm
- Форум, посвященный ремонту ноутбуков http://notebook1.ru/forma1
- Конференция по ремонту аппаратуры http://monitor.net.ru
- Конференция IXBT http://forum.ixbt.com
- Ремонт и настройка компьютеров http://comp-remont.info
Статья из четвёртого выпуска журнала «ПРОграммист».
13th
Как вывести русский текст в графическом режиме? Pascal.
uses graph, dos;
{$L EGA3FONT.OBJ}
procedure Ega3Font; external;
var gd, gm: integer;
begin
SetIntVec($1F, @Ega3Font);
gd := detect;
InitGraph(gd, gm, '');
OutTExtXY(260, 220, 'Что-то в dos-кодировке');
ReadLn;
CloseGraph;
end.
EGA3FONT – шрифт, выдранный из русского доса, содержит символы с кодами 128-255 (русские буквы и псевдографика), пропущенный через утилиту binobj и слинкованный с программой.
В аттаче пример и русские векторные шрифты (те, что через SetTextStyle выбираются)
13th
Аудио вКонтакте.
И так, в последнее время развелось очень много программ – фейков для вконтакта. Некоторые программы ищут музыку вконтакте, и дают возможность скачать её. Программам этим я не доверяю, и решил сделать свою, для себя. Разубеждать меня не надо =)
Вопрос: как получить ссылку на скачивание той или иной музыки?
Исходный код audio.php перерыл, ссылок не нашел, хорошо, видать, Дуров защитил =)Может, кто поможет.. Я не прошу написать за меня код, прошу просто подсказки. Копирование из кеша неподойдет.
http://cs4586.vkontakte.ru/u2663363/audio/61bea91731fc.mp3
вот, надеюсь понятно?)) (правда запоздал немного)
вот моя старая функция(раньше то везде ссылок чистых не было)
function WB_AudioLinkMP3(sourse:string):string;
var s:string;
begin
s:=sourse;
if Pos('operate',s)=0 then exit;
Delete(s,1,PosEx('(',s,Pos('operate',s)));
Delete(s,1,Pos(',',s));
sourse:='http://cs'+Copy(s,1,pos(',',s)-1);
Delete(s,1,Pos(',',s));
sourse:=sourse+'.vkontakte.ru/u'+Copy(s,1,pos(',',s)-1);
Delete(s,1,Pos(',',s));
sourse:=sourse+'/audio/'+Copy(s,2,pos(',',s)-3)+'.mp3';
Result:=Sourse;
end;
правда он не очень оптимизирован
можно и лист бокс, раньше я когда то занимался этим(сейчас то вернусь в эту тему…но не раньше чем разберусь со своей библиотекой классов на С++/Delphi(правда С++ важнее в этом плане))
я юзал листбокс, а если парсить и далее этой кнопки(данные песни) то можно и в листвиев все запихать как угодно
Интересная тема на форуме. Советую присоединиться к обсуждению.
11th
Июн
Рассылка. Выпуск 62.
От ведущего рассылки.
Добрый вечер читатели. Сегодня выходит очередной 62 выпуск рассылки клуба программистов. В этом номере вы сможете прочитать обзор интересных тем с форума, и еще последнюю статью с третьего номера журнала ПРОграммист.
11th
Создание exe-файла
Для удовлетворения любопытства, создаю минимодель простейшего компилятора. Пока остановился на стадии синтаксического разбора(выполняется операция “сдвиг-свертка”), следующим шагом будет построение триад, однако забегая вперед задумался над вопросом, как создать исполняемый файл. Прошу вкратце объяснить, как создается exe-шник, или даже просто com-файл. Заранее благодарен за внимание
Интересная тема на форуме о низкоуровневом программировании.
10th
Июн
Перегрузка оператора “=”(присваивание)
Класс person содержит поля beg1 (как минимум)
person &person:perator=(person &z) //в левой и правой частях от оператора два объекта типа person
{
node1 *p, *pend, *pz;
if (&z == this) return *this; //если правая и левая часть равны возвращаем левую часть
if (z.beg1==NULL) beg1=NULL;
else {p=new node1;
if (p==NULL) {cout<<"ERROR... Lack of Memory.\n"; //типа не удалось выделить память
getch(); //задерживаем экран чтобы пользователь прочитал ошибку
exit(-1); //завершаем выполнение программы
}
p->d=z.beg1->d;
p->next=NULL;
beg1=p;
pend=p;
for (pz=z.beg1->next;pz!=NULL;pz=pz->next) //в этом цикле в p присваивается z.beg1
{p=new node1;
if (p==NULL) {cout<<"ERROR... Lack of Memory.\n";
getch();
exit(-1);
}
p->d=pz->d; //присваиваем поле d
p->next=NULL; //на каждой итерации мы предполагаем что этот элемент последний
pend->next=p; //pend теперь не последний, делаем
pend=p; //его таковым
}
}
return *this; //возвращаем текущий объект
}
10th
Создание робота и все что с ним связанно
Интересная тема на форуме о создании роботов. Со ссылками на интересные ресурсы, советами и размышлениями.
9th
Июн
Игра FunWorld2
Форумчанин Манжосов Денис
представляет вашему вниманию вторую часть игры Fun World.
Задача: дойти до конца уровня, желательно собрав все шарики. Уровней 9(два тестовых-скоростных и 7 нормальных). Игра написана на собственном движке, вывод графики через Canvas, на форме нет ничего кроме таймера. Отличия от первой версии:
1) Динамичная структура карты. Уровни могут быть неограниченно большими.
2) Переделана система столкновений. Багов нет! 
3) Добавление своих текстур в игру, модификация игры
4) “Плавающая” камера;
Ну это не всё, пунктов много, но все они не столь значительны…Версия можно сказать тестовая, так как есть новые версии игры, но в них нет уровней и пока что сыроватые относительно этой. Найти остальные версии можно здесь FunWorld2
В новых версиях вместо fmod.dll используется bass.dll, есть анимация, редактор переоформлен, доработка старой версии, чекпоинты… Новые версии создаются при поддержке Perfect-Light!
В-общем, я жду Вашего мнения об игре. Спасибо за внимание!
FunWorld2
9th
Анализ введённой строки на наличие цифр. Java.
Как можно сравнить каждую букву в введённой пользователем строки символов на наличие цифр?
примерно так
if(!str.matches("^\\D*$")){
//содержит
}else{
//не содержит
}
7th
Июн
IE и закрывающийся тег LI
Столкнулся со следующей проблемой
...
echo '<li id="'.$field.'">'.$title.'</li>';
echo <div>...</div>
...
так вот в 1 строке </li> не обрабатывается, т.е. див рисуется прямо в <li> а потом в конце автоматически создается </li>
И еще, если в реквесте в ИЕ есть переменные типа ¬_redirect то в ие почемуто заменяется $not на какой то спец символ.
Решение было найдено быстро.
Все, решено – косяк в том что IE не позволяет никаких структур в <UL> кроме <LI> ну или по крайней мере <DIV>
7th
Исключающее ИЛИ
С помощью комбинации каких элементов (ИЛИ, И, НЕ) можно получить ИСКЛЮЧАЮЩЕЕ ИЛИ? Чем меньше тем лучше. Оптимально конечно через два элемента.
A xor B = (A and !B)or(!A and B) = (A or B) and (!A or !B)
Как этот процесс реализуется в электронных схемах, можно посмотреть на графиках, схемах, формулах и видео в теме на форуме.
6th
Июн
Нажать программно win+L
Есть WinApi из user32
| The keybd_event function synthesizes a keystroke. The system can use such a synthesized keystroke to generate a WM_KEYUP or WM_KEYDOWN message. The keyboard driver’s interrupt handler calls the keybd_event function.
VOID keybd_event( BYTE bVk, // virtual-key code |
Насчёт делфи неуверен, наверное так:
keybd_event(VK_LWIN, 0, 0, 0);
keybd_event('L', 0, 0, 0);
keybd_event('L', 0, KEYEVENTF_KEYUP, 0);
keybd_event(VK_LWIN, 0, KEYEVENTF_KEYUP, 0);
6th
Самый лучший каклькулятор в мире.
В свете последних новостей о гениях на Руси-матушке, таких как Школьник из Нижнего Тагила разработал аналог Windows форумчанин Ecosasha решил в шутку заявить, что он ни чем не хуже.
Наконец-то, создан самый лучший калькулятор в мире – двухкнопочный.
Теперь Вам не надо стараться попасть курсором мышки на нужные кнопки или искать их
на клавиатуре.
Используя данный калькулятор, ваш курсор может быть в любом месте на форме.
От Вас требуется только нажимать на кнопки мыши и одну кнопку на клавиатуре – самую
большую и продолговатую, называемую ПРОБЕЛОМ.
Привожу комментарии учителя информатики:
” Я пробовал пользоваться стандартным калькулятором, в нем надо долго водить курсором, чтобы набрать цифру,
можно и промахнуться. А в этом калькуляторе все просто кликнул пару раз и нажал большую кнопку и готов результат.
Видно, какие цифры вводил до этого, а то память слабая.
Ах, да, разработка оценена ведущими программистами страны.”
…………
Самый лучший калькулятор двухкнопочный.rar
Посмотреть текст всего объявления и комментарии к этой шокирующей новости.
6th
Поиск по Listbox
Функция ищет первое совпадение в листбоксе и возвращает индекс строки в которой это совпадение находиться; если ничего не найдено возвращает -1:
function ListBoxFind(template:string; listbox:TListBox):integer;
var i,j:integer;
begin
for i:=1 to listbox.Count do
begin
if Pos(template,listbox.Items.Strings)<>0 then
begin
Result:=i;
exit;
end;
end;
Result:=-1;
end;
6th
SimpleBot v1.1 напишем вместе!
Новая статья на http://pkonkurs.ru/
SimpleBot v1.1 напишем вместе!
Также новая версия игры с подправленным именами проектов
В этой статье я покажу как добавив несколько строк кода можно очень сильно изменить игру бота в лучшую сторону.
Итак, приступим! Для разнообразия будем писать на C++.
Что мы сделаем в первую очередь? Изменим набор проектов. Смотрим строку в коде которая содержит список проектов
………..
4th
Июн
Работа с LPT портом в Дельфи или компьютер в роли управляющего контроллера. Часть 1
Большинство пользователей персонального компьютера привыкли к тому, что весь результат деятельности на компьютере в той или иной степени все равно отражается в самом компьютере. В крайнем случае, отправляется на принтер или в Интернет, или же запись информации происходит на внешние носители (диски, флеш-память и т.п.). И уж мало кто задумывается, что с помощью простого РС – компьютера можно управлять различными внешними физическими устройствами.
Рис. 1. «Рабочая лошадка LPT еще даст о себе знать»
Владимир Дегтярь
by DeKot degvv@mail.ru
Тем не менее, на форуме http://www.programmersforum.ru (да и на других также) часто появляются вопросы: «Как с компьютера зажечь светодиод?», «Как управлять освещением?» или «Можно ли компьютером закрывать шторы на окне?». Ответ: «…однозначно да». С помощью современного персонального компьютера можно создавать, воспроизводить, управлять, хранить, моделировать, обучать и еще реализовать много и много других функций.
Введение
Мы же рассмотрим возможности управления внешними устройствами – при этом возможно управление, как простым вентилятором или светодиодом, так производственными устройствами. Как известно, любой персональный компьютер, да и не только персональный, а и любое компьютерное (еще одно общепринятое название – микропроцессорное) устройство имеет устройства ввода и вывода информации, называемые портами. Для нас пользователей – это просто разъемы для подключения (клавиатура, мышь, модем, флешка и т. д.). Следует заметить, что по одному и тому порту (разъему)
можно как выводить информацию, так и вводить. Кроме этого понятие порт – это не только физически внешний элемент (разъем), а больше наоборот – внутренняя логическая структура устройства компьютера, часть его архитектуры.
Думаю что уже достаточно теории. Перейдем к практической реализации – управлению реальными устройствами с помощью компьютера. Более всего для этого подходит «параллельный» порт LPT. Более подробно смотрим о LPT http://ru.wikipedia.org/wiki/IEEE_1284.
Параллельный порт LPT
Итак, почему параллельный, а не перпендикулярный? А какие еще бывают? Параллельный, потому что информация через такое устройство передается параллельным способом. А еще может передаваться последовательным – тогда устройство (порт) называется последовательным (последовательные порты компьютера: COM-порт, USB- порт). Наглядно это можно увидеть на рисунке 2:
Рис. 2. Методы вывода информации
Аналогично ввод информации также может быть параллельным или последовательным. Порты (устройства) через которые можно вводить и выводить информацию называют двунаправленными устройствами или устройствами ввода/вывода. Таким и есть параллельный порт LPT, имеющийся в большинстве компьютеров. Посмотрим, что из себя представляет этот порт (см. рисунок 3):
где С0…С3 – регистры контроля, S3…S7 – регистры статуса, D0…D7 – регистры данных
Как видите, это такой разъем с 25-ю выводами на задней стенке системного блока компьютера. Итак, имеем физический порт LPT, который фактически состоит из трех регистров. Состав регистров и распределение по контактам разъема приведены в таблице 1:
Табл. 1. Распределение выводов LPT по регистрам
Каждый из регистров может содержать байт информации (256 состояний). Часть битов не используется или используется только во внутренней архитектуре компьютера для организации прерываний при работе с принтером или для переключения режимов ввод/вывод регистра «Data».
Регистр данных «Data», номер регистра в шестнадцатеричной системе счисления $378 (в десятичной 888) – двунаправленный, восьмибитный. Данные через этот регистр можно как вводить, так и выводить с компьютера, программно устанавливая уровни на выходе порта или же вводить в компьютер, также программно считывая уровни, устанавливаемые внешними устройствами.
Регистр управления «Control» $37A (890). Через него можно только выводить информацию из компьютера. На разъем LPT выводятся четыре младших байта.
Регистр статуса «Status» $379 (889). Через порт можно только считывать уровни, установленные внешними устройствами. На разъем LPT выведены пять старших байтов.
Таким образом, на разъеме LPT задействовано 17 сигнальных контактов (8 двунаправленных – регистр 888, четыре только на вывод информации – регистр 890 и пять только на ввод информации – регистр 889).
Порт LPT разрабатывался еще на заре создания персональных компьютеров для подключения печатающих устройств (принтер). Этим объясняется специфическое наименования цепей и инверсия некоторых битов, из-за которой наблюдается несоответствие уровней напряжения на контактах и логических кодов регистров. В связи с этим, операции с информацией через LPT порт требуют учитывать эти особенности соответствия физических уровней и логических кодов.
Следует отметить, что в некоторых компьютерах может быть до трех портов LPT: LPT1, LPT2, LPT3 (в современных компьютерах LPT порты зачастую вообще отсутствуют). Адрес самого LPT порта соответствует адресу регистра «Data» и может быть $278, $378 или $3BC. Регистры в соответствующих портах имеют адресацию +1 и +2.
Следующие таблицы (см. таблицы 2, 3) показывают эти особенности данного порта. Для регистра $378 (888) соблюдается полное соответствие между уровнями напряжения на контактах и логическим кодом. А вот с регистрами $379 (889) и $37A (890) все обстоит по-другому:
Табл. 2. Порт $37A (890) «Control»
Табл. 3. Порт $379 (889) «Status»
Управление регистрами
В компьютерах с операционными системами MS-DOS, Windows 9x возможен доступ к портам непосредственно из самой операционной системы, тогда как в системах с NT такой прямой доступ невозможен. Для этих целей используются драйвера в виде библиотек (Inpout32.dll, WinIO, Giveo). Подключив соответствующие библиотеки к средам программирования, получаем возможность программно работать с портами (считывание состояния порта или установка выводов порта в необходимое состояние).
* Автор отдает предпочтение библиотеке <inpout32.dll> для работы в среде Дельфи. Библиотека
<inpout32.dll> свободно распространяется в Интернете (см. ресурсы к статье).
Итак, во-первых – помещаем <inpout32.dll> в папке с проектом. Далее в коде модуля Unit после раздела uses размещаем объявления необходимых нам функций из библиотеки:
// импорт функций inpout32.dll
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs,StdCtrls, ExtCtrls, ComCtrls;
function Inp32(PortAdr: word): byte; stdcall; external 'inpout32.dll';
function Out32(PortAdr: word; Data: byte): byte; stdcall; external 'inpout32.dll';
Функция Inp32(PortAdr) возвращает число (тип – байт), соответствующее коду, находящемся в регистре PortAdr. Функция Out32(PortAdr, Data) возвращает число (Data, тип – байт), которое запишется в регистр PortAdr. Проще сказать Inp32 считывает значение регистра, а Out32 устанавливает значение в регистр. Пример применения функций:
var val1, val2: byte;
val1:= Inp32($378); // значение регистра «data» запишется в переменную val1
val2:= 54;
Out32($378,val2); // в регистр «data» запишется число 54 (b 0 0 1 1 0 1 1 0)
При этом следует учитывать, что состояние уровней напряжения на выходных контактах LPT порта соответствует таблице 2 и 3. При необходимости управления отдельными битами регистров можно применить следующие функции преобразований десятичного числа в двоичное и наоборот:
// weight (для byte(8 разр.)) = 128, j = 7; weight( для word (16 разр.)) = 32 768, j = 15 ;
function Dec_Bin(N_dec: integer; weight: integer; _bit: byte): byte;
var i ,j : byte;
mas_bin: array[0..j] of byte;
N_dec: integer;
begin
for i:= 0 to j do
begin
mas_bin:= N_dec div weight;
if mas_bin = 1 then N_dec:= N_dec - weight;
weight:= weight div 2;
end;
Result:= mas_bin[_bit]; // возвращает значение бита (0 или 1) двоичного числа,
// соответствующего N_dec
end;
function Bin_Dec(weight: integer): integer;
var i , j: byte;
mas_bin: array[0..j] of byte;
N_dec: integer;
begin
N_dec:= 0;
for i:= 0 to j do
begin
N_dec:= N_dec + mas_bin * weight;
weight:= weight div 2;
end;
Result:= N_dec; // возвращает десятичное число, соответствующее двоичному
// в виде массива битов mas_bin [ 0 .. j ]
end;
Пример применения функций:
var bit : byte;
bit := Dec_Bin(Inp32($378))[3]; // переменная bit принимает значение 3-го бита регистра «data»
** Переключение регистра «data» ($378) c «выхода» на « вход»
Возможность использования регистра «data» ($378) в качестве порта ввода определяется в настройках
BIOS для параллельного порта. Следует установить Parallel Port в EPP. Переключение регистра на «вход»
осуществляется программно, путем установки 5-го бита регистра «control» ($37A) в «1» (при этом все биты
регистра «data» устанавливаются в «1»). Следует отметить, что данная процедура возможна не на каждом
компьютере и определяется, кроме настроек, еще и конструктивными особенностями порта LPT или
материнской платы.
Вариант тестовой утилиты управления и считывания состояния регистров LPT представлен на рисунке 4 и приведен в ресурсах к статье [1]:
Рис. 4. Утилита считывания и контроля состояний регистров LPT порта
Заключение
Продолжение смотрите в следующем выпуске журнала «ПРОграммист»…
Ресурсы
. Модули и проекты, использованные в статье http://programmersclub.ru/pro/pro3.zip
. Сайт Валерия Ковтуна с множеством интересных программ для работы с LPT портом
http://valery-us4leh.narod.ru/main.html
Это статья из третьего номера журнала “ПРОграммист”.
Скачать его можно по ссылке.
Ознакомиться со всеми номерами журнала.
4th
Рассылка. Выпуск 61
Добрый вечер читатели рассылки. Сегодня выходит очередной 61 выпуск рассылки клуба программистов. В этом номере рассылки вы сможете прочитать обзор интересных тем с форума, а так же оставшиеся статьи из последнего выпуска журнала ПРОграммист.
3rd
Июн
Как достать временные файлы из Оперы
Для решения этой проблемы есть много способов.
1. E:\Documents and Settings\Феникс\Local Settings\Application Data\Opera\Opera\cache
ищем подходящее по размеру, и ставим нужное расширение.
2. В строке адреса пишем: opera:cache и смотрим что в кэше есть без переименований.
31st
Май
Отловить момент сворачивания окна
SERG1980:
Ну тогда в разделе Public пишем следующую строку:
procedure WMSysCommand(var Msg: TWMSysCommand);message WM_SYSCOMMAND;
далее после слова implementation описываем эту процедуруProcedure TForm1.WMSysCommand(var Msg: TWMSysCommand);
begin
if msg.CmdType=SC_MINIMIZE then
begin
//здесь делаем что надо
end else inherited;
end;
31st
Расширение *.url в Windows
Нашел маленькую фишку, которую можно использовать в программах.
Создайте текстовый файл с любым содержанием.
смените ему разрешение на *.url
Вуаля – 50% пользователей не смогут его открыть.
Единственный метод – это запустить редактор и через “файл”-”открыть”.=) Enjoy.
P.S. Лично я так храню базу ссылок – и логично и практично
31st
Пароль на приложение в Delphi
Tform2 =class(Tform)
..........
private
i: integer;
end;
procedure TForm2.OnCreate(sender: TObject);
begin
self.i=0;
end;
procedure TForm2.Button1Click(Sender: TObject);
const
pas='159357';
var
n:integer;
begin
self.i:=self.i+1;
n:=3-self.i;
if edit1.Text=pas then
begin
hide;
free;
31st
Алгоритм Брезенхема
Рисование прямой методом Брезенхема.
procedure TForm1.Button1Click(Sender: TObject);
var
x1,x2,y1,y2,dx,dy,s1,s2,x,y,o,i,v,obmen : integer;
begin
x1:=strtoint(edit1.Text);
y1:=strtoint(edit2.Text);
x2:=strtoint(edit3.Text);
y2:=strtoint(edit4.Text);
x:=x1;
y:=y1;
dx:=(abs(x2-x1));
dy:=(abs(y2-y1));
if (x2-x1)<=0 then s1:=-1 else s1:=1;
if (y2-y1)<=0 then s2:=-1 else s2:=1;
if dy>dx then
begin
v:=dx;
dx:=dy;
dy:=v;
obmen:=1;
end
else obmen:=0;
o:=2*dy-dx;
for i := 1 to dx do
begin
form1.Canvas.Pixels[x,y]:=clBlack;
while o>=0 do
begin
if obmen=1 then
x:=x+s1
else
y:=y+s2;
o:=o-2*dx;
end;
if obmen=1 then y:=y+s2
else x:=x+x1;
o:=o+2*dy;
end;
//form1.refresh;
//self.Repaint;
end;
30th
Май
Как работать с графикой на канве в среде Дельфи
Здравствуйте, уважаемые читатели. Как и обещал, сегодня с вами мы подробно рассмотрим процедуры работы с графическими объектами, вынесенными в отдельный модуль, позволяющий использовать универсальные методы для создания движущихся изображений, находящихся в файлах, обычно в виде спрайтов…
Продолжение. Начало цикла смотрите в первом и втором выпусках журнала…
Владимир Дегтярь
DeKot degvv@mail.ru
Создание проекта с несколькими движущимися объектами. Урок 5
Создадим новый проект <Lesson 3> аналогично предыдущим. Введем в него новые движущиеся графические объекты (в папке <data> добавлено еще четыре звездолета. Размер каждого спрайта 100х80 pix. Новые звездолеты будут появляться по случайному закону (используем функцию Randomize) и двигаться будут сверху вниз. Вывод фона и основного звездолета ’ship1′ осуществляется также как и в предыдущем проекте <Lesson 2>. Для новых объектов вводим дополнительно BufShipR и BufPicR. Также объявим новые переменные – координаты вывода новых звездолетов и приращения этих координат.
Одновременно у нас будут отображаться основной звездолет ’ship 1′ и два из ’ship 2′ – ’ship 5′, выбираемые по случайному закону (см. листинг 1):
ЛИСТИНГ 1
Var
Form1: TForm1;
BufFon,BufFonDop,Buffer: TBitMap;
BufShip1,BufShipR: TBitMap; // буферы спрайтов
BufPicS1,BufPicR: TBitMap; // буферы изображений одного спрайта
xf,yf: integer; // координаты вывода общего буфера на форму
dyf: integer; // приращение изменения координаты yf по вертикали
xS1,yS1: integer; // координаты звездолета 'ship1'
dxS1,dyS1: integer; // приращение координат 'ship1' по гориз. и вертик.
xR1,yR1,xR2,yR2: integer; // координаты звездолетов 'ship2 - ship5'
dyR1,dxR2,dyR2: integer; // приращение координат 'ship2 - 5'
ns,nr1: byte; // номер спрайта и выбор ship2 - ship5
nr2: byte = 3;
implementation
В процедуре OnCreate формы проведем инициализацию буферов и введем начальные данные для переменных. Процедура DrawShipR(i,j: byte) для вывода новых объектов (’ship2′ – ’ship5′) имеет два
параметра: i (изменение номера рисунка в файле спрайтов) и j (переменная для номера файла спрайтов). Т.к. выбор файла спрайта происходит по передаваемому параметру j, то инициализация буфера BufShipR и загрузка в него файла спрайтов находится в процедуре DrawShipR(i,j: byte) (см. листинг 2):
ЛИСТИНГ 2
procedure DrawShip1(i: byte);
begin
// загрузка одного спрайта в буфер рисунка
BufPicS1.Canvas.CopyRect(bounds(0,0,BufPicS1.Width,
BufPicS1.Height),
BufShip1.Canvas,
bounds(i * 66,0,
BufPicS1.Width,
BufPicS1.Height));
BufPicS1.Transparent:= true; // зададим прозрачность фона рисунка спрайта
BufPicS1.TransparentColor:= BufPicS1.Canvas.Pixels[1,1];
end;
Все движения организованы в обработчике таймера. Звездолеты ’ship2′ — ’ship5′ выводятся в Buffer в координаты xR1, yR1 и xR2, yR2 вне видимого окна формы выше. В каждом такте таймера происходит приращение координат для одного dyR1 по вертикали, для другого dxR2 и dyR2 – по горизонтали и вертикали. После того, как объекты выходят за пределы видимого окна формы внизу, вызываются методы random( ) для задания новых координат xR1, xR2 и номера файла спрайта (nr1, nr2). Координаты yR1, yR2 привязаны к координате yS1 , так как ’ship1′ неподвижен в координатах окна формы. Функция
random ( 4 ) возвращает числа в дипазоне 0 .. 3, а файлы спрайтов встречных звездолетов имеют номера 2 .. 5. Поэтому в процедуре загрузки спрайтов BufShipR.LoadFromFile(’data/ship’ + IntToStr(j+2) + ‘.bmp’) номер загружаемого файла определяется как IntToStr(j + 2)… В остальном процедуры обработчиков таймера и нажатия клавиш не отличаются от проекта <Lesson 2>.
Использование универсального модуля для работы с графикой. Урок 6
Если рассмотреть внимательно код программы в проекте <Lesson 3>, можно заметить, что многие методы часто повторяются для разных графических объектов (создание буферов, загрузка изображений из файлов, копирование и т.п.). При этом для упрощения, я сознательно применил файлы спрайтов одинакового размера и с равным количеством рисунков в файлах. А если файлов спрайтов будет не пять, а больше и если количество рисунков в каждом файле будет разным? Придется значительно увеличивать код для
каждого вида спрайтов. Следовательно, необходимо оптимизировать код программы. Выход здесь в написании методов обработки объектов, не зависящих от количества объектов и применимых для разных изображений.
Даная задача реализована в отдельном модуле <LoadObjectToBufferMod>, позволяющий использовать универсальные методы для создания движущихся графических объектов (находящихся в файлах, обычно в виде спрайтов), имеющих различный размер и разное количество изображений отдельных рисунков.
Модуль находится в папке <Lesson 4> (см. ресурсы к статье). Принцип организации модуля следующий:
- вся работа с графическими объектами проводится через битовые образы TBitMap и области
копирования битовых образов TRect
- для работы с фоном используются процедуры InitFon (инициализация) и LoadFon (загрузка фона из
файлов)
- функция InitSprite предназначена для инициализации и загрузки рисунков спрайтов
- для вывода фона и изображений спрайтов использован общий буфер типа TBitMap
- в процедуре InitBuff происходит инициализация общего буфера, а в процедуре FreeBuff ”переустановка”,
т.е. уничтожение общего буфера и создание снова, но уже без изображений спрайтов
- в процедуре LoadBuff происходит наложение изображений спрайтов на фон
Подробно работа модуля показана ниже…
Применение модуля LoadObjectToBufferMod
1. procedure InitFon(nw, nh: byte; FileName: string)
Создаем дополнительный и основной буферы фона:
BufFonD:= TBitmap.Create;
BufFon := TBitmap.Create;
Далее загружаем рисунок одного из фонов в дополнительный буфер:
BufFonD.LoadFromFile(FileName) или
LoadFromResourceName(hinstance.filename);
По загруженному рисунку получаем размер одного рисунка фона (см. рисунок 1):
Рис. 1. Определение размера рисунка
Причем, размер буфера фона определяем как:
WF:= nw * WFD;
HF:= nh * HFD;
2. procedure LoadFon(xf, yf: integer; FileName: string)
Загружаем все рисунки фонов в буфер фона через дополнительный буфер (см. рисунок 2):
BufFonD.LoadFromFile(FileName) или
LoadFromResourceName(hinstance.filename);
Рис. 2. Загрузка всех рисунков фона
3. procedure initBuffer
Создаем основной буфер (Buffer) через который выводим спрайты на форму:
Buffer:= TBitmap.Create;
Размер основного буфера устанавливаем равным размеру буфера фона WF и HF. Загружаем в основной буфер весь фон (cм. рисунок 3):
Buffer.Canvas.Draw(0, 0, BufFon);
Рис. 3. Загрузка в буфер фона
4. procedure FreeBuffer
Процедура уничтожаем основной буфер Buffer. Применяется когда необходимо убрать какой-либо спрайт с формы:
Buffer.Free;
Восстанавливаем-же основной буфер с фоном так:
InitBuffer;
Спрайты, которые должны оставаться на форме, следует перерисовать по новому (см. процедуру InitStprite)…
5. procedure InitStprite(SpriteName: string; N_goriz, N_vertic, N_stroka, N_kadr: byte): byte
Cоздаем буфер массива спрайтов и загружаем туда файл спрайтов (см. рисунок 4):
BufSprite:= TBitmap.Create; BufSprite.LoadFromFile(SpriteName) или LoadFromResourceName(hinstance.spritename);![]()
Рис. 4. Загрузка файла спрайтов в буфер спрайтов
Создаем буфер рисунка (одного спрайта):
BufPic:= TBitmap.Create;
Далее определяем размеры буферов массива спрайтов и буфера рисунка, а также области (типа TRoot) загрузки рисунка. Загружаем спрайт в буфер рисунка (см. рисунок 5):
BufPic.Canvas.CopyRect(RectPic.BufSprite.Canvas, rectSprite);
Рис. 5. Загрузка спрайта в буфер рисунка
Задаем прозрачность рисунку:
BufPic.Transparent:= true;
Для вывода следующего спрайта функция возвращает (правильнее сказать – функция принимает значение = Result) значение следующего номера спрайта N_kadr:
Result:= N_kadr;
Уничтожаем буфер массива спрайтов
BufSprite.Free;
6. procedure LoadBuffer(xf, yf, xs, ys, bs: integer)
В этой процедуре на Buffer выводится участок фона с координатами ранее выведенного спрайта, а затем очередное положение спрайта. Определяем область фона и область дополнительного буфера (см. рисунок 6):
Рис. 6. Определение области фона и буфера
Выводим участок фона в буфер, т.е. затираем спрайт фоном (см. рисунок 7):
Рис. 7. Затираем спрайт фоном
Выводим очередной спрайт в дополнительный буфер Buffer (см. рисунок 8):
Buffer.Canvas.StretchDraw(Bounds(xs, ys, WP + bs, HP + bs), BufPic);
Рис. 8. Вывод следующего спрайта
Уничтожаем буфер рисунка:
BufPic.Free;
Далее в программе выводим дополнительный буфер Buffer на форму методом Draw:
Form1.Canvas.Draw(x, y, Buffer);
Битовые образы фона (BufFon и BufFonD инициализируются (создаются – Create) в программе проекта всего один раз при инициализации программы (обычно вызовом процедуры InitFon в событиях OnCreate или OnActivate). Методы InitBuff, FreeBuff, InitSprite, LoadBuf в программе вызываются неоднократно*. Соответственно и объекты Buffer, BufSprite, BufPic создаются многократно. Поэтому после окончания действия каждого из методов происходит уничтожение битовых образов Buffer, BufSprite, BufPic методом Free.
Комментарий автора.
Загрузку фона можно производить из n – количества файлов, c одинаковым размером не более 1024 х
1024. Для этого вызывать процедуру LoadFon n -раз для разных файлов FonName и изменяя
координаты xf и yf.
Модуль можно применять и для простых объектов (один рисунок в файле SpriteName). Присвойте
переменным N_goriz и N_vertic значения = 1. Если размер спрайта не изменяется, присвойте
переменной bs значение = 0.
Можно загружать рисунки из файлов .jpg. Для этого вместо TBitMap применять класс TJpegImage и в
разделах uses LoadObjectToBufferMod и uses Unit1 добавить модуль Jpeg.
Как работать с модулем?
Для этого необходимо выполнить следующие действия:
1. В процедуре FormActivate (можно в FormCreate) инициализируем буфер фона. Вызываем procedure InitFon(nw,nh: byte; FonName: string) с одним из файлов фонов:
. n раз вызываем procedure LoadFon(xf,yf: integer; FonName: string), последовательно прикрепляя рисунки фонов как бы друг к другу
. инициализируем дополнительный буфер Buffer, вызвав procedure InitBuff. Он получит размер равный сумме размеров всех файлов фонов.
2. Для вывода необходимых спрайтов в нужном месте программы вызываем function InitSprite(SpriteName: string; N_goriz,N_vertic,N_stroka, N_kadr: byte). Функция возвращает очередной номер спрайта для последующего вывода очередного спрайта. Этот номер (N_kadr) необходимо передавать в функцию при каждом ее вызове. Причем, функцию можно использовать для вывода нескольких спрайтов, не забывая передавать ей значение N_kadr для каждых спрайтов.
Далее, вызвав процедуру LoadBuff(xf,yf,xs,ys,bs: integer), выводим спрайт на канву дополнительного буфера поверх фона. Окончательный вывод дополнительного буфера на канву формы производим методом Draw().
Заключение
Рассматриваемые в данной статье проекты полностью приведены в виде ресурсов в теме «Журнал клуба программистов. Третий выпуск» или непосредственно в архиве с журналом (папка Lesson3). Продолжение наших уроков смотрите в следующем выпуске журнала «ПРОграммист»…
Комментарий автора.
Перед запуском в среде Дельфи скопируйте в папку с проектом папку data с графическими файлами.
Это статья из третьего номера журнала “ПРОграммист”.
Скачать его можно по ссылке.
Ознакомиться со всеми номерами журнала.
Обсудить на форуме – Как работать с графикой на канве в среде Дельфи
29th
Май
Что значат символы @ и ^ перед переменными в delphi и паскаль?
Эти символы в Дельфи и Паскале используются для работы с указателями (адресами памяти, где находится информация).
28th
Май
Как сделать стартовым окном Форму 2?
Sanprof:
установить “форму 2″ по умолчанию так (Project -> Options -> Вкладка Forms -> В комбобоксе с надписью Main Form выбираем нужную форму по умолчанию)









