Разработка учебной микроЭВМ с возможностью ввода и вывода программ на ленту кассетного магнитофона, страница 7

PORT_IN_ RUS1 ;

EQU

00FFH

Адрес RUS порта ввода (МС 580ВВ79)

PORT_IN_DAN1 ;

EQU

00FFH

Адрес регистра данных порта вывода

PORT_IN_ RUS2 ;

EQU

4000H

Адрес RUS порта вывода (МС580ВВ51А)

PORT_IN_DAN2

EQU

8000H

Адрес регистра даннных порта  вывода

STACK TOP

EQU

DFFFH

Адрес вершины стека

ORG

0000H

MGNITOFON;

JMP INIT

Переход на инициализацию

LXISP

Загрузить указатель стека

STACK TOP TOPTTPTTOP

MVI A

00H

Заполнить А нулями

OUT

00H

Сбросить в нуль индикатор загрузки

OUT

01H

Сбросить в нуль индикатор ошибка по четности

IN

00H

Считать состояние переключателя пересылки

ANI

01H

Выделение D0

CPI

01H

Сравнить содержимое А с 1

JZ  LOOP2

Если А=1, переход в подпрограмму записи

LXI H

M1

Загрузить начальный адрес РЕ-файла

SHLD

Переписать в оперативное ЗУ по адресу А1

MVI A

FFH

Команда с описанием режима в А

OUT RUS2

Вывод в RUS2

IDENT;

MVI A

16H

Инструкция команды в А

OUT RUS2

Вывод в RUS2

EI

Разрешение прерывания

HLT

Ожидание данных возврата через RET

LDA

Ltfb/Л

8000H

Переслать данные УСАПП в А

STA

M2

Переписать содержимое А  в M2

CPI A

C7H

Сравнить содержимое А с C7H

JNZ

Переход по метке IDENT, если идентификатор не найден

MVI A

Инструкция команды в А

в А

OUT RUS2

Вывод в RUS2

EI

Разрешение прерывания

HLT

Ожидание данных возврата через RET

LDA

8000H

Переслать данные УСАПП в А (номер программы)

STA

0C75H

Переписать в М3

LXIH

Загрузить адрес, содержащий номер программы, в HL

СМР М

Сравнить содержимое А с номером программы в ячейке ЗУ

JNZ

Переход по метке IDENT, если найденный номер программы не равен введенному номеру программы

LXI H

Загрузить начальный адрес в HL

SHLD

Переписать по адресу

ADDRESS;

MVI A

16H

Инструкция команды в А

STA

C000

Содержимое А в УСАПП

EI

Разрешение прерывания

HLT

Ожидание; возврат через RET

LDA

8000

Данные УСАПП в А2

LHLD

Загрузить Мх в HL

СМР М

Сравнить содержимое

А с Мх

JNZ

Переход по метке

IDENT, если не равно введенному начальному или ко

нечному адресу

LHLD

0C70

Загрузить адрес в А2

(Мх)

INX H

Увеличить этот адрес на 1 (HL+1)

SHLD

0C70

Переписать увеличенный адрес в Mx

MVI A

6C

Загрузить старший байт конечного адреса в А

CPI H

Сравнить содержимое А с содержимым Н

JN2

Переход по метке ADDRESS после проверки всех 4 байт начального и конечного адресов

MVI A

49H

Заполнить А единицами

OUT

00

Установка триггера индикации загрузки в состояние 1

LHLD

OC68H

Загрузить начальный адрес в HL

SHLD

0C72

Переписать в A3

DATA;

MVI A

16H

Инструкция команды в А

STA

C000H

Инструкция форматам команды в УСАПП

El

Разрешение прерывания

HLT

Ожидание

LDA

Переслать данные в УСАПП в А

LHLD

Загрузить содержимое адреса A3 в hl.

MOV M

Переписать содержимое А в программный файл

INX H

Увеличить адрес программы на 1

SHLD

Переписать увеличенный адрес в A3

CALL PE-CHECK

Проверка на четность: переход по метке РЕ-СНЕСК

LDA

0C6AH

Загрузить содержимое М4 (конечный адрес) в А (младший байт)

CMP L

Конец программного файла?

JNZ DATA

Если ¹ О, продолжить пересылки данных; переход по метке DATA

LDA

0C6B

Загрузить содержимое М4 (конечный адрес) в А (младший байт)

CMP H

Конец программного файла?

JNZ

Если¹О, продолжить пересылки данных; переход по метке DATA

XRA A

Нуль в А

OUT

00

Сбросить в нуль триггер индикатора загрузки

JMP LOOP1

Переход на LOOP1

LOOP2;

LXI H

0C67

Загрузить адрес номера программы

SHLD

0C70H

Переписать Мх в оперативное ЗУ

MVI H

FFH

Загрузить 1 (DO)

OUT RUS2

Вывод в RUS2

MVI A

33H

Команда с описанием режима в А

OUT RUS2

Вывод в RUS2

MVI A

C7

Загрузить индефикатор

STA

8000H

Запомнить IDENT в УСАПП

LXI H

9000H

Ввод начального адреса

EXIT 1;

IN_RUS1

Ввод словосостояния

ANI

0FH

Выделение D3-D0

JZ EXIT 1

Если Z=0, то ожидание нажатия

MVI A

40H

OUT RUS1

Команда чтения FIFO

IN_DAN1

Чтение FIFO

STA M6

Запоминание по адресу М6

MOV C,A

В регистр С – код нажатой клавиши

CALL PEREVOD

П/п перевода двоичного кода в 7-сегментный

CALL DISPL

П/п вывода на дисплей

EXIT 2;

IN RUS1

Ввод словосостояния

ANI

0FH

Выделение D3-D0

JZ EXIT 2

Если Z=0, то ожидание нажатия

MVI A

40H

OUT RUS1

Команда чтения FIFO

IN_DAN1

Чтение FIFO

STA M7

Запоминание по адресу М7

MOV C,A

В регистр С – код нажатой клавиши

CALL PEREVOD

П/п перевода двоичного кода в 7-сегментный

CALL DISPL

П/п вывода на дисплей

EXIT 3;

IN RUS1

Ввод словосостояния

ANI

0FH

Выделение D3-D0

JZ EXIT 3

Если Z=0, то ожидание нажатия

MVI A

40H

OUT RUS1

Команда чтения FIFO

IN_DAN1

Чтение FIFO

STA M8

Запоминание по адресу М8

MOV C,A

В регистр С – код нажатой клавиши

CALL PEREVOD

П/п перевода двоичного кода в 7-сегментный

CALL DISPL

П/п вывода на дисплей

EXIT 4;

IN RUS1

Ввод словосостояния

ANI

0FH

Выделение D3-D0

JZ EXIT 4

Если Z=0, то ожидание нажатия

MVI A

40H

OUT RUS1

Команда чтения FIFO

IN_DAN1

Чтение FIFO

STA M9

Запоминание по адресу М9

MOV C,A

В регистр С – код нажатой клавиши

CALL PEREVOD

П/п перевода двоичного кода в 7-сегментный

CALL DISPL

П/п вывода на дисплей

EXIT 5;

IN RUS1

Ввод словосостояния

ANI

0FH

Выделение D3-D0

JZ EXIT 5

Если Z=0, то ожидание нажатия

MVI A

40H

OUT RUS1

Команда чтения FIFO

IN_DAN1

Чтение FIFO

STA M10

Запоминание по адресу М10

MOV C,A

В регистр С – код нажатой клавиши

CALL PEREVOD

П/п перевода двоичного кода в 7-сегментный

CALL DISPL

П/п вывода на дисплей

EXIT 6;

IN RUS1

Ввод словосостояния

ANI

0FH

Выделение D3-D0

JZ EXIT 6

Если Z=0, то ожидание нажатия

MVI A

40H

OUT RUS1

Команда чтения FIFO

IN_DAN1

Чтение FIFO

STA M11

Запоминание по адресу М11

MOV C,A

В регистр С – код нажатой клавиши

CALL PEREVOD

П/п перевода двоичного кода в 7-сегментный

CALL DISPL

П/п вывода на дисплей

LDA M6

Загрузка А¬М6

ANI

OFH

Выделение младшей тетрады

STA M12

Запоминание  А по адресу М12

LDA M7

Загрузка А¬М7

RLC

RLC

RLC

RLC

Перенос младшей тетрады на место старшей

STA M12

Запоминание А по адресу M12=M6+M7

LDA M8

Загрузка А¬М8

ANI

OFH

Выделение младшей тетрады

STA M13

Запоминание  А по адресу М13

LDA M9

Загрузка А¬М9

RLC

RLC

RLC

RLC

Перенос младшей тетрады на место старшей

STA M13

Запоминание А по адрессу M13=M6+M7-младший байт

LDA M10

Загрузка А¬М10

ANI

OFH

Выделение младшей тетрады

STA M14

Запоминание  А по адресу М14

LDA M11

Загрузка А¬М11

RLC

RLC

RLC

RLC

Перенос младшей тетрады на место старшей

STA M14

Запоминание А по адресу M14=M11+M10-младший байт

LHLD M12

A¬M14-данные о длине программы

MOV D A

D¬A

LOOP4;

CALL KEY

Ввод данных

CALL PEREVOD

П/п перевода двоичного кода в 7-сегментный

CALL DISPL

П/п вывода на дисплей

JMP LOOP3

Переход на метку М3

POP H

Восстановление HL из стека

LOOP3;

INX H

HL¬HL+1

DCR D

D¬D-1

JNZ LOOP4

Переход на LOOP4,если D¹0

MVI A

FF H

Команда описания режима

STA

C000H

Запись режима в УСАПП

MVI A

33H

Инструкция команды

STA

C000H

Инструкция команды в УСАПП

MVI A

C7

Загрузить идентификатор в А (RESTART 0)

STA

8000H

Запомнить IDENT в УСАПП

NUMBER;

EI

Разрешение прерывания

HALT

Ожидание

MVI A

33H

Инструкция команды в А

OUT_RUS2

Запись команд в УСАПП

LHLD

0С70H

Загрузить содержимое Мх в HL (номер программы)

MOV A M

Номер программы в А

STA

8000H

Содержимое А в УСАПП

INX H

Увеличить содержимое HL на 1

SHLD

0C70H

Переслать содержимое Н в Мх

MVI A

6CH

Загрузить в А адрес ,в котором записав младший байт ко

нечного адреса

CMP L

Сравнить содержимое А с содержимым L

JNZ NUMER

Если ¹ О,,то переход по метке NUMBER

LHLD M12

Загрузить содержимое МЗ (начальный адрес)

SHLD

0C70H

Переписать в А2

DATA;

MVI A

33H

Инструкция команды в А

OUT_RUS2

Инструкция команды в УСАПП

LHLD

0C70H

Загрузить начальный адрес в HL

MOV A M

Содержимое адреса в А

STA

8000H

Содержимое в УСАПП

INX H

Увеличить содержимое HL на 1

SHLD

Переписать увеличенный адрес в  ЗУ из адреса А2

LDA

0C64H

Загрузить начальный адрес+1024 (= конечный адрес) в А (младший байт)

CMP L

Сравнить содержимое L с содержимым А

JNZ LOOP5

Если а¹о, переход по метке LOOP5

LDA

0C6BH

Загрузить начальный адрес+1024 (конечный адрес) в А

(старший байт)

CMP H

Сравнить содержимое Н c содержимым А

JZ ENE

Если А=0, то запись на ленту подготовлена, переход по метке ENE Если А¹О, то продолжать

LOOP5;

EI

Разрешение прерывания

HALT

Ожидание

JMP DATA

Переход по метки DATA

ENE;

MVI A

00

Загрузить нуль в А

OUT

00

Сброс триггера индикатора загрузки

JMP LOOP1

Переход на LOOP2

РЕ-СНЕСК;

LDA

С000H

Проверка на четность; чтение слова состояния УСАПП

ANI

08H

Чтение одного бита четности

CPI H

Равен ли бит четности 1?

CZ

Если произошла ошибка по четности, отметьте ее. Переход по метке PE-ERROR

RET

Переход

PE-ERROR;

XCHG

Обменять содержимое HL с содержимым DE

LHLD

0C6EH

Загрузить в HL содержимое адреса А1

LDA

0C72H

Загрузить в А ошибочный адрес (младший байт)

MOV M

Переслать содержимое А в РЕ-файл (младший байт)

INX H

Увеличить содержимое HL на 1

LDA

0C73H

Загрузить в А ошибочный адрес (старший байт)

MOV M

Переслать содержимое А в РЕ-файл

INX H

Увеличить содержимое HL на 1

SHLD

0C6EH

Переписать следующий адрес в А1

XCHQ

Обменять содержимое HL с содержимым DE

RET

Переход

INIT;

MVI A

DEH

Формат управляющего слова

OUT_RUS2

Вывод в RUS2

MVI A

DO

Формат инструкции команды

OUT_RUS2

Вывод в RUS2

MVI A

00H

Команда установки режима

OUT_RUS1

Вывод в RUS1

MVI A

C1H

Команда программной очистки

OUT_RUS1

Вывод в RUS1

MVI A

24H

Установка частоты сканирования

OUT_RUS1

Вывод в RUS1

RET

Переход

DISPL;

MVI A

90H

Команда вывода на дисплей

ORA E 

OUT_RUS1

Вывод в RUS1

MOV A C

Пересылка кода символа

OUT_DAN1

Вывод символа на дисплей

RET

Переход

PEREVOD;

LXI H  TABLE

CODE

MVI B D

DAD B

MOV C M

HL¬HL+BC

RET

TABLE   CODE

DB

3F

Код клавиши“0”

DB

06

Код клавиши “1”

DB

5B

Код клавиши “2”

DB

4F

Код клавиши “3”

DB

66

Код клавиши “4”

DB

6D

Код клавиши “5”

DB

7D

Код клавиши “6”

DB

07

Код клавиши “7”

DB

7F

Код клавиши “8”

DB

6F

Код клавиши “9”

DB

77

Код клавиши “A”

DB

7C

Код клавиши “B”

DB

63

Код клавиши “C”

DB

5E

Код клавиши “D”

DB

27

Код клавиши “E”

DB

71

Код клавиши “F”

KEY;

IN RUS1

Вывод словосостояния

ANI

0FH

Выделение D3-D0

JZ KEY

Если JZ¹1 , то цикл ожидания

MVI A

40H

OUT RUS1

Команда чтения FIFO

IN DAN1

Чтения FIFO

MOV C A

В регистр С – код клавиши

RET

Список литературы

1.  Й. Янсен . Курс цифровой электроники . т.4 Микрокомпьютеры

Пер. с голландского М. Мир 1987г.

2.  Цифровые и аналоговые интегральные микросхемы . Справочник под ред. С.В. Якубовского . М. Радио и связь 1989г.

3.  Цифровые  интегральные микросхемы . Справочник . М.И Богданович . Мн. Беларусь 1991г.

4.  Логические ИС серии1533 . Справочник тт1,2 . Мн Бином 1993 г.

5.  Реисторы , конденсаторы , трансформаторы , доссели , коммутационные устройства РЭА . Справочник . Н.Н. Акимов и др. Мн. Беларусь 1994 г.