· Начало · Отвђтить · Статистика · Поиск · FAQ · Правила · Установки · Язык · Выход · WASM.RU · Noir.Ru ·

 WASM Phorum —› WASM.ASSEMBLER —› Системный таймер 8253

Посл.отвђт Сообщенiе


Дата: Ноя 30, 2003 20:10:44

Изучаю работу таймера типа 8253. На обум толкать умные мысли в голову не стал
поэтому решил запрограммировать музыку использованием этой и друго чипа 8255.
Взял готовую прогу из Скэнлона и друга стащил на пару деньков, ну так вот и изу
чаю я ее и естественно много дыр в этом сплошном лесу умных мыслей.
Слабал музыку забацал тоже проге в тасме ни каких ошибок не делает, но при запуске
исполнителя выдается ошибка:
Run-time error R6003
Integer devide by 0
Помогите чем могете исходник прилогаю. Сам сидеть тоже не буду, буду медитировать
вместе с Джордэйном.

_1446291243__TERMIN.ASM


Дата: Дек 1, 2003 16:41:58

Дык этож деление на ноль вроде ...


Дата: Дек 1, 2003 16:44:56

Слушай а там "org 100" в начале не должно быть ?


Дата: Дек 1, 2003 17:14:14 · Поправил: bsl_zcs

У тебя там идёт проверка на конец нот (cmp di,0ffffh), а на самом деле конец не отмечен. Вероятно, ты его упустил когда набирал.

Оно доходит до первой длительности, а она маленькая, и результат деления на него делителя таймера не влазит в регистр. Нулевое исключение - это не только division by zero, но и Division Overflow....

А код, который делает задержку циклом, выкинь. Он был актуален только для ibm PC. Скорости с того времени немного выросли. ;) Сделай туда нормальную задержку.


Дата: Дек 1, 2003 17:56:11

Каким макаром например?


Дата: Дек 1, 2003 20:40:14

Из того, что мне вспомнилось, наверное, проще всего в цикле смотреть биосовскую ячейку с таймерными тиками. В этом тоже нормального мало, но тебя же, судя по всему, загрузка процессора не смущает? ;) И точность у неё под виндами - плюс-минус одна автобусная остановка... :)

Лежит она в [40:06Ch]. Длительность одного тика 55мс, так что под неё придётся поправить длительность нот. Или забить.

Замени цикл задержки на что-нибудь вроде:
         push   ds

         mov    cx,40h
         mov    ds,cx

         shr    bx,1
         mov    dx,[ds:6Ch]
wait2:
         mov    cx,[ds:6Ch]
         sub    cx,dx
         cmp    cx,bx
         jb     wait2

         pop    ds


Кстати, у тебя в коде масса опечаток. Например, вместо add di,2 по смыслу должно быть add bp,2.

Набрав на гугле "spkr_on:loop spkr_on" ;) можно найти вордовский файл на китайском языке, где, в числе прочего, есть тот же пример, но набраный нормально. ;)


Дата: Дек 2, 2003 20:26:14

Блин. Я тут единицу поделил на частоту своего проца 1100 МГц. Получил 909 пс.
И по формуле в исходнике она есть (17(n-1)+5+4)(909*10 в степени -12)=0.01 получил 691889, но это число для cx cлишком громадно. Если справки по времени выполнения команд? Дай ссылки.


Дата: Дек 2, 2003 22:14:24

Я тут прочел: "Как задавать вопросы?". И не пожалел думаю мне простят весь этот бред, но он от чистого сердца, если кого случаем своей дуростью задел в частности Володю. Прошу прощения, впредь постараюсь быть поаккуратней.


Powered by miniBB 1.6 © 2001-2002
Время загрузки страницы (сек.): 0.042