MISC.S (13377B)
1 * misc 2 org = $f900 3 DemoDisk = 0 4 tr on 5 lst off 6 *------------------------------- 7 org org 8 9 jmp VANISHCHAR 10 jmp MOVEMUSIC 11 clc 12 bcc MOVEAUXLC ;relocatable 13 jmp FIRSTGUARD 14 jmp MARKMETERS 15 16 jmp POTIONEFFECT 17 jmp MOUSERESCUE 18 jmp STABCHAR 19 jmp UNHOLY 20 jmp REFLECTION 21 22 jmp MARKKIDMETER 23 jmp MARKOPPMETER 24 jmp BONESRISE 25 jmp DECSTR 26 jmp DOSAVEGAME 27 28 jmp LOADLEVELX 29 jmp CHECKALERT 30 jmp DISPVERSION 31 32 *------------------------------- 33 lst 34 put eq 35 lst 36 put gameeq 37 lst 38 put seqdata 39 lst 40 put movedata 41 lst 42 put soundnames 43 lst off 44 45 dum $f0 46 ]Xcount ds 1 47 ]Xend ds 1 48 dend 49 50 *------------------------------- 51 ALTZPon = $c009 52 ALTZPoff = $c008 53 RAMWRTaux = $c005 54 RAMWRTmain = $c004 55 RAMRDaux = $c003 56 RAMRDmain = $c002 57 ADSTOREon = $c001 58 ADSTOREoff = $c000 59 RWBANK2 = $c083 60 RWBANK1 = $c08b 61 62 POPside1 = $a9 63 POPside2 = $ad 64 65 FirstSideB = 3 66 67 *------------------------------- 68 * 69 * Vanish character 70 * 71 *------------------------------- 72 VANISHCHAR 73 lda #86 74 sta CharFace 75 lda #0 76 sta CharAction 77 sta CharLife 78 sec 79 sbc OppStrength 80 sta ChgOppStr 81 ]rts rts 82 83 *------------------------------- 84 * 85 * Move a block of memory 86 * 87 * In: A < X.Y 88 * 89 * 20 < 40.60 means 2000 < 4000.5fffm 90 * WARNING: If x >= y, routine will wipe out 64k 91 * 92 *------------------------------- 93 dum locals 94 ]dest ds 2 95 ]source ds 2 96 ]endsourc ds 2 97 dend 98 99 MOVEMEM sta ]dest+1 100 stx ]source+1 101 sty ]endsourc+1 102 103 ldy #0 104 sty ]dest 105 sty ]source 106 sty ]endsourc 107 108 :loop lda (]source),y 109 sta (]dest),y 110 iny 111 bne :loop 112 113 inc ]source+1 114 inc ]dest+1 115 lda ]source+1 116 cmp ]endsourc+1 117 bne :loop 118 rts 119 120 *------------------------------- 121 * 122 * Move 1K of music data from $5000 mainmem to aux l.c. 123 * 124 *------------------------------- 125 MOVEMUSIC 126 bit RWBANK1 127 bit RWBANK1 128 sta RAMRDmain 129 130 lda #$d0 131 ldx #$50 132 ldy #$54 133 jsr MOVEMEM 134 135 sta RAMRDaux 136 ]rts rts 137 138 *------------------------------- 139 * 140 * Move $2000.5FFF mainmem to auxiliary language card 141 * Also sets interrupt vector ($FFFE.FFFF) in both l.c.'s 142 * 143 * NOTE: This code is loaded into mainmem by MASTER 144 * and called while still in mainmem. Once in aux l.c. 145 * this routine is useless! 146 * 147 * Returns control to main l.c. bank 1 148 * 149 *------------------------------- 150 Tmovemem = MOVEMEM-$b000 151 152 MOVEAUXLC 153 sta ALTZPon 154 bit RWBANK2 155 bit RWBANK2 156 157 lda #$d0 158 ldx #$20 159 ldy #$50 160 jsr Tmovemem 161 162 bit RWBANK1 163 bit RWBANK1 164 165 lda #$d0 166 ldx #$50 167 ldy #$60 168 jsr Tmovemem 169 170 * & set VBL interrupts 171 172 lda #vbli ;routine in GRAFIX 173 sta $FFFE 174 lda #>vbli 175 sta $FFFF 176 177 sta ALTZPoff 178 179 lda #vbli 180 sta $FFFE 181 lda #>vbli 182 sta $FFFF ;set in main l.c. too 183 184 rts 185 186 *------------------------------- 187 * 188 * Player can't run or jump past en-garde guard 189 * 190 *------------------------------- 191 FIRSTGUARD 192 lda EnemyAlert 193 cmp #2 194 bcc ]rts 195 lda CharSword 196 bne ]rts 197 lda OpSword 198 beq ]rts 199 lda OpAction 200 cmp #2 201 bcs ]rts 202 203 lda CharFace 204 cmp OpFace 205 beq ]rts 206 207 jsr getopdist 208 cmp #-15 209 bcc ]rts 210 211 * Bump off guard 212 213 ldx CharBlockY 214 lda FloorY+1,x 215 sta CharY 216 lda #bump 217 jsr jumpseq 218 jmp animchar 219 220 *------------------------------- 221 * 222 * Mark strength meters 223 * 224 *------------------------------- 225 Mark3 jsr Mark1 ;mark 3 blocks 226 iny 227 Mark2 jsr Mark1 ;mark 2 blocks 228 iny 229 Mark1 lda #4 230 sta height 231 clc 232 lda #2 233 jsr markwipe 234 jmp markred 235 236 MARKMETERS 237 jsr MARKKIDMETER 238 jmp MARKOPPMETER 239 240 MARKKIDMETER 241 ldy #20 242 bne Mark3 243 244 MARKOPPMETER 245 ldy #28 246 bne Mark2 247 ]rts rts 248 249 *------------------------------- 250 * 251 * Potion takes effect 252 * 253 *------------------------------- 254 wtlesstimer = 200 255 vibetimer = 3 256 257 POTIONEFFECT 258 lda CharID 259 bne ]rts 260 261 ldx lastpotion 262 beq ]rts 263 bpl :notswd 264 265 * Sword (-1) 266 267 lda #1 268 sta gotsword 269 lda #s_Sword 270 ldx #25 271 jsr cuesong 272 lda #$ff 273 sta lightcolor 274 lda #3 275 sta lightning ;3 white flashes 276 rts 277 278 * Recharge meter (1) 279 280 :notswd cpx #1 281 bne :2 282 283 lda KidStrength 284 cmp MaxKidStr 285 beq ]rts ;already at full strength 286 287 lda #$99 288 sta lightcolor 289 lda #2 290 sta lightning ;2 orange flashes 291 lda #s_ShortPot 292 ldx #25 293 jsr cuesong 294 lda #1 295 sta ChgKidStr 296 rts 297 298 * Boost meter (2) 299 300 :2 cpx #2 301 bne :3 302 lda #$99 303 sta lightcolor 304 lda #5 305 sta lightning ;5 orange flashes 306 lda #s_Potion 307 ldx #25 308 jsr cuesong 309 jmp boostmeter 310 311 * Weightless (3) 312 313 :3 cpx #3 314 bne :4 315 lda #s_ShortPot 316 ldx #25 317 jsr cuesong 318 lda #wtlesstimer 319 sta weightless 320 lda #vibetimer 321 sta vibes 322 rts 323 324 * Upside down (4) 325 326 :4 cpx #4 327 bne :5 328 lda invert 329 eor #$ff 330 sta invert 331 lda #2 332 sta redrawflg 333 jmp inverty 334 335 * Yecch (5) 336 337 :5 cpx #5 338 bne :6 339 lda #Splat ;yecch 340 jsr addsound 341 lda #-1 342 sta ChgKidStr 343 rts 344 :6 345 ]rts rts 346 347 *------------------------------- 348 * 349 * Mouse rescues you 350 * 351 *------------------------------- 352 MOUSERESCUE 353 jsr LoadKid 354 355 lda #24 ;mouse 356 sta CharID 357 lda #200 358 sta CharX 359 ldx #0 360 stx CharBlockY 361 lda FloorY+1,x 362 sta CharY 363 lda #-1 364 sta CharFace 365 sta CharLife 366 lda #1 367 sta OppStrength 368 369 lda #Mscurry 370 jsr jumpseq 371 jsr animchar 372 373 jmp SaveShad 374 375 *------------------------------- 376 * 377 * Stab character 378 * 379 *------------------------------- 380 STABCHAR 381 lda CharLife 382 bpl ]rts ;already dead 383 lda CharSword 384 cmp #2 385 bne :DL ;defenseless 386 lda CharID 387 cmp #4 388 beq :wounded ;skel has no life points 389 390 lda #1 391 jsr decstr 392 bne :wounded 393 394 ldx CharID 395 beq :killed 396 397 ldx CharID 398 cpx #4 ;skeleton 399 bne :killed 400 lda #0 401 sta ChgOppStr ;skel is invincible 402 ]rts rts 403 404 :killed jsr getbehind 405 cmp #space 406 bne :onground 407 jsr getdist ;to EOB 408 cmp #4 409 bcc :onground 410 ;if char is killed at edge, knock him off 411 sec 412 sbc #14 413 jsr addcharx 414 sta CharX 415 inc CharBlockY 416 lda #fightfall 417 jsr jumpseq 418 jmp :3 419 420 :onground lda #stabkill 421 bne :2 422 423 :wounded lda #stabbed 424 :2 jsr jumpseq 425 426 :1 ldx CharBlockY 427 lda FloorY+1,x 428 sta CharY 429 lda #0 430 sta CharYVel 431 432 :3 lda #Splat 433 jsr addsound 434 435 jmp animchar 436 437 * stabbed when defenseless 438 439 :DL lda #100 440 jsr decstr 441 442 lda #stabkill ;dropdead? 443 jmp :killed 444 445 *------------------------------- 446 * 447 * If shadow dies, you die (& vice versa) 448 * 449 *------------------------------- 450 UNHOLY 451 lda level 452 cmp #12 453 bne ]rts 454 455 lda OpID 456 ora CharID 457 cmp #1 ;kid & shadow? 458 bne ]rts 459 460 lda CharLife 461 bpl ]rts 462 lda OpLife 463 bmi ]rts 464 ;live char, dead opponent 465 lda #$ff 466 sta lightcolor 467 lda #5 468 sta lightning 469 lda #Splat 470 jsr addsound 471 lda #100 472 jmp decstr 473 ]rts rts 474 475 *------------------------------- 476 * 477 * R E F L E C T I O N 478 * 479 *------------------------------- 480 do DemoDisk 481 REFLECTION 482 BONESRISE 483 brk 484 else 485 486 REFLECTION 487 jsr LoadKid 488 jsr GetFrameInfo 489 490 lda createshad ;flag set? 491 cmp #$ff 492 beq CreateShad ;yes--reflection comes to life 493 494 jsr getunderft 495 cmp #mirror ;is kid standing before mirror? 496 bne ]rts ;no 497 498 jsr getreflect ;get char data for reflection 499 500 lda dmirr ;if kid is on wrong side of mirror, 501 bmi ]rts ;don't draw reflection 502 503 * Draw kid's reflection (as a pseudo-character) 504 505 jsr setupchar 506 507 * Crop edges 508 509 ldx CharBlockY 510 inx 511 lda BlockTop,x 512 cmp FCharY 513 bcs ]rts 514 sta FCharCU 515 516 lda CharBlockX ;of mirror 517 asl 518 asl ;x 4 519 clc 520 adc #1 521 sta FCharCL 522 523 jmp addreflobj ;normal reflection 524 525 *------------------------------- 526 * Get char data for kid's reflection 527 528 getreflect 529 lda CharBlockX 530 jsr getblockej 531 clc 532 adc #angle+3 ;fudge factor 533 sta mirrx ;mirror x-coord (0-139) 534 535 jsr getdist 536 537 ldx CharFace 538 bmi :left 539 540 eor #$ff ;facing right-- 541 clc 542 adc #14 ;get dist to back of block 543 544 :left sec 545 sbc #2 ;another fudge factor 546 sta dmirr ;distance from mirror 547 548 lda mirrx 549 asl 550 sec 551 sbc CharX 552 sta CharX ;reflection x-coord 553 554 lda CharFace 555 eor #$ff 556 sta CharFace 557 558 ]rts rts 559 560 *------------------------------- 561 * Bring reflection to life as shadowman 562 563 CreateShad 564 jsr getreflect ;get char data for reflection 565 566 lda #0 567 sta createshad 568 569 lda #1 ;shadman 570 sta CharID 571 572 lda #MirrorCrack 573 jsr addsound 574 575 jsr SaveShad 576 577 lda MaxKidStr 578 sta MaxOppStr 579 sta OppStrength 580 lda #1 581 sta KidStrength 582 jmp markmeters 583 584 *------------------------------- 585 * 586 * Bones rise 587 * 588 *------------------------------- 589 skelscrn = 1 590 skelx = 5 591 skely = 1 592 skeltrig = 2 593 skelprog = 2 594 595 BONESRISE 596 lda level 597 cmp #3 598 bne ]rts 599 600 lda ShadFace 601 cmp #86 602 bne ]rts 603 lda VisScrn 604 cmp #skelscrn 605 bne ]rts 606 lda exitopen 607 beq ]rts 608 lda KidBlockX 609 cmp #skeltrig 610 beq :trig 611 cmp #skeltrig+1 612 bne ]rts 613 614 * Remove dead skeleton 615 616 :trig lda VisScrn 617 ldx #skelx 618 ldy #skely 619 jsr rdblock 620 pha 621 lda #floor 622 sta (BlueType),y 623 lda #24 624 sta height 625 lda #2 626 jsr markred 627 jsr markwipe 628 iny 629 jsr markred 630 jsr markwipe 631 pla 632 cmp #bones 633 bne ]rts 634 635 * Create live skeleton 636 637 lda VisScrn 638 sta CharScrn 639 640 ldx #skely 641 stx CharBlockY 642 lda FloorY+1,x 643 sta CharY 644 645 lda #skelx 646 sta CharBlockX 647 jsr getblockej 648 clc 649 adc #angle+7 650 sta CharX 651 652 lda #-1 ;left 653 sta CharFace 654 655 lda #arise 656 jsr jumpseq 657 jsr animchar 658 659 lda #skelprog 660 sta guardprog 661 662 lda #-1 663 sta CharLife 664 lda #3 665 sta OppStrength 666 667 lda #0 668 sta alertguard 669 sta refract 670 sta CharXVel 671 sta CharYVel 672 673 lda #2 674 sta CharSword 675 676 lda #4 ;skeleton 677 sta CharID 678 679 jmp SaveShad ;save ShadVars 680 681 fin 682 683 *------------------------------- 684 * 685 * Decrease strength by A (non-0) 686 * 687 * Out: non-0 if char lives, 0 if he dies 688 * ChgStrength 689 * 690 *------------------------------- 691 DECSTR 692 ldx CharID 693 bne :enemy 694 695 cmp KidStrength 696 bcs killkid 697 698 eor #$ff 699 clc 700 adc #1 ;negate 701 sta ChgKidStr 702 rts 703 704 :enemy 705 cmp OppStrength 706 bcs killopp 707 708 eor #$ff 709 clc 710 adc #1 711 sta ChgOppStr 712 rts 713 714 *------------------------------- 715 * Kill character (or opponent) 716 * Return A = 0 717 *------------------------------- 718 killkid 719 lda #0 720 sec 721 sbc KidStrength 722 sta ChgKidStr 723 724 lda #0 725 ]rts rts 726 727 *------------------------------- 728 killopp 729 lda #0 730 sec 731 sbc OppStrength 732 sta ChgOppStr 733 734 lda #0 735 ]rts rts 736 737 738 *------------------------------- 739 * Save current game to disk 740 * 741 * In: SavLevel = level ($ff to erase saved game) 742 *------------------------------- 743 DOSAVEGAME 744 lda level 745 cmp #FirstSideB 746 bcs :doit ;must have reached side B 747 lda #Splat 748 jmp addsound 749 :doit 750 751 * Put data into save-game data area 752 753 lda origstrength 754 sta SavStrength 755 756 lda FrameCount 757 sta SavTimer 758 lda FrameCount+1 759 sta SavTimer+1 760 761 lda NextTimeMsg 762 sta SavNextMsg 763 764 * Write to disk 765 766 jmp savegame 767 768 *------------------------------- 769 * alt bg & char set list 770 * Level #: 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 771 772 bgset1 db 00,00,00,00,01,01,01,02,02,02,01,01,02,02,01 773 bgset2 db 00,00,00,00,01,01,01,02,02,02,01,01,02,02,01 774 chset db 00,00,00,01,02,02,03,02,02,02,02,02,04,05,05 775 776 * blueprint track & region lists (indexed by level #) 777 * NOTE--make sure these match lists in DIALOGER 778 779 bluepTRKlst 780 db 33,33,32 ;3 levels on side A 781 db 33,33,32,32,31,31 ;12 levels on side B 782 db 30,30,29,29,28,28 783 784 bluepREGlst 785 db 0,1,1 786 db 0,1,0,1,0,1 787 db 0,1,0,1,0,1 788 789 *------------------------------- 790 * 791 * Load level from disk 792 * In: X = level # (0-14) 793 * 794 *------------------------------- 795 LOADLEVELX 796 lda bluepTRKlst,x 797 sta bluepTRK 798 lda bluepREGlst,x 799 sta bluepREG 800 801 lda bgset1,x ;A 802 pha 803 lda bgset2,x ;X 804 ldy chset,x ;Y 805 tax 806 pla 807 808 jmp loadlevel ;in MASTER 809 ]rts rts 810 811 *------------------------------- 812 * 813 * In: Kid & Shad data 814 * Out: EnemyAlert 815 * 2: kid & shad are on same stretch of floor 816 * 1: slicer, gaps in floor, or other obstacles, but 817 * line of sight is clear 818 * 0: can't see each other 819 * 820 *------------------------------- 821 gfightthres = 28*4 822 823 ]safe lda #0 824 sta EnemyAlert 825 ]rts rts 826 827 CHECKALERT 828 lda ShadID 829 cmp #24 ;mouse? 830 beq ]rts 831 cmp #1 ;shadowman? 832 bne :notshad 833 lda level 834 cmp #12 835 bne ]safe ;fight shadow only on level 12 836 837 :notshad 838 lda KidPosn 839 beq ]safe 840 cmp #219 841 bcc :noclimb 842 cmp #229 843 bcc ]safe ;on staircase 844 :noclimb 845 lda ShadFace 846 cmp #86 847 beq ]safe 848 849 lda KidLife 850 and ShadLife 851 bpl ]safe ;one is dead 852 853 lda KidScrn 854 cmp ShadScrn 855 bne ]safe 856 857 lda KidBlockY 858 cmp ShadBlockY 859 bne ]safe 860 861 lda #2 ;clear path 862 sta EnemyAlert 863 864 * Get range of blocks to scan (]Xcount --> ]Xend) 865 866 lda KidBlockX 867 jsr getblockej 868 clc 869 adc #7 ;middle of block 870 sta ]Xcount 871 872 lda ShadBlockX 873 jsr getblockej 874 clc 875 adc #7 876 sta ]Xend 877 878 do 0 879 lda ]Xcount 880 jsr getblockxp 881 ldx #1 882 jsr showpage 883 lda ]Xend 884 jsr getblockxp 885 ldx #2 886 jsr showpage 887 fin 888 889 lda ]Xend 890 cmp ]Xcount 891 bcs :cont 892 tax 893 lda ]Xcount 894 sta ]Xend 895 stx ]Xcount 896 :cont 897 898 * If leftmost block is a slicer, skip it 899 900 lda ]Xcount 901 jsr :rdblock 902 cmp #slicer 903 bne :1 904 lda #14 905 clc 906 adc ]Xcount 907 sta ]Xcount 908 909 * If rightmost block is a gate, skip it 910 911 :1 lda ]Xend 912 jsr :rdblock 913 cmp #gate 914 bne :20 915 lda ]Xend 916 sec 917 sbc #14 918 sta ]Xend 919 920 :20 lda ]Xend 921 cmp ]Xcount 922 bcc :rts 923 924 * Scan from ]Xcount to ]Xend (left to right) 925 926 lda ]Xcount 927 :loop cmp ]Xend 928 beq :9 929 bcs :rts 930 931 :9 jsr :rdblock 932 933 cmp #block 934 beq :safe 935 cmp #panelwif 936 beq :safe 937 cmp #panelwof 938 beq :safe ;solid barrier blocks view 939 940 cmp #loose 941 beq :view 942 cmp #gate 943 bne :2 944 lda (BlueSpec),y 945 cmp #gfightthres 946 bcs :clear 947 bcc :view 948 949 :2 cmp #slicer 950 beq :view 951 952 jsr cmpspace 953 bne :clear ;closed gate, slicer, gap in floor, etc. 954 ;are obstacles but don't block view 955 :view lda #1 956 sta EnemyAlert 957 958 :clear lda ]Xcount 959 clc 960 adc #14 961 sta ]Xcount 962 bne :loop 963 :rts 964 ]rts rts 965 966 :safe lda #0 967 sta EnemyAlert 968 ]rts rts 969 970 *------------------------------- 971 * In: A = X-coord 972 * Out: rdblock results 973 *------------------------------- 974 :rdblock jsr getblockxp 975 tax 976 ldy KidBlockY 977 lda KidScrn 978 jmp rdblock 979 980 *------------------------------- 981 * 982 * Display version # on text page 1 (& wait for keypress) 983 * 984 *------------------------------- 985 DISPVERSION 986 lda #" " 987 jsr lrcls 988 989 sta RAMWRTmain 990 991 ldx #0 992 :loop lda textline,x 993 cmp #"@" 994 beq :done 995 sta $400,x ;top line of screen 996 inx 997 bpl :loop 998 :done 999 lda RAMWRTaux 1000 sta $c054 ;PAGE2 off 1001 sta $c051 ;TEXT on 1002 1003 * Wait for keypress 1004 1005 :wloop lda $c000 1006 bpl :wloop 1007 sta $c010 1008 1009 lda $c057 ;HIRES on 1010 lda $c050 ;TEXT off 1011 lda PAGE 1012 bne :1 1013 lda $c055 ;PAGE2 on 1014 :1 1015 lda #" " 1016 jmp lrcls 1017 1018 *------------------------------- 1019 lst 1020 ds 1 1021 usr $a9,21,$b00,*-org 1022 lst off