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

HIRES.S (8915B)


      1 * draz hires
      2 org equ $8400
      3  lst off
      4 
      5  org org
      6 
      7  put hrparams
      8  put hrtables
      9 *-------------------------------
     10  ds org+$a00-*
     11 
     12  JMP CLS
     13  JMP LAY
     14  jmp DIAMOND
     15 
     16 * Local vars
     17 
     18  dum $e0
     19 
     20 BASE ds 2
     21 IMSAVE ds 2
     22 XSAVE ds 1
     23 YSAVE ds 1
     24 WIDTH ds 1
     25 HEIGHT ds 1
     26 TOPEDGE ds 1
     27 OFFLEFT ds 1
     28 OFFRIGHT ds 1
     29 YREG ds 1
     30 CARRY ds 1
     31 AMASK ds 1
     32 BMASK ds 1
     33 VISWIDTH ds 1
     34 RMOST ds 1
     35 
     36 saveimg ds 3
     37 destheight ds 1
     38 temp1 ds 1
     39 imgline ds 1
     40 
     41  dend
     42 
     43 *-------------------------------
     44 *  C L S
     45 *
     46 *  Clear screen to black2
     47 
     48 CLS LDA PAGE
     49  CLC
     50  ADC #$20
     51  STA BASE+1
     52 
     53  LDY #$00
     54  STY BASE
     55 
     56 :1 LDA #$80
     57 
     58 :2 STA (BASE),Y
     59  INY
     60  BNE :2
     61 
     62  INC BASE+1
     63  LDA BASE+1
     64  AND #$1F
     65  BNE :1
     66 
     67  RTS
     68 
     69 *-------------------------------
     70 * L A Y
     71 *
     72 * Parameters:
     73 *
     74 * PAGE      $00 = page 1, $20 = page 2
     75 * XCO       byte (0=left, 39=right)
     76 * YCO       line (0=top, 191=bottom)
     77 * OFFSET    # bits to shift right (0-6)
     78 * IMAGE     starting address of image table
     79 * OPACITY   Bits 0-1: 0 = AND, 1 = ORA, 2 = STA, 3 = EOR
     80 *           Bit 7: 0 = normal, 1 = mirror
     81 *
     82 * Image table:
     83 *
     84 * 0:    width (# bytes)
     85 * 1:    height (# lines)
     86 * 2-n:  image reading L-R, T-B
     87 *
     88 *-------------------------------
     89 
     90 LAY LDA OPACITY
     91  BPL :99
     92 
     93  AND #$7F
     94  STA OPACITY
     95  JMP MLAY
     96 
     97 :99 JSR PREPREP
     98  JSR PREPARE
     99  CMP #-1
    100  BCC :8
    101  JMP DONE
    102 
    103 :8 LDX OFFSET
    104 
    105  LDA SHIFTL,X
    106  STA :91+1
    107  LDA SHIFTH,X
    108  STA :91+2
    109 
    110  LDA CARRYL,X
    111  STA :90+1
    112  STA :92+1
    113  LDA CARRYH,X
    114  STA :90+2
    115  STA :92+2
    116 
    117  LDA AMASKS,X
    118  STA AMASK
    119  LDA BMASKS,X
    120  STA BMASK
    121 
    122  LDX OPACITY
    123  LDA OPCODE,X
    124  STA :80
    125  STA :81
    126 
    127  LDY YCO
    128 
    129 :0 LDA YLO,Y
    130  CLC
    131  ADC XCO
    132  STA BASE
    133 
    134  LDA YHI,Y
    135  ADC PAGE
    136  STA BASE+1
    137 
    138  LDY OFFLEFT
    139  BEQ :2
    140 
    141 *  Take CARRY from off left edge
    142 
    143  DEY
    144  LDA (IMAGE),Y
    145  TAX
    146 :90 LDA $FFFF,X ;CARRYn
    147  STA CARRY
    148 
    149  LDA IMAGE
    150  CLC
    151  ADC OFFLEFT
    152  STA IMAGE
    153  BCC :1
    154  INC IMAGE+1
    155 
    156 :1 LDY #0
    157 
    158  LDA VISWIDTH
    159  STA WIDTH
    160  BNE :3
    161  BEQ :4 ;Zero width
    162 
    163 * Start a new line at left edge
    164 
    165 :2 LDA (BASE),Y
    166  AND AMASK
    167  STA CARRY
    168 
    169 * Lay line down left-to-right fast as you can
    170 
    171 :3 LDA (IMAGE),Y
    172  TAX
    173 :91 LDA $FFFF,X ;SHIFTn
    174  ORA CARRY ;Combine with carryover from previous byte
    175 
    176 :80 STA (BASE),Y ;STA/ORA/AND/EOR depending on OPACITY
    177  STA (BASE),Y
    178 
    179 :92 LDA $FFFF,X ;CARRYn
    180  STA CARRY ;Carry over to next byte
    181 
    182  INY
    183  CPY VISWIDTH
    184  BCC :3
    185 
    186 *  Extra byte on right (carryover)
    187 
    188  LDA OFFRIGHT
    189  BNE :5 ;Rightmost byte is offscreen
    190 
    191 :4 LDA (BASE),Y
    192 
    193  AND BMASK
    194  ORA CARRY
    195 :81 STA (BASE),Y
    196  STA (BASE),Y
    197 
    198 *  Next line up
    199 
    200 :5 LDA WIDTH
    201  CLC
    202  ADC IMAGE
    203  STA IMAGE
    204  BCC :6
    205  INC IMAGE+1
    206 
    207 :6 DEC YCO
    208  LDY YCO
    209  CPY TOPEDGE
    210  BNE :0
    211 
    212 *  Restore parameters
    213 
    214 DONE LDA IMSAVE
    215  STA IMAGE
    216  LDA IMSAVE+1
    217  STA IMAGE+1
    218 
    219  LDA XSAVE
    220  STA XCO
    221  LDA YSAVE
    222  STA YCO
    223 
    224  RTS
    225 
    226 *-------------------------------
    227 *  P R E P A R E
    228 *
    229 *  Save parameters
    230 
    231 PREPREP LDA IMAGE
    232  STA IMSAVE
    233  LDA IMAGE+1
    234  STA IMSAVE+1
    235 
    236  LDA XCO
    237  STA XSAVE
    238  LDA YCO
    239  STA YSAVE
    240 
    241 *  Read first two bytes (width, height) of image table
    242 
    243  LDY #0
    244  LDA (IMAGE),Y
    245  STA WIDTH
    246 
    247  INY
    248  LDA (IMAGE),Y
    249  STA HEIGHT
    250 
    251  LDA IMAGE
    252  CLC
    253  ADC #2
    254  STA IMAGE
    255  BCC :3
    256  INC IMAGE+1
    257 
    258 :3 RTS
    259 
    260 *-------------------------------
    261 * PREPARE
    262 *
    263 *  Crop top and bottom edges
    264 
    265 PREPARE LDA YCO
    266  SEC
    267  SBC HEIGHT
    268  CMP #192
    269  BCC :4 ;Top is onscreen
    270 
    271  LDA YCO
    272  CMP #192
    273  BCS :8 ;Top and bottom o.s. - skip it
    274 
    275  LDA #-1 ;Top is offscreen
    276 :4 STA TOPEDGE ;(Top line -1)
    277 
    278  LDY YCO
    279 :41 CPY #192
    280  BCC :6 ;Bottom is onscreen
    281 
    282 *  Advance pointer past bottom offscreen portion
    283 
    284  LDA IMAGE
    285  CLC
    286  ADC WIDTH
    287  STA IMAGE
    288  BCC :5
    289  INC IMAGE+1
    290 
    291 :5 DEY
    292  STY YCO
    293  BNE :41
    294 
    295 *  Crop sides
    296 
    297 :6 LDA #0
    298  STA OFFLEFT
    299  STA OFFRIGHT
    300  STA RMOST
    301 
    302  LDA WIDTH
    303  STA VISWIDTH
    304 
    305  LDA XCO
    306  BPL :7 ;Left edge is onscreen
    307 
    308 *  Left edge is offscreen
    309 
    310  EOR #$FF
    311  CLC
    312  ADC #1
    313  STA OFFLEFT ;Width of o.s. portion
    314 
    315  LDA XCO
    316  CLC
    317  ADC WIDTH
    318  BCC :8 ;Entire image is o.s. - skip it
    319  STA VISWIDTH ;(Width of onscreen portion)
    320 
    321  LDA #0
    322  STA XCO
    323  BEQ LAYON
    324 
    325 *  Left edge OK
    326 
    327 :7 CMP #40
    328  BCS :8 ;Entire image is o.s. - skip it
    329 
    330  CLC
    331  ADC WIDTH
    332  CMP #40
    333  BCC LAYON ;Right edge OK - lay on
    334 
    335  SEC
    336  SBC #39
    337  STA OFFRIGHT ;Width of o.s. portion
    338 
    339  LDA #40
    340  SEC
    341  SBC XCO
    342  STA VISWIDTH
    343 
    344  LDA WIDTH
    345  SEC
    346  SBC VISWIDTH
    347  STA RMOST
    348 
    349  BPL LAYON
    350 
    351 :8 LDA #-1 ;Image is o.s. - skip it
    352 
    353 LAYON RTS
    354 
    355 
    356 *-------------------------------
    357 *  M I R R O R L A Y
    358 *
    359 *  Specified starting byte (XCO,YCO) is image's bottom
    360 *  right corner, not bottom left; bytes are read off image
    361 *  table R-L, T-B and mirrored before printing.
    362 
    363 MLAY JSR PREPREP
    364 
    365  LDA XCO
    366  SEC
    367  SBC WIDTH
    368  STA XCO
    369 
    370  JSR PREPARE
    371  CMP #-1
    372  BCC :8
    373  JMP DONE
    374 
    375 :8 LDX OFFSET
    376 
    377  LDA SHIFTL,X
    378  STA :91+1
    379  LDA SHIFTH,X
    380  STA :91+2
    381 
    382  LDA CARRYL,X
    383  STA :90+1
    384  STA :92+1
    385  LDA CARRYH,X
    386  STA :90+2
    387  STA :92+2
    388 
    389  LDA AMASKS,X
    390  STA AMASK
    391  LDA BMASKS,X
    392  STA BMASK
    393 
    394  LDX OPACITY
    395  LDA OPCODE,X
    396  STA :80
    397  STA :81
    398 
    399 * Lay on
    400 
    401  LDY YCO
    402 
    403 :0 LDA YLO,Y
    404  STA BASE
    405 
    406  LDA YHI,Y
    407  CLC
    408  ADC PAGE
    409  STA BASE+1
    410 
    411  LDY OFFLEFT
    412  BEQ :2
    413 
    414 * Take CARRY from off left edge
    415 
    416  LDY VISWIDTH
    417  LDA (IMAGE),Y
    418  TAX
    419 
    420  LDA MIRROR-$80,X
    421  TAX
    422 
    423 :90 LDA $FFFF,X ;CARRYn
    424  STA CARRY
    425 
    426 :1 DEY
    427  BPL :3
    428  BMI :4
    429 
    430 * Start a new line at left edge
    431 
    432 :2 LDY XCO
    433  LDA (BASE),Y
    434  AND AMASK
    435  STA CARRY
    436 
    437  LDY WIDTH
    438  DEY
    439 
    440 * Lay line down left-to-right fast as you can
    441 
    442 :3 STY YREG
    443  LDA (IMAGE),Y
    444  TAX
    445 
    446  LDA MIRROR-$80,X
    447  TAX
    448 
    449 :91 LDA $FFFF,X ;SHIFTn
    450  ORA CARRY ;Combine with carryover from previous byte
    451 
    452  LDY XCO
    453 :80 STA (BASE),Y ;STA/ORA/AND/EOR depending on OPACITY
    454  STA (BASE),Y
    455 
    456 :92 LDA $FFFF,X ;CARRYn
    457  STA CARRY ;Carry over to next byte
    458 
    459  INC BASE
    460 
    461  LDY YREG
    462  CPY RMOST
    463  BEQ :7
    464 
    465  DEY
    466  BPL :3
    467 
    468 *  Extra byte on right (carryover)
    469 
    470 :7 LDA OFFRIGHT
    471  BNE :5 ;Rightmost byte is offscreen
    472 
    473 :4 LDY XCO
    474  LDA (BASE),Y
    475 
    476  AND BMASK
    477  ORA CARRY
    478 :81 STA (BASE),Y
    479  STA (BASE),Y
    480 
    481 *  Next line up
    482 
    483 :5 LDA WIDTH
    484  CLC
    485  ADC IMAGE
    486  STA IMAGE
    487  BCC :6
    488  INC IMAGE+1
    489 
    490 :6 DEC YCO
    491  LDY YCO
    492  CPY TOPEDGE
    493  BNE :0
    494 
    495  JMP DONE
    496 
    497 *-------------------------------
    498 *  F A S T L A Y
    499 *
    500 * Limitations: No offset - no clipping - no mirroring -
    501 * STA only - trashes IMAGE.
    502 
    503 FASTLAY LDY #0
    504  LDA (IMAGE),Y
    505  STA WIDTH
    506 
    507  INY
    508  LDA YCO
    509  SEC
    510  SBC (IMAGE),Y
    511  STA TOPEDGE
    512 
    513  LDA IMAGE
    514  CLC
    515  ADC #2
    516  STA IMAGE
    517  BCC :5
    518  INC IMAGE+1
    519 
    520 :5 LDX YCO
    521 
    522 :0 LDA YLO,X
    523  CLC
    524  ADC XCO
    525  STA BASE
    526 
    527  LDA YHI,X
    528  ADC PAGE
    529  STA BASE+1
    530 
    531  LDY #0
    532 
    533 :1 LDA (IMAGE),Y
    534  STA (BASE),Y
    535 
    536  INY
    537  CPY WIDTH
    538  BCC :1
    539 
    540  TYA
    541  CLC
    542  ADC IMAGE
    543  STA IMAGE
    544  BCC :2
    545  INC IMAGE+1
    546 
    547 :2 DEX
    548  CPX TOPEDGE
    549  BNE :0
    550 
    551  RTS
    552 
    553 *-------------------------------
    554 *
    555 *   D I A M O N D
    556 *
    557 *   Works like FASTLAY, but it lays down the image
    558 *   at a slant.
    559 *
    560 *-------------------------------
    561 widtable ;INT(7x/2) for x=0 to 40
    562  db 0,3,7,10,14,17,21,24,28
    563  db 31,35,38,42,45,49,52,56,59
    564  db 63,66,70,73,77,80,84,87,91
    565  db 94,98,101,105,108,112,115,119,122
    566  db 126,129,133,136,140
    567 *-------------------------------
    568 
    569 DIAMOND
    570  LDY #0
    571  LDA (IMAGE),Y
    572  STA WIDTH
    573 
    574  INY
    575  LDA (IMAGE),Y ;original image height
    576  sta HEIGHT
    577 
    578  ldx WIDTH
    579  clc
    580  adc widtable,x ;INT(7x/2)
    581  sta destheight
    582 
    583  LDA YCO
    584  SEC
    585  sbc destheight
    586  STA TOPEDGE
    587 
    588  LDA IMAGE
    589  CLC
    590  ADC #2
    591  STA IMAGE
    592  BCC :5
    593  INC IMAGE+1
    594 :5
    595 
    596 * Now lay down image (slanted)...L-R, B-T
    597 
    598  ldx YCO ;bottom line of screen dump area
    599 
    600  lda #0 ;bottom line of image
    601  sta imgline
    602 
    603 :loop
    604  LDA YLO,X
    605  CLC
    606  ADC XCO
    607  STA BASE
    608 
    609  LDA YHI,X
    610  ADC PAGE
    611  STA BASE+1 ;get base addr
    612 
    613  lda IMAGE
    614  sta saveimg
    615  lda IMAGE+1
    616  sta saveimg+1
    617 
    618  lda imgline
    619  sta saveimg+2
    620 
    621  LDY #0
    622 
    623 * Do a line (L-R), 2 bytes at a time
    624 
    625 :loop1
    626  jsr getimgbyte ;lda (IMAGE),y
    627  and #%00000011 ;2 leftmost bits (on this line)
    628  sta temp1
    629 
    630  jsr onelinedn ;move 1 line down & getimgbyte
    631  and #%00001100 ;next 2 bits (from line below)
    632  ora temp1
    633  sta temp1
    634 
    635  jsr onelinedn
    636  and #%00110000 ;next 2 bits (from 2 lines down)
    637  ora temp1
    638  sta temp1
    639 
    640  jsr onelinedn
    641  and #%01000000 ;rightmost bit (from 3 lines down)
    642  ora temp1
    643  ;Got it
    644  jsr putbyte
    645 
    646  INY
    647  CPY WIDTH
    648  bcs :eol
    649 
    650 * Next byte over on this line
    651 
    652  jsr getimgbyte
    653  and #%00000001 ;leftmost bit (still from 3 lines down)
    654  sta temp1
    655 
    656  jsr onelinedn
    657  and #%00000110 ;next 2 bits (from 4 lines down)
    658  ora temp1
    659  sta temp1
    660 
    661  jsr onelinedn
    662  and #%00011000 ;next 2 bits (from 5 lines down)
    663  ora temp1
    664  sta temp1
    665 
    666  jsr onelinedn
    667  and #%01100000 ;rightmost 2 bits (from 6 lines down)
    668  ora temp1
    669 
    670  jsr putbyte
    671 
    672  jsr onelinedn ;7 lines down (prepare for next 2 bytes)
    673 
    674  INY
    675  CPY WIDTH
    676  bcc :loop1 ;next 2 bytes in this line
    677 
    678 :eol
    679 
    680 * Done with this line
    681 * Up to the next line
    682 
    683  lda saveimg
    684  sta IMAGE
    685  lda saveimg+1
    686  sta IMAGE+1 ;reset IMAGE to point to this line
    687  lda saveimg+2
    688  sta imgline
    689 
    690  lda WIDTH
    691  CLC
    692  ADC IMAGE
    693  STA IMAGE
    694  BCC :2
    695  INC IMAGE+1
    696 :2
    697  inc imgline
    698 
    699  DEX
    700  CPX TOPEDGE
    701  beq :rts
    702 
    703  cpx #192
    704  bcs :rts ;offscreen
    705 
    706  jmp :loop
    707 
    708 :rts rts
    709 
    710 *-------------------------------
    711 onelinedn
    712  lda IMAGE
    713  sec
    714  sbc WIDTH
    715  sta IMAGE
    716 
    717  bcs :1
    718  dec IMAGE+1
    719 :1
    720 
    721  dec imgline
    722 
    723  jmp getimgbyte
    724 
    725 *-------------------------------
    726 getimgbyte
    727  lda imgline
    728  cmp HEIGHT
    729  bcs :outside
    730 
    731  lda (IMAGE),y
    732  rts
    733 
    734 :outside lda #$80 ;blank space outside image
    735  rts
    736 *-------------------------------
    737 putbyte ;in: A
    738  cpy #40
    739  bcs :skip
    740 
    741  ora #$80
    742  sta (BASE),y
    743 
    744 :skip rts
    745 *-------------------------------
    746  lst
    747 eof ds 1
    748  lst off
    749 *-------------------------------