Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Курсовик2.doc
Скачиваний:
2
Добавлен:
01.05.2025
Размер:
1 Мб
Скачать
☆

Разработка и описание принципиальной схемы алгоритма.

В УСЛОВНЫХ АДРЕСАХ:

ДЛЯ I КР580BB55.

Основная программа BEGIN (BEG): программа работы I ВВ55

адрес

команда

комментарий

BEG+0

OUT 9A16

записываем слово состояния МП (режим ВВ) 10011010

BEG+2

CALL PRC+0

вызываем подпрограмму PREADC2

BEG+6

CPI 216

сравниваем А с командой СТОП (0010)

BEG+8

JZ BEG+43

если равно 0 то переходим по адресу BEG+43

BEG+13

CPI 116

если не = 0 сравниваем А с командой начала обработки 0001

BEG+15

JZ BEG+52

если = 0 то переходим к адресу BEG+52

BEG+20

CPI 416

если не = 0 сравниваем А с ком. перехода на след. Ноту 0100

BEG+22

JZ BEG+61

если = 0 то переходим по адресу BEG+61

BEG+27

CPI 816

если не = 0 то сравниваем А с ком. перехода на пред.ноту 10000

BEG+29

JZ BEG+70

если = 0 то переходим по адресу BEG+70

BEG+34

CALL PEN+0

вызов подпрограмы получения эталонных значений

BEG+38

JMP BEG+2

если не = 0 то переходим по адресу BEG+2

BEG+43

CALL PS+0

вызываем подпрограмму PSTOP

BEG+47

JMP BEG+2

переходим по адресу BEG+2

BEG+52

CALL PPL+0

вызываем подпрограмму PPLAY

BEG+56

JMP BEG+2

переходим по адресу BEG+2

BEG+61

CALL PN+0

вызываем подпрограмму PNEXT

BEG+65

JMP BEG+2

переходим по адресу BEG+2

BEG+70

CALL PPR+0

вызываем подпрограмму PPREV

BEG+74

JMP BEG+2

переходим по адресу BEG+2

Подпрограмма PREADC2 (PRC2): чтение из C2 пока там что-то не появится отличное от 0000

адрес

команда

комментарии

PRC2+0

MVI A,016

в А передаётся содержимое 0

PRC2+3

IN port C2

из С2 в А

PRC2+5

CPI 016

сравниваем содержимое А с 0 (А)-0

PRC2+7

JZ PRC2+3

если равно 0 значит возвращается к адресу PRC2+3

PRC2+10

RET

возвращение в основную программу

Подпрограмма PSTOP (РS): устанавливаем все параметры в начальное значение

адрес

команда

комментарий

РS+0

MVI Р+0, 916

передаём в память значение начальной ноты ЛЯ (9)

РS+3

MVI Р+1, FFFFFFFFFFFFFFF16

передаём в память значение начальной октавы СКО (-1)

РS+6

RET

возвращаемся в основную программу

Подпрограмма PNEXT (РN): переключиться на следующую ноту

адрес

команда

комментарии

РN+0

MVI H,016

в Н перемещаем 0

РN+3

М0V L,Р+0

в L передаём содержимое NNOTE

РN+6

MVI B,016

в В передаём 0

РN+9

M0V C,Р+1

в С передаём содержимое NOCTAV

РN+12

MVI A,C

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

РN+15

CPI FFFFFFFFFFFFFFFF16

сравниваем А со значением октавы СКО (А) – (-1)

РN+17

JNZ РN+42

если не = 0, то переходим к адресу РN+42

РN+21

INR L

увеличиваем содержимое регистра L на 1

РN+23

MOV A,L

в А записываем значение L

PN+26

CPI 1216

сравниваем содержимое A со значением ноты СИ+1

PN+28

JNZ РN+84

если не = 0 то переходим к адресу РN+84

РN+32

MOV L,016

в L записываем значение ноты ДО (0)

РN+35

MOV C,016

в С записываем значение октавы OKO (0)

РN+38

JMP РN+84

переходим к адресу РN+84

РN+42

CPI 616

сравниваем А и значения 4-й октавы(6) (А)-(6)

РN+44

JNZ РN+68

переходим к адресу РN+68

РN+47

INR L

увеличиваем соджержимое L на 1

PN+49

MOV A,L

в A записываем значение L

РN+52

CPI 1016

сравниваем содержимое А с ЛЯ+1

РN+54

JNZ РN+84

если не = 0 то переходим к РN+84

РN+58

MOV L,916

в L записываем значение ЛЯ

РN+61

MOV C, FFFFFFFFFFFFFFFF16

в С записываем значение СКО

РN+64

JMP РN+84

переходим к адресу РN+84

РN+68

INR L

увеличиваем содержимое L на 1

PN+70

MOV A,L

в A записываем значение L

РN+73

CPI 1216

сравниваем A с СИ+1

РN+75

JNZ РN+84

если не = 0, то переходим к РN+84

РN+79

INR C

увеличиваем С на 1

РN+81

MVI L,016

в L записываем ДО

РN+84

MОV Р+0,L

в NNOTE записываем значение L

РN+87

MОV Р+1,C

в NOCTAV записываем значение С

РN+90

RET

возвращение в основную программу

Подпрограмма PPREV (РPR): переключиться на предыдущую ноту

адрес

команда

комментарий

РPR+0

MVI H,0 16

в Н перемещаем 0

РPR+3

MОV L,Р+0

в L перемещаем NNOTE

РPR+6

MVI B,016

в В перемещаем 0

РPR+9

MОV C,Р+1

в С перемещаем NOCTAV

РPR+12

MОV A,C

в А перемещаем значение С

РPR+15

CPI FFFFFFFFFFFFFFFF

сравниваем содержимое А с СКО (-1)

РPR+17

JNZ РPR+41

если не = 0 то переходим по адресу РPR+41

PPR+20

DCR L

уменьшаем L на 1

РPR+22

MOV A,L

записываем в А значение L

РPR+25

CPI 816

сравниваем A с ЛЯ-1

РPR+27

JNZ РPR+83

если не = 0 то переходим по адресу РPR+83

РPR+31

MOV L,916

в L перемещаем ЛЯ (9)

РPR+34

MOV C,616

в С перемещаем 4-я октава (6)

РPR+37

JMP РPR+83

переходим по адресу РPR+83

РPR+41

CPI 616

сравниваем содержимое А с 4-й октавой (6)

РPR+43

JNZ РPR+67

если не = 0 то переходим по адресу РPR+67

РPR+46

DCR L

уменьшаем L на 1

РPR+48

MOV A,L

записываем в А значение L

РPR+51

CPI FFFFFFFFFFFFFFFF16

сравниваем A с ДО-1

РPR+53

JNZ РPR+83

если не = 0 то переходим по адресу РPR+83

РPR+57

MOV L,1116

в L перемещаем СИ (11)

РPR+60

MOV C,516

в С перемещаем 3-я октава (5)

РPR+63

JMP РPR+83

переходим по адресу РPR+83

РPR+67

DCR L

уменьшаем L на 1

РPR+69

MOV A,L

записываем в А значение L

РPR+72

CPI FFFFFFFFFFFFFFFF16

сравниваем A с ДО-1

РPR+74

JNZ РPR+83

если не = 0 переходим по адресу РPR+83

РPR+78

DCR C

уменьшаем С на 1

РPR+80

MOV L,1116

в L записываем СИ

РPR+83

MOV P+0,L

в NNOTE записываем L

РPR+86

MOV P+1,C

в NOCTAV записываем С

РPR+89

RET

возвращение в основную программу

Подпрограмма PREADD (РRE): чтение с датчика ( в Н старшая часть слова, в L младшая)

адрес

команда

комментарий

PRE+0

MVI A,016

записываем в А 0

PRE+3

IN port A

передаём значение из порта А в А

PRE+5

MOV H,A

записываем в Н значение А

PRE+8

MVI A,016

в А записываем 0

PRE+11

IN port B

передаём значение из порта В в А

PRE+13

MOV L,A

записываем значение А в L

PRE+16

CPI 016

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

PRE+18

JNZ PRE+29

если не = 0 то переходим к адресу PRE+29

PRE+20

MOV A,H

если = 0 то в А записываем содержимое Н

PRE+23

CPI 016

сравниваем А с 0

PRE+25

JZ PRE+0

если равно 0, то переходим по адресу PRE+0

PRE+29

RET

возврат в основную программу

Подпрограмма PCALCULATE (РCA): подсчёт эталонного значения (В – номер ноты, С – номе октавы)

адрес

команда

комментарий

PCA+0

MVI D,016

передаём в D 0

PCA+3

LXI HL, P+2

передаём в HL адрес начала массива эталонных значений нот

PCA+8

MOV A,L

записываем в А значение L

PCA+12

ADD B

прибавляем значение номера ноты

PCA+14

ADD B

прибавляем значение номера ноты

PCA+16

MOV L,A

записываем получившееся из А в L

PCA+19

MOV A,H

записываем в А значсение Н

PCA+22

ADC 016

прибавляем перенос (если он есть)

PCA+24

MOV H,A

записываем значение в Н из А

PCA+27

LDAX HL

обращаемся к первому байту по адресу Н L и пишем его в А

PCA+30

MOV D,A

записываем значение из А в D(старшая часть начального значенияя)

PCA+33

INX HL

увеличиваем значение адреса на 1

PCA+36

LDAX HL

обращаемся ко второму байту по адресу Н L и пишем его в А

PCA+39

MOV E,A

записываем значение из А в Е(младшая часть начального значения)

PCA+42

MOV A,C

записываем значение С в А (начало обработки остальных октав)

PCA+45

CPI FFFFFFFFFFFFFFFF16

сравниваем значение А с -1

PCA+47

JZ PCA+86

если = 0, то переходим по адресу PCA+86 (на обработку СКО)

PCA+51

MOV A,C

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

PCA+54

CPI 016

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

PCA+56

JZ PCA+126

если = 0 то переходим по адресу РCA+126

PCA+58

MOV A,D

записываем в А значение D

PCA+61

RAL

арифметически сдвигаем А влево

PCA+62

MOV D,A

записываем в D значение А

PCA+65

MOV A,E

записываем в А значение E

PCA+68

RAL

арифметически сдвигаем А влево

PCA+69

MOV E,A

записываем значение А в E

PCA+72

MOV A,D

записываем в А значение D

PCA+75

ADC 016

складываем значение А с переносом

PCA+77

MOV H,A

записываем в Н значение А

PCA+80

DCR C

уменьшаем С на 1

PCA+82

JMP PCA+51

переходим по адресу PCA+51

PCA+86

MVI H,1

записываем в H 00000001

PCA+89

MOV A,D

записываем в А значение D

PCA+92

ANA H

логическое «И» А с D

PCA+94

MOV H,A

записываем в D значение А

PCA+97

MOV A,D

записываем в А значение D

PCA+100

RAR

сдвигаем А вправо

PCA+101

MOV D,A

записываем значение А в D

PCA+104

MOV A,E

записываем в А значение E

PCA+107

RAR

сдвигаем А вправо

PCA+108

MOV A,H

записываем в А значение Н

PCA+112

CPI 0

сравниваем его с 0 (была ли 1 в младшем разряде D до сдвига)

PCA+114

JZ PCA+123

если 0 (не было) то переходим по адресу РСА+123

PCA+118

MOV A,E

если не 0 (была) записываем в А значение из Е

PCA+121

ADD 8016

и прибавляем 1 к старшему разряду 10000000

PCA+123

MOV E,A

записываем значение А в E

PCA+126

RET

возврат в основную программу

Подпрограмма PPLAY (РPL): обработка сигнала

адрес

команда

коментарий

PPL+0

MVI A,016

записываем в А значение 0

PPL+3

OUT port C1

выдаём это значение в порт С1

PPL+5

MOV A, 016

записываем в А значение 0

PPL+8

OUT port A

выдаём из А в порт А

PPL+10

OUT port B

выдаём из А в порт В

PPL+12

CALL PRE+0

вызываем подпрограмму PREADD

PPL+16

MOV B,P+0

записываем в В NNOTE

PPL+19

MOV C,P+1

записываем в С NOCTAV

PPL+22

CALL PCA+0

вызываем подпрограмму PCALCULATE

PРL+26

MOV B,H

записываем значение из Н в В-старшая часть считанного значения

PРL+29

MOV C,L

записываем значение из L в С-младшая часть считанного значения

PPL+32

MOV A,B

записываем в А старшую часть считанного значения

PPL+35

CMP D

сравниваем со старшей частью эталонного значения

PPL+37

JP PPL+70

если результат > 0, то переходим по адресу PPL+70

PPL+41

JM PPL+64

если результат < 0, то переходим по адресу PPL+64

PPL+45

MOV A,C

если старшие части равны пишем в А младшую часть

PPL+48

CMP E

и сравниваем с эталонной младшей частью

PPL+50

JP PPL+70

если результат > 0, то переходим по адресу PPL+70

PPL+54

JM PPL+64

если результат < 0, то переходим по адресу PPL+64

PPL+58

MOV A,316

если обе части слов равны – в А пишем 0011(команда равенства)

PPL+61

JMP PPL+73

переходим по адресу PPL+73

PPL+64

MOV A,116

если значение меньше эталона – в А значение 0001

PPL+67

JMP PPL+73

переходим по адресу PPL+73

PPL+70

MOV A,216

если значение больше эталона то записываем в А значение 0010

PPL+73

OUT port C1

выдаём в порт С1 результат сравнения из А (на 2-ой ВВ)

PPL+75

RET

возвращаемся в основную программу

Подпрограмма PENTER (PEN): получение эталоных значений

адрес

команда

комментарий

PEN +0

MOV A, 016

записываем в А значение 0

PEN+3

MVI C,016

записываем в С 0 (обозначает значение какой ноты мы запоминаем)

PEN+6

MVI B,1216

записываем в В 12 (счётчик для выхода из цикла)

PEN+9

OUT port A

выдаём из А в порт А

PEN+11

OUT port B

выдаём из А в порт В

PEN+13

CALL PRE+0

вызываем подпрограмму PREADD

PEN+17

XCHF

записываем содержимое пары HL в DE

PEN+18

LXI HL,P+2

записываем в HL адрес первой ячейки памяти

PEN+23

MOV A,L

записываем в А значение L

PEN+26

ADD C

прибавляем значение

PEN+28

ADD C

прибавляем значение

PEN+30

MOV L,A

записываем получившееся из А в L

PEN+33

MOV A,H

записываем в А значсение Н

PEN+36

ADC 016

прибавляем перенос (если он есть)

PEN+38

MOV H,A

записываем значение в Н из А

PEN+41

LDAX HL

обращаемся к первому байту по адресу Н L и пишем его в А

PEN+44

ORA D

логически складываем с D

PEN+46

STAX HL

записать значение из A по адресу который находится в HL

PEN+49

INX HL

увеличиваем значение HL на 1

PEN+52

LDAX HL

обращаемся ко второму байту по адресу Н L и пишем его в А

PEN+55

ORA E

логически складываем с Е

PEN+57

STAX HL

записать значение из А по адресу который находится в HL

PEN+60

DCR B

увеличиваем В на 1

PEN+62

MOV A,B

записываем значение В в А

PEN+65

CPI 016

сравниваем с 0

PEN+67

JZ PEN+75

если = 0 то переходим по адресу PEN+75

PEN+69

INR C

если не = 0 прибавляем к С 1

PEN+71

JMP PEN +0

переходим по адресу PEN +0

PEN+75

RET

Для II КР580ВВ55

Программа USER(US):

адрес

команда

комментарий

US+0

OUT 9816

режим ВВ (записываем слово состояния ВВ) 10011000

US+2

IN port А

из порта А в А

US+4

MOV B,A

записываем значение из А в В

US+7

MVI A,016

записываем в А 0

US+10

OUT port A

обнуляем порт А

US+12

MOV A,B

записываем в А значение считанное из порта (из В)

US+15

CPI 016

сравнивает значение А с 0

US+17

JZ US+2

если = 0 то перейти к адресу US+2

US+20

CPI 116

сравнивает А с командой перехода на след. ноту 0001

US+22

JNZ US+59

если не = 0, то переходит к адресу US+59

US+25

MVI A,416

если =0,то в А передаём команду для I ВВ для перехода на след ноту 0100

US+28

OUT portC1

значение А передаётся на порт С1

US+30

CALL PN+0

вызывает подпрограмму PNEXT

US+34

MVI B,8016

зарисывает в В 1000000

US+37

MOV A,B

передаёт это значение в А

US+40

ORA L

логически прибавляет (логическое «или») содержимое регистра L

US+42

MOV B,A

записывает из А в В (1000хххх)

US+45

MOV A,C

в А записываети значение из С

US+48

RAL

сдвиг влево

US+49

RAL

сдвиг влево

US+50

RAL

сдвиг влево

US+51

RAL

сдвиг влево

US+52

ORA B

логическое «или» с содержимым В (1ууухххх)

US+54

OUT port B

передаёт это значение в порт В

US+56

JMP US+2

переходим по адресу US+2

US+59

CPI 216

сравнение А с командой перехода на предыдущ. Ноту 0010

US+61

JNZ US+98

если не = 0 то переход по адресу US+98

US+64

MVI A,816

если =0,то в А передаём команду для IBB для перехода на пред. ноту 1000

US+67

OUT portC1

передаём значение А в порт С

US+69

CALL PPR+0

вызывает подпрограмму PPREV

US+73

MVI B,8016

зарисывает в В 1000000

US+76

MOV A,B

передаёт это значение в А

US+79

ORA L

логически прибавляет (логическое «или») содержимое регистра L

US+81

MOV B,A

записывает из А в В (1000хххх)

US+84

MOV A,C

в А записываети значение из С

US+87

RAL

сдвиг влево

US+88

RAL

сдвиг влево

US+89

RAL

сдвиг влево

US+90

RAL

сдвиг влево

US+91

ORA B

логическое «или» с содержимым В (1ууухххх)

US+93

OUT port B

выдаёт значение из А в порт В

US+95

JMP US+2

переход к адресу US+2

US+98

CPI 816

сравниваем значение А с командой для остановки/сброса 1000

US+100

JNZ US+116

если не = 0 то переходим по адресу US+116

US+104

MVI А,216

если = 0 то в А записываем команду для I BB для остановки/сброса 0010

US+106

OUT portC1

передаём значение А в порт C

US+108

MVI А,F916

записываем в А 11111001 (111-СКО; 1001-ЛЯ)

US+111

OUT portB

передаём значение А в порт В

US+113

JMP US+2

переходим по адресу US+2

US+116

CPI 116

сравниваем значение А с 0001 (команда запуска обработки) 0001

US+118

JNZ US+147

если не = 0 то переходим по адресу US+147

US+122

MVI A,016

в А записываем 0

US+125

OUT portB

передаём значение А в порт В

US+127

OUT portC2

передаём значение А в порт С2

US+129

MVI A,116

записываем в А команду обработки для I BB 0001

US+132

OUT portC1

выдаём содержимое А в порт С1

US+134

IN portC2

считываем из порта С2 в А

US+136

OUT portB

передаём значение А в порт В

US+138

CALL T+0

вызываем таймер

US+142

MVI A,016

записываем в А 0

US+145

OUT portB

передаём значение А в порт В

US+147

MVI А, 316

записываем в А 0011 (команда получения эталонных значений) 0011

US+150

OUT port C1

выдаём значение из А в порт С1

US+152

JMP US+2

переходим по адресу US+2

Таймер(Т): KTIME EQU 75000000 = 11111011,10000111,10010111,01000000

адрес

команда

комментарий

T+0

MVI L,4016

записываем в L 100 (в 8-ричной системе) или 01000000

T+3

MVI H,9716

записываем в Н 10010111

T+6

MVI C,8716

записываем в С 10000111

T+9

MVI B,FB16

записываем в В 11111011

T+12

INX HL

увеличиваем пару Н L на 1

T+15

JNC T+12

если переноса нет то переходим по адресу Т+12

T+19

INX BC

если перенос был то увеличивам пару ВС на 1

T+22

JNC T+12

если переноса нет то переходим по адресу Т+12

T+26

RET

если перенос был то выходим в основную программу

Подпрограмма PNEXT (РN): переключиться на следующую ноту

адрес

команда

комментарии

РNE+0

MVI H,016

в Н перемещаем 0

РNE+3

М0V L,Р+25

в L передаём содержимое NNOTE

РNE+6

MVI B,016

в В передаём 0

РNE+9

M0V C,Р+26

в С передаём содержимое NOCTAV

РNE+12

MVI A,C

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

РNE+15

CPI FFFFFFFFFFFFFFFF16

сравниваем А со значением октавы СКО (А) – (-1)

РNE+17

JNZ РNE+42

если не = 0, то переходим к адресу РNE+42

РNE+21

INR L

увеличиваем содержимое регистра L на 1

РNE+23

MOV A,L

в А записываем значение L

PNE+26

CPI 1216

сравниваем содержимое A со значением ноты СИ+1

PNE+28

JNZ РNE+84

если не = 0 то переходим к адресу РNE+84

РNE+32

MOV L,016

в L записываем значение ноты ДО (0)

РNE+35

MOV C,016

в С записываем значение октавы OKO (0)

РNE+38

JMP РNE+84

переходим к адресу РNE+84

РNE+42

CPI 616

сравниваем А и значения 4-й октавы(6) (А)-(6)

РNE+44

JNZ РNE+68

переходим к адресу РNE+68

РNE+47

INR L

увеличиваем соджержимое L на 1

PNE+49

MOV A,L

в A записываем значение L

РNE+52

CPI 1016

сравниваем содержимое А с ЛЯ+1

РNE+54

JNZ РNE+84

если не = 0 то переходим к РNE+84

РNE+58

MOV L,916

в L записываем значение ЛЯ

РNE+61

MOV C, FFFFFFFFFFFFFFFF16

в С записываем значение СКО

РNE+64

JMP РNE+84

переходим к адресу РNE+84

РNE+68

INR L

увеличиваем содержимое L на 1

PNE+70

MOV A,L

в A записываем значение L

РNE+73

CPI 1216

сравниваем A с СИ+1

РNE+75

JNZ РNE+84

если не = 0, то переходим к РNE+84

РNE+79

INR C

увеличиваем С на 1

РNE+81

MVI L,016

в L записываем ДО

РNE+84

MОV Р+25,L

в NNOTE записываем значение L

РNE+87

MОV Р+26,C

в NOCTAV записываем значение С

РNE+90

RET

возвращение в основную программу

Подпрограмма PPREV (РPR): переключиться на предыдущую ноту

адрес

команда

комментарий

РPRE+0

MVI H,0 16

в Н перемещаем 0

РPRE+3

MОV L,Р+25

в L перемещаем NNOTE

РPRE+6

MVI B,016

в В перемещаем 0

РPRE+9

MОV C,Р+26

в С перемещаем NOCTAV

РPRE+12

MОV A,C

в А перемещаем значение С

РPRE+15

CPI FFFFFFFFFFFFFFFF

сравниваем содержимое А с СКО (-1)

РPRE+17

JNZ РPRE+41

если не = 0 то переходим по адресу РPRE+41

PPRE+20

DCR L

уменьшаем L на 1

РPRE+22

MOV A,L

записываем в А значение L

РPRE+25

CPI 816

сравниваем A с ЛЯ-1

РPRE+27

JNZ РPRE+83

если не = 0 то переходим по адресу РPRE+83

РPRE+31

MOV L,916

в L перемещаем ЛЯ (9)

РPRE+34

MOV C,616

в С перемещаем 4-я октава (6)

РPRE+37

JMP РPRE+83

переходим по адресу РPRE+83

РPRE+41

CPI 616

сравниваем содержимое А с 4-й октавой (6)

РPRE+43

JNZ РPRE+67

если не = 0 то переходим по адресу РPRE+67

РPRE+46

DCR L

уменьшаем L на 1

РPRE+48

MOV A,L

записываем в А значение L

РPRE+51

CPI FFFFFFFFFFFFFFFF16

сравниваем A с ДО-1

РPRE+53

JNZ РPRE+83

если не = 0 то переходим по адресу РPRE+83

РPRE+57

MOV L,1116

в L перемещаем СИ (11)

РPRE+60

MOV C,516

в С перемещаем 3-я октава (5)

РPRE+63

JMP РPRE+83

переходим по адресу РPRE+83

РPRE+67

DCR L

уменьшаем L на 1

РPRE+69

MOV A,L

записываем в А значение L

РPRE+72

CPI FFFFFFFFFFFFFFFF16

сравниваем A с ДО-1

РPRE+74

JNZ РPRE+83

если не = 0 переходим по адресу РPRE+83

РPRE+78

DCR C

уменьшаем С на 1

РPRE+80

MOV L,1116

в L записываем СИ

РPRE+83

MOV P+25,L

в NNOTE записываем L

РPRE+86

MOV P+26,C

в NOCTAV записываем С

РPRE+89

RET

возвращение в основную программу

Переменные (Р):

адрес

название

комментарий

Р+0

NNOTE

номер текущей ноты для первого ВВ55

Р+1

NOCTAV

номер текущей октавы для первого ВВ55

Р+2

массив начальных значений нот КО

Р+4

Р+6

Р+8

Р+10

Р+12

Р+14

Р+16

Р+18

Р+20

Р+22

Р+24

P+25

NNOTE

номер текущей ноты для второго ВВ55

Р+26

NOCTAV

номер текущей октавы для второго ВВ55

Стэк (ST):

адрес

команда

комментарий

ST+0

ST+1

ST+2

ST+3

ST+4

S T+5

В ДЕЙСТВИТЕЛЬНЫХ АДРЕСАХ:

Для I КР580ВВ55

Основная программа BEGIN (BEG): программа работы I ВВ55

адрес

команда

комментарий

000010

OUT 9A16

записываем слово состояния МП (режим ВВ) 10011010

000210

CALL 007910

вызываем подпрограмму PREADC2

000610

CPI 216

сравниваем А с командой СТОП (0010)

000810

JZ 004310

если равно 0 то переходим по адресу 004310

001310

CPI 116

если не = 0 сравниваем А с командой начала обработки 0001

001510

JZ 005210

если = 0 то переходим к адресу 005210

002010

CPI 416

если не = 0 сравниваем А с ком. перехода на след. Ноту 0100

002210

JZ 006110

если = 0 то переходим по адресу 006110

002710

CPI 816

если не = 0 то сравниваем А с ком. перехода на пред.ноту 10000

002910

JZ 007010

если = 0 то переходим по адресу 007010

003410

CALL 051010

вызов подпрограмы получения эталонных значений

003810

JMP 000210

если не = 0 то переходим по адресу 000210

004310

CALL 009010

вызываем подпрограмму PSTOP

004710

JMP 000210

переходим по адресу 000210

005210

CALL 043310

вызываем подпрограмму PPLAY

005610

JMP 000210

переходим по адресу 000210

006110

CALL 009710

вызываем подпрограмму PNEXT

006510

JMP 000210

переходим по адресу 000210

007010

CALL 018810

вызываем подпрограмму PPREV

007410

JMP 000210

переходим по адресу 000210

Подпрограмма PREADC2 (PRC2): чтение из C2 пока там что-то не появится отличное от 0000

адрес

команда

комментарии

007910

MVI A,016

в А передаётся содержимое 0

008210

IN port C2

из С2 в А

008410

CPI 016

сравниваем содержимое А с 0 (А)-0

008610

JZ 008210

если равно 0 значит возвращается к адресу 008210

008910

RET

возвращение в основную программу

Подпрограмма PSTOP (РS): устанавливаем все параметры в начальное значение

адрес

команда

комментарий

009010

MVI 000010, 916

передаём в память значение начальной ноты ЛЯ (9)

009310

MVI 000110, FFFFFFFFFFFFFFF16

передаём в память значение начальной октавы СКО (-1)

009610

RET

возвращаемся в основную программу

Подпрограмма PNEXT (РN): переключиться на следующую ноту

адрес

команда

комментарии

009710

MVI H,016

в Н перемещаем 0

010010

М0V L,000010

в L передаём содержимое NNOTE

010310

MVI B,016

в В передаём 0

010610

M0V C,000110

в С передаём содержимое NOCTAV

010910

MVI A,C

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

011210

CPI FFFFFFFFFFFFFFFF16

сравниваем А со значением октавы СКО (А) – (-1)

011410

JNZ 013910

если не = 0, то переходим к адресу 013910

011810

INR L

увеличиваем содержимое регистра L на 1

012010

MOV A,L

в А записываем значение L

012310

CPI 1216

сравниваем содержимое A со значением ноты СИ+1

012510

JNZ 018110

если не = 0 то переходим к адресу 018110

012910

MOV L,016

в L записываем значение ноты ДО (0)

013210

MOV C,016

в С записываем значение октавы OKO (0)

013510

JMP 018110

переходим к адресу 018110

013910

CPI 616

сравниваем А и значения 4-й октавы(6) (А)-(6)

014110

JNZ 016510

переходим к адресу 016510

014410

INR L

увеличиваем соджержимое L на 1

014610

MOV A,L

в A записываем значение L

014910

CPI 1016

сравниваем содержимое А с ЛЯ+1

015110

JNZ 018110

если не = 0 то переходим к 018110

015510

MOV L,916

в L записываем значение ЛЯ

015810

MOV C, FFFFFFFFFFFFFFFF16

в С записываем значение СКО

016110

JMP 018110

переходим к адресу 018110

016510

INR L

увеличиваем содержимое L на 1

016710

MOV A,L

в A записываем значение L

017010

CPI 1216

сравниваем A с СИ+1

017210

JNZ 018110

если не = 0, то переходим к 018110

017610

INR C

увеличиваем С на 1

017810

MVI L,016

в L записываем ДО

018110

MОV 000010,L

в NNOTE записываем значение L

018410

MОV 000110,C

в NOCTAV записываем значение С

018710

RET

возвращение в основную программу

Подпрограмма PPREV (РPR): переключиться на предыдущую ноту

адрес

команда

комментарий

018810

MVI H,016

в Н перемещаем 0

019110

MОV L,000010

в L перемещаем NNOTE

019410

MVI B,016

в В перемещаем 0

019710

MОV C,000110

в С перемещаем NOCTAV

020010

MОV A,C16

в А перемещаем значение С

020310

CPI FFFFFFFFFFFFFFFF

сравниваем содержимое А с СКО (-1)

020510

JNZ 022910

если не = 0 то переходим по адресу 022910

020810

DCR L

уменьшаем L на 1

021010

MOV A,L

записываем в А значение L

021310

CPI 816

сравниваем A с ЛЯ-1

021510

JNZ 027110

если не = 0 то переходим по адресу 027110

021910

MOV L,916

в L перемещаем ЛЯ (9)

022210

MOV C,616

в С перемещаем 4-я октава (6)

022510

JMP 027110

переходим по адресу 027110

022910

CPI 616

сравниваем содержимое А с 4-й октавой (6)

023110

JNZ 025510

если не = 0 то переходим по адресу 025510

023410

DCR L

уменьшаем L на 1

023610

MOV A,L

записываем в А значение L

023910

CPI FFFFFFFFFFFFFFFF16

сравниваем A с ДО-1

024110

JNZ 027110

если не = 0 то переходим по адресу 027110

024510

MOV L,1116

в L перемещаем СИ (11)

024810

MOV C,516

в С перемещаем 3-я октава (5)

025110

JMP 027110

переходим по адресу 027110

025510

DCR L

уменьшаем L на 1

025710

MOV A,L

записываем в А значение L

026010

CPI FFFFFFFFFFFFFFFF16

сравниваем A с ДО-1

026210

JNZ 027110

если не = 0 переходим по адресу 027110

026610

DCR C

уменьшаем С на 1

026810

MOV L,1116

в L записываем СИ

027110

MOV 000010,L

в NNOTE записываем L

027410

MOV 000110,C

в NOCTAV записываем С

027710

RET

возвращение в основную программу

Подпрограмма PREADD (РRE): чтение из АЦП ( в Н старшая часть слова, в L младшая)

адрес

команда

комментарий

027810

MVI A,016

записываем в А 0

028110

IN port A

передаём значение из порта А в А

028310

MOV H,A

записываем в Н значение А

028610

MVI A,016

в А записываем 0

028910

IN port B

передаём значение из порта В в А

029110

MOV L,A

записываем значение А в L

029410

CPI 016

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

029610

JNZ 030710

если не = 0 то переходим к адресу 030710

029810

MOV A,H

если = 0 то в А записываем содержимое Н

030110

CPI 016

сравниваем А с 0

030310

JZ 027810

если равно 0, то переходим по адресу 027810

030710

RET

возврат в основную программу

Подпрограмма PCALCULATE (РCA): подсчёт эталонного значения (В – номер ноты, С – номе октавы)

адрес

команда

комментарий

030810

MVI D,016

передаём в D 0

031110

LXI HL, 000210

передаём в HL адрес начала массива эталонных значений нот

031610

MOV A,L

записываем в А значение L

031910

ADD B

прибавляем значение номера ноты

032110

ADD B

прибавляем значение номера ноты

032310

MOV L,A

записываем получившееся из А в L

032610

MOV A,H

записываем в А значсение Н

032910

ADC 016

прибавляем перенос (если он есть)

033110

MOV H,A

записываем значение в Н из А

033410

LDAX HL

обращаемся к первому байту по адресу Н L и пишем его в А

033710

MOV D,A

записываем значение из А в D(старшая часть начального значенияя)

034010

INX HL

увеличиваем значение адреса на 1

034310

LDAX HL

обращаемся ко второму байту по адресу Н L и пишем его в А

034610

MOV E,A

записываем значение из А в Е(младшая часть начального значения)

034910

MOV A,C

записываем значение С в А (начало обработки остальных октав)

035210

CPI FF16

сравниваем значение А с -1

035410

JZ 039310 039310

если = 0, то переходим по адресу 039310 (на обработку СКО)

035810

MOV A,C A,C

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

036110

CPI 0016 016

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

036310

JZ 043210 043210

если = 0 то переходим по адресу 043210

036510

MOV A,D A,D

записываем в А значение D

036810

RAL

арифметически сдвигаем А влево

036910

MOV D,A D,A

записываем в D значение А

037210

MOV A,E A,E

записываем в А значение E

037510

RAL

арифметически сдвигаем А влево

037610

MOV E,A E,A

записываем значение А в E

037910

MOV A,D A,D

записываем в А значение D

038210

ADC 0 016

складываем значение А с переносом

038410

MOV H,A H,A

записываем в Н значение А

038710

DCR C C

уменьшаем С на 1

038910

JMP 035810 035810

переходим по адресу 035810

039310

MVI 0116 H,116

записываем в H 00000001

039610

MOV A,D A,D

записываем в А значение D

039910

ANA H H

логическое «И» А с H

040110

MOV H,A H,A

записываем в H значение А

040410

MOV A,D A,D

записываем в А значение D

040710

RAR

сдвигаем А вправо

040810

MOV D,A D,A

записываем значение А в D

041110

MOV A,E A,E

записываем в А значение E

041410

RAR

сдвигаем А вправо

041510

MOV A,H

записываем в А значение Н

041810

CPI 0

сравниваем его с 0 (была ли 1 в младшем разряде D до сдвига)

042010

JZ 042910

если 0 (не было) то переходим по адресу 042910

042410

MOV A,E

если не 0 (была) записываем в А значение из Е

042710

ADD 8016

и прибавляем 1 к старшему разряду 10000000

042910

MOV E,A

записываем значение А в E

043210

RET

возврат в основную программу

Подпрограмма PPLAY (РPL): обработка сигнала

адрес

команда

коментарий

043310

MVI A,016

записываем в А значение 0

043610

OUT port C1

выдаём это значение в порт С1

043810

MOV A, 016

записываем в А значение 0

044110

OUT port A

выдаём из А в порт А

044310

OUT port B

выдаём из А в порт В

044510

CALL 027810

вызываем подпрограмму PREADACР

044910

MOV B,000010

записываем в В NNOTE

045210

MOV C,000110

записываем в С NOCTAV

045510

CALL 030810

вызываем подпрограмму PCALCULATE

045910

MOV B,H

записываем значение из Н в В-старшая часть считанного значения

046210

MOV C,L

записываем значение из L в С-младшая часть считанного значения

046510

MOV A,B

записываем в А старшую часть считанного значения

046810

CMP D

сравниваем со старшей частью эталонного значения

047010

JP 049810

если результат > 0, то переходим по адресу 049810

047410

JM 050410

если результат < 0, то переходим по адресу 050410

047810

MOV A,C

если старшие части равны пишем в А младшую часть

048110

CMP E

и сравниваем с эталонной младшей частью

048310

JP 049810

если результат > 0, то переходим по адресу 049810

048710

JM 050410

если результат < 0, то переходим по адресу 050410

049110

MVI A,316

если обе части слов равны – в А пишем 0011(команда равенства)

049410

JMP 050710

переходим по адресу 050710

049810

MVI A,116

если значение меньше эталона – в А значение 0001

050110

JMP 050710

переходим по адресу 050710

050410

MOV A,216

если значение больше эталона то записываем в А значение 0010

050710

OUT port C1

выдаём в порт С1 результат сравнения из А (на 2-ой ВВ)

050910

RET

возвращаемся в основную программу

Подпрограмма PENTER (PEN): получение эталоных значений

адрес

команда

комментарий

051010

MOV A, 016

записываем в А значение 0

051310

MVI C,0

записываем в С 0 (обозначает значение какой ноты мы запоминаем)

051610

MVI B,12

записываем в В 12 (счётчик для выхода из цикла)

051910

OUT port A

выдаём из А в порт А

052110

OUT port B

выдаём из А в порт В

052310

CALL 027810

вызываем подпрограмму PREADACР

052710

XCHF

записываем содержимое пары HL в DE

052810

LXI HL,000210

записываем в HL адрес первой ячейки памяти

053310

MOV A,L

записываем в А значение L

053610

ADD C

прибавляем значение

053810

ADD C

прибавляем значение

054010

MOV L,A

записываем получившееся из А в L

054310

MOV A,H

записываем в А значсение Н

054610

ADC 016

прибавляем перенос (если он есть)

054810

MOV H,A

записываем значение в Н из А

055110

LDAX HL

обращаемся к первому байту по адресу Н L и пишем его в А

055410

ORA D

логически складываем с D

055610

STAX HL

записать значение из A по адресу который находится в HL

055910

INX HL

увеличиваем значение HL на 1

056210

LDAX HL

обращаемся ко второму байту по адресу Н L и пишем его в А

056510

ORA E

логически складываем с Е

056710

STAX HL

записать значение из А по адресу который находится в HL

057010

DCR B

увеличиваем В на 1

057210

MOV A,B

записываем значение В в А

057510

CPI 016

сравниваем с 0

057710

JZ 058510

если = 0 то переходим по адресу 058510

057910

INR C

если не = 0 прибавляем к С 1

058110

JMP 051010

переходим по адресу 051010

058510

RET

Для II КР580ВВ55

Программа USER(US):

адрес

команда

комментарий

058610

OUT 9816

режим ВВ (записываем слово состояния ВВ) 10011000

058810

IN port А

из порта А в А

059010

MOV B,A

записываем значение из А в В

059310

MVI A,016

записываем в А 0

059610

OUT port A

обнуляем порт А

059810

MOV A,B

записываем в А значение считанное из порта (из В)

060110

CPI 016

сравнивает значение А с 0

060310

JZ 058810

если = 0 то перейти к адресу 058810

060610

CPI 116

сравнивает А с командой перехода на след. ноту 0001

060810

JNZ 064510

если не = 0, то переходит к адресу 064510

061110

MVI A,416

если = 0, то в А заносим команду для I ВВ для перехода на след ноту 0100

061410

OUT portC1

значение А передаётся на порт С1

061610

CALL 076810

вызывает подпрограмму PNEXT

062010

MVI B,8016

зарисывает в В 1000000

062310

MOV A,B

передаёт это значение в А

062610

ORA L

логически прибавляет (логическое «или») содержимое регистра L

062810

MOV B,A

записывает из А в В (1000хххх)

063110

MOV A,C

в А записываети значение из С

063410

RAL

сдвиг влево

063510

RAL

сдвиг влево

063610

RAL

сдвиг влево

063710

RAL

сдвиг влево

063810

ORA B

логическое «или» с содержимым В (1ууухххх)

064010

OUT port B

передаёт это значение в порт В

064210

JMP 058810

переходим по адресу 058810

064510

CPI 216

сравнение А с командой перехода на предыдущ. Ноту 0010

064710

JNZ 068410

если не = 0 то переход по адресу 068410

065010

MVI A,816

если = 0 то в А заносим команду для I BB для перехода на пред.ноту 1000

065310

OUT portC1

передаём значение А в порт С

065510

CALL 085810

вызывает подпрограмму PPREV

065910

MVI B,8016

зарисывает в В 1000000

066210

MOV A,B

передаёт это значение в А

066510

ORA L

логически прибавляет (логическое «или») содержимое регистра L

066710

MOV B,A

записывает из А в В (1000хххх)

067010

MOV A,C

в А записываети значение из С

067310

RAL

сдвиг влево

067410

RAL

сдвиг влево

067510

RAL

сдвиг влево

067610

RAL

сдвиг влево

067710

ORA B

логическое «или» с содержимым В (1ууухххх)

067910

OUT port B

выдаёт значение из А в порт В

068110

JMP 058810

переход к адресу 058810

068410

CPI 816

сравниваем значение А с командой для остановки/сброса 1000

068610

JNZ 070210

если не = 0 то переходим по адресу 070210

069010

MVI А, 216

если = 0 то в А записываем команду для I BB для остановки/сброса 0010

069210

OUT portC1

передаём значение А в порт C

069410

MVI А,F916

записываем в А 11111001 (111-СКО; 1001-ЛЯ)

069710

OUT portB

передаём значение А в порт В

069910

JMP 058810

переходим по адресу 058810

070210

CPI 116

сравниваем значение А с 0001 (команда запуска обработки) 0001

070410

JNZ 073310

если не = 0 то переходим по адресу 073310

070810

MVI A,016

в А записываем 0

071110

OUT portB

передаём значение А в порт В

071310

OUT portC2

передаём значение А в порт С2

071510

MVI A,116

записываем в А команду обработки для I BB 0001

071810

OUT portC1

выдаём содержимое А в порт С1

072010

IN portC2

считываем из порта С2 в А

072210

OUT portB

передаём значение А в порт В

072410

CALL 074110

вызываем таймер

072810

MVI A,016

записываем в А 0

073110

OUT portB

передаём значение А в порт В

073310

MVI А, 316

записываем в А 0011 (команда получения эталонных значений) 0011

073610

OUT port C1

выдаём значение из А в порт С1

073810

JMP 058810

переходим по адресу 058810

Таймер(Т): KTIME EQU 75000000 = 11111011,10000111,10010111,01000000

адрес

команда

комментарий

074110

MVI L,4016

записываем в L 100 (в 8-ричной системе) или 01000000

074410

MVI H,9716

записываем в Н 10010111

074710

MVI C,8716

записываем в С 10000111

075010

MVI B,FB16

записываем в В 11111011

075310

INX HL

увеличиваем пару Н L на 1

075610

JNC 075310

если переноса нет то переходим по адресу 075310

076010

INX BC

если перенос был то увеличивам пару ВС на 1

076310

JNC 075310

если переноса нет то переходим по адресу 075310

076710

RET

если перенос был то выходим в основную программу

Подпрограмма PNEXT (РN): переключиться на следующую ноту

адрес

команда

комментарии

076810

MVI H,016

в Н перемещаем 0

077110

М0V L,002510

в L передаём содержимое NNOTE

077410

MVI B,016

в В передаём 0

077710

M0V C,002610

в С передаём содержимое NOCTAV

078010

MVI A,C

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

078310

CPI FFFFFFFFFFFFFFFF16

сравниваем А со значением октавы СКО (А) – (-1)

078510

JNZ 080910

если не = 0, то переходим к адресу 080910

078810

INR L

увеличиваем содержимое регистра L на 1

079010

MOV A,L

в А записываем значение L

079310

CPI 1216

сравниваем содержимое A со значением ноты СИ+1

079510

JNZ 085110

если не = 0 то переходим к адресу 085110

079910

MOV L,016

в L записываем значение ноты ДО (0)

080210

MOV C,016

в С записываем значение октавы OKO (0)

080510

JMP 085110

переходим к адресу 085110

080910

CPI 616

сравниваем А и значения 4-й октавы(6) (А)-(6)

081110

JNZ 083510

переходим к адресу 083510

081410

INR L

увеличиваем соджержимое L на 1

081610

MOV A,L

в A записываем значение L

081910

CPI 1016

сравниваем содержимое А с ЛЯ+1

082110

JNZ 085110

если не = 0 то переходим к 085110

082510

MOV L,916

в L записываем значение ЛЯ

082810

MOV C, FFFFFFFFFFFFFFFF16

в С записываем значение СКО

083110

JMP 085110

переходим к адресу 085110

083510

INR L

увеличиваем содержимое L на 1

083710

MOV A,L

в A записываем значение L

084010

CPI 1216

сравниваем A с СИ+1

084210

JNZ 085110

если не = 0, то переходим к 085110

084610

INR C

увеличиваем С на 1

084810

MVI L,016

в L записываем ДО

085110

MОV 002510,L

в NNOTE записываем значение L

085410

MОV 002610,C

в NOCTAV записываем значение С

085710

RET

возвращение в основную программу

Подпрограмма PPREV (РPR): переключиться на предыдущую ноту

адрес

команда

комментарий

085810

MVI H,016

в Н перемещаем 0

086110

MОV L,002510

в L перемещаем NNOTE

086410

MVI B,016

в В перемещаем 0

086710

MОV C,002610

в С перемещаем NOCTAV

087010

MОV A,C16

в А перемещаем значение С

087310

CPI FFFFFFFFFFFFFFFF

сравниваем содержимое А с СКО (-1)

087510

JNZ 089910

если не = 0 то переходим по адресу 089910

087810

DCR L

уменьшаем L на 1

088010

MOV A,L

записываем в А значение L

088310

CPI 816

сравниваем A с ЛЯ-1

088510

JNZ 094110

если не = 0 то переходим по адресу 094110

088910

MOV L,916

в L перемещаем ЛЯ (9)

089210

MOV C,616

в С перемещаем 4-я октава (6)

089510

JMP 094110

переходим по адресу 094110

089910

CPI 616

сравниваем содержимое А с 4-й октавой (6)

090110

JNZ 092510

если не = 0 то переходим по адресу 092510

090410

DCR L

уменьшаем L на 1

090610

MOV A,L

записываем в А значение L

090910

CPI FFFFFFFFFFFFFFFF16

сравниваем A с ДО-1

091110

JNZ 094110

если не = 0 то переходим по адресу 094110

091510

MOV L,1116

в L перемещаем СИ (11)

091810

MOV C,516

в С перемещаем 3-я октава (5)

092110

JMP 094110

переходим по адресу 094110

092510

DCR L

уменьшаем L на 1

092710

MOV A,L

записываем в А значение L

093010

CPI FFFFFFFFFFFFFFFF16

сравниваем A с ДО-1

093210

JNZ 094110

если не = 0 переходим по адресу 094110

093610

DCR C

уменьшаем С на 1

093810

MOV L,1116

в L записываем СИ

094110

MOV 002510,L

в NNOTE записываем L

094410

MOV 002610,C

в NOCTAV записываем С

094710

RET

возвращение в основную программу

ОЗУ

Переменные (Р):

адрес

название

комментарий

000010

NNOTE

номер текущей ноты для первого ВВ55

000110

NOCTAV

номер текущей октавы для первого ВВ55

000210

массив начальных значений нот КО

000410

000610

000810

001010

001210

001410

001610

001810

002010

002210

002410

002510

NNOTE

номер текущей ноты для второго ВВ55

002610

NOCTAV

номер текущей октавы для второго ВВ55

Стэк (ST):

адрес

команда

комментарий

002710

002810

002910

003010

003110

003210