Итак. Попробуем разобраться.
Исходные:
Эмулятор 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 страницей памяти...
7f1d 3e7a ld a,7ah
7f1f 01f77f ld bc,7ff7h
7f22 ed79 out (c),a
7f24 3e7e ld a,7eh
7f26 01f7ff ld bc,0fff7h
7f29 ed79 out (c),a
7f2b 3ea8 ld a,0a8h
7f2d 0177fd ld bc,0fd77h
7f30 ed79 out (c),a
очистка экрана:
7f33 f5 push af
7f34 e5 push hl
7f35 c5 push bc
7f36 d5 push de
7f37 af xor a
7f38 210040 ld hl,4000h
7f3b 110140 ld de,4001h
7f3e 01ff1a ld bc,3fffh
7f41 77 ld (hl),a
7f42 00 nop
7f43 edb0 ldir
7f38 210040 ld hl,c000h
7f3b 110140 ld de,c001h
7f3e 01ff1a ld bc,3fffh
7f41 77 ld (hl),a
7f42 00 nop
7f43 edb0 ldir
7f45 d1 pop de
7f46 c1 pop bc
7f47 e1 pop hl
7f48 f1 pop af
Выход в терминал:
7f4a 3e7b ld a,7bh
7f4c 01f77f ld bc,7ff7h
7f4f ed79 out (c),a
7f51 3e7c ld a,7ch
7f53 01f7ff ld bc,0fff7h
7f56 ed79 out (c),a
7f58 3eae ld a,0aeh
7f5a 0177fd ld bc,0fd77h
7f5d ed79 out (c),a
при пошаговом исполнении в отладчике все проходит нормально.
При стандартном запуске программа зависает на этапе очистки экрана, в районе команды ldir.
экран остается неочищенным, а процессор продолжает гулять по просторам четвертой страницы.
Вопрос такой: почему так происходит и как это исправить...