Сообщение от
mvg
буду благодарен за кусок кода убирающий курсор
Сначала, про убирание курсора в стандартном режиме. В графическом режиме (если не переносить линию подчёркивания с 10-й линии на 8-ю), курсор исчезает сам, т.к остаётся на 10-й неотображаемой линии. Поэтому специально выключать курсор надо только, если у Вас фонт 8*10 (фонт 2 кб) и для НОРТОНА, не меняя режима (т.е высоты знакоместа в 10), Вам необходимо лишь убрать курсор.
Для того, чтобы курсор не был виден, я обычно перепрограммировал ВГ75 так, чтобы линия подчёркивания устанавливалась ниже 10-й линии растра. А, т.к в строке в стандартном режиме выводится всего 10 линий растра, то если установить значение для линии подчёркивания на 11...16, то мигающей линии подчеркивания видно не будет. Для этого достаточно изменить два бита в байте 99H
Вот кусок из ПЗУ F800 (это в том месте где п/п-ма PUSK_VG, т.е куда идет JMP из F82D).
LD (HL),99H ; 1001.1001 9 +1 линия подчерк.
Первые 4 бита задают позицию линии подчёркивания. Если вместо 10-ти, Вы поставите 11, то курсор исчезнет. Вот две подрограммы. Одна выключает курсор, вторая включает курсор. Но не так как в ПЗУ F800, а большим мигающим прямоугольником, что намногого приятнее, чем мизерная чёрточка. Во всех моих мониторах и драйверах ОРИОНА и ПЗУ РК86 курсор всегда большой. По тому же принципу Вы получите курсор и в графическом режиме, но удобнее там его получать программно, - периодически выводя и гася символ псевдографики. Если же в стандартном режиме надо включить старый курсор (не сплошной прямоугольник, а тонкая линия подчёркивания), то делаете CALL 0F82DH.
Код:
.
CUROFF: LD A,0A9H ; 1001.1001 10 +1 линия подчерк.
LD B,93H ; 1.0.01.0011 - курсор мигающая линия подчёркивания
JP JJJ_01
CUR_ON: LD A,59H ; 0101.1001 5 +1 линия подчерк.
LD B,0C3H ; 1.1.00.0011 - курсор мигающее знакоместо
; отчего будет большой курсор
JJJ_01: PUSH HL
LD HL,VG_75+1
LD (HL),0 ; команда RESET
DEC HL ; адрес VG_75
LD (HL),04DH ; 0.1001101 77+1 знакомест
LD (HL),01DH ; 00.011101 29+1 строк
LD (HL),A ; 0101.1001 10 +1 линия подчерк.выше
LD (HL),B ; 1.1.00.0011 - МОЕ ИЗМЕНЕНИЕ:
; КУРСОР - МИГАЮЩЕЕ ЗНАКОМЕСТО
; атрибуты не отображать
INC HL ; адрес VG_75+1
LD (HL),27H ; команда START DISPLAY 001.001.11
LD A,(HL) ; читаем STATUS ???
AFAE1: LD A,(HL) ; читаем STATUS
AND 20H ; маска 'Interrupt request flag'
JP Z,AFAE1 ; ждем конца строки
LD HL,VT_57+8 ; далее заёмёмся ВТ57
LD (HL),80H
LD L,4 ; VT_57+04 !! НЕ_КОРРЕКТНО
LD (HL),low SСRN ; 0D0H
LD (HL),high SCRN ; 076H
INC L ; адрес VT_57+5
LD (HL),23H
LD (HL),49H
LD L,8 ; VT_57+8 !! НЕ_КОРРЕКТНО
LD (HL),0A4H
POP HL
RET
Что касается, того, чтобы убрать 2 линии растра разделяющие строки, что позволит использовать псевдографику (и рисовать сплошные вертикальные линии в рамочках), то для этого меняют вторую четверку битов в том же числе 99H. Если будет не 9, а 7, то это значит, что в строке, не 10, а 8 линий растра.
Недостаточно этого, т.к на 20% увеличится частота кадров и на многих телевизорах синхронизация сорвётся. Я видел, что некоторые так и делают. Это неверно. Не у всех профессиональные мониторы AUTOSYNC с хорошей синхронизацией. Поэтому надо изменить число строк с 30 до 38.
Или же надо, изменить число строк отводимое на обратный ход кадровой развертки. Считаем: убрались две линии растра в 30-ти строках. Это 60 строк растра. При 8 линиях растра на строку - это 60:8= 8 строк. Т.е число строк на обратный ход по кадрам надо увеличить с 1 до 9. Что невозможно, т.к максимум строк на обратный ход по кадрам 4. Поэтому можно сделать режим 35+4 строки, что тоже будет соответствовать TV-стандарту, но с'экономит 3*78=234 байта.
Если неохота разбираться в ВГ75, то можно взять любую игру с псевдографикой, прогнать её через IDA и самому посмотреть, как включается графический режим. Получить полноценный листинг сложно, а получить просто вид программы в мнемониках - это дело считанных минут. Найти место, где идёт программирование ВГ75 - не проблема. Тут всё, как в шахматах, - лучший способ совершенствоваться, - это изучать партии мастеров. К сожалению, сами мастера, т.е программисты из 80-тых, уже вымерли, как класс. У меня есть несколько дизассемблированных графических игр, если будут проблемы, то вытащу оттуда и выложу соответствующий кусок листинга. С ВГ75 нельзя полагаться на эмулятор, надо всё проверять в реале.
Теперь по поводу кода 0F1H останавливающего вывод строки и отчего все позиции сдвигаются. Это кажется, недокументированный (или широко недокумметированный ход). Об этом программисты 80-х, похоже не знали, или не использовали. В играх так не делают. Да и неудобно считать позиции фигурок, если нельзя посчитать позицию по формуле, а надо долго колдовать суммируя на калькуляторе длины предыдущих строк
Этот "ход" позволяет уместить в области стандартного экрана не только 30, а даже 36 строк. Но старые игры, по крайней мере из тех, что я "ковырял", так не делают. Т.к экран увеличивается и затирает служебные ячейки ПЗУ, отчего стандартные подпрограммы перестают работать, то разбухший экран просто переносят ниже (обычно на 36D0, чтобы было проще считать позиции пользуясь стандартными таблицами для стандартного экрана 76D0).
Но мне больше симпатичен вариант, когда разбухший экран оставляем в вершине ОЗУ, затирая естественно служебные ячейки ПЗУ, а работаем не подпрограммами ПЗУ, а подпрограммами его копии перетранслированной в ОЗУ, сразу ниже экрана. Это даёт максимально большой сплошной кусок памяти.