Это правда что в Spectrum Expert (1, 2) была самая быстрая процедура рисования линии?
Если у кого-нибудь есть быстрее, то поделитесь кодом плиз.
(естественно, что установка точки включается в рисование линии)
Вид для печати
Это правда что в Spectrum Expert (1, 2) была самая быстрая процедура рисования линии?
Если у кого-нибудь есть быстрее, то поделитесь кодом плиз.
(естественно, что установка точки включается в рисование линии)
Самая быстрая процедура линии написана Alex Raider'ом. Исходники лежат в архиве ZX Open Source http://opensourcezx.untergrund.net/e..._misc_src.html
Кстати вот, линии Alex Raider'a и которая в Spectrum Expert'e по скорости и алгоритму работа почти одинаковые (около 9 линий во фрейм), однако та которая в Expert-e меньше размером.
ээээ! ты что, в экспертовской генерится огромная процедура отрисовки! а у рэйдера нет. правда, у него чуть медленнее, самую малость.
ну, учитывая что я час назад сделал две тестовые проги и посчитал их размер (размер самих процедур отрисовки и генерации табличек + размер данных которые эти генерилки генерят) + сделал приблизительный замер скорости (по бордюру), то я уверен в том что говорю.
могу отправить SCL файл с этим всем добром
ELPH - ну не такая уж и огромная...
Нашел процедуру авторства Unwinder. Юзаю сам. Весьма быстро и хорошо. Требует 4кб памяти под таблицу и вызов MAK_PLO перед рисованием (заполнение таблицы)
Код:;-----------------------------------------
LINE_R LD (STACK+1),SP ;ПРОЦЕДУРА РИСОВАНИЯ ЛИНИИ
DI
LD A,L ;В HL И DE НАХОДЯТСЯ КООРДИНАТЫ ТОЧЕК
CP E
JR NC,NO_EXCH
EX DE,HL
LD A,L
NO_EXCH: SUB E
LD C,A
LD A,H
SUB D
JR C,DOWN_UP
UP_DOWN: LD B,A ;РИСУЕМ ЛИНИЮ СВЕРХУ ВНИЗ
LD H,58 ;LIN_ARR/512+2
LD L,D
JP MISS
;-----------------------------------------
DOWN_UP: NEG ;РИСУЕМ ЛИНИЮ СНИЗУ ВВЕРХ
LD B,A
LD H,59 ;LIN_ARR/512+3
LD A,191
SUB D
LD L,A
MISS: ADD HL,HL
LD SP,HL
LD H,'LIN_ARR
LD L,D
LD A,(HL)
INC H
LD D,(HL)
INC H
LD L,E
ADD A,(HL)
LD E,A
INC H
LD L,(HL)
EX DE,HL
LD A,B
CP C
JR NC,VERTIC
HORIZON: DEFB 221 ;ГОРИЗОНТАЛЬНАЯ ЛИНИЯ (DX>DY)
LD L,A
DEFB 221
LD H,C
LD B,C
LD C,E
LD A,B
SRL A
JR Z,END_LIN
EX AF,AF'
HORIZ0: LD A,(HL)
OR C
LD (HL),A
EX AF,AF'
DEFB 221
SUB L
JR NC,HORIZ2
DEFB 221
ADD A,H
POP DE
ADD HL,DE
HORIZ2: EX AF,AF'
RRC C
JR NC,HORIZ1
INC L
HORIZ1: DJNZ HORIZ0
END_LIN: LD A,(HL)
OR C
LD (HL),A
STACK: LD SP,0
EI
RET
;-----------------------------------------
VERTIC: DEFB 221 ;ВЕРТИКАЛЬНАЯ ЛИНИЯ (DY>DX)
LD H,A
DEFB 221
LD L,C
LD C,E
SRL A
JR Z,END_LIN
EX AF,AF'
VERT0: LD A,(HL)
OR C
LD (HL),A
EX AF,AF'
DEFB 221
SUB L
JR NC,VERT1
DEFB 221
ADD A,H
RRC C
JR NC,VERT1
INC L
VERT1: EX AF,AF'
POP DE
ADD HL,DE
DJNZ VERT0
JP END_LIN
;-----------------------------------------
DEFB " * MEGA FAST LINE V1.0 BY UNWINDER'95
;-----------------------------------------
NEXT_DE: INC D
LD A,D
AND 7
RET NZ
LD A,E
ADD A,32
LD E,A
RET C
LD A,D
SUB 8
LD D,A
RET
;-----------------------------------------
MAK_PLO: LD HL,LIN_ARR
LD DE,16384+32768
LD B,192
MAK_PL0: LD (HL),E
INC H
LD (HL),D
DEC H
INC L
CALL NEXT_DE
DJNZ MAK_PL0
LD HL,LIN_ARR+1023
LD A,1
MAK_PL1: LD (HL),A
RLCA
DEC L
DJNZ MAK_PL1
DEC H
LD A,31
MAK_PL2: LD B,8
MAK_PL3: LD (HL),A
DEC L
DJNZ MAK_PL3
DEC A
JP P,MAK_PL2
MAK_LIN: LD IX,LIN_ARR+1024
LD HL,16384+32768
LD B,191
MAK_LI0: LD E,L
LD D,H
EX DE,HL
CALL NEXT_DE
EX DE,HL
AND A
SBC HL,DE
LD (IX),L
INC IX
LD (IX),H
INC IX
ADD HL,DE
DJNZ MAK_LI0
LD IX,LIN_ARR+1024+512
LD HL,22528-31+32768
LD B,191
MAK_LI1: LD E,L
LD D,H
CALL PREV_HL
AND A
SBC HL,DE
LD (IX),L
INC IX
LD (IX),H
INC IX
ADD HL,DE
DJNZ MAK_LI1
RET
;-----------------------------------------
PREV_HL: DEC H
LD A,H
AND 7
CP 7
RET NZ
LD A,L
SUB 32
LD L,A
RET C
LD A,H
ADD A,8
LD H,A
RET
;-----------------------------------------
LIN_ARR EQU 32768-4096
himik, рандомных :) в начале фрейма рандомайзер инитится одинаковым числом, чтоб линии не прыгали.
Vitamin, сенькс, вставлю в тестилку и посмотрю по скорости.
дык это на мой взгляд не корректный тест... В диагоналях то точнее будет, ведь она:
1. самая длинная линия
2. самая сложная в рисовании
Добавлено через 3 минуты
ой сдается мне, что по нынешним меркам это мега тормозная процедура...
"весьма быстро" относительно чего?
Давайте приводить тесты в у.е. :) т.е. в диагоналях. Сколько диагоналей за фрейм успевает нарисовать.
Также можно приводить пример вертикали, горизонтали и т.п.