ZX Club #08
31 мая 1998


   (c) 1998 Eraser/Fast Gr./Elders Gr.

         Мысли вслух или введение

   Открывая данный раздел я предполагал  в
первую очередь  оказать помощь в  освоении
маш. кода начинающим и более опытным коде-
рам. Некоторые кодеры,а скорее всего,ламе-
ры,косящие под кодеров,будут протестовать:
"Ну зачем! Это везде  написано! ". Как  ни
странно, но большинство думает, что приток
начинающих  кодеров  закончился, и   будут
неправы. Приток идет, но только с  меньшей
силой,  и   многие,  кто   даже   еще   не
разобрался со Спекком, уходят с него на ПЦ
именно  из-за  того, что  сталкиваются   с
вышеупомянутыми  ламерами, которые  их  не
понимают и не стараются оказать  посильную
помощь, а иногда даже и отталкивают.
   Но вернемся к разделу... Он был сначала
задуман   для   начинающих,   но    будет,
наверное, полезен и более или менее иску-
шенным программистам.
   Хочу    сразу    оговориться     насчет
ассемблеров. Они, конечно, все  разные, т.
е. каждый из них имеет свои достоинства  и
свои недостатки:

* GENS 4;
* ZEUS;
* ALASM;
* ZXASM;
* XAS;
* STORM;
* MASM и другие, которые я не "юзал".

   Шестой и восьмой номера  "клубов"  были
собраны в ALASM  3. 8c, который  некоторые
люди поливают его  грязью, хотя  какая  им
разница на чем кто пишет (может зависть?).
Разумеется   и   листинг   приводится    в
мнемонике ALASM`а.
   На сей ноте закончу  свои  высказывания
по поводу данного раздела  и  приступлю  к
обзору процедур:

       Печать 42 символа в строке.

   Для  качественного   оформления   своих
программ,   для     хорошего     скроллера
необходима быстрая  печать  42  символа  в
строке.  Привожу    несколько    вариантов
печати:

;
;          Матюшев Александр
;           г.Сланцы, 1996
;                from
;          ZX-Ревю 4-5`1996
;
; Вход: с адреса TEXT начинается текст
; Выход: печать текста
; Комментарий: поддержка управляющх кодов:
; печать в знакоместе X,Y: 22,X,Y
; цветная печать:
; 16, INK+PAPER*8+BRIGHT*64+FLASH*128,
; встрерив этот код (16) процедура
; положит следующее за ним число в
; переменную ATTR_T (23695)
; и установит временные
; аттринуты печати

        ORG 25000; начало программы
        LD HL,TEXT
WRITE   LD A,(XTXT)
        CP 42
        JR C,WR2
        LD A,(YTXT)
        INC A
        CP 24
        JR C,WR1
        XOR A
WR1     LD (YTXT),A
        XOR A
        LD (XTXT),A
WR2     LD A,(HL)
        INC HL
        AND A
        RET Z
        CP 32
        JR C,WRIT2
WRIT1   CALL PRSYM
        JR WRITE
WRIT2   CP 16
        JR NZ,WRITЗ
        LD A,(HL)
        LD (23695),A
        INC HL
        JR WR2
WRITЗ   CP 22
        JR NZ,WRITЧ
        LD A,(HL)
        LD (YTXT),A
        INC HL
        LD A,(HL)
        LD (XTXT),A
        INC HL
        JR WRITE
WRITЧ   LD A,"?"
        JR WRIT1
PRSYM   EXX
        PUSH HL
        LD L,A
        LD H,0
        ADD HL,HL
        ADD HL,HL
        ADD HL,HL
        LD DE, FONT-256; шрифт
        ADD HL,DE
        PUSH HL
        CHECK LD DE,(XTXT)
        LD A,E
        ADD A,A
        LD E,A
        ADD A,A
        ADD A,E
        LD E,255
        LD L,8
CHPL1   INC E
        SUB L
        JR NC,CHPL1
        ADD A,L
        LD H,A
        LD A,L
        SUB H
        LD (SL1-1),A
        LD (SL2-1),A
ADDRZ   LD A,D
        AND #18
        ADD A,#40
        LD H,A
        LD A,D
        AND 7
        RRCA
        RRCA
        RRCA
        ADD A,E
        LD L,A
        PUSH HL
AADDR   LD A,H
        RRCA
        RRCA
        RRCA
        AND #03
        OR #58
        LD H,A
ATTR    LD A,(23695)
        LD (HL),A
        POP HL
        POP DE
        LD C,8;           *
SCRL    LD A,(DE)
        LD B,0
SL1     SRL (HL)
        DJNZ SL1
        AND A
        LD B,0
SL2     RL A
        RL (HL)
        DJNZ SL2
        INC HL
        LD (HL),A
        DEC HL
        INC H
        INC DE
        DEC C
        JR NZ,SCRL
FINIS   LD HL,XTXT
        INC (HL)
        POP HL
        EXX
        RET
XTXT    DEFB 0
YTXT    DEFB 0
TEXT    DEFM "Speccy - Rulez"
        DEFB 0; конец текста

FONT INCBIN "font"; здесь загрузить
                  ;           шрифт

   Длина  чистого  кода  175  байт;  старт
процедуры 25000, но  можно  изменить  и на
другой.


   Если  использовать   символьный   набор
шириной  6  пикселов, прижатый  к   левому
верхнему   углу   знакоместа,  то    нужно
изменить строку, отмеченную звездочкий  на
LD C,6.
   Данная процедура печати работает  очень
медленно, но занимает и меньше  байтов. Ее
выгоднее   всего   применять    там,   где
приходится печатать  небольшие  сообщения,
но не более.

   Привожу вторую версию печати 42 символа
в строке, которая была применена в  ZXC#6:

;
;     Специально для читатлелей Cluba
;
; Вход: в DE адрес текста. Упр. код <13>
; соответствует концу  текста, т. е. выход
; из процедуры
; Выход: печать текста
; Комментарий: поддержка упр. кодов, как в
; предыдущей процедуре
;

       ORG 25000
       LD DE,TXT
       CALL PRINT
       RET
       TXT DEFB 22,1,9,16,1
       DEFB "ELDERS GROUP`1998",13
PRINT  LD A,(DE)
       INC DE
       CP 13
       RET Z
       CP 16
       JR Z,COLOR
       CP 22
       JR Z,AT
       CALL rst
       JR PRINT
COLOR  LD A,(DE)
       LD (PERЗ),A
NEXT   INC DE
       JR PRINT
AT     LD A,(DE)
       LD (PERЧ),A
       INC DE
       LD A,(DE)
       LD (PER2),A
       JR NEXT
CV     LD A,L
       LD B,A
       SRL A
       SRL A
       LD C,A
       ADC A,C
       ADD A,C
       LD L,A
       LD A,H
       AND 7
       RRCA
       RRCA
       RRCA
       ADD A,L
       LD L,A
       LD A,H
       AND 24
       OR 64
       LD H,A
       PUSH HL
       LD A,B
       AND 3
       ADD A,A
       LD L, A
       LD H,0
       LD BC,PER1
       ADD HL,BC
       LD C,(HL)
       INC HL
       LD B,(HL)
       POP HL
       RET
CVV    PUSH HL
       PUSH DE
       PUSH BC
       EX DE,HL
       LD L,A
       LD H,0
       ADD HL,HL
       ADD HL,HL
       ADD HL,HL
       LD BC,FONT-256; шрифт
       ADD HL,BC
       EX DE,HL
       CALL CV
       EXX
       LD B,8
CVP    EXX
       LD A,(DE)
       BIT 7,B
       JR NZ,MUK
       RRCA
       RRCA
       BIT 0,C
       JR NZ,MUK
       RRCA
       RRCA
       BIT 3,B
       JR NZ,MUK
       RRCA
       RRCA
MUK    EXX
       LD C,A
       EXX
       BIT 0,C
       JR NZ,MUK2
       LD A,B
       CPL
       AND (HL)
       LD (HL),A
       EXX
       LD A,C
       EXX
       AND B
       OR (HL)
       LD (HL),A
       BIT 7,B
       JR NZ,MUKЗ
MUK2   INC L
       LD A,C
       CPL
       AND (HL)
       LD (HL),A
       EXX
       LD A,C
       EXX
       AND C
       OR (HL)
       LD (HL),A
       DEC L
MUKЗ   INC H
       INC DE
       EXX
       DJNZ CVP
       EXX
       LD A,H
       SUB 8
       AND 24
       RRCA
       RRCA
       RRCA
       OR 88
       LD H,A
       LD A,(PERЗ)
       BIT 0,C
       JR NZ,MUKЧ
       LD (HL),A
       BIT 7,B
       JR NZ,MUKS
MUKЧ   INC L
       LD (HL),A
MUKS   POP BC
       POP DE
       POP HL
       RET
ZXCLUB EXX
       LD A,(DE)
       INC DE
       LD H,0
       LD L,A
       ADD HL,HL
       ADD HL,HL
       ADD HL,HL
       ADD HL,BC
       PUSH HL
       EXX
       DJNZ ZXCLUB
       EXX
       POP HL
       EXX
       POP BC
       POP DE
       POP HL
       EXX
       PUSH DE
       LD B,8
LOOP   EXX
       LD A,(DE)
       INC DE
       EXX
       RLCA
       RLCA
       LD D,A
       AND 3
       EXX
       OR (HL)
       INC HL
       LD (IX+0),A
       INC LX
       LD A,(BC)
       INC BC
       EXX
       RRCA
       RRCA
       RRCA
       RRCA
       LD C,A
       AND 15
       LD E,A
       LD A,D
       AND 240
       OR E
       LD (IX+0),A
       LD A,LX
       LD D,A
       AND 31
       CP 31
       JR Z,BOL
       INC LX
       LD A,C
       AND 192
       LD C,A
       LD A,(HL)
       INC HL
       RRCA
       RRCA
       OR C
       LD (IX+0),A
       LD D,LX
       DEC LX
BOL    DEC LX
       INC HX
       DJNZ LOOP
       LD A,HX
       SUB 8
       LD HX,A
       INC D
       LD LX,D
       POP DE
       POP BC
       RET
rst    PUSH AF
       PUSH HL
       LD HL,(PER2)
       CALL CVV
       INC L
       LD A,L
       CP 42
       JR C,HORIZ
       LD L,0
       INC H
       LD A,H
       CP 24
       JR C,HORIZ
       LD H,0
HORIZ  LD (PER2),HL
       POP HL
       POP AF
       RET

PER1   DEFB #00,#FC
       DEFB #F0,#03
       DEFB #C0,#0F,#3F
       DEFB #00,#00
PER2   DEFB #11,#16
PERЗ   DEFB #00,#00
PERЧ   EQU  $-  3
       DEFS 6
FONT   INCBIN "font"; здесь загрузить
                    ;           шрифт

   Теперь      разрешите       представить
турбодрайвер, который был выдран  из  демы
"RAGE". Его  приемущество   -   достаточно
быстрая  скорость  загрузки, учитывая  то,
что сама процедура  "весит"  90  с  лишним
баит. Данный драйвер применяется во многих
демах (RAGE, SЧB, OPERA...)

;
; HL - адрес загрузки
; DE - дорожка/сектор
; B  - количество секторов для загрузки
;
; На выходе:
; загрузка данных в память без обработки
; ошибок и выход, конечно
;
       ORG  24576

; Пример использования процедуры

       LD A,(23830); переносим текущий
       AND 3; дисковод из TR-DOS в
       LD (DISK),A; турбо-загрузчик
                  ; хотя не мешало бы
                  ; воспользоваться
                  ; первой функцией
                  ; TR-DOS`а
       LD HL,16384; адрес загрузки
       LD DE,0000; с какого трека и сектора
       LD B,27; сколько секторов
       CALL LOADT; вызов самой процедуры
       RET

; Сам турбо-загрузчик

LOADT  PUSH BC
       LD C,D
       SRL C
       LD A,44
       JR C,PEREH
       LD A,60
PEREH  OR 0
DISK   EQU $- 1
       LD IX,8179; OUT (255),A
       CALL DOS
       LD A,C
       LD C,127
       LD IX,10835; OUT (C),A
       CALL DOS
       LD A,24
       LD IX,12227; OUT (31),A
       CALL DOS
       POP BC
       PUSH DE
       PUSH BC
       LD IX,12059
       CALL DOS
       POP BC
       POP DE
       INC E
       INC H
       BIT 4,E
       JR NZ,SLED
       DJNZ LOADT
       RET
SLED   INC D
       LD E,0
       DJNZ LOADT
       RET
DOS    PUSH IX; вызов процедур из TR-DOS
       JP 15663

P.S. В следующем номере журнала вы сможете
найти красивые оконные процедурки;)

(c) Predator/Fast Group

   Полностью  согласен с  Eraserom. Я  да-
леко не ассемблерный  монстр и сам по себе
знаю,  что  очень  много  хороших  идей  у
начинающих   разбиваются  о  всем  извест-
ный   машинно-кодовый   барьер.  И  до  90
процентов  -  это  незнание, как  оформить
программу даже на примитивном  уровне, как
организовать  хоть  какой-нибудь  интефейс
с  пользователем. Поэтому   данный  раздел
просто  необходим. Известные  издания (ZX-
Format, допустим), начали публиковать ста-
тьи на тему  "Асемблер для  начинающих", а
мы  чем  хуже?  Неужели  в  славном  граде
Барнауле не найдутся  кодеры? Они (хорошие
и  не  очень) есть, но  их  мало, а  новых
притоков действительно не видно.

   Ну так вот, от себя я хочу добавить мои
любимые окошки  из крутой книжки "Как  на-
писать   игру   на  Ассемблере. Выпуск  2"
(вдруг у кого ее нет)  и процедуру  печати
текстовых  сообщений,аналогичную процедуре
8252  из  ПЗУ,  но  работающую  раз  в  10
быстрее. Так как печать символа переделана
мною на  вариант с  использованием  стека,
то  процедура   работает   раз   в   12-15
быстрее,  что  особенно  заметно  при  пе-
чати больших объемов текстов. Если Вы,ува-
жаемые начинающие, видели мои   программки
(ZX<>BMP  converter, Disk  Copy), то могли
наблюдать эти  процедуры в  действии. Воз-
можно, программы   покажутся   однообразно
оформленными, но вся прелесть этих малень-
ких процедурок в том,что они ЕСТЬ, стопро-
центно рабочие  и  не  требуют  каких-либо
переделок под конкретную  программу. Оста-
остается  только сделать  include "window.
a" и рисовать столько окошек, сколько нуж-
но.Кстати, option  selector я  взял из ZX-
Club #5.

   Итак, процедура  window  строит   цвет-
ное окошко нужных размеров в заданных  ко-
ординатах, причем  окно окаймляется  и от-
брасывает тень.

window  inc (ix)
        inc (ix+1)
        ld a,(ix+4)
        push af
        ld (ix+4),1
        call setw
        dec (ix)
        dec (ix+1)
        pop af
        ld (ix+4),a
        call clsw
        call setw
        call box
        ret

setw    ld de,#5800
        ld b,(ix+3)
        ld c,(ix+2)
        ld a,(ix+1)
        ld l,a
        ld h,0
        add hl,hl
        add hl,hl
        add hl,hl
        add hl,hl
        add hl,hl
        add hl,de
        ld a,l
        add a,(ix)
        ld l,a
        ld a,(ix+4)
setw1   push bc
        push hl
setw2   ld (hl),a
        inc hl
        dec c
        jr nz,setw2
        pop hl
        pop bc
        ld de,32
        add hl,de
        djnz setw1
        ret

;---------------------------------------

clsw    ld b,(ix+3)
        ld c,(ix+2)
        ld a,(ix+1)
clsw1   push af
        push bc
        push de
        call 3742
        pop de
        ld a,l
        add a,(ix)
        ld l,a
        ld b,8
clsw2   push hl
        push bc
        ld b,c
clswЗ   ld (hl),0
        inc hl
        djnz clswЗ
        pop bc
        pop hl
        inc h
        djnz clsw2
        pop bc
        pop af
        inc a
        djnz clsw1
        ret

;---------------------------------------

box     ld a,(ix+1)
        push af
        call 3742
        ld a,l
        add a,(ix)
        ld l,a
        ld b,(ix+2)
box1    ld (hl),255
        inc hl
        djnz box1
        ld b,(ix+3)
        pop af
box2    push af
        push bc
        call 3742
        ld a,l
        add a,(ix)
        ld l,a
        ld b,8
boxЗ    push hl
        ld a,(hl)
        or 128
        ld (hl),a
        ld a,(ix+2)
        add a,l
        dec a
        ld l,a
        ld a,(hl)
        or 1
        ld (hl),a
        pop hl
        inc h
        djnz boxЗ
        pop bc
        pop af
        inc a
        djnz box2
        dec h
        ld b,(ix+2)
boxЧ    ld (hl),255
        inc hl
        djnz boxЧ
        ret

   Пример использования окошек:

       ld ix,winO
       call window
       ret
winO   db 10,0,5,6,1*8+0

   Первый  параметр  задает  X, второй  Y,
дальше - ширина и высота окна,а последний
параметр - атрибуты окна, которые вычисля-
ются   по  формуле: ink + 8 * paper + 64 *
bright + 128 * flash.

   А теперь процедура  печати сообщения. В
регистре HL нужно задать адрес сообщения.В
конце   сообщения   необходимо   поставить
0. Процедура   полностью  понимает  управ-
ляющие коду.Наиболее употребимые:22, X,Y -
куда   выводить   текст; 16,  INK  -  цвет
текста; 17, PAPER - цвет  бумаги; 18, флаг
(0 или 1) - FLASH;  19,флаг - BRIGHT;  20,
флаг - INVERSE; 21,флаг - OVER.  Процедура
не требует переопределения к анала вывода,
т.е. LD A,2:CALL 5633 больше не требуется.


write   ld a,(hl)
        inc hl
        and a
        ret z
        cp " "
        jr c,write2
write1  call prsym
        jr write
write2  push hl
        push bc
        ld hl,table
        ld c,a
writeЗ  ld a,(hl)
        inc hl
        and a
        jr z,writeS
        cp c
        jr z,writeЧ
        inc hl
        inc hl
        jr writeЗ
writeЧ  pop bc
        ld a,(hl)
        inc hl
        ld h,(hl)
        ld l,a
        ex (sp),hl
        ret
writeS  pop bc
        pop hl
        ld a,"?"
        jr write1
pr_13   push hl
        ld hl,(23684)
        ld a,l
        and %11100000
        add a,#20
        ld l,a
        jr nz,pr13_1
        ld a,h
        add a,8
        ld h,a
        cp #58
        jr c,pr13_1
        ld h,#40
pr13_1  ld (23684),hl
        pop hl
        jr write
pr_16   ld a,(hl)
        and %111
        push bc
        ld b,%11111000
pr16_1  ld c,a
        ld a,(iy+85)
        and b
        or c
        ld (iy+85),a
pr16_2  pop bc
        inc hl
        jr write
pr_17   ld a,(hl)
        and %111
        rlca
        rlca
        rlca
        push bc
        ld b,%11000111
        jr pr16_1
pr_18   ld a,(hl)
        and 1
        push bc
        ld b,%10111111
pr18_1  rrca
        jr pr16_1
pr_19   ld a,(hl)
        and 1
        push bc
        ld b,%10111111
        rrca
        jr pr18_1
pr_20   ld a,(hl)
        and 1
        push bc
        ld b,%11110111
        rlca
        rlca
pr20_1  rlca
        ld c,a
        ld a,(iy+87)
        and b
        or c
        ld (iy+87),a
        jr pr16_2
pr_21 ld a,(hl)
        and 1
        push bc
        ld b,%11111101
        jr pr20_1
pr_22   ld a,(hl)
        cp 24
        jr nc,outscr
        inc hl
        push de
        push hl
        call 3742
        pop de
        ld a,(de)
        cp 32
        jr nc,outscr
        inc de
        add a,l
        ld l,a
        ld (23684),hl
        pop hl
        ex de,hl
        jp write
putscr  rst 8
        db 4
prsym   push bc
        push de
        push hl
        ld l,a
        ld h,0
        add hl,hl
        add hl,hl
        add hl,hl
        ld de,(23606)
        add hl,de
        ld de,(23684)
        ex de,hl
        push hl
        ld b,8
prs1    ld a,(de)
        bit 3,(iy+87)
        jr z,prs2
        cpl
prs2    bit 1,(iy+87)
        jr z,prsЗ
        xor (hl)
prsЗ
;--------------------------------------
        ld (st2),de
        ld (st1),sp
        ld sp,#0000
st2     equ $-2
        pop de
        ld (hl),e
        inc h
        ld (hl),d
        inc h
        pop de
        ld (hl),e
        inc h
        ld (hl),d
        inc h
        pop de
        ld (hl),e
        inc h
        ld (hl),d
        inc h
        pop de
        ld (hl),e
        inc h
        ld (hl),d
        inc h
        ld sp,(st1)
;--------------------------------------
        pop hl
        push hl
        ld a,h  
        and #18
        rrca
        rrca
        rrca
        add a,#58
        ld h,a
        ld a,(23695)
        ld (hl),a
        pop hl
        inc l
        jr nz,prsЧ
        ld a,h
        add a,8
        ld h,a
        cp #58
        jr c,prsЧ
        ld h,#40
prsЧ    ld (23684),hl
        pop hl
        pop de
        pop bc
        ret
table
        db 13
        dw pr_13
        db 16
        dw pr_16
        db 17
        dw pr_17
        db 18
        dw pr_18
        db 19
        dw pr_19
        db 20
        dw pr_20
        db 21
        dw pr_21
        db 22
        dw pr_22
        db 0
st1     dw 0

───────────────────────────────────DI:HALT



Other articles:


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

Similar articles:
Scribble brain - Sami persecuted themselves drink ... its time to drink vodka.

В этот день...   21 November