\ JetPac Remake \ By Walid Maalouli \ Project start: August 2015 \ Version 1.2 \ Last update 2/20/18 \ - Corrected scoring bug \ - Limited bonus drops to 4 per level \ - No bonus drops when rocket fully fueled ffailm @ h ! 32 allot hex \ Sprite to background detection (by Mark Wills) CODE: UnderSprite C074 C274 C0B4 0200 A088 0A21 A001 D230 0228 0100 0988 0206 0008 04C7 3DC6 8088 1501 1001 0587 0A57 C047 C0B4 D230 0988 0206 0008 04C7 3DC6 8088 1501 1001 0587 A047 C014 06C0 04C6 0207 0001 0208 0002 06C1 D801 8C02 06C1 D801 8C02 020E 0002 D0A0 8800 0B19 1101 1003 9080 1601 E187 0A17 060E 16F5 0221 0020 0608 16E9 C506 ;CODE \ Enhanced DATA code (by Mark Wills) CODE: data[] ( -- addr #cells ) C073 0644 C503 0644 C501 0A11 A0C1 ;CODE decimal variable _state : data[ ( -- here ) state @ _state ! state 0! 1 $A068 ! _state @ if compile data[] here 0 , else here then ; immediate : ]data ( here -- ) dup here swap - 2/ _state @ if 1- swap ! then $A068 0! _state @ state ! ; immediate \ Splash screen RLE compressed tables 0 value memCount \ VDP counter 0 value tableAddress \ VDP table address 0 value dataAddress \ RLE compressed image data address hex \ Splash screen data - RLE encoded bitmap : SplashC ( -- addr #cells) data[ FF11 FF11 0211 1194 1A84 1184 1A84 1184 1A84 1184 1A84 1184 1A84 1184 1A84 1184 1A84 1184 1A84 1184 1A84 1184 1A84 1184 1A84 1184 1A84 1184 1A84 1184 1A84 1184 1A84 1184 1A84 1184 1A84 1184 1A84 1184 1A84 1184 1A84 1184 1A84 1184 1A84 1184 1A84 1184 1A84 1184 1A84 1184 1A84 1184 1A84 1184 1A84 A1A0 1A02 1111 8671 9817 8871 9817 9071 9817 0211 1186 7198 1788 7188 1101 7197 1788 7101 1187 7192 1786 7188 A1A0 1A85 7183 1105 1717 7171 1783 7186 1701 1183 1706 7117 1771 7117 8471 0117 8311 8617 0171 8717 0111 8317 0671 1117 1711 1785 7103 1771 1784 7101 1783 1186 1701 7187 1701 1183 1703 7171 1788 7183 1186 1701 7187 1701 1187 1702 1117 8571 0417 7117 1187 7186 1701 1184 1704 7117 1711 8717 0211 178D 7102 1771 8717 0111 8317 0371 7117 8871 8311 88A1 A01A 8811 0C81 6181 6181 6161 1818 6811 6886 1803 8118 1883 8188 1105 1818 8118 1883 1603 1818 1187 1805 1118 1811 1183 1806 6118 1861 8118 8811 0518 1881 1818 8316 0318 1811 8518 0361 6181 8561 8811 0518 1881 1818 8316 0318 1811 8718 0511 1818 1161 8318 0A81 1881 6161 8181 1881 1686 1801 1187 1809 1118 1861 1861 1818 1184 1806 6881 8116 8118 8381 0516 1681 1616 8361 0318 1811 8518 0361 6181 8461 0118 8811 88A1 A01A 0111 8761 9018 8881 8811 8816 9018 0111 8561 0281 8188 1188 1688 1888 6188 1188 1688 1888 6101 1187 6184 1802 6868 8818 0281 1888 6188 6888 8188 6190 1801 8183 6183 8101 1888 A1A0 1A84 6184 1104 1861 8118 8411 0418 1111 1884 1183 6101 818C 1104 1661 8118 8411 0418 1111 1884 1104 1811 1118 8411 0481 6181 188C 1104 1661 8118 8411 0418 6111 1884 1104 6161 8181 8C11 0416 6181 1884 1104 1861 1118 8411 0461 6181 8184 1104 6161 8118 8411 0418 1111 1884 1104 8161 1818 8411 0461 6181 1884 1104 6811 1118 8411 0481 6181 1884 1184 6184 1104 6811 1118 8411 0418 1111 1884 1104 1861 8118 8411 88A1 C81A 8911 83A1 011A 83A1 8311 051A A11A A1A1 8311 011A 84A1 0811 A1A1 1A1A A1A1 1A83 1109 1AA1 1AA1 1A11 A1A1 1A84 A183 1185 A101 1187 A104 11A1 A11A 84A1 0911 A1A1 1AA1 A11A A111 87A1 0411 A1A1 1A84 A183 1101 1A84 A104 11A1 A11A 84A1 0111 87A1 0311 A111 85A1 8811 B81A F011 02A1 A1FF 1194 1183 D18A 1101 E18A 1183 D184 1183 D101 1D95 1101 E185 1102 E111 83E1 8C11 04F1 1EE1 E189 1101 E19A 1102 E1E1 A611 04E1 E11F 1F83 1105 1F1F EF1F 1F83 1185 1F84 1104 E11F E1E1 8511 83E1 8311 04E1 E111 E18D 1104 D1D1 1D1D 8411 03E1 11E1 8411 06E1 F1E1 1111 1A86 A101 1A87 1101 E185 D183 1D8B 118D D185 1D05 D11D 1D11 1186 D183 1185 D104 E111 11E1 8411 84E1 0311 11E1 8911 83E1 8411 01E1 8611 02D1 D1A8 1101 E197 1104 1EE1 1E1E 83E1 021E 1E87 E183 1F0F 1E1F 1E1F 1FE1 F1E1 1E1F F11F 1FF1 1E85 1F01 E183 1106 E1E1 F1E1 F111 84D1 031D D1D1 851D 83D1 0211 1184 D102 1DD1 8411 04D1 1DD1 1D85 1183 D186 1102 E111 831D 85D1 0111 84D1 831D 03D1 D11D 8DD1 831D 89D1 041D 1DD1 D185 1D83 D183 1184 D101 1D89 1188 D102 1D1D 8CD1 011D 8F11 01D1 8511 83D1 8A11 83E1 8911 02F1 1F8C 1101 E184 1F06 E11E 1FF1 1F1E 84E1 0E11 E1E1 1E1F E11F 1E1E 1F1F E11F 1F89 1E86 1F02 F1F1 861F 8511 83F1 8BD1 851D 87D1 021D D184 1D83 D101 1184 D183 1D87 D102 111D 95D1 021D 1D83 D185 1D85 D101 1186 D183 1D01 D185 1D83 D103 1111 D183 1D92 D188 1D85 1103 D1D1 1D86 D101 1D89 D183 1183 D102 1D1D 8811 121E 1FE1 1E1F 1E1E 1FE1 F11F E11F 1F1E E1F1 F183 1F08 F1E1 E11F 1E1F 1F1E 83E1 041F 1F1E F185 1F0E F11F EFEF 1FF1 F11F 1E1E 1F1F 1E1E 911F 83F1 851F 01E1 8611 01F1 871D 84D1 851D 8AD1 861D 0261 6186 6802 1111 8618 0261 6186 1801 8187 1801 D187 1D02 D1D1 861D 02D1 D186 1D02 4141 8614 0211 4186 1402 4141 8614 0271 7186 1702 7171 8617 8812 0121 8712 02A1 A18E 1A0B 11E1 1F1E 1EE1 1F1E 1E1F 1F83 1E05 E1E1 1FF1 E183 F104 1FE1 1F1F 831E 061F E1E1 F11F 1F85 E104 1F1F 1EF1 86E1 01F1 87E1 041F E11F E183 1E04 E11F 1FE1 831E 861F 051E 1E1F 1FF1 851F 01F1 83E1 01F1 831F 8811 081D 1DD1 1111 D1D1 1183 D189 1D06 D11D D11D 6811 8368 8311 0218 8183 1883 8102 1881 8318 0581 6181 1861 8318 8361 021D 1183 1D05 11D1 D11D D183 1D05 D111 111D 1183 1D03 11D1 D185 1483 4102 1441 8314 8341 0214 4183 1483 1102 1711 8317 0571 7117 1771 8317 8371 0212 C183 1205 1111 2112 2183 1203 2112 1285 1A83 A102 1AA1 861A 121F 1E1E E11F 1111 E1E1 1FF1 1E1F 1EE1 E11F 1F83 E110 1FE1 11E1 E1F1 1FF1 1F1F 11E1 1111 1F11 831F 83E1 851F 83E1 071E F1F1 1F1F 1E1E 861F 83E1 051E E11E 1FE1 841F 081E 1FF1 E11F 1FE1 1E84 E184 1F03 E11E 1E86 E183 1102 D1D1 841D 83D1 841D 83D1 831D 01D1 841D 90D1 021D 1D89 D185 1D88 118B D185 1D83 1188 D185 1D83 1183 D187 1D03 D1D1 118F D101 1184 1D8A D105 1D1D D1D1 1185 D185 1D0C D1D1 1DF1 E1E1 11E1 1FE1 F11F 831E 011F 8311 831F 06EF 1F1F E11F F186 1F02 E1F1 881F 01E1 861F 01EF 881F 86E1 06F1 F111 E1E1 1E84 E102 1E1E 841F 05E1 1E1F F11F 83F1 031F 1111 83A1 031A 1AA1 8411 05A1 11A1 A1D1 8711 84D1 011D 87D1 8411 83D1 011D 86D1 8411 02D1 D188 1D83 1186 D187 1D90 D102 1D1D 88D1 0211 1184 D103 11D1 D185 1D04 D11D 1DD1 8511 01D1 831D 03D1 1111 83D1 0111 84D1 011D 83D1 041D D1D1 1184 1D88 D184 1188 D183 E101 1183 E111 111F F11E E1F1 1FE1 E11F E1F1 E1E1 1F1F 1E83 E101 1184 1F02 E1F1 861F 04F1 11E1 E189 1F13 F11F E11F 1FE1 1EE1 1E1E E1E1 1E1F 1EE1 E11F 1F84 1E84 1F83 1A02 A1A1 831A 87A1 031A 1111 8461 0416 61D1 D18A 1104 E1F1 1F1F 8411 831F 8511 831F 8511 831F 8511 831F 8511 831F 8511 831F 8511 831F 8511 831F 8511 831F 8511 831F 8511 831F 8511 831F 8511 831F 8511 831F 8511 831F 8511 831F 8511 83F1 021F 1183 E184 1105 EF11 111F 1F83 E185 1F09 F1EF 1F1F 1EF1 F11E F183 1F0F EF1E E1F1 E11F E11F F1E1 E11E E1F1 1F86 E105 1111 E11E 1F85 110A A1A1 1AA1 A11A A11A A1A1 8F1A 01A1 861A 0161 8318 0861 1861 1811 1161 1184 6188 F102 1111 8617 0211 1186 1702 1111 8617 0211 1184 7184 1186 1702 1111 8417 0471 7111 1186 1702 1111 8617 0211 1186 7102 1111 8617 0211 1186 1702 1111 8471 0417 1711 1184 1704 7171 1111 8417 0471 7111 1186 1702 1111 8417 0271 7188 F188 1103 1FE1 1F85 E108 F11E 1F1F EFE1 11E1 881F 0211 1186 F190 1101 6187 1186 A102 1111 831A 05A1 1A1A A1A1 871A 01A1 861A 0AA1 A161 1616 1861 1816 1686 6102 1816 88F1 8517 8371 8517 8371 8617 0271 7188 1186 178A 7186 1702 7171 8617 0271 7186 1702 7171 8517 8371 8517 8371 8617 9271 8517 8571 0617 7117 1771 7188 F188 1101 E187 1102 F11F 83E1 8311 02EF F183 E185 1F06 1EE1 F1F1 1F1F 8311 05F1 E11F 1E1E 8611 0241 4187 1104 4161 1161 8511 8561 0711 1161 1161 1818 8316 0961 6116 1618 1661 8146 8818 0861 1816 1816 6118 1888 F101 2185 1202 1111 8612 0211 1186 1284 1184 1203 1111 C185 1202 1111 86C1 0311 11C1 8512 0511 11C1 1221 8312 0211 1186 1203 1111 C185 1202 1111 8612 0211 1184 1207 2121 1111 C121 2183 1202 1111 8621 0311 1121 8512 0411 11C1 2184 1202 1111 88F1 011D 86D1 011D 8411 02E1 1183 E107 F11F EF1F EF1F F190 1F01 1E83 1F05 1EE1 E1F1 F184 4183 1101 1484 4183 1102 1414 8341 8311 0514 4114 4141 8311 1814 4164 4114 6111 1146 8146 6146 1661 6184 4848 4646 6118 6185 1803 1618 1888 F105 C2C2 12C2 C283 2188 1286 218D 1205 C212 21C2 C288 219A 1204 1121 2111 9A12 0121 9112 0621 1212 2112 1288 F188 1101 E187 1102 1F1E 8611 841F 04F1 E1F1 1183 1F83 F18B 1101 4187 1101 1484 4106 1414 1141 4114 8441 8311 0114 8441 0511 1441 4114 8341 0461 4141 1484 4104 1661 6164 8441 0316 6116 8361 0811 11F1 F11F 1FF1 E185 1183 1F85 1183 1F85 1183 1F85 1183 1F85 1183 1F85 1183 1F85 1183 1F85 1183 1F85 1183 1F85 1183 1F85 1183 1F85 1183 1F85 1183 1F85 1183 1F85 1183 1F85 1183 1F05 1111 F1F1 1F83 F1FF 1 FF 11F4 1100 ]data ; : SplashP ( -- addr #cells ) data[ FF00 FF00 FF00 EF00 8401 A200 8601 02C0 2086 E090 0002 C0B0 8688 02F0 C886 B88E 000C 0103 F0CC C284 0408 1010 030D 8611 9000 0203 0086 0302 0000 8680 02F0 C886 B890 0008 C0E0 F0E8 E4E4 E2E2 8800 0803 F0E8 D8D0 B0A0 6090 0002 E0D8 86C4 0800 0307 0B13 1323 2390 0008 0719 E1C2 C284 8408 8801 A000 8501 8300 05E0 E020 C303 8304 8300 8380 8400 0BF0 131C E202 0D88 8848 3807 8300 85B8 07B0 70B0 0000 0101 8400 8303 8500 0D20 4040 80F0 030E 0D11 1112 1CE0 8500 06F0 C838 F030 B083 0002 0101 8300 0803 0304 C3C0 20E0 2085 8083 0085 B807 B070 B000 0001 0186 0002 E0E0 8400 85E2 0F0D 0E0D 0001 0102 0205 0609 40C0 8080 8600 0207 F08C 0085 C403 E41C E485 2303 D838 D889 000C 0181 60E0 9070 9008 1010 E0E0 8300 8801 A800 0B07 0407 0407 0404 C080 8000 8480 0600 130D 0E0D 1383 E288 0005 C8B0 70B0 C883 B885 0002 0101 8900 0813 0D0C 0D13 120E 0188 0005 C8B0 70B0 C883 B801 0183 0084 0105 C020 E020 C083 2088 0005 C8B0 70B0 C883 B886 0002 0101 8600 12C0 C003 0D0E 0D8C 0418 E007 E01C D8C0 B0A0 608D 0003 8198 1887 0006 80D8 E4A3 E423 83C4 05E4 D838 D8E4 8323 8800 0760 9070 9060 1010 8900 8801 A100 8701 0220 6086 E088 0087 E201 C288 0088 B889 0002 0101 8600 0780 4060 2090 D0C8 8800 88B8 8801 8820 8800 88B8 8801 8820 0A00 0101 0202 0405 0940 C084 8012 0000 0101 0303 0707 F00E 1828 2848 4888 8808 8880 88C4 8723 0121 9000 08C0 2090 90C8 C8E4 0B88 01A0 0084 0184 0003 E020 C08D 0004 8404 18E0 8C00 04B8 4870 8094 0004 E414 0E01 8C00 04B8 4870 8084 0002 0101 8600 0420 20E0 E08C 0004 B848 7080 8400 0201 0186 0004 2020 E0E0 8400 040B 161C C08C 0004 E132 E103 8400 0408 090E F084 0001 8087 0004 C424 1C03 8400 0410 100C 0384 0001 808F 0003 0D0A 0785 0088 01D1 0007 0E09 09F0 0A09 0883 0005 C344 8320 9C83 0001 0184 9208 0002 020D 8D93 928D 8300 09A1 9160 D191 0008 08F0 8309 010E 8300 8328 1E10 1000 2426 2212 1819 1100 4080 439C A424 1C00 A080 58A8 A852 A600 8283 8384 8208 0020 6098 A3AC 2926 8300 10C3 9CA4 A49C 0080 8043 A2A2 A698 0004 0483 9405 B4D4 0080 0085 80FF 00B1 0002 1020 FF00 9400 0380 C0E0 8A00 0110 8A00 0301 0204 8400 04C0 7038 6195 0001 0285 0005 4000 1040 408C 0004 388B C0C0 8900 0108 9A00 0218 18A6 0004 0306 F0E0 8300 05E0 0080 C030 8300 0503 0309 1110 8400 0403 0330 4085 0003 C030 0C83 0004 4406 0020 8D00 0408 18C3 8384 0003 4000 0884 000D 1038 1000 00C3 4299 A1A1 9942 C387 0009 08F0 F0D8 B8CC 3119 888B 001D 0103 0509 1308 0911 11A1 A1E1 C160 4452 5242 8C61 6800 0080 C0C3 C4C8 7083 0009 1040 6070 7004 0000 0284 0007 E840 1040 0000 4089 0003 C240 2884 0001 0186 0002 8080 A800 0140 9700 04E8 26B1 B183 9C04 61C8 0B06 8303 1A02 2320 4010 C888 8601 C181 8689 C924 E421 210E 0E10 E120 F088 8B83 001D 8040 C0A0 D000 0101 0307 C046 8081 0110 1A13 C242 8600 0080 C070 38C3 0D84 0004 06E4 1334 8500 0380 8060 8600 3A08 00CC CC9C 6161 3010 1000 80C0 C0E0 0E05 8313 23A4 99A5 0502 02C1 C888 8810 1008 0460 70B8 4121 2010 1870 E070 E00E 0EF0 70C3 C1C0 38E4 0781 8083 0005 80C0 E0F0 0789 0017 0302 0204 0408 10C1 0D8B 3830 3020 40C0 C0E0 E0D0 D070 878F 0001 0185 0003 40E0 608A 0003 0201 1089 0002 1CC0 8C00 2801 E081 0702 9C62 01CC 31D8 1651 8906 0040 A9E8 08B2 424C 1211 088B 0121 A126 B885 52B2 2944 4404 0883 4004 80D0 E813 8310 0211 1085 0006 C0E0 E007 0303 8501 030E 8CF0 8307 3D03 010B 1818 2C2C 4C24 E1F0 8782 C8C9 1212 0900 60E0 B81C E1E4 E20C 0202 0408 0402 0087 3830 2020 4040 8004 0408 0810 1020 2004 0810 180C 0C83 0B18 1838 83C3 3AC1 F020 1011 0102 0004 83E0 F038 1CE1 F0F0 0393 9198 C4C2 0603 8000 0038 0010 87E0 C030 50F0 4181 1230 6148 989C 2C0C 4C8E 8687 8783 8984 8680 C085 0013 80E0 0701 0202 050A 149A 9A30 1C43 2312 1112 2A83 0005 C0C0 3083 1188 0051 A830 E8A8 4144 A340 0387 60A1 8088 8988 E080 8000 001C 0C02 F0C4 0202 26C8 2424 E000 C2C2 0104 F0C0 00C0 C080 8007 86C1 4386 320C 04E8 E8F0 0814 2422 4241 881C 0808 0404 0202 8181 70B8 B823 2111 1008 0186 0023 8000 94CA C4D0 8002 8007 83E1 0707 0801 000B 85C3 C120 1001 C08C 8E18 4806 2323 1901 0186 8088 0002 61C3 8600 02E4 8986 0002 07F0 8600 0281 C086 0002 8380 8600 02C0 6087 0001 0186 0002 60C0 8600 0207 0386 0002 0380 8600 0201 8086 0002 9A49 8600 0228 5186 0002 1138 8700 1903 030A 12B0 0512 C800 41A4 D0E8 4824 38C4 0470 C0F0 C303 0060 83B0 08F0 0D09 C000 0089 B483 9238 8705 16C4 6032 3010 3008 80C0 60A0 2820 8888 E011 C344 8915 1CC9 87C3 9C61 B0B8 4040 2010 9088 E8D4 8884 B843 4323 2322 8040 2020 7087 0182 8800 1AC0 E007 0000 0101 00C0 E0F0 0701 0000 220C 84C2 F087 B8F0 0780 0083 8084 0001 0783 0005 1C38 7000 0783 0005 070D 0E00 B483 0003 080C 0C86 0004 0101 001C 8300 0101 8800 0480 8000 9C83 0005 300C 0700 8C83 0005 7038 1C00 068B 0005 80D0 8700 7083 0005 7080 0300 0185 0003 E000 C183 0005 E28D C300 1C83 0005 4020 3000 8083 0007 87E1 F009 D852 D483 000B C893 4086 2911 CC10 0C01 0083 4908 0003 0090 6198 38E0 8300 0190 8600 39F0 0202 0407 0807 0000 0103 0DCC C307 0805 1526 2223 4381 8101 2623 1368 8CB2 8222 8810 2041 8619 9860 1113 928C 9214 0D0B C1C1 E1E1 8E12 9AC5 8580 8300 3307 06F0 E1E1 C3E0 80CC 190C 0CC6 1C0C 0603 43A1 8E38 381C 8A03 070E 1C18 3020 01E0 8207 0E1C 1838 F031 018C 18F0 E0E8 600C 0C0E 85E1 8800 1080 4040 C060 7070 F0C0 E0F0 0707 1398 9C83 000D 0103 0301 C08C C3E1 0E07 0307 8383 004A 80C0 61C6 F083 E1E0 8107 F080 0040 2010 080C 0404 06E0 7070 381C 0703 0083 C0C0 CC21 0181 6110 0CC2 E2F0 F020 7003 0100 80C0 2018 CC07 0381 C0C0 0B0B E407 0201 0006 F00D 1C03 544A 1580 8300 09F0 0000 8000 E040 C0F0 8500 04F0 1007 0785 0003 1803 0186 0001 8085 0016 0307 1C82 1981 0120 3038 8000 030C 4CCC B0C1 3132 C202 8301 0592 150D E413 83F0 0907 0000 7024 1286 A2AA 8400 0540 0008 0102 8700 0C31 381C 0EF0 0707 0303 0202 0484 000A 0303 0EC3 3830 3020 C0C0 8400 0A01 10C1 C0C0 1080 000C 0C83 0002 8080 83C0 0970 87C3 C1C2 8281 0361 8320 2810 8010 08E0 F070 7030 C018 1C81 800E 0703 0301 0106 0100 00C0 2010 0800 80F0 8787 8383 0306 F010 0185 0023 8007 01F0 0300 001C 0603 0080 E0E0 60F0 1C8C E0E0 1C03 000D 82F0 F080 7008 070B 85C2 F084 0001 9883 F008 380C 0403 0102 0300 8301 1600 3838 1616 E420 A0A3 1818 E030 0818 8864 1806 0100 8383 0011 031C 8341 60A0 0000 F000 0103 F080 0001 8783 0736 0BE4 1CC5 6020 C31C A348 C218 11C6 00C6 1193 0003 858B 9589 0620 90C0 A1C0 81C3 1AA4 E058 A084 D004 B0D4 6207 0000 C008 9060 8B96 0301 8A00 0401 07F0 E1FF 0085 0005 80E0 F087 0083 0184 0004 8000 0070 8380 1740 1208 E000 0007 8004 00A3 8CC4 16F0 9061 0080 51A1 C143 8303 129C 9A9A CA24 0707 C542 8C88 30C0 0000 1022 C185 000D F0C2 E2A1 2AA8 15AA 8023 23A6 5083 8003 E199 8083 001B 8028 15D4 1542 070D 0287 2185 C1A1 95C1 44C0 0000 8000 2080 1040 1C87 3802 0000 8603 0200 0086 C002 0000 86C0 0200 0084 0788 0004 C0C0 0000 8406 0401 0100 0086 0604 0000 0101 8600 0801 0103 0387 8700 0086 0102 0000 8680 0A00 00E0 E0F0 F007 0700 0084 8002 0303 8600 04F0 F000 0084 6002 E0E0 8600 0380 8038 871C 8800 03A0 20E0 8308 1604 040E C618 F080 0100 0381 0102 0408 1020 C000 0080 C083 E001 F090 0001 0187 0030 010A 3106 0502 0000 50A8 3119 C9AA A501 0100 200B 042A AC48 0112 2903 4A93 5248 1454 E8A1 0680 B2A8 A008 6410 A820 29C6 8838 0103 840B 05A4 8484 C0C0 83C2 0529 2121 C0C0 83C2 03D2 2121 8800 83C0 05C2 C2D2 2121 8801 8406 0486 9609 0984 0006 84E2 0A0A 3030 8300 0201 E183 0183 0513 1A42 4283 8081 8185 6242 4383 8301 45A2 A220 E084 0306 0202 8282 F0F0 84D0 0410 10E0 E083 E10B 1410 1080 8000 8102 0080 8088 1C88 0001 0387 0005 1C0C 0C04 0383 000F 80C1 0102 0D0C 2010 2341 98C3 860E 6184 0005 8080 0743 B886 0002 0704 8700 0480 0400 0285 0028 8823 0D25 0B00 0005 001A 401A 94B2 482A 0664 AC02 A5AA 1C41 C2A0 8841 A104 0020 AA21 8A09 26B2 1304 8838 11B4 4140 40A0 C000 00D0 A000 0001 0300 00D8 83D0 02C0 C08A 0003 25D2 D083 C002 0000 8601 0500 0049 9616 8306 0500 0029 96E8 8307 0C00 0085 8543 0387 8700 0052 8584 811B 0000 B4A0 A1A1 8181 0000 2000 F0F0 0707 0000 42C2 E21C 0C0C 0000 7085 F005 0000 16E8 E883 E004 0000 8080 8600 881C 08C3 4299 A1A1 9942 C384 0016 0100 0303 0107 E080 0080 E0E1 0804 0201 0204 0408 0000 8501 0B02 8A84 0911 23A0 60C0 8087 8304 8300 0543 A222 2418 8300 054A 4A85 4948 8300 0518 140B 14E4 8300 2084 8A05 42C6 0100 00C1 3041 94C1 A513 081A 2525 22C2 B894 9C08 0000 0401 2285 0188 3805 8080 0C80 8083 F001 6183 2105 61E1 E0E0 0385 0707 0808 0301 6101 0183 6183 0C07 8080 0380 80C3 C385 C003 8000 0086 8783 8602 8080 8386 8810 1307 0700 E0E0 0007 07C0 8087 8484 8680 C018 10F0 8510 0506 02C2 0202 83C2 08F0 0606 0000 1018 1885 020B 42C2 C200 00E0 0303 E000 0088 1C88 0001 0187 0002 41E2 8600 0EF0 1020 E01C 0B07 000C 1061 70E0 E08B 0001 0187 0002 0720 8329 06D2 D800 0202 C483 2201 2383 0011 2151 5152 8C00 8740 4383 4442 4102 0101 2083 5117 9095 8503 2112 1292 D226 26A2 2A28 2100 0038 1CE1 F007 01FF 0083 0006 1C38 87F0 E080 FF00 FF00 F400 ]data ; \ Splash screen display routines : BitmapSetup ( -- ) A0 83D4 c! \ Save new value of VR1 into interpreter workspace A0 1 vwtr \ 16K screen blanked interrupts enabled 06 2 vwtr \ SIT at >1800 FF 3 vwtr \ CT at >2000 03 4 vwtr \ PDT at >0000 36 5 vwtr \ SAL at >1B00 D0 1B00 v! \ Mark start of SAL as invalid - no sprites 11 7 vwtr \ Bitmap background is black 1800 3 0 do \ Initialize SIT 100 0 do dup i swap v! 1+ loop loop drop ; : DecompressTable ( tableaddress tabledata -- ) 2 * to memCount to dataAddress to tableAddress begin dataAddress c@ dup >r 80 and if 1 +to dataAddress dataAddress c@ tableAddress r> 7F and 0 do 2dup v! 1+ loop to tableAddress drop memCount 2 - to memCount 1 +to dataAddress else tableAddress dataAddress 1+ r@ vmbw r@ tableAddress + to tableAddress r@ 1+ dataAddress + to dataAddress memCount r> 1+ - to memCount then memCount 0= until ; : DisplaySplash ( -- ) BitmapSetup 0 SplashP DecompressTable 2000 SplashC DecompressTable 02 0 vwtr \ Start bitmap mode E0 83d4 c! E0 1 vwtr \ Turn screen on key drop A0 83D4 c! A0 1 vwtr 1001 800 do 0 i v! loop E0 83d4 c! E0 1 vwtr 1 gmode ; \ Graphic character definitions \ Spectrum font (characters 48-127) \ Characters 97-122 are inverse upper case. Inverse space is character 123 ({) : SpectrumFont ( -- ) data[ 003C 464A 5262 3C00 0018 2808 0808 3E00 003C 4202 3C40 7E00 003C 420C 0242 3C00 0008 1828 487E 0800 007E 407C 0242 3C00 003C 407C 4242 3C00 007E 0204 0810 1000 003C 423C 4242 3C00 003C 4242 3E02 3C00 0000 0010 0000 1000 0000 1000 0010 1020 0000 0408 1008 0400 0000 003E 003E 0000 0000 1008 0408 1000 003C 4204 0800 0800 003C 4A56 5E40 3C00 003C 4242 7E42 4200 007C 427C 4242 7C00 003C 4240 4042 3C00 0078 4442 4244 7800 007E 407C 4040 7E00 007E 407C 4040 4000 003C 4240 4E42 3C00 0042 427E 4242 4200 003E 0808 0808 3E00 0002 0202 4242 3C00 0044 4870 4844 4200 0040 4040 4040 7E00 0042 665A 4242 4200 0042 6252 4A46 4200 003C 4242 4242 3C00 007C 4242 7C40 4000 003C 4242 524A 3C00 007C 4242 7C44 4200 003C 403C 0242 3C00 00FE 1010 1010 1000 0042 4242 4242 3C00 0042 4242 4224 1800 0042 4242 425A 2400 0042 2418 1824 4200 0082 4428 1010 1000 007E 0408 1020 7E00 000E 0808 0808 0E00 0000 4020 1008 0400 0070 1010 1010 7000 0010 3854 1010 1000 0000 0000 0000 00FF 001C 2278 2020 7E00 FFC3 BDBD 81BD BDFF FF83 BD83 BDBD 83FF FFC3 BDBF BFBD C3FF FF87 BBBD BDBB 87FF FF81 BF83 BFBF 81FF FF81 BF83 BFBF BFFF FFC3 BDBF B1BD C3FF FFBD BD81 BDBD BDFF FFC1 F7F7 F7F7 C1FF FFFD FDFD BDBD C3FF FFBB B78F B7BB BDFF FFBF BFBF BFBF 81FF FFBD 99A5 BDBD BDFF FFBD 9DAD B5B9 BDFF FFC3 BDBD BDBD C3FF FF83 BDBD 83BF BFFF FFC3 BDBD ADB5 C3FF FF83 BDBD 83BB BDFF FFC3 BFC3 FDBD C3FF FF01 EFEF EFEF EFFF FFBD BDBD BDBD C3FF FFBD BDBD BDDB E7FF FFBD BDBD BDA5 DBFF FFBD DBE7 E7DB BDFF FF7D BBD7 EFEF EFFF FF81 FBF7 EFDF 81FF FFFF FFFF FFFF FFFF 0008 0808 0808 0800 0070 100C 1010 7000 0014 2800 0000 0000 3C42 99A1 A199 423C ]data 30 dchar ; \ High score letters (characters 128-129) : HighScoreTitle ( -- ) data[ 0042 427E 4242 4200 003E 0808 0808 3E00 ]data 80 dchar ; \ Score numbers (characters 136-146) \ Characters 147-151 are inverse numbers 1-5 : ScoreNumbers ( -- ) data[ 003C 464A 5262 3C00 0018 2808 0808 3E00 003C 4202 3C40 7E00 003C 420C 0242 3C00 0008 1828 487E 0800 007E 407C 0242 3C00 003C 407C 4242 3C00 007E 0204 0810 1000 003C 423C 4242 3C00 003C 4242 3E02 3C00 0000 0000 0018 1800 FFE7 D7F7 F7F7 C1FF FFC3 BDFD C3BF 81FF FFC3 BDF3 FDBD C3FF FFF7 E7D7 B781 F7FF FF81 BF83 FDBD C3FF ]data 88 dchar ; ffaihm @ h ! \ Player life character (character 152) : LifeFigure ( -- ) data[ 1824 3C7E 5A3C 3C66 ]data 98 dchar ; \ Ground definitions (characters 160-162) : GroundLeft ( -- ) data[ 2F7F FFDD FB7B 7121 ]data A0 dchar ; : GroundMiddle ( -- ) data[ BDFF FFF7 EBDD AD04 ]data A1 dchar ; : GroundRight ( -- ) data[ 4CFE FF3E FFFE 9C08 ]data A2 dchar ; \ Platform definitions (characters 168-170) : PlatformLeft ( -- ) data[ 2F7F FFDD FB7B 7121 ]data A8 dchar ; : PlatformMiddle ( -- ) data[ BDFF FFF7 EBDD AD04 ]data A9 dchar ; : PlatformRight ( -- ) data[ 4CFE FF3E FFFE 9C08 ]data AA dchar ; \ Rocket character definitions (characters 176-187) : U1Char ( -- ) data[ F4F5 5552 89B9 B8B8 2FEF EACA 9197 1717 B9B9 B9B9 F9A9 A9AF F7F7 F7F7 FFF5 F5F5 2929 5959 89B9 B9B9 FCF4 F6F6 F1F7 F7F7 0909 0909 0909 1919 10F0 F0B0 30B0 18F8 0909 0909 0909 0909 F0F0 F0F0 F050 5050 0101 0202 0505 0908 8080 C0C0 E0E0 F010 ]data B0 dchar ; \ Jetman sprite definitions (characters 256-263) : JetmanTopR ( -- ) data[ 0000 0307 1617 1733 302B 3A2A 3A2D 3E1F 0000 C000 F070 70E0 00C0 6868 1EE0 C0E0 ]data 100 dchar ; : JetmanTopR1 ( -- ) data[ 0000 0307 2627 1733 302B 3A2A 3A2D 3E1F 0000 C000 F070 70E0 00C0 6868 1EE0 C0E0 ]data 100 dchar ; : JetmanTopR2 ( -- ) data[ 0000 0307 2627 2733 302B 3A2A 3A2D 3E1F 0000 C000 F070 70E0 00C0 6868 1EE0 C0E0 ]data 100 dchar ; : JetmanTopL ( -- ) data[ 0000 0300 0F0E 0E07 0003 1616 7807 0307 0000 C0E0 68E8 E8CC 0CD4 5C54 5CB4 7CF8 ]data 100 dchar ; : JetmanTopL1 ( -- ) data[ 0000 0300 0F0E 0E07 0003 1616 7807 0307 0000 C0E0 64E4 E8CC 0CD4 5C54 5CB4 7CF8 ]data 100 dchar ; : JetmanTopL2 ( -- ) data[ 0000 0300 0F0E 0E07 0003 1616 7807 0307 0000 C0E0 64E4 E4CC 0CD4 5C54 5CB4 7CF8 ]data 100 dchar ; : JetmanStandR ( -- ) JetmanTopR data[ 152A 3E00 0000 0000 0000 0000 0000 0000 E0E0 E0C0 00C0 E0F0 0000 0000 0000 0000 ]data 104 dchar ; : JetmanStandL ( -- ) JetmanTopL data[ 0707 0703 0003 070F 0000 0000 0000 0000 A854 7C00 0000 0000 0000 0000 0000 0000 ]data 104 dchar ; : JetmanWalkSR ( -- ) data[ 152A 3E01 0103 0303 0000 0000 0000 0000 E0E0 E0D0 A030 B8FC 0000 0000 0000 0000 ]data 104 dchar ; : JetmanWalkLR ( -- ) data[ 152A 3E01 030D 0E07 0000 0000 0000 0000 E0E0 F0D8 980C 0E0F 0000 0000 0000 0000 ]data 104 dchar ; : JetmanWalkSL ( -- ) data[ 0707 070B 050C 1D3F 0000 0000 0000 0000 A854 7C80 80C0 C0C0 0000 0000 0000 0000 ]data 104 dchar ; : JetmanWalkLL ( -- ) data[ 0707 0F1B 1930 70F0 0000 0000 0000 0000 A854 7C80 C0B0 70E0 0000 0000 0000 0000 ]data 104 dchar ; : JetmanBoostR ( -- ) JetmanTopR data[ 142A 3E00 281C 226C 1008 0000 0000 0000 FC0C 000E 0F00 0000 0000 0000 0000 0000 ]data 104 dchar ; : JetmanBoostL ( -- ) JetmanTopL data[ 3F30 0070 F000 0000 0000 0000 0000 0000 2854 7C00 1438 4436 0810 0000 0000 0000 ]data 104 dchar ; : JetmanBoostR1 ( -- ) data[ 142A 3E00 2A11 140A A014 0000 0000 0000 FC0C 000E 0F00 0000 0000 0000 0000 0000 ]data 104 dchar ; : JetmanBoostR2 ( -- ) data[ 142A 3E00 3604 3084 2008 0000 0000 0000 FC0C 000E 0F00 0000 0000 0000 0000 0000 ]data 104 dchar ; : JetmanBoostR3 ( -- ) data[ 142A 3E00 5A12 48A4 1080 0000 0000 0000 FC0C 000E 0F00 0000 0000 0000 0000 0000 ]data 104 dchar ; : JetNoBoostR ( -- ) JetmanTopR data[ 142A 3E00 0000 0000 0000 0000 0000 0000 FC0C 000E 0F00 0000 0000 0000 0000 0000 ]data 104 dchar ; : JetmanBoostL1 ( -- ) data[ 3F30 0070 F000 0000 0000 0000 0000 0000 2854 7C00 5488 2850 0528 0000 0000 0000 ]data 104 dchar ; : JetmanBoostL2 ( -- ) data[ 3F30 0070 F000 0000 0000 0000 0000 0000 2854 7C00 6C20 0C21 0410 0000 0000 0000 ]data 104 dchar ; : JetmanBoostL3 ( -- ) data[ 3F30 0070 F000 0000 0000 0000 0000 0000 2854 7C00 5A48 1225 0801 0000 0000 0000 ]data 104 dchar ; : JetNoBoostL ( -- ) JetmanTopL data[ 3F30 0070 F000 0000 0000 0000 0000 0000 2854 7C00 0000 0000 0000 0000 0000 0000 ]data 104 dchar ; \ Explosion sprites definitions (characters 264-272) : Explosion1 ( -- ) data[ 0F3B 6768 30C0 6860 E0E8 E0FC 6A0F 0701 0E9C D3EF 2C00 0000 0000 038F 0E0E F8F0 ]data 108 dchar data[ C0E0 3804 1E0F 2307 0604 189C F8F0 8600 0000 0000 0000 0000 0000 0000 0000 0000 ]data 10C dchar ; : Explosion2 ( -- ) data[ 0000 0709 1E17 1F0F 1F1F 1F0E 0000 0000 0000 1FBF FFDF EFEF D7BF 7FFE E67C 0000 ]data 108 dchar data[ 0000 80C0 D8BC ECFC F8C0 E0C0 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 ]data 10C dchar ; : Explosion3 ( -- ) data[ 0000 0000 0001 0303 0303 0100 0000 0000 0000 0E33 2FFF DFAC EFDF DE0C 0000 0000 ]data 108 dchar data[ 0000 00B0 F8F8 70C0 C0C0 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 ]data 10C dchar ; \ Rocket sprites definitions (characters 272-283) : U1Top ( -- ) data[ 0101 0202 0505 0908 0909 0909 0909 0909 8080 C0C0 E0E0 F010 F0F0 F0F0 F050 5050 ]data 110 dchar ; : U1TopStatic ( -- ) data[ 0101 0202 0505 0908 0000 0000 0000 0000 8080 C0C0 E0E0 F010 0000 0000 0000 0000 ]data 110 dchar ; : U1Middle ( -- ) data[ 0909 0909 0909 1919 2929 5959 89B9 B9B9 10F0 F0B0 30B0 18F8 FCF4 F6F6 F1F7 F7F7 ]data 114 dchar ; : U1MiddleStatic ( -- ) data[ 0909 0909 0909 1919 0000 0000 0000 0000 10F0 F0B0 30B0 18F8 0000 0000 0000 0000 ]data 114 dchar ; : U1Bottom ( -- ) data[ B9B9 B9B9 F9A9 A9AF F4F5 5552 89B9 B8B8 F7F7 F7F7 FFF5 F5F5 2FEF EACA 9197 1717 ]data 118 dchar ; : U1BottomStatic ( -- ) data[ B9B9 B9B9 F9A9 A9AF 0000 0000 0000 0000 F7F7 F7F7 FFF5 F5F5 0000 0000 0000 0000 ]data 118 dchar ; : U2Top ( -- ) data[ 0000 0000 0101 0304 0407 0C0C 0F0F 0B0B 387C F2F2 F2F2 F2F2 F2F2 FAFA FAFA FAFA ]data 110 dchar ; : U2TopStatic ( -- ) data[ 0000 0000 0101 0304 0000 0000 0000 0000 387C F2F2 F2F2 F2F2 0000 0000 0000 0000 ]data 110 dchar ; : U2Middle ( -- ) data[ 0B0B 0D0B 0B0B 0B0D 0B0B 0B0B 0F0F 0C0B 5A5A 5256 16F6 F616 D616 7616 F6F6 7C76 ]data 114 dchar ; : U2MiddleStatic ( -- ) data[ 0B0B 0D0B 0B0B 0B0D 0000 0000 0000 0000 5A5A 5256 16F6 F616 0000 0000 0000 0000 ]data 114 dchar ; : U2Bottom ( -- ) data[ 0D0B 1B37 3757 57D7 D7D7 D7D7 DFC0 8080 7676 7676 7EFE 9CA2 2E21 4F4F 4F4F 4F4F ]data 118 dchar ; : U2BottomStatic ( -- ) data[ 0D0B 1B37 3757 57D7 0000 0000 0000 0000 7676 7676 7EFE 9CA2 0000 0000 0000 0000 ]data 118 dchar ; : U3Top ( -- ) data[ 0101 0101 0102 0508 0909 091E 1325 254B 8080 8080 8040 E010 F0F0 F008 F8FC FCFE ]data 110 dchar ; : U3TopStatic ( -- ) data[ 0101 0101 0102 0508 0000 0000 0000 0000 8080 8080 8040 E010 0000 0000 0000 0000 ]data 110 dchar ; : U3Middle ( -- ) data[ 7FD9 D9A6 A6FF 8B8B 8A8A 8A8A 8A8B FFD9 FE9B 9B65 65FF FFFF D1DD D1DD 11FF FF9B ]data 114 dchar ; : U3MiddleStatic ( -- ) data[ 7FD9 D9A6 A6FF 8B8B 0000 0000 0000 0000 FE9B 9B65 65FF FFFF 0000 0000 0000 0000 ]data 114 dchar ; : U3Bottom ( -- ) data[ D9A6 A67F 4545 4545 7F28 5C5C 829E 9E9E 9865 65FE FEFE FEFE FE14 2E2E 414F 4F4F ]data 118 dchar ; : U3BottomStatic ( -- ) data[ D9A6 A67F 4545 4545 0000 0000 0000 0000 9865 65FE FEFE FEFE 0000 0000 0000 0000 ]data 118 dchar ; : U4Top ( -- ) data[ 0101 0303 0307 0505 0D09 091B 1519 1315 8080 C0C0 C0E0 A0A0 B090 9098 8888 8888 ]data 110 dchar ; : U4TopStatic ( -- ) data[ 0101 0303 0307 0505 0000 0000 0000 0000 8080 C0C0 C0E0 A0A0 0000 0000 0000 0000 ]data 110 dchar ; : U4Middle ( -- ) data[ 1911 191D 1F1F 1F0F 8F8F 8F97 9797 BBBB 8888 98B8 F8F8 F8F0 F1F1 F1E9 E9E9 DDDD ]data 114 dchar ; : U4MiddleStatic ( -- ) data[ 1911 191D 1F1F 1F0F 0000 0000 0000 0000 8888 98B8 F8F8 F8F0 0000 0000 0000 0000 ]data 114 dchar ; : U4Bottom ( -- ) data[ BBFB ABAB AB8B FBF3 F2E5 E5C8 C989 8980 DDDF D7DF D5D1 DDCF 4FE7 E713 F3F1 F101 ]data 118 dchar ; : U4BottomStatic ( -- ) data[ BBFB ABAB AB8B FBF3 F2E5 E5C8 C989 8980 DDDF D7DF D5D1 DDCF 4FE7 E713 F3F1 F101 ]data 118 dchar ; \ Laser fire sprite definitions (characters 284-291) : LaserFire1 ( -- ) data[ 0000 0000 0000 0000 0000 FF00 0000 0000 0000 0000 0000 0000 0000 FF00 0000 0000 ]data 11C dchar ; : LaserFire2 ( -- ) data[ 0000 0000 0000 0000 0000 7E00 0000 0000 0000 0000 0000 0000 0000 7E00 0000 0000 ]data 120 dchar ; \ Miscellaneous objects and fuel (characters 292-319) : Fuel ( -- ) data[ 18FF FF8A BA8A BAB8 FFFF 1800 0000 0000 18FF FF8B BB9B BB89 FFFF 1800 0000 0000 ]data 124 dchar ; : GoldBar ( -- ) data[ 0000 0000 0000 0000 0F1F 3F20 4040 80FF 0000 0000 0000 0000 F8EC DE3F 1F1E 0EFC ]data 128 dchar ; : Radioactive ( -- ) data[ 0000 0000 000F 1024 4E6F 2060 4123 100F 0000 0000 00F8 0412 397B 8283 C1E2 04F8 ]data 12C dchar ; : Triangle ( -- ) data[ 0000 0003 0405 0F0B 1010 2070 98BF F870 0000 0080 C0C0 E0A0 1010 081C 26EE 3E1C ]data 130 dchar ; : Diamond ( -- ) data[ 0000 0000 030F 1F2F 4728 381F 0F07 0301 0000 0000 E0F0 F8F4 E214 1CF8 F0E0 C080 ]data 134 dchar ; : Blob ( -- ) data[ 0000 0000 0000 000F 3860 C3C7 CFFF 7F3F 0000 0000 0000 00F0 3C7E FFFF FFFF FEFC ]data 138 dchar ; : RocketFlame1 ( -- ) data[ 2F7F 5EB7 2E57 8A37 5324 0B10 0204 0000 FCF4 ECFD F4ED 5A6A B462 5890 4088 4000 ]data 13C dchar ; : RocketFlame2 ( -- ) data[ BF12 2D5B 2A15 4E12 0900 1200 0002 0000 7AF4 2ED4 A9D2 18C8 A400 4020 0000 8000 ]data 13C dchar ; \ Monsters definitions (characters 320-327) : Monster11 ( -- ) data[ 0000 0801 255B 27EF 9327 5102 0200 0000 0000 1078 F4C2 9DE3 F9E3 8EEC F800 0000 ]data 140 dchar ; : Monster11R ( -- ) data[ 0000 081E 2F43 B9C7 9FC7 7137 1F00 0000 0000 080A 4DAE 4F7C 9E48 A404 0000 0000 ]data 144 dchar ; : Monster12 ( -- ) data[ 0000 0004 014D 165B C317 2502 0400 0000 0000 9070 E49A 3F8F E3DF A68C 7800 0000 ]data 140 dchar ; : Monster12R ( -- ) data[ 0000 090E 2759 FCF1 C7FB 6531 1E00 0000 0000 0020 80B2 68DA C3E8 A440 2000 0000 ]data 144 dchar ; : Monster21 ( -- ) data[ 000A 160F 4F3F 79F6 36F9 3F5F 6B1A 1200 0044 E8F4 FDFE 9F6E 6C9F FEFF EA94 4000 ]data 140 dchar ; : Monster21R ( -- ) data[ 0022 172F BF7F F976 36F9 7FFF 5729 0200 0050 68F0 F2FC 9E6F 6C9F FCFA D658 4800 ]data 144 dchar ; : Monster22 ( -- ) data[ 0012 1A6B 5F3F F936 F679 3F4F 0F16 0A00 0040 94EA FFFE 9F6C 6E9F FEFD F4E8 4400 ]data 140 dchar ; : Monster22R ( -- ) data[ 0002 2957 FF7F F936 76F9 7FBF 2F17 2200 0048 58D6 FAFC 9F6C 6F9E FCF2 F068 5000 ]data 144 dchar ; : Monster31 ( -- ) data[ 071F 3F79 71E3 E7E7 FFFF FF7F 7F3F 1F07 E0F8 FCFE FEFF FFFF FFFF FFFE FEFC F8E0 ]data 140 dchar ; : Monster31R ( -- ) data[ 071F 3F7F 7FFF FFFF FFFF FF7F 7F3F 1F07 E0F8 FC9E 8EC7 E7E7 FFFF FFFE FEFC F8E0 ]data 144 dchar ; : Monster32 ( -- ) data[ 0007 1F39 7163 E7E7 FFFF 7F7F 3F1F 0700 00E0 F8FC FEFE FFFF FFFF FEFE FCF8 E000 ]data 140 dchar ; : Monster32R ( -- ) data[ 0007 1F3F 7F7F FFFF FFFF 7F7F 3F1F 0700 00E0 F89C 8EC6 E7E7 FFFF FEFE FCF8 E000 ]data 144 dchar ; : Monster4 ( -- ) data[ 0000 0000 781E CFFF FBC7 1F00 0000 0000 0000 0000 0000 F0EC DF80 F000 0000 0000 ]data 140 dchar ; : Monster4R ( -- ) data[ 0000 0000 0000 0F37 FB01 0F00 0000 0000 0000 0000 1E78 F3FF DFE3 F800 0000 0000 ]data 144 dchar ; : Monster5 ( -- ) data[ 0000 0000 0107 0D3F 7FD9 7F3F 0000 0000 0000 0000 80E0 B0FC FE9B FEFC 0000 0000 ]data 140 dchar ; : Monster5R ( -- ) data[ 0000 0000 0107 0D3F 7FD9 7F3F 0000 0000 0000 0000 80E0 B0FC FE9B FEFC 0000 0000 ]data 144 dchar ; : Monster6 ( -- ) data[ 0003 0405 0704 7B94 B5F4 7B04 0704 0503 0080 C0C0 C040 BC52 565E BC40 C040 C080 ]data 140 dchar ; : Monster6R ( -- ) data[ 0003 0405 0704 7B94 B5F4 7B04 0704 0503 0080 C0C0 C040 BC52 565E BC40 C040 C080 ]data 144 dchar ; : Monster7 ( -- ) data[ 0010 1E3F 61C0 FFCA CAFF C061 3F1E 1000 0000 00C0 F83F FFC0 C0FF 3FF8 C000 0000 ]data 140 dchar ; : Monster7R ( -- ) data[ 0000 0003 1FFC FF03 03FF FC1F 0300 0000 0008 78FC 8603 FF53 53FF 0386 FC78 0800 ]data 144 dchar ; : Monster8 ( -- ) data[ 0006 0F19 192F 4648 DFDF FF7F 3F13 0C00 0060 F098 98F4 6E9E FFFF FFFE FCC8 3000 ]data 140 dchar ; : Monster8R ( -- ) data[ 0006 0F19 192F 4648 DFDF FF7F 3F13 0C00 0060 F098 98F4 6E9E FFFF FFFE FCC8 3000 ]data 144 dchar ; \ Sound effects data : SndGrabFuel ( -- addr ) data[ 0385 0690 0102 8F08 0102 8506 0101 9F00 ]data drop ; : SndMonsExplode ( -- addr ) data[ 05C0 05DF E3F0 0204 C802 E7F9 0102 DFFF 0000 ]data drop ; : SndFire ( -- addr ) data[ 0388 0290 0102 8005 0102 840B 0102 8128 0101 9F00 ]data drop ; : SndGrabObject ( -- addr ) data[ 0388 0290 0102 8104 0102 8902 0102 8004 0101 9F00 ]data drop ; : SndFuelShip ( -- addr ) data[ 038A 0290 0102 8501 0103 8A02 9001 019F 0000 ]data drop ; : SndRockTakeoff ( -- addr ) data[ 03A0 0AB0 0101 BF01 03AF 08B0 0101 BF01 03A8 07B0 0101 BF01 03AF 05B0 0101 BF01 03AC 09B0 0101 BF01 03AF 08B0 0101 BF01 03A8 07B0 0101 BF01 03AF 05B0 0101 BF01 03A7 09B0 0101 BF01 03AF 08B0 0101 BF01 03A8 07B0 0101 BF01 03AF 05B0 0101 BF01 03A4 09B0 0101 BF01 03AF 08B0 0101 BF01 03A8 07B0 0101 BF01 03AF 05B0 0101 BF01 03AF 08B0 0101 BF01 03AF 08B0 0101 BF01 03A8 07B0 0101 BF01 03AF 05B0 0101 BF01 03AB 08B0 0101 BF01 03AF 08B0 0101 BF01 03A8 07B0 0101 BF01 03AF 05B0 0101 BF01 03A7 08B0 0101 BF01 03AF 08B0 0101 BF01 03A8 07B0 0101 BF01 03AF 05B0 0101 BF01 03A4 08B0 0101 BF01 03AF 08B0 0101 BF01 03A8 07B0 0101 BF01 03AF 05B0 0101 BF01 03AF 07B0 0101 BF01 03AF 08B0 0101 BF01 03A8 07B0 0101 BF01 03AF 05B0 0101 BF01 03AB 07B0 0101 BF01 03AF 08B0 0101 BF01 03A8 07B0 0101 BF01 03AF 05B0 0101 BF01 03A8 07B0 0101 BF01 03AF 08B0 0101 BF01 03A8 07B0 0101 BF01 03AF 05B0 0101 BF01 03A5 07B0 0101 BF01 03AF 08B0 0101 BF01 03A8 07B0 0101 BF01 03AF 05B0 0101 BF01 03A1 07B0 0101 BF01 03AF 08B0 0101 BF01 03A8 07B0 0101 BF01 03AF 05B0 0101 BF01 03AE 06B0 0101 BF01 03AF 08B0 0101 BF01 03A8 07B0 0101 BF01 03AF 05B0 0101 BF01 03AB 06B0 0101 BF01 03AF 08B0 0101 BF01 03A8 07B0 0101 BF01 03AF 05B0 0101 BF01 03A8 06B0 0101 BF01 03AF 08B0 0101 BF01 03A8 07B0 0101 BF01 03AF 05B0 0101 BF01 03A5 06B0 0101 BF01 03AF 08B0 0101 BF01 03A8 07B0 0101 BF01 03AF 05B0 0101 BF01 03A2 06B0 0101 BF01 03AF 08B0 0101 BF01 03A8 07B0 0101 BF01 03AF 05B0 0101 BF01 03AF 05B0 0101 BF01 03AF 08B0 0101 BF01 03A8 07B0 0101 BF01 03AF 05B0 0101 BF01 03AC 05B0 0101 BF01 03AF 08B0 0101 BF01 03A8 07B0 0101 BF01 03AF 05B0 0101 BF01 019F 0000 ]data drop ; : SndRockLand ( -- addr ) data[ 03AC 05B0 0101 BF01 03AF 08B0 0101 BF01 03A8 07B0 0101 BF01 03AF 05B0 0101 BF01 03AF 05B0 0101 BF01 03AF 08B0 0101 BF01 03A8 07B0 0101 BF01 03AF 05B0 0101 BF01 03A2 06B0 0101 BF01 03AF 08B0 0101 BF01 03A8 07B0 0101 BF01 03AF 05B0 0101 BF01 03A5 06B0 0101 BF01 03AF 08B0 0101 BF01 03A8 07B0 0101 BF01 03AF 05B0 0101 BF01 03A8 06B0 0101 BF01 03AF 08B0 0101 BF01 03A8 07B0 0101 BF01 03AF 05B0 0101 BF01 03AB 06B0 0101 BF01 03AF 08B0 0101 BF01 03A8 07B0 0101 BF01 03AF 05B0 0101 BF01 03AE 06B0 0101 BF01 03AF 08B0 0101 BF01 03A8 07B0 0101 BF01 03AF 05B0 0101 BF01 03A1 07B0 0101 BF01 03AF 08B0 0101 BF01 03A8 07B0 0101 BF01 03AF 05B0 0101 BF01 03A5 07B0 0101 BF01 03AF 08B0 0101 BF01 03A8 07B0 0101 BF01 03AF 05B0 0101 BF01 03A8 07B0 0101 BF01 03AF 08B0 0101 BF01 03A8 07B0 0101 BF01 03AF 05B0 0101 BF01 03AB 07B0 0101 BF01 03AF 08B0 0101 BF01 03A8 07B0 0101 BF01 03AF 05B0 0101 BF01 03AF 07B0 0101 BF01 03AF 08B0 0101 BF01 03A8 07B0 0101 BF01 03AF 05B0 0101 BF01 03A4 08B0 0101 BF01 03AF 08B0 0101 BF01 03A8 07B0 0101 BF01 03AF 05B0 0101 BF01 03A7 08B0 0101 BF01 03AF 08B0 0101 BF01 03A8 07B0 0101 BF01 03AF 05B0 0101 BF01 03AB 08B0 0101 BF01 03AF 08B0 0101 BF01 03A8 07B0 0101 BF01 03AF 05B0 0101 BF01 03AF 08B0 0101 BF01 03AF 08B0 0101 BF01 03A8 07B0 0101 BF01 03AF 05B0 0101 BF01 03A4 09B0 0101 BF01 03AF 08B0 0101 BF01 03A8 07B0 0101 BF01 03AF 05B0 0101 BF01 03A7 09B0 0101 BF01 03AF 08B0 0101 BF01 03A8 07B0 0101 BF01 03AF 05B0 0101 BF01 03AC 09B0 0101 BF01 03AF 08B0 0101 BF01 03A8 07B0 0101 BF01 03AF 05B0 0101 BF01 03A0 0AB0 0101 BF01 03AF 08B0 0101 BF01 03A8 07B0 0101 BF01 03AF 05B0 0101 BF00 ]data drop ; decimal 0 value score1 0 value score2 0 value highScore 4 value life1 4 value life2 -1 value player \ 1= -1 player, 0= 2 players -1 value playerUp \ -1= player 1 0= player 2 1 value input \ 1= keyboard, 2= joystick 1 value level \ game level 1 value level1 \ player 1 level 1 value level2 \ player 2 level 0 value 'inputMethod \ Holds the address of the selected input method 0 value 'scoreTurn \ Holds the address of the current player scoring routine 0 value 'lifeTurn \ Holds the address of the current player life count routine 160 value jetTopY \ Y coordinate of Jetman's top 176 value jetBotY \ Y coordinate of Jetman's bottom 128 value jetX \ Jetman's X coordinate -1 value walkFlag \ -1= walking right, 0= walking left -1 value strideFlag \ -1= short stride, 0= long stride -1 value groundFlag \ 0= in the air -1= on the ground 0 value groundBoost \ -1= boosting from ground 0= boosting in flight -1 value antennaFlag \ -1= antenna swinging 0= antenna to back 0 value fireFlag \ 0= no fire -1= fire 0 value rockSectFlag \ 0= middle rocket -1= top rocket 0 value jettisonFlag \ 0= rocket section not jettisoned -1 = jettisoned -1 value objGrabFlag \ -1= object not grabbed 0= object grabbed 0 value dropFlag \ 0= object not dropping -1= object dropping 0 value fuelFlag \ 0= not fuel phase -1= fuel phase -1 value fuel? \ -1= fuel tank not present 0= fuel tank present 0 value timingFrame \ animation frame counter 0 value explosionCount \ explosion frame counter -1 value rocketFuel \ rocket fuel level 176 value fuelChar \ character pointer for fuel level -1 value bonus? \ -1= bonus object not present 0= bonus object present 11 value bonusSprite \ Sprite number of bonus object 0 value boardFlag \ 0=Jetman not boarded -1=Jetman boarded 13 value rocketColor \ holds current rocket color 25 value monsterScore \ value of each monster kill 0 value bonusCount \ number of current bonus drops create mvx 4 cells allot \ horizontal monster sprite velocity array create mvy 4 cells allot \ vertical monster sprite velocity array create state1 10 cells allot \ play state for player 1 create state2 10 cells allot \ play state for player 2 \ Array operations : mvx! ( n cell# -- ) cells mvx + ! ; : mvx@ ( cell# -- n ) cells mvx + @ ; : mvy! ( n cell# -- ) cells mvy + ! ; : mvy@ ( cell# -- n ) cells mvy + @ ; : state1! ( n cell# -- ) cells state1 + ! ; : state1@ ( cell# -- n ) cells state1 + @ ; : state2! ( n cell# -- ) cells state2 + ! ; : state2@ ( cell# -- n ) cells state2 + @ ; hex \ Sound player routines (by Mark Wills) CODE: SoundListPlayer 02E0 2000 C000 1318 0280 0001 1611 D0B1 0982 1602 04C0 100B D831 8400 0602 16FC D0F1 0983 1602 04C0 1002 0200 0002 1004 0603 1602 0200 0001 02E0 83E0 045B ;CODE decimal : PlaySoundList ( soundaddress -- ) $2000 @ 0= if \ if r0 of ISR=0 (not playing a sound list) $2002 ! \ set R1 of user ISR workspace with sound list address 1 $2000 ! \ kick off sound processing else drop then ; \ Now, whenever interrupts fire, the user ISR will be called. \ interrupts are fired by most vdp accesses. \ Delay - includes a dummy vdp access to activate interrupts : Delay ( n -- ) 0 do 0 v@ drop loop ; \ Define character colors : CharacterColors ( -- ) 9 6 do i 11 1 color loop 16 8 do i 15 1 color loop 16 7 1 color 19 17 do i 15 1 color loop 19 15 1 color 20 10 1 color 21 3 1 color 22 13 1 color 23 13 1 color ; \ Player lose display : PlayerLose ( -- ) 9 4 32 6 hchar 12 15 32 4 hchar 6 24 32 6 hchar 22 4 do i 200 0 sprloc loop 17 21 32 6 vchar 17 22 32 6 vchar 6 13 gotoxy ." GAME OVER PLAYER" ; \ Score display routines : DisplayScore1 ( n -- ) +to score1 score1 2 1 gotoxy U. ; : DisplayScore2 ( n -- ) +to score2 score2 26 1 gotoxy U. ; : DisplayHScore ( score -- ) 14 1 gotoxy U. ; \ Display life remaining routine : DisplayLife1 ( n -- flag ) +to life1 0 8 life1 136 + 1 hchar 0 9 152 1 hchar life1 0= if -1 PlayerLose 13 23 137 1 hchar 20000 Delay else 0 then ; : DisplayLife2 ( n -- flag ) +to life2 0 21 life2 136 + 1 hchar 0 22 152 1 hchar life2 0= if -1 PlayerLose 13 23 138 1 hchar 20000 Delay else 0 then ; \ Display banner routine : DisplayBanner ( -- ) 0 3 137 1 hchar 0 4 85 1 hchar 0 5 80 1 hchar 0 DisplayLife1 player 0= if 0 DisplayLife2 then 0 15 128 1 hchar 0 16 129 1 hchar 0 27 138 1 hchar 0 28 85 1 hchar 0 29 80 1 hchar 1 1 gotoxy s" 000000 000000 000000" type highscore DisplayHScore ; \ Menu selections : Sel1Normal ( -- ) 7 6 137 1 hchar 7 7 32 3 hchar 7 10 137 1 hchar 11 7 gotoxy ." PLAYER GAME" ; : Sel1Inverse ( -- ) 7 6 147 1 hchar 7 7 123 3 hchar 7 10 147 1 hchar 11 7 gotoxy ." {player{game" ; : Sel2Normal ( -- ) 9 6 138 1 hchar 9 7 32 3 hchar 9 10 138 1 hchar 11 9 gotoxy ." PLAYER GAME" ; : Sel2Inverse ( -- ) 9 6 148 1 hchar 9 7 123 3 hchar 9 10 148 1 hchar 11 9 gotoxy ." {player{game" ; : Sel3Normal ( -- ) 11 6 139 1 hchar 11 7 32 3 hchar 10 11 gotoxy ." KEYBOARD" ; : Sel3Inverse ( -- ) 11 6 149 1 hchar 11 7 123 3 hchar 10 11 gotoxy ." keyboard" ; : Sel4Normal ( -- ) 13 6 140 1 hchar 13 7 32 3 hchar 10 13 gotoxy ." JOYSTICK" ; : Sel4Inverse ( -- ) 13 6 150 1 hchar 13 7 123 3 hchar 10 13 gotoxy ." joystick" ; : 1UpNormal ( -- ) 0 3 137 1 hchar 4 0 gotoxy ." UP" ; : 1UpInverse ( -- ) 0 3 147 1 hchar 4 0 gotoxy ." up" ; : 2UpNormal ( -- ) 0 27 138 1 hchar 28 0 gotoxy ." UP" ; : 2UpInverse ( -- ) 0 27 148 1 hchar 28 0 gotoxy ." up" ; \ Initialize the game : Init ( -- ) page 1 screen 2 magnify SpectrumFont HighScoreTitle ScoreNumbers LifeFigure GroundLeft GroundMiddle GroundRight PlatformLeft PlatformMiddle PlatformRight U1Char CharacterColors ; : PlayerTurn ( -- ) 4 0 do player 0= if playerUp if 2UpNormal 1UpNormal 1500 Delay 1UpInverse 1500 Delay else 1UpNormal 2UpNormal 1500 Delay 2UpInverse 1500 Delay then else 1UpNormal 1500 Delay 1UpInverse 1500 Delay then loop ; \ Initialize Jetman sprite : JetmanInit ( -- ) JetmanStandR 0 jetTopY jetX 256 15 sprite 1 jetBotY jetX 260 15 sprite -1 to groundFlag ; \ Display main game background : RocketSetup ( -- ) level 1 5 within if U1Bottom U1Middle U1Top else level 5 9 within if U2Bottom U2Middle U2Top else level 9 13 within if U3Bottom U3Middle U3Top else U4Bottom U4Middle U4Top then then then level 1 = level 5 = level 9 = level 13 = or or or if 4 56 48 sprloc 5 80 128 sprloc 6 168 168 sprloc else 6 168 168 sprloc 5 152 168 sprloc 4 136 168 sprloc then ; : GameBackground ( -- ) page DisplayBanner 9 4 168 1 hchar 9 5 169 4 hchar 9 9 170 1 hchar 12 15 168 1 hchar 12 16 169 2 hchar 12 18 170 1 hchar 6 24 168 1 hchar 6 25 169 4 hchar 6 29 170 1 hchar 23 0 160 1 hchar 23 1 161 30 hchar 23 31 162 1 hchar Blob Radioactive GoldBar Triangle Diamond Monster11 Monster11R 11 200 0 312 12 sprite 12 200 0 300 5 sprite 13 200 0 296 11 sprite 14 200 0 304 7 sprite 15 200 0 308 9 sprite U1Top 4 56 48 272 15 sprite U1Middle 5 80 128 276 15 sprite U1Bottom 6 168 168 280 15 sprite Fuel 10 200 0 292 13 sprite ; \ Jetman animation routines : CeilingCheck ( -- true/false ) jetTopY 104 161 within if 0 else jetTopY 16 <= 32 8 8 1 0 UnderSprite 0= 32 0 8 2 0 UnderSprite 0= 32 8 8 4 0 UnderSprite 0= 32 0 8 8 0 UnderSprite 0= 32 8 8 1 1 UnderSprite 0= 32 0 8 2 1 UnderSprite 0= or or or or or or then ; : FreeFall ( -- ) 0 3 0 sprvec 1 3 0 sprvec walkFlag if JetNoBoostR else JetNoBoostL then 0 2 sprmov 32 5 -1 1 1 UnderSprite 0= 32 3 -1 2 1 UnderSprite 0= or 0 sprloc? to jetX dup to jetTopY 104 160 within not and if -1 to groundFlag jetTopY 104 > if 0 160 jetX sprloc 1 176 jetX sprloc else jetTopY 40 < if 0 24 jetX sprloc 1 40 jetX sprloc else jetTopY 64 88 within if 0 72 jetX sprloc 1 88 jetX sprloc else 0 48 jetX sprloc 1 64 jetX sprloc then then then walkFlag if JetmanStandR else JetmanStandL then then ; : FreeFallR ( -- ) 0 3 3 sprvec 1 3 3 sprvec JetNoBoostR 0 2 sprmov 32 3 -1 2 1 UnderSprite 0= 32 5 -1 1 1 UnderSprite 0= or 0 sprloc? to jetX dup to jetTopY 104 160 within not and if -1 to groundFlag JetmanStandR jetTopY 104 > if 0 160 jetX sprloc 1 176 jetX sprloc else jetTopY 40 < if 0 24 jetX sprloc 1 40 jetX sprloc else jetTopY 64 88 within if 0 72 jetX sprloc 1 88 jetX sprloc else 0 48 jetX sprloc 1 64 jetX sprloc then then then else 32 8 4 2 0 UnderSprite 0= 32 8 4 8 0 UnderSprite 0= 32 8 4 2 1 UnderSprite 0= or or 0 sprloc? drop 104 160 within not and if 0 -3 -3 sprvec 1 -3 -3 sprvec 0 2 sprmov then then ; : FreeFallL ( -- ) 0 3 -3 sprvec 1 3 -3 sprvec JetNoBoostL 0 2 sprmov 32 5 -1 1 1 UnderSprite 0= 32 3 -1 2 1 UnderSprite 0= or 0 sprloc? to jetX dup to jetTopY 104 160 within not and if -1 to groundFlag JetmanStandL jetTopY 104 > if 0 160 jetX sprloc 1 176 jetX sprloc else jetTopY 40 < if 0 24 jetX sprloc 1 40 jetX sprloc else jetTopY 64 88 within if 0 72 jetX sprloc 1 88 jetX sprloc else 0 48 jetX sprloc 1 64 jetX sprloc then then then else 32 -1 4 1 0 UnderSprite 0= 32 -1 4 4 0 UnderSprite 0= 32 -1 4 1 1 UnderSprite 0= or or 0 sprloc? drop 104 160 within not and if 0 -3 3 sprvec 1 -3 3 sprvec 0 2 sprmov then then ; : WalkLeft ( -- ) groundFlag if walkFlag if JetmanStandL 0 to walkFlag -1 to strideFlag else 0 0 -3 sprvec 1 0 -3 sprvec 32 0 -1 1 1 UnderSprite 0= 32 5 -1 1 1 UnderSprite 0= 32 3 -1 2 1 UnderSprite 0= or or if strideFlag if timingFrame 2 mod 0= if JetmanTopL JetmanWalkLL 0 to strideFlag 0 2 sprmov then else timingFrame 2 mod 0= if JetmanWalkSL -1 to strideFlag 0 2 sprmov antennaFlag if JetmanTopL2 0 to antennaFlag else JetmanTopL1 -1 to antennaFlag then then then else 0 to groundFlag FreeFall then then else FreeFallL then ; : WalkRight ( -- ) groundFlag if walkFlag 0= if JetmanStandR -1 to walkFlag -1 to strideFlag else 0 0 3 sprvec 1 0 3 sprvec 32 5 -1 1 1 UnderSprite 0= 32 8 -1 2 1 UnderSprite 0= 32 3 -1 2 1 UnderSprite 0= or or if strideFlag if timingFrame 2 mod 0= if JetmanTopR JetmanWalkLR 0 to strideFlag 0 2 sprmov then else timingFrame 2 mod 0= if JetmanWalkSR -1 to strideFlag 0 2 sprmov antennaFlag if JetmanTopR2 0 to antennaFlag else JetmanTopR1 -1 to antennaFlag then then then else 0 to groundFlag FreeFall then then else FreeFallR then ; : BoostEffect ( -- ) groundBoost if explosionCount case 0 of Explosion3 1 +to explosionCount walkFlag if 2 jetBotY 8 - jetX 8 - 264 8 sprite 3 jetBotY 8 - jetX 8 + 268 8 sprite else 2 jetBotY 8 - jetX 264 8 sprite 3 jetBotY 8 - jetX 16 + 268 8 sprite then endof 1 of Explosion2 1 +to explosionCount endof 2 of Explosion1 1 +to explosionCount endof 3 of 2 200 0 sprloc 3 200 0 sprloc 0 to explosionCount 0 to groundBoost endof endcase then ; : Boost ( -- ) 0 sprloc? drop to jetTopY CeilingCheck if 0 1 0 sprvec 1 1 0 sprvec else 0 -3 0 sprvec 1 -3 0 sprvec then walkFlag if JetmanBoostR else JetmanBoostL then 0 sprloc? to jetX 16 + to jetBotY groundFlag if -1 to groundBoost then 0 to groundFlag 0 2 sprmov ; : BoostLeft ( -- ) JetmanTopL 0 sprloc? drop to jetTopY CeilingCheck if 0 1 1 sprvec 1 1 1 sprvec else 0 -3 -3 sprvec 1 -3 -3 sprvec then 0 sprloc? to jetX 16 + to jetBotY groundFlag if -1 to groundBoost then JetmanBoostL1 0 2 sprmov JetmanBoostL2 JetmanBoostL3 0 to groundFlag ; : BoostRight ( -- ) JetmanTopR 0 sprloc? drop to jetTopY CeilingCheck if 0 1 -1 sprvec 1 1 -1 sprvec else 0 -3 3 sprvec 1 -3 3 sprvec then 0 sprloc? to jetX 16 + to jetBotY groundFlag if -1 to groundBoost then JetmanBoostR1 0 2 sprmov JetmanBoostR2 jetmanBoostR3 0 to groundFlag ; \ Interaction with objects routines : DropObject ( target-y sprite -- target-y sprite/ none flag ) 0 dropFlag if drop 2dup dup 2 0 sprvec dup 1 sprmov sprloc? drop swap >= if dup >r swap 168 sprloc 0 to dropFlag -1 +to rockSectFlag rockSectFlag -1 < if -1 to fuelFlag -1 to fuel? r> 10 = if 10 200 0 sprloc 1 +to rocketFuel -1 else 0 then else r> drop 0 then else 0 then then ; : RocketCoinc ( -- target-y sprite / none ) dropFlag 0= if rockSectFlag 0= if objGrabFlag if 9 1 5 coinc if 0 to objGrabFlag SndGrabObject PlaySoundList 100 'scoreTurn execute then else 1 sprloc? 5 -rot swap 8 - swap dup >r sprloc r> 166 170 within if -1 to dropFlag 152 5 -1 to objGrabFlag then then else rockSectFlag -1 = if objGrabFlag if 9 1 4 coinc if 0 to objGrabFlag SndGrabObject PlaySoundList 100 'scoreTurn execute then else 1 sprloc? 4 -rot swap 8 - swap dup >r sprloc r> 166 170 within if -1 to dropFlag 136 4 -1 to objGrabFlag then then then then then ; : RocketDrop ( -- ) jettisonFlag if rockSectFlag 0= if 5 2 0 sprvec 32 0 0 4 5 UnderSprite 0= 32 8 0 8 5 UnderSprite 0= or if 0 to jettisonFlag else 5 1 sprmov then else rockSectFlag -1 = if 4 2 0 sprvec 32 0 0 4 4 UnderSprite 0= 32 8 0 8 4 UnderSprite 0= or if 0 to jettisonFLag else 4 1 sprmov then then then then ; : FuelFall ( -- ) fuelFlag if fuel? if begin 240 rnd dup 150 186 within if drop false else true then until 10 17 rot sprloc 0 to fuel? then 32 0 4 4 10 UnderSprite 0<> 32 8 4 8 10 UnderSprite 0<> and if 10 2 0 sprvec 10 1 sprmov then then ; : FuelCoinc ( -- target-Y sprite / none ) fuelFlag if objGrabFlag if 9 1 10 coinc if 0 to objGrabFlag SndGrabFuel PlaySoundList 100 'scoreTurn execute then else 1 sprloc? 10 -rot swap 3 - swap dup >r sprloc r> 166 172 within if -1 to dropFlag -1 to objGrabFlag 179 10 0 to fuelFlag then then then ; : FuelRocket ( flag -- ) if SndFuelShip PlaySoundList 22 rocketFuel - 21 fuelChar 1 hchar 22 rocketFuel - 22 fuelChar 1 + 1 hchar fuelChar case 176 of level 1 5 within if U1BottomStatic else level 5 9 within if U2BottomStatic else level 9 13 within if U3BottomStatic else U4BottomStatic then then then endof 178 of 6 200 0 sprloc endof 180 of level 1 5 within if U1MiddleStatic else level 5 9 within if U2MiddleStatic else level 9 13 within if U3MiddleStatic else U4MiddleStatic then then then endof 182 of 5 200 0 sprloc endof 184 of level 1 5 within if U1TopStatic else level 5 9 within if U2TopStatic else level 9 13 within if U3TopStatic else U4TopStatic then then then endof 186 of 4 200 0 sprloc endof endcase 2 +to fuelChar then ; : BonusFall ( -- flag ) rocketFuel 5 < bonusCount 4 < and bonus? 0= or if 0 bonus? if timingFrame 500 mod 0= if begin 240 rnd dup 150 186 within if drop false else true then until 1 +to bonusCount bonusSprite 17 rot sprloc 0 to bonus? drop -1 then else 32 0 -1 4 bonusSprite UnderSprite 0<> 32 8 -1 8 bonusSprite UnderSprite 0<> and if bonusSprite 1 0 sprvec bonusSprite 1 sprmov then drop -1 then else bonus? if 0 else -1 then then ; : BonusCoinc ( flag -- ) if 9 1 bonusSprite coinc 9 0 bonusSprite coinc or if bonusSprite 200 0 sprloc 1 +to bonusSprite -1 to bonus? bonusSprite 16 = if 11 to bonusSprite then SndGrabObject PlaySoundList 250 'scoreTurn execute then then ; \ Rocket operations : CheckBoarding ( -- ) boardFlag 0= rocketFuel 5 = and if 0 to fuelFlag 0 sprloc? 168 172 within swap 129 161 within and if U1Top U1Middle U1Bottom 0 200 0 sprloc 1 200 0 sprloc 7 4 do i 13 sprcol i -1 0 sprvec loop -1 to boardFlag 6 168 168 sprloc 5 152 168 sprloc 4 136 168 sprloc 6 0 do 22 i - 21 32 2 hchar loop RocketFlame1 16 184 168 316 8 sprite 16 -1 0 sprvec then then ; : TakeOff ( -- flag ) 0 boardFlag if SndRockTakeoff PlaySoundList begin 4 sprloc? drop 3 > while rocketColor 13 = if 15 to rocketColor RocketFlame2 else 13 to rocketColor RocketFlame1 then 4 3 sprmov 16 1 sprmov 7 4 do i rocketColor sprcol loop 135 Delay repeat drop -1 then ; \ Monster routines : MonsterDir ( sprite -- ) >r 3 rnd case 0 of -2 r@ 17 - mvy! endof 1 of 0 r@ 17 - mvy! endof 2 of 2 r@ 17 - mvy! endof endcase 2 rnd 0= if -2 r@ 17 - mvx! else 2 r@ 17 - mvx! then r@ dup 17 - mvy@ r> 17 - mvx@ sprvec ; : InitMonster ( sprite -- ) dup >r level case 1 of Monster11 Monster11R MonsterDir 25 to monsterScore endof 2 of Monster21 Monster21R MonsterDir 50 to monsterScore endof 3 of Monster31 Monster31R MonsterDir 50 to monsterScore endof 4 of Monster4 Monster4R MonsterDir 75 to monsterScore endof 5 of Monster5 Monster5R MonsterDir 100 to monsterScore endof 6 of Monster6 Monster6R MonsterDir 50 to monsterScore endof 7 of Monster7 Monster7R MonsterDir 25 to monsterScore endof 8 of Monster8 Monster8R MonsterDir 100 to monsterScore endof 9 of Monster11 Monster11R MonsterDir 25 to monsterScore endof 10 of Monster21 Monster21R MonsterDir 50 to monsterScore endof 11 of Monster31 Monster31R MonsterDir 50 to monsterScore endof 12 of Monster4 Monster4R MonsterDir 75 to monsterScore endof 13 of Monster5 Monster5R MonsterDir 100 to monsterScore endof 14 of Monster6 Monster6R MonsterDir 50 to monsterScore endof 15 of Monster7 Monster7R MonsterDir 25 to monsterScore endof 16 of Monster8 Monster8R MonsterDir 100 to monsterScore endof endcase r@ 152 rnd 16 + r> 17 - mvx@ -2 = if 255 324 else 0 320 then 12 rnd 2 + sprite ; : SetupMonsters ( -- ) 22 17 do i InitMonster loop ; : MoveMonsters ( -- ) level case 1 of timingFrame 2 mod 0= if Monster11 Monster11R else Monster12 Monster12R then endof 2 of timingFrame 2 mod 0= if Monster21 Monster21R else Monster22 Monster22R then endof 3 of timingFrame 2 mod 0= if Monster31 Monster31R else Monster32 Monster32R then endof 9 of timingFrame 2 mod 0= if Monster11 Monster11R else Monster12 Monster12R then endof 10 of timingFrame 2 mod 0= if Monster21 Monster21R else Monster22 Monster22R then endof 11 of timingFrame 2 mod 0= if Monster31 Monster31R else Monster32 Monster32R then endof endcase 17 5 sprmov ; : MonsterCrash ( sprite -- ) dup sprloc? 2dup Explosion3 2 -rot 264 8 sprite 3 -rot 16 + 268 8 sprite 25 Delay Explosion2 25 Delay Explosion1 25 Delay 2 200 0 sprloc 3 200 0 sprloc InitMonster ; : MonTerrainColl ( sprite -- flag ) dup >r sprloc? drop 16 < 32 0 8 1 r@ UnderSprite 0= 32 8 8 2 r@ UnderSprite 0= 32 0 0 1 r@ UnderSprite 0= 32 8 0 2 r@ UnderSprite 0= 32 0 0 4 r@ UnderSprite 0= 32 8 0 8 r> UnderSprite 0= or or or or or or ; : CrashB ( -- ) 22 17 do i MonTerrainColl if i MonsterCrash then loop ; : BounceB ( -- ) 22 17 do i MonTerrainColl if i 17 - mvy@ -2 = if i 2 i 17 - mvx@ sprvec 2 i 17 - mvy! else i 17 - mvy@ 2 = if i -2 i 17 - mvx@ sprvec -2 i 17 - mvy! else i MonsterCrash then then then loop ; : SeekerCrashB ( -- ) 22 17 do i MonTerrainColl if i MonsterCrash else 0 sprloc? drop i sprloc? drop swap < if i 2 i 17 - mvx@ sprvec 2 i 17 - mvy! else i -2 i 17 - mvx@ sprvec -2 i 17 - mvy! then then loop ; : SeekerBounceB ( -- ) 22 17 do i MonTerrainColl if i 17 - mvy@ -2 = if i 2 i 17 - mvx@ sprvec 2 i 17 - mvy! else i 17 - mvy@ 2 = if i -2 i 17 - mvx@ sprvec -2 i 17 - mvy! else i MonsterCrash then then else 0 sprloc? drop i sprloc? drop swap < if i 2 i 17 - mvx@ sprvec 2 i 17 - mvy! else i -2 i 17 - mvx@ sprvec -2 i 17 - mvy! then then loop ; create monsterStyles \ create array of execution addresses: ' CrashB , ' BounceB , ' BounceB , ' SeekerCrashB , ' SeekerBounceB , ' BounceB , ' CrashB , ' SeekerBounceB , ' CrashB , ' BounceB , ' BounceB , ' SeekerCrashB , ' SeekerBounceB , ' BounceB , ' CrashB , ' SeekerBounceB , : MonsterBehavior ( -- ) level 1- cells monsterStyles + @ execute ; \ Laser fire routines : LaserInit ( -- ) LaserFire1 LaserFire2 7 200 0 288 8 sprite 8 200 0 284 8 sprite 9 200 0 284 8 sprite ; : Fire ( -- ) fireFlag if 0 sprloc? to jetX to jetTopY jetTopY 16 + to jetBotY walkFlag if 7 jetTopY 2 + jetX 16 + sprloc 8 jetTopY 2 + jetX 32 + sprloc 9 jetTopY 2 + jetX 48 + sprloc 7 0 16 sprvec 8 0 16 sprvec 9 0 16 sprvec 7 3 sprmov else 7 jetTopY 2 + jetX 16 - sprloc 8 jetTopY 2 + jetX 32 - sprloc 9 jetTopY 2 + jetX 48 - sprloc 7 0 -16 sprvec 8 0 -16 sprvec 9 0 -16 sprvec 7 3 sprmov then SndFire PlaySoundList 22 17 do 8 7 i coinc 8 8 i coinc 8 9 i coinc or or if SndMonsExplode PlaySoundList i MonsterCrash monsterScore 'scoreTurn execute leave then loop 7 200 0 sprloc 8 200 0 sprloc 9 200 0 sprloc then ; \ Input methods : KeyboardInput ( -- ) $0100 kmode ! 0 to fireFlag key? case 4 of $0200 kmode ! key? 12 = if -1 to fireFlag then BoostLeft 0 to walkFlag MoveMonsters endof 6 of $0200 kmode ! key? 12 = if -1 to fireFlag then BoostRight -1 to walkFlag MoveMonsters endof 5 of $0200 kmode ! key? 12 = if -1 to fireFlag then Boost MoveMonsters endof 2 of $0200 kmode ! key? 12 = if -1 to fireFlag then WalkLeft 0 to walkFlag MoveMonsters endof 12 of $0200 kmode ! key? 12 = if -1 to fireFlag then WalkRight -1 to walkFlag MoveMonsters endof -1 of $0200 kmode ! key? 12 = if -1 to fireFlag then groundFlag 0= if FreeFall then MoveMonsters endof groundFlag 0= if FreeFall MoveMonsters then endcase ; : JoystickInput ( -- ) 0 to fireFlag 0 joyst case 16 of Boost MoveMonsters endof 18 of BoostLeft 0 to walkFlag MoveMonsters endof 20 of BoostRight -1 to walkFlag MoveMonsters endof 2 of 0 to walkFlag WalkLeft MoveMonsters endof 4 of -1 to walkFlag WalkRight MoveMonsters endof 17 of -1 to fireFlag Boost MoveMonsters endof 19 of -1 to fireFlag BoostLeft 0 to walkFlag MoveMonsters endof 21 of -1 to fireFlag BoostRight -1 to walkFlag MoveMonsters endof 3 of 0 to walkFlag -1 to fireFlag WalkLeft MoveMonsters endof 5 of -1 to walkFlag -1 to fireFlag WalkRight MoveMonsters endof 1 of -1 to fireFlag groundFlag 0= if FreeFall MoveMonsters then endof groundFlag 0= if FreeFall MoveMonsters then endcase ; \ Display selection screen : SelectionScreen ( -- ) Init DisplayBanner $0500 kmode ! 6 4 gotoxy ." JETPAC GAME SELECTION" Sel1Normal Sel2Normal Sel3Normal Sel4Normal 18 6 141 1 hchar 10 18 gotoxy ." START GAME" 22 0 127 1 hchar 22 1 137 1 hchar 22 2 145 1 hchar 22 3 144 1 hchar 22 4 139 1 hchar 6 22 gotoxy ." A C G ALL RIGHTS RESERVED" 22 7 146 1 hchar 22 9 146 1 hchar 22 11 146 1 hchar ['] KeyboardInput to 'inputMethod ['] DisplayScore1 to 'scoreTurn ['] DisplayLife1 to 'lifeTurn 0 begin dup 0= if player if Sel2Normal Sel1Inverse else Sel1Normal Sel2Inverse then input 1 = if Sel4Normal Sel3Inverse else Sel3Normal Sel4Inverse then 1000 delay player if Sel1Normal else Sel2Normal then input 1 = if Sel3Normal else Sel4Normal then then 1+ 100 mod key? case 49 of -1 to player false endof 50 of 0 to player false endof 51 of 1 to input ['] KeyboardInput to 'inputMethod false endof 52 of 2 to input ['] JoystickInput to 'inputMethod false endof 53 of true endof false swap endcase until drop ; \ Game initialization routines : SaveState ( -- ) playerUp if RockSectFlag 0 state1! fuelFlag 1 state1! rocketFuel 2 state1! fuelChar 3 state1! 4 sprloc? 4 state1! 5 state1! 5 sprloc? 6 state1! 7 state1! 6 sprloc? 8 state1! 9 state1! jettisonFlag 10 state1! else RockSectFlag 0 state2! fuelFlag 1 state2! rocketFuel 2 state2! fuelChar 3 state2! 4 sprloc? 4 state2! 5 state2! 5 sprloc? 6 state2! 7 state2! 6 sprloc? 8 state2! 9 state2! jettisonFlag 10 state2! then ; : RecallState ( -- ) playerUp if 0 state1@ to RockSectFlag 1 state1@ to fuelFlag 2 state1@ to rocketFuel 3 state1@ to fuelChar 4 5 state1@ 4 state1@ sprloc 5 7 state1@ 6 state1@ sprloc 6 9 state1@ 8 state1@ sprloc 10 state1@ to jettisonFlag else 0 state2@ to RockSectFlag 1 state2@ to fuelFlag 2 state2@ to rocketFuel 3 state2@ to fuelChar 4 5 state2@ 4 state2@ sprloc 5 7 state2@ 6 state2@ sprloc 6 9 state2@ 8 state2@ sprloc 10 state2@ to jettisonFlag then ; : SetupState ( -- ) RecallState level 1 5 within if U1Bottom U1Middle U1Top else level 5 9 within if U2Bottom U2Middle U2Top else level 9 13 within if U3Bottom U3Middle U3Top else U4Bottom U4Middle U4Top then then then 23 16 do i 21 32 2 hchar loop 22 10 do i 200 0 sprloc loop rocketFuel -1 > if 176 to fuelChar rocketFuel 0 to rocketFuel 1 + 0 do -1 FuelRocket 1 +to rocketFuel loop -1 +to rocketFuel then ; : ResetLevelData ( -- ) 160 to jetTopY 176 to jetBotY 128 to jetX -1 to walkFlag -1 to strideFlag -1 to groundFlag -1 to antennaFlag 0 to fireFlag 0 to jettisonFlag 0 to bonusCount level 1 = level 5 = level 9 = level 13 = or or or if 0 to rockSectFlag 0 to fuelFlag else -2 to rockSectFlag -1 to fuelFlag then -1 to objGrabFlag 0 to dropFlag -1 to fuel? 0 to timingFrame 0 to explosionCount -1 to rocketFuel 176 to fuelChar -1 to bonus? 0 to boardFlag 13 to rocketColor ; : ResetGameData ( -- ) ResetLevelData 0 to score1 0 to score2 11 to bonusSprite 1 to level1 1 to level2 -1 to playerUp 1 to level 4 to life1 4 to life2 -1 to player 1 to input ; : SwitchPlayers ( -- ) playerUp if highScore score1 < if score1 to highScore then SaveState life2 0> if 0 to playerUp ['] DisplayScore2 to 'scoreTurn ['] DisplayLife2 to 'lifeTurn level2 to level SetupState then else highScore score2 < if score2 to highScore then SaveState life1 0> if -1 to playerUp ['] DisplayScore1 to 'scoreTurn ['] DisplayLife1 to 'lifeTurn level1 to level SetupState then then ; : InitLevel ( -- ) 22 4 do i 200 0 sprloc loop RocketSetup ResetLevelData highScore DisplayHScore PlayerTurn JetmanInit SetupMonsters ; : ResetGame ( -- ) PlayerUp if highScore score1 < if score1 to highScore then else highScore score2 < if score2 to highScore then then ResetGameData ResetLevelData page SelectionScreen GameBackground highScore DisplayHScore SaveState 0 to playerUp SaveState -1 to playerUp PlayerTurn SetupMonsters JetmanInit ; : ResumeGame ( -- ) player if PlayerTurn -1 to walkFlag 160 to jetTopY 176 to jetBotY 128 to jetX JetmanInit else rockSectFlag -1 < fuelFlag 0= and if -1 to fuelFlag then SwitchPlayers 160 to jetTopY 176 to jetBotY 128 to jetX -1 to walkFlag -1 to strideFlag -1 to groundFlag -1 to antennaFlag 0 to fireFlag -1 to objGrabFlag 0 to dropFlag -1 to fuel? 0 to timingFrame 0 to explosionCount -1 to bonus? 0 to boardFlag 13 to rocketColor 13 6 32 18 hchar 9 4 168 1 hchar 9 5 169 4 hchar 9 9 170 1 hchar 12 15 168 1 hchar 12 16 169 2 hchar 12 18 170 1 hchar 6 24 168 1 hchar 6 25 169 4 hchar 6 29 170 1 hchar 23 0 160 1 hchar 23 1 161 30 hchar 23 31 162 1 hchar PlayerTurn JetmanInit SetupMonsters then ; \ Player killed by monster : MonsterKill ( -- ) 22 17 do 8 i 0 coinc 8 i 1 coinc or if SndMonsExplode PlaySoundList 0 200 0 sprloc 1 200 0 sprloc objGrabFlag 0= if -1 to objGrabFlag fuelFlag if 10 sprloc? 10 -rot sprloc else -1 to jettisonFlag rockSectFlag 0= if 5 sprloc? 5 -rot sprloc else rockSectFlag -1 = if 4 sprloc? 4 -rot sprloc then then then then i MonsterCrash -1 'lifeTurn execute if player if ResetGame else life1 0= life2 0= and if ResetGame else ResumeGame then then else ResumeGame then leave then loop ; \ Level complete : Land ( flag -- ) if 22 17 do i 200 0 sprloc loop 16 11 do i 200 0 sprloc loop 7 4 do i 15 sprcol i 1 0 sprvec loop 16 1 0 sprvec SndRockLand PlaySoundList begin 4 3 sprmov 16 1 sprmov 65 Delay RocketFlame1 65 Delay RocketFlame2 6 sprloc? drop 168 = if 16 200 0 sprloc true else false then until playerUp if level1 4 = level1 8 = level1 12 = level1 16 = or or or if 1 'lifeTurn execute then 1 +to level1 level1 16 > if 1 to level1 then level1 to level highScore score1 < if score1 to highScore then else level2 4 = level2 8 = level2 12 = level2 16 = or or or if 1 'lifeTurn execute then 1 +to level2 level2 16 > if 1 to level 2 then level2 to level highScore score2 < if score2 to highScore then then InitLevel then ; \ Main game loop : Jetpac ( -- ) $83C2 0! \ Corrects initialization error by TF $2000 32 0 fill \ clear workspace of the user isr routine. \ load user ISR hook with address of the machine code. \ note: user ISR hook expects physical machine code address, *not* a CFA: ['] soundListPlayer 2+ $a008 ! true zeros ! DisplaySplash SelectionScreen GameBackground LaserInit PlayerTurn JetmanInit SetupMonsters SaveState 0 to playerUp SaveState -1 to playerUp begin 1 +to timingFrame MoveMonsters boardFlag 0= if 'inputMethod execute then BoostEffect RocketCoinc FuelFall FuelCoinc DropObject FuelRocket BonusFall BonusCoinc MonsterBehavior Fire MonsterKill RocketDrop CheckBoarding TakeOff Land again ;