Код:
; *********************************************
; * *
; * М У З Ы К А Л Ь Н Ы Й М А Г А З И Н *
; * *
; *********************************************
; L9 = 0
MUZ:: .MCALL .EXIT,.LOOKUP,.READW,.CLOSE
; К О Н С Т А Н Т Ы
; =================
N = 40 ;- начало координат
.IF DF,L9
RSK2PR = 177510
RDK2PR = 177512
RSK2PD = 177514
RDK2PD = 177516
RSK3PD = 176554
RDK3PD = 176556
.IFF
RSK2PR = 176660
RDK2PR = 176662
RSK2PD = 176664
RDK2PD = 176666
RSK3PD = 176674
RDK3PD = 176676
.ENDC
; И Н И Ц И А Л И З А Ц И Я
; =========================
MINMUZ: CLR @#177560
; М О Н И Т О Р
; =============
MONMUZ: JSR R5,PCS ;- заголовок
TZAG
JSR R5,PMENU ;- главное меню
TGMENU,SCGM
BNE PMUZ ;- на чтение файла
WYH: JSR R5,PCS
TWMUZ
MOV #100,@#177560
.EXIT ;- выход в систему
PMUZ: JSR PC,PCTF ;- прочитать файл
BEQ MONMUZ
JSR PC,PWMEL ;- выполнить мелодию
BR MONMUZ
; ЧТЕНИЕ ФАЙЛА
; ------------
PCTF: MOV @#SCGM,R0
ASL R0
ASL R0
MOV TABR50(R0),@#SPF+2 ;- установка спецификации файла
MOV TABR50+2(R0),@#SPF+4
.LOOKUP #BUFEMT,#10,#SPF ;- открыть файл
BCS PCOSH
TST R0
BEQ PCOSH
MOV R0,R1
MUL #256.,R1
.READW #BUFEMT,#10,#BUFT,R1,#0 ;- прочитать файл
BCS PCOSH
MOV R0,@#DLF
ASL @#DLF ;- длина файла
MOV R0,R1
PSBK: .CLOSE #10 ;- закрыть файл
TST R1
RTS PC
PCOSH: JSR R5,PCS
TOSH
JSR PC,PRK
CLR R1
BR PSBK
TABR50: .RAD50 /M1 /
.RAD50 /M2 /
.RAD50 /M3 /
.RAD50 /M4 /
.RAD50 /M5 /
.RAD50 /M6 /
.RAD50 /M7 /
.RAD50 /M8 /
.RAD50 /M9 /
SPF: .RAD50 /DK M1 TXT/ ;- спецификация файла
BUFEMT: .BLKW 5
; ВЫПОЛНИТЬ МЕЛОДИЮ
; =================
PWMEL: JSR PC,PPRMEL ;- преобразовать мелодию
MOV #40000,APRPP ;- адрес программы в ПП
MOV #MUZPP,APRCP ;- адрес программы в ЦП
MOV #KMUZPP-MUZPP/2,DLPR ;- длина программы
JSR PC,PZPPP ;- запись программы в ПП и запуск
JSR PC,PIMEL ;- исполнить мелодию
RTS PC
; ПРЕОБРАЗОВАТЬ МЕЛОДИЮ
; ---------------------
PPRMEL: MOV #BUFT,R1 ;- просмотр шапки
1$: CMPB (R1)+,#'/
BNE 1$
CLRB -1(R1)
JSR R5,PCS ;- печать шапки
BUFTK
MOV #BUFT,R2 ;- буфер счетчиков
2$: JSR PC,PCT10C
MOV R3,(R2)+
BNE 2$
CLR (R2)+
RTS PC
; ИСПОЛНИТЬ МЕЛОДИЮ
; -----------------
PIMEL: MOV @#100,-(SP)
MOV #POPT,@#100
TST @#RDK2PR ;- сброс канала
1$: SOB R0,1$
;2$: SOB R0,2$
M0:
4$: MOV #BUFT,R2 ;- буфер счетчиков
2$: TSTB @#RSK2PD
BPL 2$
MOVB (R2)+,@#RDK2PD ;- младший байт частоты
1$: TSTB @#RSK2PD
BPL 1$
MOVB (R2)+,@#RDK2PD ;- старший байт частоты
MOV (R2)+,@#SCT ;- длительность
BEQ 4$
3$: TST @#SCT
BNE 3$
TSTB @#RSK2PR ;- прерывание с клавиатуры?
BPL 2$ ;- нет.
TST @#RDK2PR
KIMEL: MOV (SP)+,@#100
RTS PC
; ПРОГРАММА ОБРАБОТКИ ПРЕРЫВАНИЙ ТАЙМЕРА
; --------------------------------------
POPT: DEC @#SCT
RTI
; ЗАГРУЗКА ПРОГРАММЫ В ПП И ЗАПУСК
; --------------------------------
PZPPP: MOVB #20,KOM
JSR PC,PDABP ; запись программы в ПП
1$: MOVB #30,KOM
JSR PC,PDABP ; запуск программы в ПП
RTS PC
; ПЕРЕДАЧА АДРЕСА БЛОКА ПАРАМЕТРОВ
; --------------------------------
PDABP: MOV #ABLPAR,R1
MOV #4,R2
1$: TSTB @#RSK3PD ; передача байта в канал
BPL 1$
MOVB (R1)+,@#RDK3PD
SOB R2,1$
2$: TSTB @#RSK3PD ; ожидание готовности
BPL 2$
RTS PC
ABLPAR: BLPAR,177777 ;- адрес блока параметров
; БЛОК ПАРАМЕТРОВ
; ---------------
BLPAR: .BYTE 0 ;- ответ
KOM: .BYTE 20 ;- команда
TIPU: .WORD 32 ;- ОЗУ
APRPP: .WORD 40000 ;- адрес программы в ПП
APRCP: .WORD MUZPP ;- адрес программы в ЦП
DLPR: .WORD KMUZPP-MUZPP/2 ;- длина программы
; ПРОГРАММА НА ПП
; ===============
WPKL = 300 ;- вектор клавиатуры
WPK2 = 330
MUZPP: CLR @#177130 ;- сброс диска
MOV #401,@#177054 ;- включить таймер ЦП и выключить таймер ПП
MOV @#WPKL,-(SP) ;- установка векторов
MOV @#WPK2,-(SP)
MOV #<POPKL-MUZPP>+40000,@#WPKL
MOV #<POPK2-MUZPP>+40000,@#WPK2
TST @#RDK2PP ;- сброс канала
4$: MOV #100200,@#177716 ;- генерация звука
MOV CZW,R0
BEQ 1$
2$: SOB R0,2$
MOV #100000,@#177716
MOV CZW,R0
3$: SOB R0,3$
BR 4$
1$: MOV (SP)+,@#WPK2
MOV (SP)+,@#WPKL
MOV #1,@#177054
RTS PC
; ОБРАБОТКА ПРЕРЫВАНИЙ КЛАВИАТУРЫ
; -------------------------------
POPKL: CLR CZW
TST @#177702
MOV #100,@#177072 ;- код завершения на ЦП
RTI
; ОБРАБОТКА ПРЕРЫВАНИЙ КАНАЛА 2
; -----------------------------
RDK2PP = 177062
POPK2: BIT #1,ICZW
BNE 1$
MOVB @#RDK2PP,CZW
INC ICZW
RTI
1$: MOVB @#RDK2PP,CZW+1
INC ICZW
RTI
CZW: .WORD 177777
ICZW: .WORD 0
KMUZPP:
; БИБЛИОТЕКА ПРОЦЕДУР
; ===================
; ПРИЕМ КОДА
; ----------
PRK: TSTB @#177560
BPL PRK
MOV @#177562,R0
RTS PC
; ПЕЧАТЬ КОДА
; -----------
PCK: TSTB @#177564
BPL PCK
MOV R0,@#177566
RTS PC
; ПЕЧАТЬ СЛОВА
; ------------
PCS: MOV (R5)+,R0
PCSR:
1$: TSTB @#177564
BPL 1$
MOVB (R0)+,@#177566
BNE 1$
RTS R5
; НОВАЯ СТРОКА
; ------------
PCNS: JSR R5,PCS
TWKPS
RTS PC
; ЧТЕНИЕ 8-РИЧНОГО ЧИСЛА
; ----------------------
; Вход: R1 - текущий адрес
; Выход: R3 - слово
PCT8C: CLR R3
1$: MOVB (R1)+,R0 ;- поиск первой цифры
BEQ KCT8C
CMP R0,#60
BLO 1$
CMP R0,#67
BHI 1$
2$: BIC #177770,R0 ;- запись триады в R0
ASL R3
ASL R3
ASL R3
BIS R0,R3
MOVB (R1)+,R0 ;- чтение следующей цифры
CMP R0,#60
BLO KCT8C
CMP R0,#67
BHI KCT8C
BR 2$
KCT8C: DEC R1
RTS PC
; ЧТЕНИЕ 10-ТИЧНОГО ЧИСЛА
; -----------------------
; Вход: R1 - текущий адрес
; Выход: R3 - слово
PCT10C: CLR R3
1$: MOVB (R1)+,R0 ;- поиск первой цифры
BEQ KCT8C
CMP R0,#60
BLO 1$
CMP R0,#71
BHI 1$
2$: BIC #177760,R0 ;- запись триады в R0
MUL #10.,R3
ADD R0,R3
MOVB (R1)+,R0 ;- чтение следующей цифры
CMP R0,#60
BLO KCT8C
CMP R0,#71
BHI KCT8C
BR 2$
KCT10C: DEC R1
RTS PC
; ВЫБОР МЕНЮ
; ==========
; Вход: (R5) - текст меню
; - указатель меню
; Выход: SCM - указатель меню
; R0 - код выхода
PMENU:
PMENU0: MOV (R5)+,R1 ;- текст меню
MOVB (R1)+,R2 ;- счeтчик меню
MOV R2,R4 ;- верхняя граница меню
CLR R3 ;- текущий указатель меню
MOV #16,R0 ;- РУС
JSR PC,PCK
3$: CMP R3,@(R5)
BNE 1$
JSR R5,PCS ;- включить инверсию
TWINW
1$: MOV R1,R0 ;- напечатать строку
JSR R5,PCSR
MOV R0,R1
CMP R3,@(R5)
BNE 2$
JSR R5,PCS ;- отключить инверсию
TOINW
2$: INC R3 ;- текущий счетчик
SOB R2,3$
MOV #17,R0 ;- ЛАТ
JSR PC,PCK
5$: JSR PC,PRK ;- принять код
CMP R0,#60 ;- цифра?
BLO 4$ ;- нет.
SUB #60,R0
BNE 11$
MOV R4,R0
11$: DEC R0
CMP R0,R4 ;- проверка на верхнюю границу
BHIS 5$
MOV R0,@(R5) ;- новая активная позиция
10$: TST -(R5) ;- на печать меню
BR PMENU0
4$: CMP R0,#15 ;- ввод?
BEQ KMENU ;- да.
; CMP R0,#40 ;- пробел?
; BEQ KMENU ;- да.
CMP R0,#33 ;- АР2?
BNE 5$ ;- нет.
JSR PC,PRK
CMP R0,#101 ;- стрелка вверх?
BNE 7$ ;- нет.
8$: DEC @(R5)
BPL 10$
MOV R4,@(R5)
BR 8$
7$: CMP R0,#104 ;- стрелка влево?
BEQ 8$
CMP R0,#102 ;- стрелка вниз?
BEQ 6$ ;- да.
CMP R0,#103 ;- стрелка вправо?
BNE 5$ ;- нет.
6$: INC @(R5)
CMP @(R5),R4
BNE 10$
CLR @(R5)
BR 10$
KMENU: DEC R4
CMP @(R5)+,R4 ;- выход из меню
RTS R5
; Т Е К С Т Ы
; ===========
TZAG: .ASCII <14><33><41><33><100><16>
.ASCII <33><131><N+1><N+20.>
.ASCII /М У З Ы К А Л Ь Н Ы Й М А Г А З И Н/
.ASCII <33><131><N+2><N+20.>
.ASCII /=====================================/
.ASCII <33><131><N+6><N+26.>
.ASCII /Н А Б О Р М Е Л О Д И Й/
.ASCII <33><131><N+7><N+26.>
.ASCIZ /-------------------------/
TGMENU: .ASCII <10.>
.ASCIZ <33><131><N+09.><N+29.>/1 - МЕЛОДИЯ 1 ( М1 )/
.ASCIZ <33><131><N+10.><N+29.>/2 - МЕЛОДИЯ 2 ( М2 )/
.ASCIZ <33><131><N+11.><N+29.>/3 - МЕЛОДИЯ 3 ( М3 )/
.ASCIZ <33><131><N+12.><N+29.>/4 - МЕЛОДИЯ 4 ( М4 )/
.ASCIZ <33><131><N+13.><N+29.>/5 - МЕЛОДИЯ 5 ( М5 )/
.ASCIZ <33><131><N+14.><N+29.>/6 - МЕЛОДИЯ 6 ( М6 )/
.ASCIZ <33><131><N+15.><N+29.>/7 - МЕЛОДИЯ 7 ( М7 )/
.ASCIZ <33><131><N+16.><N+29.>/8 - МЕЛОДИЯ 8 ( М8 )/
.ASCIZ <33><131><N+17.><N+29.>/9 - МЕЛОДИЯ 9 ( М9 )/
.ASCIZ <33><131><N+19.><N+29.>/0 - ВЫХОД /<33><131><50><75>
TMENUR: .ASCII <2.>
.ASCIZ <33><131><N+23.><N+4.>/ ПУСК /
.ASCIZ <33><131><N+23.><N+12.>/ ВЫХОД /<33><131><N+23.><N>
;.IF DF,L9
TWINW: .ASCIZ <33><145> ;- включить инверсию
TOINW: .ASCIZ <33><177><145> ;- отключить инверсию
;.IFF
;TWINW: .ASCIZ <33><243> ;- включить инверсию
;TOINW: .ASCIZ <33><277><243> ;- отключить инверсию
;.ENDC
TSBRE: .ASCIZ <14><33><41><33><100> ;- сброс экрана
TZB: .ASCIZ <32><40><32> ;- забой
TNE: .ASCIZ <33><110> ;- начало экрана
TSTPS: .ASCIZ <33><113> ;- стирание последней строки
TWKPS: .ASCIZ <15><12> ;- новая строка
TOSH: .ASCII <33><131><N+22.><N+22.><7><16>
.ASCIZ /*** Файл на диске не обнаружен *** /<17>
TKPCC: .ASCIZ <15><33><101>
TWMUZ: .ASCIZ <14><33><41><33><100><17> ;- выход из программы
.EVEN
SCGM: .WORD 0 ;- счетчик главного меню
SCMR: .WORD 0 ;- счетчик меню режимов
ANTS: .WORD 0 ;- адрес начала теста
DLF: .WORD 0 ;- длина файла
SCT: .WORD 0 ;- счетчик таймера
.WORD 111111
BUFTK: .ASCII <33><131><N+22.><N> ;- коортинаты шапки
BUFT: ;- буфер для текста
.END MUZ