Paguo-86PK wrote:по-моему, на ногах переболел Коронычем ещё в январе…
Это вряд-ли. В январе эта зараза ещё не вышла за пределы Уханя. Это был грипп или простуда. Если бы это было не так, Вы бы заметили, что люди из вашего окружения вдруг начали попадать в больницу и даже умирать.
Paguo-86PK wrote:«USR» не даёт возможности передавать параметры непосредственно в регистрах, что требует ПОК-ить уйму непонятного кода.
Чего тут непонятного? Если надо передавать данное в ассемблерную подпрограмму, то с помощью POKE кладём данное в ячейку из которой ассемблерная процедура его возъмёт. А возврат одного данного из ассемблерной подпрограммы USR поддерживает, т.к это функция. И почему уйма? Сколько передаваемых параметров, столько и POKE. А если поднимается вопрос скорости, то даже упоминать бейсик неуместно. В Паскале, Си и PL/M при вызове внешних процедур/функций параметры передаются в оговоренных для данного компилятора регистрах и стеке.
В бейсике-интерпретаторе другая проблема, - как разместить ассемблерный код в ОЗУ. Это делают с помощью операторов DATA, READ и программной перегрузки кода под вершину ОЗУ или в какую-либо длинную строчную переменную. После чего подпрограмма в маш.кодах вызывается оператором USR. Делая свой бейсик несложно ввести оператор CODE, который похож на DATA, только числа задаются в HEX-виде (отпадает префикс &H) и оператор CODE сам загружает код из бейсиковой строки на текущий адрес размещения, исходно заданный ранее оператором ORG.
Paguo-86PK wrote:порты... занимают не 8 Кб, а свои законные 4 байта
После этого команды IN/OUT перестанут попадать в порты. Кстати, ПДП занимает не 4, а 9 адресов. Если открывать ОЗУ в дырках портов, то чтобы не переделывать РК-программы, на порты надо оставлять по целому килобайту. А ОЗУ дырками неудобно. Если надо большой сплошной кусок доп.ОЗУ, то лучше всего выкинуть запасной ППА и отдать под доп.ОЗУ участок 8400...BFFF размером в 15 кб.
Paguo-86PK wrote:Дополнительная память будет +24 Кб, но ячейки 8000…8003, A000…A003, C000…C001 будут заняты чем надо. Это РК-совместимый режим +24…
Это же аппаратно намного сложнее и неудобнее в использовании, чем просто ввести вторую страницу с ОЗУ в адресах 0...EFFF. Порты остаются в 0-вой странице и не мешают.
Paguo-86PK wrote:А вот если проделать трюки «CALL 8000», «CALL A000», «CALL C000» - включается РК-несовместимый режим +32 Кб. То есть все 64 Кб ОЗУ, а ячейки FF00…FFFF при M1 через CALL переключает ОЗУ на верхние 64 Кб. То есть, ОЗУ - 128 Кб. В верхние 64 Кб записываем БСВВ, а нижние - пользователю. Под БСВВ ППА/ПДП/ВГ75 на местах (10 ячеек), а в нижних - только 64 Кб ОЗУ. Никаких ППА…
Это маниловщина, к тому же ненужное усложнение архитектуры.
Paguo-86PK wrote:Вы просто проигнорировали мой эскиз в начале темы… Я за вариант в 64 Кб
А зачем сейчас хоть кому-то из пользователей РК86 нужны 64 кб? Никто из фанатов РК не одобрил идею сделать новодел РК с бОльшим ОЗУ? И Вы не объяснили для каких целей Вам в РК86 необходимо иметь 64 кб.
Разве есть или вскоре ожидается поступление множества программ с объёмом более, чем 29 кб ? Большое сплошное ОЗУ было надо до середины 90-тых годов, когда программы писались на самих 8-ми разрядках. Т.к тогда, чем больше в бездисководной ЭВМ ОЗУ, тем бОльший исходник можно в него загрузить и странслировать (хотя это не закон, а является отражением несовершенства имеющегося тогда инструментария). ОЗУ размером под 60 кб позволяло использовать CP/M, где имелись нужные инструменты для программиста, а также давало DOS в качестве средства хранения файлов.
А сейчас Вам наличие 128 кб ОЗУ что даст? Тем более такой изощрённой архитектурой. Пока даже на неэффективных ЯВУ для РК ещё не странслировали ни одной программы объём кода которой при трансляциии неожиданно превысил бы 29 кб. И совершенно непоследовательно отвергать простейшие и всем доступные доработки и тут же предлагать делать сложные и громоздкие.
Доп.ОЗУ (или доп.ПЗУ), если и нужно, то лишь, во-первых, чтобы поиметь хоть какую-то DOS (чтобы появилась файловая система для удобного доступа к файлам). А во-вторых, доп.ОЗУ нужно, если планируется начать штамповать качественные РК-игры на каком-нибудь ЯВУ, т.к компиляторы ЯВУ дают в несколько раз менее плотный код, чем ассемблер.
Например, текстов редактор без блоков написанный на ассемблере с размером в 2 кб (т.е уровня Микрон-1) переписанный на Си или Паскаль занимает уже 8 кб. РК-нортон с минимальными окнами в 8 кб, написанный на ассемблере, переписанный на ЯВУ разбухнет до 29 кб (что вообще не оставляет места ни под буфер копирования, ни под буфер сохранения окон). А например, CP/M нортон MIVFI для ОРИОНА имеет размер в 17 кб. Если его переписать на ЯВУ, то он займёт 64 кб.
Паскаль позволяет грузить оверлеи, как в окно A000...BFFF, так и в основное ОЗУ 0...7FFF с автоматическим переключением банок. Так, что, дополнив РК (в любом виде) дополнительным странично-коммутируемым ОЗУ, полностью снимается ограничение на объём кода. И тогда ничто (кроме отсутствия графики) не помешает написать на ЯВУ (естественно, с фрагментами ассемблера, там где важна скорость) большое количество игр с высоким игровым аспектом.
Paguo-86PK wrote:Застрял на подпрограммах клавиатуры и магнитофона. Хотелось бы ввести поддержку разных раскладок. Подгружаемых…
Застряли Вы потому, что пытаетесь программируя в машинных кодах (что уместно в XIX веке, но явное безумие в XXI веке), уместить что-то в те же 2 кб ПЗУ. Хотя никто не мешает припаяв пару проводков и заменив 24-х ногую панельку на 28-ми ногую (или
впаять рядом в имеющиеся отверстия) и установив в неё микросхему 2764, поиметь ПЗУ размером в 8 кб.
Тогда можно запрограммировать драйвер клавиатуры программируя, как теперь принято, в стиле "Quick and Dirty" абсолютно не заморачиваясь экономией байтов (за счёт такого размещения символов в матрице, что укорачивает драйвер). Не имея ограничений на объём кода, таблицу кодов клавиш можно при инициализации копировать из ПЗУ в ОЗУ, что и позволяет программно менять "раскладку клавиш".
А что касается подпрограмм для магнитофона, - зачем их вообще трогать? Они работают нормально (хотя и непонятно зачем перепрограммируют ВГ75 после ввода/вывода каждого байта). Или Вы улучшаете их, чтобы экран не гас при работе с МГ-лентой? Если это так уж надо, то Вам достаточно просто перейти на Специалист, там экран вообще никогда не гаснет.
Paguo-86PK wrote:это ещё один весомый аргумент от меня в пользу того, что встроенные отладочные средства в Мониторе нужны!
Отладочные средства в ROM-BIOS означают просто трату впустую ~100 байтов. Приличный отладчик занимает объём ~10 кб. И отладчик д.быть привязан к среде, т.е к DOS. Потому отладчики включают в состав DOS, а не делают частью ROM-BIOS.
Paguo-86PK wrote:Для микро-ЭВМ Паскаль - необходим, как никогда.
Это самая здравая мысль во всей этой теме, во всём разделе этого форума, во всех других разделах этого форума, где речь о программировании 8-ми разрядок и во всех остальных форумах, где речь о том же.
Paguo-86PK wrote:Это я только недавно стал понимать!
Ну так и забудьте как о кошмарном сне о программировании в машинных кодах КР580 и займитесь Паскалем МТ+. А, если с помощью платки-переходника замените КР580 на Z80, то и Турбо-Паскалем, который хоть и менее серъёзный инструмент, но зато позволяет писать программы быстрее (я в 90-тые годы написал на TP текстов редактор с блоками менее, чем за три дня).
К тому же Паскаль МТ+ (в отличие от Турбо-Паскаля) ничуть не отменяет ассемблер, - он позволяет иметь модули не только на ассемблере, но и на других ЯВУ. А мелкие процедуры на ассемблере удобно встраиваются прямо в код Паскаля используя INLINE вставки (хотя для этого используется менее удобная мнемоника КР580).
На ЯВУ можно делать сложную часть алгоритма, а скоростную часть выполнять на ассемблере. В РК-играх (за небольшим исключением, типа шахмат, что написаны на PL/I) обычно объём собственно кода не превышает 5-6 кб (остальное уровни). Потому большинство РК-игр можно переписать на ЯВУ и они уместятся в имеющиеся 29 кб.
Paguo-86PK wrote:давно нарисовал ПЗУ знакогенератора, где коды 08/0A/0C/0D/18/19/1A/1F и реализуют псевдографику в три бита: Вместо блоков 2×2 блок 3×1. И в режиме 78×64 можно рисовать 234×64.
Всем известно, что РК отображает 64*25, 64*30 или 64*51 знакомест. Без аппаратных переделок, формат экрана 78*64 никак не увидеть ни на одном телевизоре или мониторе. И если эмулятор это отображает, то это плохой эмулятор, не соответствующий реалу. Если матрица знакоместа 3х1, то экранный формат в пикселях - 192*25. А если включить режим изобретённый
vinxru с 51-й видимой строкой, то будет формат 192*51.
Зачем реализовывать матрицу пикселей, - просто применяйте символы для рамок толщиной в одну точку. И непонятно, чем для псевдографики и рамок лучше матрица знакоместа 3х1? Ведь тогда, хотя вертикальные линии рамок будут толщиной в 2 точки, горизонтальные линии будут толщиной аж в 8 линий, т.е рамки станут ещё более противными.
Paguo-86PK wrote:ВГ75 сама имеет резерв кодов C0…EF под некие рамки
Получить рамки допрошив второй фонт в имеющееся полупустое ПЗУ, - это реально. Делать апп.доработки, тем более ради того, что достигается без хлопот и корёжения платы РК - никто не будет. Это ни в одном из клонов РК не использовали, т.к тогда курсор должен быть реализован программно, а он уже во всех РК-программах аппаратный.
Paguo-86PK wrote:Я занят кодом, а не сверкающими фантиками…
Зачем нужен код для поддержки окон без решения проблемы нормального дизайна окон? Когда Вы видите красоту, у Вас резко возрастает энтузиазм, а когда Вы видите уродство, то наоборот.
Paguo-86PK wrote:(навеяло
отсюда)…
Эта ссылка работает
не для всех.
Paguo-86PK wrote:Есть предложение: Подготовьте мне разные настройки ВГ75/ВТ57 под мою утилиту и под экран в нижней половине (чтобы не затирать рабочие ячейки Монитора)
Я сейчас пытаюсь изучить/вспомнить/освоить Паскаль (ассемблер стараюсь забыть) и мне не хочется заниматься ассемблером, хотя изменить ПЗУ под режим 27/28 строк - просто. Кроме смены параметров установки режима, требуется изменение адреса начала экрана при HOME и адресов и размеров экрана в п/п-ме ролика. Было бы полезно, если бы крутые эмуляторы чётко привязанные к реальным времянкам выдавали индикацию какая текущая частота кадров и строк.
Проще всего попробовать режим в 27 строк задав полные 32+1 строки (с частотой кадров ~53 ГЦ) и экраном на 36D0H-78*2, т.к при этом начала строк остаются там же и вывод символов будет корректно работать без изменений кода драйвера вывода символов. Здесь длина КСИ не меняется, а в коде меняется только два параметра в подпрограмме задающей режим ВГ75. Попробуйте сначала с экраном на 36D0H-78*2 (тогда, естественно вывод символов п/п-ми F809, F818 не сработает), а затем попробуйте задать адрес экрана 76D0H-78*2 и сделайте вывод текста на экран обычными подпрограммами ПЗУ.
Code: Select all
S.HHHHHHH - 0.1001101 77+1 знакомест в ряду
VV.RRRRRR - 00.011101 29+1 строк в экране
UUUU.LLLL - 1001.1001 9+1 линия подчерк, 9+1 линий в знакоместе
MFCC.ZZZZ - 1.0.01.0011 без смещ, мигающ.лин, атриб.пробелом, гашение 8 зн.мест
S - через_рядность картинки
H - символов в ряду (минус 1)
V - гашение по вертикали
R - число рядов знакомест (минус 1)
U - номер линии подчёркивания (0 первая линия)
L - высота знакоместа в линиях
M - метод счёта линий в знакоместе
F - прозрачность атрибутов
С - метод отображения курсора
Z - гашение по горизонтали
; -------------------------------------------------------
MODE EQU 1 ; если =0, то 64*25, иначе 64*28
if MODE eq 0
SA EQU 76D0H
PARM1 EQU 4DH ; 0.1001101 77 (77+1 знакомест)
PARM2 EQU 1DH ; 00.011101 29 (29+1 строк)
PARM3 EQU 99H ; 1001.1001 9 9 (9+1 линия подчерк)
; (9+1 линий в знакоместе)
PARM4 EQU 93H ; 1.0.01.0011 без смещ.
; курсор - мигающая линия подчеркивания
; атрибуты отображать пробелом
; ZZZZ= 3. Т.е 3*2+2= 8 тактов сдвига -
; длина обратного хода луча в строке
else
SA EQU 36D0H-78*2
PARM1 EQU 4DH ; 0.1001101 77 (77+1 знакомест)
PARM2 EQU 1FH ; 00.011111 31 (31+1 строк)
PARM3 EQU 88H ; 1000.1000 8 8 (8+1 линия подчерк)
; (8+1 линий в знакоместе)
PARM4 EQU 93H ; 1.0.01.0011 без смещ.
; курсор - мигающая линия подчеркивания
; атрибуты отображать пробелом
; ZZZZ= 3. Т.е 3*2+2= 8 тактов сдвига -
; длина обратного хода луча в строке
endif
VG_75 EQU 0C000H
VT_57 EQU 0E000H
PUSK_VG:
LD HL,VG_75+1
LD (HL),0 ; reset commando
DEC HL ; адрес VG_75
LD (HL),PARM1
LD (HL),PARM2
LD (HL),PARM3
LD (HL),PARM4
INC HL ; адрес VG_75+1
LD (HL),27H ; Start display commando
LD A,(HL) ; read status (зачем-то это надо)
AFAE1: LD A,(HL) ; read status
AND 20H ; mask 'Interrupt request flag'
JP Z,AFAE1 ; ждем конца строки
LD HL,VT_57+8
LD (HL),80H
LD L,4 ; VT_57+04
LD (HL),low SA ; 0D0H
LD (HL),high SA ; 076H
INC L ; адрес VT_57+5
LD (HL),23H ; число байтов
LD (HL),49H ; режим
LD L,8 ; VT_57+8
LD (HL),0A4H
RET
.
- - - Добавлено - - -
Вдруг вспомнил... Есть одна программа от Микроши, что использует режим с высотой знакомест в 9 линий. Но она не поможет в данной задаче, т.к хотя там число строк хранимых в ОЗУ 33, но строчный шаг - 78 (а не 76), а как уже сказано выше, 33 строки длиной в 78 байтов не умещаются в стандартной экранной области 7633...7FFF. Для интереса попробуйте такой режим, ниже его процедура инициализации. Обратите внимание, что в ВТ57 тут записываются другие байты (не знаю почему и что это меняет, - в программировании ВТ57 никогда не пытался разбираться, т.к там всё очень сложно).
Code: Select all
PUSKVG: LD HL,0C001H ; Вход: BC= адрес экранного буфера
LD (HL),0
DEC HL
LD (HL),4DH ; 0.1001101 77 (77+1 знакомест)
LD (HL),21H ; 00.100001 = 33 (34 строки +1 на обр.ход)
LD (HL),68H ; 0110.1000 6 8 (6+1 линия подчеркивания)
; (8+1 линий в знакоместе)
LD (HL),0B3H ; 1.0.11.0011 без смещ.
; курсор - мигающая линия подчеркивания
; атрибуты отображать пробелом
; ZZZZ= 3. Т.е 3*2+2= 8 тактов сдвига -
; длина обратного хода луча в строке
INC HL
LD (HL),27H
LD HL,0C001H ; программируем ВТ57
LD A,(HL)
WAITD5: LD A,(HL) ; сначала ждём готовность ВГ75
AND 00100000B
JP Z,WAITD5
LD HL,0E008H
LD (HL),80H
LD L,4 ; HL= E004
LD (HL),C ; адрес экрана
LD (HL),B
INC L ; HL= E005
LD (HL),5BH
LD (HL),4AH
LD L,8 ; HL= E008
LD (HL),0A4H
RET
.
Да, кстати. У Вас не вышло заставить для РК86 успешно работать конвертор CGA --> VGA потому, что Вы исходили из неверных идей. Число строк (точнее линий) в кадре не играет роли. Тем более, что никогда 312 строк не присутствуют в сигнале. В видео сигнале ОРИОНА, Специалиста и клонов ZX-Spectrum есть в наличии только 192...260 строк снабжённых ССИ. А далее идёт пауза, уровень чёрного, гашение по кадрам, в середине которого выдаётся КСИ. А в сигнале от РК86 строчные синхроимпульсы ССИ идут и во время гашения по кадрам. Возможно это сбивает конвертор. Ещё конвертор возможно сбивает слишком длинный КСИ и он формирует из одного слишком длинного КСИ на выходе несколько стандартных КСИ.
Вообще телевизор и монитор определяя формат сигнала могут опираться только на период следования ССИ и КСИ и их параметры. Колебания периодов следования ССИ и КСИ в диапазоне +/- 10% не играют роли (лишь центровка растра слегка сбивается). Роль играют длительности КСИ и ССИ и их полярности. По ним телевизор и монитор и определяет формат сигнала.