Prince-of-Persia-Apple-II

A running-jumping-swordfighting game Jordan Mechner made on the Apple II from 1985-89
Log | Files | Refs | README | LICENSE

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