ZX Forum #04
19 ноября 1997

Technology sprites - Part 9: Printing sprites (coordinates given in pixels).

<b>Technology sprites</b> - Part 9: Printing sprites (coordinates given in pixels).
        PRINT Sprite

      (CONTACT PRESS

      ASK pixels)


   Yes, this topic requires special
attention, as numerous publications have not yet
shed light on it. Examples of these
procedures must include
very carefully, and there can be no unequivocal advice or
example. I will offer only its
considerations on this topic.

   Let's see what's
is this complexity. First, the printing procedure is valid
Comrade Pixel extremely slow, and there can only help
talent of the programmer, his experience.
Secondly, each procedure is unique, there is no unambiguous way 
that would satisfy all the requirements - all depends on the 
size of a sprite. All these difficulties actually belong to 
only one element of the program - print the sprite pixel 
coordinate X, as the Y is made simple.


   Today I offer you two
different ways of printing - the first prints the size of the 
sprites 1 to 3 familiarity in length (height does not matter), 
with a print of additional memory is not used, the second way 
to print to print sprites of almost any size, but such an 
approach will need a buffer whose size is directly proportional 
to the size of the sprite (actually the memory need a bit more).


   So, I propose to you the first way, it is based
on the fact that the free register pairs enough to
buffer to organize with the help of
them. Because the number of registers is small, then the 
dimensions sprites, which can be printed in a way too limited 
(limited only by the length, height sprites values ​​are not 
a). Well, now the program itself, it is designed to print a 2 
sprites familiarity in length. Print data prepared already 
considered Our ways: ADRSPR - Address

sprite into memory, LENHGT - length, height of the sprite. Adds 
another variable that stores the coordinates of the print: CRDS 
- Y, CRDS +1 - X.

140.
SETSPR LD DE, (CRDS); We take the coordinates of the press.

        CALL ADRPIX; Calculate address for him in the screen.

        LD A, D; We get the bit in a byte. In the latter
                         ; Accordance with this number will op
                         ; Ganizovan counter.

        AND 7

        EX AF, AF '; order not to expend the registers, we are 
metal                          ; A equate to an alternative.


        LD IX, (ADRSPR); In IX organize data pointer

                         ; Sprite.

        LD A, (LENHGT +1); In A put the height of the sprite.

        LD C, A; organize a counter height.
SETSPR1 LD B, (IX +0); Put in B the first byte of the sprite.

        LD E, (IX +1); E put in the second byte of the sprite.

        EX AF, AF '; Register A indicates how to
                         ; To move.

        LD D, A

        EX AF, AF '

        LD A, D

        LD D, 0

        AND A; A check for zero.

        JR Z, SETSPR3; If A were 0, then the shift is not 
necessary. SETSPR2 SRL B; Move the sprite to the desired peak us

                         ; Mudflow.

        RR E

        RR D

        DEC A; decrements shifts.

        JR NZ, SETSPR2; If A is not 0, continue to shift.
SETSPR3 PUSH HL; Store temporarily HL.

        LD A, (HL); impose the first byte of the screen.

        OR B

        LD (HL), A

        INC L; proceed to the next byte.

        LD A, L; check, not out there beyond the right edge

                         ; Screen.

        AND # 1F

        JR Z, SETSPR4; If left, then continue to impose no

                         ; Necessary.

        LD A, (HL); If you have not yet reached the edge, then
                         , Imposes the second byte of the 
sprite. 

        OR E

        LD (HL), A

        INC L

        LD A, L; checks again on the way out of the screen.

        AND # 1F

        JR Z, SETSPR4

        LD A, (HL); impose the third byte, if he was
                         , Gives off the screen.

        OR D

        LD (HL), A
SETSPR4 POP HL; Restore HL.

        CALL DOWN; proceed to the next pixel line

                         ; The screen below.

        LD A, H; check, did not come out if the lower boundary
                         ; Nice sprite on the lower edge of the 
screen. 

        CP # 58

        RET NC; If you went out, then print and then not have to

                         ; Exit.

        INC IX; turn to new data from a sprite.

        INC IX

        DEC C; decrements height.

        JR NZ, SETSPR1; If the sprite is not yet published, 
continued                          ; Isplay.


        RET
-------------------------------------- 3 (C) 1993 Inforkom 
(Applied Graphics) -------------------------------------- 
ADRPIX LD A, E; Calculate the address on the screen. Coor       
                   ; Coordinates given in pixels - EY, DX. 

        AND A

        RRA

        SCF

        RRA

        AND A

        RRA

        XOR E

        AND # F8

        XOR E

        LD H, A

        LD A, D

        RLCA

        RLCA

        RLCA

        XOR E

        AND # C7

        XOR E

        RLCA

        RLCA

        LD L, A

        RET
ADRSPR DEFW 0; stores the address data sprite.
LENHGT DEFW 0; Stores the length and height of the sprite.
CRDS DEFW 0; Coordinates print sprite.
2

   The program has received a relatively quick, but it has
reserve to improve. If
use of alternative registers, the size of a sprite can
increase.

   Now consider, how to print the program mask
is not enough to change the OR
by AND. Firstly, in the case D
instead of 0 has to enter 255;
Second, some change
command shift. Team SRL B
puts in 7 bits are always 0, but
printing mask there shall be placed 1. Such teams do not
(To be precise, these teams have, but they are
undocumented. But such
command is available only to shift
to the left.), and we need to perform their emulation:

SETSPR2 SCF

        RR B

        RR E

        RR D

        DEC A

        JR NZ, SETSPR2


   In this case we are forced to include a flag C (carry flag), 
and the command RR B puts it in 7-bit register B. 

   Why we were compelled to perform all these actions? All
very simple: if you remember
action commands AND, you'll find that on the screen are cleared
where the mask bits are
off, so instead of 0 we
puts 255 (11111111 = 255)
so as not to have effect, which can be observed in direct
copying the sprite to the screen.
Yes, the point with 0,0 in the upper left corner of the screen, 
not as in BASIC, pay attention. 

   Apparently, when printing a sprite
mask you have to choose
format of the sprite and mask such
to ensure the highest print speeds.

   Now let's move on to
the second method in print. At first I
wrote that the buffer size is directly proportional to the size 
of the sprite, but at the last moment I was struck a good idea, 
and I turned out to print a sprite

unscathed, with this
approach, a sprite the size of the screen will need a buffer 
length 33 bytes. So you see, is always worth

sit and think, never
should dwell on one
idea. Your attention will be
proposed a "new" version of the program print using
buffer. Data for printing are prepared similarly to the 
previous procedure. 

   The speed of this procedure
relatively normal. The program is described as a set of 
procedures, but I would recommend to disclose these procedures, 
as this increase the printing speed. I printed the sprite size 
2 familiarity in length. 140.

SETSPR LD DE, (CRDS); We take the coordinates of the press.

        CALL ADRPIX; calculate for him the address on the 
screen. 

        LD A, D; Take the number of bits in a byte. Vposledst
                         ; Dance with the aid of it we will 
organize by                          ; Snip.


        AND 7

        EX AF, AF '; Replace A on the alternative.

        LD IX, (ADRSPR); In the IX data address sprite.

        LD A, (LENHGT +1); In A put the height of the sprite.

        LD C, A; B C organize a counter height.
SETSPR1 PUSH BC; Save the counter.

        PUSH HL; Save the address on the screen.

        CALL SPRBUF; We transfer the current line of the sprite 
in the bu                          ; Fer.


        EX AF, AF '; check bit to 0 if zero, the motion
                         ; Causeway buffer is not necessary.

        LD B, A

        EX AF, AF '

        DEC B

        INC B

        JR Z, SETSPR2

        LD C, B; in C Counter organize shifts.

        CALL ROLBUF; Move buffer.
SETSPR2 CALL PRNBUF; We print buffer.

        POP HL

        POP BC

        CALL DOWN; Go to the next pixel line

                         ; The screen below.

        LD A, H; check the output of the lower edge of the 
equivalent                          ; Wound.


        CP # 58

        RET NC; Exit if out on the edge of the screen.

        DEC C

        JR NZ, SETSPR1; If C is not 0, continue typing.

        RET
SPRBUF LD DE, BUFER; In DE address of a buffer in memory.

        LD A, (LENHGT); organize meter in length.

        LD B, A
SPRBUF1 LD A, (IX +0); Copy data to clipboard.

        LD (DE), A

        INC IX

        INC DE

        DJNZ SPRBUF1

        XOR A; Before we zero D, here we obnu
                         ; Trolled additional bytes (the buffer

                         ; Greater than the length sprite on 1 
byte). 

        LD (DE), A

        RET
ROLBUF EX DE, HL; To increase speed, we will address
                         ; Schrieffer record in the HL, and 
data from the HL time                          ; Simultaneously 
transfer to the DE. ROLBUF1 LD HL, BUFER


        LD A, (LENHGT); organize meter length.

        LD B, A

        INC B; Because the buffer is larger than the sprite

                         , At 1 byte, then the counter is 
incremented by 

                         , 1.

        AND A; Zeroing flag C.
ROLBUF2 RR (HL); Move the buffer.

        INC HL

        DJNZ ROLBUF2

        DEC C

        JR NZ, ROLBUF1

        EX DE, HL; Restore the value of HL.

        RET
PRNBUF LD DE, BUFER; in DE buffer address.

        LD A, (LENHGT); organize a counter length sprite.

        INC A; Again, it increased by 1.

        LD B, A
PRNBUF1 LD A, (DE); impose a sprite on the screen.

        OR (HL)

        LD (HL), A

        INC DE

        INC L

        LD A, L; Check out for the right border

                         ; Screen

        AND # 1F

        RET Z; If you went abroad, stop ne
                         ; Chat.

        DJNZ PRNBUF1

        RET
ADRSPR DEFW 0; stores the address data sprite.
LENHGT DEFW 0; Stores the length and height of the sprite.
CRDS DEFW 0; Stores coordinate print.
BUFER DEFB 0,0,0; this buffer. In this case, only 3

                         ; Bytes, because we printed a sprite

                         ; Familiarity of 2 in length.
2

   At this procedure ends. Sharpens your attention
on the fact that the buffer size is equal to
length (the length is not in the sense that
that the size of the sprite, and refers to the size of the 
sprite in long) sprite plus 1 byte. To print this way the mask, 
you will need to last byte buffer is not null and bring back 
255, and the team at AND A procedure shift the sprite is 
replaced by SCF. 

   About the attributes of sprites, I purposely did not mention 
then you yourself have to think, speculate, because here the 
so-called kleshing, and other difficulties. 

   I mention yet another way to print the sprite
pixels, which was used
in older programs western
programmers. Its essence is that, at one stroke you draw 
sprites 8 sprites with the only difference being that figure in 
the sprite every time shifted by 1 pixel. Well,

Printing selected the desired
sprite.

   Another article went to
his finale.






Other articles:

Help - Description of the shell of an electronic book "ZX-FORUM 4.

Secrets of Successful Design - Head for the book "Design your Programs

screen effects - Running a string of R-Type.

screen effects - clearing the screen of Zynaps.

screen effects - "minimize" the screen from Comando Tracer.

screen effects - smooth "decay" of the screen Sommando Tracer.

screen effects - changed the character set for the original stylized font from the game Rockstar.

screen effects - "running out the string" out of the game Rockstar.

screen effects - "pouring" the screen of the game Rockstar.

screen effects - a complex multi-effects from the game Bubbler.

New top 40 procedures - scrolling display, a fusion of two images, inverting screen, rotate characters, replacement of attributes, fill a closed loop, the calculation of addresses in the screen, copy of the screen, etc.

Technology sprites - Part 1: Introduction.

Technology sprites - Part 2: The hunt for sprites (search and pulling).

Technology sprites - Part 3: Format of sprites.

Technology sprites - Part 4: Format of sprites with a mask.

Technology sprites - Part 5: Structure sprite blocks (both co-exist in memory sprite and mask, what data to help us quickly find the address of the sprite in memory, and much more.)

Technology sprites - Part 6: preparation of data for publication.

Technology sprites - Part 8: Printing sprites (coordinates are given in familiarity).

Technology sprites - Part 9: Printing sprites (coordinates given in pixels).

Technology sprites - Part 10: a review of programs to work with sprites and graphics.

world of sound Spectrum - Chapter 1: The Physics of Sound.

world of sound Spectrum - Chapter 2: Operator BEEP, Creating effects on BEEPe, Making Music on BEEPe.

world of sound Spectrum - Chapter 3: How is the sound device (BEEP'ra and methods of sound production).

world of sound Spectrum - Chapter 4: Programming sound in assembler.

world of sound Spectrum - Chapter 4.1: Programming sound effects - Tone, Noise, Complexes effects.

world of sound Spectrum - Chapter 4.2: Programming Sound Effects - Volume Control.

world of sound Spectrum - chapter 4.3: Sound Effects - Management timbre.

world of sound Spectrum - Chapter 4.4: Programming sound effects - music programming.

world of sound Spectrum - Chapter 4.5: Programming sound effects - Polyphonic ringtones (polyphonic).

world of sound Spectrum - chapter 4.6: Treatment of external signals - digitization.

world of sound Spectrum - Chapter 4.7: Handling of external signals - Reverberation.

world of sound Spectrum - chapter 4.8: Synthesis of speech.

world of sound Spectrum - Chapter 4.9: audio playback interrupt.

world of sound Spectrum - Chapter 5: The operator PLAY for music coprocessor AY- 3-8910 (AY-3-8912).

world of sound Spectrum - Chapter 5.1: Creating effects operator PLAY.

world of sound Spectrum - Chapter 5.2: Making Music on PLAYe.

world of sound Spectrum - Chapter 6.1: Description of the coprocessor registers of the musical AY- 3-8910 (AY-3-8912).

world of sound Spectrum - Chapter 6.2: Programming effects and music under the musical coprocessor AY- 3-8910 (AY-3-8912).

world of sound Spectrum - Chapter 7: Software Review ZX-Spectrum to create sounds and music.

world of sound Spectrum - chapter 7.1: Editor, Sound Effects SUPER SOUND.

world of sound Spectrum - Chapter 7.2: Music Editor Wham the Music Box.

world of sound Spectrum - Annex 1, 2: Listings sound effects SUPER SOUND'a, tips assembler.


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

Similar articles:
Nemo open letters № 4.4

В этот день...   21 November