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!
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:
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:
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.
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
Popular Sprite Tricks
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.
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.
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.
Post your comment
Comments
There is any info about the development process? Asm used, making of , etc?
Uagu 12/10/2022 1:24pm (2 years ago)
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 (3 years ago)
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)
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)
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 (7 years ago)
WHDLoad for this game needs a fix (force OCS mode) to correct title screen parallax corrupt tree roots...
hexaae 05/01/2017 3:15am (8 years ago)
Thank-you for this insight - amazing stuff!
Moose Malloy 05/05/2014 3:09pm (11 years ago)
Amazing! They were re-using the sprites during hblank?
I've never seen anything like it.
Sandra 22/12/2012 8:27am (12 years ago)
No one has commented on this page yet.
RSS feed for comments on this page | RSS feed for all comments