Ну вот, жизненный цикл макетки подошел к завершению. Свои задачи она выполнила и теперь ей на смену должна прийти другая, более сложная.
Вот простейший "монитор", который я для нее написал. Работает он через последовательный порт. Его основная функция - загрузка файлов через терминал в ОЗУ и запуск программ с адреса 8000h. Кроме того имеются подпрограммы ввода и вывода. Ввод с использованием прерываний и аппаратным управлением потоком.
Код:
include "8085.inc"
;----RST 0---------------------------------------------------------------------------------------------------------
di
lxi sp,ramtop
jmp init
nop
;----RST 1---Разрешение передачи /RTS вкл-----------------------------------------------------
mvi a,rxe+txen+dtr+rts
out cusart
ret
nop
nop
nop
;----RST 2---Вывод строки [HL] в терминал---------------------------------------------------
strout: mov a,m ; загрузка символа
ana a ; проверка конца сообщения
rz
rst 3 ; вывод символа
inx h
jmp strout ; к следующему символу
;----RST 3--Вывод символа в терминал---------------------------------------------------------
chout: push psw
sym1: in cusart ; загрузка слова состояния
ani txrdy+dsr ; проверочная маска
cpi txrdy+dsr ; проверка готовности передатчика
jnz sym1 ; если не готов то sym1
pop psw
out dusart ; вывод в порт
ret
nop
nop
;----RST 5--Вывод HEX в терминал---------------------------------------------------------------
hexout: push psw
rrc
rrc
rrc
rrc
call nibout
pop psw
call nibout
ret
nop
nop
nop
;----RST 7--Обработчик прерываний УСАПП------------------------------------------------
int: push psw
mvi a,rxe+txen+dtr
out cusart ; /RTS выкл
in dusart ; чтение из порта
sta lastch ; сохранение символа в переменной
pop psw
ei
ret
;------Главный цикл--------------------------------------------------------------------------------------
loop: hlt ; ожидание
lda lastch ; последний принятый символ
rst 3 ; вывод символа
cpi 6Ch ; если "L"
jz sload ; то переход к загрузке
cpi 67h ; если "G"
jz goto ; запуск программы в озу
rst 1 ; /RTS вкл
jmp loop
;------Загрузка через порт--------------------------------------------------------------------------
sload: lxi h,loadstr ; адрес строки
rst 2 ; вывод строки
lxi h,ramp ; загрузка указателя
rst 1 ; /RTS вкл
sload1: hlt
lda lastch ; загружаем байт в аккумулятор
mov m,a ; записываем в память
inx h ; HL+1
rst 3 ; вывод символа
rst 1 ; /RTS вкл
jmp sload1 ; цикл загрузки
;------Запуск программы с адреса 8000h---------------------------------------------------
goto: lxi h,gotostr ; адрес строки
rst 2 ; вывод строки
rst 1 ; /RTS вкл
call 8000h
lxi h,endstr ; адрес строки
rst 2 ; вывод строки
rst 1 ; /RTS вкл
ret
;------Инициализация-----------------------------------------------------------------------------------
init: call initusart
lxi h,introstr ; адрес строки
rst 2 ; вывод строки
ei
jmp loop
;---Установка ВВ51 в исходное состояние-----------------------------------------------
initusart: xra a
out cusart
out cusart
out cusart
mvi a,ir ; Сброс
out cusart
mvi a,s2400
out cusart ; Установка режима порта
rst 1 ; /RTS вкл
ret
;----печать HEX младшего полубайта----------------------------------------------------
nibout: ani 0Fh
cpi 0Ah
jm nib1
adi 7
nib1: adi 30h
rst 3 ; вывод символа
ret
;-------------------------------------Данные----------------------------------------------------------------
introstr: db 0dh,'Monitor nano:',0dh,00h
loadstr: db 0dh,'Loading:',0dh,00h
gotostr: db 0dh,'Go 8000h',0dh,00h
endstr: db 0dh,'End program.',0dh,00h
;--------------------Константы и указатели--------------------------------------------------------
ramtop= 087DFh ; Верхушка свободной памяти
ramp= 08000h ; Начало оперативной памяти
lastch= 087E1h ; Редактируемый символ
;---Адреса регистров УСАПП----------------------------------------------------------------------
dusart= 00h ; регистр данных
cusart= 01h ; регистр команд
;---Режимы УСАПП--------------------------------------------------------------------------------------
s9600= 04Eh ;9600_8_no_1
s2400= 04Fh ;2400_8_no_1
;---Команды УСАПП------------------------------------------------------------------------------------
txen= 01h ; Передатчик включен
dtr= 02h ; Устройство готово
rxe= 04h ; Приемник включен
sbrk= 08h ; Прерывание передачи
er= 10h ; Сброс ошибок приема
rts= 20h ; Передача разрешена
ir= 40h ; Программный сброс
eh= 80h ; Режим Hunt
;---Регистр состояния УСАПП-----------------------------------------------------------------------
txrdy= 01h ; Передатчик готов
rxrdy= 02h ; Приемник готов
txe= 04h ; Передача закончена
pe= 08h ; Ошибка четности
oe= 10h ; Ошибка переполнения
fe= 20h ; Ошибка формата
syndet= 40h ; Синхросимвол найден
dsr= 80h ; Передатчик терминала готов
Схема контроллера простейшая, включение компонентов типовое - КР580ВМ80, КР580ГФ24 с кварцем 22.1184 Мгц, КР580ВК28(38), В качестве ПЗУ используется AT28C64, начинается с адреса 0000h, ОЗУ статика КР537РУ10 2кб с адреса 8000h. "Дешифратор адреса" выполнен на ЛА3, тактовая частота процессора 2.4576 МГц подается и на тактовый вход КР580ВВ51. Поделенные на 16 при помощи ИЕ5 тактовые импульсы подаются на /TxC /RxC ВВ51, обеспечивая скорость порта 2400 и 9600.