SUBS.S (22871B)
1 * subs 2 DemoDisk = 0 3 EditorDisk = 0 4 CheckTimer = 0 5 org = $e000 6 tr on 7 lst off 8 *------------------------------- 9 * 10 * S U B S 11 * 12 *------------------------------- 13 org org 14 15 jmp ADDTORCHES 16 jmp DOFLASHON 17 jmp PAGEFLIP 18 jmp DEMO 19 jmp SHOWTIME 20 21 jmp DOFLASHOFF 22 jmp LRCLSE 23 jmp potioneffect 24 jmp checkalert 25 jmp reflection 26 27 jmp ADDSLICERS 28 jmp PAUSE 29 jmp bonesrise 30 jmp DEADENEMY 31 jmp PLAYCUT 32 33 jmp ADDLOWERSOUND 34 jmp REMOVEOBJ 35 jmp ADDFALL 36 jmp SETINITIALS 37 jmp STARTKID 38 39 jmp STARTKID1 40 jmp GRAVITY 41 jmp INITIALGUARDS 42 jmp MIRAPPEAR 43 jmp CRUMBLE 44 45 *------------------------------- 46 lst 47 put eq 48 lst 49 put gameeq 50 lst 51 put seqdata 52 lst 53 put movedata 54 lst 55 put soundnames 56 lst off 57 58 *------------------------------- 59 dum $f0 60 ]Xcount ds 1 61 ]Xend ds 1 62 tempstate ds 1 63 dend 64 65 66 POPside1 = $a9 67 POPside2 = $ad 68 69 * Message #s 70 71 LevelMsg = 1 72 ContMsg = 2 73 TimeMsg = 3 74 75 timemsgtimer = 20 76 77 mirscrn = 4 78 mirx = 4 79 miry = 0 ;also in topctrl, auto 80 81 *------------------------------- 82 do CheckTimer 83 min = 180 84 else 85 min = 1090 ;# frames per "minute" 86 fin ;actual frame rate approx. 11 fps) 87 88 sec = min/60 89 t = 60 ;game time limit 90 91 *------------------------------- 92 ALTZPon = $c009 93 ALTZPoff = $c008 94 RAMWRTaux = $c005 95 RAMWRTmain = $c004 96 RAMRDaux = $c003 97 RAMRDmain = $c002 98 99 *------------------------------- 100 SceneCount ds 2 101 102 *------------------------------- 103 * Level 13 only: When you enter, trigger loose floors on 104 * screen above 105 *------------------------------- 106 ]rts rts 107 108 CRUMBLE 109 lda level 110 cmp #13 111 bne ]rts 112 lda VisScrn 113 cmp #23 114 beq :1 115 cmp #16 116 bne ]rts 117 ;Trigger blocks 2-7 on bottom row of scrn above 118 :1 lda scrnAbove 119 sta tempscrn 120 lda #2 121 sta tempblocky 122 ldx #7 123 :loop stx tempblockx 124 jsr :trigloose 125 ldx tempblockx 126 dex 127 cpx #2 128 bcs :loop 129 ]rts rts 130 131 :trigloose 132 jsr rdblock1 133 cmp #loose 134 bne ]rts 135 jsr rnd 136 and #$0f 137 eor #$ff 138 clc 139 adc #1 140 jmp breakloose1 141 142 *------------------------------- 143 * Add all flasks & torches on VisScrn to trans list 144 * & swords 145 *------------------------------- 146 ADDTORCHES 147 lda VisScrn 148 jsr calcblue 149 150 ldy #29 151 :loop lda (BlueType),y 152 and #idmask 153 cmp #torch 154 bne :c1 155 tya 156 pha 157 lda VisScrn 158 jsr trigtorch 159 pla 160 tay 161 bpl :cont 162 163 :c1 cmp #flask 164 bne :c2 165 tya 166 pha 167 lda VisScrn 168 jsr trigflask 169 pla 170 tay 171 bpl :cont 172 173 :c2 cmp #sword 174 bne :cont 175 tya 176 pha 177 lda VisScrn 178 jsr trigsword 179 pla 180 tay 181 :cont dey 182 bpl :loop 183 184 ]rts rts 185 186 *------------------------------- 187 * 188 * In: A = length of pause (1-256) 189 * 190 *------------------------------- 191 PAUSE 192 :outer pha 193 ldx #0 194 :loop dex 195 bne :loop 196 pla 197 sec 198 sbc #1 199 bne :outer 200 ]rts rts 201 202 *------------------------------- 203 * 204 * F L A S H 205 * 206 * Has a traumatic incident occured this frame? 207 * If so, do lightning flash 208 * 209 *------------------------------- 210 DOFLASHON 211 jsr lrclse 212 213 jsr vblank 214 215 lda $c054 216 lda $c056 ;show lores 217 rts 218 219 *------------------------------- 220 DOFLASHOFF 221 jsr vblank 222 223 lda PAGE 224 bne :1 225 226 lda $c055 227 :1 lda $c057 ;show hires 228 229 rts 230 231 *------------------------------- 232 * 233 * Clear lo-res screen only if we need to 234 * 235 * In: A = byte value 236 * 237 *------------------------------ 238 LRCLSE 239 cmp scrncolor ;last scrncolor 240 beq ]rts 241 242 jmp lrcls 243 244 *------------------------------- 245 * Add all slicers on CharBlockY to trans list 246 *------------------------------- 247 slicetimer = 15 ;from mover 248 slicersync = 3 ;# frames out of sync 249 250 ADDSLICERS 251 lda #slicetimer 252 sta tempstate 253 254 lda CharScrn 255 jsr calcblue 256 257 ldy CharBlockY 258 cpy #3 259 bcs ]rts 260 261 lda Mult10,y 262 tay 263 clc 264 adc #10 265 sta :sm+1 266 :loop 267 lda (BlueType),y 268 and #idmask 269 cmp #slicer 270 bne :cont 271 272 lda (BlueSpec),y 273 tax 274 and #$7f 275 beq :ok 276 cmp #slicerRet 277 bcc :cont ;in mid-slice--leave it alone 278 :ok txa 279 and #$80 ;get hibit 280 ora tempstate 281 jsr trigslicer ;trigger slicer 282 jsr getnextstate 283 284 :cont iny 285 :sm cpy #0 286 bcc :loop 287 288 ]rts rts 289 290 getnextstate 291 lda tempstate 292 sec 293 sbc #slicersync 294 cmp #slicerRet 295 bcs :ok 296 clc 297 adc #slicetimer+1-slicerRet 298 :ok sta tempstate 299 ]rts rts 300 301 *------------------------------- 302 * 303 * Special animation lists for princess's room 304 * 305 *------------------------------- 306 ptorchx db 13,25,-1 307 ptorchoff db 0,6 308 ptorchy db 113,113 309 ptorchstate db 1,6 310 ptorchcount ds 1 311 psandcount ds 1 312 pstarcount ds 4 313 314 *------------------------------- 315 * 316 * Burn torches (Princess's room) 317 * 318 *------------------------------- 319 pburn 320 ldx ptorchcount ;last torch burned 321 inx 322 lda ptorchx,x 323 bpl :ok 324 ldx #0 325 :ok stx ptorchcount 326 lda ptorchx,x 327 sta XCO 328 lda ptorchoff,x 329 sta OFFSET 330 lda ptorchy,x 331 sta YCO 332 lda ptorchstate,x 333 jsr getflameframe 334 sta ptorchstate,x 335 tax 336 jsr psetupflame 337 jmp lay ;<---DIRECT HIRES CALL 338 339 *------------------------------- 340 * 341 * Flow sand 342 * 343 *------------------------------- 344 pflow 345 ldx psandcount 346 bmi ]rts ;no hourglass yet 347 inx 348 cpx #3 349 bcc :ok 350 ldx #0 351 :ok stx psandcount 352 ldy GlassState 353 jmp flow ;<---Contains direct hires call 354 355 *------------------------------- 356 * 357 * Twinkle stars 358 * 359 *------------------------------- 360 pstars 361 ldx #3 362 :loop lda pstarcount,x 363 beq :ok 364 dec pstarcount,x 365 bne :ok 366 txa 367 pha 368 jsr twinkle ;turn it off 369 pla 370 tax 371 :ok dex 372 bpl :loop 373 374 * New twinkle? 375 376 jsr rnd 377 cmp #10 378 bcs ]rts 379 jsr rnd 380 and #3 381 clc 382 adc #5 ;A = rnd length of twinkle (5-8) 383 pha 384 jsr rnd 385 jsr rnd 386 and #3 387 tax ;X = rnd star # (0-3) 388 pla 389 sta pstarcount,x 390 jmp twinkle ;<---Contains direct hires call 391 392 *------------------------------- 393 * 394 * P A G E F L I P 395 * 396 *------------------------------- 397 PAGEFLIP 398 jsr normspeed ;IIGS 399 lda PAGE 400 bne :1 401 402 lda #$20 403 sta PAGE 404 lda $C054 ;show page 1 405 406 :3 lda $C057 ;hires on 407 lda $C050 ;text off 408 lda vibes 409 beq :rts 410 lda $c05e 411 ]rts rts 412 :rts lda $c05f 413 rts 414 415 :1 lda #0 416 sta PAGE 417 lda $C055 ;show page 2 418 jmp :3 419 420 *------------------------------- 421 * 422 * Play pre-recorded "princess" scenes 423 * 424 * In: A = scene # 425 * 426 *------------------------------- 427 AddrL db #PlayCut0,#PlayCut1,#PlayCut2,#PlayCut3 428 db #PlayCut4,#PlayCut5,#PlayCut6,#PlayCut7 429 db #PlayCut8 430 AddrH db #>PlayCut0,#>PlayCut1,#>PlayCut2,#>PlayCut3 431 db #>PlayCut4,#>PlayCut5,#>PlayCut6,#>PlayCut7 432 db #>PlayCut8 433 434 PLAYCUT 435 pha 436 jsr initit 437 pla 438 tax 439 440 do 0 ;temp 441 jmp PlayCut4 442 fin 443 444 lda AddrL,x 445 sta :sm+1 446 lda AddrH,x 447 sta :sm+2 448 :sm jsr $FFFF ;self-mod 449 450 lda #1 451 sta SPEED 452 ]rts rts 453 454 *------------------------------- 455 do DemoDisk 456 PlayCut8 457 PlayCut4 458 PlayCut7 459 brk 460 else 461 *------------------------------- 462 * Cut #8: Princess sends out mouse 463 *------------------------------- 464 PlayCut8 465 jsr getglass 466 jsr addglass 467 468 jsr startP8 469 jsr SaveShad 470 jsr startM8 471 jsr SaveKid 472 473 lda #20 474 jsr play 475 476 lda #Mleave 477 jsr mjumpseq 478 lda #20 479 jsr play 480 481 lda #Prise 482 jsr pjumpseq 483 484 lda #20 485 jsr play 486 487 lda #0 488 sta KidPosn ;mouse disappears 489 ldx #50 490 lda #s_Heartbeat 491 jmp PlaySongX 492 493 *------------------------------- 494 * Cut #4: Mouse returns to princess 495 *------------------------------- 496 PlayCut4 497 jsr getglass 498 jsr addglass 499 500 jsr startP4 501 jsr SaveShad 502 jsr startM4 503 jsr SaveKid 504 lda #5 505 jsr play 506 507 lda #Pcrouch 508 jsr pjumpseq 509 lda #9 510 jsr play 511 512 lda #Mraise 513 jsr mjumpseq 514 515 lda #58 516 jmp play 517 518 *------------------------------- 519 * Happy ending 520 *------------------------------- 521 PlayCut7 522 lda #8 523 sta SPEED 524 525 lda #1 526 sta soundon 527 sta musicon ;they must listen!! 528 529 jsr startP7 530 jsr SaveShad 531 lda #8 532 jsr play 533 534 jsr startK7 535 jsr SaveKid 536 lda #8 537 jsr play 538 539 lda #Pembrace 540 jsr pjumpseq 541 lda #5 542 jsr play 543 544 lda #runstop 545 jsr vjumpseq 546 lda #2 547 jsr play 548 549 lda #0 550 sta KidPosn ;kid disappears on frame 8 of embrace 551 552 lda #9 553 jsr play 554 555 lda #s_Embrace 556 jsr PlaySong 557 558 jsr startM7 559 jsr SaveKid ;mouse runs in 560 561 lda #12 562 jsr play 563 564 lda #Mclimb 565 jsr mjumpseq 566 567 lda #30 568 jmp play 569 570 fin 571 572 *------------------------------- 573 * Tragic ending 574 *------------------------------- 575 PlayCut6 576 lda #22 577 sta SPEED 578 ldx #8 ;empty hourglass 579 jsr addglass 580 lda #2 581 jsr play 582 lda #s_Tragic 583 jsr PlaySong 584 lda #100 585 jmp play 586 587 *------------------------------- 588 * Princess cut #5 589 *------------------------------- 590 PlayCut5 591 jsr getglass 592 cpx #7 593 bcs Ominous ;sand is almost out--go for it 594 jmp PlayCut1 595 596 Ominous 597 jsr getglass 598 jsr addglass 599 600 jsr startP5 601 jsr SaveShad 602 603 lda #2 604 jsr play 605 606 ldx #50 607 lda #s_Heartbeat 608 jsr PlaySongX 609 610 lda #Palert 611 jsr pjumpseq ;princess hears something... 612 lda #12 613 jsr play 614 615 ldx #20 616 lda #s_Danger 617 jmp PlaySongX 618 619 *------------------------------- 620 * Princess cut #2 (lying down) 621 *------------------------------- 622 PlayCut2 623 jsr getglass 624 jsr addglass 625 626 jsr startP2 627 jsr SaveShad 628 629 lda #2 630 jsr play 631 632 ldx #50 633 lda #s_Heartbeat 634 jsr PlaySongX 635 ]rts rts 636 637 *------------------------------- 638 * Princess cut #1 (standing) 639 *------------------------------- 640 PlayCut1 641 PlayCut3 642 jsr getglass 643 jsr addglass 644 645 jsr startP1 646 jsr SaveShad 647 648 lda #2 649 jsr play 650 651 ldx #50 652 lda #s_Timer 653 jmp PlaySongX 654 655 *------------------------------- 656 * Opening titles scene 657 *------------------------------- 658 PlayCut0 659 jsr startV0 660 jsr SaveKid 661 jsr startP0 ;put chars in starting posn 662 jsr SaveShad 663 664 lda #2 665 jsr play ;animate 2 frames 666 667 lda #s_Princess 668 ldx #8 669 jsr PlaySongI 670 671 lda #5 672 jsr play 673 674 lda #Palert 675 jsr pjumpseq ;princess hears something... 676 lda #9 677 jsr play 678 lda #s_Squeek 679 ldx #0 680 jsr PlaySongI ;door squeaks... 681 682 lda #7 683 sta SPEED 684 685 lda #5 686 jsr play 687 lda #Vapproach 688 jsr vjumpseq 689 lda #6 690 jsr play 691 lda #Vstop 692 jsr vjumpseq 693 lda #4 694 jsr play ;vizier enters 695 lda #s_Vizier 696 ldx #12 697 jsr PlaySongI 698 lda #4 699 jsr play 700 701 lda #Vapproach 702 jsr vjumpseq 703 lda #30 704 jsr play 705 lda #Vstop 706 jsr vjumpseq 707 lda #4 708 jsr play ;stops in front of princess 709 lda #s_Buildup 710 ldx #25 711 jsr PlaySongI 712 713 lda #Vraise ;raises arms 714 jsr vjumpseq 715 lda #1 716 jsr play 717 lda #Pback 718 jsr pjumpseq 719 lda #13 720 jsr play 721 ldx #0 722 jsr addglass1 ;hourglass appears 723 lda #5 724 sta lightning 725 lda #$ff 726 sta lightcolor 727 728 lda #12 729 sta SPEED 730 lda #5 731 jsr play 732 lda #0 733 sta psandcount ;sand starts flowing 734 lda #s_Magic 735 ldx #8 736 jsr PlaySongI 737 738 lda #7 739 sta SPEED 740 lda #Vexit 741 jsr vjumpseq 742 lda #17 743 jsr play 744 ldx #1 745 jsr addglass1 ;glass starts to fill 746 lda #12 747 jsr play 748 lda #Pslump 749 jsr pjumpseq 750 lda #28 751 jsr play 752 753 lda #12 754 sta SPEED 755 lda #s_StTimer 756 ldx #20 757 jmp PlaySongI 758 759 *------------------------------- 760 * Add hourglass to scene 761 * In: X = state 762 *------------------------------- 763 addglass 764 lda #0 765 sta psandcount ;start sand flowing 766 addglass1 767 stx GlassState 768 lda #2 769 sta redrawglass 770 ]rts rts 771 772 *------------------------------- 773 * In: A = song # 774 * X = # cycles to play if sound is off 775 *------------------------------- 776 PlaySongX 777 tay 778 lda soundon 779 and musicon 780 bne :1 781 txa 782 jmp play 783 :1 tya ;falls thru to PlaySong 784 785 *------------------------------- 786 * 787 * Play Song (Princess's room) 788 * 789 * Button press ends song 790 * 791 * In: A = song # 792 * 793 *------------------------------- 794 PlaySong 795 jsr minit 796 jsr swpage 797 :loop lda #1 798 jsr strobe 799 lda $c061 800 ora $c062 801 ora keypress 802 bmi :interrupt 803 jsr pburn 804 jsr pstars 805 jsr pflow 806 jsr mplay 807 cmp #0 808 bne :loop 809 :interrupt 810 jmp swpage 811 812 *------------------------------- 813 * 814 * Play Song (Princess's room--Interruptible) 815 * 816 * Key or button press starts a new game 817 * 818 * In: A = song # 819 * X = # cycles to play if sound is off 820 * 821 *------------------------------- 822 PlaySongI 823 tay 824 lda soundon 825 and musicon 826 bne :1 827 txa 828 beq ]rts 829 jmp play 830 :1 tya 831 832 jsr minit 833 jsr swpage 834 :loop jsr musickeys 835 cmp #$80 836 bcs :interrupt 837 jsr pburn 838 jsr pstars 839 jsr pflow 840 jsr mplay 841 cmp #0 842 bne :loop 843 jmp swpage 844 :interrupt 845 jmp dostartgame 846 847 *------------------------------- 848 * Switch hires pages for duration of song 849 850 swpage 851 lda PAGE 852 eor #$20 853 sta PAGE 854 ]rts rts 855 856 *------------------------------- 857 flashon 858 lda lightning 859 beq ]rts 860 lda lightcolor 861 jmp doflashon 862 863 flashoff 864 lda lightning 865 beq ]rts 866 dec lightning 867 jmp doflashoff 868 869 *------------------------------- 870 * 871 * Playback loop (simplified version of main loop in TOPCTRL) 872 * 873 * In: A = sequence length (# of frames) 874 * 875 *------------------------------- 876 play 877 sta SceneCount 878 playloop 879 jsr rnd 880 881 lda SPEED 882 jsr pause 883 884 jsr strobe ;strobe kbd & jstk 885 886 lda level 887 bne :notdemo 888 jsr demokeys 889 bpl :cont 890 lda #1 891 jmp dostartgame ;interrupted--start a new game 892 893 :notdemo lda $c061 894 ora $c062 895 ora keypress 896 bmi ]rts ;key or button to end scene 897 898 :cont jsr NextFrame ;Determine what next frame should look like 899 900 jsr flashon 901 902 jsr FrameAdv ;Update hidden page to reflect new reality 903 ;& show it 904 jsr flashoff 905 906 lda soundon 907 beq :1 908 jsr playback ;play back sound fx 909 jsr zerosound 910 :1 911 ; jsr songcues 912 913 dec SceneCount 914 bne playloop 915 rts 916 917 *------------------------------- 918 NextFrame 919 jsr DoKid ;kid/vizier/mouse 920 921 jsr DoShad ;always princess 922 923 ]rts rts 924 925 *------------------------------- 926 FrameAdv 927 jsr DoFast 928 929 jsr vblank 930 931 jmp PageFlip 932 933 *------------------------------- 934 DoKid 935 jsr LoadKid 936 lda CharPosn 937 beq ]rts 938 939 jsr ctrlkidchar 940 941 jsr animchar ;Get next frame from sequence table 942 943 jsr SaveKid ;Save all changes to char data 944 945 ]rts rts 946 947 *------------------------------- 948 DoShad 949 jsr LoadShadwOp 950 lda CharPosn 951 beq ]rts 952 953 jsr ctrlshadchar 954 955 jsr animchar 956 957 jmp SaveShad 958 959 *------------------------------- 960 ctrlkidchar 961 rts 962 963 ctrlshadchar 964 rts 965 966 *------------------------------- 967 DoFast 968 969 * Set up image lists 970 971 jsr zerolsts 972 973 lda redrawglass 974 beq :3 975 dec redrawglass 976 ldx GlassState 977 jsr drawglass ;hourglass 978 :3 979 jsr LoadKid ;can be kid or vizier 980 lda CharPosn 981 beq :1 982 jsr setupchar 983 lda #30 984 sta FCharIndex 985 jsr addkidobj 986 :1 987 jsr LoadShad ;always princess 988 lda CharPosn 989 beq :2 990 jsr setupchar 991 lda #30 992 sta FCharIndex 993 jsr addkidobj 994 jsr pmask ;kludge to mask face & hair 995 :2 996 jsr fast ;get char/objs into mid table 997 998 jsr drawpost ;big white post 999 1000 * Draw to screen 1001 1002 jsr pburn 1003 jsr pburn ;first put down 2 torch flames 1004 jsr pstars ;& twinkle stars 1005 1006 jsr drawall ;...then draw the rest 1007 1008 jmp pflow ;& flow sand 1009 1010 ]rts rts 1011 1012 *------------------------------- 1013 * 1014 * Jumpseq for princess & vizier 1015 * 1016 * In: A = sequence # 1017 * 1018 *------------------------------- 1019 pjumpseq 1020 pha 1021 jsr LoadShad 1022 pla 1023 jsr jumpseq 1024 jmp SaveShad 1025 1026 kjumpseq 1027 mjumpseq 1028 vjumpseq 1029 pha 1030 jsr LoadKid 1031 pla 1032 jsr jumpseq 1033 jmp SaveKid 1034 1035 *------------------------------- 1036 * 1037 * Put characters in starting position for scene 1038 * 1039 *------------------------------- 1040 floorY = 151 1041 1042 * mouse runs to princess 1043 1044 startM8 1045 jsr startM4 1046 lda #144 1047 sta CharX 1048 lda #Mstop 1049 jsr jumpseq 1050 jmp animchar 1051 1052 startM4 1053 lda #24 1054 sta CharID 1055 lda #199 1056 sta CharX 1057 lda #floorY+1 1058 sta CharY 1059 lda #-1 1060 sta CharFace 1061 1062 lda #Mscurry 1063 jsr jumpseq 1064 jmp animchar 1065 1066 * princess w/mouse 1067 1068 startP8 1069 jsr startP0 1070 lda #130 1071 sta CharX 1072 lda #floorY+3 1073 sta CharY 1074 lda #Pstroke 1075 jsr jumpseq 1076 jmp animchar 1077 1078 startP4 1079 jsr startP1 1080 lda #142 1081 sta CharX 1082 lda #floorY+3 1083 sta CharY 1084 lda #Pstand 1085 jsr jumpseq 1086 jmp animchar 1087 1088 startP5 1089 jsr startP0 1090 lda #160 1091 sta CharX 1092 rts 1093 1094 startP2 1095 jsr startP0 1096 lda #89 1097 sta CharX 1098 lda #floorY 1099 sta CharY 1100 1101 lda #Plie 1102 jsr jumpseq 1103 jmp animchar 1104 1105 startP1 1106 jsr startP0 1107 lda #0 1108 sta CharFace 1109 rts 1110 1111 startP7 1112 jsr startP0 1113 lda #136 1114 sta CharX 1115 lda #floorY-2 1116 sta CharY 1117 lda #Pwaiting 1118 ldx #1 1119 cpx purpleflag 1120 beq :ok 1121 lda #120 ;crash (copy protect) 1122 :ok jsr jumpseq 1123 jmp animchar 1124 1125 startM7 1126 jsr startM4 1127 lda #floorY-2 1128 sta CharY 1129 rts 1130 1131 startP0 1132 lda #5 1133 sta CharID 1134 1135 lda #120 1136 sta CharX 1137 lda #floorY 1138 sta CharY 1139 1140 lda #-1 1141 sta CharFace 1142 1143 lda #Pstand 1144 jsr jumpseq 1145 jmp animchar 1146 1147 startV0 1148 lda #6 1149 sta CharID 1150 1151 lda #197 1152 sta CharX 1153 lda #floorY 1154 sta CharY 1155 1156 lda #-1 1157 sta CharFace 1158 1159 lda #Vstand 1160 jsr jumpseq 1161 jmp animchar 1162 1163 startK7 1164 lda #0 1165 sta CharID 1166 1167 lda #198 1168 sta CharX 1169 lda #floorY-2 1170 sta CharY 1171 1172 lda #-1 1173 sta CharFace 1174 1175 lda #startrun 1176 jsr jumpseq 1177 jmp animchar 1178 1179 *------------------------------- 1180 * Demo commands 1181 *------------------------------- 1182 EndProg = -2 1183 EndDemo = -1 1184 Ctr = 0 1185 Fwd = 1 1186 Back = 2 1187 Up = 3 1188 Down = 4 1189 Upfwd = 5 1190 Press = 6 1191 Release = 7 1192 1193 *------------------------------- 1194 DemoProg1 ;up to fight w/1st guard 1195 db 0,Ctr 1196 db 1,Fwd 1197 db 13,Ctr 1198 db 30,Fwd ;start running... 1199 db 37,Upfwd ;jump 1st pit 1200 db 47,Ctr 1201 db 48,Fwd ;& keep running 1202 d1 = 65 1203 db d1,Ctr ;stop 1204 db d1+8,Back ;look back... 1205 db d1+10,Ctr 1206 db d1+34,Back 1207 db d1+35,Ctr 1208 d2 = 115 1209 db d2,Upfwd ;jump 2nd pit 1210 db d2+13,Press ;& grab ledge 1211 db d2+21,Up 1212 db d2+42,Release 1213 db d2+43,Ctr 1214 db d2+44,Fwd 1215 db d2+58,Down 1216 db d2+62,Ctr 1217 db d2+63,Fwd 1218 db d2+73,Ctr 1219 d3 = 193 1220 db d3,Fwd 1221 db d3+12,Ctr 1222 db d3+40,EndDemo 1223 1224 *------------------------------- 1225 * 1226 * D E M O 1227 * 1228 * Controls kid's movements during self-running demo 1229 * 1230 * (Called from PLAYERCTRL) 1231 * 1232 *------------------------------- 1233 DEMO 1234 lda #DemoProg1 1235 ldx #>DemoProg1 1236 jmp AutoPlayback 1237 1238 *------------------------------- 1239 * 1240 * Init princess cut 1241 * 1242 *------------------------------- 1243 initit 1244 lda #" " 1245 sta scrncolor ;? 1246 lda #0 1247 sta vibes 1248 sta redrawglass 1249 sta KidPosn 1250 sta ShadPosn 1251 sta ptorchcount 1252 ldx #3 1253 :loop sta pstarcount,x 1254 dex 1255 bpl :loop 1256 1257 lda #-1 ;no hourglass yet 1258 sta psandcount 1259 1260 lda #12 1261 sta SPEED 1262 1263 jsr zeropeels 1264 jsr zerored 1265 jsr zerosound 1266 ]rts rts 1267 1268 *------------------------------- 1269 * 1270 * Get hourglass state (based on time left) 1271 * 1272 * In: FrameCount 1273 * Out: X = glass state 1274 * 1275 *------------------------------- 1276 getglass 1277 jsr getminleft 1278 ldx #7 1279 lda MinLeft 1280 cmp #6 1281 bcc :got 1282 dex 1283 cmp #$11 1284 bcc :got 1285 dex 1286 cmp #$21 1287 bcc :got 1288 dex 1289 cmp #$41 1290 bcc :got 1291 dex 1292 :got 1293 ]rts rts 1294 1295 *------------------------------- 1296 * 1297 * Show time if requested 1298 * (& constant time display during final minute) 1299 * 1300 * In: timerequest (0 = no, 1-2 = auto, 3 = from kbd,) 1301 * 4 = Vizier dead) 1302 * 1303 *------------------------------- 1304 SHOWTIME 1305 lda timerequest 1306 beq ]rts 1307 lda KidLife 1308 bpl ]rts 1309 1310 jsr getminleft 1311 1312 lda MinLeft 1313 cmp #2 1314 bcs :normal 1315 lda SecLeft 1316 beq :timeup 1317 1318 * Countdown during final minute 1319 1320 lda level 1321 cmp #14 1322 bcs :normal 1323 bcc :showsec ;stop countdown when clock stops 1324 1325 :timeup 1326 lda timerequest 1327 cmp #3 1328 bcc ]rts ;Once t=0, show time only on kbd request 1329 1330 :normal 1331 lda msgtimer 1332 bne ]rts ;wait till other msgs are gone 1333 1334 lda #TimeMsg 1335 sta message 1336 lda #timemsgtimer 1337 ldx timerequest 1338 cpx #4 1339 bcc :norm 1340 :delay lda #timemsgtimer+5 ;delay 5 cycles 1341 :norm sta msgtimer 1342 1343 lda #0 1344 sta timerequest 1345 ]rts rts 1346 1347 :showsec 1348 lda SecLeft 1349 cmp #2 1350 bcc :nomsg 1351 1352 lda message 1353 cmp #TimeMsg 1354 beq :2 1355 lda msgtimer 1356 bne ]rts 1357 lda #TimeMsg 1358 sta message 1359 :2 lda #1 1360 sta timerequest 1361 lda #1 1362 sta msgtimer 1363 rts 1364 :nomsg lda #0 1365 sta timerequest 1366 sta msgtimer 1367 rts 1368 1369 *------------------------------- 1370 * Add lowering-gate sound (only when gate is visible) 1371 * In: A = state 1372 *------------------------------- 1373 ADDLOWERSOUND 1374 lsr 1375 bcc ]rts ;alt frames 1376 1377 lda level 1378 cmp #3 1379 bne :n 1380 lda trscrn 1381 cmp #2 ;Exception: Level 3, screen 2 1382 beq :y 1383 :n lda trscrn 1384 cmp scrnLeft 1385 bne :1 1386 ldy trloc 1387 cpy #9 1388 beq :y 1389 cpy #19 1390 beq :y 1391 cpy #29 1392 beq :y ;visible to left 1393 ]rts rts 1394 1395 :1 cmp VisScrn 1396 bne ]rts 1397 ldy trloc 1398 cpy #9 1399 beq ]rts 1400 cpy #19 1401 beq ]rts 1402 cpy #29 1403 beq ]rts 1404 1405 :y lda #LoweringGate 1406 jmp addsound 1407 1408 *------------------------------- 1409 * 1410 * Remove object 1411 * 1412 * In: A = lastpotion 1413 * 1414 *------------------------------- 1415 REMOVEOBJ 1416 sta lastpotion 1417 1418 ldx #1 1419 stx clrbtn 1420 1421 lda #floor 1422 sta (BlueType),y ;remove object 1423 lda #0 1424 sta (BlueSpec),y 1425 1426 lda #35 ;TEMP 1427 sta height 1428 1429 lda #2 1430 clc 1431 jsr markwipe 1432 jmp markred 1433 1434 *------------------------------- 1435 * 1436 * S E T I N I T I A L S 1437 * 1438 * Set initial states of gadgets 1439 * 1440 *------------------------------- 1441 SETINITIALS 1442 lda INFO ;number of screens +1 1443 sec 1444 sbc #1 1445 sta SCRNUM 1446 1447 :loop jsr DoScrn ;for every screen 1448 1449 dec SCRNUM 1450 bne :loop 1451 rts 1452 1453 *------------------------------- 1454 DoScrn 1455 lda SCRNUM 1456 jsr calcblue 1457 1458 ldy #29 1459 1460 :loop jsr getinitobj 1461 bcc :skip 1462 sta (BlueSpec),y 1463 1464 :skip dey 1465 bpl :loop 1466 1467 rts 1468 1469 *------------------------------- 1470 * 1471 * S T A R T K I D 1472 * 1473 * Put kid in his starting position for this level 1474 * 1475 *------------------------------- 1476 STARTKID 1477 lda level 1478 cmp #3 1479 bne :nomile 1480 1481 * Level 3 milestone? 1482 1483 :special3 1484 lda milestone ;set to 1 when he gets past 1st gate 1485 beq :nomile 1486 lda #-1 1487 sta KidStartFace 1488 lda #2 1489 sta KidStartScrn 1490 lda #6 1491 sta KidStartBlock ;put him just inside 1st gate... 1492 1493 lda #7 1494 ldx #4 1495 ldy #0 1496 jsr rdblock 1497 lda #space 1498 sta (BlueType),y ;remove loose floor... 1499 ;& continue 1500 :nomile 1501 lda KidStartScrn ;in INFO 1502 sta CharScrn 1503 1504 lda KidStartBlock 1505 jsr unindex ;return A = blockx, X = blocky 1506 1507 sta CharBlockX 1508 stx CharBlockY 1509 1510 lda CharBlockX 1511 jsr getblockej 1512 clc 1513 adc #angle+7 1514 sta CharX ;put kid on starting block 1515 1516 lda KidStartFace 1517 eor #$ff 1518 sta CharFace 1519 1520 lda origstrength 1521 ldx level 1522 bne :notdemo 1523 lda #4 1524 :notdemo sta MaxKidStr 1525 sta KidStrength 1526 1527 do EditorDisk 1528 jmp :normal 1529 fin 1530 1531 lda level 1532 cmp #1 1533 beq :special1 1534 cmp #13 1535 beq :special13 1536 bne :normal 1537 1538 * Special start for Level 1 1539 1540 :special1 1541 lda #5 ;scrn 1542 ldx #2 ;blockx 1543 ldy #0 ;blocky 1544 jsr rdblock 1545 jsr pushpp ;slam gate shut 1546 1547 lda #stepfall 1548 jsr jumpseq 1549 jmp STARTKID1 1550 1551 * & for level 13 1552 1553 :special13 1554 lda #running 1555 jsr jumpseq 1556 jmp STARTKID1 1557 1558 * Normal start 1559 1560 :normal lda #turn 1561 jsr jumpseq ;start in standing posn 1562 1563 STARTKID1 1564 ldx CharBlockY 1565 lda FloorY+1,x 1566 sta CharY 1567 1568 lda #-1 1569 sta CharLife ;ff = alive 1570 1571 lda #0 ;kid 1572 sta CharID 1573 1574 lda #0 1575 sta CharXVel 1576 sta CharYVel 1577 sta waitingtojump 1578 sta weightless 1579 sta invert 1580 sta jarabove 1581 sta droppedout 1582 sta CharSword 1583 sta offguard 1584 1585 :done jsr animchar ;get next frame 1586 1587 * WTLESS level only--kid falls into screen 1588 1589 lda level 1590 cmp #7 ;WTLESS level 1591 bne :notsp 1592 1593 lda yellowflag ;should be - 1594 bmi :yelok 1595 lda #$40 1596 sta timebomb ;2nd level copy protection 1597 :yelok 1598 lda CharScrn 1599 cmp #17 1600 bne :notsp 1601 lda #3 ;down 1602 jsr cut 1603 :notsp 1604 jmp SaveKid ;save KidVars 1605 1606 ]rts rts 1607 1608 *------------------------------- 1609 * 1610 * G R A V I T Y 1611 * 1612 *------------------------------- 1613 TermVelocity = 33 1614 AccelGravity = 3 1615 WtlessTermVel = 4 1616 WtlessGravity = 1 1617 1618 GRAVITY 1619 lda CharAction 1620 cmp #4 1621 bne ]rts 1622 1623 lda weightless 1624 bne :wtless 1625 1626 lda CharYVel 1627 clc 1628 adc #AccelGravity 1629 1630 cmp #TermVelocity 1631 bcc :ok 1632 lda #TermVelocity 1633 1634 :ok sta CharYVel 1635 ]rts rts 1636 1637 :wtless lda CharYVel 1638 clc 1639 adc #WtlessGravity 1640 1641 cmp #WtlessTermVel 1642 bcc :ok 1643 lda #WtlessTermVel 1644 bcs :ok 1645 1646 *------------------------------- 1647 * 1648 * Add falling velocity 1649 * 1650 *------------------------------- 1651 ADDFALL 1652 lda CharYVel 1653 clc 1654 adc CharY 1655 sta CharY 1656 1657 * X-vel 1658 1659 lda CharAction 1660 cmp #4 ;freefall? 1661 bne ]rts 1662 1663 lda CharXVel 1664 jsr addcharx 1665 sta CharX 1666 1667 jmp rereadblocks 1668 1669 *------------------------------- 1670 * 1671 * Set initial guard posns for entire level (call once) 1672 * 1673 *------------------------------- 1674 INITIALGUARDS 1675 ldy #24 ;screen # 1676 :loop 1677 lda GdStartBlock-1,y 1678 cmp #30 1679 bcs :nogd 1680 jsr unindex ;A = blockx 1681 jsr getblockej 1682 clc 1683 adc #angle+7 1684 sta GdStartX-1,y 1685 lda #0 1686 sta GdStartSeqH-1,y 1687 1688 :nogd dey 1689 bne :loop 1690 ]rts rts 1691 1692 *------------------------------- 1693 * 1694 * Newly dead enemy--play music (or whatever) 1695 * 1696 * In: Char vars 1697 * 1698 *------------------------------- 1699 DEADENEMY 1700 lda level 1701 beq :demo 1702 cmp #13 1703 beq :wingame 1704 1705 lda CharID 1706 cmp #1 1707 beq ]rts ;shadow 1708 lda #s_Vict 1709 ldx #25 1710 jsr cuesong 1711 ]rts rts 1712 1713 :demo lda #1 1714 sta milestone ;start demo, part 2 1715 lda #0 1716 sta PreRecPtr 1717 sta PlayCount 1718 rts 1719 1720 :wingame lda #s_Upstairs 1721 ldx #25 1722 jsr cuesong 1723 1724 lda #$ff ;white 1725 sta lightcolor 1726 lda #10 1727 sta lightning 1728 1729 lda #1 1730 sta exitopen 1731 lda #4 1732 sta timerequest 1733 1734 lda #24 1735 ldx #0 1736 ldy #0 1737 jsr rdblock 1738 jmp pushpp ;open exit 1739 1740 *------------------------------- 1741 * Mirror appears (called by MOVER when exit opened) 1742 *------------------------------- 1743 MIRAPPEAR 1744 do DemoDisk 1745 rts 1746 else 1747 1748 lda level 1749 cmp #4 1750 bne ]rts 1751 1752 lda #mirscrn 1753 ldx #mirx 1754 ldy #miry 1755 jsr rdblock 1756 lda #mirror 1757 sta (BlueType),y 1758 rts 1759 1760 fin 1761 1762 *------------------------------- 1763 lst 1764 ds 1 1765 usr $a9,20,$400,*-org 1766 lst off