Manic Miner: Routine at 36344

| Routines

36344: Move and draw Eugene in Eugene's Lair

Used by the routine at 34574. First we move Eugene up or down, or change his direction.
36344 | LD A,(32884) | Pick up the attribute of the last item drawn from 32884
36347 | OR A | Have all the items been collected?
36348 | JR Z,36367 | Jump if so
36350 | LD A,(32987) | Pick up Eugene's direction from 32987
36353 | OR A | Is Eugene moving downwards?
36354 | JR Z,36367 | Jump if so
36356 | LD A,(32988) | Pick up Eugene's pixel y-coordinate from 32988
36359 | DEC A | Decrement it (moving Eugene up)
36360 | JR Z,36380 | Jump if Eugene has reached the top of the cavern
36362 | LD (32988),A | Update Eugene's pixel y-coordinate at 32988
36365 | JR 36388 |
36367 | LD A,(32988) | Pick up Eugene's pixel y-coordinate from 32988
36370 | INC A | Increment it (moving Eugene down)
36371 | CP 88 | Has Eugene reached the portal yet?
36373 | JR Z,36380 | Jump if so
36375 | LD (32988),A | Update Eugene's pixel y-coordinate at 32988
36378 | JR 36388 |
36380 | LD A,(32987) | Toggle Eugene's direction at 32987
36383 | XOR 1
36385 | LD (32987),A
Now that Eugene's movement has been dealt with, it's time to draw him.
36388 | LD A,(32988) | Pick up Eugene's pixel y-coordinate from 32988
36391 | AND 127 | Point DE at the entry in the screen buffer address lookup table at 33536 that corresponds to Eugene's y-coordinate
36393 | RLCA
36394 | LD E,A
36395 | LD D,131
36397 | LD A,(DE) | Point HL at the address of Eugene's location in the screen buffer at 24576
36398 | OR 15
36400 | LD L,A
36401 | INC DE
36402 | LD A,(DE)
36403 | LD H,A
36404 | LD DE,32992 | Draw Eugene to the screen buffer at 24576
36407 | LD C,1
36409 | CALL 36852
36412 | JP NZ,36102 | Kill Willy if Eugene collided with him
36415 | LD A,(32988) | Pick up Eugene's pixel y-coordinate from 32988
36418 | AND 120 | Point HL at the address of Eugene's location in the attribute buffer at 23552
36420 | RLCA
36421 | OR 7
36423 | SCF
36424 | RL A
36426 | LD L,A
36427 | LD A,0
36429 | ADC A,92
36431 | LD H,A
36432 | LD A,(32884) | Pick up the attribute of the last item drawn from 32884
36435 | OR A | Set the zero flag if all the items have been collected
36436 | LD A,7 | Assume we will draw Eugene with white INK
36438 | JR NZ,36447 | Jump if there are items remaining to be collected
36440 | LD A,(32957) | Pick up the value of the game clock at 32957
36443 | RRCA | Move bits 2-4 into bits 0-2 and clear the other bits; this value (which decreases by one on each pass through the main loop) will be Eugene's INK colour
36444 | RRCA
36445 | AND 7
This entry point is used by the routines at 36469 (to set the attributes for a Skylab), 36593 (to set the attributes for a vertical guardian) and 37173 (to set the attributes for the Kong Beast).
36447 | LD (HL),A | Save the INK colour in the attribute buffer temporarily
36448 | LD A,(32800) | Pick up the attribute byte of the background tile for the current cavern from 32800
36451 | AND 248 | Combine its PAPER colour with the chosen INK colour
36453 | OR (HL)
36454 | LD (HL),A | Set the attribute byte for the top-left cell of the sprite in the attribute buffer at 23552
36455 | LD DE,31 | Prepare DE for addition
36458 | INC HL | Set the attribute byte for the top-right cell of the sprite in the attribute buffer at 23552
36459 | LD (HL),A
36460 | ADD HL,DE | Set the attribute byte for the middle-left cell of the sprite in the attribute buffer at 23552
36461 | LD (HL),A
36462 | INC HL | Set the attribute byte for the middle-right cell of the sprite in the attribute buffer at 23552
36463 | LD (HL),A
36464 | ADD HL,DE | Set the attribute byte for the bottom-left cell of the sprite in the attribute buffer at 23552
36465 | LD (HL),A
36466 | INC HL | Set the attribute byte for the bottom-right cell of the sprite in the attribute buffer at 23552
36467 | LD (HL),A
36468 | RET |