; ******************************************************** ; * ПЕРЕМЕЩАЮЩИМ ЗАГРУЗЧИК ОБЪЕКТНЫХ ПРОГРАММНЫХ МОДУЛЕИ * ; * для радиолюбительского компьютра "Радио-86РК" * ; ******************************************************** ; Внимание; Эта программа должна загружаться с адреса 0000Н ; и использовать заранее созданнум ВIТМАР-тавлицу ; Вызовы резидентного монитора Радио-86РК F830 GETMEM: EQU 0F830Н ; Вернуть значение МАХRАМ в (HL) F8ЗЗ PUTMEM: EQU 0F833Н ; Заменить MAXRAM на содержимое (HL) F81B MSB: EQU 0F81BH ; Напечатать сообщение, указанное (HL) F815 PRINTA: EQU 0F815Н : Напечатать содержимое (А) в HEX F836 WSTART: EQU 0F836Н ; Вход в CLI монитора. 0000 ORG 0 0000 C31200 INIT: JMP START ; Основной "ход в аагруэ^ик с авто- 0001 GO$ADR: EQU INIT+I ; установкой aдреса по МАХRАМ. 0003 С32900 INIT1: JMP STARTI ; Вход без автоустановки адреса 0006 00 TOPS: DB 0 ; Младший байт длины программы TASK ВВ07 00 BLOCKS: DB 0 ; Старший байт длины программы TASK ; TOPS&BLOCKS вместе содержат 16- ; битное представлние верхней грани- ; цы прикладной программы. 0008 00 ASTART: DB 0 ; Адрес начала области перемещения 0009 00 SHIFT: DB 0 ; (16-битное число) 000A 0000 LENGTH: DW 0 ; длина TASK в байтах 000C 0000 FILE: DW 0 ; Адрес начала TASK в ОЗУ РК. 000E 0000 BITMAP: DW 0 ; Адрес начала таблицы BITMAP 0010 0000 CONTROL:DW 0 ; Адрес старта TASK. ; Загрузка с автоматическим резервированием памяти. 0012 CD30F6 START: CALL GЕТМЕМ ; Запросить границу ОЗУ у Монитора 0015 ЗА0600 LDA TOPS ; Сравнить, уместится ли "хвост" 0018 BD СМР L ; копии при перемешении на целое 0019 F21D00 JP 10$ ; число 256~байтнмх блоков. 001С 25 DCR Н ; Нет " зарезервировать на блок больше ' 001D 3A0700 10$: LDA BLOCKS ; Получить адрес начала области 0020 2F CMA ; перемещения по размеру TASK. 0021 ЗС INR А 0022 84 ADD Н 0023 67 MOV Н,А 0024 2E00 MVI L,0 0026 220800 SHLD ASTART ; Сохранить полученное значение ; для единообразия. ; Загрузка с ручным резервированием памяти. 0029 2A0800 START1: LHLD ASTART ; 002C Е5 PUSH H ; Start ADDRES is on stack BB2D EB XCHG 0B2E 2A0A00 LHLD LENGTH ; Взять размер TASK в (ВС) 0031 44 MOV В,Н 0032 4D MOV C,L 0033 2A0C00 LHLD PILE ; Параметры подготовлены; 0036 ЕB ХСНО ; (ВС) "длина, 0064 1A LDAX D 0065 84 ADD Н 0066 12 STAX D 0067 15 30$: INX D 0068 С34D00 JMP 10$ ; Выход из загрузчика с печатью сообшения и изменением ; значения верхней границы ОЗУ MAXRAM в Мониторе. 006В Е1 REPORT: POP Н 006C 218F00 LXI H,STMSG ; Отпечатать новое значение 006F CD18F8 CALL MSG ; стартового адреса копии TASK 0072 E1 POP Н ; 0073 CD33F8 CALL PUTMEM ; Изменить NAXRAM для "эахлопывания" 0076 ЕВ XCHG ; загруженной копии е ОЗУ. 0077 2А1000 LHLD CONTROL ; Изменить адрес перехода по "Б0" 007А 29 DAD Н ; на стартовый адрес копии TASK 007В 220100 SHLD GO$ADR 007Е 7С MOV A,H 007F CD15F8 CALL PRINTA 0082 7D MOV A,L 008З CD15F8 CALL PRINTA 0086 21А400 LXI H,CRLF ; Подготовить HOByte строку для CLI 0089 CD18F8 CALL MSG 008C C336F8 JMP WStart NOGEN 008F 204E45 STMSG: DB NEW START ADDRESS! ,0 00A4 0D0A00 CRLF: DB 0DH,0AH,0