- •Курсовая работа по дисциплине «Аппаратные средства вычислительной техники»
- •Введение.
- •Постановка задачи.
- •Техническое задание.
- •Структура входных и выходных данных.
- •Разработка и описание структурной схемы алгоритма.
- •Разработка и описание функциональной схемы алгоритма.
- •Разработка и описание принципиальной схемы алгоритма.
- •Разработка и описание функциональной схемы микропроцессорной системы.
- •Разработка и описание структурной схемы микропроцессорной системы.
- •Временные диаграммы.
- •Заключение.
Разработка и описание принципиальной схемы алгоритма.
В УСЛОВНЫХ АДРЕСАХ:
ДЛЯ 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 |
|
|
