|
nedoPC.orgElectronics hobbyists community established in 2002 |
|
Author |
Message |
Lavr
Supreme God
Joined: 21 Oct 2009 08:08 Posts: 7777 Location: Россия
|
Я и раньше про него слышал, но за прошедшее время язык разбогател и стал опенсорцным: http://free-basic.ru/download.htmlНе то, чтобы я тут BASIC-и пеарю... но понадобилась мне простая среда разработки Виндоуз-приложений, работающая без инсталляции с флешки и не задевающая админских прав на Вынь 7...10. Пока ничего подходящего не нахожу....
_________________ iLavr
|
02 Apr 2016 06:31 |
|
|
Lavr
Supreme God
Joined: 21 Oct 2009 08:08 Posts: 7777 Location: Россия
|
И что-то я просто впадаю в ступор... Потому как мне ещё надо напрямую обратиться к портам таймера. И драйвер-то у меня есть, но читаю: Выходит, без прав администратора на первой попавшейся машине к порту таймера и никак не обратиться под Вынь 7...10 из своего приложения?
_________________ iLavr
|
06 Apr 2016 09:11 |
|
|
IgorR76
Senior
Joined: 27 Jul 2015 15:20 Posts: 102
|
Я извиняюсь, а зачем обращаться к таймеру?
|
06 Apr 2016 11:02 |
|
|
Lavr
Supreme God
Joined: 21 Oct 2009 08:08 Posts: 7777 Location: Россия
|
Затея вот в чем: со времен начала Виндовса, когда M$ стала мешать людям работать с портами напрямую, пишу я вот такую подвиндовую программку: Это просто настройка канала 2 таймера 8254 на извлечение звука частотой ~ 440 Hz. Приложение 16-разрядное, лезет в порты само через IN PORT и OUT PORT. И я нигде не слышал, что извлечение звука из канала 2 таймера как-то вредило Венде. Эта программулька нормально работает под Вендами 3.хх, 95, 98, Ме. А вот под ХР - уже с переменным успехом. У неё есть под-ДОС-овский прототип BEEPER.ASM: | | | | 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 4A6H;854H ;1.190.000/1000=1200Гц (делитель 3DFH) TONE_LOW DW 4A6H;0A90H ;1.190.000/3000=440Гц (делитель) DATA_0010 DB 01H ; пpизнак совпадения и пеpеключения DATA_0012 DB 'BEEPER: press any key to stop & exit!',00H
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 LOC_0022 MOV AH,0EH; записать символ из AL INT 10H INC BX JMP LOC_0020 LOC_0022: CALL PUT_BEEP MOV AX,0101H INT 16H JZ LOC_0022 ; INT 20H MOV AX,4C05H INT 21H ;Выход с ошибкой 5
;____________________________ Генеpация звука ________________________________ PUT_BEEP PROC NEAR PUSH AX MOV AX,CS:TONE_HIGH ;=880Гц (делитель)
NEG CS:DATA_0010 ; пеpеключатель ? JL LOC_0011 ; Jump if <
MOV AX,CS:TONE_LOW ;=440Гц (делитель) JMP SHORT LOC_0011 LOC_0011: 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 команд ; L+L+ L+-L--- код двоичный ; ¦ ¦ L----- 011 - pежим 3 - генеp.меандpа ; ¦ L-------- 11 - мл.байт, ст.байт ; L---------- 10 - канал 2 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
;______________________ Фоpмиpуем задеpжку чеpез пpеpывание __________________ PUSH BX PUSH DX MOV BX,0004H ; задеpжка 2x 1/18 cек = 0.22 c XOR AX,AX ; функция чтения счетчка INT 1AH ; получим значение в [DX} ADD BX,DX LOC_0013: INT 1AH ; получим значение в [DX] CMP DX,BX JC LOC_0013 ; Jump if not zero POP DX POP BX ;________________________________ Выключение звука ___________________________ 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 POP DX RET LOCK_BEEP ENDP ;----------------------------------------------------------------------------- SEG_A ENDS
END START
| | | | |
Он тоже нормально работает под Вендами 3.хх, 95, 98, Ме порой и под ХР ... Позже я написал еще один подВиндовый вариант, который использует dll-библиотеку portio.dllОн успешно работает под Вендами 3.хх, 95, 98, Ме и под ХР ... Пробовал я вчера все три варианта под Windows 7: Самый первый вариант работает, не падает, но издает полную тишину! Последний вариант через библиотеку portio.dll - тоже издает полную тишину. Я как администратор на своем ноутбуке зарегистрировал новые библиотеки ntport.dll и zntport.sys. Адаптировал программу под них, программа работает, но звука таймера нет. А вот с ДОС-овским вариантом вышло интересно! Во-первых, он очень поганно, но звучит в ДОС-бокс. Это странно - таймер-то "железка" и звук должен быть ровный, но кажается, что в ДОС-бокс таймер эмулируют софтверно через звуковую карту. Звучит с подвываниями и "федингами". Но самое потрясающее происходит при запуске ДОС-программы прямо под Windows 7: при запуске она молчит, а вот после её выключения Windows 7 начинает издавать якобы "звук таймера"! Ощущение - как будто Венда записала звук в файл и теперь проигрывает его! Звук прекращается при повторном запуске этой ДОС-программы. Вот такие опыты с невинным, казалось бы, портом 2 таймера 8254 под Windows 7. P.S. Почитал про порты под Windows 7 какую-то неубедительную бредятину здесь:Открытие портов ввода/вывода в Windows 7.P.P.S. А вот здесь про работу с портами под Windows 7 расписали, пожалуй, поумнее:ПРОГРАММИРОВАНИЕ УСТРОЙСТВ ВВОДА-ВЫВОДА
_________________ iLavr
|
07 Apr 2016 01:50 |
|
|
jdigreze
God
Joined: 02 Jan 2006 02:28 Posts: 1388 Location: Abakan
|
Да скорее всего венда просто перехватывает доступ к портам и пропускает обращение, а досбокс пытается обращение к портам транслировать через функции венды, а не напрямую, бо напрямую ему венда не даст. От того и неправильный звук.
|
07 Apr 2016 04:44 |
|
|
Lavr
Supreme God
Joined: 21 Oct 2009 08:08 Posts: 7777 Location: Россия
|
Если до канала таймера хоть каким образом "достучались", задали ему режим и делитель, а также открыли GATE, никакая венда, да и никто другой не может испортить аппаратную организацию звука. А звук плавает под ДОС-бокс просто неподетски. Кстати, звук из-под самой Венды куда ровнее.
_________________ iLavr
|
07 Apr 2016 05:09 |
|
|
jdigreze
God
Joined: 02 Jan 2006 02:28 Posts: 1388 Location: Abakan
|
Вообще да. Ну, тогда предположение о софтовой эмуляции наверно будет более правдоподобно.
|
07 Apr 2016 06:59 |
|
|
Lavr
Supreme God
Joined: 21 Oct 2009 08:08 Posts: 7777 Location: Россия
|
Сегодня на работе повторил опыты с "подВендовыми" программами на Венде ХР. Странно, но супротив Венды 7 обе программы просто не начали работать, упав с ошибкой вызова динамической библиотеки. Хотя, прочитав статью по ссылке выше, я ожидал другого: Произошло не то, чего я ожидал... Странно, но под Вендой 7 программы просто молча исполнялись, не падая... Значит, чтобы этого избежать, и обмануть Венду 7 ДАЖЕ в её 64-разрядной ипостаси, но при этом не потерять совместимости с Вендами линейки 9х, советуют пользовать хитрозадуманный драйвер inpout32.dll. Я про этот драйвер слышал, скачивал его (он есть даже с исходниками), но попробовать пока не доводилось... Буду посмотреть!
_________________ iLavr
|
07 Apr 2016 07:49 |
|
|
Shaos
Admin
Joined: 08 Jan 2003 23:22 Posts: 22758 Location: Silicon Valley
|
Оказывается у меня много неодобренных сообщений накопилось - извиняюсь
|
07 Apr 2016 08:56 |
|
|
Lavr
Supreme God
Joined: 21 Oct 2009 08:08 Posts: 7777 Location: Россия
|
В современных ноутбуках нет LPT-порта, COM-порта тоже нет, так что чтобы обратиться к нормальному "железному" порту и увидеть (услышать) результат, остается только таймер, аналог 8254, запрятанный куда-то в "мост". Значит перекомпилировал я самый первый вариант программы под Win32 и с обращениями к портам через библиотеку inpout32.dll. Под Вынь 98 работает отлично, буду переносить сейчас и тестировать под Вендой 7.
_________________ iLavr
|
07 Apr 2016 09:59 |
|
|
Lavr
Supreme God
Joined: 21 Oct 2009 08:08 Posts: 7777 Location: Россия
|
Результат довольно обескураживающий... Возможно, я сделал не совсем корректно, и нужна регистрация inpout32.dll в Венде7, но для начала я просто положил inpout32.dll рядом с исполняемым файлом. Исполняемый файл библиотеку находит, работает с ней Но звука от таймера нет! Буду пробовать зарегистрировать inpout32.dll в Венде7... А вот второй результат: запускается DOS-программа прямо под Вендой 7: По идее - должен быть звук, но - тишина.... А вот если я её закрываю не нажав на любую клавишу, а некорректно - крестиком, то ТАЙМЕР НАЧИНАЕТ ЗВУЧАТЬ! И это точно таймер, так как звучит разными тонами, как и написано в DOS-программе! И ничем его не заткнешь, как только новым вызовом самой этой программы... И я вот еще что думаю: что-то должно разрешать подавать сигнал "спикера" на звуковую карту, поскольку спикера отдельного в ноуте скорее всего нет.
_________________ iLavr
|
07 Apr 2016 13:08 |
|
|
Lavr
Supreme God
Joined: 21 Oct 2009 08:08 Posts: 7777 Location: Россия
|
А со спикером у ноутбуков не так-то всё и просто... Есть ещё вариант, но у меня он не сработал...
_________________ iLavr
|
07 Apr 2016 13:42 |
|
|
Lavr
Supreme God
Joined: 21 Oct 2009 08:08 Posts: 7777 Location: Россия
|
Кто бы мог подумать, что вокруг атавизмов таймера 8254 и спикера ломаются такие копья! Что там у нас с драйвером Beep в Windows 7?
_________________ iLavr
|
07 Apr 2016 15:01 |
|
|
Shaos
Admin
Joined: 08 Jan 2003 23:22 Posts: 22758 Location: Silicon Valley
|
Кстати я тоже не догнал нафига нам напрямую к таймеру обращаться?...
|
07 Apr 2016 15:16 |
|
|
Lavr
Supreme God
Joined: 21 Oct 2009 08:08 Posts: 7777 Location: Россия
|
Первое объяснение будет грубым, и звучало оно здесь давно:" если кто-то что-то делает, значит оно ему надо. Если оно Вам не надо - можете идти лесом." Второе объяснение будет более корректным: http://forum.ru-board.com/topic.cgi?forum=33&topic=11977&start=340http://forum.qip.ru/showthread.php?t=18589&page=6&p=391957http://rsdn.ru/forum/winapi/3714380.flatВот и я примерно то же самое делаю, но звука пока нет... Я доходчиво объяснил?
_________________ iLavr
|
07 Apr 2016 16:16 |
|
|
Who is online |
Users browsing this forum: No registered users and 4 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
|
|