<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="ru">
	<id>https://emuverse.ru/w/index.php?action=history&amp;feed=atom&amp;title=%D0%A0%D0%B0%D0%B4%D0%B8%D0%BE-86%D0%A0%D0%9A%2F%D0%A0%D0%B0%D0%B4%D0%B8%D0%BE_03-88%2F%D0%9F%D0%B5%D1%80%D0%B5%D0%BC%D0%B5%D1%89%D0%B0%D1%8E%D1%89%D0%B8%D0%B9_%D0%B7%D0%B0%D0%B3%D1%80%D1%83%D0%B7%D1%87%D0%B8%D0%BA</id>
	<title>Радио-86РК/Радио 03-88/Перемещающий загрузчик - История изменений</title>
	<link rel="self" type="application/atom+xml" href="https://emuverse.ru/w/index.php?action=history&amp;feed=atom&amp;title=%D0%A0%D0%B0%D0%B4%D0%B8%D0%BE-86%D0%A0%D0%9A%2F%D0%A0%D0%B0%D0%B4%D0%B8%D0%BE_03-88%2F%D0%9F%D0%B5%D1%80%D0%B5%D0%BC%D0%B5%D1%89%D0%B0%D1%8E%D1%89%D0%B8%D0%B9_%D0%B7%D0%B0%D0%B3%D1%80%D1%83%D0%B7%D1%87%D0%B8%D0%BA"/>
	<link rel="alternate" type="text/html" href="https://emuverse.ru/w/index.php?title=%D0%A0%D0%B0%D0%B4%D0%B8%D0%BE-86%D0%A0%D0%9A/%D0%A0%D0%B0%D0%B4%D0%B8%D0%BE_03-88/%D0%9F%D0%B5%D1%80%D0%B5%D0%BC%D0%B5%D1%89%D0%B0%D1%8E%D1%89%D0%B8%D0%B9_%D0%B7%D0%B0%D0%B3%D1%80%D1%83%D0%B7%D1%87%D0%B8%D0%BA&amp;action=history"/>
	<updated>2026-05-04T03:50:48Z</updated>
	<subtitle>История изменений этой страницы в вики</subtitle>
	<generator>MediaWiki 1.40.0</generator>
	<entry>
		<id>https://emuverse.ru/w/index.php?title=%D0%A0%D0%B0%D0%B4%D0%B8%D0%BE-86%D0%A0%D0%9A/%D0%A0%D0%B0%D0%B4%D0%B8%D0%BE_03-88/%D0%9F%D0%B5%D1%80%D0%B5%D0%BC%D0%B5%D1%89%D0%B0%D1%8E%D1%89%D0%B8%D0%B9_%D0%B7%D0%B0%D0%B3%D1%80%D1%83%D0%B7%D1%87%D0%B8%D0%BA&amp;diff=1009&amp;oldid=prev</id>
		<title>Panther: http://retro.h1.ru/RK86/Loader/MoveLoad.html</title>
		<link rel="alternate" type="text/html" href="https://emuverse.ru/w/index.php?title=%D0%A0%D0%B0%D0%B4%D0%B8%D0%BE-86%D0%A0%D0%9A/%D0%A0%D0%B0%D0%B4%D0%B8%D0%BE_03-88/%D0%9F%D0%B5%D1%80%D0%B5%D0%BC%D0%B5%D1%89%D0%B0%D1%8E%D1%89%D0%B8%D0%B9_%D0%B7%D0%B0%D0%B3%D1%80%D1%83%D0%B7%D1%87%D0%B8%D0%BA&amp;diff=1009&amp;oldid=prev"/>
		<updated>2008-07-14T09:28:26Z</updated>

		<summary type="html">&lt;p&gt;http://retro.h1.ru/RK86/Loader/MoveLoad.html&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Новая страница&lt;/b&gt;&lt;/p&gt;&lt;div&gt;{{ДИ|Автор= Д. ЛУКЬЯНОВ|Источник=http://retro.h1.ru/RK86/Loader/MoveLoad.html}}&lt;br /&gt;
&lt;br /&gt;
Опубликованный в прошлом номере РЕДАКТОР ПАМЯТИ обладает свойством&lt;br /&gt;
загрузки в самые старшие адреса доступной пользователю памяти. Операцию перемещения&lt;br /&gt;
и соответствующей коррекции кодов программы осуществляет модуль ПЕРЕМЕЩАЮЩЕГО&lt;br /&gt;
ЗАГРУЗЧИКА (табл.1), представляющий и самостоятельный интерес.&lt;br /&gt;
&lt;br /&gt;
Таблица 1.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
	; ********************************************************&lt;br /&gt;
 	; * ПЕРЕМЕЩАЮЩИМ ЗАГРУЗЧИК ОБЪЕКТНЫХ ПРОГРАММНЫХ МОДУЛЕИ *&lt;br /&gt;
 	; * для радиолюбительского компьютера &amp;quot;Радио-86РК&amp;quot;        *&lt;br /&gt;
 	; ********************************************************&lt;br /&gt;
 	; Внимание; Эта программа должна загружаться с адреса 0000Н &lt;br /&gt;
 	; и использовать заранее созданную ВIТМАР-таблицу           &lt;br /&gt;
 	; Вызовы резидентного монитора Радио-86РК&lt;br /&gt;
F830 	GETMEM:	EQU 	0F830Н 	; Вернуть значение МАХRАМ в (HL)&lt;br /&gt;
F8ЗЗ 	PUTMEM:	EQU 	0F833Н 	; Заменить MAXRAM на содержимое (HL)&lt;br /&gt;
F81B 	MSB:   	EQU	0F81BH 	; Напечатать сообщение, указанное (HL)&lt;br /&gt;
F815 	PRINTA:	EQU 	0F815Н 	: Напечатать содержимое (А) в HEX&lt;br /&gt;
F836 	WSTART:	EQU 	0F836Н 	; Вход в CLI монитора.&lt;br /&gt;
0000 		ORG 	0&lt;br /&gt;
0000 C31200 	INIT: 	JMP 	START 	; Основной &amp;quot;ход в загрузчик с авто-&lt;br /&gt;
0001 	GO$ADR:	EQU 	INIT+I 		; установкой aдреса по МАХRАМ.&lt;br /&gt;
0003 С32900 	INIT1: 	JMP 	STARTI 	; Вход без автоустановки адреса&lt;br /&gt;
0006 00 	TOPS: 	DB 	0 	; Младший байт длины программы TASK&lt;br /&gt;
ВВ07 00 	BLOCKS: DB 	0 	; Старший байт длины программы TASK&lt;br /&gt;
 					; TOPS&amp;amp;BLOCKS вместе содержат 16-&lt;br /&gt;
 					; битное представление верхней грани-&lt;br /&gt;
 					; цы прикладной программы.&lt;br /&gt;
0008 00 	ASTART: DB 	0 	; Адрес начала области перемещения&lt;br /&gt;
0009 00 	SHIFT: 	DB 	0 	; (16-битное число)&lt;br /&gt;
000A 0000 	LENGTH: DW 	0 	; длина TASK в байтах&lt;br /&gt;
000C 0000 	FILE: 	DW 	0 	; Адрес начала TASK в ОЗУ РК.&lt;br /&gt;
000E 0000 	BITMAP: DW 	0 	; Адрес начала таблицы BITMAP&lt;br /&gt;
0010 0000 	CONTROL:DW 	0 	; Адрес старта TASK.&lt;br /&gt;
 	; Загрузка с 	автоматическим резервированием памяти.&lt;br /&gt;
0012 CD30F6 	START: 	CALL 	GЕТМЕМ 	; Запросить границу ОЗУ у Монитора&lt;br /&gt;
0015 ЗА0600 		LDA 	TOPS 	; Сравнить, уместится ли &amp;quot;хвост&amp;quot;&lt;br /&gt;
0018 BD 		СМР 	L 	; копии при перемещении на целое&lt;br /&gt;
0019 F21D00 		JP 	10$ 	; число 256~байтнмх блоков.&lt;br /&gt;
001С 25 		DCR 	Н 	; Нет &amp;quot; зарезервировать на блок больше &amp;#039;&lt;br /&gt;
001D 3A0700 	10$: 	LDA 	BLOCKS 	; Получить адрес начала области&lt;br /&gt;
0020 2F 		CMA 		; перемещения по размеру TASK.&lt;br /&gt;
0021 ЗС 		INR 	А&lt;br /&gt;
0022 84 		ADD 	Н&lt;br /&gt;
0023 67 		MOV 	Н,А&lt;br /&gt;
0024 2E00		MVI 	L,0&lt;br /&gt;
0026 220800		SHLD 	ASTART 	; Сохранить полученное значение&lt;br /&gt;
 					; для единообразия.&lt;br /&gt;
 	; Загрузка с 	ручным резервированием памяти.&lt;br /&gt;
0029 2A0800 	START1: LHLD 	ASTART 	;&lt;br /&gt;
002C Е5 		PUSH 	H 	; Start ADDRES is on stack&lt;br /&gt;
BB2D EB 		XCHG&lt;br /&gt;
0B2E 2A0A00 		LHLD 	LENGTH 	; Взять размер TASK в (ВС)&lt;br /&gt;
0031 44 		MOV 	В,Н&lt;br /&gt;
0032 4D 		MOV 	C,L&lt;br /&gt;
0033 2A0C00 		LHLD 	PILE 	; Параметры подготовлены;&lt;br /&gt;
0036 ЕB 		ХСНО 		; (ВС) &amp;quot;длина, &amp;lt;DE) &amp;quot;начало TASK,&lt;br /&gt;
0037 С5 		PUSH 	В 	; (HL) &amp;quot;начало области копии.&lt;br /&gt;
 	; Пересылка 	прикладной 	программы в &amp;quot;верхние&amp;quot; адреса&lt;br /&gt;
0038 78 	LOOP: 	МОV 	A,В&lt;br /&gt;
0039 В1 		ОRA 	С&lt;br /&gt;
003A СА4500 		JZ 	ENDLOOP&lt;br /&gt;
003D 1A 		LDAX 	D&lt;br /&gt;
003Е 77 		MOV 	М,А&lt;br /&gt;
003F 13 		INX 	D&lt;br /&gt;
0040 23 		INX 	Н&lt;br /&gt;
0041 0В 		DCX 	В&lt;br /&gt;
0042 СЗЗ800 		JMP 	LOOP&lt;br /&gt;
 	; Коррекция адресов в копии программы TASK&lt;br /&gt;
0045 	ENOLOOP:&lt;br /&gt;
0045 С1 		POP 	В 	: Длина&lt;br /&gt;
B04b D1 		POP 	D 	; Начальный адрес&lt;br /&gt;
0047 D5 		PUSH 	D&lt;br /&gt;
0048 2A0E00 		LHLD 	BITMAP 	; Взять указатель на таблицу&lt;br /&gt;
004В E5 		PUSH 	Н 	; коррекции&lt;br /&gt;
004С 62 		MOV 	H,D&lt;br /&gt;
004D 78 	10$: 	MOV 	А,В 	; Начать коррекцию по таблице&lt;br /&gt;
004Е B1 		ORA 	С 	; Все байты скорректированы?&lt;br /&gt;
004F СА6B00 		JZ 	REPORT 	; Да, выход из программы&lt;br /&gt;
0052 0В 		DCX 	В 	; Нет, Продолжаем проверку&lt;br /&gt;
0053 7В 		MOV 	А,Е&lt;br /&gt;
0054 Е607 		ANI 	7 	; Нужен новый байт на BITMAP?&lt;br /&gt;
0056 С25Е00 		JNZ 	20$ 	; Нет, анализируем текущие биты&lt;br /&gt;
0359 ЕЗ 		XTHL 		; Да, загрузим новый байт с L&lt;br /&gt;
005A 7E 		MOV 	А,М&lt;br /&gt;
005B 23 		INX 	Н&lt;br /&gt;
005C Е5 		XTHL&lt;br /&gt;
005D 6F 		MOV 	L,A&lt;br /&gt;
005Е 7D 	20$: 	MOV 	A,L 	; 	Обработка текущего байта BITMAP:&lt;br /&gt;
005F 17 		RAL 		; 	начиная со старшего разряда&lt;br /&gt;
0060 6F 		MOV 	L,A 	; 	(На необходимость коррекции&lt;br /&gt;
0061 D26700 		JNC 	30$ 	; 	указывает старший бит. т.е. &amp;lt;f:Y&amp;gt;&lt;br /&gt;
0064 1A 		LDAX 	D&lt;br /&gt;
0065 84 		ADD 	Н&lt;br /&gt;
0066 12 		STAX 	D&lt;br /&gt;
0067 15 	30$: 	INX	D&lt;br /&gt;
0068 С34D00 		JMP 	10$&lt;br /&gt;
; Выход из загрузчика с печатью сообщения и изменением&lt;br /&gt;
; значения верхней границы ОЗУ MAXRAM в Мониторе.&lt;br /&gt;
006В Е1 	REPORT:	POP 	Н&lt;br /&gt;
006C 218F00 		LXI 	H,STMSG ; 	Отпечатать новое значение&lt;br /&gt;
006F CD18F8 		CALL 	MSG 	; 	стартового адреса копии TASK&lt;br /&gt;
0072 E1 		POP 	Н 	;&lt;br /&gt;
0073 CD33F8 		CALL 	PUTMEM 	; 	Изменить NAXRAM для &amp;quot;захлопывания&amp;quot;&lt;br /&gt;
0076 ЕВ 		XCHG 		; 	загруженной копии е ОЗУ.&lt;br /&gt;
0077 2А1000 		LHLD 	CONTROL ; 	Изменить адрес перехода по &amp;quot;Б0&amp;quot;&lt;br /&gt;
007А 29 		DAD 	Н 	; 	на стартовый адрес копии TASK&lt;br /&gt;
007В 220100 		SHLD 	GO$ADR&lt;br /&gt;
007Е 7С 		MOV 	A,H&lt;br /&gt;
007F CD15F8 		CALL 	PRINTA&lt;br /&gt;
0082 7D 		MOV 	A,L&lt;br /&gt;
008З CD15F8 		CALL 	PRINTA&lt;br /&gt;
0086 21А400 		LXI 	H,CRLF 	; 	Подготовить HOByte строку для CLI&lt;br /&gt;
0089 CD18F8 		CALL 	MSG&lt;br /&gt;
008C C336F8 		JMP 	WStart&lt;br /&gt;
 		NOGEN&lt;br /&gt;
008F 204E45 	STMSG: 	DB 	NEW START ADDRESS! ,0&lt;br /&gt;
00A4 0D0A00 	CRLF: 	DB 	0DH,0AH,0&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Использование перемещающего режима загрузки предпочтительно для&lt;br /&gt;
большинства разрабатываемых программ, поэтому мы и приводим исходный текст этого&lt;br /&gt;
важного программного модуля ПОЛНОСТЬЮ.&lt;br /&gt;
&lt;br /&gt;
Как видно из текста программы, при запуске с адреса 0000Н загрузчик&lt;br /&gt;
получает у МОНИТОРА адрес верхней границы доступного ОЗУ и вычисляет смещение,&lt;br /&gt;
которое необходимо задать от начала ОЗУ до области загружаемой программы, чтобы&lt;br /&gt;
она смогла полностью разместиться в ОЗУ. После этого следует процедура коррекции&lt;br /&gt;
байтов, которые в кодах программы содержат старшие части изменившихся переходов&lt;br /&gt;
и меток внутри программы. Поскольку для такой коррекции необходима дополнительная&lt;br /&gt;
информация о том, как необходимо трактовать байты программы, программа пользуется&lt;br /&gt;
побитной таблицей коррекции BITMAP, полученной вместе с машинными кодами при&lt;br /&gt;
трансляции загружаемой программы с помощью МАКРОАССЕМБЛЕРА.&lt;br /&gt;
&lt;br /&gt;
Каждый байт этой таблицы описывает 8 последовательных байт машинного&lt;br /&gt;
кода. Установленный в «1» бит этой таблицы помечает байт, который необходимо&lt;br /&gt;
корректировать. Старший бит байта таблицы описывает самый первый байт кодов&lt;br /&gt;
программы, а остальные — следующие по порядку 7 бит. Такую таблицу для небольших&lt;br /&gt;
программ можно создать и вручную, пользуясь листингом трансляции. Эта же таблица&lt;br /&gt;
поможет однозначно дизассемблировать программы, имеющиеся только в машинном&lt;br /&gt;
коде.&lt;br /&gt;
&lt;br /&gt;
Информация, содержащаяся в таблице BITMAP, является исчерпывающей&lt;br /&gt;
для перемещения программ с дискретностью 256 байт и позволяет, в частности,&lt;br /&gt;
настроить программу в кодах на конкретные адреса или переместить ее так, чтобы&lt;br /&gt;
она была настроена на работу в одной области адресного пространства, а переместилась&lt;br /&gt;
в другую. Это необходимо, например, для записи программ в ПЗУ. Областью перемещения&lt;br /&gt;
тогда будет область буфера программатора, а настройка должна быть произведена&lt;br /&gt;
на область, где будет расположено запрограммированное ПЗУ. Для такого режима&lt;br /&gt;
перемещающий загрузчик имеет вторую точку входа (0003Н), причем перед запуском&lt;br /&gt;
программы необходимо соответствующим образом скорректировать содержимое блока&lt;br /&gt;
параметров загрузчика (ячейки 0006H — 0011Н).&lt;br /&gt;
&lt;br /&gt;
Программа, подлежащая перемещению, должна быть оттранслирована&lt;br /&gt;
с адреса 0000Н, а адрес массива памяти, где будут размещаться ее коды до загрузки,&lt;br /&gt;
указывается в ячейках 000СН, 000DH области параметров загрузчика.&lt;br /&gt;
&lt;br /&gt;
Квалифицированные радиолюбители могут дополнить функциональные&lt;br /&gt;
возможности экранного РЕДАКТОРА ПАМЯТИ. Для этого в наиболее важных точках программы&lt;br /&gt;
зарезервировано по 3 байта (заполнены командой NOP) для размещения команд перехода&lt;br /&gt;
на внешние программы и подпрограммы. В табл.2 приведено расположение этих точек&lt;br /&gt;
и условия, при которых происходит выход на них. Следует также учесть, для удобной&lt;br /&gt;
мнемоники команд в РЕДАКТОРЕ введен режим префикса: сначала нажимают клавишу&lt;br /&gt;
АР2, а затем одну из алфавитно-цифровых клавиш.&lt;br /&gt;
&lt;br /&gt;
Таблица 2&lt;br /&gt;
&lt;br /&gt;
ЗАРЕЗЕРВИРОВАННЫЕ АДРЕСА ДЛЯ РАСШИРЕНИЯ ФУНКЦИИ РЕДАКТОРА&lt;br /&gt;
&lt;br /&gt;
{| class=border&lt;br /&gt;
! Адрес || Имя || функция || Условия выхода и передаваемые параметры&lt;br /&gt;
|-&lt;br /&gt;
| 0023 || EXT1 || Основное меню || Ни одна из перечисленных в меню директив не выбрана. (a)=ascii код введенной клавиши&lt;br /&gt;
|-&lt;br /&gt;
| 0466 || ЕХТ2 || DUMP-редактор || Ни одна из возможных директив редактора не совпадает с введенной. (А)=код клавиши&lt;br /&gt;
|-&lt;br /&gt;
| 0549 || EXT5 || Тo же, peжим Letter || Введена не команда управления курсором, (А)=АSСII -код введенного символа.&lt;br /&gt;
|-&lt;br /&gt;
| 0642 || ЕХТ3 || Программатор РПЗУ || Введен тип РПЗУ, не поддерживаемый этой версией. (А)=код типа РПЗУ (в HEX- записи)&lt;br /&gt;
|-&lt;br /&gt;
| 07C7 || ЕХТ4 || Программатор ППЗУ || Введен тип ППЗУ, не поддерживаемый этой версией. (А)=код типа ППЗУ (в НЕХ- записи)&lt;br /&gt;
|-&lt;br /&gt;
| 0891 || ЕХТ7 || DUMP-редактор || В [Hex] или [Letter] режимах редактора набрана &amp;amp;lt;ESC&amp;amp;gt;-последовательность, не отрабатываемая этой версией. (А)=код второго символа в набранной последовательности&lt;br /&gt;
|-&lt;br /&gt;
| 08B0 || ЕХТ9 || Despatch || В слове по этому адресу необходимо разместить адрес входа в дизассемблер. Возврат из этой подпрограммы должен быть по RET&lt;br /&gt;
|-&lt;br /&gt;
| 08B3 || EXT8 || Despatch || Первый байт должен содержать символ, следующий за &amp;amp;lt;ESC&amp;amp;gt;, а следующее за ним слово — адрес подпрограммы, отрабатывающей эту &amp;amp;lt;ESC&amp;amp;gt;-последовательность&lt;br /&gt;
|-&lt;br /&gt;
| 097В || EXT10 || Основное меню || Первый байт должен содержать символ меню, а следующее слово — адрес перехода по этому символу на подпрограмму пользователя (например: ED*MICRON* или Бейсик).&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Примечание:&lt;br /&gt;
&lt;br /&gt;
* &amp;amp;lt;ESC&amp;amp;gt;/A = Курсор вверх,&lt;br /&gt;
* &amp;amp;lt;ESC&amp;amp;gt;/B = Курсор вниз,&lt;br /&gt;
* &amp;amp;lt;ESC&amp;amp;gt;/C = Курсор вправо,&lt;br /&gt;
* &amp;amp;lt;ESC&amp;amp;gt;/D = Курсор влево,&lt;br /&gt;
* &amp;amp;lt;ESC&amp;amp;gt;/&amp;amp;lt;ESC&amp;amp;gt; = выход в монитор РК,&lt;br /&gt;
* &amp;amp;lt;ESC&amp;amp;gt;/L = Выход в подключаемый дополнительно дизассемблер&lt;br /&gt;
&lt;br /&gt;
Д. ЛУКЬЯНОВ, г. Москва&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;От редакции.&amp;#039;&amp;#039;&amp;#039; Исходный текст перемещающего загрузчика был&lt;br /&gt;
подготовлен на другом компьютере. Чтобы воспользоваться им для «Радио-86РК»,&lt;br /&gt;
необходимо операторы SET заменить операторами EQU, а после их имен поставить&lt;br /&gt;
двоеточие.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Категория:Радио-86РК/Публикации|28]]&lt;/div&gt;</summary>
		<author><name>Panther</name></author>
	</entry>
</feed>