Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Metodichka_i386.docx
Скачиваний:
5
Добавлен:
18.11.2019
Размер:
820.47 Кб
Скачать
    1. Разработка по

Для упрощения написания и последующего восприятия программы, возможности ее частичного написания до разработки аппаратной части МПС и для уменьшения затрат времени на отладку программы, ее следует разрабатывать с использованием символической формы обозначения различных устройств, параметров, констант и т.д.Например, при обращении к УВВ с помощью команд IN и OUT, нецелесообразно использование числовых значений адресов УВВ, выделенных им в АПУВВ. Гораздо удобнее в тексте программы указывать символические имена этих устройств, кратко обозначающих их названия или выполняемые ими функции. Для связи символических имен с их числовыми значениями используется директива EQU.

Используем введенные при распределении АПП и АПУВВ символические имена устройств ППА и ПИТ и присвоенные им значения адресов. При этом получим следующее начало программы:

;----------------------------------------------------------------------------------------------

;-- kp_386_Real_NoOS.asm --

;-- Текст программы для курсового проекта по ОЭВМ (i386). --

;-- После включения питания или сброса регистры процессора --

;-- установлены: CS = F000h; IP = FFF0h; DS = SS = ES = 0. --

;-- Код программы должен быть размещен в микросхеме ПЗУ --

;-- в микросхеме ПЗУ начиная с нулевой ячейки --

;----------------------------------------------------------------------------------------------

;-- Адреса переменных, в сегменте данных ОЗУ. Размер переменных - слово

Data_X EQU 0h ; переменная Х (данные с шины Х)

Data_K EQU 2h ; переменная K (константа с тумблеров)

Data_X EQU 4h ; переменная Х (данные с шины Х)

Data_Y1 EQU 6h ; результат вычисления функции Y1

Data_Y2 EQU 8h ; результат вычисления функции Y2

Data_Y3 EQU 0Ah ; результат вычисления функции Y3

;-- Определение констант

Adr_IRQ EQU 40h ; Адрес вектора в таблице прерываний

PIC_ICW1 EQU 0 ; Адрес контроллера прерываний (A0 = 0)

PIC_ICW2 EQU 2 ; Адрес контроллера прерываний (A0 = 1)

PIT_0 EQU 8 ; Адрес регистра состояния счетчика 0 ПИТ

PIT_1 EQU 10 ; Адрес регистра состояния счетчика 1 ПИТ

PIT_2 EQU 12 ; Адрес регистра состояния счетчика 2 ПИТ

PIT_CW EQU 14 ; Адрес регистра управления ПИТ

PPA_A EQU 16 ; Адрес регистра порта А ППА

PPA_B EQU 18 ; Адрес регистра порта B ППА

PPA_C EQU 20 ; Адрес регистра порта C ППА

PPA_CW EQU 22 ; Адрес регистра управления ППА

ORG 0 ; Начальный адрес микросхемы ROM

;----------------------------------------------------------------------------------------------

;-- Инициализация --

;----------------------------------------------------------------------------------------------

ProgramBegin:

cli ; Запрет аппаратных прерываний

; -- Установка сегмента данных на ОЗУ

mov ax, 400h

mov ds, ax

; -- Установка вектора прерывания (адрес подпрограммы обработки прерывания)

mov ax, offset ProgramPrer ; Определение смещения адреса

; подпрограмм мы обработки прерывания

mov es:Adr_IRQ, ax ; Запись в два младших байта ТВП

; по адресу Adr_IRQ

push cs

pop ax

mov es:Adr_IRQ + 2, ax

;-- Программирование ППА

mov al, 10010000b ; Управляющее слово для ППА

out PPA_CW, al

;-- Программирование ПИТ

call ProgramCalculateY2SetPIT

call ProgramCalculateY3SetPIT

;-- Программирование контроллера прерываний

mov al, 00010010b ; Запись ICW1 в КП (работа КП)

out PIC_ICW1, al

mov al, 01000000b ; Запись ICW2 в КП (номер вектора прерывания)

out PIC_ICW2, al

mov al, 00000000b ; Запись OCW1 в КП (маскирование прерываний)

out PIC _ICW1, al

sti ; Разрешение аппаратных прерываний

;----------------------------------------------------------------------------------------------

;-- Начало основной программы --

;----------------------------------------------------------------------------------------------

ProgramStart:

call ProgramKlavIn

call ProgramCalculateY1SetY1SetInd

jmp ProgramStart

;----------------------------------------------------------------------------------------------

;-- Подпрограмма обработки прерывания --

;----------------------------------------------------------------------------------------------

ProgramPrer:

push ax

call ProgramCalculateY2SetPIT

pop ax

iret

;----------------------------------------------------------------------------------------------

;-- Подпрограмма опроса клавиатуры (порта А ППА) --

;----------------------------------------------------------------------------------------------

ProgramKlavIn:

push ax

push dx

push bx

; Принять и сохранить значение Х

in ax, PPA_A

mov ds:Data_X, ax

; Принять и сохранить значение К

in ax, PPA_B

mov ds:Data_K, ax

pop bx

pop dx

pop ax

ret

;----------------------------------------------------------------------------------------------

;-- Подпрограмма рассчитывает У1 и выводит его в порт С --

;----------------------------------------------------------------------------------------------

ProgramCalculateY1SetY1SetInd:

push ax

push dx

push bx

; расчет У1

mov ds:Data_Y1, ax ; сохранение результата

; Вывод в порт С

mov bx, ax

and ax, 0000000000001111b ; выделение младшей тетрады в ax

and bx, 0000000011110000b ; выделение старшей тетрады в bx

or ax, bx ; младшая и старшая тердады в общий регистр ax

out PPA_C, al

pop bx

pop dx

pop ax

ret

;----------------------------------------------------------------------------------------------

;-- Подпрограмма расчета Y2 и программирования ПИТ --

;----------------------------------------------------------------------------------------------

ProgramCalculateY2SetPIT:

push ax

push dx

; расчет У2

mov dx, ds:Data_X

mov ax, ds:Data_K

xor ax, dx

mov bx,ax

mov ax, ds:Data_K

not ax

cmp ax, dx

jl y2min

mov ax, dx

y2min:

add bx

mov ds:Data_Y2, ax

; программирование ПИТ по значению У2

mov ax, 0000000000011110b ; записать младший байт в счетчик 0

; и установить режим 3

out Adr_PIT_U, al

out Adr_PIT_0, dl

mov ax, 0000000000101110b ; записать старший байт

out Adr_PIT_U, al

out Adr_PIT_0, dh

mov ax, 0000000000001110b ; защелкнуть

out Adr_PIT_U, al

pop dx

pop ax

ret

;----------------------------------------------------------------------------------------------

;-- Подпрограмма расчета Y3 --

;----------------------------------------------------------------------------------------------

ProgramCalculateY3SetPIT:

push ax

push dx

; расчет У3

mov dx, ds:Data_X

mov ax, ds:Data_K

cmp ax,dx

jg y3max

mov ax,dx

rcl ax,1

mov ds: Data_Y3, ax

; Программирование ПИТ для У3

mov ax, 0000000001010000b ; записать младший байт в счетчик 0

; и установить режим 3

out PIT_U, al

out PIT_1, dl

mov ax, 0000000001100000b ; записать старший байт

out PIT_U, al

out PIT_1, dh

mov ax, 0000000001000000b ; защелкнуть

out PIT_U, al

pop dx

pop ax

ret

;-- После сброса процессор выполняет команду из адреса CS:FFF0h

ORG 0FFF0h

jmp ProgramBegin

end ProgramBegin

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]