Prev: BDC1 Up: Map Next: C0E1
BDFB: Map reader
Used by the routines at main_loop, cpu_driver and escape_scene.
read_map BDFB XOR A var_a23d = 0 -- state var TBD
BDFC LD ($A23D),A
BDFF LD ($A23C),A var_a23c = 0 -- state var TBD
BE02 LD ($A254),A Reset another_spawning_flag
BE05 LD HL,$A23F HL = Address of fast_counter
BE08 LD DE,($A24A) DE = speed
BE0C LD A,E A = Bottom byte of speed
BE0D RR D If speed < 255 then jump
BE0F JR NC,rm_be18
BE11 PUSH AF Preserve
BE12 PUSH HL
BE13 CALL rm_cycle_buffer_offset Call subfunction rm_cycle_buffer_offset -- processing something twice as much when at high speed?
BE16 POP HL Restore
BE17 POP AF
rm_be18 BE18 ADD A,(HL) fast_counter += bottom byte of speed in A
BE19 LD (HL),A
BE1A LD A,$00 A = 0 doesn't seem self modified
BE1C JP NC,rm_c0d9 Jump to j_c0d9 if no carry
This entry point is used by the routine at setup_game.
rm_cycle_buffer_offset BE1F INC HL Increment road_buffer_offset
BE20 LD A,(HL)
BE21 INC A
BE22 LD (HL),A
BE23 ADD A,$5F HL = $EE00 | (A + 95) -- final byte of lanes data? or compensating for previous increment?
BE25 LD L,A
BE26 LD H,$EE
BE28 LD A,($A23C) var_a23c |= *HL
BE2B OR (HL)
BE2C LD ($A23C),A
BE2F LD A,L L += 32 -- offset 128
BE30 ADD A,$20
BE32 LD L,A
BE33 LD A,($A23D) var_a23d |= *HL
BE36 OR (HL)
BE37 LD ($A23D),A
BE3A LD A,L L -= 96 -- offset 32
BE3B SUB $60
BE3D LD L,A
-- CURVATURE --
The top nibble of each byte is a counter. The bottom nibble is curvature data.
BE3E LD A,($A242) A = curvature_byte - 16
BE41 SUB $10
BE43 JR NC,rm_save_curvature_byte Jump to rm_save_curvature_byte if curvature_byte >= 16
Load a new curvature byte.
BE45 LD DE,($A26E) Read and increment address of curvature data
BE49 INC DE
BE4A LD A,(DE) Read a curvature byte
BE4B OR A Set flags
BE4C JR NZ,rm_curvature_regular_byte Jump to rm_curvature_regular_byte if non-zero
Handle curvature escape byte.
rm_curvature_escape_byte BE4E EX DE,HL HL is now address of escape byte
BE4F INC HL Increment, read command byte, increment again
BE50 LD A,(HL)
BE51 INC HL
BE52 AND A Jump to rm_curvature_jump_command if command byte is zero
BE53 JR Z,rm_curvature_jump_command
BE55 DEC A Jump to rm_curvature_one_command if command byte is one
BE56 JR Z,rm_curvature_one_command
Otherwise it must be a road split command (byte == 2).
BE58 LD C,(HL) Load address of left route's curvature data
BE59 INC HL
BE5A LD B,(HL)
BE5B INC HL
BE5C LD ($BB95),BC Self modify 'LD HL,$xxxx' @ BB94 to load the address
BE60 LD A,(HL) Load address of right route's curvature data
BE61 INC HL
BE62 LD H,(HL)
BE63 LD L,A
BE64 LD ($BBC2),HL Self modify 'LD HL,$xxxx' @ BBC1 to load the address
BE67 LD HL,$E2C6 HL = roadsplit_curvature -> road split left curvature data
BE6A JR rm_read_curvature Jump to rm_read_curvature
Handle a command byte of one: TBD.
rm_curvature_one_command BE6C LD HL,$0000 HL = <map curvature address> -- Self modified by ml27_bbcc
BE6F JR rm_read_curvature Jump to rm_read_curvature
Handle a command byte of zero: jump to the address given in next two bytes.
rm_curvature_jump_command BE71 LD A,(HL) HL = wordat(HL)
BE72 INC HL
BE73 LD H,(HL)
BE74 LD L,A
rm_read_curvature BE75 EX DE,HL DE is now map curvature address
BE76 LD A,(DE) Read a curvature byte (regular, not an escape)
rm_curvature_regular_byte BE77 LD ($A26E),DE road_curvature_ptr = DE
BE7B SUB $10 A -= 16 -- decrement counter in top nibble
rm_save_curvature_byte BE7D LD ($A242),A curvature_byte = A
BE80 AND $0F Mask off direction bits
BE82 BIT 3,A Jump to rm_set_curvature if (A & (1<<3)) is zero -- bit 3 => left (so jump if right)
BE84 JR Z,rm_set_curvature
BE86 AND $07 A = -(A & 7) -- Left direction becomes -ve
BE88 NEG
Write the direction into the cyclic road buffer.
rm_set_curvature BE8A ADD A,A *HL = A * 2 -- Sampled HL: $EEA9 [in cyclic road buffer]
BE8B LD (HL),A
BE8C LD A,L L += 32
BE8D ADD A,$20
BE8F LD L,A
-- HEIGHT --
The top nibble of each byte is a counter. The bottom nibble is height data.
BE90 LD A,($A243) A = height_byte - 16
BE93 SUB $10
BE95 JR NC,rm_save_height_byte Jump to rm_save_height_byte if height_byte >= 16
BE97 LD DE,($A270) Read and increment address of height data
BE9B INC DE
BE9C LD A,(DE) Read a height byte
BE9D OR A Set flags
BE9E JR NZ,rm_height_regular_byte Jump to rm_height_regular_byte if non-zero
Handle height escape byte.
BEA0 EX DE,HL HL is now address of escape byte
BEA1 INC HL Increment, read command byte, increment again
BEA2 LD A,(HL)
BEA3 INC HL
BEA4 AND A Jump to rm_height_jump_command if command byte is zero
BEA5 JR Z,rm_height_jump_command
BEA7 DEC A
BEA8 JR Z,rm_height_one_command Jump to rm_height_one_command if command byte is one
Otherwise it must be a road split command (byte == 2).
BEAA LD C,(HL) Load address of left route's height data
BEAB INC HL
BEAC LD B,(HL)
BEAD INC HL
BEAE LD ($BB98),BC Self modify 'LD DE,$xxxx' @ BB97 to load the address
BEB2 LD A,(HL) Load address of right route's height data
BEB3 INC HL
BEB4 LD H,(HL)
BEB5 LD L,A
BEB6 LD ($BBC5),HL Self modify 'LD DE,$xxxx' @ BBC4 to load the address
BEB9 LD HL,$E2CC HL = roadsplit_height -> road split height data
BEBC JR rm_read_height Jump to rm_read_height
rm_height_one_command BEBE LD HL,$0000 HL = <something> -- Self modified by BBCF
BEC1 JR rm_read_height Jump to rm_read_height
rm_height_jump_command BEC3 LD A,(HL) HL = wordat(HL)
BEC4 INC HL
BEC5 LD H,(HL)
BEC6 LD L,A
rm_read_height BEC7 EX DE,HL DE is now height address
BEC8 LD A,(DE) Read a height byte (regular, not an escape)
rm_height_regular_byte BEC9 LD ($A270),DE road_height_ptr = DE
BECD SUB $10 A -= 16 -- decrement counter in top nibble
rm_save_height_byte BECF LD ($A243),A height_byte = A
BED2 AND $0F *HL = (A & 15) - 8 -- Sampled HL: $EEC9 [in cyclic road buffer]
BED4 SUB $08
BED6 LD (HL),A
BED7 LD A,L L += 32
BED8 ADD A,$20
BEDA LD L,A
-- LANES --
Lanes bytes are counted (like RLE).
BEDB LD A,($A247) Decrement the lanes counter
BEDE SUB $01
BEE0 JR NC,rm_lanes_count_resume Jump to rm_lanes_count_resume if non-zero
Lanes counter hit zero, so reload.
BEE2 LD DE,($A272) Read and increment address of lanes data
BEE6 INC DE
BEE7 LD A,(DE) Read a lanes byte
BEE8 OR A Set flags
BEE9 JR NZ,rm_lanes_regular_byte Jump to rm_lanes_regular_byte if non-zero
Handle lanes escape byte.
BEEB EX DE,HL HL is now address of escape byte
BEEC INC HL Increment, read command byte, increment again
BEED LD A,(HL)
BEEE INC HL
BEEF AND A Jump to rm_lanes_jump_command if command byte is zero
BEF0 JR Z,rm_lanes_jump_command
BEF2 DEC A Jump to rm_lanes_one_command if command byte is one
BEF3 JR Z,rm_lanes_one_command
Otherwise it must be a road split command (byte == 2).
BEF5 LD C,(HL) Load address of left route's lanes data
BEF6 INC HL
BEF7 LD B,(HL)
BEF8 INC HL
BEF9 LD ($BB9B),BC Self modify 'LD BC,$xxxx' @ BB9A to load the address
BEFD LD A,(HL) Load address of right route's height data
BEFE INC HL
BEFF LD H,(HL)
BF00 LD L,A
BF01 LD ($BBC8),HL Self modify 'LD BC,$xxxx' @ BBC7 to load the address
BF04 LD HL,$E2D1 HL = roadsplit_lanes -> road split lanes data
BF07 JR rm_read_lanes Jump to rm_read_lanes
rm_lanes_one_command BF09 LD HL,$0000 HL = $0000 -- This looks setup for it as others, but doesn't seem to be self modified.
BF0C JR rm_read_lanes Jump to rm_read_lanes
rm_lanes_jump_command BF0E LD A,(HL) HL = wordat(HL)
BF0F INC HL
BF10 LD H,(HL)
BF11 LD L,A
rm_read_lanes BF12 EX DE,HL DE is now lanes address
BF13 LD A,(DE) Read a lanes byte (regular, not an escape)
rm_lanes_regular_byte BF14 DEC A lanes_counter_byte = (lanes byte) - 1
BF15 LD ($A247),A
BF18 INC DE road_lanes_ptr = ++DE
BF19 LD ($A272),DE
BF1D LD A,(DE) *HL = *DE & $F7 -- HL points into cyclic road buffer? Sampled HL = $EE60
BF1E AND $F7
BF20 LD (HL),A
BF21 LD A,(DE) A = *DE & $FB
BF22 AND $FB
BF24 LD ($BF2D),A Self modify 'LD A,$xx' @ BF2C
BF27 JR rm_lanes_done Jump to rm_lanes_done
Resume updating lanes data.
rm_lanes_count_resume BF29 LD ($A247),A Store decremented lanes counter
BF2C LD A,$00 A = <self modified value> -- Self modified above AND below
BF2E LD C,A C = A -- Save temporarily
BF2F AND $0C Jump to rm_lanes_bf39 if (A & $0C) is zero
BF31 JR Z,rm_lanes_bf39
(bottom two bits significant)
BF33 LD A,C A = C & $F3
BF34 AND $F3
BF36 LD ($BF2D),A Self modify 'LD A,$xx' @ BF2C
rm_lanes_bf39 BF39 LD (HL),C *HL = C -- Sampled HL: $EEE9
rm_lanes_done BF3A LD A,L L += 32
BF3B ADD A,$20
BF3D LD L,A
-- SKIPPING ALL OBJECTS AND HAZARDS --
BF3E LD A,($A185) Decrement no_objects_counter
BF41 DEC A
BF42 JR Z,rm_rightside Jump to rm_rightside if it's zero
Clear the right side, left side and hazards
BF44 LD C,$00 HL[ 0] = 0
BF46 LD (HL),C
BF47 LD A,L
BF48 ADD A,$20
BF4A LD L,A
BF4B LD (HL),C HL[32] = 0
BF4C ADD A,$20
BF4E LD L,A
BF4F LD (HL),C HL[64] = 0
BF50 LD A,$01 Reset no_objects_counter to 1
BF52 JP rm_all_hazards Jump to rm_all_hazards
-- RIGHT-SIDE OBJECTS --
The top nibble of each byte is a counter. The bottom nibble is rightside data.
rm_rightside BF55 LD A,($A245) A = rightside_byte - 16
BF58 SUB $10
BF5A JR NC,rm_rightside_count_resume Jump to rm_rightside_count_resume if rightside_byte >= 16
Rightside counter hit zero, so reload.
BF5C LD DE,($A274) Read and increment address of rightside data
BF60 INC DE
BF61 LD A,(DE) Read a rightside byte
BF62 AND A Set flags
BF63 JR NZ,rm_rightside_regular_byte Jump to rm_rightside_regular_byte if non-zero
Handle rightside escape byte.
BF65 EX DE,HL HL is now address of escape byte
BF66 INC HL Increment, read command byte, increment again
BF67 LD A,(HL)
BF68 INC HL
BF69 AND A Jump to rm_rightside_jump_command if command byte is zero
BF6A JR Z,rm_rightside_jump_command
BF6C DEC A Jump to rm_rightside_one_command if command byte is one
BF6D JR Z,rm_rightside_one_command
Otherwise it must be a road split command (byte == 2).
BF6F LD C,(HL) Load address of left route's rightside data
BF70 INC HL
BF71 LD B,(HL)
BF72 INC HL
BF73 LD ($BB8E),BC Set modify 'LD DE,$xxxx' @ BB8D to load the address
BF77 LD A,(HL) Load address of right route's rightside data
BF78 INC HL
BF79 LD H,(HL)
BF7A LD L,A
BF7B LD ($BBBB),HL Self modify 'LD DE,$xxxx' @ BBBA to load the address
BF7E LD HL,$E2C1 HL = $E2C1 [overlapping use of data TBD]
BF81 JR rm_read_rightside Jump to rm_read_rightside
rm_rightside_one_command BF83 LD HL,$0000 HL = $0000 -- This looks setup for it as others, but doesn't seem to be self modified.
BF86 JR rm_read_rightside Jump to rm_read_rightside
rm_rightside_jump_command BF88 LD A,(HL) HL = wordat(HL)
BF89 INC HL
BF8A LD H,(HL)
BF8B LD L,A
rm_read_rightside BF8C EX DE,HL DE is now lanes address
BF8D LD A,(DE) Read a rightside byte (regular, not an escape)
rm_rightside_regular_byte BF8E LD ($A274),DE road_rightside_ptr = DE
BF92 SUB $10 A -= 16
rm_rightside_count_resume BF94 LD ($A245),A rightside_byte = A -- Store decremented rightside counter
BF97 AND $0F *HL = A & $0F -- Write to cyclic road buffer
BF99 LD (HL),A
BF9A LD A,L L += 32
BF9B ADD A,$20
BF9D LD L,A
-- LEFT-SIDE OBJECTS --
BF9E LD A,($A244) A = leftside_byte - 16
BFA1 SUB $10
BFA3 JR NC,rm_leftside_count_resume Jump to rm_leftside_count_resume if leftside_byte >= 16
BFA5 LD DE,($A276) DE = road_leftside_ptr + 1
BFA9 INC DE
BFAA LD A,(DE) Read a lanes byte
BFAB AND A Set flags
BFAC JR NZ,rm_leftside_regular_byte Jump to rm_leftside_regular_byte if non-zero
Handle leftside escape byte.
BFAE EX DE,HL HL is now address of escape byte
BFAF INC HL Increment, read command byte, increment again
BFB0 LD A,(HL)
BFB1 INC HL
BFB2 AND A Jump to rm_leftside_jump_command if command byte is zero
BFB3 JR Z,rm_leftside_jump_command
BFB5 DEC A Jump to rm_leftside_one_command if command byte is one
BFB6 JR Z,rm_leftside_one_command
Otherwise it must be a road split command (byte == 2).
BFB8 LD C,(HL) Load address of left route's leftside data
BFB9 INC HL
BFBA LD B,(HL)
BFBB INC HL
BFBC LD ($BB91),BC Self modify 'LD BC,$xxxx' @ BB90
BFC0 LD A,(HL) Load address of right route's leftside data
BFC1 INC HL
BFC2 LD H,(HL)
BFC3 LD L,A
BFC4 LD ($BBBE),HL Self modify 'LD BC,$xxxx' @ BBBD
BFC7 LD HL,$E2C0 HL = $E2C0 [overlapping use of data TBD]
BFCA JR rm_read_leftside Jump to rm_read_leftside
rm_leftside_one_command BFCC LD HL,$0000 HL = $0000 -- This looks setup for it as others, but doesn't seem to be self modified.
BFCF JR rm_read_leftside Jump to rm_read_leftside
rm_leftside_jump_command BFD1 LD A,(HL) HL = wordat(HL)
BFD2 INC HL
BFD3 LD H,(HL)
BFD4 LD L,A
rm_read_leftside BFD5 EX DE,HL DE is now lanes address
BFD6 LD A,(DE) Read a leftside byte (regular, not an escape)
rm_leftside_regular_byte BFD7 LD ($A276),DE road_leftside_ptr = DE
BFDB SUB $10 A -= 16
rm_leftside_count_resume BFDD LD ($A244),A leftside_byte = A -- Store decremented leftside counter
BFE0 AND $0F *HL = A & $0F -- Write to cyclic road buffer
BFE2 LD (HL),A
BFE3 LD A,L L += 32
BFE4 ADD A,$20
BFE6 LD L,A
-- HAZARDS --
BFE7 LD A,($A246) A = hazards_byte - 1 [it's a counter]
BFEA SUB $01
BFEC JR NC,rm_no_hazards Jump to rm_no_hazards if no carry
BFEE LD DE,($A278) DE = road_hazard_ptr + 1
BFF2 INC DE
rm_restart_hazards_read BFF3 LD A,(DE) Read a hazards byte
BFF4 AND A Set flags
BFF5 JR NZ,rm_hazards_regular_byte Jump to rm_hazards_regular_byte if non-zero
Handle hazards escape byte.
BFF7 EX DE,HL HL is now address of escape byte
BFF8 INC HL Increment, read command byte, increment again
BFF9 LD A,(HL)
BFFA INC HL
BFFB AND A Set flags
BFFC JR Z,rm_hazards_jump_command Jump to rm_hazards_jump_command if command byte is zero
BFFE DEC A
BFFF JR Z,rm_hazards_one_command Jump to rm_hazards_one_command if command byte is one
C001 DEC A Jump to rm_hazards_road_fork_command if command byte is two
C002 JR Z,rm_hazards_road_fork_command
C004 DEC A
C005 CP $07 Jump to rm_hazards_set_hazard_command if command byte is < 10 -- 3..9
C007 JR C,rm_hazards_set_hazard_command
C009 CP $0A Jump to rm_hazards_set_arrow_command if command byte is < 13 -- 10..12
C00B JR C,rm_hazards_set_arrow_command
C00D CP $0C Jump to rm_hazards_spawning_command if command byte is < 15 -- 13..14
C00F JR C,rm_hazards_spawning_command
C011 SUB $0B Otherwise helicopter_control = A - 11
C013 LD ($A224),A
C016 JR rm_do_restart Jump to rm_do_restart
Handle car spawning commands (13/14 = enable/disable car spawning).
rm_hazards_spawning_command C018 SUB $0A stop_car_spawning = A - 10
C01A LD ($A225),A
C01D JR rm_do_restart Jump to rm_do_restart
Handle floating arrow commands (10/11/12 = off/left/right).
rm_hazards_set_arrow_command C01F SUB $07 floating_arrow = A - 7
C021 LD ($A227),A
C024 JR Z,rm_do_restart Jump to rm_do_restart if zero
C026 LD ($A226),A correct_fork = A
rm_do_restart C029 EX DE,HL
C02A JR rm_restart_hazards_read Jump to rm_restart_hazards_read
Handle hazard commands (3 = off, 4/5/6 = tumbleweeds left/right/both, 7/8/9 => barriers)
When on left it uses lane 1, on right it uses lane 4, both it uses lane 2 and 3.
rm_hazards_set_hazard_command C02C LD ($C059),A Self modify 'LD (HL),xxxx' at C058 to load A [which is command_no-3]
C02F JR rm_read_hazards Jump to rm_read_hazards
rm_hazards_road_fork_command C031 LD C,(HL) Load address of left route's hazards data -- Sampled HL: $5F26 (road split)
C032 INC HL
C033 LD B,(HL)
C034 INC HL
C035 LD ($BB8B),BC Self modify 'LD HL,$xxxx' @ BB8A
C039 LD A,(HL) Load address of right route's hazards data
C03A INC HL
C03B LD H,(HL)
C03C LD L,A
C03D LD ($BBB8),HL Self modify 'LD HL,$xxxx' @ BBB7
C040 LD HL,$E2B8 HL = perp_escape_lanes_loop
C043 JR rm_read_hazards Jump to rm_read_hazards
rm_hazards_one_command C045 LD HL,$0000 HL = 0
C048 JR rm_read_hazards Jump to rm_read_hazards
rm_hazards_jump_command C04A LD A,(HL) HL = wordat(HL) [Sampled HL: $6292 $6107 $61BC $600F]
C04B INC HL
C04C LD H,(HL)
C04D LD L,A
rm_read_hazards C04E EX DE,HL DE is now hazards address
C04F LD A,(DE) Read a hazards byte (regular, not an escape)
rm_hazards_regular_byte C050 LD ($A278),DE road_hazard_ptr = DE -- Update hazard objects ptr
C054 DEC A A--
rm_no_hazards C055 LD ($A246),A hazards_byte = A -- Update hazards byte
C058 LD (HL),$00 *HL = 0 [cyclic road buffer]
C05A LD A,$02 A = 2
rm_all_hazards C05C LD ($A185),A Set no_objects_counter to A
C05F CALL sub_b8d2 Call sub_b8d2
C062 LD IX,$A188 IX = &hazards
C066 LD DE,$0014 DE = 20 -- array entry stride
C069 LD BC,$0600 B = 6, C = 0
rm_c06c C06C RLC (IX+$00) test the used flag
C070 JR C,rm_c080 jump if used
rm_c072_continue C072 ADD IX,DE IX += DE
C074 DJNZ rm_c06c Loop while B
C076 LD A,C A = C -- A = 0?
C077 LD HL,$A22B HL = &allow_overtake_bonus
C07A LD HL,$A22B HL = &allow_overtake_bonus -- duplicate instruction
C07D LD (HL),A *HL = A
C07E JR rm_c0bb Jump to rm_c0bb
rm_c080 C080 LD A,(IX+$0F) A = IX[15] + 1
C083 INC A
C084 JR Z,rm_c096 Jump to rm_c096 if zero
C086 DEC (IX+$01) IX[1]--
C089 JP NZ,rm_c072_continue Jump to rm_c072_continue if non-zero
C08C LD (IX+$00),$00 IX[0] = 0 -- mark the hazard entry unused
C090 RLA testing top bit of A
C091 JR NC,rm_c072_continue Jump to rm_c072_continue if no carry
C093 INC C C++
C094 JR rm_c072_continue Jump to rm_c072_continue
rm_c096 C096 LD A,(IX+$01) A = IX[1] - 1
C099 SUB $01
C09B LD (IX+$01),A IX[1] = A
C09E JR C,rm_c0b2 Jump to rm_c0b2 if carry
C0A0 JR NZ,rm_c072_continue Jump to rm_c072_continue if non-zero
C0A2 LD A,(IX+$11) A = IX[17]
C0A5 AND A Set flags
C0A6 JR NZ,rm_c072_continue Jump to rm_c072_continue if non-zero
C0A8 LD (IX+$01),$01 IX[1] = 1
C0AC LD (IX+$04),$FF IX[4] = 255
C0B0 JR rm_c072_continue Jump to rm_c072_continue
rm_c0b2 C0B2 LD A,(IX+$11) IX[17]--
C0B5 DEC A
C0B6 LD (IX+$11),A
C0B9 JR rm_c072_continue Jump to rm_c072_continue
rm_c0bb C0BB LD A,$00 A = <self modified> -- Self modified by A977 + A9A0 only
C0BD AND A Set flags
C0BE JP Z,rm_c0d7 Jump to rm_c0d7 if zero
C0C1 LD HL,$ED73 HL = $ED73 -- This must be a buffer pointer at this point
C0C4 LD DE,$ED77 DE = $ED77
C0C7 LD BC,$0026 BC = 38
rm_c0ca C0CA DEC HL HL -= 2
C0CB DEC HL
C0CC DEC DE DE -= 2
C0CD DEC DE
C0CE LDD *DE-- = *HL--; BC--
C0D0 LDD *DE-- = *HL--; BC--
C0D2 JP PE,rm_c0ca Jump to rm_c0ca if PE PE => B became zero
C0D5 INC HL HL++
C0D6 LD (HL),B *HL = B
rm_c0d7 C0D7 LD A,$01 A = 1
rm_c0d9 C0D9 LD HL,$A254 Increment another_spawning_flag by A
C0DC ADD A,(HL)
C0DD LD (HL),A
C0DE JP sub_ad0d Exit via sub_ad0d
Prev: BDC1 Up: Map Next: C0E1