Codetapper's Amiga Site

Shadow of the Beast

Shadow of the Beast by Reflections was one of the first jaw-droppingly beautiful Amiga games. Even today, it still looks very slick, a testament to the creative talents of Paul Howarth and Martin Edmondson.

Even the attract sequence has multiple layers of parallax scrolling and animation, so let's investigate how it was done!

Shadow of the Beast attract mode

The game is basically running in dual playfield mode, 2 playfields of 3 bitplanes each, therefore 8 colours (really 7, as one of them is transparent) on top of another 8 colours! This may be hard to believe when you look at the screenshot above.

Shadow of the Beast was one of the first games to really go overboard with sprite re-use and palette changes with the copper. The other technique that really added to the effect was switching the playfield and sprite priorities multiple times while the screen was being drawn.

The back playfield consists of the clouds, mountains and the grass. There are many splits in the image so that each section scrolls at a different speed to simulate the parallax effect. There are 5 horizontal bands of clouds, then the mountains, then 5 sections of grass giving 11 layers of parallax in this playfield:

Shadow of the Beast back playfield

During the attact sequence, the front playfield simply scrolls left and right, revealing a "Psygnosis presents" screen and the "Beast by Reflections" image. At the bottom of the screen, a broken stone wall with a gate scrolls very quickly to add to the effect:

Shadow of the Beast front playfield

The Amiga's 8 sprites are used to add extra layers to the image. There are 3 distinct bands where the sprites are re-used. In the top section, sprites are given the highest priority, so they sit on top of all the other graphics:

  • Sprites 0 and 1 create the life counter, in this case showing the numbers 12.
  • Sprites 2 and 3 (attached) form the little 16-colour heartbeat monitor.
  • Sprites 4 and 5 (attached) form the 16-colour blue potion.
  • Sprites 6 and 7 (attached) form the 16-colour purple potion.

After the first band of sprites have been drawn, all 8 sprites are reset to new addresses, new colours are loaded into the sprite palette registers, and the priority is changed so the sprites appear behind everything. Because of this new low priority, sprites will only appear where colour 0 appears (which is black) so the game has to change the background black colour to the sky blue on every single line in the region, and switch it back to black at the end of each scanline:

  • Sprites 0-3 form the large blimp.
  • Sprites 4-7 create the moon.
  • Sprites 0-1 form the small blimp.

After the large blimp has been drawn, the palette for the first 2 sprites is changed to purple shades, and the small blimp is drawn.

Shadow of the Beast sprites

After this, all 8 sprites are again reset and all colours are set to the same set of 3 brown shades. The sprite priority is again changed so that the sprites appear on top of the back playfield (the mountains).

Now all 8 sprites are drawn side by side creating a 128 pixel wide tree. There is also some graphics corruption where the sprite wasn't correctly finished off, hence the strange effect under the trunk of the tree!

The copperlist to achieve this screenshot is:

00027a58: 0120 0005    ;SPR0PTH := 0x0005    Setup sprite pointers - digit 1
00027a5c: 0122 92b0    ;SPR0PTL := 0x92b0
00027a60: 0124 0005    ;SPR1PTH := 0x0005    Digit 2
00027a64: 0126 9570    ;SPR1PTL := 0x9570
00027a68: 0128 0005    ;SPR2PTH := 0x0005    Heartbeat monitor
00027a6c: 012a 9d98    ;SPR2PTL := 0x9d98
00027a70: 012c 0005    ;SPR3PTH := 0x0005
00027a74: 012e 9ddc    ;SPR3PTL := 0x9ddc
00027a78: 0130 0005    ;SPR4PTH := 0x0005    Blue potion
00027a7c: 0132 a260    ;SPR4PTL := 0xa260
00027a80: 0134 0005    ;SPR5PTH := 0x0005
00027a84: 0136 a2a0    ;SPR5PTL := 0xa2a0
00027a88: 0138 0005    ;SPR6PTH := 0x0005    Purple potion
00027a8c: 013a a2e0    ;SPR6PTL := 0xa2e0
00027a90: 013c 0005    ;SPR7PTH := 0x0005
00027a94: 013e a320    ;SPR7PTL := 0xa320
00027a98: 0104 0024    ;BPLCON2 := 0x0024    Sprites have highest priority
00027a9c: 0192 0ccc    ;COLOR09 := 0x0ccc    Setup palette for the clouds
00027aa0: 0194 0bbb    ;COLOR10 := 0x0bbb
00027aa4: 0196 0aaa    ;COLOR11 := 0x0aaa
00027aa8: 0198 0999    ;COLOR12 := 0x0999
00027aac: 019a 0888    ;COLOR13 := 0x0888
00027ab0: 019c 0777    ;COLOR14 := 0x0777
00027ab4: 019e 0678    ;COLOR15 := 0x0678
00027ab8: 00e4 0007    ;BPL2PTH := 0x0007    Setup back playfield pointers (top clouds) 
00027abc: 00e6 449a    ;BPL2PTL := 0x449a
00027ac0: 00ec 0007    ;BPL4PTH := 0x0007
00027ac4: 00ee 831a    ;BPL4PTL := 0x831a
00027ac8: 00f4 0007    ;BPL6PTH := 0x0007
00027acc: 00f6 c19a    ;BPL6PTL := 0xc19a
00027ad0: 0102 000e    ;BPLCON1 := 0x000e
00027ad4: 00e0 0005    ;BPL1PTH := 0x0005    Setup front playfield pointers
00027ad8: 00e2 baea    ;BPL1PTL := 0xbaea
00027adc: 00e8 0005    ;BPL3PTH := 0x0005
00027ae0: 00ea fc8a    ;BPL3PTL := 0xfc8a
00027ae4: 00f0 0006    ;BPL5PTH := 0x0006
00027ae8: 00f2 3e2a    ;BPL5PTL := 0x3e2a
00027aec: 0102 000e    ;BPLCON1 := 0x000e
00027af0: 0182 0aaa    ;COLOR01 := 0x0aaa    Setup palette for Beast by Reflections
00027af4: 0184 0f00    ;COLOR02 := 0x0f00
00027af8: 0186 0fff    ;COLOR03 := 0x0fff
00027afc: 0188 0daa    ;COLOR04 := 0x0daa
00027b00: 018a 0b66    ;COLOR05 := 0x0b66
00027b04: 018c 0a22    ;COLOR06 := 0x0a22
00027b08: 018e 0800    ;COLOR07 := 0x0800
00027b0c: 01a2 00f0    ;COLOR17 := 0x00f0    Setup sprite colours
00027b10: 01a4 0660    ;COLOR18 := 0x0660
00027b14: 01a6 0770    ;COLOR19 := 0x0770
00027b18: 01a8 0005    ;COLOR20 := 0x0005
00027b1c: 01aa 0007    ;COLOR21 := 0x0007
00027b20: 01ac 0228    ;COLOR22 := 0x0228
00027b24: 01ae 0449    ;COLOR23 := 0x0449
00027b28: 01b0 055a    ;COLOR24 := 0x055a
00027b2c: 01b2 066b    ;COLOR25 := 0x066b
00027b30: 01b4 0c00    ;COLOR26 := 0x0c00
00027b34: 01b6 0b0b    ;COLOR27 := 0x0b0b
00027b38: 01b8 0808    ;COLOR28 := 0x0808
00027b3c: 01ba 0606    ;COLOR29 := 0x0606
00027b40: 01bc 0404    ;COLOR30 := 0x0404
00027b44: 01be 0550    ;COLOR31 := 0x0550

In the life counter digits, a graduated effect from a series of blues to browns is drawn through the numbers. The digits are 14 pixels high, so the game changes the colour for sprite 0 and 1 on each line for 14 lines:

00027b48: 2d01 ff00    ;Wait for vpos >= 0x2d, ignore horizontal.
00027b4c: 01a2 0335    ;COLOR17 := 0x0335
00027b50: 2e01 ff00    ;Wait for vpos >= 0x2e, ignore horizontal.
00027b54: 01a2 0446    ;COLOR17 := 0x0446
00027b58: 2f01 ff00    ;Wait for vpos >= 0x2f, ignore horizontal.
00027b5c: 01a2 0557    ;COLOR17 := 0x0557
00027b60: 3001 ff00    ;Wait for vpos >= 0x30, ignore horizontal.
00027b64: 01a2 0668    ;COLOR17 := 0x0668
00027b68: 3101 ff00    ;Wait for vpos >= 0x31, ignore horizontal.
00027b6c: 01a2 0779    ;COLOR17 := 0x0779
00027b70: 3201 ff00    ;Wait for vpos >= 0x32, ignore horizontal.
00027b74: 01a2 088a    ;COLOR17 := 0x088a
00027b78: 3301 ff00    ;Wait for vpos >= 0x33, ignore horizontal.
00027b7c: 01a2 099b    ;COLOR17 := 0x099b
00027b80: 3401 ff00    ;Wait for vpos >= 0x34, ignore horizontal.
00027b84: 01a2 0543    ;COLOR17 := 0x0543
00027b88: 3501 ff00    ;Wait for vpos >= 0x35, ignore horizontal.
00027b8c: 01a2 0654    ;COLOR17 := 0x0654
00027b90: 3601 ff00    ;Wait for vpos >= 0x36, ignore horizontal.
00027b94: 01a2 0765    ;COLOR17 := 0x0765
00027b98: 3701 ff00    ;Wait for vpos >= 0x37, ignore horizontal.
00027b9c: 01a2 0876    ;COLOR17 := 0x0876
00027ba0: 3801 ff00    ;Wait for vpos >= 0x38, ignore horizontal.
00027ba4: 01a2 0987    ;COLOR17 := 0x0987
00027ba8: 3901 ff00    ;Wait for vpos >= 0x39, ignore horizontal.
00027bac: 01a2 0a98    ;COLOR17 := 0x0a98
00027bb0: 3a01 ff00    ;Wait for vpos >= 0x3a, ignore horizontal.
00027bb4: 01a2 0ba9    ;COLOR17 := 0x0ba9

At the end of the final scanline, the sprite pointers are reset so the blimp section and moon can be displayed. Sprites are given the lowest priority, so they will only appear where colour 0 exists. This means they will appear behind the clouds and the Beast writing.

00027bb8: 3ad1 fffe    ;Wait for vpos >= 0x3a and hpos >= 0xd0.
00027bbc: 0120 0005    ;SPR0PTH := 0x0005
00027bc0: 0122 a360    ;SPR0PTL := 0xa360
00027bc4: 0124 0005    ;SPR1PTH := 0x0005
00027bc8: 0126 a3d4    ;SPR1PTL := 0xa3d4
00027bcc: 0128 0005    ;SPR2PTH := 0x0005
00027bd0: 012a a448    ;SPR2PTL := 0xa448
00027bd4: 012c 0005    ;SPR3PTH := 0x0005
00027bd8: 012e a4bc    ;SPR3PTL := 0xa4bc
00027bdc: 0132 8f00    ;SPR4PTL := 0x8f00
00027be0: 0136 8fdc    ;SPR5PTL := 0x8fdc
00027be4: 013a 90b8    ;SPR6PTL := 0x90b8
00027be8: 013e 9194    ;SPR7PTL := 0x9194
00027bec: 0104 0000    ;BPLCON2 := 0x0000    Sprites appear behind everything
00027bf0: 01b2 089a    ;COLOR25 := 0x089a    Moon colours (light blues)
00027bf4: 01b4 0789    ;COLOR26 := 0x0789
00027bf8: 01ba 089a    ;COLOR29 := 0x089a
00027bfc: 01bc 0789    ;COLOR30 := 0x0789
00027c00: 01a2 0567    ;COLOR17 := 0x0567    Large blimp colours (dark blues)
00027c04: 01aa 0567    ;COLOR21 := 0x0567
00027c08: 01a4 0456    ;COLOR18 := 0x0456
00027c0c: 01ac 0456    ;COLOR22 := 0x0456
00027c10: 01a6 0345    ;COLOR19 := 0x0345
00027c14: 01ae 0345    ;COLOR23 := 0x0345

The sprites would look awful if they scrolled over a black landscape, so the game gets around this problem by waiting for horizontal position $40 and changing colour 0 from black to a sky blue shade. At the end of each line at horizontal position $c0, it changes colour 0 back to black. This is repeated all the way down the blimp section:

00027c18: 3c41 fffe    ;Wait for vpos >= 0x3c and hpos >= 0x40.
00027c1c: 0180 0678    ;COLOR00 := 0x0678
00027c20: 3cd1 fffe    ;Wait for vpos >= 0x3c and hpos >= 0xd0.
00027c24: 0180 0000    ;COLOR00 := 0x0000
00027c28: 3d41 fffe    ;Wait for vpos >= 0x3d and hpos >= 0x40.
00027c2c: 0180 0678    ;COLOR00 := 0x0678
00027c30: 3dd1 fffe    ;Wait for vpos >= 0x3d and hpos >= 0xd0.
00027c34: 0180 0000    ;COLOR00 := 0x0000
00027c38: 3e41 fffe    ;Wait for vpos >= 0x3e and hpos >= 0x40.
00027c3c: 0180 0678    ;COLOR00 := 0x0678
00027c40: 3ed1 fffe    ;Wait for vpos >= 0x3e and hpos >= 0xd0.
00027c44: 0180 0000    ;COLOR00 := 0x0000
00027c48: 3f41 fffe    ;Wait for vpos >= 0x3f and hpos >= 0x40.
00027c4c: 0180 0678    ;COLOR00 := 0x0678
00027c50: 3fd1 fffe    ;Wait for vpos >= 0x3f and hpos >= 0xd0.
00027c54: 0180 0000    ;COLOR00 := 0x0000
00027c58: 4041 fffe    ;Wait for vpos >= 0x40 and hpos >= 0x40.
00027c5c: 0180 0678    ;COLOR00 := 0x0678
00027c60: 40d1 fffe    ;Wait for vpos >= 0x40 and hpos >= 0xd0.
00027c64: 0180 0000    ;COLOR00 := 0x0000
00027c68: 4141 fffe    ;Wait for vpos >= 0x41 and hpos >= 0x40.
00027c6c: 0180 0678    ;COLOR00 := 0x0678
00027c70: 41d1 fffe    ;Wait for vpos >= 0x41 and hpos >= 0xd0.
00027c74: 0180 0000    ;COLOR00 := 0x0000
00027c78: 4201 ff00    ;Wait for vpos >= 0x42, ignore horizontal.

During this section, the back playfield has it's pointers changed to access a different cloud image. This is scrolled at a slightly different speed to add to the parallax effect. From here downwards, other palette entries for the front playfield are also changed at various points. This creates the graduated effect on the "Psygnosis Presents" screen and the "Beast by Reflections" part:

00027c7c: 00e4 0007    ;BPL2PTH := 0x0007    Cloud layer 2
00027c80: 00e6 4b82    ;BPL2PTL := 0x4b82
00027c84: 00ec 0007    ;BPL4PTH := 0x0007
00027c88: 00ee 8a02    ;BPL4PTL := 0x8a02
00027c8c: 00f4 0007    ;BPL6PTH := 0x0007
00027c90: 00f6 c882    ;BPL6PTL := 0xc882
00027c94: 0102 008e    ;BPLCON1 := 0x008e    New scroll position set for the clouds
00027c98: 4241 fffe    ;Wait for vpos >= 0x42 and hpos >= 0x40.
00027c9c: 0180 0678    ;COLOR00 := 0x0678
00027ca0: 42d1 fffe    ;Wait for vpos >= 0x42 and hpos >= 0xd0.
00027ca4: 0180 0000    ;COLOR00 := 0x0000
00027ca8: 4341 fffe    ;Wait for vpos >= 0x43 and hpos >= 0x40.
00027cac: 0180 0678    ;COLOR00 := 0x0678
00027cb0: 43d1 fffe    ;Wait for vpos >= 0x43 and hpos >= 0xd0.
00027cb4: 0180 0000    ;COLOR00 := 0x0000
00027cb8: 4441 fffe    ;Wait for vpos >= 0x44 and hpos >= 0x40.
00027cbc: 0180 0678    ;COLOR00 := 0x0678
00027cc0: 44d1 fffe    ;Wait for vpos >= 0x44 and hpos >= 0xd0.
00027cc4: 0180 0000    ;COLOR00 := 0x0000
00027cc8: 4541 fffe    ;Wait for vpos >= 0x45 and hpos >= 0x40.
00027ccc: 0180 0678    ;COLOR00 := 0x0678
00027cd0: 45d1 fffe    ;Wait for vpos >= 0x45 and hpos >= 0xd0.
00027cd4: 0180 0000    ;COLOR00 := 0x0000
00027cd8: 4641 fffe    ;Wait for vpos >= 0x46 and hpos >= 0x40.
00027cdc: 0180 0678    ;COLOR00 := 0x0678
00027ce0: 46d1 fffe    ;Wait for vpos >= 0x46 and hpos >= 0xd0.
00027ce4: 0180 0000    ;COLOR00 := 0x0000
00027ce8: 4741 fffe    ;Wait for vpos >= 0x47 and hpos >= 0x40.
00027cec: 0180 0678    ;COLOR00 := 0x0678
00027cf0: 47d1 fffe    ;Wait for vpos >= 0x47 and hpos >= 0xd0.
00027cf4: 0180 0000    ;COLOR00 := 0x0000
00027cf8: 4841 fffe    ;Wait for vpos >= 0x48 and hpos >= 0x40.
00027cfc: 0180 0678    ;COLOR00 := 0x0678
00027d00: 48d1 fffe    ;Wait for vpos >= 0x48 and hpos >= 0xd0.
00027d04: 0180 0000    ;COLOR00 := 0x0000
00027d08: 4941 fffe    ;Wait for vpos >= 0x49 and hpos >= 0x40.
00027d0c: 0180 0678    ;COLOR00 := 0x0678
00027d10: 49d1 fffe    ;Wait for vpos >= 0x49 and hpos >= 0xd0.
00027d14: 0180 0000    ;COLOR00 := 0x0000
00027d18: 4a41 fffe    ;Wait for vpos >= 0x4a and hpos >= 0x40.
00027d1c: 0180 0678    ;COLOR00 := 0x0678
00027d20: 4ad1 fffe    ;Wait for vpos >= 0x4a and hpos >= 0xd0.
00027d24: 0180 0000    ;COLOR00 := 0x0000
00027d28: 4b41 fffe    ;Wait for vpos >= 0x4b and hpos >= 0x40.
00027d2c: 0180 0678    ;COLOR00 := 0x0678
00027d30: 4bd1 fffe    ;Wait for vpos >= 0x4b and hpos >= 0xd0.
00027d34: 0180 0000    ;COLOR00 := 0x0000
00027d38: 4c41 fffe    ;Wait for vpos >= 0x4c and hpos >= 0x40.
00027d3c: 0180 0678    ;COLOR00 := 0x0678
00027d40: 4cd1 fffe    ;Wait for vpos >= 0x4c and hpos >= 0xd0.
00027d44: 0180 0000    ;COLOR00 := 0x0000
00027d48: 4d41 fffe    ;Wait for vpos >= 0x4d and hpos >= 0x40.
00027d4c: 0180 0678    ;COLOR00 := 0x0678
00027d50: 4dd1 fffe    ;Wait for vpos >= 0x4d and hpos >= 0xd0.
00027d54: 0180 0000    ;COLOR00 := 0x0000
00027d58: 4e41 fffe    ;Wait for vpos >= 0x4e and hpos >= 0x40.
00027d5c: 0180 0678    ;COLOR00 := 0x0678
00027d60: 4ed1 fffe    ;Wait for vpos >= 0x4e and hpos >= 0xd0.
00027d64: 0180 0000    ;COLOR00 := 0x0000
00027d68: 4f41 fffe    ;Wait for vpos >= 0x4f and hpos >= 0x40.
00027d6c: 0180 0678    ;COLOR00 := 0x0678
00027d70: 4fd1 fffe    ;Wait for vpos >= 0x4f and hpos >= 0xd0.
00027d74: 0180 0000    ;COLOR00 := 0x0000
00027d78: 5041 fffe    ;Wait for vpos >= 0x50 and hpos >= 0x40.
00027d7c: 0180 0678    ;COLOR00 := 0x0678
00027d80: 50d1 fffe    ;Wait for vpos >= 0x50 and hpos >= 0xd0.
00027d84: 0180 0000    ;COLOR00 := 0x0000
00027d88: 5141 fffe    ;Wait for vpos >= 0x51 and hpos >= 0x40.
00027d8c: 0180 0678    ;COLOR00 := 0x0678
00027d90: 51d1 fffe    ;Wait for vpos >= 0x51 and hpos >= 0xd0.
00027d94: 0180 0000    ;COLOR00 := 0x0000
00027d98: 5241 fffe    ;Wait for vpos >= 0x52 and hpos >= 0x40.
00027d9c: 0180 0678    ;COLOR00 := 0x0678
00027da0: 52d1 fffe    ;Wait for vpos >= 0x52 and hpos >= 0xd0.
00027da4: 0180 0000    ;COLOR00 := 0x0000
00027da8: 5341 fffe    ;Wait for vpos >= 0x53 and hpos >= 0x40.
00027dac: 0180 0678    ;COLOR00 := 0x0678
00027db0: 53d1 fffe    ;Wait for vpos >= 0x53 and hpos >= 0xd0.
00027db4: 0180 0000    ;COLOR00 := 0x0000
00027db8: 5441 fffe    ;Wait for vpos >= 0x54 and hpos >= 0x40.
00027dbc: 0180 0678    ;COLOR00 := 0x0678
00027dc0: 54d1 fffe    ;Wait for vpos >= 0x54 and hpos >= 0xd0.
00027dc4: 0180 0000    ;COLOR00 := 0x0000
00027dc8: 5541 fffe    ;Wait for vpos >= 0x55 and hpos >= 0x40.
00027dcc: 0180 0678    ;COLOR00 := 0x0678
00027dd0: 55d1 fffe    ;Wait for vpos >= 0x55 and hpos >= 0xd0.
00027dd4: 0180 0000    ;COLOR00 := 0x0000
00027dd8: 5641 fffe    ;Wait for vpos >= 0x56 and hpos >= 0x40.
00027ddc: 0180 0678    ;COLOR00 := 0x0678
00027de0: 56d1 fffe    ;Wait for vpos >= 0x56 and hpos >= 0xd0.
00027de4: 0180 0000    ;COLOR00 := 0x0000
00027de8: 5741 fffe    ;Wait for vpos >= 0x57 and hpos >= 0x40.
00027dec: 0180 0678    ;COLOR00 := 0x0678
00027df0: 57d1 fffe    ;Wait for vpos >= 0x57 and hpos >= 0xd0.
00027df4: 0180 0000    ;COLOR00 := 0x0000
00027df8: 5841 fffe    ;Wait for vpos >= 0x58 and hpos >= 0x40.
00027dfc: 0180 0678    ;COLOR00 := 0x0678
00027e00: 58d1 fffe    ;Wait for vpos >= 0x58 and hpos >= 0xd0.
00027e04: 0180 0000    ;COLOR00 := 0x0000
00027e08: 5901 ff00    ;Wait for vpos >= 0x59, ignore horizontal.
00027e0c: 0184 0000    ;COLOR02 := 0x0000    Colour 2 changed to black
00027e10: 5941 fffe    ;Wait for vpos >= 0x59 and hpos >= 0x40.
00027e14: 0180 0678    ;COLOR00 := 0x0678
00027e18: 59d1 fffe    ;Wait for vpos >= 0x59 and hpos >= 0xd0.
00027e1c: 0180 0000    ;COLOR00 := 0x0000
00027e20: 5a41 fffe    ;Wait for vpos >= 0x5a and hpos >= 0x40.
00027e24: 0180 0678    ;COLOR00 := 0x0678
00027e28: 5ad1 fffe    ;Wait for vpos >= 0x5a and hpos >= 0xd0.
00027e2c: 0180 0000    ;COLOR00 := 0x0000

Now the first 2 sprites are reset to point to the small blimp graphics, and the palette for them is changed:

00027e30: 0120 0005    ;SPR0PTH := 0x0005    Small blimp
00027e34: 0122 a530    ;SPR0PTL := 0xa530
00027e38: 0124 0005    ;SPR1PTH := 0x0005
00027e3c: 0126 a574    ;SPR1PTL := 0xa574
00027e40: 0128 0004    ;SPR2PTH := 0x0004    Sprites 2 and 3 form the tree
00027e44: 012a 6668    ;SPR2PTL := 0x6668
00027e48: 012c 0004    ;SPR3PTH := 0x0004
00027e4c: 012e 6818    ;SPR3PTL := 0x6818
00027e50: 01a2 0889    ;COLOR17 := 0x0889    Small blimp colours
00027e54: 01a4 0778    ;COLOR18 := 0x0778
00027e58: 01a6 0667    ;COLOR19 := 0x0667
00027e5c: 5b01 ff00    ;Wait for vpos >= 0x5b, ignore horizontal.
00027e60: 0184 0125    ;COLOR02 := 0x0125
00027e64: 5b41 fffe    ;Wait for vpos >= 0x5b and hpos >= 0x40.
00027e68: 0180 0678    ;COLOR00 := 0x0678
00027e6c: 5bd1 fffe    ;Wait for vpos >= 0x5b and hpos >= 0xd0.
00027e70: 0180 0000    ;COLOR00 := 0x0000
00027e74: 5c01 ff00    ;Wait for vpos >= 0x5c, ignore horizontal.
00027e78: 0184 0236    ;COLOR02 := 0x0236
00027e7c: 5c41 fffe    ;Wait for vpos >= 0x5c and hpos >= 0x40.
00027e80: 0180 0678    ;COLOR00 := 0x0678
00027e84: 5cd1 fffe    ;Wait for vpos >= 0x5c and hpos >= 0xd0.
00027e88: 0180 0000    ;COLOR00 := 0x0000
00027e8c: 5d01 ff00    ;Wait for vpos >= 0x5d, ignore horizontal.
00027e90: 0184 0347    ;COLOR02 := 0x0347
00027e94: 5d41 fffe    ;Wait for vpos >= 0x5d and hpos >= 0x40.
00027e98: 0180 0678    ;COLOR00 := 0x0678
00027e9c: 5dd1 fffe    ;Wait for vpos >= 0x5d and hpos >= 0xd0.
00027ea0: 0180 0000    ;COLOR00 := 0x0000
00027ea4: 5e01 ff00    ;Wait for vpos >= 0x5e, ignore horizontal.
00027ea8: 0184 0458    ;COLOR02 := 0x0458
00027eac: 5e41 fffe    ;Wait for vpos >= 0x5e and hpos >= 0x40.
00027eb0: 0180 0678    ;COLOR00 := 0x0678
00027eb4: 5ed1 fffe    ;Wait for vpos >= 0x5e and hpos >= 0xd0.
00027eb8: 0180 0000    ;COLOR00 := 0x0000
00027ebc: 5f01 ff00    ;Wait for vpos >= 0x5f, ignore horizontal.
00027ec0: 0184 0569    ;COLOR02 := 0x0569
00027ec4: 5f41 fffe    ;Wait for vpos >= 0x5f and hpos >= 0x40.
00027ec8: 0180 0678    ;COLOR00 := 0x0678
00027ecc: 5fd1 fffe    ;Wait for vpos >= 0x5f and hpos >= 0xd0.
00027ed0: 0180 0000    ;COLOR00 := 0x0000
00027ed4: 6001 ff00    ;Wait for vpos >= 0x60, ignore horizontal.
00027ed8: 0184 067a    ;COLOR02 := 0x067a
00027edc: 6041 fffe    ;Wait for vpos >= 0x60 and hpos >= 0x40.
00027ee0: 0180 0678    ;COLOR00 := 0x0678
00027ee4: 60d1 fffe    ;Wait for vpos >= 0x60 and hpos >= 0xd0.
00027ee8: 0180 0000    ;COLOR00 := 0x0000
00027eec: 6101 ff00    ;Wait for vpos >= 0x61, ignore horizontal.
00027ef0: 0184 078b    ;COLOR02 := 0x078b
00027ef4: 6141 fffe    ;Wait for vpos >= 0x61 and hpos >= 0x40.
00027ef8: 0180 0678    ;COLOR00 := 0x0678
00027efc: 61d1 fffe    ;Wait for vpos >= 0x61 and hpos >= 0xd0.
00027f00: 0180 0000    ;COLOR00 := 0x0000
00027f04: 6201 ff00    ;Wait for vpos >= 0x62, ignore horizontal.
00027f08: 0184 089c    ;COLOR02 := 0x089c
00027f0c: 6241 fffe    ;Wait for vpos >= 0x62 and hpos >= 0x40.
00027f10: 0180 0678    ;COLOR00 := 0x0678
00027f14: 62d1 fffe    ;Wait for vpos >= 0x62 and hpos >= 0xd0.
00027f18: 0180 0000    ;COLOR00 := 0x0000
00027f1c: 6301 ff00    ;Wait for vpos >= 0x63, ignore horizontal.
00027f20: 0184 09ad    ;COLOR02 := 0x09ad
00027f24: 6341 fffe    ;Wait for vpos >= 0x63 and hpos >= 0x40.
00027f28: 0180 0678    ;COLOR00 := 0x0678
00027f2c: 63d1 fffe    ;Wait for vpos >= 0x63 and hpos >= 0xd0.
00027f30: 0180 0000    ;COLOR00 := 0x0000
00027f34: 6401 ff00    ;Wait for vpos >= 0x64, ignore horizontal.
00027f38: 0184 0abe    ;COLOR02 := 0x0abe
00027f3c: 6441 fffe    ;Wait for vpos >= 0x64 and hpos >= 0x40.
00027f40: 0180 0678    ;COLOR00 := 0x0678
00027f44: 64d1 fffe    ;Wait for vpos >= 0x64 and hpos >= 0xd0.
00027f48: 0180 0000    ;COLOR00 := 0x0000
00027f4c: 6501 ff00    ;Wait for vpos >= 0x65, ignore horizontal.
00027f50: 0184 0bcf    ;COLOR02 := 0x0bcf
00027f54: 6541 fffe    ;Wait for vpos >= 0x65 and hpos >= 0x40.
00027f58: 0180 0678    ;COLOR00 := 0x0678
00027f5c: 65d1 fffe    ;Wait for vpos >= 0x65 and hpos >= 0xd0.
00027f60: 0180 0000    ;COLOR00 := 0x0000
00027f64: 6601 ff00    ;Wait for vpos >= 0x66, ignore horizontal.
00027f68: 0184 0cdf    ;COLOR02 := 0x0cdf
00027f6c: 6641 fffe    ;Wait for vpos >= 0x66 and hpos >= 0x40.
00027f70: 0180 0678    ;COLOR00 := 0x0678
00027f74: 66d1 fffe    ;Wait for vpos >= 0x66 and hpos >= 0xd0.
00027f78: 0180 0000    ;COLOR00 := 0x0000
00027f7c: 6701 ff00    ;Wait for vpos >= 0x67, ignore horizontal.
00027f80: 0184 0fff    ;COLOR02 := 0x0fff
00027f84: 6741 fffe    ;Wait for vpos >= 0x67 and hpos >= 0x40.
00027f88: 0180 0678    ;COLOR00 := 0x0678
00027f8c: 67d1 fffe    ;Wait for vpos >= 0x67 and hpos >= 0xd0.
00027f90: 0180 0000    ;COLOR00 := 0x0000
00027f94: 6801 ff00    ;Wait for vpos >= 0x68, ignore horizontal.
00027f98: 0184 0000    ;COLOR02 := 0x0000
00027f9c: 6841 fffe    ;Wait for vpos >= 0x68 and hpos >= 0x40.
00027fa0: 0180 0678    ;COLOR00 := 0x0678
00027fa4: 68d1 fffe    ;Wait for vpos >= 0x68 and hpos >= 0xd0.
00027fa8: 0180 0000    ;COLOR00 := 0x0000
00027fac: 6901 ff00    ;Wait for vpos >= 0x69, ignore horizontal.
00027fb0: 0184 0324    ;COLOR02 := 0x0324
00027fb4: 6941 fffe    ;Wait for vpos >= 0x69 and hpos >= 0x40.
00027fb8: 0180 0678    ;COLOR00 := 0x0678
00027fbc: 69d1 fffe    ;Wait for vpos >= 0x69 and hpos >= 0xd0.
00027fc0: 0180 0000    ;COLOR00 := 0x0000
00027fc4: 6a01 ff00    ;Wait for vpos >= 0x6a, ignore horizontal.
00027fc8: 0184 0435    ;COLOR02 := 0x0435
00027fcc: 6a41 fffe    ;Wait for vpos >= 0x6a and hpos >= 0x40.
00027fd0: 0180 0678    ;COLOR00 := 0x0678
00027fd4: 6ad1 fffe    ;Wait for vpos >= 0x6a and hpos >= 0xd0.
00027fd8: 0180 0000    ;COLOR00 := 0x0000
00027fdc: 6b01 ff00    ;Wait for vpos >= 0x6b, ignore horizontal.

Again the back playfield has another cloud parallax section, so the pointers are changed and the scroll position:

00027fe0: 00e4 0007    ;BPL2PTH := 0x0007    Cloud layer 3
00027fe4: 00e6 5846    ;BPL2PTL := 0x5846
00027fe8: 00ec 0007    ;BPL4PTH := 0x0007
00027fec: 00ee 96c6    ;BPL4PTL := 0x96c6
00027ff0: 00f4 0007    ;BPL6PTH := 0x0007
00027ff4: 00f6 d546    ;BPL6PTL := 0xd546
00027ff8: 0102 000e    ;BPLCON1 := 0x000e
00027ffc: 0184 0546    ;COLOR02 := 0x0546
00028000: 6b41 fffe    ;Wait for vpos >= 0x6b and hpos >= 0x40.
00028004: 0180 0678    ;COLOR00 := 0x0678
00028008: 6bd1 fffe    ;Wait for vpos >= 0x6b and hpos >= 0xd0.
0002800c: 0180 0000    ;COLOR00 := 0x0000
00028010: 6c01 ff00    ;Wait for vpos >= 0x6c, ignore horizontal.
00028014: 0184 0657    ;COLOR02 := 0x0657
00028018: 6c41 fffe    ;Wait for vpos >= 0x6c and hpos >= 0x40.
0002801c: 0180 0678    ;COLOR00 := 0x0678
00028020: 6cd1 fffe    ;Wait for vpos >= 0x6c and hpos >= 0xd0.
00028024: 0180 0000    ;COLOR00 := 0x0000
00028028: 6d01 ff00    ;Wait for vpos >= 0x6d, ignore horizontal.
0002802c: 0184 0768    ;COLOR02 := 0x0768
00028030: 6d41 fffe    ;Wait for vpos >= 0x6d and hpos >= 0x40.
00028034: 0180 0678    ;COLOR00 := 0x0678
00028038: 6dd1 fffe    ;Wait for vpos >= 0x6d and hpos >= 0xd0.
0002803c: 0180 0000    ;COLOR00 := 0x0000
00028040: 6e01 ff00    ;Wait for vpos >= 0x6e, ignore horizontal.
00028044: 0184 0879    ;COLOR02 := 0x0879
00028048: 6e41 fffe    ;Wait for vpos >= 0x6e and hpos >= 0x40.
0002804c: 0180 0678    ;COLOR00 := 0x0678
00028050: 6ed1 fffe    ;Wait for vpos >= 0x6e and hpos >= 0xd0.
00028054: 0180 0000    ;COLOR00 := 0x0000
00028058: 6f01 ff00    ;Wait for vpos >= 0x6f, ignore horizontal.
0002805c: 0184 098a    ;COLOR02 := 0x098a
00028060: 6f41 fffe    ;Wait for vpos >= 0x6f and hpos >= 0x40.
00028064: 0180 0678    ;COLOR00 := 0x0678
00028068: 6fd1 fffe    ;Wait for vpos >= 0x6f and hpos >= 0xd0.
0002806c: 0180 0000    ;COLOR00 := 0x0000
00028070: 0120 0004    ;SPR0PTH := 0x0004    Tree graphics
00028074: 0122 6308    ;SPR0PTL := 0x6308
00028078: 0124 0004    ;SPR1PTH := 0x0004
0002807c: 0126 64b8    ;SPR1PTL := 0x64b8
00028080: 7001 ff00    ;Wait for vpos >= 0x70, ignore horizontal.
00028084: 0184 0a9b    ;COLOR02 := 0x0a9b
00028088: 7041 fffe    ;Wait for vpos >= 0x70 and hpos >= 0x40.
0002808c: 0180 0678    ;COLOR00 := 0x0678
00028090: 70d1 fffe    ;Wait for vpos >= 0x70 and hpos >= 0xd0.
00028094: 0180 0000    ;COLOR00 := 0x0000
00028098: 0130 0004    ;SPR4PTH := 0x0004    Tree graphics
0002809c: 0132 69c8    ;SPR4PTL := 0x69c8
000280a0: 0134 0004    ;SPR5PTH := 0x0004
000280a4: 0136 6b78    ;SPR5PTL := 0x6b78
000280a8: 0138 0004    ;SPR6PTH := 0x0004
000280ac: 013a 6d28    ;SPR6PTL := 0x6d28
000280b0: 013c 0004    ;SPR7PTH := 0x0004
000280b4: 013e 6ed8    ;SPR7PTL := 0x6ed8
000280b8: 7101 ff00    ;Wait for vpos >= 0x71, ignore horizontal.
000280bc: 0184 0bac    ;COLOR02 := 0x0bac
000280c0: 01a2 0553    ;COLOR17 := 0x0553    Tree palette (sprites 0-1)
000280c4: 01a4 0442    ;COLOR18 := 0x0442
000280c8: 01a6 0331    ;COLOR19 := 0x0331
000280cc: 01aa 0553    ;COLOR21 := 0x0553    Tree palette (sprites 2-3)
000280d0: 01ac 0442    ;COLOR22 := 0x0442
000280d4: 01ae 0331    ;COLOR23 := 0x0331
000280d8: 01b2 0553    ;COLOR25 := 0x0553    Tree palette (sprites 4-5)
000280dc: 01b4 0442    ;COLOR26 := 0x0442
000280e0: 01b6 0331    ;COLOR27 := 0x0331
000280e4: 01ba 0553    ;COLOR29 := 0x0553    Tree palette (sprites 6-7)
000280e8: 01bc 0442    ;COLOR30 := 0x0442
000280ec: 01be 0331    ;COLOR31 := 0x0331
000280f0: 0104 0020    ;BPLCON2 := 0x0020
000280f4: 7201 ff00    ;Wait for vpos >= 0x72, ignore horizontal.
000280f8: 0184 0cbd    ;COLOR02 := 0x0cbd
000280fc: 7301 ff00    ;Wait for vpos >= 0x73, ignore horizontal.
00028100: 0184 0dce    ;COLOR02 := 0x0dce
00028104: 7401 ff00    ;Wait for vpos >= 0x74, ignore horizontal.
00028108: 0184 0edf    ;COLOR02 := 0x0edf
0002810c: 7501 ff00    ;Wait for vpos >= 0x75, ignore horizontal.
00028110: 0184 0fef    ;COLOR02 := 0x0fef
00028114: 7601 ff00    ;Wait for vpos >= 0x76, ignore horizontal.
00028118: 0184 0fff    ;COLOR02 := 0x0fff
0002811c: 7801 ff00    ;Wait for vpos >= 0x78, ignore horizontal.
00028120: 019e 0778    ;COLOR15 := 0x0778
00028124: 7e01 ff00    ;Wait for vpos >= 0x7e, ignore horizontal.
00028128: 00e4 0007    ;BPL2PTH := 0x0007    Cloud layer 4 (9 pixels high)
0002812c: 00e6 5e32    ;BPL2PTL := 0x5e32
00028130: 00ec 0007    ;BPL4PTH := 0x0007
00028134: 00ee 9cb2    ;BPL4PTL := 0x9cb2
00028138: 00f4 0007    ;BPL6PTH := 0x0007
0002813c: 00f6 db32    ;BPL6PTL := 0xdb32
00028140: 0102 00ce    ;BPLCON1 := 0x00ce
00028144: 8701 ff00    ;Wait for vpos >= 0x87, ignore horizontal.
00028148: 00e4 0007    ;BPL2PTH := 0x0007    Cloud layer 5 (6 pixels high)
0002814c: 00e6 60fe    ;BPL2PTL := 0x60fe
00028150: 00ec 0007    ;BPL4PTH := 0x0007
00028154: 00ee 9f7e    ;BPL4PTL := 0x9f7e
00028158: 00f4 0007    ;BPL6PTH := 0x0007
0002815c: 00f6 ddfe    ;BPL6PTL := 0xddfe
00028160: 0102 006e    ;BPLCON1 := 0x006e
00028164: 8d01 ff00    ;Wait for vpos >= 0x8d, ignore horizontal.
00028168: 00e4 0007    ;BPL2PTH := 0x0007    Mountains
0002816c: 00e6 62f2    ;BPL2PTL := 0x62f2
00028170: 00ec 0007    ;BPL4PTH := 0x0007
00028174: 00ee a172    ;BPL4PTL := 0xa172
00028178: 00f4 0007    ;BPL6PTH := 0x0007
0002817c: 00f6 dff2    ;BPL6PTL := 0xdff2
00028180: 0102 008e    ;BPLCON1 := 0x008e
00028184: 0192 0ba9    ;COLOR09 := 0x0ba9
00028188: 0194 0a98    ;COLOR10 := 0x0a98
0002818c: 0196 0987    ;COLOR11 := 0x0987
00028190: 0198 0876    ;COLOR12 := 0x0876
00028194: 019a 0765    ;COLOR13 := 0x0765
00028198: 019c 0654    ;COLOR14 := 0x0654
0002819c: 9301 ff00    ;Wait for vpos >= 0x93, ignore horizontal.
000281a0: 019e 0878    ;COLOR15 := 0x0878
000281a4: 9c01 ff00    ;Wait for vpos >= 0x9c, ignore horizontal.
000281a8: 018a 0987    ;COLOR05 := 0x0987
000281ac: 0182 0876    ;COLOR01 := 0x0876
000281b0: 0184 0765    ;COLOR02 := 0x0765
000281b4: 0186 0654    ;COLOR03 := 0x0654
000281b8: 0188 0543    ;COLOR04 := 0x0543
000281bc: a101 ff00    ;Wait for vpos >= 0xa1, ignore horizontal.
000281c0: 019e 0978    ;COLOR15 := 0x0978
000281c4: ab01 ff00    ;Wait for vpos >= 0xab, ignore horizontal.
000281c8: 019e 0a78    ;COLOR15 := 0x0a78
000281cc: b101 ff00    ;Wait for vpos >= 0xb1, ignore horizontal.
000281d0: 0182 0aaa    ;COLOR01 := 0x0aaa
000281d4: 018a 0aaa    ;COLOR05 := 0x0aaa
000281d8: 018e 0555    ;COLOR07 := 0x0555
000281dc: b201 ff00    ;Wait for vpos >= 0xb2, ignore horizontal.
000281e0: 018c 0124    ;COLOR06 := 0x0124
000281e4: b301 ff00    ;Wait for vpos >= 0xb3, ignore horizontal.
000281e8: 019e 0b78    ;COLOR15 := 0x0b78
000281ec: 018c 0235    ;COLOR06 := 0x0235
000281f0: b401 ff00    ;Wait for vpos >= 0xb4, ignore horizontal.
000281f4: 018c 0346    ;COLOR06 := 0x0346
000281f8: b501 ff00    ;Wait for vpos >= 0xb5, ignore horizontal.
000281fc: 018c 0457    ;COLOR06 := 0x0457
00028200: b601 ff00    ;Wait for vpos >= 0xb6, ignore horizontal.
00028204: 018c 0568    ;COLOR06 := 0x0568
00028208: b701 ff00    ;Wait for vpos >= 0xb7, ignore horizontal.
0002820c: 018c 0679    ;COLOR06 := 0x0679
00028210: b801 ff00    ;Wait for vpos >= 0xb8, ignore horizontal.
00028214: 018c 078a    ;COLOR06 := 0x078a
00028218: b901 ff00    ;Wait for vpos >= 0xb9, ignore horizontal.
0002821c: 018c 089b    ;COLOR06 := 0x089b
00028220: ba01 ff00    ;Wait for vpos >= 0xba, ignore horizontal.
00028224: 019e 0c78    ;COLOR15 := 0x0c78
00028228: 018c 09ac    ;COLOR06 := 0x09ac
0002822c: 0184 0236    ;COLOR02 := 0x0236
00028230: bb01 ff00    ;Wait for vpos >= 0xbb, ignore horizontal.
00028234: 0184 0347    ;COLOR02 := 0x0347
00028238: 018c 0abd    ;COLOR06 := 0x0abd
0002823c: bc01 ff00    ;Wait for vpos >= 0xbc, ignore horizontal.
00028240: 0184 0458    ;COLOR02 := 0x0458
00028244: 018c 0bce    ;COLOR06 := 0x0bce
00028248: bd01 ff00    ;Wait for vpos >= 0xbd, ignore horizontal.
0002824c: 0184 067a    ;COLOR02 := 0x067a
00028250: 018c 0cdf    ;COLOR06 := 0x0cdf
00028254: be01 ff00    ;Wait for vpos >= 0xbe, ignore horizontal.
00028258: 0184 089c    ;COLOR02 := 0x089c
0002825c: 018c 0def    ;COLOR06 := 0x0def
00028260: bf01 ff00    ;Wait for vpos >= 0xbf, ignore horizontal.
00028264: 0184 0abe    ;COLOR02 := 0x0abe
00028268: 018c 0eff    ;COLOR06 := 0x0eff
0002826c: c001 ff00    ;Wait for vpos >= 0xc0, ignore horizontal.
00028270: 019e 0d78    ;COLOR15 := 0x0d78
00028274: 018c 0fff    ;COLOR06 := 0x0fff
00028278: 0184 0453    ;COLOR02 := 0x0453
0002827c: c101 ff00    ;Wait for vpos >= 0xc1, ignore horizontal.
00028280: 0184 0546    ;COLOR02 := 0x0546
00028284: 018c 0321    ;COLOR06 := 0x0321
00028288: c201 ff00    ;Wait for vpos >= 0xc2, ignore horizontal.
0002828c: 0184 0657    ;COLOR02 := 0x0657
00028290: 018c 0432    ;COLOR06 := 0x0432
00028294: c301 ff00    ;Wait for vpos >= 0xc3, ignore horizontal.
00028298: 0184 0768    ;COLOR02 := 0x0768
0002829c: 018c 0543    ;COLOR06 := 0x0543
000282a0: c401 ff00    ;Wait for vpos >= 0xc4, ignore horizontal.
000282a4: 0184 0879    ;COLOR02 := 0x0879
000282a8: 018c 0654    ;COLOR06 := 0x0654
000282ac: c501 ff00    ;Wait for vpos >= 0xc5, ignore horizontal.
000282b0: 0184 098a    ;COLOR02 := 0x098a
000282b4: 018c 0765    ;COLOR06 := 0x0765
000282b8: c601 ff00    ;Wait for vpos >= 0xc6, ignore horizontal.
000282bc: 019e 0e78    ;COLOR15 := 0x0e78
000282c0: 0184 0a9b    ;COLOR02 := 0x0a9b
000282c4: 018c 0876    ;COLOR06 := 0x0876
000282c8: c701 ff00    ;Wait for vpos >= 0xc7, ignore horizontal.
000282cc: 0184 0bac    ;COLOR02 := 0x0bac
000282d0: 018c 0987    ;COLOR06 := 0x0987
000282d4: c801 ff00    ;Wait for vpos >= 0xc8, ignore horizontal.
000282d8: 0184 0cbd    ;COLOR02 := 0x0cbd
000282dc: 018c 0a98    ;COLOR06 := 0x0a98
000282e0: c901 ff00    ;Wait for vpos >= 0xc9, ignore horizontal.
000282e4: 0184 0dce    ;COLOR02 := 0x0dce
000282e8: 018c 0ba9    ;COLOR06 := 0x0ba9
000282ec: ca01 ff00    ;Wait for vpos >= 0xca, ignore horizontal.
000282f0: 019e 0f78    ;COLOR15 := 0x0f78
000282f4: 0184 0edf    ;COLOR02 := 0x0edf
000282f8: 018c 0cba    ;COLOR06 := 0x0cba
000282fc: cb01 ff00    ;Wait for vpos >= 0xcb, ignore horizontal.
00028300: 018c 0dcb    ;COLOR06 := 0x0dcb
00028304: cc01 ff00    ;Wait for vpos >= 0xcc, ignore horizontal.
00028308: 018c 0edc    ;COLOR06 := 0x0edc
0002830c: cd01 ff00    ;Wait for vpos >= 0xcd, ignore horizontal.
00028310: 018c 0fed    ;COLOR06 := 0x0fed
00028314: ce01 ff00    ;Wait for vpos >= 0xce, ignore horizontal.
00028318: 018c 0ffe    ;COLOR06 := 0x0ffe
0002831c: d201 ff00    ;Wait for vpos >= 0xd2, ignore horizontal.
00028320: 0182 0666    ;COLOR01 := 0x0666
00028324: d301 ff00    ;Wait for vpos >= 0xd3, ignore horizontal.
00028328: 0182 0555    ;COLOR01 := 0x0555
0002832c: d401 ff00    ;Wait for vpos >= 0xd4, ignore horizontal.
00028330: 0182 0444    ;COLOR01 := 0x0444
00028334: d501 ff00    ;Wait for vpos >= 0xd5, ignore horizontal.
00028338: 0182 0333    ;COLOR01 := 0x0333
0002833c: d601 ff00    ;Wait for vpos >= 0xd6, ignore horizontal.
00028340: 0192 0780    ;COLOR09 := 0x0780
00028344: 0194 0670    ;COLOR10 := 0x0670
00028348: 0196 0560    ;COLOR11 := 0x0560
0002834c: 0198 0450    ;COLOR12 := 0x0450
00028350: 019a 0340    ;COLOR13 := 0x0340
00028354: 019c 0230    ;COLOR14 := 0x0230
00028358: 019e 0890    ;COLOR15 := 0x0890
0002835c: 00e4 0007    ;BPL2PTH := 0x0007    Grass layer 1 (2 pixels high)
00028360: 00e6 79ba    ;BPL2PTL := 0x79ba
00028364: 00ec 0007    ;BPL4PTH := 0x0007
00028368: 00ee b83a    ;BPL4PTL := 0xb83a
0002836c: 00f4 0007    ;BPL6PTH := 0x0007
00028370: 00f6 f6ba    ;BPL6PTL := 0xf6ba
00028374: 0102 000e    ;BPLCON1 := 0x000e
00028378: 0182 0222    ;COLOR01 := 0x0222
0002837c: d701 ff00    ;Wait for vpos >= 0xd7, ignore horizontal.
00028380: 0182 0111    ;COLOR01 := 0x0111
00028384: d801 ff00    ;Wait for vpos >= 0xd8, ignore horizontal.
00028388: 00e4 0007    ;BPL2PTH := 0x0007    Grass layer 2 (3 pixels high)
0002838c: 00e6 7a4c    ;BPL2PTL := 0x7a4c
00028390: 00ec 0007    ;BPL4PTH := 0x0007
00028394: 00ee b8cc    ;BPL4PTL := 0xb8cc
00028398: 00f4 0007    ;BPL6PTH := 0x0007
0002839c: 00f6 f74c    ;BPL6PTL := 0xf74c
000283a0: 0102 000e    ;BPLCON1 := 0x000e
000283a4: 0182 0000    ;COLOR01 := 0x0000
000283a8: db01 ff00    ;Wait for vpos >= 0xdb, ignore horizontal.
000283ac: 00e4 0007    ;BPL2PTH := 0x0007    Grass layer 3 (7 pixels high)
000283b0: 00e6 7b56    ;BPL2PTL := 0x7b56
000283b4: 00ec 0007    ;BPL4PTH := 0x0007
000283b8: 00ee b9d6    ;BPL4PTL := 0xb9d6
000283bc: 00f4 0007    ;BPL6PTH := 0x0007
000283c0: 00f6 f856    ;BPL6PTL := 0xf856
000283c4: 0102 000e    ;BPLCON1 := 0x000e

At the bottom of the screen, the broken stone wall and gate are drawn, so the colour palette is changed and new pointers for the playfield are set:

000283c8: df01 ff00    ;Wait for vpos >= 0xdf, ignore horizontal.
000283cc: 0182 0555    ;COLOR01 := 0x0555
000283d0: 0184 0444    ;COLOR02 := 0x0444
000283d4: 0186 0333    ;COLOR03 := 0x0333
000283d8: 0188 0222    ;COLOR04 := 0x0222
000283dc: 018a 0321    ;COLOR05 := 0x0321
000283e0: 018c 0542    ;COLOR06 := 0x0542
000283e4: 018e 0431    ;COLOR07 := 0x0431
000283e8: 00e0 0005    ;BPL1PTH := 0x0005
000283ec: 00e2 f592    ;BPL1PTL := 0xf592
000283f0: 00e8 0006    ;BPL3PTH := 0x0006
000283f4: 00ea 3732    ;BPL3PTL := 0x3732
000283f8: 00f0 0006    ;BPL5PTH := 0x0006
000283fc: 00f2 78d2    ;BPL5PTL := 0x78d2
00028400: 0102 0000    ;BPLCON1 := 0x0000

They couldn't end the fun there, so there are another 2 sections of parallax scrolling grass before we reach the end of the copperlist!

00028404: e201 ff00    ;Wait for vpos >= 0xe2, ignore horizontal.
00028408: 00e4 0007    ;BPL2PTH := 0x0007    Grass layer 4 (7 pixels high)
0002840c: 00e6 7d78    ;BPL2PTL := 0x7d78
00028410: 00ec 0007    ;BPL4PTH := 0x0007
00028414: 00ee bbf8    ;BPL4PTL := 0xbbf8
00028418: 00f4 0007    ;BPL6PTH := 0x0007
0002841c: 00f6 fa78    ;BPL6PTL := 0xfa78
00028420: 0102 0000    ;BPLCON1 := 0x0000
00028424: e901 ff00    ;Wait for vpos >= 0xe9, ignore horizontal.
00028428: 00e4 0007    ;BPL2PTH := 0x0007    Grass layer 5
0002842c: 00e6 7f9a    ;BPL2PTL := 0x7f9a
00028430: 00ec 0007    ;BPL4PTH := 0x0007
00028434: 00ee be1a    ;BPL4PTL := 0xbe1a
00028438: 00f4 0007    ;BPL6PTH := 0x0007
0002843c: 00f6 fc9a    ;BPL6PTL := 0xfc9a
00028440: 0102 0000    ;BPLCON1 := 0x0000
00028444: ffff fffe    ;Wait for vpos >= 0xff and hpos >= 0xfe.
                       ;End of Copperlist

Post your comment

Comments

  • Gravatar for Uagu

    There is any info about the development process? Asm used, making of , etc?

    Uagu 12/10/2022 1:24pm (17 months ago)

  • Gravatar for txpk

    Great explanation. But I thing ther's already more.
    So, all the trees and forest in gerenal are sprites drawn between the two playfields? How do they fill the entire screen, are they resetted half scanline? Also, at the game start there are two tree layers (in fact, the forest and a single parallaxed tree after that ) This cannot be a sprite unless the other active are only 7.

    txpk 08/10/2021 11:55am (2 years ago)

  • Gravatar for rsn8887

    Thanks for the awesome article.

    I love the blimps in Beast. They create this hint of a much bigger world....

    The world was greatly expanded upon in the PS4 remake.

    rsn8887 01/07/2020 3:12am (4 years ago)

  • Gravatar for Mark

    I can remember using blitz basic 2 to recreate beasts level one. I got as far as having clouds, hills and grass all scrolling at there own speeds with the player Sprite on screen. I never did workout how they managed to reuse the sprites and so my project ended there.

    Mark 07/08/2019 10:43am (5 years ago)

  • Gravatar for hexaae

    Can you help with your experience to fix the trashed tree sprite bug in WHDLoad slave?

    http://mantis.whdload.de/view.php?id=3498

    hexaae 19/11/2017 11:56am (6 years ago)

  • Gravatar for hexaae

    WHDLoad for this game needs a fix (force OCS mode) to correct title screen parallax corrupt tree roots...

    hexaae 05/01/2017 3:15am (7 years ago)

  • Gravatar for Moose Malloy

    Thank-you for this insight - amazing stuff!

    Moose Malloy 05/05/2014 3:09pm (10 years ago)

  • Gravatar for Sandra

    Amazing! They were re-using the sprites during hblank?
    I've never seen anything like it.

    Sandra 22/12/2012 8:27am (11 years ago)

RSS feed for comments on this page | RSS feed for all comments

Popular Sprite Tricks

Shadow of the Beast

Jim Power

2 sprites are displayed then repositioned horizontally right across the screen to create the colourful static background. The remaining sprites are used for the main character, the status bar and player bullets.

Shadow of the Beast

Risky Woods

The 16-colour background layer was created by using all 8 hardware sprites and repositioning them across the screen. The same 64 pixel wide graphics are repeated across the entire play area.

Shadow of the Beast

Stardust

The amazing tunnel sequence was created with a 6 frame animation sequence made with only 4 colours and mirrored vertically. The asteroid layer sits on top of this, with a status panel and player ship made of sprites sitting on top.