3Bit
#01
03 января 2005 |
|
Программинг - сборник кодов: Рисование окна с рамкой в цвете, обработка дисковых ошибок TR-DOS, универсальня процедура Scroll'a экрана.
Рисование окна с рамкой в цвете. (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, бегущая строчка и прочая гадость в прерываниях... ──────────────────────────────────────────
Другие статьи номера:
Похожие статьи:
В этот день... 21 ноября