Кaк я уже говорил, код МОНИТОРа в ПЗУ местами можно и подправить, чтобы отвоевать несколько ячеек…
Например, я подкорректировал частично дамп ПЗУ таким вот образом:
Код:
.0 .1 .2 .3 .4 .5 .6 .7 .8 .9 .A .B .C .D .E .F
F800 C3 40 F8 .. .. .. .. .. .. .. .. .. .. .. .. ..
F810 .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. ..
F820 .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. ..
F830 2A 31 76 22 31 76 C9 XX XX XX XX XX XX XX XX XX <- 9 CELLS
F840 21 03 80 36 8A 2B AF 77 7C FE 75 C2 45 F8 22 31
F850 76 2A 6D F8 22 1C 76 F9 CD CE FA 21 50 FF CD 22
F860 F9 21 2A 1D 22 2F 76 3E C3 32 26 76
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
.0 .1 .2 .3 .4 .5 .6 .7 .8 .9 .A .B .C .D .E .F
F950 .. .. .. .. .. .. .. .. .. .. 21 00 00 1A 13 FE
F960 0D 37 C8 FE 2C C8 FE 20 CA 5D F9 01 AE FA C5 D6
F970 30 F8 FE 0A FA 7D F9 FE 11 F8 FE 17 F0 D6 07 4F
F980 29 29 29 29 D8 06 00 09 C1 C3 5D F9 XX XX XX XX <- 4 CELLS
F990 7C BA C0 7D BB C9 CD A4 F9 CD 90 F9 23 C0 2B 33
F9A0 33 C9 XX XX .. .. .. .. .. .. .. .. .. .. .. .. <- 2 CELLS
Чем получил суммарно 15 байтов (помеченных «XX»).
Здесь, четыре ячейки по F98C можно использовать под «08 20 08 00» и F8E4 вписать их адрес.
Тем самым, в более удобной области FF9E…FFA1 появляется резерв, а там много текста и его можно несколько иначе спланировать…
Например, вот так:
Код:
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
.0 .1 .2 .3 .4 .5 .6 .7 .8 .9 .A .B .C .D .E .F
FF50 .. .. XX XX XX XX XX XX XX XX XX XX XX XX 1F 72 <- 12 CELLS
FF60 61 64 69 6F 2D 38 36 72 2B 00 0D 0A 2D 2D 3E 00
FF70 0D 0A 18 18 18 18 00 0A 0D 0A 20 48 4C 2D 0D 0A
FF80 20 42 43 2D 0D 0A 20 44 45 2D 0D 0A 20 53 50 2D
FF90 0D 0A 20 41 46 2D 19 19 19 19 19 0D 20 50 43 2D
FFA0 19 00
Если продолжать в том же духе, то можно заполучить больше нефрагментированного пространства:
Код:
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
.0 .1 .2 .3 .4 .5 .6 .7 .8 .9 .A .B .C .D .E .F
F800 C3 3D F8 .. .. .. .. .. .. .. .. .. .. .. .. ..
F810 .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. ..
F820 .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. ..
F830 2A 31 76 22 31 76 C9 XX XX XX XX XX 21 03 80 36 <- 5 CELLS
F840 8A[0D_0A_2D_2D_3E_00]77 7C FE 75 C2 45 F8 22 31 <- TEXT!!!
F850 76 2A 6D F8 22 1C 76 F9 CD CE FA 21 64 FF CD 22
F860 F9 21 2A 1D 22 2F 76 3E C3 32 26 76 31 CF 76 21
F870 41 F8
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
.0 .1 .2 .3 .4 .5 .6 .7 .8 .9 .A .B .C .D .E .F
F950 .. .. .. .. .. .. .. .. .. .. 21 00 00 1A 13 FE
F960 0D 37 C8 FE 2C C8 FE 20 CA 5D F9 01 AE FA C5 D6
F970 30 F8 FE 0A FA 7D F9 FE 11 F8 FE 17 F0 D6 07 4F
F980 29 29 29 29 D8 06 00 09 C1 C3 5D F9[08_20_08_00]
F990 7C BA C0 7D BB C9 CD A4 F9 CD 90 F9 23 C0 2B 33
F9A0 33 C9 XX XX .. .. .. .. .. .. .. .. .. .. .. .. <- 2 CELLS
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
.0 .1 .2 .3 .4 .5 .6 .7 .8 .9 .A .B .C .D .E .F
FF50 .. .. XX XX XX XX XX XX XX XX XX XX XX XX XX XX <- 18 CELLS
FF60 XX XX XX XX 1F 72 61 64 69 6F 2D 38 36 72 2B 00
FF70 0D 0A 18 18 18 18 00 0A 0D 0A 20 48 4C 2D 0D 0A
FF80 20 42 43 2D 0D 0A 20 44 45 2D 0D 0A 20 53 50 2D
FF90 0D 0A 20 41 46 2D 19 19 19 19 19 0D 20 50 43 2D
FFA0 19 00
Имеем уже 23 ячейки… При этом эстетически интерфейс никак не изменился!
А что же дальше?
Если пожертвовать эстетику, то получим мою…
«WINDOWS'86»
Удалось втиснуть все функции (Escape-позиционирование) в спартанские просторы ПЗУ!
Правда, пришлось многое перекроить, отвоёвывая каждый байт литром крови…
Но, к сожалению, не всё так гладко…
Хоть «ПИТОН» и запустился, но вот «Ксоникс» самовольно перезаписывает указатель на символ под курсором не меняя саму позицию, из-за чего очистка экрана по «1F» уже невозможна и это никак не исправить!
Также «Цирк» и «Вулкан» работают крайне некорректно…
В общем, «кодик мой да с запашком оказывается». И это очень обидно!
То есть, кровью и нервами отвоёвывая каждый байт тактически, стратегически я проиграл!
Теперь и не знаю, что делать…
Заняться больше и нечем…
Выкладываю это добро здесь…
Вложение 71048
Вставьте его в ассемблер эмулятора, прошейте и погоняйте, если не лень!
Работают 7 «точек входа»:
Просто набирайте директивы «G0», «G1», «G2», «G3», «G4» и сами всё увидите…
А именно:- «G0»: Режим максимального окна - 78×30. Довольно любопытно посмотреть, как работают некоторые директивы МОНИТОРа в этом режиме
- «G1»: Стандартное окошечко - 64×25. Просто это должно быть встроенным
- «G2»: Вывод содержимого памяти ASCII-дампом
- «G3»: Среднее окошечко
- «G4»: Маленький менеджер окон… Нажатием TAB переключает окна; Курсорные клавиши двигают окна; Пробелом выбирается опция в окне с вопросом; «ВК» подтверждает опцию; Другие клавиши - переход в режим МОНИТОРа
ВАЖНО!
Поддерживается и произвольная Escape-последовательность, но крайне опасно…
Если после сразу после кода 1B не идёт код 59 ('Y'), то управление передаётся на адрес 7626h, где МОНИТОР хранит свою команду JMP.
Тем самым, пользовательский драйвер должен изменять в ячейках тех адрес на свой, чтобы оперативно получать управление прямо из недр подпрограммы вывода символа.
В регистрах - все данные:- B C - Y2 X2 (нижний правый угол окна)
- D E - Y X (текущая позиция курсора)
- HL - Адрес символа в памяти под курсором
- A - символы Escape-последовательности
Тем самым, свободно можно и ANSI-последовательности поддержать на самом базовом уровне!
P.S.: В остальном - вполне любопытные возможности открываются…