;[]=========================================================================[] ;[] Резидент отладчика [] ;[] v0.03 - последние изменения 24.02.2006 [] ;[] Принцип работы (два варианта): [] ;[] 1. Резидент расположен не во втором окне памяти (0x8000...0xBFFF) [] ;[] Из отладчика готовится резидент (настраиваются все адреса) и копируется [] ;[] по адресу расположения, управление из отладчика передается на метку [] ;[] Rezident.Start1, после чего происходит востановление банки памяти, рас- [] ;[] положенной под отладчиком и выполнение отлаживаемой команды. Возврат [] ;[] в резидент осуществляется на метку Rezident.RetIn1 и далее после вос- [] ;[] тановления банки с отладчиком возврат в отладчик. [] ;[] 2. Резидент расположен во втором окне памяти (0x8000...0xBFFF) [] ;[] Поскольку в этом окне работает сам отладчик, то переход в резидент и [] ;[] возврат в отладчик после трассировки команды выполняется при помощи [] ;[] вспомогательной процедуры длиной 7 байт расположеной по адресу [] ;[] AdrTmpBuf. После коррекции всех адресов в отладчике и сохранении акку- [] ;[] мулятора отлаживаемой программы по адресу Rezident+1 и пары HL по адре- [] ;[] ce Rezident+2 управление передается по адресу AdrTmpBuf, где расположен [] ;[] следующий код отключающий банку с отладчиком: [] ;[] ld a,НомерБанкиПодОтладчиком [] ;[] out (НомерПорта2Окна),a [] ;[] jp Rezident.Start [] ;[] Далее резидент востанавливает 7 байт запорченых вышепреведенной проце- [] ;[] дурой, а также пару HL и аккумулятор и переходит к трассировке. Возврат [] ;[] происходит на метку Rezident.RetIn, где после сохранения аккумулятора и [] ;[] пары HL сохраняется 7 байт памяти из адреса AdrTmpBuf и туда прописыва- [] ;[] ется код востановления банки с отладчиком: [] ;[] ld a,НомерБанкиСОтладчиком [] ;[] out (НомерПорта2Окна),a [] ;[] jp ВОтладчик [] ;[] После возврата в отладчик востанавливается память запорченая резидентом [] ;[] и временной процедурой [] ;[]=========================================================================[] AdrTmpBuf equ 0xFF00 Rezident: ds 11 .Start ld hl,0 ;вост. памяти запорченной при ld (AdrTmpBuf),hl ;размещении резидента ld hl,0 ;во 2-м окне ld (AdrTmpBuf+2),hl ld hl,0 ld (AdrTmpBuf+4),hl ld a,0 ld (AdrTmpBuf+6),a .K2 ld hl,(Rezident+2) ;востановили HL jr .K3 ;...востановить банку во 2-м окне .Start1 ld a,0xFF ;банка под demon'ом out (EmmWin.P2),a .K3 ld a,(Rezident+1) ;востановим аккумулятор .Step jp 0 ;переход на выполнение .RetIn ld (Rezident+1),a ;сохраним аккумулятор .K4 ld (Rezident+2),hl ;сохраним HL ld hl,(AdrTmpBuf) ;сохранение памяти .K5 ld (Rezident+4),hl ld hl,(AdrTmpBuf+2) ld (Rezident+6),hl ld hl,(AdrTmpBuf+4) ld (Rezident+8),hl ld a,(AdrTmpBuf+6) ld (Rezident+10),a .BankD1 ld hl,0xFF3E ;ld a,0xFF - N банки с отладч ld (AdrTmpBuf),hl ld hl,EmmWin.P2*256+0xD3 ;out (EmmWin.P2),a ld (AdrTmpBuf+2),hl .Return1 ld hl,0xC3 ;jp в отладчик ld (AdrTmpBuf+4),hl ld a,0 ld (AdrTmpBuf+6),a in a,(EmmWin.P2) ;номер банки под demon'ом .K6 ld (Rezident),a ;сохранили jp AdrTmpBuf .RetIn1 ld (Rezident+1),a ;сохраним аккумулятор ;...сохранить банку из 2-го окна in a,(EmmWin.P2) ;номер банки под demon'ом .K1 ld (Rezident),a ;сохранили .BankD ld a,0xFF ;банка с demon'ом out (EmmWin.P2),a .Return jp 0 .End