MASTER525.S (20619B)
1 * master 2 DemoDisk = 0 3 FinalDisk = 1 4 CopyProtect = 1 5 6 org = $f880 7 lst off 8 *------------------------------- 9 * 10 * M A S T E R 11 * 12 * Sits in main l.c. 13 * 14 *------------------------------- 15 org org 16 17 jmp FIRSTBOOT 18 jmp LOADLEVEL 19 jmp RELOAD 20 jmp LoadStage2 21 jmp RELOAD 22 23 jmp ATTRACTMODE 24 jmp CUTPRINCESS 25 jmp SAVEGAME 26 jmp LOADGAME 27 jmp DOSTARTGAME 28 29 jmp EPILOG 30 jmp LOADALTSET 31 jmp SCREENDUMP 32 33 *------------------------------- 34 lst 35 put eq 36 lst 37 put gameeq 38 lst off 39 40 Tmoveauxlc = moveauxlc-$b000 41 42 *------------------------------- 43 * RW18 ID bytes 44 45 POPside1 = $a9 46 POPside2 = $ad 47 48 * RW18 zero page vars 49 50 slot = $fd 51 track = $fe 52 lastrack = $ff 53 54 * RW18 commands 55 56 DrvOn = $00 57 DrvOff = $01 58 Seek = $02 59 RdSeqErr = $03 60 RdGrpErr = $04 61 WrtSeqErr = $05 62 WrtGrpErr = $06 63 ModID = $07 64 RdSeq = $83 65 RdGrp = $84 66 WrtSeq = $85 67 WrtGrp = $86 68 Inc = $40 ;.Inc to inc track 69 70 *------------------------------- 71 * Local vars 72 73 dum locals 74 75 ]dest ds 2 76 ]source ds 2 77 ]endsourc ds 2 78 79 newBGset1 ds 1 80 newBGset2 ds 1 81 newCHset ds 1 82 83 dend 84 85 *------------------------------- 86 * Passed params 87 88 params = $3f0 89 90 *------------------------------- 91 * Coordinates of default load-in level 92 93 demolevel db 33,0 94 firstlevel db 33,1 95 96 *------------------------------- 97 * Hi bytes of crunch data 98 * Double hi-res (stage 1) 99 100 pacSplash = $40 101 delPresents = $70 102 delByline = $72 103 delTitle = $74 104 pacProlog = $7c 105 pacSumup = $60 ;mainmem 106 pacEpilog = $76 ;side B 107 108 * Single hires (stage 2) 109 110 pacProom = $84 111 112 *------------------------------- 113 * Music song #s 114 * Set 1 (title) 115 116 s_Presents = 1 117 s_Byline = 2 118 s_Title = 3 119 s_Prolog = 4 120 s_Sumup = 5 121 s_Princess = 7 122 s_Squeek = 8 123 s_Vizier = 9 124 s_Buildup = 10 125 s_Magic = 11 126 127 * Set 2 (epilog) 128 129 s_Epilog = 1 130 s_Curtain = 2 131 132 *------------------------------- 133 * Soft switches 134 135 IOUDISoff = $c07f 136 IOUDISon = $c07e 137 DHIRESoff = $c05f 138 DHIRESon = $c05e 139 HIRESon = $c057 140 HIRESoff = $c056 141 PAGE2on = $c055 142 PAGE2off = $c054 143 MIXEDon = $c053 144 MIXEDoff = $c052 145 TEXTon = $c051 146 TEXToff = $c050 147 ALTCHARon = $c00f 148 ALTCHARoff = $c00e 149 ADCOLon = $c00d 150 ADCOLoff = $c00c 151 ALTZPon = $c009 152 ALTZPoff = $c008 153 RAMWRTaux = $c005 154 RAMWRTmain = $c004 155 RAMRDaux = $c003 156 RAMRDmain = $c002 157 ADSTOREon = $c001 158 ADSTOREoff = $c000 159 160 RWBANK2 = $c083 161 RWBANK1 = $c08b 162 163 *------------------------------- 164 kprincess = "p"-$60 ;temp! 165 kdemo = "d"-$60 ;temp! 166 krestart = "r"-$60 167 kresume = "l"-$60 168 169 *------------------------------- 170 * 171 * Notes: 172 * 173 * Game code sits in auxmem & aux l.c. and uses aux z.p. 174 * 175 * Routines in main l.c. (including MASTER and HIRES) 176 * are called via intermediary routines in GRAFIX (in auxmem). 177 * 178 * RW18 sits in bank 1 of main language card; 179 * driveon switches it in, driveoff switches it out. 180 * 181 *------------------------------- 182 * 183 * F I R S T B O O T 184 * 185 *------------------------------- 186 FIRSTBOOT 187 lda MIXEDoff 188 jsr setaux 189 190 do CopyProtect 191 else 192 lda #$79 193 sta redherring 194 fin 195 196 * Set BBund ID byte 197 198 lda #POPside1 199 sta BBundID 200 201 * Load hires tables & add'l hires routines 202 203 sta RAMWRTmain 204 lda #2 205 sta track 206 jsr rw18 207 db RdGrp.Inc 208 hex e0,e1,e2,e3,e4,e5,e6,e7,e8 209 hex e9,ea,eb,ec,ed,00,00,00,00 210 211 * Load as much of Stage 3 as we can keep 212 213 jsr loadperm 214 215 * Turn off drive 216 217 jsr driveoff 218 219 * Check for IIGS 220 221 jsr checkIIGS ;returns IIGS 222 223 * Start attract loop 224 225 jsr initsystem ;in topctrl 226 227 lda #0 228 sta invert ;rightside up Y tables 229 230 lda #1 231 sta soundon ;Sound on 232 233 jmp AttractLoop 234 235 *------------------------------- 236 * 237 * Reload code & images 238 * (Temp routine for game development) 239 * 240 *------------------------------- 241 RELOAD 242 do 0 243 jsr driveon 244 245 jsr loadperm 246 jsr LoadStage3 247 248 jmp driveoff 249 fin 250 251 *------------------------------- 252 * 253 * L O A D G A M E 254 * 255 *------------------------------- 256 * load game 1: tracks 3-4 (code) 257 *------------------------------- 258 loadgame1 259 lda #3 260 sta track 261 262 jsr setaux 263 264 jsr rw18 265 db RdSeq.Inc,$0e 266 267 jsr rw18 268 db RdGrp.Inc 269 hex 04,05,06,07,08,09,0a,0b,0c 270 hex 0d,20,21,22,23,24,25,26,27 271 rts 272 273 *------------------------------- 274 * load game 2a: tracks 9-13 (mainmem image tables) 275 *------------------------------- 276 loadgame2a 277 jsr setmain 278 lda #9 279 sta track 280 jsr rw18 281 db RdSeq.Inc,$84 282 jsr rw18 283 db RdSeq.Inc,$96 284 285 jsr rw18 286 db RdSeq.Inc,$08 287 288 jsr rw18 289 db RdGrp.Inc 290 hex 1a,1b,1c,1d,1e,1f,a8,a9,aa 291 hex ab,ac,ad,ae,af,b0,b1,b2,b3 292 293 jsr rw18 294 db RdGrp.Inc 295 hex b4,b5,b6,b7,b8,b9,ba,bb,bc 296 hex bd,be,bf,00,00,00,00,00,00 297 rts 298 299 *------------------------------- 300 * 301 * Load aux l.c. stuff (tracks 19-21 & 34) 302 * (includes music set 1) 303 * 304 * Load into main hires area & move to aux l.c. 305 * 306 *------------------------------- 307 loadauxlc 308 jsr setmain 309 310 lda #19 311 sta track 312 313 jsr rw18 314 db RdGrp.Inc 315 hex 00,00,20,21,22,23,24,25,26 316 hex 27,28,29,2a,2b,2c,2d,2e,2f 317 318 jsr rw18 319 db RdGrp.Inc 320 hex 00,00,00,00,30,31,32,33,34 321 hex 35,36,37,38,39,3a,3b,3c,3d 322 jsr rw18 323 db RdSeq.Inc,$3e 324 325 lda #34 326 sta track 327 jsr rw18 328 db RdGrp.Inc 329 hex 00,00,50,51,52,53,54,55,56 330 hex 57,58,59,5a,5b,5c,5d,5e,5f 331 332 jsr setaux 333 lda #1 334 sta MSset 335 lda #$d0 336 sta redherring2 337 338 jsr setmain 339 jmp Tmoveauxlc 340 341 *------------------------------- 342 * 343 * Load music (1K) 344 * 345 * Load at $5000 mainmem & move to aux l.c. 346 * 347 *------------------------------- 348 * Load music set 1 (title) 349 350 loadmusic1 351 jsr setmain 352 lda #34 353 sta track 354 jsr rw18 355 db RdSeq,$4e ;we only want $50-53 356 ]mm jsr setaux 357 jmp xmovemusic 358 359 *------------------------------- 360 * Load music set 2 (game) 361 362 loadmusic2 363 jsr setmain 364 lda #20 365 sta track 366 jsr rw18 367 db RdGrp.Inc 368 hex 50,51,52,53,00,00,00,00,00 369 hex 00,00,00,00,00,00,00,00,00 370 jmp ]mm 371 372 *------------------------------- 373 * Load music set 3 (epilog) 374 375 loadmusic3 376 jmp loadmusic1 377 378 *------------------------------- 379 setaux sta RAMRDaux 380 sta RAMWRTaux 381 rts 382 383 setmain sta RAMRDmain 384 sta RAMWRTmain 385 rts 386 387 *------------------------------- 388 * 389 * D R I V E O N 390 * 391 * In: A = delay 392 * BBundID 393 * 394 * Sets auxmem 395 * 396 *------------------------------- 397 driveon lda #0 398 driveon1 sta :delay 399 400 jsr setaux ;set auxmem 401 402 * switch in bank 1 (RW18) 403 404 bit RWBANK1 405 bit RWBANK1 ;1st 4k bank 406 407 * set Bbund ID 408 409 lda BBundID 410 sta :IDbyte 411 412 jsr rw18 413 db ModID 414 :IDbyte hex a9 ;Bbund ID byte 415 416 * turn on drive 1 417 418 jsr rw18 419 db DrvOn 420 :drive hex 01 421 :delay hex 00 422 rts 423 424 *------------------------------- 425 * 426 * D R I V E O F F 427 * 428 *------------------------------- 429 driveoff jsr rw18 430 db DrvOff 431 432 * switch in bank 2 433 434 bit RWBANK2 435 bit RWBANK2 ;2nd 4k bank 436 437 sta $c010 ;clr kbd 438 439 jmp setaux ;& set auxmem 440 441 *------------------------------- 442 * 443 * Set first level/demo level 444 * 445 *------------------------------- 446 set1stlevel 447 lda firstlevel 448 ldx firstlevel+1 449 SetLevel sta params 450 stx params+1 451 ]rts rts 452 453 setdemolevel 454 lda demolevel 455 ldx demolevel+1 456 jmp SetLevel 457 458 *------------------------------- 459 * 460 * Hires screen dump 461 * 462 * Dump hires screen to tracks 22-23 463 * In: A = page # (00/20) 464 * 465 *------------------------------- 466 SCREENDUMP 467 do 0 468 469 clc 470 adc #$20 471 sta :sm1 472 adc #$12 473 sta :sm2 474 475 lda BBundID 476 pha 477 jsr checkdisk 478 jsr setmain 479 lda #22 480 sta track 481 jsr rw18 482 hex c5 483 :sm1 hex 20 484 jsr rw18 485 hex c5 486 :sm2 hex 32 487 488 jsr driveoff 489 pla 490 sta BBundID 491 ]rts rts 492 493 fin 494 495 *------------------------------- 496 * 497 * Check track 22 to make sure it's the right disk 498 * 499 * (Scratch page 2 mainmem--return w/mainmem set) 500 * 501 *------------------------------- 502 checkdisk 503 jsr setaux 504 ldx #POPside2 505 stx BBundID 506 507 jsr driveon 508 :loop jsr setmain 509 lda #22 510 sta track 511 jsr rw18 512 db RdGrpErr.Inc 513 hex 02,00,00,00,00,00,00,00,00 514 hex 00,00,00,00,00,00,00,00,00 515 bcc ]rts 516 jsr error 517 jmp :loop 518 519 *------------------------------- 520 * 521 * Save/load game 522 * 523 * Write/read 256 bytes of data: sector 0, track 23, side 2 524 * We scorch an entire track, but on side 2 we can afford it 525 * 526 *------------------------------- 527 SAVEGAME 528 jsr checkdisk ;sets main 529 530 sta RAMRDaux 531 ldx #15 532 :loop lda savedgame,x ;aux 533 sta $200,x ;main 534 dex 535 bpl :loop 536 sta RAMRDmain 537 538 lda #23 539 sta track 540 jsr rw18 541 db WrtGrpErr 542 hex 02,00,00,00,00,00,00,00,00 543 hex 00,00,00,00,00,00,00,00,00 544 bcc :ok 545 jsr whoop 546 :ok jmp driveoff 547 548 *------------------------------- 549 LOADGAME 550 jsr checkdisk ;sets main 551 552 lda #23 553 sta track 554 jsr rw18 555 db RdGrp 556 hex 02,00,00,00,00,00,00,00,00 557 hex 00,00,00,00,00,00,00,00,00 558 559 sta RAMWRTaux 560 ldx #15 561 :loop lda $200,x ;main 562 sta savedgame,x ;aux 563 dex 564 bpl :loop 565 566 jmp driveoff 567 568 *------------------------------- 569 * 570 * Load alt. character set (chtable4) 571 * 572 * In: Y = CHset4 573 * 574 *------------------------------- 575 LOADALTSET 576 sty newCHset 577 578 jsr driveon 579 580 jsr rdch4 581 582 jmp driveoff 583 584 *------------------------------- 585 * 586 * L O A D L E V E L 587 * 588 * In: bluepTRK, bluepREG 589 * TRK = track # (1-33) 590 * REG = region on track (0-1) 591 * A = BGset1; X = BGset2; Y = CHset4 592 * 593 * Load level into "working blueprint" buffer in auxmem; 594 * game code will make a "backup copy" into aux l.c. 595 * (which we can't reach from here). 596 * 597 * If bg & char sets in memory aren't right, load them in 598 * 599 *------------------------------- 600 LOADLEVEL 601 sta newBGset1 602 stx newBGset2 603 sty newCHset 604 605 jsr driveon 606 607 jsr rdbluep ;blueprint 608 jsr rdbg1 ;bg set 1 609 jsr rdbg2 ;bg set 2 610 jsr rdch4 ;char set 4 611 612 jsr vidstuff 613 614 jmp driveoff 615 616 *------------------------------- 617 setbluep 618 lda bluepTRK 619 sta track 620 lda bluepREG 621 ]rts rts 622 623 *------------------------------- 624 vidstuff 625 lda BBundID 626 cmp #POPside2 627 bne ]rts 628 lda $c000 629 cmp #"^" 630 bne ]rts 631 632 jsr setmain 633 lda #12 634 sta track 635 jsr rw18 636 db RdGrp.Inc 637 hex 00,00,00,00,00,00,00,00,00 638 hex 00,00,00,0c,0d,0e,0f,10,11 639 :loop jsr rw18 640 db RdSeq.Inc 641 :sm hex 12 642 lda :sm 643 clc 644 adc #$12 645 sta :sm 646 cmp #$6c 647 bcc :loop 648 jsr driveoff 649 jsr setmain 650 jmp $c00 651 652 *------------------------------- 653 * Track data for alt bg/char sets 654 * 655 * Set #: 0 1 2 3 4 5 6 656 657 bg1trk hex 05,00,07 658 bg2trk hex 12,02,09 659 ch4trk hex 0d,03,04,05,0a,0b 660 ch4off hex 0c,00,06,0c,00,06 661 662 *------------------------------- 663 rdbg1 ldx newBGset1 664 cpx BGset1 ;already in memory? 665 beq :rts ;yes--no need to load 666 stx BGset1 667 lda bg1trk,x 668 sta track 669 jsr rw18 670 db RdSeq.Inc,$60 671 jsr rw18 672 db RdSeq.Inc,$72 673 ]rts 674 :rts rts 675 676 rdbg2 ldx newBGset2 677 cpx BGset2 678 beq ]rts 679 stx BGset2 680 lda bg2trk,x 681 sta track 682 jsr rw18 683 db RdSeq.Inc,$84 684 rts 685 686 rdch4 ldx newCHset 687 cpx CHset 688 beq ]rts 689 stx CHset 690 lda ch4trk,x 691 sta track 692 lda ch4off,x 693 beq :off0 694 cmp #6 695 beq :off6 696 cmp #12 697 beq :off12 698 rts 699 700 :off12 jsr rw18 701 db RdGrp.Inc 702 hex 00,00,00,00,00,00,00,00,00 703 hex 00,00,00,96,97,98,99,9a,9b 704 jsr rw18 705 db RdSeq.Inc,$9c 706 rts 707 708 :off6 jsr rw18 709 db RdGrp.Inc 710 hex 00,00,00,00,00,00,96,97,98 711 hex 99,9a,9b,9c,9d,9e,9f,a0,a1 712 jsr rw18 713 db RdGrp.Inc 714 hex a2,a3,a4,a5,a6,a7,a8,a9,aa 715 hex ab,ac,ad,00,00,00,00,00,00 716 rts 717 718 :off0 jsr rw18 719 db RdSeq.Inc,$96 720 jsr rw18 721 db RdGrp.Inc 722 hex a8,a9,aa,ab,ac,ad,00,00,00 723 hex 00,00,00,00,00,00,00,00,00 724 ]rts rts 725 726 *------------------------------- 727 * 728 * read blueprint 729 * 730 *------------------------------- 731 rdbluep 732 jsr setbluep 733 bne :reg1 734 735 :reg0 jsr rw18 736 db RdGrpErr 737 hex b7,b8,b9,ba,bb,bc,bd,be,bf 738 hex 00,00,00,00,00,00,00,00,00 739 bcc ]rts 740 jsr error 741 jmp :reg0 742 743 :reg1 jsr rw18 744 db RdGrpErr 745 hex 00,00,00,00,00,00,00,00,00 746 hex b7,b8,b9,ba,bb,bc,bd,be,bf 747 bcc ]rts 748 jsr error 749 jmp :reg1 750 751 *------------------------------- 752 * 753 * Copy one DHires page to another 754 * 755 *------------------------------- 756 copy1to2 757 lda #$40 ;dest 758 ldx #$20 ;org 759 bne copydhires 760 761 copy2to1 762 lda #$20 763 ldx #$40 764 765 copydhires 766 sta IMAGE+1 ;dest 767 stx IMAGE ;org 768 769 jsr _copy2000aux 770 jmp _copy2000 ;in hires 771 772 *------------------------------- 773 * 774 * Cut to princess screen 775 * 776 *------------------------------- 777 CUTPRINCESS 778 jsr blackout 779 lda #1 ;seek track 0 780 cutprincess1 781 jsr LoadStage2 ;displaces bgtab1-2, chtab4 782 783 lda #pacProom 784 jsr SngExpand 785 786 lda #$40 787 sta IMAGE+1 788 lda #$20 789 sta IMAGE ;copy page 1 to page 2 790 jmp _copy2000 ;in HIRES 791 792 *------------------------------- 793 * 794 * Epilog (You Win) 795 * 796 *------------------------------- 797 EPILOG 798 lda #1 799 sta soundon 800 sta musicon 801 jsr blackout 802 jsr LoadStage1B 803 804 jsr Epilog 805 806 lda #POPside1 807 sta BBundID 808 sta $c010 809 :loop lda $c000 810 bpl :loop ;fall thru 811 812 *------------------------------- 813 * 814 * A T T R A C T 815 * 816 * Self-running "attract mode" 817 * 818 *------------------------------- 819 ATTRACTMODE 820 AttractLoop 821 lda #1 822 sta musicon 823 824 jsr SetupDHires 825 826 jsr PubCredit 827 828 jsr AuthorCredit 829 830 jsr TitleScreen 831 832 jsr Prolog1 833 ]princess 834 jsr PrincessScene 835 836 jsr SetupDHires 837 838 jsr Prolog2 839 840 jsr SilentTitle 841 842 jmp Demo 843 844 *------------------------------- 845 * 846 * Set up double hi-res 847 * 848 *------------------------------- 849 SetupDHires 850 851 * Show black lo-res scrn 852 853 jsr blackout 854 855 * Load in Stage 1 data 856 857 jmp LoadStage1A 858 859 *------------------------------- 860 * 861 * "Broderbund Software Presents" 862 * 863 *------------------------------- 864 PubCredit 865 866 * Unpack splash screen into DHires page 1 867 868 jsr unpacksplash 869 870 * Show DHires page 1 871 872 jsr setdhires 873 874 * Copy to DHires page 2 875 876 jsr copy1to2 877 878 lda #44 879 jsr tpause 880 881 * Unpack "Broderbund Presents" onto page 1 882 883 lda #delPresents 884 jsr DeltaExpPop 885 886 ldx #80 887 lda #s_Presents 888 jsr PlaySongI 889 890 jmp CleanScreen 891 892 *------------------------------- 893 * 894 * Credit line disappears 895 * 896 *------------------------------- 897 CleanScreen 898 899 * Switch to DHires page 2 900 * (credit line disappears) 901 902 lda PAGE2on 903 904 * Copy DHires page 2 back to hidden page 1 905 906 jsr copy2to1 907 908 * Display page 1 909 910 lda PAGE2off 911 ]rts rts 912 913 *------------------------------- 914 * 915 * "A Game by Jordan Mechner" 916 * 917 *------------------------------- 918 AuthorCredit 919 920 lda #42 921 jsr tpause 922 923 * Unpack byline onto page 1 924 925 lda #delByline 926 jsr DeltaExpPop 927 928 ldx #80 929 lda #s_Byline 930 jsr PlaySongI 931 932 * Credit line disappears 933 934 jmp CleanScreen 935 936 *------------------------------- 937 * 938 * "Prince of Persia" 939 * 940 *------------------------------- 941 SilentTitle 942 jsr unpacksplash 943 944 jsr copy1to2 945 946 lda #20 947 jsr tpause 948 949 lda #delTitle 950 jsr DeltaExpPop 951 952 lda #160 953 jmp tpause 954 955 *------------------------------- 956 TitleScreen 957 lda #38 958 jsr tpause 959 960 * Unpack title onto page 1 961 962 lda #delTitle 963 jsr DeltaExpPop 964 965 ldx #140 966 lda #s_Title 967 jsr PlaySongI 968 969 * Credit line disappears 970 971 jmp CleanScreen 972 973 *------------------------------- 974 * 975 * Prologue, part 1 976 * 977 *------------------------------- 978 Prolog1 979 lda #pacProlog 980 sta RAMRDaux 981 jsr DblExpand 982 983 ldx #250 984 lda #s_Prolog 985 jmp PlaySongI 986 987 *------------------------------- 988 * 989 * Princess's room: Vizier starts hourglass 990 * 991 *------------------------------- 992 PrincessScene 993 jsr blackout 994 995 jsr ReloadStuff ;wiped out by dhires titles 996 997 lda #0 ;don't seek track 0 998 jsr cutprincess1 999 1000 lda #0 ;cut #0 (intro) 1001 jmp xplaycut ;aux l.c. via grafix 1002 1003 *------------------------------- 1004 * 1005 * Prologue, part 2 1006 * 1007 *------------------------------- 1008 Prolog2 1009 lda #pacSumup 1010 sta RAMRDmain 1011 jsr DblExpand 1012 1013 jsr setdhires 1014 1015 ldx #250 1016 lda #s_Sumup 1017 jmp PlaySongI 1018 1019 *------------------------------- 1020 * 1021 * Epilog 1022 * 1023 *------------------------------- 1024 Epilog 1025 lda #pacEpilog 1026 sta RAMRDaux 1027 jsr DblExpand 1028 1029 jsr setdhires 1030 1031 lda #s_Epilog 1032 jsr PlaySongNI 1033 lda #15 1034 jsr pauseNI 1035 jsr unpacksplash 1036 lda #75 1037 jsr pauseNI 1038 1039 lda #s_Curtain 1040 jsr PlaySongNI 1041 lda #60 1042 jsr pauseNI 1043 1044 jmp blackout 1045 1046 unpacksplash 1047 lda #pacSplash 1048 sta RAMRDaux 1049 jmp DblExpand 1050 1051 *------------------------------- 1052 * 1053 * Demo sequence 1054 * 1055 *------------------------------- 1056 Demo 1057 jsr blackout 1058 1059 jsr LoadStage3 1060 1061 jsr setdemolevel 1062 jsr rdbluep 1063 1064 jsr driveoff 1065 1066 * Go to TOPCTRL 1067 1068 lda #0 1069 jmp start 1070 1071 *------------------------------- 1072 * non-interruptible pause 1073 1074 pauseNI 1075 :loop sta pausetemp 1076 ldy #20 1077 :loop1 ldx #0 1078 :loop2 dex 1079 bne :loop2 1080 dey 1081 bne :loop1 1082 1083 lda pausetemp 1084 sec 1085 sbc #1 1086 bne :loop 1087 ]rts rts 1088 1089 *------------------------------- 1090 * 1091 * Start game? (if key or button pressed) 1092 * 1093 *------------------------------- 1094 StartGame? 1095 jsr musickeys 1096 cmp #$80 ;key or button press? 1097 bcc ]rts ;no 1098 1099 do FinalDisk 1100 else 1101 cmp #kdemo ;temp! 1102 bne :1 1103 jmp Demo 1104 :1 cmp #kprincess ;temp! 1105 bne :2 1106 jmp ]princess 1107 fin 1108 1109 :2 cmp #krestart 1110 bne :3 1111 jmp AttractLoop 1112 :3 ;fall thru to DOSTARTGAME 1113 *------------------------------- 1114 * 1115 * Start a game 1116 * 1117 *------------------------------- 1118 DOSTARTGAME 1119 jsr blackout 1120 1121 * Turn on drive & load Stage 3 routines 1122 1123 :1 jsr LoadStage3 1124 1125 * Load 1st level 1126 1127 jsr set1stlevel 1128 1129 jsr rdbluep 1130 1131 * Turn off drive & set aux 1132 1133 jsr driveoff 1134 1135 * Go to TOPCTRL 1136 1137 lda #1 1138 sta musicon 1139 1140 do DemoDisk 1141 else 1142 1143 lda keypress 1144 cmp #kresume 1145 bne :newgame 1146 1147 * Resume old game 1148 1149 lda #4 ;arbitrary 1150 jmp startresume 1151 1152 fin 1153 1154 * Start new game 1155 1156 :newgame 1157 lda #1 1158 jmp start 1159 1160 *------------------------------- 1161 * 1162 * Load permanent code & data 1163 * (only once) 1164 * 1165 *------------------------------- 1166 loadperm 1167 jsr loadgame1 ;tracks 3-4 1168 jsr loadgame2a ;tracks 9-13 (main image tables) 1169 jmp loadauxlc 1170 1171 *------------------------------- 1172 * 1173 * Stage 1: static dbl hires screens -- no animation 1174 * Stage 2: character animation only (bg is unpacked) 1175 * Stage 3: full game animation 1176 * 1177 *------------------------------- 1178 * 1179 * Load Stage 1 data (sida A) 1180 * 1181 *------------------------------- 1182 ]lsub sta track 1183 :test jsr rw18 1184 db RdSeqErr.Inc,$40 1185 bcc :ok 1186 jsr error 1187 jmp :test 1188 :ok 1189 jsr rw18 1190 db RdSeq.Inc,$52 1191 jsr rw18 1192 db RdSeq.Inc,$64 1193 jsr rw18 1194 db RdSeq.Inc,$76 1195 jsr rw18 1196 db RdSeq.Inc,$88 1197 rts 1198 1199 LoadStage1A 1200 jsr driveon 1201 1202 lda #22 1203 jsr ]lsub 1204 1205 jsr setmain 1206 jsr rw18 1207 db RdSeq.Inc,$60 1208 jsr rw18 1209 db RdSeq.Inc,$72 1210 1211 jsr loadmusic1 1212 1213 jsr setaux 1214 lda #$ff 1215 sta BGset1 1216 sta BGset2 1217 sta CHset 1218 1219 jmp driveoff 1220 1221 *------------------------------- 1222 * 1223 * Load stage 1 (side B) 1224 * 1225 *------------------------------- 1226 LoadStage1B 1227 jsr driveon 1228 1229 lda #18 1230 jsr ]lsub 1231 1232 jsr loadmusic3 ;epilog 1233 1234 jmp driveoff 1235 1236 *------------------------------- 1237 * 1238 * Reload 2000-6000 auxmem 1239 * (wiped out by dhires titles) 1240 * 1241 *------------------------------- 1242 ReloadStuff 1243 jsr driveon 1244 1245 :test lda #4 1246 sta track 1247 jsr rw18 1248 db RdGrpErr 1249 hex 00,00,00,00,00,00,00,00,00 1250 hex 00,20,21,22,23,24,25,26,27 1251 bcc :ok 1252 jsr error 1253 jmp :test 1254 :ok 1255 lda #15 1256 sta track 1257 jsr rw18 1258 db RdSeq.Inc,$28 1259 jsr rw18 1260 db RdSeq.Inc,$3a 1261 jsr rw18 1262 db RdSeq.Inc,$4c 1263 1264 jmp driveoff 1265 1266 *------------------------------- 1267 * 1268 * Load stage 2 data (6000-a800) 1269 * 1270 *------------------------------- 1271 LoadStage2 1272 ldx BBundID 1273 cpx #POPside2 1274 beq LoadStage2B 1275 1276 LoadStage2A 1277 pha 1278 jsr driveon 1279 pla 1280 beq :1 ;don't seek track 0 1281 1282 jsr rw18 ;Copy protection has already been checked 1283 db Seek,0,0 ;Drive is already on & at track 0 1284 ;This is just a ruse 1285 jsr text ;So's this 1286 1287 lda #0 1288 :1 jsr loadch7 ;side A only 1289 1290 lda #29 1291 ]ls2 sta track 1292 1293 :test jsr rw18 1294 db RdSeqErr.Inc,$60 1295 bcc :ok 1296 jsr error 1297 jmp :test 1298 :ok 1299 jsr rw18 1300 db RdSeq.Inc,$72 1301 jsr rw18 1302 db RdSeq.Inc,$84 1303 jsr rw18 1304 db RdGrp.Inc 1305 hex 96,97,98,99,9a,9b,9c,9d,9e 1306 hex 00,00,00,00,00,00,00,00,00 1307 1308 lda #$ff 1309 sta BGset1 1310 sta BGset2 1311 sta CHset 1312 1313 jmp driveoff 1314 1315 * Load chtable7 (side A only) 1316 1317 loadch7 1318 sta recheck0 1319 :test lda #28 1320 sta track 1321 jsr rw18 1322 db RdGrpErr.Inc 1323 hex 00,00,00,00,00,00,00,00,00 1324 hex 00,00,00,00,9f,a0,a1,a2,a3 1325 bcc :ok 1326 jsr error 1327 inc recheck0 1328 jmp :test 1329 :ok 1330 ]rts rts 1331 1332 *------------------------------- 1333 * 1334 * Load stage 2 routines (side B) 1335 * 1336 *------------------------------- 1337 LoadStage2B 1338 jsr driveon 1339 1340 lda #24 1341 bne ]ls2 1342 1343 *------------------------------- 1344 * 1345 * Load stage 3 1346 * Full version (from stage 1) 1347 * 1348 * Reload 2000-AC00 auxmem, 6000-7200 mainmem 1349 * 1350 *------------------------------- 1351 LoadStage3 1352 jsr driveon 1353 :purple 1354 jsr rw18 1355 db Seek,0,0 1356 1357 do CopyProtect 1358 jsr purple ;in unpack ($ea00) 1359 ;sets purpleflag ($da) to #$01 1360 ;uses $6300 aux as scratch 1361 fin 1362 1363 jsr rw18 1364 db Seek,0,4 1365 1366 jsr rw18 1367 db RdGrpErr.Inc 1368 hex 00,00,00,00,00,00,00,00,00 1369 hex 00,20,21,22,23,24,25,26,27 1370 bcc :ok 1371 jsr error 1372 jmp :purple 1373 :ok 1374 jsr rw18 1375 db RdSeq.Inc,$60 1376 jsr rw18 1377 db RdSeq.Inc,$72 ;bgtable1 1378 1379 jsr setmain 1380 jsr rw18 1381 db RdSeq.Inc,$60 1382 jsr rw18 1383 db RdSeq.Inc,$72 1384 1385 jsr setaux 1386 1387 lda #13 1388 sta track 1389 jsr rw18 1390 db RdGrp.Inc 1391 hex 00,00,00,00,00,00,00,00,00 1392 hex 00,00,00,96,97,98,99,9a,9b 1393 jsr rw18 1394 db RdSeq.Inc,$9c ;chtable4 1395 jsr rw18 1396 db RdSeq.Inc,$28 1397 jsr rw18 1398 db RdSeq.Inc,$3a 1399 jsr rw18 1400 db RdSeq.Inc,$4c 1401 jsr rw18 1402 db RdSeq.Inc,$84 ;bgtable2 1403 1404 lda #0 1405 sta BGset1 1406 sta BGset2 1407 sta CHset 1408 1409 jsr loadmusic2 1410 1411 jmp setaux 1412 1413 *------------------------------- 1414 * 1415 * Play song--interruptible & non-interruptible 1416 * 1417 * (Enter & exit w/ bank 2 switched in) 1418 * 1419 * In: A = song # 1420 * X = length to pause if sound is turned off 1421 * 1422 *------------------------------- 1423 PlaySongNI ;non-interruptible 1424 ;(& ignores sound/music toggles) 1425 jsr setaux 1426 jsr xminit 1427 :loop jsr xmplay 1428 cmp #0 1429 bne :loop 1430 ]rts rts 1431 1432 *------------------------------- 1433 PlaySongI ;interruptible 1434 jsr setaux 1435 beq ]rts 1436 1437 tay 1438 lda musicon 1439 and soundon 1440 beq :pause 1441 1442 tya 1443 jsr xminit 1444 :loop jsr StartGame? 1445 jsr xmplay 1446 cmp #0 1447 bne :loop 1448 ]rts rts 1449 1450 :pause txa ;falls thru to tpause 1451 *------------------------------- 1452 * 1453 * In: A = delay (max = 255) 1454 * 1455 *------------------------------- 1456 tpause 1457 :loop sta pausetemp 1458 1459 ldy #2 1460 :loop1 ldx #0 1461 :loop2 jsr StartGame? 1462 dex 1463 bne :loop2 1464 dey 1465 bne :loop1 1466 1467 lda pausetemp 1468 sec 1469 sbc #1 1470 bne :loop 1471 ]rts rts 1472 1473 *------------------------------- 1474 * 1475 * Disk error 1476 * 1477 * Prompt user for correct disk side & wait for keypress 1478 * 1479 *------------------------------- 1480 error 1481 jsr driveoff 1482 1483 jsr prompt 1484 1485 jmp driveon 1486 1487 *------------------------------- 1488 lst 1489 eof ds 1 1490 usr $a9,1,$a80,*-org 1491 lst off