UNPACK.S (10522B)
1 * unpack 3.5 2 ThreeFive = 1 3 org = $ea00 4 lst off 5 *------------------------------- 6 * 7 * Sits in main l.c. bank 2 8 * 9 *------------------------------- 10 org org 11 12 jmp SNGEXPAND 13 jmp DBLEXPAND 14 jmp DELTAEXPPOP 15 jmp INVERTY 16 jmp DELTAEXPWIPE 17 18 jmp PURPLE 19 jmp PROMPT 20 jmp BLACKOUT 21 jmp CLR 22 jmp TEXT 23 24 jmp SETDHIRES 25 jmp FADEIN 26 jmp LOADSUPER 27 jmp FADEOUT 28 29 *------------------------------- 30 lst 31 put gameeq 32 lst 33 put eq 34 lst off 35 36 IOUDISoff = $c07f 37 IOUDISon = $c07e 38 DHIRESoff = $c05f 39 DHIRESon = $c05e 40 HIRESon = $c057 41 HIRESoff = $c056 42 PAGE2on = $c055 43 PAGE2off = $c054 44 MIXEDon = $c053 45 MIXEDoff = $c052 46 TEXTon = $c051 47 TEXToff = $c050 48 ALTCHARon = $c00f 49 ALTCHARoff = $c00e 50 ADCOLon = $c00d 51 ADCOLoff = $c00c 52 ALTZPon = $c009 53 ALTZPoff = $c008 54 RAMWRTaux = $c005 55 RAMWRTmain = $c004 56 RAMRDaux = $c003 57 RAMRDmain = $c002 58 ADSTOREon = $c001 59 ADSTOREoff = $c000 60 61 RWBANK2 = $c083 62 RWBANK1 = $c08b 63 64 *------------------------------- 65 * RW18 ID bytes 66 67 POPside1 = $a9 68 POPside2 = $ad 69 70 * RW18 zero page vars 71 72 slot = $fd 73 track = $fe 74 lastrack = $ff 75 76 * RW18 commands 77 78 DrvOn = $00 79 DrvOff = $01 80 Seek = $02 81 RdSeqErr = $03 82 RdGrpErr = $04 83 WrtSeqErr = $05 84 WrtGrpErr = $06 85 ModID = $07 86 RdSeq = $83 87 RdGrp = $84 88 WrtSeq = $85 89 WrtGrp = $86 90 Inc = $40 ;.Inc to inc track 91 92 *------------------------------- 93 * 94 * Unpack single hi-res screen into page 1 95 * (Sorry about the code--it's lifted directly from DRAZ) 96 * 97 *------------------------------- 98 dum $00 99 100 PAC ds 2 101 PIC ds 2 102 V2 ds 1 103 V3 ds 1 104 V4 ds 1 105 V5 ds 1 106 V8 ds 1 107 V9 ds 1 108 VA ds 1 109 VB ds 1 110 VC ds 1 111 112 dend 113 114 *------------------------------- 115 SNGEXPAND 116 sta RAMRDaux 117 sta RAMWRTmain 118 119 STA PAC+1 ;org addr 120 121 LDA #$20 122 STA PIC+1 ;dest addr 123 124 LDA #0 125 STA PAC 126 STA PIC 127 128 LDA #$FE 129 STA V8 130 LDA #0 131 STA VA 132 LDY #$27 133 :4 LDA #$78 134 STA V2 135 LDA #$20 136 STA V3 137 :0 LDA V2 138 SEC 139 SBC #$28 140 STA V2 141 BCS :1 142 DEC V3 143 :1 LDA V2 144 STA V4 145 LDA V3 146 CLC 147 ADC #4 148 STA V5 149 :2 LDA V4 150 SEC 151 SBC #$80 152 STA V4 153 BCS :3 154 DEC V5 155 :3 LDA V4 156 STA PIC 157 LDA V5 158 CLC 159 ADC #$20 160 STA PIC+1 161 :5 LDA PIC+1 162 SEC 163 SBC #4 164 STA PIC+1 165 CLC 166 BCC :6 167 :13 LDA PIC+1 168 CMP V5 169 BNE :5 170 LDA V4 171 CMP V2 172 BNE :2 173 LDA V5 174 CMP V3 175 BNE :2 176 LDA V2 177 BNE :0 178 DEY 179 BPL :4 180 RTS 181 :6 BIT VA 182 BMI :11 183 LDX #0 184 LDA (PAC,X) 185 STA VB 186 CMP V8 187 BNE :10 188 INC PAC 189 BNE :7 190 INC PAC+1 191 :7 LDA (PAC,X) 192 STA V9 193 INC PAC 194 BNE :8 195 INC PAC+1 196 :8 LDA (PAC,X) 197 STA VB 198 INC PAC 199 BNE :9 200 INC PAC+1 201 :9 LDA #$80 202 STA VA 203 CLC 204 BCC :11 205 :10 LDA VB 206 ORA #$80 207 STA (PIC),Y 208 INC PAC 209 BNE :12 210 INC PAC+1 211 :12 CLC 212 BCC :13 213 :11 LDA VB 214 ORA #$80 215 STA (PIC),Y 216 DEC V9 217 BNE :13 218 LDA #0 219 STA VA 220 BEQ :13 221 222 *------------------------------- 223 * 224 * Unpack crunched double hi-res screen 225 * 226 * Robert A. Cook 3/89 227 * 228 * In: A = hi byte of crunched data address 229 * RAMRD set to main/aux depending on where crunched 230 * data is stored 231 * 232 *------------------------------- 233 234 dum $f0 235 236 CrnDatPtr ds 2 237 XClmPos ds 1 238 YScrPos ds 1 239 ByteHld ds 1 240 RepeatCdn ds 1 241 ScrBasPtr ds 2 242 243 dend 244 245 *------------------------------- 246 DBLEXPAND 247 sta CrnDatPtr+1 248 249 lda #1 250 sta CrnDatPtr 251 ;(CrnDatPtr),0 is crunch type (unused) 252 jmp WipeRgtExp 253 254 *------------------------------- 255 * 256 * Wipe Right Expand 257 * 258 *------------------------------- 259 WipeRgtExp 260 lda #0 261 sta XClmPos 262 263 :Loop lda #0 264 sta YScrPos 265 jsr ExpandClm 266 267 lda #1 268 sta YScrPos 269 jsr ExpandClm 270 271 inc XClmPos 272 273 lda XClmPos 274 cmp #80 275 bne :Loop 276 277 ]rts rts 278 279 *------------------------------- 280 * 281 * Delta Expand 282 * 283 * In: A = hi byte of crunched data address (in auxmem) 284 * 285 *------------------------------- 286 DeltaExp 287 sta RAMRDaux 288 289 sta CrnDatPtr+1 290 291 lda #0 292 sta CrnDatPtr 293 294 sta XClmPos 295 296 :Loop ldy #0 297 lda (CrnDatPtr),y 298 cmp #-1 299 beq :Done 300 301 sta ByteHld 302 and #$80 303 beq :ExpandOne 304 305 lda ByteHld 306 and #$7f 307 beq :NewCoord 308 309 tax 310 311 ldy #1 312 lda (CrnDatPtr),y 313 jsr ExpClmSeq1 314 315 clc 316 lda CrnDatPtr 317 adc #2 318 sta CrnDatPtr 319 bcc :a4 320 inc CrnDatPtr+1 321 :a4 322 jmp :Next 323 324 :NewCoord 325 ldy #1 326 lda (CrnDatPtr),y 327 sta XClmPos 328 329 ldy #2 330 lda (CrnDatPtr),y 331 sta YScrPos 332 333 clc 334 lda CrnDatPtr 335 adc #3 336 sta CrnDatPtr 337 bcc :a7 338 inc CrnDatPtr+1 339 :a7 340 jmp :Next 341 342 :ExpandOne 343 lda ByteHld 344 ldx #1 345 jsr ExpClmSeq1 346 347 inc CrnDatPtr 348 bne :sysi8 349 inc CrnDatPtr+1 350 :sysi8 351 352 :Next lda XClmPos 353 cmp #$80 354 bne :Loop 355 356 :Done sta RAMRDmain 357 ]rts rts 358 359 *------------------------------- 360 * 361 * Expand Column 362 * 363 *------------------------------- 364 ExpandClm 365 366 :Loop ldy #0 367 lda (CrnDatPtr),y 368 sta ByteHld 369 and #$80 370 beq :ExpandOne 371 372 ldy #1 373 lda (CrnDatPtr),y 374 tax 375 lda ByteHld 376 and #$7f 377 jsr ExpClmSeq 378 379 clc 380 lda CrnDatPtr 381 adc #2 382 sta CrnDatPtr 383 bcc :a4 384 inc CrnDatPtr+1 385 :a4 386 jmp :Next 387 388 :ExpandOne 389 lda ByteHld 390 ldx #1 391 jsr ExpClmSeq 392 393 inc CrnDatPtr 394 bne :sysi5 395 inc CrnDatPtr+1 396 :sysi5 397 398 :Next lda YScrPos 399 cmp #192 400 bcc :Loop 401 402 rts 403 404 *------------------------------- 405 * 406 * Expand Column Sequence 407 * 408 *------------------------------- 409 * 410 * In: XClmPos 411 * YScrPos 412 * A (byte pattern) 413 * X (repeat count) 414 * 415 * Out: YScrPos (modified) 416 * 417 *------------------------------- 418 ExpClmSeq 419 sta ByteHld 420 stx RepeatCdn 421 422 :Loop ldx XClmPos 423 ldy YScrPos 424 lda ByteHld 425 jsr PutScrByte 426 427 lda YScrPos 428 clc 429 adc #2 430 sta YScrPos 431 432 dec RepeatCdn 433 bne :Loop 434 435 rts 436 437 *------------------------------- 438 * 439 * Expand Column Sequence 1 440 * 441 *------------------------------- 442 ExpClmSeq1 443 sta ByteHld 444 stx RepeatCdn 445 446 :Loop ldx XClmPos 447 ldy YScrPos 448 lda ByteHld 449 bmi :Next 450 451 jsr PutScrByte 452 453 :Next inc YScrPos 454 455 lda YScrPos 456 cmp #192 457 bne :SkipXInc 458 459 lda #0 460 sta YScrPos 461 462 inc XClmPos 463 464 :SkipXInc 465 dec RepeatCdn 466 bne :Loop 467 468 rts 469 470 *------------------------------- 471 * 472 * Put DHires Byte Value 473 * 474 *------------------------------- 475 * 476 * In: X (XClmPos) 477 * Y (YScrPos) 478 * A (Byte value) 479 * 480 *------------------------------- 481 PutScrByte 482 sta ByteHld 483 ;YScrPos in Y 484 lda YLO,y 485 sta ScrBasPtr 486 lda YHI,y 487 ora #$20 ;DHires page 1 488 sta ScrBasPtr+1 489 490 txa ;XClmPos in X 491 lsr 492 tay 493 bcs NoAuxSet 494 495 sta RAMWRTaux 496 497 NoAuxSet lda ByteHld 498 sta (ScrBasPtr),y 499 500 sta RAMWRTmain 501 502 ]rts rts 503 504 *------------------------------- 505 * 506 * P U R P L E 507 * 508 *------------------------------- 509 do ThreeFive 510 PURPLE rts 511 512 else 513 put purple 514 fin 515 516 *------------------------------- 517 * 518 * Delta Expand (Pop or Wipe) 519 * 520 * In: A = hi byte of crunched data address (in auxmem) 521 * 522 *------------------------------- 523 DELTAEXPPOP 524 sta PAGE2on 525 ]DE jsr DeltaExp 526 sta PAGE2off 527 sta RAMRDaux 528 sta RAMWRTaux 529 ]rts rts 530 531 DELTAEXPWIPE 532 sta PAGE2off 533 jmp ]DE 534 535 *------------------------------- 536 * 537 * Invert Y-tables 538 * 539 *------------------------------- 540 INVERTY 541 ldx #191 ;low line 542 ldy #0 ;high line 543 544 * Switch low & high lines 545 546 :loop lda YLO,x 547 pha 548 lda YLO,y 549 sta YLO,x 550 pla 551 sta YLO,y 552 553 lda YHI,x 554 pha 555 lda YHI,y 556 sta YHI,x 557 pla 558 sta YHI,y 559 560 * Move 1 line closer to ctr 561 562 dex 563 iny 564 cpy #96 565 bcc :loop 566 ]rts rts 567 568 *------------------------------- 569 * 570 * Prompt user to insert correct disk side 571 * 572 *------------------------------- 573 do ThreeFive 574 msg1 asc " Insert Prince of Persia Disk@" 575 else 576 msg1 asc "Insert Prince of Persia Disk, Side " 577 fin 578 579 msg2 asc "C@" 580 581 *------------------------------- 582 PROMPT 583 lda #"A" 584 ldx BBundID 585 cpx #POPside1 586 beq :1 587 lda #"B" 588 :1 sta msg2 ;side A or B? 589 590 jsr blackout 591 592 sta RAMWRTmain 593 594 ldx #0 595 :loop lda msg1,x 596 cmp #"@" 597 beq :done 598 sta $528+2,x ;midscrn 599 inx 600 bpl :loop 601 602 :done sta RAMWRTaux 603 jsr whoop ;whoop spkr 604 605 :wloop lda $c000 606 ora $c061 607 ora $c062 608 bpl :wloop 609 sta $c010 610 611 jmp clr ;clear screen 612 613 *------------------------------- 614 CLR bit RWBANK2 615 bit RWBANK2 616 617 sta $c010 618 619 lda #" " 620 jmp _lrcls ;in hires 621 622 *------------------------------- 623 * 624 * Show black screen (text page 1) 625 * 626 *------------------------------- 627 BLACKOUT 628 jsr CLR 629 630 TEXT sta RAMRDaux 631 jsr vblank 632 sta TEXTon 633 sta ADCOLoff 634 sta PAGE2off 635 ]rts rts 636 637 *------------------------------- 638 * Set dbl hires 639 *------------------------------- 640 SETDHIRES 641 sta RAMRDaux 642 sta RAMWRTaux 643 jsr vblank 644 sta ADCOLon 645 bit HIRESon 646 647 bit DHIRESon 648 bit DHIRESoff 649 bit DHIRESon 650 bit DHIRESoff 651 bit DHIRESon ;for old Apple RGB card 652 653 sta TEXToff 654 rts 655 656 ************************************************** 657 ************************************************** 658 ************************************************** 659 xc 660 xc 661 662 stlx mac bank;addr 663 hex 9f 664 da ]2 665 db ]1 666 <<< 667 ldlx mac bank;addr 668 hex bf 669 da ]2 670 db ]1 671 <<< 672 673 *------------------------------- 674 * 675 * FADE IN 676 * 677 * In: s-hires data in $2000.9FFF 678 * A = 0 main, 1 aux 679 * 680 *------------------------------- 681 FADEIN 682 sta RAMRDmain 683 sta :sm1+2 684 sta :sm2+2 685 686 clc 687 xce 688 689 sep $30 ;axy 690 691 lda #%00011110 692 sta $C035 ;shadow reg 693 lda #$41 694 sta $C029 ;SH reg 695 696 rep $30 ;AXY 697 698 * Clear scan line control byte table 699 * and palette 0 to black 700 701 lda #$0000 702 ldx #$011E 703 :scbclr dex 704 dex 705 stlx $E1;$9D00 706 bne :scbclr 707 708 * Now move data over 709 710 ldx #$2000 711 ldy #$2000 712 lda #32000-1 713 phb 714 :sm1 mvn $E1,1 ;main/aux 715 plb 716 717 * Turn on Super Hires mode 718 719 sep $20 720 lda #$C1 721 sta $C029 722 rep $20 723 724 * Move desired palette over to PalFade area 725 726 ldx #$9D00 ;aux mem 727 ldy #new_palette 728 lda #32-1 729 phb 730 :sm2 mvn 0,1 ;aux to main/aux 731 plb 732 733 * Now fade in the picture 734 735 bra PalFade ;switches back to e-mode 736 737 *------------------------------- 738 * 739 * FADE OUT 740 * 741 *------------------------------- 742 FADEOUT 743 mx 3 744 745 * Clear the "destination" palette back to zero 746 747 ldx #31 748 lda #$00 749 :palclr sta new_palette,x 750 dex 751 bpl :palclr 752 753 * Now fade out 754 755 bra PalFade ;switches back to e-mode 756 757 *------------------------------------------------- PalFade 758 * 759 * Given current palette at $E19E00.1F, fade to 760 * new palette given in new_palette 761 * 762 763 new_palette ds 32 764 765 PalFade dum 0 766 :green ds 1 767 :blue ds 1 768 dend 769 770 sec 771 xce 772 773 bit $C019 774 bmi *-3 775 776 ldy #16 777 778 :fadein ldx #3 779 780 :fadein2 bit $C019 781 bpl *-3 782 783 bit $C019 784 bmi *-3 785 786 dex 787 bne :fadein2 788 789 ldx #30 790 :palloop ldlx $E1;$9E01 791 and #$0f 792 cmp new_palette+1,x 793 beq :red_ok 794 inc 795 blt :red_ok 796 dec 797 dec 798 799 :red_ok stlx $E1;$9E01 800 801 lda new_palette,x 802 and #$F0 803 sta :green 804 805 ldlx $E1;$9E00 806 and #$F0 807 cmp :green 808 beq :green_ok 809 blt :grn_add 810 sbc #$20 811 :grn_add clc 812 adc #$10 813 814 :green_ok sta :green 815 816 lda new_palette,x 817 and #$0F 818 sta :blue 819 820 ldlx $E1;$9E00 821 and #$0F 822 cmp :blue 823 beq :blue_ok 824 inc 825 blt :blue_ok 826 dec 827 dec 828 829 :blue_ok ora :green 830 stlx $E1;$9E00 831 832 dex 833 dex 834 bpl :palloop 835 836 dey 837 bpl :fadein 838 839 rts 840 841 xc off 842 mx 3 843 844 *=============================== 845 * 846 * Load super hi-res data 847 * 848 *------------------------------- 849 LOADSUPER 850 jsr rw18 851 db ModID,$79 ;set "side C" 852 853 lda #0 854 sta track 855 sta RAMWRTmain 856 jsr loadscrn ;"Tracks" 0-6: palace (mainmem) 857 858 sta RAMWRTaux 859 jmp loadscrn ;"Tracks" 7-13: epilog (auxmem) 860 861 *------------------------------- 862 * 863 * Load super hi-res screen into $2000.9FFF 864 * 865 *------------------------------- 866 loadscrn 867 lda #$20 868 :loop sta :sm 869 jsr rw18 870 db RdSeq.Inc 871 :sm db $20 872 lda :sm 873 clc 874 adc #$12 875 cmp #$9e 876 bcc :loop ;load 7 tracks 877 ]rts rts 878 879 *------------------------------- 880 lst 881 eof ds 1 882 usr $a9,2,$a00,*-org 883 lst off