Procedure for drawing a line
ZXNet echo conference «code.zx»
From Aleksandr Majorov → To Han Solo 11 August 2000
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.
Therefore, at the beginning there are synchro-HALTs and a border “timer” :)
╒═════════════════════════ Home 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 B.C.
LL6515 PUSH BC
EXX
POP B.C.
;CALCULATE THE ADDRESS OF THE STARTING POINT
LD A,B
AND A
RRASCF
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 A
LL6525 SEP 7,A ;УСТ. БИТ ТОЧКИ
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 DE
XOR A
LD E,A
JR LL6555
LL654E OR A
RET Z
LD L,B
LD B,C
PUSH DE
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 BCPUSH BC
JR LL6569
LL6565 LD C,A
PUSH THE
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 #07
JR 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 OF
RET
╘═════════════════════ Конец draw.asm ═════════════════════════╛
╒════════════════════════ Hачало draw1.asm ══════════════════════════
SCR2 EQ #4000
ORG 25000
LOOP HALT
LD B,0
DJNZ $
DJNZ $
DJNZ $
LD A,1
OUT (254),A
LD H,1
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),ALD 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
CPL
OR #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,A
JR 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 ;на стpокy выше
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 ;на стpокy ниже
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,DPZ1LD 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,DPPY1
INC 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 ═════════════════════════╛
Aleksand
From Aleksandr Majorov → To Han Solo 12 August 2000
Hello 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 maybe 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,#80LD 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 $
╘═════════════════════════ Конец vector.asm ═════════════════════════╛
Aleksand
From Aleksandr Majorov → To Han Solo 15 August 2000
Hello Han!
14 Aug 00 04:28, Han Solo -> Aleksandr Majorov:
[skipped]
AM>> We need to strengthen our brains! ;)
HS> Tell me, how should they be strengthened? ;)
Smart books to read.
Try to put the calculator aside and do the math in your head.
Try to come up with an algorithm yourself.....
[skipped]
AM>> Of course you can, damn it, is it really hard to guess?
AM>> Instead of increasing MAG?? we need to reduce it.
AM>> And draw objects small.
HS> Why are you so angry
Who am I??????
HS> I was joking. :)))
HS> So there was a question for filling. :))
Well, who got enough sleep where? ;)
[skipped]
AM>> It's lazy to look for fellows.
AM>> What do you need?
HS> Everything is needed. I will now be a collector of source codes. :)
You already have about 10 disks ;)))))))
HS> Don't be lazy. Just enter the search mask ********.asm, and let's go
HS> your Windows is looking for. And businesslike. :)))))))))
There are almost no fellows at the PC.
Everything is on live discs.
And on the PC everything is in archives and on companies :)))))
HS>>> I’m also interested in learning about chunks, their format, what they are,
HS>>> typy pypy.... AM>> These are small 2x2 point objects that are
AM>> one “big” dot with 4 gradations of brightness :)))
HS> FAQ????? :)))) Did you understand what you said.....
Yes, I got it :)
HS> Seriously, it’s not clear what you wrote above.
I repeat for tankers :)
This is an object consisting of 4 points, a 2x2 square.
These 2x2 points are considered one "point" and are perceived
visually with one “point”.
Thus, the screen does not consist of 256x192 pixels, but
only 128x96 "big dots".
Each of these “big dots” can have 4 brightness levels,
without using attributes:
┌─┬─┐ ┌─┬─┐ ┌─┬─┐ ┌─┬─┐
│ │ │ │Х│ │ │Х│ │ │Х│Х│
├─┼─┤ ├─┼─┤ ├─┼─┤ ├─┼─┤
│ │ │ │ │ │ │ │Х│ │Х│Х│
└─┴─┘ └─┴─┘ └─┴─┘ └─┴─┘
In principle, you can try to create another brightness level
┌─┬─┐
│Х│ │
├─┼─┤
│Х│Х│
└─┴─┘
But most likely there will be no sense from this.
That's actually the whole "theory".
Then everything depends on the method of storing point images:
one byte - one point %000000aa
and up to
one byte - four dots %ddccbbaa
And a way to quickly display data from an array on the screen.
(Stack, two screens, ...)
[skipped]
AM>> Break all sorts of demos - there's plenty of it.
HS> Well said. If it were clear there, I wouldn’t ask.
HS> Maybe I don't know how to break? :)What is there to know?
In extreme cases, there is enough shadow work :)
I extracted the necessary items and dumped them on disk.
STS disassembled and sit and study!
How many effects have I pulled out this way...
Alexand
From Aleksey Malov → To Han Solo 15 August 2000
Greetings, Han!
Sun 13 Aug 2000 at 01:44:16 Han Solo and Aleksandr Majorov were talking
on the topic The procedure for drawing a line.
HS> I'm also interested to know
HS> about chunks, their format, what they are, a lot of money...
Most chunky 2D effects (tunnels, plasma, voxels, bump mappings and
others) can be done in multicolor and two to three times faster than chunks
originals. If you don't believe me, come to CC'000 and watch our demo Tryptimine Dream.
You've never seen anything like this on the Spectrum!
Happy Han!
Vivid/Brainwave^X-Project was with you.