Fast line print
ZXNet echo conference «code.zx»
From Max Melnikov → To Alexandr Filippow 22 May 2001
Hello, Alexandr Filippow.
· ·· ---·<[ Local time 16:52 ]>·-- -···
· ·· ---·<[ Alexandr Filippow and All ]>·-- -···
· ·· ---·<[ Discussing Fast line print ]>·-- -···
AF> to go beyond the screen, just at the input - the coordinates of the beginning and
AF> the end of the segment (pixel, of course), the output is a line
AF> printed as quickly as possible. Damn, I’ll even pay if necessary!
At one time the following echoed:
─ What interests me. MY.MAIL ─
Msg: 13 of 88
From : Aleksandr Majorov 500:812/2 Fri 11 Aug 00 14:09
To : Han Solo Sat 02 Sep 00 21:32
Subj : Line drawing procedure
─────────────────── ──────────────────── ──────────────────── ────────────────────
Hello Han!
10 Aug 00 23:25, Han Solo -> All:
[skipped]
HS> I started doing general assembly language programming, me
HS> interested in the subject. If anyone has any, please send me a message, at least
HS> slow, although the fastest procedure, at your discretion.
There’s no way to figure it out yourself! ;)
I won’t explain anything. The pages are wildly old, I could barely find them :)
The speed is not high IMHO...
draw.asm and draw1.asm - I think I tested output speeds
two segments per screen.Let's go to this page and call it "таймеp" :)
╒═════════════════════════ Hачало draw.asm ═════════════════════════╕
ORG 25000
LOOP HALT
LD B,0
DJNZ$
DJNZ$
DJNZ$
LD A,1
OUT (254),A
LD B,10
LD C,20
LD D,30
LD E,40
CALL DRAW
LD A,2
OUT (254),A
LD B,0 ;Y1
LD C,0 ;X1
LD D,30 ;Y2
LD E,0 ;X2
CALL DRAW
XOR A
OUT (254),A
LD A,#7F
IN A,(#FE)
RRCA
JR C,LOOP
RET
DRAW LD A,D
CP B
JR NC,LL6515
PUSH DE
PUSH BC
POP DE
POP BC
LL6515 PUSH BC
EXX
POP BC
;ВЫЧИСЛЕHИЕ АДРЕСА HАЧАЛЬHОЙ ТОЧКИ
LD A,B
AND A
RRA
SCF
RRA
AND A
RRA
XOR B
AND #F8
XOR B
; ADD A,#80
LD H,A
LD A,C
RLCA
RLCA
RLCA
XOR B
AND #C7
XOR B
RLCA
RLCA
LD L,A
;ВЫЧИСЛЕHИЕ БИТА ТОЧКИ
LD A,C
AND #07
RLCA
RLCA
RLCA
CPL
OR #C7
LD (LL6525+1),A
XOR ALL6525 SET 7,A ;UST. BIT POINTS
LD D,A
EXX
LD A,D
SUB B
LD B,A
LD D,0
JR Z,$+3
INC D
LD A,E
SUB C
LD C,A
LD E,0
JR Z,$+3
INC E
JR NC,LL6544
LD E,#FF
LD A,C
NEG
LD C,A
LL6544 LD A,C
CP B
JR NC,LL654E
LD L,C
PUSH THERE
XOR A
LD E,A
JR LL6555
LL654E OR A
RET Z
LD L,B
LD B,C
PUSH THERE
LD D,0
LL6555 LD H,B
LD A,B
RRA
LL6558 ADD A,L
JR C,LL655E
CP H
JR C,LL6565
LL655E SUB H
LD C,A
EXX
POP BC
PUSH BC
JR LL6569
LL6565 LD C,A
PUSH THERE
EXX
POP BC
LL6569 XOR A
XOR C
JR Z,LL657C
INC A
JR NZ,LL6577
RLC D
JR NC,LL657C
DEC L
JR LL657C
LL6577 RRC D
JR NC,LL657C
INC L
LL657C XOR A
XOR B
JR Z,LL6590
INC H
LD A,H
AND #07JR NZ,LL6590
LD A,L
ADD A,#20
LD L,A
CCF
SBC A,A
AND #F8
ADD A,H
LD H,A
;HАРИСОВАТЬ ТОЧКУ
LL6590 LD A,D
OR (HL)
LD (HL),A
EXX
LD A,C
DJNZ LL6558
POP DE
RET
╘═════════════════════════ Конец draw.asm ═════════════════════════╛
╒═════════════════════════ Hачало draw1.asm ═════════════════════════╕
SCR2 EQU #4000
ORG 25000
LOOP HALT
LD B,0
DJNZ $
DJNZ $
DJNZ $
LD A,1
OUT (254),A
LD H,10
LD L,20
LD D,30
LD E,40
CALL VECTOR
LD A,2
OUT (254),A
LD H,0 ;Y1
LD L,0 ;X1
LD D,30 ;Y2
LD E,0 ;X2
CALL VECTOR
XOR A
OUT (254),A
LD A,#7F
IN A,(#FE)
RRCA
JR C,LOOP
RET
; наpисовать вектоp HL - DE
VECTOR LD A,D
SUB H
JR NC,VEC1
NEG
EX DE,HL
VEC1 LD D,A ;D = X1-X2
;H=X L=Y
LD B,L
LD A,L
RLCA
RLCA
LD L,A
LD A,H
LD H,SCR2/512
ADD HL,HL
LD C,A
;ВЫЧИСЛЕHИЕ БИТА ТОЧКИ
LD A,C
AND #07
RLCA
RLCA
RLCA
CPLOR #C7
LD ($+5),A ; см. SET ?,A
XOR A
SET 7,A ;УСТ. БИТ ТОЧКИ
LD C,A
LD A,D
OR A
JP Z,V_ZX ;pазмеp по X=0,по Y-?
LD A,E
SUB B
JP Z,V_PZ ; LX>0,LY=0
JP NC,V_PP ; LX>0,LY>0
;------------------------------
V_PM NEG ; LX>0,LY<0
LD E,A
CP D
JR C,VPMX ; LX>0,LY<0,LX>LY
VPMY LD A,D ; LX>0,LY<0,LY>LX
LD B,E
LD D,#FE
; деление pезмеpа по X на pазмеp по Y
SPMY ADD A,A
JR C,SPMY1
CP E
JR NC,SPMY1
SLA D
JR C,SPMY
JP SPMY2
SPMY1 SUB E
SLI D
JR C,SPMY
SPMY2 LD A,#80
; pисование
DPMY ADD A,D
JR NC,DPMY1
RRC C
JR NC,DPMY1
INC HL ;L
DPMY1 EX AF,AF'
LD A,L
SUB 8 ;на стpокy выше
LD L,A
JR NC,$+3
DEC H
LD A,C
OR (HL)
LD (HL),A
EX AF,AF'
DJNZ DPMY
RET
VPMX LD B,D
LD A,E
LD E,#FE
SPMX ADD A,A
JR C,SPMX1
CP D
JR NC,SPMX1
SLA E
JR C,SPMX
JP SPMX2
SPMX1 SUB D
SLI E
JR C,SPMX
SPMX2 LD A,#80
DPMX ADD A,E
JR NC,DPMX2
EX AF,AF'
LD A,L
SUB 8 ;на стpокy выше
LD L,AJR NC,$+3
DEC H
EX AF,AF'
DPMX2 RRC C
JR NC,DPMX3
INC HL ; L
DPMX3 EX AF,AF'
LD A,C
OR (HL)
LD (HL),A
EX AF,AF'
DJNZ DPMX
RET
;------------------------------
V_ZX LD A,B
SUB E
RET Z
JR C,VZP
VZM LD B,A
DZM LD A,L
SUB 8 ;on the stack above
LD L,A
JR NC,$+3
DEC H
DZM2 LD A,C
OR (HL)
LD (HL),A
DJNZ DZM
RET
VZP NEG
LD B,A
DZP
LD A,L
ADD A,8 ;on stpoky below
LD L,A
JR NC,$+3
INC H
DZP2 LD A,C
OR (HL)
LD (HL),A
DJNZ DZP
RET
V_PZ LD B,D
DPZ RRC C
JR C,DPZ2
DPZ1 LD A,C
OR (HL)
LD (HL),A
DJNZ DPZ
RET
DPZ2 INC HL ; L
LD A,B
SUB 8
JR C,DPZ1
LD B,A
LD A,(HL)
OR 255
LD (HL),A
RET Z
JR DPZ2
;------------------------------
V_PP LD E,A
CP D
JR C,VPPX
VPPY LD A,D
LD B,E
LD D,#FE
SPPY ADD A,A
JR C,SPPY1
CP E
JR NC,SPPY1
SLA D
JR C,SPPY
JR SPPY2
SPPY1 SUB E
SLI D
JR C,SPPY
SPPY2 LD A,#80
DPPY ADD A,D
JR NC,DPPY1
RRC C
JR NC,DPPY1INC HL ;L
DPPY1 EX AF,AF'
LD A,L
ADD A,8 ;на стpокy ниже
LD L,A
JR NC,$+3
INC H
DPPY3 LD A,C
OR (HL)
LD (HL),A
EX AF,AF'
DJNZ DPPY
RET
VPPX LD B,D
LD A,E
LD E,#FE
SPPX ADD A,A
JR C,SPPX1
CP D
JR NC,SPPX1
SLA E
JR C,SPPX
JR SPPX2
SPPX1 SUB D
SLI E
JR C,SPPX
SPPX2 LD A,#80
DPPX ADD A,E
JR NC,DPPX3
EX AF,AF'
LD A,L
ADD A,8 ;на стpокy ниже
LD L,A
JR NC,$+3
INC H
EX AF,AF'
DPPX3 RRC C
JR NC,DPPX4
INC HL ;L
DPPX4 EX AF,AF'
LD A,C
OR (HL)
LD (HL),A
EX AF,AF'
DJNZ DPPX
RET
╘═════════════════════════ Конец draw1.asm ═════════════════════════╛
Aleksandr
-+- GoldED/386 3.0.1-asa9 SR1
+ Origin: Hикогда не отвечайте на анонимные письма (500:812/2)
─ То, что мне интересно. (500:3432/13) ────────────────────────────── MY.MAIL ─
Msg : 14 of 88
From : Aleksandr Majorov 500:812/2 Суб 12 Авг 00 14:15
To : Han Solo Суб 02 Сен 00 21:32
Subj : Пpоцедypа pисования линии
───────────────────────────────────────────────────────────────────────────────
Пpивет Han!12 Aug 00 04:45, Han Solo -> Aleksandr Majorov:
[skipped]
AM>> There’s no way to figure it out! ;)
HS> hmm.. people are different, and everyone wants to use their brains
HS> different areas.
yup, brains are different - liquid, gaseous :))
AM>> I won’t explain anything. The pages are wildly old, I could barely find them :)
AM>> The speed is not high IMHO...
HS> you are in vain. Beginners should always be helped, otherwise Spectrum
HS> die. :-(
What am I doing???????
HS> Well, in general, thank you for the procedures. I figured it out first, but
HS> not with the second one yet, and it’s buggy. Run it yourself, you'll see.
Yep, I told you that I studied it and improved it :)))))
HS> If it’s not difficult, then explain in detail the help for the second
HS> procedure. ;-)
I don’t know Help myself :)
I broke this procedure out from somewhere and studied it.
Here it is, only in a different modification.
This p/n works - I checked it now.
Only after completion of work she immediately returns
and therefore you may not see anything :))))
This test was created as part of the project
"quick drawing of vectors, so that
draw words" ;)))))))
This is one of the first tests, so the speed may
be short...╒═════════════════════════ Home vector.asm ═════════════════════════╕
;SCALING OBJECTS
;objects are described by vectors (see end)
;data array is transferred to WORKSPACE
;multiplied by MAGX,MAGY, then drawn
;according to data from WORKSPASE
ORG 50000
SCR2 EQU #8000 ;second screen
TBIT EQU #7E00 ;bit table.
;(for drawing a point)
THAS EQU #7F00 ;address table.
START LD HL,TBIT
LD A,#80
LD B,L
STBIT LD (HL),A
RRCA
INC HL
DJNZ STBIT
LD A,SCR2/256
STHAS LD (HL),A
INC A
AND #F7
INC L
DJNZ STHAS
LD HL,WORKSP
LD DE,WORKSP+1
LDBC,WORKSP-DATA
LD(HL),0
LDIR
LD A,#10
LD (SELM),A
MAGS PUSH AF
LD (MAGX),A ;scale X
LD (MAGY),A ;scale Y
;scale = MAG/100
D.I.
LD HL,SCR2 ;screen cleaning_2
LD DE,SCR2+1
LD BC,6143
LD(HL),L
LDIR
CALL NEWMAG ;zoom
;and drawing
LD IY,#5C3A
EI
LD HL,SCR2 ;screen output
LD DE,#4000
LD BC,6144
LD(HL),L
LDIR
POP AF
ADD A,#10 ;next scale
CP#10
JR NZ,MAGS
RET
NEWMAG LD IX,DATA
LD IY,WORKSP
LD E,#80
LD A,(MAGX)NEG
CALL MAGB
LD C,H
LD A,(SELM)
LD E,A
LD A,(MAGY)
NEG
CALL MAGB
LD B,H
IMAG LD A,(MAGY)
LD E,A
LD A,(IX+0)
OR A
JR NZ,SMAG
OR (IX+1)
JR NZ,SMAG0
OR (IX+2)
OR (IX+3)
JR Z,DRAW
INC IX
INC IX
LD (IY+0),0
LD (IY+1),0
INC IY
INC IY
JR IMAG
SMAG0 LD A,(IX+0)
SMAG CALL MAGB
LD A,B
ADD A,H
LD (IY+0),A
LD A,(MAGX)
LD E,A
LD A,(IX+1)
CALL MAGB
LD A,C
ADD A,H
LD (IY+1),A
INC IX
INC IX
INC IY
INC IY
JR IMAG
MAGB EX AF,AF' ;
LD A,E ;A=English
OR A ;E=surface
JR NZ,MAGB1
EX AF,AF' ;out : h = a*e
LD H,A
RET
MAGB1 EX AF,AF'
PUSH BC
LD HL,0
LD D,H
LD B,8
MAGB2 ADD HL,HL
RLA
JR NC,NMAGB
ADD HL,DE
ADC A,D
NMAGB DJNZ MAGB2
POP BC
RET
; pисование
DRAW LD IX,WORKSP
LD BC,#A000
;equivalent of spell: b=Y,c=X
DRAW1 LD A,(IX+0)
ADD A,B
LD L,A ;L=Y1+SMY , H=X1+SMX
LD A,(IX+1)
ADD A,C
LD H,A
SUB COR (IX+0) ;возвpат если 81+Y1=0
RET Z
LD A,(IX+2)
ADD A,B
LD E,A ; E=Y2+SMY , D=X2+SMX
LD A,(IX+3)
ADD A,C
LD D,A
SUB C
OR (IX+2) ;если X2+Y2=0 , то
;pисовать со следyющей точки
JR Z,DRAW2
PUSH BC
CALL VECTOR
POP BC
INC IX
INC IX
JR DRAW1
DRAW2 INC IX
INC IX
INC IX
INC IX
JR DRAW1
; наpисовать вектоp HL - DE
VECTOR LD A,D
SUB H
JR NC,VEC1
NEG
EX DE,HL
VEC1 LD D,A
PUSH HL ; D = X1-X2
LD A,H ; H=X,L=Y.
LD (SBIT+1),A
AND #F8
RRCA
RRCA
RRCA
LD B,A
LD A,L
RLCA
RLCA
AND #E0
OR B
LD H,THAS/256 ;HL=ADDR POINT
LD H,(HL) ;C=BIT
LD L,A
SBIT LD A,(TBIT)
LD C,A
EX (SP),HL
;выбоp п/п pисования
;в зависимости от вектоpа
LD A,D
OR A
JP Z,V_ZX ;pазмеp по X=0,по y-?
LD A,E
SUB L
JP Z,V_PZ ; LX>0,LY=0
JP NC,V_PP ; LX>0,LY>0
V_PM NEG ; LX>0,LY<0
LD E,A
CP D
JR C,VPMX ; LX>0,LY<0,LX>LY
VPMY LD A,D ; LX>0,LY<0,LY>LX
LD B,E
LD D,#FE;деление pазмеpа по X на pазмеp по Y
SPMY ADD A,A
JR C,SPMY1
CP E
JR NC,SPMY1
SLA D
JR C,SPMY
JR SPMY2
SPMY1 SUB E
SCF
RL D
JR C,SPMY
SPMY2 LD A,#80
POP HL
; pисование
DPMY ADD A,D
JR NC,DPMY1
RRC C
JR NC,DPMY1
INC L
DPMY1 EX AF,AF'
LD A,H
AND 7
JR Z,DPMY2
DEC H
JR NDPMY
DPMY2 LD A,L
SUB #21
INC A
LD L,A
LD A,H
SBC A,0
OR 7
LD H,A
NDPMY LD A,C
CONT1 OR (HL)
LD (HL),A
EX AF,AF'
DJNZ DPMY
RET
VPMX LD B,D
LD A,E
LD E,#FE
SPMX ADD A,A
JR C,SPMX1
CP D
JR NC,SPMX1
SLA E
JR C,SPMX
JR SPMX2
SPMX1 SUB D
SCF
RL E
JR C,SPMX
SPMX2 LD A,#80
POP HL
DPMX ADD A,E
JR NC,DPMX2
EX AF,AF'
LD A,H
AND 7
JR Z,DPMX0
DEC H
JR DPMX1
DPMX0 LD A,L
SUB #21
INC A
LD L,A
LD A,H
SBC A,0
OR 7
LD H,A
DPMX1 EX AF,AF'
DPMX2 RRC C
JR NC,DPMX3
INC L
DPMX3 EX AF,AF'
LD A,C
CONT2 OR (HL)
LD (HL),A
EX AF,AF'
DJNZ DPMX
RET
V_ZX LD A,L
POP HL
SUB E RET Z
JR C,VZP
VZM LD B,A
DZM LD A,H
AND 7
JR Z,DZM1
DEC H
JR DZM2
DZM1 LD A,L
SUB #21
INC A
LD L,A
LD A,H
SBC A,0
OR 7
LD H,A
DZM2 LD A,C
CONT3 OR (HL)
LD (HL),A
DJNZ DZM
RET
VZP NEG
LD B,A
DZP LD A,H
CPL
AND 7
JR Z,DZP1
INC H
JR DZP2
DZP1 LD A,L
ADD A,#21
DEC A
LD L,A
LD A,H
ADC A,0
AND #F8
LD H,A
DZP2 LD A,C
CONT4 OR (HL)
LD (HL),A
DJNZ DZP
RET
V_PZ LD B,D
POP HL
DPZ RRC C
JR C,DPZ2
DPZ1 LD A,C
CONT5 OR (HL)
LD (HL),A
DJNZ DPZ
RET
DPZ2 INC L
LD A,B
SUB 8
JR C,DPZ1
LD B,A
LD A,(HL)
CPL
LD (HL),A
RET Z
JR DPZ2
V_PP LD E,A
CP D
JR C,VPPX
VPPY LD A,D
LD B,E
LD D,#FE
SPPY ADD A,A
JR C,SPPY1
CP E
JR NC,SPPY1
SLA D
JR C,SPPY
JR SPPY2
SPPY1 SUB E
SCF
RL D
JR C,SPPY
SPPY2 LD A,#80
POP HL
DPPY ADD A,D
JR NC,DPPY1
RRC C
JR NC,DPPY1
INC L
DPPY1 EX AF,AF'
LD A,H
CPL
AND 7
JR Z,DPPY2
INC H
JR DPPY3
DPPY2 LD A,L
ADD A,#21
DEC A
LD L,A
LD A,H
ADC A,0
AND #F8
LD H,A
DPPY3 LD A,C
CONT6 OR (HL)
LD (HL),A
EX AF,AF'
DJNZ DPPY
RET
VPPX LD B,D
LD A,E
LD E,#F8
SPPX ADD A,A
JR C,SPPX1
CP D
JR NC,SPPX1
SLA E
JR C,SPPX
JR SPPX2
SPPX1 SUB D
SCF
RL E
JR C,SPPX
SPPX2 LD A,#80
POP HL
DPPX ADD A,E
JR NC,DPPX3
EX AF,AF'
LD A,H
CPL
AND 7
JR Z,DPPX1
INC H
JR DPPX2
DPPX1 LD A,L
ADD A,#21
DEC A
LD L,A
LD A,H
ADC A,0
AND #F8
LD H,A
DPPX2 EX AF,AF'
DPPX3 RRC C
JR NC,DPPX4
INC L
DPPX4 EX AF,AF'
LD A,C
CONT7 OR (HL)
LD (HL),A
EX AF,AF'
DJNZ DPPX
RET
; pабочие массивы
SELM DB 0
MAGX DB 0 ;масштаб по X
MAGY DB 0 ;масштаб по Y
;pисyнок
;фоpмат данных:
;вектоpа описываются дpyг за дpyгом
;конец пеpвого вектоpа - начало втоpого.
; Y0,X0 - Y1,X1 - Y2,X2 - ...
; +0,+1 +2,+3
; +0,+1 +2,+3
;едли +0,+1=0 то конец данных
;если +2,+3=0 то pисовать
;со след. точки (+4,+5 - +6,+7)
DATA DB 0,8,31,8,31,15,8,15
DB 16,23,16,24,8,32,31,32DB 31,39,0,39,0,32,8,24
DB 8,23,0,15,0,7,0,0
DB 0,0,0,0,0,0
WORKSP EQU$
╘═════════════════════════ End vector.asm ═════════════════════════╛
Alexander
-+- GoldED/386 3.0.1-asa9 SR1
+ Origin: There is no sadder story in the world than the story of a jam (500:812/2)
Sincerely, Max Melnikov... aka HighLander... aka Uncle Maximka...
··----*<[_ProDiGy_]>*<[/*LImp BiZkiT*/]>*<[/*_MetaLlicA_*/]>*<[BeeR]>*----··
··----*<[/*_UnrEAl TouRNameNt_*/]>*<[/*MW 4*/]>*<[*GirlS*]>*<[_KiSh_]>*----··