Re: A83: masked sprites


[Prev][Next][Index][Thread]

Re: A83: masked sprites




Or you could try using the routines @ ticalc. Look under /83/asm/source
(called andxor sprite). Instructions included...

Frank Schoep
====================
Forever For Now
http://foreverfornow.cjb.net
dsfs98@concepts.nl
====================
-----Oorspronkelijk bericht-----
Van: D Weiss <dwedit@hotmail.com>
Aan: assembly-83@lists.ticalc.org <assembly-83@lists.ticalc.org>
Datum: woensdag 31 januari 2001 4:01
Onderwerp: Re: A83: masked sprites


>
>There's CrASH Man's sprclip routine:  (hotmail will probably mess this one
>up)
>
>;---------------------------------------------------------------------
>;[ PutSprClp ] [ABCDEFIX]                  [ 177 bytes ] [ CrASH_Man ]
>;---------------------------------------------------------------------
>; Draws a sprite with an AND/XOR mask with clipping
>;
>; parameters: HL -> sprite, (B,C) = coordinates
>; returns:    Puts sprite in GRAPH_MEM
>;
>PutSprClp:      XOR  A
>__Change_1:     LD   DE, DefaultSpriteHeight      ; D = 0, E = Height
>
>                OR   C                            ; If C < 0
>                JP   M, _PSC_NoBotClp             ; No bottom clip.
>
>                LD   A, $3F                       ; Is C is offscreen?
>                SUB  C
>                RET  C
>
>__Change_2:     CP   DefaultSpriteHeight-1        ; If C + 7 < 64
>                JR   NC, _PSC_NoVertClp           ; No vertical clip.
>                INC  A
>                LD   E, A
>                JR   _PSC_NoVertClp               ; Height = 64 - C
>
>_PSC_NoBotClp:
>__Change_3:     CP   -(DefaultSpriteHeight-1)     ; Is C is offscreen?
>                RET  C
>
>                ADD  A, E                         ; Find how many lines
>                LD   C, A                         ; to actually draw
>                SUB  E
>
>                NEG
>                LD   E, A
>                ADD  HL, DE                       ; Move HL down
>                LD   E, C                         ; by -C lines
>                LD   C, D
>
>_PSC_NoVertClp: PUSH HL                           ; IX -> Sprite
>                POP  IX
>
>                LD   A, $77                       ; OP code for
>                LD   (_PSC_OPchg_1), A            ;   LD   (HL), A
>                LD   (_PSC_OPchg_2), A
>
>                XOR  A                            ; Is B > 0?
>                OR   B
>                JP   M, _PSC_NoRightClp
>
>                CP   89                           ; Is B < 89?
>                JR   C, _PSC_ClpDone
>                CP   96
>                RET  NC
>
>                LD   HL, _PSC_OPchg_1             ; Modify LD to NOP
>                JR   _PSC_ClpModify
>
>_PSC_NoRightClp:CP   -7                           ; Is B is offscreen?
>                RET  C
>
>                LD   HL, _PSC_OPchg_2             ; Modify LD to NOP
>_PSC_ClpModify: LD   (HL), D
>
>_PSC_ClpDone:   LD   B, D
>                LD   H, B
>                LD   L, C
>                ADD  HL, BC                       ; HL = Y * 12
>                ADD  HL, BC
>                ADD  HL, HL
>                ADD  HL, HL
>
>                LD   C, A                         ; HL = Y*12 + X/8
>                SRA  C
>                SRA  C
>                SRA  C
>                INC  C
>
>                ADD  HL, BC
>                LD   BC, GRAPH_MEM
>                ADD  HL, BC
>
>                LD   B, E                         ; B = number of rows
>
>                AND  %00000111                    ; find number of
>                LD   E, A                         ; instructions to jump
>                ADD  A, E
>                ADD  A, E
>                LD   (_PSC_OPchg_4 + 1), A        ; 3 * number
>                SUB  22
>                CPL
>                LD   (_PSC_OPchg_3 + 1), A        ; 3 * (7 - number)
>
>_PSC_LineLoop:  LD   C, (IX)
>                SCF
>                SBC  A, A
>_PSC_OPchg_3:   JR   _PSC_OPchg_3                 ; modify
>
>                RR   C
>                RRA
>                RR   C
>                RRA
>                RR   C
>                RRA
>                RR   C
>                RRA
>                RR   C
>                RRA
>                RR   C
>                RRA
>                RR   C
>                RRA
>
>                AND  (HL)                         ; AND with background
>                LD   E, A
>__Change_4:     LD   A, (IX+DefaultSpriteHeight)
>_PSC_OPchg_4:   JR   _PSC_OPchg_4                 ; modify
>
>                RLA
>                RL   D
>                RLA
>                RL   D
>                RLA
>                RL   D
>                RLA
>                RL   D
>                RLA
>                RL   D
>                RLA
>                RL   D
>                RLA
>                RL   D
>                RLA
>                RL   D
>
>                XOR  E                            ; XOR with background
>_PSC_OPchg_1:   LD   (HL), A                      ; Write
>                DEC  HL                           ; HL -> next 8 pixels
>
>                LD   A, C
>                AND  (HL)                         ; AND with background
>                XOR  D                            ; XOR with background
>_PSC_OPchg_2:   LD   (HL), A                      ; Write
>                INC  IX                           ; Increment to next data
>
>                LD   DE, 13                       ; HL -> next row
>                ADD  HL, DE
>                DJNZ _PSC_LineLoop
>                RET
>
>#IFNDEF NO_MOD_AX
>;----------------------------------------------------------------------
>;[ SetSpriteHeight ] [A]                     [ 16 bytes ] [ CrASH_Man ]
>;----------------------------------------------------------------------
>; Changes the default sprite size
>;
>; parameters: A = New Sprite Height
>; returns:    Self modified routine.
>;
>SetSpriteHeight:LD   (__Change_1+1), A
>                LD   (__Change_4+2), A
>                DEC  A
>                LD   (__Change_2+1), A
>                NEG
>                LD   (__Change_3+1), A
>                RET
>#ENDIF
>
>
>>From: "Joe Pemberton" Reply-To: assembly-83@lists.ticalc.org To:
>>assembly-83@lists.ticalc.org Subject: A83: masked sprites Date: Tue, 30
Jan
>>2001 20:42:30 -0600
>>
>>
>>does anyone have a good sprite routine that does non-aligned bit masked
>>sprites?
>>
>>_____________________________________________ Free email with personality!
>>Over 200 domains! http://www.MyOwnEmail.com
>>
>>
>_________________________________________________________________
>Get your FREE download of MSN Explorer at http://explorer.msn.com
>
>