nedoPC.org

Electronics hobbyists community established in 2002
Atom Feed | View unanswered posts | View active topics It is currently 28 Mar 2024 08:54



Reply to topic  [ 48 posts ]  Go to page 1, 2, 3, 4  Next
FreeBASIC 
Author Message
Supreme God
User avatar

Joined: 21 Oct 2009 08:08
Posts: 7777
Location: Россия
Reply with quote
Quote:
FreeBASIC — язык программирования высокого уровня по синтаксису наиболее близкий к QuickBASIC, а также компилятор для него (FreeBASIC Compiler). Первоначально компилятор разрабатывался как свободная альтернатива Microsoft QuickBasic, но скоро обзавёлся новыми возможностями, превратившись в мощное средство разработки. Хотя первые версии компилятора были написаны на Visual Basic, теперь он может откомпилировать сам себя.
Компилирует QBasic и FreeBASIC код в 32 и 64-битные исполняемые Win32, DOS (в защищённом режиме) и Linux x86 модули.

Я и раньше про него слышал, но за прошедшее время язык разбогател и стал опенсорцным:
http://free-basic.ru/download.html

Image

Не то, чтобы я тут BASIC-и пеарю... но понадобилась мне простая среда разработки Виндоуз-приложений,
работающая без инсталляции с флешки и не задевающая админских прав на Вынь 7...10.
Пока ничего подходящего не нахожу....

_________________
iLavr


02 Apr 2016 06:31
Profile
Supreme God
User avatar

Joined: 21 Oct 2009 08:08
Posts: 7777
Location: Россия
Reply with quote
Lavr wrote:
понадобилась мне простая среда разработки Виндоуз-приложений,
работающая без инсталляции с флешки и не задевающая админских прав на Вынь 7...10...

И что-то я просто впадаю в ступор... :osad: Потому как мне ещё надо напрямую обратиться к портам таймера.
И драйвер-то у меня есть, но читаю:
Quote:
When you install your application to a Windows NT/2000/XP system, you have two choices:

1) If all the users have administrative right (which is usually the case unless
someone in your IT department has not given you administrative rights) you can
install ntport.dll and zntport.sys to your client's WinNT\System32 directory. In
this case, you need not any other configuration.

2) If some users don't have administrative right, you need create an
installation program to install the NTPort Library driver. The installation
program should do following steps:

- Install ntport.dll to WinNT\System32 directory
- Install zntport.sys to WinNT\System32\drivers directory
- Import the registry settings from ntport2.reg - this file is in the ntport directory
- Restart Windows

In this case, you still need administrative right to run the installation
program, but after the reboot, any normal user can use your program.

Выходит, без прав администратора на первой попавшейся машине к порту таймера и никак не обратиться
под Вынь 7...10 из своего приложения?

_________________
iLavr


06 Apr 2016 09:11
Profile
Senior

Joined: 27 Jul 2015 15:20
Posts: 101
Reply with quote
Я извиняюсь, а зачем обращаться к таймеру?


06 Apr 2016 11:02
Profile
Supreme God
User avatar

Joined: 21 Oct 2009 08:08
Posts: 7777
Location: Россия
Reply with quote
Затея вот в чем: со времен начала Виндовса, когда M$ стала мешать людям работать с портами
напрямую, пишу я вот такую подвиндовую программку:
Attachment:
beep3xx.gif
beep3xx.gif [ 3 KiB | Viewed 13024 times ]

Это просто настройка канала 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
Attachment:
beep98.gif
beep98.gif [ 3.68 KiB | Viewed 13024 times ]

Он успешно работает под Вендами 3.хх, 95, 98, Ме и под ХР ...

Пробовал я вчера все три варианта под Windows 7:

Самый первый вариант работает, не падает, но издает полную тишину! :o

Последний вариант через библиотеку portio.dll - тоже издает полную тишину. :osad:

Я как администратор на своем ноутбуке зарегистрировал новые библиотеки ntport.dll и zntport.sys.
Адаптировал программу под них, программа работает, но звука таймера нет. :-?

А вот с ДОС-овским вариантом вышло интересно! :esurprised:

Во-первых, он очень поганно, но звучит в ДОС-бокс. Это странно - таймер-то "железка" и звук
должен быть ровный, но кажается, что в ДОС-бокс таймер эмулируют софтверно через звуковую
карту. Звучит с подвываниями и "федингами".

Но самое потрясающее происходит при запуске ДОС-программы прямо под Windows 7:
при запуске она молчит, а вот после её выключения Windows 7 начинает издавать якобы
"звук таймера"! :lol:
Ощущение - как будто Венда записала звук в файл и теперь проигрывает его!
Звук прекращается при повторном запуске этой ДОС-программы.

Вот такие опыты с невинным, казалось бы, портом 2 таймера 8254 под Windows 7.


P.S. Почитал про порты под Windows 7 какую-то неубедительную бредятину здесь:
Открытие портов ввода/вывода в Windows 7.

P.P.S. А вот здесь про работу с портами под Windows 7 расписали, пожалуй, поумнее:
ПРОГРАММИРОВАНИЕ УСТРОЙСТВ ВВОДА-ВЫВОДА

_________________
iLavr


07 Apr 2016 01:50
Profile
God

Joined: 02 Jan 2006 02:28
Posts: 1390
Location: Abakan
Reply with quote
Да скорее всего венда просто перехватывает доступ к портам и пропускает обращение, а досбокс пытается обращение к портам транслировать через функции венды, а не напрямую, бо напрямую ему венда не даст. От того и неправильный звук.


07 Apr 2016 04:44
Profile
Supreme God
User avatar

Joined: 21 Oct 2009 08:08
Posts: 7777
Location: Россия
Reply with quote
jdigreze wrote:
досбокс пытается обращение к портам транслировать через функции венды, а не напрямую, бо напрямую ему венда не даст. От того и неправильный звук.

Если до канала таймера хоть каким образом "достучались", задали ему режим и делитель, а также открыли GATE, никакая венда, да и никто другой не может испортить аппаратную организацию звука.
А звук плавает под ДОС-бокс просто неподетски. Кстати, звук из-под самой Венды куда ровнее.

_________________
iLavr


07 Apr 2016 05:09
Profile
God

Joined: 02 Jan 2006 02:28
Posts: 1390
Location: Abakan
Reply with quote
Lavr wrote:
Если до канала таймера хоть каким образом "достучались", задали ему режим и делитель, а также открыли GATE, никакая венда, да и никто другой не может испортить аппаратную организацию звука.
Вообще да. Ну, тогда предположение о софтовой эмуляции наверно будет более правдоподобно.


07 Apr 2016 06:59
Profile
Supreme God
User avatar

Joined: 21 Oct 2009 08:08
Posts: 7777
Location: Россия
Reply with quote
Сегодня на работе повторил опыты с "подВендовыми" программами на Венде ХР.
Странно, но супротив Венды 7 обе программы просто не начали работать, упав
с ошибкой вызова динамической библиотеки.

Хотя, прочитав статью по ссылке выше, я ожидал другого:
Quote:
...при прямом низкоуровневом управлении устройствами с использованием инструкций (например, IN и OUT), которые позволяют читать или писать в порт в/в или обращаться к системной области памяти в приложении Windows XP, появится сообщение об исключении в связи с привилегированной инструкцией и будет предложен выбор: завершить или перейти к отладке приложения. Если вы пытаетесь производить операции в/в из 16-битного DOS приложения в окне консоли Windows XP, то операция ввода-вывода игнорируется либо эмулируется виртуальными драйверами устройств NT. Исключения не произойдет, но прямого в/в также не произойдет.

Произошло не то, чего я ожидал...
Странно, но под Вендой 7 программы просто молча исполнялись, не падая...

Значит, чтобы этого избежать, и обмануть Венду 7 ДАЖЕ в её 64-разрядной ипостаси, но при этом
не потерять совместимости с Вендами линейки 9х, советуют пользовать хитрозадуманный драйвер
inpout32.dll.
Quote:
Совместимость со всеми ОС Windows обеспечивается тем, что сначала драйвер проверяет, какая ОС установлена. Если это 9x, то при обращении к библиотеке с помощью функций Out32(адрес порта, байт данных) – это для записи в порт и Inp32 (адрес порта) – для чтения из порта, драйвер конвертирует эти обращения к стандартным и известным нам функциям _outp(адрес порта, байт данных) и _inp(адрес порта). Если же она имеет дело с NT, то обращения конвертируются в запросы к стандартному драйверу ОС, через который и идет обмен информацией с портом.

Я про этот драйвер слышал, скачивал его (он есть даже с исходниками), но попробовать пока не доводилось...
Буду посмотреть! :wink:

_________________
iLavr


07 Apr 2016 07:49
Profile
Admin
User avatar

Joined: 08 Jan 2003 23:22
Posts: 22409
Location: Silicon Valley
Reply with quote
IgorR76 wrote:
Я извиняюсь, а зачем обращаться к таймеру?


Оказывается у меня много неодобренных сообщений накопилось - извиняюсь :roll:

_________________
:dj: https://mastodon.social/@Shaos


07 Apr 2016 08:56
Profile WWW
Supreme God
User avatar

Joined: 21 Oct 2009 08:08
Posts: 7777
Location: Россия
Reply with quote
IgorR76 wrote:
Я извиняюсь, а зачем обращаться к таймеру?

В современных ноутбуках нет LPT-порта, COM-порта тоже нет, так что чтобы обратиться
к нормальному "железному" порту и увидеть (услышать) результат, остается только таймер,
аналог 8254, запрятанный куда-то в "мост".


Значит перекомпилировал я самый первый вариант программы под Win32 и с обращениями
к портам через библиотеку inpout32.dll.
Attachment:
beep3x1.gif
beep3x1.gif [ 3.04 KiB | Viewed 13007 times ]

Под Вынь 98 работает отлично, буду переносить сейчас и тестировать под Вендой 7.

_________________
iLavr


07 Apr 2016 09:59
Profile
Supreme God
User avatar

Joined: 21 Oct 2009 08:08
Posts: 7777
Location: Россия
Reply with quote
Результат довольно обескураживающий... :o
Возможно, я сделал не совсем корректно, и нужна регистрация inpout32.dll в Венде7,
но для начала я просто положил inpout32.dll рядом с исполняемым файлом.
Исполняемый файл библиотеку находит, работает с ней
Attachment:
beep0.gif
beep0.gif [ 4.08 KiB | Viewed 12998 times ]

Но звука от таймера нет! 8)
Буду пробовать зарегистрировать inpout32.dll в Венде7...

А вот второй результат: запускается DOS-программа прямо под Вендой 7:
Attachment:
beep1.gif
beep1.gif [ 11.48 KiB | Viewed 12998 times ]

По идее - должен быть звук, но - тишина.... А вот если я её закрываю не нажав на любую клавишу,
а некорректно - крестиком, то ТАЙМЕР НАЧИНАЕТ ЗВУЧАТЬ! :esurprised:
И это точно таймер, так как звучит разными тонами, как и написано в DOS-программе!
И ничем его не заткнешь, как только новым вызовом самой этой программы... :mrgreen:

И я вот еще что думаю: что-то должно разрешать подавать сигнал "спикера" на звуковую карту,
поскольку спикера отдельного в ноуте скорее всего нет.

_________________
iLavr


07 Apr 2016 13:08
Profile
Supreme God
User avatar

Joined: 21 Oct 2009 08:08
Posts: 7777
Location: Россия
Reply with quote
А со спикером у ноутбуков не так-то всё и просто...
Отключаем системный динамик wrote:
1 Пуск — Выполнить — regedit

2 В разделе реестра HKEY_CURRENT_USER\Control Panel\Sound ищем строковый параметр Beep и меняем его значение на NO.

3 Перегружаем ПК.

Также можно открыть диспетчер устройств, включить в нем отображение скрытых устройств и в списке «Non Plug and Play Drivers» отключить устройство «Beep».


Есть ещё вариант, но у меня он не сработал...
Quote:
Выключить спикер: net stop beep
Включить спикер: net start beep
(через Пуск/выполнить естественно)

_________________
iLavr


07 Apr 2016 13:42
Profile
Supreme God
User avatar

Joined: 21 Oct 2009 08:08
Posts: 7777
Location: Россия
Reply with quote
Кто бы мог подумать, что вокруг атавизмов таймера 8254 и спикера ломаются такие копья! :esurprised:

Что там у нас с драйвером Beep в Windows 7?
Quote:
PC стали популярным товаром. Что означает, что производители PC стали искать способы снизить их стоимость. Они посмотрели на 8254 и спросили: "Почему мы не можем его убрать?".
Получилось так, что они не могли это сделать. И ответ на то, почему они не могли это сделать, пришёл с совершенно неожиданной стороны. ADA - Americans with Disabilities Act - закон о (американских) инвалидах.

_________________
iLavr


07 Apr 2016 15:01
Profile
Admin
User avatar

Joined: 08 Jan 2003 23:22
Posts: 22409
Location: Silicon Valley
Reply with quote
IgorR76 wrote:
Lavr wrote:
В современных ноутбуках нет LPT-порта, COM-порта тоже нет


Тем более не пойму, зачем обращаться напрямую к таймеру... Если измерить временной интервал или издать звук - есть функции WinAPI. Расскажите Ваши идеи! Интересно!


Кстати я тоже не догнал нафига нам напрямую к таймеру обращаться?...

_________________
:dj: https://mastodon.social/@Shaos


07 Apr 2016 15:16
Profile WWW
Supreme God
User avatar

Joined: 21 Oct 2009 08:08
Posts: 7777
Location: Россия
Reply with quote
Shaos wrote:
Кстати я тоже не догнал нафига нам напрямую к таймеру обращаться?...

Первое объяснение будет грубым, и звучало оно здесь давно:"если кто-то что-то делает, значит оно ему надо.
Если оно Вам не надо - можете идти лесом.
"

Второе объяснение будет более корректным:
Quote:
F>Как заставить пищать PC speaker на Win7 x64 ?
F>Скажите уважаемые люди. Есть ли вообще возможность у 64 разрядной операционной системы издавать звук с помощью спикера?

у ОС — благодаря М$ теперь нет. Зато у нас — есть =)
берем inpoutx64.dll, и программируем порты таймера напрямую!
у меня на win7 x64 скайп через это звонит, с помощью Skype4com
Code:
public class PortAccess
{
[DllImport("inpoutx64.dll", EntryPoint = "Out32")]
public static extern void Output(int adress, int value);

[DllImport("inpoutx64.dll", EntryPoint = "Inp32")]
public static extern int Input(int adress);
}

class Program
{
static void HBeep(int tone, int duration)
{
int div = 1193180 / tone;

PortAccess.Output(0x43, 182);

PortAccess.Output(0x42, div & 0xFF);
PortAccess.Output(0x42, (div >> 8) & 0xFF);

int v = PortAccess.Input(0x61);
PortAccess.Output(0x61, v | 0x03);

System.Threading.Thread.Sleep(duration);

v = PortAccess.Input(0x61);
PortAccess.Output(0x61, v & ~0x03);
}
}
Quote:
Задача простая: как в Windows 7 банально пикнуть системным динамиком (пищалкой-спикером)? Если в RAD Studio (версия студии не имеет значения) вызвать функцию, к примеру:
Beep(400, 500); // C++Builder
Winapi.Windows.Beep(400, 500); // Delphi
звук раздастся из колонок, но не из пищалки! Это ограничение Windows 7.

http://forum.ru-board.com/topic.cgi?forum=33&topic=11977&start=340
http://forum.qip.ru/showthread.php?t=18589&page=6&p=391957
http://rsdn.ru/forum/winapi/3714380.flat

Вот и я примерно то же самое делаю, но звука пока нет... :-?
Я доходчиво объяснил?

_________________
iLavr


07 Apr 2016 16:16
Profile
Display posts from previous:  Sort by  
Reply to topic   [ 48 posts ]  Go to page 1, 2, 3, 4  Next

Who is online

Users browsing this forum: No registered users and 22 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

Search for:
Jump to:  
Powered by phpBB® Forum Software © phpBB Group
Designed by ST Software.