|
nedoPC.orgElectronics hobbyists community established in 2002 |
|
Author |
Message |
Lavr
Supreme God
Joined: 21 Oct 2009 08:08 Posts: 7777 Location: Россия
|
32-х Где уточнить? А я через чего лезу, кэп очевидность? Или inpout32.dll не драйвер? Если бы его там не было, я бы к нему не лез, кэп...
_________________ iLavr
|
07 Apr 2016 17:51 |
|
|
Lavr
Supreme God
Joined: 21 Oct 2009 08:08 Posts: 7777 Location: Россия
|
Читаем русским по белому в этом топике: У меня на старом ноуте выход спикера заведен на звуковую карту, но никакого регулятора "Системный динамик" в настройках звука нет и в помине, но все приблуды отлично работают. Так что спикера физически вполне может и не быть, собственно, так оно чаще всего в ноутах и бывает.
_________________ iLavr
|
07 Apr 2016 18:14 |
|
|
Lavr
Supreme God
Joined: 21 Oct 2009 08:08 Posts: 7777 Location: Россия
|
Вот, кстати, на моей служебной машине под ХР среди устройств есть и таймер и системный динамик! Но всеми тестовыми программами системный динамик молчит как рыба об лед. В микшере звуковой карты он тоже не наблюдается и регулировки громкости его нет. Значит спикер могли просто не поставить в корпус, но вскрывать машину мне сейчас сугубо неохота...
_________________ iLavr
|
08 Apr 2016 08:54 |
|
|
Shaos
Admin
Joined: 08 Jan 2003 23:22 Posts: 22735 Location: Silicon Valley
|
> Напоминаю - задача с помощью софта, не требующего регистрации и админских привелегий на ЛЮБОЙ машине иметь доступ к портам ВВ
через драйвер или напрямую? напрямую говорят низя...
|
08 Apr 2016 09:46 |
|
|
Lavr
Supreme God
Joined: 21 Oct 2009 08:08 Posts: 7777 Location: Россия
|
Через драйвер, конечно, но хотелось бы, чтобы драйвер не тебовал привилегий администратора. В общем пробовал сегодня все приблуды на машине с Вендой 7-64. Вот это не запустилось вощще... Венда сказала, что это 16-битное приложение и чтобы я обратился к поставщику за новой версией. То есть - к самому себе. Я обратился и запустил вот это приложение, т.к. оно 32-разрядное и работает с библиотекой inpout32.dll. Оно запустилось нормально, но звуков не издало. Хотел на ходу перекомпилировать под библиотеку inpoutx64.dll. Тут компилятор сказал, что он незарегистрированный... ну понятно - я его просто в спешке слил на флешку... Вот такие говенства с Вендой 7-64...
_________________ iLavr
|
08 Apr 2016 10:24 |
|
|
Shaos
Admin
Joined: 08 Jan 2003 23:22 Posts: 22735 Location: Silicon Valley
|
а COM с LPT недостаточно? им вроде права администратора не нужны или теперь нужны?...
|
08 Apr 2016 10:31 |
|
|
Lavr
Supreme God
Joined: 21 Oct 2009 08:08 Posts: 7777 Location: Россия
|
Shaos, так я и проверяю вот это всё на Вендах-7: где какие права нужны, ну и всё остальное. На работе наблюдается массовый переход на Венду-7... что-то это не радует. Протеус вот, как ни странно, отлично заработал под Вендой-7-64, причем с флешки. Я даже не сразу осознал, что Венда-7- 64.
_________________ iLavr
|
08 Apr 2016 10:52 |
|
|
Lavr
Supreme God
Joined: 21 Oct 2009 08:08 Posts: 7777 Location: Россия
|
Я вот думаю, надо изменить тестовую программу. Не звук ожидать из спикера, а просто с каналом таймера поработать. Почитать "на лету" что-ли. Похоже, что до порта таймера я достаю, а звук спикера - это сама по себе проблема отдельная.
_________________ iLavr
|
08 Apr 2016 11:08 |
|
|
Lavr
Supreme God
Joined: 21 Oct 2009 08:08 Posts: 7777 Location: Россия
|
Со звуком спикера в ноутбуках ситуация вырисовывается следующая: Если в перечне Системных устройств присутствует Системный динамик, то звук спикера по каналу 2 таймера, видимо услышать можно и должно. Кстати, аппаратными ресурсами Системного динамика считают порт 61h, хотя на сам динамик в нём приходится только Бит 1, а Бит 0 - контролирует Gate канала 2 таймера. В новом ноутбуке Системный динамик в перечне Системных устройств у меня отсутствует, и, видимо, системная функция beep программно реализуется через звуковую карту. А бибиканье через канала 2 таймера, похоже, что никто не обещал. Но я уже чуть раньше сказал, что, похоже, тест доступа к портам, и, в частности, к портам таймера следует изменить, не рассчитывая на результат услышать beep. И я тест изменил вот как: Канал 2 таймера теперь программируется в Режим 0: Делитель загружается максимальный - 65536: | | | | Code: MOV AX,0000H ;(делитель) OUT 42H,AL ; мл.байт в port 42H, 8253 timer 2 JMP SHORT $+2 MOV AL,AH OUT 42H,AL ; ст.байт в port 42H, 8253 timer 2 IN AL,61H ; port 61H, 8255 port B, read JMP SHORT $+2 OR AL,03H; = 0000.0011b - установили 2 младших бита OUT 61H,AL; port 61H, 8255 B - spkr, etc JMP SHORT $+2 | | | | |
Теперь суть теста заключается в том, что мы читаем канал 2 таймера "на лету". Делитель по каждому тику тактовой частоты уменьшается на 1, и при достижении значения 0000H, счет в канале 2 должен прекратиться. В общем-то так оно и происходит... но при достижении значения 0000H, счет в канале 2 НЕ ПРЕКРАЩАЕТСЯ! Он начинается снова с максимального значения! А в режиме 0 так быть не должно! Так только режимы 2 и 3 работают... Предположение только одно, что в работу канала как-то вмешивется Венда... Есть, правда, предположение хуже, что таймер в VLSI-чипах не полностью идентичен 8254, но в это как-то верить не хочется... Попробую повторить тест под чистым DOS.
_________________ iLavr
|
10 Apr 2016 04:40 |
|
|
Lavr
Supreme God
Joined: 21 Oct 2009 08:08 Posts: 7777 Location: Россия
|
Результат меня просто потряс! Этот интегрированный в южный мост таймер, который должен, по идее, полностью повторять поведение оригинального i8254, В РЕЖИМЕ 0 КАНАЛА 2 ДЕЛАЕТ АВТОМАТИЧЕСКУЮ ЗАГРУЗКУ И ПРОДОЛЖАЕТ СЧЕТ!Ассемблерный код следующий: | | | | Code: SEG_A SEGMENT BYTE PUBLIC ASSUME CS:SEG_A, DS:SEG_A ORG 100h
BEEPER PROC FAR
START: JMP LOC_0021
TONE_HIGH DW 0854H ; 1.190.000/1000=1200Гц (делитель 3DFH) TONE_LOW DW 0A90H ; 1.190.000/3000=440Гц (делитель)4A6H; DATA_0010 DB 01H ; пpизнак совпадения и пеpеключения (не используем) DATA_0012 DB ' <-BEEPER: press any key to stop & exit!',00H TAB_HEX DB '0123456789ABCDEF'
BEEPER ENDP
LOC_0021: MOV AX,0F00H; узнаем pежим INT 10H PUSH BX ; сохpаним стpаницу XOR BX,BX; очистить окно MOV CX,BX; pазмеpами: MOV BH,07H; аттpибут MOV DH,24; 25 стpок на MOV DL,AH; AH столбцов MOV AX,0600H INT 10H POP BX ; восстановим стpаницу XOR DX,DX ; <- веpхний угол MOV AX,0200H INT 10H ; установим куpсоp
MOV BX,OFFSET DATA_0012 LOC_0020: MOV AL,CS:[BX] OR AL,AL JZ LOK_0021 MOV AH,0EH; записать символ из AL INT 10H INC BX JMP LOC_0020 LOK_0021: CALL PUT_BEEP; настроим таймер LOC_0022: MOV AL,80H; = чтение на лету, канал 2 OUT 43H,AL JMP SHORT $+2 IN AL,42H; low byte JMP SHORT $+2 MOV AH,AL; <- low byte IN AL,42H; high byte JMP SHORT $+2 ; OR AH,AL ; AH=AL=00h? ; JZ LOK_0022
LOC_VIDS:;_____ AL-SYMBOL; DI-OFFSET PUSH ES PUSH AX
XOR AX,AX MOV DI,AX; DI = 0000h смещение в буфере
MOV AX,0B800H; сегмент текст.буфера экрана MOV ES,AX POP AX
CALL SHOW_HEX MOV AL,AH CALL SHOW_HEX POP ES
MOV AX,0101H INT 16H ;_____ опрос клавиатуры без ожидания JZ LOC_0022 LOK_0022: CALL SHUT_UP ; INT 20H MOV AX,4C05H INT 21H ; Выход с ошибкой 5
;____________________________ Генеpация звука ________________________________ PUT_BEEP PROC NEAR PUSH AX ; MOV AX,CS:TONE_HIGH ;=880Гц (делитель) ; MOV AX,CS:TONE_LOW ;=440Гц (делитель) MOV AX,0000H ;=65536 (делитель) CALL LOCK_BEEP POP AX RET
PUT_BEEP ENDP ;---------------------------- Вывод звука ----------------------------------- LOCK_BEEP PROC NEAR ;________________________________ Настpоим таймеp ___________________________ PUSH DX PUSH AX ; AX - делитель сохpаним
; MOV AL,0B6H; = 1011.0110b - в pегистp команд MOV AL,0B0H; = 1011.0100b - в pегистp команд MOV DX,0043H OUT DX,AL ; port 43H, 8253 wrt timr mode JMP SHORT $+2 POP AX ; AX - делитель восстановим ;---------------------------------------------------------------------------- MOV DX,0042H OUT DX,AL ; port 42H, 8253 timer 2 spkr JMP SHORT $+2 MOV AL,AH OUT DX,AL ; port 42H, 8253 timer 2 spkr JMP SHORT $+2 ;________________________________ Включение звука ____________________________ IN AL,61H ; port 61H, 8255 port B, read JMP SHORT $+2 OR AL,03H; = 0000.0011b - установили 2 младших бита ; ¦L----- бит 0 = 1 включить таймеp(2) ; L------ бит 1 = 1 включить динамик OUT 61H,AL; port 61H, 8255 B - spkr, etc JMP SHORT $+2 POP DX RET LOCK_BEEP ENDP
;________________________________ Выключение звука ___________________________ SHUT_UP PROC NEAR IN AL,61H ; port 61H, 8255 port B, read JMP SHORT $+2 AND AL,0FCH; = 1111.1100b - сбpосили 2 младших бита ; ¦L---- бит 0 = 0 выключить таймеp(2) ; L----- бит 1 = 0 выключить динамик OUT 61H,AL ; port 61H, 8255 B - spkr, etc JMP SHORT $+2 OUT 61H,AL; RET SHUT_UP ENDP
SHOW_HEX PROC NEAR ; AL - байт на вывод в HEX виде PUSH AX PUSH CX
PUSH AX AND AL,0F0H MOV CL,4 SHR AL,CL CALL HEXASC MOV ES:[DI],AL INC DI INC DI POP AX
AND AL,0FH CALL HEXASC MOV ES:[DI],AL INC DI INC DI
POP CX POP AX RETN SHOW_HEX ENDP
;______________ Перекодировка ______ HEXASC PROC NEAR PUSH BX MOV BX,OFFSET TAB_HEX XLAT POP BX RETN HEXASC ENDP
;----------------------------------------------------------------------------- SEG_A ENDS
END START | | | | |
Если поменять комментарии вот в этих строчках и сделать активным код 0B6H, то спикер в режиме 3 тарахтит с частотой ~19 Hz. Если снять комментарий со следующих строк: то программа-таки выйдет из цикла чтения канала 2 таймера по достижению значения 0000Н, как, собственно, и было задумано, но сделает это случайным образом, когда AH=AL=00h случайно совпадет. У кого есть возможность скомпилировать и проверить это на своих ноутбуках - попробуйте!Результат меня зело обескуражил... Похоже, что интегрированный таймер упростили по соображению: всё равно он всегда в режиме 3 с автозагрузкой...P.S.Если я ничего в жизни по этому поводу не пропустил, то таймер 8254 в режиме 0 должен работать вот так:Но вдруг были какие-то иные директивы и распоряжения?
_________________ iLavr
|
10 Apr 2016 07:22 |
|
|
Lavr
Supreme God
Joined: 21 Oct 2009 08:08 Posts: 7777 Location: Россия
|
А вот выходит, что и пропустил... ( посыпаю голову пеплом) Слишком уж меня везде уверили, что i8253 и i8254 практически идентичны за небольшим исключением. А Дьявол как раз и кроется в деталях - продолжать счет по достижению 0000 - это, оказывается, фича i8254! http://www.scs.stanford.edu/10wi-cs140/pintos/specs/8254.pdfИ самое интересное, что я с этим сталкивался уже очень давно, когда писал эмулятор таймера 8253 для "Специалиста" на двух каналах интегрированного таймера 8254. Меня тогда, выходит, здорово выручила привычка не делать проверку на 0, а делать проверку на уход в минус, но с фичей я тогда, выходит, что до конца не разобрался... Виноват...
_________________ iLavr
|
10 Apr 2016 08:38 |
|
|
Lavr
Supreme God
Joined: 21 Oct 2009 08:08 Posts: 7777 Location: Россия
|
Ну а теперь о хорошем, коли уж все непонятки учтены... Я изменил программу согласно тому факту, что счетчик таймера не прекращает счет при переходе через 0000Н, и вот её новый вариант: | | | | Code: SEG_A SEGMENT BYTE PUBLIC ASSUME CS:SEG_A, DS:SEG_A ORG 100h
BEEPER PROC FAR
START: JMP LOC_0021
TONE_HIGH DW 0854H ; 1.190.000/1000=1200Гц (делитель 3DFH) TONE_LOW DW 0A90H ; 1.190.000/3000=440Гц (делитель)4A6H; DATA_0010 DB 01H ; пpизнак совпадения и пеpеключения (не используем) DATA_0012 DB '0000H <-TEST TIMER: press any key to stop & exit!',00H TAB_HEX DB '0123456789ABCDEF'
BEEPER ENDP
LOC_0021: MOV AX,0F00H; узнаем pежим INT 10H PUSH BX ; сохpаним стpаницу XOR BX,BX; очистить окно MOV CX,BX; pазмеpами: MOV BH,07H; аттpибут MOV DH,24; 25 стpок на MOV DL,AH; AH столбцов MOV AX,0600H INT 10H POP BX ; восстановим стpаницу XOR DX,DX ; <- веpхний угол MOV AX,0200H INT 10H ; установим куpсоp
MOV BX,OFFSET DATA_0012 LOC_0020: MOV AL,CS:[BX] OR AL,AL JZ LOK_0021 MOV AH,0EH; записать символ из AL INT 10H INC BX JMP LOC_0020 LOK_0021: CALL PUT_BEEP; настроим таймер LOC_0022: MOV AL,80H; = чтение на лету, канал 2 OUT 43H,AL JMP SHORT $+2 IN AL,42H; low byte JMP SHORT $+2 MOV AH,AL; <- low byte IN AL,42H; high byte JMP SHORT $+2 XCHG AH,AL CMP BX,AX; BX-AX MOV BX,AX; сохраним предыдущее значение JA LOC_0022 XCHG AH,AL LOC_VIDS:;_____ AL-SYMBOL; DI-OFFSET PUSH ES PUSH AX
XOR AX,AX MOV DI,AX; DI = 0000h смещение в буфере
MOV AX,0B800H; сегмент текст.буфера экрана MOV ES,AX POP AX
CALL SHOW_HEX MOV AL,AH CALL SHOW_HEX POP ES
MOV AX,0101H INT 16H ;_____ опрос клавиатуры без ожидания JZ LOC_0022 LOK_0022: CALL SHUT_UP ; INT 20H MOV AX,4C05H INT 21H ; Выход с ошибкой 5
;____________________________ Генеpация звука ________________________________ PUT_BEEP PROC NEAR PUSH AX ; MOV AX,CS:TONE_HIGH ;=880Гц (делитель) ; MOV AX,CS:TONE_LOW ;=440Гц (делитель) MOV AX,0000H ;=65536 (делитель) MOV BX,AX DEC BX CALL LOCK_BEEP POP AX RET
PUT_BEEP ENDP ;---------------------------- Вывод звука ----------------------------------- LOCK_BEEP PROC NEAR ;________________________________ Настpоим таймеp ___________________________ PUSH DX PUSH AX ; AX - делитель сохpаним
; MOV AL,0B6H; = 1011.0110b - в pегистp команд MOV AL,0B0H; = 1011.0100b - в pегистp команд MOV DX,0043H OUT DX,AL ; port 43H, 8253 wrt timr mode JMP SHORT $+2 POP AX ; AX - делитель восстановим ;---------------------------------------------------------------------------- MOV DX,0042H OUT DX,AL ; port 42H, 8253 timer 2 spkr JMP SHORT $+2 MOV AL,AH OUT DX,AL ; port 42H, 8253 timer 2 spkr JMP SHORT $+2 ;________________________________ Включение звука ____________________________ IN AL,61H ; port 61H, 8255 port B, read JMP SHORT $+2 OR AL,03H; = 0000.0011b - установили 2 младших бита ; ¦L----- бит 0 = 1 включить таймеp(2) ; L------ бит 1 = 1 включить динамик OUT 61H,AL; port 61H, 8255 B - spkr, etc JMP SHORT $+2 POP DX RET LOCK_BEEP ENDP
;________________________________ Выключение звука ___________________________ SHUT_UP PROC NEAR IN AL,61H ; port 61H, 8255 port B, read JMP SHORT $+2 AND AL,0FCH; = 1111.1100b - сбpосили 2 младших бита ; ¦L---- бит 0 = 0 выключить таймеp(2) ; L----- бит 1 = 0 выключить динамик OUT 61H,AL ; port 61H, 8255 B - spkr, etc JMP SHORT $+2 OUT 61H,AL; RET SHUT_UP ENDP
SHOW_HEX PROC NEAR ; AL - байт на вывод в HEX виде PUSH AX PUSH CX
PUSH AX AND AL,0F0H MOV CL,4 SHR AL,CL CALL HEXASC MOV ES:[DI],AL INC DI INC DI POP AX
AND AL,0FH CALL HEXASC MOV ES:[DI],AL INC DI INC DI
POP CX POP AX RETN SHOW_HEX ENDP
;______________ Перекодировка ______ HEXASC PROC NEAR PUSH BX MOV BX,OFFSET TAB_HEX XLAT POP BX RETN HEXASC ENDP
;----------------------------------------------------------------------------- SEG_A ENDS
END START | | | | |
В ней есть атавизмы старого варианта, но теперь она четко фиксирует лишь переход через 0000Н, и выводит следующее после этого число. Назначение программы - сугубо проверить доступ к таймеру командами IN и OUT, а также работоспособность при этом самого таймера по каналу 2, с адресом 42Н. Результаты на этот раз приятные сверх меры! Таймер доступен на ноутбуке из-под голой DOS, несмотря на довольно гнусную архитектуру ноутбука, где почти всё висит на "внутренней шине" и по адресам портов недоступно. LPT и COM-порты отсутствуют как факт. В наличии только 2 USB. Для пробы в голой DOS я стартовал с загрузочной флешки с поддержкой NTFS. Вторая приятная вещь: эта же самая программа отлично работает под Вендой-7-32 безо всяких DOS-боксов, что меня удивило, ведь пишут, что команды IN и OUT - привелегированные, и вызывают исключение или не выполняются. У меня - выполняются. Теперь о доступе через библиотеку inpout32.dll. Доступ к портам происходит через неё под Вендой-7-32 просто великолепно. Я, правда, с перепугу переписал заново приложение, контролируя всё более тщательным образом: Оно теперь демонстрирует обратный отсчет при чтении таймера "на лету". Кстати говоря, скачал я мануал и на таймер i8253, где тоже нашел упоминание о том, что он продолжает счет при переходе через 0000Н. Странно, почему мне не попадалась такая информация о таймере КР580ВИ53... Теперь буду пробовать эти программы на сторонних Вендах-7, где я на правах гостя. Ну и эта задача, на мой взгляд, отвечает на вопрос, зачем мне лезть к таймеру. Таймер - это единственное устройство, на всех воможных посторонних машинах, которое заведомо в них есть и точно находится всегда по адресам 40Н...43Н. Тем более, что обращение к каналу 2 таймера совершенно безопасно для всех систем, но позволяет проверить доступость портов ввода-вывода. А на моем ноутбуке практически больше и нет устройств, доступных по адресам портов, к которым можно было бы обратиться не создавая лишних проблем. Теперь о том, почему, собственно, топик называется FreeBASIC... Дело в том, что для возможости программирования на незнакомых машинах, я всегда носил на флешке Visual Basic 3.0. Он великолепно работал автономно, никак не затрагивая ни реестр, ни какую другую требуху этих машин. Но вот Венда-7-64 ему в работе отказала, что вынудило меня начать искать Visual Basic 3.0альтернативу, столь же неприхотливо работающую с флешки и не требующую установки. Пока не нашел...
_________________ iLavr
|
10 Apr 2016 21:45 |
|
|
Lavr
Supreme God
Joined: 21 Oct 2009 08:08 Posts: 7777 Location: Россия
|
А вот под Вендой-7-64 этот фокус не прошел, даже с правами администратора. При запуске она ответила окном:"Денаед!" Но с другой стороны удивило, что в Системных устройствах Венды-7-64 оказался "Системный динамик", хотя всюду пишут, что она его не поддерживает. Буду разбираться дальше...
_________________ iLavr
|
12 Apr 2016 13:54 |
|
|
Lavr
Supreme God
Joined: 21 Oct 2009 08:08 Posts: 7777 Location: Россия
|
Сегодня дошли руки еще поэкспериментировать с портами под Вендой-7-64 в гостевом доступе без прав администратора. Ну чтобы эксперимент считать чистым, Венда была у меня вот такая: С вот таким набором устройств: То есть Системный таймер в устройствах есть, а Системного динамика - нет. Динамическая библиотека доступа к портам НЕ РЕГИСТРИРОВАЛАСЬ в Венде 7, а лежала в папке на диске C:, куда мне всё перекинуть вместе с компилятором было позволено, а вот в Програм Файлз - НЕТ. Ну и доступ к портам сработал без вопросов... Вот это невзрачное с точки зрения MS-DOS происшествие, что я без проблем обратился к портам таймера, и есть "взлом системы", о чем мне тут ранее рассказывали? Также в режиме гостевого доступа я спокойно зарегистрировал компилятор ( самое смешное, что я сейчас сижу на другой Венде-7-64 с правами Администратора а компилятор зарегить она не дает...)
_________________ iLavr
|
15 Apr 2016 07:53 |
|
|
Lavr
Supreme God
Joined: 21 Oct 2009 08:08 Posts: 7777 Location: Россия
|
Продолжаем опыты над Вендой-7-64, где я сижу с правами Администратора... Ну зарегить она не дает, поскольку хочет, чтобы я запустил приложение от имени администратора... Это особо ни на что не влияет, только мне напоминают "злым окном", что я работаю на незарегистрированной копии... Ладно... зарегистрирую от имени Администратора, чтобы не мешало мне. А вот теперь самое интересное! Честно скажу, я этого как бы уже и не ожидал... Конфигурация этой Венды-7-64 вот такая: То есть, есть и Системный таймер и Встроенный динамик. Я, честно говоря, перед опытами сегодня спросил владельца машины - слышал ли он хоть раз её спикер (может его внутри нет) - он ответил мне отрицательно... ТАК ВОТ, ДЖЕНТЛЬМЕНЫ, ОНА СПИКЕРОМ ЗАБИБИКАЛААААААА!!!! Динамическая библиотека доступа к портам inpout32.dll НЕ РЕГИСТРИРОВАЛАСЬ в Венде 7, а также лежала в папке на диске C:
_________________ iLavr
|
15 Apr 2016 08:36 |
|
|
Who is online |
Users browsing this forum: No registered users and 2 guests |
|
You cannot post new topics in this forum You cannot reply to topics in this forum You cannot edit your posts in this forum You cannot delete your posts in this forum You cannot post attachments in this forum
|
|