ZX Club
#08
31 мая 1998 |
|
Soft Group - Печать 42 символа в строке, турболоадер из демы "RAGE", процедура рисования окна.
(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
Другие статьи номера:
Похожие статьи:
В этот день... 21 ноября