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,  бегущая
строчка и прочая гадость в прерываниях...
──────────────────────────────────────────




Темы: Игры, Программное обеспечение, Пресса, Аппаратное обеспечение, Сеть, Демосцена, Люди, Программирование

Похожие статьи:
Авторы - авторы газеты.
Birthday List v0.0 - Список дней рождений.
How Demos Are REALLY Made

В этот день...   12 ноября