Здравствуйте, уважаемые форумчане и гуру. Прошу помочь!
Исходные:
Эмулятор Unreal Speccy. CP/M, Turbo Pascal 3.0.
На написание графической библиотеки не претендую, для начала нужно чтобы компьютер корректно входил в графический режим 320x200x16, очищал экран и выходил обратно в консоль.
Pascal:
Минимальный стартовый адрес: 20E2 (я ставлю 8000), максимальный конечный адрес D942 (у меня BFFF), компилится в COM-файл.
Procedure SetVidMode;
begin
inline($3e/$7A/$01/$7ff7/$ed/$79/$3e/$7E/$01/$fff7/$ed/$79/$3e/$a8/$01/$fd77/$ed/$79);
end;
Procedure ClrScrRt;
begin
inline($f5/$e5/$c5/$d5/$af/$21/$00/$40/$11/$01/$40/$01/$ff/$1a/$77/$00/$ed/$b0/$d1/$c1/$e1/$f1);
end;
Procedure CloseVidMode;
begin
inline($3e/$7b/$01/$7ff7/$ed/$79/$3e/$7c/$01/$fff7/$ed/$79/$3e/$ae/$01/$fd77/$ed/$79);
end;
Begin
SetVidMode;
ClrScrRt;
CloseVidMode;
End.
Для реализации процедур используется машинный код.
подробнее:
переключение в режим EGA с 5 и 1 страницей памяти...
 3e7a ld a,7ah
 01f77f ld bc,7ff7h
 ed79 out (c),a
 3e7e ld a,7eh
 01f7ff ld bc,0fff7h
 ed79 out (c),a
 3ea8 ld a,0a8h
 0177fd ld bc,0fd77h
 ed79 out (c),a
очистка экрана:
 f5 push af
 e5 push hl
 c5 push bc
 d5 push de
 af xor a
 210040 ld hl,4000h
 110140 ld de,4001h
 01ff1a ld bc,3fffh
 77 ld (hl),a
 00 nop
 edb0 ldir
 210040 ld hl,c000h
 110140 ld de,c001h
 01ff1a ld bc,3fffh
 77 ld (hl),a
 00 nop
 edb0 ldir
 d1 pop de
 c1 pop bc
 e1 pop hl
 f1 pop af
Выход в терминал:
 3e7b ld a,7bh
 01f77f ld bc,7ff7h
 ed79 out (c),a
 3e7c ld a,7ch
 01f7ff ld bc,0fff7h
 ed79 out (c),a
 3eae ld a,0aeh
 0177fd ld bc,0fd77h
 ed79 out (c),a
при пошаговом исполнении в отладчике все проходит нормально.
При стандартном запуске программа зависает на этапе очистки экрана, в районе команды ldir.
экран остается неочищенным, а процессор продолжает гулять по просторам четвертой страницы.
Вопрос такой: почему так происходит и как это исправить...
            
        


