Проектирование микропроцессорного модуля автоматизированной информационной системы
Курсовой проект - Компьютеры, программирование
Другие курсовые по предмету Компьютеры, программирование
МП-модуля, включающее в себя программы тестирования, начальной инициализации, ввода, обработки и вывода информации.
Полученный модуль является готовым устройством и может быть применен в качестве устройства управления и обработки информации.
Приложения
Приложение А
Текст программного обеспечения МП-модуля на языке ассемблера
0; по адресу ffff0h находится команда call far test
1; остальной код - последовательно, начиная с адреса f4000h.
2datasg segment para data ; определение данных
3equ ROM F400h ;базовый адрес начала ПЗУ
4equ RAMEND 1FFFh ;база адреса конца ОЗУ(верхняя граница ОЗУ-1FFFFh)
equ CONST1 10101010h ;константы тестирования ОЗУ
6equ CONST2 01010101h
7equ PICW 00010110b ;управляющее слово для ПКП
8equ PPIW 10000010b ;УС для ППИ
9equ LPTW1 00001010b ;УС для принтера
10equ LPTW2 00001111b ;УС для принтера
11equ PKDIW 00000001b ;УС для ПККИ
12equ PPIA 08h ;адреса портов ППИ - А
13equ PPIB 09h ;В
14equ PPIC 0Ah ;С
15equ PPIR 0Bh ;регистр упр. слова ППИ
16equ PKDID 020h ;регистр данных ПККИ
17equ PKDIR 021h ;регистр слова состояния ПККИ
18equ PICR1 010h ;регистры ПКП
19equ PICR2 011h
20controlsum db ? ;переменная для эталонной контр. суммы ПЗУ
21datasg ends
22codesg segment para code
23init proc far ; программа инициализации при включении
24call test ; тест АЛУ
call test_rom ; тест ПЗУ
call test_ram ; тест ОЗУ
xor ax, ax ; обнулить аккумулятор
mov bx,ffffh ; заполнить bx единицами
29mov es, ax ; инициализировать сегмент es
30mov di, 010h ; 10h = 4*4 - прерывание INT O (по переполнению) -
31init_int: ; последнее из обязательных системных прерываний
32mov es:[di], bx ; инициализировать вектор прерывания значениями
33mov es:[di+2], ax ; адреса стартовой ячейки памяти
34sub di,2 ; перейти к следующему вектору
35jnz init_int
mov es:[014h], cs ; 5*4=20=14h. прерывание №5 - от принтера
37mov es:[016h], offset output ; переход на программу вывода
38mov es:[018h], cs ; прерывание №6 - от клавиатуры
39mov es:[01Ah], offset input ; переход на программу ввода
mov ax, 1Ch ; установка сегментов данных
41mov es, ax ; сразу после таблицы векторов прерываний
42mov ds, ax
43mov ax, 1000h ; базовый адрес стека - 10000h
44mov ss, ax
mov sp, 0fffeh ; начало стека - с конца ОЗУ
46mov al, PPIW ; загрузка упр. слова для ППИ
47out PPIR, al
48mov al, 00001101b ; сигнал сброса принтера
49out PPIC, al ; загрузить в порт С - порт УС принтера
mov al, PICW ; загрузка упр. слова для ПКП
51out PICR1, al ; адрес ПКП при A0=0
mov al, PKDIW ; загрузка упр. слова для ПККИ
53out PKDIR, al
54mov al,00001111b ; снятие сигнала сброса принтера
55out PPIC, al
56xor ax,ax ; обнулить аккумулятор
57mov si,ax ; указать на последний введенный элемент
58sti ; разрешить прерывания по входу INTR
59hlt ; перевести МП в режим останов
60init ENDP
61test PROC NEAR ; подпрограмма тестирования работы процессора
62mov ax, 5 ; проверка сумматора
63mov bx, ax
64mov cx, ax
mov dx, ax
add ax, ax
cmp ax, 10
jne error_cpu
add bx, bx
cmp bx, ax
jne error_cpu
add cx, cx
cmp cx, ax
jne error_cpu
add dx, dx
cmp dx, ax
jne error_cpu
mov ah, 11111111b ; проверка сдвигателя
mov cx, 8
shift:
shr ah, 1
jnc error_cpu
loop shift
ret
error_cpu:
86mov si,1 ; указать на смещение в области вывода
87mov ds:[si],FFFFh ; поместить в обл. вывода значение кода ошибки
88int 32 ; вызов п/программы вывода
89jmp error_cpu
90test ENDP
91test_rom PROC NEAR ; подпрограмма тестирования пзу
92mov ax, ROM ; начальный адрес пзу - F4000h
93mov es, ax
94mov si, 0 ; тест с ячейки 2
95xor ax, ax ; обнулить аккумулятор
96mov cx, BFFFh; счетчик цикла теста (48Кбайт -1)
count:
add ax, es:[si] ; добавить к сумме содержимое текущей ячейки
inc si ; передвинуть указатель на следующую
loop count ; повторять в цикле
cmp al, controlsum ; сравнить полученную сумму с эталонной
102je end_tst ; если совпадают - конец теста
103error_rom:
104mov si,1
105mov ds:[si],FFFEh ; поместить в область вывода знач. кода ошибки
106int 32 ; вызов п/программы вывода
107jmp error_rom
108end_tst: ret
test_rom endp
110test_ram PROC NEAR ; подпрограмма тестирования озу
111mov cx,1000h ; вначале - тест старшего банка ОЗУ
112test_bank:
mov ds, cx
mov di, 0ffffh ; счетчик повторений
115test_cell: mov ax, СONST1
116mov [di],ax ; записать в память
117mov bx,[di] ; считать из памяти
cmp ax,bx ; сравнить записанное и считанное
119jne error_ram ; перейти на обработчик ошибок
120mov ax, СONST2; продолжить тест с другой константой
mov [di],ax ; записать в память
122mov bx,[di] ; считать из памяти
cmp ax,bx ; сравнить записанное и считанное
jne error_ram ; перейти на обработчик ошибок
dec di ; перейти к следующему адресу
126jnz test_cell
127test cx,0 ; младший банк протестирован?
128jz end_test_ram
129mov cx,0 ; переход к тестированию младшего банка ОЗУ
130jmp test_bank
error_ram:
132mov si,1
133mov ds:[si],FFFDh ; поместить в обл. вывода значение кода ошибки
134int 32 ; вызов п/программы вывода
135jmp error_ram
136end_test_ram: ret
137test_ram ENDP
138input PROC NEAR ; обработчик прерывания от клавиатуры
139in al, PKDID ; считать номер клавиши из ПККИ
140test al,64 ; анализировать его значение
141jz need_output ; нажата клавиша печати
142test al,63
jz need_comp ; нажата клавиша обработки
144cli ; запретить прерывания
145inc si
mov ds:[si],al ; иначе сохраним ее код в области вывода
147sti ; разрешить прерывания
148jmp end_input
need_comp:
call computing
need_output:
int 32 ; вызов п/программы вывода
153end_input:
154mov al,64h ; очистка регистра текущих прерываний ПКП
155out PICR1, al
iret
input ENDP
158output PROC NEAR ; обработчик прерывания от принтера
159and si,si ; установить флаг z
160jz end_out ; если si=0, данные к выводу не готовы
161ready:
in al, PPIB ; считать слово состояния принтера (порт В ППИ)
163or al,00011111b ; выделить значащие биты
164test al,19h ; 11001b -слово состояния принтера, готового к приему
165jnz ready ; дожидаться