├── level-a ├── level-b ├── level-c ├── level-d ├── level-e ├── level-f ├── level-g ├── level-h ├── level-i ├── level-j ├── level-k ├── level-l ├── level-m ├── level-n ├── tileset.pet ├── BACKGROUND_TASKS.ASM └── PETROBOTS12.ASM /level-a: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zeropolis79/PETSCIIRobots-Pet/HEAD/level-a -------------------------------------------------------------------------------- /level-b: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zeropolis79/PETSCIIRobots-Pet/HEAD/level-b -------------------------------------------------------------------------------- /level-c: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zeropolis79/PETSCIIRobots-Pet/HEAD/level-c -------------------------------------------------------------------------------- /level-d: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zeropolis79/PETSCIIRobots-Pet/HEAD/level-d -------------------------------------------------------------------------------- /level-e: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zeropolis79/PETSCIIRobots-Pet/HEAD/level-e -------------------------------------------------------------------------------- /level-f: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zeropolis79/PETSCIIRobots-Pet/HEAD/level-f -------------------------------------------------------------------------------- /level-g: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zeropolis79/PETSCIIRobots-Pet/HEAD/level-g -------------------------------------------------------------------------------- /level-h: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zeropolis79/PETSCIIRobots-Pet/HEAD/level-h -------------------------------------------------------------------------------- /level-i: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zeropolis79/PETSCIIRobots-Pet/HEAD/level-i -------------------------------------------------------------------------------- /level-j: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zeropolis79/PETSCIIRobots-Pet/HEAD/level-j -------------------------------------------------------------------------------- /level-k: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zeropolis79/PETSCIIRobots-Pet/HEAD/level-k -------------------------------------------------------------------------------- /level-l: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zeropolis79/PETSCIIRobots-Pet/HEAD/level-l -------------------------------------------------------------------------------- /level-m: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zeropolis79/PETSCIIRobots-Pet/HEAD/level-m -------------------------------------------------------------------------------- /level-n: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zeropolis79/PETSCIIRobots-Pet/HEAD/level-n -------------------------------------------------------------------------------- /tileset.pet: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zeropolis79/PETSCIIRobots-Pet/HEAD/tileset.pet -------------------------------------------------------------------------------- /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 | RTS 1518 | TE02: LDA #11 ;Small explosion AI type 1519 | STA UNIT_TYPE,X 1520 | LDA #248 ;first tile for explosion 1521 | STA UNIT_TILE,X 1522 | LDA #1 1523 | STA UNIT_TIMER_A,X 1524 | LDA UNIT_LOC_X 1525 | STA UNIT_LOC_X,X 1526 | LDA UNIT_LOC_Y 1527 | STA UNIT_LOC_Y,X 1528 | RTS 1529 | 1530 | EVILBOT: 1531 | LDX UNIT 1532 | LDA #5 1533 | STA UNIT_TIMER_A,X 1534 | ;first animate evilbot 1535 | LDA UNIT_TILE,X 1536 | CMP #100 1537 | BNE EVIL1 1538 | INC UNIT_TILE,X 1539 | JMP EVIL10 1540 | EVIL1: CMP #101 1541 | BNE EVIL2 1542 | INC UNIT_TILE,X 1543 | JMP EVIL10 1544 | EVIL2: CMP #102 1545 | BNE EVIL3 1546 | INC UNIT_TILE,X 1547 | JMP EVIL10 1548 | EVIL3: LDA #100 1549 | STA UNIT_TILE,X 1550 | EVIL10: ;now figure out movement 1551 | LDA UNIT_TIMER_B,X 1552 | CMP #0 1553 | BEQ EVIL11 1554 | DEC UNIT_TIMER_B,X 1555 | JSR CHECK_FOR_WINDOW_REDRAW 1556 | JMP AILP 1557 | EVIL11: LDA #1 ;Reset timer B 1558 | STA UNIT_TIMER_B,X 1559 | LDA #%00000001 ;WALK 1560 | STA MOVE_TYPE 1561 | ;CHECK FOR HORIZONTAL MOVEMENT 1562 | LDA UNIT_LOC_X,X 1563 | CMP UNIT_LOC_X 1564 | BEQ EVIL13 1565 | BCC EVIL12 1566 | JSR REQUEST_WALK_LEFT 1567 | JMP EVIL13 1568 | EVIL12: JSR REQUEST_WALK_RIGHT 1569 | EVIL13: ;NOW CHECK FOR VERITCAL MOVEMENT 1570 | LDA UNIT_LOC_Y,X 1571 | CMP UNIT_LOC_Y 1572 | BEQ EVIL20 1573 | BCC EVIL14 1574 | JSR REQUEST_WALK_UP 1575 | JMP EVIL20 1576 | EVIL14: JSR REQUEST_WALK_DOWN 1577 | EVIL20: JSR ROBOT_ATTACK_RANGE 1578 | LDA PROX_DETECT 1579 | CMP #1 ;1=Robot next to player 0=not 1580 | BNE EVIL21 1581 | LDA #5 ;amount of damage it will inflict 1582 | STA TEMP_A 1583 | LDA #0 ;unit to inflict damage on. 1584 | STA UNIT_FIND 1585 | JSR INFLICT_DAMAGE 1586 | JSR CREATE_PLAYER_EXPLOSION 1587 | LDA #07 ;electric shock sound 1588 | JSR PLAY_SOUND ;SOUND PLAY 1589 | LDX UNIT 1590 | LDA #15 ;rate of attack on player. 1591 | STA UNIT_TIMER_A,X 1592 | EVIL21: JSR CHECK_FOR_WINDOW_REDRAW 1593 | JMP AILP 1594 | 1595 | ;This routine handles automatic sliding doors. 1596 | ;UNIT_B register means: 1597 | ;0=opening-A 1=opening-B 2=OPEN 3=closing-A 4=closing-B 5-CLOSED 1598 | AI_DOOR: 1599 | LDX UNIT 1600 | LDA UNIT_B,X 1601 | CMP #06 ;make sure number is in bounds 1602 | BCS DOORA 1603 | TAY 1604 | LDA AIDB_L,Y 1605 | STA DOORJ+1 1606 | LDA AIDB_H,Y 1607 | STA DOORJ+2 1608 | DOORJ: JMP $0000 ;self modifying code 1609 | DOORA: JMP AILP ;-SHOULD NEVER NEED TO HAPPEN 1610 | AIDB_L: 1611 | !BYTE DOOR_OPEN_A 1619 | !BYTE >DOOR_OPEN_B 1620 | !BYTE >DOOR_OPEN_FULL 1621 | !BYTE >DOOR_CLOSE_A 1622 | !BYTE >DOOR_CLOSE_B 1623 | !BYTE >DOOR_CLOSE_FULL 1624 | 1625 | DOOR_OPEN_A: 1626 | LDA UNIT_A,X 1627 | CMP #1 1628 | BEQ DOA1 1629 | ;HORIZONTAL DOOR 1630 | LDA #88 1631 | STA DOORPIECE1 1632 | LDA #89 1633 | STA DOORPIECE2 1634 | LDA #86 1635 | STA DOORPIECE3 1636 | JSR DRAW_HORIZONTAL_DOOR 1637 | JMP DOA2 1638 | DOA1: ;VERTICAL DOOR 1639 | LDA #70 1640 | STA DOORPIECE1 1641 | LDA #74 1642 | STA DOORPIECE2 1643 | LDA #78 1644 | STA DOORPIECE3 1645 | JSR DRAW_VERTICAL_DOOR 1646 | DOA2: LDY UNIT 1647 | LDA #1 1648 | STA UNIT_B,X 1649 | LDA #5 1650 | STA UNIT_TIMER_A,X 1651 | JSR CHECK_FOR_WINDOW_REDRAW 1652 | JMP AILP 1653 | 1654 | DOOR_OPEN_B: 1655 | LDA UNIT_A,X 1656 | CMP #1 1657 | BEQ DOB1 1658 | ;HORIZONTAL DOOR 1659 | LDA #17 1660 | STA DOORPIECE1 1661 | LDA #09 1662 | STA DOORPIECE2 1663 | LDA #91 1664 | STA DOORPIECE3 1665 | JSR DRAW_HORIZONTAL_DOOR 1666 | JMP DOB2 1667 | DOB1: ;VERTICAL DOOR 1668 | LDA #27 1669 | STA DOORPIECE1 1670 | LDA #09 1671 | STA DOORPIECE2 1672 | LDA #15 1673 | STA DOORPIECE3 1674 | JSR DRAW_VERTICAL_DOOR 1675 | DOB2: LDX UNIT 1676 | LDA #2 1677 | STA UNIT_B,X 1678 | LDA #30 1679 | STA UNIT_TIMER_A,X 1680 | JSR CHECK_FOR_WINDOW_REDRAW 1681 | JMP AILP 1682 | DOOR_OPEN_FULL: 1683 | LDX UNIT 1684 | JSR DOOR_CHECK_PROXIMITY 1685 | LDA PROX_DETECT 1686 | CMP #1 1687 | BNE DOF1 1688 | LDA #30 1689 | STA UNIT_TIMER_B,X ;RESET TIMER 1690 | JMP AILP 1691 | DOF1: ;if nobody near door, lets close it. 1692 | ;check for object in the way first. 1693 | LDA UNIT_LOC_X,X 1694 | STA MAP_X 1695 | LDA UNIT_LOC_Y,X 1696 | STA MAP_Y 1697 | JSR GET_TILE_FROM_MAP 1698 | LDA TILE 1699 | CMP #09 ;FLOOR-TILE 1700 | BEQ DOFB 1701 | ;SOMETHING IN THE WAY, ABORT 1702 | LDA #35 1703 | STA UNIT_TIMER_A,X 1704 | JMP AILP 1705 | DOFB: LDA #14 ;DOOR-SOUND 1706 | JSR PLAY_SOUND ;SOUND PLAY 1707 | LDX UNIT 1708 | LDA UNIT_A,X 1709 | CMP #1 1710 | BEQ DOF2 1711 | ;HORIZONTAL_DOOR 1712 | LDA #88 1713 | STA DOORPIECE1 1714 | LDA #89 1715 | STA DOORPIECE2 1716 | LDA #86 1717 | STA DOORPIECE3 1718 | JSR DRAW_HORIZONTAL_DOOR 1719 | JMP DOF3 1720 | DOF2: ;VERTICAL DOOR 1721 | LDA #70 1722 | STA DOORPIECE1 1723 | LDA #74 1724 | STA DOORPIECE2 1725 | LDA #78 1726 | STA DOORPIECE3 1727 | JSR DRAW_VERTICAL_DOOR 1728 | DOF3: LDY UNIT 1729 | LDA #3 1730 | STA UNIT_B,X 1731 | LDA #5 1732 | STA UNIT_TIMER_A,X 1733 | JSR CHECK_FOR_WINDOW_REDRAW 1734 | JMP AILP 1735 | 1736 | DOOR_CLOSE_A: 1737 | LDA UNIT_A,X 1738 | CMP #1 1739 | BEQ DCA2 1740 | ;HORIZONTAL DOOR 1741 | LDA #84 1742 | STA DOORPIECE1 1743 | LDA #85 1744 | STA DOORPIECE2 1745 | LDA #86 1746 | STA DOORPIECE3 1747 | JSR DRAW_HORIZONTAL_DOOR 1748 | JMP DCA3 1749 | DCA2: ;VERTICAL DOOR 1750 | LDA #69 1751 | STA DOORPIECE1 1752 | LDA #73 1753 | STA DOORPIECE2 1754 | LDA #77 1755 | STA DOORPIECE3 1756 | JSR DRAW_VERTICAL_DOOR 1757 | DCA3: LDY UNIT 1758 | LDA #4 1759 | STA UNIT_B,X 1760 | LDA #5 1761 | STA UNIT_TIMER_A,X 1762 | JSR CHECK_FOR_WINDOW_REDRAW 1763 | JMP AILP 1764 | 1765 | DOOR_CLOSE_B: 1766 | LDA UNIT_A,X 1767 | CMP #1 1768 | BEQ DCB2 1769 | ;HORIZONTAL DOOR 1770 | LDA #80 1771 | STA DOORPIECE1 1772 | LDA #81 1773 | STA DOORPIECE2 1774 | LDA #82 1775 | STA DOORPIECE3 1776 | JSR DRAW_HORIZONTAL_DOOR 1777 | JMP DCB3 1778 | DCB2: ;VERTICAL DOOR 1779 | LDA #68 1780 | STA DOORPIECE1 1781 | LDA #72 1782 | STA DOORPIECE2 1783 | LDA #76 1784 | STA DOORPIECE3 1785 | JSR DRAW_VERTICAL_DOOR 1786 | DCB3: LDY UNIT 1787 | LDA #5 1788 | STA UNIT_B,X 1789 | LDA #5 1790 | STA UNIT_TIMER_A,X 1791 | JSR CHECK_FOR_WINDOW_REDRAW 1792 | JMP AILP 1793 | 1794 | DOOR_CLOSE_FULL: 1795 | LDX UNIT 1796 | JSR DOOR_CHECK_PROXIMITY 1797 | LDA PROX_DETECT 1798 | CMP #0 1799 | BNE DCF1 1800 | DCF0: LDA #20 1801 | STA UNIT_TIMER_A,X ;RESET TIMER 1802 | JMP AILP 1803 | DCF1: ;if player near door, lets open it. 1804 | ;first check if locked 1805 | LDA UNIT_C,X ;Lock status 1806 | CMP #0 ;UNLOCKED 1807 | BEQ DCFZ 1808 | CMP #1 ;SPADE KEY 1809 | BNE DCFB 1810 | LDA KEYS 1811 | AND #%00000001 ;CHECK FOR SPADE KEY 1812 | CMP #%00000001 1813 | BEQ DCFZ 1814 | JMP DCF0 1815 | DCFB: CMP #2 ;HEART KEY 1816 | BNE DCFC 1817 | LDA KEYS 1818 | AND #%00000010 ;CHECK FOR HEART KEY 1819 | CMP #%00000010 1820 | BEQ DCFZ 1821 | JMP DCF0 1822 | DCFC: CMP #3 ;STAR KEY 1823 | BNE DCF0 ;SHOULD NEVER HAPPEN 1824 | LDA KEYS 1825 | AND #%00000100 ;CHECK FOR STAR KEY 1826 | CMP #%00000100 1827 | BEQ DCFZ 1828 | JMP DCF0 1829 | DCFZ: ;Start open door process 1830 | LDA #14 ;DOOR-SOUND 1831 | JSR PLAY_SOUND ;SOUND PLAY 1832 | LDX UNIT 1833 | LDA UNIT_A,X 1834 | CMP #1 1835 | BEQ DCF2 1836 | ;HORIZONTAL DOOR 1837 | LDA #84 1838 | STA DOORPIECE1 1839 | LDA #85 1840 | STA DOORPIECE2 1841 | LDA #86 1842 | STA DOORPIECE3 1843 | JSR DRAW_HORIZONTAL_DOOR 1844 | JMP DCF3 1845 | ;VERTICAL DOOR 1846 | DCF2: LDA #69 1847 | STA DOORPIECE1 1848 | LDA #73 1849 | STA DOORPIECE2 1850 | LDA #77 1851 | STA DOORPIECE3 1852 | JSR DRAW_VERTICAL_DOOR 1853 | DCF3: LDY UNIT 1854 | LDA #0 1855 | STA UNIT_B,X 1856 | LDA #5 1857 | STA UNIT_TIMER_A,X 1858 | JSR CHECK_FOR_WINDOW_REDRAW 1859 | JMP AILP 1860 | 1861 | DRAW_VERTICAL_DOOR: 1862 | LDA UNIT_LOC_Y,X 1863 | STA MAP_Y 1864 | DEC MAP_Y 1865 | LDA UNIT_LOC_X,X 1866 | STA MAP_X 1867 | LDA DOORPIECE1 1868 | STA TILE 1869 | JSR PLOT_TILE_TO_MAP 1870 | LDA $FD 1871 | CLC 1872 | ADC #128 1873 | STA $FD 1874 | LDA $FE 1875 | ADC #$00 1876 | STA $FE 1877 | LDA DOORPIECE2 1878 | STA ($FD),Y 1879 | LDA $FD 1880 | CLC 1881 | ADC #128 1882 | STA $FD 1883 | LDA $FE 1884 | ADC #$00 1885 | STA $FE 1886 | LDA DOORPIECE3 1887 | STA ($FD),Y 1888 | RTS 1889 | 1890 | DRAW_HORIZONTAL_DOOR: 1891 | LDA UNIT_LOC_X,X 1892 | STA MAP_X 1893 | DEC MAP_X 1894 | LDA UNIT_LOC_Y,X 1895 | STA MAP_Y 1896 | LDA DOORPIECE1 1897 | STA TILE 1898 | JSR PLOT_TILE_TO_MAP 1899 | INY 1900 | LDA DOORPIECE2 1901 | STA ($FD),Y 1902 | INY 1903 | LDA DOORPIECE3 1904 | STA ($FD),Y 1905 | RTS 1906 | DOORPIECE1 !BYTE 00 1907 | DOORPIECE2 !BYTE 00 1908 | DOORPIECE3 !BYTE 00 1909 | 1910 | ROBOT_ATTACK_RANGE: 1911 | ;First check horizontal proximity to door 1912 | LDA UNIT_LOC_X,X ;ROBOT UNIT 1913 | SEC ;always set carry before subtraction 1914 | SBC UNIT_LOC_X ;PLAYER UNIT 1915 | BCC RAR1 ;if carry cleared then its negative 1916 | JMP RAR2 1917 | RAR1: EOR #$FF ;convert two's comp back to positive 1918 | ADC #$01 ;no need for CLC here, already cleared 1919 | RAR2: CMP #1 ;1 HORIZONTAL TILE FROM PLAYER 1920 | BCC RAR3 1921 | LDA #0 ;player not detected 1922 | STA PROX_DETECT 1923 | RTS 1924 | RAR3: ;Now check vertical proximity 1925 | LDA UNIT_LOC_Y,X ;DOOR UNIT 1926 | SEC ;always set carry before subtraction 1927 | SBC UNIT_LOC_Y ;PLAYER UNIT 1928 | BCC RAR4 ;if carry cleared then its negative 1929 | JMP RAR5 1930 | RAR4: EOR #$FF ;convert two's comp back to positive 1931 | ADC #$01 ;no need for CLC here, already cleared 1932 | RAR5: CMP #1 ;1 VERTICAL TILE FROM PLAYER 1933 | BCC RAR6 1934 | LDA #0 ;player not detected 1935 | STA PROX_DETECT 1936 | RTS 1937 | RAR6: ;PLAYER DETECTED, CHANGE DOOR MODE. 1938 | LDA #1 1939 | STA PROX_DETECT 1940 | RTS 1941 | 1942 | DOOR_CHECK_PROXIMITY: 1943 | ;First check horizontal proximity to door 1944 | LDA UNIT_LOC_X,X ;DOOR UNIT 1945 | SEC ;always set carry before subtraction 1946 | SBC UNIT_LOC_X ;PLAYER UNIT 1947 | BCC PRD1 ;if carry cleared then its negative 1948 | JMP PRD2 1949 | PRD1: EOR #$FF ;convert two's comp back to positive 1950 | ADC #$01 ;no need for CLC here, already cleared 1951 | PRD2: CMP #2 ;2 HORIZONTAL TILES FROM PLAYER 1952 | BCC PRD3 1953 | LDA #0 ;player not detected 1954 | STA PROX_DETECT 1955 | RTS 1956 | PRD3: ;Now check vertical proximity 1957 | LDA UNIT_LOC_Y,X ;DOOR UNIT 1958 | SEC ;always set carry before subtraction 1959 | SBC UNIT_LOC_Y ;PLAYER UNIT 1960 | BCC PRD4 ;if carry cleared then its negative 1961 | JMP PRD5 1962 | PRD4: EOR #$FF ;convert two's comp back to positive 1963 | ADC #$01 ;no need for CLC here, already cleared 1964 | PRD5: CMP #2 ;2 VERTICAL TILES FROM PLAYER 1965 | BCC PRD6 1966 | LDA #0 ;player not detected 1967 | STA PROX_DETECT 1968 | RTS 1969 | PRD6: ;PLAYER DETECTED, CHANGE DOOR MODE. 1970 | LDA #1 1971 | STA PROX_DETECT 1972 | RTS 1973 | PROX_DETECT !BYTE 00 ;0=NO 1=YES 1974 | 1975 | ;This routine handles automatic sliding doors. 1976 | ;UNIT_B register means: 1977 | ;0=opening-A 1=opening-B 2=OPEN 3=closing-A 4=closing-B 5-CLOSED 1978 | ELEVATOR: 1979 | LDX UNIT 1980 | LDA UNIT_B,X 1981 | CMP #06 ;make sure number is in bounds 1982 | BCS ELEVA 1983 | TAY 1984 | LDA ELDB_L,Y 1985 | STA ELEVJ+1 1986 | LDA ELDB_H,Y 1987 | STA ELEVJ+2 1988 | ELEVJ: JMP $0000 ;self modifying code 1989 | ELEVA: JMP AILP ;-SHOULD NEVER NEED TO HAPPEN 1990 | ELDB_L: 1991 | !BYTE ELEV_OPEN_A 1999 | !BYTE >ELEV_OPEN_B 2000 | !BYTE >ELEV_OPEN_FULL 2001 | !BYTE >ELEV_CLOSE_A 2002 | !BYTE >ELEV_CLOSE_B 2003 | !BYTE >ELEV_CLOSE_FULL 2004 | 2005 | ELEV_OPEN_A: 2006 | LDA #181 2007 | STA DOORPIECE1 2008 | LDA #89 2009 | STA DOORPIECE2 2010 | LDA #173 2011 | STA DOORPIECE3 2012 | JSR DRAW_HORIZONTAL_DOOR 2013 | LDY UNIT 2014 | LDA #1 2015 | STA UNIT_B,X 2016 | LDA #5 2017 | STA UNIT_TIMER_A,X 2018 | JSR CHECK_FOR_WINDOW_REDRAW 2019 | JMP AILP 2020 | 2021 | ELEV_OPEN_B: 2022 | LDA #182 2023 | STA DOORPIECE1 2024 | LDA #09 2025 | STA DOORPIECE2 2026 | LDA #172 2027 | STA DOORPIECE3 2028 | JSR DRAW_HORIZONTAL_DOOR 2029 | LDX UNIT 2030 | LDA #2 2031 | STA UNIT_B,X 2032 | LDA #50 2033 | STA UNIT_TIMER_A,X 2034 | JSR CHECK_FOR_WINDOW_REDRAW 2035 | JMP AILP 2036 | 2037 | ELEV_OPEN_FULL: 2038 | LDX UNIT 2039 | EVOF1: ;CLOSE DOOR 2040 | ;check for object in the way first. 2041 | LDA UNIT_LOC_X,X 2042 | STA MAP_X 2043 | LDA UNIT_LOC_Y,X 2044 | STA MAP_Y 2045 | JSR GET_TILE_FROM_MAP 2046 | LDA TILE 2047 | CMP #09 ;FLOOR-TILE 2048 | BEQ EVOF3 2049 | ;SOMETHING IN THE WAY, ABORT 2050 | EVOF2: LDA #35 2051 | STA UNIT_TIMER_A,X 2052 | JMP AILP 2053 | EVOF3: ;check for player or robot in the way 2054 | JSR CHECK_FOR_UNIT 2055 | LDX UNIT 2056 | LDA UNIT_FIND 2057 | CMP #255 2058 | BNE EVOF2 2059 | EVOFB: ;START TO CLOSE ELEVATOR DOOR 2060 | LDA #14 ;DOOR SOUND 2061 | JSR PLAY_SOUND ;SOUND PLAY 2062 | LDX UNIT 2063 | LDA #181 2064 | STA DOORPIECE1 2065 | LDA #89 2066 | STA DOORPIECE2 2067 | LDA #173 2068 | STA DOORPIECE3 2069 | JSR DRAW_HORIZONTAL_DOOR 2070 | LDX UNIT 2071 | LDA #3 2072 | STA UNIT_B,X 2073 | LDA #5 2074 | STA UNIT_TIMER_A,X 2075 | JSR CHECK_FOR_WINDOW_REDRAW 2076 | JMP AILP 2077 | 2078 | ELEV_CLOSE_A: 2079 | LDA #84 2080 | STA DOORPIECE1 2081 | LDA #85 2082 | STA DOORPIECE2 2083 | LDA #173 2084 | STA DOORPIECE3 2085 | JSR DRAW_HORIZONTAL_DOOR 2086 | LDY UNIT 2087 | LDA #4 2088 | STA UNIT_B,X 2089 | LDA #5 2090 | STA UNIT_TIMER_A,X 2091 | JSR CHECK_FOR_WINDOW_REDRAW 2092 | JMP AILP 2093 | 2094 | ELEV_CLOSE_B: 2095 | LDA #80 2096 | STA DOORPIECE1 2097 | LDA #81 2098 | STA DOORPIECE2 2099 | LDA #174 2100 | STA DOORPIECE3 2101 | JSR DRAW_HORIZONTAL_DOOR 2102 | LDY UNIT 2103 | LDA #5 2104 | STA UNIT_B,X 2105 | LDA #5 2106 | STA UNIT_TIMER_A,X 2107 | JSR CHECK_FOR_WINDOW_REDRAW 2108 | JSR ELEVATOR_PANEL 2109 | JMP AILP 2110 | 2111 | ELEV_CLOSE_FULL: 2112 | LDX UNIT 2113 | JSR DOOR_CHECK_PROXIMITY 2114 | LDA PROX_DETECT 2115 | CMP #0 2116 | BNE EVF1 2117 | LDA #20 2118 | STA UNIT_TIMER_A,X ;RESET TIMER 2119 | JMP AILP 2120 | EVF1: ;Start open door process 2121 | LDA #14 ;DOOR SOUND 2122 | JSR PLAY_SOUND ;SOUND PLAY 2123 | LDX UNIT 2124 | LDA #84 2125 | STA DOORPIECE1 2126 | LDA #85 2127 | STA DOORPIECE2 2128 | LDA #173 2129 | STA DOORPIECE3 2130 | JSR DRAW_HORIZONTAL_DOOR 2131 | LDY UNIT 2132 | LDA #0 2133 | STA UNIT_B,X 2134 | LDA #5 2135 | STA UNIT_TIMER_A,X 2136 | JSR CHECK_FOR_WINDOW_REDRAW 2137 | JMP AILP 2138 | 2139 | ELEVATOR_PANEL: 2140 | ;Check to see if player is standing in the 2141 | ;elevator first. 2142 | LDX UNIT 2143 | LDA UNIT_LOC_X,X ;elevator X location 2144 | CMP UNIT_LOC_X ;player X location 2145 | BEQ ELPN1 2146 | RTS 2147 | ELPN1: LDA UNIT_LOC_Y,X ;elevator Y location 2148 | SEC 2149 | SBC #01 2150 | CMP UNIT_LOC_Y ;player Y location 2151 | BEQ ELPN2 2152 | RTS 2153 | ELPN2: ;PLAYER DETECTED, START ELEVATOR PANEL 2154 | LDA #MSG_ELEVATOR 2157 | STA $FC 2158 | JSR PRINT_INFO 2159 | LDA #MSG_LEVELS 2162 | STA $FC 2163 | JSR PRINT_INFO 2164 | JSR ELEVATOR_SELECT 2165 | RTS 2166 | 2167 | PLOT_TILE_TO_MAP: 2168 | LDY #0 2169 | LDA MAP_Y 2170 | CLC 2171 | ROR 2172 | PHP 2173 | CLC 2174 | ADC #>MAP 2175 | STA $FE ;HIGH BYTE OF MAP SOURCE 2176 | LDA #$0 2177 | PLP 2178 | ROR 2179 | ORA MAP_X 2180 | STA $FD ;LOW BYTE OF MAP SOURCE 2181 | LDA TILE 2182 | STA ($FD),Y 2183 | RTS 2184 | 2185 | ;This routine will return the tile for a specific X/Y 2186 | ;on the map. You must first define MAP_X and MAP-Y. 2187 | ;The result is stored in TILE. 2188 | GET_TILE_FROM_MAP: 2189 | LDY #0 2190 | LDA MAP_Y 2191 | CLC 2192 | ROR 2193 | PHP 2194 | CLC 2195 | ADC #>MAP 2196 | STA $FE ;HIGH BYTE OF MAP SOURCE 2197 | LDA #$0 2198 | PLP 2199 | ROR 2200 | ORA MAP_X 2201 | STA $FD ;LOW BYTE OF MAP SOURCE 2202 | LDA ($FD),Y 2203 | STA TILE 2204 | RTS 2205 | 2206 | ;In this AI routine, the droid simply goes left until it 2207 | ;hits an object, and then reverses direction and does the 2208 | ;same, bouncing back and forth. 2209 | LEFT_RIGHT_DROID: 2210 | LDX UNIT 2211 | JSR HOVERBOT_ANIMATE 2212 | LDA #10 ;reset timer to 10 2213 | STA UNIT_TIMER_A,X 2214 | LDA UNIT_A,X ;GET DIRECTION 2215 | CMP #1 ;0=LEFT 1=RIGHT 2216 | BEQ LRD01 2217 | LDA #%00000010 2218 | STA MOVE_TYPE 2219 | JSR REQUEST_WALK_LEFT 2220 | LDA MOVE_RESULT 2221 | CMP #1 2222 | BEQ LRD02 2223 | LDA #1 2224 | LDX UNIT 2225 | STA UNIT_A,X ;CHANGE DIRECTION 2226 | JSR CHECK_FOR_WINDOW_REDRAW 2227 | JMP AILP 2228 | LRD01: LDA #%00000010 2229 | STA MOVE_TYPE 2230 | JSR REQUEST_WALK_RIGHT 2231 | LDA MOVE_RESULT 2232 | CMP #1 2233 | BEQ LRD02 2234 | LDA #0 2235 | LDX UNIT 2236 | STA UNIT_A,X ;CHANGE DIRECTION 2237 | LRD02: JSR CHECK_FOR_WINDOW_REDRAW 2238 | JMP AILP 2239 | 2240 | ;In this AI routine, the droid simply goes UP until it 2241 | ;hits an object, and then reverses direction and does the 2242 | ;same, bouncing back and forth. 2243 | UP_DOWN_DROID: 2244 | LDX UNIT 2245 | JSR HOVERBOT_ANIMATE 2246 | LDA #10 ;reset timer to 10 2247 | STA UNIT_TIMER_A,X 2248 | LDA UNIT_A,X ;GET DIRECTION 2249 | CMP #1 ;0=UP 1=DOWN 2250 | BEQ UDD01 2251 | LDA #%00000010 2252 | STA MOVE_TYPE 2253 | JSR REQUEST_WALK_UP 2254 | LDA MOVE_RESULT 2255 | CMP #1 2256 | BEQ UDD02 2257 | LDA #1 2258 | LDX UNIT 2259 | STA UNIT_A,X ;CHANGE DIRECTION 2260 | JSR CHECK_FOR_WINDOW_REDRAW 2261 | JMP AILP 2262 | UDD01: LDA #%00000010 2263 | STA MOVE_TYPE 2264 | JSR REQUEST_WALK_DOWN 2265 | LDA MOVE_RESULT 2266 | CMP #1 2267 | BEQ UDD02 2268 | LDA #0 2269 | LDX UNIT 2270 | STA UNIT_A,X ;CHANGE DIRECTION 2271 | UDD02: JSR CHECK_FOR_WINDOW_REDRAW 2272 | JMP AILP 2273 | 2274 | HOVERBOT_ANIMATE: 2275 | LDA UNIT_TIMER_B,X 2276 | CMP #0 2277 | BEQ HOVAN2 2278 | DEC UNIT_TIMER_B,X 2279 | RTS 2280 | HOVAN2: LDA #3 2281 | STA UNIT_TIMER_B,X ;RESET ANIMATE TIMER 2282 | LDA UNIT_TILE,X 2283 | CMP #98 2284 | BNE HOVAN1 2285 | LDA #99 ;HOVERBOT TILE 2286 | STA UNIT_TILE,X 2287 | RTS 2288 | HOVAN1: LDA #98 ;HOVERBOT TILE 2289 | STA UNIT_TILE,X 2290 | RTS 2291 | 2292 | ;The following 4 routines are used by both the player and some 2293 | ;of the enemy units. It checks to see if you can walk in a 2294 | ;specific direction. It checks for edge of map and also that 2295 | ;the tile you want to walk onto can allow that. There is a 2296 | ;separate routine for hovering robots. 2297 | REQUEST_WALK_RIGHT: 2298 | LDY UNIT 2299 | LDA UNIT_LOC_X,Y 2300 | CMP #122 2301 | BEQ MGR01 2302 | STA MAP_X 2303 | INC MAP_X 2304 | LDA UNIT_LOC_Y,Y 2305 | STA MAP_Y 2306 | JSR GET_TILE_FROM_MAP 2307 | LDY TILE 2308 | LDA TILE_ATTRIB,Y 2309 | AND MOVE_TYPE ;Check, can walk on this tile? 2310 | CMP MOVE_TYPE 2311 | BNE MGR01 2312 | JSR CHECK_FOR_UNIT 2313 | LDA UNIT_FIND 2314 | CMP #255 2315 | BNE MGR01 2316 | LDX UNIT 2317 | INC UNIT_LOC_X,X 2318 | LDA #1 ;Move success 2319 | STA MOVE_RESULT 2320 | RTS 2321 | MGR01: LDA #0 ;Move fail 2322 | STA MOVE_RESULT 2323 | RTS 2324 | 2325 | REQUEST_WALK_LEFT: 2326 | LDY UNIT 2327 | LDA UNIT_LOC_X,Y 2328 | CMP #5 2329 | BEQ MGL01 2330 | STA MAP_X 2331 | DEC MAP_X 2332 | LDA UNIT_LOC_Y,Y 2333 | STA MAP_Y 2334 | JSR GET_TILE_FROM_MAP 2335 | LDY TILE 2336 | LDA TILE_ATTRIB,Y 2337 | AND MOVE_TYPE ;Check, can walk on this tile? 2338 | CMP MOVE_TYPE 2339 | BNE MGL01 2340 | JSR CHECK_FOR_UNIT 2341 | LDA UNIT_FIND 2342 | CMP #255 2343 | BNE MGL01 2344 | LDX UNIT 2345 | DEC UNIT_LOC_X,X 2346 | LDA #1 ;Move success 2347 | STA MOVE_RESULT 2348 | RTS 2349 | MGL01: LDA #0 ;Move fail 2350 | STA MOVE_RESULT 2351 | RTS 2352 | 2353 | REQUEST_WALK_DOWN: 2354 | LDY UNIT 2355 | LDA UNIT_LOC_Y,Y 2356 | CMP #60 2357 | BEQ MGD01 2358 | STA MAP_Y 2359 | INC MAP_Y 2360 | LDA UNIT_LOC_X,Y 2361 | STA MAP_X 2362 | JSR GET_TILE_FROM_MAP 2363 | LDY TILE 2364 | LDA TILE_ATTRIB,Y 2365 | AND MOVE_TYPE ;Check, can walk on this tile? 2366 | CMP MOVE_TYPE 2367 | BNE MGD01 2368 | JSR CHECK_FOR_UNIT 2369 | LDA UNIT_FIND 2370 | CMP #255 2371 | BNE MGD01 2372 | LDX UNIT 2373 | INC UNIT_LOC_Y,X 2374 | LDA #1 ;Move success 2375 | STA MOVE_RESULT 2376 | RTS 2377 | MGD01: LDA #0 ;Move fail 2378 | STA MOVE_RESULT 2379 | RTS 2380 | 2381 | REQUEST_WALK_UP: 2382 | LDY UNIT 2383 | LDA UNIT_LOC_Y,Y 2384 | CMP #3 2385 | BEQ MGU01 2386 | STA MAP_Y 2387 | DEC MAP_Y 2388 | LDA UNIT_LOC_X,Y 2389 | STA MAP_X 2390 | JSR GET_TILE_FROM_MAP 2391 | LDY TILE 2392 | LDA TILE_ATTRIB,Y 2393 | AND MOVE_TYPE ;Check, can walk on this tile? 2394 | CMP MOVE_TYPE 2395 | BNE MGU01 2396 | JSR CHECK_FOR_UNIT 2397 | LDA UNIT_FIND 2398 | CMP #255 2399 | BNE MGU01 2400 | LDX UNIT 2401 | DEC UNIT_LOC_Y,X 2402 | LDA #1 ;Move success 2403 | STA MOVE_RESULT 2404 | RTS 2405 | MGU01: LDA #0 ;Move fail 2406 | STA MOVE_RESULT 2407 | RTS 2408 | 2409 | ;This routine checks a specific place on the map specified 2410 | ;in MAP_X and MAP_Y to see if there is a unit present at 2411 | ;that spot. If so, the unit# will be stored in UNIT_FIND 2412 | ;otherwise 255 will be stored. 2413 | CHECK_FOR_UNIT: 2414 | LDX #0 2415 | CFU00: LDA UNIT_TYPE,X 2416 | CMP #0 2417 | BNE CFU02 2418 | CFU01: INX 2419 | CPX #28 2420 | BNE CFU00 2421 | LDA #255 2422 | STA UNIT_FIND ;no units found 2423 | RTS 2424 | CFU02: LDA UNIT_LOC_X,X 2425 | CMP MAP_X 2426 | BNE CFU01 2427 | LDA UNIT_LOC_Y,X 2428 | CMP MAP_Y 2429 | BNE CFU01 2430 | STX UNIT_FIND ;unit found 2431 | RTS 2432 | 2433 | ;This routine checks a specific place on the map specified 2434 | ;in MAP_X and MAP_Y to see if there is a hidden unit present 2435 | ;at that spot. If so, the unit# will be stored in UNIT_FIND 2436 | ;otherwise 255 will be stored. 2437 | CHECK_FOR_HIDDEN_UNIT: 2438 | LDX #48 2439 | CFH00: LDA UNIT_TYPE,X 2440 | CMP #0 2441 | BNE CFH02 2442 | CFH01: INX 2443 | CPX #64 2444 | BNE CFH00 2445 | LDA #255 2446 | STA UNIT_FIND ;no units found 2447 | RTS 2448 | CFH02: ;first compare horizontal position 2449 | LDA UNIT_LOC_X,X 2450 | CMP MAP_X 2451 | BEQ CFH05 2452 | BCC CFH03 2453 | JMP CFH01 2454 | CFH03: CLC 2455 | ADC UNIT_C,X ;add hidden unit width 2456 | CMP MAP_X 2457 | BCC CFH01 2458 | CFH05: ;now compare vertical position 2459 | LDA UNIT_LOC_Y,X 2460 | CMP MAP_Y 2461 | BEQ CFH10 2462 | BCC CFH06 2463 | JMP CFH01 2464 | CFH06: CLC 2465 | ADC UNIT_D,X ;add hidden unit HEIGHT 2466 | CMP MAP_Y 2467 | BCC CFH01 2468 | CFH10: STX UNIT_FIND ;unit found 2469 | RTS 2470 | 2471 | ;NOTES ABOUT UNIT TYPES 2472 | ;---------------------- 2473 | ;000=no unit (does not exist) 2474 | ;001=player unit 2475 | ;002=hoverbot left-to-right 2476 | ;003=hoverbot up-down 2477 | ;004=hoverbot attack mode 2478 | ;005=hoverbot chase player 2479 | ;006= 2480 | ;007=transporter 2481 | ;008= 2482 | ;009=evilbot chase player 2483 | ;010=door 2484 | ;011=small explosion 2485 | ;012=pistol fire up 2486 | ;013=pistol fire down 2487 | ;014=pistol fire left 2488 | ;015=pistol fire right 2489 | ;016=trash compactor 2490 | ;017= 2491 | ;018= 2492 | ;019= 2493 | ;020= 2494 | 2495 | ;NOTES ABOUT UNIT NUMBERING SCHEME 2496 | ;--------------------------------- 2497 | ;0 = player unit 2498 | ;1-27 = enemy robots (max 28 units) 2499 | ;28-31 = weapons fire 2500 | ;32-47 = doors and other units that don't have sprites (max 16 units) 2501 | ;48-63 = hidden objects to be found (max 16 units) 2502 | 2503 | ;NOTES ABOUT DOORS. 2504 | ;------------------- 2505 | ;A-0=horitzonal 1=vertical 2506 | ;B-0=opening-A 1=opening-B 2=OPEN / 3=closing-A 4=closing-B 5-CLOSED 2507 | ;C-0=unlocked / 1=locked spade 2=locked heart 3=locked star 2508 | ;D-0=automatic / 0=manual 2509 | 2510 | ;HIDDEN OBJECTS 2511 | ;-------------- 2512 | ;UNIT_TYPE:128=key UNIT_A: 0=SPADE 1=HEART 2=STAR 2513 | ;UNIT_TYPE:129=time bomb 2514 | ;UNIT_TYPE:130=EMP 2515 | ;UNIT_TYPE:131=pistol 2516 | ;UNIT_TYPE:132=charged plasma gun 2517 | ;UNIT_TYPE:133=medkit 2518 | ;UNIT_TYPE:134=magnet 2519 | 2520 | ;NOTES ABOUT TRANSPORTER 2521 | ;---------------------- 2522 | ;UNIT_A: 0=always active 1=only active when all robots are dead 2523 | ;UNIT_B: 0=completes level 1=send to coordinates 2524 | ;UNIT_C: X-coordinate 2525 | ;UNIT_D: Y-coordinate 2526 | 2527 | ;Sound Effects 2528 | ;---------------------- 2529 | ;0 explosion 2530 | ;1 small explosion 2531 | ;2 medkit 2532 | ;3 emp 2533 | ;4 haywire 2534 | ;5 evilbot 2535 | ;6 move 2536 | ;7 electric shock 2537 | ;8 plasma gun 2538 | ;9 fire pistol 2539 | ;10 item found 2540 | ;11 error 2541 | ;12 change weapons 2542 | ;13 change items 2543 | ;14 door 2544 | ;15 menu beep 2545 | ;16 walk 2546 | ;17 sfx (short beep) 2547 | ;18 sfx 2548 | -------------------------------------------------------------------------------- /PETROBOTS12.ASM: -------------------------------------------------------------------------------- 1 | ;PETSCII Robots (PET 4032 version) 2 | ;by David Murray 2020 (last update 7-15-2022) 3 | ;dfwgreencars@gmail.com 4 | 5 | !to "petrobots",cbm 6 | 7 | *=$0401 ;START ADDRESS IS $0401 8 | DESTRUCT_PATH =$5000 ;Destruct path array (256 bytes) 9 | TILE_ATTRIB =$5100 ;Tile attrib array (256 bytes) 10 | TILE_DATA_TL =$5200 ;Tile character top-left (256 bytes) 11 | TILE_DATA_TM =$5300 ;Tile character top-middle (256 bytes) 12 | TILE_DATA_TR =$5400 ;Tile character top-right (256 bytes) 13 | TILE_DATA_ML =$5500 ;Tile character middle-left (256 bytes) 14 | TILE_DATA_MM =$5600 ;Tile character middle-middle (256 bytes) 15 | TILE_DATA_MR =$5700 ;Tile character middle-right (256 bytes) 16 | TILE_DATA_BL =$5800 ;Tile character bottom-left (256 bytes) 17 | TILE_DATA_BM =$5900 ;Tile character bottom-middle (256 bytes) 18 | TILE_DATA_BR =$5A00 ;Tile character bottom-right (256 bytes) 19 | 20 | ;***These arrays can go anywhere in RAM*** 21 | UNIT_TIMER_A =$5B00 ;Primary timer for units (64 bytes) 22 | UNIT_TIMER_B =$5B40 ;Secondary timer for units (64 bytes) 23 | UNIT_TILE =$5B80 ;Current tile assigned to unit (32 bytes) 24 | ;UNIT_ALT_MOVE =$5BA0 ;For moving around objects (32 bytes) 25 | ;UNIT_DEST_X =$5BC0 ;Destination X coordinate (32 bytes) 26 | ;UNIT_DEST_Y =$5BE0 ;Destination X coordinate (32 bytes) 27 | EXP_BUFFER =$5C00 ;Explosion Buffer (16 bytes) 28 | MAP_PRECALC =$5C10 ;Stores pre-calculated objects for map window (77 bytes) 29 | 30 | ;The following addresses are used to store the current 31 | ;state of the SNES buttons. 32 | SNES_B =$5C5D 33 | SNES_Y =$5C5E 34 | SNES_SELECT =$5C5F 35 | SNES_START =$5C60 36 | SNES_UP =$5C61 37 | SNES_DOWN =$5C62 38 | SNES_LEFT =$5C63 39 | SNES_RIGHT =$5C64 40 | SNES_A =$5C65 41 | SNES_X =$5C66 42 | SNES_BACK_L =$5C67 43 | SNES_BACK_R =$5C68 44 | ;The following addresses are used to store the last 45 | ;state of the SNES buttons so that we can determine 46 | ;if a button was released. 47 | LAST_B =$5C69 48 | LAST_Y =$5C6A 49 | LAST_SELECT =$5C6B 50 | LAST_START =$5C6C 51 | LAST_UP =$5C6D 52 | LAST_DOWN =$5C6E 53 | LAST_LEFT =$5C6F 54 | LAST_RIGHT =$5C70 55 | LAST_A =$5C71 56 | LAST_X =$5C72 57 | LAST_BACK_L =$5C73 58 | LAST_BACK_R =$5C74 59 | 60 | ;The following addresses are used to store new 61 | ;presses of the SNES buttons. Once they are set 62 | ;as a 1, it requires the game to reset them to 63 | ;0 when it is ready to be read again. 64 | NEW_B =$5C75 65 | NEW_Y =$5C76 66 | NEW_SELECT =$5C77 67 | NEW_START =$5C78 68 | NEW_UP =$5C79 69 | NEW_DOWN =$5C7A 70 | NEW_LEFT =$5C7B 71 | NEW_RIGHT =$5C7C 72 | NEW_A =$5C7D 73 | NEW_X =$5C7E 74 | NEW_BACK_L =$5C7F 75 | NEW_BACK_R =$5C80 76 | 77 | ;The following are the locations where the current 78 | ;key controls are stored. These must be set before 79 | ;the game can start. 80 | KEY_MOVE_UP =$5C81 81 | KEY_MOVE_DOWN =$5C82 82 | KEY_MOVE_LEFT =$5C83 83 | KEY_MOVE_RIGHT =$5C84 84 | KEY_FIRE_UP =$5C85 85 | KEY_FIRE_DOWN =$5C86 86 | KEY_FIRE_LEFT =$5C87 87 | KEY_FIRE_RIGHT =$5C88 88 | KEY_CYCLE_WEAPONS =$5C89 89 | KEY_CYCLE_ITEMS =$5C8A 90 | KEY_USE =$5C8B 91 | KEY_SEARCH =$5C8C 92 | KEY_MOVE =$5C8D 93 | 94 | ;***MAP FILES CONSIST OF EVERYTHING FROM THIS POINT ON*** 95 | UNIT_TYPE =$5D00 ;Unit type 0=none (64 bytes) 96 | UNIT_LOC_X =$5D40 ;Unit X location (64 bytes) 97 | UNIT_LOC_Y =$5D80 ;Unit X location (64 bytes) 98 | UNIT_A =$5DC0 99 | UNIT_B =$5E00 100 | UNIT_C =$5E40 101 | UNIT_D =$5E80 102 | UNIT_HEALTH =$5EC0 ;Unit health (0 to 11) (64 bytes) 103 | MAP =$6000 ;Location of MAP (8K) 104 | ;***END OF MAP FILE*** 105 | 106 | ;*** Zero Page locations used *** 107 | TILE =$23 ;The tile number to be plotted 108 | TEMP_X =$24 ;Temporarily used for loops 109 | TEMP_Y =$25 ;Temporarily used for loops 110 | MAP_X =$26 ;Current X location on map 111 | MAP_Y =$27 ;Current Y location on map 112 | MAP_WINDOW_X =$28 ;Top left location of what is displayed in map window 113 | MAP_WINDOW_Y =$29 ;Top left location of what is displayed in map window 114 | DECNUM =$2A ;a decimal number to be displayed onscreen as 3 digits. 115 | ATTRIB =$2B ;Tile attribute value 116 | UNIT =$2C ;Current unit being processed 117 | TEMP_A =$2D ;used within some routines 118 | TEMP_B =$2E ;used within some routines 119 | TEMP_C =$2F ;used within some routines 120 | TEMP_D =$30 ;used within some routines 121 | CURSOR_X =$31 ;For on-screen cursor 122 | CURSOR_Y =$32 ;For on-screen cursor 123 | CURSOR_ON =$33 ;Is cursor active or not? 1=yes 0=no 124 | REDRAW_WINDOW =$34 ;1=yes 0=no 125 | MOVE_RESULT =$35 ;1=Move request success, 0=fail. 126 | UNIT_FIND =$36 ;255=no unit present. 127 | MOVE_TYPE =$37 ;%00000001=WALK %00000010=HOVER 128 | PRECALC_COUNT =$39 ;part of screen draw routine 129 | CUR_PATTERN_L =$3A ;stores the memory location of the current 130 | CUR_PATTERN_H =$3B ;musical pattern being played. 131 | 132 | BASIC: !BYTE $0B,$04,$01,$00,$9E,$31,$30,$33,$37,$00,$00,$00 133 | ;Adds BASIC line: 1 SYS 1037 134 | LDA #%00101000 ;Pins 3 & 5 are output 135 | STA $E843 ;Data-direction-register for userport 136 | LDA #12 137 | STA $E84C ; Turn on upper-case+graphics character set 138 | LDA #0 ;RESET SOUND TO ZERO 139 | STA $E84A ;RESET SOUND TO ZERO 140 | STA $E848 ;RESET SOUND TO ZERO 141 | LDA #16 ;turn on sound port 142 | STA $E84B ;turn on sound port 143 | JSR DETECT_ROM_VERSION 144 | ; JSR DISPLAY_WARNING 145 | JSR $FFE4 ;No idea why this is needed, but the files won't load without it. 146 | JSR DISPLAY_LOAD_MESSAGE1 147 | JSR TILE_LOAD_ROUTINE 148 | JSR $FFE4 ;No idea why this is needed, but the files won't load without it. 149 | JSR SETUP_INTERRUPT 150 | JSR SET_CONTROLS ;copy initial key controls 151 | JMP INTRO_SCREEN 152 | INIT_GAME: 153 | LDA #0 154 | STA SCREEN_SHAKE 155 | JSR RESET_KEYS_AMMO 156 | JSR DISPLAY_GAME_SCREEN 157 | JSR DISPLAY_LOAD_MESSAGE2 158 | JSR $FFE4 ;No idea why this is needed, but the files won't load without it. 159 | JSR MAP_LOAD_ROUTINE 160 | JSR SET_DIFF_LEVEL 161 | JSR ANIMATE_PLAYER 162 | JSR CACULATE_AND_REDRAW 163 | JSR DRAW_MAP_WINDOW 164 | JSR DISPLAY_PLAYER_HEALTH 165 | JSR DISPLAY_KEYS 166 | JSR DISPLAY_WEAPON 167 | LDA #1 168 | STA UNIT_TYPE 169 | JSR SET_INITIAL_TIMERS 170 | JSR PRINT_INTRO_MESSAGE 171 | LDA #30 172 | STA KEYTIMER 173 | JMP MAIN_GAME_LOOP 174 | 175 | TILENAME !PET"tileset.pet" 176 | MAPNAME !PET"level-a" 177 | SNDNAME !PET"pdrv-pet" 178 | LOADMSG1 !PET"loading tiles...",13 179 | LOADMSG2 !PET 147,"loading map...",13 180 | KEYS !BYTE 00 ;bit0=spade bit2=heart bit3=star 181 | AMMO_PISTOL !BYTE 00 ;how much ammo for the pistol 182 | AMMO_PLASMA !BYTE 00 ;how many shots of the plasmagun 183 | INV_BOMBS !BYTE 00 ;How many bombs do we have 184 | INV_EMP !BYTE 00 ;How many EMPs do we have 185 | INV_MEDKIT !BYTE 00 ;How many medkits do we have? 186 | INV_MAGNET !BYTE 00 ;How many magnets do we have? 187 | SELECTED_WEAPON !BYTE 00 ;0=none 1=pistol 2=plasmagun 188 | SELECTED_ITEM !BYTE 00 ;0=none 1=bomb 2=emp 3=medkit 4=magnet 189 | SELECT_TIMEOUT !BYTE 00 ;can only change weapons once it hits zero 190 | ANIMATE !BYTE 01 ;0=DISABLED 1=ENABLED 191 | BIG_EXP_ACT !BYTE 00 ;0=No explosion active 1=big explosion active 192 | MAGNET_ACT !BYTE 00 ;0=no magnet active 1=magnet active 193 | PLASMA_ACT !BYTE 00 ;0=No plasma fire active 1=plasma fire active 194 | RANDOM !BYTE 00 ;used for random number generation 195 | BORDER !BYTE 00 ;Used for border flash timing 196 | SCREEN_SHAKE !BYTE 00 ;1=shake 0=no shake 197 | CONTROL !BYTE 00 ;0=keyboard 1=custom keys 2=snes 198 | BASICROM !BYTE 04 ;which ROM is detected? 199 | INTRO_MESSAGE !SCR"welcome to pet-robots v1.1!",255 200 | !SCR"by david murray 2022",255 201 | !SCR"map on clr/home key.",0 202 | MSG_CANTMOVE !SCR"can't move that!",0 203 | MSG_BLOCKED !SCR"blocked!",0 204 | MSG_SEARCHING !SCR"searching",0 205 | MSG_NOTFOUND !SCR"nothing found here.",0 206 | MSG_FOUNDKEY !SCR"you found a key card!",0 207 | MSG_FOUNDGUN !SCR"you found a pistol!",0 208 | MSG_FOUNDEMP !SCR"you found an emp device!",0 209 | MSG_FOUNDBOMB !SCR"you found a timebomb!",0 210 | MSG_FOUNDPLAS !SCR"you found a plasma gun!",0 211 | MSG_FOUNDMED !SCR"you found a medkit!",0 212 | MSG_FOUNDMAG !SCR"you found a magnet!",0 213 | MSG_MUCHBET !SCR"ahhh, much better!",0 214 | MSG_EMPUSED !SCR"emp activated!",255 215 | !SCR"nearby robots are rebooting.",0 216 | MSG_TERMINATED !SCR"you're terminated!",0 217 | MSG_TRANS1 !SCR"transporter will not activate",255 218 | !SCR"until all robots destroyed.",0 219 | MSG_ELEVATOR !SCR"[ elevator panel ] down",255 220 | !SCR"[ select level ] opens",0 221 | MSG_LEVELS !SCR"[ ] door",0 222 | MSG_PAUSED !SCR"game paused.",255 223 | !SCR"exit game (y/n)",0 224 | MSG_MUSICON !SCR"music on.",0 225 | MSG_MUSICOFF !SCR"music off.",0 226 | SELECTED_MAP !BYTE 00 227 | MAP_NAMES !SCR"01-research lab " 228 | !SCR"02-headquarters " 229 | !SCR"03-the village " 230 | !SCR"04-the islands " 231 | !SCR"05-downtown " 232 | !SCR"06-pi university" 233 | !SCR"07-more islands " 234 | !SCR"08-robot hotel " 235 | !SCR"09-forest moon " 236 | !SCR"10-death tower " 237 | !SCR"11-bunker " 238 | !SCR"12-castle robot " 239 | !SCR"13-rocket center" 240 | !SCR"14-pilands " 241 | ;***THE FOLLOWING ARE USED BY THE SOUND SYSTEM*** 242 | TEMPO_TIMER !BYTE 00 ;used for counting down to the next tick 243 | TEMPO !BYTE 07 ;How many IRQs between ticks 244 | DATA_LINE !BYTE 00 ;used for playback to keep track of which line we are executing. 245 | ARP_MODE !BYTE 00 ;0=no 1=major 2=minor 3=sus4 246 | CHORD_ROOT !BYTE 00 ;root note of the chord 247 | MUSIC_ON !BYTE 00 ;0=off 1=on 248 | SOUND_EFFECT !BYTE $FF ;FF=OFF or number of effect in progress 249 | 250 | DETECT_ROM_VERSION: 251 | LDA $C353 252 | CMP #160 253 | BEQ DET0 254 | LDA #50 255 | STA DETECTMSG+9 256 | LDA #2 257 | STA BASICROM 258 | LDA #$22 259 | STA LDR1+1 260 | STA LDR2+1 261 | ;NOW DISLPAY MESSAGE 262 | DET0: LDY #0 263 | DET1: LDA DETECTMSG,Y 264 | CMP #0 265 | BEQ DET2 266 | JSR $FFD2 267 | INY 268 | JMP DET1 269 | DET2: RTS 270 | DETECTMSG: !BYTE 13,13 271 | !PET"basic v4 detected!",13,0 272 | 273 | DISPLAY_LOAD_MESSAGE1: 274 | LDY #0 275 | DLM1: LDA LOADMSG1,Y 276 | JSR $FFD2 277 | INY 278 | CPY #17 279 | BNE DLM1 280 | RTS 281 | 282 | ;Displays loading message for map. 283 | DISPLAY_LOAD_MESSAGE2: 284 | LDY #0 285 | DLM2: LDA LOAD_MSG2,Y 286 | STA $8190,Y 287 | INY 288 | CPY #12 289 | BNE DLM2 290 | JSR CALC_MAP_NAME 291 | DLM3: LDA ($FB),Y 292 | STA $819C,Y 293 | INY 294 | CPY #16 295 | BNE DLM3 296 | RTS 297 | LOAD_MSG2: !SCR"loading map:" 298 | 299 | SETUP_INTERRUPT: 300 | SEI ; Disable interrupt routine 301 | LDA $0090 ; get old address 302 | STA IRQ31+1 303 | LDA $0091 ; get old address 304 | STA IRQ31+2 305 | LDA #RUNIRQ 308 | STA $0091 309 | CLI ; Reenable routine. 310 | RTS 311 | 312 | ;This is the routine that runs every 60 seconds from the IRQ. 313 | ;BGTIMER1 is always set to 1 every cycle, after which the main 314 | ;program will reset it to 0 when it is done with it's work for 315 | ;that cycle. BGTIMER2 is a count-down to zero and then stays 316 | ;there. 317 | RUNIRQ: 318 | ;LDA ARP_MODE ;ARP ROUTINE DISABLED 319 | ;CMP #00 ;SINCE NO MUSIC IS USING IT 320 | ;BEQ IRQ20 321 | ;JSR CYCLE_ARP 322 | IRQ20: JSR MUSIC_ROUTINE 323 | JSR UPDATE_GAME_CLOCK 324 | JSR ANIMATE_WATER 325 | LDA #1 326 | STA BGTIMER1 327 | LDA BGTIMER2 328 | CMP #0 329 | BEQ IRQ1 330 | DEC BGTIMER2 331 | IRQ1: LDA KEYTIMER 332 | CMP #0 333 | BEQ IRQ30 334 | DEC KEYTIMER 335 | IRQ30: LDA BORDER 336 | CMP #0 337 | BEQ IRQ31 338 | DEC BORDER 339 | IRQ31: JMP $E455 ; Back to usual IRQ routine 340 | BGTIMER1 !BYTE 00 341 | BGTIMER2 !BYTE 00 342 | KEYTIMER !BYTE 00 ;Used for repeat of movement 343 | 344 | ;Since the PET has no real-time clock, and the Jiffy clock 345 | ;is a pain to read from assembly language, I have created my own. 346 | UPDATE_GAME_CLOCK: 347 | LDA CLOCK_ACTIVE 348 | CMP #1 349 | BNE UGC5 350 | INC CYCLES 351 | LDA CYCLES 352 | CMP #50 ;60 for ntsc or 50 for pal 353 | BNE UGC5 354 | LDA #0 355 | STA CYCLES 356 | INC SECONDS 357 | LDA SECONDS 358 | CMP #60 359 | BNE UGC5 360 | LDA #0 361 | STA SECONDS 362 | INC MINUTES 363 | LDA MINUTES 364 | CMP #60 365 | BNE UGC5 366 | LDA #0 367 | STA SECONDS 368 | STA MINUTES 369 | INC HOURS 370 | UGC5: RTS 371 | 372 | HOURS !BYTE 00 373 | MINUTES !BYTE 00 374 | SECONDS !BYTE 00 375 | CYCLES !BYTE 00 376 | CLOCK_ACTIVE !BYTE 00 377 | 378 | SNES_CONTROLER_READ: 379 | ;First copy last time's results to the LAST variables. 380 | LDY #0 381 | SNCL: LDA SNES_B,Y 382 | STA LAST_B,Y 383 | ;STA $8398,Y ;TESTCODE 384 | INY 385 | CPY #12 386 | BNE SNCL 387 | ;now latch data 388 | LDA #%00100000 ;latch on pin 5 389 | STA $E841 390 | LDA #%00000000 391 | STA $E841 392 | LDX #0 393 | ;Now read in bits 394 | SRLOOP: LDA $E841 395 | AND #%01000000 ;READ pin 6 396 | CMP #%01000000 397 | BEQ SRL1 398 | LDA #1 399 | JMP SRL5 400 | SRL1: LDA #0 401 | SRL5: STA SNES_B,X 402 | ;pulse the clock line 403 | LDA #%00001000 ;CLOCK on pin 3 404 | STA $E841 405 | LDA #%00000000 406 | STA $E841 407 | INX 408 | CPX #12 409 | BNE SRLOOP 410 | ;now process any new presses 411 | LDY #0 412 | SRL09: LDA NEW_B,Y 413 | CMP #1 414 | BEQ SRL10 415 | LDA SNES_B,Y 416 | CMP #1 417 | BNE SRL10 418 | LDA LAST_B,Y 419 | CMP #0 420 | BNE SRL10 421 | LDA #1 422 | STA NEW_B,Y 423 | ;STA $83C0,Y ;TEST CODE 424 | SRL10: INY 425 | CPY #12 426 | BNE SRL09 427 | RTS 428 | 429 | ;This routine clears any new-button-presses 430 | ;that are pending. 431 | CLEAR_SNES_PAD: 432 | LDA #0 433 | STA NEW_UP 434 | STA NEW_DOWN 435 | STA NEW_LEFT 436 | STA NEW_RIGHT 437 | STA NEW_A 438 | STA NEW_B 439 | STA NEW_X 440 | STA NEW_Y 441 | STA NEW_BACK_L 442 | STA NEW_BACK_R 443 | RTS 444 | 445 | ;This routine spaces out the timers so that not everything 446 | ;is running out once. It also starts the game_clock. 447 | SET_INITIAL_TIMERS: 448 | LDA #1 449 | STA CLOCK_ACTIVE 450 | LDX #01 451 | SIT1 TXA 452 | STA UNIT_TIMER_A,X 453 | LDA #0 454 | STA UNIT_TIMER_B,X 455 | INX 456 | CPX #48 457 | BNE SIT1 458 | RTS 459 | 460 | MAIN_GAME_LOOP: 461 | MG0A: JSR PET_SCREEN_SHAKE 462 | JSR BACKGROUND_TASKS 463 | LDA UNIT_TYPE 464 | CMP #1 ;Is player unit alive 465 | BEQ MG00 466 | JMP GAME_OVER 467 | MG00: LDA CONTROL 468 | CMP #2 469 | BNE KY01 470 | JMP SC01 471 | KY01: ;Keyboard controls here. 472 | JSR KEY_REPEAT 473 | JSR $FFE4 474 | CMP #$00 475 | BEQ MAIN_GAME_LOOP 476 | LDX #5 477 | STX KEYTIMER 478 | MG01: CMP #$1D ;CURSOR RIGHT 479 | BNE MG02 480 | MG01A: LDA #0 481 | STA UNIT 482 | LDA #%00000001 483 | STA MOVE_TYPE 484 | JSR REQUEST_WALK_RIGHT 485 | JMP AFTER_MOVE 486 | MG02: CMP #$9D ;CURSOR LEFT 487 | BNE MG03 488 | MG02A: LDA #0 489 | STA UNIT 490 | LDA #%00000001 491 | STA MOVE_TYPE 492 | JSR REQUEST_WALK_LEFT 493 | JMP AFTER_MOVE 494 | MG03: CMP #$11 ;CURSOR DOWN 495 | BNE MG04 496 | MG03A: LDA #0 497 | STA UNIT 498 | LDA #%00000001 499 | STA MOVE_TYPE 500 | JSR REQUEST_WALK_DOWN 501 | JMP AFTER_MOVE 502 | MG04: CMP #$91 ;CURSOR UP 503 | BNE MG05 504 | MG04A: LDA #0 505 | STA UNIT 506 | LDA #%00000001 507 | STA MOVE_TYPE 508 | JSR REQUEST_WALK_UP 509 | JMP AFTER_MOVE 510 | MG05: CMP KEY_CYCLE_WEAPONS 511 | BNE MG06 512 | JSR CYCLE_WEAPON 513 | JSR CLEAR_KEY_BUFFER 514 | JMP MAIN_GAME_LOOP 515 | MG06: CMP KEY_CYCLE_ITEMS 516 | BNE MG07 517 | JSR CYCLE_ITEM 518 | JSR CLEAR_KEY_BUFFER 519 | JMP MAIN_GAME_LOOP 520 | MG07: CMP KEY_MOVE 521 | BNE MG08 522 | JSR MOVE_OBJECT 523 | JSR CLEAR_KEY_BUFFER 524 | JMP MAIN_GAME_LOOP 525 | MG08: CMP KEY_SEARCH 526 | BNE MG09 527 | JSR SEARCH_OBJECT 528 | JSR CLEAR_KEY_BUFFER 529 | JMP MAIN_GAME_LOOP 530 | MG09: CMP KEY_USE 531 | BNE MG10 532 | JSR USE_ITEM 533 | JSR CLEAR_KEY_BUFFER 534 | JMP MAIN_GAME_LOOP 535 | MG10: CMP KEY_MOVE_LEFT 536 | BNE MG11 537 | JMP MG02A 538 | MG11: CMP KEY_MOVE_DOWN 539 | BNE MG12 540 | JMP MG03A 541 | MG12: CMP KEY_MOVE_RIGHT 542 | BNE MG13 543 | JMP MG01A 544 | MG13: CMP KEY_MOVE_UP 545 | BNE MG14 546 | JMP MG04A 547 | MG14: CMP KEY_FIRE_UP 548 | BNE MG15 549 | JSR FIRE_UP 550 | LDA #20 551 | STA KEYTIMER 552 | JMP MAIN_GAME_LOOP 553 | MG15: CMP KEY_FIRE_LEFT 554 | BNE MG16 555 | JSR FIRE_LEFT 556 | LDA #20 557 | STA KEYTIMER 558 | JMP MAIN_GAME_LOOP 559 | MG16: CMP KEY_FIRE_DOWN 560 | BNE MG17 561 | JSR FIRE_DOWN 562 | LDA #20 563 | STA KEYTIMER 564 | JMP MAIN_GAME_LOOP 565 | MG17: CMP KEY_FIRE_RIGHT 566 | BNE MG18 567 | JSR FIRE_RIGHT 568 | LDA #20 569 | STA KEYTIMER 570 | JMP MAIN_GAME_LOOP 571 | MG18: CMP #03 ;RUN/STOP 572 | BNE MG19 573 | JMP PAUSE_GAME 574 | MG19: CMP #195 ;SHIFT-C 575 | BNE MG20 576 | JSR CHEATER 577 | JMP MAIN_GAME_LOOP 578 | MG20: CMP #205 ;SHIFT-M 579 | BNE MG21 580 | JSR TOGGLE_MUSIC 581 | JSR CLEAR_KEY_BUFFER 582 | JMP MAIN_GAME_LOOP 583 | MG21: CMP #19 ;HOME 584 | BNE MG22 585 | JSR DISPLAY_MAP 586 | MG22: JMP MAIN_GAME_LOOP 587 | 588 | SC01: ;SNES CONTROLLER starts here 589 | JSR SNES_CONTROLER_READ 590 | ;check keytimer for repeat time. 591 | LDA KEYTIMER 592 | CMP #0 593 | BEQ SC02 594 | JMP SC40 595 | SC02: LDA #0 596 | STA NEW_UP 597 | STA NEW_DOWN 598 | STA NEW_LEFT 599 | STA NEW_RIGHT 600 | STA SNES_UP 601 | STA SNES_DOWN 602 | STA SNES_LEFT 603 | STA SNES_RIGHT 604 | JSR SNES_CONTROLER_READ 605 | SC05: ;first we start with the 4 directional buttons. 606 | LDA NEW_LEFT 607 | CMP #01 608 | BNE SC10 609 | LDA SNES_SELECT ;find out if select is being held down 610 | CMP #0 611 | BEQ SC06 612 | LDA #0 613 | STA NEW_LEFT 614 | JSR DISPLAY_MAP 615 | JMP MAIN_GAME_LOOP 616 | SC06: LDA #0 617 | STA UNIT 618 | LDA #%00000001 619 | STA MOVE_TYPE 620 | JSR REQUEST_WALK_LEFT 621 | JMP AFTER_MOVE_SNES 622 | SC10: LDA NEW_RIGHT 623 | CMP #01 624 | BNE SC20 625 | LDA #0 626 | STA UNIT 627 | LDA #%00000001 628 | STA MOVE_TYPE 629 | JSR REQUEST_WALK_RIGHT 630 | JMP AFTER_MOVE_SNES 631 | SC20: LDA NEW_UP 632 | CMP #01 633 | BNE SC30 634 | LDA #0 635 | STA UNIT 636 | LDA #%00000001 637 | STA MOVE_TYPE 638 | JSR REQUEST_WALK_UP 639 | JMP AFTER_MOVE_SNES 640 | SC30: LDA NEW_DOWN 641 | CMP #01 642 | BNE SC35 643 | LDA #0 644 | STA UNIT 645 | LDA #%00000001 646 | STA MOVE_TYPE 647 | JSR REQUEST_WALK_DOWN 648 | JMP AFTER_MOVE_SNES 649 | SC35: LDA #0 650 | STA KEY_FAST 651 | SC40: ;Now check for non-repeating buttons 652 | LDA NEW_Y 653 | CMP #1 654 | BNE SC45 655 | JSR FIRE_LEFT 656 | LDA #0 657 | STA NEW_Y 658 | SC45: LDA NEW_A 659 | CMP #1 660 | BNE SC50 661 | JSR FIRE_RIGHT 662 | LDA #0 663 | STA NEW_A 664 | SC50: LDA NEW_X 665 | CMP #1 666 | BNE SC55 667 | JSR FIRE_UP 668 | LDA #0 669 | STA NEW_X 670 | SC55: LDA NEW_B 671 | CMP #1 672 | BNE SC60 673 | JSR FIRE_DOWN 674 | LDA #0 675 | STA NEW_B 676 | SC60: LDA NEW_BACK_L 677 | CMP #1 678 | BNE SC65 679 | LDA SNES_SELECT 680 | CMP #1 681 | BNE SC62 682 | JSR CYCLE_ITEM 683 | JMP SC63 684 | SC62: JSR SEARCH_OBJECT 685 | SC63: LDA #0 686 | STA NEW_BACK_L 687 | LDA #15 688 | STA KEYTIMER 689 | SC65: LDA NEW_BACK_R 690 | CMP #1 691 | BNE SC70 692 | LDA SNES_SELECT 693 | CMP #1 694 | BNE SC67 695 | JSR CYCLE_WEAPON 696 | JMP SC68 697 | SC67: JSR MOVE_OBJECT 698 | SC68: LDA #0 699 | STA NEW_BACK_R 700 | LDA #15 701 | STA KEYTIMER 702 | SC70: LDA NEW_START 703 | CMP #1 704 | BNE SC75 705 | JSR USE_ITEM 706 | LDA #0 707 | STA NEW_START 708 | LDA #15 709 | STA KEYTIMER 710 | SC75: ;STILL USE KEYBOARD TO CHECK FOR RUN/STOP AND OTHERS 711 | JSR $FFE4 712 | CMP #03 ;RUN/STOP 713 | BNE SC80 714 | JMP PAUSE_GAME 715 | SC80: CMP #205 ;SHIFT-M 716 | BNE SC81 717 | JSR TOGGLE_MUSIC 718 | JSR CLEAR_KEY_BUFFER 719 | JMP MAIN_GAME_LOOP 720 | SC81: CMP #19 ;HOME 721 | BNE SC82 722 | JSR DISPLAY_MAP 723 | SC82: JMP MAIN_GAME_LOOP 724 | 725 | 726 | ;This routine handles things that are in common to 727 | ;all 4 directions of movement. 728 | AFTER_MOVE_SNES: 729 | LDA MOVE_RESULT 730 | CMP #1 731 | BNE AMS01 732 | JSR ANIMATE_PLAYER 733 | JSR CACULATE_AND_REDRAW 734 | AMS01: LDA KEY_FAST 735 | CMP #0 736 | BNE AMS02 737 | LDA #15 738 | STA KEYTIMER 739 | LDA #1 740 | STA KEY_FAST 741 | JMP AMS03 742 | AMS02: LDA #6 743 | STA KEYTIMER 744 | LDA #0 745 | STA NEW_UP 746 | STA NEW_DOWN 747 | STA NEW_LEFT 748 | STA NEW_RIGHT 749 | AMS03: JMP MAIN_GAME_LOOP 750 | 751 | TOGGLE_MUSIC: 752 | LDA MUSIC_ON 753 | CMP #1 754 | BNE TGMUS1 755 | LDA #MSG_MUSICOFF 758 | STA $FC 759 | JSR PRINT_INFO 760 | LDA #0 761 | STA MUSIC_ON 762 | STA $E848 ;turn off sound 763 | STA $E84A ;turn off sound 764 | RTS 765 | TGMUS1: LDA #MSG_MUSICON 768 | STA $FC 769 | JSR PRINT_INFO 770 | LDA #1 771 | STA MUSIC_ON 772 | JSR START_IN_GAME_MUSIC 773 | RTS 774 | 775 | START_IN_GAME_MUSIC: 776 | LDA #1 777 | STA MUSIC_ON 778 | LDA SOUND_EFFECT 779 | CMP #$FF ;FF=NO sound effect in progress 780 | BNE SIGM1 781 | LDA #0 782 | STA DATA_LINE 783 | LDA #IN_GAME_MUSIC1 786 | CLC 787 | LDY SELECTED_MAP 788 | ADC LEVEL_MUSIC,Y 789 | STA CUR_PATTERN_H 790 | RTS 791 | SIGM1: ;apparently a sound-effect is active, so we do things differently. 792 | LDA #0 793 | STA DATA_LINE_TEMP 794 | LDA #IN_GAME_MUSIC1 797 | CLC 798 | LDY SELECTED_MAP 799 | ADC LEVEL_MUSIC,Y 800 | STA PATTERN_H_TEMP 801 | LDA #0 802 | STA DATA_LINE_TEMP 803 | RTS 804 | LEVEL_MUSIC: !BYTE 0,1,2,0,1,2,0,1,2,0,1,2,0,1 805 | 806 | ;TEMP ROUTINE TO GIVE ME ALL ITEMS AND WEAPONS 807 | CHEATER: 808 | LDA #7 809 | STA KEYS 810 | LDA #100 811 | STA AMMO_PISTOL 812 | STA AMMO_PLASMA 813 | STA INV_BOMBS 814 | STA INV_EMP 815 | STA INV_MEDKIT 816 | STA INV_MAGNET 817 | LDA #1 818 | STA SELECTED_WEAPON 819 | STA SELECTED_ITEM 820 | JSR DISPLAY_KEYS 821 | JSR DISPLAY_WEAPON 822 | JSR DISPLAY_ITEM 823 | RTS 824 | PAUSE_GAME: 825 | LDA #15 826 | JSR PLAY_SOUND 827 | ;pause clock 828 | LDA #0 829 | STA CLOCK_ACTIVE 830 | ;display message to user 831 | JSR SCROLL_INFO 832 | LDA #MSG_PAUSED 835 | STA $FC 836 | JSR PRINT_INFO 837 | LDA #0 838 | STA BGTIMER1 839 | PG0: LDA BGTIMER1 ;to prevent double-tap of run/stop 840 | CMP #1 841 | BNE PG0 842 | JSR CLEAR_KEY_BUFFER 843 | PG1: JSR $FFE4 844 | CMP #$00 845 | BEQ PG1 846 | CMP #03 ;RUN/STOP 847 | BEQ PG5 848 | CMP #78 ;N-KEY 849 | BEQ PG5 850 | CMP #89 ;Y-KEY 851 | BEQ PG6 852 | JMP PG1 853 | PG5: JSR SCROLL_INFO 854 | JSR SCROLL_INFO 855 | JSR SCROLL_INFO 856 | JSR CLEAR_KEY_BUFFER 857 | LDA #1 858 | STA CLOCK_ACTIVE 859 | LDA #15 860 | JSR PLAY_SOUND 861 | JMP MAIN_GAME_LOOP 862 | PG6: LDA #0 863 | STA UNIT_TYPE ;make player dead 864 | LDA #15 865 | JSR PLAY_SOUND 866 | JMP GOM4 867 | 868 | CLEAR_KEY_BUFFER: 869 | LDA #0 870 | STA $009E ;CLEAR KEYBOARD BUFFER 871 | LDA #20 872 | STA KEYTIMER 873 | RTS 874 | 875 | USE_ITEM: 876 | ;check select timeout to prevent accidental double-tap 877 | LDA SELECT_TIMEOUT 878 | CMP #0 879 | BEQ UI01 880 | RTS 881 | ;First figure out which item to use. 882 | UI01: LDA SELECTED_ITEM 883 | CMP #1 ;BOMB 884 | BNE UI02 885 | JMP USE_BOMB 886 | UI02: CMP #2 ;EMP 887 | BNE UI03 888 | JMP USE_EMP 889 | UI03: CMP #3 ;MEDKIT 890 | BNE UI04 891 | JMP USE_MEDKIT 892 | UI04: CMP #4 ;MAGNET 893 | BNE UI05 894 | JMP USE_MAGNET 895 | UI05: RTS 896 | 897 | USE_BOMB: 898 | JSR USER_SELECT_OBJECT 899 | ;NOW TEST TO SEE IF THAT SPOT IS OPEN 900 | JSR BOMB_MAGNET_COMMON1 901 | BEQ BM30 902 | JMP BM3A ;If not, then exit routine. 903 | BM30: ;Now scan for any units at that location: 904 | JSR CHECK_FOR_UNIT 905 | LDA UNIT_FIND 906 | CMP #255 ;255 means no unit found. 907 | BEQ BM31 908 | BM3A: JMP BOMB_MAGNET_COMMON2 909 | BM31: LDX #28 ;Start of weapons units 910 | BOMB1: LDA UNIT_TYPE,X 911 | CMP #0 912 | BEQ BOMB2 913 | INX 914 | CPX #32 915 | BNE BOMB1 916 | RTS ;no slots available right now, abort. 917 | BOMB2: LDA #6 ;bomb AI 918 | STA UNIT_TYPE,X 919 | LDA #130 ;bomb tile 920 | STA UNIT_TILE,X 921 | LDA MAP_X 922 | STA UNIT_LOC_X,X 923 | LDA MAP_Y 924 | STA UNIT_LOC_Y,X 925 | LDA #100 ;How long until exposion? 926 | STA UNIT_TIMER_A,X 927 | LDA #0 928 | STA UNIT_A,X 929 | DEC INV_BOMBS 930 | JSR DISPLAY_ITEM 931 | LDA #01 932 | STA REDRAW_WINDOW 933 | LDA #3 ;3 cycles before next item can be used 934 | STA SELECT_TIMEOUT ;pet version only 935 | LDA #06 ;move sound 936 | JSR PLAY_SOUND ;SOUND PLAY 937 | RTS 938 | 939 | USE_MAGNET: 940 | LDA MAGNET_ACT ;only one magnet active at a time. 941 | CMP #0 942 | BEQ MG32 943 | RTS 944 | MG32: JSR USER_SELECT_OBJECT 945 | ;NOW TEST TO SEE IF THAT SPOT IS OPEN 946 | JSR BOMB_MAGNET_COMMON1 947 | BEQ MG31 948 | JMP BOMB_MAGNET_COMMON2 949 | MG31: LDX #28 ;Start of weapons units 950 | MAG1: LDA UNIT_TYPE,X 951 | CMP #0 952 | BEQ MAG2 953 | INX 954 | CPX #32 955 | BNE MAG1 956 | RTS ;no slots available right now, abort. 957 | MAG2: LDA #20 ;MAGNET AI 958 | STA UNIT_TYPE,X 959 | LDA #134 ;MAGNET tile 960 | STA UNIT_TILE,X 961 | LDA MAP_X 962 | STA UNIT_LOC_X,X 963 | LDA MAP_Y 964 | STA UNIT_LOC_Y,X 965 | LDA #1 ;How long until ACTIVATION 966 | STA UNIT_TIMER_A,X 967 | LDA #255 ;how long does it live -A 968 | STA UNIT_TIMER_B,X 969 | LDA #3 ;how long does it live -B 970 | STA UNIT_A,X 971 | LDA #1 972 | STA MAGNET_ACT ;only one magnet allowed at a time. 973 | DEC INV_MAGNET 974 | JSR DISPLAY_ITEM 975 | LDA #01 976 | STA REDRAW_WINDOW 977 | LDA #06 ;move sound 978 | JSR PLAY_SOUND ;SOUND PLAY 979 | RTS 980 | 981 | BOMB_MAGNET_COMMON1: 982 | LDA #0 983 | STA CURSOR_ON 984 | JSR DRAW_MAP_WINDOW ;ERASE THE CURSOR 985 | LDA CURSOR_X 986 | CLC 987 | ADC MAP_WINDOW_X 988 | STA MAP_X 989 | STA MOVTEMP_UX 990 | LDA CURSOR_Y 991 | CLC 992 | ADC MAP_WINDOW_Y 993 | STA MAP_Y 994 | STA MOVTEMP_UY 995 | JSR GET_TILE_FROM_MAP 996 | LDA TILE 997 | TAY 998 | LDA TILE_ATTRIB,Y 999 | AND #%00000001 ;is that spot available 1000 | CMP #%00000001 ;for something to move onto it? 1001 | RTS 1002 | 1003 | BOMB_MAGNET_COMMON2: 1004 | LDA #MSG_BLOCKED 1007 | STA $FC 1008 | JSR PRINT_INFO 1009 | LDA #11 ;ERROR SOUND 1010 | JSR PLAY_SOUND ;SOUND PLAY 1011 | RTS 1012 | 1013 | USE_EMP: 1014 | JSR EMP_FLASH 1015 | LDA #0 1016 | STA REDRAW_WINDOW ;attempt to delay window redrawing (pet only) 1017 | LDA #3 ;EMP sound 1018 | JSR PLAY_SOUND ;SOUND PLAY 1019 | DEC INV_EMP 1020 | JSR DISPLAY_ITEM 1021 | LDX #1 ;start with unit#1 (skip player) 1022 | EMP1: ;CHECK THAT UNIT EXISTS 1023 | LDA UNIT_TYPE,X 1024 | CMP #0 1025 | BEQ EMP5 1026 | ;CHECK HORIZONTAL POSITION 1027 | LDA UNIT_LOC_X,X 1028 | CMP MAP_WINDOW_X 1029 | BCC EMP5 1030 | LDA MAP_WINDOW_X 1031 | CLC 1032 | ADC #10 1033 | CMP UNIT_LOC_X,X 1034 | BCC EMP5 1035 | ;NOW CHECK VERTICAL 1036 | LDA UNIT_LOC_Y,X 1037 | CMP MAP_WINDOW_Y 1038 | BCC EMP5 1039 | LDA MAP_WINDOW_Y 1040 | CLC 1041 | ADC #6 1042 | CMP UNIT_LOC_Y,X 1043 | BCC EMP5 1044 | LDA #255 1045 | STA UNIT_TIMER_A,X 1046 | ;test to see if unit is above water 1047 | LDA UNIT_LOC_X,X 1048 | STA MAP_X 1049 | LDA UNIT_LOC_Y,X 1050 | STA MAP_Y 1051 | JSR GET_TILE_FROM_MAP 1052 | LDA TILE 1053 | CMP #204 ;WATER 1054 | BNE EMP5 1055 | LDA #5 1056 | STA UNIT_TYPE,X 1057 | STA UNIT_TIMER_A,X 1058 | LDA #60 ;how long to show sparks. 1059 | STA UNIT_A,X 1060 | LDA #140 ;Electrocuting tile 1061 | STA UNIT_TILE,X 1062 | EMP5: INX 1063 | CPX #28 1064 | BNE EMP1 1065 | LDA #MSG_EMPUSED 1068 | STA $FC 1069 | JSR PRINT_INFO 1070 | LDA #3 ;3 cycles before next item can be used 1071 | STA SELECT_TIMEOUT 1072 | RTS 1073 | 1074 | USE_MEDKIT: 1075 | LDA UNIT_HEALTH 1076 | CMP #12 ;Do we even need the medkit? 1077 | BNE UMK1 1078 | RTS 1079 | UMK1: ;Now figure out how many HP we need to be healthy. 1080 | LDA #12 1081 | SEC 1082 | SBC UNIT_HEALTH 1083 | STA TEMP_A ;how many we need. 1084 | LDA INV_MEDKIT ;how many do we have? 1085 | SEC 1086 | SBC TEMP_A 1087 | BCC UMK2 1088 | ;we had more than we need, so go to full health. 1089 | LDA #12 1090 | STA UNIT_HEALTH 1091 | LDA INV_MEDKIT 1092 | SEC 1093 | SBC TEMP_A 1094 | STA INV_MEDKIT 1095 | JMP UMK3 1096 | UMK2: ;we had less than we need, so we'll use what is available. 1097 | LDA INV_MEDKIT 1098 | CLC 1099 | ADC UNIT_HEALTH 1100 | STA UNIT_HEALTH 1101 | LDA #0 1102 | STA INV_MEDKIT 1103 | UMK3: JSR DISPLAY_PLAYER_HEALTH 1104 | JSR DISPLAY_ITEM 1105 | LDA #2 ;MEDKIT SOUND 1106 | JSR PLAY_SOUND ;SOUND PLAY 1107 | LDA #MSG_MUCHBET 1110 | STA $FC 1111 | JSR PRINT_INFO 1112 | RTS 1113 | 1114 | FIRE_UP: 1115 | LDA SELECTED_WEAPON 1116 | CMP #0 1117 | BNE FRU0 1118 | RTS 1119 | FRU0: CMP #1 1120 | BNE FRU1 1121 | JMP FIRE_UP_PISTOL 1122 | FRU1: JMP FIRE_UP_PLASMA 1123 | 1124 | FIRE_UP_PISTOL: 1125 | LDA AMMO_PISTOL 1126 | CMP #0 1127 | BNE FU00 1128 | RTS 1129 | FU00: LDX #28 1130 | FU01: LDA UNIT_TYPE,X 1131 | CMP #0 1132 | BEQ FU02 1133 | INX 1134 | CPX #32 ;max unit for weaponsfire 1135 | BNE FU01 1136 | RTS 1137 | FU02: LDA #12 ;Fire pistol up AI routine 1138 | STA UNIT_TYPE,X 1139 | LDA #244 ;tile for vertical weapons fire 1140 | STA UNIT_TILE,X 1141 | LDA #3 ;travel distance. 1142 | STA UNIT_A,X 1143 | LDA #0 ;weapon-type = pistol 1144 | STA UNIT_B,X 1145 | JMP AFTER_FIRE 1146 | 1147 | FIRE_UP_PLASMA: 1148 | LDA BIG_EXP_ACT 1149 | CMP #1 1150 | BEQ FUP3 1151 | LDA PLASMA_ACT 1152 | CMP #1 1153 | BEQ FUP3 1154 | LDA AMMO_PLASMA 1155 | CMP #0 1156 | BNE FUP0 1157 | FUP3: RTS 1158 | FUP0: LDX #28 1159 | FUP1: LDA UNIT_TYPE,X 1160 | CMP #0 1161 | BEQ FUP2 1162 | INX 1163 | CPX #32 ;max unit for weaponsfire 1164 | BNE FUP1 1165 | RTS 1166 | FUP2: LDA #12 ;Fire pistol up AI routine 1167 | STA UNIT_TYPE,X 1168 | LDA #240 ;tile for vertical plasma bolt 1169 | STA UNIT_TILE,X 1170 | LDA #3 ;travel distance. 1171 | STA UNIT_A,X 1172 | LDA #1 ;weapon-type = plasma 1173 | STA UNIT_B,X 1174 | STA PLASMA_ACT 1175 | JMP AFTER_FIRE 1176 | 1177 | FIRE_DOWN: 1178 | LDA SELECTED_WEAPON 1179 | CMP #0 1180 | BNE FRD0 1181 | RTS 1182 | FRD0: CMP #1 1183 | BNE FRD1 1184 | JMP FIRE_DOWN_PISTOL 1185 | FRD1: JMP FIRE_DOWN_PLASMA 1186 | 1187 | FIRE_DOWN_PISTOL: 1188 | LDA AMMO_PISTOL 1189 | CMP #0 1190 | BNE FD00 1191 | RTS 1192 | FD00: LDX #28 1193 | FD01: LDA UNIT_TYPE,X 1194 | CMP #0 1195 | BEQ FD02 1196 | INX 1197 | CPX #32 ;max unit for weaponsfire 1198 | BNE FD01 1199 | RTS 1200 | FD02: LDA #13 ;Fire pistol DOWN AI routine 1201 | STA UNIT_TYPE,X 1202 | LDA #244 ;tile for vertical weapons fire 1203 | STA UNIT_TILE,X 1204 | LDA #3 ;travel distance. 1205 | STA UNIT_A,X 1206 | LDA #0 ;weapon-type = pistol 1207 | STA UNIT_B,X 1208 | JMP AFTER_FIRE 1209 | 1210 | FIRE_DOWN_PLASMA: 1211 | LDA BIG_EXP_ACT 1212 | CMP #1 1213 | BEQ FDP3 1214 | LDA PLASMA_ACT 1215 | CMP #1 1216 | BEQ FDP3 1217 | LDA AMMO_PLASMA 1218 | CMP #0 1219 | BNE FDP0 1220 | FDP3: RTS 1221 | FDP0: LDX #28 1222 | FDP1: LDA UNIT_TYPE,X 1223 | CMP #0 1224 | BEQ FDP2 1225 | INX 1226 | CPX #32 ;max unit for weaponsfire 1227 | BNE FDP1 1228 | RTS 1229 | FDP2: LDA #13 ;Fire pistol DOWN AI routine 1230 | STA UNIT_TYPE,X 1231 | LDA #240 ;tile for vertical weapons fire 1232 | STA UNIT_TILE,X 1233 | LDA #3 ;travel distance. 1234 | STA UNIT_A,X 1235 | LDA #1 ;weapon-type = plasma 1236 | STA UNIT_B,X 1237 | STA PLASMA_ACT 1238 | JMP AFTER_FIRE 1239 | 1240 | FIRE_LEFT: 1241 | LDA SELECTED_WEAPON 1242 | CMP #0 1243 | BNE FRL0 1244 | RTS 1245 | FRL0: CMP #1 1246 | BNE FRL1 1247 | JMP FIRE_LEFT_PISTOL 1248 | FRL1: JMP FIRE_LEFT_PLASMA 1249 | 1250 | FIRE_LEFT_PISTOL: 1251 | LDA AMMO_PISTOL 1252 | CMP #0 1253 | BNE FL00 1254 | RTS 1255 | FL00: LDX #28 1256 | FL01: LDA UNIT_TYPE,X 1257 | CMP #0 1258 | BEQ FL02 1259 | INX 1260 | CPX #32 ;max unit for weaponsfire 1261 | BNE FL01 1262 | RTS 1263 | FL02: LDA #14 ;Fire pistol LEFT AI routine 1264 | STA UNIT_TYPE,X 1265 | LDA #245 ;tile for horizontal weapons fire 1266 | STA UNIT_TILE,X 1267 | LDA #5 ;travel distance. 1268 | STA UNIT_A,X 1269 | LDA #0 ;weapon-type = pistol 1270 | STA UNIT_B,X 1271 | JMP AFTER_FIRE 1272 | 1273 | FIRE_LEFT_PLASMA: 1274 | LDA BIG_EXP_ACT 1275 | CMP #1 1276 | BEQ FLP3 1277 | LDA PLASMA_ACT 1278 | CMP #1 1279 | BEQ FLP3 1280 | LDA AMMO_PLASMA 1281 | CMP #0 1282 | BNE FLP0 1283 | FLP3: RTS 1284 | FLP0: LDX #28 1285 | FLP1: LDA UNIT_TYPE,X 1286 | CMP #0 1287 | BEQ FLP2 1288 | INX 1289 | CPX #32 ;max unit for weaponsfire 1290 | BNE FLP1 1291 | RTS 1292 | FLP2: LDA #14 ;Fire pistol LEFT AI routine 1293 | STA UNIT_TYPE,X 1294 | LDA #241 ;tile for horizontal weapons fire 1295 | STA UNIT_TILE,X 1296 | LDA #5 ;travel distance. 1297 | STA UNIT_A,X 1298 | LDA #1 ;weapon-type = plasma 1299 | STA UNIT_B,X 1300 | STA PLASMA_ACT 1301 | JMP AFTER_FIRE 1302 | 1303 | FIRE_RIGHT: 1304 | LDA SELECTED_WEAPON 1305 | CMP #0 1306 | BNE FRR0 1307 | RTS 1308 | FRR0: CMP #1 1309 | BNE FRR1 1310 | JMP FIRE_RIGHT_PISTOL 1311 | FRR1: JMP FIRE_RIGHT_PLASMA 1312 | 1313 | FIRE_RIGHT_PISTOL: 1314 | LDA AMMO_PISTOL 1315 | CMP #0 1316 | BNE FR00 1317 | RTS 1318 | FR00: LDX #28 1319 | FR01: LDA UNIT_TYPE,X 1320 | CMP #0 1321 | BEQ FR02 1322 | INX 1323 | CPX #32 ;max unit for weaponsfire 1324 | BNE FR01 1325 | RTS 1326 | FR02: LDA #15 ;Fire pistol RIGHT AI routine 1327 | STA UNIT_TYPE,X 1328 | LDA #245 ;tile for horizontal weapons fire 1329 | STA UNIT_TILE,X 1330 | LDA #5 ;travel distance. 1331 | STA UNIT_A,X 1332 | LDA #0 ;weapon-type = pistol 1333 | STA UNIT_B,X 1334 | JMP AFTER_FIRE 1335 | 1336 | FIRE_RIGHT_PLASMA: 1337 | LDA BIG_EXP_ACT 1338 | CMP #1 1339 | BEQ FRP3 1340 | LDA PLASMA_ACT 1341 | CMP #1 1342 | BEQ FRP3 1343 | LDA AMMO_PLASMA 1344 | CMP #0 1345 | BNE FRP0 1346 | FRP3: RTS 1347 | FRP0: LDX #28 1348 | FRP1: LDA UNIT_TYPE,X 1349 | CMP #0 1350 | BEQ FRP2 1351 | INX 1352 | CPX #32 ;max unit for weaponsfire 1353 | BNE FRP1 1354 | RTS 1355 | FRP2: LDA #15 ;Fire pistol RIGHT AI routine 1356 | STA UNIT_TYPE,X 1357 | LDA #241 ;tile for horizontal weapons fire 1358 | STA UNIT_TILE,X 1359 | LDA #5 ;travel distance. 1360 | STA UNIT_A,X 1361 | LDA #1 ;weapon-type = plasma 1362 | STA UNIT_B,X 1363 | STA PLASMA_ACT 1364 | JMP AFTER_FIRE 1365 | 1366 | AFTER_FIRE: 1367 | LDA #0 1368 | STA UNIT_TIMER_A,X 1369 | LDA UNIT_LOC_X 1370 | STA UNIT_LOC_X,X 1371 | LDA UNIT_LOC_Y 1372 | STA UNIT_LOC_Y,X 1373 | STX UNIT 1374 | LDA SELECTED_WEAPON 1375 | CMP #2 1376 | BEQ AF01 1377 | LDA #09 ;PISTOL-SOUND 1378 | JSR PLAY_SOUND ;SOUND PLAY 1379 | DEC AMMO_PISTOL 1380 | JSR DISPLAY_WEAPON 1381 | RTS 1382 | AF01: LDA #08 ;PLASMA-GUN-SOUND 1383 | JSR PLAY_SOUND ;SOUND PLAY 1384 | DEC AMMO_PLASMA 1385 | JSR DISPLAY_WEAPON 1386 | RTS 1387 | 1388 | ;This routine checks KEYTIMER to see if it has 1389 | ;reached zero yet. If so, it clears the LSTX 1390 | ;variable used by the kernal, so that it will 1391 | ;register a new keypress. 1392 | 1393 | KEY_REPEAT: 1394 | LDA KEYTIMER 1395 | CMP #0 1396 | BNE KEYR2 1397 | LDA $97 1398 | CMP #255 ;no key pressed 1399 | BEQ KEYR1 1400 | LDA #255 ;clear LSTX register 1401 | STA $97 ;clear LSTX register 1402 | LDA #6 1403 | STA KEYTIMER 1404 | RTS 1405 | KEYR1: ;No key pressed, reset all to defaults 1406 | LDA #0 1407 | STA KEY_FAST 1408 | LDA #6 1409 | STA KEYTIMER 1410 | KEYR2: RTS 1411 | 1412 | ;This routine handles things that are in common to 1413 | ;all 4 directions of movement. 1414 | AFTER_MOVE: 1415 | LDA MOVE_RESULT 1416 | CMP #1 1417 | BNE AM01 1418 | JSR ANIMATE_PLAYER 1419 | JSR CACULATE_AND_REDRAW 1420 | AM01: ;now reset key-repeat rate 1421 | LDA KEY_FAST 1422 | CMP #0 1423 | BNE KEYR3 1424 | ;FIRST REPEAT 1425 | LDA #13 1426 | STA KEYTIMER 1427 | INC KEY_FAST 1428 | KEYR4: JMP MAIN_GAME_LOOP 1429 | KEYR3: ;SUBSEQUENT REPEATS 1430 | LDA #6 1431 | STA KEYTIMER 1432 | JMP MAIN_GAME_LOOP 1433 | KEY_FAST !BYTE 0 ;0=DEFAULT STATE 1434 | 1435 | ;This routine is invoked when the user presses S to search 1436 | ;an object such as a crate, chair, or plant. 1437 | SEARCH_OBJECT: 1438 | JSR USER_SELECT_OBJECT 1439 | LDA #1 1440 | STA REDRAW_WINDOW 1441 | CHS1: ;first check of object is searchable 1442 | JSR CALC_COORDINATES 1443 | JSR GET_TILE_FROM_MAP 1444 | LDX TILE 1445 | LDA TILE_ATTRIB,X 1446 | AND #%01000000 ;can search attribute 1447 | CMP #%01000000 1448 | BEQ CHS2 1449 | LDA #0 1450 | STA CURSOR_ON 1451 | JMP CHS3 1452 | CHS2: ;is the tile a crate? 1453 | LDX TILE 1454 | CPX #041 ;BIG CRATE 1455 | BEQ CHS2B 1456 | CPX #045 ;small CRATE 1457 | BEQ CHS2B 1458 | CPX #199 ;"Pi" CRATE 1459 | BEQ CHS2B 1460 | JMP CHS2C 1461 | CHS2B: LDA DESTRUCT_PATH,X 1462 | STA TILE 1463 | JSR PLOT_TILE_TO_MAP 1464 | CHS2C ;Now check if there is an object there. 1465 | LDA #0 1466 | STA SEARCHBAR 1467 | LDA #MSG_SEARCHING 1470 | STA $FC 1471 | JSR PRINT_INFO 1472 | SOBJ1: LDA #18 ;delay time between search periods 1473 | STA BGTIMER2 1474 | SOBJ2: JSR PET_SCREEN_SHAKE 1475 | JSR BACKGROUND_TASKS 1476 | LDA BGTIMER2 1477 | CMP #0 1478 | BNE SOBJ2 1479 | LDX SEARCHBAR 1480 | LDA #46 ;PERIOD 1481 | STA $83C9,X 1482 | INC SEARCHBAR 1483 | LDA SEARCHBAR 1484 | CMP #8 1485 | BNE SOBJ1 1486 | LDA #0 1487 | STA CURSOR_ON 1488 | JSR DRAW_MAP_WINDOW ;ERASE THE CURSOR 1489 | JSR CALC_COORDINATES 1490 | JSR CHECK_FOR_HIDDEN_UNIT 1491 | LDA UNIT_FIND 1492 | CMP #255 1493 | BNE SOBJ5 1494 | CHS3: LDA #MSG_NOTFOUND 1497 | STA $FC 1498 | JSR PRINT_INFO 1499 | RTS 1500 | SOBJ5: LDX UNIT_FIND 1501 | LDA UNIT_TYPE,X 1502 | STA TEMP_A ;store object type 1503 | LDA UNIT_A,X 1504 | STA TEMP_B ;store secondary info 1505 | LDA #0 ;DELETE ITEM ONCE FOUND 1506 | STA UNIT_TYPE,X 1507 | ;***NOW PROCESS THE ITEM FOUND*** 1508 | LDA #10 ;ITEM-FOUND-SOUND 1509 | JSR PLAY_SOUND ;SOUND PLAY 1510 | LDA TEMP_A 1511 | CMP #128 ;key 1512 | BEQ SOBJ10 1513 | JMP SOBJ15 1514 | SOBJ10: LDA TEMP_B ;WHICH SORT OF KEY? 1515 | CMP #00 1516 | BNE SOBJK1 1517 | LDA KEYS 1518 | ORA #%00000001 ;Add spade key 1519 | STA KEYS 1520 | JMP SOBJ12 1521 | SOBJK1: CMP #01 1522 | BNE SOBJK2 1523 | LDA KEYS 1524 | ORA #%00000010 ;Add heart key 1525 | STA KEYS 1526 | JMP SOBJ12 1527 | SOBJK2: LDA KEYS 1528 | ORA #%00000100 ;Add star key 1529 | STA KEYS 1530 | SOBJ12: LDA #MSG_FOUNDKEY 1533 | STA $FC 1534 | JSR PRINT_INFO 1535 | JSR DISPLAY_KEYS 1536 | RTS 1537 | SOBJ15: CMP #129 ;TIME BOMB 1538 | BNE SOBJ17 1539 | LDA TEMP_B 1540 | CLC 1541 | ADC INV_BOMBS 1542 | STA INV_BOMBS 1543 | LDA #MSG_FOUNDBOMB 1546 | STA $FC 1547 | JSR PRINT_INFO 1548 | JSR DISPLAY_ITEM 1549 | RTS 1550 | SOBJ17: CMP #130 ;EMP 1551 | BNE SOBJ20 1552 | LDA TEMP_B 1553 | CLC 1554 | ADC INV_EMP 1555 | STA INV_EMP 1556 | LDA #MSG_FOUNDEMP 1559 | STA $FC 1560 | JSR PRINT_INFO 1561 | JSR DISPLAY_ITEM 1562 | RTS 1563 | SOBJ20: CMP #131 ;PISTOL 1564 | BNE SOBJ21 1565 | LDA TEMP_B 1566 | CLC 1567 | ADC AMMO_PISTOL 1568 | STA AMMO_PISTOL 1569 | BCC SOBJ2A ;If we rolled over past 255 1570 | LDA #255 ;set it to 255. 1571 | STA AMMO_PISTOL 1572 | SOBJ2A: LDA #MSG_FOUNDGUN 1575 | STA $FC 1576 | JSR PRINT_INFO 1577 | JSR DISPLAY_WEAPON 1578 | SOBJ21: CMP #132 ;PLASMA GUN 1579 | BNE SOBJ22 1580 | LDA TEMP_B 1581 | CLC 1582 | ADC AMMO_PLASMA 1583 | STA AMMO_PLASMA 1584 | LDA #MSG_FOUNDPLAS 1587 | STA $FC 1588 | JSR PRINT_INFO 1589 | JSR DISPLAY_WEAPON 1590 | SOBJ22: CMP #133 ;MEDKIT 1591 | BNE SOBJ23 1592 | LDA TEMP_B 1593 | CLC 1594 | ADC INV_MEDKIT 1595 | STA INV_MEDKIT 1596 | LDA #MSG_FOUNDMED 1599 | STA $FC 1600 | JSR PRINT_INFO 1601 | JSR DISPLAY_ITEM 1602 | SOBJ23: CMP #134 ;MAGNET 1603 | BNE SOBJ99 1604 | LDA TEMP_B 1605 | CLC 1606 | ADC INV_MAGNET 1607 | STA INV_MAGNET 1608 | LDA #MSG_FOUNDMAG 1611 | STA $FC 1612 | JSR PRINT_INFO 1613 | JSR DISPLAY_ITEM 1614 | SOBJ99: ;ADD CODE HERE FOR OTHER OBJECT TYPES 1615 | RTS 1616 | SEARCHBAR !BYTE 00 ;to count how many periods to display. 1617 | 1618 | ;combines cursor location with window location 1619 | ;to determine coordinates for MAP_X and MAP_Y 1620 | CALC_COORDINATES: 1621 | LDA CURSOR_X 1622 | CLC 1623 | ADC MAP_WINDOW_X 1624 | STA MAP_X 1625 | LDA CURSOR_Y 1626 | CLC 1627 | ADC MAP_WINDOW_Y 1628 | STA MAP_Y 1629 | RTS 1630 | 1631 | ;This routine is called by routines such as the move, search, 1632 | ;or use commands. It displays a cursor and allows the user 1633 | ;to pick a direction of an object. 1634 | USER_SELECT_OBJECT: 1635 | LDA #16 ;beep sound 1636 | JSR PLAY_SOUND ;SOUND PLAY 1637 | LDA #5 1638 | STA CURSOR_X 1639 | LDA #3 1640 | STA CURSOR_Y 1641 | LDA #1 1642 | STA CURSOR_ON 1643 | JSR REVERSE_TILE 1644 | ;First ask user which object to move 1645 | MV01: JSR PET_SCREEN_SHAKE 1646 | JSR BACKGROUND_TASKS 1647 | LDA UNIT_TYPE 1648 | CMP #0 ;Did player die wile moving something? 1649 | BNE MVCONT 1650 | LDA #0 1651 | STA CURSOR_ON 1652 | RTS 1653 | MVCONT: LDA CONTROL 1654 | CMP #2 1655 | BNE MV01A 1656 | JMP MVSNES 1657 | MV01A: JSR $FFE4 1658 | CMP #$00 1659 | BEQ MV02 1660 | MV02: CMP #$1D ;CURSOR RIGHT 1661 | BNE MV03 1662 | INC CURSOR_X 1663 | RTS 1664 | MV03: CMP #$9D ;CURSOR LEFT 1665 | BNE MV04 1666 | DEC CURSOR_X 1667 | RTS 1668 | MV04: CMP #$11 ;CURSOR DOWN 1669 | BNE MV05 1670 | INC CURSOR_Y 1671 | RTS 1672 | MV05: CMP #$91 ;CURSOR UP 1673 | BNE MV06 1674 | DEC CURSOR_Y 1675 | RTS 1676 | MV06: CMP KEY_MOVE_LEFT 1677 | BNE MV07 1678 | DEC CURSOR_X 1679 | RTS 1680 | MV07: CMP KEY_MOVE_DOWN 1681 | BNE MV08 1682 | INC CURSOR_Y 1683 | RTS 1684 | MV08: CMP KEY_MOVE_RIGHT 1685 | BNE MV09 1686 | INC CURSOR_X 1687 | RTS 1688 | MV09: CMP KEY_MOVE_UP 1689 | BNE MV0A 1690 | DEC CURSOR_Y 1691 | RTS 1692 | MV0A: JMP MV01 1693 | 1694 | MVSNES: ;SNES controls for this routine 1695 | JSR SNES_CONTROLER_READ 1696 | LDA NEW_RIGHT 1697 | CMP #1 1698 | BNE MVS03 1699 | INC CURSOR_X 1700 | LDA #0 1701 | STA NEW_RIGHT 1702 | RTS 1703 | MVS03: LDA NEW_LEFT 1704 | CMP #1 1705 | BNE MVS04 1706 | DEC CURSOR_X 1707 | LDA #0 1708 | STA NEW_LEFT 1709 | RTS 1710 | MVS04: LDA NEW_DOWN 1711 | CMP #1 1712 | BNE MVS05 1713 | INC CURSOR_Y 1714 | LDA #0 1715 | STA NEW_DOWN 1716 | RTS 1717 | MVS05: LDA NEW_UP 1718 | CMP #1 1719 | BNE MVS06 1720 | DEC CURSOR_Y 1721 | LDA #0 1722 | STA NEW_UP 1723 | RTS 1724 | MVS06: JMP MV01 1725 | 1726 | MOVE_OBJECT: 1727 | JSR USER_SELECT_OBJECT 1728 | LDA UNIT 1729 | ;now test that object to see if it 1730 | ;is allowed to be moved. 1731 | MV10: LDA #0 1732 | STA CURSOR_ON 1733 | JSR DRAW_MAP_WINDOW ;ERASE THE CURSOR 1734 | JSR CALC_COORDINATES 1735 | JSR CHECK_FOR_HIDDEN_UNIT 1736 | LDA UNIT_FIND 1737 | STA MOVTEMP_U 1738 | JSR GET_TILE_FROM_MAP 1739 | LDA TILE 1740 | TAY 1741 | LDA TILE_ATTRIB,Y 1742 | AND #%00000100 ;can it be moved? 1743 | CMP #%00000100 1744 | BEQ MV11 1745 | LDA #MSG_CANTMOVE 1748 | STA $FC 1749 | JSR PRINT_INFO 1750 | LDA #11 ;ERROR SOUND 1751 | JSR PLAY_SOUND ;SOUND PLAY 1752 | RTS 1753 | MV11: LDA TILE 1754 | STA MOVTEMP_O ;Store which tile it is we are moving 1755 | LDA MAP_X 1756 | STA MOVTEMP_X ;Store original location of object 1757 | LDA MAP_Y 1758 | STA MOVTEMP_Y 1759 | LDA #1 1760 | STA CURSOR_ON 1761 | JSR REVERSE_TILE 1762 | ;NOW ASK THE USER WHICH DIRECTION TO MOVE IT TO 1763 | MV15: JSR PET_SCREEN_SHAKE 1764 | JSR BACKGROUND_TASKS 1765 | LDA UNIT_TYPE 1766 | CMP #0 ;Did player die wile moving something? 1767 | BNE MVCONT2 1768 | LDA #0 1769 | STA CURSOR_ON 1770 | RTS 1771 | MVCONT2: ;which controller are we using? 1772 | LDA CONTROL 1773 | CMP #2 1774 | BNE MV15B 1775 | JMP SMV30 1776 | MV15B: ;keyboard control 1777 | JSR $FFE4 1778 | CMP #$00 1779 | BEQ MV15 1780 | MV16: CMP #$1D ;CURSOR RIGHT 1781 | BNE MV17 1782 | INC CURSOR_X 1783 | JMP MV25 1784 | MV17: CMP #$9D ;CURSOR LEFT 1785 | BNE MV18 1786 | DEC CURSOR_X 1787 | JMP MV25 1788 | MV18: CMP #$11 ;CURSOR DOWN 1789 | BNE MV19 1790 | INC CURSOR_Y 1791 | JMP MV25 1792 | MV19: CMP #$91 ;CURSOR UP 1793 | BNE MV20 1794 | DEC CURSOR_Y 1795 | JMP MV25 1796 | MV20: CMP KEY_MOVE_LEFT 1797 | BNE MV2A 1798 | DEC CURSOR_X 1799 | JMP MV25 1800 | MV2A: CMP KEY_MOVE_DOWN 1801 | BNE MV2B 1802 | INC CURSOR_Y 1803 | JMP MV25 1804 | MV2B: CMP KEY_MOVE_RIGHT 1805 | BNE MV2C 1806 | INC CURSOR_X 1807 | JMP MV25 1808 | MV2C: CMP KEY_MOVE_UP 1809 | BNE MV2D 1810 | DEC CURSOR_Y 1811 | JMP MV25 1812 | MV2D: JMP MV15 1813 | SMV30: ;SNES controls 1814 | JSR SNES_CONTROLER_READ 1815 | LDA NEW_RIGHT 1816 | CMP #1 1817 | BNE SMV31 1818 | INC CURSOR_X 1819 | LDA #0 1820 | STA NEW_RIGHT 1821 | JMP MV25 1822 | SMV31: LDA NEW_LEFT 1823 | CMP #1 1824 | BNE SMV32 1825 | DEC CURSOR_X 1826 | LDA #0 1827 | STA NEW_LEFT 1828 | JMP MV25 1829 | SMV32: LDA NEW_DOWN 1830 | CMP #1 1831 | BNE SMV33 1832 | INC CURSOR_Y 1833 | LDA #0 1834 | STA NEW_DOWN 1835 | JMP MV25 1836 | SMV33: LDA NEW_UP 1837 | CMP #1 1838 | BNE SMV34 1839 | DEC CURSOR_Y 1840 | LDA #0 1841 | STA NEW_UP 1842 | JMP MV25 1843 | SMV34: JMP MV15 1844 | 1845 | ;NOW TEST TO SEE IF THAT SPOT IS OPEN 1846 | MV25: LDA #0 1847 | STA CURSOR_ON 1848 | JSR DRAW_MAP_WINDOW ;ERASE THE CURSOR 1849 | LDA CURSOR_X 1850 | CLC 1851 | ADC MAP_WINDOW_X 1852 | STA MAP_X 1853 | STA MOVTEMP_UX 1854 | LDA CURSOR_Y 1855 | CLC 1856 | ADC MAP_WINDOW_Y 1857 | STA MAP_Y 1858 | STA MOVTEMP_UY 1859 | JSR GET_TILE_FROM_MAP 1860 | LDA TILE 1861 | TAY 1862 | LDA TILE_ATTRIB,Y 1863 | AND #%00100000 ;is that spot available 1864 | CMP #%00100000 ;for something to move onto it? 1865 | BEQ MV30 1866 | JMP MV3A ;If not, then exit routine. 1867 | MV30: ;Now scan for any units at that location: 1868 | JSR CHECK_FOR_UNIT 1869 | LDA UNIT_FIND 1870 | CMP #255 ;255 means no unit found. 1871 | BEQ MV31 1872 | MV3A: LDA #MSG_BLOCKED 1875 | STA $FC 1876 | JSR PRINT_INFO 1877 | LDA #11 ;ERROR SOUND 1878 | JSR PLAY_SOUND ;SOUND PLAY 1879 | RTS 1880 | MV31: LDA #06 ;move sound 1881 | JSR PLAY_SOUND ;SOUND PLAY 1882 | LDY #0 1883 | LDA ($FD),Y ;Grab current object 1884 | STA MOVTEMP_D 1885 | LDA MOVTEMP_O 1886 | STA ($FD),Y ;replace with obect we are moving 1887 | LDA MOVTEMP_X ;RETRIEVE original location of object 1888 | STA MAP_X 1889 | LDA MOVTEMP_Y 1890 | STA MAP_Y 1891 | JSR GET_TILE_FROM_MAP 1892 | LDA MOVTEMP_D 1893 | CMP #148 ;trash compactor tile 1894 | BNE MV31A 1895 | LDA #09 ;Floor tile 1896 | MV31A: STA ($FD),Y ;Replace former location 1897 | LDA #1 1898 | STA REDRAW_WINDOW ;See the result 1899 | LDA MOVTEMP_U 1900 | CMP #255 1901 | BNE MV32 1902 | RTS 1903 | MV32: LDX MOVTEMP_U 1904 | LDA MOVTEMP_UX 1905 | STA UNIT_LOC_X,X 1906 | LDA MOVTEMP_UY 1907 | STA UNIT_LOC_Y,X 1908 | RTS 1909 | MOVTEMP_O: !BYTE 00 ;origin tile 1910 | MOVTEMP_D: !BYTE 00 ;destination tile 1911 | MOVTEMP_X: !BYTE 00 ;x-coordinate 1912 | MOVTEMP_Y: !BYTE 00 ;y-coordinate 1913 | MOVTEMP_U: !BYTE 00 ;unit number (255=none) 1914 | MOVTEMP_UX !BYTE 00 1915 | MOVTEMP_UY !BYTE 00 1916 | 1917 | CACULATE_AND_REDRAW: 1918 | LDA UNIT_LOC_X ;no index needed since it's player unit 1919 | SEC 1920 | SBC #5 1921 | STA MAP_WINDOW_X 1922 | LDA UNIT_LOC_Y ;no index needed since it's player unit 1923 | SEC 1924 | SBC #3 1925 | STA MAP_WINDOW_Y 1926 | LDA #1 1927 | STA REDRAW_WINDOW 1928 | RTS 1929 | 1930 | ;This routine checks all units from 0 to 31 and figures out if it should be dislpayed 1931 | ;on screen, and then grabs that unit's tile and stores it in the MAP_PRECALC array 1932 | ;so that when the window is drawn, it does not have to search for units during the 1933 | ;draw, speeding up the display routine. 1934 | MAP_PRE_CALCULATE: 1935 | ;CLEAR OLD BUFFER 1936 | LDA #0 1937 | LDY #0 1938 | PREC0: STA MAP_PRECALC,Y 1939 | INY 1940 | CPY #77 1941 | BNE PREC0 1942 | LDX #0 1943 | JMP PREC2 ;skip the check for unit zero, always draw it. 1944 | PREC1: ;CHECK THAT UNIT EXISTS 1945 | LDA UNIT_TYPE,X 1946 | CMP #0 1947 | BEQ PREC5 1948 | ;CHECK HORIZONTAL POSITION 1949 | LDA UNIT_LOC_X,X 1950 | CMP MAP_WINDOW_X 1951 | BCC PREC5 1952 | LDA MAP_WINDOW_X 1953 | CLC 1954 | ADC #10 1955 | CMP UNIT_LOC_X,X 1956 | BCC PREC5 1957 | ;NOW CHECK VERTICAL 1958 | LDA UNIT_LOC_Y,X 1959 | CMP MAP_WINDOW_Y 1960 | BCC PREC5 1961 | LDA MAP_WINDOW_Y 1962 | CLC 1963 | ADC #6 1964 | CMP UNIT_LOC_Y,X 1965 | BCC PREC5 1966 | ;Unit found in map window, now add that unit's 1967 | ;tile to the precalc map. 1968 | PREC2: LDA UNIT_LOC_Y,X 1969 | SEC 1970 | SBC MAP_WINDOW_Y 1971 | TAY 1972 | LDA UNIT_LOC_X,X 1973 | SEC 1974 | SBC MAP_WINDOW_X 1975 | CLC 1976 | ADC PRECALC_ROWS,Y 1977 | TAY 1978 | LDA UNIT_TILE,X 1979 | CMP #130 ;is it a bomb 1980 | BEQ PREC6 1981 | CMP #134 ;is it a magnet? 1982 | BEQ PREC6 1983 | PREC4: STA MAP_PRECALC,Y 1984 | PREC5: ;continue search 1985 | INX 1986 | CPX #32 1987 | BNE PREC1 1988 | RTS 1989 | PREC6: ;What to do in case of bomb or magnet that should 1990 | ;go underneath the unit or robot. 1991 | LDA MAP_PRECALC,Y 1992 | CMP #0 1993 | BNE PREC5 1994 | LDA UNIT_TILE,X 1995 | JMP PREC4 1996 | 1997 | PRECALC_ROWS: !BYTE 0,11,22,33,44,55,66 1998 | 1999 | ;This routine is where the MAP is displayed on the screen 2000 | ;This is a temporary routine, taken from the map editor. 2001 | DRAW_MAP_WINDOW: 2002 | JSR MAP_PRE_CALCULATE 2003 | LDA #0 2004 | STA REDRAW_WINDOW 2005 | STA TEMP_X 2006 | STA TEMP_Y 2007 | STA PRECALC_COUNT 2008 | DM01: ;FIRST CALCULATE WHERE THE BYTE IS STORED IN THE MAP 2009 | LDY #0 2010 | LDA TEMP_Y 2011 | CLC 2012 | ADC MAP_WINDOW_Y 2013 | ROR 2014 | PHP 2015 | CLC 2016 | ADC #>MAP 2017 | STA $FE ;HIGH BYTE OF MAP SOURCE 2018 | LDA #$0 2019 | PLP 2020 | ROR 2021 | CLC 2022 | ADC TEMP_X 2023 | ADC MAP_WINDOW_X 2024 | STA $FD ;LOW BYTE OF MAP SOURCE 2025 | LDA ($FD),Y 2026 | STA TILE 2027 | ;NOW FIGURE OUT WHERE TO PLACE IT ON SCREEN. 2028 | LDX TEMP_Y 2029 | LDA MAP_CHART_L,X 2030 | STA $FB ;LOW BYTE OF SCREEN AREA 2031 | LDA MAP_CHART_H,X 2032 | STA $FC ;HIGH BYTE OF SCREEN AREA 2033 | LDA TEMP_X 2034 | ASL ;MULTIPLY BY 2 2035 | CLC 2036 | ADC TEMP_X ;ADD ANOTHER TO MAKE X3 2037 | ADC $FB 2038 | STA $FB 2039 | LDA $FC 2040 | ADC #00 ;CARRY FLAG 2041 | STA $FC 2042 | JSR PLOT_TILE 2043 | ;now check for sprites in this location 2044 | LDY PRECALC_COUNT 2045 | LDA MAP_PRECALC,Y 2046 | CMP #00 2047 | BEQ DM02 2048 | STA TILE 2049 | LDX TEMP_Y 2050 | LDA MAP_CHART_L,X 2051 | STA $FB ;LOW BYTE OF SCREEN AREA 2052 | LDA MAP_CHART_H,X 2053 | STA $FC ;HIGH BYTE OF SCREEN AREA 2054 | LDA TEMP_X 2055 | ASL ;MULTIPLY BY 2 2056 | CLC 2057 | ADC TEMP_X ;ADD ANOTHER TO MAKE X3 2058 | ADC $FB 2059 | STA $FB 2060 | LDA $FC 2061 | ADC #00 ;CARRY FLAG 2062 | STA $FC 2063 | JSR PLOT_TRANSPARENT_TILE 2064 | DM02: INC TEMP_X 2065 | INC PRECALC_COUNT 2066 | LDA TEMP_X 2067 | CMP #11 2068 | BNE DM01 2069 | ;CHECK FOR CURSOR 2070 | DM03: LDA CURSOR_ON 2071 | CMP #1 ;Is cursor even on? 2072 | BNE DM04 2073 | LDA TEMP_Y 2074 | CMP CURSOR_Y ;is cursor on the same row that were drawing? 2075 | BNE DM04 2076 | JSR REVERSE_TILE 2077 | DM04: LDA #0 2078 | STA TEMP_X 2079 | INC TEMP_Y 2080 | LDA TEMP_Y 2081 | CMP #7 2082 | BEQ DM10 2083 | JMP DM01 2084 | DM10: RTS 2085 | 2086 | ;This routine plots a 3x3 tile from the tile database anywhere 2087 | ;on screen. But first you must define the tile number in the 2088 | ;TILE variable, as well as the starting screen address must 2089 | ;be defined in $FB. 2090 | PLOT_TILE: 2091 | LDX TILE 2092 | ;DRAW THE TOP 3 CHARACTERS 2093 | LDA TILE_DATA_TL,X 2094 | LDY #0 2095 | STA ($FB),Y 2096 | LDA TILE_DATA_TM,X 2097 | INY 2098 | STA ($FB),Y 2099 | LDA TILE_DATA_TR,X 2100 | INY 2101 | STA ($FB),Y 2102 | ;MOVE DOWN TO NEXT LINE 2103 | ; LDA $FB 2104 | ; CLC 2105 | ; ADC #40 2106 | ; STA $FB 2107 | ; LDA $FC 2108 | ; ADC #00 2109 | ; STA $FC 2110 | ;DRAW THE MIDDLE 3 CHARACTERS 2111 | LDA TILE_DATA_ML,X 2112 | LDY #40 2113 | STA ($FB),Y 2114 | LDA TILE_DATA_MM,X 2115 | INY 2116 | STA ($FB),Y 2117 | LDA TILE_DATA_MR,X 2118 | INY 2119 | STA ($FB),Y 2120 | ;MOVE DOWN TO NEXT LINE 2121 | ; LDA $FB 2122 | ; CLC 2123 | ; ADC #40 2124 | ; STA $FB 2125 | ; LDA $FC 2126 | ; ADC #00 2127 | ; STA $FC 2128 | ;DRAW THE BOTTOM 3 CHARACTERS 2129 | LDA TILE_DATA_BL,X 2130 | LDY #80 2131 | STA ($FB),Y 2132 | LDA TILE_DATA_BM,X 2133 | INY 2134 | STA ($FB),Y 2135 | LDA TILE_DATA_BR,X 2136 | INY 2137 | STA ($FB),Y 2138 | RTS 2139 | 2140 | ;This routine plots a transparent tile from the tile database 2141 | ;anywhere on screen. But first you must define the tile number 2142 | ;in the TILE variable, as well as the starting screen address must 2143 | ;be defined in $FB. Also, this routine is slower than the usual 2144 | ;tile routine, so is only used for sprites. The ":" character ($3A) 2145 | ;is not drawn. 2146 | PLOT_TRANSPARENT_TILE: 2147 | LDX TILE 2148 | ;DRAW THE TOP 3 CHARACTERS 2149 | LDA TILE_DATA_TL,X 2150 | LDY #0 2151 | CMP #$3A 2152 | BEQ PTT01 2153 | STA ($FB),Y 2154 | PTT01: LDA TILE_DATA_TM,X 2155 | INY 2156 | CMP #$3A 2157 | BEQ PTT02 2158 | STA ($FB),Y 2159 | PTT02: LDA TILE_DATA_TR,X 2160 | INY 2161 | CMP #$3A 2162 | BEQ PTT03 2163 | STA ($FB),Y 2164 | ;MOVE DOWN TO NEXT LINE 2165 | PTT03: ;LDA $FB 2166 | ;CLC 2167 | ;ADC #40 2168 | ;STA $FB 2169 | ;LDA $FC 2170 | ;ADC #00 2171 | ;STA $FC 2172 | ;DRAW THE MIDDLE 3 CHARACTERS 2173 | LDA TILE_DATA_ML,X 2174 | LDY #40 2175 | CMP #$3A 2176 | BEQ PTT04 2177 | STA ($FB),Y 2178 | PTT04: LDA TILE_DATA_MM,X 2179 | INY 2180 | CMP #$3A 2181 | BEQ PTT05 2182 | STA ($FB),Y 2183 | PTT05: LDA TILE_DATA_MR,X 2184 | INY 2185 | CMP #$3A 2186 | BEQ PTT06 2187 | STA ($FB),Y 2188 | ;MOVE DOWN TO NEXT LINE 2189 | PTT06: ;LDA $FB 2190 | ;CLC 2191 | ;ADC #40 2192 | ;STA $FB 2193 | ;LDA $FC 2194 | ;ADC #00 2195 | ;STA $FC 2196 | ;DRAW THE BOTTOM 3 CHARACTERS 2197 | LDA TILE_DATA_BL,X 2198 | LDY #80 2199 | CMP #$3A 2200 | BEQ PTT07 2201 | STA ($FB),Y 2202 | PTT07: LDA TILE_DATA_BM,X 2203 | INY 2204 | CMP #$3A 2205 | BEQ PTT08 2206 | STA ($FB),Y 2207 | PTT08: LDA TILE_DATA_BR,X 2208 | INY 2209 | CMP #$3A 2210 | BEQ PTT09 2211 | STA ($FB),Y 2212 | PTT09: RTS 2213 | 2214 | REVERSE_TILE: 2215 | LDX CURSOR_Y 2216 | LDA MAP_CHART_L,X 2217 | STA $FB ;LOW BYTE OF SCREEN AREA 2218 | LDA MAP_CHART_H,X 2219 | STA $FC ;HIGH BYTE OF SCREEN AREA 2220 | LDA CURSOR_X 2221 | ASL ;MULTIPLY BY 2 2222 | CLC 2223 | ADC CURSOR_X ;ADD ANOTHER TO MAKE X3 2224 | ADC $FB 2225 | STA $FB 2226 | LDA $FC 2227 | ADC #00 ;CARRY FLAG 2228 | STA $FC 2229 | LDY #00 2230 | LDA ($FB),Y 2231 | EOR #%10000000 2232 | STA ($FB),Y 2233 | INY 2234 | LDA ($FB),Y 2235 | EOR #%10000000 2236 | STA ($FB),Y 2237 | INY 2238 | LDA ($FB),Y 2239 | EOR #%10000000 2240 | STA ($FB),Y 2241 | ; TYA 2242 | ; CLC 2243 | ; ADC #38 2244 | ; TAY 2245 | LDY #40 2246 | LDA ($FB),Y 2247 | EOR #%10000000 2248 | STA ($FB),Y 2249 | INY 2250 | LDA ($FB),Y 2251 | EOR #%10000000 2252 | STA ($FB),Y 2253 | INY 2254 | LDA ($FB),Y 2255 | EOR #%10000000 2256 | STA ($FB),Y 2257 | ; TYA 2258 | ; CLC 2259 | ; ADC #38 2260 | ; TAY 2261 | LDY #80 2262 | LDA ($FB),Y 2263 | EOR #%10000000 2264 | STA ($FB),Y 2265 | INY 2266 | LDA ($FB),Y 2267 | EOR #%10000000 2268 | STA ($FB),Y 2269 | INY 2270 | LDA ($FB),Y 2271 | EOR #%10000000 2272 | STA ($FB),Y 2273 | RTS 2274 | 2275 | ;This routine checks to see if UNIT is occupying any space 2276 | ;that is currently visible in the window. If so, the 2277 | ;flag for redrawing the window will be set. 2278 | CHECK_FOR_WINDOW_REDRAW: 2279 | LDX UNIT 2280 | ;FIRST CHECK HORIZONTAL 2281 | LDA UNIT_LOC_X,X 2282 | CMP MAP_WINDOW_X 2283 | BCC CFR1 2284 | LDA MAP_WINDOW_X 2285 | CLC 2286 | ADC #10 2287 | CMP UNIT_LOC_X,X 2288 | BCC CFR1 2289 | ;NOW CHECK VERTICAL 2290 | LDA UNIT_LOC_Y,X 2291 | CMP MAP_WINDOW_Y 2292 | BCC CFR1 2293 | LDA MAP_WINDOW_Y 2294 | CLC 2295 | ADC #6 2296 | CMP UNIT_LOC_Y,X 2297 | BCC CFR1 2298 | LDA #1 2299 | STA REDRAW_WINDOW 2300 | CFR1: RTS 2301 | 2302 | DECWRITE: 2303 | LDA #$00 2304 | STA SCREENPOS 2305 | LDA DECNUM 2306 | LDX #2 2307 | LDY #$4C 2308 | DEC1: STY DECB 2309 | LSR 2310 | DEC2: ROL 2311 | BCS DEC3 2312 | CMP DECA,X 2313 | BCC DEC4 2314 | DEC3: SBC DECA,X 2315 | SEC 2316 | DEC4: ROL DECB 2317 | BCC DEC2 2318 | STA DECTEMP 2319 | LDA DECB 2320 | LDY SCREENPOS 2321 | STA ($FB),Y 2322 | INC SCREENPOS 2323 | LDA DECTEMP 2324 | LDY #$13 2325 | DEX 2326 | BPL DEC1 2327 | RTS 2328 | DECA !BYTE 128,160,200 2329 | DECB !BYTE 1 2330 | SCREENPOS !BYTE $00 2331 | DECTEMP !BYTE $00 2332 | 2333 | ; The following routine loads the tileset from disk 2334 | TILE_LOAD_ROUTINE: 2335 | LDA #11 ;LENGTH OF FILENAME 2336 | STA $D1 ;LENGTH OF FILENAME 2337 | LDA #TILENAME 2340 | STA $DB ;HIGH BYTE OF FILENAME 2341 | LDA #08 ;DEVICE NUMBER 8 2342 | STA $D4 ;DEVICE NUMBER 2343 | LDA #$00 2344 | STA $9D ;load/verify (0=load 1=verify) 2345 | LDR1: JSR $F356 ;LOAD ROUTINE (USE $F322 IN BASIC 2) 2346 | RTS 2347 | ; The following routine loads the tileset from disk 2348 | 2349 | ;SOUND_LOAD_ROUTINE: 2350 | ; LDA #8 ;LENGTH OF FILENAME 2351 | ; STA $D1 ;LENGTH OF FILENAME 2352 | ; LDA #SNDNAME 2355 | ; STA $DB ;HIGH BYTE OF FILENAME 2356 | ; LDA #08 ;DEVICE NUMBER 8 2357 | ; STA $D4 ;DEVICE NUMBER 2358 | ; LDA #$00 2359 | ; STA $9D ;load/verify (0=load 1=verify) 2360 | ; JSR $F356 ;LOAD ROUTINE (USE $F322 IN BASIC 2) 2361 | ; RTS 2362 | 2363 | ; The following routine loads the map from disk 2364 | MAP_LOAD_ROUTINE: 2365 | LDA #7 ;LENGTH OF FILENAME 2366 | STA $D1 ;LENGTH OF FILENAME 2367 | LDA #MAPNAME 2370 | STA $DB ;HIGH BYTE OF FILENAME 2371 | LDA #08 ;DEVICE NUMBER 8 2372 | STA $D4 ;DEVICE NUMBER 2373 | LDA #$00 2374 | STA $9D ;load/verify (0=load 1=verify) 2375 | LDR2: JSR $F356 ;LOAD ROUTINE (USE $F322 IN BASIC 2) 2376 | RTS 2377 | 2378 | DISPLAY_GAME_SCREEN: 2379 | LDA #SCR_TEXT 2382 | STA $FC 2383 | JSR DECOMPRESS_SCREEN 2384 | RTS 2385 | 2386 | DISPLAY_INTRO_SCREEN: 2387 | LDA #INTRO_TEXT 2390 | STA $FC 2391 | JSR DECOMPRESS_SCREEN 2392 | RTS 2393 | 2394 | DISPLAY_ENDGAME_SCREEN: 2395 | LDA #SCR_ENDGAME 2398 | STA $FC 2399 | JSR DECOMPRESS_SCREEN 2400 | ;display map name 2401 | JSR CALC_MAP_NAME 2402 | DEG3: LDA ($FB),Y 2403 | STA $812E,Y 2404 | INY 2405 | CPY #16 2406 | BNE DEG3 2407 | ;display elapsed time 2408 | LDA HOURS 2409 | STA DECNUM 2410 | LDA #$81 2411 | STA $FC 2412 | LDA #$7D 2413 | STA $FB 2414 | JSR DECWRITE 2415 | LDA MINUTES 2416 | STA DECNUM 2417 | LDA #$81 2418 | STA $FC 2419 | LDA #$80 2420 | STA $FB 2421 | JSR DECWRITE 2422 | LDA SECONDS 2423 | STA DECNUM 2424 | LDA #$81 2425 | STA $FC 2426 | LDA #$83 2427 | STA $FB 2428 | JSR DECWRITE 2429 | LDA #32 ;SPACE 2430 | STA $817D 2431 | LDA #58 ;COLON 2432 | STA $8180 2433 | STA $8183 2434 | ;count robots remaining 2435 | LDX #1 2436 | LDA #0 2437 | STA DECNUM 2438 | DEG7: LDA UNIT_TYPE,X 2439 | CMP #0 2440 | BEQ DEG8 2441 | INC DECNUM 2442 | DEG8: INX 2443 | CPX #28 2444 | BNE DEG7 2445 | LDA #$81 2446 | STA $FC 2447 | LDA #$CE 2448 | STA $FB 2449 | JSR DECWRITE 2450 | ;Count secrets remaining 2451 | LDA #0 2452 | STA DECNUM 2453 | LDX #48 2454 | DEG9: LDA UNIT_TYPE,X 2455 | CMP #0 2456 | BEQ DEG10 2457 | INC DECNUM 2458 | DEG10: INX 2459 | CPX #64 2460 | BNE DEG9 2461 | LDA #$82 2462 | STA $FC 2463 | LDA #$1E 2464 | STA $FB 2465 | JSR DECWRITE 2466 | ;display difficulty level 2467 | LDY DIFF_LEVEL 2468 | LDA DIFF_LEVEL_LEN,Y 2469 | TAY 2470 | LDX #0 2471 | DEG11: LDA DIFF_LEVEL_WORDS,Y 2472 | CMP #0 2473 | BEQ DEG12 2474 | STA $826E,X 2475 | INY 2476 | INX 2477 | JMP DEG11 2478 | DEG12: RTS 2479 | 2480 | DIFF_LEVEL_WORDS: 2481 | !SCR "easy",0,"normal",0,"hard",0 2482 | DIFF_LEVEL_LEN: 2483 | !BYTE 0,5,12 2484 | 2485 | DECOMPRESS_SCREEN: 2486 | LDA #$00 2487 | STA $FD 2488 | LDA #$80 2489 | STA $FE 2490 | LDY #00 2491 | DGS1: LDA ($FB),Y 2492 | CMP #96 ;REPEAT FLAG 2493 | BEQ DGS10 2494 | DGS2: STA ($FD),Y 2495 | ;CHECK TO SEE IF WE REACHED $83E7 YET. 2496 | DGS4: LDA $FE 2497 | CMP #$83 2498 | BNE DGS3 2499 | LDA $FD 2500 | CMP #$E7 2501 | BNE DGS3 2502 | RTS 2503 | DGS3: JSR INC_SOURCE 2504 | JSR INC_DEST 2505 | JMP DGS1 2506 | DGS10: ;REPEAT CODE 2507 | JSR INC_SOURCE 2508 | LDA ($FB),Y 2509 | STA RPT 2510 | JSR INC_SOURCE 2511 | LDA ($FB),Y 2512 | TAX 2513 | DGS11: LDA RPT 2514 | STA ($FD),Y 2515 | JSR INC_DEST 2516 | DEX 2517 | CPX #$FF 2518 | BNE DGS11 2519 | LDA $FD 2520 | SEC 2521 | SBC #01 2522 | STA $FD 2523 | LDA $FE 2524 | SBC #00 2525 | STA $FE 2526 | JMP DGS4 2527 | INC_SOURCE: 2528 | LDA $FB 2529 | CLC 2530 | ADC #01 2531 | STA $FB 2532 | LDA $FC 2533 | ADC #00 2534 | STA $FC 2535 | RTS 2536 | INC_DEST: 2537 | LDA $FD 2538 | CLC 2539 | ADC #01 2540 | STA $FD 2541 | LDA $FE 2542 | ADC #00 2543 | STA $FE 2544 | RTS 2545 | RPT !BYTE 00 ;repeat value 2546 | 2547 | DISPLAY_PLAYER_HEALTH: 2548 | LDA UNIT_HEALTH ;No index needed because it is the player 2549 | LSR ;divide by two 2550 | STA TEMP_A 2551 | LDY #00 2552 | DPH01: CPY TEMP_A 2553 | BEQ DPH02 2554 | LDA #$66 ;GRAY BLOCK 2555 | STA $83BA,Y 2556 | INY 2557 | JMP DPH01 2558 | DPH02: LDA UNIT_HEALTH 2559 | AND #%00000001 2560 | CMP #%00000001 2561 | BNE DPH03 2562 | LDA #$5C ;HALF GRAY BLOCK 2563 | STA $83BA,Y 2564 | INY 2565 | DPH03: CPY #6 2566 | BEQ DPH04 2567 | LDA #$20 ;SPACE 2568 | STA $83BA,Y 2569 | INY 2570 | JMP DPH03 2571 | DPH04: RTS 2572 | 2573 | CYCLE_ITEM: 2574 | LDA #13 ;CHANGE-ITEM-SOUND 2575 | JSR PLAY_SOUND ;SOUND PLAY 2576 | LDA SELECT_TIMEOUT 2577 | CMP #0 2578 | BEQ CYIT0 2579 | RTS 2580 | CYIT0: LDA #3 2581 | STA SELECT_TIMEOUT ;RESET THE TIMEOUT 2582 | LDA #20 2583 | STA KEYTIMER 2584 | INC SELECTED_ITEM 2585 | LDA SELECTED_ITEM 2586 | CMP #5 2587 | BEQ CYIT1 2588 | JMP DISPLAY_ITEM 2589 | CYIT1: LDA #0 2590 | STA SELECTED_ITEM 2591 | JMP DISPLAY_ITEM 2592 | 2593 | DISPLAY_ITEM: 2594 | JSR PRESELECT_ITEM 2595 | DSIT00: LDA SELECTED_ITEM 2596 | CMP #0 ;no items to show 2597 | BNE DSIT01 2598 | ;add routine to draw blank space 2599 | RTS 2600 | DSIT01: CMP #5 ;number too high! 2601 | BNE DSIT0A 2602 | LDA #0 2603 | STA SELECTED_ITEM 2604 | RTS 2605 | DSIT0A: CMP #1 ;bomb 2606 | BNE DSIT03 2607 | LDA INV_BOMBS 2608 | CMP #0 ;did we run out? 2609 | BNE DSIT02 2610 | INC SELECTED_ITEM 2611 | JMP DSIT00 2612 | DSIT02: JSR DISPLAY_TIMEBOMB 2613 | RTS 2614 | DSIT03: CMP #2 ;emp 2615 | BNE DSIT05 2616 | LDA INV_EMP 2617 | CMP #0 ;did we run out? 2618 | BNE DSIT04 2619 | INC SELECTED_ITEM 2620 | JMP DSIT00 2621 | DSIT04: JSR DISPLAY_EMP 2622 | RTS 2623 | DSIT05: CMP #3 ;medkit 2624 | BNE DSIT07 2625 | LDA INV_MEDKIT 2626 | CMP #0 ;did we run out? 2627 | BNE DSIT06 2628 | INC SELECTED_ITEM 2629 | JMP DSIT00 2630 | DSIT06: JSR DISPLAY_MEDKIT 2631 | RTS 2632 | DSIT07: CMP #4 ;magnet 2633 | BNE DSIT09 2634 | LDA INV_MAGNET 2635 | CMP #0 ;did we run out? 2636 | BNE DSIT08 2637 | INC SELECTED_ITEM 2638 | JMP DSIT09 2639 | DSIT08: JSR DISPLAY_MAGNET 2640 | RTS 2641 | DSIT09: LDA #0 2642 | STA SELECTED_ITEM 2643 | JSR PRESELECT_ITEM 2644 | JMP DISPLAY_ITEM 2645 | 2646 | ;This routine checks to see if currently selected 2647 | ;item is zero. And if it is, then it checks inventories 2648 | ;of other items to decide which item to automatically 2649 | ;select for the user. 2650 | PRESELECT_ITEM: 2651 | LDA SELECTED_ITEM 2652 | CMP #0 ;If item already selected, return 2653 | BEQ PRSI01 2654 | RTS 2655 | PRSI01: LDA INV_BOMBS 2656 | CMP #0 2657 | BEQ PRSI02 2658 | LDA #1 ;BOMB 2659 | STA SELECTED_ITEM 2660 | RTS 2661 | PRSI02: LDA INV_EMP 2662 | CMP #0 2663 | BEQ PRSI03 2664 | LDA #2 ;EMP 2665 | STA SELECTED_ITEM 2666 | RTS 2667 | PRSI03: LDA INV_MEDKIT 2668 | CMP #0 2669 | BEQ PRSI04 2670 | LDA #3 ;MEDKIT 2671 | STA SELECTED_ITEM 2672 | RTS 2673 | PRSI04: LDA INV_MAGNET 2674 | CMP #0 2675 | BEQ PRSI05 2676 | LDA #4 ;MAGNET 2677 | STA SELECTED_ITEM 2678 | RTS 2679 | PRSI05: ;Nothing found in inventory at this point, so set 2680 | ;selected-item to zero. 2681 | LDA #0 ;nothing in inventory 2682 | STA SELECTED_ITEM 2683 | JSR DISPLAY_BLANK_ITEM 2684 | RTS 2685 | 2686 | DISPLAY_TIMEBOMB: 2687 | LDY #0 2688 | DTB1: LDA TBOMB1A,Y 2689 | STA $8162,Y 2690 | LDA TBOMB1B,Y 2691 | STA $818A,Y 2692 | LDA TBOMB1C,Y 2693 | STA $81B2,Y 2694 | LDA TBOMB1D,Y 2695 | STA $81DA,Y 2696 | INY 2697 | CPY #6 2698 | BNE DTB1 2699 | LDA INV_BOMBS 2700 | STA DECNUM 2701 | LDA #$05 2702 | STA $FB 2703 | LDA #$82 2704 | STA $FC 2705 | JSR DECWRITE 2706 | RTS 2707 | 2708 | DISPLAY_EMP: 2709 | LDY #0 2710 | DEM1: LDA EMP1A,Y 2711 | STA $8162,Y 2712 | LDA EMP1B,Y 2713 | STA $818A,Y 2714 | LDA EMP1C,Y 2715 | STA $81B2,Y 2716 | LDA EMP1D,Y 2717 | STA $81DA,Y 2718 | INY 2719 | CPY #6 2720 | BNE DEM1 2721 | LDA INV_EMP 2722 | STA DECNUM 2723 | LDA #$05 2724 | STA $FB 2725 | LDA #$82 2726 | STA $FC 2727 | JSR DECWRITE 2728 | RTS 2729 | 2730 | DISPLAY_MEDKIT: 2731 | LDY #0 2732 | DMK1: LDA MED1A,Y 2733 | STA $8162,Y 2734 | LDA MED1B,Y 2735 | STA $818A,Y 2736 | LDA MED1C,Y 2737 | STA $81B2,Y 2738 | LDA MED1D,Y 2739 | STA $81DA,Y 2740 | INY 2741 | CPY #6 2742 | BNE DMK1 2743 | LDA INV_MEDKIT 2744 | STA DECNUM 2745 | LDA #$05 2746 | STA $FB 2747 | LDA #$82 2748 | STA $FC 2749 | JSR DECWRITE 2750 | RTS 2751 | 2752 | DISPLAY_MAGNET: 2753 | LDY #0 2754 | DMG1: LDA MAG1A,Y 2755 | STA $8162,Y 2756 | LDA MAG1B,Y 2757 | STA $818A,Y 2758 | LDA MAG1C,Y 2759 | STA $81B2,Y 2760 | LDA MAG1D,Y 2761 | STA $81DA,Y 2762 | INY 2763 | CPY #6 2764 | BNE DMG1 2765 | LDA INV_MAGNET 2766 | STA DECNUM 2767 | LDA #$05 2768 | STA $FB 2769 | LDA #$82 2770 | STA $FC 2771 | JSR DECWRITE 2772 | RTS 2773 | 2774 | DISPLAY_BLANK_ITEM: 2775 | LDY #0 2776 | DBI1: LDA #32 2777 | STA $8162,Y 2778 | STA $818A,Y 2779 | STA $81B2,Y 2780 | STA $81DA,Y 2781 | STA $8202,Y 2782 | INY 2783 | CPY #6 2784 | BNE DBI1 2785 | RTS 2786 | 2787 | CYCLE_WEAPON: 2788 | LDA #12 ;CHANGE WEAPON-SOUND 2789 | JSR PLAY_SOUND ;SOUND PLAY 2790 | LDA SELECT_TIMEOUT 2791 | CMP #0 2792 | BEQ CYWE0 2793 | RTS 2794 | CYWE0: LDA #3 2795 | STA SELECT_TIMEOUT ;RESET THE TIMEOUT 2796 | LDA #20 2797 | STA KEYTIMER 2798 | INC SELECTED_WEAPON 2799 | LDA SELECTED_WEAPON 2800 | CMP #2 2801 | BNE CYWE1 2802 | JMP DISPLAY_WEAPON 2803 | CYWE1: LDA #0 2804 | STA SELECTED_WEAPON 2805 | JMP DISPLAY_WEAPON 2806 | 2807 | DISPLAY_WEAPON: 2808 | JSR PRESELECT_WEAPON 2809 | LDA SELECTED_WEAPON 2810 | CMP #0 ;no weapon to show 2811 | BNE DSWP01 2812 | ;add routine to draw blank space 2813 | RTS 2814 | DSWP01: CMP #1 ;PISTOL 2815 | BNE DSWP03 2816 | LDA AMMO_PISTOL 2817 | CMP #0 ;did we run out? 2818 | BNE DSWP02 2819 | LDA #0 2820 | STA SELECTED_WEAPON 2821 | JMP DISPLAY_WEAPON 2822 | DSWP02: JSR DISPLAY_PISTOL 2823 | RTS 2824 | DSWP03: CMP #2 ;PLASMA GUN 2825 | BNE DSWP05 2826 | LDA AMMO_PLASMA 2827 | CMP #0 ;did we run out? 2828 | BNE DSWP04 2829 | LDA #0 2830 | STA SELECTED_WEAPON 2831 | JMP DISPLAY_WEAPON 2832 | DSWP04: JSR DISPLAY_PLASMA_GUN 2833 | RTS 2834 | DSWP05: LDA #0 2835 | STA SELECTED_WEAPON ;should never happen 2836 | JMP DISPLAY_WEAPON 2837 | 2838 | ;This routine checks to see if currently selected 2839 | ;weapon is zero. And if it is, then it checks inventories 2840 | ;of other weapons to decide which item to automatically 2841 | ;select for the user. 2842 | PRESELECT_WEAPON: 2843 | LDA SELECTED_WEAPON 2844 | CMP #0 ;If item already selected, return 2845 | BEQ PRSW01 2846 | RTS 2847 | PRSW01: LDA AMMO_PISTOL 2848 | CMP #0 2849 | BEQ PRSW02 2850 | LDA #1 ;PISTOL 2851 | STA SELECTED_WEAPON 2852 | RTS 2853 | PRSW02: LDA AMMO_PLASMA 2854 | CMP #0 2855 | BEQ PRSW04 2856 | LDA #2 ;PLASMAGUN 2857 | STA SELECTED_WEAPON 2858 | RTS 2859 | PRSW04: ;Nothing found in inventory at this point, so set 2860 | ;selected-item to zero. 2861 | LDA #0 ;nothing in inventory 2862 | STA SELECTED_WEAPON 2863 | JSR DISPLAY_BLANK_WEAPON 2864 | RTS 2865 | 2866 | DISPLAY_PLASMA_GUN: 2867 | LDY #0 2868 | DW1: LDA WEAPON1A,Y 2869 | STA $804A,Y 2870 | LDA WEAPON1B,Y 2871 | STA $8072,Y 2872 | LDA WEAPON1C,Y 2873 | STA $809A,Y 2874 | LDA WEAPON1D,Y 2875 | STA $80C2,Y 2876 | INY 2877 | CPY #6 2878 | BNE DW1 2879 | LDA AMMO_PLASMA 2880 | STA DECNUM 2881 | LDA #$ED 2882 | STA $FB 2883 | LDA #$80 2884 | STA $FC 2885 | JSR DECWRITE 2886 | RTS 2887 | 2888 | DISPLAY_PISTOL: 2889 | LDY #0 2890 | DW2: LDA PISTOL1A,Y 2891 | STA $804A,Y 2892 | LDA PISTOL1B,Y 2893 | STA $8072,Y 2894 | LDA PISTOL1C,Y 2895 | STA $809A,Y 2896 | LDA PISTOL1D,Y 2897 | STA $80C2,Y 2898 | INY 2899 | CPY #6 2900 | BNE DW2 2901 | LDA AMMO_PISTOL 2902 | STA DECNUM 2903 | LDA #$ED 2904 | STA $FB 2905 | LDA #$80 2906 | STA $FC 2907 | JSR DECWRITE 2908 | RTS 2909 | 2910 | DISPLAY_BLANK_WEAPON: 2911 | LDY #0 2912 | DBW2: LDA #32 2913 | STA $804A,Y 2914 | STA $8072,Y 2915 | STA $809A,Y 2916 | STA $80C2,Y 2917 | STA $80EA,Y 2918 | INY 2919 | CPY #6 2920 | BNE DBW2 2921 | RTS 2922 | 2923 | DISPLAY_KEYS: 2924 | LDA #32 2925 | STA $827A ;ERASE ALL 3 SPOTS 2926 | STA $827B 2927 | STA $827C 2928 | STA $827D 2929 | STA $827E 2930 | STA $827F 2931 | STA $82A2 2932 | STA $82A3 2933 | STA $82A4 2934 | STA $82A5 2935 | STA $82A6 2936 | STA $82A7 2937 | LDA KEYS 2938 | AND #%00000001 2939 | CMP #%00000001 ;Spade key 2940 | BNE DKS1 2941 | LDA #$63 2942 | STA $827A 2943 | LDA #$4D 2944 | STA $827B 2945 | LDA #$41 2946 | STA $82A2 2947 | LDA #$67 2948 | STA $82A3 2949 | DKS1: LDA KEYS 2950 | AND #%00000010 2951 | CMP #%00000010 ;heart key 2952 | BNE DKS2 2953 | LDA #$63 2954 | STA $827C 2955 | LDA #$4D 2956 | STA $827D 2957 | LDA #$53 2958 | STA $82A4 2959 | LDA #$67 2960 | STA $82A5 2961 | DKS2: LDA KEYS 2962 | AND #%00000100 2963 | CMP #%00000100 ;star key 2964 | BNE DKS3 2965 | LDA #$63 2966 | STA $827E 2967 | LDA #$4D 2968 | STA $827F 2969 | LDA #$2A 2970 | STA $82A6 2971 | LDA #$67 2972 | STA $82A7 2973 | DKS3: RTS 2974 | 2975 | GAME_OVER: 2976 | ;stop game clock 2977 | LDA #0 2978 | STA CLOCK_ACTIVE 2979 | ;disable music 2980 | LDA #0 2981 | STA MUSIC_ON 2982 | STA $E848 ;turn off sound 2983 | STA $E84A ;turn off sound 2984 | ;Did player die or win? 2985 | LDA UNIT_TYPE 2986 | CMP #0 2987 | BNE GOM0 2988 | LDA #111 ;dead player tile 2989 | STA UNIT_TILE 2990 | LDA #100 2991 | STA KEYTIMER 2992 | GOM0: JSR PET_SCREEN_SHAKE 2993 | JSR BACKGROUND_TASKS 2994 | LDA KEYTIMER 2995 | CMP #0 2996 | BNE GOM0 2997 | LDX #0 2998 | GOM1: LDA GAMEOVER1,X 2999 | STA $8173,X 3000 | LDA GAMEOVER2,X 3001 | STA $819B,X 3002 | LDA GAMEOVER3,X 3003 | STA $81C3,X 3004 | INX 3005 | CPX #11 3006 | BNE GOM1 3007 | LDA #100 3008 | STA KEYTIMER 3009 | GOM2: LDA KEYTIMER 3010 | CMP #0 3011 | BNE GOM2 3012 | LDA #0 3013 | STA $009E ;CLEAR KEYBOARD BUFFER 3014 | JSR CLEAR_SNES_PAD 3015 | GOM3: JSR SNES_CONTROLER_READ 3016 | LDA NEW_B 3017 | CMP #1 3018 | BEQ GOM4 3019 | JSR $FFE4 3020 | CMP #$00 3021 | BEQ GOM3 3022 | GOM4: LDA #0 3023 | STA $009E ;CLEAR KEYBOARD BUFFER 3024 | JSR CLEAR_SNES_PAD 3025 | LDA #0 3026 | STA MUSIC_ON 3027 | JSR DISPLAY_ENDGAME_SCREEN 3028 | JSR DISPLAY_WIN_LOSE 3029 | GOM5: JSR SNES_CONTROLER_READ 3030 | LDA NEW_B 3031 | CMP #1 3032 | BEQ GOM6 3033 | JSR $FFE4 3034 | CMP #$00 3035 | BEQ GOM5 3036 | ;LDA #0 3037 | ;STA $009E ;CLEAR KEYBOARD BUFFER 3038 | GOM6: JMP INTRO_SCREEN 3039 | 3040 | GAMEOVER1: !BYTE $70,$40,$40,$40,$40,$40,$40,$40,$40,$40,$6e 3041 | GAMEOVER2: !BYTE $5d,$07,$01,$0d,$05,$20,$0f,$16,$05,$12,$5d 3042 | GAMEOVER3: !BYTE $6d,$40,$40,$40,$40,$40,$40,$40,$40,$40,$7d 3043 | 3044 | DISPLAY_WIN_LOSE: 3045 | JSR STOP_SONG 3046 | LDX #0 3047 | LDA UNIT_TYPE 3048 | CMP #0 3049 | BEQ DWL5 3050 | DWL1: ;WIN MESSAGE 3051 | LDA WIN_MSG,X 3052 | STA $8088,X 3053 | INX 3054 | CPX #8 3055 | BNE DWL1 3056 | LDA #18 ;win music 3057 | JSR PLAY_SOUND 3058 | RTS 3059 | DWL5: ;LOSE MESSAGE 3060 | LDA LOS_MSG,X 3061 | STA $8088,X 3062 | INX 3063 | CPX #9 3064 | BNE DWL5 3065 | LDA #19 ;LOSE music 3066 | JSR PLAY_SOUND 3067 | RTS 3068 | 3069 | WIN_MSG: !SCR"you win!" 3070 | LOS_MSG: !SCR"you lose!" 3071 | 3072 | PRINT_INTRO_MESSAGE: 3073 | LDA #INTRO_MESSAGE 3076 | STA $FC 3077 | JSR PRINT_INFO 3078 | RTS 3079 | 3080 | ;This routine will print something to the "information" window 3081 | ;at the bottom left of the screen. You must first define the 3082 | ;source of the text in $FB. The text should terminate with 3083 | ;a null character. 3084 | PRINT_INFO: 3085 | JSR SCROLL_INFO ;New text always causes a scroll 3086 | LDY #0 3087 | STY PRINTX 3088 | PI01: LDA ($FB),Y 3089 | CMP #0 ;null terminates string 3090 | BNE PI02 3091 | RTS 3092 | PI02: CMP #255 ;return 3093 | BNE PI03 3094 | LDX #0 3095 | STX PRINTX 3096 | JSR SCROLL_INFO 3097 | JMP PI04 3098 | PI03: LDX PRINTX 3099 | STA $83C0,X 3100 | INC PRINTX 3101 | PI04: INY 3102 | JMP PI01 3103 | PRINTX: !BYTE 00 ;used to store X-cursor location 3104 | 3105 | ;This routine scrolls the info screen by one row, clearing 3106 | ;a new row at the bottom. 3107 | SCROLL_INFO: 3108 | LDX #0 3109 | SCI1: LDA $8398,X 3110 | STA $8370,X 3111 | LDA $83C0,X ;BOTTOM ROW 3112 | STA $8398,X 3113 | INX 3114 | CPX #33 3115 | BNE SCI1 3116 | ;NOW CLEAR BOTTOM ROW 3117 | LDX #0 3118 | LDA #32 3119 | SCI2: STA $83C0,X;BOTTOM ROW 3120 | INX 3121 | CPX #33 3122 | BNE SCI2 3123 | RTS 3124 | 3125 | RESET_KEYS_AMMO: 3126 | LDA #$00 3127 | STA KEYS 3128 | STA AMMO_PISTOL 3129 | STA AMMO_PLASMA 3130 | STA INV_BOMBS 3131 | STA INV_EMP 3132 | STA INV_MEDKIT 3133 | STA INV_MAGNET 3134 | STA SELECTED_WEAPON 3135 | STA SELECTED_ITEM 3136 | STA MAGNET_ACT 3137 | STA PLASMA_ACT 3138 | STA BIG_EXP_ACT 3139 | STA CYCLES 3140 | STA SECONDS 3141 | STA MINUTES 3142 | STA HOURS 3143 | RTS 3144 | 3145 | INTRO_SCREEN: 3146 | JSR DISPLAY_INTRO_SCREEN 3147 | JSR DISPLAY_MAP_NAME 3148 | JSR CHANGE_DIFFICULTY_LEVEL 3149 | JSR START_INTRO_MUSIC 3150 | LDA #0 3151 | STA MENUY 3152 | JSR REVERSE_MENU_OPTION 3153 | JSR CLEAR_SNES_PAD 3154 | JSR CLEAR_KEY_BUFFER 3155 | ISLOOP JSR $FFE4 ;SCAN for key presses 3156 | CMP #00 3157 | BEQ IS011 ;If none found, try SNES 3158 | CMP #$11 ;CURSOR DOWN 3159 | BNE IS001 3160 | JSR MENU_DOWN 3161 | JMP ISLOOP 3162 | IS001: CMP #$91 ;CURSOR UP 3163 | BNE IS002 3164 | JSR MENU_UP 3165 | JMP ISLOOP 3166 | IS002: CMP #32 ;SPACE 3167 | BNE IS003 3168 | JMP EXEC_COMMAND 3169 | IS003: CMP KEY_MOVE_UP 3170 | BNE IS004 3171 | JSR MENU_UP 3172 | JMP ISLOOP 3173 | IS004: CMP KEY_MOVE_DOWN 3174 | BNE IS005 3175 | JSR MENU_DOWN 3176 | JMP ISLOOP 3177 | IS005: CMP #13 ;RETURN 3178 | BNE IS006 3179 | LDA #15 ;menu beep 3180 | JSR PLAY_SOUND ;SOUND PLAY 3181 | JMP EXEC_COMMAND 3182 | IS006: JMP ISLOOP 3183 | IS011: ;Now check SNES status for menu 3184 | JSR SNES_CONTROLER_READ 3185 | LDA NEW_UP 3186 | CMP #1 3187 | BNE IS012 3188 | JSR MENU_UP 3189 | LDA #0 3190 | STA NEW_UP 3191 | JMP ISLOOP 3192 | IS012: LDA NEW_DOWN 3193 | CMP #1 3194 | BNE IS013 3195 | JSR MENU_DOWN 3196 | LDA #0 3197 | STA NEW_DOWN 3198 | JMP ISLOOP 3199 | IS013: LDA NEW_B 3200 | CMP #1 3201 | BNE IS014 3202 | LDA #0 3203 | STA NEW_B 3204 | JMP EXEC_COMMAND 3205 | IS014: JMP ISLOOP 3206 | 3207 | MENU_UP: 3208 | LDA MENUY 3209 | CMP #0 3210 | BNE MENUP1 3211 | RTS 3212 | MENUP1: JSR REVERSE_MENU_OPTION 3213 | DEC MENUY 3214 | JSR REVERSE_MENU_OPTION 3215 | LDA #15 ;MENU BEEP 3216 | JSR PLAY_SOUND ;SOUND PLAY 3217 | RTS 3218 | 3219 | MENU_DOWN: 3220 | LDA MENUY 3221 | CMP #3 3222 | BNE MENDN1 3223 | RTS 3224 | MENDN1: JSR REVERSE_MENU_OPTION 3225 | INC MENUY 3226 | JSR REVERSE_MENU_OPTION 3227 | LDA #15 ;menu beep 3228 | JSR PLAY_SOUND ;SOUND PLAY 3229 | RTS 3230 | 3231 | START_INTRO_MUSIC: 3232 | LDA #0 3233 | STA DATA_LINE 3234 | LDA #$FF 3235 | STA SOUND_EFFECT 3236 | LDA #INTRO_MUSIC 3239 | STA CUR_PATTERN_H 3240 | LDA #1 3241 | STA MUSIC_ON 3242 | RTS 3243 | 3244 | EXEC_COMMAND: 3245 | LDA MENUY 3246 | CMP #00 ;START GAME 3247 | BNE EXEC1 3248 | JSR SET_CONTROLS 3249 | LDA #0 3250 | STA MUSIC_ON 3251 | STA $E848 ;turn off sound 3252 | STA $E84A ;turn off sound 3253 | JMP INIT_GAME 3254 | EXEC1: CMP #2 ;DIFF LEVEL 3255 | BNE EXEC05 3256 | INC DIFF_LEVEL 3257 | LDA DIFF_LEVEL 3258 | CMP #3 3259 | BNE EXEC02 3260 | LDA #0 3261 | STA DIFF_LEVEL 3262 | EXEC02: JSR CHANGE_DIFFICULTY_LEVEL 3263 | LDA #15 ;menu beep 3264 | JSR PLAY_SOUND 3265 | JMP ISLOOP 3266 | EXEC05: CMP #1 ;cycle map 3267 | BNE EXEC06 3268 | LDA #15 ;menu beep 3269 | JSR PLAY_SOUND 3270 | JSR CYCLE_MAP 3271 | JMP ISLOOP 3272 | EXEC06: CMP #3 3273 | BNE EXEC07 3274 | JSR CYCLE_CONTROLS 3275 | LDA #15 ;menu beep 3276 | JSR PLAY_SOUND 3277 | EXEC07: JMP ISLOOP 3278 | 3279 | CYCLE_CONTROLS: 3280 | LDA #0 3281 | STA KEYS_DEFINED 3282 | INC CONTROL 3283 | LDA CONTROL 3284 | CMP #3 3285 | BNE CCON2 3286 | LDA #0 3287 | STA CONTROL 3288 | CCON2: ;display control method on screen 3289 | LDY CONTROL 3290 | LDA CONTROLSTART,Y 3291 | TAY 3292 | LDX #0 3293 | CCON3: LDA CONTROLTEXT,Y 3294 | ORA #%10000000 3295 | STA $80CC,X 3296 | INX 3297 | INY 3298 | CPX #10 3299 | BNE CCON3 3300 | RTS 3301 | 3302 | CONTROLTEXT: !SCR"keyboard " 3303 | !SCR"custom key" 3304 | !SCR"snes pad " 3305 | CONTROLSTART: !BYTE 00,10,20 3306 | 3307 | CYCLE_MAP: 3308 | INC SELECTED_MAP 3309 | LDA SELECTED_MAP 3310 | CMP #14 ;Maximum number of maps 3311 | BNE CYM1 3312 | LDA #0 3313 | STA SELECTED_MAP 3314 | CYM1: JSR DISPLAY_MAP_NAME 3315 | RTS 3316 | 3317 | DISPLAY_MAP_NAME: 3318 | JSR CALC_MAP_NAME 3319 | DMN1: LDA ($FB),Y 3320 | STA $816A,Y 3321 | INY 3322 | CPY #16 3323 | BNE DMN1 3324 | ;now set the mapname for the filesystem load 3325 | LDA SELECTED_MAP 3326 | CLC 3327 | ADC #65 3328 | STA MAPNAME+6 3329 | RTS 3330 | 3331 | CALC_MAP_NAME: 3332 | ;FIND MAP NAME 3333 | LDA SELECTED_MAP 3334 | STA $FB 3335 | LDA #0 3336 | STA $FC 3337 | ;multiply by 16 by shifting 4 times to left. 3338 | ASL $FB 3339 | ROL $FC 3340 | ASL $FB 3341 | ROL $FC 3342 | ASL $FB 3343 | ROL $FC 3344 | ASL $FB 3345 | ROL $FC 3346 | ;now add offset for mapnames 3347 | LDA $FB 3348 | CLC 3349 | ADC #MAP_NAMES 3353 | STA $FC 3354 | LDY #0 3355 | RTS 3356 | 3357 | REVERSE_MENU_OPTION: 3358 | LDY MENUY 3359 | LDA MENU_CHART_L,Y 3360 | STA $FB 3361 | LDA #$80 3362 | STA $FC 3363 | LDY #0 3364 | RMO1: LDA ($FB),Y 3365 | EOR #%10000000 3366 | STA ($FB),Y 3367 | INY 3368 | CPY #10 3369 | BNE RMO1 3370 | RTS 3371 | MENUY !BYTE $00 ;CURRENT MENU SELECTION 3372 | MENU_CHART_L: 3373 | !BYTE $54,$7C,$A4,$CC 3374 | 3375 | CHANGE_DIFFICULTY_LEVEL: 3376 | LDY DIFF_LEVEL 3377 | LDA FACE_LEVEL,Y 3378 | TAY 3379 | ;DO CHARACTERS FIRST 3380 | LDA ROBOT_FACE,Y 3381 | STA $80DD 3382 | INY 3383 | LDA ROBOT_FACE,Y 3384 | STA $80DE 3385 | INY 3386 | LDA ROBOT_FACE,Y 3387 | STA $80DF 3388 | INY 3389 | LDA ROBOT_FACE,Y 3390 | STA $80E1 3391 | INY 3392 | LDA ROBOT_FACE,Y 3393 | STA $80E2 3394 | INY 3395 | LDA ROBOT_FACE,Y 3396 | STA $80E3 3397 | INY 3398 | LDA ROBOT_FACE,Y 3399 | STA $8107 3400 | INY 3401 | LDA ROBOT_FACE,Y 3402 | STA $8109 3403 | RTS 3404 | DIFF_LEVEL !BYTE 01 ;default medium 3405 | 3406 | ROBOT_FACE: 3407 | !BYTE $3A,$43,$49,$55,$43,$3A,$49,$55 ;EASY LEVEL 3408 | !BYTE $40,$40,$6E,$70,$40,$40,$49,$55 ;MEDIUM LEVEL 3409 | !BYTE $3A,$4D,$3A,$3A,$4E,$3A,$4D,$4E ;HARD LEVEL 3410 | FACE_LEVEL: 3411 | !BYTE 0,8,16 3412 | 3413 | ;This routine is run after the map is loaded, but before the 3414 | ;game starts. If the diffulcty is set to normal, nothing 3415 | ;actually happens. But if it is set to easy or hard, then 3416 | ;some changes occur accordingly. 3417 | SET_DIFF_LEVEL: 3418 | LDA DIFF_LEVEL 3419 | CMP #0 ;easy 3420 | BNE SDLE1 3421 | JMP SET_DIFF_EASY 3422 | SDLE1: CMP #2 ;hard 3423 | BNE SDLE2 3424 | JMP SET_DIFF_HARD 3425 | SDLE2: RTS 3426 | 3427 | SET_DIFF_EASY: 3428 | ;Find all hidden items and double the quantity. 3429 | LDX #48 3430 | SDE1: LDA UNIT_TYPE,X 3431 | CMP #0 3432 | BEQ SDE2 3433 | CMP #128 ;KEY 3434 | BEQ SDE2 3435 | ASL UNIT_A,X ;item qty 3436 | SDE2: INX 3437 | CPX #64 3438 | BNE SDE1 3439 | RTS 3440 | 3441 | SET_DIFF_HARD: 3442 | ;Find all hoverbots and change AI 3443 | LDX #0 3444 | SDH1: LDA UNIT_TYPE,X 3445 | CMP #2 ;hoverbot left/right 3446 | BEQ SDH4 3447 | CMP #3 ;hoverbot up/down 3448 | BEQ SDH4 3449 | SDH2: INX 3450 | CPX #28 3451 | BNE SDH1 3452 | RTS 3453 | SDH4: LDA #4 ;hoverbot attack mode 3454 | STA UNIT_TYPE,X 3455 | JMP SDH2 3456 | 3457 | ;This chart contains the left-most staring position for each 3458 | ;row of tiles on the map-editor. 7 Rows. 3459 | MAP_CHART_L: 3460 | !BYTE $00,$78,$F0,$68,$E0,$58,$D0 3461 | 3462 | MAP_CHART_H: 3463 | !BYTE $80,$80,$80,$81,$81,$82,$82 3464 | 3465 | EMP_FLASH: 3466 | LDY #0 3467 | EMPF1: LDA $8000,Y ;screen row 00 3468 | EOR #%10000000 3469 | STA $8000,Y ;screen row 00 3470 | LDA $8028,Y ;screen row 01 3471 | EOR #%10000000 3472 | STA $8028,Y ;screen row 01 3473 | LDA $8050,Y ;screen row 02 3474 | EOR #%10000000 3475 | STA $8050,Y ;screen row 02 3476 | LDA $8078,Y ;screen row 03 3477 | EOR #%10000000 3478 | STA $8078,Y ;screen row 03 3479 | LDA $80A0,Y ;screen row 04 3480 | EOR #%10000000 3481 | STA $80A0,Y ;screen row 04 3482 | LDA $80C8,Y ;screen row 05 3483 | EOR #%10000000 3484 | STA $80C8,Y ;screen row 05 3485 | LDA $80F0,Y ;screen row 06 3486 | EOR #%10000000 3487 | STA $80F0,Y ;screen row 06 3488 | LDA $8118,Y ;screen row 07 3489 | EOR #%10000000 3490 | STA $8118,Y ;screen row 07 3491 | LDA $8140,Y ;screen row 08 3492 | EOR #%10000000 3493 | STA $8140,Y ;screen row 08 3494 | LDA $8168,Y ;screen row 09 3495 | EOR #%10000000 3496 | STA $8168,Y ;screen row 09 3497 | LDA $8190,Y ;screen row 10 3498 | EOR #%10000000 3499 | STA $8190,Y ;screen row 10 3500 | LDA $81B8,Y ;screen row 11 3501 | EOR #%10000000 3502 | STA $81B8,Y ;screen row 11 3503 | LDA $81E0,Y ;screen row 12 3504 | EOR #%10000000 3505 | STA $81E0,Y ;screen row 12 3506 | LDA $8208,Y ;screen row 13 3507 | EOR #%10000000 3508 | STA $8208,Y ;screen row 13 3509 | LDA $8230,Y ;screen row 14 3510 | EOR #%10000000 3511 | STA $8230,Y ;screen row 14 3512 | LDA $8258,Y ;screen row 15 3513 | EOR #%10000000 3514 | STA $8258,Y ;screen row 15 3515 | LDA $8280,Y ;screen row 16 3516 | EOR #%10000000 3517 | STA $8280,Y ;screen row 16 3518 | LDA $82A8,Y ;screen row 17 3519 | EOR #%10000000 3520 | STA $82A8,Y ;screen row 17 3521 | LDA $82D0,Y ;screen row 18 3522 | EOR #%10000000 3523 | STA $82D0,Y ;screen row 18 3524 | LDA $82F8,Y ;screen row 19 3525 | EOR #%10000000 3526 | STA $82F8,Y ;screen row 19 3527 | LDA $8320,Y ;screen row 20 3528 | EOR #%10000000 3529 | STA $8320,Y ;screen row 20 3530 | INY 3531 | CPY #33 3532 | BEQ EMPF2 3533 | JMP EMPF1 3534 | EMPF2: RTS 3535 | 3536 | ;This routine animates the tile #204 (water) 3537 | ;and also tile 148 (trash compactor) 3538 | ANIMATE_WATER: 3539 | LDA ANIMATE 3540 | CMP #1 3541 | BEQ AW00 3542 | RTS 3543 | AW00: INC WATER_TIMER 3544 | LDA WATER_TIMER 3545 | CMP #20 3546 | BEQ AW01 3547 | RTS 3548 | AW01: LDA #0 3549 | STA WATER_TIMER 3550 | LDA TILE_DATA_BR+204 3551 | STA WATER_TEMP1 3552 | LDA TILE_DATA_MM+204 3553 | STA TILE_DATA_BR+204 3554 | STA TILE_DATA_BR+221 3555 | LDA TILE_DATA_TL+204 3556 | STA TILE_DATA_MM+204 3557 | LDA WATER_TEMP1 3558 | STA TILE_DATA_TL+204 3559 | 3560 | LDA TILE_DATA_BL+204 3561 | STA WATER_TEMP1 3562 | LDA TILE_DATA_MR+204 3563 | STA TILE_DATA_BL+204 3564 | STA TILE_DATA_BL+221 3565 | LDA TILE_DATA_TM+204 3566 | STA TILE_DATA_MR+204 3567 | LDA WATER_TEMP1 3568 | STA TILE_DATA_TM+204 3569 | STA TILE_DATA_TM+221 3570 | 3571 | LDA TILE_DATA_BM+204 3572 | STA WATER_TEMP1 3573 | LDA TILE_DATA_ML+204 3574 | STA TILE_DATA_BM+204 3575 | STA TILE_DATA_BM+221 3576 | LDA TILE_DATA_TR+204 3577 | STA TILE_DATA_ML+204 3578 | LDA WATER_TEMP1 3579 | STA TILE_DATA_TR+204 3580 | STA TILE_DATA_TR+221 3581 | 3582 | ;now do trash compactor 3583 | LDA TILE_DATA_TR+148 3584 | STA WATER_TEMP1 3585 | LDA TILE_DATA_TM+148 3586 | STA TILE_DATA_TR+148 3587 | LDA TILE_DATA_TL+148 3588 | STA TILE_DATA_TM+148 3589 | LDA WATER_TEMP1 3590 | STA TILE_DATA_TL+148 3591 | 3592 | LDA TILE_DATA_MR+148 3593 | STA WATER_TEMP1 3594 | LDA TILE_DATA_MM+148 3595 | STA TILE_DATA_MR+148 3596 | LDA TILE_DATA_ML+148 3597 | STA TILE_DATA_MM+148 3598 | LDA WATER_TEMP1 3599 | STA TILE_DATA_ML+148 3600 | 3601 | LDA TILE_DATA_BR+148 3602 | STA WATER_TEMP1 3603 | LDA TILE_DATA_BM+148 3604 | STA TILE_DATA_BR+148 3605 | LDA TILE_DATA_BL+148 3606 | STA TILE_DATA_BM+148 3607 | LDA WATER_TEMP1 3608 | STA TILE_DATA_BL+148 3609 | ;Now do HVAC fan 3610 | LDA HVAC_STATE 3611 | CMP #0 3612 | BEQ HVAC1 3613 | LDA #$CD 3614 | STA TILE_DATA_MM+196 3615 | STA TILE_DATA_TL+201 3616 | LDA #$CE 3617 | STA TILE_DATA_ML+197 3618 | STA TILE_DATA_TM+200 3619 | LDA #$A0 3620 | STA TILE_DATA_MR+196 3621 | STA TILE_DATA_BM+196 3622 | STA TILE_DATA_BL+197 3623 | STA TILE_DATA_TR+200 3624 | LDA #0 3625 | STA HVAC_STATE 3626 | JMP HVAC2 3627 | HVAC1: 3628 | LDA #$A0 3629 | STA TILE_DATA_MM+196 3630 | STA TILE_DATA_TL+201 3631 | STA TILE_DATA_ML+197 3632 | STA TILE_DATA_TM+200 3633 | LDA #$C2 3634 | STA TILE_DATA_MR+196 3635 | STA TILE_DATA_TR+200 3636 | LDA #$C0 3637 | STA TILE_DATA_BM+196 3638 | STA TILE_DATA_BL+197 3639 | LDA #1 3640 | STA HVAC_STATE 3641 | HVAC2: ;now do cinema screen tiles 3642 | ;FIRST COPY OLD LETTERS TO THE LEFT. 3643 | LDA TILE_DATA_MR+20 ;#2 3644 | STA TILE_DATA_MM+20 ;#1 3645 | LDA TILE_DATA_ML+21 ;#3 3646 | STA TILE_DATA_MR+20 ;#2 3647 | LDA TILE_DATA_MM+21 ;#4 3648 | STA TILE_DATA_ML+21 ;#3 3649 | LDA TILE_DATA_MR+21 ;#5 3650 | STA TILE_DATA_MM+21 ;#4 3651 | LDA TILE_DATA_ML+22 ;#6 3652 | STA TILE_DATA_MR+21 ;#5 3653 | ;now insert new character. 3654 | LDY CINEMA_STATE 3655 | LDA CINEMA_MESSAGE,Y 3656 | STA TILE_DATA_ML+22 ;#6 3657 | 3658 | INC CINEMA_STATE 3659 | LDA CINEMA_STATE 3660 | CMP #197 3661 | BNE CINE2 3662 | LDA #0 3663 | STA CINEMA_STATE 3664 | CINE2: ;Now animate light on server computers 3665 | LDA TILE_DATA_MR+143 3666 | CMP #$D7 3667 | BNE CINE3 3668 | LDA #$D1 3669 | JMP CINE4 3670 | CINE3: LDA #$D7 3671 | CINE4: STA TILE_DATA_MR+143 3672 | LDA #1 3673 | STA REDRAW_WINDOW 3674 | RTS 3675 | WATER_TIMER !BYTE 00 3676 | WATER_TEMP1 !BYTE 00 3677 | HVAC_STATE !BYTE 00 3678 | CINEMA_STATE !BYTE 00 3679 | 3680 | ;This is the routine that allows a person to select 3681 | ;a level and highlights the selection in the information 3682 | ;display. It is unique to each computer since it writes 3683 | ;to the screen directly. 3684 | ELEVATOR_SELECT: 3685 | JSR DRAW_MAP_WINDOW 3686 | LDX UNIT 3687 | LDA UNIT_D,X ;get max levels 3688 | STA ELEVATOR_MAX_FLOOR 3689 | ;Now draw available levels on screen 3690 | LDY #0 3691 | LDA #$31 3692 | ELS1: STA $83C6,Y 3693 | CLC 3694 | ADC #01 3695 | INY 3696 | CPY ELEVATOR_MAX_FLOOR 3697 | BNE ELS1 3698 | LDA UNIT_C,X ;what level are we on now? 3699 | STA ELEVATOR_CURRENT_FLOOR 3700 | ;Now highlight current level 3701 | JSR ELEVATOR_INVERT 3702 | ;Now get user input 3703 | LDA CONTROL 3704 | CMP #2 3705 | BNE ELS5 3706 | JMP SELS5 3707 | ELS5: ;KEYBOARD INPUT 3708 | JSR $FFE4 3709 | CMP #$00 3710 | BEQ ELS5 3711 | CMP KEY_MOVE_LEFT 3712 | BNE ELS6 3713 | JSR ELEVATOR_DEC 3714 | JMP ELS5 3715 | ELS6: CMP KEY_MOVE_RIGHT 3716 | BNE ELS7 3717 | JSR ELEVATOR_INC 3718 | JMP ELS5 3719 | ELS7: CMP #$9D ;CURSOR LEFT 3720 | BNE ELS8 3721 | JSR ELEVATOR_DEC 3722 | JMP ELS5 3723 | ELS8: CMP #$1D ;CURSOR RIGHT 3724 | BNE ELS9 3725 | JSR ELEVATOR_INC 3726 | JMP ELS5 3727 | ELS9: CMP #$11 ;CURSOR DOWN 3728 | BNE ELS10 3729 | ELS9B: JSR SCROLL_INFO 3730 | JSR SCROLL_INFO 3731 | JSR SCROLL_INFO 3732 | JSR CLEAR_KEY_BUFFER 3733 | RTS 3734 | ELS10: CMP KEY_MOVE_DOWN 3735 | BEQ ELS9B 3736 | ELS11: JMP ELS5 3737 | 3738 | SELS5: ;SNES INPUT 3739 | JSR SNES_CONTROLER_READ 3740 | LDA NEW_LEFT 3741 | CMP #1 3742 | BNE SELS8 3743 | JSR ELEVATOR_DEC 3744 | LDA #0 3745 | STA NEW_LEFT 3746 | JMP SELS5 3747 | SELS8: LDA NEW_RIGHT 3748 | CMP #1 3749 | BNE SELS9 3750 | JSR ELEVATOR_INC 3751 | LDA #0 3752 | STA NEW_RIGHT 3753 | JMP SELS5 3754 | SELS9: LDA NEW_DOWN 3755 | CMP #1 3756 | BNE SELS10 3757 | JSR SCROLL_INFO 3758 | JSR SCROLL_INFO 3759 | JSR SCROLL_INFO 3760 | LDA #15 3761 | STA KEYTIMER 3762 | LDA #0 3763 | STA NEW_DOWN 3764 | RTS 3765 | SELS10: JMP SELS5 3766 | 3767 | ELEVATOR_MAX_FLOOR !BYTE 00 3768 | ELEVATOR_CURRENT_FLOOR !BYTE 00 3769 | 3770 | ELEVATOR_INVERT: 3771 | LDY ELEVATOR_CURRENT_FLOOR 3772 | LDA $83C5,Y 3773 | EOR #%10000000 3774 | STA $83C5,Y 3775 | RTS 3776 | ELEVATOR_INC: 3777 | LDA ELEVATOR_CURRENT_FLOOR 3778 | CMP ELEVATOR_MAX_FLOOR 3779 | BNE ELVIN1 3780 | RTS 3781 | ELVIN1: JSR ELEVATOR_INVERT 3782 | INC ELEVATOR_CURRENT_FLOOR 3783 | JSR ELEVATOR_INVERT 3784 | JSR ELEVATOR_FIND_XY 3785 | RTS 3786 | ELEVATOR_DEC: 3787 | LDA ELEVATOR_CURRENT_FLOOR 3788 | CMP #1 3789 | BNE ELVDE1 3790 | RTS 3791 | ELVDE1: JSR ELEVATOR_INVERT 3792 | DEC ELEVATOR_CURRENT_FLOOR 3793 | JSR ELEVATOR_INVERT 3794 | JSR ELEVATOR_FIND_XY 3795 | RTS 3796 | 3797 | ELEVATOR_FIND_XY: 3798 | LDX #32 ;start of doors 3799 | ELXY1: LDA UNIT_TYPE,X 3800 | CMP #19 ;elevator 3801 | BNE ELXY5 3802 | LDA UNIT_C,X 3803 | CMP ELEVATOR_CURRENT_FLOOR 3804 | BNE ELXY5 3805 | JMP ELXY10 3806 | ELXY5: INX 3807 | CPX #48 3808 | BNE ELXY1 3809 | RTS 3810 | ELXY10: LDA UNIT_LOC_X,X ;new elevator location 3811 | STA UNIT_LOC_X ;player location 3812 | SEC 3813 | SBC #5 3814 | STA MAP_WINDOW_X 3815 | LDA UNIT_LOC_Y,X ;new elevator location 3816 | STA UNIT_LOC_Y ;player location 3817 | DEC UNIT_LOC_Y 3818 | SEC 3819 | SBC #4 3820 | STA MAP_WINDOW_Y 3821 | JSR DRAW_MAP_WINDOW 3822 | LDA #17 ;elevator sound 3823 | JSR PLAY_SOUND ;SOUND PLAY 3824 | RTS 3825 | 3826 | SET_CONTROLS: 3827 | LDA CONTROL 3828 | CMP #1 ;CUSTOM KEYS 3829 | BNE SETC1 3830 | JSR SET_CUSTOM_KEYS 3831 | RTS 3832 | SETC1: ;load standard values for key controls 3833 | LDY #0 3834 | SETC2: LDA STANDARD_CONTROLS,Y 3835 | STA KEY_MOVE_UP,Y 3836 | INY 3837 | CPY #13 3838 | BNE SETC2 3839 | RTS 3840 | 3841 | STANDARD_CONTROLS: 3842 | !BYTE 56 ;MOVE UP 3843 | !BYTE 50 ;MOVE DOWN 3844 | !BYTE 52 ;MOVE LEFT 3845 | !BYTE 54 ;MOVE RIGHT 3846 | !BYTE 87 ;FIRE UP 3847 | !BYTE 83 ;FIRE DOWN 3848 | !BYTE 65 ;FIRE LEFT 3849 | !BYTE 68 ;FIRE RIGHT 3850 | !BYTE 60 ;CYCLE WEAPONS 3851 | !BYTE 62 ;CYCLE ITEMS 3852 | !BYTE 32 ;USE ITEM 3853 | !BYTE 90 ;SEARCH OBEJCT 3854 | !BYTE 77 ;MOVE OBJECT 3855 | 3856 | SET_CUSTOM_KEYS: 3857 | LDA KEYS_DEFINED 3858 | CMP #0 3859 | BEQ SCK00 3860 | RTS 3861 | SCK00: LDA #SCR_CUSTOM_KEYS 3864 | STA $FC 3865 | JSR DECOMPRESS_SCREEN 3866 | LDA #0 3867 | STA TEMP_A 3868 | LDA #$81 3869 | STA $FC 3870 | LDA #$51 3871 | STA $FB 3872 | SCK01: JSR $FFE4 3873 | CMP #00 3874 | BEQ SCK01 3875 | LDY TEMP_A 3876 | STA KEY_MOVE_UP,Y 3877 | STA DECNUM 3878 | JSR DECWRITE 3879 | LDA $FB 3880 | CLC 3881 | ADC #40 3882 | STA $FB 3883 | LDA $FC 3884 | ADC #00 3885 | STA $FC 3886 | INC TEMP_A 3887 | LDA TEMP_A 3888 | CMP #13 3889 | BNE SCK01 3890 | LDA #01 3891 | STA KEYS_DEFINED 3892 | RTS 3893 | 3894 | KEYS_DEFINED !BYTE 00 ;DEFAULT 0 3895 | 3896 | PET_SCREEN_SHAKE: 3897 | LDA BGTIMER1 3898 | CMP #1 3899 | BEQ PSS4 3900 | RTS 3901 | PSS4: LDA SELECT_TIMEOUT ;shoehorned this into the screenshake routine 3902 | CMP #0 ;this is to prevent accidental double-taps 3903 | BEQ PSS4A ;on cycle weapons or items. 3904 | DEC SELECT_TIMEOUT 3905 | PSS4A: JSR PET_BORDER_FLASH 3906 | LDA SCREEN_SHAKE 3907 | CMP #1 3908 | BEQ PSS0 3909 | RTS 3910 | PSS0: LDY #0 3911 | LDX #0 3912 | LDA #01 3913 | STA PSS1+1 3914 | LDA #00 3915 | STA PSS2+1 3916 | LDA #$80 3917 | STA PSS1+2 3918 | STA PSS2+2 3919 | PSS1: LDA $8001,X ;self modifying code 3920 | PSS2: STA $8000,X ;self modifying code 3921 | INX 3922 | CPX #32 3923 | BNE PSS1 3924 | LDX #0 3925 | LDA PSS1+1 3926 | CLC 3927 | ADC #40 3928 | STA PSS1+1 3929 | LDA PSS1+2 3930 | ADC #00 3931 | STA PSS1+2 3932 | LDA PSS2+1 3933 | CLC 3934 | ADC #40 3935 | STA PSS2+1 3936 | LDA PSS2+2 3937 | ADC #00 3938 | STA PSS2+2 3939 | INY 3940 | CPY #21 3941 | BNE PSS1 3942 | LDA #1 3943 | STA REDRAW_WINDOW 3944 | RTS 3945 | 3946 | ;So, it doesn't really flash the PET border, instead it 3947 | ;flashes the health screen. 3948 | PET_BORDER_FLASH: 3949 | LDA BORDER 3950 | CMP #0 3951 | BNE PBF10 3952 | LDA FLASH_STATE 3953 | CMP #0 3954 | BEQ PBF5 3955 | JMP PBF20 3956 | PBF5: RTS 3957 | PBF10: ;border flash should be active 3958 | LDA FLASH_STATE 3959 | CMP #1 ;Is it already flashing? 3960 | BNE PBF11 3961 | RTS 3962 | PBF11: ;copy flash message to screen 3963 | LDX #0 3964 | PBF12: LDA OUCH1,X 3965 | STA $82F2,X 3966 | LDA OUCH2,X 3967 | STA $831A,X 3968 | LDA OUCH3,X 3969 | STA $8342,X 3970 | INX 3971 | CPX #6 3972 | BNE PBF12 3973 | LDA #1 3974 | STA FLASH_STATE 3975 | RTS 3976 | PBF20: ;Remove message from screen 3977 | LDX #0 3978 | PBF21: LDA #32 3979 | STA $82F2,X 3980 | STA $831A,X 3981 | STA $8342,X 3982 | INX 3983 | CPX #6 3984 | BNE PBF21 3985 | LDA #0 3986 | STA FLASH_STATE 3987 | RTS 3988 | 3989 | FLASH_STATE !BYTE 00 3990 | OUCH1 !BYTE $CD,$A0,$A0,$A0,$A0,$CE 3991 | OUCH2 !BYTE $A0,$8F,$95,$83,$88,$A0 3992 | OUCH3 !BYTE $CE,$A0,$A0,$A0,$A0,$CD 3993 | 3994 | ;This is actually part of a background routine, but it has to be in the main 3995 | ;source because the screen effects used are unique on each system. 3996 | DEMATERIALIZE: 3997 | LDX UNIT 3998 | LDA UNIT_TIMER_B,X 3999 | AND #%00000001 4000 | CLC 4001 | ADC #252 ;dematerialize tile 4002 | STA UNIT_TILE 4003 | LDA UNIT_TIMER_B,X 4004 | AND #%00001000 4005 | LSR 4006 | LSR 4007 | LSR 4008 | ADC UNIT_TILE 4009 | STA UNIT_TILE 4010 | INC UNIT_TIMER_B,X 4011 | LDA UNIT_TIMER_B,X 4012 | CMP #%00010000 4013 | BEQ DEMA1 4014 | LDA #1 4015 | STA UNIT_TIMER_A,X 4016 | LDA #1 4017 | STA REDRAW_WINDOW 4018 | JMP AILP 4019 | DEMA1: ;TRANSPORT COMPLETE 4020 | LDA UNIT_B,X 4021 | CMP #1 ;transport somewhere 4022 | BEQ DEMA2 4023 | LDA #2 ;this means game over condition 4024 | STA UNIT_TYPE ;player type 4025 | LDA #7 ;Normal transporter pad 4026 | STA UNIT_TYPE,X 4027 | JMP AILP 4028 | DEMA2: LDA #243 4029 | STA UNIT_TILE 4030 | LDA UNIT_C,X ;target X coordinates 4031 | STA UNIT_LOC_X 4032 | LDA UNIT_D,X ;target Y coordinates 4033 | STA UNIT_LOC_Y 4034 | LDA #7 ;Normal transporter pad 4035 | STA UNIT_TYPE,X 4036 | JSR CACULATE_AND_REDRAW 4037 | JMP AILP 4038 | 4039 | ANIMATE_PLAYER: 4040 | ANP1: LDA UNIT_TILE 4041 | CMP #243 4042 | BNE ANP2 4043 | LDA #247 4044 | STA UNIT_TILE 4045 | RTS 4046 | ANP2: LDA #243 4047 | STA UNIT_TILE 4048 | RTS 4049 | 4050 | RENDER_MAP: 4051 | LDA #0 4052 | STA PX 4053 | STA PY 4054 | LDA BIGMAP_X 4055 | STA MAP_X 4056 | LDA BIGMAP_Y 4057 | STA MAP_Y 4058 | JSR CLEAR_SCREEN 4059 | DSMP01: LDA PX 4060 | CLC 4061 | ADC BIGMAP_X 4062 | STA MAP_X 4063 | JSR GET_TILE_FROM_MAP 4064 | LDX TILE 4065 | LDA TILE_ATTRIB,X 4066 | AND #%00000001 ;CAN WE WALK ON IT? 4067 | CMP #%00000001 4068 | BEQ DSMP10 4069 | JSR PIXELPLOT 4070 | DSMP10: INC PX 4071 | LDA PX 4072 | CMP #80 4073 | BNE DSMP01 4074 | LDA #0 4075 | STA PX 4076 | INC PY 4077 | LDA PY 4078 | CLC 4079 | ADC BIGMAP_Y 4080 | STA MAP_Y 4081 | LDA PY 4082 | CMP #50 4083 | BNE DSMP01 4084 | RTS 4085 | 4086 | DISPLAY_MAP: 4087 | LDA #15 ;MENU BEEP 4088 | JSR PLAY_SOUND 4089 | JSR RENDER_MAP 4090 | JSR CLEAR_KEY_BUFFER 4091 | JSR CLEAR_SNES_PAD 4092 | 4093 | MAP_KEY_WAIT: 4094 | LDA BGTIMER2 4095 | CMP #0 4096 | BNE MAPS1 4097 | JSR BLINK_PLAYER 4098 | MAPS1: JSR SNES_CONTROLER_READ 4099 | LDA NEW_B 4100 | CMP #1 4101 | BNE MAPS2 4102 | JMP MKW12 4103 | MAPS2: LDA NEW_A 4104 | CMP #1 4105 | BNE MAPS3 4106 | JSR TOGGLE_PLAYER_ROBOTS 4107 | LDA #0 4108 | STA NEW_A 4109 | MAPS3: LDA NEW_UP 4110 | CMP #1 4111 | BNE MAPS4 4112 | JSR MAP_UP 4113 | LDA #0 4114 | STA NEW_UP 4115 | MAPS4: LDA NEW_DOWN 4116 | CMP #1 4117 | BNE MAPS5 4118 | JSR MAP_DOWN 4119 | LDA #0 4120 | STA NEW_DOWN 4121 | MAPS5: LDA NEW_LEFT 4122 | CMP #1 4123 | BNE MAPS6 4124 | JSR MAP_LEFT 4125 | LDA #0 4126 | STA NEW_LEFT 4127 | MAPS6: LDA NEW_RIGHT 4128 | CMP #1 4129 | BNE MKW1 4130 | JSR MAP_RIGHT 4131 | LDA #0 4132 | STA NEW_RIGHT 4133 | MKW1: JSR $FFE4 4134 | CMP #$00 4135 | BEQ MAP_KEY_WAIT 4136 | CMP KEY_MOVE_RIGHT 4137 | BNE MKW2 4138 | JSR MAP_RIGHT 4139 | JMP MAP_KEY_WAIT 4140 | MKW2: CMP KEY_MOVE_LEFT 4141 | BNE MKW3 4142 | JSR MAP_LEFT 4143 | JMP MAP_KEY_WAIT 4144 | MKW3: CMP KEY_MOVE_UP 4145 | BNE MKW4 4146 | JSR MAP_UP 4147 | JMP MAP_KEY_WAIT 4148 | MKW4: CMP KEY_MOVE_DOWN 4149 | BNE MKW5 4150 | JSR MAP_DOWN 4151 | JMP MAP_KEY_WAIT 4152 | MKW5: CMP #19 ;HOME KEY 4153 | BNE MKW6 4154 | JSR TOGGLE_PLAYER_ROBOTS 4155 | JMP MAP_KEY_WAIT 4156 | MKW6: CMP #$1D ;CURSOR RIGHT 4157 | BNE MKW7 4158 | JSR MAP_RIGHT 4159 | JMP MAP_KEY_WAIT 4160 | MKW7: CMP #$9D ;CURSOR LEFT 4161 | BNE MKW8 4162 | JSR MAP_LEFT 4163 | JMP MAP_KEY_WAIT 4164 | MKW8: CMP #$11 ;CURSOR DOWN 4165 | BNE MKW9 4166 | JSR MAP_DOWN 4167 | JMP MAP_KEY_WAIT 4168 | MKW9: CMP #$91 ;CURSOR UP 4169 | BNE MKW12 4170 | JSR MAP_UP 4171 | JMP MAP_KEY_WAIT 4172 | MKW12: ;RETURN TO GAME 4173 | LDA #15 ;MENU BEEP 4174 | JSR PLAY_SOUND 4175 | JSR DISPLAY_GAME_SCREEN 4176 | JSR DRAW_MAP_WINDOW 4177 | JSR DISPLAY_PLAYER_HEALTH 4178 | JSR DISPLAY_KEYS 4179 | JSR DISPLAY_WEAPON 4180 | JSR DISPLAY_ITEM 4181 | JSR CLEAR_SNES_PAD 4182 | RTS 4183 | 4184 | TOGGLE_PLAYER_ROBOTS: 4185 | LDA #15 ;MENU BEEP 4186 | JSR PLAY_SOUND 4187 | LDA BP_ROBOTS 4188 | CMP #0 ;PLAYER ACTIVE 4189 | BNE TPR1 4190 | JSR PIXELUNPLOT 4191 | LDA #1 ;SET ROBOTS ACTIVE 4192 | STA BP_ROBOTS 4193 | RTS 4194 | TPR1: LDA #1 4195 | STA BP_STATUS ;set to clear robot pixels 4196 | JSR BLINK_ROBOTS 4197 | LDA #0 ;SET PLAYER ACTIVE 4198 | STA BP_ROBOTS 4199 | RTS 4200 | 4201 | MAP_RIGHT: 4202 | LDA #17 ;SHORT SOUND 4203 | JSR PLAY_SOUND 4204 | LDA BIGMAP_X 4205 | CMP #48 4206 | BEQ MAPR1 4207 | CLC 4208 | ADC #16 4209 | STA BIGMAP_X 4210 | JSR RENDER_MAP 4211 | MAPR1: RTS 4212 | 4213 | MAP_LEFT: 4214 | LDA #17 ;SHORT SOUND 4215 | JSR PLAY_SOUND 4216 | LDA BIGMAP_X 4217 | CMP #0 4218 | BEQ MAPL1 4219 | SEC 4220 | SBC #16 4221 | STA BIGMAP_X 4222 | JSR RENDER_MAP 4223 | MAPL1: RTS 4224 | 4225 | MAP_UP: 4226 | LDA #17 ;SHORT SOUND 4227 | JSR PLAY_SOUND 4228 | LDA BIGMAP_Y 4229 | CMP #0 4230 | BEQ MAPU1 4231 | LDA #0 4232 | STA BIGMAP_Y 4233 | JSR RENDER_MAP 4234 | MAPU1: RTS 4235 | 4236 | MAP_DOWN: 4237 | LDA #17 ;SHORT SOUND 4238 | JSR PLAY_SOUND 4239 | LDA BIGMAP_Y 4240 | CMP #14 4241 | BEQ MAPD1 4242 | LDA #14 4243 | STA BIGMAP_Y 4244 | JSR RENDER_MAP 4245 | MAPD1: RTS 4246 | 4247 | BLINK_ROBOTS: 4248 | LDA #1 ;First possible robot 4249 | STA UNIT 4250 | BLRB01: LDX UNIT 4251 | LDA UNIT_TYPE,X 4252 | CMP #0 ;does it exist? 4253 | BEQ BLRB10 4254 | ;Check if robot falls within horizontal window area 4255 | LDA UNIT_LOC_X,X 4256 | CMP BIGMAP_X 4257 | BCC BLRB10 4258 | LDA BIGMAP_X 4259 | CLC 4260 | ADC #79 4261 | CMP UNIT_LOC_X,X 4262 | BCC BLRB10 4263 | ;Check if robot falls within vertical window area 4264 | LDA UNIT_LOC_Y,X 4265 | CMP BIGMAP_Y 4266 | BCC BLRB10 4267 | LDA BIGMAP_Y 4268 | CLC 4269 | ADC #49 4270 | CMP UNIT_LOC_Y,X 4271 | BCC BLRB10 4272 | ;apparently it falls within, so calculate the screen coordinates. 4273 | LDA UNIT_LOC_X,X 4274 | SEC 4275 | SBC BIGMAP_X 4276 | STA PX 4277 | LDA UNIT_LOC_Y,X 4278 | SEC 4279 | SBC BIGMAP_Y 4280 | STA PY 4281 | ;Now determine if it is time to turn the pixel on or off 4282 | LDA BP_STATUS 4283 | CMP #00 4284 | BEQ BLRB02 4285 | JSR PIXELUNPLOT 4286 | JMP BLRB10 4287 | BLRB02: JSR PIXELPLOT 4288 | BLRB10: INC UNIT ;Try for next robot 4289 | LDA UNIT 4290 | CMP #28 ;MAX ROBOTS 4291 | BNE BLRB01 4292 | LDA BP_STATUS 4293 | EOR #%00000001 4294 | STA BP_STATUS 4295 | RTS 4296 | 4297 | BLINK_PLAYER: 4298 | LDA #20 4299 | STA BGTIMER2 4300 | LDA BP_ROBOTS 4301 | CMP #0 4302 | BEQ BPL5 4303 | JMP BLINK_ROBOTS 4304 | BPL5: ;first determine if it is in the map window (X) 4305 | LDA UNIT_LOC_X 4306 | CMP BIGMAP_X 4307 | BCC BLPL2 4308 | LDA BIGMAP_X 4309 | CLC 4310 | ADC #79 4311 | CMP UNIT_LOC_X 4312 | BCC BLPL2 4313 | ;now determine if it is in the map window (Y) 4314 | LDA UNIT_LOC_Y 4315 | CMP BIGMAP_Y 4316 | BCC BLPL2 4317 | LDA BIGMAP_Y 4318 | CLC 4319 | ADC #49 4320 | CMP UNIT_LOC_Y 4321 | BCC BLPL2 4322 | ;it's inside, so show the dot 4323 | LDA UNIT_LOC_X 4324 | SEC 4325 | SBC BIGMAP_X 4326 | STA PX 4327 | LDA UNIT_LOC_Y 4328 | SEC 4329 | SBC BIGMAP_Y 4330 | STA PY 4331 | LDA BP_STATUS 4332 | CMP #00 4333 | BEQ BLPL1 4334 | JSR PIXELUNPLOT 4335 | LDA #00 4336 | STA BP_STATUS 4337 | RTS 4338 | BLPL1: JSR PIXELPLOT 4339 | LDA #01 4340 | STA BP_STATUS 4341 | BLPL2: RTS 4342 | BP_STATUS !BYTE 00 4343 | BP_ROBOTS !BYTE 00 ;0=PLAYER 1=ROBOTS 4344 | BIGMAP_X !BYTE 16 ;SCROLL POSITION X FOR FULL SCREEN MAP 4345 | BIGMAP_Y !BYTE 00 ;SCROLL POSITION Y FOR FULL SCREEN MAP 4346 | 4347 | ; The following routine clears the screen 4348 | ; it is C64 specific. 4349 | 4350 | CLEAR_SCREEN: 4351 | LDA #$20 4352 | LDX #$00 4353 | CS01: STA $8000,X 4354 | STA $8100,X 4355 | STA $8200,X 4356 | INX 4357 | CPX #$00 4358 | BNE CS01 4359 | CS02: STA $8300,X 4360 | INX 4361 | CPX #$E8 4362 | BNE CS02 4363 | RTS 4364 | 4365 | XLOC !BYTE $00 ;X Coordinate (0-39) 4366 | PCHAR !BYTE $00 ;Character (0-255) 4367 | 4368 | ; The following routine takes the coordinates in 4369 | ; PX and PY and plots a pixel on the screen. 4370 | 4371 | PIXELPLOTFIND: 4372 | ;Set screen RAM location in $FB and $FC 4373 | LDA PX 4374 | LSR ;divide by 2 4375 | STA XLOC 4376 | LDX PY 4377 | LDA LEFTSCREEN_L,X 4378 | STA $FB 4379 | LDA LEFTSCREEN_H,X 4380 | STA $FC 4381 | CLC 4382 | LDA $FB 4383 | ADC XLOC 4384 | STA $FB 4385 | BCC PCADR2 4386 | INC $FC 4387 | PCADR2: 4388 | ;Find out what character is already there and convert 4389 | ;it over to a 4-bit binary number 4390 | LDY #$00 4391 | LDX #$00 4392 | LDA ($FB),Y 4393 | PP01 CMP PIXELMAP,X 4394 | BEQ PP02 4395 | INX 4396 | CPX #$10 4397 | BEQ PP02 4398 | JMP PP01 4399 | PP02 STX PIXEL 4400 | ;now figure out which of the 4 locations we are working with 4401 | ;and store that in PIXEL2 4402 | LDA PX 4403 | AND #%00000001 4404 | CMP #%00000001 ;is it even or odd X position? 4405 | BEQ PP03 4406 | LDA #%00000010 4407 | JMP PP04 4408 | PP03 LDA #%00000001 4409 | PP04 STA PIXEL2 4410 | LDA PY 4411 | AND #%00000001 4412 | CMP #%00000001 ;is it even or odd Y position? 4413 | BEQ PP05 4414 | ASL PIXEL2 4415 | ASL PIXEL2 4416 | PP05 RTS 4417 | 4418 | PX !BYTE $00 ; X-Location (0-79) 4419 | PY !BYTE $00 ; Y-Location (0-49) 4420 | PIXEL !BYTE $00 ; CURRENT 4-BIT PIXEL 4421 | PIXEL2 !BYTE $00 ; which segment are we addressing? 4422 | ;The following routine allows the user to select 4423 | ;a new working color from a friendly screen. 4424 | 4425 | PIXELPLOT: 4426 | JSR PIXELPLOTFIND 4427 | LDA PIXEL2 ;new location 4428 | ORA PIXEL ;add it to old 4429 | TAX 4430 | LDA PIXELMAP,X 4431 | LDY #$00 4432 | STA ($FB),Y ; plot char 4433 | RTS 4434 | 4435 | PIXELUNPLOT: 4436 | JSR PIXELPLOTFIND 4437 | LDA PIXEL2 ;new location 4438 | EOR #%11111111 4439 | AND PIXEL ;subtract it from old 4440 | TAX 4441 | LDA PIXELMAP,X 4442 | LDY #$00 4443 | STA ($FB),Y ; plot char 4444 | RTS 4445 | 4446 | ;The following tables are used to quickly find the left-most 4447 | ;address of the text screen. It is PET specific 4448 | 4449 | LEFTSCREEN_H: 4450 | !BYTE $80 ;ROW 00 4451 | !BYTE $80 ;ROW 00 4452 | !BYTE $80 ;ROW 01 4453 | !BYTE $80 ;ROW 01 4454 | !BYTE $80 ;ROW 02 4455 | !BYTE $80 ;ROW 02 4456 | !BYTE $80 ;ROW 03 4457 | !BYTE $80 ;ROW 03 4458 | !BYTE $80 ;ROW 04 4459 | !BYTE $80 ;ROW 04 4460 | !BYTE $80 ;ROW 05 4461 | !BYTE $80 ;ROW 05 4462 | !BYTE $80 ;ROW 06 4463 | !BYTE $80 ;ROW 06 4464 | !BYTE $81 ;ROW 07 4465 | !BYTE $81 ;ROW 07 4466 | !BYTE $81 ;ROW 08 4467 | !BYTE $81 ;ROW 08 4468 | !BYTE $81 ;ROW 09 4469 | !BYTE $81 ;ROW 09 4470 | !BYTE $81 ;ROW 10 4471 | !BYTE $81 ;ROW 10 4472 | !BYTE $81 ;ROW 11 4473 | !BYTE $81 ;ROW 11 4474 | !BYTE $81 ;ROW 12 4475 | !BYTE $81 ;ROW 12 4476 | !BYTE $82 ;ROW 13 4477 | !BYTE $82 ;ROW 13 4478 | !BYTE $82 ;ROW 14 4479 | !BYTE $82 ;ROW 14 4480 | !BYTE $82 ;ROW 15 4481 | !BYTE $82 ;ROW 15 4482 | !BYTE $82 ;ROW 16 4483 | !BYTE $82 ;ROW 16 4484 | !BYTE $82 ;ROW 17 4485 | !BYTE $82 ;ROW 17 4486 | !BYTE $82 ;ROW 18 4487 | !BYTE $82 ;ROW 18 4488 | !BYTE $82 ;ROW 19 4489 | !BYTE $82 ;ROW 19 4490 | !BYTE $83 ;ROW 20 4491 | !BYTE $83 ;ROW 20 4492 | !BYTE $83 ;ROW 21 4493 | !BYTE $83 ;ROW 21 4494 | !BYTE $83 ;ROW 22 4495 | !BYTE $83 ;ROW 22 4496 | !BYTE $83 ;ROW 23 4497 | !BYTE $83 ;ROW 23 4498 | !BYTE $83 ;ROW 24 4499 | !BYTE $83 ;ROW 24 4500 | 4501 | LEFTSCREEN_L: 4502 | !BYTE $00 ;ROW 00 4503 | !BYTE $00 ;ROW 00 4504 | !BYTE $28 ;ROW 01 4505 | !BYTE $28 ;ROW 01 4506 | !BYTE $50 ;ROW 02 4507 | !BYTE $50 ;ROW 02 4508 | !BYTE $78 ;ROW 03 4509 | !BYTE $78 ;ROW 03 4510 | !BYTE $A0 ;ROW 04 4511 | !BYTE $A0 ;ROW 04 4512 | !BYTE $C8 ;ROW 05 4513 | !BYTE $C8 ;ROW 05 4514 | !BYTE $F0 ;ROW 06 4515 | !BYTE $F0 ;ROW 06 4516 | !BYTE $18 ;ROW 07 4517 | !BYTE $18 ;ROW 07 4518 | !BYTE $40 ;ROW 08 4519 | !BYTE $40 ;ROW 08 4520 | !BYTE $68 ;ROW 09 4521 | !BYTE $68 ;ROW 09 4522 | !BYTE $90 ;ROW 10 4523 | !BYTE $90 ;ROW 10 4524 | !BYTE $B8 ;ROW 11 4525 | !BYTE $B8 ;ROW 11 4526 | !BYTE $E0 ;ROW 12 4527 | !BYTE $E0 ;ROW 12 4528 | !BYTE $08 ;ROW 13 4529 | !BYTE $08 ;ROW 13 4530 | !BYTE $30 ;ROW 14 4531 | !BYTE $30 ;ROW 14 4532 | !BYTE $58 ;ROW 15 4533 | !BYTE $58 ;ROW 15 4534 | !BYTE $80 ;ROW 16 4535 | !BYTE $80 ;ROW 16 4536 | !BYTE $A8 ;ROW 17 4537 | !BYTE $A8 ;ROW 17 4538 | !BYTE $D0 ;ROW 18 4539 | !BYTE $D0 ;ROW 18 4540 | !BYTE $F8 ;ROW 19 4541 | !BYTE $F8 ;ROW 19 4542 | !BYTE $20 ;ROW 20 4543 | !BYTE $20 ;ROW 20 4544 | !BYTE $48 ;ROW 21 4545 | !BYTE $48 ;ROW 21 4546 | !BYTE $70 ;ROW 22 4547 | !BYTE $70 ;ROW 22 4548 | !BYTE $98 ;ROW 23 4549 | !BYTE $98 ;ROW 23 4550 | !BYTE $C0 ;ROW 24 4551 | !BYTE $C0 ;ROW 24 4552 | 4553 | ;The following data is for representing each of the 4554 | ;PETSCII block characters as an 4-bit binary number 4555 | ;arranged as following: 4556 | ; 33332222 4557 | ; 33332222 4558 | ; 33332222 4559 | ; 33332222 4560 | ; 11110000 4561 | ; 11110000 4562 | ; 11110000 4563 | ; 11110000 4564 | 4565 | PIXELMAP: 4566 | !BYTE $20 4567 | !BYTE $6C 4568 | !BYTE $7B 4569 | !BYTE $62 4570 | !BYTE $7C 4571 | !BYTE $E1 4572 | !BYTE $FF 4573 | !BYTE $FE 4574 | !BYTE $7E 4575 | !BYTE $7F 4576 | !BYTE $61 4577 | !BYTE $FC 4578 | !BYTE $E2 4579 | !BYTE $FB 4580 | !BYTE $EC 4581 | !BYTE $A0 4582 | 4583 | PLAY_SOUND: 4584 | ;check if music is playing 4585 | LDY MUSIC_ON 4586 | CPY #0 4587 | BEQ PSND1 4588 | LDY SOUND_EFFECT 4589 | CPY #$FF ;no sound effect currently being played 4590 | BNE PSND1 4591 | LDY CUR_PATTERN_L 4592 | STY PATTERN_L_TEMP 4593 | LDY CUR_PATTERN_H 4594 | STY PATTERN_H_TEMP 4595 | LDY DATA_LINE 4596 | STY DATA_LINE_TEMP 4597 | LDY TEMPO 4598 | STY TEMPO_TEMP 4599 | PSND1: ;check if we should play new effect. 4600 | LDY SOUND_EFFECT 4601 | CPY #$FF ;no sound effect currently being played 4602 | BEQ PSND2 4603 | CMP SOUND_EFFECT 4604 | BCC PSND2 ;Prioritize sounds that have lower number. 4605 | BEQ PSND2 4606 | RTS 4607 | PSND2: ;Now process sound effect. 4608 | TAY ;Get waiting sound# from accumulator 4609 | LDA SOUND_LIBRARY_L,Y 4610 | STA CUR_PATTERN_L 4611 | LDA SOUND_LIBRARY_H,Y 4612 | STA CUR_PATTERN_H 4613 | STY SOUND_EFFECT 4614 | LDA #0 4615 | STA DATA_LINE 4616 | RTS 4617 | PATTERN_L_TEMP: !BYTE 00 4618 | PATTERN_H_TEMP: !BYTE 00 4619 | DATA_LINE_TEMP: !BYTE 00 4620 | TEMPO_TEMP: !BYTE 00 4621 | 4622 | SOUND_LIBRARY_L: 4623 | !BYTE SND_EXPLOSION ;sound 0 4646 | !BYTE >SND_EXPLOSION ;sound 1 4647 | !BYTE >SND_MEDKIT ;sound 2 4648 | !BYTE >SND_EMP ;sound 3 4649 | !BYTE >SND_MAGNET ;sound 4 4650 | !BYTE >SND_SHOCK ;sound 5 4651 | !BYTE >SND_MOVE_OBJ ;sound 6 4652 | !BYTE >SND_SHOCK ;sound 7 4653 | !BYTE >SND_PLASMA ;sound 8 4654 | !BYTE >SND_PISTOL ;sound 9 4655 | !BYTE >SND_ITEM_FOUND ;sound 10 4656 | !BYTE >SND_ERROR ;sound 11 4657 | !BYTE >SND_CYCLE_WEAPON ;sound 12 4658 | !BYTE >SND_CYCLE_ITEM ;sound 13 4659 | !BYTE >SND_DOOR ;sound 14 4660 | !BYTE >SND_MENU_BEEP ;sound 15 4661 | !BYTE >SND_SHORT_BEEP ;sound 16 4662 | !BYTE >SND_SHORT_BEEP ;sound 17 4663 | !BYTE >WIN_MUSIC ;sound 18 4664 | !BYTE >LOSE_MUSIC ;sound 19 4665 | ;0 explosion 4666 | ;1 small explosion 4667 | ;2 medkit 4668 | ;3 emp 4669 | ;4 haywire 4670 | ;5 evilbot 4671 | ;6 move 4672 | ;7 electric shock 4673 | ;8 plasma gun 4674 | ;9 fire pistol 4675 | ;10 item found 4676 | ;11 error 4677 | ;12 change weapons 4678 | ;13 change items 4679 | ;14 door 4680 | ;15 menu beep 4681 | ;16 walk 4682 | ;17 sfx (short beep) 4683 | ;18 sfx 4684 | 4685 | MUSIC_ROUTINE: 4686 | LDA SOUND_EFFECT 4687 | CMP #$FF 4688 | BNE PS10 4689 | LDA MUSIC_ON 4690 | CMP #1 4691 | BEQ PS10 4692 | RTS 4693 | PS10: LDA TEMPO_TIMER 4694 | CMP #0 4695 | BEQ PS15 4696 | DEC TEMPO_TIMER 4697 | RTS 4698 | PS15: LDY DATA_LINE 4699 | LDA (CUR_PATTERN_L),Y 4700 | CMP #0 ;blank line (do nothing) 4701 | BNE PS20 4702 | LDA TEMPO 4703 | STA TEMPO_TIMER ;reset timer to wait for next line 4704 | INC DATA_LINE 4705 | RTS 4706 | PS20: CMP #37 ;END pattern 4707 | BNE PS21 4708 | JMP STOP_SONG 4709 | PS21: CMP #38 4710 | BNE PS22 4711 | LDA #0 4712 | STA ARP_MODE 4713 | STA $E84A ;RESET SOUND TO ZERO 4714 | STA $E848 4715 | PS22: CMP #38 ;IS IT A TEMPO COMMAND? 4716 | BCC PS23 4717 | CMP #49 ;COMMAND IS BETWEEN 39 AND 49 (TEMPO ADJUST) 4718 | BCS PS23 4719 | SEC 4720 | SBC #38 4721 | STA TEMPO 4722 | INC DATA_LINE 4723 | RTS 4724 | PS23: ;PLAY A NOTE 4725 | TAY 4726 | LSR 4727 | LSR 4728 | LSR 4729 | LSR 4730 | LSR 4731 | LSR 4732 | STA ARP_MODE 4733 | TYA 4734 | AND #%00111111 4735 | STA CHORD_ROOT 4736 | TAY 4737 | LDA NOTE_FREQ,Y 4738 | STA $E848 4739 | LDA NOTE_OCTAVE,Y 4740 | STA $E84A 4741 | LDA TEMPO 4742 | STA TEMPO_TIMER ;reset timer to wait for next line 4743 | INC DATA_LINE 4744 | RTS 4745 | 4746 | STOP_SONG: ;actually, stop sound effect. 4747 | LDA #0 4748 | STA $E848 ;turn off sound 4749 | STA $E84A ;turn off sound 4750 | LDA #$FF 4751 | STA SOUND_EFFECT 4752 | LDA TEMPO 4753 | STA TEMPO_TIMER 4754 | ;now restore music info for continued play. 4755 | LDA MUSIC_ON 4756 | CMP #1 4757 | BEQ STSN1 4758 | RTS 4759 | STSN1: LDY PATTERN_L_TEMP 4760 | STY CUR_PATTERN_L 4761 | LDY PATTERN_H_TEMP 4762 | STY CUR_PATTERN_H 4763 | LDY DATA_LINE_TEMP 4764 | STY DATA_LINE 4765 | LDY TEMPO_TEMP 4766 | STY TEMPO 4767 | RTS 4768 | 4769 | ;this is only called from the IRQ routine and runs 60 times per second if 4770 | ;an arp is active. 4771 | ;*NOTE* it is deactivated here because no music or sound effects were 4772 | ;composed to use this feature, so might as well disable it. 4773 | ;CYCLE_ARP: 4774 | ; INC ARP_STEP 4775 | ; LDA ARP_STEP 4776 | ; CMP #3 4777 | ; BNE CARP1 4778 | ; LDA #0 4779 | ; STA ARP_STEP 4780 | ;CARP1: LDA ARP_MODE 4781 | ; CMP #1 4782 | ; BNE CARP2 4783 | ; ;MAJOR CHORD 4784 | ; LDA CHORD_ROOT 4785 | ; LDY ARP_STEP 4786 | ; CLC 4787 | ; ADC MAJ_CHART,Y 4788 | ; TAY 4789 | ; LDA NOTE_FREQ,Y 4790 | ; STA $E848 4791 | ; LDA NOTE_OCTAVE,Y 4792 | ; STA $E84A 4793 | ; RTS 4794 | ;CARP2: CMP #2 4795 | ; BNE CARP3 4796 | ; ;MINOR CHORD 4797 | ; LDA CHORD_ROOT 4798 | ; LDY ARP_STEP 4799 | ; CLC 4800 | ; ADC MIN_CHART,Y 4801 | ; TAY 4802 | ; LDA NOTE_FREQ,Y 4803 | ; STA $E848 4804 | ; LDA NOTE_OCTAVE,Y 4805 | ; STA $E84A 4806 | ; RTS 4807 | ;CARP3: ;SUS4 CHORD 4808 | ; LDA CHORD_ROOT 4809 | ; LDY ARP_STEP 4810 | ; CLC 4811 | ; ADC SUS4_CHART,Y 4812 | ; TAY 4813 | ; LDA NOTE_FREQ,Y 4814 | ; STA $E848 4815 | ; LDA NOTE_OCTAVE,Y 4816 | ; STA $E84A 4817 | ; RTS 4818 | ;ARP_STEP !BYTE 00 4819 | ;MAJ_CHART !BYTE 00,04,07 4820 | ;MIN_CHART !BYTE 00,03,07 4821 | ;SUS4_CHART !BYTE 00,05,07 4822 | 4823 | !SOURCE "BACKGROUND_TASKS.ASM" 4824 | 4825 | ;These are the included binary files that contain the screen 4826 | ;image for the main editor. 4827 | INTRO_TEXT: 4828 | !BYTE $60,$20,$02,$4e,$60,$63,$0a,$4e,$65,$60,$20,$05,$e9,$ce,$20,$20,$e9,$ce,$60,$20 4829 | !BYTE $0d,$cd,$60,$a0,$09,$ce,$20,$65,$60,$20,$05,$66,$a0,$20,$20,$66,$a0,$60,$20,$0d 4830 | !BYTE $a0,$13,$14,$01,$12,$14,$20,$07,$01,$0d,$05,$a0,$20,$65,$60,$20,$04,$e9,$66,$ce 4831 | !BYTE $a0,$a0,$66,$ce,$ce,$60,$20,$0c,$a0,$13,$05,$0c,$05,$03,$14,$20,$0d,$01,$10,$a0 4832 | !BYTE $20,$65,$60,$20,$03,$e9,$a0,$e3,$60,$a0,$02,$e3,$60,$ce,$02,$60,$20,$0b,$a0,$04 4833 | !BYTE $09,$06,$06,$09,$03,$15,$0c,$14,$19,$a0,$20,$65,$60,$20,$02,$e9,$60,$66,$06,$ce 4834 | !BYTE $ce,$a0,$60,$20,$0b,$a0,$03,$0f,$0e,$14,$12,$0f,$0c,$13,$20,$20,$a0,$20,$65,$60 4835 | !BYTE $20,$02,$66,$3a,$4d,$60,$3a,$02,$4e,$3a,$66,$a0,$a0,$60,$20,$02,$e9,$ce,$20,$20 4836 | !BYTE $e9,$ce,$60,$20,$02,$ce,$60,$a0,$09,$cd,$4e,$60,$20,$03,$66,$55,$43,$4d,$3a,$4e 4837 | !BYTE $43,$49,$66,$a0,$a0,$60,$20,$02,$66,$a0,$20,$20,$66,$a0,$60,$20,$13,$66,$42,$51 4838 | !BYTE $48,$3a,$42,$51,$48,$66,$a0,$69,$60,$20,$02,$66,$a0,$20,$20,$66,$a0,$60,$20,$02 4839 | !BYTE $70,$60,$40,$02,$73,$0d,$01,$10,$6b,$60,$40,$02,$6e,$60,$20,$03,$66,$4a,$46,$4b 4840 | !BYTE $3a,$4a,$46,$4b,$66,$ce,$60,$20,$03,$66,$ce,$a0,$a0,$66,$a0,$20,$20,$0b,$09,$0c 4841 | !BYTE $0c,$20,$01,$0c,$0c,$20,$08,$15,$0d,$01,$0e,$13,$60,$20,$03,$60,$66,$06,$a0,$a0 4842 | !BYTE $60,$20,$03,$60,$66,$04,$69,$60,$20,$14,$66,$60,$d0,$04,$66,$a0,$a0,$60,$20,$05 4843 | !BYTE $66,$a0,$20,$20,$60,$43,$14,$66,$60,$d0,$04,$66,$a0,$69,$60,$43,$05,$66,$a0,$43 4844 | !BYTE $43,$60,$3a,$14,$60,$66,$06,$ce,$a0,$a0,$ce,$60,$3a,$03,$66,$a0,$60,$3a,$16,$e9 4845 | !BYTE $a0,$a0,$e7,$d0,$ce,$60,$a0,$02,$ce,$a0,$60,$3a,$03,$66,$a0,$60,$3a,$15,$e9,$60 4846 | !BYTE $a0,$03,$e3,$60,$a0,$02,$ce,$a0,$a0,$60,$3a,$03,$66,$a0,$60,$3a,$0b,$e9,$ce,$df 4847 | !BYTE $60,$3a,$06,$60,$66,$08,$d5,$c0,$c9,$60,$3a,$03,$66,$ce,$df,$60,$3a,$09,$e9,$e3 4848 | !BYTE $cd,$ce,$60,$a0,$06,$66,$51,$60,$66,$04,$51,$66,$dd,$ce,$e3,$60,$a0,$02,$ce,$a0 4849 | !BYTE $cd,$ce,$60,$3a,$09,$a0,$d1,$e7,$60,$66,$10,$dd,$60,$66,$04,$a0,$d1,$e7,$69,$60 4850 | !BYTE $3a,$09,$5f,$a0,$ce,$60,$3a,$07,$60,$66,$08,$ca,$c0,$cb,$60,$3a,$02,$5f,$e4,$69 4851 | !BYTE $60,$3a,$0b,$66,$a0,$3a,$e9,$a0,$a0,$ce,$3a,$e9,$a0,$a0,$ce,$e9,$a0,$a0,$ce,$66 4852 | !BYTE $e9,$a0,$a0,$ce,$e9,$a0,$a0,$ce,$e9,$a0,$a0,$ce,$60,$3a,$0a,$66,$a0,$3a,$60,$66 4853 | !BYTE $02,$ce,$ce,$60,$66,$02,$a0,$60,$66,$02,$ce,$ce,$60,$66,$02,$a0,$60,$66,$02,$69 4854 | !BYTE $60,$66,$02,$69,$60,$3a,$0a,$66,$a0,$3a,$66,$ce,$a0,$66,$ce,$66,$a0,$66,$a0,$66 4855 | !BYTE $ce,$a0,$66,$ce,$66,$a0,$66,$a0,$3a,$66,$a0,$3a,$66,$ce,$a0,$ce,$60,$3a,$0a,$66 4856 | !BYTE $a0,$3a,$60,$66,$02,$ce,$ce,$66,$a0,$66,$a0,$60,$66,$02,$ce,$ce,$66,$a0,$66,$a0 4857 | !BYTE $3a,$66,$a0,$3a,$60,$66,$02,$a0,$60,$3a,$0a,$66,$a0,$3a,$66,$a0,$3a,$66,$a0,$66 4858 | !BYTE $ce,$66,$a0,$66,$ce,$a0,$66,$69,$66,$ce,$66,$a0,$3a,$66,$a0,$3a,$e9,$a0,$66,$a0 4859 | !BYTE $60,$3a,$0a,$66,$a0,$3a,$66,$69,$3a,$66,$69,$60,$66,$02,$69,$60,$66,$02,$69,$3a 4860 | !BYTE $60,$66,$02,$69,$3a,$66,$69,$3a,$60,$66,$02,$69,$3a 4861 | 4862 | SCR_TEXT: 4863 | !BYTE $60,$20,$20,$5d,$17,$05,$01,$10,$0f,$0e,$60,$20,$20,$5d,$60,$20,$26,$5d,$60,$20 4864 | !BYTE $26,$5d,$60,$20,$26,$5d,$60,$20,$26,$5d,$60,$20,$26,$6b,$60,$40,$05,$60,$20,$20 4865 | !BYTE $5d,$20,$09,$14,$05,$0d,$60,$20,$21,$5d,$60,$20,$26,$5d,$60,$20,$26,$5d,$60,$20 4866 | !BYTE $26,$5d,$60,$20,$26,$5d,$60,$20,$26,$6b,$60,$40,$05,$60,$20,$20,$5d,$20,$0b,$05 4867 | !BYTE $19,$13,$60,$20,$21,$5d,$60,$20,$26,$5d,$60,$20,$26,$6b,$60,$40,$05,$60,$20,$20 4868 | !BYTE $5d,$60,$20,$26,$5d,$60,$20,$26,$5d,$60,$20,$05,$73,$09,$0e,$06,$0f,$12,$0d,$01 4869 | !BYTE $14,$09,$0f,$0e,$6b,$60,$40,$13,$5b,$60,$40,$05,$60,$20,$20,$5d,$08,$05,$01,$0c 4870 | !BYTE $14,$08,$60,$20,$20,$5d,$60,$20,$26,$5d,$60,$71,$05 4871 | 4872 | SCR_ENDGAME: 4873 | !BYTE $55, $60, $40, $03, $73, $01, $14, $14, $01, $03, $0B, $20, $0F, $06, $20 4874 | !BYTE $14, $08, $05, $20, $10, $05, $14, $13, $03, $09, $09, $20, $12, $0F, $02 4875 | !BYTE $0F, $14, $13, $6B, $60, $40, $03, $49, $5D, $60, $20, $25, $5D, $5D, $60 4876 | !BYTE $20, $25, $5D, $5D, $60, $20, $25, $5D, $5D, $60, $20, $25, $5D, $5D, $60 4877 | !BYTE $20, $25, $5D, $5D, $60, $20, $25, $5D, $5D, $60, $20, $0A, $13, $03, $05 4878 | !BYTE $0E, $01, $12, $09, $0F, $3A, $60, $20, $11, $5D, $5D, $60, $20, $25, $5D 4879 | !BYTE $5D, $60, $20, $06, $05, $0C, $01, $10, $13, $05, $04, $20, $14, $09, $0D 4880 | !BYTE $05, $3A, $60, $20, $11, $5D, $5D, $60, $20, $25, $5D, $5D, $60, $20, $02 4881 | !BYTE $12, $0F, $02, $0F, $14, $13, $20, $12, $05, $0D, $01, $09, $0E, $09, $0E 4882 | !BYTE $07, $3A, $60, $20, $11, $5D, $5D, $60, $20, $25, $5D, $5D, $20, $20, $13 4883 | !BYTE $05, $03, $12, $05, $14, $13, $20, $12, $05, $0D, $01, $09, $0E, $09, $0E 4884 | !BYTE $07, $3A, $60, $20, $11, $5D, $5D, $60, $20, $25, $5D, $5D, $60, $20, $08 4885 | !BYTE $04, $09, $06, $06, $09, $03, $15, $0C, $14, $19, $3A, $60, $20, $11, $5D 4886 | !BYTE $5D, $60, $20, $25, $5D, $5D, $60, $20, $25, $5D, $5D, $60, $20, $25, $5D 4887 | !BYTE $5D, $60, $20, $25, $5D, $5D, $60, $20, $25, $5D, $5D, $60, $20, $25, $5D 4888 | !BYTE $5D, $60, $20, $25, $5D, $5D, $60, $20, $25, $5D, $4A, $60, $40, $25, $4B 4889 | 4890 | SCR_CUSTOM_KEYS: 4891 | !BYTE $55, $60, $40, $03, $73, $01, $14, $14, $01, $03, $0B, $20, $0F, $06, $20 4892 | !BYTE $14, $08, $05, $20, $10, $05, $14, $13, $03, $09, $09, $20, $12, $0F, $02 4893 | !BYTE $0F, $14, $13, $6B, $60, $40, $03, $49, $5D, $60, $20, $25, $5D, $5D, $60 4894 | !BYTE $20, $25, $5D, $5D, $60, $20, $03, $10, $12, $05, $13, $13, $20, $14, $08 4895 | !BYTE $05, $20, $0B, $05, $19, $13, $20, $19, $0F, $15, $20, $17, $09, $13, $08 4896 | !BYTE $20, $14, $0F, $20, $15, $13, $05, $60, $20, $03, $5D, $5D, $60, $20, $04 4897 | !BYTE $06, $0F, $12, $20, $14, $08, $05, $20, $06, $0F, $0C, $0C, $0F, $17, $09 4898 | !BYTE $0E, $07, $20, $06, $15, $0E, $03, $14, $09, $0F, $0E, $13, $60, $20, $05 4899 | !BYTE $5D, $5D, $60, $20, $25, $5D, $5D, $60, $20, $25, $5D, $5D, $60, $20, $25 4900 | !BYTE $5D, $5D, $60, $20, $06, $0D, $0F, $16, $05, $20, $15, $10, $3A, $60, $20 4901 | !BYTE $16, $5D, $5D, $60, $20, $04, $0D, $0F, $16, $05, $20, $04, $0F, $17, $0E 4902 | !BYTE $3A, $60, $20, $16, $5D, $5D, $60, $20, $04, $0D, $0F, $16, $05, $20, $0C 4903 | !BYTE $05, $06, $14, $3A, $60, $20, $16, $5D, $5D, $60, $20, $03, $0D, $0F, $16 4904 | !BYTE $05, $20, $12, $09, $07, $08, $14, $3A, $60, $20, $16, $5D, $5D, $60, $20 4905 | !BYTE $06, $06, $09, $12, $05, $20, $15, $10, $3A, $60, $20, $16, $5D, $5D, $60 4906 | !BYTE $20, $04, $06, $09, $12, $05, $20, $04, $0F, $17, $0E, $3A, $60, $20, $16 4907 | !BYTE $5D, $5D, $60, $20, $04, $06, $09, $12, $05, $20, $0C, $05, $06, $14, $3A 4908 | !BYTE $60, $20, $16, $5D, $5D, $60, $20, $03, $06, $09, $12, $05, $20, $12, $09 4909 | !BYTE $07, $08, $14, $3A, $60, $20, $16, $5D, $5D, $20, $03, $19, $03, $0C, $05 4910 | !BYTE $20, $17, $05, $01, $10, $0F, $0E, $13, $3A, $60, $20, $16, $5D, $5D, $60 4911 | !BYTE $20, $02, $03, $19, $03, $0C, $05, $20, $09, $14, $05, $0D, $13, $3A, $60 4912 | !BYTE $20, $16, $5D, $5D, $60, $20, $05, $15, $13, $05, $20, $09, $14, $05, $0D 4913 | !BYTE $3A, $60, $20, $16, $5D, $5D, $20, $13, $05, $01, $12, $03, $08, $20, $0F 4914 | !BYTE $02, $0A, $05, $03, $14, $3A, $60, $20, $16, $5D, $5D, $60, $20, $02, $0D 4915 | !BYTE $0F, $16, $05, $20, $0F, $02, $0A, $05, $03, $14, $3A, $60, $20, $16, $5D 4916 | !BYTE $5D, $60, $20, $25, $5D, $5D, $60, $20, $25, $5D, $5D, $60, $20, $25, $5D 4917 | !BYTE $4A, $60, $40, $25, $4B 4918 | 4919 | CINEMA_MESSAGE: 4920 | !SCR"coming soon: space balls 2 - the search for more money, " 4921 | !SCR"attack of the paperclips: clippy's revenge, " 4922 | !SCR"it came from planet earth, " 4923 | !SCR"rocky 5000, all my circuits the movie, " 4924 | !SCR"conan the librarian, and more! " 4925 | 4926 | 4927 | ;PLASMA Gun (PET / C64) 4928 | WEAPON1A: !BYTE $2c,$20,$20,$20,$20,$2c 4929 | WEAPON1B: !BYTE $e2,$f9,$ef,$e4,$66,$66 4930 | WEAPON1C: !BYTE $20,$20,$20,$20,$5f,$df 4931 | WEAPON1D: !BYTE $20,$20,$20,$20,$20,$20 4932 | 4933 | ;PISTOL (PET / C64) 4934 | PISTOL1A: !BYTE $20,$20,$20,$20,$20,$20 4935 | PISTOL1B: !BYTE $20,$68,$62,$62,$62,$20 4936 | PISTOL1C: !BYTE $20,$20,$20,$5f,$df,$20 4937 | PISTOL1D: !BYTE $20,$20,$20,$20,$20,$20 4938 | 4939 | ;Time Bomb (PET / C64) 4940 | TBOMB1A !BYTE $20,$20,$55,$2a,$20,$20 4941 | TBOMB1B !BYTE $20,$55,$66,$49,$20,$20 4942 | TBOMB1C !BYTE $20,$42,$20,$48,$20,$20 4943 | TBOMB1D !BYTE $20,$4a,$46,$4b,$20,$20 4944 | 4945 | ;EMP (PET / C64) 4946 | EMP1A !BYTE $20,$55,$43,$43,$49,$20 4947 | EMP1B !BYTE $66,$df,$55,$49,$e9,$66 4948 | EMP1C !BYTE $66,$69,$4a,$4b,$5f,$66 4949 | EMP1D !BYTE $20,$4a,$46,$46,$4b,$20 4950 | 4951 | ;Magnet (PET / C64) 4952 | MAG1A !BYTE $4d,$70,$6e,$70,$6e,$4e 4953 | MAG1B !BYTE $20,$42,$42,$48,$48,$20 4954 | MAG1C !BYTE $63,$42,$4a,$4b,$48,$63 4955 | MAG1D !BYTE $4e,$4a,$46,$46,$4b,$4d 4956 | 4957 | ;Medkit (PET / C64) 4958 | MED1A !BYTE $20,$55,$43,$43,$49,$20 4959 | MED1B !BYTE $20,$A0,$A0,$A0,$A0,$20 4960 | MED1C !BYTE $20,$A0,$EB,$F3,$A0,$20 4961 | MED1D !BYTE $20,$E4,$E4,$E4,$E4,$20 4962 | 4963 | ;Mighty Foot (PET / C64) 4964 | ;!BYTE $1f,$df,$20,$20,$e4,$e4 4965 | ;!BYTE $1f,$ba,$e5,$a8,$e7,$a0 4966 | ;!BYTE $20,$20,$20,$20,$20,$e4 4967 | ;!BYTE $06,$0f,$0f,$14,$e9,$ba 4968 | 4969 | ;This array holds the data for the PET's handshake line to 4970 | ;determine what value to place there, based on what note is 4971 | ;being played from 1 to 88. There is a zero at the beginning 4972 | ;as a placeholder to simplify the math in the routine. 4973 | 4974 | NOTE_FREQ: 4975 | !BYTE 00 ;placeholder for zero 4976 | !BYTE 251 ;Note 01 B (Lowest note the PET can produce) 4977 | ;octave 4 4978 | !BYTE 238 ;Note 02 C 4979 | !BYTE 224 ;Note 03 C# 4980 | !BYTE 210 ;Note 04 D 4981 | !BYTE 199 ;Note 05 D# 4982 | !BYTE 188 ;Note 06 E 4983 | !BYTE 177 ;Note 07 F 4984 | !BYTE 168 ;Note 08 F# 4985 | !BYTE 158 ;Note 09 G 4986 | !BYTE 149 ;Note 10 G# 4987 | !BYTE 140 ;Note 11 A 4988 | !BYTE 133 ;Note 12 A# 4989 | !BYTE 251 ;Note 13 B 4990 | ;octave 5 4991 | !BYTE 238 ;Note 14 C 4992 | !BYTE 224 ;Note 15 C# 4993 | !BYTE 210 ;Note 16 D 4994 | !BYTE 199 ;Note 17 D# 4995 | !BYTE 188 ;Note 18 E 4996 | !BYTE 177 ;Note 19 F 4997 | !BYTE 168 ;Note 20 F# 4998 | !BYTE 158 ;Note 21 G 4999 | !BYTE 149 ;Note 22 G# 5000 | !BYTE 140 ;Note 23 A 5001 | !BYTE 133 ;Note 24 A# 5002 | !BYTE 251 ;Note 25 B 5003 | ;octave 6 5004 | !BYTE 238 ;Note 26 C 5005 | !BYTE 224 ;Note 27 C# 5006 | !BYTE 210 ;Note 28 D 5007 | !BYTE 199 ;Note 29 D# 5008 | !BYTE 188 ;Note 30 E 5009 | !BYTE 177 ;Note 31 F 5010 | !BYTE 168 ;Note 32 F# 5011 | !BYTE 158 ;Note 33 G 5012 | !BYTE 149 ;Note 34 G# 5013 | !BYTE 140 ;Note 35 A 5014 | !BYTE 133 ;Note 36 A# (Highest note the PET can produce) 5015 | 5016 | ;This array holds the data for the PET's handshake line to 5017 | ;determine what value to place there, based on what note is 5018 | ;being played from 1 to 88. There is a zero at the beginning 5019 | ;as a placeholder to simplify the math in the routine. 5020 | 5021 | NOTE_OCTAVE: 5022 | !BYTE 00 ;placeholder for zero 5023 | !BYTE 15 ;Note 01 B (Lowest note the PET can produce) 5024 | ;octave 4 5025 | !BYTE 15 ;Note 02 C 5026 | !BYTE 15 ;Note 03 C# 5027 | !BYTE 15 ;Note 04 D 5028 | !BYTE 15 ;Note 05 D# 5029 | !BYTE 15 ;Note 06 E 5030 | !BYTE 15 ;Note 07 F 5031 | !BYTE 15 ;Note 08 F# 5032 | !BYTE 15 ;Note 09 G 5033 | !BYTE 15 ;Note 10 G# 5034 | !BYTE 15 ;Note 11 A 5035 | !BYTE 15 ;Note 12 A# 5036 | !BYTE 51 ;Note 13 B 5037 | ;octave 5 5038 | !BYTE 51 ;Note 14 C 5039 | !BYTE 51 ;Note 15 C# 5040 | !BYTE 51 ;Note 16 D 5041 | !BYTE 51 ;Note 17 D# 5042 | !BYTE 51 ;Note 18 E 5043 | !BYTE 51 ;Note 19 F 5044 | !BYTE 51 ;Note 20 F# 5045 | !BYTE 51 ;Note 21 G 5046 | !BYTE 51 ;Note 22 G# 5047 | !BYTE 51 ;Note 23 A 5048 | !BYTE 51 ;Note 24 A# 5049 | !BYTE 85 ;Note 25 B 5050 | ;octave 6 5051 | !BYTE 85 ;Note 26 C 5052 | !BYTE 85 ;Note 27 C# 5053 | !BYTE 85 ;Note 28 D 5054 | !BYTE 85 ;Note 29 D# 5055 | !BYTE 85 ;Note 30 E 5056 | !BYTE 85 ;Note 31 F 5057 | !BYTE 85 ;Note 32 F# 5058 | !BYTE 85 ;Note 33 G 5059 | !BYTE 85 ;Note 34 G# 5060 | !BYTE 85 ;Note 35 A 5061 | !BYTE 85 ;Note 36 A# (Highest note the PET can produce) 5062 | 5063 | SND_EXPLOSION: 5064 | !BYTE $27, $0B, $0D, $07, $08, $0B, $03, $07, $03, $05, $06, $0C, $0E, $02, $01 5065 | !BYTE $06, $08, $0D, $0B, $01, $05, $06, $07, $0A, $0A, $03, $06, $25 5066 | SND_MEDKIT: 5067 | !BYTE $29, $09, $04, $01, $25 5068 | SND_EMP: 5069 | !BYTE $27, $02, $07, $0C, $11, $16, $1B, $20, $1B, $16, $11, $0C, $07, $02, $25 5070 | SND_MAGNET: 5071 | !BYTE $2A, $17, $0D, $12, $23, $0F, $15, $09, $17, $03, $25 5072 | SND_SHOCK: 5073 | !BYTE $27, $26, $0E, $26, $0E, $26, $0E, $26, $0E, $26, $04 5074 | !BYTE $26, $04, $26, $04, $26, $04, $25 5075 | SND_MOVE_OBJ: 5076 | !BYTE $28, $02, $26, $0E, $26, $25 5077 | SND_PLASMA: 5078 | !BYTE $27, $07, $13, $06, $12, $07, $13, $06, $12 5079 | !BYTE $07, $13, $06, $12, $07, $13, $25 5080 | SND_PISTOL: 5081 | !BYTE $27, $24, $23, $22, $21, $20, $1F, $25 5082 | SND_ITEM_FOUND: 5083 | !BYTE $28, $09, $15, $0B, $17, $0D, $19 5084 | !BYTE $0E, $02, $0E, $02, $0E, $25 5085 | SND_ERROR: 5086 | !BYTE $27, $01, $26, $01, $26, $01, $26, $01, $25 5087 | SND_CYCLE_WEAPON: 5088 | !BYTE $27, $15, $13, $11, $0F, $0D, $15, $25 5089 | SND_CYCLE_ITEM: 5090 | !BYTE $27, $0D, $0C, $0B, $0A, $0B, $0C, $0D, $25 5091 | SND_DOOR: 5092 | !BYTE $28, $0B, $0D, $0E, $10, $12, $13, $15, $25 5093 | SND_MENU_BEEP: 5094 | !BYTE $28, $0E, $04, $25 5095 | SND_SHORT_BEEP: 5096 | !BYTE $28, $11, $25 5097 | INTRO_MUSIC: 5098 | !BYTE $2D, $06, $12, $0F, $03, $0F, $0D, $08, $12, $03, $06, $08, $0A, $03, $12 5099 | !BYTE $03, $09, $2D, $03, $00, $01, $01, $03, $26, $06, $26, $00, $00, $01, $26 5100 | !BYTE $03, $01, $00, $00, $03, $00, $01, $01, $03, $26, $06, $26, $00, $00, $01 5101 | !BYTE $26, $08, $06, $00, $00, $03, $00, $01, $01, $03, $26, $06, $26, $00, $00 5102 | !BYTE $01, $26, $03, $01, $00, $00, $08, $0A, $08, $00, $06, $00, $03, $01, $03 5103 | !BYTE $26, $06, $26, $03, $26, $00, $00, $0F, $00, $0D, $0F, $26, $00, $12, $00 5104 | !BYTE $00, $00, $0D, $0F, $12, $00, $0F, $26, $0F, $00, $0D, $0F, $26, $00, $12 5105 | !BYTE $00, $00, $00, $0D, $0F, $14, $00, $12, $00, $0F, $00, $0D, $0F, $26, $00 5106 | !BYTE $12, $00, $00, $00, $0D, $0F, $14, $00, $0F, $00, $14, $16, $14, $00, $12 5107 | !BYTE $00, $0F, $0D, $0F, $26, $12, $26, $0F, $26, $00, $00, $0F, $00, $0D, $0F 5108 | !BYTE $26, $00, $12, $00, $00, $00, $0D, $0F, $12, $26, $0F, $26, $0F, $00, $0D 5109 | !BYTE $0F, $26, $00, $12, $00, $00, $00, $0D, $0F, $12, $00, $14, $00, $0F, $00 5110 | !BYTE $0D, $0F, $26, $00, $12, $00, $00, $00, $0D, $0F, $12, $00, $0F, $00, $14 5111 | !BYTE $16, $14, $00, $12, $14, $12, $00, $0F, $12, $0D, $00, $0F, $08, $0A, $0B 5112 | !BYTE $0F, $04, $01, $04, $0D, $04, $01, $04, $0F, $04, $01, $04, $12, $04, $01 5113 | !BYTE $04, $0D, $04, $0F, $04, $12, $04, $01, $04, $0D, $04, $01, $04, $0B, $0A 5114 | !BYTE $08, $06, $08, $04, $01, $04, $0F, $04, $01, $04, $0D, $04, $01, $04, $0B 5115 | !BYTE $00 5116 | WIN_MUSIC: 5117 | !BYTE $2C, $07, $00, $09, $00, $0C, $00, $10, $00, $00, $0E, $00, $00, $10, $00 5118 | !BYTE $11, $00, $00, $10, $00, $00, $11, $00, $13, $00, $00, $00, $00, $00, $25 5119 | LOSE_MUSIC: 5120 | !BYTE $2F, $0D, $00, $0B, $00, $09, $00, $08, $00, $06, $00, $02, $00, $00, $04 5121 | !BYTE $00, $00, $06, $00, $00, $00, $00, $00, $25 5122 | IN_GAME_MUSIC1: 5123 | !BYTE $30, $01, $03, $04, $06, $08, $00, $06, $04, $06, $26, $0B, $26, $09, $26 5124 | !BYTE $06, $04, $06, $26, $0B, $26, $09, $26, $04, $03, $04, $26, $09, $26, $08 5125 | !BYTE $00, $00, $00, $01, $03, $04, $06, $08, $00, $06, $04, $06, $26, $0B, $26 5126 | !BYTE $09, $26, $06, $04, $06, $26, $0F, $26, $0B, $26, $09, $08, $09, $00, $00 5127 | !BYTE $00, $08, $00, $00, $00, $09, $00, $14, $00, $15, $00, $0B, $09, $08, $00 5128 | !BYTE $12, $00, $14, $00, $09, $08, $06, $26, $12, $00, $14, $00, $02, $04, $08 5129 | !BYTE $09, $08, $06, $08, $00, $00, $00, $09, $00, $14, $00, $15, $00, $0B, $09 5130 | !BYTE $08, $00, $12, $00, $14, $00, $09, $08, $06, $00, $12, $00, $14, $00, $02 5131 | !BYTE $06, $0D, $00, $0B, $09, $0B, $00, $00, $00, $01, $03, $04, $06, $08, $00 5132 | !BYTE $06, $04, $06, $26, $0B, $26, $09, $26, $06, $04, $06, $26, $0B, $26, $09 5133 | !BYTE $26, $04, $03, $04, $26, $09, $26, $08, $00, $00, $00, $01, $03, $04, $06 5134 | !BYTE $08, $00, $06, $04, $06, $26, $0B, $26, $09, $26, $06, $04, $06, $26, $0F 5135 | !BYTE $26, $0B, $26, $09, $08, $09, $00, $00, $00, $08, $00, $00, $26, $08, $00 5136 | !BYTE $13, $00, $14, $00, $16, $14, $13, $00, $05, $00, $07, $00, $14, $13, $11 5137 | !BYTE $00, $05, $00, $07, $00, $01, $03, $07, $08, $07, $05, $07, $00, $00, $00 5138 | !BYTE $08, $00, $13, $00, $14, $00, $0A, $08, $07, $00, $11, $00, $13, $00, $08 5139 | !BYTE $07, $05, $00, $11, $00, $13, $00, $03, $04, $09, $00, $06, $00, $08, $00 5140 | !BYTE $00 5141 | IN_GAME_MUSIC2: 5142 | !BYTE $2E, $03, $00, $26, $03, $0F, $00, $00, $03, $00, $00, $0F, $00, $01, $0D 5143 | !BYTE $02, $0E, $03, $00, $26, $03, $0F, $00, $00, $03, $00, $00, $0F, $00, $01 5144 | !BYTE $0D, $02, $0E, $0F, $26, $00, $0F, $26, $00, $0F, $26, $00, $0F, $00, $12 5145 | !BYTE $00, $0F, $26, $0F, $26, $00, $0F, $26, $00, $0F, $26, $00, $0F, $00, $14 5146 | !BYTE $00, $0F, $26, $0F, $26, $00, $0F, $26, $00, $0F, $26, $00, $0F, $00, $12 5147 | !BYTE $00, $0F, $00, $0D, $00, $00, $0E, $00, $00, $0F, $30, $00, $00, $26, $00 5148 | !BYTE $00, $2E, $0F, $26, $00, $0F, $26, $00, $0F, $26, $00, $0F, $00, $12, $00 5149 | !BYTE $0F, $00, $0F, $26, $00, $0F, $26, $00, $0F, $26, $00, $0F, $00, $14, $00 5150 | !BYTE $0F, $26, $0F, $26, $00, $0F, $26, $00, $0F, $26, $00, $0F, $00, $12, $00 5151 | !BYTE $0F, $00, $0D, $00, $00, $0E, $00, $00, $0F, $00, $00, $00, $0E, $00, $0D 5152 | !BYTE $00, $0C, $26, $0C, $00, $00, $0E, $00, $00, $0F, $30, $00, $00, $00, $26 5153 | !BYTE $00, $00, $00, $2E, $0C, $00, $00, $0E, $00, $00, $11, $30, $00, $00, $00 5154 | !BYTE $26, $00, $00, $00, $2E, $0C, $00, $00, $0E, $00, $00, $13, $00, $00, $00 5155 | !BYTE $14, $00, $13, $00, $11, $00, $0C, $00, $00, $0E, $00, $00, $0F, $30, $00 5156 | !BYTE $00, $00, $26, $00, $00, $00, $2E, $0C, $00, $00, $0E, $00, $00, $11, $30 5157 | !BYTE $00, $00, $00, $26, $00, $00, $00, $2E, $0C, $00, $00, $0E, $00, $00, $13 5158 | !BYTE $00, $00, $00, $14, $00, $13, $00, $11, $00, $0F, $00, $0E, $00, $0D, $2E 5159 | !BYTE $00 5160 | IN_GAME_MUSIC3: 5161 | !BYTE $2C, $02, $00, $09, $00, $0E, $00, $09, $00, $0E, $00, $09, $00, $02, $00 5162 | !BYTE $09, $00, $0C, $00, $09, $00, $0C, $00, $09, $00, $02, $00, $09, $00, $0E 5163 | !BYTE $00, $09, $00, $0E, $00, $09, $00, $02, $00, $09, $00, $0C, $00, $09, $00 5164 | !BYTE $0C, $00, $09, $00, $2F, $0E, $00, $00, $00, $00, $2C, $0C, $00, $00, $00 5165 | !BYTE $09, $00, $0C, $00, $00, $00, $00, $00, $02, $00, $09, $00, $0C, $00, $00 5166 | !BYTE $00, $09, $00, $0C, $00, $2F, $0E, $00, $00, $00, $00, $2C, $0C, $00, $09 5167 | !BYTE $00, $26, $00, $09, $00, $26, $00, $00, $00, $09, $00, $0C, $00, $10, $00 5168 | !BYTE $11, $00, $10, $00, $0C, $00, $2F, $0E, $00, $00, $00, $00, $2C, $0C, $00 5169 | !BYTE $00, $00, $09, $00, $0C, $00, $00, $00, $00, $00, $02, $00, $09, $00, $0C 5170 | !BYTE $00, $00, $00, $09, $00, $0C, $00, $2F, $0E, $00, $00, $00, $00, $2C, $10 5171 | !BYTE $00, $00, $00, $00, $00, $13, $00, $00, $00, $00, $00, $00, $02, $00, $05 5172 | !BYTE $00, $07, $00, $09, $00, $07, $00, $0B, $00, $2F, $10, $00, $00, $00, $00 5173 | !BYTE $2C, $0E, $00, $0C, $00, $26, $00, $0C, $00, $26, $00, $0E, $00, $26, $00 5174 | !BYTE $0B, $00, $00, $00, $00, $00, $09, $00, $0B, $00, $10, $00, $26, $00, $10 5175 | !BYTE $00, $12, $00, $26, $00, $17, $00, $26, $00, $15, $00, $00, $00, $00, $00 5176 | !BYTE $00, $00, $12, $00, $00, $00, $00, $00, $00, $00, $14, $00, $00, $00, $00 5177 | !BYTE $00, $00, $11, $00, $00, $00, $00, $00, $00, $13, $00, $00, $00, $00, $00 5178 | !BYTE $00 5179 | 5180 | 5181 | 5182 | 5183 | 5184 | 5185 | 5186 | 5187 | --------------------------------------------------------------------------------