Paguo-86PK wrote:Текст завершается 0 или >127. И F818 править не обязательно, печать текста будет иметь терминацию по 00 или >7F (как Бейсик-токены), а это в ПЗУ позволит отыграть ещё парочку ячеек…
Почему не надо править F818 для стопа по старшему биту? Там же (на F922) обычный MSSG и он не останавливается по старшему биту, только по нулю.
оригинал подпрограммы вывода строкиCode: Select all
MSSG: LD A,(HL)
AND A
RET Z
CALL COUT_A
INC HL
JP MSSG
.
Да, если вместо оригинальной MSSG (F818) применить п/п-мму MSGH, которая делает стоп по взведённому старшему биту символа, то в оригинальном РК-мониторе это даёт выигрыш в пяток байтов (экономия в байтах = сколько вызовов MSSG минус 2).
Но если убрана директива X и G без стоп точки, то выигрывается совсем немного. Сейчас выиграю и этот байт. Так мало выигрывается потому, что после выкидыша ненужных сообщений про регистры, текстов в ПЗУ осталось слишком мало (всего четыре - TITR, TZABOJ, TCHSUM и TRIGHT). TRIGHT сейчас уже не нужен, т.к п/п RIGHT4 я заменяю на CR. Остаётся всего 3 текста, т.о выигрыш всего 1 байт.
В компьютерах из стран с чисто латинским алфавитом часто используется такой метод задания конца текстовой строки. Т.к у них 7-ми битовый ASCII. И даже в некоторых ассемблерах есть такой псевдо-оператор для задания текстовых строк, - аналог DEFB, но в последнем символе строки старший бит выставляется. Но у нас для КОИ-8 это не годится, потому и не распространилось. Я много раз использовал MSSG со стопом по биту D7=1 в CP/M и в прикладных программах, где много сообщений. В CCP CP/M в сочетании с RST это даёт выигрыш около 80 байт.
В CP/M Специалиста всё-равно нельзя использовать стандартный MSSG C818, т.к из-за того, что CONOUT в ПЗУ не векторизован, чтобы MSSG обслуживал искейп-коды (которые не обслуживаются ПЗУ), надо иметь свой MSSG. В РК86 изначально стоило использовать такой стоп в MSSG, т.к там семибитовость символов, а атрибуты запрещены.
Обычно, если не нужна КОИ-8 и нет сброса бита D7 в CONOUT, то стоп по биту D7 обходится в 7 байтов (см.ниже). Но для РК86, т.к там в COUT_A сбрасывается старший бит и рег.А сохраняется, стоп по взведённому биту D7 вводится ценой всего в 2 байта:
п/п-мма вывода строки со стопом по символу сCode: Select all
MSGH: LD A,(HL)
OR A
RET Z
CALL COUT_A
RLA
RET C
INC HL
JP MSGH
.
вывод текста по RST и стопом по символу с битом.
Дополнительный выигрыш (кроме экономии на стоп-байте) даёт отказ от загрузки указателя на адрес текста. Для этого подлежащий выводу текст ставят сразу после CALL или RST. Так делают в грамотных CP/M-программах. На RST_18 выигрывается 5 байтов на каждом сообщении. Это и при изучении исходников полезно, т.к текст сразу тут-же и не надо шариться по страницам (обычно тексты в конце), чтобы узнать, что за текст выводится. Но отладчик смешение кода и данных, путает. В CP/M вместо CALL RST_18 ставится RST $18, а вместо CALL SCOUTA ставится RST $10, т.к в CP/M в Zero Page под это дело специально резервированы ячейки 0008... ~005F (не до 007F, т.к CCP ставит стек на 0080).
Code: Select all
; Вывод текста прямо в коде со стоп байтом старшим битом
CALL RST_18
defb 13,10,'Hello World ','!' or 80H
....
RST_18: EX (SP),HL
JP TXLOOP
TXTOU1: CALL SCOUTA
TXLOOP: LD A,(HL)
INC HL
OR A
JP M,LASTSY
JP NZ,TXTOU1
EX (SP),HL
RET
LASTSY: AND 7FH
CALL SCOUTA
EX (SP),HL
RET
.
Paguo-86PK wrote:Разделительную запятую сменил на пробел - «D0 17F» работает
Заменить запятую на пробел разве проблема? В DOS желательно вводить вот такую командную строку:
--> S 0,1FFF MYPROG.COM
Чтобы и запятые принимались и пробелы (любое их число) и табуляция и ввод имени файла не вызывал ошибки. Ещё надо добавить ввод с клавиатуры символа $5F (подчёркивание).
Paguo-86PK wrote:barsik wrote:А как я могу проверить ваше ПЗУ, если Вы ни готовые коды своего улучшенного ПЗУ, ни его исходник, чтобы можно было самому странслировать, не выкладываете?
Кaк не выкладываю?
Где ? Дайте готовый дамп ПЗУ, пригодный, как для эмуляторов, так и для реала и демо-программу, что демонстрирует добавленные возможности. И объясните, что мы должны увидеть. Я до сих пор не понимаю в чём Вы хотите улучшить подпрограмму CONOUT F809. Я бы понял, если бы в эту п/п-мму добавили обслуживание искейп-кодов, реализующих оконность.
что означает оконность драйвера.
А так Вами объявлено, что добавляется оконность, но о реальной оконности даже нет речи. Оконность поддерживает так называемый текстовый графический интерфейс (это перекрывающиеся окна и окна меню с управляемой балкой подстветки в роли указателя).
При наличии оконности в драйвере вывода программист, например, вставляет лишь одну строку в своей программе, - макрокоманду OPEN с кучей параметров через запятую, а результирующий код задаёт окно, сохраняет его текущее содержимое в буфере, очищает окно иным цветом или инверсией, чертит двойную рамку по краю окна, выводит в рамке титр окна и в нём сообщение и ждёт реакции пользователя.
Всё это делается цепочками искейп-команд выкидываемых на CONOUT, которые обслуживают оконный драйвер. Точно также для открытия окна с меню создаётся массив имён строк выбора и вставляется макро-команда H_MENU или V_MENU. С таким драйвером писать программы в графическом интерфейсе совсем просто.
Если смысл вашей оконности заключается лишь в том, чтобы вывод символов не попадал вне окна, то это решается кодом в несколько десятков байтов (контроллирующем при каждом выводе попадание в окно и пересчитывающем оконные координаты в абсолютные). И нет смысла такой код вставлять в ПЗУ.
Paguo-86PK wrote:Существует
онлайн-эмулятор с ассемблером - вот туда мои патчи можно вставить и проверить…
Это убогий эмулятор, вместо отладчика предлагающий какую-то консоль. У меня от этого эмулятора прямо сейчас плоский монитор сдох (сейчас поставил другой плоский монитор, дефектный - чуть пониженная яркость вверху экрана). Единственная польза от этого онлайн-эмулятора - это скачать некоторые РК-игры и забыть. Но я даже скачать файлы не сумел. Как вывести данные из этого эмулятора на мой винчестер?
Вряд-ли кто-то захочет проверять ваши программы в этом онлайн-эмуляторе. Давайте нормальные коды, пригодные для приличных эмуляторов и реала. Да и зачем нам это проверять, читателей форумов вполне устроят скрин-шоты и рассказы о ходе работ.
Paguo-86PK wrote:Исходников нет. Одни заплатки в нескольких текстовых файлах… Но, рано или поздно, исходники будут - напишу.
Исходники читателям и не нужны, нужны готовые программы в виде кодов (а не экранных дампов). В 80-тые годы считалось неприличным просить исходник, это личное. Считалось, что если тебе надо, то покупай, или дизассемблер в помощь!
Paguo-86PK wrote:Какие дампы в XXI веке?
Так что же Вы их постоянно показываете в форумах. Как будто их кто понимает. А вот исходный текст на ассемблере читатели поймут, особенно, если он в привычной большинству читателей мнемонике и с комментарями.
Paguo-86PK wrote:Вставьте, транслируйте, залейте в память и нажмите «Reset». Затем набирайте «G0», «G1», «G2», «G3», «G4» - выше я описал эти точки демонстрации вьюпорта.
Непонятно, куда, как вставить, что транслировать, где набирать и вообще, я этот эмулятор больше не запущу, т.к у меня остался единственный плоский монитор (ещё пара кинескопных). Лучше показывайте скрин-шоты и расказывайте словами какая польза от ваших доработок.
Paguo-86PK wrote:Эмуляторы поддерживают мнемонику i8080
EMU и EMU80 поддерживают и Z80. Достаточно в конфиге заменить одно слово на Z80. А в EMU можно даже включить процессор 6502 или 8088 (жаль 6800 нельзя). В EMU80 мнемоника в отладчике переключается командой Z (но проще задать в конфиге процессор Z80 не используя в программах его доп.команды, тогда мнемоника сразу Z80).
Paguo-86PK wrote:Мне же удобна мнемоника x86…
У вас же нет конвертора мнемоник 8086 в мнемоники Z80/8080. Чтобы получить текст понятный всем придётся дизассемблировать коды полученные из под вашего компилятора x86/80.
Paguo-86PK wrote:Пока обойдусь браузерной эмуляцией/отладкой
Даже самым лучшим врачам психиатрам не удаётся излечить мазохизм. На вкус и цвет товарищей нет (пословица).
внутренние точки ПЗУ F800.
Я сохраняю только вот эти нестандартные точки. Возможно внутренних точек куда лезут программы привязанные к коду ПЗУ больше (но не намного). Это те, что мне мешали пользоваться какой-либо игрой. А сейчас при модификации директив D и M я убрал GETPRM (т.к её в моей редакции CCP вообще нет), а RIGHT4 (ВК и сдвиг курсора вправо) заменил просто на ВК. В принципе точки WARMST, CMPDH и GETLIN уже можно считать стандартными, их использовали часто, остальные лишь в единичных программах.
Code: Select all
WARMST 0F86CH ; горячий рестарт монитора
GETLIN 0F8EEH ; ввод строки символов в буфер ком.строки
GETPRM 0F92CH ; разбор ком.строки (конверсия в HEX-числа)
CMPDH 0F990H ; вычесть из HL DE, Z=1 если HL=DE, CY=1, если DE>HL
RIGHT4 0F9B0H ; на новую строку и курсор вправо на 4 позиции
PUSKVG 0FACEH ; настройка ВГ75 и ПДП на режим 64*25
HXDEBL 0FB78H ; на новую строку, вывод DE в HEX-виде и пробела
LDBYTE 0FB98H ; считать байт с МГ-ленты (на входе А=8 или 255)
WRBYTE 0FC46H ; вывести байт на МГ-ленту
LD_BAK 0FCA4H ; точка выхода из МГ-подпрограмм (это только для EMU)
CONIN 0FE63H ; ввод символа с клавиатуры (это только для EMU80)
.