Ну а теперь о хорошем, коли уж все непонятки учтены...
Я изменил программу согласно тому факту, что счетчик таймера не прекращает счет при переходе
через 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.