![]() |
Routines |
| Prev: AE78 | Up: Map | Next: AF5E |
|
This draws the searchlight.
Note: The game window attributes are located at (7,2)-(29,17) inclusive.
Used by the routine at nighttime.
|
||||||||
| searchlight_plot | AEB8 | EXX | Bank the screen attribute pointer supplied in DE | |||||
| AEB9 | LD DE,$AF3E | Point DE at the searchlight bitmap searchlight_shape[0] | ||||||
| AEBC | LD C,$10 | 16 iterations - one per row of searchlight bitmap | ||||||
|
Start loop (outer)
|
||||||||
| searchlight_plot_0 | AEBE | EXX | Switch register banks for this iteration | |||||
|
Note: I'm presently unable to discern the intent of the 'clip' flag.
|
||||||||
| AEBF | LD A,($AE75) | Fetch the clip flag | ||||||
|
Stop if we're beyond the maximum Y
|
||||||||
| AEC2 | LD HL,$5A40 | Point HL at the screen attribute (0,18). This is max_y_attrs: the bottom of the game window | ||||||
| AEC5 | AND A | Is the clip flag zero? | ||||||
| AEC6 | JP Z,searchlight_plot_1 | Jump forward if so | ||||||
| AEC9 | LD A,E | Extract the X position from the screen attribute pointer | ||||||
| AECA | AND $1F | |||||||
| AECC | CP $16 | Is it < 22? | ||||||
| AECE | JR C,searchlight_plot_1 | Jump forward if so | ||||||
| AED0 | LD L,$20 | Otherwise point HL at screen attribute (0,17) | ||||||
| searchlight_plot_1 | AED2 | SBC HL,DE | Is the screen attribute pointer >= max_y_attrs? | |||||
| AED4 | RET C | Return if so | ||||||
| AED5 | PUSH DE | Preserve the screen attribute pointer | ||||||
|
Skip rows until we're in bounds
|
||||||||
| AED6 | LD HL,$5840 | Point HL at screen attribute (0,2). This is min_y_attrs: the first row that has the game window on it | ||||||
| AED9 | AND A | Is the clip flag zero? | ||||||
| AEDA | JP Z,searchlight_plot_2 | Jump forward if so | ||||||
| AEDD | LD A,E | Extract the X position from the screen attribute pointer | ||||||
| AEDE | AND $1F | |||||||
| AEE0 | CP $07 | Is it < 7? | ||||||
| AEE2 | JR C,searchlight_plot_2 | Jump forward if so | ||||||
| AEE4 | LD L,$20 | Otherwise point HL at screen attribute (0,1) | ||||||
| searchlight_plot_2 | AEE6 | SBC HL,DE | Is the screen attribute pointer >= min_y_attrs? | |||||
| AEE8 | JR C,searchlight_plot_3 | Jump forward if so | ||||||
| AEEA | EXX | Otherwise we need to skip this row. Increment the (banked) shape pointer by a row | ||||||
| AEEB | INC DE | |||||||
| AEEC | INC DE | |||||||
| AEED | EXX | |||||||
| AEEE | JR next_row | Then jump to the next row, skipping all of the plotting | ||||||
| searchlight_plot_3 | AEF0 | EX DE,HL | Move shape pointer into DE | |||||
| AEF1 | EXX | |||||||
| AEF2 | LD B,$02 | Two iterations (two bytes per row) | ||||||
|
Start loop (inner)
|
||||||||
| searchlight_plot_4 | AEF4 | LD A,(DE) | Fetch eight pixels from the shape data | |||||
| AEF5 | EXX | |||||||
| AEF6 | LD DE,$071E | Preload D with 7 (left hand clip) and E with 30 (right hand clip) | ||||||
| AEF9 | LD C,A | Save the shape pixels to C | ||||||
| AEFA | LD B,$08 | Eight iterations (bits per byte) | ||||||
|
Start loop (inner inner)
Clip right hand edge
|
||||||||
| searchlight_plot_5 | AEFC | LD A,($AE75) | Fetch the clip flag | |||||
| AEFF | AND A | Is the clip flag zero? | ||||||
| AF00 | LD A,L | Fetch the screen attribute pointer low byte (interleaved) | ||||||
| AF01 | JP Z,searchlight_plot_6 | Jump forward if so | ||||||
| AF04 | AND $1F | Get X | ||||||
| AF06 | CP $16 | Is it >= 22? | ||||||
| AF08 | JR NC,dont_plot | Jump to don't plot if so | ||||||
| AF0A | JR searchlight_plot_8 | Otherwise jump to plot test | ||||||
| searchlight_plot_6 | AF0C | AND $1F | Get X | |||||
| AF0E | CP E | Is it < 30? (E is 30 here, as set by AEF6) | ||||||
| AF0F | JR C,searchlight_plot_8 | Jump to plot test if so | ||||||
| AF11 | EXX | |||||||
|
Tight loop to increment DE by B
|
||||||||
| searchlight_plot_7 | AF12 | INC DE | Skip the remainder of the shape's row | |||||
| AF13 | DJNZ searchlight_plot_7 | |||||||
| AF15 | EXX | |||||||
| AF16 | JR next_row | Jump to next_row | ||||||
|
Clip left hand edge
|
||||||||
| searchlight_plot_8 | AF18 | CP D | Is A >= 8? (AEF6 previously stored 7 in D) | |||||
| AF19 | JR NC,do_plot | Jump to plot if so | ||||||
| dont_plot | AF1B | RL C | Extract the next bit from shape's pixels | |||||
| AF1D | JR searchlight_plot_10 | Jump to the next pixel | ||||||
| do_plot | AF1F | RL C | Extract the next bit from shape's pixels | |||||
| AF21 | JP NC,searchlight_plot_9 | Jump if the pixel is not set | ||||||
| AF24 | LD (HL),$06 | Set screen attribute to attribute_YELLOW_OVER_BLACK | ||||||
| AF26 | JR searchlight_plot_10 | (else) | ||||||
| searchlight_plot_9 | AF28 | LD (HL),$41 | Set screen attribute to attribute_BRIGHT_BLUE_OVER_BLACK | |||||
| searchlight_plot_10 | AF2A | INC HL | Advance to the next pixel and attribute | |||||
| AF2B | DJNZ searchlight_plot_5 | ...loop (inner inner) | ||||||
| AF2D | EXX | |||||||
| AF2E | INC DE | Advance shape pointer | ||||||
| AF2F | DJNZ searchlight_plot_4 | ...loop (inner) | ||||||
| AF31 | EXX | |||||||
| next_row | AF32 | POP HL | ||||||
| AF33 | LD DE,$0020 | Move the attribute pointer to the next scanline | ||||||
| AF36 | ADD HL,DE | |||||||
| AF37 | EX DE,HL | |||||||
| AF38 | EXX | |||||||
| AF39 | DEC C | Decrement row counter | ||||||
| AF3A | JP NZ,searchlight_plot_0 | ...loop while row > 0 (outer) | ||||||
| AF3D | RET | Return | ||||||
|
Searchlight circle shape.
|
||||||||
| searchlight_shape | AF3E | DEFB $00,$00 | ||||||
| AF40 | DEFB $00,$00 | |||||||
| AF42 | DEFB $00,$00 | |||||||
| AF44 | DEFB $01,$80 | |||||||
| AF46 | DEFB $07,$E0 | |||||||
| AF48 | DEFB $0F,$F0 | |||||||
| AF4A | DEFB $0F,$F0 | |||||||
| AF4C | DEFB $1F,$F8 | |||||||
| AF4E | DEFB $1F,$F8 | |||||||
| AF50 | DEFB $0F,$F0 | |||||||
| AF52 | DEFB $0F,$F0 | |||||||
| AF54 | DEFB $07,$E0 | |||||||
| AF56 | DEFB $01,$80 | |||||||
| AF58 | DEFB $00,$00 | |||||||
| AF5A | DEFB $00,$00 | |||||||
| AF5C | DEFB $00,$00 | |||||||
| Prev: AE78 | Up: Map | Next: AF5E |