	.title	fmz

	.GLOBL	ENTRY, GETW
				; Программные секции для :

	.PSECT	...ASM,D
	.PSECT	TABASM,D	; -- таблицы ссылок на MACRO модули 
	.PSECT	...COD,D
	.PSECT	TABCOD,D	; -- таблицы ссылок на P-модули
	.PSECT	$KERN$,SAV,I	; -- резидентного ядра интерпретатора
	.PSECT	.ASM,I		; -- MACRO модулей для поддержки Р-кода
	.PSECT	.PROG,I		; -- программы пользователя на МАСRО
	.PSECT	.COD,D		; -- подпрограмм в Р-коде
	.PSECT	.DATA
	.PSECT	.strn

	.mcall	.rofdf .exit .print .ttyin .ttinr .settop .ttyout
	.mcall	.qset
	.rofdf
	k2sr = 	176674	
	k2dr =	176676
	
.Macro	REL	Command	arg1,arg2	?l
.if	b	<arg2>
.'l	==	.
	COMMAND	ARG1
.iff
.'l	==	.+2
	COMMAND	ARG1,ARG2
.endc
	.save
	.psect	reltab
	.word	.'l
	.restore
.ENDM
.macro	mput	addr
	TRAP	2
	.word	addr
.endm
.macro	mwait
	trap	1
.endm
	.psect	.prog
	.psect	.data
	.psect	.strn
	.psect	pp$prg
; ╣╣╣ с метки DISK все удаляется !!! ╣╣╣
; Там могут быть размещены промежуточные строки
; длиной до 100. символов
; (с адреса DISK+200. начинается динамическая область,
; а с DISK+150. - стек эльф-интерпретатора)
	.psect	reltab
Reltab:
	.psect	eortab
	.word	0
	.psect	delete

; ╣╣╣╣╣╣╣╣╣╣╣╣╣╣╣╣╣╣╣╣╣╣╣╣╣╣╣╣╣╣╣╣╣╣╣╣╣╣╣╣╣╣╣╣
	.asect
	.=34
	.word	tr$dis,0
	.=42
	.word	st$are
	.word	11000	; noecho & overlay
; Распределение памяти в ОЗУ ЦП:
; 
;    1. Программа fmz
;    2. Метка DISK - с нее начинается дин. область:
;       200. байт  - буферная строка и стек интерпретатора
;       10. * 256. - буфер для записи дорожки
;       10. * 256. - буфер для чтения дорожки
;
;

;memcpu	== <<disk> + 200. + <11. * 256.>>

	.Asect
	.=50
	.word	memcpu	; захватим память

;	.word	disk + 200. + <11. * 256.>

; Все остальное будем брать динамически

.radix	10
	ntrk	== 0
	no$up	== 1
	typfor	== 2
	segdir	== 3
	fnam	== 4
	labvol	== 18
	owner	== 30
	recsiz	== 42
	.=^o1000
pardev::
	.byte	83,1,2,3
	.ascii	/mz1:          /
	.ascii	/Привод No 0 /
	.ascii	/Oleg H.     /

	.byte	83,1,2,3
	.ascii	/mz0:          /
	.ascii	/Привод No 1 /
	.ascii	/Oleg H.     /

	.blkb	recsiz * 2

ordsct::.byte	1,2,3,4,5,6,7,8,9,10
	.byte	1,6,2,7,3,8,4,9,5,10
	.byte	1,7,2,8,3,9,4,10,5,6
	.byte	7,8,1,2,9,10,3,4,5,6
	.blkb	20
	.Even
tf$tab::.ascii	/AAAADAAAABCDAAAAAAEF/	; По 4 на каждый тип
pass::	.rad50	/AJV/
.radix	8
; ╣╣╣╣╣╣╣╣ Диспетчер клавиатуры ╣╣╣╣╣╣╣╣╣╣╣╣╣
	.psect	.prog
cmd$f:
scr$f:	call	ramker
1$:	jsr	r1,intmen
	.word	work$m,work$p		; Рабочее меню и процедуры
	br	exit$p			; Выход по ESC
;╣╣╣╣╣╣╣╣╣╣╣╣╣╣╣╣╣╣╣╣╣╣╣╣╣╣╣╣╣╣╣╣╣╣
	; число	- r3
	; СИМВ. МАССИВ - r0
	; размер - r1
Utoa::
	add	r0,r1
	movb	#200,-(r1)
3$:	CLR	R2
	DIV	#10.,R2
	ADD	#'0,R3
	MOVb	R3,-(r1)
	MOV	R2,R3
	BNE	3$
1$:	cmp	r0,r1
	bhis	ret$
	movb	#40,-(r1)
	br	1$	
putint::
	Trap	0
	; число	- r0
siz$$ == :.+2		; Размер поля вывода
	mov	#3,r1
	mov	r0,r3
	mov	#disk,r0
	call	utoa
	.print
ret$:	return
; ╣╣╣╣╣╣╣╣╣╣╣╣╣╣╣╣╣╣╣╣╣╣╣╣╣╣╣╣╣╣╣╣╣╣╣╣╣╣╣╣╣╣╣╣
call$:				; trap 0
	call	@12(sp)
	mov	pc,r5
	return
k2wait:				; trap 1
1$:
	tstb	@#k2sr
	bpl	1$
	return
mp$k2:				; trap 2
	mov	(r5)+,r4
	call	1$
	mov	#-1,r4
1$:	mov	pc,-(sp)
	mwait
	movb	r4,@#k2dr
	swab	r4
	return
gt$chr:				; trap 3
	.ttyin
	cmpb	r0,#12
	beq	gt$chr
	cmpb	r0,#ctrlC
	beq	exit$p
two$cc:	tst	@#42		; trap 4
	bmi	exit$p
	return
tt$out:	mov	(r5)+,r0	; trap 5
tt$r0:	.ttyout			; trap 6
	return
; ╣╣╣╣╣╣╣╣╣╣╣╣╣╣╣╣╣╣╣╣╣╣╣╣╣╣╣╣╣╣╣╣╣╣╣╣╣╣╣╣╣╣╣╣
	.psect	.data
trptab:	.word	call$,k2wait,mp$k2,gt$chr,two$cc,tt$out,tt$r0
	.psect	.prog	
; ╣╣╣╣╣╣╣╣╣╣╣╣╣╣╣╣╣╣╣╣╣╣╣╣╣╣╣╣╣╣╣╣╣╣╣╣╣╣╣╣╣╣╣╣
Tr$dis:
	mov	(sp)+,r1
	mov	r1,(sp)
	mov	r5,-(sp)
	mov	r4,-(sp)
	mov	r3,-(sp)
	mov	r2,-(sp)
	mov	r1,r5		; Указатель на аргументы
	mov	-(r1),r1	; Команда trap N == 104400
	aslb	r1
	call	@trptab-104400(r1)
	mov	(sp)+,r2
	mov	(sp)+,r3
	mov	(sp)+,r4
	mov	r5,2(sp)
	mov	(sp)+,r5
	return
; ╣╣╣╣╣╣╣╣╣╣╣╣╣╣╣╣╣╣╣╣╣╣╣╣╣╣╣╣╣╣╣╣╣╣╣╣╣╣╣╣╣╣╣╣

trplc:	jmp	notuk
exit$p::
	mput	free$		; Снимем сопрограмму в ПП
	mput	restMZ
	.print	#exit$t
	.ttinr
	bcc	.-2
	clr	r0
	mov	#5000,(r0)+	; clr r0
	mov	(pc),(r0)	; exit
	.exit
	.psect	.data
slowMZ::
	.byte	0,20,32,0
	.word	23260
	.word	1$,4
1$:	.byte	4.,4.,4.,4.	; Переход на дорожку
	.byte	20.,20.,20.,20.	; Загрузка головки
restMZ::
	.byte	0,10,32,0
	.word	23260
	.word	savtim,4
savtim:	.blkw	4
	.psect	.prog
		; R0 - Номер поверхности
SetPrm::	;---------------------------
	trap	0
	mov	r0,r4		; Сохраним N поверхности
	cmp	r4,#4
	blt	1$
	bic	#^c1,r4
	add	#2,r4		; N альтернативы (типа форм.)
1$:	movb	curdev,r1
	asl	r1
	asr	r0		; N поверхности -> N дорожки
	rorb	r1
	movb	r1,drive	; Текущ. привод + Верх/Низ
	movb	r0,track	
	jsr	r2,a$parm
	.word	typfor
	movb	(r5),r5		; Тип разметки на текущ. приводе
	dec	r5		; 1..5  ->  0..4
	ash	#2,r5		; Смещение в массиве tf$tab
	add	r4,r5		; Индекс тек. A..F
	movb	tf$tab(r5),r5
	sub	#'A,r5
	mov	#10.,r1
	mul	r1,r5
	add	#ordsct,r5
	mov	#subsec,r0
2$:	movb	(r5)+,(r0)+
	sob	r1,2$
	mput	movpar

;	mov	(pc)+,r0	; 0 or 2
;curbuf:	.word	0
;	mov	buftab(r0),buff
;	neg	r0
;	add	#2,r0
;	mov	r0,curbuf

	mov	#< <buf$wr ! buf$rd> &	<^c<buf$wr & buf$rd>> >/2,r0
	xor	r0,buff
	return
	
	.psect	.data
;buftab:	.word	buf$wr/2,buf$rd/2	
	.psect	.strn
exit$t:	.byte	14,27
old$c::	.byte	33,247
rest$$:	.byte	0,200

	.psect	.data
free$:
alloc$:
	.byte	0,1,32,0
pp$all:	.blkw	1
	.word	LO$END-LO$BEG/2
execute::			; Выполнить подпрограмму
	.byte	0,30,32,0
REL	.word	disk
movpar:				; Смена переменных
	.byte	0,20,32,0
REL	.word	lo$beg
	.word	lo$beg,disk-LO$BEG/2
unhead::			; Забыть положение головок
	.byte	0,20,32,0
	.word	23254
	.word	1$,2
1$:	.word	-1,-1
	
; ╣╣╣╣╣╣╣╣╣╣╣╣╣╣╣╣╣╣╣╣╣╣╣╣╣╣╣╣╣╣╣╣╣╣╣╣╣╣╣╣╣╣╣╣
	.psect	delete
move$:
	.byte	0,20,32,0
REL	.word	lo$beg
	.word	lo$beg,LO$END-LO$BEG/2
get$col:
	.byte	0,10,32,0
	.word	22746		; Цвет курсора из таблицы
	.word	colcur,1
SCCA:
	.WORD	16400,42
trpset:
	.WORD	1400,trplc
START:
	clr	@#40
	bic	#40000,@#44	; Привести к UPPER
	mov	#trpset,r0	; Сообщение об ошибке по t4
	emt	375
	mov	#scca,r0	; Запретим ^C
	emt	375
	mput	get$col		; Получаем цвет курсора
	mput	alloc$		; Захватываем память

colcur = :.+2			; Текущий цвет курсора
	add	#0,chrcol
chrcol = :.+2
	movb	#'0,rest$$	; Символ для восстановления цвета

;	mwait			; *** Подождем, когда захватится
	mput	restMZ		; Читаем задержки
	tstb	alloc$		; А памяти хватило ?
	bne	all$err		; Нет - абзац
	aslb	free$+1		; Приготов. к ее освобождению
	mov	#5727,trplc	; Tst	(PC)+
	mov	#-1,@#2		; Чтобы вызвать trap 10

	mov	pp$all,r0	; Релокация
	mov	#reltab,r1
	sub	#lo$beg,r0
1$:	add	r0,@(r1)+
	tst	(r1)
	bne	1$
	
	mput	move$		; Посадим программу в ПП
				; Тем временем перекурежим RMON
ENTR$:	MOV	pc,R0		; RMKOI8
	mov	@#sysptr,r5	; 
	mov	$date(r5),-(sp)
	mov	(sp),dat.1
	mov	(sp),dat.2
	mov	(sp)+,c.date
	jsr	r0,dstat
	.RAD50	"SY "
dstat:	EMT	342		; .DSTATUS
	MOV	entr$+6,R1
2$:	CMP	-(R1),#177600
	BNE	1$	
	MOV	-(R1),R0	; Код команды
	BIC	#000077,R0
	CMP	R0,(PC)+
	BIC	(PC)+,R0
	BNE	1$
	MOV	#177400,2(R1)
1$:	CMP	R1,r5
	BHI	2$
	aslb	restMZ+1	; Переключим чтение=>запись
	jmp	scr$f

notuk:
	jsr	r1,e$print
	.asciz	<16>/Только для УКНЦ/<17>
	.even
all$err:
	jsr	r1,e$print
	.asciz	/Нет памяти в ПП/
	.even
e$print:
	.print	#1$
	call	prir1
	.exit
1$:	.ascii	<15>/?FMZ-F-/<200>
	.end	start
                                                                                                                                                                                                                                                     