;17.9.96 v1.41	испр.ош. v1.40 и ->CALL	RDY2 перед I/O HDD
;21.6.96 v1.40	 врем.для SMK: на 6 МГц	при ПЗП	не чувств.клав.
;16.6.95 v1.33	- была ошибка им.Коренкова с перех.на лок.метку
;16.2.96 v1.35	;запорка: если добиться	обращения по 160006 при
		;плохой	Part&Config и неготовом	винте: ->SETPRM
		;(при загрузке Part. чит.всегда, если в. готов)
.LA 165054		;переходы BR-> EX11-> EX1 на грани
			;строки, отлич.для БК10	помеч. "10!"
;Адрес перезапуска =@167716=167400 = #ZAG-2 нельзя смещать !!!
;Для краткости особый вызов BOOT$ с сопрограммой.
;Сообщ.	"(с)" тк при V30=100112
		;КОНСТАНТЫ
HD$TRK=176776		;всего дорожек
HD$DRV=176775		;код # привода,	уст.внешним драйвером
HD$HEA=176774		;всего головок
HD$SEC=176772		;секторов на дорожке
HD$UNI=176771		;# устр. для загрузки по умолч.
HD$LOG=176770		;всего лог.дисков

HD$SPD=176000		;признак быстрого чтения (125252)
HD$USR=175776		;указатель на начало USR-драйвера
HD$EIS=175774		;указ. на нач.FIS/EIS др-ра; ...подряд!
HD$US1=175772		;указ.на нач. USR-1 (физич.чтен/зап)

HD$OZU=170000
HD$MBR=20000
		;РЕГИСТРЫ
R$STAT=177740		;статус
R$HEAD=177742		;головка
R$TRKH=177744		;дор.ст.б.
R$TRKL=177746		;дор.мл.б.
R$SECT=177750		;сектор
R$COUN=177752		;счетчик секторов
R$ERRR=177754		;ошибка
R$DATA=177756		;данные
R$SRES=177743		;Soft Reset
R$ADDR=177741		;адрес НЖМД (не	используется)

FORM$:	;точка входа по	160012
	MOV	SP,50(R3)
	CLRB	57(R3)
	JSR	R4,USER$
	.WORD	4
	CALL	@R5
	BR	EX12
2$:	JMP	163416

	CMPB	34(R3),#2
	BLO	2$
	MOV	@#HD$SEC,R0	;секторов на дор.
	MOVB	#1,35(R3)
	MOV	R0,42(R3)	;призн.вериф., >0
	SWAB	R0
	MOV	R0,30(R3)	;длина,	слов
	JMP	ALL

BOOT$:	;точка входа по	загрузке, перехват 160072 (10!)
	JSR	PC,@(SP)+	;CALL	160156:	-1 слов	;10!
;	MOVB	R0,34(R3)	;будет дальше
	MOV	R0,R4

	MOV	#TXT,R1
	CMP	@#30,(R1)+	;#100112; TXT-четн!
	BNE	2$
	CLR	R2
	EMT	20		;вывод строки 10!
2$:
;	CLR	@#HD$LOG	;иниц.переменных ОЗУ ; ->PARTRD
;	MOV	SP,@#HD$LOG-2	;против	всех 0
	MOV	#HD$USR,R2
	MOV	PC,@R2
	MOV	PC,-(R2)	;HD$EIS
	MOV	PC,-(R2)	;HD$US1
	CLR	@#HD$OZU	;0 - конец цепи

	CLR	@#R$SRES	;сброс
	MOV	#6,@#R$SRES
	MOVB	#6,@#52

	MOVB	R4,34(R3)	;<0 тк 1-й по умолч.
	BPL	3$
	CALL	RDY4		;7.4 sec max
3$:	TST	R4
	BMI	6$		;#0,1 по умолч.(ст.байт	< 0)
	CALL	RDY2		;3.7 sec max
	BCC	7$
				;винта нет или неиспр.
	CMPB	R4,#2		;# LOG
	BHIS	5$
6$:	CLR	R0		;10!
	JMP	160104		;там R0	не исп.	10!
5$:	RTS	PC

7$:	CALL	PARTRD		;чт.табл.разд.и	счит.ее	CRC
	MOVB	34(R3),R0	;# привода
	BPL	1$
	MOVB	@#HD$UNI,R0	;устр.по умолчанию
	MOVB	R0,34(R3)
	BEQ	5$
1$:	CMPB	R0,#2
	BLO	6$

	MOVB	#1,35(R3)	;сект.#1
	MOV	#HD$MBR,26(R3)
	MOV	#3400,30(R3)	;7 блоков
	CLR	32(R3)		;дор.=0, гол.=0
	CALL	160006		;чтение	MBR (7 бл.) с 20000
	BCS	5$		;ошибка

	CMP	@#HD$MBR,#240
	BNE	4$
	CALL	@#HD$MBR	;CALL на MBR
4$:	MOVB	@PC,@R3		;для ANDOS - не	253 прошивка
	BR	6$		;"вторичная" загрузка

READ$:	;точка входа по	160004,	перехват 160250
	MOV	#10,R4
	CLRB	57(R3)		;на всякий случай
	JSR	R4,USER$	;проверка драйв.пользователя
	.WORD	0
	CALL	@R5
EX12:	BR	EX11
2$:	JMP	160254

	CMPB	34(R3),#2
	BLO	2$
R$:	TST	R1		;WCNT
	SXT	42(R3)		;0 - READ, -1 -	WRITE
	BPL	4$
	NEG	R1
4$:	MOV	R1,30(R3)	;WCNT
	MOV	R2,26(R3)	;ADDR
	CALL	CRC
	SUB	-(R1),R2
	BEQ	L11
	CALL	PARTRD		;чт.табл.разд.и	CNF
	MOVB	#13,57(R3)
EX11:	BR	EX1

L11:	BISB	34(R3),R2	;#LOG, R2=0
	CMPB	#377,R2		;абс.адресация?
	BNE	9$
	MOV	#ABSLOG,R2	;можно и неперемещ!
	BR	8$
9$:	DEC	R2
	MOVB	#3,57(R3)	;ERR 3
	CMPB	R2,@#HD$LOG
	BHI	EX1
	ASL	R2
	ASL	R2
	SUB	#HD$LOG,R2	;=TOP табл.разделов
	NEG	R2		;R2-ADDR из табл.разд.
8$:	MOV	(R2)+,R4	;об'ем LOG
	CLRB	57(R3)		;#ошибки
	MOV	30(R3),R1	;WCNT
	BNE	6$
	CMP	R0,R4
	BLO	7$
	MOV	R4,R0
	DEC	R0		;последний блок	LOG
7$:	MOV	R2,-(SP)	;координаты LOG
	MOV	26(R3),R1
	BEQ	6$
	MOV	#HD$TRK,R2	;указ.на кол-во	дорожек
	MOV	@R2,(R1)+	;дорожек
	MOV	-(R2),(R1)+	;головок
	MOV	-(R2),(R1)+	;секторов
	MOV	-(R2),(R1)+	;лог.дисков
	MOV	@SP,R2
	CLR	R1

6$:	ADD	#377,R1
	CLRB	R1
	SWAB	R1
	MOVB	R1,55(R3)	;блоков
	ADD	R0,R1		;конечный блок
	BCS	5$		;перенос, R1>177777
	CMP	R1,R4		;внутри	LOG ?
	BLOS	2$
5$:	MOVB	#5,57(R3)
	CMP	R0,R4
	BHIS	EX1		;вых., т.к.нач блок вне	LOG
	SUB	R0,R4		;сколько можно прочитать
	MOVB	R4,55(R3)

2$:	MOV	@R2,R2		;нач.LOG
	BPL	11$
	COM	R2		;-запрет записи; 55(R3)
	TST	42(R3)				;не м.б.=0
	BMI	ERR1
11$:	MOV	R2,R1
	BIC	#177760,R1	;гол.нач.LOG
	MOV	R1,-(SP)
	BIC	R1,R2
	CLC
	ROR	R2
	ASR	R2
	ASR	R2
	ASR	R2		;дор.нач.LOG

	MOV	@#HD$SEC,R1	;секторов
	CALL	DIV$		;R0/R1->R0,|R1|
	INC	R1		;нумерация с 1
	MOVB	R1,54(R3)	;старт.сектор /35(R3)

	MOVB	@#HD$HEA,R4	;всего головок
	MOV	R4,R1
	CALL	DIV$		;R0/R1 -> R0,|R1|
	ADD	R0,R2

	ADD	R1,@SP
	CMPB	@SP,R4
	BLO	3$
	SUB	R4,@SP
	INC	R2		;старт.дор.
3$:	MOV	(SP)+,R0	;старт.гол.
	TSTB	55(R3)
	BNE	ALL1

	ASL	R2
	ASL	R2
	ASL	R2
	ASL	R2
	BIS	R0,R2
	MOV	R2,32(R3)

	MOV	(SP)+,R2
	MOV	@R2,R1		;координаты LOG
	MOV	-(R2),R0	;об'ем LOG
;	CLR	R2		;на всякий случай
	BR	EX1

ERR1:	MOVB	#1,57(R3)
	BR	EX1
ERR12$:	MOVB	#12,57(R3)
EXIT:	MOV	50(R3),SP	;выход из драйвера
	MOV	46(R3),@#4
EX1:	CLC
	MOVB	57(R3),@#52
	BEQ	1$
	SEC
1$:	MOV	#R$ERRR,R4	;для прогр, делающих MOV ..,@R4
	RTS	PC

STOP$:	MOVB	#7,57(R3)
	BR	SPEX

;точка входа по	160006
ABS$RD:	CLRB	57(R3)
	JSR	R4,USER$
	.WORD	2
	CALL	@R5
	BR	EX1		;не оптимизировать!
1$:	JMP	160372

	CMP	@SP,#CAL06	;перемещ.не важна - тк при загр
	BEQ	3$		;нужно для PARTRD при 0(1)B
	CMPB	34(R3),#2
	BLO	1$
3$:	MOV	30(R3),R0	;WCNT
	BEQ	EX1
	SXT	42(R3)		;0 - READ, -1 -	WRITE
	BPL	2$
	CMPB	34(R3),#377	;запись	разреш.	тк для UNIT=-1
	BNE	ERR1
	NEG	R0
	MOV	R0,30(R3)
2$:	ADD	#377,R0

ALL:	CLRB	R0		;C=0
	BISB	35(R3),R0
	BEQ	ERR12$
	MOV	R0,54(R3)  ;мл.б=#сект,	ст.б= к-во сект;/35(R3)
	MOV	32(R3),R0
	MOV	R0,R2
	BIC	#177760,R0	;старт.гол.
	BIC	R0,R2
;	CLC
	ROR	R2
	ASR	R2
	ASR	R2
	ASR	R2		;старт.дор.

;R0 - старт.гол., R2 - старт.дор., 55(R3) - число секторов
;54(R3)	- старт.сектор,	42(R3) - 0-чт.,-1-зап.,>0-вериф.
;35(R3)	освобождено для	возможной имитации FDD
ALL1:	MOV	#4,R4
	MOV	@R4,46(R3)
	MOV	SP,50(R3)
	MOV	PC,@R4
	ADD	#STOP$-.,@R4
	MOV	@#HD$US1,R5	;то, что после уст. V4 - норм.
	CMP	@R5,#240
	BNE	2$
	CALL	@R5

2$:	MOV	#R$STAT,R4

	CALL	RDY2	;меньшая задержка при перезап./дубле
	BCC	L2	;если чтение каталога не раскруч.двиг.
			;мж вызывать ош.6
	MOVB	#6,57(R3)	;ошибка	6
SPEX:	CALL	SETPRM
EXI:	BR	EXIT

L2:	COM	R2
	MOV	R2,@#R$TRKL	;мл.б.дор.
	SWAB	R2
	MOV	R2,@#R$TRKH	;ст.б.дор.
	BISB	@#HD$DRV,R0
	COM	R0
	MOV	R0,@#R$HEAD	;гол.
	MOV	54(R3),R0	;сектор	& к-во /35(R3)
	COM	R0
	MOVB	R0,@#R$SECT	;старт.сектор
	SWAB	R0
	MOVB	R0,R0		;до 128	!!!
	MOV	R0,@#R$COUN	;кол-во	секторов
	MOV	#R$DATA,R5
	COM	R0
	MOV	26(R3),R2	;ADDR
	MOV	#337,R1		;"Чтение"
	TST	42(R3)
	BEQ	4$
	BMI	5$
	SUB	#20,R1
5$:	SUB	#20,R1		;"Запись"
4$:	MOV	R1,@R4		;запись	команды

	CMP	R1,#277
	BEQ	ENDVER

;R1=337-чтение,	317-запись, 277-верификация
RDWR:	MOV	#400,R1
	CMP	R1,30(R3)
	BLOS	1$
	MOV	30(R3),R1

1$:	TSTB	@R4
	BPL	.-2
	BIT	#10,@R4
	BNE	.-4

	CMP	@#HD$SPD,#125252
	BEQ	L7

	TST	42(R3)
	BMI	3$

2$:	TSTB	@R4
	BPL	.-2
	MOV	@R5,(R2)+	;RD
	SOB	R1,2$
	BR	L4$

3$:	TSTB	@R4
	BPL	.-2
	MOV	(R2)+,@R5	;WR
	SOB	R1,3$

L4$:	BIT	#1,@R4
	BEQ	ERR$HD
	SUB	#400,30(R3)
	MOV	R2,26(R3)
	SOB	R0,RDWR

	MOV	30(R3),R0
	BGE	EXI
	NEG	R0
	TST	42(R3)
	BMI	6$
5$:	TSTB	@R4
	BPL	.-2
	TST	@R5
	SOB	R0,5$
	BR	EXI

6$:	TSTB	@R4
	BPL	.-2
	MOV	R1,@R5		;R1=0
	SOB	R0,6$
EXI2:	BR	EXI

L7:	TST	42(R3)
	BMI	9$

8$:	MOV	@R5,(R2)+	;RD
	SOB	R1,8$
	BR	L4$

9$:	MOV	(R2)+,@R5	;WR
	SOB	R1,9$
	BR	L4$

ENDVER:	TSTB	@R4
	BPL	.-2
	BIT	#1,@R4
	BNE	EXI2

ERR$HD:	CLR	R0
	BISB	@#R$ERRR,R0
	COM	R0
	BIC	#4,R0		;устан.вместе с	др.разрядами
	MOV	#ERRTAB-1,R2	;перемещ.не важна
1$:	INC	R2
	ROR	R0
	BCC	1$
	MOVB	@R2,57(R3)
	BR	EXI2

USER$:	;опр.налич.USR-драйвера	и возврат его адреса с
	;необх.смещ.в R5 или выход на HDD
	MOV	@#HD$USR,R5
	CMP	R5,#HD$LOG
	BHIS	1$
	CMP	(R5)+,#240
	BEQ	2$
1$:	ADD	#10,R4	;->HDD;	а что будет в R5 - не важно
2$:	ADD	(R4)+,R5	;смещ.соотв.тчк	входа USER
	RTS	R4

DIV$:
;На входе:  R0-делимое,	R1-делитель
;На выходе: R0-частное,	R1-остаток
	MOV	R2,-(SP)
	MOV	R3,-(SP)
	MOV	#16.,R3
	CLR	R2
1$:	ASL	R0
	ROL	R2
	CMP	R1,R2
	BHI	2$
	SUB	R1,R2
	INC	R0
2$:	SOB	R3,1$
	MOV	R2,R1
	MOV	(SP)+,R3
	MOV	(SP)+,R2
	RTS	PC
			;подсчет CRC таблицы разделов
CRC:	MOV	@PC,R2		;с избытком 12701,против всех 0
	MOV	#HD$TRK+2,R1	;<если все нули, совпадет>
	MOVB	@#HD$LOG,R5		;до 128	!
	BMI	RTS1
	TST	(R5)+		;=ADD #2
1$:	ADD	-(R1),R2
	ADD	-(R1),R2
	SOB	R5,1$
RTS1:	RTS	PC

PARTRD:	;чт.CNF, табл.разд.и подсч.CRC
	MOV	#8.,R4	     ;именно >7, т.к. м.б. сразу SETPRM
	MOV	#HD$HEA,R0
	MOV	R4,@R0		;= мастер!
	MOV	R4,-(R0)	;HD$SEC
	CLR	-(R0)		;HD$LOG
	MOVB	R4,35(R3)	;#сект.=8
	MOV	#HD$SPD,26(R3)	;176000
	MOV	#400,30(R3)	;блок
	CLR	32(R3)		;дор.=0, гол.=0
	CALL	160006		;partition &config; будет обра-
CAL06:	BCS	RTS1	  ;HDD-x	;ботан при любом 34(R3)
	MOV	#R$STAT,R4
	CALL	CRC
	CMP	R2,-(R1)	;CRC
	BEQ	SETPRM

	CALL	RDY		;1.7sec, BCS не	бывает?
	MOV	#R$DATA,R5	;из 160006, испорчено by CRC
	MOV	#23,@R4		;"IDENTIFY"
	TSTB	@R4
	BPL	.-2
	BIT	#10,@R4		;R4=R$STAT
	BNE	.-4
	MOV	#HD$TRK+2,R2
	MOV	#512,R1		;^B( 101 001 010) #400-лишн!

4$:	TSTB	@R4
	BPL	.-2
	MOV	@R5,-(R2)
	COM	@R2
	ASR	R1
	BEQ	8$
	BCS	4$
	TST	(R2)+
	BR	4$

8$:	CLR	@R2		;HD$LOG	& UNI
	CALL	CRC
	MOV	R2,-(R1)	;CRC

SETPRM:	CALL	RDY		;ибо при СТОП при вериф.глюки!
				;бывает	BPL, если уже 0->R$SRES
	CLR	@#R$SRES	;программный сброс
	MOV	#6,@#R$SRES
	CALL	RDY2		;ПОРТИТ	R5, R1 !	3.7sec
	BCS	7$		;винт откл., а открыли C:
	MOV	@#HD$SEC,R0
	COM	R0
	MOV	R0,@#R$COUN	;сект.
	MOVB	@#HD$HEA,R0
	BISB	@#HD$DRV,R0
	NEG	R0		;=DEC +	COM
	MOV	R0,@#R$HEAD	;гол.
	MOV	#156,@R4	;уст.параметров
7$:	RTS	PC

RDY4:	CALL	@PC
RDY2:	CALL	@PC		;ПОРТИТ	R5,R1
RDY:	MOV	#1500,R5   ;10!	на 3 МГц в ПЗУ >2 с, 6 >1.1
1$:	MOV	R5,R1
	TSTB	@#R$STAT	;SEC - не раб.
	BPL	2$
	BIT	#100,@#R$STAT
	BEQ	5$
2$:	SEC
3$:	SOB	R1,3$
	SOB	R5,1$
5$:	RTS	PC

KEYT:	TST	R5				;НИЖЕ для 10!
	BNE	ZAGN		;T1,T2,...
	EMT	26
	DEC	R2
	CMP	(R1)+,(R1)+	;+4
	EMT	24
	MOV	@#160,R1
	CMPB	77(R1),@#212	;распозн."0" при люб.фоне
	BEQ	ZAG		;- просто "T"
ZAGN:	MOV	R5,-(SP)
	CALL	INIT
	MOV	(SP)+,R0
	CALL	160002
	HALT

	BR	PZP		;<====== 167400	!!!

ZAG:	CALL	INIT
	CALL	160000
Q:	JMP	@#100274

PZP:	;------------		Т.ВХОДА	только по ПЕРЕЗАПУСКУ
	MOV	@PC,R2	;почувств.клав.на 6 МГц: > 40000 SOB
L4:	MOV	#177130,R3
	MOV	#177716,R5	;все для задержки для /St1102
	MOV	#100,R0
	MOV	#1000,SP
	SOB	R2,L4		;чтоб прописать	как след.

	MOV	#4,R4
	MOV	#P10,(R4)+
	MFPS	@R4

	MOV	#60,R1		;для 10
	MOV	#42400,@#177662	;белая палитра

	MOV	#100140,R1	;признак и код раб.реж.11M
	MOV	#16200,@R5	;страницы ANDOS

P10:	MOV	R4,@R3
	MOV	R1,@R3
	CLR	@R3

	BIT	R0,@R5
	BNE	ZAG
1$:	BIT	R0,@R5		;пусть отпустят	клавишу
	BEQ	1$

	MOVB	@#177662,R5	;< 200 !
	BIC	#40,R5
	SUB	#22,R5		;'2 - будет сраб.и от СУ/R
	CMP	#6,R5
	BLO	LZ
	BEQ	CPR8
	MOVB	HITAB(R5),R3
	SWAB	R3
	ASL	R3
	JMP	@R3
CPR8:	MOV	@#376,R3
	JMP	@R3

LZ:	SUB	#'A-22,R5
	BMI	Q
	BR	ZAGN

INIT:	TST	R1
	BMI	1$
	CALL	@#100140
	BR	2$
1$:	CALL	@#150170
	MOV	#16200,@#114	;как в ANDOS
	EMT	0
2$:	MTPS	@PC
	RTS	PC

ABSLOG:	.WORD	177777,0	;псевдолог.диск	для абс.адрес.

TXT:	.WORD	100112
	.BYTE	232,14,233,224,236,12,12,40,40,40,40,233 ;10!
	.ASCIZ	/КЖД & дpайвеp V1.41  (c) AльтПpo 1996/

	.WORD	0,0,167400		;177716	!

ERRTAB:	.BYTE	11,3,17,17,5,17,1,2,12

HITAB:	.BYTE	100,130,140,150,137,157
	.EVEN

END:	.END
***
**
*

