├── level-a ├── level-b ├── level-c ├── level-d ├── level-e ├── level-f ├── level-g ├── level-h ├── level-i ├── level-j ├── pdrv-vic ├── music0.vic ├── music1.vic ├── gfxfont.prg ├── pdrv_vic.bin ├── tileset.vic ├── README.md ├── LICENSE ├── BACKGROUND_TASKS.ASM └── VICROBOTS.ASM /level-a: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zeropolis79/PETSCIIRobots-Vic20/HEAD/level-a -------------------------------------------------------------------------------- /level-b: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zeropolis79/PETSCIIRobots-Vic20/HEAD/level-b -------------------------------------------------------------------------------- /level-c: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zeropolis79/PETSCIIRobots-Vic20/HEAD/level-c -------------------------------------------------------------------------------- /level-d: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zeropolis79/PETSCIIRobots-Vic20/HEAD/level-d -------------------------------------------------------------------------------- /level-e: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zeropolis79/PETSCIIRobots-Vic20/HEAD/level-e -------------------------------------------------------------------------------- /level-f: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zeropolis79/PETSCIIRobots-Vic20/HEAD/level-f -------------------------------------------------------------------------------- /level-g: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zeropolis79/PETSCIIRobots-Vic20/HEAD/level-g -------------------------------------------------------------------------------- /level-h: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zeropolis79/PETSCIIRobots-Vic20/HEAD/level-h -------------------------------------------------------------------------------- /level-i: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zeropolis79/PETSCIIRobots-Vic20/HEAD/level-i -------------------------------------------------------------------------------- /level-j: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zeropolis79/PETSCIIRobots-Vic20/HEAD/level-j -------------------------------------------------------------------------------- /pdrv-vic: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zeropolis79/PETSCIIRobots-Vic20/HEAD/pdrv-vic -------------------------------------------------------------------------------- /music0.vic: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zeropolis79/PETSCIIRobots-Vic20/HEAD/music0.vic -------------------------------------------------------------------------------- /music1.vic: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zeropolis79/PETSCIIRobots-Vic20/HEAD/music1.vic -------------------------------------------------------------------------------- /gfxfont.prg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zeropolis79/PETSCIIRobots-Vic20/HEAD/gfxfont.prg -------------------------------------------------------------------------------- /pdrv_vic.bin: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zeropolis79/PETSCIIRobots-Vic20/HEAD/pdrv_vic.bin -------------------------------------------------------------------------------- /tileset.vic: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zeropolis79/PETSCIIRobots-Vic20/HEAD/tileset.vic -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # PETSCIIRobots-Vic20 2 | Attack of the Petscii Robots VIC-20 Source Code 3 | The Attack of the PETSCII Robots source code has been provided by David Murray for the purposes of study and also to provide information to those who would like to port 4 | the game to other systems. This code may NOT be used to produce unofficial copies for sale and he code must NOT be modified in anyway unless adding a feature, in which both 5 | the source and compiled versions must be sent to David Murray. 6 | 7 | Due to time constraints, David Murray will NOT be prodiving support. He has gladly given permission for me to host this. 8 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | GNU GENERAL PUBLIC LICENSE 2 | Version 3, 29 June 2007 3 | 4 | Copyright (C) 2007 Free Software Foundation, Inc. 5 | Everyone is permitted to copy and distribute verbatim copies 6 | of this license document, but changing it is not allowed. 7 | 8 | Preamble 9 | 10 | The GNU General Public License is a free, copyleft license for 11 | software and other kinds of works. 12 | 13 | The licenses for most software and other practical works are designed 14 | to take away your freedom to share and change the works. By contrast, 15 | the GNU General Public License is intended to guarantee your freedom to 16 | share and change all versions of a program--to make sure it remains free 17 | software for all its users. We, the Free Software Foundation, use the 18 | GNU General Public License for most of our software; it applies also to 19 | any other work released this way by its authors. You can apply it to 20 | your programs, too. 21 | 22 | When we speak of free software, we are referring to freedom, not 23 | price. Our General Public Licenses are designed to make sure that you 24 | have the freedom to distribute copies of free software (and charge for 25 | them if you wish), that you receive source code or can get it if you 26 | want it, that you can change the software or use pieces of it in new 27 | free programs, and that you know you can do these things. 28 | 29 | To protect your rights, we need to prevent others from denying you 30 | these rights or asking you to surrender the rights. Therefore, you have 31 | certain responsibilities if you distribute copies of the software, or if 32 | you modify it: responsibilities to respect the freedom of others. 33 | 34 | For example, if you distribute copies of such a program, whether 35 | gratis or for a fee, you must pass on to the recipients the same 36 | freedoms that you received. You must make sure that they, too, receive 37 | or can get the source code. And you must show them these terms so they 38 | know their rights. 39 | 40 | Developers that use the GNU GPL protect your rights with two steps: 41 | (1) assert copyright on the software, and (2) offer you this License 42 | giving you legal permission to copy, distribute and/or modify it. 43 | 44 | For the developers' and authors' protection, the GPL clearly explains 45 | that there is no warranty for this free software. For both users' and 46 | authors' sake, the GPL requires that modified versions be marked as 47 | changed, so that their problems will not be attributed erroneously to 48 | authors of previous versions. 49 | 50 | Some devices are designed to deny users access to install or run 51 | modified versions of the software inside them, although the manufacturer 52 | can do so. This is fundamentally incompatible with the aim of 53 | protecting users' freedom to change the software. The systematic 54 | pattern of such abuse occurs in the area of products for individuals to 55 | use, which is precisely where it is most unacceptable. Therefore, we 56 | have designed this version of the GPL to prohibit the practice for those 57 | products. If such problems arise substantially in other domains, we 58 | stand ready to extend this provision to those domains in future versions 59 | of the GPL, as needed to protect the freedom of users. 60 | 61 | Finally, every program is threatened constantly by software patents. 62 | States should not allow patents to restrict development and use of 63 | software on general-purpose computers, but in those that do, we wish to 64 | avoid the special danger that patents applied to a free program could 65 | make it effectively proprietary. To prevent this, the GPL assures that 66 | patents cannot be used to render the program non-free. 67 | 68 | The precise terms and conditions for copying, distribution and 69 | modification follow. 70 | 71 | TERMS AND CONDITIONS 72 | 73 | 0. Definitions. 74 | 75 | "This License" refers to version 3 of the GNU General Public License. 76 | 77 | "Copyright" also means copyright-like laws that apply to other kinds of 78 | works, such as semiconductor masks. 79 | 80 | "The Program" refers to any copyrightable work licensed under this 81 | License. Each licensee is addressed as "you". "Licensees" and 82 | "recipients" may be individuals or organizations. 83 | 84 | To "modify" a work means to copy from or adapt all or part of the work 85 | in a fashion requiring copyright permission, other than the making of an 86 | exact copy. The resulting work is called a "modified version" of the 87 | earlier work or a work "based on" the earlier work. 88 | 89 | A "covered work" means either the unmodified Program or a work based 90 | on the Program. 91 | 92 | To "propagate" a work means to do anything with it that, without 93 | permission, would make you directly or secondarily liable for 94 | infringement under applicable copyright law, except executing it on a 95 | computer or modifying a private copy. Propagation includes copying, 96 | distribution (with or without modification), making available to the 97 | public, and in some countries other activities as well. 98 | 99 | To "convey" a work means any kind of propagation that enables other 100 | parties to make or receive copies. Mere interaction with a user through 101 | a computer network, with no transfer of a copy, is not conveying. 102 | 103 | An interactive user interface displays "Appropriate Legal Notices" 104 | to the extent that it includes a convenient and prominently visible 105 | feature that (1) displays an appropriate copyright notice, and (2) 106 | tells the user that there is no warranty for the work (except to the 107 | extent that warranties are provided), that licensees may convey the 108 | work under this License, and how to view a copy of this License. If 109 | the interface presents a list of user commands or options, such as a 110 | menu, a prominent item in the list meets this criterion. 111 | 112 | 1. Source Code. 113 | 114 | The "source code" for a work means the preferred form of the work 115 | for making modifications to it. "Object code" means any non-source 116 | form of a work. 117 | 118 | A "Standard Interface" means an interface that either is an official 119 | standard defined by a recognized standards body, or, in the case of 120 | interfaces specified for a particular programming language, one that 121 | is widely used among developers working in that language. 122 | 123 | The "System Libraries" of an executable work include anything, other 124 | than the work as a whole, that (a) is included in the normal form of 125 | packaging a Major Component, but which is not part of that Major 126 | Component, and (b) serves only to enable use of the work with that 127 | Major Component, or to implement a Standard Interface for which an 128 | implementation is available to the public in source code form. A 129 | "Major Component", in this context, means a major essential component 130 | (kernel, window system, and so on) of the specific operating system 131 | (if any) on which the executable work runs, or a compiler used to 132 | produce the work, or an object code interpreter used to run it. 133 | 134 | The "Corresponding Source" for a work in object code form means all 135 | the source code needed to generate, install, and (for an executable 136 | work) run the object code and to modify the work, including scripts to 137 | control those activities. However, it does not include the work's 138 | System Libraries, or general-purpose tools or generally available free 139 | programs which are used unmodified in performing those activities but 140 | which are not part of the work. For example, Corresponding Source 141 | includes interface definition files associated with source files for 142 | the work, and the source code for shared libraries and dynamically 143 | linked subprograms that the work is specifically designed to require, 144 | such as by intimate data communication or control flow between those 145 | subprograms and other parts of the work. 146 | 147 | The Corresponding Source need not include anything that users 148 | can regenerate automatically from other parts of the Corresponding 149 | Source. 150 | 151 | The Corresponding Source for a work in source code form is that 152 | same work. 153 | 154 | 2. Basic Permissions. 155 | 156 | All rights granted under this License are granted for the term of 157 | copyright on the Program, and are irrevocable provided the stated 158 | conditions are met. This License explicitly affirms your unlimited 159 | permission to run the unmodified Program. The output from running a 160 | covered work is covered by this License only if the output, given its 161 | content, constitutes a covered work. This License acknowledges your 162 | rights of fair use or other equivalent, as provided by copyright law. 163 | 164 | You may make, run and propagate covered works that you do not 165 | convey, without conditions so long as your license otherwise remains 166 | in force. You may convey covered works to others for the sole purpose 167 | of having them make modifications exclusively for you, or provide you 168 | with facilities for running those works, provided that you comply with 169 | the terms of this License in conveying all material for which you do 170 | not control copyright. Those thus making or running the covered works 171 | for you must do so exclusively on your behalf, under your direction 172 | and control, on terms that prohibit them from making any copies of 173 | your copyrighted material outside their relationship with you. 174 | 175 | Conveying under any other circumstances is permitted solely under 176 | the conditions stated below. Sublicensing is not allowed; section 10 177 | makes it unnecessary. 178 | 179 | 3. Protecting Users' Legal Rights From Anti-Circumvention Law. 180 | 181 | No covered work shall be deemed part of an effective technological 182 | measure under any applicable law fulfilling obligations under article 183 | 11 of the WIPO copyright treaty adopted on 20 December 1996, or 184 | similar laws prohibiting or restricting circumvention of such 185 | measures. 186 | 187 | When you convey a covered work, you waive any legal power to forbid 188 | circumvention of technological measures to the extent such circumvention 189 | is effected by exercising rights under this License with respect to 190 | the covered work, and you disclaim any intention to limit operation or 191 | modification of the work as a means of enforcing, against the work's 192 | users, your or third parties' legal rights to forbid circumvention of 193 | technological measures. 194 | 195 | 4. Conveying Verbatim Copies. 196 | 197 | You may convey verbatim copies of the Program's source code as you 198 | receive it, in any medium, provided that you conspicuously and 199 | appropriately publish on each copy an appropriate copyright notice; 200 | keep intact all notices stating that this License and any 201 | non-permissive terms added in accord with section 7 apply to the code; 202 | keep intact all notices of the absence of any warranty; and give all 203 | recipients a copy of this License along with the Program. 204 | 205 | You may charge any price or no price for each copy that you convey, 206 | and you may offer support or warranty protection for a fee. 207 | 208 | 5. Conveying Modified Source Versions. 209 | 210 | You may convey a work based on the Program, or the modifications to 211 | produce it from the Program, in the form of source code under the 212 | terms of section 4, provided that you also meet all of these conditions: 213 | 214 | a) The work must carry prominent notices stating that you modified 215 | it, and giving a relevant date. 216 | 217 | b) The work must carry prominent notices stating that it is 218 | released under this License and any conditions added under section 219 | 7. This requirement modifies the requirement in section 4 to 220 | "keep intact all notices". 221 | 222 | c) You must license the entire work, as a whole, under this 223 | License to anyone who comes into possession of a copy. This 224 | License will therefore apply, along with any applicable section 7 225 | additional terms, to the whole of the work, and all its parts, 226 | regardless of how they are packaged. This License gives no 227 | permission to license the work in any other way, but it does not 228 | invalidate such permission if you have separately received it. 229 | 230 | d) If the work has interactive user interfaces, each must display 231 | Appropriate Legal Notices; however, if the Program has interactive 232 | interfaces that do not display Appropriate Legal Notices, your 233 | work need not make them do so. 234 | 235 | A compilation of a covered work with other separate and independent 236 | works, which are not by their nature extensions of the covered work, 237 | and which are not combined with it such as to form a larger program, 238 | in or on a volume of a storage or distribution medium, is called an 239 | "aggregate" if the compilation and its resulting copyright are not 240 | used to limit the access or legal rights of the compilation's users 241 | beyond what the individual works permit. Inclusion of a covered work 242 | in an aggregate does not cause this License to apply to the other 243 | parts of the aggregate. 244 | 245 | 6. Conveying Non-Source Forms. 246 | 247 | You may convey a covered work in object code form under the terms 248 | of sections 4 and 5, provided that you also convey the 249 | machine-readable Corresponding Source under the terms of this License, 250 | in one of these ways: 251 | 252 | a) Convey the object code in, or embodied in, a physical product 253 | (including a physical distribution medium), accompanied by the 254 | Corresponding Source fixed on a durable physical medium 255 | customarily used for software interchange. 256 | 257 | b) Convey the object code in, or embodied in, a physical product 258 | (including a physical distribution medium), accompanied by a 259 | written offer, valid for at least three years and valid for as 260 | long as you offer spare parts or customer support for that product 261 | model, to give anyone who possesses the object code either (1) a 262 | copy of the Corresponding Source for all the software in the 263 | product that is covered by this License, on a durable physical 264 | medium customarily used for software interchange, for a price no 265 | more than your reasonable cost of physically performing this 266 | conveying of source, or (2) access to copy the 267 | Corresponding Source from a network server at no charge. 268 | 269 | c) Convey individual copies of the object code with a copy of the 270 | written offer to provide the Corresponding Source. This 271 | alternative is allowed only occasionally and noncommercially, and 272 | only if you received the object code with such an offer, in accord 273 | with subsection 6b. 274 | 275 | d) Convey the object code by offering access from a designated 276 | place (gratis or for a charge), and offer equivalent access to the 277 | Corresponding Source in the same way through the same place at no 278 | further charge. You need not require recipients to copy the 279 | Corresponding Source along with the object code. If the place to 280 | copy the object code is a network server, the Corresponding Source 281 | may be on a different server (operated by you or a third party) 282 | that supports equivalent copying facilities, provided you maintain 283 | clear directions next to the object code saying where to find the 284 | Corresponding Source. Regardless of what server hosts the 285 | Corresponding Source, you remain obligated to ensure that it is 286 | available for as long as needed to satisfy these requirements. 287 | 288 | e) Convey the object code using peer-to-peer transmission, provided 289 | you inform other peers where the object code and Corresponding 290 | Source of the work are being offered to the general public at no 291 | charge under subsection 6d. 292 | 293 | A separable portion of the object code, whose source code is excluded 294 | from the Corresponding Source as a System Library, need not be 295 | included in conveying the object code work. 296 | 297 | A "User Product" is either (1) a "consumer product", which means any 298 | tangible personal property which is normally used for personal, family, 299 | or household purposes, or (2) anything designed or sold for incorporation 300 | into a dwelling. In determining whether a product is a consumer product, 301 | doubtful cases shall be resolved in favor of coverage. For a particular 302 | product received by a particular user, "normally used" refers to a 303 | typical or common use of that class of product, regardless of the status 304 | of the particular user or of the way in which the particular user 305 | actually uses, or expects or is expected to use, the product. A product 306 | is a consumer product regardless of whether the product has substantial 307 | commercial, industrial or non-consumer uses, unless such uses represent 308 | the only significant mode of use of the product. 309 | 310 | "Installation Information" for a User Product means any methods, 311 | procedures, authorization keys, or other information required to install 312 | and execute modified versions of a covered work in that User Product from 313 | a modified version of its Corresponding Source. The information must 314 | suffice to ensure that the continued functioning of the modified object 315 | code is in no case prevented or interfered with solely because 316 | modification has been made. 317 | 318 | If you convey an object code work under this section in, or with, or 319 | specifically for use in, a User Product, and the conveying occurs as 320 | part of a transaction in which the right of possession and use of the 321 | User Product is transferred to the recipient in perpetuity or for a 322 | fixed term (regardless of how the transaction is characterized), the 323 | Corresponding Source conveyed under this section must be accompanied 324 | by the Installation Information. But this requirement does not apply 325 | if neither you nor any third party retains the ability to install 326 | modified object code on the User Product (for example, the work has 327 | been installed in ROM). 328 | 329 | The requirement to provide Installation Information does not include a 330 | requirement to continue to provide support service, warranty, or updates 331 | for a work that has been modified or installed by the recipient, or for 332 | the User Product in which it has been modified or installed. Access to a 333 | network may be denied when the modification itself materially and 334 | adversely affects the operation of the network or violates the rules and 335 | protocols for communication across the network. 336 | 337 | Corresponding Source conveyed, and Installation Information provided, 338 | in accord with this section must be in a format that is publicly 339 | documented (and with an implementation available to the public in 340 | source code form), and must require no special password or key for 341 | unpacking, reading or copying. 342 | 343 | 7. Additional Terms. 344 | 345 | "Additional permissions" are terms that supplement the terms of this 346 | License by making exceptions from one or more of its conditions. 347 | Additional permissions that are applicable to the entire Program shall 348 | be treated as though they were included in this License, to the extent 349 | that they are valid under applicable law. If additional permissions 350 | apply only to part of the Program, that part may be used separately 351 | under those permissions, but the entire Program remains governed by 352 | this License without regard to the additional permissions. 353 | 354 | When you convey a copy of a covered work, you may at your option 355 | remove any additional permissions from that copy, or from any part of 356 | it. (Additional permissions may be written to require their own 357 | removal in certain cases when you modify the work.) You may place 358 | additional permissions on material, added by you to a covered work, 359 | for which you have or can give appropriate copyright permission. 360 | 361 | Notwithstanding any other provision of this License, for material you 362 | add to a covered work, you may (if authorized by the copyright holders of 363 | that material) supplement the terms of this License with terms: 364 | 365 | a) Disclaiming warranty or limiting liability differently from the 366 | terms of sections 15 and 16 of this License; or 367 | 368 | b) Requiring preservation of specified reasonable legal notices or 369 | author attributions in that material or in the Appropriate Legal 370 | Notices displayed by works containing it; or 371 | 372 | c) Prohibiting misrepresentation of the origin of that material, or 373 | requiring that modified versions of such material be marked in 374 | reasonable ways as different from the original version; or 375 | 376 | d) Limiting the use for publicity purposes of names of licensors or 377 | authors of the material; or 378 | 379 | e) Declining to grant rights under trademark law for use of some 380 | trade names, trademarks, or service marks; or 381 | 382 | f) Requiring indemnification of licensors and authors of that 383 | material by anyone who conveys the material (or modified versions of 384 | it) with contractual assumptions of liability to the recipient, for 385 | any liability that these contractual assumptions directly impose on 386 | those licensors and authors. 387 | 388 | All other non-permissive additional terms are considered "further 389 | restrictions" within the meaning of section 10. If the Program as you 390 | received it, or any part of it, contains a notice stating that it is 391 | governed by this License along with a term that is a further 392 | restriction, you may remove that term. If a license document contains 393 | a further restriction but permits relicensing or conveying under this 394 | License, you may add to a covered work material governed by the terms 395 | of that license document, provided that the further restriction does 396 | not survive such relicensing or conveying. 397 | 398 | If you add terms to a covered work in accord with this section, you 399 | must place, in the relevant source files, a statement of the 400 | additional terms that apply to those files, or a notice indicating 401 | where to find the applicable terms. 402 | 403 | Additional terms, permissive or non-permissive, may be stated in the 404 | form of a separately written license, or stated as exceptions; 405 | the above requirements apply either way. 406 | 407 | 8. Termination. 408 | 409 | You may not propagate or modify a covered work except as expressly 410 | provided under this License. Any attempt otherwise to propagate or 411 | modify it is void, and will automatically terminate your rights under 412 | this License (including any patent licenses granted under the third 413 | paragraph of section 11). 414 | 415 | However, if you cease all violation of this License, then your 416 | license from a particular copyright holder is reinstated (a) 417 | provisionally, unless and until the copyright holder explicitly and 418 | finally terminates your license, and (b) permanently, if the copyright 419 | holder fails to notify you of the violation by some reasonable means 420 | prior to 60 days after the cessation. 421 | 422 | Moreover, your license from a particular copyright holder is 423 | reinstated permanently if the copyright holder notifies you of the 424 | violation by some reasonable means, this is the first time you have 425 | received notice of violation of this License (for any work) from that 426 | copyright holder, and you cure the violation prior to 30 days after 427 | your receipt of the notice. 428 | 429 | Termination of your rights under this section does not terminate the 430 | licenses of parties who have received copies or rights from you under 431 | this License. If your rights have been terminated and not permanently 432 | reinstated, you do not qualify to receive new licenses for the same 433 | material under section 10. 434 | 435 | 9. Acceptance Not Required for Having Copies. 436 | 437 | You are not required to accept this License in order to receive or 438 | run a copy of the Program. Ancillary propagation of a covered work 439 | occurring solely as a consequence of using peer-to-peer transmission 440 | to receive a copy likewise does not require acceptance. However, 441 | nothing other than this License grants you permission to propagate or 442 | modify any covered work. These actions infringe copyright if you do 443 | not accept this License. Therefore, by modifying or propagating a 444 | covered work, you indicate your acceptance of this License to do so. 445 | 446 | 10. Automatic Licensing of Downstream Recipients. 447 | 448 | Each time you convey a covered work, the recipient automatically 449 | receives a license from the original licensors, to run, modify and 450 | propagate that work, subject to this License. You are not responsible 451 | for enforcing compliance by third parties with this License. 452 | 453 | An "entity transaction" is a transaction transferring control of an 454 | organization, or substantially all assets of one, or subdividing an 455 | organization, or merging organizations. If propagation of a covered 456 | work results from an entity transaction, each party to that 457 | transaction who receives a copy of the work also receives whatever 458 | licenses to the work the party's predecessor in interest had or could 459 | give under the previous paragraph, plus a right to possession of the 460 | Corresponding Source of the work from the predecessor in interest, if 461 | the predecessor has it or can get it with reasonable efforts. 462 | 463 | You may not impose any further restrictions on the exercise of the 464 | rights granted or affirmed under this License. For example, you may 465 | not impose a license fee, royalty, or other charge for exercise of 466 | rights granted under this License, and you may not initiate litigation 467 | (including a cross-claim or counterclaim in a lawsuit) alleging that 468 | any patent claim is infringed by making, using, selling, offering for 469 | sale, or importing the Program or any portion of it. 470 | 471 | 11. Patents. 472 | 473 | A "contributor" is a copyright holder who authorizes use under this 474 | License of the Program or a work on which the Program is based. The 475 | work thus licensed is called the contributor's "contributor version". 476 | 477 | A contributor's "essential patent claims" are all patent claims 478 | owned or controlled by the contributor, whether already acquired or 479 | hereafter acquired, that would be infringed by some manner, permitted 480 | by this License, of making, using, or selling its contributor version, 481 | but do not include claims that would be infringed only as a 482 | consequence of further modification of the contributor version. For 483 | purposes of this definition, "control" includes the right to grant 484 | patent sublicenses in a manner consistent with the requirements of 485 | this License. 486 | 487 | Each contributor grants you a non-exclusive, worldwide, royalty-free 488 | patent license under the contributor's essential patent claims, to 489 | make, use, sell, offer for sale, import and otherwise run, modify and 490 | propagate the contents of its contributor version. 491 | 492 | In the following three paragraphs, a "patent license" is any express 493 | agreement or commitment, however denominated, not to enforce a patent 494 | (such as an express permission to practice a patent or covenant not to 495 | sue for patent infringement). To "grant" such a patent license to a 496 | party means to make such an agreement or commitment not to enforce a 497 | patent against the party. 498 | 499 | If you convey a covered work, knowingly relying on a patent license, 500 | and the Corresponding Source of the work is not available for anyone 501 | to copy, free of charge and under the terms of this License, through a 502 | publicly available network server or other readily accessible means, 503 | then you must either (1) cause the Corresponding Source to be so 504 | available, or (2) arrange to deprive yourself of the benefit of the 505 | patent license for this particular work, or (3) arrange, in a manner 506 | consistent with the requirements of this License, to extend the patent 507 | license to downstream recipients. "Knowingly relying" means you have 508 | actual knowledge that, but for the patent license, your conveying the 509 | covered work in a country, or your recipient's use of the covered work 510 | in a country, would infringe one or more identifiable patents in that 511 | country that you have reason to believe are valid. 512 | 513 | If, pursuant to or in connection with a single transaction or 514 | arrangement, you convey, or propagate by procuring conveyance of, a 515 | covered work, and grant a patent license to some of the parties 516 | receiving the covered work authorizing them to use, propagate, modify 517 | or convey a specific copy of the covered work, then the patent license 518 | you grant is automatically extended to all recipients of the covered 519 | work and works based on it. 520 | 521 | A patent license is "discriminatory" if it does not include within 522 | the scope of its coverage, prohibits the exercise of, or is 523 | conditioned on the non-exercise of one or more of the rights that are 524 | specifically granted under this License. You may not convey a covered 525 | work if you are a party to an arrangement with a third party that is 526 | in the business of distributing software, under which you make payment 527 | to the third party based on the extent of your activity of conveying 528 | the work, and under which the third party grants, to any of the 529 | parties who would receive the covered work from you, a discriminatory 530 | patent license (a) in connection with copies of the covered work 531 | conveyed by you (or copies made from those copies), or (b) primarily 532 | for and in connection with specific products or compilations that 533 | contain the covered work, unless you entered into that arrangement, 534 | or that patent license was granted, prior to 28 March 2007. 535 | 536 | Nothing in this License shall be construed as excluding or limiting 537 | any implied license or other defenses to infringement that may 538 | otherwise be available to you under applicable patent law. 539 | 540 | 12. No Surrender of Others' Freedom. 541 | 542 | If conditions are imposed on you (whether by court order, agreement or 543 | otherwise) that contradict the conditions of this License, they do not 544 | excuse you from the conditions of this License. If you cannot convey a 545 | covered work so as to satisfy simultaneously your obligations under this 546 | License and any other pertinent obligations, then as a consequence you may 547 | not convey it at all. For example, if you agree to terms that obligate you 548 | to collect a royalty for further conveying from those to whom you convey 549 | the Program, the only way you could satisfy both those terms and this 550 | License would be to refrain entirely from conveying the Program. 551 | 552 | 13. Use with the GNU Affero General Public License. 553 | 554 | Notwithstanding any other provision of this License, you have 555 | permission to link or combine any covered work with a work licensed 556 | under version 3 of the GNU Affero General Public License into a single 557 | combined work, and to convey the resulting work. The terms of this 558 | License will continue to apply to the part which is the covered work, 559 | but the special requirements of the GNU Affero General Public License, 560 | section 13, concerning interaction through a network will apply to the 561 | combination as such. 562 | 563 | 14. Revised Versions of this License. 564 | 565 | The Free Software Foundation may publish revised and/or new versions of 566 | the GNU General Public License from time to time. Such new versions will 567 | be similar in spirit to the present version, but may differ in detail to 568 | address new problems or concerns. 569 | 570 | Each version is given a distinguishing version number. If the 571 | Program specifies that a certain numbered version of the GNU General 572 | Public License "or any later version" applies to it, you have the 573 | option of following the terms and conditions either of that numbered 574 | version or of any later version published by the Free Software 575 | Foundation. If the Program does not specify a version number of the 576 | GNU General Public License, you may choose any version ever published 577 | by the Free Software Foundation. 578 | 579 | If the Program specifies that a proxy can decide which future 580 | versions of the GNU General Public License can be used, that proxy's 581 | public statement of acceptance of a version permanently authorizes you 582 | to choose that version for the Program. 583 | 584 | Later license versions may give you additional or different 585 | permissions. However, no additional obligations are imposed on any 586 | author or copyright holder as a result of your choosing to follow a 587 | later version. 588 | 589 | 15. Disclaimer of Warranty. 590 | 591 | THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY 592 | APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT 593 | HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY 594 | OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, 595 | THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR 596 | PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM 597 | IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF 598 | ALL NECESSARY SERVICING, REPAIR OR CORRECTION. 599 | 600 | 16. Limitation of Liability. 601 | 602 | IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING 603 | WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS 604 | THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY 605 | GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE 606 | USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF 607 | DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD 608 | PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), 609 | EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF 610 | SUCH DAMAGES. 611 | 612 | 17. Interpretation of Sections 15 and 16. 613 | 614 | If the disclaimer of warranty and limitation of liability provided 615 | above cannot be given local legal effect according to their terms, 616 | reviewing courts shall apply local law that most closely approximates 617 | an absolute waiver of all civil liability in connection with the 618 | Program, unless a warranty or assumption of liability accompanies a 619 | copy of the Program in return for a fee. 620 | 621 | END OF TERMS AND CONDITIONS 622 | 623 | How to Apply These Terms to Your New Programs 624 | 625 | If you develop a new program, and you want it to be of the greatest 626 | possible use to the public, the best way to achieve this is to make it 627 | free software which everyone can redistribute and change under these terms. 628 | 629 | To do so, attach the following notices to the program. It is safest 630 | to attach them to the start of each source file to most effectively 631 | state the exclusion of warranty; and each file should have at least 632 | the "copyright" line and a pointer to where the full notice is found. 633 | 634 | 635 | Copyright (C) 636 | 637 | This program is free software: you can redistribute it and/or modify 638 | it under the terms of the GNU General Public License as published by 639 | the Free Software Foundation, either version 3 of the License, or 640 | (at your option) any later version. 641 | 642 | This program is distributed in the hope that it will be useful, 643 | but WITHOUT ANY WARRANTY; without even the implied warranty of 644 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 645 | GNU General Public License for more details. 646 | 647 | You should have received a copy of the GNU General Public License 648 | along with this program. If not, see . 649 | 650 | Also add information on how to contact you by electronic and paper mail. 651 | 652 | If the program does terminal interaction, make it output a short 653 | notice like this when it starts in an interactive mode: 654 | 655 | Copyright (C) 656 | This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'. 657 | This is free software, and you are welcome to redistribute it 658 | under certain conditions; type `show c' for details. 659 | 660 | The hypothetical commands `show w' and `show c' should show the appropriate 661 | parts of the General Public License. Of course, your program's commands 662 | might be different; for a GUI interface, you would use an "about box". 663 | 664 | You should also get your employer (if you work as a programmer) or school, 665 | if any, to sign a "copyright disclaimer" for the program, if necessary. 666 | For more information on this, and how to apply and follow the GNU GPL, see 667 | . 668 | 669 | The GNU General Public License does not permit incorporating your program 670 | into proprietary programs. If your program is a subroutine library, you 671 | may consider it more useful to permit linking proprietary applications with 672 | the library. If this is what you want to do, use the GNU Lesser General 673 | Public License instead of this License. But first, please read 674 | . 675 | -------------------------------------------------------------------------------- /BACKGROUND_TASKS.ASM: -------------------------------------------------------------------------------- 1 | BACKGROUND_TASKS: 2 | LDA REDRAW_WINDOW 3 | CMP #1 4 | BNE UNIT_AI 5 | LDA BGTIMER1 6 | CMP #1 7 | BNE UNIT_AI 8 | LDA #0 9 | STA REDRAW_WINDOW 10 | JSR DRAW_MAP_WINDOW 11 | UNIT_AI: 12 | ;Now check to see if it is time to run background tasks 13 | LDA BGTIMER1 14 | CMP #1 15 | BEQ AI000 16 | RTS 17 | AI000: LDA #0 18 | STA BGTIMER1 ;RESET BACKGROUND TIMER 19 | ;INC $83C0 ;-TROUBLESHOOTING 20 | LDX #$FF 21 | STA UNIT 22 | AILP: INC UNIT ;ALL AI routines must JMP back to here at the end. 23 | LDX UNIT 24 | CPX #64 ;END OF UNITS 25 | BNE AI001 26 | RTS ;RETURN CONTROL TO MAIN PROGRAM 27 | AI001: LDA UNIT_TYPE,X 28 | CMP #0 ;Does unit exist? 29 | BNE AI002 30 | JMP AILP 31 | AI002: ;Unit found to exist, now check it's timer. 32 | ;unit code won't run until timer hits zero. 33 | LDA UNIT_TIMER_A,X 34 | CMP #0 35 | BEQ AI003 36 | DEC UNIT_TIMER_A,X ;Decrease timer by one. 37 | JMP AILP 38 | AI003: ;Unit exists and timer has triggered 39 | ;The unit type determines which AI routine is run. 40 | LDA UNIT_TYPE,X 41 | CMP #24 ;MAX DIFFERENT UNIT TYPES IN CHART 42 | BCS AILP ;ABORT IF GREATER 43 | TAY 44 | LDA AI_ROUTINE_CHART_L,Y 45 | STA AI004+1 46 | LDA AI_ROUTINE_CHART_H,Y 47 | STA AI004+2 48 | AI004: JMP $0000 ;***self modifying code used here*** 49 | 50 | AI_ROUTINE_CHART_L: 51 | !BYTE DUMMY_ROUTINE ;UNIT TYPE 00 ;non-existent unit 78 | !BYTE >DUMMY_ROUTINE ;UNIT TYPE 01 ;player unit - can't use 79 | !BYTE >LEFT_RIGHT_DROID ;UNIT TYPE 02 80 | !BYTE >UP_DOWN_DROID ;UNIT TYPE 03 81 | !BYTE >HOVER_ATTACK ;UNIT TYPE 04 82 | !BYTE >WATER_DROID ;UNIT TYPE 05 83 | !BYTE >TIME_BOMB ;UNIT TYPE 06 84 | !BYTE >TRANSPORTER_PAD ;UNIT TYPE 07 85 | !BYTE >DEAD_ROBOT ;UNIT TYPE 08 86 | !BYTE >EVILBOT ;UNIT TYPE 09 87 | !BYTE >AI_DOOR ;UNIT TYPE 10 88 | !BYTE >SMALL_EXPLOSION ;UNIT TYPE 11 89 | !BYTE >PISTOL_FIRE_UP ;UNIT TYPE 12 90 | !BYTE >PISTOL_FIRE_DOWN ;UNIT TYPE 13 91 | !BYTE >PISTOL_FIRE_LEFT ;UNIT TYPE 14 92 | !BYTE >PISTOL_FIRE_RIGHT ;UNIT TYPE 15 93 | !BYTE >TRASH_COMPACTOR ;UNIT TYPE 16 94 | !BYTE >UP_DOWN_ROLLERBOT ;UNIT TYPE 17 95 | !BYTE >LEFT_RIGHT_ROLLERBOT ;UNIT TYPE 18 96 | !BYTE >ELEVATOR ;UNIT TYPE 19 97 | !BYTE >MAGNET ;UNIT TYPE 20 98 | !BYTE >MAGNETIZED_ROBOT ;UNIT TYPE 21 99 | !BYTE >WATER_RAFT_LR ;UNIT TYPE 22 100 | !BYTE >DEMATERIALIZE ;UNIT TYPE 23 101 | 102 | ;Dummy routine does nothing, but I need it for development. 103 | DUMMY_ROUTINE: 104 | JMP AILP 105 | 106 | WATER_RAFT_LR: 107 | LDA #0 108 | ;First check which direction raft is moving. 109 | LDX UNIT 110 | LDA UNIT_A,X 111 | CMP #1 112 | BEQ RAFT_RIGHT 113 | JMP RAFT_LEFT 114 | RAFT_RIGHT: 115 | JSR RAFT_DELETE 116 | ;Check to see if player is on raft 117 | LDA UNIT_LOC_X,X ;raft 118 | CMP UNIT_LOC_X ;player 119 | BNE WARF05 120 | LDA UNIT_LOC_Y,X ;raft 121 | CMP UNIT_LOC_Y ;player 122 | BNE WARF05 123 | INC UNIT_LOC_X ;player 124 | INC UNIT_LOC_X,X ;raft 125 | JSR RAFT_PLOT 126 | JSR CACULATE_AND_REDRAW 127 | JMP WARF5B 128 | WARF05: INC UNIT_LOC_X,X ;raft 129 | JSR RAFT_PLOT 130 | ;Now check if it has reached its destination 131 | JSR CHECK_FOR_WINDOW_REDRAW 132 | WARF5B: LDX UNIT 133 | LDA UNIT_LOC_X,X 134 | CMP UNIT_C,X 135 | BEQ WARF06 136 | LDA #6 137 | STA UNIT_TIMER_A,X 138 | JMP AILP 139 | WARF06: LDA #100 140 | STA UNIT_TIMER_A,X 141 | LDA #0 142 | STA UNIT_A,X 143 | JMP AILP 144 | 145 | RAFT_LEFT: 146 | JSR RAFT_DELETE 147 | ;Check to see if player is on raft 148 | LDA UNIT_LOC_X,X ;raft 149 | CMP UNIT_LOC_X ;player 150 | BNE WARF07 151 | LDA UNIT_LOC_Y,X ;raft 152 | CMP UNIT_LOC_Y ;player 153 | BNE WARF07 154 | DEC UNIT_LOC_X ;player 155 | DEC UNIT_LOC_X,X ;raft 156 | JSR RAFT_PLOT 157 | JSR CACULATE_AND_REDRAW 158 | JMP WARF7B 159 | WARF07: DEC UNIT_LOC_X,X ;raft 160 | JSR RAFT_PLOT 161 | ;Now check if it has reached its destination 162 | JSR CHECK_FOR_WINDOW_REDRAW 163 | WARF7B: LDX UNIT 164 | ;Now check if it has reached its destination 165 | LDA UNIT_LOC_X,X 166 | CMP UNIT_B,X 167 | BEQ WARF08 168 | LDA #6 169 | STA UNIT_TIMER_A,X 170 | JMP AILP 171 | WARF08: LDA #100 172 | STA UNIT_TIMER_A,X 173 | LDA #1 174 | STA UNIT_A,X 175 | JMP AILP 176 | 177 | RAFT_DELETE: 178 | LDA UNIT_LOC_X,X 179 | STA MAP_X 180 | LDA UNIT_LOC_Y,X 181 | STA MAP_Y 182 | LDA #204 ;WATER TILE 183 | STA TILE 184 | JSR PLOT_TILE_TO_MAP 185 | RTS 186 | 187 | RAFT_PLOT: 188 | LDA UNIT_LOC_X,X 189 | STA MAP_X 190 | LDA UNIT_LOC_Y,X 191 | STA MAP_Y 192 | LDA #242 ;RAFT TILE 193 | STA TILE 194 | JSR PLOT_TILE_TO_MAP 195 | RTS 196 | 197 | 198 | MAGNETIZED_ROBOT: 199 | LDA #%00000001 200 | STA MOVE_TYPE 201 | JSR GENERATE_RANDOM_NUMBER 202 | LDA RANDOM 203 | AND #%00000011 204 | CMP #00 205 | BEQ MAGRO1 206 | CMP #01 207 | BEQ MAGRO2 208 | CMP #02 209 | BEQ MAGRO3 210 | CMP #03 211 | BEQ MAGRO4 212 | MAGRO1: JSR REQUEST_WALK_UP 213 | JMP MAGR10 214 | MAGRO2: JSR REQUEST_WALK_DOWN 215 | JMP MAGR10 216 | MAGRO3: JSR REQUEST_WALK_LEFT 217 | JMP MAGR10 218 | MAGRO4: JSR REQUEST_WALK_RIGHT 219 | MAGR10: JSR CHECK_FOR_WINDOW_REDRAW 220 | LDX UNIT 221 | LDA #10 222 | STA UNIT_TIMER_A,X 223 | DEC UNIT_TIMER_B,X 224 | LDA UNIT_TIMER_B,X 225 | CMP #0 226 | BNE MAGR11 227 | LDA UNIT_D,X 228 | STA UNIT_TYPE,X 229 | MAGR11: JMP AILP 230 | 231 | GENERATE_RANDOM_NUMBER: 232 | LDA RANDOM 233 | BEQ DOEOR ;added this 234 | ASL 235 | BCC NOEOR 236 | DOEOR: EOR #$1D 237 | NOEOR: STA RANDOM 238 | RTS 239 | 240 | MAGNET: 241 | ;First let's take care of the timers. This unit runs 242 | ;every cycle so that it can detect contact with another 243 | ;unit. But it still needs to count down to terminate 244 | ;So, it uses two timers for a 16-bit value. 245 | LDX UNIT 246 | DEC UNIT_TIMER_B,X 247 | LDA UNIT_TIMER_B,X 248 | CMP #0 249 | BNE MAGN1 250 | DEC UNIT_A,X 251 | LDA UNIT_A,X 252 | CMP #0 253 | BNE MAGN1 254 | ;Both timers have reached zero, time to deactivate. 255 | MAGN0: LDX UNIT 256 | LDA #0 257 | STA UNIT_TYPE,X 258 | STA MAGNET_ACT 259 | JMP AILP 260 | MAGN1: ;Now let's see if another units walks on the magnet. 261 | LDA UNIT_LOC_X,X 262 | STA MAP_X 263 | LDA UNIT_LOC_Y,X 264 | STA MAP_Y 265 | JSR CHECK_FOR_UNIT 266 | LDA UNIT_FIND 267 | CMP #255 ;no unit found 268 | BEQ MAGN2 269 | CMP #0 ;player unit 270 | BEQ MAGN3 271 | JMP MAGN4 272 | MAGN2: JMP AILP 273 | MAGN3: INC INV_MAGNET 274 | JSR DISPLAY_ITEM 275 | JMP MAGN0 276 | MAGN4: ;Collision with robot detected. 277 | LDA #4 ;HAYWIRE SOUND 278 | JSR PLAY_SOUND ;SOUND PLAY 279 | LDX UNIT_FIND 280 | LDA UNIT_TYPE,X 281 | STA UNIT_D,X ;make backup of unit type 282 | LDA #21 ;Crazy robot AI 283 | STA UNIT_TYPE,X 284 | LDA #60 285 | STA UNIT_TIMER_B,X 286 | LDX UNIT 287 | JMP MAGN0 288 | 289 | DEAD_ROBOT: 290 | LDX UNIT 291 | LDA #0 292 | STA UNIT_TYPE,X 293 | JMP AILP 294 | 295 | UP_DOWN_ROLLERBOT: 296 | LDX UNIT 297 | LDA #7 298 | STA UNIT_TIMER_A,X 299 | JSR ROLLERBOT_ANIMATE 300 | LDX UNIT 301 | LDA UNIT_A,X ;GET DIRECTION 302 | CMP #1 ;0=UP 1=DOWN 303 | BEQ UDR01 304 | LDA #%00000001 305 | STA MOVE_TYPE 306 | JSR REQUEST_WALK_UP 307 | LDA MOVE_RESULT 308 | CMP #1 309 | BEQ UDR02 310 | LDA #1 311 | LDX UNIT 312 | STA UNIT_A,X ;CHANGE DIRECTION 313 | JSR ROLLERBOT_FIRE_DETECT 314 | JSR CHECK_FOR_WINDOW_REDRAW 315 | JMP AILP 316 | UDR01: LDA #%00000001 317 | STA MOVE_TYPE 318 | JSR REQUEST_WALK_DOWN 319 | LDA MOVE_RESULT 320 | CMP #1 321 | BEQ UDR02 322 | LDA #0 323 | LDX UNIT 324 | STA UNIT_A,X ;CHANGE DIRECTION 325 | UDR02: JSR ROLLERBOT_FIRE_DETECT 326 | JSR CHECK_FOR_WINDOW_REDRAW 327 | JMP AILP 328 | 329 | LEFT_RIGHT_ROLLERBOT: 330 | LDX UNIT 331 | LDA #7 332 | STA UNIT_TIMER_A,X 333 | JSR ROLLERBOT_ANIMATE 334 | LDX UNIT 335 | LDA UNIT_A,X ;GET DIRECTION 336 | CMP #1 ;0=LEFT 1=RIGHT 337 | BEQ LRR01 338 | LDA #%00000001 339 | STA MOVE_TYPE 340 | JSR REQUEST_WALK_LEFT 341 | LDA MOVE_RESULT 342 | CMP #1 343 | BEQ LRR02 344 | LDA #1 345 | LDX UNIT 346 | STA UNIT_A,X ;CHANGE DIRECTION 347 | JSR ROLLERBOT_FIRE_DETECT 348 | JSR CHECK_FOR_WINDOW_REDRAW 349 | JMP AILP 350 | LRR01: LDA #%00000001 351 | STA MOVE_TYPE 352 | JSR REQUEST_WALK_RIGHT 353 | LDA MOVE_RESULT 354 | CMP #1 355 | BEQ LRR02 356 | LDA #0 357 | LDX UNIT 358 | STA UNIT_A,X ;CHANGE DIRECTION 359 | LRR02: JSR ROLLERBOT_FIRE_DETECT 360 | JSR CHECK_FOR_WINDOW_REDRAW 361 | JMP AILP 362 | 363 | ROLLERBOT_FIRE_DETECT: 364 | LDA UNIT_LOC_X,X 365 | STA TEMP_A 366 | LDA UNIT_LOC_Y,X 367 | STA TEMP_B 368 | ;See if we're lined up vertically 369 | LDA UNIT_LOC_Y,X ;robot 370 | CMP UNIT_LOC_Y ;player 371 | BNE RFDE2 372 | JMP ROLLERBOT_FIRE_LR 373 | RFDE2: ;See if we're lined up horizontally 374 | LDA UNIT_LOC_X,X ;robot 375 | CMP UNIT_LOC_X ;player 376 | BNE RFDE3 377 | JMP ROLLERBOT_FIRE_UD 378 | RFDE3: RTS 379 | 380 | ROLLERBOT_FIRE_LR: 381 | LDA UNIT_LOC_X,X 382 | CMP UNIT_LOC_X 383 | BCC RBFLR2 384 | JMP ROLLERBOT_FIRE_LEFT 385 | RBFLR2: JMP ROLLERBOT_FIRE_RIGHT 386 | 387 | ROLLERBOT_FIRE_LEFT: 388 | ;Check to see if distance is less than 5 389 | LDA UNIT_LOC_X,X ;robot 390 | SEC 391 | SBC UNIT_LOC_X ;player 392 | CMP #6 393 | BCC RFL0 394 | RTS 395 | RFL0: LDX #28 396 | RFL1: LDA UNIT_TYPE,X 397 | CMP #0 398 | BEQ RFL2 399 | INX 400 | CPX #32 401 | BNE RFL1 402 | RTS 403 | RFL2: LDA #14 ;pistol fire left AI 404 | STA UNIT_TYPE,X 405 | LDA #245 ;tile for horizontal weapons fire 406 | JMP ROLLERBOT_AFTER_FIRE 407 | 408 | ROLLERBOT_FIRE_RIGHT: 409 | ;Check to see if distance is less than 5 410 | LDA UNIT_LOC_X ;player 411 | SEC 412 | SBC UNIT_LOC_X,X ;robot 413 | CMP #6 414 | BCC RFR0 415 | RTS 416 | RFR0: LDX #28 417 | RFR1: LDA UNIT_TYPE,X 418 | CMP #0 419 | BEQ RFR2 420 | INX 421 | CPX #32 422 | BNE RFR1 423 | RTS 424 | RFR2: LDA #15 ;pistol fire RIGHT AI 425 | STA UNIT_TYPE,X 426 | LDA #245 ;tile for horizontal weapons fire 427 | JMP ROLLERBOT_AFTER_FIRE 428 | RTS 429 | 430 | ROLLERBOT_FIRE_UD: 431 | LDA UNIT_LOC_Y,X 432 | CMP UNIT_LOC_Y 433 | BCC RBFUD2 434 | JMP ROLLERBOT_FIRE_UP 435 | RBFUD2: JMP ROLLERBOT_FIRE_DOWN 436 | 437 | ROLLERBOT_FIRE_UP: 438 | ;Check to see if distance is less than 5 439 | LDA UNIT_LOC_Y,X ;robot 440 | SEC 441 | SBC UNIT_LOC_Y ;player 442 | CMP #4 443 | BCC RFU0 444 | RTS 445 | RFU0: LDX #28 446 | RFU1: LDA UNIT_TYPE,X 447 | CMP #0 448 | BEQ RFU2 449 | INX 450 | CPX #32 451 | BNE RFU1 452 | RTS 453 | RFU2: LDA #12 ;pistol fire UP AI 454 | STA UNIT_TYPE,X 455 | LDA #244 ;tile for horizontal weapons fire 456 | JMP ROLLERBOT_AFTER_FIRE 457 | 458 | ROLLERBOT_FIRE_DOWN: 459 | ;Check to see if distance is less than 5 460 | LDA UNIT_LOC_Y ;player 461 | SEC 462 | SBC UNIT_LOC_Y,X ;robot 463 | CMP #4 464 | BCC RFD0 465 | RTS 466 | RFD0: LDX #28 467 | RFD1: LDA UNIT_TYPE,X 468 | CMP #0 469 | BEQ RFD2 470 | INX 471 | CPX #32 472 | BNE RFD1 473 | RTS 474 | RFD2: LDA #13 ;pistol fire DOWN AI 475 | STA UNIT_TYPE,X 476 | LDA #244 ;tile for horizontal weapons fire 477 | JMP ROLLERBOT_AFTER_FIRE 478 | 479 | ROLLERBOT_AFTER_FIRE: 480 | STA UNIT_TILE,X 481 | LDA #5 ;travel distance. 482 | STA UNIT_A,X 483 | LDA #0 ;weapon-type = pistol 484 | STA UNIT_B,X 485 | STA UNIT_TIMER_A,X 486 | LDA TEMP_A 487 | STA UNIT_LOC_X,X 488 | LDA TEMP_B 489 | STA UNIT_LOC_Y,X 490 | LDA #9 ;PISTOL SOUND 491 | JSR PLAY_SOUND ;SOUND PLAY 492 | RTS 493 | 494 | ROLLERBOT_ANIMATE: 495 | LDA UNIT_TIMER_B,X 496 | CMP #0 497 | BEQ ROLAN2 498 | DEC UNIT_TIMER_B,X 499 | RTS 500 | ROLAN2: LDA #3 501 | STA UNIT_TIMER_B,X ;RESET ANIMATE TIMER 502 | LDA UNIT_TILE,X 503 | CMP #164 504 | BNE ROLAN1 505 | LDA #165 ;ROLLERBOT TILE 506 | STA UNIT_TILE,X 507 | JSR CHECK_FOR_WINDOW_REDRAW 508 | RTS 509 | ROLAN1: LDA #164 ;ROLLERBOT TILE 510 | STA UNIT_TILE,X 511 | JSR CHECK_FOR_WINDOW_REDRAW 512 | RTS 513 | 514 | 515 | 516 | ;UNIT_A: 0=always active 1=only active when all robots are dead 517 | ;UNIT_B: 0=completes level 1=send to coordinates 518 | ;UNIT_C: X-coordinate 519 | ;UNIT_D: Y-coordinate 520 | 521 | ;The "DEMATERIALIZE" part of this AI routine has to be in the main 522 | ;source for each individual computer, because the screen effects 523 | ;are created uniquely for each one. 524 | 525 | TRANSPORTER_PAD: 526 | ;first determine if the player is standing here 527 | LDX UNIT 528 | LDA UNIT_LOC_X,X 529 | CMP UNIT_LOC_X 530 | BNE TRP01 531 | LDA UNIT_LOC_Y,X 532 | CMP UNIT_LOC_Y 533 | BNE TRP01 534 | JMP TRANS_PLAYER_PRESENT 535 | TRP01: ;player not present 536 | LDA UNIT_A,X 537 | CMP #1 538 | BEQ TRP02 539 | JMP TRANS_ACTIVE 540 | TRP02: ;test if all robots are dead 541 | LDX #1 542 | TRP03: LDA UNIT_TYPE,X 543 | CMP #0 544 | BNE TRP04 545 | INX 546 | CPX #28 547 | BNE TRP03 548 | LDX UNIT 549 | LDA #0 550 | STA UNIT_A,X ;make unit active 551 | TRP04: LDX UNIT 552 | LDA #30 553 | STA UNIT_TIMER_A,X 554 | JMP AILP 555 | 556 | TRANS_PLAYER_PRESENT: 557 | LDX UNIT 558 | LDA UNIT_A,X 559 | CMP #0 ;unit active 560 | BEQ TRPL1 561 | LDA #MSG_TRANS1 564 | STA $FC 565 | JSR PRINT_INFO 566 | LDA #11 ;error-SOUND 567 | JSR PLAY_SOUND ;SOUND PLAY 568 | LDX UNIT 569 | LDA #100 570 | STA UNIT_TIMER_A,X 571 | JMP AILP 572 | TRPL1: ;start transport process 573 | LDA #23 ;Convert to different AI 574 | STA UNIT_TYPE,X 575 | LDA #5 576 | STA UNIT_TIMER_A,X 577 | LDA #0 578 | STA UNIT_TIMER_B,X 579 | JMP AILP 580 | 581 | TRANS_ACTIVE: 582 | LDA UNIT_TIMER_B,X 583 | CMP #1 584 | BEQ TRAC1 585 | LDA #1 586 | STA UNIT_TIMER_B,X 587 | LDA #30 588 | STA TILE 589 | JMP TRAC2 590 | TRAC1: LDA #0 591 | STA UNIT_TIMER_B,X 592 | LDA #31 593 | STA TILE 594 | TRAC2: LDA UNIT_LOC_X,X 595 | STA MAP_X 596 | LDA UNIT_LOC_Y,X 597 | STA MAP_Y 598 | JSR PLOT_TILE_TO_MAP 599 | JSR CHECK_FOR_WINDOW_REDRAW 600 | LDA #30 601 | STA UNIT_TIMER_A,X 602 | JMP AILP 603 | 604 | TIME_BOMB: 605 | LDX UNIT 606 | LDA UNIT_A,X 607 | CMP #0 608 | BNE TB01 609 | JMP BIG_EXP_PHASE1 610 | TB01: CMP #1 611 | BNE TB02 612 | JMP BIG_EXP_PHASE2 613 | TB02: JMP AILP 614 | 615 | ;This is the large explosion used by the time-bomb 616 | ;and plasma gun, and maybe others. This is the first 617 | ;phase of the explosion, which stores the tiles to 618 | ;a buffer and then changes each tile to an explosion. 619 | BIG_EXP_PHASE1: 620 | LDA BIG_EXP_ACT 621 | CMP #0 ;Check that no other explosion active. 622 | BEQ BEX001 623 | LDX UNIT 624 | LDA #10 625 | STA UNIT_TIMER_A,X 626 | JMP AILP ;wait for existing explosion to finish. 627 | BEX001: 628 | LDA #1 ;Set flag so no other explosions 629 | STA BIG_EXP_ACT ;can begin until this one ends. 630 | STA SCREEN_SHAKE 631 | LDA #0 ;explosion-sound 632 | JSR PLAY_SOUND ;SOUND PLAY 633 | JSR BEX_PART1 ;check center piece for unit 634 | JSR BEXCEN ;check center piece for unit 635 | JSR BEX1_NORTH 636 | JSR BEX1_SOUTH 637 | JSR BEX1_EAST 638 | JSR BEX1_WEST 639 | JSR BEX1_NE 640 | JSR BEX1_NW 641 | JSR BEX1_SE 642 | JSR BEX1_SW 643 | LDX UNIT 644 | LDA #246 ;explosion tile 645 | STA UNIT_TILE,X 646 | LDA #1 ;move to next phase of explosion. 647 | STA UNIT_A,X 648 | LDA #12 649 | STA UNIT_TIMER_A,X 650 | LDA #1 651 | STA REDRAW_WINDOW 652 | JMP AILP 653 | 654 | ;There are 8 separate subroutines for the large explosion 655 | ;with each one handling a specific outward direction of motion. 656 | ;The "unit" itself changes tiles to an explosion, so we don't 657 | ;need to mess with the center tile. 658 | BEX1_NORTH: 659 | JSR BEX_PART1 660 | ;first tile 661 | DEC MAP_Y 662 | JSR BEX_PART2 663 | BEQ BEX1N1 664 | RTS 665 | BEX1N1: LDA TILE 666 | STA EXP_BUFFER+0 667 | JSR BEX_PART3 668 | ;second tile 669 | DEC MAP_Y 670 | JSR BEX_PART2 671 | BEQ BEX1N2 672 | RTS 673 | BEX1N2: LDA TILE 674 | STA EXP_BUFFER+1 675 | JSR BEX_PART3 676 | RTS 677 | 678 | BEX1_SOUTH: 679 | JSR BEX_PART1 680 | ;first tile 681 | INC MAP_Y 682 | JSR BEX_PART2 683 | BEQ BEX1S1 684 | RTS 685 | BEX1S1: LDA TILE 686 | STA EXP_BUFFER+2 687 | JSR BEX_PART3 688 | ;second tile 689 | INC MAP_Y 690 | JSR BEX_PART2 691 | BEQ BEX1S2 692 | RTS 693 | BEX1S2: LDA TILE 694 | STA EXP_BUFFER+3 695 | JSR BEX_PART3 696 | RTS 697 | 698 | BEX1_EAST: 699 | JSR BEX_PART1 700 | ;first tile 701 | INC MAP_X 702 | JSR BEX_PART2 703 | BEQ BEX1E1 704 | RTS 705 | BEX1E1: LDA TILE 706 | STA EXP_BUFFER+4 707 | JSR BEX_PART3 708 | ;second tile 709 | INC MAP_X 710 | JSR BEX_PART2 711 | BEQ BEX1E2 712 | RTS 713 | BEX1E2: LDA TILE 714 | STA EXP_BUFFER+5 715 | JSR BEX_PART3 716 | RTS 717 | 718 | BEX1_WEST: 719 | JSR BEX_PART1 720 | ;first tile 721 | DEC MAP_X 722 | JSR BEX_PART2 723 | BEQ BEX1W1 724 | RTS 725 | BEX1W1: LDA TILE 726 | STA EXP_BUFFER+6 727 | JSR BEX_PART3 728 | ;second tile 729 | DEC MAP_X 730 | JSR BEX_PART2 731 | BEQ BEX1W2 732 | RTS 733 | BEX1W2: LDA TILE 734 | STA EXP_BUFFER+7 735 | JSR BEX_PART3 736 | RTS 737 | 738 | BEX1_NE: 739 | JSR BEX_PART1 740 | ;first tile 741 | INC MAP_X 742 | DEC MAP_Y 743 | JSR BEX_PART2 744 | BEQ BEX1NE1 745 | RTS 746 | BEX1NE1:LDA TILE 747 | STA EXP_BUFFER+8 748 | JSR BEX_PART3 749 | ;second tile 750 | INC MAP_X 751 | DEC MAP_Y 752 | JSR BEX_PART2 753 | BEQ BEX1NE2 754 | RTS 755 | BEX1NE2:LDA TILE 756 | STA EXP_BUFFER+9 757 | JSR BEX_PART3 758 | RTS 759 | 760 | BEX1_NW: 761 | JSR BEX_PART1 762 | ;first tile 763 | DEC MAP_X 764 | DEC MAP_Y 765 | JSR BEX_PART2 766 | BEQ BEX1NW1 767 | RTS 768 | BEX1NW1:LDA TILE 769 | STA EXP_BUFFER+10 770 | JSR BEX_PART3 771 | ;second tile 772 | DEC MAP_X 773 | DEC MAP_Y 774 | JSR BEX_PART2 775 | BEQ BEX1NW2 776 | RTS 777 | BEX1NW2:LDA TILE 778 | STA EXP_BUFFER+11 779 | JSR BEX_PART3 780 | RTS 781 | 782 | BEX1_SE: 783 | JSR BEX_PART1 784 | ;first tile 785 | INC MAP_X 786 | INC MAP_Y 787 | JSR BEX_PART2 788 | BEQ BEX1SE1 789 | RTS 790 | BEX1SE1:LDA TILE 791 | STA EXP_BUFFER+12 792 | JSR BEX_PART3 793 | ;second tile 794 | INC MAP_X 795 | INC MAP_Y 796 | JSR BEX_PART2 797 | BEQ BEX1SE2 798 | RTS 799 | BEX1SE2:LDA TILE 800 | STA EXP_BUFFER+13 801 | JSR BEX_PART3 802 | RTS 803 | 804 | BEX1_SW: 805 | JSR BEX_PART1 806 | ;first tile 807 | DEC MAP_X 808 | INC MAP_Y 809 | JSR BEX_PART2 810 | BEQ BEX1SW1 811 | RTS 812 | BEX1SW1:LDA TILE 813 | STA EXP_BUFFER+14 814 | JSR BEX_PART3 815 | ;second tile 816 | DEC MAP_X 817 | INC MAP_Y 818 | JSR BEX_PART2 819 | BEQ BEX1SW2 820 | RTS 821 | BEX1SW2:LDA TILE 822 | STA EXP_BUFFER+15 823 | JSR BEX_PART3 824 | RTS 825 | 826 | BEX_PART1: 827 | LDX UNIT 828 | LDA UNIT_LOC_X,X 829 | STA MAP_X 830 | LDA UNIT_LOC_Y,X 831 | STA MAP_Y 832 | RTS 833 | 834 | BEX_PART2: 835 | JSR GET_TILE_FROM_MAP 836 | LDY TILE 837 | LDA TILE_ATTRIB,Y 838 | AND #%00010000 ;can see through tile? 839 | CMP #%00010000 840 | RTS 841 | 842 | BEX_PART3: 843 | LDA #246 844 | LDY #0 845 | STA ($FD),Y 846 | BEXCEN: JSR CHECK_FOR_UNIT 847 | LDA UNIT_FIND 848 | CMP #255 849 | BEQ EPT2 850 | LDA #11 851 | STA TEMP_A 852 | JSR INFLICT_DAMAGE 853 | EPT2: RTS 854 | 855 | BIG_EXP_PHASE2: 856 | ;Do the center tile first. 857 | JSR BEX_PART1 858 | JSR GET_TILE_FROM_MAP 859 | LDA #246 860 | STA ($FD),Y 861 | LDA TILE 862 | STA TEMP_A 863 | JSR RESTORE_TILE 864 | ;tile #0 north 1 865 | JSR BEX_PART1 866 | DEC MAP_Y 867 | LDA EXP_BUFFER+0 868 | STA TEMP_A 869 | JSR RESTORE_TILE 870 | ;tile #1 north 2 871 | DEC MAP_Y 872 | LDA EXP_BUFFER+1 873 | STA TEMP_A 874 | JSR RESTORE_TILE 875 | ;tile #2 south 1 876 | JSR BEX_PART1 877 | INC MAP_Y 878 | LDA EXP_BUFFER+2 879 | STA TEMP_A 880 | JSR RESTORE_TILE 881 | ;tile #3 south 2 882 | INC MAP_Y 883 | LDA EXP_BUFFER+3 884 | STA TEMP_A 885 | JSR RESTORE_TILE 886 | ;tile #4 east 1 887 | JSR BEX_PART1 888 | INC MAP_X 889 | LDA EXP_BUFFER+4 890 | STA TEMP_A 891 | JSR RESTORE_TILE 892 | ;tile #5 east 2 893 | INC MAP_X 894 | LDA EXP_BUFFER+5 895 | STA TEMP_A 896 | JSR RESTORE_TILE 897 | ;tile #6 west 1 898 | JSR BEX_PART1 899 | DEC MAP_X 900 | LDA EXP_BUFFER+6 901 | STA TEMP_A 902 | JSR RESTORE_TILE 903 | ;tile #7 west 2 904 | DEC MAP_X 905 | LDA EXP_BUFFER+7 906 | STA TEMP_A 907 | JSR RESTORE_TILE 908 | ;tile #8 northeast 1 909 | JSR BEX_PART1 910 | DEC MAP_Y 911 | INC MAP_X 912 | LDA EXP_BUFFER+8 913 | STA TEMP_A 914 | JSR RESTORE_TILE 915 | ;tile #9 northeast 2 916 | DEC MAP_Y 917 | INC MAP_X 918 | LDA EXP_BUFFER+9 919 | STA TEMP_A 920 | JSR RESTORE_TILE 921 | ;tile #10 northwest 1 922 | JSR BEX_PART1 923 | DEC MAP_Y 924 | DEC MAP_X 925 | LDA EXP_BUFFER+10 926 | STA TEMP_A 927 | JSR RESTORE_TILE 928 | ;tile #11 northwest 2 929 | DEC MAP_Y 930 | DEC MAP_X 931 | LDA EXP_BUFFER+11 932 | STA TEMP_A 933 | JSR RESTORE_TILE 934 | ;tile #12 southeast 1 935 | JSR BEX_PART1 936 | INC MAP_Y 937 | INC MAP_X 938 | LDA EXP_BUFFER+12 939 | STA TEMP_A 940 | JSR RESTORE_TILE 941 | ;tile #13 southeast 2 942 | INC MAP_Y 943 | INC MAP_X 944 | LDA EXP_BUFFER+13 945 | STA TEMP_A 946 | JSR RESTORE_TILE 947 | ;tile #14 southwest 1 948 | JSR BEX_PART1 949 | INC MAP_Y 950 | DEC MAP_X 951 | LDA EXP_BUFFER+14 952 | STA TEMP_A 953 | JSR RESTORE_TILE 954 | ;tile #15 southwest 2 955 | INC MAP_Y 956 | DEC MAP_X 957 | LDA EXP_BUFFER+15 958 | STA TEMP_A 959 | JSR RESTORE_TILE 960 | LDA #1 961 | STA REDRAW_WINDOW 962 | LDX UNIT 963 | LDA #0 964 | STA UNIT_TYPE,X ;Deactivate this AI 965 | STA BIG_EXP_ACT 966 | STA SCREEN_SHAKE 967 | JMP AILP 968 | 969 | RESTORE_TILE: 970 | JSR GET_TILE_FROM_MAP 971 | LDA TILE 972 | CMP #246 973 | BEQ REST0 974 | RTS 975 | 976 | REST0: LDY TEMP_A 977 | CPY #131 ;Cannister tile 978 | BEQ REST3 979 | LDA TILE_ATTRIB,Y 980 | AND #%00001000 ;can it be destroyed? 981 | CMP #%00001000 982 | BNE REST2 983 | LDA DESTRUCT_PATH,Y 984 | LDY #0 985 | STA ($FD),Y 986 | RTS 987 | REST2: LDA TEMP_A 988 | LDY #0 989 | STA ($FD),Y 990 | RTS 991 | REST3: ;What to do if we encounter an explosive cannister 992 | LDA #135 ;Blown cannister 993 | LDY #0 994 | STA ($FD),Y 995 | LDX #28 ;Start of weapons units 996 | REST4: LDA UNIT_TYPE,X 997 | CMP #0 998 | BEQ REST5 999 | INX 1000 | CPX #32 1001 | BNE REST4 1002 | RTS ;no slots available right now, abort. 1003 | REST5: LDA #6 ;bomb AI 1004 | STA UNIT_TYPE,X 1005 | LDA #131 ;Cannister tile 1006 | STA UNIT_TILE,X 1007 | LDA MAP_X 1008 | STA UNIT_LOC_X,X 1009 | LDA MAP_Y 1010 | STA UNIT_LOC_Y,X 1011 | LDA #10 ;How long until exposion? 1012 | STA UNIT_TIMER_A,X 1013 | LDA #0 1014 | STA UNIT_A,X 1015 | RTS 1016 | 1017 | TRASH_COMPACTOR: 1018 | LDX UNIT 1019 | LDA UNIT_A,X 1020 | CMP #0 ;OPEN 1021 | BNE TRS01 1022 | JMP TC_OPEN_STATE 1023 | TRS01: CMP #1 ;MID-CLOSING STATE 1024 | BNE TRS02 1025 | JMP TC_MID_CLOSING 1026 | TRS02: CMP #2 ;CLOSED STATE 1027 | BNE TRS03 1028 | JMP TC_CLOSED_STATE 1029 | TRS03: CMP #3 ;MID-OPENING STATE 1030 | BNE TRS04 1031 | JMP TC_MID_OPENING 1032 | TRS04: JMP AILP ;should never get here. 1033 | 1034 | TC_OPEN_STATE: 1035 | LDA UNIT_LOC_X,X 1036 | STA MAP_X 1037 | LDA UNIT_LOC_Y,X 1038 | STA MAP_Y 1039 | JSR GET_TILE_FROM_MAP 1040 | CMP #148 ;Usual tile for trash compactor danger zone 1041 | BNE TRS15 1042 | TRS10: INY 1043 | LDA ($FD),Y 1044 | CMP #148 ;Usual tile for trash compactor danger zone 1045 | BNE TRS15 1046 | LDA #20 1047 | STA UNIT_TIMER_A,X 1048 | ;now check for units in the compactor 1049 | LDA UNIT_LOC_X,X 1050 | STA MAP_X 1051 | LDA UNIT_LOC_Y,X 1052 | STA MAP_Y 1053 | JSR CHECK_FOR_UNIT 1054 | LDA UNIT_FIND 1055 | CMP #255 1056 | BNE TRS15 1057 | JMP AILP ;Nothing found, do nothing. 1058 | TRS15: ;Object has been detected in TC, start closing. 1059 | LDA #146 1060 | STA TCPIECE1 1061 | LDA #147 1062 | STA TCPIECE2 1063 | LDA #150 1064 | STA TCPIECE3 1065 | LDA #151 1066 | STA TCPIECE4 1067 | JSR DRAW_TRASH_COMPACTOR 1068 | INC UNIT_A,X 1069 | LDA #10 1070 | STA UNIT_TIMER_A,X 1071 | LDA #14 ;door sound 1072 | JSR PLAY_SOUND ;SOUND PLAY 1073 | JMP AILP 1074 | 1075 | TC_MID_CLOSING: 1076 | LDA #152 1077 | STA TCPIECE1 1078 | LDA #153 1079 | STA TCPIECE2 1080 | LDA #156 1081 | STA TCPIECE3 1082 | LDA #157 1083 | STA TCPIECE4 1084 | JSR DRAW_TRASH_COMPACTOR 1085 | INC UNIT_A,X 1086 | LDA #50 1087 | STA UNIT_TIMER_A,X 1088 | ;Now check for any live units in the compactor 1089 | LDA UNIT_LOC_X,X 1090 | STA MAP_X 1091 | LDA UNIT_LOC_Y,X 1092 | STA MAP_Y 1093 | JSR CHECK_FOR_UNIT 1094 | LDA UNIT_FIND 1095 | CMP #255 1096 | BNE TCMC1 1097 | INC MAP_X ;check second tile 1098 | JSR CHECK_FOR_UNIT 1099 | LDA UNIT_FIND 1100 | CMP #255 1101 | BNE TCMC1 1102 | JMP AILP 1103 | TCMC1: ;Found unit in compactor, kill it. 1104 | LDA #MSG_TERMINATED 1107 | STA $FC 1108 | JSR PRINT_INFO 1109 | LDA #0 ;EXPLOSION sound 1110 | JSR PLAY_SOUND ;SOUND PLAY 1111 | LDX UNIT_FIND 1112 | LDA #0 1113 | STA UNIT_TYPE,X 1114 | STA UNIT_HEALTH,X 1115 | LDX #28 ;start of weapons 1116 | TCMC2: LDA UNIT_TYPE,X 1117 | CMP #0 1118 | BEQ TCMC3 1119 | INX 1120 | CPX #32 1121 | BNE TCMC2 1122 | JSR CHECK_FOR_WINDOW_REDRAW 1123 | JMP AILP 1124 | TCMC3: LDA #11 ;SMALL EXPLOSION 1125 | STA UNIT_TYPE,X 1126 | LDA #248 ;first tile for explosion 1127 | STA UNIT_TILE,X 1128 | LDY UNIT 1129 | LDA UNIT_LOC_X,Y 1130 | STA UNIT_LOC_X,X 1131 | LDA UNIT_LOC_Y,Y 1132 | STA UNIT_LOC_Y,X 1133 | LDA UNIT_FIND 1134 | CMP #0 ;is it the player? 1135 | BNE TCMC4 1136 | LDA #10 1137 | STA BORDER 1138 | TCMC4: JSR CHECK_FOR_WINDOW_REDRAW 1139 | JMP AILP 1140 | 1141 | TC_CLOSED_STATE: 1142 | LDA #146 1143 | STA TCPIECE1 1144 | LDA #147 1145 | STA TCPIECE2 1146 | LDA #150 1147 | STA TCPIECE3 1148 | LDA #151 1149 | STA TCPIECE4 1150 | JSR DRAW_TRASH_COMPACTOR 1151 | INC UNIT_A,X 1152 | LDA #10 1153 | STA UNIT_TIMER_A,X 1154 | JMP AILP 1155 | 1156 | TC_MID_OPENING: 1157 | LDA #144 1158 | STA TCPIECE1 1159 | LDA #145 1160 | STA TCPIECE2 1161 | LDA #148 1162 | STA TCPIECE3 1163 | LDA #148 1164 | STA TCPIECE4 1165 | JSR DRAW_TRASH_COMPACTOR 1166 | LDA #0 1167 | STA UNIT_A,X 1168 | LDA #20 1169 | STA UNIT_TIMER_A,X 1170 | LDA #14 ;door sound 1171 | JSR PLAY_SOUND ;SOUND PLAY 1172 | JMP AILP 1173 | 1174 | DRAW_TRASH_COMPACTOR: 1175 | LDA UNIT_LOC_Y,X 1176 | STA MAP_Y 1177 | DEC MAP_Y ;start one tile above 1178 | LDA UNIT_LOC_X,X 1179 | STA MAP_X 1180 | LDA TCPIECE1 1181 | STA TILE 1182 | JSR PLOT_TILE_TO_MAP 1183 | INY 1184 | LDA TCPIECE2 1185 | STA ($FD),Y 1186 | TYA 1187 | CLC 1188 | ADC #127 1189 | TAY 1190 | LDA TCPIECE3 1191 | STA ($FD),Y 1192 | LDA TCPIECE4 1193 | INY 1194 | STA ($FD),Y 1195 | JSR CHECK_FOR_WINDOW_REDRAW 1196 | RTS 1197 | TCPIECE1: !BYTE 00 1198 | TCPIECE2: !BYTE 00 1199 | TCPIECE3: !BYTE 00 1200 | TCPIECE4: !BYTE 00 1201 | 1202 | WATER_DROID: 1203 | ;first rotate the tiles 1204 | LDX UNIT 1205 | INC UNIT_TILE,X 1206 | LDA UNIT_TILE,X 1207 | CMP #143 1208 | BNE WD01 1209 | LDA #140 1210 | STA UNIT_TILE,X 1211 | WD01: DEC UNIT_A,X 1212 | LDA UNIT_A,X 1213 | CMP #0 1214 | BEQ WD02 1215 | JSR CHECK_FOR_WINDOW_REDRAW 1216 | JMP AILP 1217 | WD02: ;kill unit after countdown reaches zero. 1218 | LDA #08 ;Dead robot type 1219 | STA UNIT_TYPE,X 1220 | LDA #255 1221 | STA UNIT_TIMER_A,X 1222 | LDA #115 ;dead robot tile 1223 | STA UNIT_TILE,X 1224 | JSR CHECK_FOR_WINDOW_REDRAW 1225 | JMP AILP 1226 | 1227 | PISTOL_FIRE_UP: 1228 | ;Check if it has reached limits. 1229 | LDX UNIT 1230 | LDA UNIT_A,X 1231 | CMP #0 1232 | BNE PFU02 1233 | ;if it has reached max range, then it vanishes. 1234 | JSR DEACTIVATE_WEAPON 1235 | JMP PFU05 1236 | PFU02: DEC UNIT_LOC_Y,X ;move it up one. 1237 | JMP PISTOL_AI_COMMON 1238 | PFU05: JSR CHECK_FOR_WINDOW_REDRAW 1239 | JMP AILP 1240 | 1241 | PISTOL_FIRE_DOWN: 1242 | ;Check if it has reached limits. 1243 | LDX UNIT 1244 | LDA UNIT_A,X 1245 | CMP #0 1246 | BNE PFD02 1247 | ;if it has reached max range, then it vanishes. 1248 | JSR DEACTIVATE_WEAPON 1249 | JMP PFD05 1250 | PFD02: INC UNIT_LOC_Y,X ;move it down one. 1251 | JMP PISTOL_AI_COMMON 1252 | PFD05: JSR CHECK_FOR_WINDOW_REDRAW 1253 | JMP AILP 1254 | 1255 | PISTOL_FIRE_LEFT: 1256 | ;Check if it has reached limits. 1257 | LDX UNIT 1258 | LDA UNIT_A,X 1259 | CMP #0 1260 | BNE PFL02 1261 | ;if it has reached max range, then it vanishes. 1262 | JSR DEACTIVATE_WEAPON 1263 | JMP PFL05 1264 | PFL02: DEC UNIT_LOC_X,X ;move it left one. 1265 | JMP PISTOL_AI_COMMON 1266 | PFL05: JSR CHECK_FOR_WINDOW_REDRAW 1267 | JMP AILP 1268 | 1269 | PISTOL_FIRE_RIGHT: 1270 | ;Check if it has reached limits. 1271 | LDX UNIT 1272 | LDA UNIT_A,X 1273 | CMP #0 1274 | BNE PFR02 1275 | ;if it has reached max range, then it vanishes. 1276 | JSR DEACTIVATE_WEAPON 1277 | JMP PFR05 1278 | PFR02: INC UNIT_LOC_X,X ;move it right one. 1279 | JMP PISTOL_AI_COMMON 1280 | PFR05: JSR CHECK_FOR_WINDOW_REDRAW 1281 | JMP AILP 1282 | 1283 | DEACTIVATE_WEAPON: 1284 | LDA #0 1285 | STA UNIT_TYPE,X 1286 | LDA UNIT_B,X 1287 | CMP #1 1288 | BNE DEW1 1289 | LDA #0 1290 | STA UNIT_B,X 1291 | STA PLASMA_ACT 1292 | DEW1: RTS 1293 | 1294 | PISTOL_AI_COMMON: 1295 | LDA UNIT_B,X ;is it pistol or plasma? 1296 | CMP #0 1297 | BEQ PAIC02 1298 | JMP PLASMA_AI_COMMON 1299 | PAIC02: DEC UNIT_A,X ;reduce range by one 1300 | ;Now check what map object it is on. 1301 | LDA UNIT_LOC_X,X 1302 | STA MAP_X 1303 | LDA UNIT_LOC_Y,X 1304 | STA MAP_Y 1305 | JSR GET_TILE_FROM_MAP 1306 | LDY TILE 1307 | CMP #131 ;explosive cannister 1308 | BNE PAIC04 1309 | ;hit an explosive cannister 1310 | LDA #135 ;Blown cannister 1311 | LDY #0 1312 | STA ($FD),Y 1313 | LDX UNIT 1314 | LDA #6 ;bomb AI 1315 | STA UNIT_TYPE,X 1316 | LDA #131 ;Cannister tile 1317 | STA UNIT_TILE,X 1318 | LDA MAP_X 1319 | STA UNIT_LOC_X,X 1320 | LDA MAP_Y 1321 | STA UNIT_LOC_Y,X 1322 | LDA #5 ;How long until exposion? 1323 | STA UNIT_TIMER_A,X 1324 | LDA #0 1325 | STA UNIT_A,X 1326 | JMP AILP 1327 | PAIC04: LDA TILE_ATTRIB,Y 1328 | ;AND #%00000010 ;Check, can hover on this? 1329 | ;CMP #%00000010 1330 | AND #%00010000 ;can see through tile? 1331 | CMP #%00010000 1332 | BEQ PAIC05 1333 | ;Hit object that can't pass through, convert to explosion 1334 | LDA #11 ;SMALL EXPLOSION 1335 | STA UNIT_TYPE,X 1336 | LDA #248 ;first tile for explosion 1337 | STA UNIT_TILE,X 1338 | JSR CHECK_FOR_WINDOW_REDRAW 1339 | JMP AILP 1340 | PAIC05: ;check if it encountered a robot/human 1341 | JSR CHECK_FOR_UNIT 1342 | LDA UNIT_FIND 1343 | CMP #255 ;NO UNIT ENCOUNTERED. 1344 | BNE PAIC06 1345 | JSR CHECK_FOR_WINDOW_REDRAW 1346 | JMP AILP 1347 | PAIC06: ;struck a robot/human 1348 | LDX UNIT 1349 | LDA #11 ;SMALL EXPLOSION 1350 | STA UNIT_TYPE,X 1351 | LDA #248 ;first tile for explosion 1352 | STA UNIT_TILE,X 1353 | LDA #1 ;set damage for pistol 1354 | STA TEMP_A 1355 | JSR INFLICT_DAMAGE 1356 | JSR ALTER_AI 1357 | JSR CHECK_FOR_WINDOW_REDRAW 1358 | JMP AILP 1359 | 1360 | PLASMA_AI_COMMON: 1361 | DEC UNIT_A,X ;reduce range by one 1362 | ;find what tile we are over 1363 | LDA UNIT_LOC_X,X 1364 | STA MAP_X 1365 | LDA UNIT_LOC_Y,X 1366 | STA MAP_Y 1367 | JSR GET_TILE_FROM_MAP 1368 | LDY TILE 1369 | CPY #131 ;cannister tile 1370 | BEQ PLAI11 1371 | LDA TILE_ATTRIB,Y 1372 | AND #%00010000 ;can see through tile? 1373 | CMP #%00010000 1374 | BEQ PLAI05 1375 | JMP PLAI11 1376 | PLAI05: ;check if it encountered a human/robot 1377 | JSR CHECK_FOR_UNIT 1378 | LDA UNIT_FIND 1379 | CMP #255 ;NO UNIT ENCOUNTERED. 1380 | BNE PLAI11 1381 | PLAI10: ;no impacts detected: 1382 | JSR CHECK_FOR_WINDOW_REDRAW 1383 | JMP AILP 1384 | PLAI11: ;impact detected. convert to explosion 1385 | LDX UNIT 1386 | LDA #6 ;bomb AI 1387 | STA UNIT_TYPE,X 1388 | LDA #1 ;How long until exposion? 1389 | STA UNIT_TIMER_A,X 1390 | LDA #0 1391 | STA UNIT_A,X 1392 | STA PLASMA_ACT 1393 | JSR CHECK_FOR_WINDOW_REDRAW 1394 | JMP AILP 1395 | 1396 | ;This routine checks to see if the robot being shot 1397 | ;is a hoverbot, if so it will alter it's AI to attack 1398 | ;mode. 1399 | ALTER_AI: 1400 | LDX UNIT_FIND 1401 | LDA UNIT_TYPE,X 1402 | CMP #2 ;hoverbot left/right 1403 | BEQ ATKMOD 1404 | CMP #3 ;hoverbot UP/DOWN 1405 | BEQ ATKMOD 1406 | RTS 1407 | ATKMOD: LDA #4 ;Attack AI 1408 | STA UNIT_TYPE,X 1409 | RTS 1410 | 1411 | 1412 | ;This routine will inflict damage on whatever is defined in 1413 | ;UNIT_FIND in the amount set in TEMP_A. If the damage is more 1414 | ;than the health of that unit, it will delete the unit. 1415 | INFLICT_DAMAGE: 1416 | LDX UNIT_FIND 1417 | LDA UNIT_HEALTH,X 1418 | SEC 1419 | SBC TEMP_A 1420 | STA UNIT_HEALTH,X 1421 | BCC UNIT_DEAD 1422 | CMP #0 1423 | BEQ UNIT_DEAD 1424 | CPX #0 ;IS IT THE PLAYER? 1425 | BNE IND1 1426 | JSR DISPLAY_PLAYER_HEALTH 1427 | LDA #10 1428 | STA BORDER 1429 | IND1: RTS 1430 | UNIT_DEAD: 1431 | LDA #0 1432 | STA UNIT_HEALTH,X 1433 | CPX #0 ;Is it the player that is dead? 1434 | BEQ UD01 1435 | LDA #08 ;Dead robot type 1436 | CMP UNIT_TYPE,X ;is it a dead robot already? 1437 | BEQ UD0A 1438 | STA UNIT_TYPE,X 1439 | LDA #255 1440 | STA UNIT_TIMER_A,X 1441 | LDA #115 ;dead robot tile 1442 | STA UNIT_TILE,X 1443 | UD0A: RTS 1444 | UD01: LDA #0 1445 | STA UNIT_TYPE,X 1446 | JSR DISPLAY_PLAYER_HEALTH 1447 | LDA #10 1448 | STA BORDER 1449 | RTS 1450 | 1451 | SMALL_EXPLOSION: 1452 | LDA #0 1453 | STA UNIT_TIMER_A,X 1454 | INC UNIT_TILE,X 1455 | LDA UNIT_TILE,X 1456 | CMP #252 1457 | BEQ SEXP1 1458 | JSR CHECK_FOR_WINDOW_REDRAW 1459 | JMP AILP 1460 | SEXP1: LDA #0 1461 | STA UNIT_TYPE,X 1462 | JSR CHECK_FOR_WINDOW_REDRAW 1463 | JMP AILP 1464 | 1465 | HOVER_ATTACK: 1466 | LDX UNIT 1467 | LDA #0 1468 | STA UNIT_TIMER_B,X 1469 | JSR HOVERBOT_ANIMATE 1470 | LDA #7 1471 | STA UNIT_TIMER_A,X 1472 | LDA #%00000010 ;HOVER 1473 | STA MOVE_TYPE 1474 | ;CHECK FOR HORIZONTAL MOVEMENT 1475 | LDA UNIT_LOC_X,X 1476 | CMP UNIT_LOC_X 1477 | BEQ HOAT13 1478 | BCC HOAT12 1479 | JSR REQUEST_WALK_LEFT 1480 | JMP HOAT13 1481 | HOAT12: JSR REQUEST_WALK_RIGHT 1482 | HOAT13: ;NOW CHECK FOR VERITCAL MOVEMENT 1483 | LDA UNIT_LOC_Y,X 1484 | CMP UNIT_LOC_Y 1485 | BEQ HOAT20 1486 | BCC HOAT14 1487 | JSR REQUEST_WALK_UP 1488 | JMP HOAT20 1489 | HOAT14: JSR REQUEST_WALK_DOWN 1490 | HOAT20: JSR ROBOT_ATTACK_RANGE 1491 | LDA PROX_DETECT 1492 | CMP #1 ;1=Robot next to player 0=not 1493 | BNE HOAT21 1494 | LDA #1 ;amount of damage it will inflict 1495 | STA TEMP_A 1496 | LDA #0 ;unit to inflict damage on. 1497 | STA UNIT_FIND 1498 | JSR INFLICT_DAMAGE 1499 | JSR CREATE_PLAYER_EXPLOSION 1500 | LDA #07 ;electric shock 1501 | JSR PLAY_SOUND ;SOUND PLAY 1502 | LDX UNIT 1503 | LDA #30 ;rate of attack on player. 1504 | STA UNIT_TIMER_A,X 1505 | ;add some code here to create explosion 1506 | HOAT21: JSR CHECK_FOR_WINDOW_REDRAW 1507 | JMP AILP 1508 | 1509 | CREATE_PLAYER_EXPLOSION: 1510 | LDX #28 1511 | TE01: LDA UNIT_TYPE,X 1512 | CMP #0 1513 | BEQ TE02 1514 | INX 1515 | CPX #32 ;max unit for weaponsfire 1516 | BNE TE01 1517 | TE02: LDA #11 ;Small explosion AI type 1518 | STA UNIT_TYPE,X 1519 | LDA #248 ;first tile for explosion 1520 | STA UNIT_TILE,X 1521 | LDA #1 1522 | STA UNIT_TIMER_A,X 1523 | LDA UNIT_LOC_X 1524 | STA UNIT_LOC_X,X 1525 | LDA UNIT_LOC_Y 1526 | STA UNIT_LOC_Y,X 1527 | RTS 1528 | 1529 | EVILBOT: 1530 | LDX UNIT 1531 | LDA #5 1532 | STA UNIT_TIMER_A,X 1533 | ;first animate evilbot 1534 | LDA UNIT_TILE,X 1535 | CMP #100 1536 | BNE EVIL1 1537 | INC UNIT_TILE,X 1538 | JMP EVIL10 1539 | EVIL1: CMP #101 1540 | BNE EVIL2 1541 | INC UNIT_TILE,X 1542 | JMP EVIL10 1543 | EVIL2: CMP #102 1544 | BNE EVIL3 1545 | INC UNIT_TILE,X 1546 | JMP EVIL10 1547 | EVIL3: LDA #100 1548 | STA UNIT_TILE,X 1549 | EVIL10: ;now figure out movement 1550 | LDA UNIT_TIMER_B,X 1551 | CMP #0 1552 | BEQ EVIL11 1553 | DEC UNIT_TIMER_B,X 1554 | JSR CHECK_FOR_WINDOW_REDRAW 1555 | JMP AILP 1556 | EVIL11: LDA #1 ;Reset timer B 1557 | STA UNIT_TIMER_B,X 1558 | LDA #%00000001 ;WALK 1559 | STA MOVE_TYPE 1560 | ;CHECK FOR HORIZONTAL MOVEMENT 1561 | LDA UNIT_LOC_X,X 1562 | CMP UNIT_LOC_X 1563 | BEQ EVIL13 1564 | BCC EVIL12 1565 | JSR REQUEST_WALK_LEFT 1566 | JMP EVIL13 1567 | EVIL12: JSR REQUEST_WALK_RIGHT 1568 | EVIL13: ;NOW CHECK FOR VERITCAL MOVEMENT 1569 | LDA UNIT_LOC_Y,X 1570 | CMP UNIT_LOC_Y 1571 | BEQ EVIL20 1572 | BCC EVIL14 1573 | JSR REQUEST_WALK_UP 1574 | JMP EVIL20 1575 | EVIL14: JSR REQUEST_WALK_DOWN 1576 | EVIL20: JSR ROBOT_ATTACK_RANGE 1577 | LDA PROX_DETECT 1578 | CMP #1 ;1=Robot next to player 0=not 1579 | BNE EVIL21 1580 | LDA #5 ;amount of damage it will inflict 1581 | STA TEMP_A 1582 | LDA #0 ;unit to inflict damage on. 1583 | STA UNIT_FIND 1584 | JSR INFLICT_DAMAGE 1585 | JSR CREATE_PLAYER_EXPLOSION 1586 | LDA #07 ;electric shock sound 1587 | JSR PLAY_SOUND ;SOUND PLAY 1588 | LDX UNIT 1589 | LDA #15 ;rate of attack on player. 1590 | STA UNIT_TIMER_A,X 1591 | EVIL21: JSR CHECK_FOR_WINDOW_REDRAW 1592 | JMP AILP 1593 | 1594 | ;This routine handles automatic sliding doors. 1595 | ;UNIT_B register means: 1596 | ;0=opening-A 1=opening-B 2=OPEN 3=closing-A 4=closing-B 5-CLOSED 1597 | AI_DOOR: 1598 | LDX UNIT 1599 | LDA UNIT_B,X 1600 | CMP #06 ;make sure number is in bounds 1601 | BCS DOORA 1602 | TAY 1603 | LDA AIDB_L,Y 1604 | STA DOORJ+1 1605 | LDA AIDB_H,Y 1606 | STA DOORJ+2 1607 | DOORJ: JMP $0000 ;self modifying code 1608 | DOORA: JMP AILP ;-SHOULD NEVER NEED TO HAPPEN 1609 | AIDB_L: 1610 | !BYTE DOOR_OPEN_A 1618 | !BYTE >DOOR_OPEN_B 1619 | !BYTE >DOOR_OPEN_FULL 1620 | !BYTE >DOOR_CLOSE_A 1621 | !BYTE >DOOR_CLOSE_B 1622 | !BYTE >DOOR_CLOSE_FULL 1623 | 1624 | DOOR_OPEN_A: 1625 | LDA UNIT_A,X 1626 | CMP #1 1627 | BEQ DOA1 1628 | ;HORIZONTAL DOOR 1629 | LDA #88 1630 | STA DOORPIECE1 1631 | LDA #89 1632 | STA DOORPIECE2 1633 | LDA #86 1634 | STA DOORPIECE3 1635 | JSR DRAW_HORIZONTAL_DOOR 1636 | JMP DOA2 1637 | DOA1: ;VERTICAL DOOR 1638 | LDA #70 1639 | STA DOORPIECE1 1640 | LDA #74 1641 | STA DOORPIECE2 1642 | LDA #78 1643 | STA DOORPIECE3 1644 | JSR DRAW_VERTICAL_DOOR 1645 | DOA2: LDY UNIT 1646 | LDA #1 1647 | STA UNIT_B,X 1648 | LDA #5 1649 | STA UNIT_TIMER_A,X 1650 | JSR CHECK_FOR_WINDOW_REDRAW 1651 | JMP AILP 1652 | 1653 | DOOR_OPEN_B: 1654 | LDA UNIT_A,X 1655 | CMP #1 1656 | BEQ DOB1 1657 | ;HORIZONTAL DOOR 1658 | LDA #17 1659 | STA DOORPIECE1 1660 | LDA #09 1661 | STA DOORPIECE2 1662 | LDA #91 1663 | STA DOORPIECE3 1664 | JSR DRAW_HORIZONTAL_DOOR 1665 | JMP DOB2 1666 | DOB1: ;VERTICAL DOOR 1667 | LDA #27 1668 | STA DOORPIECE1 1669 | LDA #09 1670 | STA DOORPIECE2 1671 | LDA #15 1672 | STA DOORPIECE3 1673 | JSR DRAW_VERTICAL_DOOR 1674 | DOB2: LDX UNIT 1675 | LDA #2 1676 | STA UNIT_B,X 1677 | LDA #30 1678 | STA UNIT_TIMER_A,X 1679 | JSR CHECK_FOR_WINDOW_REDRAW 1680 | JMP AILP 1681 | DOOR_OPEN_FULL: 1682 | LDX UNIT 1683 | JSR DOOR_CHECK_PROXIMITY 1684 | LDA PROX_DETECT 1685 | CMP #1 1686 | BNE DOF1 1687 | LDA #30 1688 | STA UNIT_TIMER_B,X ;RESET TIMER 1689 | JMP AILP 1690 | DOF1: ;if nobody near door, lets close it. 1691 | ;check for object in the way first. 1692 | LDA UNIT_LOC_X,X 1693 | STA MAP_X 1694 | LDA UNIT_LOC_Y,X 1695 | STA MAP_Y 1696 | JSR GET_TILE_FROM_MAP 1697 | LDA TILE 1698 | CMP #09 ;FLOOR-TILE 1699 | BEQ DOFB 1700 | ;SOMETHING IN THE WAY, ABORT 1701 | LDA #35 1702 | STA UNIT_TIMER_A,X 1703 | JMP AILP 1704 | DOFB: LDA #14 ;DOOR-SOUND 1705 | JSR PLAY_SOUND ;SOUND PLAY 1706 | LDX UNIT 1707 | LDA UNIT_A,X 1708 | CMP #1 1709 | BEQ DOF2 1710 | ;HORIZONTAL_DOOR 1711 | LDA #88 1712 | STA DOORPIECE1 1713 | LDA #89 1714 | STA DOORPIECE2 1715 | LDA #86 1716 | STA DOORPIECE3 1717 | JSR DRAW_HORIZONTAL_DOOR 1718 | JMP DOF3 1719 | DOF2: ;VERTICAL DOOR 1720 | LDA #70 1721 | STA DOORPIECE1 1722 | LDA #74 1723 | STA DOORPIECE2 1724 | LDA #78 1725 | STA DOORPIECE3 1726 | JSR DRAW_VERTICAL_DOOR 1727 | DOF3: LDY UNIT 1728 | LDA #3 1729 | STA UNIT_B,X 1730 | LDA #5 1731 | STA UNIT_TIMER_A,X 1732 | JSR CHECK_FOR_WINDOW_REDRAW 1733 | JMP AILP 1734 | 1735 | DOOR_CLOSE_A: 1736 | LDA UNIT_A,X 1737 | CMP #1 1738 | BEQ DCA2 1739 | ;HORIZONTAL DOOR 1740 | LDA #84 1741 | STA DOORPIECE1 1742 | LDA #85 1743 | STA DOORPIECE2 1744 | LDA #86 1745 | STA DOORPIECE3 1746 | JSR DRAW_HORIZONTAL_DOOR 1747 | JMP DCA3 1748 | DCA2: ;VERTICAL DOOR 1749 | LDA #69 1750 | STA DOORPIECE1 1751 | LDA #73 1752 | STA DOORPIECE2 1753 | LDA #77 1754 | STA DOORPIECE3 1755 | JSR DRAW_VERTICAL_DOOR 1756 | DCA3: LDY UNIT 1757 | LDA #4 1758 | STA UNIT_B,X 1759 | LDA #5 1760 | STA UNIT_TIMER_A,X 1761 | JSR CHECK_FOR_WINDOW_REDRAW 1762 | JMP AILP 1763 | 1764 | DOOR_CLOSE_B: 1765 | LDA UNIT_A,X 1766 | CMP #1 1767 | BEQ DCB2 1768 | ;HORIZONTAL DOOR 1769 | LDA #80 1770 | STA DOORPIECE1 1771 | LDA #81 1772 | STA DOORPIECE2 1773 | LDA #82 1774 | STA DOORPIECE3 1775 | JSR DRAW_HORIZONTAL_DOOR 1776 | JMP DCB3 1777 | DCB2: ;VERTICAL DOOR 1778 | LDA #68 1779 | STA DOORPIECE1 1780 | LDA #72 1781 | STA DOORPIECE2 1782 | LDA #76 1783 | STA DOORPIECE3 1784 | JSR DRAW_VERTICAL_DOOR 1785 | DCB3: LDY UNIT 1786 | LDA #5 1787 | STA UNIT_B,X 1788 | LDA #5 1789 | STA UNIT_TIMER_A,X 1790 | JSR CHECK_FOR_WINDOW_REDRAW 1791 | JMP AILP 1792 | 1793 | DOOR_CLOSE_FULL: 1794 | LDX UNIT 1795 | JSR DOOR_CHECK_PROXIMITY 1796 | LDA PROX_DETECT 1797 | CMP #0 1798 | BNE DCF1 1799 | DCF0: LDA #20 1800 | STA UNIT_TIMER_A,X ;RESET TIMER 1801 | JMP AILP 1802 | DCF1: ;if player near door, lets open it. 1803 | ;first check if locked 1804 | LDA UNIT_C,X ;Lock status 1805 | CMP #0 ;UNLOCKED 1806 | BEQ DCFZ 1807 | CMP #1 ;SPADE KEY 1808 | BNE DCFB 1809 | LDA KEYS 1810 | AND #%00000001 ;CHECK FOR SPADE KEY 1811 | CMP #%00000001 1812 | BEQ DCFZ 1813 | JMP DCF0 1814 | DCFB: CMP #2 ;HEART KEY 1815 | BNE DCFC 1816 | LDA KEYS 1817 | AND #%00000010 ;CHECK FOR HEART KEY 1818 | CMP #%00000010 1819 | BEQ DCFZ 1820 | JMP DCF0 1821 | DCFC: CMP #3 ;STAR KEY 1822 | BNE DCF0 ;SHOULD NEVER HAPPEN 1823 | LDA KEYS 1824 | AND #%00000100 ;CHECK FOR STAR KEY 1825 | CMP #%00000100 1826 | BEQ DCFZ 1827 | JMP DCF0 1828 | DCFZ: ;Start open door process 1829 | LDA #14 ;DOOR-SOUND 1830 | JSR PLAY_SOUND ;SOUND PLAY 1831 | LDX UNIT 1832 | LDA UNIT_A,X 1833 | CMP #1 1834 | BEQ DCF2 1835 | ;HORIZONTAL DOOR 1836 | LDA #84 1837 | STA DOORPIECE1 1838 | LDA #85 1839 | STA DOORPIECE2 1840 | LDA #86 1841 | STA DOORPIECE3 1842 | JSR DRAW_HORIZONTAL_DOOR 1843 | JMP DCF3 1844 | ;VERTICAL DOOR 1845 | DCF2: LDA #69 1846 | STA DOORPIECE1 1847 | LDA #73 1848 | STA DOORPIECE2 1849 | LDA #77 1850 | STA DOORPIECE3 1851 | JSR DRAW_VERTICAL_DOOR 1852 | DCF3: LDY UNIT 1853 | LDA #0 1854 | STA UNIT_B,X 1855 | LDA #5 1856 | STA UNIT_TIMER_A,X 1857 | JSR CHECK_FOR_WINDOW_REDRAW 1858 | JMP AILP 1859 | 1860 | DRAW_VERTICAL_DOOR: 1861 | LDA UNIT_LOC_Y,X 1862 | STA MAP_Y 1863 | DEC MAP_Y 1864 | LDA UNIT_LOC_X,X 1865 | STA MAP_X 1866 | LDA DOORPIECE1 1867 | STA TILE 1868 | JSR PLOT_TILE_TO_MAP 1869 | LDA $FD 1870 | CLC 1871 | ADC #128 1872 | STA $FD 1873 | LDA $FE 1874 | ADC #$00 1875 | STA $FE 1876 | LDA DOORPIECE2 1877 | STA ($FD),Y 1878 | LDA $FD 1879 | CLC 1880 | ADC #128 1881 | STA $FD 1882 | LDA $FE 1883 | ADC #$00 1884 | STA $FE 1885 | LDA DOORPIECE3 1886 | STA ($FD),Y 1887 | RTS 1888 | 1889 | DRAW_HORIZONTAL_DOOR: 1890 | LDA UNIT_LOC_X,X 1891 | STA MAP_X 1892 | DEC MAP_X 1893 | LDA UNIT_LOC_Y,X 1894 | STA MAP_Y 1895 | LDA DOORPIECE1 1896 | STA TILE 1897 | JSR PLOT_TILE_TO_MAP 1898 | INY 1899 | LDA DOORPIECE2 1900 | STA ($FD),Y 1901 | INY 1902 | LDA DOORPIECE3 1903 | STA ($FD),Y 1904 | RTS 1905 | DOORPIECE1 !BYTE 00 1906 | DOORPIECE2 !BYTE 00 1907 | DOORPIECE3 !BYTE 00 1908 | 1909 | ROBOT_ATTACK_RANGE: 1910 | ;First check horizontal proximity to door 1911 | LDA UNIT_LOC_X,X ;ROBOT UNIT 1912 | SEC ;always set carry before subtraction 1913 | SBC UNIT_LOC_X ;PLAYER UNIT 1914 | BCC RAR1 ;if carry cleared then its negative 1915 | JMP RAR2 1916 | RAR1: EOR #$FF ;convert two's comp back to positive 1917 | ADC #$01 ;no need for CLC here, already cleared 1918 | RAR2: CMP #1 ;1 HORIZONTAL TILE FROM PLAYER 1919 | BCC RAR3 1920 | LDA #0 ;player not detected 1921 | STA PROX_DETECT 1922 | RTS 1923 | RAR3: ;Now check vertical proximity 1924 | LDA UNIT_LOC_Y,X ;DOOR UNIT 1925 | SEC ;always set carry before subtraction 1926 | SBC UNIT_LOC_Y ;PLAYER UNIT 1927 | BCC RAR4 ;if carry cleared then its negative 1928 | JMP RAR5 1929 | RAR4: EOR #$FF ;convert two's comp back to positive 1930 | ADC #$01 ;no need for CLC here, already cleared 1931 | RAR5: CMP #1 ;1 VERTICAL TILE FROM PLAYER 1932 | BCC RAR6 1933 | LDA #0 ;player not detected 1934 | STA PROX_DETECT 1935 | RTS 1936 | RAR6: ;PLAYER DETECTED, CHANGE DOOR MODE. 1937 | LDA #1 1938 | STA PROX_DETECT 1939 | RTS 1940 | 1941 | DOOR_CHECK_PROXIMITY: 1942 | ;First check horizontal proximity to door 1943 | LDA UNIT_LOC_X,X ;DOOR UNIT 1944 | SEC ;always set carry before subtraction 1945 | SBC UNIT_LOC_X ;PLAYER UNIT 1946 | BCC PRD1 ;if carry cleared then its negative 1947 | JMP PRD2 1948 | PRD1: EOR #$FF ;convert two's comp back to positive 1949 | ADC #$01 ;no need for CLC here, already cleared 1950 | PRD2: CMP #2 ;2 HORIZONTAL TILES FROM PLAYER 1951 | BCC PRD3 1952 | LDA #0 ;player not detected 1953 | STA PROX_DETECT 1954 | RTS 1955 | PRD3: ;Now check vertical proximity 1956 | LDA UNIT_LOC_Y,X ;DOOR UNIT 1957 | SEC ;always set carry before subtraction 1958 | SBC UNIT_LOC_Y ;PLAYER UNIT 1959 | BCC PRD4 ;if carry cleared then its negative 1960 | JMP PRD5 1961 | PRD4: EOR #$FF ;convert two's comp back to positive 1962 | ADC #$01 ;no need for CLC here, already cleared 1963 | PRD5: CMP #2 ;2 VERTICAL TILES FROM PLAYER 1964 | BCC PRD6 1965 | LDA #0 ;player not detected 1966 | STA PROX_DETECT 1967 | RTS 1968 | PRD6: ;PLAYER DETECTED, CHANGE DOOR MODE. 1969 | LDA #1 1970 | STA PROX_DETECT 1971 | RTS 1972 | PROX_DETECT !BYTE 00 ;0=NO 1=YES 1973 | 1974 | ;This routine handles automatic sliding doors. 1975 | ;UNIT_B register means: 1976 | ;0=opening-A 1=opening-B 2=OPEN 3=closing-A 4=closing-B 5-CLOSED 1977 | ELEVATOR: 1978 | LDX UNIT 1979 | LDA UNIT_B,X 1980 | CMP #06 ;make sure number is in bounds 1981 | BCS ELEVA 1982 | TAY 1983 | LDA ELDB_L,Y 1984 | STA ELEVJ+1 1985 | LDA ELDB_H,Y 1986 | STA ELEVJ+2 1987 | ELEVJ: JMP $0000 ;self modifying code 1988 | ELEVA: JMP AILP ;-SHOULD NEVER NEED TO HAPPEN 1989 | ELDB_L: 1990 | !BYTE ELEV_OPEN_A 1998 | !BYTE >ELEV_OPEN_B 1999 | !BYTE >ELEV_OPEN_FULL 2000 | !BYTE >ELEV_CLOSE_A 2001 | !BYTE >ELEV_CLOSE_B 2002 | !BYTE >ELEV_CLOSE_FULL 2003 | 2004 | ELEV_OPEN_A: 2005 | LDA #181 2006 | STA DOORPIECE1 2007 | LDA #89 2008 | STA DOORPIECE2 2009 | LDA #173 2010 | STA DOORPIECE3 2011 | JSR DRAW_HORIZONTAL_DOOR 2012 | LDY UNIT 2013 | LDA #1 2014 | STA UNIT_B,X 2015 | LDA #5 2016 | STA UNIT_TIMER_A,X 2017 | JSR CHECK_FOR_WINDOW_REDRAW 2018 | JMP AILP 2019 | 2020 | ELEV_OPEN_B: 2021 | LDA #182 2022 | STA DOORPIECE1 2023 | LDA #09 2024 | STA DOORPIECE2 2025 | LDA #172 2026 | STA DOORPIECE3 2027 | JSR DRAW_HORIZONTAL_DOOR 2028 | LDX UNIT 2029 | LDA #2 2030 | STA UNIT_B,X 2031 | LDA #50 2032 | STA UNIT_TIMER_A,X 2033 | JSR CHECK_FOR_WINDOW_REDRAW 2034 | JMP AILP 2035 | 2036 | ELEV_OPEN_FULL: 2037 | LDX UNIT 2038 | EVOF1: ;CLOSE DOOR 2039 | ;check for object in the way first. 2040 | LDA UNIT_LOC_X,X 2041 | STA MAP_X 2042 | LDA UNIT_LOC_Y,X 2043 | STA MAP_Y 2044 | JSR GET_TILE_FROM_MAP 2045 | LDA TILE 2046 | CMP #09 ;FLOOR-TILE 2047 | BEQ EVOF3 2048 | ;SOMETHING IN THE WAY, ABORT 2049 | EVOF2: LDA #35 2050 | STA UNIT_TIMER_A,X 2051 | JMP AILP 2052 | EVOF3: ;check for player or robot in the way 2053 | JSR CHECK_FOR_UNIT 2054 | LDX UNIT 2055 | LDA UNIT_FIND 2056 | CMP #255 2057 | BNE EVOF2 2058 | EVOFB: ;START TO CLOSE ELEVATOR DOOR 2059 | LDA #14 ;DOOR SOUND 2060 | JSR PLAY_SOUND ;SOUND PLAY 2061 | LDX UNIT 2062 | LDA #181 2063 | STA DOORPIECE1 2064 | LDA #89 2065 | STA DOORPIECE2 2066 | LDA #173 2067 | STA DOORPIECE3 2068 | JSR DRAW_HORIZONTAL_DOOR 2069 | LDX UNIT 2070 | LDA #3 2071 | STA UNIT_B,X 2072 | LDA #5 2073 | STA UNIT_TIMER_A,X 2074 | JSR CHECK_FOR_WINDOW_REDRAW 2075 | JMP AILP 2076 | 2077 | ELEV_CLOSE_A: 2078 | LDA #84 2079 | STA DOORPIECE1 2080 | LDA #85 2081 | STA DOORPIECE2 2082 | LDA #173 2083 | STA DOORPIECE3 2084 | JSR DRAW_HORIZONTAL_DOOR 2085 | LDY UNIT 2086 | LDA #4 2087 | STA UNIT_B,X 2088 | LDA #5 2089 | STA UNIT_TIMER_A,X 2090 | JSR CHECK_FOR_WINDOW_REDRAW 2091 | JMP AILP 2092 | 2093 | ELEV_CLOSE_B: 2094 | LDA #80 2095 | STA DOORPIECE1 2096 | LDA #81 2097 | STA DOORPIECE2 2098 | LDA #174 2099 | STA DOORPIECE3 2100 | JSR DRAW_HORIZONTAL_DOOR 2101 | LDY UNIT 2102 | LDA #5 2103 | STA UNIT_B,X 2104 | LDA #5 2105 | STA UNIT_TIMER_A,X 2106 | JSR CHECK_FOR_WINDOW_REDRAW 2107 | JSR ELEVATOR_PANEL 2108 | JMP AILP 2109 | 2110 | ELEV_CLOSE_FULL: 2111 | LDX UNIT 2112 | JSR DOOR_CHECK_PROXIMITY 2113 | LDA PROX_DETECT 2114 | CMP #0 2115 | BNE EVF1 2116 | LDA #20 2117 | STA UNIT_TIMER_A,X ;RESET TIMER 2118 | JMP AILP 2119 | EVF1: ;Start open door process 2120 | LDA #14 ;DOOR SOUND 2121 | JSR PLAY_SOUND ;SOUND PLAY 2122 | LDX UNIT 2123 | LDA #84 2124 | STA DOORPIECE1 2125 | LDA #85 2126 | STA DOORPIECE2 2127 | LDA #173 2128 | STA DOORPIECE3 2129 | JSR DRAW_HORIZONTAL_DOOR 2130 | LDY UNIT 2131 | LDA #0 2132 | STA UNIT_B,X 2133 | LDA #5 2134 | STA UNIT_TIMER_A,X 2135 | JSR CHECK_FOR_WINDOW_REDRAW 2136 | JMP AILP 2137 | 2138 | ELEVATOR_PANEL: 2139 | ;Check to see if player is standing in the 2140 | ;elevator first. 2141 | LDX UNIT 2142 | LDA UNIT_LOC_X,X ;elevator X location 2143 | CMP UNIT_LOC_X ;player X location 2144 | BEQ ELPN1 2145 | RTS 2146 | ELPN1: LDA UNIT_LOC_Y,X ;elevator Y location 2147 | SEC 2148 | SBC #01 2149 | CMP UNIT_LOC_Y ;player Y location 2150 | BEQ ELPN2 2151 | RTS 2152 | ELPN2: ;PLAYER DETECTED, START ELEVATOR PANEL 2153 | LDA #MSG_ELEVATOR 2156 | STA $FC 2157 | JSR PRINT_INFO 2158 | LDA #MSG_LEVELS 2161 | STA $FC 2162 | JSR PRINT_INFO 2163 | JSR ELEVATOR_SELECT 2164 | RTS 2165 | 2166 | PLOT_TILE_TO_MAP: 2167 | LDY #0 2168 | LDA MAP_Y 2169 | CLC 2170 | ROR 2171 | PHP 2172 | CLC 2173 | ADC #>MAP 2174 | STA $FE ;HIGH BYTE OF MAP SOURCE 2175 | LDA #$0 2176 | PLP 2177 | ROR 2178 | ORA MAP_X 2179 | STA $FD ;LOW BYTE OF MAP SOURCE 2180 | LDA TILE 2181 | STA ($FD),Y 2182 | RTS 2183 | 2184 | ;This routine will return the tile for a specific X/Y 2185 | ;on the map. You must first define MAP_X and MAP-Y. 2186 | ;The result is stored in TILE. 2187 | GET_TILE_FROM_MAP: 2188 | LDY #0 2189 | LDA MAP_Y 2190 | CLC 2191 | ROR 2192 | PHP 2193 | CLC 2194 | ADC #>MAP 2195 | STA $FE ;HIGH BYTE OF MAP SOURCE 2196 | LDA #$0 2197 | PLP 2198 | ROR 2199 | ORA MAP_X 2200 | STA $FD ;LOW BYTE OF MAP SOURCE 2201 | LDA ($FD),Y 2202 | STA TILE 2203 | RTS 2204 | 2205 | ;In this AI routine, the droid simply goes left until it 2206 | ;hits an object, and then reverses direction and does the 2207 | ;same, bouncing back and forth. 2208 | LEFT_RIGHT_DROID: 2209 | LDX UNIT 2210 | JSR HOVERBOT_ANIMATE 2211 | LDA #10 ;reset timer to 10 2212 | STA UNIT_TIMER_A,X 2213 | LDA UNIT_A,X ;GET DIRECTION 2214 | CMP #1 ;0=LEFT 1=RIGHT 2215 | BEQ LRD01 2216 | LDA #%00000010 2217 | STA MOVE_TYPE 2218 | JSR REQUEST_WALK_LEFT 2219 | LDA MOVE_RESULT 2220 | CMP #1 2221 | BEQ LRD02 2222 | LDA #1 2223 | LDX UNIT 2224 | STA UNIT_A,X ;CHANGE DIRECTION 2225 | JSR CHECK_FOR_WINDOW_REDRAW 2226 | JMP AILP 2227 | LRD01: LDA #%00000010 2228 | STA MOVE_TYPE 2229 | JSR REQUEST_WALK_RIGHT 2230 | LDA MOVE_RESULT 2231 | CMP #1 2232 | BEQ LRD02 2233 | LDA #0 2234 | LDX UNIT 2235 | STA UNIT_A,X ;CHANGE DIRECTION 2236 | LRD02: JSR CHECK_FOR_WINDOW_REDRAW 2237 | JMP AILP 2238 | 2239 | ;In this AI routine, the droid simply goes UP until it 2240 | ;hits an object, and then reverses direction and does the 2241 | ;same, bouncing back and forth. 2242 | UP_DOWN_DROID: 2243 | LDX UNIT 2244 | JSR HOVERBOT_ANIMATE 2245 | LDA #10 ;reset timer to 10 2246 | STA UNIT_TIMER_A,X 2247 | LDA UNIT_A,X ;GET DIRECTION 2248 | CMP #1 ;0=UP 1=DOWN 2249 | BEQ UDD01 2250 | LDA #%00000010 2251 | STA MOVE_TYPE 2252 | JSR REQUEST_WALK_UP 2253 | LDA MOVE_RESULT 2254 | CMP #1 2255 | BEQ UDD02 2256 | LDA #1 2257 | LDX UNIT 2258 | STA UNIT_A,X ;CHANGE DIRECTION 2259 | JSR CHECK_FOR_WINDOW_REDRAW 2260 | JMP AILP 2261 | UDD01: LDA #%00000010 2262 | STA MOVE_TYPE 2263 | JSR REQUEST_WALK_DOWN 2264 | LDA MOVE_RESULT 2265 | CMP #1 2266 | BEQ UDD02 2267 | LDA #0 2268 | LDX UNIT 2269 | STA UNIT_A,X ;CHANGE DIRECTION 2270 | UDD02: JSR CHECK_FOR_WINDOW_REDRAW 2271 | JMP AILP 2272 | 2273 | HOVERBOT_ANIMATE: 2274 | LDA UNIT_TIMER_B,X 2275 | CMP #0 2276 | BEQ HOVAN2 2277 | DEC UNIT_TIMER_B,X 2278 | RTS 2279 | HOVAN2: LDA #3 2280 | STA UNIT_TIMER_B,X ;RESET ANIMATE TIMER 2281 | LDA UNIT_TILE,X 2282 | CMP #98 2283 | BNE HOVAN1 2284 | LDA #99 ;HOVERBOT TILE 2285 | STA UNIT_TILE,X 2286 | RTS 2287 | HOVAN1: LDA #98 ;HOVERBOT TILE 2288 | STA UNIT_TILE,X 2289 | RTS 2290 | 2291 | ;The following 4 routines are used by both the player and some 2292 | ;of the enemy units. It checks to see if you can walk in a 2293 | ;specific direction. It checks for edge of map and also that 2294 | ;the tile you want to walk onto can allow that. There is a 2295 | ;separate routine for hovering robots. 2296 | REQUEST_WALK_RIGHT: 2297 | LDY UNIT 2298 | LDA UNIT_LOC_X,Y 2299 | CMP #122 2300 | BEQ MGR01 2301 | STA MAP_X 2302 | INC MAP_X 2303 | LDA UNIT_LOC_Y,Y 2304 | STA MAP_Y 2305 | JSR GET_TILE_FROM_MAP 2306 | LDY TILE 2307 | LDA TILE_ATTRIB,Y 2308 | AND MOVE_TYPE ;Check, can walk on this tile? 2309 | CMP MOVE_TYPE 2310 | BNE MGR01 2311 | JSR CHECK_FOR_UNIT 2312 | LDA UNIT_FIND 2313 | CMP #255 2314 | BNE MGR01 2315 | LDX UNIT 2316 | INC UNIT_LOC_X,X 2317 | LDA #1 ;Move success 2318 | STA MOVE_RESULT 2319 | RTS 2320 | MGR01: LDA #0 ;Move fail 2321 | STA MOVE_RESULT 2322 | RTS 2323 | 2324 | REQUEST_WALK_LEFT: 2325 | LDY UNIT 2326 | LDA UNIT_LOC_X,Y 2327 | CMP #5 2328 | BEQ MGL01 2329 | STA MAP_X 2330 | DEC MAP_X 2331 | LDA UNIT_LOC_Y,Y 2332 | STA MAP_Y 2333 | JSR GET_TILE_FROM_MAP 2334 | LDY TILE 2335 | LDA TILE_ATTRIB,Y 2336 | AND MOVE_TYPE ;Check, can walk on this tile? 2337 | CMP MOVE_TYPE 2338 | BNE MGL01 2339 | JSR CHECK_FOR_UNIT 2340 | LDA UNIT_FIND 2341 | CMP #255 2342 | BNE MGL01 2343 | LDX UNIT 2344 | DEC UNIT_LOC_X,X 2345 | LDA #1 ;Move success 2346 | STA MOVE_RESULT 2347 | RTS 2348 | MGL01: LDA #0 ;Move fail 2349 | STA MOVE_RESULT 2350 | RTS 2351 | 2352 | REQUEST_WALK_DOWN: 2353 | LDY UNIT 2354 | LDA UNIT_LOC_Y,Y 2355 | CMP #60 2356 | BEQ MGD01 2357 | STA MAP_Y 2358 | INC MAP_Y 2359 | LDA UNIT_LOC_X,Y 2360 | STA MAP_X 2361 | JSR GET_TILE_FROM_MAP 2362 | LDY TILE 2363 | LDA TILE_ATTRIB,Y 2364 | AND MOVE_TYPE ;Check, can walk on this tile? 2365 | CMP MOVE_TYPE 2366 | BNE MGD01 2367 | JSR CHECK_FOR_UNIT 2368 | LDA UNIT_FIND 2369 | CMP #255 2370 | BNE MGD01 2371 | LDX UNIT 2372 | INC UNIT_LOC_Y,X 2373 | LDA #1 ;Move success 2374 | STA MOVE_RESULT 2375 | RTS 2376 | MGD01: LDA #0 ;Move fail 2377 | STA MOVE_RESULT 2378 | RTS 2379 | 2380 | REQUEST_WALK_UP: 2381 | LDY UNIT 2382 | LDA UNIT_LOC_Y,Y 2383 | CMP #3 2384 | BEQ MGU01 2385 | STA MAP_Y 2386 | DEC MAP_Y 2387 | LDA UNIT_LOC_X,Y 2388 | STA MAP_X 2389 | JSR GET_TILE_FROM_MAP 2390 | LDY TILE 2391 | LDA TILE_ATTRIB,Y 2392 | AND MOVE_TYPE ;Check, can walk on this tile? 2393 | CMP MOVE_TYPE 2394 | BNE MGU01 2395 | JSR CHECK_FOR_UNIT 2396 | LDA UNIT_FIND 2397 | CMP #255 2398 | BNE MGU01 2399 | LDX UNIT 2400 | DEC UNIT_LOC_Y,X 2401 | LDA #1 ;Move success 2402 | STA MOVE_RESULT 2403 | RTS 2404 | MGU01: LDA #0 ;Move fail 2405 | STA MOVE_RESULT 2406 | RTS 2407 | 2408 | ;This routine checks a specific place on the map specified 2409 | ;in MAP_X and MAP_Y to see if there is a unit present at 2410 | ;that spot. If so, the unit# will be stored in UNIT_FIND 2411 | ;otherwise 255 will be stored. 2412 | CHECK_FOR_UNIT: 2413 | LDX #0 2414 | CFU00: LDA UNIT_TYPE,X 2415 | CMP #0 2416 | BNE CFU02 2417 | CFU01: INX 2418 | CPX #28 2419 | BNE CFU00 2420 | LDA #255 2421 | STA UNIT_FIND ;no units found 2422 | RTS 2423 | CFU02: LDA UNIT_LOC_X,X 2424 | CMP MAP_X 2425 | BNE CFU01 2426 | LDA UNIT_LOC_Y,X 2427 | CMP MAP_Y 2428 | BNE CFU01 2429 | STX UNIT_FIND ;unit found 2430 | RTS 2431 | 2432 | ;This routine checks a specific place on the map specified 2433 | ;in MAP_X and MAP_Y to see if there is a hidden unit present 2434 | ;at that spot. If so, the unit# will be stored in UNIT_FIND 2435 | ;otherwise 255 will be stored. 2436 | CHECK_FOR_HIDDEN_UNIT: 2437 | LDX #48 2438 | CFH00: LDA UNIT_TYPE,X 2439 | CMP #0 2440 | BNE CFH02 2441 | CFH01: INX 2442 | CPX #64 2443 | BNE CFH00 2444 | LDA #255 2445 | STA UNIT_FIND ;no units found 2446 | RTS 2447 | CFH02: ;first compare horizontal position 2448 | LDA UNIT_LOC_X,X 2449 | CMP MAP_X 2450 | BEQ CFH05 2451 | BCC CFH03 2452 | JMP CFH01 2453 | CFH03: CLC 2454 | ADC UNIT_C,X ;add hidden unit width 2455 | CMP MAP_X 2456 | BCC CFH01 2457 | CFH05: ;now compare vertical position 2458 | LDA UNIT_LOC_Y,X 2459 | CMP MAP_Y 2460 | BEQ CFH10 2461 | BCC CFH06 2462 | JMP CFH01 2463 | CFH06: CLC 2464 | ADC UNIT_D,X ;add hidden unit HEIGHT 2465 | CMP MAP_Y 2466 | BCC CFH01 2467 | CFH10: STX UNIT_FIND ;unit found 2468 | RTS 2469 | 2470 | ;NOTES ABOUT UNIT TYPES 2471 | ;---------------------- 2472 | ;000=no unit (does not exist) 2473 | ;001=player unit 2474 | ;002=hoverbot left-to-right 2475 | ;003=hoverbot up-down 2476 | ;004=hoverbot attack mode 2477 | ;005=hoverbot chase player 2478 | ;006= 2479 | ;007=transporter 2480 | ;008= 2481 | ;009=evilbot chase player 2482 | ;010=door 2483 | ;011=small explosion 2484 | ;012=pistol fire up 2485 | ;013=pistol fire down 2486 | ;014=pistol fire left 2487 | ;015=pistol fire right 2488 | ;016=trash compactor 2489 | ;017= 2490 | ;018= 2491 | ;019= 2492 | ;020= 2493 | 2494 | ;NOTES ABOUT UNIT NUMBERING SCHEME 2495 | ;--------------------------------- 2496 | ;0 = player unit 2497 | ;1-27 = enemy robots (max 28 units) 2498 | ;28-31 = weapons fire 2499 | ;32-47 = doors and other units that don't have sprites (max 16 units) 2500 | ;48-63 = hidden objects to be found (max 16 units) 2501 | 2502 | ;NOTES ABOUT DOORS. 2503 | ;------------------- 2504 | ;A-0=horitzonal 1=vertical 2505 | ;B-0=opening-A 1=opening-B 2=OPEN / 3=closing-A 4=closing-B 5-CLOSED 2506 | ;C-0=unlocked / 1=locked spade 2=locked heart 3=locked star 2507 | ;D-0=automatic / 0=manual 2508 | 2509 | ;HIDDEN OBJECTS 2510 | ;-------------- 2511 | ;UNIT_TYPE:128=key UNIT_A: 0=SPADE 1=HEART 2=STAR 2512 | ;UNIT_TYPE:129=time bomb 2513 | ;UNIT_TYPE:130=EMP 2514 | ;UNIT_TYPE:131=pistol 2515 | ;UNIT_TYPE:132=charged plasma gun 2516 | ;UNIT_TYPE:133=medkit 2517 | ;UNIT_TYPE:134=magnet 2518 | 2519 | ;NOTES ABOUT TRANSPORTER 2520 | ;---------------------- 2521 | ;UNIT_A: 0=always active 1=only active when all robots are dead 2522 | ;UNIT_B: 0=completes level 1=send to coordinates 2523 | ;UNIT_C: X-coordinate 2524 | ;UNIT_D: Y-coordinate 2525 | 2526 | ;Sound Effects 2527 | ;---------------------- 2528 | ;0 explosion 2529 | ;1 small explosion 2530 | ;2 medkit 2531 | ;3 emp 2532 | ;4 haywire 2533 | ;5 evilbot 2534 | ;6 move 2535 | ;7 electric shock 2536 | ;8 plasma gun 2537 | ;9 fire pistol 2538 | ;10 item found 2539 | ;11 error 2540 | ;12 change weapons 2541 | ;13 change items 2542 | ;14 door 2543 | ;15 menu beep 2544 | ;16 walk 2545 | ;17 sfx (short beep) 2546 | ;18 sfx 2547 | -------------------------------------------------------------------------------- /VICROBOTS.ASM: -------------------------------------------------------------------------------- 1 | ;PETSCII Robots (VIC-20 version) 2 | ;by David Murray 2020 3 | ;dfwgreencars@gmail.com 4 | 5 | !to "vicrobots",cbm 6 | 7 | *=$1201 ;START ADDRESS IS $1201 8 | DESTRUCT_PATH =$A000 ;Destruct path array (256 bytes) 9 | TILE_ATTRIB =$A100 ;Tile attrib array (256 bytes) 10 | TILE_DATA_TL =$A200 ;Tile character top-left (256 bytes) 11 | TILE_DATA_TM =$A300 ;Tile character top-middle (256 bytes) 12 | TILE_DATA_TR =$A400 ;Tile character top-right (256 bytes) 13 | TILE_DATA_ML =$A500 ;Tile character middle-left (256 bytes) 14 | TILE_DATA_MM =$A600 ;Tile character middle-middle (256 bytes) 15 | TILE_DATA_MR =$A700 ;Tile character middle-right (256 bytes) 16 | TILE_DATA_BL =$A800 ;Tile character bottom-left (256 bytes) 17 | TILE_DATA_BM =$A900 ;Tile character bottom-middle (256 bytes) 18 | TILE_DATA_BR =$AA00 ;Tile character bottom-right (256 bytes) 19 | TILE_COLOR_TL =$AB00 ;Tile color top-left (256 bytes) (C64/VIC/TED VERSION ONLY) 20 | TILE_COLOR_TM =$AC00 ;Tile color top-middle (256 bytes) (C64/VIC/TED VERSION ONLY) 21 | TILE_COLOR_TR =$AD00 ;Tile color top-right (256 bytes) (C64/VIC/TED VERSION ONLY) 22 | TILE_COLOR_ML =$AE00 ;Tile color middle-left (256 bytes) (C64/VIC/TED VERSION ONLY) 23 | TILE_COLOR_MM =$AF00 ;Tile color middle-middle (256 bytes) (C64/VIC/TED VERSION ONLY) 24 | TILE_COLOR_MR =$B000 ;Tile color middle-right (256 bytes) (C64/VIC/TED VERSION ONLY) 25 | TILE_COLOR_BL =$B100 ;Tile color bottom-left (256 bytes) (C64/VIC/TED VERSION ONLY) 26 | TILE_COLOR_BM =$B200 ;Tile color bottom-middle (256 bytes) (C64/VIC/TED VERSION ONLY) 27 | TILE_COLOR_BR =$B300 ;Tile color bottom-right (256 bytes) (C64/VIC/TED VERSION ONLY) 28 | PEST_SOUND =$0400 ;Sound system base address 29 | PLAY_SOUND =$0415 ;play sound effect 30 | 31 | ;***These arrays can go anywhere in RAM*** 32 | UNIT_TIMER_A =$0E00 ;Primary timer for units (64 bytes) 33 | UNIT_TIMER_B =$0E40 ;Secondary timer for units (64 bytes) 34 | UNIT_TILE =$0E80 ;Current tile assigned to unit (32 bytes) 35 | ;UNIT_ALT_MOVE =$0EA0 ;For moving around objects (32 bytes) 36 | ;UNIT_DEST_X =$0EC0 ;Destination X coordinate (32 bytes) 37 | ;UNIT_DEST_Y =$0EE0 ;Destination X coordinate (32 bytes) 38 | EXP_BUFFER =$0F00 ;Explosion Buffer (16 bytes) 39 | MAP_PRECALC =$0F10 ;Stores pre-calculated objects for map window (49 bytes) 40 | ;The following addresses are used to store the current 41 | ;state of the SNES buttons. 42 | SNES_B =$0F41 43 | SNES_Y =$0F42 44 | SNES_SELECT =$0F43 45 | SNES_START =$0F44 46 | SNES_UP =$0F45 47 | SNES_DOWN =$0F46 48 | SNES_LEFT =$0F47 49 | SNES_RIGHT =$0F48 50 | SNES_A =$0F49 51 | SNES_X =$0F4A 52 | SNES_BACK_L =$0F4B 53 | SNES_BACK_R =$0F4C 54 | ;The following addresses are used to store the last 55 | ;state of the SNES buttons so that we can determine 56 | ;if a button was released. 57 | LAST_B =$0F4D 58 | LAST_Y =$0F4E 59 | LAST_SELECT =$0F4F 60 | LAST_START =$0F50 61 | LAST_UP =$0F51 62 | LAST_DOWN =$0F52 63 | LAST_LEFT =$0F53 64 | LAST_RIGHT =$0F54 65 | LAST_A =$0F55 66 | LAST_X =$0F56 67 | LAST_BACK_L =$0F57 68 | LAST_BACK_R =$0F58 69 | 70 | ;The following addresses are used to store new 71 | ;presses of the SNES buttons. Once they are set 72 | ;as a 1, it requires the game to reset them to 73 | ;0 when it is ready to be read again. 74 | NEW_B =$0F59 75 | NEW_Y =$0F5A 76 | NEW_SELECT =$0F5B 77 | NEW_START =$0F5C 78 | NEW_UP =$0F5D 79 | NEW_DOWN =$0F5E 80 | NEW_LEFT =$0F5F 81 | NEW_RIGHT =$0F60 82 | NEW_A =$0F61 83 | NEW_X =$0F62 84 | NEW_BACK_L =$0F63 85 | NEW_BACK_R =$0F64 86 | 87 | ;The following are the locations where the current 88 | ;key controls are stored. These must be set before 89 | ;the game can start. 90 | KEY_MOVE_UP =$0F65 91 | KEY_MOVE_DOWN =$0F66 92 | KEY_MOVE_LEFT =$0F67 93 | KEY_MOVE_RIGHT =$0F68 94 | KEY_FIRE_UP =$0F69 95 | KEY_FIRE_DOWN =$0F6A 96 | KEY_FIRE_LEFT =$0F6B 97 | KEY_FIRE_RIGHT =$0F6C 98 | KEY_CYCLE_WEAPONS =$0F6D 99 | KEY_CYCLE_ITEMS =$0F6E 100 | KEY_USE =$0F6F 101 | KEY_SEARCH =$0F70 102 | KEY_MOVE =$0F71 103 | 104 | ;***MAP FILES CONSIST OF EVERYTHING FROM THIS POINT ON*** 105 | UNIT_TYPE =$5D00 ;Unit type 0=none (64 bytes) 106 | UNIT_LOC_X =$5D40 ;Unit X location (64 bytes) 107 | UNIT_LOC_Y =$5D80 ;Unit X location (64 bytes) 108 | UNIT_A =$5DC0 109 | UNIT_B =$5E00 110 | UNIT_C =$5E40 111 | UNIT_D =$5E80 112 | UNIT_HEALTH =$5EC0 ;Unit health (0 to 11) (64 bytes) 113 | MAP =$6000 ;Location of MAP (8K) 114 | ;***END OF MAP FILE*** 115 | 116 | ;*** Zero Page locations used *** 117 | TILE =$23 ;The tile number to be plotted 118 | TEMP_X =$24 ;Temporarily used for loops 119 | TEMP_Y =$25 ;Temporarily used for loops 120 | MAP_X =$26 ;Current X location on map 121 | MAP_Y =$27 ;Current Y location on map 122 | MAP_WINDOW_X =$28 ;Top left location of what is displayed in map window 123 | MAP_WINDOW_Y =$29 ;Top left location of what is displayed in map window 124 | DECNUM =$2A ;a decimal number to be displayed onscreen as 3 digits. 125 | ATTRIB =$2B ;Tile attribute value 126 | UNIT =$2C ;Current unit being processed 127 | TEMP_A =$2D ;used within some routines 128 | TEMP_B =$2E ;used within some routines 129 | TEMP_C =$2F ;used within some routines 130 | TEMP_D =$30 ;used within some routines 131 | CURSOR_X =$31 ;For on-screen cursor 132 | CURSOR_Y =$32 ;For on-screen cursor 133 | CURSOR_ON =$33 ;Is cursor active or not? 1=yes 0=no 134 | REDRAW_WINDOW =$34 ;1=yes 0=no 135 | MOVE_RESULT =$35 ;1=Move request success, 0=fail. 136 | UNIT_FIND =$36 ;255=no unit present. 137 | MOVE_TYPE =$37 ;%00000001=WALK %00000010=HOVER 138 | SCREEN_SHAKE =$38 ;0=NO 1=YES 139 | PRECALC_COUNT =$39 ;part of screen draw routine 140 | 141 | BASIC !BYTE $0C,$12,$01,$00,$9E,$20,$34,$36,$32,$32,$00,$00,$00 142 | ;Adds BASIC line: 1 SYS 4622 143 | JMP $1272 144 | 145 | *=$1272 ;Must leave padding for video RAM at $1000-$1271 146 | LDA #%00101000 ;Pins 3 & 5 are output 147 | STA $9112 ;Data-direction-register for userport 148 | LDA #$0E ;black with blue border 149 | STA $900F ;set fore/background 150 | LDA #$80 151 | STA $0291 ;Disable character set switching 152 | LDA #$15 153 | STA $D018 ;enable upper-case character set 154 | JSR DISPLAY_LOAD_MESSAGE1 155 | JSR TILE_LOAD_ROUTINE 156 | JSR SOUND_LOAD_ROUTINE 157 | LDA #0 158 | STA SCREEN_SHAKE 159 | JSR SETUP_INTERRUPT 160 | JSR SET_CONTROLS ;copy initial key controls 161 | JSR PEST_SOUND ;INIT SOUNND ROUTINE 162 | JSR SET_SCREEN_SIZE 163 | JMP INTRO_SCREEN 164 | INIT_GAME: 165 | LDA #0 166 | STA SCREEN_SHAKE 167 | JSR DISPLAY_GAME_SCREEN 168 | JSR DISPLAY_LOAD_MESSAGE2 169 | JSR RESET_KEYS_AMMO 170 | JSR MAP_LOAD_ROUTINE 171 | JSR SET_DIFF_LEVEL 172 | JSR ANIMATE_PLAYER 173 | JSR CACULATE_AND_REDRAW 174 | JSR DRAW_MAP_WINDOW 175 | JSR DISPLAY_PLAYER_HEALTH 176 | JSR DISPLAY_KEYS 177 | JSR DISPLAY_WEAPON 178 | LDA #1 179 | STA UNIT_TYPE 180 | LDA #97 181 | STA UNIT_TILE 182 | JSR SET_INITIAL_TIMERS 183 | JSR PRINT_INTRO_MESSAGE 184 | LDA #30 185 | STA KEYTIMER 186 | JMP MAIN_GAME_LOOP 187 | 188 | TILENAME !PET"tileset.vic" 189 | MAPNAME !PET"level-a" 190 | SNDNAME !PET"pdrv-vic" 191 | MUSICNAME !PET"music0.vic" 192 | LOADMSG1 !PET 5,"loading tiles...",13 193 | KEYS !BYTE 00 ;bit 0=spade bit2=heart bit3=star 194 | AMMO_PISTOL !BYTE 00 ;how much ammo for the pistol 195 | AMMO_PLASMA !BYTE 00 ;how many shots of the plasmagun 196 | INV_BOMBS !BYTE 00 ;How many bombs do we have 197 | INV_EMP !BYTE 00 ;How many EMPs do we have 198 | INV_MEDKIT !BYTE 00 ;How many medkits do we have? 199 | INV_MAGNET !BYTE 00 ;How many magnets do we have? 200 | SELECTED_WEAPON !BYTE 00 ;0=none 1=pistol 2=plasmagun 201 | SELECTED_ITEM !BYTE 00 ;0=none 1=bomb 2=emp 3=medkit 202 | ANIMATE !BYTE 01 ;0=DISABLED 1=ENABLED 203 | BIG_EXP_ACT !BYTE 00 ;0=No explosion active 1=big explosion active 204 | MAGNET_ACT !BYTE 00 ;0=no magnet active 1=magnet active 205 | PLASMA_ACT !BYTE 00 ;0=No Plasma active 1=plasma active 206 | RANDOM !BYTE 00 ;used for random number generation 207 | CONTROL !BYTE 00 ;0=keyboard 1=custom keys 2=snes 208 | MUSIC_STATE !BYTE 00 ;0=music off 1=music on 209 | PLAYER_DIR !BYTE 01 ;0=UP 1=DOWN 2=LEFT 3=RIGHT 210 | PLAYER_ANI !BYTE 56 ;0=ANIM1 56=ANIM2 211 | INTRO_MESSAGE !SCR"vic-robots! by",255 212 | !SCR"david murray 2021",0 213 | MSG_CANTMOVE !SCR"can't move that!",0 214 | MSG_BLOCKED !SCR"blocked!",0 215 | MSG_SEARCHING !SCR"searching",0 216 | MSG_NOTFOUND !SCR"nothing found here",0 217 | MSG_FOUNDKEY !SCR"found a key card!",0 218 | MSG_FOUNDGUN !SCR"found a pistol!",0 219 | MSG_FOUNDEMP !SCR"found emp device!",0 220 | MSG_FOUNDBOMB !SCR"found a timebomb!",0 221 | MSG_FOUNDPLAS !SCR"found a plasmagun!",0 222 | MSG_FOUNDMED !SCR"found a medkit!",0 223 | MSG_FOUNDMAG !SCR"found a magnet!",0 224 | 225 | *=$13FE ;CHARSET GOES HERE 226 | !BINARY "gfxfont.prg" 227 | 228 | MSG_MUCHBET !SCR"ahhh, much better!",0 229 | MSG_EMPUSED !SCR"emp activated!",255 230 | !SCR"robots rebooting.",0 231 | MSG_TERMINATED !SCR"you're terminated!",0 232 | MSG_TRANS1 !SCR"transporter won't",255 233 | !SCR"activate until all",255 234 | !SCR"robots destroyed!",0 235 | MSG_ELEVATOR !SCR"[ elevator panel ]",255 236 | !SCR"[ select level ]",0 237 | MSG_LEVELS !SCR"[ ]",0 238 | MSG_PAUSED !SCR"game paused.",255 239 | !SCR"exit game (y/n)",0 240 | SELECTED_MAP !BYTE 00 241 | 242 | ;Reconfigures VIC-20 screen to 25x25 characters 243 | ;uses sound routine to check if PAL or NTSC. 244 | SET_SCREEN_SIZE: 245 | LDA #25 ;Number of columns to display on VIC 246 | STA $9002 ;Send to VIC. also sets COLOR RAM to $9400 247 | LDA #50 ;Number of rows (times two) for VIC 248 | STA $9003 ;Send to VIC 249 | JSR PEST_SOUND+27 250 | CMP #0 251 | BNE PAL 252 | ;NTSC MODE 253 | LDA #1 254 | STA $9000 ;horizontal offset 255 | LDA #22 256 | STA $9001 ;vertical offset 257 | RTS 258 | PAL: LDA #9 259 | STA SHAKE3+1 260 | LDA #10 261 | STA SHAKE4+1 262 | LDA #35 263 | STA $9001 ;vertical offset 264 | RTS 265 | 266 | DISPLAY_LOAD_MESSAGE1: 267 | LDY #0 268 | DLM1: 269 | LDA LOADMSG1,Y 270 | JSR $FFD2 271 | INY 272 | CPY #18 273 | BNE DLM1 274 | RTS 275 | 276 | ;Displays loading message for map. 277 | DISPLAY_LOAD_MESSAGE2: 278 | LDY #0 279 | DLM2: LDA LOAD_MSG2,Y 280 | STA $10FA,Y 281 | INY 282 | CPY #12 283 | BNE DLM2 284 | LDA SELECTED_MAP 285 | STA DECNUM 286 | INC DECNUM 287 | LDA #$06 288 | STA $FB 289 | LDA #$11 290 | STA $FC 291 | JSR DECWRITE 292 | RTS 293 | LOAD_MSG2: !SCR"loading map:" 294 | 295 | SETUP_INTERRUPT: 296 | SEI ; Disable interrupt routine 297 | LDA #RUNIRQ 300 | STA $0315 301 | CLI ; Reenable routine. 302 | RTS 303 | 304 | ;This is the routine that runs every 60 seconds from the IRQ. 305 | ;BGTIMER1 is always set to 1 every cycle, after which the main 306 | ;program will reset it to 0 when it is done with it's work for 307 | ;that cycle. BGTIMER2 is a count-down to zero and then stays 308 | ;there. 309 | RUNIRQ: 310 | JSR ANIMATE_WATER 311 | LDA #1 312 | STA BGTIMER1 313 | LDA BGTIMER2 314 | CMP #0 315 | BEQ IRQ1 316 | DEC BGTIMER2 317 | IRQ1: LDA KEYTIMER 318 | CMP #0 319 | BEQ IRQ2 320 | DEC KEYTIMER 321 | IRQ2: ;BORDER FLASHER 322 | LDX BORDER 323 | CPX #0 324 | BEQ IRQ3 325 | LDA BORDER,X 326 | STA $900F 327 | DEC BORDER 328 | ;BACKGROUND FLASHER 329 | IRQ3: LDX BGFLASH 330 | CPX #0 331 | BEQ IRQ10 332 | LDA BGFLASH,X 333 | STA $900F 334 | DEC BGFLASH 335 | IRQ10: ;SCREEN_SHAKER 336 | LDA SCREEN_SHAKE 337 | CMP #$00 338 | BEQ SHAKE3 339 | SHAKE2: LDA $9000 ;X-SCROLL REGISTER 340 | AND #%00000001 341 | CMP #%00000001 342 | BEQ SHAKE4 343 | SHAKE3: LDA #%00000001 344 | STA $9000 345 | JMP IRQ20 346 | SHAKE4: LDA #%00000000 347 | STA $9000 348 | ;CHECK TO SEE IF KEYBOARD WAS DISABLED 349 | ;This routine causes the kernal to skip keyboard 350 | ;input for one cycle to help "debounce" the 351 | ;keyboard. 352 | IRQ20: LDA $0289 ;1=normal 0=disabled 353 | CMP #0 354 | BNE IRQ30 355 | LDA KEYSOFF 356 | CMP #00 357 | BEQ IRQ21 358 | LDA #0 359 | STA KEYSOFF 360 | LDA #1 361 | STA $0289 ;turn keyboard back on 362 | JMP IRQ30: 363 | IRQ21: INC KEYSOFF 364 | IRQ30: JSR PEST_SOUND+$06 ;UPDATE Sound 365 | JMP $EABF ; Back to usual IRQ routine 366 | BGTIMER1 !BYTE 00 367 | BGTIMER2 !BYTE 00 368 | KEYTIMER !BYTE 00 369 | KEYSOFF !BYTE 00 370 | BORDER !BYTE 00,14,10,10,10,15,15,15,10,10,10 371 | BGFLASH !BYTE 00,14,104,232,232,30,30,30,232,232,104 372 | 373 | SNES_CONTROLER_READ: 374 | ;First copy last time's results to the LAST variables. 375 | LDY #0 376 | SNCL: LDA SNES_B,Y 377 | STA LAST_B,Y 378 | INY 379 | CPY #12 380 | BNE SNCL 381 | ;now latch data 382 | LDA #%00100000 ;latch on pin 5 383 | STA $9110 384 | LDA #%00000000 385 | STA $9110 386 | LDX #0 387 | ;Now read in bits 388 | SRLOOP: LDA $9110 389 | AND #%01000000 ;READ pin 6 390 | CMP #%01000000 391 | BEQ SRL1 392 | LDA #1 393 | JMP SRL5 394 | SRL1: LDA #0 395 | SRL5: STA SNES_B,X 396 | ;pulse the clock line 397 | LDA #%00001000 ;CLOCK on pin 3 398 | STA $9110 399 | LDA #%00000000 400 | STA $9110 401 | INX 402 | CPX #12 403 | BNE SRLOOP 404 | ;now process any new presses 405 | LDY #0 406 | SRL09: LDA NEW_B,Y 407 | CMP #1 408 | BEQ SRL10 409 | LDA SNES_B,Y 410 | CMP #1 411 | BNE SRL10 412 | LDA LAST_B,Y 413 | CMP #0 414 | BNE SRL10 415 | LDA #1 416 | STA NEW_B,Y 417 | SRL10: INY 418 | CPY #12 419 | BNE SRL09 420 | RTS 421 | 422 | ;This routine spaces out the timers so that not everything 423 | ;is running out once. 424 | SET_INITIAL_TIMERS: 425 | LDX #01 426 | SIT1 TXA 427 | STA UNIT_TIMER_A,X 428 | LDA #0 429 | STA UNIT_TIMER_B,X 430 | INX 431 | CPX #48 432 | BNE SIT1 433 | RTS 434 | 435 | MAIN_GAME_LOOP: 436 | JSR BACKGROUND_TASKS 437 | LDA UNIT_TYPE 438 | CMP #1 ;Is player unit alive 439 | BEQ MG00 440 | JMP GAME_OVER 441 | MG00: LDA CONTROL 442 | CMP #2 443 | BNE KY01 444 | JMP SC01 445 | KY01: ;Keyboard controls here. 446 | JSR KEY_REPEAT 447 | JSR $FFE4 448 | CMP #$00 449 | BEQ MAIN_GAME_LOOP 450 | MG01: CMP #$1D ;CURSOR RIGHT 451 | BNE MG02 452 | MG01A: LDA #3 453 | STA PLAYER_DIR 454 | LDA #0 455 | STA UNIT 456 | LDA #%00000001 457 | STA MOVE_TYPE 458 | JSR REQUEST_WALK_RIGHT 459 | JMP AFTER_MOVE 460 | MG02: CMP #$9D ;CURSOR LEFT 461 | BNE MG03 462 | MG02A: LDA #2 463 | STA PLAYER_DIR 464 | LDA #0 465 | STA UNIT 466 | LDA #%00000001 467 | STA MOVE_TYPE 468 | JSR REQUEST_WALK_LEFT 469 | JMP AFTER_MOVE 470 | MG03: CMP #$11 ;CURSOR DOWN 471 | BNE MG04 472 | MG03A: LDA #1 473 | STA PLAYER_DIR 474 | LDA #0 475 | STA UNIT 476 | LDA #%00000001 477 | STA MOVE_TYPE 478 | JSR REQUEST_WALK_DOWN 479 | JMP AFTER_MOVE 480 | MG04: CMP #$91 ;CURSOR UP 481 | BNE MG05 482 | MG04A: LDA #0 483 | STA PLAYER_DIR 484 | LDA #0 485 | STA UNIT 486 | LDA #%00000001 487 | STA MOVE_TYPE 488 | JSR REQUEST_WALK_UP 489 | JMP AFTER_MOVE 490 | MG05: CMP #133 ;F1-Key 491 | BNE MG06 492 | JSR CYCLE_WEAPON 493 | JSR CLEAR_KEY_BUFFER 494 | JMP MAIN_GAME_LOOP 495 | MG06: CMP #134 ;F3-Key 496 | BNE MG07 497 | JSR CYCLE_ITEM 498 | JSR CLEAR_KEY_BUFFER 499 | JMP MAIN_GAME_LOOP 500 | MG07: CMP KEY_MOVE 501 | BNE MG08 502 | JSR MOVE_OBJECT 503 | JSR CLEAR_KEY_BUFFER 504 | JMP MAIN_GAME_LOOP 505 | MG08: CMP KEY_SEARCH 506 | BNE MG09 507 | JSR SEARCH_OBJECT 508 | JSR CLEAR_KEY_BUFFER 509 | JMP MAIN_GAME_LOOP 510 | MG09: CMP KEY_USE 511 | BNE MG10 512 | JSR USE_ITEM 513 | JSR CLEAR_KEY_BUFFER 514 | JMP MAIN_GAME_LOOP 515 | MG10: CMP KEY_MOVE_LEFT 516 | BNE MG11 517 | JMP MG02A 518 | MG11: CMP KEY_MOVE_DOWN 519 | BNE MG12 520 | JMP MG03A 521 | MG12: CMP KEY_MOVE_RIGHT 522 | BNE MG13 523 | JMP MG01A 524 | MG13: CMP KEY_MOVE_UP 525 | BNE MG14 526 | JMP MG04A 527 | MG14: CMP KEY_FIRE_UP 528 | BNE MG15 529 | JSR FIRE_UP 530 | LDA #20 531 | STA KEYTIMER 532 | JMP MAIN_GAME_LOOP 533 | MG15: CMP KEY_FIRE_LEFT 534 | BNE MG16 535 | JSR FIRE_LEFT 536 | LDA #20 537 | STA KEYTIMER 538 | JMP MAIN_GAME_LOOP 539 | MG16: CMP KEY_FIRE_DOWN 540 | BNE MG17 541 | JSR FIRE_DOWN 542 | LDA #20 543 | STA KEYTIMER 544 | JMP MAIN_GAME_LOOP 545 | MG17: CMP KEY_FIRE_RIGHT 546 | BNE MG18 547 | JSR FIRE_RIGHT 548 | LDA #20 549 | STA KEYTIMER 550 | JMP MAIN_GAME_LOOP 551 | MG18: CMP #03 ;RUN/STOP 552 | BNE MG19 553 | JMP PAUSE_GAME 554 | MG19: CMP #223 ;C= + * (cheat mode) 555 | BNE MG20 556 | JSR CHEATER 557 | JMP MAIN_GAME_LOOP 558 | MG20: CMP #205 ;SHIFT-M 559 | BNE MG21 560 | JSR TOGGLE_MUSIC 561 | JSR CLEAR_KEY_BUFFER 562 | MG21: JMP MAIN_GAME_LOOP 563 | 564 | SC01: ;SNES CONTROLLER starts here 565 | JSR SNES_CONTROLER_READ 566 | ;check keytimer for repeat time. 567 | LDA KEYTIMER 568 | CMP #0 569 | BEQ SC02 570 | JMP SC40 571 | SC02: LDA #0 572 | STA NEW_UP 573 | STA NEW_DOWN 574 | STA NEW_LEFT 575 | STA NEW_RIGHT 576 | STA SNES_UP 577 | STA SNES_DOWN 578 | STA SNES_LEFT 579 | STA SNES_RIGHT 580 | JSR SNES_CONTROLER_READ 581 | SC05: ;first we start with the 4 directional buttons. 582 | LDA NEW_LEFT 583 | CMP #01 584 | BNE SC10 585 | LDA #2 586 | STA PLAYER_DIR 587 | LDA #0 588 | STA UNIT 589 | LDA #%00000001 590 | STA MOVE_TYPE 591 | JSR REQUEST_WALK_LEFT 592 | JMP AFTER_MOVE_SNES 593 | SC10: LDA NEW_RIGHT 594 | CMP #01 595 | BNE SC20 596 | LDA #3 597 | STA PLAYER_DIR 598 | LDA #0 599 | STA UNIT 600 | LDA #%00000001 601 | STA MOVE_TYPE 602 | JSR REQUEST_WALK_RIGHT 603 | JMP AFTER_MOVE_SNES 604 | SC20: LDA NEW_UP 605 | CMP #01 606 | BNE SC30 607 | LDA #0 608 | STA PLAYER_DIR 609 | STA UNIT 610 | LDA #%00000001 611 | STA MOVE_TYPE 612 | JSR REQUEST_WALK_UP 613 | JMP AFTER_MOVE_SNES 614 | SC30: LDA NEW_DOWN 615 | CMP #01 616 | BNE SC35 617 | LDA #1 618 | STA PLAYER_DIR 619 | LDA #0 620 | STA UNIT 621 | LDA #%00000001 622 | STA MOVE_TYPE 623 | JSR REQUEST_WALK_DOWN 624 | JMP AFTER_MOVE_SNES 625 | SC35: LDA #0 626 | STA KEY_FAST 627 | SC40: ;Now check for non-repeating buttons 628 | LDA NEW_Y 629 | CMP #1 630 | BNE SC45 631 | JSR FIRE_LEFT 632 | LDA #0 633 | STA NEW_Y 634 | SC45: LDA NEW_A 635 | CMP #1 636 | BNE SC50 637 | JSR FIRE_RIGHT 638 | LDA #0 639 | STA NEW_A 640 | SC50: LDA NEW_X 641 | CMP #1 642 | BNE SC55 643 | JSR FIRE_UP 644 | LDA #0 645 | STA NEW_X 646 | SC55: LDA NEW_B 647 | CMP #1 648 | BNE SC60 649 | JSR FIRE_DOWN 650 | LDA #0 651 | STA NEW_B 652 | SC60: LDA NEW_BACK_L 653 | CMP #1 654 | BNE SC65 655 | LDA SNES_SELECT 656 | CMP #1 657 | BNE SC62 658 | JSR CYCLE_ITEM 659 | JMP SC63 660 | SC62: JSR SEARCH_OBJECT 661 | SC63: LDA #0 662 | STA NEW_BACK_L 663 | LDA #15 664 | STA KEYTIMER 665 | SC65: LDA NEW_BACK_R 666 | CMP #1 667 | BNE SC70 668 | LDA SNES_SELECT 669 | CMP #1 670 | BNE SC67 671 | JSR CYCLE_WEAPON 672 | JMP SC68 673 | SC67: JSR MOVE_OBJECT 674 | SC68: LDA #0 675 | STA NEW_BACK_R 676 | LDA #15 677 | STA KEYTIMER 678 | SC70: LDA NEW_START 679 | CMP #1 680 | BNE SC75 681 | JSR USE_ITEM 682 | LDA #0 683 | STA NEW_START 684 | LDA #15 685 | STA KEYTIMER 686 | SC75: ;STILL USE KEYBOARD TO CHECK FOR RUN/STOP 687 | JSR $FFE4 688 | CMP #03 ;RUN/STOP 689 | BNE SC82 690 | JMP PAUSE_GAME 691 | SC82: CMP #205 ;SHIFT-M 692 | BNE SC83 693 | JSR TOGGLE_MUSIC 694 | JSR CLEAR_KEY_BUFFER 695 | SC83: JMP MAIN_GAME_LOOP 696 | 697 | ;This routine handles things that are in common to 698 | ;all 4 directions of movement. 699 | AFTER_MOVE_SNES: 700 | LDA MOVE_RESULT 701 | CMP #1 702 | BNE AMS01 703 | JSR ANIMATE_PLAYER 704 | JSR CACULATE_AND_REDRAW 705 | AMS01: LDA KEY_FAST 706 | CMP #0 707 | BNE AMS02 708 | LDA #15 709 | STA KEYTIMER 710 | LDA #1 711 | STA KEY_FAST 712 | JMP AMS03 713 | AMS02: LDA #6 714 | STA KEYTIMER 715 | LDA #0 716 | STA NEW_UP 717 | STA NEW_DOWN 718 | STA NEW_LEFT 719 | STA NEW_RIGHT 720 | AMS03: JMP MAIN_GAME_LOOP 721 | 722 | CHEATER: 723 | LDA #7 724 | STA KEYS 725 | LDA #100 726 | STA AMMO_PISTOL 727 | STA AMMO_PLASMA 728 | STA INV_BOMBS 729 | STA INV_EMP 730 | STA INV_MEDKIT 731 | STA INV_MAGNET 732 | LDA #1 733 | STA SELECTED_WEAPON 734 | STA SELECTED_ITEM 735 | JSR DISPLAY_KEYS 736 | JSR DISPLAY_WEAPON 737 | JSR DISPLAY_ITEM 738 | RTS 739 | 740 | PAUSE_GAME: 741 | JSR SCROLL_INFO 742 | LDA #MSG_PAUSED 745 | STA $FC 746 | JSR PRINT_INFO 747 | JSR CLEAR_KEY_BUFFER 748 | PG1: JSR $FFE4 749 | CMP #$00 750 | BEQ PG1 751 | CMP #03 ;RUN/STOP 752 | BEQ PG5 753 | CMP #78 ;N-KEY 754 | BEQ PG5 755 | CMP #89 ;Y-KEY 756 | BEQ PG6 757 | JMP PG1 758 | PG5: JSR SCROLL_INFO 759 | JSR SCROLL_INFO 760 | JSR SCROLL_INFO 761 | JSR CLEAR_KEY_BUFFER 762 | JMP MAIN_GAME_LOOP 763 | PG6: JMP GOM4 764 | 765 | CLEAR_KEY_BUFFER: 766 | LDA #0 767 | STA $0289 ;disable keyboard input 768 | LDA #0 769 | STA $00C6 ;CLEAR KEYBOARD BUFFER 770 | LDA #20 771 | STA KEYTIMER 772 | RTS 773 | 774 | USE_ITEM: 775 | ;First figure out which item to use. 776 | LDA SELECTED_ITEM 777 | CMP #1 ;BOMB 778 | BNE UI02 779 | JMP USE_BOMB 780 | UI02: CMP #2 ;EMP 781 | BNE UI03 782 | JMP USE_EMP 783 | UI03: CMP #3 ;MEDKIT 784 | BNE UI04 785 | JMP USE_MEDKIT 786 | UI04: CMP #4 ;MAGNET 787 | BNE UI05 788 | JMP USE_MAGNET 789 | UI05: RTS 790 | 791 | USE_BOMB: 792 | JSR USER_SELECT_OBJECT 793 | ;NOW TEST TO SEE IF THAT SPOT IS OPEN 794 | JSR BOMB_MAGNET_COMMON1 795 | BEQ BM30 796 | JMP BM3A ;If not, then exit routine. 797 | BM30: ;Now scan for any units at that location: 798 | JSR CHECK_FOR_UNIT 799 | LDA UNIT_FIND 800 | CMP #255 ;255 means no unit found. 801 | BEQ BM31 802 | BM3A: JMP BOMB_MAGNET_COMMON2 803 | BM31: LDX #28 ;Start of weapons units 804 | BOMB1: LDA UNIT_TYPE,X 805 | CMP #0 806 | BEQ BOMB2 807 | INX 808 | CPX #32 809 | BNE BOMB1 810 | RTS ;no slots available right now, abort. 811 | BOMB2: LDA #6 ;bomb AI 812 | STA UNIT_TYPE,X 813 | LDA #130 ;bomb tile 814 | STA UNIT_TILE,X 815 | LDA MAP_X 816 | STA UNIT_LOC_X,X 817 | LDA MAP_Y 818 | STA UNIT_LOC_Y,X 819 | LDA #100 ;How long until exposion? 820 | STA UNIT_TIMER_A,X 821 | LDA #0 822 | STA UNIT_A,X 823 | DEC INV_BOMBS 824 | JSR DISPLAY_ITEM 825 | LDA #01 826 | STA REDRAW_WINDOW 827 | LDA #06 ;move sound 828 | JSR PLAY_SOUND ;SOUND PLAY 829 | RTS 830 | 831 | USE_MAGNET: 832 | LDA MAGNET_ACT ;only one magnet active at a time. 833 | CMP #0 834 | BEQ MG32 835 | RTS 836 | MG32: JSR USER_SELECT_OBJECT 837 | ;NOW TEST TO SEE IF THAT SPOT IS OPEN 838 | JSR BOMB_MAGNET_COMMON1 839 | BEQ MG31 840 | JMP BOMB_MAGNET_COMMON2 841 | MG31: LDX #28 ;Start of weapons units 842 | MAG1: LDA UNIT_TYPE,X 843 | CMP #0 844 | BEQ MAG2 845 | INX 846 | CPX #32 847 | BNE MAG1 848 | RTS ;no slots available right now, abort. 849 | MAG2: LDA #20 ;MAGNET AI 850 | STA UNIT_TYPE,X 851 | LDA #134 ;MAGNET tile 852 | STA UNIT_TILE,X 853 | LDA MAP_X 854 | STA UNIT_LOC_X,X 855 | LDA MAP_Y 856 | STA UNIT_LOC_Y,X 857 | LDA #1 ;How long until ACTIVATION 858 | STA UNIT_TIMER_A,X 859 | LDA #255 ;how long does it live -A 860 | STA UNIT_TIMER_B,X 861 | LDA #5 ;how long does it live -B 862 | STA UNIT_A,X 863 | LDA #1 864 | STA MAGNET_ACT ;only one magnet allowed at a time. 865 | DEC INV_MAGNET 866 | JSR DISPLAY_ITEM 867 | LDA #01 868 | STA REDRAW_WINDOW 869 | LDA #06 ;move sound 870 | JSR PLAY_SOUND ;SOUND PLAY 871 | RTS 872 | 873 | BOMB_MAGNET_COMMON1: 874 | LDA #0 875 | STA CURSOR_ON 876 | JSR DRAW_MAP_WINDOW ;ERASE THE CURSOR 877 | LDA CURSOR_X 878 | CLC 879 | ADC MAP_WINDOW_X 880 | STA MAP_X 881 | STA MOVTEMP_UX 882 | LDA CURSOR_Y 883 | CLC 884 | ADC MAP_WINDOW_Y 885 | STA MAP_Y 886 | STA MOVTEMP_UY 887 | JSR GET_TILE_FROM_MAP 888 | LDA TILE 889 | TAY 890 | LDA TILE_ATTRIB,Y 891 | AND #%00000001 ;is that spot available 892 | CMP #%00000001 ;for something to move onto it? 893 | RTS 894 | 895 | BOMB_MAGNET_COMMON2: 896 | LDA #MSG_BLOCKED 899 | STA $FC 900 | JSR PRINT_INFO 901 | LDA #11 ;ERROR SOUND 902 | JSR PLAY_SOUND ;SOUND PLAY 903 | RTS 904 | 905 | USE_EMP: 906 | LDA #10 907 | STA BGFLASH 908 | LDA #3 ;EMP sound 909 | JSR PLAY_SOUND ;SOUND PLAY 910 | DEC INV_EMP 911 | JSR DISPLAY_ITEM 912 | LDX #1 ;start with unit#1 (skip player) 913 | EMP1: ;CHECK THAT UNIT EXISTS 914 | LDA UNIT_TYPE,X 915 | CMP #0 916 | BEQ EMP5 917 | ;CHECK HORIZONTAL POSITION 918 | LDA UNIT_LOC_X,X 919 | CMP MAP_WINDOW_X 920 | BCC EMP5 921 | LDA MAP_WINDOW_X 922 | CLC 923 | ADC #6 ;reduced screen width on VIC-20 924 | CMP UNIT_LOC_X,X 925 | BCC EMP5 926 | ;NOW CHECK VERTICAL 927 | LDA UNIT_LOC_Y,X 928 | CMP MAP_WINDOW_Y 929 | BCC EMP5 930 | LDA MAP_WINDOW_Y 931 | CLC 932 | ADC #6 933 | CMP UNIT_LOC_Y,X 934 | BCC EMP5 935 | LDA #255 936 | STA UNIT_TIMER_A,X 937 | ;test to see if unit is above water 938 | LDA UNIT_LOC_X,X 939 | STA MAP_X 940 | LDA UNIT_LOC_Y,X 941 | STA MAP_Y 942 | JSR GET_TILE_FROM_MAP 943 | LDA TILE 944 | CMP #204 ;WATER 945 | BNE EMP5 946 | LDA #5 947 | STA UNIT_TYPE,X 948 | STA UNIT_TIMER_A,X 949 | LDA #60 950 | STA UNIT_A,X 951 | LDA #140 ;Electrocuting tile 952 | STA UNIT_TILE,X 953 | EMP5: INX 954 | CPX #28 955 | BNE EMP1 956 | LDA #MSG_EMPUSED 959 | STA $FC 960 | JSR PRINT_INFO 961 | RTS 962 | 963 | USE_MEDKIT: 964 | LDA UNIT_HEALTH 965 | CMP #12 ;Do we even need the medkit? 966 | BNE UMK1 967 | RTS 968 | UMK1: ;Now figure out how many HP we need to be healthy. 969 | LDA #12 970 | SEC 971 | SBC UNIT_HEALTH 972 | STA TEMP_A ;how many we need. 973 | LDA INV_MEDKIT ;how many do we have? 974 | SEC 975 | SBC TEMP_A 976 | BCC UMK2 977 | ;we had more than we need, so go to full health. 978 | LDA #12 979 | STA UNIT_HEALTH 980 | LDA INV_MEDKIT 981 | SEC 982 | SBC TEMP_A 983 | STA INV_MEDKIT 984 | JMP UMK3 985 | UMK2: ;we had less than we need, so we'll use what is available. 986 | LDA INV_MEDKIT 987 | CLC 988 | ADC UNIT_HEALTH 989 | STA UNIT_HEALTH 990 | LDA #0 991 | STA INV_MEDKIT 992 | UMK3: JSR DISPLAY_PLAYER_HEALTH 993 | JSR DISPLAY_ITEM 994 | LDA #2 ;MEDKIT SOUND 995 | JSR PLAY_SOUND ;SOUND PLAY 996 | LDA #MSG_MUCHBET 999 | STA $FC 1000 | JSR PRINT_INFO 1001 | RTS 1002 | 1003 | FIRE_UP: 1004 | LDA SELECTED_WEAPON 1005 | CMP #0 1006 | BNE FRU0 1007 | RTS 1008 | FRU0: CMP #1 1009 | BNE FRU1 1010 | JMP FIRE_UP_PISTOL 1011 | FRU1: JMP FIRE_UP_PLASMA 1012 | 1013 | FIRE_UP_PISTOL: 1014 | LDA AMMO_PISTOL 1015 | CMP #0 1016 | BNE FU00 1017 | RTS 1018 | FU00: LDX #28 1019 | FU01: LDA UNIT_TYPE,X 1020 | CMP #0 1021 | BEQ FU02 1022 | INX 1023 | CPX #32 ;max unit for weaponsfire 1024 | BNE FU01 1025 | RTS 1026 | FU02: LDA #12 ;Fire pistol up AI routine 1027 | STA UNIT_TYPE,X 1028 | LDA #244 ;tile for vertical weapons fire 1029 | STA UNIT_TILE,X 1030 | LDA #3 ;travel distance. 1031 | STA UNIT_A,X 1032 | LDA #0 ;weapon-type = pistol 1033 | STA UNIT_B,X 1034 | JMP AFTER_FIRE 1035 | 1036 | FIRE_UP_PLASMA: 1037 | LDA BIG_EXP_ACT 1038 | CMP #1 1039 | BEQ FUP3 1040 | LDA PLASMA_ACT 1041 | CMP #1 1042 | BEQ FUP3 1043 | LDA AMMO_PLASMA 1044 | CMP #0 1045 | BNE FUP0 1046 | FUP3: RTS 1047 | FUP0: LDX #28 1048 | FUP1: LDA UNIT_TYPE,X 1049 | CMP #0 1050 | BEQ FUP2 1051 | INX 1052 | CPX #32 ;max unit for weaponsfire 1053 | BNE FUP1 1054 | RTS 1055 | FUP2: LDA #12 ;Fire pistol up AI routine 1056 | STA UNIT_TYPE,X 1057 | LDA #240 ;tile for vertical plasma bolt 1058 | STA UNIT_TILE,X 1059 | LDA #3 ;travel distance. 1060 | STA UNIT_A,X 1061 | LDA #1 ;weapon-type = plasma 1062 | STA UNIT_B,X 1063 | STA PLASMA_ACT 1064 | JMP AFTER_FIRE 1065 | 1066 | FIRE_DOWN: 1067 | LDA SELECTED_WEAPON 1068 | CMP #0 1069 | BNE FRD0 1070 | RTS 1071 | FRD0: CMP #1 1072 | BNE FRD1 1073 | JMP FIRE_DOWN_PISTOL 1074 | FRD1: JMP FIRE_DOWN_PLASMA 1075 | 1076 | FIRE_DOWN_PISTOL: 1077 | LDA AMMO_PISTOL 1078 | CMP #0 1079 | BNE FD00 1080 | RTS 1081 | FD00: LDX #28 1082 | FD01: LDA UNIT_TYPE,X 1083 | CMP #0 1084 | BEQ FD02 1085 | INX 1086 | CPX #32 ;max unit for weaponsfire 1087 | BNE FD01 1088 | RTS 1089 | FD02: LDA #13 ;Fire pistol DOWN AI routine 1090 | STA UNIT_TYPE,X 1091 | LDA #244 ;tile for vertical weapons fire 1092 | STA UNIT_TILE,X 1093 | LDA #3 ;travel distance. 1094 | STA UNIT_A,X 1095 | LDA #0 ;weapon-type = pistol 1096 | STA UNIT_B,X 1097 | JMP AFTER_FIRE 1098 | 1099 | FIRE_DOWN_PLASMA: 1100 | LDA BIG_EXP_ACT 1101 | CMP #1 1102 | BEQ FDP3 1103 | LDA PLASMA_ACT 1104 | CMP #1 1105 | BEQ FDP3 1106 | LDA AMMO_PLASMA 1107 | CMP #0 1108 | BNE FDP0 1109 | FDP3: RTS 1110 | FDP0: LDX #28 1111 | FDP1: LDA UNIT_TYPE,X 1112 | CMP #0 1113 | BEQ FDP2 1114 | INX 1115 | CPX #32 ;max unit for weaponsfire 1116 | BNE FDP1 1117 | RTS 1118 | FDP2: LDA #13 ;Fire pistol DOWN AI routine 1119 | STA UNIT_TYPE,X 1120 | LDA #240 ;tile for vertical weapons fire 1121 | STA UNIT_TILE,X 1122 | LDA #3 ;travel distance. 1123 | STA UNIT_A,X 1124 | LDA #1 ;weapon-type = plasma 1125 | STA UNIT_B,X 1126 | STA PLASMA_ACT 1127 | JMP AFTER_FIRE 1128 | 1129 | FIRE_LEFT: 1130 | LDA SELECTED_WEAPON 1131 | CMP #0 1132 | BNE FRL0 1133 | RTS 1134 | FRL0: CMP #1 1135 | BNE FRL1 1136 | JMP FIRE_LEFT_PISTOL 1137 | FRL1: JMP FIRE_LEFT_PLASMA 1138 | 1139 | FIRE_LEFT_PISTOL: 1140 | LDA AMMO_PISTOL 1141 | CMP #0 1142 | BNE FL00 1143 | RTS 1144 | FL00: LDX #28 1145 | FL01: LDA UNIT_TYPE,X 1146 | CMP #0 1147 | BEQ FL02 1148 | INX 1149 | CPX #32 ;max unit for weaponsfire 1150 | BNE FL01 1151 | RTS 1152 | FL02: LDA #14 ;Fire pistol LEFT AI routine 1153 | STA UNIT_TYPE,X 1154 | LDA #245 ;tile for horizontal weapons fire 1155 | STA UNIT_TILE,X 1156 | LDA #3 ;travel distance. 1157 | STA UNIT_A,X 1158 | LDA #0 ;weapon-type = pistol 1159 | STA UNIT_B,X 1160 | JMP AFTER_FIRE 1161 | 1162 | FIRE_LEFT_PLASMA: 1163 | LDA BIG_EXP_ACT 1164 | CMP #1 1165 | BEQ FLP3 1166 | LDA PLASMA_ACT 1167 | CMP #1 1168 | BEQ FLP3 1169 | LDA AMMO_PLASMA 1170 | CMP #0 1171 | BNE FLP0 1172 | FLP3: RTS 1173 | FLP0: LDX #28 1174 | FLP1: LDA UNIT_TYPE,X 1175 | CMP #0 1176 | BEQ FLP2 1177 | INX 1178 | CPX #32 ;max unit for weaponsfire 1179 | BNE FLP1 1180 | RTS 1181 | FLP2: LDA #14 ;Fire pistol LEFT AI routine 1182 | STA UNIT_TYPE,X 1183 | LDA #241 ;tile for horizontal weapons fire 1184 | STA UNIT_TILE,X 1185 | LDA #3 ;travel distance. 1186 | STA UNIT_A,X 1187 | LDA #1 ;weapon-type = plasma 1188 | STA UNIT_B,X 1189 | STA PLASMA_ACT 1190 | JMP AFTER_FIRE 1191 | 1192 | FIRE_RIGHT: 1193 | LDA SELECTED_WEAPON 1194 | CMP #0 1195 | BNE FRR0 1196 | RTS 1197 | FRR0: CMP #1 1198 | BNE FRR1 1199 | JMP FIRE_RIGHT_PISTOL 1200 | FRR1: JMP FIRE_RIGHT_PLASMA 1201 | 1202 | FIRE_RIGHT_PISTOL: 1203 | LDA AMMO_PISTOL 1204 | CMP #0 1205 | BNE FR00 1206 | RTS 1207 | FR00: LDX #28 1208 | FR01: LDA UNIT_TYPE,X 1209 | CMP #0 1210 | BEQ FR02 1211 | INX 1212 | CPX #32 ;max unit for weaponsfire 1213 | BNE FR01 1214 | RTS 1215 | FR02: LDA #15 ;Fire pistol RIGHT AI routine 1216 | STA UNIT_TYPE,X 1217 | LDA #245 ;tile for horizontal weapons fire 1218 | STA UNIT_TILE,X 1219 | LDA #3 ;travel distance. 1220 | STA UNIT_A,X 1221 | LDA #0 ;weapon-type = pistol 1222 | STA UNIT_B,X 1223 | JMP AFTER_FIRE 1224 | 1225 | FIRE_RIGHT_PLASMA: 1226 | LDA BIG_EXP_ACT 1227 | CMP #1 1228 | BEQ FRP3 1229 | LDA PLASMA_ACT 1230 | CMP #1 1231 | BEQ FRP3 1232 | LDA AMMO_PLASMA 1233 | CMP #0 1234 | BNE FRP0 1235 | FRP3: RTS 1236 | FRP0: LDX #28 1237 | FRP1: LDA UNIT_TYPE,X 1238 | CMP #0 1239 | BEQ FRP2 1240 | INX 1241 | CPX #32 ;max unit for weaponsfire 1242 | BNE FRP1 1243 | RTS 1244 | FRP2: LDA #15 ;Fire pistol RIGHT AI routine 1245 | STA UNIT_TYPE,X 1246 | LDA #241 ;tile for horizontal weapons fire 1247 | STA UNIT_TILE,X 1248 | LDA #3 ;travel distance. 1249 | STA UNIT_A,X 1250 | LDA #1 ;weapon-type = plasma 1251 | STA UNIT_B,X 1252 | STA PLASMA_ACT 1253 | JMP AFTER_FIRE 1254 | 1255 | AFTER_FIRE: 1256 | LDA #0 1257 | STA UNIT_TIMER_A,X 1258 | LDA UNIT_LOC_X 1259 | STA UNIT_LOC_X,X 1260 | LDA UNIT_LOC_Y 1261 | STA UNIT_LOC_Y,X 1262 | STX UNIT 1263 | LDA #20 1264 | STA KEYTIMER 1265 | LDA SELECTED_WEAPON 1266 | CMP #2 1267 | BEQ AF01 1268 | LDA #09 ;PISTOL-SOUND 1269 | JSR PLAY_SOUND ;SOUND PLAY 1270 | DEC AMMO_PISTOL 1271 | JSR DISPLAY_WEAPON 1272 | RTS 1273 | AF01: LDA #08 ;PLASMA-GUN-SOUND 1274 | JSR PLAY_SOUND ;SOUND PLAY 1275 | DEC AMMO_PLASMA 1276 | JSR DISPLAY_WEAPON 1277 | RTS 1278 | 1279 | KEY_REPEAT: 1280 | LDA #16 1281 | STA $028C ;reset kernal repeat timer (to prevent repeats) 1282 | LDA KEYTIMER 1283 | CMP #0 1284 | BNE KEYR2 1285 | LDA $C5 1286 | CMP #64 ;no key pressed 1287 | BEQ KEYR1 1288 | LDA #64 ;clear LSTX register 1289 | STA $C5 ;clear LSTX register 1290 | LDA #7 1291 | STA KEYTIMER 1292 | RTS 1293 | KEYR1: ;No key pressed, reset all to defaults 1294 | LDA #0 1295 | STA KEY_FAST 1296 | LDA #7 1297 | STA KEYTIMER 1298 | KEYR2: RTS 1299 | 1300 | ;This routine handles things that are in common to 1301 | ;all 4 directions of movement. 1302 | AFTER_MOVE: 1303 | LDA MOVE_RESULT 1304 | CMP #1 1305 | BNE AM01 1306 | JSR ANIMATE_PLAYER 1307 | JSR CACULATE_AND_REDRAW 1308 | AM01: ;now reset key-repeat rate 1309 | LDA KEY_FAST 1310 | CMP #0 1311 | BNE KEYR3 1312 | ;FIRST REPEAT 1313 | LDA #15 1314 | STA KEYTIMER 1315 | INC KEY_FAST 1316 | KEYR4: JMP MAIN_GAME_LOOP 1317 | KEYR3: ;SUBSEQUENT REPEATS 1318 | LDA #7 1319 | STA KEYTIMER 1320 | JMP MAIN_GAME_LOOP 1321 | KEY_FAST !BYTE 0 ;0=DEFAULT STATE 1322 | 1323 | ;This routine is invoked when the user presses S to search 1324 | ;an object such as a crate, chair, or plant. 1325 | SEARCH_OBJECT: 1326 | JSR USER_SELECT_OBJECT 1327 | LDA #1 1328 | STA REDRAW_WINDOW 1329 | CHS1: ;first check of object is searchable 1330 | JSR CALC_COORDINATES 1331 | JSR GET_TILE_FROM_MAP 1332 | LDX TILE 1333 | LDA TILE_ATTRIB,X 1334 | AND #%01000000 ;can search attribute 1335 | CMP #%01000000 1336 | BEQ CHS2 1337 | LDA #0 1338 | STA CURSOR_ON 1339 | JMP CHS3 1340 | CHS2: ;is the tile a crate? 1341 | LDX TILE 1342 | CPX #041 ;BIG CRATE 1343 | BEQ CHS2B 1344 | CPX #045 ;small CRATE 1345 | BEQ CHS2B 1346 | CPX #199 ;"Pi" CRATE 1347 | BEQ CHS2B 1348 | JMP CHS2C 1349 | CHS2B: LDA DESTRUCT_PATH,X 1350 | STA TILE 1351 | JSR PLOT_TILE_TO_MAP 1352 | CHS2C: ;Now check if there is an object there. 1353 | LDA #0 1354 | STA SEARCHBAR 1355 | LDA #MSG_SEARCHING 1358 | STA $FC 1359 | JSR PRINT_INFO 1360 | SOBJ1: LDA #18 ;delay time between search periods 1361 | STA BGTIMER2 1362 | SOBJ2: JSR BACKGROUND_TASKS 1363 | LDA BGTIMER2 1364 | CMP #0 1365 | BNE SOBJ2 1366 | LDX SEARCHBAR 1367 | LDA #46 ;PERIOD 1368 | STA $1261,X 1369 | INC SEARCHBAR 1370 | LDA SEARCHBAR 1371 | CMP #8 1372 | BNE SOBJ1 1373 | LDA #0 1374 | STA CURSOR_ON 1375 | JSR DRAW_MAP_WINDOW ;ERASE THE CURSOR 1376 | JSR CALC_COORDINATES 1377 | JSR CHECK_FOR_HIDDEN_UNIT 1378 | LDA UNIT_FIND 1379 | CMP #255 1380 | BNE SOBJ5 1381 | CHS3: LDA #MSG_NOTFOUND 1384 | STA $FC 1385 | JSR PRINT_INFO 1386 | RTS 1387 | SOBJ5: LDX UNIT_FIND 1388 | LDA UNIT_TYPE,X 1389 | STA TEMP_A ;store object type 1390 | LDA UNIT_A,X 1391 | STA TEMP_B ;store secondary info 1392 | LDA #0 ;DELETE ITEM ONCE FOUND 1393 | STA UNIT_TYPE,X 1394 | 1395 | ;***NOW PROCESS THE ITEM FOUND*** 1396 | LDA #10 ;ITEM-FOUND-SOUND 1397 | JSR PLAY_SOUND ;SOUND PLAY 1398 | LDA TEMP_A 1399 | CMP #128 ;key 1400 | BEQ SOBJ10 1401 | JMP SOBJ15 1402 | SOBJ10: LDA TEMP_B ;WHICH SORT OF KEY? 1403 | CMP #00 1404 | BNE SOBJK1 1405 | LDA KEYS 1406 | ORA #%00000001 ;Add spade key 1407 | STA KEYS 1408 | JMP SOBJ12 1409 | SOBJK1: CMP #01 1410 | BNE SOBJK2 1411 | LDA KEYS 1412 | ORA #%00000010 ;Add heart key 1413 | STA KEYS 1414 | JMP SOBJ12 1415 | SOBJK2: LDA KEYS 1416 | ORA #%00000100 ;Add star key 1417 | STA KEYS 1418 | SOBJ12: LDA #MSG_FOUNDKEY 1421 | STA $FC 1422 | JSR PRINT_INFO 1423 | JSR DISPLAY_KEYS 1424 | RTS 1425 | SOBJ15: CMP #129 ;TIME BOMB 1426 | BNE SOBJ17 1427 | LDA TEMP_B 1428 | CLC 1429 | ADC INV_BOMBS 1430 | STA INV_BOMBS 1431 | LDA #MSG_FOUNDBOMB 1434 | STA $FC 1435 | JSR PRINT_INFO 1436 | JSR DISPLAY_ITEM 1437 | RTS 1438 | SOBJ17: CMP #130 ;EMP 1439 | BNE SOBJ20 1440 | LDA TEMP_B 1441 | CLC 1442 | ADC INV_EMP 1443 | STA INV_EMP 1444 | LDA #MSG_FOUNDEMP 1447 | STA $FC 1448 | JSR PRINT_INFO 1449 | JSR DISPLAY_ITEM 1450 | RTS 1451 | SOBJ20: CMP #131 ;PISTOL 1452 | BNE SOBJ21 1453 | LDA TEMP_B 1454 | CLC 1455 | ADC AMMO_PISTOL 1456 | STA AMMO_PISTOL 1457 | BCC SOBJ2A ;If we rolled over past 255 1458 | LDA #255 ;set it to 255. 1459 | STA AMMO_PISTOL 1460 | SOBJ2A: LDA #MSG_FOUNDGUN 1463 | STA $FC 1464 | JSR PRINT_INFO 1465 | JSR DISPLAY_WEAPON 1466 | SOBJ21: CMP #132 ;PLASMA GUN 1467 | BNE SOBJ22 1468 | LDA TEMP_B 1469 | CLC 1470 | ADC AMMO_PLASMA 1471 | STA AMMO_PLASMA 1472 | LDA #MSG_FOUNDPLAS 1475 | STA $FC 1476 | JSR PRINT_INFO 1477 | JSR DISPLAY_WEAPON 1478 | SOBJ22: CMP #133 ;MEDKIT 1479 | BNE SOBJ23 1480 | LDA TEMP_B 1481 | CLC 1482 | ADC INV_MEDKIT 1483 | STA INV_MEDKIT 1484 | LDA #MSG_FOUNDMED 1487 | STA $FC 1488 | JSR PRINT_INFO 1489 | JSR DISPLAY_ITEM 1490 | SOBJ23: CMP #134 ;MAGNET 1491 | BNE SOBJ99 1492 | LDA TEMP_B 1493 | CLC 1494 | ADC INV_MAGNET 1495 | STA INV_MAGNET 1496 | LDA #MSG_FOUNDMAG 1499 | STA $FC 1500 | JSR PRINT_INFO 1501 | JSR DISPLAY_ITEM 1502 | SOBJ99: ;ADD CODE HERE FOR OTHER OBJECT TYPES 1503 | RTS 1504 | SEARCHBAR !BYTE 00 ;to count how many periods to display. 1505 | 1506 | ;combines cursor location with window location 1507 | ;to determine coordinates for MAP_X and MAP_Y 1508 | CALC_COORDINATES: 1509 | LDA CURSOR_X 1510 | CLC 1511 | ADC MAP_WINDOW_X 1512 | STA MAP_X 1513 | LDA CURSOR_Y 1514 | CLC 1515 | ADC MAP_WINDOW_Y 1516 | STA MAP_Y 1517 | RTS 1518 | 1519 | ;This routine is called by routines such as the move, search, 1520 | ;or use commands. It displays a cursor and allows the user 1521 | ;to pick a direction of an object. 1522 | USER_SELECT_OBJECT: 1523 | LDA #16 ;beep sound 1524 | JSR PLAY_SOUND ;SOUND PLAY 1525 | LDA #3 1526 | STA CURSOR_X 1527 | LDA #3 1528 | STA CURSOR_Y 1529 | LDA #1 1530 | STA CURSOR_ON 1531 | JSR REVERSE_TILE 1532 | ;First ask user which object to move 1533 | MV01: JSR BACKGROUND_TASKS 1534 | LDA UNIT_TYPE 1535 | CMP #0 ;Did player die wile moving something? 1536 | BNE MVCONT 1537 | LDA #0 1538 | STA CURSOR_ON 1539 | RTS 1540 | MVCONT: LDA CONTROL 1541 | CMP #2 1542 | BNE MV01A 1543 | JMP MVSNES 1544 | MV01A: JSR $FFE4 1545 | CMP #$00 1546 | BEQ MV02 1547 | MV02: CMP #$1D ;CURSOR RIGHT 1548 | BNE MV03 1549 | INC CURSOR_X 1550 | RTS 1551 | MV03: CMP #$9D ;CURSOR LEFT 1552 | BNE MV04 1553 | DEC CURSOR_X 1554 | RTS 1555 | MV04: CMP #$11 ;CURSOR DOWN 1556 | BNE MV05 1557 | INC CURSOR_Y 1558 | RTS 1559 | MV05: CMP #$91 ;CURSOR UP 1560 | BNE MV06 1561 | DEC CURSOR_Y 1562 | RTS 1563 | MV06: CMP KEY_MOVE_LEFT 1564 | BNE MV07 1565 | DEC CURSOR_X 1566 | RTS 1567 | MV07: CMP KEY_MOVE_DOWN 1568 | BNE MV08 1569 | INC CURSOR_Y 1570 | RTS 1571 | MV08: CMP KEY_MOVE_RIGHT 1572 | BNE MV09 1573 | INC CURSOR_X 1574 | RTS 1575 | MV09: CMP KEY_MOVE_UP 1576 | BNE MV0A 1577 | DEC CURSOR_Y 1578 | RTS 1579 | MV0A: JMP MV01 1580 | 1581 | MVSNES: ;SNES controls for this routine 1582 | JSR SNES_CONTROLER_READ 1583 | LDA NEW_RIGHT 1584 | CMP #1 1585 | BNE MVS03 1586 | INC CURSOR_X 1587 | LDA #0 1588 | STA NEW_RIGHT 1589 | RTS 1590 | MVS03: LDA NEW_LEFT 1591 | CMP #1 1592 | BNE MVS04 1593 | DEC CURSOR_X 1594 | LDA #0 1595 | STA NEW_LEFT 1596 | RTS 1597 | MVS04: LDA NEW_DOWN 1598 | CMP #1 1599 | BNE MVS05 1600 | INC CURSOR_Y 1601 | LDA #0 1602 | STA NEW_DOWN 1603 | RTS 1604 | MVS05: LDA NEW_UP 1605 | CMP #1 1606 | BNE MVS06 1607 | DEC CURSOR_Y 1608 | LDA #0 1609 | STA NEW_UP 1610 | RTS 1611 | MVS06: JMP MV01 1612 | 1613 | MOVE_OBJECT: 1614 | JSR USER_SELECT_OBJECT 1615 | LDA UNIT 1616 | ;now test that object to see if it 1617 | ;is allowed to be moved. 1618 | MV10: LDA #0 1619 | STA CURSOR_ON 1620 | JSR DRAW_MAP_WINDOW ;ERASE THE CURSOR 1621 | JSR CALC_COORDINATES 1622 | JSR CHECK_FOR_HIDDEN_UNIT 1623 | LDA UNIT_FIND 1624 | STA MOVTEMP_U 1625 | JSR GET_TILE_FROM_MAP 1626 | LDA TILE 1627 | TAY 1628 | LDA TILE_ATTRIB,Y 1629 | AND #%00000100 ;can it be moved? 1630 | CMP #%00000100 1631 | BEQ MV11 1632 | LDA #MSG_CANTMOVE 1635 | STA $FC 1636 | JSR PRINT_INFO 1637 | LDA #11 ;ERROR SOUND 1638 | JSR PLAY_SOUND ;SOUND PLAY 1639 | RTS 1640 | MV11: LDA TILE 1641 | STA MOVTEMP_O ;Store which tile it is we are moving 1642 | LDA MAP_X 1643 | STA MOVTEMP_X ;Store original location of object 1644 | LDA MAP_Y 1645 | STA MOVTEMP_Y 1646 | LDA #1 1647 | STA CURSOR_ON 1648 | JSR REVERSE_TILE 1649 | ;NOW ASK THE USER WHICH DIRECTION TO MOVE IT TO 1650 | MV15: JSR BACKGROUND_TASKS 1651 | LDA UNIT_TYPE 1652 | CMP #0 ;Did player die wile moving something? 1653 | BNE MVCONT2 1654 | LDA #0 1655 | STA CURSOR_ON 1656 | RTS 1657 | MVCONT2: ;which controller are we using? 1658 | LDA CONTROL 1659 | CMP #2 1660 | BNE MV15B 1661 | JMP SMV30 1662 | MV15B: ;KEYBOARD CONTROL 1663 | JSR $FFE4 1664 | CMP #$00 1665 | BEQ MV15 1666 | MV16: CMP #$1D ;CURSOR RIGHT 1667 | BNE MV17 1668 | INC CURSOR_X 1669 | JMP MV25 1670 | MV17: CMP #$9D ;CURSOR LEFT 1671 | BNE MV18 1672 | DEC CURSOR_X 1673 | JMP MV25 1674 | MV18: CMP #$11 ;CURSOR DOWN 1675 | BNE MV19 1676 | INC CURSOR_Y 1677 | JMP MV25 1678 | MV19: CMP #$91 ;CURSOR UP 1679 | BNE MV20 1680 | DEC CURSOR_Y 1681 | JMP MV25 1682 | MV20: CMP KEY_MOVE_LEFT 1683 | BNE MV2A 1684 | DEC CURSOR_X 1685 | JMP MV25 1686 | MV2A: CMP KEY_MOVE_DOWN 1687 | BNE MV2B 1688 | INC CURSOR_Y 1689 | JMP MV25 1690 | MV2B: CMP KEY_MOVE_RIGHT 1691 | BNE MV2C 1692 | INC CURSOR_X 1693 | JMP MV25 1694 | MV2C: CMP KEY_MOVE_UP 1695 | BNE MV2D 1696 | DEC CURSOR_Y 1697 | JMP MV25 1698 | MV2D: JMP MV15 1699 | SMV30: ;SNES controls 1700 | JSR SNES_CONTROLER_READ 1701 | LDA NEW_RIGHT 1702 | CMP #1 1703 | BNE SMV31 1704 | INC CURSOR_X 1705 | LDA #0 1706 | STA NEW_RIGHT 1707 | JMP MV25 1708 | SMV31: LDA NEW_LEFT 1709 | CMP #1 1710 | BNE SMV32 1711 | DEC CURSOR_X 1712 | LDA #0 1713 | STA NEW_LEFT 1714 | JMP MV25 1715 | SMV32: LDA NEW_DOWN 1716 | CMP #1 1717 | BNE SMV33 1718 | INC CURSOR_Y 1719 | LDA #0 1720 | STA NEW_DOWN 1721 | JMP MV25 1722 | SMV33: LDA NEW_UP 1723 | CMP #1 1724 | BNE SMV34 1725 | DEC CURSOR_Y 1726 | LDA #0 1727 | STA NEW_UP 1728 | JMP MV25 1729 | SMV34: JMP MV15 1730 | 1731 | ;NOW TEST TO SEE IF THAT SPOT IS OPEN 1732 | MV25: LDA #0 1733 | STA CURSOR_ON 1734 | JSR DRAW_MAP_WINDOW ;ERASE THE CURSOR 1735 | LDA CURSOR_X 1736 | CLC 1737 | ADC MAP_WINDOW_X 1738 | STA MAP_X 1739 | STA MOVTEMP_UX 1740 | LDA CURSOR_Y 1741 | CLC 1742 | ADC MAP_WINDOW_Y 1743 | STA MAP_Y 1744 | STA MOVTEMP_UY 1745 | JSR GET_TILE_FROM_MAP 1746 | LDA TILE 1747 | TAY 1748 | LDA TILE_ATTRIB,Y 1749 | AND #%00100000 ;is that spot available 1750 | CMP #%00100000 ;for something to move onto it? 1751 | BEQ MV30 1752 | JMP MV3A ;If not, then exit routine. 1753 | MV30: ;Now scan for any units at that location: 1754 | JSR CHECK_FOR_UNIT 1755 | LDA UNIT_FIND 1756 | CMP #255 ;255 means no unit found. 1757 | BEQ MV31 1758 | MV3A: LDA #MSG_BLOCKED 1761 | STA $FC 1762 | JSR PRINT_INFO 1763 | LDA #11 ;ERROR SOUND 1764 | JSR PLAY_SOUND ;SOUND PLAY 1765 | RTS 1766 | MV31: LDA #06 ;move sound 1767 | JSR PLAY_SOUND ;SOUND PLAY 1768 | LDY #0 1769 | LDA ($FD),Y ;Grab current object 1770 | STA MOVTEMP_D 1771 | LDA MOVTEMP_O 1772 | STA ($FD),Y ;replace with obect we are moving 1773 | LDA MOVTEMP_X ;RETRIEVE original location of object 1774 | STA MAP_X 1775 | LDA MOVTEMP_Y 1776 | STA MAP_Y 1777 | JSR GET_TILE_FROM_MAP 1778 | LDA MOVTEMP_D 1779 | CMP #148 ;trash compactor tile 1780 | BNE MV31A 1781 | LDA #09 ;Floor tile 1782 | MV31A: STA ($FD),Y ;Replace former location 1783 | LDA #1 1784 | STA REDRAW_WINDOW ;See the result 1785 | LDA MOVTEMP_U 1786 | CMP #255 1787 | BNE MV32 1788 | RTS 1789 | MV32: LDX MOVTEMP_U 1790 | LDA MOVTEMP_UX 1791 | STA UNIT_LOC_X,X 1792 | LDA MOVTEMP_UY 1793 | STA UNIT_LOC_Y,X 1794 | RTS 1795 | MOVTEMP_O: !BYTE 00 ;origin tile 1796 | MOVTEMP_D: !BYTE 00 ;destination tile 1797 | MOVTEMP_X: !BYTE 00 ;x-coordinate 1798 | MOVTEMP_Y: !BYTE 00 ;y-coordinate 1799 | MOVTEMP_U: !BYTE 00 ;unit number (255=none) 1800 | MOVTEMP_UX !BYTE 00 1801 | MOVTEMP_UY !BYTE 00 1802 | 1803 | CACULATE_AND_REDRAW: 1804 | LDA UNIT_LOC_X ;no index needed since it's player unit 1805 | SEC 1806 | SBC #3 1807 | STA MAP_WINDOW_X 1808 | LDA UNIT_LOC_Y ;no index needed since it's player unit 1809 | SEC 1810 | SBC #3 1811 | STA MAP_WINDOW_Y 1812 | LDA #1 1813 | STA REDRAW_WINDOW 1814 | RTS 1815 | 1816 | ;This routine checks all units from 0 to 31 and figures out if it should be dislpayed 1817 | ;on screen, and then grabs that unit's tile and stores it in the MAP_PRECALC array 1818 | ;so that when the window is drawn, it does not have to search for units during the 1819 | ;draw, speeding up the display routine. 1820 | MAP_PRE_CALCULATE: 1821 | ;CLEAR OLD BUFFER 1822 | LDA #0 1823 | LDY #0 1824 | PREC0: STA MAP_PRECALC,Y 1825 | INY 1826 | CPY #49 1827 | BNE PREC0 1828 | LDX #0 1829 | JMP PREC2 ;skip the check for unit zero, always draw it. 1830 | PREC1: ;CHECK THAT UNIT EXISTS 1831 | LDA UNIT_TYPE,X 1832 | CMP #0 1833 | BEQ PREC5 1834 | ;CHECK HORIZONTAL POSITION 1835 | LDA UNIT_LOC_X,X 1836 | CMP MAP_WINDOW_X 1837 | BCC PREC5 1838 | LDA MAP_WINDOW_X 1839 | CLC 1840 | ADC #6 1841 | CMP UNIT_LOC_X,X 1842 | BCC PREC5 1843 | ;NOW CHECK VERTICAL 1844 | LDA UNIT_LOC_Y,X 1845 | CMP MAP_WINDOW_Y 1846 | BCC PREC5 1847 | LDA MAP_WINDOW_Y 1848 | CLC 1849 | ADC #6 1850 | CMP UNIT_LOC_Y,X 1851 | BCC PREC5 1852 | ;Unit found in map window, now add that unit's 1853 | ;tile to the precalc map. 1854 | PREC2: LDA UNIT_LOC_Y,X 1855 | SEC 1856 | SBC MAP_WINDOW_Y 1857 | TAY 1858 | LDA UNIT_LOC_X,X 1859 | SEC 1860 | SBC MAP_WINDOW_X 1861 | CLC 1862 | ADC PRECALC_ROWS,Y 1863 | TAY 1864 | LDA UNIT_TILE,X 1865 | CMP #130 ;is it a bomb 1866 | BEQ PREC6 1867 | CMP #134 ;is it a magnet? 1868 | BEQ PREC6 1869 | PREC4: STA MAP_PRECALC,Y 1870 | PREC5: ;continue search 1871 | INX 1872 | CPX #32 1873 | BNE PREC1 1874 | RTS 1875 | PREC6: ;What to do in case of bomb or magnet that should 1876 | ;go underneath the unit or robot. 1877 | LDA MAP_PRECALC,Y 1878 | CMP #0 1879 | BNE PREC5 1880 | LDA UNIT_TILE,X 1881 | JMP PREC4 1882 | 1883 | PRECALC_ROWS: !BYTE 0,7,14,21,28,35,42 1884 | 1885 | ;This routine is where the MAP is displayed on the screen 1886 | ;This is a temporary routine, taken from the map editor. 1887 | DRAW_MAP_WINDOW: 1888 | JSR MAP_PRE_CALCULATE 1889 | LDA #0 1890 | STA REDRAW_WINDOW 1891 | STA TEMP_X 1892 | STA TEMP_Y 1893 | STA PRECALC_COUNT 1894 | DM01: ;FIRST CALCULATE WHERE THE BYTE IS STORED IN THE MAP 1895 | LDY #0 1896 | LDA TEMP_Y 1897 | CLC 1898 | ADC MAP_WINDOW_Y 1899 | ROR 1900 | PHP 1901 | CLC 1902 | ADC #>MAP 1903 | STA $FE ;HIGH BYTE OF MAP SOURCE 1904 | LDA #$0 1905 | PLP 1906 | ROR 1907 | CLC 1908 | ADC TEMP_X 1909 | ADC MAP_WINDOW_X 1910 | STA $FD ;LOW BYTE OF MAP SOURCE 1911 | LDA ($FD),Y 1912 | STA TILE 1913 | ;NOW FIGURE OUT WHERE TO PLACE IT ON SCREEN. 1914 | LDX TEMP_Y 1915 | LDA MAP_CHART_L,X 1916 | STA $FB ;LOW BYTE OF SCREEN AREA 1917 | LDA MAP_CHART_H,X 1918 | STA $FC ;HIGH BYTE OF SCREEN AREA 1919 | LDA TEMP_X 1920 | ASL ;MULTIPLY BY 2 1921 | CLC 1922 | ADC TEMP_X ;ADD ANOTHER TO MAKE X3 1923 | ADC $FB 1924 | STA $FB 1925 | LDA $FC 1926 | ADC #00 ;CARRY FLAG 1927 | STA $FC 1928 | JSR PLOT_TILE 1929 | ;now check for sprites in this location 1930 | LDY PRECALC_COUNT 1931 | LDA MAP_PRECALC,Y 1932 | CMP #00 1933 | BEQ DM02 1934 | STA TILE 1935 | LDX TEMP_Y 1936 | LDA MAP_CHART_L,X 1937 | STA $FB ;LOW BYTE OF SCREEN AREA 1938 | LDA MAP_CHART_H,X 1939 | STA $FC ;HIGH BYTE OF SCREEN AREA 1940 | LDA TEMP_X 1941 | ASL ;MULTIPLY BY 2 1942 | CLC 1943 | ADC TEMP_X ;ADD ANOTHER TO MAKE X3 1944 | ADC $FB 1945 | STA $FB 1946 | LDA $FC 1947 | ADC #00 ;CARRY FLAG 1948 | STA $FC 1949 | JSR PLOT_TRANSPARENT_TILE 1950 | DM02: INC TEMP_X 1951 | INC PRECALC_COUNT 1952 | LDA TEMP_X 1953 | CMP #7 1954 | BNE DM01 1955 | ;CHECK FOR CURSOR 1956 | DM03: LDA CURSOR_ON 1957 | CMP #1 ;Is cursor even on? 1958 | BNE DM04 1959 | LDA TEMP_Y 1960 | CMP CURSOR_Y ;is cursor on the same row that were drawing? 1961 | BNE DM04 1962 | JSR REVERSE_TILE 1963 | DM04: LDA #0 1964 | STA TEMP_X 1965 | INC TEMP_Y 1966 | LDA TEMP_Y 1967 | CMP #7 1968 | BEQ DM10 1969 | JMP DM01 1970 | DM10: RTS 1971 | 1972 | ;This routine plots a 3x3 tile from the tile database anywhere 1973 | ;on screen. But first you must define the tile number in the 1974 | ;TILE variable, as well as the starting screen address must 1975 | ;be defined in $FB. 1976 | PLOT_TILE: 1977 | LDA $FB ;Grab the starting address, and adjust it for 1978 | STA $FD ;the color RAM before we get started. 1979 | LDA $FC 1980 | STA $FE 1981 | LDX TILE 1982 | ;DRAW THE TOP 3 CHARACTERS 1983 | LDA TILE_DATA_TL,X 1984 | LDY #0 1985 | STA ($FB),Y 1986 | LDA TILE_DATA_TM,X 1987 | INY 1988 | STA ($FB),Y 1989 | LDA TILE_DATA_TR,X 1990 | INY 1991 | STA ($FB),Y 1992 | ;MOVE DOWN TO NEXT LINE 1993 | LDY #25 1994 | ;DRAW THE MIDDLE 3 CHARACTERS 1995 | LDA TILE_DATA_ML,X 1996 | STA ($FB),Y 1997 | LDA TILE_DATA_MM,X 1998 | INY 1999 | STA ($FB),Y 2000 | LDA TILE_DATA_MR,X 2001 | INY 2002 | STA ($FB),Y 2003 | ;MOVE DOWN TO NEXT LINE 2004 | LDY #50 2005 | ;DRAW THE BOTTOM 3 CHARACTERS 2006 | LDA TILE_DATA_BL,X 2007 | STA ($FB),Y 2008 | LDA TILE_DATA_BM,X 2009 | INY 2010 | STA ($FB),Y 2011 | LDA TILE_DATA_BR,X 2012 | INY 2013 | STA ($FB),Y 2014 | ;NOW DO THE COLOR 2015 | LDA $FE 2016 | CLC 2017 | ADC #$84 ;adjust to color RAM area by adding $D400 2018 | STA $FE 2019 | ;DRAW THE TOP 3 COLORS 2020 | LDA TILE_COLOR_TL,X 2021 | LDY #0 2022 | STA ($FD),Y 2023 | LDA TILE_COLOR_TM,X 2024 | INY 2025 | STA ($FD),Y 2026 | LDA TILE_COLOR_TR,X 2027 | INY 2028 | STA ($FD),Y 2029 | ;MOVE DOWN TO NEXT LINE 2030 | LDY #25 2031 | ;DRAW THE MIDDLE 3 COLORS 2032 | LDA TILE_COLOR_ML,X 2033 | STA ($FD),Y 2034 | LDA TILE_COLOR_MM,X 2035 | INY 2036 | STA ($FD),Y 2037 | LDA TILE_COLOR_MR,X 2038 | INY 2039 | STA ($FD),Y 2040 | ;MOVE DOWN TO NEXT LINE 2041 | LDY #50 2042 | ;DRAW THE BOTTOM 3 COLORS 2043 | LDA TILE_COLOR_BL,X 2044 | STA ($FD),Y 2045 | LDA TILE_COLOR_BM,X 2046 | INY 2047 | STA ($FD),Y 2048 | LDA TILE_COLOR_BR,X 2049 | INY 2050 | STA ($FD),Y 2051 | RTS 2052 | 2053 | ;This routine plots a transparent tile from the tile database 2054 | ;anywhere on screen. But first you must define the tile number 2055 | ;in the TILE variable, as well as the starting screen address must 2056 | ;be defined in $FB. Also, this routine is slower than the usual 2057 | ;tile routine, so is only used for sprites. The ":" character ($3A) 2058 | ;is not drawn. 2059 | PLOT_TRANSPARENT_TILE: 2060 | LDA $FB ;Grab the starting address, and adjust it for 2061 | STA $FD ;the color RAM before we get started. 2062 | LDA $FC 2063 | STA $FE 2064 | LDX TILE 2065 | ;DRAW THE TOP 3 CHARACTERS 2066 | LDA TILE_DATA_TL,X 2067 | LDY #0 2068 | CMP #$3A 2069 | BEQ PTT01 2070 | STA ($FB),Y 2071 | PTT01: LDA TILE_DATA_TM,X 2072 | INY 2073 | CMP #$3A 2074 | BEQ PTT02 2075 | STA ($FB),Y 2076 | PTT02: LDA TILE_DATA_TR,X 2077 | INY 2078 | CMP #$3A 2079 | BEQ PTT03 2080 | STA ($FB),Y 2081 | ;MOVE DOWN TO NEXT LINE 2082 | PTT03: LDY #25 2083 | ;DRAW THE MIDDLE 3 CHARACTERS 2084 | LDA TILE_DATA_ML,X 2085 | CMP #$3A 2086 | BEQ PTT04 2087 | STA ($FB),Y 2088 | PTT04: LDA TILE_DATA_MM,X 2089 | INY 2090 | CMP #$3A 2091 | BEQ PTT05 2092 | STA ($FB),Y 2093 | PTT05: LDA TILE_DATA_MR,X 2094 | INY 2095 | CMP #$3A 2096 | BEQ PTT06 2097 | STA ($FB),Y 2098 | ;MOVE DOWN TO NEXT LINE 2099 | PTT06: LDY #50 2100 | ;DRAW THE BOTTOM 3 CHARACTERS 2101 | LDA TILE_DATA_BL,X 2102 | CMP #$3A 2103 | BEQ PTT07 2104 | STA ($FB),Y 2105 | PTT07: LDA TILE_DATA_BM,X 2106 | INY 2107 | CMP #$3A 2108 | BEQ PTT08 2109 | STA ($FB),Y 2110 | PTT08: LDA TILE_DATA_BR,X 2111 | INY 2112 | CMP #$3A 2113 | BEQ PTT09 2114 | STA ($FB),Y 2115 | PTT09: ;****NOW DO THE COLOR**** 2116 | LDA $FE 2117 | CLC 2118 | ADC #$84 ;adjust to color RAM area by adding $8400 2119 | STA $FE 2120 | ;DRAW THE TOP 3 COLORS 2121 | LDA TILE_COLOR_TL,X 2122 | LDY #0 2123 | CMP #$00 ;If it is black, don't draw it. 2124 | BEQ PTT10 2125 | STA ($FD),Y 2126 | PTT10: LDA TILE_COLOR_TM,X 2127 | INY 2128 | CMP #$00 ;If it is black, don't draw it. 2129 | BEQ PTT11 2130 | STA ($FD),Y 2131 | PTT11: LDA TILE_COLOR_TR,X 2132 | INY 2133 | CMP #$00 ;If it is black, don't draw it. 2134 | BEQ PTT12 2135 | STA ($FD),Y 2136 | ;MOVE DOWN TO NEXT LINE 2137 | PTT12: LDY #25 2138 | ;DRAW THE MIDDLE 3 COLORS 2139 | LDA TILE_COLOR_ML,X 2140 | CMP #$00 ;If it is black, don't draw it. 2141 | BEQ PTT13 2142 | STA ($FD),Y 2143 | PTT13: LDA TILE_COLOR_MM,X 2144 | INY 2145 | CMP #$00 ;If it is black, don't draw it. 2146 | BEQ PTT14 2147 | STA ($FD),Y 2148 | PTT14: LDA TILE_COLOR_MR,X 2149 | INY 2150 | CMP #$00 ;If it is black, don't draw it. 2151 | BEQ PTT15 2152 | STA ($FD),Y 2153 | ;MOVE DOWN TO NEXT LINE 2154 | PTT15: LDY #50 2155 | ;DRAW THE BOTTOM 3 COLORS 2156 | LDA TILE_COLOR_BL,X 2157 | CMP #$00 ;If it is black, don't draw it. 2158 | BEQ PTT16 2159 | STA ($FD),Y 2160 | PTT16: LDA TILE_COLOR_BM,X 2161 | INY 2162 | CMP #$00 ;If it is black, don't draw it. 2163 | BEQ PTT17 2164 | STA ($FD),Y 2165 | PTT17: LDA TILE_COLOR_BR,X 2166 | INY 2167 | CMP #$00 ;If it is black, don't draw it. 2168 | BEQ PTT18 2169 | STA ($FD),Y 2170 | PTT18: RTS 2171 | 2172 | 2173 | ;This routine puts the cursor on the game map. Originally it reversed 2174 | ;the characters, but after moving to a custom character set, there was 2175 | ;no reverse set to use anymore, so now it draws a box. 2176 | REVERSE_TILE: 2177 | LDX CURSOR_Y 2178 | LDA MAP_CHART_L,X 2179 | STA $FB ;LOW BYTE OF SCREEN AREA 2180 | LDA MAP_CHART_H,X 2181 | STA $FC ;HIGH BYTE OF SCREEN AREA 2182 | LDA CURSOR_X 2183 | ASL ;MULTIPLY BY 2 2184 | CLC 2185 | ADC CURSOR_X ;ADD ANOTHER TO MAKE X3 2186 | ADC $FB 2187 | STA $FB 2188 | LDA $FC 2189 | ADC #00 ;CARRY FLAG 2190 | STA $FC 2191 | LDY #00 2192 | LDA #$70 2193 | STA ($FB),Y 2194 | INY 2195 | INY 2196 | LDA #$6E 2197 | STA ($FB),Y 2198 | LDY #50 2199 | LDA #$6D 2200 | STA ($FB),Y 2201 | INY 2202 | INY 2203 | LDA #$7D 2204 | STA ($FB),Y 2205 | LDX CURSOR_Y 2206 | LDA MAP_CHART_L,X 2207 | STA $FB ;LOW BYTE OF SCREEN AREA 2208 | LDA MAP_CHART_H,X 2209 | STA $FC ;HIGH BYTE OF SCREEN AREA 2210 | LDA CURSOR_X 2211 | ASL ;MULTIPLY BY 2 2212 | CLC 2213 | ADC CURSOR_X ;ADD ANOTHER TO MAKE X3 2214 | ADC $FB 2215 | STA $FB 2216 | LDA $FC 2217 | ADC #$84 ;CARRY FLAG AND $D4 TO MOVE TO COLOR RAM 2218 | STA $FC 2219 | LDY #00 2220 | LDA #01 ;WHITE ON BLACK 2221 | STA ($FB),Y 2222 | INY 2223 | INY 2224 | STA ($FB),Y 2225 | LDY #50 2226 | LDA #01 ;WHITE ON BLACK 2227 | STA ($FB),Y 2228 | INY 2229 | INY 2230 | STA ($FB),Y 2231 | RTS 2232 | 2233 | ;SOURCE_CHAR !BYTE 00 2234 | ;DEST_CAR !BYTE 00 2235 | 2236 | ;REVERSE_CHAR: 2237 | ; LDA SOURCE_CHAR 2238 | 2239 | 2240 | ;This routine checks to see if UNIT is occupying any space 2241 | ;that is currently visible in the window. If so, the 2242 | ;flag for redrawing the window will be set. 2243 | CHECK_FOR_WINDOW_REDRAW: 2244 | LDX UNIT 2245 | ;FIRST CHECK HORIZONTAL 2246 | LDA UNIT_LOC_X,X 2247 | CMP MAP_WINDOW_X 2248 | BCC CFR1 2249 | LDA MAP_WINDOW_X 2250 | CLC 2251 | ADC #6 ;this number is unique to VIC-20 due to smaller screen 2252 | CMP UNIT_LOC_X,X 2253 | BCC CFR1 2254 | ;NOW CHECK VERTICAL 2255 | LDA UNIT_LOC_Y,X 2256 | CMP MAP_WINDOW_Y 2257 | BCC CFR1 2258 | LDA MAP_WINDOW_Y 2259 | CLC 2260 | ADC #6 2261 | CMP UNIT_LOC_Y,X 2262 | BCC CFR1 2263 | LDA #1 2264 | STA REDRAW_WINDOW 2265 | CFR1: RTS 2266 | 2267 | DECWRITE: 2268 | LDA #$00 2269 | STA SCREENPOS 2270 | LDA DECNUM 2271 | LDX #2 2272 | LDY #$4C 2273 | DEC1 STY DECB 2274 | LSR 2275 | DEC2 ROL 2276 | BCS DEC3 2277 | CMP DECA,X 2278 | BCC DEC4 2279 | DEC3 SBC DECA,X 2280 | SEC 2281 | DEC4 ROL DECB 2282 | BCC DEC2 2283 | STA DECTEMP 2284 | LDA DECB 2285 | LDY SCREENPOS 2286 | STA ($FB),Y 2287 | INC SCREENPOS 2288 | LDA DECTEMP 2289 | LDY #$13 2290 | DEX 2291 | BPL DEC1 2292 | RTS 2293 | DECA !BYTE 128,160,200 2294 | DECB !BYTE 1 2295 | SCREENPOS !BYTE $00 2296 | DECTEMP !BYTE $00 2297 | 2298 | ; The following routine loads the tileset from disk 2299 | TILE_LOAD_ROUTINE: 2300 | LDA #11 ;LENGTH OF FILENAME 2301 | LDX #TILENAME 2303 | JSR $FFBD ;SETNAM A=FILE NAME LENGTH X/Y=POINTER TO FILENAME 2304 | LDA #$02 2305 | LDX #$08 2306 | LDY #$00 2307 | JSR $FFBA ;SETFLS A=LOGICAL NUMBER X=DEVICE NUMBER Y=SECONDARY 2308 | LDX #$00 ;LOW BYTE FOR LOAD ADDRESS 2309 | LDY #$A0 ;HIGH BYTE FOR LOAD ADDRESS 2310 | LDA #$00 2311 | JSR $FFD5 ;LOAD FILE A=0 FOR LOAD X/Y=LOAD ADDRESS 2312 | JSR $FFC3 ;CLOSE FILE 2313 | RTS 2314 | 2315 | ; The following routine loads the map from disk 2316 | MAP_LOAD_ROUTINE: 2317 | LDA #7 ;LENGTH OF FILENAME 2318 | LDX #MAPNAME 2320 | JSR $FFBD ;SETNAM A=FILE NAME LENGTH X/Y=POINTER TO FILENAME 2321 | LDA #$02 2322 | LDX #$08 2323 | LDY #$00 2324 | JSR $FFBA ;SETFLS A=LOGICAL NUMBER X=DEVICE NUMBER Y=SECONDARY 2325 | LDX #$00 ;LOW BYTE FOR LOAD ADDRESS 2326 | LDY #$5D ;HIGH BYTE FOR LOAD ADDRESS 2327 | LDA #$00 2328 | JSR $FFD5 ;LOAD FILE A=0 FOR LOAD X/Y=LOAD ADDRESS 2329 | JSR $FFC3 ;CLOSE FILE 2330 | RTS 2331 | 2332 | ; The following routine loads the sound routines from disk 2333 | SOUND_LOAD_ROUTINE: 2334 | ;load sound driver to $0400 2335 | LDA #8 ;LENGTH OF FILENAME 2336 | LDX #SNDNAME 2338 | JSR $FFBD ;SETNAM A=FILE NAME LENGTH X/Y=POINTER TO FILENAME 2339 | LDA #$02 2340 | LDX #$08 2341 | LDY #$00 2342 | JSR $FFBA ;SETFLS A=LOGICAL NUMBER X=DEVICE NUMBER Y=SECONDARY 2343 | LDX #$00 ;LOW BYTE FOR LOAD ADDRESS 2344 | LDY #$04 ;HIGH BYTE FOR LOAD ADDRESS 2345 | LDA #$00 2346 | JSR $FFD5 ;LOAD FILE A=0 FOR LOAD X/Y=LOAD ADDRESS 2347 | JSR $FFC3 ;CLOSE FILE 2348 | ;load music to $B400 2349 | LDA #10 ;LENGTH OF FILENAME 2350 | LDX #MUSICNAME 2352 | JSR $FFBD ;SETNAM A=FILE NAME LENGTH X/Y=POINTER TO FILENAME 2353 | LDA #$02 2354 | LDX #$08 2355 | LDY #$00 2356 | JSR $FFBA ;SETFLS A=LOGICAL NUMBER X=DEVICE NUMBER Y=SECONDARY 2357 | LDX #$00 ;LOW BYTE FOR LOAD ADDRESS 2358 | LDY #$B4 ;HIGH BYTE FOR LOAD ADDRESS 2359 | LDA #$00 2360 | JSR $FFD5 ;LOAD FILE A=0 FOR LOAD X/Y=LOAD ADDRESS 2361 | JSR $FFC3 ;CLOSE FILE 2362 | RTS 2363 | 2364 | DISPLAY_GAME_SCREEN: 2365 | LDA #$CD 2366 | STA $9005 ;enabled custom charset at $1400 2367 | ;SET SOURCE 2368 | LDA #SCR_TEXT 2371 | STA $FC 2372 | ;SET DESTINATION 2373 | LDA #$00 2374 | STA $FD 2375 | LDA #$10 2376 | STA $FE 2377 | ;SET END 2378 | LDA #$12 2379 | STA DGS5+1 2380 | LDA #$70 2381 | STA DGS6+1 2382 | JSR DECOMPRESS_SCREEN 2383 | ;SET SOURCE 2384 | LDA #SCR_COLOR 2387 | STA $FC 2388 | ;SET DESTINATION 2389 | LDA #$00 2390 | STA $FD 2391 | LDA #$94 2392 | STA $FE 2393 | ;SET END 2394 | LDA #$96 2395 | STA DGS5+1 2396 | LDA #$70 2397 | STA DGS6+1 2398 | JSR DECOMPRESS_SCREEN 2399 | RTS 2400 | 2401 | DISPLAY_INTRO_SCREEN: 2402 | LDA #$C0 2403 | STA $9005 ; Turn off custom character set. 2404 | ;SET SOURCE 2405 | LDA #INTRO_TEXT 2408 | STA $FC 2409 | ;SET DESTINATION 2410 | LDA #$00 2411 | STA $FD 2412 | LDA #$10 2413 | STA $FE 2414 | ;SET END 2415 | LDA #$12 2416 | STA DGS5+1 2417 | LDA #$70 2418 | STA DGS6+1 2419 | JSR DECOMPRESS_SCREEN 2420 | ;SET SOURCE 2421 | LDA #INTRO_COLOR 2424 | STA $FC 2425 | ;SET DESTINATION 2426 | LDA #$00 2427 | STA $FD 2428 | LDA #$94 2429 | STA $FE 2430 | ;SET END 2431 | LDA #$96 2432 | STA DGS5+1 2433 | LDA #$70 2434 | STA DGS6+1 2435 | JSR DECOMPRESS_SCREEN 2436 | RTS 2437 | 2438 | DISPLAY_ENDGAME_SCREEN: 2439 | ;first clear the color RAM. 2440 | LDA #05; GREEN 2441 | LDX #0 2442 | DESA: STA $9400,X 2443 | STA $9500,X 2444 | INX 2445 | CPX #0 2446 | BNE DESA 2447 | DESB: STA $9600,X 2448 | INX 2449 | CPX #113 2450 | BNE DESB 2451 | ;Now decompress text 2452 | ;SET SOURCE 2453 | LDA #SCR_ENDGAME 2456 | STA $FC 2457 | ;SET DESTINATION 2458 | LDA #$00 2459 | STA $FD 2460 | LDA #$10 2461 | STA $FE 2462 | ;SET END 2463 | LDA #$12 2464 | STA DGS5+1 2465 | LDA #$70 2466 | STA DGS6+1 2467 | JSR DECOMPRESS_SCREEN 2468 | ;display map number 2469 | LDA #$D3 2470 | STA $FB 2471 | LDA #$10 2472 | STA $FC 2473 | LDA SELECTED_MAP 2474 | STA DECNUM 2475 | INC DECNUM 2476 | JSR DECWRITE 2477 | ;count robots remaining 2478 | LDX #1 2479 | LDA #0 2480 | STA DECNUM 2481 | DEG7: LDA UNIT_TYPE,X 2482 | CMP #0 2483 | BEQ DEG8 2484 | INC DECNUM 2485 | DEG8: INX 2486 | CPX #28 2487 | BNE DEG7 2488 | LDA #$11 2489 | STA $FC 2490 | LDA #$69 2491 | STA $FB 2492 | JSR DECWRITE 2493 | ;Count secrets remaining 2494 | LDA #0 2495 | STA DECNUM 2496 | LDX #48 2497 | DEG9: LDA UNIT_TYPE,X 2498 | CMP #0 2499 | BEQ DEG10 2500 | INC DECNUM 2501 | DEG10: INX 2502 | CPX #64 2503 | BNE DEG9 2504 | LDA #$11 2505 | STA $FC 2506 | LDA #$B4 2507 | STA $FB 2508 | JSR DECWRITE 2509 | RTS 2510 | 2511 | DECOMPRESS_SCREEN: 2512 | LDY #00 2513 | DGS1: LDA ($FB),Y 2514 | CMP #96 ;REPEAT FLAG 2515 | BEQ DGS10 2516 | DGS2: STA ($FD),Y 2517 | ;CHECK TO SEE IF WE REACHED $83E7 YET. 2518 | DGS4: LDA $FE 2519 | DGS5: CMP #$83 ;SELF MODIFYING CODE 2520 | BNE DGS3 2521 | LDA $FD 2522 | DGS6: CMP #$E7 ;SELF MODIFYING CODE 2523 | BNE DGS3 2524 | RTS 2525 | DGS3: JSR INC_SOURCE 2526 | JSR INC_DEST 2527 | JMP DGS1 2528 | DGS10: ;REPEAT CODE 2529 | JSR INC_SOURCE 2530 | LDA ($FB),Y 2531 | STA RPT 2532 | JSR INC_SOURCE 2533 | LDA ($FB),Y 2534 | TAX 2535 | DGS11: LDA RPT 2536 | STA ($FD),Y 2537 | JSR INC_DEST 2538 | DEX 2539 | CPX #$FF 2540 | BNE DGS11 2541 | LDA $FD 2542 | SEC 2543 | SBC #01 2544 | STA $FD 2545 | LDA $FE 2546 | SBC #00 2547 | STA $FE 2548 | JMP DGS4 2549 | INC_SOURCE: 2550 | LDA $FB 2551 | CLC 2552 | ADC #01 2553 | STA $FB 2554 | LDA $FC 2555 | ADC #00 2556 | STA $FC 2557 | RTS 2558 | INC_DEST: 2559 | LDA $FD 2560 | CLC 2561 | ADC #01 2562 | STA $FD 2563 | LDA $FE 2564 | ADC #00 2565 | STA $FE 2566 | RTS 2567 | RPT !BYTE 00 ;repeat value 2568 | 2569 | DISPLAY_PLAYER_HEALTH: 2570 | LDA UNIT_HEALTH ;No index needed because it is the player 2571 | LSR ;divide by two 2572 | STA TEMP_A 2573 | LDY #00 2574 | DPH01: CPY TEMP_A 2575 | BEQ DPH02 2576 | LDA #$66 ;GRAY BLOCK 2577 | STA $1252,Y 2578 | INY 2579 | JMP DPH01 2580 | DPH02: LDA UNIT_HEALTH 2581 | AND #%00000001 2582 | CMP #%00000001 2583 | BNE DPH03 2584 | LDA #$5C ;HALF GRAY BLOCK 2585 | STA $1252,Y 2586 | INY 2587 | DPH03: CPY #6 2588 | BEQ DPH04 2589 | LDA #$20 ;SPACE 2590 | STA $1252,Y 2591 | INY 2592 | JMP DPH03 2593 | DPH04: RTS 2594 | 2595 | DISPLAY_KEYS: 2596 | LDA #32 2597 | STA $11A6 ;ERASE ALL 3 SPOTS 2598 | STA $11A7 2599 | STA $11A8 2600 | LDA KEYS 2601 | AND #%00000001 2602 | CMP #%00000001 ;Spade key 2603 | BNE DKS1 2604 | LDA #$41 2605 | STA $11A6 2606 | DKS1: LDA KEYS 2607 | AND #%00000010 2608 | CMP #%00000010 ;heart key 2609 | BNE DKS2 2610 | LDA #$53 2611 | STA $11A7 2612 | DKS2: LDA KEYS 2613 | AND #%00000100 2614 | CMP #%00000100 ;star key 2615 | BNE DKS3 2616 | LDA #$2A 2617 | STA $11A8 2618 | DKS3: RTS 2619 | 2620 | CYCLE_ITEM: 2621 | LDA #13 ;CHANGE-ITEM-SOUND 2622 | JSR PLAY_SOUND ;SOUND PLAY 2623 | LDA #20 2624 | STA KEYTIMER 2625 | INC SELECTED_ITEM 2626 | LDA SELECTED_ITEM 2627 | CMP #5 2628 | BEQ CYIT1 2629 | JMP DISPLAY_ITEM 2630 | CYIT1: LDA #0 2631 | STA SELECTED_ITEM 2632 | JMP DISPLAY_ITEM 2633 | 2634 | DISPLAY_ITEM: 2635 | JSR PRESELECT_ITEM 2636 | DSIT00: LDA SELECTED_ITEM 2637 | CMP #0 ;no items to show 2638 | BNE DSIT01 2639 | ;add routine to draw blank space 2640 | RTS 2641 | DSIT01: CMP #5 ;number too high! 2642 | BNE DSIT0A 2643 | LDA #0 2644 | STA SELECTED_ITEM 2645 | RTS 2646 | DSIT0A: CMP #1 ;bomb 2647 | BNE DSIT03 2648 | LDA INV_BOMBS 2649 | CMP #0 ;did we run out? 2650 | BNE DSIT02 2651 | INC SELECTED_ITEM 2652 | JMP DSIT00 2653 | DSIT02: JSR DISPLAY_TIMEBOMB 2654 | RTS 2655 | DSIT03: CMP #2 ;emp 2656 | BNE DSIT05 2657 | LDA INV_EMP 2658 | CMP #0 ;did we run out? 2659 | BNE DSIT04 2660 | INC SELECTED_ITEM 2661 | JMP DSIT00 2662 | DSIT04: JSR DISPLAY_EMP 2663 | RTS 2664 | DSIT05: CMP #3 ;medkit 2665 | BNE DSIT07 2666 | LDA INV_MEDKIT 2667 | CMP #0 ;did we run out? 2668 | BNE DSIT06 2669 | INC SELECTED_ITEM 2670 | JMP DSIT00 2671 | DSIT06: JSR DISPLAY_MEDKIT 2672 | RTS 2673 | DSIT07: CMP #4 ;magnet 2674 | BNE DSIT09 2675 | LDA INV_MAGNET 2676 | CMP #0 ;did we run out? 2677 | BNE DSIT08 2678 | INC SELECTED_ITEM 2679 | JMP DSIT09 2680 | DSIT08: JSR DISPLAY_MAGNET 2681 | RTS 2682 | DSIT09: LDA #0 2683 | STA SELECTED_ITEM 2684 | JSR PRESELECT_ITEM 2685 | JMP DISPLAY_ITEM 2686 | 2687 | ;This routine checks to see if currently selected 2688 | ;item is zero. And if it is, then it checks inventories 2689 | ;of other items to decide which item to automatically 2690 | ;select for the user. 2691 | PRESELECT_ITEM: 2692 | LDA SELECTED_ITEM 2693 | CMP #0 ;If item already selected, return 2694 | BEQ PRSI01 2695 | RTS 2696 | PRSI01: LDA INV_BOMBS 2697 | CMP #0 2698 | BEQ PRSI02 2699 | LDA #1 ;BOMB 2700 | STA SELECTED_ITEM 2701 | RTS 2702 | PRSI02: LDA INV_EMP 2703 | CMP #0 2704 | BEQ PRSI03 2705 | LDA #2 ;EMP 2706 | STA SELECTED_ITEM 2707 | RTS 2708 | PRSI03: LDA INV_MEDKIT 2709 | CMP #0 2710 | BEQ PRSI04 2711 | LDA #3 ;MEDKIT 2712 | STA SELECTED_ITEM 2713 | RTS 2714 | PRSI04: LDA INV_MAGNET 2715 | CMP #0 2716 | BEQ PRSI05 2717 | LDA #4 ;MAGNET 2718 | STA SELECTED_ITEM 2719 | RTS 2720 | PRSI05: ;Nothing found in inventory at this point, so set 2721 | ;selected-item to zero. 2722 | LDA #0 ;nothing in inventory 2723 | STA SELECTED_ITEM 2724 | JSR DISPLAY_BLANK_ITEM 2725 | RTS 2726 | 2727 | DISPLAY_TIMEBOMB: 2728 | LDY #0 2729 | DTB1: LDA TBOMB1A,Y 2730 | STA $10DE,Y 2731 | LDA TBOMB1B,Y 2732 | STA $10F7,Y 2733 | LDA TBOMB1C,Y 2734 | STA $1110,Y 2735 | LDA TBOMB1D,Y 2736 | STA $1129,Y 2737 | LDA TBOMB1E,Y 2738 | STA $94DE,Y 2739 | LDA TBOMB1F,Y 2740 | STA $94F7,Y 2741 | LDA TBOMB1G,Y 2742 | STA $9510,Y 2743 | LDA TBOMB1H,Y 2744 | STA $9529,Y 2745 | INY 2746 | CPY #3 2747 | BNE DTB1 2748 | LDA INV_BOMBS 2749 | STA DECNUM 2750 | LDA #$42 2751 | STA $FB 2752 | LDA #$11 2753 | STA $FC 2754 | JSR DECWRITE 2755 | RTS 2756 | 2757 | DISPLAY_EMP: 2758 | LDY #0 2759 | DEM1: LDA EMP1A,Y 2760 | STA $10DE,Y 2761 | LDA EMP1B,Y 2762 | STA $10F7,Y 2763 | LDA EMP1C,Y 2764 | STA $1110,Y 2765 | LDA EMP1D,Y 2766 | STA $1129,Y 2767 | LDA EMP1E,Y 2768 | STA $94DE,Y 2769 | LDA EMP1F,Y 2770 | STA $94F7,Y 2771 | LDA EMP1G,Y 2772 | STA $9510,Y 2773 | LDA EMP1H,Y 2774 | STA $9529,Y 2775 | INY 2776 | CPY #3 2777 | BNE DEM1 2778 | LDA INV_EMP 2779 | STA DECNUM 2780 | LDA #$42 2781 | STA $FB 2782 | LDA #$11 2783 | STA $FC 2784 | JSR DECWRITE 2785 | RTS 2786 | 2787 | DISPLAY_MEDKIT: 2788 | LDY #0 2789 | DMK1: LDA MED1A,Y 2790 | STA $10DE,Y 2791 | LDA MED1B,Y 2792 | STA $10F7,Y 2793 | LDA MED1C,Y 2794 | STA $1110,Y 2795 | LDA MED1D,Y 2796 | STA $1129,Y 2797 | LDA MED1E,Y 2798 | STA $94DE,Y 2799 | LDA MED1F,Y 2800 | STA $94F7,Y 2801 | LDA MED1G,Y 2802 | STA $9510,Y 2803 | LDA MED1H,Y 2804 | STA $9529,Y 2805 | INY 2806 | CPY #3 2807 | BNE DMK1 2808 | LDA INV_MEDKIT 2809 | STA DECNUM 2810 | LDA #$42 2811 | STA $FB 2812 | LDA #$11 2813 | STA $FC 2814 | JSR DECWRITE 2815 | RTS 2816 | 2817 | DISPLAY_MAGNET: 2818 | LDY #0 2819 | DMG1: LDA MAG1A,Y 2820 | STA $10DE,Y 2821 | LDA MAG1B,Y 2822 | STA $10F7,Y 2823 | LDA MAG1C,Y 2824 | STA $1110,Y 2825 | LDA MAG1D,Y 2826 | STA $1129,Y 2827 | LDA MAG1E,Y 2828 | STA $94DE,Y 2829 | LDA MAG1F,Y 2830 | STA $94F7,Y 2831 | LDA MAG1G,Y 2832 | STA $9510,Y 2833 | LDA MAG1H,Y 2834 | STA $9529,Y 2835 | INY 2836 | CPY #3 2837 | BNE DMG1 2838 | LDA INV_MAGNET 2839 | STA DECNUM 2840 | LDA #$42 2841 | STA $FB 2842 | LDA #$11 2843 | STA $FC 2844 | JSR DECWRITE 2845 | RTS 2846 | 2847 | DISPLAY_BLANK_ITEM: 2848 | LDY #0 2849 | DBI1: LDA #32 2850 | STA $10DE,Y 2851 | STA $10F7,Y 2852 | STA $1110,Y 2853 | STA $1129,Y 2854 | STA $1142,Y 2855 | INY 2856 | CPY #3 2857 | BNE DBI1 2858 | RTS 2859 | 2860 | CYCLE_WEAPON: 2861 | LDA #12 ;CHANGE WEAPON-SOUND 2862 | JSR PLAY_SOUND ;SOUND PLAY 2863 | LDA #20 2864 | STA KEYTIMER 2865 | INC SELECTED_WEAPON 2866 | LDA SELECTED_WEAPON 2867 | CMP #2 2868 | BNE CYWE1 2869 | JMP DISPLAY_WEAPON 2870 | CYWE1: LDA #0 2871 | STA SELECTED_WEAPON 2872 | JMP DISPLAY_WEAPON 2873 | 2874 | DISPLAY_WEAPON: 2875 | JSR PRESELECT_WEAPON 2876 | LDA SELECTED_WEAPON 2877 | CMP #0 ;no weapon to show 2878 | BNE DSWP01 2879 | ;add routine to draw blank space 2880 | RTS 2881 | DSWP01: CMP #1 ;PISTOL 2882 | BNE DSWP03 2883 | LDA AMMO_PISTOL 2884 | CMP #0 ;did we run out? 2885 | BNE DSWP02 2886 | LDA #0 2887 | STA SELECTED_WEAPON 2888 | JMP DISPLAY_WEAPON 2889 | DSWP02: JSR DISPLAY_PISTOL 2890 | RTS 2891 | DSWP03: CMP #2 ;PLASMA GUN 2892 | BNE DSWP05 2893 | LDA AMMO_PLASMA 2894 | CMP #0 ;did we run out? 2895 | BNE DSWP04 2896 | LDA #0 2897 | STA SELECTED_WEAPON 2898 | JMP DISPLAY_WEAPON 2899 | DSWP04: JSR DISPLAY_PLASMA_GUN 2900 | RTS 2901 | DSWP05: LDA #0 2902 | STA SELECTED_WEAPON ;should never happen 2903 | JMP DISPLAY_WEAPON 2904 | 2905 | ;This routine checks to see if currently selected 2906 | ;weapon is zero. And if it is, then it checks inventories 2907 | ;of other weapons to decide which item to automatically 2908 | ;select for the user. 2909 | PRESELECT_WEAPON: 2910 | LDA SELECTED_WEAPON 2911 | CMP #0 ;If item already selected, return 2912 | BEQ PRSW01 2913 | RTS 2914 | PRSW01: LDA AMMO_PISTOL 2915 | CMP #0 2916 | BEQ PRSW02 2917 | LDA #1 ;PISTOL 2918 | STA SELECTED_WEAPON 2919 | RTS 2920 | PRSW02: LDA AMMO_PLASMA 2921 | CMP #0 2922 | BEQ PRSW04 2923 | LDA #2 ;PLASMAGUN 2924 | STA SELECTED_WEAPON 2925 | RTS 2926 | PRSW04: ;Nothing found in inventory at this point, so set 2927 | ;selected-item to zero. 2928 | LDA #0 ;nothing in inventory 2929 | STA SELECTED_WEAPON 2930 | JSR DISPLAY_BLANK_WEAPON 2931 | RTS 2932 | 2933 | DISPLAY_PISTOL: 2934 | LDY #0 2935 | DW2: LDA PISTOL1A,Y 2936 | STA $102F,Y 2937 | LDA PISTOL1B,Y 2938 | STA $1048,Y 2939 | LDA PISTOL1C,Y 2940 | STA $1061,Y 2941 | LDA PISTOL1D,Y 2942 | STA $107A,Y 2943 | LDA PISTOL1E,Y 2944 | STA $942F,Y 2945 | LDA PISTOL1F,Y 2946 | STA $9448,Y 2947 | LDA PISTOL1G,Y 2948 | STA $9461,Y 2949 | LDA PISTOL1H,Y 2950 | STA $947A,Y 2951 | INY 2952 | CPY #3 2953 | BNE DW2 2954 | LDA AMMO_PISTOL 2955 | STA DECNUM 2956 | LDA #$93 2957 | STA $FB 2958 | LDA #$10 2959 | STA $FC 2960 | JSR DECWRITE 2961 | RTS 2962 | 2963 | DISPLAY_PLASMA_GUN: 2964 | LDY #0 2965 | DW1: LDA WEAPON1A,Y 2966 | STA $102F,Y 2967 | LDA WEAPON1B,Y 2968 | STA $1048,Y 2969 | LDA WEAPON1C,Y 2970 | STA $1061,Y 2971 | LDA WEAPON1D,Y 2972 | STA $107A,Y 2973 | LDA WEAPON1E,Y 2974 | STA $942F,Y 2975 | LDA WEAPON1F,Y 2976 | STA $9448,Y 2977 | LDA WEAPON1G,Y 2978 | STA $9461,Y 2979 | LDA WEAPON1H,Y 2980 | STA $947A,Y 2981 | INY 2982 | CPY #3 2983 | BNE DW1 2984 | LDA AMMO_PLASMA 2985 | STA DECNUM 2986 | LDA #$93 2987 | STA $FB 2988 | LDA #$10 2989 | STA $FC 2990 | JSR DECWRITE 2991 | RTS 2992 | 2993 | DISPLAY_BLANK_WEAPON: 2994 | LDY #0 2995 | DBW2: LDA #32 2996 | STA $102F,Y 2997 | STA $1048,Y 2998 | STA $1061,Y 2999 | STA $107A,Y 3000 | STA $1093,Y 3001 | INY 3002 | CPY #6 3003 | BNE DBW2 3004 | RTS 3005 | 3006 | GAME_OVER: 3007 | ;Did player die or win? 3008 | LDA UNIT_TYPE 3009 | CMP #0 3010 | BNE GOM0 3011 | LDA #111 ;dead player tile 3012 | STA UNIT_TILE 3013 | LDA #100 3014 | STA KEYTIMER 3015 | GOM0: JSR BACKGROUND_TASKS 3016 | LDA KEYTIMER 3017 | CMP #0 3018 | BNE GOM0 3019 | ;stop screen shake 3020 | LDA #0 3021 | STA SCREEN_SHAKE 3022 | LDX #0 3023 | GOM1: LDA GAMEOVER1,X 3024 | STA $10E6,X 3025 | LDA GAMEOVER2,X 3026 | STA $10FF,X 3027 | LDA GAMEOVER3,X 3028 | STA $1118,X 3029 | LDA #01 ;COLOR WHITE 3030 | STA $94E6,X 3031 | STA $94FF,X 3032 | STA $9518,X 3033 | INX 3034 | CPX #11 3035 | BNE GOM1 3036 | LDA #100 3037 | STA KEYTIMER 3038 | GOM2: LDA KEYTIMER 3039 | CMP #0 3040 | BNE GOM2 3041 | LDA #0 3042 | STA $00C6 ;CLEAR KEYBOARD BUFFER 3043 | GOM3: JSR $FFE4 3044 | CMP #$00 3045 | BEQ GOM3 3046 | GOM4: LDA #0 3047 | STA $00C6 ;CLEAR KEYBOARD BUFFER 3048 | LDA #15 ;menu beep 3049 | JSR PLAY_SOUND ;SOUND PLAY 3050 | JSR DISPLAY_ENDGAME_SCREEN 3051 | GOM5: JSR $FFE4 3052 | CMP #$00 3053 | BEQ GOM5 3054 | LDA #0 3055 | STA $009E ;CLEAR KEYBOARD BUFFER 3056 | JMP INTRO_SCREEN 3057 | 3058 | GAMEOVER1: !BYTE $70,$40,$40,$40,$40,$40,$40,$40,$40,$40,$6e 3059 | GAMEOVER2: !BYTE $5d,$07,$01,$0d,$05,$20,$0f,$16,$05,$12,$5d 3060 | GAMEOVER3: !BYTE $6d,$40,$40,$40,$40,$40,$40,$40,$40,$40,$7d 3061 | 3062 | PRINT_INTRO_MESSAGE: 3063 | LDA #INTRO_MESSAGE 3066 | STA $FC 3067 | JSR PRINT_INFO 3068 | RTS 3069 | 3070 | ;This routine will print something to the "information" window 3071 | ;at the bottom left of the screen. You must first define the 3072 | ;source of the text in $FB. The text should terminate with 3073 | ;a null character. 3074 | PRINT_INFO: 3075 | JSR SCROLL_INFO ;New text always causes a scroll 3076 | LDY #0 3077 | STY PRINTX 3078 | PI01: LDA ($FB),Y 3079 | CMP #0 ;null terminates string 3080 | BNE PI02 3081 | RTS 3082 | PI02: CMP #255 ;return 3083 | BNE PI03 3084 | LDX #0 3085 | STX PRINTX 3086 | JSR SCROLL_INFO 3087 | JMP PI04 3088 | PI03: LDX PRINTX 3089 | STA $1258,X 3090 | INC PRINTX 3091 | PI04: INY 3092 | JMP PI01 3093 | PRINTX: !BYTE 00 ;used to store X-cursor location 3094 | 3095 | ;This routine scrolls the info screen by one row, clearing 3096 | ;a new row at the bottom. 3097 | SCROLL_INFO: 3098 | LDX #0 3099 | SCI1: LDA $123F,X 3100 | STA $1226,X 3101 | LDA $1258,X ;BOTTOM ROW 3102 | STA $123F,X 3103 | INX 3104 | CPX #18 3105 | BNE SCI1 3106 | ;NOW CLEAR BOTTOM ROW 3107 | LDX #0 3108 | LDA #32 3109 | SCI2: STA $1258,X;BOTTOM ROW 3110 | INX 3111 | CPX #18 3112 | BNE SCI2 3113 | RTS 3114 | 3115 | RESET_KEYS_AMMO: 3116 | LDA #$00 3117 | STA KEYS 3118 | STA AMMO_PISTOL 3119 | STA AMMO_PLASMA 3120 | STA INV_BOMBS 3121 | STA INV_EMP 3122 | STA INV_MEDKIT 3123 | STA INV_MAGNET 3124 | STA SELECTED_WEAPON 3125 | STA SELECTED_ITEM 3126 | STA MAGNET_ACT 3127 | STA PLASMA_ACT 3128 | STA BIG_EXP_ACT 3129 | RTS 3130 | 3131 | INTRO_SCREEN: 3132 | LDX #$B4 ;find music at $B400 3133 | LDA #$00 3134 | JSR PEST_SOUND+$09 ;PEST MUSIC LOAD 3135 | JSR PEST_SOUND+$0C ;PEST MUSIC PLAY 3136 | JSR DISPLAY_INTRO_SCREEN 3137 | JSR DISPLAY_MAP_NAME 3138 | JSR CHANGE_DIFFICULTY_LEVEL 3139 | LDA #0 3140 | STA MENUY 3141 | JSR REVERSE_MENU_OPTION 3142 | ISLOOP JSR $FFE4 3143 | CMP #00 3144 | BEQ ISLOOP 3145 | CMP #$11 ;CURSOR DOWN 3146 | BNE IS001 3147 | IS001A: LDA MENUY 3148 | CMP #3 3149 | BEQ ISLOOP 3150 | JSR REVERSE_MENU_OPTION 3151 | INC MENUY 3152 | JSR REVERSE_MENU_OPTION 3153 | LDA #15 3154 | JSR PEST_SOUND+$15 ;SOUND PLAY 3155 | JMP ISLOOP 3156 | IS001: CMP #$91 ;CURSOR UP 3157 | BNE IS002 3158 | IS002A: LDA MENUY 3159 | CMP #0 3160 | BEQ ISLOOP 3161 | JSR REVERSE_MENU_OPTION 3162 | DEC MENUY 3163 | JSR REVERSE_MENU_OPTION 3164 | LDA #15 3165 | JSR PLAY_SOUND ;SOUND PLAY 3166 | JMP ISLOOP 3167 | IS002: CMP #32 ;SPACE 3168 | BNE IS003 3169 | JMP EXEC_COMMAND 3170 | IS003: CMP KEY_MOVE_UP 3171 | BNE IS004 3172 | JMP IS002A 3173 | IS004: CMP KEY_MOVE_DOWN 3174 | BNE IS005 3175 | JMP IS001A 3176 | IS005: CMP #13 ;RETURN 3177 | BNE IS006 3178 | LDA #15 ;menu beep 3179 | JSR PLAY_SOUND ;SOUND PLAY 3180 | JMP EXEC_COMMAND 3181 | IS006: JMP ISLOOP 3182 | 3183 | 3184 | EXEC_COMMAND: 3185 | LDA MENUY 3186 | CMP #00 ;START GAME 3187 | BNE EXEC1 3188 | JSR SET_CONTROLS 3189 | JSR PEST_SOUND+$0F ;MUSIC STOP 3190 | LDA #0 3191 | STA MUSIC_STATE 3192 | JMP INIT_GAME 3193 | EXEC1: CMP #2 ;DIFF LEVEL 3194 | BNE EXEC05 3195 | INC DIFF_LEVEL 3196 | LDA DIFF_LEVEL 3197 | CMP #3 3198 | BNE EXEC02 3199 | LDA #0 3200 | STA DIFF_LEVEL 3201 | EXEC02: JSR CHANGE_DIFFICULTY_LEVEL 3202 | JMP ISLOOP 3203 | EXEC05: CMP #1 ;cycle map 3204 | BNE EXEC06 3205 | JSR CYCLE_MAP 3206 | EXEC06: CMP #3 3207 | BNE EXEC07 3208 | JSR CYCLE_CONTROLS 3209 | EXEC07: JMP ISLOOP 3210 | 3211 | CYCLE_CONTROLS: 3212 | INC CONTROL 3213 | LDA CONTROL 3214 | CMP #3 3215 | BNE CCON2 3216 | LDA #0 3217 | STA CONTROL 3218 | CCON2: ;display control method on screen 3219 | LDY CONTROL 3220 | LDA CONTROLSTART,Y 3221 | TAY 3222 | LDX #0 3223 | CCON3: LDA CONTROLTEXT,Y 3224 | ORA #%10000000 3225 | STA $105C,X 3226 | INX 3227 | INY 3228 | CPX #8 3229 | BNE CCON3 3230 | RTS 3231 | 3232 | CONTROLTEXT: !SCR"keyset 1" 3233 | !SCR"keyset 2" 3234 | !SCR"snes pad" 3235 | CONTROLSTART: !BYTE 00,8,16 3236 | 3237 | CYCLE_MAP: 3238 | INC SELECTED_MAP 3239 | LDA SELECTED_MAP 3240 | CMP #10 ;max number of maps 3241 | BNE CYM1 3242 | LDA #0 3243 | STA SELECTED_MAP 3244 | CYM1: JSR DISPLAY_MAP_NAME 3245 | RTS 3246 | 3247 | DISPLAY_MAP_NAME: 3248 | LDA SELECTED_MAP 3249 | STA DECNUM 3250 | INC DECNUM 3251 | LDA #$1A 3252 | STA $FB 3253 | LDA #$10 3254 | STA $FC 3255 | JSR DECWRITE 3256 | ;now set the mapname for the filesystem load 3257 | LDA SELECTED_MAP 3258 | CLC 3259 | ADC #65 3260 | STA MAPNAME+6 3261 | RTS 3262 | 3263 | REVERSE_MENU_OPTION: 3264 | LDY MENUY 3265 | LDA MENU_CHART_L,Y 3266 | STA $FB 3267 | LDA #$10 3268 | STA $FC 3269 | LDY #0 3270 | RMO1: LDA ($FB),Y 3271 | EOR #%10000000 3272 | STA ($FB),Y 3273 | INY 3274 | CPY #8 3275 | BNE RMO1 3276 | RTS 3277 | MENUY !BYTE $00 ;CURRENT MENU SELECTION 3278 | MENU_CHART_L: 3279 | !BYTE $11,$2A,$43,$5C 3280 | 3281 | CHANGE_DIFFICULTY_LEVEL: 3282 | LDY DIFF_LEVEL 3283 | LDA FACE_LEVEL,Y 3284 | TAY 3285 | ;DO CHARACTERS FIRST 3286 | LDA ROBOT_FACE,Y 3287 | STA $1083 3288 | INY 3289 | LDA ROBOT_FACE,Y 3290 | STA $1084 3291 | INY 3292 | LDA ROBOT_FACE,Y 3293 | STA $1085 3294 | INY 3295 | LDA ROBOT_FACE,Y 3296 | STA $1087 3297 | INY 3298 | LDA ROBOT_FACE,Y 3299 | STA $1088 3300 | INY 3301 | LDA ROBOT_FACE,Y 3302 | STA $1089 3303 | INY 3304 | LDA ROBOT_FACE,Y 3305 | STA $109E 3306 | INY 3307 | LDA ROBOT_FACE,Y 3308 | STA $10A0 3309 | ;NOW DO COLORS 3310 | INY 3311 | LDA ROBOT_FACE,Y 3312 | STA $9483 3313 | INY 3314 | LDA ROBOT_FACE,Y 3315 | STA $9484 3316 | INY 3317 | LDA ROBOT_FACE,Y 3318 | STA $9485 3319 | INY 3320 | LDA ROBOT_FACE,Y 3321 | STA $9487 3322 | INY 3323 | LDA ROBOT_FACE,Y 3324 | STA $9488 3325 | INY 3326 | LDA ROBOT_FACE,Y 3327 | STA $9489 3328 | RTS 3329 | DIFF_LEVEL !BYTE 01 ;default is medium 3330 | 3331 | ROBOT_FACE: 3332 | !BYTE $3A,$43,$49,$55,$43,$3A,$49,$55,$06,$01,$01,$01,$01,$06 ;EASY LEVEL 3333 | !BYTE $40,$40,$6E,$70,$40,$40,$49,$55,$01,$01,$01,$01,$01,$01 ;MEDIUM LEVEL 3334 | !BYTE $3A,$4D,$3A,$3A,$4E,$3A,$4D,$4E,$02,$01,$02,$02,$01,$02 ;HARD LEVEL 3335 | FACE_LEVEL: 3336 | !BYTE 0,14,28 3337 | 3338 | ;This routine is run after the map is loaded, but before the 3339 | ;game starts. If the diffulcty is set to normal, nothing 3340 | ;actually happens. But if it is set to easy or hard, then 3341 | ;some changes occur accordingly. 3342 | SET_DIFF_LEVEL: 3343 | LDA DIFF_LEVEL 3344 | CMP #0 ;easy 3345 | BNE SDLE1 3346 | JMP SET_DIFF_EASY 3347 | SDLE1: CMP #2 ;hard 3348 | BNE SDLE2 3349 | JMP SET_DIFF_HARD 3350 | SDLE2: RTS 3351 | 3352 | SET_DIFF_EASY: 3353 | ;Find all hidden items and double the quantity. 3354 | LDX #48 3355 | SDE1: LDA UNIT_TYPE,X 3356 | CMP #0 3357 | BEQ SDE2 3358 | CMP #128 ;KEY 3359 | BEQ SDE2 3360 | ASL UNIT_A,X ;item qty 3361 | SDE2: INX 3362 | CPX #64 3363 | BNE SDE1 3364 | RTS 3365 | 3366 | SET_DIFF_HARD: 3367 | ;Find all hoverbots and change AI 3368 | LDX #0 3369 | SDH1: LDA UNIT_TYPE,X 3370 | CMP #2 ;hoverbot left/right 3371 | BEQ SDH4 3372 | CMP #3 ;hoverbot up/down 3373 | BEQ SDH4 3374 | SDH2: INX 3375 | CPX #28 3376 | BNE SDH1 3377 | RTS 3378 | SDH4: LDA #4 ;hoverbot attack mode 3379 | STA UNIT_TYPE,X 3380 | JMP SDH2 3381 | 3382 | ;This chart contains the left-most staring position for each 3383 | ;row of tiles on the map-editor. 7 Rows. 3384 | MAP_CHART_L: 3385 | !BYTE $00,$4B,$96,$E1,$2C,$77,$C2 3386 | 3387 | MAP_CHART_H: 3388 | !BYTE $10,$10,$10,$10,$11,$11,$11 3389 | 3390 | ;This routine animates the tile #204 (water) 3391 | ;and also tile 148 (trash compactor) 3392 | ANIMATE_WATER: 3393 | LDA ANIMATE 3394 | CMP #1 3395 | BEQ AW00 3396 | RTS 3397 | AW00: INC WATER_TIMER 3398 | LDA WATER_TIMER 3399 | CMP #20 3400 | BEQ AW01 3401 | RTS 3402 | AW01: LDA #0 3403 | STA WATER_TIMER 3404 | 3405 | LDA TILE_DATA_BR+204 3406 | STA WATER_TEMP1 3407 | LDA TILE_DATA_MM+204 3408 | STA TILE_DATA_BR+204 3409 | STA TILE_DATA_BR+221 3410 | LDA TILE_DATA_TL+204 3411 | STA TILE_DATA_MM+204 3412 | LDA WATER_TEMP1 3413 | STA TILE_DATA_TL+204 3414 | 3415 | LDA TILE_DATA_BL+204 3416 | STA WATER_TEMP1 3417 | LDA TILE_DATA_MR+204 3418 | STA TILE_DATA_BL+204 3419 | STA TILE_DATA_BL+221 3420 | LDA TILE_DATA_TM+204 3421 | STA TILE_DATA_MR+204 3422 | LDA WATER_TEMP1 3423 | STA TILE_DATA_TM+204 3424 | STA TILE_DATA_TM+221 3425 | 3426 | LDA TILE_DATA_BM+204 3427 | STA WATER_TEMP1 3428 | LDA TILE_DATA_ML+204 3429 | STA TILE_DATA_BM+204 3430 | STA TILE_DATA_BM+221 3431 | LDA TILE_DATA_TR+204 3432 | STA TILE_DATA_ML+204 3433 | LDA WATER_TEMP1 3434 | STA TILE_DATA_TR+204 3435 | STA TILE_DATA_TR+221 3436 | 3437 | ;now do trash compactor 3438 | LDA TILE_COLOR_TR+148 3439 | STA WATER_TEMP1 3440 | LDA TILE_COLOR_TM+148 3441 | STA TILE_COLOR_TR+148 3442 | LDA TILE_COLOR_TL+148 3443 | STA TILE_COLOR_TM+148 3444 | LDA WATER_TEMP1 3445 | STA TILE_COLOR_TL+148 3446 | 3447 | LDA TILE_COLOR_MR+148 3448 | STA WATER_TEMP1 3449 | LDA TILE_COLOR_MM+148 3450 | STA TILE_COLOR_MR+148 3451 | LDA TILE_COLOR_ML+148 3452 | STA TILE_COLOR_MM+148 3453 | LDA WATER_TEMP1 3454 | STA TILE_COLOR_ML+148 3455 | 3456 | LDA TILE_COLOR_BR+148 3457 | STA WATER_TEMP1 3458 | LDA TILE_COLOR_BM+148 3459 | STA TILE_COLOR_BR+148 3460 | LDA TILE_COLOR_BL+148 3461 | STA TILE_COLOR_BM+148 3462 | LDA WATER_TEMP1 3463 | STA TILE_COLOR_BL+148 3464 | 3465 | ;Now do HVAC fan 3466 | LDA HVAC_STATE 3467 | CMP #0 3468 | BEQ HVAC1 3469 | LDA #$CD 3470 | STA TILE_DATA_MM+196 3471 | STA TILE_DATA_TL+201 3472 | LDA #$CE 3473 | STA TILE_DATA_ML+197 3474 | STA TILE_DATA_TM+200 3475 | LDA #$A0 3476 | STA TILE_DATA_MR+196 3477 | STA TILE_DATA_BM+196 3478 | STA TILE_DATA_BL+197 3479 | STA TILE_DATA_TR+200 3480 | LDA #0 3481 | STA HVAC_STATE 3482 | JMP HVAC2 3483 | HVAC1: 3484 | LDA #$A0 3485 | STA TILE_DATA_MM+196 3486 | STA TILE_DATA_TL+201 3487 | STA TILE_DATA_ML+197 3488 | STA TILE_DATA_TM+200 3489 | LDA #$C2 3490 | STA TILE_DATA_MR+196 3491 | STA TILE_DATA_TR+200 3492 | LDA #$C0 3493 | STA TILE_DATA_BM+196 3494 | STA TILE_DATA_BL+197 3495 | LDA #1 3496 | STA HVAC_STATE 3497 | HVAC2: ;now do cinema screen tiles 3498 | ; ;FIRST COPY OLD LETTERS TO THE LEFT. 3499 | ; LDA TILE_DATA_MR+20 ;#2 3500 | ; STA TILE_DATA_MM+20 ;#1 3501 | ; LDA TILE_DATA_ML+21 ;#3 3502 | ; STA TILE_DATA_MR+20 ;#2 3503 | ; LDA TILE_DATA_MM+21 ;#4 3504 | ; STA TILE_DATA_ML+21 ;#3 3505 | ; LDA TILE_DATA_MR+21 ;#5 3506 | ; STA TILE_DATA_MM+21 ;#4 3507 | ; LDA TILE_DATA_ML+22 ;#6 3508 | ; STA TILE_DATA_MR+21 ;#5 3509 | ; ;now insert new character. 3510 | ; LDY CINEMA_STATE 3511 | ; LDA CINEMA_MESSAGE,Y 3512 | ; STA TILE_DATA_ML+22 ;#6 3513 | ; INC CINEMA_STATE 3514 | ; LDA CINEMA_STATE 3515 | ; CMP #197 3516 | ; BNE CINE2 3517 | ; LDA #0 3518 | ; STA CINEMA_STATE 3519 | ;CINE2: ;Now animate light on server computers 3520 | ; LDA TILE_DATA_MR+143 3521 | ; CMP #$D7 3522 | ; BNE CINE3 3523 | ; LDA #$D1 3524 | ; JMP CINE4 3525 | ;CINE3: LDA #$D7 3526 | ;CINE4: STA TILE_DATA_MR+143 3527 | LDA #1 3528 | STA REDRAW_WINDOW 3529 | RTS 3530 | WATER_TIMER !BYTE 00 3531 | WATER_TEMP1 !BYTE 00 3532 | HVAC_STATE !BYTE 00 3533 | ;CINEMA_STATE !BYTE 00 3534 | 3535 | ;This is the routine that allows a person to select 3536 | ;a level and highlights the selection in the information 3537 | ;display. It is unique to each computer since it writes 3538 | ;to the screen directly. 3539 | ELEVATOR_SELECT: 3540 | JSR DRAW_MAP_WINDOW 3541 | LDX UNIT 3542 | LDA UNIT_D,X ;get max levels 3543 | STA ELEVATOR_MAX_FLOOR 3544 | ;Now draw available levels on screen 3545 | LDY #0 3546 | LDA #$31 3547 | ELS1: STA $125E,Y 3548 | CLC 3549 | ADC #01 3550 | INY 3551 | CPY ELEVATOR_MAX_FLOOR 3552 | BNE ELS1 3553 | LDA UNIT_C,X ;what level are we on now? 3554 | STA ELEVATOR_CURRENT_FLOOR 3555 | ;Now highlight current level 3556 | JSR ELEVATOR_INVERT 3557 | ;Now get user input 3558 | LDA CONTROL 3559 | CMP #2 3560 | BNE ELS5 3561 | JMP SELS5 3562 | ELS5: ;KEYBOARD INPUT 3563 | JSR $FFE4 3564 | CMP #$00 3565 | BEQ ELS5 3566 | CMP KEY_MOVE_LEFT 3567 | BNE ELS6 3568 | JSR ELEVATOR_DEC 3569 | JMP ELS5 3570 | ELS6: CMP KEY_MOVE_RIGHT 3571 | BNE ELS7 3572 | JSR ELEVATOR_INC 3573 | JMP ELS5 3574 | ELS7: CMP #$9D ;CURSOR LEFT 3575 | BNE ELS8 3576 | JSR ELEVATOR_DEC 3577 | JMP ELS5 3578 | ELS8: CMP #$1D ;CURSOR RIGHT 3579 | BNE ELS9 3580 | JSR ELEVATOR_INC 3581 | JMP ELS5 3582 | ELS9: CMP #$11 ;CURSOR DOWN 3583 | BNE ELS10 3584 | ELS9B: JSR SCROLL_INFO 3585 | JSR SCROLL_INFO 3586 | JSR SCROLL_INFO 3587 | JSR CLEAR_KEY_BUFFER 3588 | RTS 3589 | ELS10: CMP KEY_MOVE_DOWN 3590 | BEQ ELS9B 3591 | ELS11: JMP ELS5 3592 | 3593 | SELS5: ;SNES INPUT 3594 | JSR SNES_CONTROLER_READ 3595 | LDA NEW_LEFT 3596 | CMP #1 3597 | BNE SELS8 3598 | JSR ELEVATOR_DEC 3599 | LDA #0 3600 | STA NEW_LEFT 3601 | JMP SELS5 3602 | SELS8: LDA NEW_RIGHT 3603 | CMP #1 3604 | BNE SELS9 3605 | JSR ELEVATOR_INC 3606 | LDA #0 3607 | STA NEW_RIGHT 3608 | JMP SELS5 3609 | SELS9: LDA NEW_DOWN 3610 | CMP #1 3611 | BNE SELS10 3612 | JSR SCROLL_INFO 3613 | JSR SCROLL_INFO 3614 | JSR SCROLL_INFO 3615 | LDA #15 3616 | STA KEYTIMER 3617 | LDA #0 3618 | STA NEW_DOWN 3619 | RTS 3620 | SELS10: JMP SELS5 3621 | 3622 | ELEVATOR_MAX_FLOOR !BYTE 00 3623 | ELEVATOR_CURRENT_FLOOR !BYTE 00 3624 | 3625 | ELEVATOR_INVERT: 3626 | LDY ELEVATOR_CURRENT_FLOOR 3627 | LDA $125D,Y 3628 | EOR #%10000000 3629 | STA $125D,Y 3630 | RTS 3631 | ELEVATOR_INC: 3632 | LDA ELEVATOR_CURRENT_FLOOR 3633 | CMP ELEVATOR_MAX_FLOOR 3634 | BNE ELVIN1 3635 | RTS 3636 | ELVIN1: JSR ELEVATOR_INVERT 3637 | INC ELEVATOR_CURRENT_FLOOR 3638 | JSR ELEVATOR_INVERT 3639 | JSR ELEVATOR_FIND_XY 3640 | RTS 3641 | ELEVATOR_DEC: 3642 | LDA ELEVATOR_CURRENT_FLOOR 3643 | CMP #1 3644 | BNE ELVDE1 3645 | RTS 3646 | ELVDE1: JSR ELEVATOR_INVERT 3647 | DEC ELEVATOR_CURRENT_FLOOR 3648 | JSR ELEVATOR_INVERT 3649 | JSR ELEVATOR_FIND_XY 3650 | RTS 3651 | 3652 | ELEVATOR_FIND_XY: 3653 | LDX #32 ;start of doors 3654 | ELXY1: LDA UNIT_TYPE,X 3655 | CMP #19 ;elevator 3656 | BNE ELXY5 3657 | LDA UNIT_C,X 3658 | CMP ELEVATOR_CURRENT_FLOOR 3659 | BNE ELXY5 3660 | JMP ELXY10 3661 | ELXY5: INX 3662 | CPX #48 3663 | BNE ELXY1 3664 | RTS 3665 | ELXY10: LDA UNIT_LOC_X,X ;new elevator location 3666 | STA UNIT_LOC_X ;player location 3667 | SEC 3668 | SBC #3 3669 | STA MAP_WINDOW_X 3670 | LDA UNIT_LOC_Y,X ;new elevator location 3671 | STA UNIT_LOC_Y ;player location 3672 | DEC UNIT_LOC_Y 3673 | SEC 3674 | SBC #4 3675 | STA MAP_WINDOW_Y 3676 | JSR DRAW_MAP_WINDOW 3677 | LDA #17 ;elevator sound 3678 | JSR PLAY_SOUND ;SOUND PLAY 3679 | RTS 3680 | 3681 | SET_CONTROLS: 3682 | LDA CONTROL 3683 | CMP #1 ;alternate keyset 3684 | BNE SETC1 3685 | LDY #0 3686 | SETC3: LDA ALTERNATE_CONTROLS,Y 3687 | STA KEY_MOVE_UP,Y 3688 | INY 3689 | CPY #13 3690 | BNE SETC3 3691 | RTS 3692 | SETC1: ;load standard values for key controls 3693 | LDY #0 3694 | SETC2: LDA STANDARD_CONTROLS,Y 3695 | STA KEY_MOVE_UP,Y 3696 | INY 3697 | CPY #13 3698 | BNE SETC2 3699 | RTS 3700 | 3701 | ;This is technically part of a background routine, but it has to 3702 | ;be here in the main code because the screen effects are unique 3703 | ;to each system. 3704 | DEMATERIALIZE: 3705 | LDX UNIT 3706 | LDA UNIT_TIMER_B,X 3707 | AND #%00000001 3708 | CLC 3709 | ADC #160 ;dematerialize tile 3710 | STA UNIT_TILE 3711 | LDA UNIT_TIMER_B,X 3712 | AND #%00001000 3713 | LSR 3714 | LSR 3715 | LSR 3716 | ADC UNIT_TILE 3717 | STA UNIT_TILE 3718 | INC UNIT_TIMER_B,X 3719 | LDA UNIT_TIMER_B,X 3720 | CMP #%00010000 3721 | BEQ DEMA1 3722 | LDA #1 3723 | STA UNIT_TIMER_A,X 3724 | LDA #1 3725 | STA REDRAW_WINDOW 3726 | JMP AILP 3727 | DEMA1: ;TRANSPORT COMPLETE 3728 | LDA UNIT_B,X 3729 | CMP #1 ;transport somewhere 3730 | BEQ DEMA2 3731 | LDA #2 ;this means game over condition 3732 | STA UNIT_TYPE ;player type 3733 | LDA #7 ;Normal transporter pad 3734 | STA UNIT_TYPE,X 3735 | JMP AILP 3736 | DEMA2: LDA #97 3737 | STA UNIT_TILE 3738 | LDA UNIT_C,X ;target X coordinates 3739 | STA UNIT_LOC_X 3740 | LDA UNIT_D,X ;target Y coordinates 3741 | STA UNIT_LOC_Y 3742 | LDA #7 ;Normal transporter pad 3743 | STA UNIT_TYPE,X 3744 | JSR CACULATE_AND_REDRAW 3745 | JMP AILP 3746 | 3747 | STANDARD_CONTROLS: 3748 | !BYTE 73 ;MOVE UP 3749 | !BYTE 75 ;MOVE DOWN 3750 | !BYTE 74 ;MOVE LEFT 3751 | !BYTE 76 ;MOVE RIGHT 3752 | !BYTE 87 ;FIRE UP 3753 | !BYTE 83 ;FIRE DOWN 3754 | !BYTE 65 ;FIRE LEFT 3755 | !BYTE 68 ;FIRE RIGHT 3756 | !BYTE 133 ;CYCLE WEAPONS 3757 | !BYTE 134 ;CYCLE ITEMS 3758 | !BYTE 32 ;USE ITEM 3759 | !BYTE 90 ;SEARCH OBEJCT 3760 | !BYTE 77 ;MOVE OBJECT 3761 | 3762 | ALTERNATE_CONTROLS: 3763 | !BYTE 87 ;MOVE UP 3764 | !BYTE 83 ;MOVE DOWN 3765 | !BYTE 65 ;MOVE LEFT 3766 | !BYTE 68 ;MOVE RIGHT 3767 | !BYTE 73 ;FIRE UP 3768 | !BYTE 75 ;FIRE DOWN 3769 | !BYTE 74 ;FIRE LEFT 3770 | !BYTE 76 ;FIRE RIGHT 3771 | !BYTE 133 ;CYCLE WEAPONS 3772 | !BYTE 134 ;CYCLE ITEMS 3773 | !BYTE 32 ;USE ITEM 3774 | !BYTE 90 ;SEARCH OBEJCT 3775 | !BYTE 77 ;MOVE OBJECT 3776 | 3777 | TOGGLE_MUSIC: 3778 | LDA MUSIC_STATE 3779 | CMP #0 3780 | BEQ TMU1 3781 | LDA #0 3782 | STA MUSIC_STATE 3783 | JSR PEST_SOUND+$0F 3784 | RTS 3785 | TMU1: LDA #1 3786 | STA MUSIC_STATE 3787 | JSR PEST_SOUND+$0C 3788 | RTS 3789 | 3790 | ANIMATE_PLAYER: 3791 | LDA PLAYER_ANI 3792 | CMP #0 3793 | BEQ PANI1 3794 | LDA #0 3795 | STA PLAYER_ANI 3796 | JMP PANI2 3797 | PANI1: LDA #56 3798 | STA PLAYER_ANI 3799 | PANI2: LDX #0 3800 | LDY PLAYER_ANI 3801 | LDA PLAYER_DIR 3802 | CMP #0 3803 | BEQ APU1 3804 | CMP #1 3805 | BEQ APD1 3806 | CMP #2 3807 | BEQ APL1 3808 | JMP APR1 3809 | APU1: LDA PLAYER_UP_1A,Y 3810 | STA $1400+$0480,X 3811 | LDA PLAYER_UP_1B,Y 3812 | STA $1400+$0488,X 3813 | LDA PLAYER_UP_1C,Y 3814 | STA $1400+$04C0,X 3815 | LDA PLAYER_UP_1D,Y 3816 | STA $1400+$04D8,X 3817 | LDA PLAYER_UP_1E,Y 3818 | STA $1400+$04E0,X 3819 | LDA PLAYER_UP_1F,Y 3820 | STA $1400+$04E8,X 3821 | LDA PLAYER_UP_1G,Y 3822 | STA $1400+$0510,X 3823 | INY 3824 | INX 3825 | CPX #8 3826 | BNE APU1 3827 | RTS 3828 | APD1: LDA PLAYER_DOWN_1A,Y 3829 | STA $1400+$0480,X 3830 | LDA PLAYER_DOWN_1B,Y 3831 | STA $1400+$0488,X 3832 | LDA PLAYER_DOWN_1C,Y 3833 | STA $1400+$04C0,X 3834 | LDA PLAYER_DOWN_1D,Y 3835 | STA $1400+$04D8,X 3836 | LDA PLAYER_DOWN_1E,Y 3837 | STA $1400+$04E0,X 3838 | LDA PLAYER_DOWN_1F,Y 3839 | STA $1400+$04E8,X 3840 | LDA PLAYER_DOWN_1G,Y 3841 | STA $1400+$0510,X 3842 | INY 3843 | INX 3844 | CPX #8 3845 | BNE APD1 3846 | RTS 3847 | APL1: LDA PLAYER_LEFT_1A,Y 3848 | STA $1400+$0480,X 3849 | LDA PLAYER_LEFT_1B,Y 3850 | STA $1400+$0488,X 3851 | LDA PLAYER_LEFT_1C,Y 3852 | STA $1400+$04C0,X 3853 | LDA PLAYER_LEFT_1D,Y 3854 | STA $1400+$04D8,X 3855 | LDA PLAYER_LEFT_1E,Y 3856 | STA $1400+$04E0,X 3857 | LDA PLAYER_LEFT_1F,Y 3858 | STA $1400+$04E8,X 3859 | LDA PLAYER_LEFT_1G,Y 3860 | STA $1400+$0510,X 3861 | INY 3862 | INX 3863 | CPX #8 3864 | BNE APL1 3865 | RTS 3866 | APR1: LDA PLAYER_RIGHT_1A,Y 3867 | STA $1400+$0480,X 3868 | LDA PLAYER_RIGHT_1B,Y 3869 | STA $1400+$0488,X 3870 | LDA PLAYER_RIGHT_1C,Y 3871 | STA $1400+$04C0,X 3872 | LDA PLAYER_RIGHT_1D,Y 3873 | STA $1400+$04D8,X 3874 | LDA PLAYER_RIGHT_1E,Y 3875 | STA $1400+$04E0,X 3876 | LDA PLAYER_RIGHT_1F,Y 3877 | STA $1400+$04E8,X 3878 | LDA PLAYER_RIGHT_1G,Y 3879 | STA $1400+$0510,X 3880 | INY 3881 | INX 3882 | CPX #8 3883 | BNE APR1 3884 | RTS 3885 | ;CHARACTER $90,$91,$98,$9B,$9C,$9D,$A2 3886 | 3887 | !SOURCE "BACKGROUND_TASKS.ASM" 3888 | 3889 | ;These are the included binary files that contain the screen 3890 | ;image for the main editor. 3891 | SCR_TEXT: 3892 | !BYTE $60, $20, $14, $5D, $17, $10, $0E, $60, $20, $14, $5D, $60, $20, $02, $60 3893 | !BYTE $20, $14, $5D, $60, $20, $02, $60, $20, $14, $5D, $60, $20, $02, $60, $20 3894 | !BYTE $14, $5D, $60, $20, $02, $60, $20, $14, $5D, $60, $20, $02, $60, $20, $14 3895 | !BYTE $6B, $60, $40, $02, $60, $20, $14, $5D, $09, $14, $0D, $60, $20, $14, $5D 3896 | !BYTE $60, $20, $02, $60, $20, $14, $5D, $60, $20, $02, $60, $20, $14, $5D, $60 3897 | !BYTE $20, $02, $60, $20, $14, $5D, $60, $20, $02, $60, $20, $14, $5D, $60, $20 3898 | !BYTE $02, $60, $20, $14, $6B, $60, $40, $02, $60, $20, $14, $5D, $0B, $05, $19 3899 | !BYTE $60, $20, $14, $5D, $60, $20, $02, $60, $20, $14, $5D, $60, $20, $02, $60 3900 | !BYTE $20, $14, $6B, $60, $40, $02, $60, $20, $14, $5D, $60, $20, $02, $60, $20 3901 | !BYTE $14, $5D, $60, $20, $02, $60, $20, $14, $5D, $60, $20, $02, $73, $09, $0E 3902 | !BYTE $06, $0F, $6B, $60, $40, $0B, $72, $40, $40, $71, $60, $40, $02, $60, $20 3903 | !BYTE $11, $5D, $08, $05, $01, $0C, $14, $08, $60, $20, $11, $5D, $60, $20, $17 3904 | !BYTE $5D, $60, $71, $05, $22 3905 | 3906 | SCR_COLOR: 3907 | !BYTE $60, $11, $FF, $60, $11, $A6, $12, $15, $60, $11, $7C, $60, $15, $11 3908 | !BYTE $60, $11, $06, $60, $15, $11, $60, $11, $06, $60, $15, $11, $11, $12, $12 3909 | !BYTE $17, $17, $15, $15 3910 | 3911 | ;These are the included binary files that contain the screen 3912 | ;image for the main editor. 3913 | INTRO_TEXT: 3914 | !BYTE $20, $0D, $01, $10, $60, $20, $03, $E9, $CE, $20, $20, $E9, $CE, $60, $20 3915 | !BYTE $02, $13, $14, $01, $12, $14, $60, $20, $02, $20, $30, $30, $31, $60, $20 3916 | !BYTE $03, $66, $A0, $20, $20, $66, $A0, $60, $20, $02, $0D, $01, $10, $20, $13 3917 | !BYTE $05, $0C, $60, $20, $07, $E9, $66, $CE, $A0, $A0, $66, $CE, $CE, $20, $20 3918 | !BYTE $13, $0B, $09, $0C, $0C, $60, $20, $08, $E9, $A0, $E3, $60, $A0, $02, $E3 3919 | !BYTE $60, $CE, $02, $20, $03, $0F, $0E, $14, $12, $0F, $0C, $13, $60, $20, $04 3920 | !BYTE $E9, $60, $66, $06, $CE, $CE, $A0, $60, $20, $0D, $66, $3A, $43, $49, $3A 3921 | !BYTE $55, $43, $3A, $66, $A0, $A0, $60, $20, $02, $E9, $CE, $20, $20, $E9, $CE 3922 | !BYTE $60, $20, $04, $66, $55, $43, $49, $3A, $55, $43, $49, $66, $A0, $A0, $60 3923 | !BYTE $20, $02, $66, $A0, $20, $20, $66, $A0, $60, $20, $04, $66, $42, $51, $48 3924 | !BYTE $3A, $42, $51, $48, $66, $A0, $69, $60, $20, $02, $66, $A0, $20, $20, $66 3925 | !BYTE $A0, $60, $20, $04, $66, $4A, $46, $4B, $3A, $4A, $46, $4B, $66, $CE, $60 3926 | !BYTE $20, $03, $66, $CE, $A0, $A0, $66, $A0, $60, $20, $05, $60, $66, $06, $A0 3927 | !BYTE $A0, $60, $20, $03, $60, $66, $04, $69, $60, $20, $05, $66, $60, $D0, $04 3928 | !BYTE $66, $A0, $A0, $60, $20, $05, $66, $A0, $20, $20, $60, $43, $05, $66, $60 3929 | !BYTE $D0, $04, $66, $A0, $69, $60, $43, $05, $66, $A0, $43, $43, $60, $3A, $05 3930 | !BYTE $60, $66, $06, $CE, $A0, $A0, $CE, $60, $3A, $03, $66, $A0, $60, $3A, $07 3931 | !BYTE $E9, $A0, $A0, $E7, $D0, $CE, $60, $A0, $02, $CE, $A0, $60, $3A, $03, $66 3932 | !BYTE $A0, $60, $3A, $06, $E9, $60, $A0, $03, $E3, $60, $A0, $02, $CE, $A0, $A0 3933 | !BYTE $60, $3A, $03, $66, $A0, $60, $3A, $02, $E9, $CE, $DF, $3A, $60, $66, $08 3934 | !BYTE $D5, $C0, $C9, $60, $3A, $03, $66, $CE, $DF, $3A, $E9, $A0, $CD, $CE, $A0 3935 | !BYTE $66, $51, $60, $66, $04, $51, $66, $DD, $CE, $E3, $60, $A0, $02, $CE, $A0 3936 | !BYTE $CD, $CE, $3A, $A0, $D1, $E7, $60, $66, $0A, $DD, $60, $66, $04, $A0, $D1 3937 | !BYTE $E7, $69, $3A, $5F, $A0, $CE, $3A, $3A, $60, $66, $08, $CA, $C0, $CB, $60 3938 | !BYTE $3A, $02, $5F, $E4, $69, $3A, $3A, $E9, $A0, $A0, $CE, $3A, $E9, $A0, $A0 3939 | !BYTE $CE, $E9, $A0, $CE, $3A, $E9, $A0, $A0, $CE, $E9, $A0, $A0, $CE, $E9, $A0 3940 | !BYTE $A0, $CE, $60, $66, $02, $CE, $CE, $60, $66, $02, $A0, $66, $66, $CE, $CE 3941 | !BYTE $60, $66, $02, $A0, $60, $66, $02, $69, $60, $66, $02, $69, $66, $CE, $A0 3942 | !BYTE $66, $CE, $66, $A0, $66, $A0, $66, $CE, $66, $69, $66, $A0, $66, $A0, $3A 3943 | !BYTE $66, $A0, $3A, $66, $CE, $A0, $CE, $60, $66, $02, $CE, $CE, $66, $A0, $66 3944 | !BYTE $A0, $66, $66, $CE, $CE, $66, $A0, $66, $A0, $3A, $66, $A0, $3A, $60, $66 3945 | !BYTE $02, $A0, $66, $A0, $3A, $66, $A0, $66, $CE, $66, $A0, $66, $CE, $66, $69 3946 | !BYTE $66, $CE, $66, $A0, $3A, $66, $A0, $3A, $3A, $E9, $66, $A0, $66, $69, $3A 3947 | !BYTE $66, $69, $60, $66, $02, $69, $66, $66, $69, $3A, $60, $66, $02, $69, $3A 3948 | !BYTE $66, $69, $3A, $60, $66, $02, $69 3949 | 3950 | INTRO_COLOR: 3951 | !BYTE $60, $25, $03, $60, $21, $03, $23, $23, $21, $21, $23, $23, $60, $21, $02 3952 | !BYTE $60, $25, $0B, $60, $21, $02, $2C, $22, $23, $21, $21, $22, $23, $60, $21 3953 | !BYTE $02, $60, $25, $09, $60, $21, $04, $23, $22, $60, $23, $02, $22, $23, $23 3954 | !BYTE $21, $21, $60, $25, $09, $60, $21, $03, $60, $23, $09, $21, $60, $25, $09 3955 | !BYTE $60, $21, $02, $23, $60, $22, $06, $60, $23, $02, $60, $21, $08, $25, $25 3956 | !BYTE $60, $21, $02, $22, $26, $21, $21, $22, $21, $21, $26, $22, $23, $23, $60 3957 | !BYTE $21, $02, $23, $23, $21, $21, $23, $23, $25, $25, $60, $21, $02, $22, $60 3958 | !BYTE $21, $02, $22, $60, $21, $02, $22, $23, $23, $60, $21, $02, $22, $23, $21 3959 | !BYTE $21, $22, $23, $25, $60, $21, $03, $22, $21, $22, $21, $22, $21, $22, $21 3960 | !BYTE $22, $23, $23, $60, $21, $02, $22, $23, $21, $23, $22, $23, $25, $60, $21 3961 | !BYTE $03, $22, $60, $21, $02, $22, $60, $21, $02, $22, $23, $2C, $60, $21, $02 3962 | !BYTE $22, $60, $23, $02, $22, $23, $60, $25, $04, $21, $60, $22, $06, $23, $23 3963 | !BYTE $60, $21, $03, $60, $22, $04, $23, $60, $21, $05, $22, $60, $21, $04, $22 3964 | !BYTE $23, $23, $60, $21, $05, $22, $23, $21, $21, $60, $26, $05, $22, $60, $21 3965 | !BYTE $04, $22, $23, $23, $60, $26, $05, $22, $23, $60, $26, $07, $60, $22, $06 3966 | !BYTE $60, $23, $03, $60, $26, $03, $22, $23, $60, $26, $07, $60, $23, $03, $28 3967 | !BYTE $60, $23, $05, $60, $26, $03, $22, $23, $60, $26, $06, $60, $23, $0B, $60 3968 | !BYTE $26, $03, $22, $23, $60, $26, $02, $60, $23, $02, $26, $60, $22, $08, $60 3969 | !BYTE $23, $02, $60, $26, $03, $22, $23, $23, $26, $60, $23, $04, $22, $21, $60 3970 | !BYTE $22, $04, $21, $22, $60, $23, $09, $26, $60, $23, $02, $60, $22, $0A, $23 3971 | !BYTE $60, $22, $04, $60, $23, $03, $26, $60, $23, $02, $26, $26, $60, $22, $08 3972 | !BYTE $60, $23, $02, $60, $26, $02, $60, $23, $02, $60, $26, $1A, $60, $21, $02 3973 | !BYTE $26, $26, $60, $21, $02, $26, $21, $21, $26, $26, $60, $21, $02, $26, $60 3974 | !BYTE $21, $02, $26, $60, $21, $02, $26, $21, $26, $26, $21, $26, $21, $26, $21 3975 | !BYTE $26, $21, $26, $21, $26, $21, $26, $21, $26, $26, $21, $26, $26, $21, $60 3976 | !BYTE $26, $02, $60, $21, $02, $26, $26, $21, $26, $21, $26, $21, $21, $26, $26 3977 | !BYTE $21, $26, $21, $26, $26, $21, $26, $26, $60, $21, $02, $26, $21, $26, $26 3978 | !BYTE $21, $26, $21, $26, $21, $26, $21, $26, $21, $26, $21, $26, $21, $26, $26 3979 | !BYTE $21, $60, $26, $03, $21, $26, $21, $26, $26, $21, $26, $60, $21, $02, $26 3980 | !BYTE $21, $21, $26, $26, $60, $21, $02, $26, $26, $21, $26, $26, $60, $21, $02 3981 | !BYTE $26 3982 | 3983 | SCR_ENDGAME: 3984 | !BYTE $55, $60, $40, $03, $73, $16, $09, $03, $2D, $32, $30, $20, $12, $0F, $02 3985 | !BYTE $0F, $14, $13, $6B, $60, $40, $03, $49, $5D, $60, $20, $16, $5D, $5D, $60 3986 | !BYTE $20, $16, $5D, $5D, $60, $20, $16, $5D, $5D, $60, $20, $16, $5D, $5D, $60 3987 | !BYTE $20, $16, $5D, $5D, $60, $20, $16, $5D, $5D, $60, $20, $06, $13, $03, $05 3988 | !BYTE $0E, $01, $12, $09, $0F, $60, $20, $07, $5D, $5D, $60, $20, $16, $5D, $5D 3989 | !BYTE $60, $20, $16, $5D, $5D, $60, $20, $10 3990 | !BYTE $60, $20, $05, $5D, $5D, $60, $20, $16, $5D, $5D 3991 | !BYTE $60, $20, $16, $5D, $5D, $60, $20, $02, $12, $0F, $02, $0F, $14, $13, $20 3992 | !BYTE $12, $05, $0D, $01, $09, $0E, $09, $0E, $07, $60, $20, $03, $5D, $5D, $60 3993 | !BYTE $20, $16, $5D, $5D, $60, $20, $16, $5D, $5D, $60, $20, $02, $13, $05, $03 3994 | !BYTE $12, $05, $14, $13, $20, $12, $05, $0D, $01, $09, $0E, $09, $0E, $07, $60 3995 | !BYTE $20, $02, $5D, $5D, $60, $20, $16, $5D, $5D, $60, $20, $16, $5D, $5D, $60 3996 | !BYTE $20, $16, $5D, $5D, $60, $20, $16, $5D, $5D, $60, $20, $16, $5D, $5D, $60 3997 | !BYTE $20, $16, $5D, $5D, $60, $20, $16, $5D, $4A, $60, $40, $16, $4B 3998 | 3999 | ;CINEMA_MESSAGE: 4000 | ; !SCR"coming soon: space balls 2 - the search for more money, " 4001 | ; !SCR"attack of the paperclips: clippy's revenge, " 4002 | ; !SCR"it came from planet earth, " 4003 | ; !SCR"rocky 5000, all my circuits the movie, " 4004 | ; !SCR"conan the librarian, and more! " 4005 | 4006 | ;Pistol (VIC-20) 4007 | PISTOL1A !BYTE $20,$20,$20 4008 | PISTOL1B !BYTE $E2,$F5,$F6 4009 | PISTOL1C !BYTE $20,$20,$F4 4010 | PISTOL1D !BYTE $20,$20,$20 4011 | ;Color for Blaster Gun (VIC-20) 4012 | PISTOL1E !BYTE $01,$01,$01 4013 | PISTOL1F !BYTE $05,$05,$05 4014 | PISTOL1G !BYTE $01,$01,$01 4015 | PISTOL1H !BYTE $01,$01,$01 4016 | 4017 | ;Blaster Gun (VIC-20) 4018 | WEAPON1A !BYTE $20,$20,$2c 4019 | WEAPON1B !BYTE $e2,$ef,$66 4020 | WEAPON1C !BYTE $20,$20,$F4 4021 | WEAPON1D !BYTE $20,$20,$20 4022 | ;Color for Blaster Gun (VIC-20) 4023 | WEAPON1E !BYTE $01,$01,$01 4024 | WEAPON1F !BYTE $03,$03,$06 4025 | WEAPON1G !BYTE $01,$01,$01 4026 | WEAPON1H !BYTE $01,$01,$01 4027 | 4028 | ;Time Bomb (VIC-20) 4029 | TBOMB1A !BYTE $20,$55,$2a 4030 | TBOMB1B !BYTE $55,$66,$49 4031 | TBOMB1C !BYTE $42,$20,$48 4032 | TBOMB1D !BYTE $4a,$46,$4b 4033 | ;Color for Time Bomb (VIC-20) 4034 | TBOMB1E !BYTE $01,$02,$07 4035 | TBOMB1F !BYTE $03,$03,$03 4036 | TBOMB1G !BYTE $03,$01,$03 4037 | TBOMB1H !BYTE $03,$03,$03 4038 | 4039 | ;EMP (VIC-20) 4040 | EMP1A !BYTE $55,$43,$49 4041 | EMP1B !BYTE $DF,$51,$E9 4042 | EMP1C !BYTE $69,$57,$5F 4043 | EMP1D !BYTE $4A,$46,$4B 4044 | ;Color for EMP (VIC-20) 4045 | EMP1E !BYTE $02,$02,$02 4046 | EMP1F !BYTE $03,$07,$03 4047 | EMP1G !BYTE $03,$07,$03 4048 | EMP1H !BYTE $02,$02,$02 4049 | 4050 | ;Magnet (VIC-20) 4051 | MAG1A !BYTE $4D,$20,$4E 4052 | MAG1B !BYTE $70,$E0,$6E 4053 | MAG1C !BYTE $42,$52,$48 4054 | MAG1D !BYTE $4A,$46,$4B 4055 | ;Color for EMP (VIC-20) 4056 | MAG1E !BYTE $01,$01,$01 4057 | MAG1F !BYTE $07,$07,$07 4058 | MAG1G !BYTE $02,$02,$02 4059 | MAG1H !BYTE $02,$02,$02 4060 | 4061 | ;Medkit (VIC-20) 4062 | MED1A !BYTE $55,$43,$49 4063 | MED1B !BYTE $A0,$A0,$A0 4064 | MED1C !BYTE $A0,$E1,$A0 4065 | MED1D !BYTE $E4,$E4,$E4 4066 | ;Color for Medkit (VIC-20) 4067 | MED1E !BYTE $01,$01,$01 4068 | MED1F !BYTE $01,$01,$01 4069 | MED1G !BYTE $01,$01,$01 4070 | MED1H !BYTE $01,$01,$01 4071 | 4072 | ;****PLAYER TILE BITMAPS**** 4073 | ;CHARACTER $90,$91,$98,$9B,$9C,$9D,$A2 4074 | 4075 | PLAYER_DOWN_1A: ;facing down step 1 4076 | !BYTE %00000000 4077 | !BYTE %00000000 4078 | !BYTE %00000000 4079 | !BYTE %00000000 4080 | !BYTE %00000111 4081 | !BYTE %00001111 4082 | !BYTE %00011111 4083 | !BYTE %00011111 4084 | PLAYER_DOWN_1B: 4085 | !BYTE %00000000 4086 | !BYTE %00000000 4087 | !BYTE %00000000 4088 | !BYTE %00000000 4089 | !BYTE %11000000 4090 | !BYTE %11100000 4091 | !BYTE %11100000 4092 | !BYTE %11101100 4093 | PLAYER_DOWN_1C: 4094 | !BYTE %00011111 4095 | !BYTE %00010111 4096 | !BYTE %00001000 4097 | !BYTE %00000100 4098 | !BYTE %00000011 4099 | !BYTE %00000011 4100 | !BYTE %00000001 4101 | !BYTE %00000001 4102 | PLAYER_DOWN_1D: 4103 | !BYTE %11100011 4104 | !BYTE %10100000 4105 | !BYTE %00100010 4106 | !BYTE %01000011 4107 | !BYTE %10000111 4108 | !BYTE %10011001 4109 | !BYTE %10000000 4110 | !BYTE %10100001 4111 | PLAYER_DOWN_1E: 4112 | !BYTE %00000000 4113 | !BYTE %10000000 4114 | !BYTE %01000000 4115 | !BYTE %10100000 4116 | !BYTE %01010000 4117 | !BYTE %10111000 4118 | !BYTE %10011000 4119 | !BYTE %11001000 4120 | PLAYER_DOWN_1F: 4121 | !BYTE %11010011 4122 | !BYTE %11001111 4123 | !BYTE %01000111 4124 | !BYTE %00000001 4125 | !BYTE %00000001 4126 | !BYTE %00000000 4127 | !BYTE %00000000 4128 | !BYTE %00000000 4129 | PLAYER_DOWN_1G: 4130 | !BYTE %11100000 4131 | !BYTE %01110000 4132 | !BYTE %10111000 4133 | !BYTE %10011100 4134 | !BYTE %10000110 4135 | !BYTE %00000110 4136 | !BYTE %00000000 4137 | !BYTE %00000000 4138 | 4139 | PLAYER_DOWN_2A: ;facing down step 2 4140 | !BYTE %00000000 4141 | !BYTE %00000000 4142 | !BYTE %00000000 4143 | !BYTE %00000000 4144 | !BYTE %00000111 4145 | !BYTE %00001111 4146 | !BYTE %00011111 4147 | !BYTE %00011111 4148 | PLAYER_DOWN_2B: 4149 | !BYTE %00000000 4150 | !BYTE %00000000 4151 | !BYTE %00000000 4152 | !BYTE %00000000 4153 | !BYTE %11000000 4154 | !BYTE %11100000 4155 | !BYTE %11100000 4156 | !BYTE %11100000 4157 | PLAYER_DOWN_2C: 4158 | !BYTE %00011111 4159 | !BYTE %00010111 4160 | !BYTE %00001000 4161 | !BYTE %00000100 4162 | !BYTE %00000111 4163 | !BYTE %00000011 4164 | !BYTE %00000000 4165 | !BYTE %00000000 4166 | PLAYER_DOWN_2D: 4167 | !BYTE %11101000 4168 | !BYTE %10100100 4169 | !BYTE %00100010 4170 | !BYTE %01000001 4171 | !BYTE %10001001 4172 | !BYTE %10111100 4173 | !BYTE %10000110 4174 | !BYTE %01000010 4175 | PLAYER_DOWN_2E: 4176 | !BYTE %00000000 4177 | !BYTE %00000000 4178 | !BYTE %00000000 4179 | !BYTE %00000000 4180 | !BYTE %00000000 4181 | !BYTE %10000000 4182 | !BYTE %10000000 4183 | !BYTE %11000000 4184 | PLAYER_DOWN_2F: 4185 | !BYTE %00100111 4186 | !BYTE %00011100 4187 | !BYTE %00011100 4188 | !BYTE %00001110 4189 | !BYTE %00001111 4190 | !BYTE %00000011 4191 | !BYTE %00000011 4192 | !BYTE %00000000 4193 | PLAYER_DOWN_2G: 4194 | !BYTE %11111000 4195 | !BYTE %01111000 4196 | !BYTE %00011000 4197 | !BYTE %00000000 4198 | !BYTE %00000000 4199 | !BYTE %00000000 4200 | !BYTE %00000000 4201 | !BYTE %00000000 4202 | 4203 | PLAYER_UP_1A: ;facing up step 1 4204 | !BYTE %00000000 4205 | !BYTE %00000000 4206 | !BYTE %00000000 4207 | !BYTE %00000000 4208 | !BYTE %00000111 4209 | !BYTE %00001110 4210 | !BYTE %00011111 4211 | !BYTE %00011111 4212 | PLAYER_UP_1B: 4213 | !BYTE %00000000 4214 | !BYTE %00000000 4215 | !BYTE %00000000 4216 | !BYTE %00000000 4217 | !BYTE %11000000 4218 | !BYTE %00100000 4219 | !BYTE %10010000 4220 | !BYTE %11010000 4221 | PLAYER_UP_1C: 4222 | !BYTE %00011111 4223 | !BYTE %00011111 4224 | !BYTE %00001111 4225 | !BYTE %00000111 4226 | !BYTE %00000011 4227 | !BYTE %00000011 4228 | !BYTE %00000001 4229 | !BYTE %00000000 4230 | PLAYER_UP_1D: 4231 | !BYTE %11111100 4232 | !BYTE %11110010 4233 | !BYTE %11100001 4234 | !BYTE %10000000 4235 | !BYTE %10000011 4236 | !BYTE %11000011 4237 | !BYTE %11100001 4238 | !BYTE %11110001 4239 | PLAYER_UP_1E: 4240 | !BYTE %00000000 4241 | !BYTE %00000000 4242 | !BYTE %00000000 4243 | !BYTE %10000000 4244 | !BYTE %01000000 4245 | !BYTE %10100000 4246 | !BYTE %11110000 4247 | !BYTE %11110000 4248 | PLAYER_UP_1F: 4249 | !BYTE %01111111 4250 | !BYTE %00011110 4251 | !BYTE %00001111 4252 | !BYTE %00000111 4253 | !BYTE %00000011 4254 | !BYTE %00000001 4255 | !BYTE %00000000 4256 | !BYTE %00000000 4257 | PLAYER_UP_1G: 4258 | !BYTE %11110000 4259 | !BYTE %11111000 4260 | !BYTE %11111000 4261 | !BYTE %10111000 4262 | !BYTE %10011000 4263 | !BYTE %10000000 4264 | !BYTE %00000000 4265 | !BYTE %00000000 4266 | 4267 | PLAYER_UP_2A: ;facing up step 2 4268 | !BYTE %00000000 4269 | !BYTE %00000000 4270 | !BYTE %00000000 4271 | !BYTE %00000000 4272 | !BYTE %00000111 4273 | !BYTE %00001110 4274 | !BYTE %00011111 4275 | !BYTE %00011111 4276 | PLAYER_UP_2B: 4277 | !BYTE %00000000 4278 | !BYTE %00000000 4279 | !BYTE %00000000 4280 | !BYTE %00000000 4281 | !BYTE %11000000 4282 | !BYTE %00100000 4283 | !BYTE %10010000 4284 | !BYTE %11010000 4285 | PLAYER_UP_2C: 4286 | !BYTE %00011111 4287 | !BYTE %00011111 4288 | !BYTE %00001111 4289 | !BYTE %00001111 4290 | !BYTE %00000111 4291 | !BYTE %00000111 4292 | !BYTE %00000011 4293 | !BYTE %00000011 4294 | PLAYER_UP_2D: 4295 | !BYTE %11111000 4296 | !BYTE %11110110 4297 | !BYTE %11100001 4298 | !BYTE %10000111 4299 | !BYTE %10000111 4300 | !BYTE %11000010 4301 | !BYTE %11000001 4302 | !BYTE %11100001 4303 | PLAYER_UP_2E: 4304 | !BYTE %00000000 4305 | !BYTE %00000000 4306 | !BYTE %10000000 4307 | !BYTE %01100000 4308 | !BYTE %11100000 4309 | !BYTE %00100000 4310 | !BYTE %00000000 4311 | !BYTE %00000000 4312 | PLAYER_UP_2F: 4313 | !BYTE %11110001 4314 | !BYTE %10111111 4315 | !BYTE %10011111 4316 | !BYTE %10000111 4317 | !BYTE %00000000 4318 | !BYTE %00000000 4319 | !BYTE %00000000 4320 | !BYTE %00000000 4321 | PLAYER_UP_2G: 4322 | !BYTE %10000000 4323 | !BYTE %11000000 4324 | !BYTE %11100000 4325 | !BYTE %11110000 4326 | !BYTE %01110000 4327 | !BYTE %00110000 4328 | !BYTE %00000000 4329 | !BYTE %00000000 4330 | 4331 | PLAYER_LEFT_1A: ;facing LEFT step 1 4332 | !BYTE %00000000 4333 | !BYTE %00000000 4334 | !BYTE %00000000 4335 | !BYTE %00000000 4336 | !BYTE %00000111 4337 | !BYTE %00001111 4338 | !BYTE %00011111 4339 | !BYTE %00011111 4340 | PLAYER_LEFT_1B: 4341 | !BYTE %00000000 4342 | !BYTE %00000000 4343 | !BYTE %00000000 4344 | !BYTE %00000000 4345 | !BYTE %10000000 4346 | !BYTE %11000000 4347 | !BYTE %11100000 4348 | !BYTE %11110000 4349 | PLAYER_LEFT_1C: 4350 | !BYTE %00010111 4351 | !BYTE %00010111 4352 | !BYTE %00010011 4353 | !BYTE %00001001 4354 | !BYTE %00000111 4355 | !BYTE %00000001 4356 | !BYTE %00000001 4357 | !BYTE %00000000 4358 | PLAYER_LEFT_1D: 4359 | !BYTE %11111100 4360 | !BYTE %11101110 4361 | !BYTE %11100111 4362 | !BYTE %11000011 4363 | !BYTE %10000001 4364 | !BYTE %00000000 4365 | !BYTE %10000000 4366 | !BYTE %10011000 4367 | PLAYER_LEFT_1E: 4368 | !BYTE %00000000 4369 | !BYTE %00000000 4370 | !BYTE %00000000 4371 | !BYTE %10000000 4372 | !BYTE %11000000 4373 | !BYTE %10000000 4374 | !BYTE %11000000 4375 | !BYTE %11000000 4376 | PLAYER_LEFT_1F: 4377 | !BYTE %11001101 4378 | !BYTE %01111111 4379 | !BYTE %00111111 4380 | !BYTE %00011101 4381 | !BYTE %00001110 4382 | !BYTE %00000000 4383 | !BYTE %00000000 4384 | !BYTE %00000000 4385 | PLAYER_LEFT_1G: 4386 | !BYTE %11100000 4387 | !BYTE %01100000 4388 | !BYTE %10000000 4389 | !BYTE %11000000 4390 | !BYTE %11100000 4391 | !BYTE %11110000 4392 | !BYTE %11110000 4393 | !BYTE %00000000 4394 | 4395 | PLAYER_LEFT_2A: ;facing LEFT step 2 4396 | !BYTE %00000000 4397 | !BYTE %00000000 4398 | !BYTE %00000000 4399 | !BYTE %00000000 4400 | !BYTE %00000111 4401 | !BYTE %00001111 4402 | !BYTE %00011111 4403 | !BYTE %00011111 4404 | PLAYER_LEFT_2B: 4405 | !BYTE %00000000 4406 | !BYTE %00000000 4407 | !BYTE %00000000 4408 | !BYTE %00000000 4409 | !BYTE %10000000 4410 | !BYTE %11000000 4411 | !BYTE %11100000 4412 | !BYTE %11111000 4413 | PLAYER_LEFT_2C: 4414 | !BYTE %00010111 4415 | !BYTE %00010111 4416 | !BYTE %00010011 4417 | !BYTE %00001001 4418 | !BYTE %00000111 4419 | !BYTE %00000000 4420 | !BYTE %00000000 4421 | !BYTE %00000000 4422 | PLAYER_LEFT_2D: 4423 | !BYTE %11111100 4424 | !BYTE %11101110 4425 | !BYTE %11100010 4426 | !BYTE %11000001 4427 | !BYTE %10000000 4428 | !BYTE %11001100 4429 | !BYTE %01100110 4430 | !BYTE %01110011 4431 | PLAYER_LEFT_2E: 4432 | !BYTE %00000000 4433 | !BYTE %00000000 4434 | !BYTE %00000000 4435 | !BYTE %00000000 4436 | !BYTE %10000000 4437 | !BYTE %11000000 4438 | !BYTE %11100000 4439 | !BYTE %11111000 4440 | PLAYER_LEFT_2F: 4441 | !BYTE %00111111 4442 | !BYTE %00011111 4443 | !BYTE %00011100 4444 | !BYTE %00011100 4445 | !BYTE %00001111 4446 | !BYTE %00001111 4447 | !BYTE %00000000 4448 | !BYTE %00000000 4449 | PLAYER_LEFT_2G: 4450 | !BYTE %01111000 4451 | !BYTE %00000000 4452 | !BYTE %00000000 4453 | !BYTE %10000000 4454 | !BYTE %00000000 4455 | !BYTE %00000000 4456 | !BYTE %00000000 4457 | !BYTE %00000000 4458 | 4459 | PLAYER_RIGHT_1A: ;facing RIGHT step 1 4460 | !BYTE %00000000 4461 | !BYTE %00000000 4462 | !BYTE %00000000 4463 | !BYTE %00000000 4464 | !BYTE %00000111 4465 | !BYTE %00001111 4466 | !BYTE %00011111 4467 | !BYTE %00011111 4468 | PLAYER_RIGHT_1B: 4469 | !BYTE %00000000 4470 | !BYTE %00000000 4471 | !BYTE %00000000 4472 | !BYTE %00000000 4473 | !BYTE %10000000 4474 | !BYTE %11000000 4475 | !BYTE %10100000 4476 | !BYTE %10011000 4477 | PLAYER_RIGHT_1C: 4478 | !BYTE %00011111 4479 | !BYTE %00011111 4480 | !BYTE %00001111 4481 | !BYTE %00000111 4482 | !BYTE %00000011 4483 | !BYTE %00000011 4484 | !BYTE %00000011 4485 | !BYTE %00000001 4486 | PLAYER_RIGHT_1D: 4487 | !BYTE %10010111 4488 | !BYTE %10010001 4489 | !BYTE %00100101 4490 | !BYTE %11000110 4491 | !BYTE %10000101 4492 | !BYTE %10000000 4493 | !BYTE %11000000 4494 | !BYTE %11110001 4495 | PLAYER_RIGHT_1E: 4496 | !BYTE %00000000 4497 | !BYTE %10000000 4498 | !BYTE %11000000 4499 | !BYTE %00000000 4500 | !BYTE %00000000 4501 | !BYTE %10000000 4502 | !BYTE %11000000 4503 | !BYTE %11110000 4504 | PLAYER_RIGHT_1F: 4505 | !BYTE %11111011 4506 | !BYTE %11101111 4507 | !BYTE %01110011 4508 | !BYTE %00111000 4509 | !BYTE %00011100 4510 | !BYTE %00001110 4511 | !BYTE %00000000 4512 | !BYTE %00000000 4513 | PLAYER_RIGHT_1G: 4514 | !BYTE %01110000 4515 | !BYTE %10000000 4516 | !BYTE %11000000 4517 | !BYTE %11100000 4518 | !BYTE %01111000 4519 | !BYTE %00111000 4520 | !BYTE %00000000 4521 | !BYTE %00000000 4522 | 4523 | PLAYER_RIGHT_2A: ;facing RIGHT step 2 4524 | !BYTE %00000000 4525 | !BYTE %00000000 4526 | !BYTE %00000000 4527 | !BYTE %00000000 4528 | !BYTE %00000111 4529 | !BYTE %00001111 4530 | !BYTE %00011111 4531 | !BYTE %00011111 4532 | PLAYER_RIGHT_2B: 4533 | !BYTE %00000000 4534 | !BYTE %00000000 4535 | !BYTE %00000000 4536 | !BYTE %00000000 4537 | !BYTE %10000000 4538 | !BYTE %11000000 4539 | !BYTE %10100000 4540 | !BYTE %10010000 4541 | PLAYER_RIGHT_2C: 4542 | !BYTE %00011111 4543 | !BYTE %00011111 4544 | !BYTE %00001111 4545 | !BYTE %00000111 4546 | !BYTE %00000011 4547 | !BYTE %00000001 4548 | !BYTE %00000000 4549 | !BYTE %00000000 4550 | PLAYER_RIGHT_2D: 4551 | !BYTE %10010000 4552 | !BYTE %10010100 4553 | !BYTE %00100110 4554 | !BYTE %11000001 4555 | !BYTE %11000000 4556 | !BYTE %11100000 4557 | !BYTE %11111001 4558 | !BYTE %01111111 4559 | PLAYER_RIGHT_2E: 4560 | !BYTE %00000000 4561 | !BYTE %00000000 4562 | !BYTE %00000000 4563 | !BYTE %00000000 4564 | !BYTE %11000000 4565 | !BYTE %11110000 4566 | !BYTE %11111100 4567 | !BYTE %00011100 4568 | PLAYER_RIGHT_2F: 4569 | !BYTE %00111111 4570 | !BYTE %00001111 4571 | !BYTE %00000011 4572 | !BYTE %00000001 4573 | !BYTE %00000001 4574 | !BYTE %00000000 4575 | !BYTE %00000000 4576 | !BYTE %00000000 4577 | PLAYER_RIGHT_2G: 4578 | !BYTE %00000000 4579 | !BYTE %00000000 4580 | !BYTE %10000000 4581 | !BYTE %11000000 4582 | !BYTE %11000000 4583 | !BYTE %00000000 4584 | !BYTE %00000000 4585 | !BYTE %00000000 4586 | 4587 | ;*****Documentation for Alex Semenov's PEST sound system******* 4588 | ;+$00 pest_init: 4589 | ; Initialize sound system. Call it once when program starts. 4590 | ; Clears all variables, init hardware, set up timer IRQ (if required) 4591 | ; in: none 4592 | ; out: none 4593 | ; 4594 | ;+$03 pest_done 4595 | ; De-initialize sound system. It may be needed before disk operations, so I kept it here just in case. 4596 | ; Stop sound, restore timer IRQ (if required) 4597 | ; in: none 4598 | ; out: none 4599 | ; 4600 | ;+$06 pest_update 4601 | ; Update sound system state and produce sounds 4602 | ; Should be called 50 or 60 times per second, normally from frame interrupt 4603 | ; in: none 4604 | ; out: none 4605 | ; 4606 | ;+$09 pest_music_load 4607 | ; Load music data, initialize music player vars 4608 | ; in: X:A pointer to music data, can be located anywhere (music data is relocatable) 4609 | ; out: none 4610 | ; 4611 | ;+$0c pest_music_play 4612 | ; Start playing music from beginning 4613 | ; in: none 4614 | ; out: none 4615 | ; 4616 | ;+$0f pest_music_stop 4617 | ; Stop playing music 4618 | ; in: none 4619 | ; out: none 4620 | ; 4621 | ;+$12 pest_music_pause 4622 | ; Pause and resume music 4623 | ; in: A=0 unpause, !0 pause 4624 | ; out: none 4625 | ; 4626 | ;+$15 pest_sound_play 4627 | ; Request sound effect to be played 4628 | ; in: A sound effect number, 0..63 4629 | ; out: none 4630 | ; 4631 | ;+$18 pest_stop_all 4632 | ; Stop all sounds, including music and sound effect 4633 | ; in: none 4634 | ; out: none 4635 | ; 4636 | ;+$1b pest_detect_rate 4637 | ; Detect framerate (50/60Hz). Actual detection happens during pest_init, this is just a readback. 4638 | ; Used internally for music tempo compensation, can be used externally too 4639 | ; in: none 4640 | ; out: A=0 for 60Hz, !0 for 50Hz 4641 | --------------------------------------------------------------------------------