Prev: A83B Up: Map Next: A8A0
A83D: Put a static object in the sprite buffer, without a mask
Used by the routines at EEC1, F334, F43C, F4D3, F572, F6EC, F746, F773, F814, F93A and F9F5.
Input
A ID of the object to draw.
The location of the object to draw is stored at A838.
This routine is a copy of code used in Pyjamarama, the previous game in the series.
A83D DI Disable interrupts.
A83E EXX Exchange all main registers.
A83F PUSH AF Remember the object ID.
A840 LD ($A83B),SP Remember the current stack pointer in A83B.
A844 LD L,A Put the object ID in HL.
A845 LD H,$00
A847 ADD HL,HL Multiply by 32 to get a suitable offset.
A848 ADD HL,HL
A849 ADD HL,HL
A84A ADD HL,HL
A84B ADD HL,HL
A84C LD SP,$8378 Point the stack at the start of the graphics buffer. (8378)
A84F ADD HL,SP Add the offset so the stack is at the start of the graphic data.
A850 LD SP,HL
A851 LD A,($A838) Get the x co-ordinate.
A854 LD B,A Set this in B.
A855 AND $07 Get the bottom 3 bits, which are the frame ID.
A857 INC A Add 1 to this and modifiy A87B which is executed later.
A858 LD ($A87B),A
A85B LD A,B Get the top 5 bits of the x co-ordinate, which are the byte.
A85C AND $F8
A85E RRCA
A85F RRCA
A860 RRCA
A861 LD ($EFAF),A Change the routine at EF91 to use a different pointer in the buffer.
A864 ADD A,$02 Move forward two columns and store this in E.
A866 LD E,A
A867 LD A,($A839) Get the Y co-ordinate.
A86A SUB $40 Subtract 40 to get an offset on screen.
A86C LD L,A Put this in HL.
A86D LD H,$00
A86F ADD HL,HL Multiply by 32 so it points at the start of a row.
A870 ADD HL,HL
A871 ADD HL,HL
A872 ADD HL,HL
A873 ADD HL,HL
A874 LD D,$6B Point the high byte of DE at the sprite buffer. (6B00)
A876 ADD HL,DE Add this to the offset so HL points to the correct row.
A877 LD C,$10 16 rows to copy.
A879 POP DE Put the next graphic data in DE.
A87A LD B,$00 Skip a number of frames. (This code was modified earlier in the routine)
A87C DEC B If this is frame 0, it sits on a byte boundary and there is one less byte to update.
A87D JR Z,$A889
A87F XOR A Start with a value of 0 ie: all bits off.
A880 SRL E Shift E, putting 0 in bit 7.
A882 RR D Rotate D, respecting carry.
A884 RRA Rotate A, respecting carry.
A885 DJNZ $A880 Loop until we get the right frame.
A887 OR (HL) Do a logical OR of the byte with the data in A.
A888 LD (HL),A
A889 DEC HL Move back a byte.
A88A LD A,(HL) Do a logical OR of the byte with the data in D.
A88B OR D
A88C LD (HL),A
A88D DEC HL Move back a byte.
A88E LD A,(HL) Do a logical OR of the byte with the data in D.
A88F OR E
A890 LD (HL),A
A891 LD DE,$0022 Move to the next row
A894 ADD HL,DE
A895 DEC C Decrement the number of rows to copy.
A896 JP NZ,$A879 Loop while there is more to draw.
A899 LD SP,($A83B) Restore the stack pointer.
A89D POP AF Restore the object ID in A.
A89E EXX Swap back all main registers and return.
A89F RET
Prev: A83B Up: Map Next: A8A0