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

RW1835.POP.S (7529B)


      1  lst off
      2  tr on
      3  org $D000
      4  xc off
      5 
      6 *-------------------------------------------------
      7 *
      8 * 07/02/87
      9 *
     10 * Unidisk 3.5 interface for
     11 * 18 sector read/write routine
     12 *
     13 * 09/05/89 Version for //e
     14 *
     15 *  Copyright 1985, 1987
     16 *  by Roland Gustafsson
     17 *
     18 *-------------------------------------------------
     19 
     20 sigblock = 16+315
     21 
     22 *
     23 * Permanent vars
     24 *
     25 
     26 slot = $FD
     27 track = $FE
     28 ;lastrack = $FF ;NOT USED
     29 
     30 * Zero page usage:
     31 
     32 temp = $40
     33 command = $41
     34 
     35 *-------------------------------------------------
     36  jmp RW18
     37 *-------------------------------------------------
     38 GS? ds 1 ;bpl if not, bmi if GS
     39 
     40 OFFSET = 16 ;default offset
     41 
     42 *-------------------------------------------------
     43 *
     44 * READ/WRITE 18 sectors!
     45 *
     46 
     47 READ lda #1
     48  hex 2C
     49 WRITE lda #2
     50  sta SPcommand
     51 
     52 * Calculate starting block
     53 * (OFFSET+track*9)
     54 
     55  lda track  ;0-34
     56  asl
     57  asl
     58  asl
     59  tax  ;x=lo
     60 
     61  lda #0
     62  rol
     63  tay  ;y=hi
     64 
     65  txa
     66  adc track
     67  tax
     68 
     69  tya
     70  adc #0
     71  tay
     72 
     73  txa
     74  adc #OFFSET
     75 BOFFLO = *-1
     76  sta BLOCKLO
     77 
     78  tya
     79  adc #>OFFSET
     80 BOFFHI = *-1
     81  sta BLOCKHI
     82 
     83 * Loop for 18 sectors, 2 at a time.
     84 
     85  ldy #0
     86 :0 tya
     87  pha
     88 
     89 * Do 2 sectors
     90 
     91  lda BUFTABLE,Y
     92  sta ]rbuf0
     93  sta ]wbuf0
     94  ldx BUFTABLE+1,Y
     95  stx ]rbuf1
     96  stx ]wbuf1
     97  dex
     98  cpx ]rbuf0
     99  jsr RWSECTS
    100 
    101  pla
    102  tay
    103 
    104  bcs :rts
    105 
    106 * Next 2 sectors
    107 
    108  inc BLOCKLO
    109  bne :1
    110  inc BLOCKHI
    111 
    112 :1 iny
    113  iny
    114  cpy #18
    115  bne :0
    116 
    117  clc
    118 :rts rts
    119 
    120 *-----------
    121 *
    122 * Read or write 2 sectors
    123 *
    124 * If the two sectors are sequential
    125 * then just go to the Device Driver.
    126 *
    127 
    128 RWSECTS bne :noncont
    129 
    130 * We are dealing with contiguous sectors...
    131 * if aux mem is set in any way, then we must
    132 * load them using the non-contiguous routine..
    133 
    134  bit ]RAMread?
    135  bmi :noncont
    136  bit ]RAMwrite?
    137  bpl JMPSP
    138 
    139 * Non-contiguous...
    140 
    141 :noncont ldy SPcommand
    142  dey
    143  bne WSECTS
    144 
    145 * Read two non-contiguous sectors
    146 
    147 RSECTS lda ]rbuf0
    148  ora ]rbuf1
    149  clc
    150  beq :rts
    151 
    152  jsr JMPSPBUF
    153  bcs :rts
    154 
    155 * Now move them to where they belong
    156 
    157  ldx #$2C  ; bit ABS
    158  ldy #$99  ; sta ABS,Y
    159 
    160 * If this sector is to be ignored,
    161 * then change sta $FF00,Y to bit.
    162 
    163  sty ]rmod0
    164  lda ]rbuf0
    165  bne *+5
    166  stx ]rmod0
    167 
    168  sty ]rmod1
    169  lda ]rbuf1
    170  bne *+5
    171  stx ]rmod1
    172 
    173  ldy #0
    174 :0 lda BLOCKBUF,Y
    175 ]rmod0 sta $FF00,Y
    176 ]rbuf0 = *-1
    177  lda BLOCKBUF+256,Y
    178 ]rmod1 sta $FF00,Y
    179 ]rbuf1 = *-1
    180  iny
    181  bne :0
    182 
    183 :rts rts
    184 
    185 *-----------
    186 *
    187 * Write two non-contiguous sectors
    188 *
    189 
    190 WSECTS ldy #0
    191 :0 lda $FF00,Y
    192 ]wbuf0 = *-1
    193  sta BLOCKBUF,Y
    194  lda $FF00,Y
    195 ]wbuf1 = *-1
    196  sta BLOCKBUF+256,Y
    197  iny
    198  bne :0
    199 
    200 JMPSPBUF lda #>BLOCKBUF
    201 
    202 *-------------------------------------------------
    203 *
    204 * Jump to Smart Port driver
    205 *
    206 * Enter: A - address of buffer
    207 *
    208 
    209 JMPSP sta SPbufhi
    210 
    211 * If ERROR? hi bit is set, then just return sec
    212 
    213  asl ERROR?
    214  bcs ]rtserr
    215 
    216 * Force main memory
    217 
    218  sta $C002
    219  sta $C004
    220 
    221 * Trick here, first time through, calculates
    222 * the entry point into the SmartPort, from
    223 * then on, direct access is available.
    224 
    225 ]SPjsr jsr calcSPjsr
    226 SPcommand db $11
    227  da SPcmdlist
    228 
    229 restAux sta $C002
    230  lda #$11
    231 ]RAMread? = *-1
    232  bpl *+5
    233  sta $C003
    234 
    235  sta $C004
    236  lda #$11
    237 ]RAMwrite? = *-1
    238  bpl *+5
    239  sta $C005
    240 
    241 ]rtserr rts
    242 
    243 calcSPjsr lda slot
    244  lsr
    245  lsr
    246  lsr
    247  lsr
    248  ora #$C0
    249  sta ]SPjsr+2
    250  sta :calcSPmod+2
    251 
    252 :calcSPmod lda $C5FF
    253  clc
    254  adc #3
    255  sta ]SPjsr+1
    256  jmp (]SPjsr+1)
    257 
    258 SPcmdlist db 3
    259 unit_num db 1 ;unit one
    260  db 0 ;SPbuflo=$00
    261 SPbufhi db $11
    262 BLOCKLO db $11 ;"low"
    263 BLOCKHI db $11 ;"med"
    264  db 0 ;"high" always zero!
    265 
    266 *------------------------------------------------- RW18
    267 *
    268 * Entry point into RW18
    269 *
    270 
    271 RW18 pla
    272  sta GOTBYTE+1
    273  pla
    274  sta GOTBYTE+2
    275 
    276  bit $CFFF
    277 
    278 * Remember aux memory settings
    279 
    280  lda $C013
    281  sta ]RAMread?
    282  lda $C014
    283  sta ]RAMwrite?
    284 
    285 * Save aux text page if running on a GS
    286 
    287  bit GS?
    288  bpl *+5
    289  jsr saveTaux
    290 
    291 * Save zpage
    292 
    293  ldx #0
    294 :zsave lda 0,x
    295  sta ZPAGEBUF,x
    296  inx
    297  bne :zsave
    298 
    299 * Get the command
    300 
    301  jsr GETBYTE
    302  sta command
    303  and #$0F
    304  asl
    305  tax
    306 
    307  lda cmdadr,X
    308  sta :1+1
    309  lda cmdadr+1,X
    310  sta :1+2
    311 
    312 :1 jsr $FFFF
    313 
    314 * Restore aux text page if running on a GS
    315 
    316  bit GS?
    317  bpl *+5
    318  jsr restTaux
    319 
    320 * Restore aux memory settings
    321 
    322  jsr restAux
    323 
    324 * Restore zpage
    325 
    326  ldy track
    327  ldx #0
    328 :zrest lda ZPAGEBUF,x
    329  sta 0,x
    330  inx
    331  bne :zrest
    332  sty track
    333 
    334  lda GOTBYTE+2
    335  pha
    336  lda GOTBYTE+1
    337  pha
    338 
    339 rts rts
    340 
    341 cmdadr da CMdriveon
    342  da rts  ; CMDRIVOFF
    343  da CMseek
    344  da CMreadseq
    345  da CMreadgroup
    346  da CMwriteseq
    347  da CMwritegroup
    348  da CMid
    349  da CMoffset
    350 
    351 *------------------------------------------------- CMseek
    352 *
    353 * SEEK
    354 * <check disk for lastrack?>,
    355 * <track>
    356 *
    357 
    358 CMseek jsr GETBYTE
    359  jsr GETBYTE
    360  sta track
    361  rts
    362 
    363 *------------------------------------------------- CMreadseq
    364 *------------------------------------------------- CMreadgroup
    365 *
    366 * Read sequence
    367 * <buf adr>
    368 *
    369 * Read group
    370 * <18 buf adr's>
    371 *
    372 
    373 CMreadseq ldx #1
    374  hex 2C
    375 CMreadgroup ldx #18
    376  jsr CMADINFO
    377 
    378 CMREAD2 jsr READ
    379 
    380 *-------------------------------------------------
    381 *
    382 * READ/WRITE exit.
    383 *
    384 INCTRAK? bit command
    385  bcs WHOOP?
    386 
    387 * If bit 6 set, then inc track
    388 
    389  bvc ]rts
    390  inc track
    391 ]rts rts
    392 
    393 * If bit 7 set then whoop speaker
    394 * WARNING:use only with READ
    395 
    396 WHOOP? bpl ]rts
    397  ldy #0
    398 :1 tya
    399  bit $C030
    400 :2 sec
    401  sbc #1
    402  bne :2
    403  dey
    404  bne :1
    405  beq CMREAD2
    406 
    407 *------------------------------------------------- CMdriveon
    408 *
    409 * "DriveOn" is when we check for the POP disk
    410 *
    411 
    412 ERROR? db 0
    413 
    414 CMdriveon ldy #sigblock
    415  lda #>sigblock
    416  sty BLOCKLO
    417  sta BLOCKHI
    418 
    419  lda #1 ;read
    420  sta SPcommand
    421 
    422  jsr JMPSPBUF ;read in sig block
    423  bcs :9
    424 
    425  ldy #-1
    426 :chksig iny
    427  lda :sig,y
    428  beq :9
    429  eor BLOCKBUF,y
    430  beq :chksig
    431  sec
    432 
    433 :9 lda #0
    434  ror
    435  sta ERROR?
    436  rts
    437 
    438 :sig asc 'Prince of Persia 3.5!',00
    439 
    440 *------------------------------------------------- CMwriteseq
    441 *------------------------------------------------- CMwritegroup
    442 *
    443 * Same as READ
    444 *
    445 
    446 CMwriteseq ldx #1
    447  hex 2C
    448 CMwritegroup ldx #18
    449  jsr CMADINFO
    450  jsr WRITE
    451  jmp INCTRAK?
    452 
    453 *------------------------------------------------- CMid
    454 *
    455 * Change offset based on ID
    456 *
    457 
    458 CMid jsr GETBYTE
    459  sta :IDmod+1
    460 
    461  ldy #-3
    462 :0 iny
    463  iny
    464  iny
    465  lda :IDlist,y
    466  beq :rts
    467 
    468 :IDmod cmp #$11
    469  bne :0
    470 
    471  lda :IDlist+1,y
    472  sta BOFFLO
    473  lda :IDlist+2,y
    474  sta BOFFHI
    475 
    476 :rts rts
    477 
    478 :IDlist db $A9
    479  dw 16 ;side one
    480 
    481  db $AD
    482  dw 16+315+1 ;side two
    483 
    484  db $79
    485  dw 16+315+1+315 ;side three!!!
    486 
    487  db 0 ;end of list
    488 
    489 *-------------------------------------------------
    490 *
    491 * Set new block offset
    492 *
    493 
    494 CMoffset jsr GETBYTE
    495  sta BOFFLO
    496  jsr GETBYTE
    497  sta BOFFHI
    498  rts
    499 
    500 *-------------------------------------------------
    501 *
    502 * Get buffer info.
    503 *
    504 
    505 CMADINFO stx temp
    506  ldx #0
    507 :0 jsr GETBYTE
    508  jsr auxTfix
    509  sta BUFTABLE,X
    510  inx
    511  cpx temp
    512  bcc :0
    513  tay
    514 
    515 * If sequence, then fill table
    516 
    517 :1 iny
    518  cpx #18
    519  beq :2
    520  tya
    521  jsr auxTfix
    522  sta BUFTABLE,X
    523  inx
    524  bne :1
    525 
    526 :2 rts
    527 
    528 *-------------------------------------------------
    529 *
    530 * Only if running on a GS:
    531 *
    532 * If loading into text page, then change to
    533 * load into internal buffer instead.
    534 *
    535 
    536 auxTfix bit GS?
    537  bpl :0
    538 
    539  cmp #4
    540  bcc :0
    541  cmp #8
    542  bcs :0
    543  adc #>auxTPAGEsave-$400
    544 
    545 :0 rts
    546 
    547 *-------------------------------------------------
    548 *
    549 * Only if running on a GS:
    550 *
    551 * Save the aux memory text page to internal buffer
    552 *
    553 
    554  xc
    555  xc
    556 
    557 saveTaux clc
    558  xce
    559  rep $30
    560  ldx #$0400
    561  ldy #auxTPAGEsave
    562  lda #$400-1
    563  phb
    564  mvn $10400,0
    565  plb
    566  sec
    567  xce
    568  rts
    569 
    570 *-------------------------------------------------
    571 *
    572 * Only if running on a GS:
    573 *
    574 * Restore aux text page from internal buffer
    575 
    576 restTaux clc
    577  xce
    578  rep $30
    579  ldx #auxTPAGEsave
    580  ldy #$0400
    581  lda #$400-1
    582  phb
    583  mvn 0,$10400
    584  plb
    585  sec
    586  xce
    587  rts
    588 
    589  xc off
    590 
    591 *-------------------------------------------------
    592 
    593 GETBYTE inc GOTBYTE+1
    594  bne GOTBYTE
    595  inc GOTBYTE+2
    596 GOTBYTE lda $FFFF
    597  rts
    598 
    599 *-------------------------------------------------
    600 
    601  sav rw1835.pop
    602 
    603 *-------------------------------------------------
    604 
    605  lst on
    606 
    607 ZPAGEBUF ds $100
    608 BUFTABLE ds 18
    609  ds \
    610 BLOCKBUF ds 512
    611 
    612 auxTPAGEsave ds 1024
    613 
    614  da *
    615 
    616  lst off
    617 
    618 *------------------------------------------------- EOF