Курсовой проект (8086)
.doc
-
Листинг управляющей программы.
RAM0_BASE EQU 0x01000000 ;начальный адрес ОЗУ
ROM_BASE EQU 0x00000000 ;начальный адрес ПЗУ
IOR_BASE EQU 0x80000000 ;начальный адрес регистра ввода-вывода
KBD_IRQ_MASK EQU 0x02000000 ;маска прерывания клавиатуры
DISP_IRQ_MASK EQU 0x04000000 ;маска прерывания дисплея
KB_INT EQU 1 ;номер прерывания клавиатуры
DISP_INT EQU 2 ;номер прерывания дисплея
KB_BUF EQU 0 ;смещение буфера клавиатуры в ОЗУ
KBB_LEN EQU 128 ;смещение длины буфера в ОЗУ
KBB_CP EQU 132 ;смещение символа выводимого на дисплей в ОЗУ
excpt_tab:
B reset_handler ;RESET handler
B irq_fin ;Udefinde Instruction handler (fake)
B irq_fin ;SWI handler (fake)
B irq_fin ;PFA handler (fake)
B irq_fin ;DA handler (fake)
B irq_fin ;RESERVED handler (fake)
B irq_handler ;IRQ handler
B irq_fin ;FIQ handler (fake)
reset_handler:
MRS R0, CPSR ;R0<-CPRS (Current Process Status Register)
BIC R0, R0, 0x80 ;cброс флага I (7-ого бита в CPRS) (разрешение прерываний)
MSR CPSR, R0 ;CPSR<-R0
inf_loop:
B inf_loop ;put the processor into the infinite loop
B inf_loop
B inf_loop
B inf_loop
B inf_loop
B inf_loop
B inf_loop
; IOR structure:
; Bits Description
; 0-7 System control byte (Reserved)
; 8-15 keyboard buffer
; 16-23 interrupt numer
; 24-31 0
irq_handler:
MOV R8, IOR_BASE ;R8<-адрес регистра ввода-вывода
LDR R9, [R8] ;R9<-содержимое регистра ввода-вывода
MOV R10, R9, LSR 16 ;1-ый байт R10 содержит номер прерывания
CMP R10, KB_INT ;определение прерывания по номеру
BEQ kb_int
CMP R10, DISP_INT
BEQ disp_int
B irq_fin
kb_int:
MOV R10, R9, LSR 8 ;в 1-ый полубайт попадает состояние строк и столбцов клавиатурной матрицы
AND R10, R10, 0xFF ;extract keyboard buffer
MOV R10, R10, LSL 2 ;R10 = R10*4
ADD R10, R10, sat ;R10=R10+sat=индекс в таблице ASCII-кодов(scan-code to ASCII translation table)
LDR R11, [R10] ;R11<-ASCII-код
MOV R10, RAM0_BASE
ADD R10, R10, KBB_LEN
LDR R8, [R10] ;R8 = [KBB_LEN]
MOV R10, RAM0_BASE
ADD R10, R10, KB_BUF
ADD R10, R10, R8, LSL 2 ;в R10 свободная ячейка в буфере клавиатуры
CMP R11, 1 ;проверка на код клавиши Clear
BEQ transmit_cls
STR R11, [R10] ;записываем ASCII-код по адресу [R10]
MOV R10, RAM0_BASE
ADD R10, R10, KBB_LEN
ADD R8, R8, 1
STR R8, [R10] ;увеличиваем длину буфера на еденицу
B irq_fin
transmit_cls:
MOV R8, 254 ;escape code for LCD
STR R8, [R10] ;сохраняем escape code в ОЗУ по адресу [R10]
ADD R10, R10, 4 ;переходим в следующую ячейку ОЗУ
STR R11, [R10] ;store CLS
MOV R10, RAM0_BASE
ADD R10, R10, KBB_LEN
LDR R8, [R10] ;R8<-[R10]
ADD R8, R8, 2 ;R8=R8+2, т.к. в буфер сохранено 2 кода
STR R8, [R10] ;R8->[R10]
B irq_fin
disp_int:
MOV R8, RAM0_BASE
ADD R8, R8, KBB_LEN ;R8=адресс KBB_LEN в ОЗУ
LDR R9, [R8] ;R9<-[KBB_LEN]
CMP R9, 0
BEQ irq_fin ;длина буфера=0, след-но, нечего отображать
MOV R8, KBB_CP
ADD R8, R8, RAM0_BASE ;R8 = адресс KBB_CP в ОЗУ
LDR R9, [R8] ;R9=текущей позиции в клавиатурном буфере
MOV R9, R9, LSL 2 ;R9=смещение В ОЗУ текущей позиции в клавиатурном буфере
ADD R9, R9, RAM0_BASE
ADD R9, R9, KB_BUF ;R9=адрес в ОЗУ текущей позиции в клавиатурном буфере
LDR R10, [R9] ;R10<-ASCII-код текущего символа
MOV R11, IOR_BASE
ADD R11, R11, 1
STR R10, [R11] ;посылаем символ на дисплей
LDR R9, [R8] ;R9=смещение текущего символа в буфере клавиатуры
ADD R9, R9, 1 ;R9=R9+1
STR R9, [R8] ;смещаем текущую позицию в буфере
MOV R10, RAM0_BASE
ADD R10, R10, KBB_LEN
LDR R11, [R10] ;R11<-размер клавиатурного буфера
CMP R11, R9 ;[KBB_LEN] = [KBB_CP] ?
BNE irq_fin
MOV R8, 0
MOV R10, RAM0_BASE
ADD R11, R10, KBB_CP
STR R8, [R11] ;текущая позиция в буфере=0
ADD R11, R10, KBB_LEN
STR R8, [R11] ;длина буфера=0 (буфер пуст)
irq_fin:
SUBS R15, R14, 4
;возврат из IRQ_handler на команду, выполнявшуюся в момент прерывания, R15 - ip, R14 - регистр связи (содержит указатель на команду, следующую после команды, в момент выполнения которой произошло прерывание)
num: DW 0x4D
sat: DB '1', 0, 0, 0 ;scan-code to ASCII translation table
DB '5', 0, 0, 0
DB '9', 0, 0, 0
DB 'D', 0, 0, 0
DB '2', 0, 0, 0
DB '6', 0, 0, 0
DB 'A', 0, 0, 0
DB 'E', 0, 0, 0
DB '3', 0, 0, 0
DB '7', 0, 0, 0
DB 'B', 0, 0, 0
DB 'F', 0, 0, 0
DB '4', 0, 0, 0
DB '8', 0, 0, 0
DB 'C', 0, 0, 0
DB 1, 0, 0, 0 ;clear LCD
p_fin:
БИБЛИОГРАФИЧЕСКИЙ СПИСОК
-
Алиев, И. И. Виртуальная электротехника : Учеб. пособие [Текст] / И. И. Алиев. - М : РадиоСофт, 2003. - 112 с. - ISBN 5-93037-110-5. (621.3(07) А-50)
-
Алексеенко, А. Г. Основы микросхемотехники [Текст] / А. Г. Алексеенко. - 3-е изд. перераб. и доп. - М : ЮНИМЕДИАСТАЙЛ, 2002. - 448 с. - ISBN 5-94774-002-8. (621.3(07) А479)
-
Кузовкин, В. А. Электроника : Учебник [Текст] / В. А. Кузовкин. - М : Логос, 2005. - 328 с. - ISBN 5-98704-025-6. (621.3(07) К892)
-
Петров, К. С. Радиоматериалы, радиокомпоненты и электроника : Учеб. пособие [Текст] / К. С. Петров. - СПб : Питер, 2004. - 522 с. - ISBN 5-94723-378-9. (621.3(07) П-305)
-
Прянишников, В. А. Электроника : Полный курс лекций [Текст] / В. А. Прянишников. - 4-е изд. - СПб : КОРОНА принт, 2004. - 416 с. - ISBN 5-7931-0018-0. (621.3(07) П858)
-
Степаненко, И. П. Основы микроэлектроники : Учеб. пособие для вузов [Текст] / И. П. Степаненко. - 2-е изд. перераб. и доп. - М. : Лаборатория базовых знаний, 2001. - 488 с. - ISBN 5-93208-045-0. (621.3(07) С794)
-
Хоровиц, П. Искусство схемотехники [Текст]/ П. Хоровиц, У. Хилл. - Пер. с англ. - Изд. 6-е. - М. : Мир, 2003. - 704 с. - ISBN 5-03-003395-5. (621.3 Х80)
-
Хотунцев, Ю. Л. Основы радиоэлектроники : Учеб. пособие [Текст] / Ю. Л. Хотунцев, А. С. Лобарев. - М. : Агар, 2000. - 288 с. - ISBN 5-89218-108-1. (621.3(07) Х855)
-
Шевкопляс, Б. В. Микропроцессорные структуры. Инженерные решения : Справочник [Текст] / Б. В. Шевкопляс. - 2-е изд. перераб. и доп. - М. : Радио и связь, 1990. - 512 с. - ISBN 5-256-00460-3.