Радио-86РК/Радио 03-91/Сортировка/Таблица 3

Материал из Emuverse
Данный материал защищён авторскими правами!

Использование материала заявлено как добросовестное, исключительно для образовательных некоммерческих целей.

Автор: M. ОВЕЧКИН

Источник: http://retro.h1.ru/RK86/Programm/SortTbl3.txt

				Таблица 3
;СОРТИРОВКА СПИСКА НА РУССКОМ ЯЗЫКЕ
; (ДОПУСТИМЫ ЦИФРОВЫЕ ДАННЫЕ).
;ПРЕДПОЛАГАЕТСЯ,ЧТО СЧЕТЧИК PSR
;ХРАНИТ ЧИСЛО 	СИМВОЛОВ СТРОКИ;
;СТРОКИ РАСШИРЕНЫ;
;В BUF3 НАХОДИТСЯ АДРЕС КОНЦА СПИСКА.
;СРАВНЕНИЕ ИДЕТ 	ОТ НАЧАЛА СТРОКИ.
	JMP 	NEWO	; ПЕРЕЙТИ К СОРТИРОВКЕ
WYH: 	POP 	D	;
	LDA 	FL	; БЫЛ ЛИ ОБМЕН?
	ORA 	А	;
	JZ 	0F86CH	;
	XRA 	А	; БЫЛ,СБРОСИТЬ ПРИЗНАК
	STA 	FL	; ОБМЕНА.
;ОЧЕРЕДНОЙ ПРОСМОТР СПИСКА
NEWO: 	LHLD 	BUF	; ЗАПОМНИТЬ ИСХОДНЫЙ
	SHLD 	BUF1	; АДРЕС ТЕКСТОВОГО БУФЕРА.
; ПРОСМОТР СТРОК
NEW1: 	LHLD 	BUF1	; ВСТАТЬ НА НАЧАЛО
	XCHG		; 	ТЕКУЩЕЙ СТРОКИ.
	LHLD 	BUF1	; ВЫЧИСЛИТЬ АДРЕС
	LDA 	PSR	; НАЧАЛА
	INR 	А	; СЛЕДУЮЩЕЙ
	CALL 	SUM	; СТРОКИ.
	SHLD 	BUF2	; СОХРАНИТЬ.
	PUSH 	D	; ПРОВЕРИТЬ ВЫХОД
	CALL 	STR2	; ЗА ПРЕДЕЛЫ СПИСКА
	JNC 	WYH	; ЕСЛИ KOHEЦ,TO ПРОВЕРИТЬ
	POP 	D	; НАЛИЧИЕ ОБМЕНА.
R0: 	LDAX 	D	; СИМВОЛ ТЕКУЩЕЙ СТРОКИ-
	СРI 	60Н	; БУКВА РУССКОГО АЛФАВИТА?
	JC 	N1	; ЕСЛИ "ДА",ТО
R1: 	MOV 	А,М	; СИМВОЛ СЛЕДУЮЩЕЙ
	СРI 	60Н	; СТРОКИ- БУКВА РУССКОГО
	JC 	N1	; АЛФАВИТА?
R2: 	PUSH 	D	; ДА,ПЕРЕКОДИРОВАТЬ
	PUSH 	Н	; СИМВОЛЫ
	LDAX 	D	; ДЛЯ
	CALL 	PER	; СОРТИРОВКИ
	XCHG		;
	POP 	Н	;
	PUSH 	Н	;
	MOV 	А,М	;
	CALL 	PER	;
	LDAX 	D	; НОВЫЙ КОД СИМВОЛА
	SUB 	М	; ТЕКУЩЕЙ СТРОКИ
	POP 	Н	; МЕНЬШЕ НОВОГО
	POP 	D	; КОДА СИМВОЛА
	JMP 	N2	; ПОСЛЕДУЮЩЕЙ?
N1: 	LDAX 	D	;
	SUB 	М	; РАВЕН,ВЗЯТЬ СЛЕДУЮЩИЕ
M2: 	JZ 	PUZZ	; позиции СТРОК.
	JM 	CORR	; МЕНЬШЕ :ОБМЕН НЕ НУЖЕН,
;ОБМЕН ПО РЕЗУЛЬТАТУ СРАВНЕНИЯ ПЕРВЫХ ПОЗИЦИЙ
PUZ1: 	MVI 	А,0FFН	;ИНАЧЕ УСТАНОВИТЬ ПРИЗНАК
	STA 	FL	; ОБМЕНА
	LDA 	PSR	;
	MOV 	С,А	; И
	LHLD    BUF1	;
	XCHG		; ПОМЕНЯТЬ СТРОКИ 
	LHLD    BUF2	; МЕСТАМИ. 
PO:     MOV     8, M	; 
	LDAX    D	; 
	MOV     M,A	; 
	MOV     A,B	; 
	STAX    D	; 
	INX     D	; 
	INX     H	; 
	DCR     C	; 
	JNZ     PO	; 
	JMP     CORR	;
; ПРОДОЛЖЕНИЕ СРАВНЕНИЯ ОСТАЛЬНЫХ ПОЗИЦИЙ 
PUZ2:   INX     H	;    ПОДГОТОВИТЬ СЛЕДУМИЕ
	INX     D	;    ПОЗИЦИИ СТРОК. 
	LDAX    D	;
	СРI     0DН	; ЕСЛИ КОНЕЦ СТРОКИ,ТО 
	JNZ     RO;
CORR:   LHLD    BUF2	; ПОСЛЕДУЮЩУЮ СТРОКУ 
	SHLD    BUF1	; СДЕЛАТЬ ТЕКУЩЕЙ. 
	JMP     NEW1	; СОРТИРОВАТЬ.
;ПРЕОБРАЗ0ВАНИЕ КОДА СИМВОЛА ДЛЯ СРАВНЕНИЯ 
PER:    SUI     60Н	; ВЗЯТЬ
	LXI     Н,ТАВ1	;НОВЫЙ КОД 
SUM:    MVI     В,0	; СИМВОЛА.
	MOV     С,А	; 
	DAD     В	; 
	RET		;
;ПРОВЕРКА КОНЦА СПИСКА 
STR2:   LHLD    BUF3	; АДРЕС СЛЕДУЮВЕй 
	DCX     H	;    СТРОКИ СПИСКА 
	XCHG		;         СРАВНИТЬ 
	LHLD    BUF2	; С АДРЕСОМ ПОСЛЕДНЕЙ 
	MOV     А,Н	; "00Н" СТРОКИ 
	СМР     D	; 
	RNZ		;
	MOV     A,L	; 
	СМР     Е	; 
	RET		;
;БУКВЫ РУССКОГО АЛФАВИТА,УПОРЯДОЧЕННЫЕ 
;ПО ОТНОШЕНИЮ К КОДУ ASCII 
TABL:   DB 1DH,00H,01H,16H	; Ю,А,Б,Ц 
	DB 04Н,05Н,14Н,0ЗН	; Д,Е,ф,Г 
	DB 15Н,08Н,09Н,0АН	; X,И,Й,К 
	DB 0ВН,0СН,0DН,0ЕН	; Л,М,Н,О 
	DВ 0FH,1EH,10H,11H	; П,Я,Р,С 
	DB 12H,13H,06H,02H	; Т,У,Ж,В 
	DВ 1АН,1ВН,07Н,18Н	; Ь,Ы,3,Ю 
	DB 1СН,19Н,17Н,1FН	; Э,Щ,Ч,DEL
BUF:    DW 2100H		;исходный АДРЕС Т кетового БУФЕРА 
BUF1:   DW 0			;    АДРЕС НАЧАЛА ТЕКУЧЕЙ СТРОКИ 
BUF2:   DW 0			;    АДРЕС НАЧАЛА СЛЕДУЮЩЕЙ СТРОКИ 
BUF3:   DW 0			;    АДРЕС КОНЦА РАСВИРЕННОГО СПИСКА 
PSR:    DB 0			;    СЧЕТЧИК "МАХ" ЧИСЛА СИМВОЛОВ СТРОКИ 
FL:     DВ 0			;    ФЛАГ ОБМЕНА
	END			;
<+> -А-Я(г), 0-9 <L) -ДАТ <R) - РУС