Prev: A83D Up: Map Next: A921
A8A0: Draw a masked object in the sprite buffer
Used by the routines at ED2A, ED8A, F057, F10E, F24B, F277, F309, F37D, F3AB, F409, F49D, F503, F5F1, F674, F6EC and F8B9.
Input
A ID of the graphic to update
The co-ordinates to update are stored in A838.
A8A0 EXX Exchange main registers.
A8A1 PUSH AF Remember AF.
A8A2 LD ($A83B),SP Store the stack pointer in A83B.
A8A6 LD SP,$8378 Set the stack pointer to the start of the object graphics. (8378)
A8A9 LD L,A Put the sprite ID in HL.
A8AA LD H,$00
A8AC ADD HL,HL Multiply by 32.
A8AD ADD HL,HL
A8AE ADD HL,HL
A8AF ADD HL,HL
A8B0 ADD HL,HL
A8B1 ADD HL,SP Use this to set the stack pointer at the graphic data for this object.
A8B2 LD SP,HL
A8B3 LD A,($A838) Put the X co-ordinate in B.
A8B6 LD B,A
A8B7 AND $07 Get the bottom 3 bytes, which represents the frame number.
A8B9 INC A Add 1, and set this in A8E0 and A8FC which modifies later routines.
A8BA LD ($A8E0),A
A8BD LD ($A8FC),A
A8C0 LD A,B Put the bottom 5 bits, which represents the byte, in EFAF. This changes the logic in the routine to draw the fountain in the town square at EF91.
A8C1 AND $F8
A8C3 RRCA
A8C4 RRCA
A8C5 RRCA
A8C6 LD ($EFAF),A
A8C9 ADD A,$02 Add 2 to the byte and store it in E.
A8CB LD E,A
A8CC LD C,$10 10 rows to update.
A8CE LD A,($A839) Get the Y co-ordinate.
A8D1 SUB $40 Subtract 40 to get an offset in the sprite buffer.
A8D3 LD L,A Put this in HL.
A8D4 LD H,$00
A8D6 ADD HL,HL Multiply by 32 to get a row offset.
A8D7 ADD HL,HL
A8D8 ADD HL,HL
A8D9 ADD HL,HL
A8DA ADD HL,HL
A8DB LD D,$6B Set the high byte of DE to an offset in the sprite buffer. (6B00)
A8DD ADD HL,DE Add this.
A8DE POP DE Get the next value (the mask) in DE.
If this is not frame 0, it doesn't sit on a byte boundary and bits need shifting forwards.
A8DF LD B,$00 Set B to the number of frames to loop around. (This code is modified earlier)
A8E1 DEC B If this is frame 0, there is one less byte to update.
A8E2 JR Z,$A8F0
A8E4 SCF Set the carry flag, to use in rotating bits.
A8E5 LD A,$FF Start with a mask of FF ie: all bits on.
A8E7 RR E Rotate E and D, respecting carry.
A8E9 RR D
A8EB RRA Rotate A, respecting carry.
A8EC DJNZ $A8E7 Loop until we get to the right frame number.
A8EE AND (HL) Do a logical AND of the mask in A against the byte in the sprite buffer.
A8EF LD (HL),A
A8F0 DEC HL Move back a byte.
A8F1 LD A,(HL) Do a logical AND of the mask in D against the byte in the sprite buffer.
A8F2 AND D
A8F3 LD (HL),A
A8F4 DEC HL Move back a byte.
A8F5 LD A,(HL) Do a logical AND of the mask in E against the byte in the sprite buffer.
A8F6 AND E
A8F7 LD (HL),A
A8F8 INC HL Move forward to the next byte in the buffer.
A8F9 INC HL
A8FA POP DE Get the next value (the data) in DE.
A8FB LD B,$00 Set B to the number of frames to loop around. (This code is modified earlier)
A8FD DEC B If this is frame 0, there is one less byte to update.
A8FE JR Z,$A90A
A900 XOR A Start with data of 0 ie: all bits off
A901 SRL E Shift E to the right, putting 0 on bit 7.
A903 RR D Rotate D respecting carry.
A905 RRA Rotate A repsecting carry.
A906 DJNZ $A901 Loop until we get to the right frame number.
A908 OR (HL) Do a logical OR of the data in A against the byte in the sprite buffer.
A909 LD (HL),A
A90A DEC HL Move back a byte.
A90B LD A,(HL) Do a logical OR of the data in D against the byte in the sprite buffer.
A90C OR D
A90D LD (HL),A
A90E DEC HL Move back a byte.
A90F LD A,(HL) Do a logical OR of the data in D against the byte in the sprite buffer.
A910 OR E
A911 LD (HL),A
A912 LD DE,$0022 Move forward a row and two columns.
A915 ADD HL,DE
A916 DEC C Decrement the row count.
A917 JP NZ,$A8DE Loop while there are more rows to draw.
A91A EXX Restore main registers.
A91B LD SP,($A83B) Restore the stack pointer.
A91F POP AF Restore AF and return.
A920 RET
Prev: A83D Up: Map Next: A921