Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
OEVM / Орг.ЭВМ КП / ОЭВМ КП Методичкие указания.doc
Скачиваний:
38
Добавлен:
10.04.2015
Размер:
1.7 Mб
Скачать
    1. Разработка управляющей программы

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

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

; kp_386_Real_NoOS.asm

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

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

;-- kp_386_Real_NoOS.asm --

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

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

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

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

;-- в последних 64х килобайтах --

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

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

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

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

Adr_ROM_Reset EQU FFFF0h ; Адрес области ROM с которой начинается выполнение команд при включении питания или сброса

Adr_ROM_Start EQU F0000h ; Начальный адрес сегмента кода

Adr_RAM_Begin EQU 0h ; Начальный адрес ОЗУ

Adr_RAM_Data EQU 0400h ; Начальный адрес сегменда данных

Adr_ROM_Stack EQU 7FFFFh ; Максимально возможный адрес ОЗУ, для указания вершины стека

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

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

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

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

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

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

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

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

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

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

IRQ_n EQU 00001001b ; Адрес – вектор прерывания по варианту задания

Adr_IRQ_n EQU IRQ_n * 4; Адрес начала области из четырех ЯП, в которой размещается адрес первой команды программы обработки прерывания.

Adr_Data_K EQU Adr_RAM_Data + 0; Ячейка в ОЗУ для хранения значения К

Adr_Data_X EQU Adr_RAM_Data + 1; Ячейка в ОЗУ для хранения значения Х

Adr_Data_Y1 EQU Adr_RAM_Data + 2; Ячейка в ОЗУ для хранения значения У1

Adr_Data_Y2 EQU Adr_RAM_Data + 3; Ячейка в ОЗУ для хранения значения У2

Adr_Data_Y3 EQU Adr_RAM_Data + 4; Ячейка в ОЗУ для хранения значения У3

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

;-- Подготовка к запуску основной программы после --

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

;-- CS = F000h; IP = FFF0H; DS = SS = ES = 0 --

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

ORG Adr_ROM_Reset ; Начальный адрес области ROM

jmp Adr_ROM_ Start ; Переход на основную программу по адресу Adr_ROM_Start

ORG Adr_ROM_ Start;

mov ax, Adr_ROM_Start

mov cs, ax

mov ax, Adr_ROM_Stack

mov ss, ax

mov ax, Adr_RAM_Data

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

xor ax, ax ; Записать 0 в AX

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

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

;-- Установка начальных параметров --

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

;-- Определение переменных в памяти --

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

ProgramBegin:

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

; Настройка es на начало таблицы векторов прерываний - в реальном режиме mov ax, 0h

mov es, ax

mov ax, offset ProgramPrer ; Определение смещения адреса подпрограммы обработки прерывания

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

push cs

pop ax

mov es:Adr_IRQ_n + 2, ax; Запись в два старших байта ТВП по адресу Adr_IRQ_n

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

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

out Adr_PPA_CW, al

; Установить содержимое сегмента данных

; Указание меток и содержимого (переменных)

call ProgramKlavIn ; опрос клавиатуры для получения К и Х

;Выдать Y3

call ProgramCalculateY3SetPIT

call ProgramCalculateY1SetY1SetInd ; начальная установка У1 и идникации

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

call ProgramCalculateY2SetPIT

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

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

out Adr_KP_A0, al

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

out Adr_KP_A1, al

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

out Adr_KP_A1, 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, Adr_PPA_A

mov ds:Adr_Data_X, ax

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

in dx, Adr_PPA_B

mov ds:Adr_Data_K

pop bx

pop dx

pop ax

ret

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

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

;-- (Значение У1 используется для индикации и управшения объектом. --

;-- для индикации старшая тетрада У1 --

;-- для управления объектом младшая тетрада) --

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

ProgramCalculateY1SetY1SetInd:

push ax

push dx

; расчет У1

mov dx, ds:Adr_Data_X

mov ax, ds:Adr_Data_K

add dx

mov ds:Adr_data_Y1, ax

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

mov bx, ax

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

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

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

out Adr_PPA_C, al

pop dx

pop ax

ret

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

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

;-- (поскольку надо У2 вычислить только раз при включении питания --

;-- или обработке прерывания) --

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

ProgramCalculateY2SetPIT:

push ax

push dx

; расчет У2

mov dx, ds:Adr_Data_X

mov ax, ds:Adr_Data_K

add dx

mov ds:Adr_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:Adr_Data_X

mov ax, ds:Adr_Data_K

add dx

mov ds:Adr_data_Y3, ax

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

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

out Adr_PIT_U, al

out Adr_PIT_1, dl

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

out Adr_PIT_U, al

out Adr_PIT_1, dh

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

out Adr_PIT_U, al

pop dx

pop ax

ret

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

;-- конц программы! --

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

end ProgramBegin

Соседние файлы в папке Орг.ЭВМ КП