nedoPC.org

Electronics hobbyists community established in 2002
Atom Feed | View unanswered posts | View active topics It is currently 25 Apr 2024 10:15



Reply to topic  [ 204 posts ]  Go to page Previous  1, 2, 3, 4, 5, 6, 7, 8 ... 14  Next
Paguo-86PK - XXI BEK 
Author Message
Maniac
User avatar

Joined: 12 Apr 2011 20:43
Posts: 267
Location: Tashkent
Reply with quote
barsik wrote:
Вы изобрели уникальный метод для пропуска незадействованных в директивах букв с помощью битовой маски. Возможно, это новое слово в разработке компактных мониторов.
Bсё иронизируете? :mrgreen:
barsik wrote:
Может быть попробую эту идею, если она даст реальную экономию (я на днях освободил в ПЗУ еще 5 байтов, теперь 214 свободно, но ещё десяток свободных байт не повредит).
Мне страшно представить, что там от РК осталось :o
barsik wrote:
Всегда хотел посчитать, сколько директив минимум, когда табличный метод начинает окупаться. При малом числе букв цепочка непосредственных сравнений и джампов по объёму кода даёт выигрыш над табличным методом.
Меня это тоже интересовало! Когда сегодня написал код, понял, что ещё один-два адреса директив можно вставить…
Кстати, код выше я писал наобум и не проверяя, так как из-за бессонницы начал ковырять дамп ментально… Не выдержал, включил компьютер и набил тот код в стиле Z80. Сейчас перевёл в эмулятор - сбой!
 Вот отлаженный вариант для проверки эмулятором онлайн
Code:
        ORG     0F883H
        LDA     07633H                  ; Читаем букву директивы
        SBI     03FH                    ; Выравниваем под таблицу
        MOV     C,A                     ; Сохраняем в счётчик
        MVI     A,0C9H                  ; Маска для __CD_FG_
        LXI     HL,0648EH               ; Маска для I__LM_OP и _RST___X
        LXI     DE,DIRECTIVES_TABLE
DIRECTIVES_SCAN:
        DAD     HL                      ; Прокручиваем все 24 бита
        ADC     A                       ; маски влево
        JZ      0F000H                  ; Маска опустела - неявный U
        DCR     C                       ; Перебираем весь алфавит
        JC      DIRECTIVES_SCAN         ; пропуская маскированные литеры
        JZ      DIRECTIVES_EXEC         ; Директива найдена - вызовем её
        INX     DE                      ; Иначе перемещаемся по
        INX     DE                      ; таблице указателей
        JMP     DIRECTIVES_SCAN         ; и продолжаем поиск
DIRECTIVES_EXEC:
        XCHG                            ; Считаем адрес
        MOV     E,M                     ; кода директивы
        INX     HL                      ; из таблицы
        MOV     D,M                     ; двумя байтами
        PUSH    D                       ; и сохраним в стеке
        CALL    0F92CH                  ; Читаем все 4 аргумента
        MOV     A,L                     ; Аргумент #4 в аккумуляторе
        LHLD    0762BH                  ; Читаем третий аргумент
        MOV     C,L                     ; и сохраняем его
        MOV     B,H                     ; в паре B C
        LHLD    07629H                  ; Читаем второй аргумент
        XCHG                            ; и сохраняем в D E
        LHLD    07627H                  ; Читаем первый аргумент в H L
        RET                             ; Передаём управление коду директивы
DIRECTIVES_TABLE:
        DW      0F9D7H,0F9C5H,0F9EDH,0FA3FH     ; C D F G
        DW      0FA86H,0FA08H,0FA26H,0FB2DH     ; I L M O
        DW      0F86CH,0FA68H,0F9F4H,0F9FFH     ; P R S T
        DW      0FFD3H                          ; X
        ; RESERVED
        DB      076H,076H,076H,076H     ; Здесь образовалась область
        DB      076H,076H,076H,076H     ; резервных ячеек под какой-нибудь
        DB      076H,076H               ; полезный код
        ORG     0FA68H
DIRECTIVE_R:
        OUT     080H                    ; Теперь в порт "A" ППА клавиатуры выдаётся
        MVI     A,090H                  ; четвёртый аргумент, даже если и не нужно
        OUT     0A3H
DIRECTIVE_R_LOOP:
        SHLD    0A001H
        IN      0A0H
        STAX    BC
        INX     BC
        CALL    0F999H  ; CMP_HL_DE_LOOP
        JMP     DIRECTIVE_R_LOOP
        ORG     0F957H
        NOP                             ; Глушим переход на недоумение Монитора
        NOP                             ; тремя "холостяками"
        NOP                             ; чем открываем ввод четвёртого аргумента
Тем самым, ответ - 11 директив!
То есть, до двенадцатой директивы экономия таблицей невозможна…
barsik wrote:
Но если все нужные буквы в начале алфавита и таблицу переходов укоротить (лишь для букв C...T), то будет экономия уже при меньшем числе директив.
Нажмите тут F4 - тут я полное имя директивы выводил таблицей из 26 WORD'ов, так как первая буква печатается эхом с клавиатуры, а остальные три буквы - хранятся 5 битами в WORD.
(К сожалению, версия эмулятора на сайте подбитая и гонит: Квадратиков быть не должно, так как это просачивается код FF от опроса клавиатуры…)
barsik wrote:
Вы собираетесь использовать 13 директив: C D F G I L M O P R S T X (к стандартным 12-ти, не считая U, Вы добавили P).
Ещё 25 лет назад я задавался вопросом, для чего нужна «U» с переходом на F000, если F000 запускается по любой другой букве. Потому здесь «U» у меня и не включена.
Вообще, подозревал всегда, что сам автор МОНИТОРа по F000 не отдельную оболочку хотел запускать, а разместить там продолжение разбора остальных директив.
Сейчас я вообще ничего не понимаю…
barsik wrote:
Хотя X сразу надо выкинуть, а директива G сокращается до одного байта [ JP (HL) ].
Подзабыли, что «G» я доработал и вместо «Goto» получился «Gosub»: По «X» я менял регистры и по «GF809» проверял свою подпрограмму вывода символа… :mrgreen:
barsik wrote:
Директива L не нужна, если Вы доработаете D до ASCII (да и без доработки не нужна).
Доработал, но не втиснул…
barsik wrote:
Директива S тоже никем не используется.
Бывают случаи…
barsik wrote:
Для реальной жизни достаточно оставить директивы: I, O, D, M, T, F, R. И, может быть, полезно добавить директиву V (Verify) - проверка МГ-записи путём сравнения записи на МГ-ленте с кодом в ОЗУ.
Вот «I»/«O»/«V» я не буду трогать - подпрограммы реального времени отлаживаются сложно и в рамках эмулятора ковырять их опасно :neutral:
barsik wrote:
Кстати, освободив место в ПЗУ, можно встроить директивы I/O работающие без гашения экрана (для этого придётся кракнуть коммерческую защиту и выдрать оттуда процедуру чтения работающую без гашения, а вот процедуру записи придётся писать по образцу, т.к инсталляторов многоблочных защищённых от копирования МГ-программ, естественно, не распространялось).
Если Вам это под силу! Я тоже хотел бы такое иметь в ПЗУ, с тех пор, как здесь узнал про игры с подобными загрузчиками…
barsik wrote:
Что позволяет иметь оверлейные из ROM-диска директивы.
Вот потому я и надрывался, чтобы переключать страницы РФ2 без лишних сигналов/проводков!
Нужно будет снова пересмотреть всю номенклатуру ТТЛ и выискать наиболее подходящие регистры/счётчики под это…
Пусть даже редчайшие буржуйские… :roll:
barsik wrote:
В минимуме нужна всего лишь одна директива - I с автозапуском. Ну и для порядка директива G. Если G не надо, то монитор вырождается в загрузку и старт по сбросу, как в Специалисте в минимальном варианте (когда в нём стоит всего одна РФ2 с загрузчиком).

Тогда, если ROM-диска нет, то по сбросу выводится титр и сообщение "НАЖМИ КЛАВИШУ ДЛЯ НАЧАЛА ЗАГРУЗКИ". И пользователь нажимает на клавишу, когда услышит в динамике магнитофона начало пилотона.
Всё это я проходил уже на «ПОИСКе», пока НГМД не добыл…
barsik wrote:
Кстати, директиву U при наличии расширяющего ПЗУ на F000 полезно заменить на пробел. Тогда все директивы, что должны обрабатываться в ПЗУ F000
А пробел и так вызывает F000 в оригинале: Нажмите ПРОБЕЛ с параметрами… :mrgreen:
По F000 обычно вспомогательный МОНИТОР или какая-то DOS может размещаться. А так как кроме «U» и все остальные директивы туда ссылаются, необходимо крепко подумать…


24 Jan 2020 07:03
Profile WWW
Doomed
User avatar

Joined: 19 Feb 2017 03:46
Posts: 583
Location: Санкт-Петербург, Россия, третья планета от Солнца, галактика Млечный Путь
Reply with quote
Post 
Paguo-86PK wrote:
barsik wrote:
Вы изобрели уникальный метод для пропуска незадействованных в директивах букв с помощью битовой маски.
Bсё иронизируете?
И в мыслях не было. Битовые маски обычно используют, чтобы фиксировать занятость членов в множествах (в частности для этого служит Allocation Table в CP/M и VTOC в Apple-DOS 3.3 и RK-DOS). Но я никогда не встречал их применения в CCP для таких целей. Скорее всего никто в мире так их ещё не использовал.
Paguo-86PK wrote:
barsik wrote:
на днях освободил в ПЗУ еще 5 байтов, теперь 214 свободно
Мне страшно представить, что там от РК осталось
Да нет, за модификацию кода я ещё и не брался. Весь код Попова и Зелёнко сохранён в неизменности. ~90 байтов освободились от удаления директивы X и стоп-точки в директиве G. Остальные байты выиграны удалением лишнего по мелочи (типа замены CP 0 на OR A; LD A,0 на XOR A; CP FF на INC A; устранение дублирования, ненужных JMP-ов, использование полезного содержимого регистров после п/п-мм, типа А=0 после MSSG, и т.п).
Paguo-86PK wrote:
автор РК МОНИТОР-а по F000 не отдельную оболочку хотел запускать, а разместить там продолжение разбора остальных директив.
Это ясно, но это не отменяет того, что и DOS может располагаться в том же ПЗУ F000 и добавленные директивы, (что в этом ПЗУ F000) могут быть командами DOS (записать/удалить/загрузить/переименовать). Использование CCP монитора в качестве замены CCP DOS экономит объём кода (хотя и ограничивает команды DOS одной буквой).

Правда RK-DOS 1.0 что стояла на F000 не использовала CCP монитора (т.к у Микроши нет в ПЗУ расширяющей команды JMP F000), там вынужденно был свой CCP, но подпрограммы GETLIN и GETPRM (т.е ввод строки и конверсия символьных параметров в HEX-значения) использовались мониторовские. Потому в RK-DOS 1.0 и было всего 4 директивы: C- Catalog, S- Save, L- Load и F- Format.

Кстати, Вы можете посмотреть для чего люди 30 лет назад ставили в РК86 второе ПЗУ F000, - на архивных сайтах есть РК-монитор размером в 4 кб.
Paguo-86PK wrote:
А пробел и так вызывает F000 в оригинале
Не совсем так. Да, по ошибке, т.е если первая буква директивы не из числа резидентных 12, то происходит уход на F000. Но при этом не меняя CCP мы не можем в качестве доп.директив использовать те же буквы, например D для DIR, S для SAVE, т.к они уже резидентны и по ним переход на исполнительную часть уже происходит по коду ранее.

Если просто вводить пробел, а затем, например, команду S100,1FFF<ВК>, то до F000 управление даже не дойдёт, т.к буква S это не HEX-цифра и подпрограмма GETPRM выскочит на ошибку. Потому надо в CCP ввести подпрограмму SKIP, которая пропускает пробелы в начале ком.строки. Тогда на обслуживание резидентных команд и правильную конверсию в HEX-числа лидирующий пробел в ком.строке не повлияет. Но т.к цепочкой сравнений анализируется байт взятый по LD A,(COMBUF), т.е из самого первого байта буфера ком.строки, то команды начинающиеся с пробела не вызовут исполнения, даже если они содержат буквы резидентных команд (C,S,T,D,I,O...), потому что буквой команды будет считаться пробел. А также благодаря SKIP подпрограмма конверсии текста в HEX-цифры сработает правильно загрузив ячейки 3-х параметров и 3 пары регистров. Решается задача, чтобы и подпрограмма конверсии текста в HEX-значения сработала и чтобы буквы уже занятые резидентно можно было использовать в расширении монитора.

Уходить на F000 программа должна только если первый символ команды именно пробел (а не любая буква). И перед уходом на F000 монитор должен проверить, что на F000 стоит JMP F836 (иначе на F000 нет ни ПЗУ F000, ни дубля ПЗУ F800, что бывает без дешифратора или большого ПЗУ).

Если же просто уходить на F000 по пробелу или другой свободной букве, используя её как префикс, то возможна только одна команда, т.к нельзя передать букву доп.команды в F000. GETPRM, что делает конверсию текста в числа (если МНИП, вроде аналог оператора VAL$ в бейсике) в РК86 неудачная, хотя и короткая. Лучше эта п/п-мма - у А.Волкова в первом мониторе Специалиста (что на 8D00) и у Орлова в его мониторе Специалиста.
Paguo-86PK wrote:
«G» я доработал и вместо «Goto» получился «Gosub»
Не знаю о чём это, но все директивы «G» во всех мониторах всех компьютеров делают уход по CALL. Там в стеке адрес WARM START (F86C) и делается JP (HL). В регистрах DE, BC могут передаваться параметры.


Last edited by barsik on 24 Jan 2020 17:12, edited 2 times in total.



24 Jan 2020 13:46
Profile
Maniac
User avatar

Joined: 12 Apr 2011 20:43
Posts: 267
Location: Tashkent
Reply with quote
barsik wrote:
И в мыслях не было. Битовые маски обычно используют, чтобы фиксировать занятость членов в множествах (в частности для этого служит Allocation Table в CP/M и VTOC в Apple-DOS 3.3 и RK-DOS). Но я никогда не встречал их применения в CCP для таких целей. Скорее всего никто в мире так их ещё не использовал.
Eсть мысль сократить число директив до пограничного минимума - 11.
Так как моя подпрограмма печати символа использует «шагалку» по строкам, я её хочу вынести за пределы пространства кода печати:
 Моя шагалка на ±78 символов
Code:
UP_DOWN:PUSH BC     ; B C - Y2 X2 вьюпорта
        SBB  A,A    ; CF:0 - шаг вниз, 1 - шаг вверх
        LD   B,A    ; B = CF ? -1 : 0
        XOR  A,04Eh ; Ширина строки ВГ75 - 78 символов
        SUB  A,B    ; A ^ 0xFF ^ 78 - 0xFF = NEG 78
        LD   C,A    ; A = CF ? -78 : 78
        ADD  HL,BC  ; Приращиваем к указателю
        LD   A,B    ; Теперь нужно сместить позицию по Y
        ADD  A,A    ; D += B * 2 + 1
        INC  A
        ADD  A,D
        LD   D,A
        POP  BC
        RET         ; Итого - 15 байтов
Удивительно, но увеличив её на два байта, можно добиться полной универсальности:
 Шагалка на любое число символов
Code:
UP_DOWN:PUSH BC     ; B C - Y2 X2 вьюпорта
        SBB  A,A    ; CF:0 - шаг вниз, 1 - шаг вверх
        LD   B,A    ; B = CF ? -1 : 0
        LD   A,(COLS)
        XOR  A,B    ; Ширина строки ВГ75 - в служебной ячейке
        SUB  A,B    ; A ^ 0xFF ^ 78 - 0xFF = NEG 78
        LD   C,A    ; A = CF ? -78 : 78
        ADD  HL,BC  ; Приращиваем к указателю
        LD   A,B    ; Теперь нужно сместить позицию по Y
        ADD  A,A    ; D += B * 2 + 1
        INC  A
        ADD  A,D
        LD   D,A
        POP  BC
        RET         ; Итого - 17 байтов
Тем самым, чтобы мои «FD FD FD» по F803…F82F работали, получим ячейки под FDFD…FE00 таким образом, что откроет мне перспективы унификации селекторного перехода к API, но только в рамках МОНИТОРа, который должен быть в составе страниц «Супер-РФ2» с функциями работы с файлами, о чём я выше думал…
В рамках же просто «продвинутого Монитора» эти FD-шки ни к чему…
Если «заставку Windows» переместить, а «шагалку» вписать на то место, то резервные ячейки, из-за перемещения проверки Escape-последовательности на место «шагалки» в тело кода печати, дадут некий выигрыш… Сейчас нужно проверить, какой…
barsik wrote:
Не так. Да, по ошибке, т.е если первая буква директивы не из числа резидентных 12, то происходит уход на F000. Но при этом не меняя CCP мы не можем в качестве доп.директив использовать те же буквы, например D для DIR, S для SAVE, т.к они уже резидентны и по ним переход на исполнительную часть уже происходит по коду ранее.

Если просто вводить пробел, а затем, например, команду S100,1FFF<ВК>, то до F000 управление даже не дойдёт, т.к буква S это не HEX-цифра и подпрограмма GETPRM выскочит на ошибку.
Потому что в оригинале сначала читаются аргументы, а потом уже исследуется буква директивы…
Если бы мой код проверили практически, то заметили бы, что в нём иное поведение… :ewink:


24 Jan 2020 15:43
Profile WWW
Doomed
User avatar

Joined: 19 Feb 2017 03:46
Posts: 583
Location: Санкт-Петербург, Россия, третья планета от Солнца, галактика Млечный Путь
Reply with quote
Post 
Paguo-86PK wrote:
Если бы мой код проверили практически, то заметили бы, что в нём иное поведение
А как я могу проверить ваше ПЗУ, если Вы ни готовые коды своего улучшенного ПЗУ, ни его исходник, чтобы можно было самому странслировать, не выкладываете? Правильно выкладывать коды или исходники плюс описание, где подробно описано, что изменено или добавлено/убавлено.

Что толку от дампов каких-то коррекций? Кому охота вручную вбивать эти дампы. Да и зачем? Пока нет окончательного релиза вашего нового ROM-BIOS просто раскажите, что даёт та или иная мелкая коррекция. Хотя в очередной раз упомяну, что модернизировать программы отладчиком раз в сто менее эффективно, чем нормальным способом.

Для маленьких патчей программ поставляют отдельные программки - запускаешь такую программку и она изменяет коды (предварительно убедившись по КС, что это тот код, для коррекции которого она предназначена).
Paguo-86PK wrote:
Вот директивы I/O/V я не буду трогать - подпрограммы реального времени отлаживаются сложно и в рамках эмулятора ковырять их опасно
Директивы V в РК нет (есть в Специалисте). В эмуляторе с перехватом МГ-подпрограмм ничего не отладить, т.к коды этих п/п-ммы там не прогоняются вообще. Но в обоих эмуляторах есть ввод из WAV. Но похоже это работает не точно, т.к есть WAV МГ-записи, что вводятся в реале, а в эмуляторе нет.

Что значит трогать? - Менять логику работы? Или просто сдвинуть на более удобное место? И в чём проблема, если даже чуть изменить, не меняя алгоритм? Что изменится, если вместо LD A,0 поставить XOR A. Понятно, что 4 POP-а, что там стоят для регенерации ОЗУ убирать не надо или переделывать двухфазку в двухчастотку.

Вообще при модификациях код можно двигать, если сохранять лишь 11 внутренних точек (это 8 вх.точек для идиотов и точки для эмуляторов). Хотя может быть их даже больше, т.е возможно есть ещё игры идиотов, что лезут на неучтённые мной внутренние точки. Например, меня удивляет, что на точку @LDIR я не встречал игр, а должны бы быть. Чаще всего используют CMPDH, GETLIN и PUSK_VG. Если CMPDH, GETLIN ещё понятно, но на внутреннюю точку PUSK_VG зачем лезть, если эта точка включающая видео выведена в стандартные входы (F82D)? Как будто 6 МКСЕК (время прогона команды JMP) спасут программу этого программиста дилетанта.

А относительно эмуляторов достаточно знать как задать точки перехвата в конфиге. У EMU например, задаются точки входа в LDBYTE/SVBYTE и точки выхода (байты RET) из них. Если Вы эти точки сдвинули, так посмотрите адреса в листинге трансляции и откорректируйте конфиг. Или проще, всегда подгоняйте эти адреса под адреса оригинала.
Paguo-86PK wrote:
Потому что в оригинале сначала читаются аргументы, а потом уже исследуется буква директивы
Это естественно, как может быть обратный порядок? Если сразу уходить по букве на исполнение, то надо в каждую директиву вставлять вызов подпрограммы конверсии текстовой строки с параметрами в их значения (GETPRM или DC16).

Я писал о том, что чтобы ввести префикс, служащий для переадресации директив в доп.ПЗУ F000 и одновременно использовать имеющуюся подпрограмму конверсии текстовых параметров в HEX-числа, надо убрать позиционность. Как я упоминал выше в оригинале подпрограмма конверсии, начинает разбор сразу за буквой директивы, т.е с адреса BUFCOM+1. А когда добавляется префикс (например, пробел), то это попадает на букву команды и получается ошибка, в лучшем случае, вводится ошибочное первое число. Кстати, все мониторы, кроме РК-шного прекрасно воспринимают ввод более, чем 4-х HEX-цифр, - берутся 4 последних (например, при вводе 123456, параметр будет 3456H), а РК-шная процедура GETPRM это не допускает.

Потому вчера, когда я заменил две директивы D и M на аналогичные директивы от Специалиста (т.к они более удобные), то одновременно заменил и GETLIN и подпрограмму конверсии текстовых параметров в двоичные.

Вот посмотрите как просто и красиво в мониторе Специалиста делается конверсия текстовых параметров в двоичные значения (а аналогичная РК-п/п-мма GETPRM просто уродлива). И пробелы пропускаются и разделитель может быть как запятая, так и пробел. И посмотрите, что делает эта п/п-мма. Она вводит один параметр до разделителя и кладёт его в стек. Если указатель дошёл до стоп-байта 13, то в стек уходит 0 (нет параметра). Таким образом вводятся 4 параметра, но при желании можно вводить и 44 параметра (лишь бы стека хватало).

 
Code:
DC16:   LD      HL,0             ; ВХОД: BC- адрес строки с параметрами
        CALL    DC161
        EX      DE,HL
        LD      (HL),E
        INC     HL
        LD      (HL),D
        INC     HL
        EX      DE,HL
        EX      (SP),HL
        JP      (HL)

; ----------------------------------------------

DC163:  LD      H,0FFH
DC161:  LD      A,(BC)
        CP      13
        RET     Z
        INC     BC
        CP      ','
        RET     Z
        CP      20H
        RET     Z
        INC     H
        JP      Z,DC163

        DEC     H
        CALL    DC8
        JP      C,DC163

        ADD     HL,HL
        ADD     HL,HL
        ADD     HL,HL
        ADD     HL,HL
        ADD     A,L
        LD      L,A
        JP      DC161

; ----------------------------------------------

; ПЕРЕВОД СИМВОЛОВ 0...9 или A...F В HEX-значение

DC8:    SUB     30H             ; ВХОД: A= введенный символ
        RET     C               ; ВЫХОД: CY=1,если ошибка
        CP      10
        CCF
        RET     NC
        CP      11H             ; 'A'-30H
        RET     C
        SUB     7
        CP      10H
        CCF
        RET
.


24 Jan 2020 17:25
Profile
Maniac
User avatar

Joined: 12 Apr 2011 20:43
Posts: 267
Location: Tashkent
Reply with quote
barsik wrote:
Да не 5 ячеек выигрывается, а 205
Типa вот такого?
Code:
     .0 .1 .2 .3 .4 .5 .6 .7 .8 .9 .A .B .C .D .E .F
F9C5 .. .. .. .. .. CC 78 FB CD B9 F9 CD 96 F9 E6 0F <- в директиве D
F9D0 C3 C5 F9 <- -- -- -> cccccccccccccccccccccccccc <- 4 ячейки освободили
F9E0 cccccccccccccccccccccccccccccccccccccc ffffffff <- здесь директивы C и F
F9F0 fffffffffff ssssssssssssssssssssssssssssssss tt <- здесь директивы S и T
FA00 ttttttttttttttttttttttt CC 78 FB 7E D6 20 FE 60 <- здесь директива L,
FA10 3E 2E D2 16 FA 7E CD B9 FC CD 96 F9 E6 0F C3 08 <- в которой можно
FA20 FA <- -- -- -- -> .. .. .. .. .. .. .. .. .. .. <- освободить 5 ячеек
Здесь я освободил 9 ячеек. Но если удалить/переместить директивы C/F/S/T, то освободится ещё 49 ячеек.
Можно сделать одну комбинированную директиву D:
  • «D100» работает как «M100»
  • «D100,109» работает стандартно
Если тут чуток доработать:
Code:
     .0 .1 .2 .3 .4 .5 .6 .7 .8 .9 .A .B .C .D .E .F
F8DC .. .. .. .. .. .. .. .. .. .. .. .. 7B BD CA F1
F8E0 F8 2B E5 21 9E FF CD 21 F9 E1 C3 F3 F8 21 33 76
F8F0 5D 06 00 CD 63 FE FE 08 CA DC F8 FE 7F CA DC F8
F900 FE 1B CA 6C F8 FE 77 FE 0D CA 1A F9 CD B9 FC 43
F910 3E 52 BD CA AE FA 23 C3 F3 F8 90 11 33 76 06 00
F920 C9 F8 7E 23 A7 C8 CD B9 FC C3 21 F9 .. .. .. .. <- Текст завершается 0 или >127
И F818 править не обязательно, печать текста будет иметь терминацию по 00 или >7F (как Бейсик-токены), а это в ПЗУ позволит отыграть ещё парочку ячеек…
Code:
<<<- было ->>> | <<< стало >>>
08 20 08 00    - 08 20 88
18 18 18 18 00 - 18 18 18 98
2D 2D 3E 00    - 2D 2D BE
barsik wrote:
А как я могу проверить ваше ПЗУ, если Вы ни готовые коды своего улучшенного ПЗУ, ни его исходник, чтобы можно было самому странслировать, не выкладываете?
Кaк не выкладываю? :esurprised:
Существует онлайн-эмулятор с ассемблером - вот туда мои патчи можно вставить и проверить…
Нужно лишь онлайн проверить, оценить, а затем сделать замечания, что где-то кривовато получилось… :mrgreen:
barsik wrote:
Правильно выкладывать коды или исходники плюс описание, где подробно описано, что изменено или добавлено/убавлено.
Код ПЗУ? Бинарник я выше выкладывал…
Исходников нет. Одни заплатки в нескольких текстовых файлах…
Тем более, комментариев нет, так как всё очень сырое…
barsik wrote:
Что толку от дампов каких-то коррекций? Кому охота вручную вбивать эти дампы. Да и зачем?
Какие дампы в XXI веке‽ :lol:
Я давал маленький дампик под ВГ75 и всё…
barsik wrote:
Пока нет окончательного релиза вашего нового ROM-BIOS просто раскажите, что даёт та или иная мелкая коррекция. Хотя в очередной раз упомяну, что модернизировать программы отладчиком раз в сто мнее эффективно, чем нормальным способом.
Да, пока нет…
Вернее, я тупо из онлайн-эмулятора выдрал снимок памяти пропатченного ПЗУ и выложил тут, предварительно проверив в Emu80/3000.

Ниже выкладываю патч текстом для вставки в ассемблер онлайн-эмулятора.
Вставьте, транслируйте, залейте в память и нажмите «Reset».
Затем набирайте «G0», «G1», «G2», «G3», «G4» - выше я описал эти точки демонстрации вьюпорта.
Что в патче:
  • Разделительную запятую сменил на пробел - «D0 17F» работает (непривычно, неудобно)
  • Вместо точки теперь АР2 (в эмуляторе - Левый Alt+0) (быстро привык)
  • Теперь ширина экрана определяется ячейкой 7722h - «M7722» с байтом «4D» устроит перекос скроллинга и всего

Предвосхищая Вашу критику, скажу, что это всё - лишь заготовки.
Так как я сижу на форумах и в гугле, одна из закладок - эмулятор, чтобы в промежутках вносить разные изменения, не запуская разные программы. Это очень удобно! В случае краха - просто жму F5…
Чтобы выложить исходники, их нужно написать/переписать.
Вы советуете мнемонику Z80.
Эмуляторы поддерживают мнемонику i8080.
Мне же удобна мнемоника x86…
Из-за чего я ещё не определился, с какого края подходить к написанию полного текста…

Но, рано или поздно, исходники будут - напишу.
Пока - проверяем заплатки онлайн!

P.S.: Может моя версия - тупиковая и медленно двигается к краху?
Пока обойдусь браузерной эмуляцией/отладкой поэтому :roll:


Attachments:
File comment: Патч для использования онлайн-эмулятором
Windows86.zip [4.95 KiB]
Downloaded 214 times
File comment: Бинарник для Emu80/3000
подмените им RK86.32K

Windows86_32Kb.zip [1.88 KiB]
Downloaded 255 times
File comment: Бейсик-демонстрация для Emulator-3000
Запустите Run'ом
Набирайте List
Переключайте режимы Cont'ом

Windows86-Demo.rar [7.61 KiB]
Downloaded 212 times
24 Jan 2020 19:15
Profile WWW
Doomed
User avatar

Joined: 19 Feb 2017 03:46
Posts: 583
Location: Санкт-Петербург, Россия, третья планета от Солнца, галактика Млечный Путь
Reply with quote
Post 
Paguo-86PK wrote:
Текст завершается 0 или >127. И F818 править не обязательно, печать текста будет иметь терминацию по 00 или >7F (как Бейсик-токены), а это в ПЗУ позволит отыграть ещё парочку ячеек…
Почему не надо править F818 для стопа по старшему биту? Там же (на F922) обычный MSSG и он не останавливается по старшему биту, только по нулю.

 оригинал подпрограммы вывода строки
Code:
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 байта:

 п/п-мма вывода строки со стопом по символу с D7=1
Code:
MSGH:   LD      A,(HL)
        OR      A
        RET     Z
        CALL    COUT_A
        RLA
        RET     C
        INC     HL
        JP      MSGH
.

 вывод текста по RST и стопом по символу с битом D7=1
.
Дополнительный выигрыш (кроме экономии на стоп-байте) даёт отказ от загрузки указателя на адрес текста. Для этого подлежащий выводу текст ставят сразу после 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:
; Вывод текста прямо в коде со стоп байтом старшим битом

        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:
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)
.


25 Jan 2020 06:26
Profile
Doomed
User avatar

Joined: 19 Feb 2017 03:46
Posts: 583
Location: Санкт-Петербург, Россия, третья планета от Солнца, галактика Млечный Путь
Reply with quote
Post 
Т.к доработки ПЗУ в этой теме выкладываются в виде никому непонятных дампов, я всё-же заинтересовался c чего бы вдруг MSSG у Вас будет работать со стопом по выставленному старшему биту символов. После долгой возни узнал, что всё-же модификация в MSSG для этого нужна, а фраза о ненужности для этого модификаций в п/п-мме F818 была ложной.

Т.к читать в кодах я не умею, мне пришлось скопировать выложенный дамп, вставить его в текстовый редактор, вручную отредактировать дамп в DEFB строки ассемблера, дополнить обрамлением, затем странслировать макро ассемблером, отлинковать и полученный DAT-файл загрузить в IDA и затем дизассемблировать и текст фрагмента сохранить в виде ASM-текста. Затем отредактировать его и только тогда получается возможность его изучать.

Разве можно такое выкладывание для ознакомления читателям считать нормальным? Когда надо потратить, как минимум полчаса для каждого фрагмента, чтобы привести данные в воспринимаемый обычным человеком вид. На мой взгляд это не нормальное выкладывание в форуме, а граничит с издевательством. Типа, я могу читать в кодах, а вы все дураки, если это не умеете... В общем в итоге я получил вот такой фрагмент. Это оказались немного модифицированные п/п-ммы GETLIN и MSSG.

Code:
GETLIN: LD      HL,COMBUF
        LD      E,L
LOOP1:  LD      B,0
LOOP2:  CALL    CONIN
        CP      8
        JP      Z,ZABOJ
        CP      7FH
        JP      Z,ZABOJ
        CP      27
        JP      Z,WARMST
        CP      77H             ; зачем это ?
        CP      13
        JP      Z,DONE
        CALL    COUT_A
        LD      B,E
        LD      A,low COMBUF+31
        CP      L
        JP      Z,ERROR
        INC     HL
        JP      LOOP2

DONE:   SUB     B               ; 0DH-33H --> CY=1 или 0DH-0 --> CY=0
        LD      DE,COMBUF
        LD      B,0
        RET     

ZABOJ:  LD      A,E
        CP      L
        JP      Z,LOOP1
        DEC     HL
        PUSH    HL
        LD      HL,TZABOJ
        CALL    MSGH
        POP     HL
        JP      LOOP2
       
TZABOJ: defb    8, 32, 8 or 80H

MSGH:   RET     M
        LD      A,(HL)
        INC     HL
        AND     A
        RET     Z
        CALL    COUT_A
        JP      MSGH
.

Во-первых, сразу видно насколько написание программ отладчиком неэффективно и подвержено ошибкам (здесь ошибочно вставлена команда CP 77H). Кстати, вот так экономим два байта на загрузке в DE адреса COMBUF:

Code:
GETLIN: LD      HL,COMBUF
        LD      D,H
        LD      E,L
LOOP1:  LD      B,0
LOOP2:  CALL    CONIN
        CP      8
        JP      Z,ZABOJ
        CP      7FH
        JP      Z,ZABOJ
        CP      27
        JP      Z,WARMST
        CP      13
        JP      Z,DONE
        CALL    COUT_A
        LD      B,E
        LD      A,low COMBUF+31
        CP      L
        JP      Z,ERROR
        INC     HL
        JP      LOOP2

DONE:   SUB     B               ; 0DH-33H --> CY=1 или 0DH-0 --> CY=0
        LD      B,0             ; это лишнее (см.ниже про п/п-мму GET_HL)
        RET     

Ещё один байт выигрывается, если (во второй строчке снизу в предыдущем фрагменте) убрать загрузку регистра B нулём, а сделать это в п/п-мме GET_HL (что стоит на $F95A в оригинале), где первой командой в HL загружается 0000. После неё надо вставить команду LD B,H, что также загружает 0 в регистр B, но с экономией в 1 байт.

Зато из MSGH видно, что ваш вариант на 1 байт короче, а я не сообразил, что не только регистр А сохраняется в п/п-мме COUT_A, но и флаги, и потому сдвигать, чтобы узнать бит D7 излишне. Уже польза от потраченного на дизассемблирование дампа времени.

Кстати, команду AND A, чтобы узнать флаги программисты применяют реже, чем OR A. Это конечно, кто как привык, но мне AND A сразу не даёт подсказку, что это тест для получения флагов (т.к AND всегда используют для маскирования битов). Потому я всегда заменяю AND A на OR A.


25 Jan 2020 21:36
Profile
Maniac
User avatar

Joined: 12 Apr 2011 20:43
Posts: 267
Location: Tashkent
Reply with quote
barsik wrote:
Для этого подлежащий выводу текст ставят сразу после CALL или RST. Так делают в грамотных CP/M-программах. На RST_18 выигрывается 5 байтов на каждом сообщении.
Мoя демка окон так и работает… В ней RST_0 служит для печати текста и вызова подпрограмм МОНИТОРа.
Да, именно RST_0, так как она проверяет по указателю стека горячий/холодный ли вызов? А так как у МОНИТОРа SP > 7600, а приложения устанавливают SP < 75FF, то RST_0 - самая медленная подпрограмма, так как печать текста впопыхах не нужна!
barsik wrote:
Т.к доработки ПЗУ в этой теме выкладываются в виде никому непонятных дампов, …
Вoт здесь меня обнадёжили тем, что мою интеллектуальную собственность с первого захода никто ковырять и не станет…
barsik wrote:
я всё-же заинтересовался c чего бы вдруг MSSG у Вас будет работать со стопом по выставленному старшему биту символов. После долгой возни узнал, что всё-же модификация в MSSG для этого нужна, а фраза о ненужности для этого модификаций в п/п-мме F818 была ложной.
Она не нужна, так как подпрограмма неверно воспринята:
Code:
    ORG  0F921H
; Подпрограмма печати ascii-текста
; с пре-терминацией по нулю
; и пост-терминацией по биту #7
MSGH_LOOP:         ; Точка пост-входа
    RET  M         ; Возврат, если установлен бит #7
MSGH:              ; Реальная точка входа в подпрограмму (F922)
    LD   A,(HL)    ; Читаем ascii-код
    INC  HL        ; и сразу сдвигаем указатель
    OR   A,A       ; подготовим флаги
    RET  Z         ; Конец, если ноль
    CALL COUT_A    ; Выводим очередной символ строки
    JMP  MSGH_LOOP ; Теперь - пост-проверка
; Указатель HL лучше сразу сдвигать,
; так как экономить такты - глупо,
; а приложениям (моим) удобнее.
; Хотя я не уверен на счёт обратной совместимости
barsik wrote:
Т.к читать в кодах я не умею, мне пришлось скопировать выложенный дамп, вставить его в текстовый редактор, вручную отредактировать дамп в DEFB строки ассемблера, дополнить обрамлением, затем странслировать макро ассемблером, отлинковать и полученный DAT-файл загрузить в IDA и затем дизассемблировать и текст фрагмента сохранить в виде ASM-текста. Затем отредактировать его и только тогда получается возможность его изучать.
barsik wrote:
Зато из MSGH видно, что ваш вариант на 1 байт короче, а я не сообразил, что не только регистр А сохраняется в п/п-мме COUT_A, но и флаги, и потому сдвигать, чтобы узнать бит D7 излишне. Уже польза от потраченного на дизассемблирование дампа времени.

Кстати, команду AND A, чтобы узнать флаги программисты применяют реже, чем OR A. Это конечно, кто как привык, но мне AND A сразу не даёт подсказку, что это тест для получения флагов (т.к AND всегда используют для маскирования битов). Потому я всегда заменяю AND A на OR A.
Как уже можете видеть, моя фирма тоже веники не вяжет… :ebiggrin:

Здесь в теме у нас уже наблюдается здоровая конкуренция модификации ПЗУ судя по всему…
Тем самым, не будете против, если я буду именно своей версией заниматься?

Нет, я не против разных комментариев и критики моего кода или варианта.
Просто мой вариант - наиболее совместимый с оригиналом и поддержкой всех директив.
(В силу моего малого опыта и излишней аккуратности!)
Конечному пользователю будет просто любопытно сравнить наши МОНИТОРы в конце-концов!

Сейчас у меня накопилось много файлов с фрагментами подпрограмм, которые очень запарно собирать в целое. И я уже путаюсь во всём этом.
Понимаете, исходники я не могу показать даже уже по этой причине. И это, в каком-то смысле, тоже хорошо, так как секрет фирмы должен сохраняться :mrgreen:

Те тексты, что я здесь публикую, имеют ошибки, да…
Так как я их с потолка прямо сюда вставляю.
С одной стороны - тоже хорошо, так как не нужно слепо доверять коду и лучше перепроверить, если хочется.
С другой стороны, нужно уважать друг друга и не вводить в заблуждение. И я постараюсь быть аккуратнее…


Last edited by Paguo-86PK on 26 Jan 2020 00:30, edited 1 time in total.



26 Jan 2020 00:16
Profile WWW
Doomed
User avatar

Joined: 19 Feb 2017 03:46
Posts: 583
Location: Санкт-Петербург, Россия, третья планета от Солнца, галактика Млечный Путь
Reply with quote
Post 
Испробовал Ваш метод выигрыша объёма кода за счёт стопа по взведённому старшему биту символа. Выиграл 3 байта, но пока делал, то вспомнил почему этот метод я не применил в Мониторе-3 ОРИОНА и ПЗУ Специалиста.

Этот метод не так эффективен для монитора, потому что есть программы, которые ожидают, что после вызова п/п-ммы F818 в аккумуляторе возвращается 0. Значит перед RET M надо ставить команду LD A,0.
Paguo-86PK wrote:
Указатель HL лучше сразу сдвигать, так как экономить такты - глупо, а приложениям (моим) удобнее.
Это неверно. Нельзя сдвигать указатель HL, т.к есть программы, что рассчитывают на то, что HL по выходе из MSSG указывает на стоп байт. Тогда сделав INC HL снова вызывают CALL MSSG для вывода следующих слов.
Paguo-86PK wrote:
Здесь в теме у нас уже наблюдается здоровая конкуренция модификации ПЗУ судя по всему…
Вообще исходно у нас были разные задачи. Я освобождал место, чтобы хватило на поддержку ROM-диска, подпрограмм RRAM/WRAM F836/39 для чтения/записи байта из дополнительного ОЗУ (что обязательно при цельно-банковой коммутации, но необязательно при оконной) и для введения в ПЗУ F000 RAMDOS от Специалиста.

А Вы собирались изменить алгоритм работы п/п-ммы F809. Но конечно я охотно заимствую любые чужие идеи, если они полезны. Уже с вашей помощью я выиграл несколько байтов.


Last edited by barsik on 26 Jan 2020 00:42, edited 1 time in total.



26 Jan 2020 00:24
Profile
Maniac
User avatar

Joined: 12 Apr 2011 20:43
Posts: 267
Location: Tashkent
Reply with quote
barsik wrote:
Для этого подлежащий выводу текст ставят сразу после CALL или RST. Так делают в грамотных CP/M-программах. На RST_18 выигрывается 5 байтов на каждом сообщении.
Мoя демка окон так и работает… В ней RST_0 служит для печати текста и вызова подпрограмм МОНИТОРа.
Да, именно RST_0, так как она проверяет по указателю стека горячий/холодный ли вызов? А так как у МОНИТОРа SP > 7600, а приложения устанавливают SP < 75FF, то RST_0 - самая медленная подпрограмма, так как печать текста впопыхах не нужна!
RST_0 проверяет первый байт за инструкцией. Если он ≤127 - печатает текст. Если >127 - вызывает F800+(n-128)*3…
Code:
    RST_0
    DEFB 85h ; CALL 0F815h
    RST_0
    DEFB 'Hello!',0
 Много листинга i8080
Code:
   ORG   00000H
   DB   0FFH,0FFH,0FFH,0FFH,0FFH,0FFH,0FFH,0FFH
   DB   0FFH,0FFH,0FFH,0FFH,0FFH,0FFH,0FFH,0FFH
   DB   0FFH,0FFH,0FFH,0FFH,0FFH,0FFH,0FFH,0FFH
   DB   0FFH,0FFH,0FFH,0FFH,0FFH,0FFH,0FFH,0FFH
   DB   0FFH,0FFH,0FFH,0FFH,0FFH,0FFH,0FFH,0FFH
   DB   0FFH,0FFH,0FFH,0FFH,0FFH,0FFH,0FFH,0FFH
   DB   0FFH,0FFH,0FFH,0FFH,0FFH,0FFH,0FFH,0FFH
   SHLD   THE_HL+1
   PUSH   PSW
   POP   HL
   SHLD   THE_PSW+1
   LXI   H,08A02H
   DAD   SP
   JNC   THE_API
   POP   H
   DCX   H
   MOV   E,L
   CALL   GET_LIM
   SPHL
   LXI   H,ESCAPER
   SHLD   CUR_ESC
   LXI   H,076D0H
   SHLD   REGS_SP
   DB   VIEW_IS,0,0,78,30
   DB   PRINTZ,1BH,'Y AVIEW PORT #',0
   MOV   A,E
   CALL   0F815H
   LXI   H,0F86CH
   PUSH   H
   MOV   A,E
   ADD   A
   ADI   TAB_VIEW
   MOV   L,A
   MVI   H,TAB_VIEW >> 8
   MOV   A,M
   INX   H
   MOV   H,M
   MOV   L,A
   PCHL
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
THE_API:MOV   H,B
   MOV   L,C
   SHLD   THE_BC+1
   XCHG
   SHLD   THE_DE+1
   POP   H
   MOV   A,L
   RAR
   RAR
   ANI   00EH
   ADI   TAB_API
   MOV   L,A
   MVI   H,TAB_API >> 8
   MOV   A,M
   INX   H
   MOV   H,M
   MOV   L,A
   PCHL
TAB_API:DW   _VIEW,_PRINTZ
TAB_VIEW:DW   _VIEW0,_VIEW1,_VIEW2,_VIEW3
   DW   _VIEW4,_VIEW5,_VIEW6,_VIEW7
   DW   _VIEW8,_VIEW9,_VIEW10,_VIEW11
   DW   _VIEW12,_VIEW13,_VIEW14,_VIEW15
   DW   0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
   DW   0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
   DW   0,0,0,0,0,0,0,0,0

_VIEW:   LXI   H,00000H
   SHLD   CUR_MIN
   LXI   H,01D4DH
   SHLD   CUR_MAX
   XRA   A
   STA   CUR_SEQ
   POP   H
   MOV   A,M
   MOV   E,A
   INX   H
   ADI   020H
   STA   _THE_XY+1
   MOV   A,M
   MOV   D,A
   INX   H
   ADI   020H
   STA   _THE_XY
   CALL   _PRINTS
   DB   01BH,'Y'
_THE_XY:DB   ' ',' ',0
   MOV   C,M
   INX   H
   MOV   B,M
   INX   H
   PUSH   H
   XCHG
   SHLD   CUR_MIN
   DCR   B
   DCR   C
   DAD   B
   SHLD   CUR_MAX
   CALL   _PRINTS
   DB   0CH,0
   CALL   _DRAW_BAR
THE_PSW:LXI   H,0
   PUSH   H
   POP   PSW
THE_BC:   LXI   B,0
THE_DE:   LXI   D,0
THE_HL:   LXI   H,0
   RET
_PRINTS:XTHL
   CALL   0F818H
   XTHL
   RET
_PRINTZ:XTHL
   CALL   0F818H
   XTHL
   JMP   THE_PSW
barsik wrote:
Испробовал Ваш метод выигрыша объёма кода за счёт стопа по взведённому старшему биту символа. Выиграл 3 байта, но пока делал, то вспомнил почему этот метод я не применил в Мониторе-3 ОРИОНА и ПЗУ Специалиста.

Этот метод не так эффективен для монитора, потому что есть программы, которые ожидают, что после вызова п/п-ммы F818 в аккумуляторе возвращается 0. Значит перед RET M надо ставить команду LD A,0.
Quote:
Указатель HL лучше сразу сдвигать, так как экономить такты - глупо, а приложениям (моим) удобнее.
Это неверно. Нельзя сдвигать указатель HL, т.к есть программы, что рассчитывают на то, что HL по выходе из MSSG указывает на стоп байт. Тогда сделав INC HL снова вызывают CALL MSSG для вывода следующих слов.
Вот этого я и боялся!
Однако, использую это в своей радикальной версии ПЗУ тогда…


26 Jan 2020 00:33
Profile WWW
Doomed
User avatar

Joined: 19 Feb 2017 03:46
Posts: 583
Location: Санкт-Петербург, Россия, третья планета от Солнца, галактика Млечный Путь
Reply with quote
Post 
Когда я приводил пример подпрограммы вывода текста вставленного сразу за командой CALL или RST, я эту подпрограмму вывода текста назвал именем RST_18. Это просто имя, речь не шла об однобайтовой команде RST. Я использую такое имя, потому, что в версиях CP/M, что я транслировал с середины 90-тых всегда использовались RST (все RST, кроме RST 0, т.к RST 0 в CP/M это Warm Boot) и RST 18H как раз делает то же самое - выводит текст непосредственно вставленный в код.

В CP/M использование RST не создаёт проблем, т.к это место в Zero Page резервировано именно для RST и по каждому рестарту на адрес 0008 кидается блок RST. Благодаря чему в CP/M всегда есть RST, что заметно экономит объём кода в программах и в самой CP/M. Например, команда RST 18H выводит непосредственный текст, RST 10H выводит символ из регистра A с сохранением всех регистров (SCOUTA), RST 20H - возвращает статус консоли, RST 30H - CONIN, RST 28H - CALL F81B без останова часов и др.

Но не для CP/M, а для обычных бездисковых прикладных программ (игр и др.) команды RST не используют, т.к бОльшая часть программ работает с адреса 0. Тогда вместо однобайтовой команды RST 18H, ставят команду CALL. Об этом и был пример. Я назвал подпрограмму RST_18 просто потому, что у меня во всех исходниках эта п/п-мма так и называется. Потому что это делает макро-команда и я всегда пишу макро-команду, а ассемблер сам подставляет или команду RST 18H или команду CALL RST_18 (где RST_18 это подпрограмма и вовсе не на адресе $0018). У других авторов, аналогичная подпрограмма называется TXTOUT или иначе. И речи тут о самих командах RST не идёт.

Потому и непонятно, что Вы имеете ввиду когда пишете RST_0. Это что так ошибочно Вы пишете команду RST 0 или ещё что-то? Как RST могут применяться в ROM-BIOS машины в которой на адресах 0000...003A стоит ОЗУ, а не ПЗУ ?


Last edited by barsik on 26 Jan 2020 01:20, edited 1 time in total.



26 Jan 2020 01:05
Profile
Maniac
User avatar

Joined: 12 Apr 2011 20:43
Posts: 267
Location: Tashkent
Reply with quote
barsik wrote:
Потому и непонятно, что Вы имеете ввиду когда пишете RST_0. Это что так ошибочно Вы пишете команду RST 0 или ещё что-то? Как RST могут применяться в ROM-BIOS машины в которой на аресах 0000...003A стоит ОЗУ, а не ПЗУ ?
Здесь я сделал типа макроса:
Code:
PRINTZ  EQU     0C7H    ; Usage: DB PRINTZ,'...',0 = RST 0 + '...',0
PRINT   EQU     086C7H  ; Usage: DW PRINT = CALL 0F818H
PRINTHEX EQU    085C7H  ; Usage: DW PRINTHEX = CALL 0F815H

В адресах под RST я расположил демо-код. МОНИТОР RST не использует.
Позднее попытаюсь выложить его: Нету средств для трансляции под руками. Только онлайн-эмулятор :mrgreen:
(Нашёл тут кое-что под несколько процессоров. Но он ругается на мой листинг, так как не поддерживается подчёркивание как ведущий символ метки и некоторый синтаксический сахар, поддерживаемый ассемблером онлайн-эмулятора (банальное «&» и «>>» следует менять на «%» и «/») :o )

Скриншoты просили? :wink:


Attachments:
File comment: Снимки экрана онлайн-эмулятора с запуском через G0…G4
ScreenShots.zip [104.65 KiB]
Downloaded 219 times


Last edited by Paguo-86PK on 26 Jan 2020 04:57, edited 1 time in total.

26 Jan 2020 01:20
Profile WWW
Maniac
User avatar

Joined: 12 Apr 2011 20:43
Posts: 267
Location: Tashkent
Reply with quote
Маленькиe раздумья
Вообще-то схема РК спроектирована очень расточительно в плане расширения.
Так, светодиод «Рус/Lat» можно было посадить прямо на матрицу клавиатуры:
Что плохого, если при опросе клавиатуры индикатор будет пульсировать?
За то, явно видно, что опрос клавиатуры работает. А сама подпрограмма опроса перед выходом должна явно бит индикатора так и так установить. В этом плане, можно хоть все восемь светодиодов установить и подпрограммы ПЗУ ввода/вывода могли бы явно индикаторами сигнализировать о режиме, в котором в данный момент находится РК…
Конечно, можно выделить отдельный регистр и разместить его прямо на плате клавиатуры, а стробировать - тем же «Рус/Lat»…

Клавиши «УС»/«СС»/«Рус/Lat» могли бы параллельно с компаратором магнитофона через диод сидеть:
Нормальный пользователь при загрузке с ленты не тарабанит по клавишам :exclaim:
Тем более, для прерывания процедуры ввода можно было бы специально нажать их для генерации сбоя.

Здесь, правда, нужно придумать развязку, чтобы сигнал с магнитофона не воспринимался ошибочно как «УС»/«СС»/«Рус/Lat»… :mrgreen:
Можно просто выход компаратора двумя диодами и подать на «СС»+«УС»…

Хотя, вообще-то, никто никогда не стал бы нажимать сразу три клавиши и «СС»/«УС» с «Рус/Lat». И «Рус/Lat» можно посадить диодами одновременно, например, на «Ф1»+«Ф3». В моём КР-03 с матрицей 8×11 три лишние линии клавиатуры шестью диодами и сидят так…
(Что за расточительность авторами схемы взята за основу? Диодов что ли жалко было? Или лишних инструкций? Вон, в DOS раскладка переключалась двумя клавишами Shift…)

Тем самым, по возможности, я бы доработал схему в этом плане. Ведь ничего добавлять существенно и не придётся.
Можно было бы одну-две линии клавиатуры вывести и на джойстики так же. Правда, игры нужно будет допиливать…
В том же ZX-Spectrum всегда поддерживался комплекс джойстиков, включая сидящий на клавишах «6»…«0» (не помню, как назывался, Interface 2?)…
И добавил бы просто ещё клавиш через диоды - ничего плохого не случится… :idea:

Кстати
Вoт файлы демонстрации
Файл *.rkr - Демонстрация окон…
Загрузите (нормально, без автозапуска или по «I») и запускайте по «G0»,«G1»,«G2»,«G3» и «G4».
По «G4» работают курсорные клавиши перемещения активного окна и клавиша Tab для переключения между окнами.

Файл *.rss - Бейсик с готовой программой: Сначала RUN и затем пару раз CONT.

Естественно, предварительно эмулятору нужно подложить мою версию ПЗУ
barsik wrote:
А кто заставляет выводить дамп с 16-ю байтами в строке? В Специалисте, ОРИОНЕ и ИРИШЕ выводят в дампе по 8 байтов в строке и никто ещё не жаловался.
Да как можно говорить, чтобы РАДИО-86РК выводил "куцый дамп", когда я и ZX-Spectrum заставил дамп выводить нормально :mrgreen:
Ниже - tap-файл для Спектрума…


Attachments:
File comment: Здесь:
Файл *.rkr - Демонстрация окон: Загрузите (нормально, без автозапуска) и запускайте по «G0»,«G1»,«G2»,«G3» и «G4» (где работают курсорные клавиши и Tab)
Файл *.rss - Бейсик с готовой программой: Сначала RUN и затем пару раз CONT

ViewPort.zip [9.46 KiB]
Downloaded 197 times
File comment: Если очень лень грузить ZX-файл - вот скриншот работы моего кода
Hexas.gif
Hexas.gif [ 6.91 KiB | Viewed 4733 times ]
File comment: Дамп в стиле РК на ZX
Paguo-86PK.zip [1.94 KiB]
Downloaded 212 times
26 Jan 2020 04:46
Profile WWW
Doomed
User avatar

Joined: 19 Feb 2017 03:46
Posts: 583
Location: Санкт-Петербург, Россия, третья планета от Солнца, галактика Млечный Путь
Reply with quote
Post 
Paguo-86PK wrote:
Демонстрация окон
Без инверсии знакомест или цвета и нормальных рамок заниматься окнами на РК86 бессмысленно. Кому понравится такое уродство? Зато истратив кусочек проволоки и допрошив во вторую половинку РФ2 знакогенератора альтернативный фонт управляемый одним битом запасного ППА D14 (или PC1 ППА D20) получаются приемлемые инверсные окна.
Paguo-86PK wrote:
я и ZX-Spectrum заставил дамп выводить нормально
Это разве нормальный вывод дампа? Такое пишется на любом бейсике за 3 минуты и занимает всего несколько строк бейсика. Вот нормальный дамп.
Paguo-86PK wrote:
Нету средств для трансляции под руками. Только онлайн-эмулятор
Никакие средства трансляции кроме TSR CP/M эмулятора (например 22NICE) и макроассемблера Microsoft М80 из CP/M Вам и не надо. Ничего лучше за 40 лет не написали. Всяким самодельным кросс-ассемблерам под Windows от любителей далеко до М80 как до Луны. Есть и другие ассемблеры для CP/M, но лучше нет. Поищите здесь.

Удобнее всего, если используется Windows XP, тогда трансляция, линковка и запуск на тестирование занимают две секунды (да и то лишь потому, что надо глазами увидеть сообщения, что нет ошибок трансляции и линковки и нажать пробел). Нужно только это плюс текстов редактор программиста UltraEdit (из редакторов для программиста тоже ничего лучше за 25 последних лет не написали). Если же применяется более свежая Windows, то она не позволяет прогонять программы MSDOS и потому приходится запускать MSDOS-программы и CP/M компиляторы ассемблера и ЯВУ под программой DosBox.
Paguo-86PK wrote:
Вообще-то схема РК спроектирована очень расточительно в плане расширения. Так, светодиод «РУС/ЛАТ» можно было посадить прямо на матрицу клавиатуры
Где-же расточительно? Наоборот, недостаточно расточительно, - в ППА клавиатуры не нашли куда применить 2 бита на вывод PC1 и PC2. Если освободим и PC3, то будет уже 3 разряда незадействованных.
Paguo-86PK wrote:
Клавиши «УС»/«СС»/«Рус/Lat» могли бы параллельно с компаратором магнитофона через диод сидеть
УС и СС - клавиши модификаторы, потому они правильно вне матрицы и читаются отдельными битами. А вот РУС/ЛАТ генерит код $FE и потому её можно было включить в матрицу (например, вместо <F5>). Тогда бы по освобождённому биту можно читать КСИ или такт КСИ делённый на 5 или 10, что даёт примитивный программный таймер. Ещё было бы полезно куда-то приспособить вход от "светового пера" (кстати, интересно с плоским дисплеем он работает или только с кинескопным).

Вот как раз джойстик (или ещё 8 клавиш) можно читать по линии магнитофона добавив линию ввода в матрицу. Можно бы и наоборот, т.е добавить линию сканирования с диодом по PC1 или PC2. Но на PC1 и PC2 сидят нули (после задания режима) и даже, если изменить ПЗУ и выдавать на PC1 и PC2 единицы, то не поможет, т.к игры не знают о этом.
Paguo-86PK wrote:
В моём КР-03 с матрицей 8×11 три лишние линии клавиатуры шестью диодами и сидят так… (Что за расточительность авторами схемы взята за основу? Диодов что ли жалко было?)
Кажется в ПК11/16 (Союз-Неон) MS7007 подключена всего через два порта по 8 разрядов за счёт диодов (два нуля на разрядах PA дают доп.линию сканирования).


26 Jan 2020 12:47
Profile
Maniac
User avatar

Joined: 12 Apr 2011 20:43
Posts: 267
Location: Tashkent
Reply with quote
barsik wrote:
Без инверсии знакомест или цвета и нормальных рамок заниматься окнами на РК86 бессмысленно. Кому понравится такое уродство?
Этo слова XXI века! А тогда - и таким бы довольствовались :idea:
barsik wrote:
Зато истратив кусочек проволоки и допрошив во вторую половинку РФ2 знакогенератора альтернативный фонт управляемый одним битом запасного ППА D14 (или PC1 ППА D20) получаются приемлемые инверсные окна.
Опять ППА! :roll: Атрибуты же есть!
barsik wrote:
Это разве нормальный вывод дампа?
Для меня - да :wink:
barsik wrote:
Такое пишется на любом бейсике за 3 минуты и занимает всего несколько строк бейсика.
Вы уверены :question:
barsik wrote:
Вам нужно почитать мемуары одного пользователя, который интерфейсами Радио-86РК и Специалист связал и не понимал, как другие на Спектруме редактируют текст 64x24 с вырви глаз фонтами 4x8 и тормозами, когда на ВГ75 всё быстро и красиво!
(Кстати, дефолтный фонт ZX меня всегда напрягал какой-то корявостью… Буква «T» особенно…)
barsik wrote:
Никакие средства трансляции кроме TSR CP/M эмулятора (например 22NICE) и макроассемблера Microsoft М80 для CP/M Вам и не надо. Ничего лучше за 40 лет не написали. Всяким самоделкам ассемблеров под Windows от любителей далеко до М80 как до Луны. Есть и другие ассемблеры для CP/M, но лучше нет. Поищите здесь.
Спасибо!
Кстати, только что для онлайн-эмулятора написал костыль в 54 строки, который дежурит и пасёт FB50 в стеке 76C9: Как только в эмуляторе набираешь «O», мой скрипт подсчитывает CRC памяти и выбрасывает в файл.
Теперь я могу файлы *.rom и *.rkr штамповать даже не напрягаясь! :roll:
barsik wrote:
Где-же расточительно. Наоборот, недостаточно расточительно, - в ППА клавиатуры не нашли куда применить 2 бита на вывод PC1 и PC2. Если освободим и PC3, то будет уже 3 разряда незадействованных.
Чем больше резерва - тем лучше :lol:
barsik wrote:
УС и СС - клавиши модификаторы, потому они правильно вне матрицы и читаются отдельными битами.
На моём КР-03 пять клавиш-триггеров: «Упр», «Лат», «Рус», «Верхний регистр» и «Нижний регистр».
Тем шамым, пальцами шпагаты никогда не выкренделывал и так привык, что страдал на Поиске в DOS, но в Windows сразу же включил залипание.
Потому экономия на клавишах - зло!
barsik wrote:
Ещё было бы полезно куда-то приспособить вход от "светового пера" (кстати, интересно с плоским дисплеем он работает или только с кинескопным).
Не сработает :roll:
barsik wrote:
Вот как раз джойстик (или ещё 8 клавиш) можно читать по линии магнитофона добавив линию ввода в матрицу.
Опять окольные методы :lol:
Знакогенератор переключать - ППА D14/D20, джойстик читать - магнитофоном!
Давайте уже признаем, что в XXI веке нужно стремиться к унификации стандартов?
Для ввода пальцами (клавиатура/джойстик) - порт клавиатуры. Тем более, если грамотно подключить, игры не заметят разницы.
Для ввода/вывода информации - порт магнитофона.

Нет, фантазировать можно, конечно… Но не генерируя хаос…
Вот смотрите: Когда я вожусь со схемой «Супер-РФ2» у которой 512 Кб в 256 страницах - это одно. Так как впихивать туда всё ПО должен, по идее, я сам. Пользователь же, как во времена NES/Sega, должен лишь заказать этот «Супер-РФ2», вставить в панельку и включить - всё! То есть, по идее, концептуально я задумываю дизайн как закрытый. Пользователь не должен думать, как там страницы переключаются…
Вами же предлагается наворотить в открытой архитектуре многое из эпохи дефицита. В открытом дизайне нужно быть аккуратнее.
Я понимаю, у Вас - опыт!
Опытный хирург в пациенте орудует аки мясник.
Я же в технике - дилетант и действую аккуратно… :idea:

Если Вы не обиделись/разозлились, вот ещё идея… :roll:

Умный ВГ75
Можно обойтись и без атрибутов.
Режим «Smart»: Код ТОЧКИ/Кавычек/Двоеточия сбрасывает триггер и включает верхний регистр знакогенератора. Код любой буквы - включает нижний регистр. Тем самым, весь текст будет начинаться всегда заглавными буквами, но продолжаться - строчными.
Режим «Jumps»: Особый код переключает каналы ПДП и ВГ75 может читать с любого из четырёх каналов ПДП, а также и знакогенератор переключать. Тем самым, на одном экране можно иметь 4 независимых ПДП-страницы и 4 знакогенератора. Конечно, программирование такого режима будет адское! Но возможности - уникальные…
Так как знакогенератор - 6x8, 2 бита никак не используются и можно прошить некоторые символы как угодно: Два бита - 3 исключительные комбинации.
  • 00 - переключить канал ПДП
  • 01 - нижний регистр (вторая страница знакогенератора)
  • 10 - верхний регистр
  • 11 - ничего не делать


26 Jan 2020 14:40
Profile WWW
Display posts from previous:  Sort by  
Reply to topic   [ 204 posts ]  Go to page Previous  1, 2, 3, 4, 5, 6, 7, 8 ... 14  Next

Who is online

Users browsing this forum: No registered users and 35 guests


You cannot post new topics in this forum
You cannot reply to topics in this forum
You cannot edit your posts in this forum
You cannot delete your posts in this forum
You cannot post attachments in this forum

Search for:
Jump to:  
Powered by phpBB® Forum Software © phpBB Group
Designed by ST Software.