Prev: 53870 Up: Map Next: 54053
53885: Drawing checks and routines for all on-screen room items
Used by the routines at 51359, 51420, 51611, 51892, 52582, 52849, 53145, 53273, 53323, 53372, 53550, 53601, 53625, 53714, 53759, 53787 and 53819.
This routine is run after each room scenery object/item data set has been set up ready for printing. It:
  • Checks if items need printing (on-screen, not hidden)
  • Erases item graphics if needed
  • Calculate and set item colours/attributes
  • Prints/draws the item's attribute colours and then pixels (CALLs to 58365 and 56216)
53885 LD A,(60238) Item properties byte
53888 LD C,A
53889 AND 7 Just the lowest 3 bits (bits 0-2) needed for this check
53891 CP 5 Bit 0 (1) = the item is on screen, bit 2 (4) = the item will need erasing
53893 JR NZ,53930 If both conditions are met, continue and erase it. Otherwise there's no need so skip the next set of instructions.
Item is on-screen and needs erasing:
53895 LD A,0 Set the draw/erase flag to 0 (ERASE)
53897 LD (60111),A
53900 LD HL,(60109) Get address pointer for the item graphic to erase
53903 CALL 56216 ...And erase the graphic
53906 LD A,(60072) Get INK colour of room item/object
53909 CP 0 If it's zero, it's an erased scenery room item (rather than a differently coloured object), so there's no need to specially print colours/attributes for it
53911 JR Z,53916
53913 CALL 58365 Otherwise, will need to set the screen attributes/colours for the object
53916 LD A,(60117) Get the 'graphic visible' flag (1 = graphic drawn, 0 = graphic not drawn as fully off-screen)
53919 LD C,A ...Store in C register
53920 LD A,(60238) Get item properties byte
53923 AND 254 Filter out (reset) bit 0
53925 OR C ...append the 'graphic visible' flag to bit 0 to indicate if the graphic is on screen or not
53926 LD (60238),A ...and re-store
53929 LD C,A Copy the item properties byte (60238) into the C register
Check if the item needs drawing
53930 LD A,(60227) Type of graphic to draw
53933 CP 0
53935 JR Z,54053 If this has been set to zero, the item is no longer visible or in existence - there's nothing to draw
53937 LD A,C Retrieve item properties byte
53938 AND 5 Check for bit 0 (item is visible) and bit 2 (item has moved/needs erasing)
53940 JR Z,54053 If neither is set, there's nothing to draw, so skip the rest of the routine
Set up item for drawing
53942 LD A,(60234) Graphic vertical position within current room, in pixels, from top of room playing area
53945 LD (60114),A Copy to working graphics data buffer
53948 LD HL,(60107) Graphic's horizontal position, in pixels
53951 LD (60115),HL Copy to working graphics data buffer
53954 LD A,(60235) Room type byte - this is set to 64 for 'standard' rooms, or 254/255 for tunnel rooms
53957 LD (60118),A Copy to working graphics data buffer
53960 LD A,1
53962 LD (60111),A Set draw/erase flag to 1 (DRAW)
53965 LD A,C Retrieve item properties byte from C register
53966 AND 2 Bit 1 (2) if set means item is hidden/not-visible, e.g. inside a chest
53968 JR Z,53975
53970 LD HL,(60147) If this is the case, set the graphics address pointer to the 'dummy' graphic (39097), so that nothing actually gets drawn
53973 JR 54037 As nothing will be drawn, can also skip over the next section dealing with the item's colours/attributes
Set attribute colours for this item
53975 LD A,(60072) Get item colour byte
53978 CP 0 This is set for interactable items and creatures but 0 for most other things such as scenery (which is drawn with standard room colours)
53980 JR Z,54034 If it's set to 0, don't need to print any colours
53982 CP 8 Is the value 7 or less ('standard' INK colours)
53984 JR C,53993 If so, can skip the next 3 instructions
If bit 3 (8) is set, it means this object flashes (changes colour). Use the game cycle timer to determine its INK colour at this exact moment:
53986 LD A,(60074) Get game counter/timer
53989 AND 3 Keep just bits 0 and 1 (values = 0-3)
53991 ADD A,4 Add 4, to give an INK value between 4 (green) and 7 (white)
Set object colour:
53993 AND 7 Only need to keep bits 0-2 (values = 0-7)
53995 OR 64 Set BRIGHT bit for the colour (all on-screen/viewport colours are set to BRIGHT 1)
53997 LD C,A Store item (INK) colour in C register
Check if object graphic INK colour is the same as the current screen PAPER colour (if so, it'd be invisible):
53998 LD A,(60073) Get room attribute colour
54001 LD B,A Temp store in B register
54002 RRA Shift bits so that the PAPER colour becomes an INK value to compare
54003 RRA
54004 RRA
54005 AND 7 Filter out everything other than INK bits
54007 OR 64 Set BRIGHT bit
54009 CP C Compare with object colour
54010 JR NZ,54017 If different, all is fine, skip next two instructions
Item INK colour is the same as screen PAPER colour.
This shouldn't really happen; most portable objects like keys are light colours (screens have dark backgrounds) and other objects like chests can't be moved from room to room:
54012 LD HL,(60147) If it does happen, set the graphics address pointer to the 'dummy' graphic (39097), so nothing gets drawn (the item would appear invisible anyway)
54015 JR 54037 ...and skip to drawing the actual graphic (pixels)
As screen PAPER background colours vary, we need to combine the object attribute INK colour with the current screen PAPER colour:
54017 LD A,B Retrieve the room colour attribute value (stored in PAPER bits)
54018 AND 248 Filter out/clear any INK bits
54020 OR C Append the item's INK bits (0-7)
54021 LD (60072),A ...and re-store as the item's colour
Print the item's attribute colours on screen (this is done before drawing the actual pixels):
54024 LD A,(60116) Get the horizontal position high byte - this indicates whether the object is within the current screen viewport
54027 CP 0
54029 JR NZ,54034 If not, no need to print attributes, skip the next instruction
54031 CALL 58365 Print screen attribute colours for the room object/creature
Now draw the item's graphics (pixels):
54034 LD HL,(60241) Graphic address pointer
54037 CALL 56216 Draw the item graphics
54040 LD A,(60117) Get the visible graphic flag (1 = graphic drawn, 0 = graphic not drawn as fully off-screen)
54043 LD C,A Append this flag (1/0) into bit 0 of the item properties byte at 60238 indicating whether this item is visible on screen
54044 LD A,(60238)
54047 AND 254 Filter out bit 0 from the item properties byte
54049 OR C Append a 0 or 1 accordingly (not on-screen/on-screen)
54050 LD (60238),A ...and re-store the item properties byte.
Prev: 53870 Up: Map Next: 54053