
;Ссылается на адреса
;TRP4 - точка входа в основную часть.
;INITSN - инициализация нотного текста
;INISAM - инициализация сэмплов
; эта часть транслируется с адреса 45300 и до конца.
; Вообще это модуль хака, и кажется написан мной. или адаптирован мной, уже не понять.

HACK:	mtps	#340
		mov		#177777, @#177660	; Запретим прерывания от клавиатуры
		;тут нужно сделать проверку на андос/мкдос,
		;и если обнаружено - делать перехватчик, иначе - не нужно.

		;внедряем перехватчик
WRK:	.addr	R5, BGARR0
		.addr	R4, ANDHCK
		mov		#BGARR1 - BGARR0, R0
5$:		movb	(R5)+, (R4)+
		sob		R0, 5$
		;копируем страницу 4 в страницу 3
		mov		#45400, @#177662	; Выкл таймер, экран 0, палитра 11
1$:		mov		#100000, R2			; Адаптатор под ANDOS
		mov		#20000, R0
2$:		mov		#6000, @#177716		; стр.1->окно0, стр.4->окно1
		mov		(R2), R1
		mov		#5400, @#177716		; стр.1->окно0, стр.3->окно1
		mov		R1, (R2)+			; копируем содержимое стр.4 в стр.3
		sob		R0, 2$
		mov		#100256, @#100016	; блокируем emt 16
		mov		#100256, @#100020	; блокируем emt 20
		;переносим перехватчик обмена с дисководом в стр.3
		mov		#ANDHCK+6, R4
		mov		#ENARR1-BGARR1, R0
3$:		movb	(R5)+, (R4)+
		sob		R2, 3$
		;инициализируем нотную страницу
		mov		#6000, @#177716		; стр.1->окно0, стр.4->окно1
		call	@#INITSN
		call	@#INISAM
		jmp		@#ENDHCK	;запускаем рок монитор.

;хак, часть1 - вызывальщик.
BGARR0:	mov		#5400, @#177716		;стр.1->окно0, стр.3->окно1
		nop	;вот на это месте в стр.3 тут перехватчик андос BGARR1
		;нужно обращать внимание, чтобы не попало ни на что важное в мониторе БК10
		mov		#14000, @#177716	;стр.5->окно0, стр.1->окно1
		return
; кусок кода размером 420, помещается по адресу ANDHCK+6 в страницу 3, внутрь монитора БК10
BGARR1:	br		1$
2$:		mov		#14000, @#177716	; стр.5->окно0, стр.1->окно1
1$:		mov		#5400, R4			; стр.1->окно0, стр.3->окно1
		mov		R4, @#177716
		movb	#4, @#52
		cmpb	@#FILNME, #'.		;!!!из оверлейного модуля
		sec
		beq		2$
		mov		#100112, @#30		; вектор emt - монитор БК10
		mov		#220, @#102064		; делаем стандартный БК10 звук
		mov		#360, @#102076
		mov		#GETKA1-BGARR1+ANDHCK, @#100016 ; новый адрес emt 16
		clr		R3					; флаг: 1 - андос, 0 - мкдос
		cmp		#10., @#120100		; число секторов на дорожке в рабочей области драйвера НГМД с адреса 120020
		bne		3$
		inc		R3
		mov		#160004, @#120106	; Адрес входа "чтение/запись блока" драйвера НГМД (160004)
		mov		#120172, R0
		clr		(R0)+				; Признак включения/адрес оболочки.
		clr		(R0)+				; Признак включения/адрес файлера.
		clr		(R0)+				; Признак включения/адрес эмулятора MicroDOS
3$:		mov		#160004, @#100054
		clr		@#FILNME+20			;!!!из оверлейного модуля
		mov		#110006, R0
		mov		#10, R1
4$:		mov		#20040, (R0)+
		sob		R1, 4$
		mov		#FILCMD, R0			;!!!из оверлейного модуля
		mov		#110000, R1			; адрес блока параметров emt 36
		mov		(R0)+, R5			; команда emt 36
		tstb	R5
		bne		5$
		mov		#200, R5			; если 0, то 200
5$:		add		#2, R5
		mov		R5, (R1)+			; формируем андосную команду
		mov		(R0)+, R5			; адрес массива
		bpl		6$					; <0 - snd, >0 - tsn
		mov		#240, @#SNDPLY+42	; прибиваем IOT в модуле воспроизведения
		sub		#40000, R5
		mov		#1000, @#110026
		tst		R3
		beq		7$
		mov		#1000, @#120152		; Адрес, помещаемый в каталог. Используется при исполнении EMT36 с кодом операции 202
		br		7$
; ───────────────────────────────────────────────────────────────────────────

6$:		mov		#45400, R4			; стр.4->окно0, стр.3->окно1
		mov		R5, @#110026
		tst		R3
		beq		7$
		mov		R5, @#120152
7$:		mov		R5, (R1)+			; адрес массива
		mov		(R0)+, (R1)+		; его длина
9$:		movb	(R0)+, R5			; скопируем имя
		beq		8$
		movb	R5, (R1)+
		br		9$
; ───────────────────────────────────────────────────────────────────────────

8$:		mov		R4, @#177716
		mov		#110000, R1			; адрес блока параметров
		mfps	-(SP)
		mtps	#340
		call	@#120002			; выполняем дисковую операцию
		mtps	(SP)+
		clc
		movb	@#110001, @#52		; результат выполнения на своё место
		beq		10$
		sec
10$:	mov		#5400, @#177716		; стр.1->окно0, стр.3->окно1
		mov		#4, @#SNDPLY+42		; восстанавливаем IOT в модуле воспроизведения
		br		2$
; ───────────────────────────────────────────────────────────────────────────
;наш emt 16
GETKA1:	mov		R2, -(SP)
		mov		R3, -(SP)
		mov		#40, R2
		mov		#41, R3
		call	@#102062
		mov		(SP)+, R3
		mov		(SP)+, R2
		return
		nop
		nop
		nop
		nop
		nop
		nop
ENARR1:

		.END

;тут будут всякие примеры и заготовки дискового ввода/вывода в андос/мкдос

		MOV		#OWERDT,R0
		CMP		@#120004,#100000+315.	;это мкдос?
		BLO		10$						;нет. или версия не та
		CLR		(R0)+					;переменные мкдос - флаги для ячеек 120124 и 120125
		MOV		#120124,(R0)+			;120124 - флаг автоперезаписи 0-вкл, 120125 - флаг предудаления 0-вкл.
		MOV		#120074,(R0)+			;ячейка перехвата вывода сообщений на экран, для запрета вывода адрес команды 207
		MOV		#346,(R0)+				;ячейка, в которую помещается адрес для каталога
		BR		11$
;     202 - Запись файла с указанием адреса  для  каталога.  При
;этом адрес в памяти помещается в ячейку по смещению 2 от начала
;блока параметров, а адрес для помещения в каталог - по смещению
;26 (ячейка адреса ответа блока параметров). Работает также и  с
;магнитофоном;

10$:	CMP		@#120170,#100000+310.	;это андос?
		BLO		12$						;нет. или версия не та
		MOV		#"PP,(R0)+				;переменные андос-  флаги для ячеек 120140 и 120141
		MOV		#120140,(R0)+			;120140 - флаг автоперезаписи 'P'-вкл, 120141 - текущий режим автоперезаписи 'P'-вкл
		MOV		#120150,(R0)+			;ячейка перехвата вывода сообщений на экран, для запрета вывода адрес команды 207
		MOV		#120152,(R0)+			;ячейка, в которую помещается адрес для каталога
11$:	;ok
;202 - Запись файла с указанием адреса  для  каталога. адрес для помещения в каталог - в ячейке 120152
12$:	;error
		halt
		
IOTRAP:	br		1$	;точка входа
2$:		mov		#14000, @#177716	; точка выхода. стр.5->окно0, стр.1->окно1
1$:		mov		#5400, @#177716		; стр.1->окно0, стр.3->окно1
		movb	#4, @#52
		cmpb	@#FILNME, #'.		; если имя начинается с точки, то ошибка.
		sec
		beq		2$

		clr		@#FILNME+20			; делаем конец имени файла
		mov		#320, R1			; адрес блока параметров emt 36
		mov		#FILCMD, R0			; блок параметров rockmonitora. команда
		mov		(R0)+, R5			; команда emt 36
		tstb	R5
		bne		5$
		mov		#200, R5			; если 0, то 200
5$:		add		#2, R5				; если 1, то 3
		mov		R5, (R1)+			; формируем андосную команду
		mov		(R0)+, R5			; реальный адрес массива
		bpl		6$					; <0 - snd, >0 - tsn
		mov		#240, @#SNDPLY+42	; прибиваем IOT в модуле воспроизведения
		sub		#40000, R5
		mov		#1000,@DIRADR		; Адрес, помещаемый в каталог. Используется при исполнении EMT36 с кодом операции 202
		br		7$
; ───────────────────────────────────────────────────────────────────────────

6$:		mov		#45400, R4			; стр.4->окно0, стр.3->окно1
		mov		R5,@DIRADR			; Адрес, помещаемый в каталог. Используется при исполнении EMT36 с кодом операции 202
7$:		mov		R5, (R1)+			; адрес массива
		mov		(R0)+, (R1)+		; его длина
		mov		R1, R2
		mov		#10, R3
4$:		mov		#20040, (R2)+
		sob		R3, 4$
9$:		movb	(R0)+, R5			; скопируем имя
		beq		8$
		movb	R5, (R1)+
		br		9$
; ───────────────────────────────────────────────────────────────────────────

8$:		mov		R4, @#177716
		mov		#320, R1			; адрес блока параметров
		mfps	-(SP)
		mtps	#340
		MOV		@SCREEN,-(SP)
		MOV		@OWERWR,-(SP)
		MOV		#100256,@SCREEN
		MOV		OWERDT,@OWERWR
		call	@#120002			; выполняем дисковую операцию
		MOV		(SP)+,@OWERWR
		MOV		(SP)+,@SCREEN
		mtps	(SP)+				;не слишком ли много стека будет? может 370 перекроет?
		clc
		movb	@#321, @#52			; результат выполнения на своё место
		beq		10$
		sec
10$:	mov		#5400, @#177716		; стр.1->окно0, стр.3->окно1
		mov		#4, @#SNDPLY+42		; восстанавливаем IOT в модуле воспроизведения
		br		2$
OWERDT:	.word	0
OWERWR:	.word	0
SCREEN:	.word	0
DIRADR:	.word	0














