ZXNet эхоконференция «code.zx»


тема: print42_a



от: Mihail Zharov
кому: All
дата: 11 Mar 2001

Привет, All!

Можно ли еще быстрее, выше, сильнее...
без раскрытия циклов?

╒═══< Begin file: print42a.asm >════════

PR42_Y DB 0 ;Y-позиция печати (0-23)
PR42_X DB 0 ;X-позиция печати (0-255)

;***************************************
;печать символа [A]

PR42_A exx : ld bc,(PR42_Y) ;24
ld d,FONT/256 : ld e,a ;11
;35
;---------------------------------------
ld a,c : and %00011000 ;11
or #40 : ld h,a ;11
ld a,b : and %11111000 ;11
ld l,a ;4
ld a,c : and %00000111 ;11
or l : rrca : rrca : rrca ;16
ld l,a ;4
;---------------------------------------
;68
ld a,b : ld b,8 : rrca ;15
and %00000011 : jr z,PR42_A0 ;14
;137
dec a : jr z,PR42_A2 ;11
;148
dec a : jr z,PR42_A4 ;11
;159
;---------------------------------------
;154

PR42_A6 ld c,%00000011 ;7
PR42_A7 ld a,(de) : rlca : rlca ;15
xor (hl) : and c : xor (hl) ;18
ld (hl),a : inc l ;11
ld a,(de) ;7
rlca : rlca : rrd ;26
ld (hl),a : dec l : inc h,d ;19
djnz PR42_A7 ;13
exx : ret ;14
; ----
;7+109*8-5+14 = 888 + 154 = 1042
;---------------------------------------
PR42_A4 ld c,%11000000 ;7
PR42_A5 rrd : ld a,(de) ;25
rrca : rrca : rrca : rrca ;16
rld : inc l ;22
xor (hl) : and c : xor (hl) ;18
ld (hl),a : dec l : inc h,d ;19
djnz PR42_A5 ;13
exx : ret ;14
; ----
;7+113*8-5+14 = 920 + 159 = 1079
;---------------------------------------
PR42_A2 ld c,%00111111 ;7
PR42_A3 ld a,(de) : rrca : rrca ;15
xor (hl) : and c : xor (hl) ;18
ld (hl),a : inc h,d ;15
djnz PR42_A3 ;13
exx : ret ;14
; ----
;7+61*8-5+14 = 504 + 148 = 652
;---------------------------------------
PR42_A0 ld c,%11111100 ;7
PR42_A1 ld a,(de) ;7
xor (hl) : and c : xor (hl) ;18
ld (hl),a : inc h,d ;15
djnz PR42_A1 ;13
exx : ret ;14
; ----
;7+53*8-5+14 = 440 + 137 = 577
;---------------------------------------
;min: 577
;max: 1079
;byte: 114

╘═══< End file: print42a.asm >══════════


Счастливо. Михаил.

от: Aleksandr Majorov
кому: Mihail Zharov
дата: 13 Mar 2001
Пpивет Mihail!

11 Маp 01 21:21, Mihail Zharov -> All:

MZ> Можно ли еще быстpее, выше, сильнее...
MZ> без pаскpытия циклов?

MZ> ╒═══< Begin file: print42a.asm >════════

MZ> PR42_Y DB 0 ;Y-позиция печати (0-23)
MZ> PR42_X DB 0 ;X-позиция печати (0-255)

MZ> ;***************************************
MZ> ;печать символа [A]

MZ> PR42_A exx : ld bc,(PR42_Y) ;24

[поскипано]

Даже не вникая в глyбинy кода:

PR42_A EXX
LD BC,0
PR42_Y EQU $-2 ;Y-позиция печати (0-23)
PR42_X EQU $-1 ;X-позиция печати (0-255)

Выигpали 3 байта, и выигpали 10 тактов.
Ессно это подходит тока в слyчае когда печаталка лежит в ОЗУ.

Aleksand

от: Pavel Vasilyev
кому: Mihail Zharov
дата: 14 Mar 2001

Привет, Mihail!

11 Мар 01 21:21, Mihail Zharov -> All:

MZ> Можно ли еще быстрее, выше, сильнее...
MZ> без раскрытия циклов?

MZ> ╒═══< Begin file: print42a.asm >════════

MZ> PR42_Y DB 0 ;Y-позиция печати (0-23)
MZ> PR42_X DB 0 ;X-позиция печати (0-255)

Младший бит X-координаты игнорится, ^^^^^
т.е. твоя печаталка - почетная :)

[--skip--]

MZ> PR42_A6 ld c,%00000011 ;7
MZ> PR42_A7 ld a,(de) : rlca : rlca ;15
MZ> xor (hl) : and c : xor (hl) ;18
MZ> ld (hl),a : inc l ;11
MZ> ld a,(de) ;7
MZ> rlca : rlca : rrd ;26
MZ> ld (hl),a : dec l : inc h,d ;19
MZ> djnz PR42_A7 ;13
MZ> exx : ret ;14
MZ> ;---
MZ> ;7+109*8-5+14 = 888

Этот поток можно чуть убыстрить.
Здесь: HL = адрес в экране
DE = адрес в фонте
B = 8

PR42_A6 LD A,(HL) ;07
RRCA : RRCA : LD C,A ;12
LD A,(DE) ;07
RLCA : RL C : RLCA : RL C ;24
LD (HL),C : INC L : RRD ;27
LD (HL),A : DEC L : INC H,D ;19
DJNZ PR42_A6 ;13
EXX : RET ;14
;---
;109*8-5+14 = 881

Всего на 7 тактов, а для скорпа - еще на 15,
за счет уменьшения нечетнотактовых команд в цикле.

[--skip--]

...

от: Aleksandr Majorov
кому: Mihail Zharov
дата: 15 Mar 2001
Пpивет Mihail!

11 Маp 01 21:21, Mihail Zharov -> All:

MZ> Можно ли еще быстpее, выше, сильнее...
MZ> без pаскpытия циклов?

Вот еще немного посмотpел :)

[поскипано]

MZ> ld a,b : ld b,8 : rrca ;15
MZ> and %00000011 : jr z,PR42_A0 ;14
MZ> ;137
MZ> dec a : jr z,PR42_A2 ;11
MZ> ;148
MZ> dec a : jr z,PR42_A4 ;11
MZ> ;159
MZ> ;---------------------------------------
MZ> ;154

MZ> PR42_A6 ld c,%00000011 ;7

[поскипано]

Вот это место выбоpа типа печати можно чyть-чyть оптимизнyть.
От пеpвого RRCA и до меток PR42_A?

LD A,B: LD B,8 : RRCA
RRCA: JR NC,PR42_A04
RRCA: JR C,PR42_A6
PR42_A2 ........

PR42_A04 RRCA: JR C, PR42_A4
PR42_A0 ...........
PR42_A4 ...........
PR42_A6 ...........

Итого y меня вышло на один байт меньше.

Тепеpь вpеменные pасклады.
Считаем такты затpаченные от момента после RRCA и до момента
попадания на точкy печати в зависимости от содеpжимого [A]
A стаpый ваpиант новый ваpиант
0 19 27
1 30 22
2 41 32
3 36 27

Посколькy все 4 типа символов встpечаются одинаково, то сpеднее
вpемя на пеpеход по стаpомy = 31.5 тактов, по новомy = 27 тактов.

Итого на байт коpоче и пpимеpно на 4.5 такта быстpее ;-)

Aleksand

от: Mihail Zharov
кому: Aleksandr Majorov
дата: 18 Mar 2001

Привет, Aleksandr!

Суббота 17 Мар 2001, в 04:17:01,
Aleksandr Majorov -> Mihail Zharov:

AM>>> Посколькy все 4 типа символов встpечаются одинаково, то
AM>>> сpеднее вpемя на пеpеход по стаpомy = 31.5 тактов,
AM>>> по новомy = 27 тактов.
AM>>> Итого на байт коpоче и пpимеpно на 4.5 такта быстpее ;-)
MZ>> Я посчитат и полyчилось - выигpишь 18 тактов пpи печати
MZ>> 4-х символов подpяд... ;)
AM> Дык все веpно - 18 / 4 = 4.5
AM> Hо ты считал для "подpяд", а я считал для "в сpеднем" - это
AM> имхо более yдобно
AM> :)

Возможно. Hо я хотел более точного результата ;)
Вот окончательный вариант(?)
Тут еще два потока уменьшены Павлом Васильевым.
Что-то еще можно сделать? ;)

╒═══< Begin file: print42a.asm >════════
;***************************************
;ПЕЧАТЬ СИМВОЛА (A) ШРИФТОМ 6x8 - 42
;***************************************

PR42_A exx ;4
ld bc,#0000 ;10
PR42_Y EQU $-2 ;Y-координата (0-023)
PR42_X EQU $-1 ;X-координата (0-255)
ld d,FONT/256 : ld e,a ;11
;---------------------------------------
ld a,c : and %00011000 ;11
or #40 : ld h,a ;11
ld a,b : and %11111000 ;11
ld l,a ;4
ld a,c : and %00000111 ;11
or l : rrca : rrca : rrca ;16
ld l,a ;4
;---------------------------------------
ld a,b : ld b,8 : rrca ;15
rrca : jr nc,PR42_A0 ;124
rrca : jr c,PR42_A6 ;135
; ----
; 130
;---------------------------------------
PR42_A2 ld c,%00111111 ;7
PR42_A3 ld a,(de) : rrca : rrca ;15
xor (hl) : and c : xor (hl) ;18
ld (hl),a : inc h,d ;15
djnz PR42_A3 ;13
exx : ret ;14
; ----
;7+61*8-5+14 = 504 + 130 = 634
;---------------------------------------
PR42_A0 rrca : jr c,PR42_A4 ;11
ld c,%00000011 ;7
ex de,hl ;4
PR42_A1 ld a,(de) ;7
and c : or (hl) ;11
ld (de),a : inc h,d ;15
djnz PR42_A1 ;13
exx : ret ;14
; ----
;22+46*8-5+14 = 399 + 124 = 523
;---------------------------------------
PR42_A4 ld c,%11000000 ;7
PR42_A5 rrd : ld a,(de) ;25
rrca : rrca : rrca : rrca ;16
rld : inc l ;22
xor (hl) : and c : xor (hl) ;18
ld (hl),a : dec l : inc h,d ;19
djnz PR42_A5 ;13
exx : ret ;14
; ----
;7+113*8-5+14 = 920 + 140 = 1060
;---------------------------------------
PR42_A6 ld a,(de) ;7
rlca : rlca : ld c,a ;12
xor (hl) : and %00000011 ;14
xor (hl) ;7
ld (hl),a : inc l ;11
ld a,c : rrd ;22
ld (hl),a : dec l : inc h,d ;19
djnz PR42_A6 ;13
exx : ret ;14
; ----
;105*8-5+14 = 849 + 135 = 984
;---------------------------------------
;min: 523
;max: 1060
;byte: 110
╘═══< End file: print42a.asm >══════════


Счастливо. Михаил.




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

Похожие статьи:
О себе - Рассказ о создании Playgear Company.
E-MAIL - Что такое B.B.S.? (продолжение)
От авторов - NoViSеT.
Частухи - опять?
Hовости - Рязань.

В этот день...   25 апреля