Prev: C949 Up: Map Next: CB4F
C950: Draw Wide Entity Sprite
Draws or erases a wide entity's sprite on the display. Draw_Wide_Entity_Sprite sets draw mode so the entity colour is written to the attribute area. Erase_Wide_Entity_Sprite sets erase mode and skips the attribute write. Both paths enter Draw_Wide_Entity_Sprite_Render, which reads the entity type to look up sprite data from Sprite_Pixel_Data_Table, computes the screen position from the Y and X bytes, then XOR-blends sixteen pixel rows of sprite data onto the display across three bytes (24 pixels) wide.
Input
HL Entity record pointer
Draw_Wide_Entity_Sprite C950 EXX Set draw mode (attribute write enabled).
C951 LD D,$01
C953 EXX
This entry point is used by the routine at Erase_Wide_Entity_Sprite.
Draw_Wide_Entity_Sprite_Render C954 LD B,H Copy the entity record pointer to BC.
C955 LD C,L
C956 LD E,(HL) Look up the sprite data address for this entity type.
C957 SLA E
C959 LD D,$00
C95B LD HL,$C60C
C95E ADD HL,DE
C95F LD E,(HL)
C960 INC HL
C961 LD D,(HL)
C962 LD H,B Copy the entity record pointer from BC.
C963 LD L,C
C964 INC HL Read the entity's Y position and form the pixel row address.
C965 LD B,$46
C967 LD C,(HL)
C968 SLA C
C96A RL B
C96C PUSH BC
C96D INC HL Read the X position and extract the byte column and bit offset.
C96E LD A,(HL)
C96F AND A
C970 LD HL,$0000
C973 RRA
C974 RR L
C976 RRA
C977 RR L
C979 RRA
C97A RR L
C97C EXX Save the pixel bit offset in the shadow register.
C97D LD C,A
C97E EXX
C97F LD A,L Compute the sprite pixel data address and add the column offset.
C980 RRCA
C981 ADD A,L
C982 LD L,A
C983 LD A,H
C984 ADC A,$00
C986 LD H,A
C987 ADD HL,DE
C988 LD B,H Copy the sprite data pointer to BC.
C989 LD C,L
C98A POP HL Restore the pixel row address from the stack.
C98B EXX Read the pixel bit offset from the shadow register.
C98C LD A,C
C98D EXX
Render the sprite row by row. Each row XOR-blends three bytes of pixel data onto the display. After every ninth row the entity's colour is written to three screen attribute cells.
Draw_Wide_Entity_Sprite_Row1 C98E ADD A,(HL) Blit the first sprite row onto the display.
C98F LD E,A
C990 INC HL
C991 LD D,(HL)
C992 INC HL
C993 EX DE,HL
C994 LD A,(BC)
C995 XOR (HL)
C996 LD (HL),A
C997 INC BC
C998 INC HL
C999 LD A,(BC)
C99A XOR (HL)
C99B LD (HL),A
C99C INC BC
C99D INC HL
C99E LD A,(BC)
C99F XOR (HL)
C9A0 LD (HL),A
C9A1 INC BC
C9A2 EXX Jump to Draw_Wide_Entity_Sprite_Row2 if in erase mode (skip the attribute write).
C9A3 LD A,D
C9A4 AND A
C9A5 EXX
C9A6 JR Z,Draw_Wide_Entity_Sprite_Row2
C9A8 LD A,H Compute the attribute area address from the current screen row.
C9A9 RRCA
C9AA RRCA
C9AB RRCA
C9AC AND %00000011 Keep only the row address bits.
C9AE OR %01011000 Set the attribute memory flag.
C9B0 LD H,A Write the entity's colour to three attribute cells.
C9B1 EXX
C9B2 LD A,B
C9B3 EXX
C9B4 LD (HL),A
C9B5 DEC HL
C9B6 LD (HL),A
C9B7 DEC HL
C9B8 LD (HL),A
Draw_Wide_Entity_Sprite_Row2 C9B9 EX DE,HL Blit row two.
C9BA EXX
C9BB LD A,C
C9BC EXX
C9BD ADD A,(HL)
C9BE LD E,A
C9BF INC HL
C9C0 LD D,(HL)
C9C1 INC HL
C9C2 EX DE,HL
C9C3 LD A,(BC)
C9C4 XOR (HL)
C9C5 LD (HL),A
C9C6 INC BC
C9C7 INC HL
C9C8 LD A,(BC)
C9C9 XOR (HL)
C9CA LD (HL),A
C9CB INC BC
C9CC INC HL
C9CD LD A,(BC)
C9CE XOR (HL)
C9CF LD (HL),A
C9D0 INC BC
C9D1 EX DE,HL Blit row three.
C9D2 EXX
C9D3 LD A,C
C9D4 EXX
C9D5 ADD A,(HL)
C9D6 LD E,A
C9D7 INC HL
C9D8 LD D,(HL)
C9D9 INC HL
C9DA EX DE,HL
C9DB LD A,(BC)
C9DC XOR (HL)
C9DD LD (HL),A
C9DE INC BC
C9DF INC HL
C9E0 LD A,(BC)
C9E1 XOR (HL)
C9E2 LD (HL),A
C9E3 INC BC
C9E4 INC HL
C9E5 LD A,(BC)
C9E6 XOR (HL)
C9E7 LD (HL),A
C9E8 INC BC
C9E9 EX DE,HL Blit row four.
C9EA EXX
C9EB LD A,C
C9EC EXX
C9ED ADD A,(HL)
C9EE LD E,A
C9EF INC HL
C9F0 LD D,(HL)
C9F1 INC HL
C9F2 EX DE,HL
C9F3 LD A,(BC)
C9F4 XOR (HL)
C9F5 LD (HL),A
C9F6 INC BC
C9F7 INC HL
C9F8 LD A,(BC)
C9F9 XOR (HL)
C9FA LD (HL),A
C9FB INC BC
C9FC INC HL
C9FD LD A,(BC)
C9FE XOR (HL)
C9FF LD (HL),A
CA00 INC BC
CA01 EX DE,HL Blit row five.
CA02 EXX
CA03 LD A,C
CA04 EXX
CA05 ADD A,(HL)
CA06 LD E,A
CA07 INC HL
CA08 LD D,(HL)
CA09 INC HL
CA0A EX DE,HL
CA0B LD A,(BC)
CA0C XOR (HL)
CA0D LD (HL),A
CA0E INC BC
CA0F INC HL
CA10 LD A,(BC)
CA11 XOR (HL)
CA12 LD (HL),A
CA13 INC BC
CA14 INC HL
CA15 LD A,(BC)
CA16 XOR (HL)
CA17 LD (HL),A
CA18 INC BC
CA19 EX DE,HL Blit row six.
CA1A EXX
CA1B LD A,C
CA1C EXX
CA1D ADD A,(HL)
CA1E LD E,A
CA1F INC HL
CA20 LD D,(HL)
CA21 INC HL
CA22 EX DE,HL
CA23 LD A,(BC)
CA24 XOR (HL)
CA25 LD (HL),A
CA26 INC BC
CA27 INC HL
CA28 LD A,(BC)
CA29 XOR (HL)
CA2A LD (HL),A
CA2B INC BC
CA2C INC HL
CA2D LD A,(BC)
CA2E XOR (HL)
CA2F LD (HL),A
CA30 INC BC
CA31 EX DE,HL Blit row seven.
CA32 EXX
CA33 LD A,C
CA34 EXX
CA35 ADD A,(HL)
CA36 LD E,A
CA37 INC HL
CA38 LD D,(HL)
CA39 INC HL
CA3A EX DE,HL
CA3B LD A,(BC)
CA3C XOR (HL)
CA3D LD (HL),A
CA3E INC BC
CA3F INC HL
CA40 LD A,(BC)
CA41 XOR (HL)
CA42 LD (HL),A
CA43 INC BC
CA44 INC HL
CA45 LD A,(BC)
CA46 XOR (HL)
CA47 LD (HL),A
CA48 INC BC
CA49 EX DE,HL Blit row eight.
CA4A EXX
CA4B LD A,C
CA4C EXX
CA4D ADD A,(HL)
CA4E LD E,A
CA4F INC HL
CA50 LD D,(HL)
CA51 INC HL
CA52 EX DE,HL
CA53 LD A,(BC)
CA54 XOR (HL)
CA55 LD (HL),A
CA56 INC BC
CA57 INC HL
CA58 LD A,(BC)
CA59 XOR (HL)
CA5A LD (HL),A
CA5B INC BC
CA5C INC HL
CA5D LD A,(BC)
CA5E XOR (HL)
CA5F LD (HL),A
CA60 INC BC
CA61 EX DE,HL Blit row nine.
CA62 EXX
CA63 LD A,C
CA64 EXX
CA65 ADD A,(HL)
CA66 LD E,A
CA67 INC HL
CA68 LD D,(HL)
CA69 INC HL
CA6A EX DE,HL
CA6B LD A,(BC)
CA6C XOR (HL)
CA6D LD (HL),A
CA6E INC BC
CA6F INC HL
CA70 LD A,(BC)
CA71 XOR (HL)
CA72 LD (HL),A
CA73 INC BC
CA74 INC HL
CA75 LD A,(BC)
CA76 XOR (HL)
CA77 LD (HL),A
CA78 INC BC
CA79 EXX Jump to Draw_Wide_Entity_Sprite_Row10 if in erase mode (skip the attribute write).
CA7A LD A,D
CA7B AND A
CA7C EXX
CA7D JR Z,Draw_Wide_Entity_Sprite_Row10
CA7F LD A,H Compute the attribute area address from the current screen row.
CA80 RRCA
CA81 RRCA
CA82 RRCA
CA83 AND %00000011 Keep only the row address bits.
CA85 OR %01011000 Set the attribute memory flag.
CA87 LD H,A Write the entity's colour to three attribute cells.
CA88 EXX
CA89 LD A,B
CA8A EXX
CA8B LD (HL),A
CA8C DEC HL
CA8D LD (HL),A
CA8E DEC HL
CA8F LD (HL),A
Draw_Wide_Entity_Sprite_Row10 CA90 EX DE,HL Blit row ten.
CA91 EXX
CA92 LD A,C
CA93 EXX
CA94 ADD A,(HL)
CA95 LD E,A
CA96 INC HL
CA97 LD D,(HL)
CA98 INC HL
CA99 EX DE,HL
CA9A LD A,(BC)
CA9B XOR (HL)
CA9C LD (HL),A
CA9D INC BC
CA9E INC HL
CA9F LD A,(BC)
CAA0 XOR (HL)
CAA1 LD (HL),A
CAA2 INC BC
CAA3 INC HL
CAA4 LD A,(BC)
CAA5 XOR (HL)
CAA6 LD (HL),A
CAA7 INC BC
CAA8 EX DE,HL Blit row eleven.
CAA9 EXX
CAAA LD A,C
CAAB EXX
CAAC ADD A,(HL)
CAAD LD E,A
CAAE INC HL
CAAF LD D,(HL)
CAB0 INC HL
CAB1 EX DE,HL
CAB2 LD A,(BC)
CAB3 XOR (HL)
CAB4 LD (HL),A
CAB5 INC BC
CAB6 INC HL
CAB7 LD A,(BC)
CAB8 XOR (HL)
CAB9 LD (HL),A
CABA INC BC
CABB INC HL
CABC LD A,(BC)
CABD XOR (HL)
CABE LD (HL),A
CABF INC BC
CAC0 EX DE,HL Blit row twelve.
CAC1 EXX
CAC2 LD A,C
CAC3 EXX
CAC4 ADD A,(HL)
CAC5 LD E,A
CAC6 INC HL
CAC7 LD D,(HL)
CAC8 INC HL
CAC9 EX DE,HL
CACA LD A,(BC)
CACB XOR (HL)
CACC LD (HL),A
CACD INC BC
CACE INC HL
CACF LD A,(BC)
CAD0 XOR (HL)
CAD1 LD (HL),A
CAD2 INC BC
CAD3 INC HL
CAD4 LD A,(BC)
CAD5 XOR (HL)
CAD6 LD (HL),A
CAD7 INC BC
CAD8 EX DE,HL Blit row thirteen.
CAD9 EXX
CADA LD A,C
CADB EXX
CADC ADD A,(HL)
CADD LD E,A
CADE INC HL
CADF LD D,(HL)
CAE0 INC HL
CAE1 EX DE,HL
CAE2 LD A,(BC)
CAE3 XOR (HL)
CAE4 LD (HL),A
CAE5 INC BC
CAE6 INC HL
CAE7 LD A,(BC)
CAE8 XOR (HL)
CAE9 LD (HL),A
CAEA INC BC
CAEB INC HL
CAEC LD A,(BC)
CAED XOR (HL)
CAEE LD (HL),A
CAEF INC BC
CAF0 EX DE,HL Blit row fourteen.
CAF1 EXX
CAF2 LD A,C
CAF3 EXX
CAF4 ADD A,(HL)
CAF5 LD E,A
CAF6 INC HL
CAF7 LD D,(HL)
CAF8 INC HL
CAF9 EX DE,HL
CAFA LD A,(BC)
CAFB XOR (HL)
CAFC LD (HL),A
CAFD INC BC
CAFE INC HL
CAFF LD A,(BC)
CB00 XOR (HL)
CB01 LD (HL),A
CB02 INC BC
CB03 INC HL
CB04 LD A,(BC)
CB05 XOR (HL)
CB06 LD (HL),A
CB07 INC BC
CB08 EX DE,HL Blit row fifteen.
CB09 EXX
CB0A LD A,C
CB0B EXX
CB0C ADD A,(HL)
CB0D LD E,A
CB0E INC HL
CB0F LD D,(HL)
CB10 INC HL
CB11 EX DE,HL
CB12 LD A,(BC)
CB13 XOR (HL)
CB14 LD (HL),A
CB15 INC BC
CB16 INC HL
CB17 LD A,(BC)
CB18 XOR (HL)
CB19 LD (HL),A
CB1A INC BC
CB1B INC HL
CB1C LD A,(BC)
CB1D XOR (HL)
CB1E LD (HL),A
CB1F INC BC
CB20 EX DE,HL Blit row sixteen.
CB21 EXX
CB22 LD A,C
CB23 EXX
CB24 ADD A,(HL)
CB25 LD E,A
CB26 INC HL
CB27 LD D,(HL)
CB28 INC HL
CB29 EX DE,HL
CB2A LD A,(BC)
CB2B XOR (HL)
CB2C LD (HL),A
CB2D INC BC
CB2E INC HL
CB2F LD A,(BC)
CB30 XOR (HL)
CB31 LD (HL),A
CB32 INC BC
CB33 INC HL
CB34 LD A,(BC)
CB35 XOR (HL)
CB36 LD (HL),A
CB37 INC BC
CB38 EXX Return if in erase mode (skip the final attribute write).
CB39 LD A,D
CB3A AND A
CB3B EXX
CB3C RET Z
CB3D LD A,H Compute the attribute area address from the current screen row.
CB3E RRCA
CB3F RRCA
CB40 RRCA
CB41 AND %00000011 Keep only the row address bits.
CB43 OR %01011000 Set the attribute memory flag.
CB45 LD H,A Write the entity's colour to three attribute cells and return.
CB46 EXX
CB47 LD A,B
CB48 EXX
CB49 LD (HL),A
CB4A DEC HL
CB4B LD (HL),A
CB4C DEC HL
CB4D LD (HL),A
CB4E RET
Prev: C949 Up: Map Next: CB4F