Ну а теперь о хорошем, коли уж все непонятки учтены...  
 
 
Я изменил программу согласно тому факту, что счетчик таймера не прекращает счет при переходе 
через 0000Н, и вот её новый вариант:
Code: Select all
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 - привелегированные, и
вызывают исключение или не выполняются. У меня - выполняются.  
 
 
8254dos.gif
Теперь о доступе через библиотеку 
inpout32.dll. Доступ к портам происходит через неё под
Вендой-7-32 просто великолепно. Я, правда, с перепугу переписал заново приложение, контролируя
всё более тщательным образом:
8254tst.gif
Оно теперь демонстрирует обратный отсчет при чтении таймера "на лету".
Кстати говоря, скачал я мануал и на таймер 
i8253, где тоже нашел упоминание о том, что
он продолжает счет при переходе через 0000Н. Странно, почему мне не попадалась такая информация
о таймере 
КР580ВИ53...  
 
 
Теперь буду пробовать эти программы на сторонних Вендах-7, где я на правах гостя.
Ну и эта задача, на мой взгляд, отвечает на вопрос, зачем мне лезть к таймеру.
Таймер - это единственное устройство, на всех воможных посторонних машинах, которое заведомо
в них есть и точно находится всегда по адресам 
40Н...43Н.
Тем более, что обращение к каналу 2 таймера совершенно безопасно для всех систем, но позволяет
проверить доступость портов ввода-вывода.
А на моем ноутбуке практически больше и нет устройств, доступных по адресам портов, к которым
можно было бы обратиться не создавая лишних проблем.
Теперь о том, почему, собственно, топик называется 
FreeBASIC... Дело в том, что для возможости
программирования на незнакомых машинах, я всегда носил на флешке 
Visual Basic 3.0.
Он великолепно работал автономно, никак не затрагивая ни реестр, ни какую другую требуху
этих машин.
Но вот Венда-7-64 ему в работе отказала, что вынудило меня начать искать 
Visual Basic 3.0
альтернативу, столь же неприхотливо работающую с флешки и не требующую установки.
Пока не нашел...  

You do not have the required permissions to view the files attached to this post.