МИНИСТЕРСТВО ОБЩЕГО И ПРОФЕССИОНАЛЬНОГО ОБРАЗОВАНИЯ РФ БРЯНСКИЙ ГОСУДАРСТВЕННЫЙ ТЕХНИЧЕСКИЙ УНИВЕРСИТЕТ Кафедра: "Информатика и программное обеспечение" Расчетное задание по дисциплине: «Организация и функционирование ЭВМ» “Управление часами реального времени в формате внешних часов” Выполнила: студент группы 99-ПО1 Моргунова Е.А. Проверил: Конкин В.В. Брянск 2000г. Содержание Введение 1. Постановка задачи 2. Описание программы 2.1. Общие сведения 2.2. Описание логической структуры 2.2.1. Алгоритм программы 2.2.2. Структура программы с описанием функций составных частей и связи между ними 3. Инструкция пользователю 4. Список использованной литературы Приложение А 2 Введение Когда-то ассемблер был основным языком программирования, без знания которого нельзя было заставить компьютер сделать что-либо полезное. Постепенно ситуация менялась. Появились более удобные средства общения с компьютером. Но в отличие от других языков ассемблер не умирал, более того, он не мог сделать этого в принципе. Располагая языками высокого уровня, необходимость в языке ассемблера, в силу его эффективности и четкости, не ослабевает и на сегодняшний день. Не случайно практически все компиляторы языков высокого уровня содержат средства связи своих модулей с модулями на ассемблере либо поддерживают выход на ассемблерный уровень программирования. В то же время, язык ассемблера требует планирования буквально каждого шага ЭВМ. В случае небольших программ это позволяет сделать их оптимальными с точки зрения эффективности использования аппаратных средств. Целью данного расчетного задания является повышение навыков программирования на языке ассемблера. Как результат необходимо предоставить программу, написанную на языке ассемблера. Данное расчетное задание состоит в написании программы, позволяющей определить реальное время. Данная пояснительная записка состоит из четырех пунктов и приложения. В первом пункте освещается постановка задачи, цели и задачи, которые преследовались при выполнении данного домашнего задания. Второй пункт содержит описание программы: общие сведения и описание логической структуры программы. В третьем пункте приводится инструкция пользователю. В приложении приводится текст программы. 3 Постановка задачи ТЕМА: Управление часами реального времени в формате внешних часов с циферблатом. Установка будильника и разработка программ обработки «звонка» будильника. ЦЕЛЬ: Ознакомится с основными положениями языка ассемблера, написание программы. ЗАДАЧИ: 1. Общие: Программа должна иметь удобный интерфейс и быть проста в обращении. 2. Программа должна: 2.1. выполнять все требования, описанные в постановки задачи 2.2. иметь выход из программы, выполняемый при соблюдении последовательности действий пользователя. 4 описанных в руководстве Описание программы Общие сведения Программа имеет название «Clock» и хранится на диске под именем clock.com, занимает 1936 байт. Дата создания 27/12/2000. Для функционирования программы необходимо выполнение следующих условий: 1. Операционная система MS_DOS 6.22 (Windows 95/98/2000). 2. IBM – совместимый персональный компьютер, наличие встроенного динамика, .VGA – совместимый адаптер, наличие сопроцессора. Описание логической структуры Алгоритм программы 1. Вывод титульного листа 2. Ожидание нажатия клавиши. Очистка экрана 3. Вывод текущего времени в виде часов с циферблатом, оснащенным четырьмя стрелками. 4. При совмещении стрелки будильника с часовой стрелкой последует звуковой сигнал продолжительностью в две минуты. 5. Выход в ОС осуществляется при нажатии клавиши ESC. 5 Структура программы с описанием функций составных частей и связи между ними Программа состоит из файла с названием Clock.asm, который содержит следующие основные процедуры: 1. ClrScr - очистка экрана 2. OutStr - вывод строки на экран 3. OutChr - вывод символа на экран 4. OutDec - вывод десятичного числа на экран 5. PressAnyKey 6. GoToCursor - Переход в нужную позицию экрана 7. Titul - Вывод титульника 8. OutCros - Затирает старые стрелки и отображает на новом - ожидание нажатия любой клавиши месте 9. CurUgols - Устанавливает углы для стрелок в зависимости от текущего времени 10. GradToRad - Переводит радианы в градусы 11. SinCos - Вычисляет синус и косинус 12. Plot - Отображает точку на экране 13. Line - Отображает линию по начальной точке, углу и радиусу 14. OutRim - Отображает римскую шестерку на циферблате 15. OutFiga - Выводит цифры на циферблате в указанной позиции 16. Number - Подготовка к выводу цифер на циферблате по окружности 17. Circul - Отображает окружность по центральной точке и радиусу 18. PlotFiga - Выводит точки на циферблате 19. Time - Загружает текущие время в поля данных 20. ClearKBuf - Очищает буфер клавиатуры 21. ShowBUD - Стирает если ах<>0 или отображает ах=0 стрелку будильника 6 22. BEEP - Подготовка к выводу звукового сигнала 23. B10SPKR - Выводит звуковой сигнал 24. CmpBeep - Проверяет на совпадение стрелок будильника и часа 25. CheckUgolBud - Проверяет угол стрелки будильника на выход из облости (0:360) 7 Инструкция пользователю Запуск программы Для запуска программы необходимо запустить файл CLOCK.COM на диске. Порядок работы После запуска программы на экране появится титульный лист с описанием задания и другой информации по данной расчетной работе. После нажатия любой клавиши на экране отобразится циферблат с четырьмя стрелками: часовой, минутной, секундной и стрелкой будильника, отличающимися между собой по длине и цвету. Установка будильника осуществляется перемещением красной стрелки циферблата клавишами управления курсором (правой/левой). При совмещении часовой стрелки и стрелки будильника последует звуковой сигнал продолжительностью в две минуты. При нажатии клавиши ESC произойдет выход из программы без завершения звукового сигнала. 8 Список использованной литературы 1. В. Юров, С. Хорошенко, “Ассемблер. Учебный курс.”, С.-П. “Питер”, 1999г. 2. Зубков, “Язык ассем блера для DOS, WINDOWS, UNIX”, М. “ДМК”, 2000г. 3. П.В.Беспалов С.В. Горин С.М. Коновалов, «Программирование на языке Ассемблер», М. “Высшая школа”, 1993г. 4. П.Нортон , «Персональный компьютер фирмы IBM и операционная система M-DOS», М. “Радио и связь”, 1991г. 5. Питер Абель ,«Язык Ассемблера для IBM PC и программирования», М. “Высшая школа”, 1992г. 6. П.Нортон , «Язык ассемблера для IBM PC», М. “Радио и связь”, 1990г. 9 ПРИЛОЖЕНИЕ А mycode segment public para 'code' assume cs:mycode,ds:mycode,ss:mycode,es:mycode org 100h .386 .387 START: JMP GO TX dw 160 ;Текущий X TY dw 100 ;Текущий Y ;Текущий цвет COLOR dw 4 UGOL DD 00000000H ;Текущий угол RAD DD 00000000H ;Текущий радиус RESULT DD 00000000H ;Временная переменная для хранения ;результатов работы с сопроцессором RESULTX dd 00000000h ;Результат для координаты x RESULTY dd 00000000h ;Результат для координаты y COS dd 00000000h ;Результат вычисления косинуса угла SIN dd 00000000h ;Результат вычисления синуса угла STEPX dd (?) ;Шаг по X STEPY dd (?) ;Шаг по Y XC dd 311 ;Центр по X YC dd 230 ;Центр по Y UGOLCEK dd 00000000h ;Угол секундной стрелки UGOLMIN dd 00000000h ;Угол минутной стрелки UGOLCH dd UGOLBUD CurCek CurCH CurMIN 00000000h ;Угол часовойой стрелки dd 00000000h ;Угол стрелки будильника db 0 ;Текушее количество секунд (RTC) db 0 ;Текушее количество часов (RTC) db 0 ;Текушее количество минут (RTC) 10 CurMCek db 0 ;Текушее количество милисекунд (RTC) RADCEK dd 90 ;Радиус секундной стрелки RADMIN dd 70 ;Радиус минутной стрелки RADCH dd RADBUD 60 ;Радиус часовой стрелки dd 100 ;Радиус стрелки будильника COLORCEK dw 15 ;Цвет секундной стрелки COLORMIN dw 10 ;Цвет секундной стрелки COLORCH dw COLORBUD dw 4 DURTION DW TONE DW 050H 0FFFFH 10 ;Цвет секундной стрелки ;Цвет секундной стрелки ;Время звучания ;Высота (частота) звука ;Очистка экрана ClrScr proc mov ax,0600h mov bh,07 mov cx,0000 mov dx,184Fh int 10h ret ClrScr endp ;Вывод строки на экран OutStr proc mov ah,09 int 21h ret OutStr endp 11 OutChr proc push ax mov ah,02h int 21h pop ax ret OutChr endp ; Ожидание нажатия любой клавиши PressAnyKey proc push ax mov ah,0 int 16h pop ax ret PressAnyKey endp ;Переход в нужную позицию экрана GoToCursor proc mov ah,02 mov bh,00 int 10h ret GoToCursor endp ;Вывод десятичного числа на экран из dx OutDec proc mov eax, edx mov ebx, 10 xor cx, cx 12 _lp: cdq div ebx add dx , 30h push dx inc cx or eax, eax jnz _lp pop dx call OutChr loop _l1 _l1: ret OutDec endp ;Вывод титульника Titul proc call ClrScr ;Очистка экрана mov dh , 00 mov dl , 22 call gotocursor lea dx , Str1 call OutStr ;Вывод строки на экран mov dh , 01 mov dl , 13 call gotocursor lea dx , Str2 call OutStr mov dh , 03 mov dl , 23 call gotocursor lea dx , Str3 13 call OutStr mov dh , 07 mov dl , 19 call gotocursor lea dx , Str4 call OutStr mov dh , 08 mov dl , 33 call gotocursor lea dx , Str40 call OutStr mov dh , 09 mov dl , 18 call gotocursor lea dx , Str5 call OutStr mov dh , 10 mov dl , 18 call gotocursor lea dx , Str50 call OutStr mov dh , 10 mov dl , 45 call gotocursor lea dx , Str6 call OutStr mov dh , 11 mov dl , 19 call gotocursor lea dx , Str60 14 call OutStr mov dh , 12 mov dl , 19 call gotocursor lea dx , Str61 call OutStr mov dh , 16 mov dl , 53 call gotocursor lea dx , Str7 call OutStr mov dh , 17 mov dl , 65 call gotocursor lea dx , Str8 call OutStr mov dh , 18 mov dl , 59 call gotocursor lea dx , Str9 call OutStr mov dh , 23 mov dl , 33 call gotocursor lea dx , Str10 call OutStr mov dh , 24 mov dl , 35 call gotocursor lea dx , Str11 15 call OutStr call PressAnyKey ret Str1 db 'Министерство образования РФ',24h Str2 db 'Брянский Государственный технический университет',24h Str3 db 'Кафедра информатики и ПО',24h Str4 db 'Расчетное задание на языке ассемблер ',24h Str40 db 'по теме:',24h Str5 db '"Управление часами реального времени ',24h Str50 db ' в формате внешних часов.',24h Str6 db 'Установка ',24h Str60 db ' будильника, разработка программ ',24h Str61 db ' обработки "звонка" будильника."',24h Str7 db 'Выполнила ст-ка гр.99ПО-1',24h Str8 db 'Моргунова Е.А.',24h Str9 db 'Проверил Конкин В.В.',24h Str10 db 'г.Брянск ',24h Str11 db '2000г.',24h Titul endp ;Затирает старые стрелки и отображает на новом месте OutCros proc pusha mov bx , offset COLOR mov eax , 0 mov [bx] , eax fild UGOLCEK fistp UGOL fild RADCEK fistp RAD call Line 16 fild UGOLMIN fistp UGOL fild RADMIN fistp RAD call Line fild UGOLCH fistp UGOL fild RADCH fistp RAD call Line call CurUgols xor ax , ax call ShowBUD fild UGOLMIN fistp UGOL fild RADMIN fistp RAD fild COLORMIN fistp COLOR call Line fild UGOLCH fistp UGOL fild RADCH fistp RAD fild COLORCH fistp COLOR call Line fild UGOLCEK fistp UGOL 17 fild RADCEK fistp RAD fild COLORCEK fistp COLOR call Line call CmpBeep popa ret OutCros endp ;Устанавливает углы для стрелок в зависимости от текущего времени CurUgols proc pusha mov cl , CurCek[0] mov ax , 6 mul cl mov bx , offset UGOLCEK mov [bx] , ax xor ax, ax mov al , CurCek mov dl , 10 div dl xor dx , dx mov dl , al mov cl , CurMin[0] mov ax , 6 mul cl add ax , dx mov bx , offset UGOLMIN mov [bx] , ax mov dl , 12 div dl 18 xor ah , ah mov dx , ax mov ch , CurCH[0] cmp ch , 13 jb NEXTTIME sub ch , 12 NEXTTIME: xor eax, eax mov ax , 30 mul ch add ax , dx mov bx , offset UGOLCH mov [bx] , ax CURUGOLSEND: popa ret CurUgols endp ;Переводит радианы в градусы GradToRad proc pusha fldpi lea bx , RESULT mov eax , 180 mov [bx] , eax fild RESULT fdiv fild UGOL fmul fstp UGOL popa ret GradToRad endp 19 ;Вычисляет синус и косинус SinCos proc pusha mov eax , 90 lea bx , RESULT mov [bx] , eax fild RESULT fild UGOL fsubr fistp UGOL call GradToRad fld UGOL fsincos fstp COS fstp SIN popa ret SinCos endp ;Отображает точку на экране Plot proc pusha lea bx , TY mov dx , [bx] lea bx , TX mov cx , [bx] lea bx , COLOR mov ax , [bx] xor bx , bx mov bh , 0 mov ah , 0ch int 10h 20 popa ret Plot endp ;Отображает линию по начальной точке, углу и радиусу Line proc pusha call SINCOS mov bx , offset RAD mov cx , [bx] GO_LOOP: mov bx , offset RESULT mov [bx] , ecx fild RESULT fmul COS fiadd XC fistp TX mov bx , offset RESULT mov [bx] , ecx fild RESULT fmul SIN fiadd YC fistp TY call Plot loop GO_LOOP popa ret Line endp ; Отображает римскую шестерку на циферблате 21 OutRim proc pusha mov ax , TY mov cl , 16 div cl mov dh , al mov ax , TX mov cl , 8 div cl mov dl , al mov bh , 0 mov ah , 2h int 10h mov ah , 09h mov bh , 0 mov al , 'V' mov cx , 1 mov bl , 15 int 10h mov ax , TY mov cl , 16 div cl mov dh , al mov ax , TX mov cl , 8 div cl mov dl , al inc dl 22 mov bh , 0 mov ah , 2h int 10h mov ah , 09h mov bh , 0 mov al , 'I' mov cx , 1 mov bl , 15 int 10h popa ret OutRim endp ;Выводит цифры на циферблате в указанной позиции OutFiga proc pusha pusha mov ax , TY mov cl , 16 div cl mov dh , al mov ax , TX mov cl , 8 div cl mov dl , al mov bh , 0 mov ah , 2h int 10h popa 23 call OutDec popa ret OutFiga endp ;Подготовка к выводу цифер на циферблате по окружности Number proc pusha mov bx , offset RAD mov edx , [bx] mov ecx , 4 NumCur: mov edx , 130 mov UGOL,90 mov RESULT , ecx fild fild UGOL RESULT fmul fistp UGOL call SINCOS mov RESULT , edx fild RESULT fmul COS fiadd XC fistp TX mov RESULT , edx fild RESULT fmul SIN 24 fiadd YC fistp TY cmp ecx , 2 jnz NUMNEXT call OutRim JMP NUMEND NUMNEXT: mov eax , 3 mul cl mov edx , eax call OutFiga NUMEND: loop NumCur popa ret Number endp ;Отображает окружность по центральной точке и радиусу Circul proc pusha mov bx , offset RAD mov edx , [bx] mov ecx , 360 mov bx , offset UGOL mov [bx] , ecx call GradToRad call SINCOS mov bx , offset RESULT mov [bx] , edx Cur: ; 25 fild RESULT fmul COS fiadd XC fistp TX mov bx , offset RESULT mov [bx] , edx fild RESULT fmul SIN fiadd YC fistp TY call Plot loop Cur popa ret Circul endp ;Выводит точки на циферблате PlotFiga proc pusha mov COLOR , 15 mov bx , offset RAD mov edx , [bx] mov ecx , 60 PlotCur: mov eax , 6 mul cl mov bx , offset UGOL mov [bx] , eax call SINCOS 26 mov bx , offset RESULT mov [bx] , edx fild RESULT fmul COS fiadd XC fistp TX mov bx , offset RESULT mov [bx] , edx fild RESULT fmul SIN fiadd YC fistp TY call Plot loop PlotCur popa ret PlotFiga endp ;Загружает текущие время в поля данных Time proc pusha mov ah , 2ch int 21h cmp dh , CurCek[0] je TIMEEND mov CurCH[0] , ch mov CurMIN[0] , cl mov CurCek[0] , dh 27 TIMENEXT: call OutCros TIMEEND: popa ret Time endp ;Очищает буфер клавиатуры ClearKBuf proc pusha mov bx, 40h mov es, bx mov bx, es:[1ah] mov es:[1ch], bx popa ret ClearKBuf endp ;Стирает ах=0 или отображает ах<>0 стрелку будильника ShowBUD proc pusha mov COLOR[0] , 0 cmp ax , 0 jnz SHOWBUDNEXT fild COLORBUD fistp COLOR SHOWBUDNEXT: fild UGOLBUD fistp UGOL fild RADBUD 28 fistp RAD call Line popa ret ShowBUD endp ;Подготовка к выводу звукового сигнала BEEP PROC NEAR pusha IN AL,61H PUSH ;Получить и сохранить AX ; данные порта CLI ;Запретить прерывания CALL B10SPKR POP AX OUT 61H,AL STI ;Произвести звук ;Восстановить значение ; порта ;Разрешить прерывания popa RET BEEP ENDP ;Выводит звуковой сигнал B10SPKR PROC B20: NEAR MOV DX,DURTION ;Установить время звучания B30: AND AL,11111100B ;Очистить биты 0 и 1 OUT 61H,AL MOV CX,TONE LOOP B40 ;Передать на динамик ;Установить частоту B40: OR ;Задержка времени AL,00000010B ;Установить бит 1 29 OUT 61H,AL ;Передать на динамик MOV CX,TONE LOOP B50 ;становить частоту B50: DEC DX JNZ B30 SHR TONE,2 JNZ B20 RET ;Задержка времени ;Уменьшить время звучания ;Продолжать? ; сократить частоту ;Нулевая частота? ; да - выйти B10SPKR ENDP ;Проверяет на совпадение стрелок будильника и часа CmpBeep proc pusha fild UGOLCH fild UGOLBUD fsub fistp RESULT cmp RESULT , 0 jl CMPBEEPEND cmp RESULT , 1 jge CMPBEEPEND call BEEP CMPBEEPEND: popa ret CmpBeep endp ;Проверяет угол стрелки будильника на выход из облости (0:360) CheckUgolBud proc pusha 30 mov bx , offset UGOLBUD mov eax , [bx] cmp eax , 168H jle CHECKNEXT sub eax , 168H CHECKNEXT: cmp eax , 0 jge CHECKEND add eax , 168H CHECKEND: mov [bx] , eax popa ret CheckUgolBud endp GO: Call Titul ; Вывод титульника ;Сохраняем исходный видеорежим mov ah , 0fh int 10h push ax ;Устанавливаем новый видеорежим: 640x480, 16 цветов mov ax ,4f02h mov bx , 12h int 10h ;Отрисовка основной окружности mov eax , 145 lea bx , RAD mov [bx] , eax call Circul ;Отрисовка циферблата mov eax , 130 31 lea bx , RAD mov [bx] , eax call PlotFiga call Number ;Основной цикл xor cx , cx MAINLOOP: call ClearKBuf ;Очистка буфера клавиатуры call Time ;Отрисовка текущего времени ;Считывание символа in al , 60h inc cx cmp cx ,10 jnb MAINLOOPEND xor cx , cx push ax cmp al , 4dh ;проверяем на нажатие курсора в лево jnz MAINLOOPNEXT1 ;если нет то дальше mov ax , 1 call ShowBUD mov bx , offset UGOLBUD mov eax , [bx] inc eax mov [bx] , eax mov ax , 0 call ShowBUD call jmp OutCros ;Стираем ах=1 стрелку будильника ;Увеличиваем угол стрелки будильника ;Отображаем стрелку будильника ;Получаем новое положение стрелки MAINLOOPEND MAINLOOPNEXT1: cmp al , 4bH ;проверяем нажатие на курсор в право 32 jnz MAINLOOPNEXT2 mov ax , 1 call ShowBUD mov bx , offset UGOLBUD mov eax , [bx] dec eax mov [bx] , eax mov ax , 0 call ShowBUD call jmp OutCros ;если нет то дальше ;Отображаем стрелку будильника ;Уменьшаем угол стрелки будильника ;Отображаем стрелку будильника ;Получаем новое положение стрелки MAINLOOPEND MAINLOOPNEXT2: MAINLOOPEND: call CheckUgolBud pop ax cmp jnz ;Проверем угол Стрелки Будильника al , 1h ;проверяем нажатие ESC MAINLOOP ;если нет то продолжаем цикл ;Востанавливаем исходный видеорежим pop ax mov ah , 00 int 10h mov ah,4ch ;Выход в DOS Int 21h mycode ends end start 33