Рисование окна с рамкой в цвете.
(c) Иван Рощин
(c) Cooper/RSM/P7S
──────────────────────────────────────────
Автором основного алгоритма является
Иван Рощин. Cooper, тобишь я, добавил саму
процедуру печати символа 8х8 (оптимизиро-
ванная на скорую руку. Кому надо - тот
сделает быстрее ;) и поддержку цвета. Да,
и еще, я сделал вызов окна через вектор,
но можете сделать так, как удобнее вам.
При её вызове (метка OPEN_W) в регистро-
вой паре DE нужно задать координаты левого
верхнего угла рамки,в регистре B - высоту,
в C - ширину окна (в символах). Ячейка
COLOR должна содержать цвет.
LD IX,VEKT
CALL OKHO
RET
OKHO LD D,(IX+0)
LD E,(IX+1)
LD B,(IX+2)
LD C,(IX+3)
LD A,(IX+4)
LD (COLOR),A
OPEN_W LD A,"╔" ;Левый верхний угол рамки.
LD L,"╚" ;Левый нижний угол рамки.
CALL OPEN_W2
OPEN_W1 LD A,"═" ;Горизонтальная граница рамки.
LD H," " ;Этим символом заполняется окно.
LD L,A
CALL OPEN_W3
DJNZ OPEN_W1
LD A,"╗" ;Правый верхний угол рамки.
LD L,"╝" ;Правый нижний угол рамки.
OPEN_W2 LD H,"║" ;Горизонтальная граница рамки.
OPEN_W3 PUSH DE
CALL PRSYM
INC D
LD A,H
LD H,C
OPEN_W4 CALL PRSYM
INC D
DEC H
JP NZ,OPEN_W4
LD A,L
CALL PRSYM
POP DE
INC E
RET
;печать символа 8х8 с цветом
;in: DE - координаты, A - код символа
PRSYM PUSH BC
PUSH AF
PUSH DE
PUSH HL
LD L,A
LD H,0
LD BC,42048 ;адрес вашего шрифта
ADD HL,BC
LD A,D
AND 7
RRCA
RRCA
RRCA
OR E
LD E,A
LD A,D
AND 24
OR 64
LD D,A
DUP 7
LD A,(HL)
LD (DE),A
INC H
INC D
EDUP
LD A,(HL)
LD (DE),A
LD A,D
RRCA
RRCA
RRCA
AND 3
OR #58
LD D,A
LD A,%00001111
COLOR EQU $-1
LD (DE),A
POP HL
POP DE
POP AF
POP BC
RET
;---вектор окна-----
;+00 - Y координата
;+01 - X координата
;+02 - X-размер
;+03 - Y-размер
;+04 - цвет окна
;-------------------
;пример вектора окна
VEKT DB 1,1,10,10,15
Обработка дисковых ошибок TR-DOS
(C) Max
──────────────────────────────────────────
Если в вашей программе не требуется де-
лать подробную обработку ошибок с вывали-
вающимся меню, с возможностью выбора Retry
Abort/Ignore,но вы хотите избежать очистки
экрана и появления подлой надписи TR-DOS
"disk error", то в этом вам поможет разра-
ботанная мною короткая процедурка, которая
блокирует все попытки TR-DOS напечатать
сообщение об ошибке, она, в этом случае,
без всяких последствий вернет управление
программе с кодом ошибки в регистре A (ко-
пия системной переменной #5D0F(23823 ).
Если же вам нужно обрабатывать RIA, то
на данную процедурку без особых проблем вы
можете навесить драйвер обработки ошибок,
например, такой, как опубликован в газете
ECHO 3 (автор VfNG). На случай, если у вас
не найдется этой газетки, я привожу этот
драйвер, сразу подключенный к моей програ-
ммке, мной в него было внесено только
определение типа ошибки DISK ERROR или
READ ONLY.
Вместо #3D13 вызываете TR-DOS, oбработка
ошибок без меню RIA TRDOS:
...
PUSH HL
LD HL,(23613) ;Сохр. ERR_SP
LD (ERR+1),HL
LD HL,ERR
EX (SP),HL
LD (23613),SP
EX AF,AF'
XOR A
LD (23823),A
LD (23824),A
LD (23570),A
EX AF,AF'
JP 15635
ERR LD HL,0
LD (23613),HL ;восст. ERR_SP
LD A,6
LD (23570),A
LD A,(23823)
AND A
TRD1 RET Z
PUSH AF
LD IX,W1 ;окно ERROR !
CALL OPWIN ;открыть окно
POP AF
RET
Примечание: если вы используете бейсико-
вские каналы для печати символов или для
каких-либо других целей, то вставьте в
процедуру обработки ошибок перед открытием
окна с сообщением об ошибке инициализацию
нужного канала. Например:
LD A,2
CALL 5633
Кстати, один из способов быстрого взлома
программ - это открывание защелки диско-
вода во время загрузки, и сохранение по
MAGIC'у или вход в монитор, а дальше про-
сто нужно найти LOADER. Так что, если вы
хотите нормально защитить программу, то
подвешивайте ту или иную процедуру обрабо-
тки ошибок.
Опять Scroll...
(c) cooper/RSM/P7S
──────────────────────────────────────────
Предлагаю вашему вниманию небольшую про-
цедурку для сдвига экрана. В чем её преи-
мущества, по сравнению с другими? Во-пер-
вых, она универсальна, т. е. подходит для
скрола как вниз, так и вверх. Всё зависит
от адресов которые вы зададите ей при ста-
рте. Во-вторых, она за раз сдвигает одну
строку, т. е. если надо сдвинуть не весь
экран, а допустим 2/3, то нужно соответст-
венно вызвать её в цикле 16 раз (может это
и не рационально, но зато удобно). В-тре-
тьих, она сдвигает и графику, и атрибуты.
И делает это хитрым путем ;) Ладно, думаю,
сами разберётесь как. Вот её листинг:
LD DE,#4000 ;откуда
LD HL,#4020 ;куда
LD B,#17 ;кол-во строк
MAIN PUSH BC
CALL SCROLL ;вызов проц.сдвига
CALL LL693E ;служебные процедуры (на стр. вверх)
CALL LL6949 ;служебные процедуры (на стр. вниз)
POP BC
DJNZ MAIN
RET
;а это собственно и есть служебные процедуры
;где какая, разберетесь сами, ok?
LL692A LD A,L
SUB #20
LD L,A
RET NC
LD A,H
SUB #08
LD H,A
RET
LL6934 LD A,E
SUB #20
LD E,A
RET NC
LD A,D
SUB #08
LD D,A
RET
LL693E INC H
LD A,L
SUB #E0
LD L,A
RET NC
LD A,H
SUB #08
LD H,A
RET
LL6949 INC D
LD A,E
SUB #E0
LD E,A
RET NC
LD A,D
SUB #08
LD D,A
RET
;непосредственный scroll screen
SCROLL PUSH HL
PUSH DE
LD A,D
RRCA
RRCA
RRCA
AND #03
OR #58
LD D,A
LD A,H
RRCA
RRCA
RRCA
AND #03
OR #58
LD H,A
DUP 32
LDI
EDUP
POP DE
POP HL
LD BC,#00F8
JP LOOP2
LOOP1 INC H
INC D
LOOP2 DUP 31
LDI
EDUP
LD A,(HL)
LD (DE),A
INC H
INC D
DUP 31
LDD
EDUP
LD A,(HL)
LD (DE),A
JP PE,LOOP1
RET
И ещё момент - она используется в нашем
журнале, т.е. вы можете оценить её быстро-
действие на живом примере. Кстати, в жур-
нале она работает медленее оригинала. Сами
понимаете, музыка, scroll bar, бегущая
строчка и прочая гадость в прерываниях...
──────────────────────────────────────────