Как известно, стандартный авторский Монитор РАДИО-86РК имеет минимальные встроенные средства отладки кода - директивы G с парой параметров и X.
Причём, вторым параметром директивы G указывается адрес прерывания приложения с временным размещением кода F7 - RST 6. Причём, по адресам 0030…0032 прописывается инструкция «JMP FFA2», уничтожая содержимое ячеек безвозвратно!
(Очевидно, в CP/M адрес 0030 был стандартной точкой отладки.)
Директива G, однако, сохраняет код временно замещённой инструкции в ячейку 7625 и её адрес в ячейки 7623/7624.
Тем самым, приложение может само себя частично восстановить, используя сохранённую служебную информацию, а так как все параметры директив сохраняются в ячейках 7627…762C, то и использовать, в частности, и третий параметр.
- «G,<параметр#2>»
- «G,<параметр#2>,<параметр#3>»
- «G,,<параметр#3>»
Code: Select all
PUTHEX: EQU 0F815H
PUTEXT: EQU 0F818H
GETMEM: EQU 0F830H
WARMON: EQU 0F86CH
;;;;;;;;;;;;;;;;;;;;;;;;;
STOPTR: EQU 07629H ; Адрес останова (7623 или второй параметр)
STOPIC: EQU 07625H ; Сохранённый код инструкции
DIRDE: EQU 07629H ; Второй параметр директивы (передаётся в DE)
DIRBC: EQU 0762BH ; Третий параметр директивы (передаётся в BC)
ORG 00000H
LHLD STOPTR ; Читаем адрес "порчи" (слово в 7623 или 7629)
MOV A,H ; и проверяем,
ORA L ; был ли второй параметр у директивы G?
JZ BEGIN ; Если указатель - "нулевой", значит отсутствует.
LDA STOPIC ; Иначе, читаем код инструкции
MOV M,A ; и "снимаем порчу" у ячейки, которая "прихворала".
BEGIN: XCHG ; Заносим второй параметр в DE.
DCX SP ; Корректируем указатель стека
DCX SP ; для благополучного возврата в Монитор.
LXI H,HELLO ; Сначала поприветствуем пользователя
CALL PUTEXT ; скромным сообщением о нормальном запуске.
CALL SHOWDE ; Отобразим содержимое DE - второй параметр директивы
INX H ; и напечатаем остальное
CALL PUTEXT ; сообщение.
LHLD DIRBC ; Третий параметр директивы.
XCHG ; Теперь отображаем третий параметр директивы и выходим
;;;;;;;;;;;;;;;;;;;;;;;;;
SHOWDE: MOV A,D ; Выводим регистр D
CALL PUTHEX ; шестнадцатеричным,
MOV A,E ; выводим регистр E
JMP PUTHEX ; шестнадцатеричным.
;;;;;;;;;;;;;;;;;;;;;;;;;
MOV B,C
MOV C,H
MOV C,C
MOV C,E
MOV B,D
MOV B,L
MOV D,D
MOV C,A
MOV D,M
MVI L,031H
;;;;;;;;;;;;;;;;;;;;;;;;;
HELLO: DB 00DH,00AH
DB 'SECOND PARAMETER IS ',0
DB 00DH,00AH
DB 'THIRTH PARAMETER IS ',0
