Annotation of doom/r_phase7.gas, revision 1.1.1.1

1.1       root        1:  .long
                      2:  .dc.l codeend - _ref7_start
                      3: _ref7_start::
                      4:  .gpu
                      5:        .org $f03100
                      6: 
                      7: DIVCONTROL             .equ    $f0211c
                      8: 
                      9: S_LE   .ccdef  $14     ; PL
                     10: U_LE   .ccdef  $04     ; CC
                     11: S_GT    .ccdef $18     ; MI
                     12: U_GT    .ccdef $08     ; CS
                     13: 
                     14: S_LT   .ccdef  $15             ; PL+NE
                     15: U_LT   .ccdef  $05             ; CC+NE
                     16: 
                     17: FP .equr r14
                     18: scratch .equr r10
                     19: scratch2 .equr r11
                     20: RETURNVALUE .equr r29
                     21: RETURNPOINT .equr r28
                     22: MATH_A .equr r27
                     23: MATH_B .equr r26
                     24: MATH_C .equr r25
                     25: MATH_RTS .equr r24
                     26: MATH_SIGN .equr r23
                     27: 
                     28: alt_plane_lightmax     .equr   r4
                     29: alt_plane_lightmin     .equr   r5
                     30: alt_plane_lightcoef    .equr   r6
                     31: alt_plane_lightsub     .equr   r7
                     32: alt_baseyscale         .equr   r8
                     33: alt_basexscale         .equr   r9
                     34: alt_planeheight                .equr   r10
                     35: alt_planesource                .equr   r11
                     36: alt_planeangle         .equr   r12
                     37: alt_planey                     .equr   r13
                     38: alt_planex                     .equr   r14
                     39: alt_400000                     .equr   r15
                     40: 
                     41: ;===========================================================================
                     42: _R_DrawPlanes::
                     43: ;4 dag registers  3 register variables
                     44: ;localoffset:4  regoffset:4  argoffset:36
                     45: ;===========================================================================
                     46:        movei #36,scratch
                     47:        sub scratch,FP
                     48: 
                     49:        nop
                     50:        store   RETURNPOINT,(FP+1)
                     51:        
                     52: ;================
                     53: ; load constants into alternate register bank
                     54: ;================
                     55:        movei   #$400000,r0
                     56:        moveta  r0,alt_400000
                     57: 
                     58:        movei   #_viewx,r0
                     59:        load    (r0),r0
                     60:        moveta  r0,alt_planex 
                     61:  
                     62:        movei   #_viewy,r0
                     63:        load    (r0),r0
                     64:        neg             r0
                     65:        moveta  r0,alt_planey
                     66:   
                     67:        movei   #_viewangle,r0
                     68:        load    (r0),r0
                     69:        moveta  r0,alt_planeangle
                     70:    
                     71:        movei   #1073741824,r1
                     72:        sub             r1,r0
                     73:        shrq    #19,r0
                     74:        move    r0,r17 ;(angle)
                     75: 
                     76:  move r17,r1 ;(angle)
                     77:  shlq #2,r1
                     78:  movei #_finecosine,r2
                     79:  load (r2),r2
                     80:  move r1,r3
                     81:  add r2,r3
                     82:  load (r3),r2
                     83:  movei #80,r3
                     84:  move r3,MATH_SIGN
                     85:  move r3,MATH_B
                     86:  xor r2,MATH_SIGN
                     87:  abs MATH_B
                     88:  abs r2
                     89:  div MATH_B,r2
                     90:  btst #31, MATH_SIGN
                     91:  jr EQ,L71
                     92:  nop
                     93:  neg r2
                     94: L71:
                     95:        moveta  r2,alt_basexscale
                     96:  
                     97:  movei #_finesine,r2
                     98:  add r2,r1
                     99:  load (r1),r1
                    100:  move r3,MATH_SIGN
                    101:  move r3,MATH_B
                    102:  xor r1,MATH_SIGN
                    103:  abs MATH_B
                    104:  abs r1
                    105:  div MATH_B,r1
                    106:  btst #31, MATH_SIGN
                    107:  jr EQ,L72
                    108:  nop
                    109:  neg r1
                    110: L72:
                    111:  neg r1
                    112:        moveta  r1,alt_baseyscale
                    113: 
                    114: L53:
                    115:  movei #_junk,r0
                    116:  movei #15737400,r1
                    117:  load (r1),r1
                    118:  store r1,(r0)
                    119:  move r1,r0
                    120:  moveq #1,r1
                    121:  and r1,r0
                    122:  moveq #0,r1
                    123:  cmp r0,r1
                    124:  movei #L53,scratch
                    125:  jump EQ,(scratch)
                    126:  nop
                    127: 
                    128:  movei #15737348,r0
                    129:  movei #208928,r1
                    130:  store r1,(r0)
                    131: 
                    132:  movei #15737384,r0
                    133:  movei #80416,r1
                    134:  store r1,(r0)
                    135: 
                    136:  movei #_visplanes+348,r0
                    137:  move r0,r15 ;(pl)
                    138: 
                    139:  movei #L59,r0
                    140:  jump T,(r0)
                    141:  nop
                    142: 
                    143: L56:
                    144: 
                    145:  move r15,r0 ;(pl)
                    146:  addq #12,r0
                    147:  load (r0),r0
                    148:  move r15,r1 ;(pl)
                    149:  addq #16,r1
                    150:  load (r1),r1
                    151:  cmp r0,r1
                    152:  movei #L61,scratch
                    153:  jump PL,(scratch)
                    154:  nop
                    155: 
                    156:  movei #L57,r0
                    157:  jump T,(r0)
                    158:  nop
                    159: 
                    160: L61:
                    161: 
                    162: L63:
                    163:  movei #_junk,r0
                    164:  movei #15737400,r1
                    165:  load (r1),r1
                    166:  store r1,(r0)
                    167:  move r1,r0
                    168:  moveq #1,r1
                    169:  and r1,r0
                    170:  moveq #0,r1
                    171:  cmp r0,r1
                    172:  movei #L63,scratch
                    173:  jump EQ,(scratch)
                    174:  nop
                    175: 
                    176:        load (r15+1),r1 ; (pl)
                    177:        movei #$f02200,r0               ; plane source
                    178:        store r1,(r0)
                    179: 
                    180:        load (r15),r0 ;(pl)
                    181:        abs r0
                    182:        moveta  r0,alt_planeheight
                    183: 
                    184: L66:
                    185: 
                    186:  move r15,r0 ;(pl)
                    187:  addq #8,r0
                    188:  load (r0),r0
                    189:  move r0,r16 ;(light)
                    190:  movei #255,r1
                    191:  sub r16,r1 ;(light)
                    192:  shlq #1,r1
                    193:  move r16,r2 ;(light)
                    194:  sub r1,r2
                    195:  moveta r2,alt_plane_lightmin
                    196:  moveq #0,r1
                    197:  cmp r2,r1
                    198:  movei #L68,scratch
                    199:  jump EQ,(scratch)
                    200:  nop
                    201:  jump MI,(scratch)
                    202:  nop
                    203: 
                    204:  moveq #0,r1
                    205:  moveta        r1,alt_plane_lightmin
                    206: 
                    207: L68:
                    208: 
                    209:        moveta  r16,alt_plane_lightmax
                    210:        
                    211:        movei   #160,r1
                    212:        movefa  alt_plane_lightmin,r2
                    213:        move    r16,r3 ;(light)
                    214:        sub             r2,r3
                    215:        move    r3,r4
                    216:        imult   r1,r3
                    217:        movei   #640,r2
                    218:        div             r2,r3
                    219:        moveta  r3,alt_plane_lightsub
                    220: 
                    221:        shlq    #11,r4
                    222:        moveta  r4,alt_plane_lightcoef
                    223:  
                    224:  move r15,r0 ;(pl)
                    225:  addq #16,r0
                    226:  load (r0),r0
                    227:  shlq #1,r0
                    228:  move r15,r1 ;(pl)
                    229:  addq #26,r1
                    230:  add r1,r0
                    231:  movei #65280,r1
                    232:  storew r1,(r0)
                    233: 
                    234:  move r15,r0 ;(pl)
                    235:  addq #12,r0
                    236:  load (r0),r0
                    237:  shlq #1,r0
                    238:  subq #2,r0
                    239:  move r15,r1 ;(pl)
                    240:  addq #24,r1
                    241:  add r1,r0
                    242:  movei #65280,r1
                    243:  storew r1,(r0)
                    244: 
                    245:        store   r15,(FP) ; arg[] ;(pl)
                    246:        movei   #_R_PlaneLoop,r0
                    247:        move    PC,RETURNPOINT
                    248:        jump    T,(r0)
                    249:        addq    #6,RETURNPOINT
                    250:        load    (FP),r15
                    251:        
                    252: L57:
                    253: 
                    254:  movei #348,r0
                    255:  move r15,r1 ;(pl)
                    256:  add r0,r1
                    257:  move r1,r15 ;(pl)
                    258: 
                    259: L59:
                    260: 
                    261:  move r15,r0 ;(pl)
                    262:  movei #_lastvisplane,r1
                    263:  load (r1),r1
                    264:  cmp r0,r1
                    265:  movei #L56,scratch
                    266:  jump U_LT,(scratch)
                    267:  nop
                    268: 
                    269:  movei #_phasetime+28,r0
                    270:  movei #_samplecount,r1
                    271:  load (r1),r1
                    272:  store r1,(r0)
                    273: 
                    274:  movei #_gpucodestart,r0
                    275:  movei #_ref8_start,r1
                    276:  store r1,(r0)
                    277: 
                    278: 
                    279: L52:
                    280:        load    (FP+1),RETURNPOINT
                    281:        movei   #36,scratch
                    282:        jump    T,(RETURNPOINT)
                    283:        add             scratch,FP ; delay slot
                    284: 
                    285: ;=======================
                    286: 
                    287:  .extern _lastvisplane
                    288:  .extern _visplanes
                    289:  .extern _phasetime
                    290:  .extern _viewangle
                    291:  .extern _viewy
                    292:  .extern _viewx
                    293:  .extern _gpucodestart
                    294:  .extern _samplecount
                    295:  .extern _junk
                    296:  .extern _finecosine
                    297:  .extern _finesine
                    298:  .extern _ref8_start
                    299:        
                    300: 
                    301:        .extern _yslope,_distscale,_xtoviewangle
                    302:        
                    303: ;==============================================================================
                    304: _R_PlaneLoop::
                    305: ;==============================================================================
                    306: 
                    307: pl_L_topstarts .equr   r0
                    308: pl_L_checkbottomdif .equr r1
                    309: pl_L_topdif            .equr   r2
                    310: pl_L_next              .equr   r3
                    311: pl_L_bottomstarts .equr        r4
                    312: pl_L_xloop             .equr   r5
                    313: pl_L_bottomdif .equr   r6
                    314: 
                    315: pl_spanstart   .equr   r15
                    316: pl_pl                  .equr   r15
                    317: 
                    318: pl_x                   .equr   r16
                    319: pl_stopx               .equr   r17
                    320: pl_t1                  .equr   r18
                    321: pl_t2                  .equr   r19
                    322: pl_b1                  .equr   r20
                    323: pl_b2                  .equr   r21
                    324: pl_oldtop              .equr   r22
                    325: pl_oldbottom   .equr   r23
                    326: pl_openptr             .equr   r24
                    327: pl_ff                  .equr   r25
                    328: pl_cmdhigh             .equr   r26
                    329: 
                    330: pl_stopfp              .equr   r13             ; must stay constant across R_MapPlane
                    331: 
                    332: ;scratch               .equr r10
                    333: ;scratch2              .equr r11
                    334: ;FP                    .equr r14
                    335: ;RETURNPOINT   .equr r28
                    336: 
                    337:  load  (FP),pl_pl                              ; get plane
                    338: 
                    339:  move  pl_pl,pl_openptr
                    340:  load  (pl_pl+3),pl_x                  ; pl_x = pl->minx
                    341:  addq  #6*4,pl_openptr                 ; pl_openptr = pl->open  
                    342:  load  (pl_pl+4),pl_stopx              ; pl_stopx = pl->maxx
                    343:  
                    344:  cmp   pl_x,pl_stopx                   ; see if there is any open space
                    345:  jump  U_GT,(RETURNPOINT)              ; nothing to map
                    346:  addq  #2,pl_stopx                             ; pl_stopx = pl->maxx+2 (harmless delay slot)
                    347:  
                    348:  subq  #4,FP                                   ; space for returnpoint
                    349:  store RETURNPOINT,(FP)                ; save returnpoint before pushing cmds
                    350:  move  FP,pl_stopfp                    ; when command que is back here, stop
                    351: 
                    352:  move  pl_x,scratch
                    353:  shlq  #1,scratch
                    354:  add   scratch,pl_openptr              ; pl_openptr = &pl->open[x-1]
                    355:  subq  #2,pl_openptr
                    356:  
                    357:  movei #_spanstart,pl_spanstart        ; allow indexed loads on spanstart[]
                    358:  movei #$ff,pl_ff
                    359:   
                    360:  movei #pl_topstarts,pl_L_topstarts
                    361:  movei #pl_checkbottmdif,pl_L_checkbottomdif
                    362:  movei #pl_topdif,pl_L_topdif
                    363:  movei #pl_next,pl_L_next
                    364:  movei #pl_bottomstarts,pl_L_bottomstarts
                    365:  movei #pl_xloop,pl_L_xloop
                    366:  movei #pl_bottomdif,pl_L_bottomdif
                    367: 
                    368: ;      oldtop = open[x-1];
                    369: ;      oldbottom = oldtop&0xff;
                    370: ;      oldtop >>= 8;
                    371:  loadw (pl_openptr),pl_t1
                    372:  addq  #2,pl_openptr
                    373:  move  pl_t1,pl_b1
                    374:  and   pl_ff,pl_b1
                    375:  shrq  #8,pl_t1
                    376:  
                    377:  loadw (pl_openptr),pl_t2                      ; delay sloted
                    378: ;----------------------
                    379: ;
                    380: pl_xloop:
                    381: ;
                    382: ;-----------------------
                    383: ;              t1 = oldtop;
                    384: ;              b1 = oldbottom;
                    385: ;              t2 = open[x];
                    386: ;              b2 = t2&0xff;
                    387: ;              t2 >>= 8;
                    388: ;              oldtop = t2;
                    389: ;              oldbottom = b2;
                    390: 
                    391:  move  pl_t2,pl_b2
                    392:  and   pl_ff,pl_b2
                    393:  shrq  #8,pl_t2
                    394:  move  pl_x,pl_cmdhigh
                    395:  subq  #1,pl_cmdhigh
                    396:  shlq  #16,pl_cmdhigh
                    397:        
                    398: ;------------------------
                    399: ;
                    400: ; top diffs
                    401: ;
                    402: ;------------------------
                    403: ; if (t1 != t2)
                    404:  move  pl_t2,pl_oldtop
                    405:  cmp   pl_t1,pl_oldtop
                    406:  move  pl_b2,pl_oldbottom
                    407:  jump  EQ,(pl_L_checkbottomdif)
                    408:  addq  #2,pl_openptr                   ; reordered delay slot
                    409:   
                    410: pl_topdif:
                    411:  cmp   pl_t1,pl_t2
                    412:  jump  U_GT,(pl_L_topstarts)
                    413:  nop
                    414:  jump  EQ,(pl_L_topstarts)
                    415:  cmp   pl_t1,pl_b1                             ; harmless delay slot
                    416:  jump  U_GT,(pl_L_topstarts)
                    417:  
                    418: ;
                    419: ; R_MapPlane ( ((x-1)<<16) + (t1<<8) + spanstart[t1]);
                    420: ;
                    421:  move  pl_t1,scratch                   ; harmless delay slot
                    422:  move  pl_t1,scratch2
                    423:  shlq  #8,scratch
                    424:  shlq  #2,scratch2
                    425:  or            pl_cmdhigh,scratch
                    426:  load  (pl_spanstart+scratch2),scratch2
                    427:  subq  #4,FP
                    428:  or            scratch2,scratch
                    429:  addqt #1,pl_t1                                        ; t1++
                    430:  jump  T,(pl_L_topdif)
                    431:  store scratch,(FP)                            ; delay slot
                    432:  
                    433: ;
                    434: ; top dif spanstarts
                    435: ;
                    436: pl_topstarts:
                    437:  cmp   pl_t2,pl_t1
                    438:  jump  U_GT,(pl_L_checkbottomdif)
                    439:  move  pl_t2,scratch2                          ; harmless delay slot
                    440:  jump  EQ,(pl_L_checkbottomdif)
                    441:  shlq  #2,scratch2                                     ; harmless delay slot
                    442:  cmp   pl_t2,pl_b2
                    443:  jump  U_GT,(pl_L_checkbottomdif)
                    444:  nop
                    445: 
                    446: ; spanstart[t2] = x
                    447:  addqt #1,pl_t2
                    448:  jr            T,pl_topstarts
                    449:  store pl_x,(pl_spanstart+scratch2)    ; delay slot
                    450:  
                    451:  
                    452: ;------------------------
                    453: ;
                    454: ; bottom diffs
                    455: ; 
                    456: ;------------------------
                    457: pl_checkbottmdif:
                    458: ; if (b1 != b2)
                    459:  cmp   pl_b1,pl_b2
                    460:  jump  EQ,(pl_L_next)
                    461:  
                    462: pl_bottomdif:
                    463:  cmp   pl_b1,pl_b2                                     ; harmless delay slot
                    464:  jump  U_LE,(pl_L_bottomstarts)
                    465:  cmp   pl_b1,pl_t1                                     ; harmless delay slot
                    466:  jr            EQ,pl_bottomplane
                    467:  move  pl_b1,scratch                           ; harmless delay slot
                    468:  jump  U_LE,(pl_L_bottomstarts)
                    469: pl_bottomplane:
                    470: ;
                    471: ;R_MapPlane ( ((x-1)<<16) + (b1<<8) + spanstart[b1]);
                    472: ;
                    473:  shlq  #8,scratch                                      ; harmless delay slot
                    474:  move  pl_b1,scratch2
                    475:  or            pl_cmdhigh,scratch
                    476:  shlq  #2,scratch2
                    477:  load  (pl_spanstart+scratch2),scratch2
                    478:  subq  #4,FP
                    479:  or            scratch2,scratch
                    480:  subqt #1,pl_b1                                        ; b1--
                    481:  jump  T,(pl_L_bottomdif)
                    482:  store scratch,(FP)                            ; delay slot 
                    483:  
                    484: ;
                    485: ; bottom dif spanstarts
                    486: ;
                    487: pl_bottomstarts:
                    488:  cmp   pl_b2,pl_b1
                    489:  jump  U_LE,(pl_L_next)
                    490:  cmp   pl_b2,pl_t2                                     ; harmless delay slot
                    491:  jr            EQ,pl_bottommark
                    492:  move  pl_b2,scratch2                          ; harmless delay slot
                    493:  jump  U_LT,(pl_L_next)
                    494: pl_bottommark:
                    495:  shlq  #2,scratch2                                     ; harmless delay slot
                    496: ; spanstart[b2] = x
                    497: ; b2--
                    498:  subqt #1,pl_b2
                    499:  jump  T,(pl_L_bottomstarts)
                    500:  store pl_x,(pl_spanstart+scratch2)    ; delay slot
                    501:  
                    502: 
                    503: ;------------------------
                    504: ;
                    505: ; next
                    506: ; 
                    507: ;------------------------
                    508: pl_next:
                    509:  addq  #1,pl_x
                    510:  move  pl_oldbottom,pl_b1
                    511:  cmp   pl_x,pl_stopx
                    512:  move  pl_oldtop,pl_t1
                    513:  jump  NE,(pl_L_xloop)
                    514:  loadw (pl_openptr),pl_t2                      ; delay slot
                    515: 
                    516: ;------------------------
                    517: ;
                    518: ; all done calculating, so execute the plane commands
                    519: ; 
                    520: ;------------------------
                    521:  cmp   FP,pl_stopfp
                    522:  jr            NE,pl_isadraw
                    523:  nop
                    524: 
                    525: ; nothing to draw
                    526:  load  (FP),RETURNPOINT
                    527:  jump  T,(RETURNPOINT)
                    528:  addq  #4,FP                                   ; delay slot
                    529:  
                    530: pl_isadraw:
                    531: 
                    532: ;
                    533: ; fall through into R_MapPlane
                    534: ;
                    535: 
                    536: 
                    537:   
                    538: ;==============================================================================
                    539: _R_MapPlane::
                    540: ; (FP) is the munged up coordinates
                    541: ;==============================================================================
                    542: 
                    543: mp_ystep       .equr   r0
                    544: mp_axstep      .equr   r1
                    545: mp_aystep      .equr   r2
                    546: mp_count       .equr   r3
                    547: mp_a1pixel     .equr   r4
                    548: mp_FREE                .equr   r5
                    549: mp_remaining .equr     r6
                    550: mp_xremain     .equr   r7
                    551: mp_yremain     .equr   r8
                    552: mp_ffff                .equr   r9
                    553: mp_ffff0000    .equr   r12
                    554: 
                    555: ;scratch               .equr r10
                    556: ;scratch2              .equr r11
                    557: ;pl_stopfp             .equr   r13             ; must stay constant across R_MapPlane
                    558: ;FP                    .equr r14
                    559: 
                    560: mp_blitter     .equr   r15
                    561: mp_y           .equr   r16
                    562: mp_3fffff      .equr   r17
                    563: mp_x2          .equr   r18
                    564: mp_angle       .equr   r19
                    565: mp_distance    .equr   r20
                    566: mp_length      .equr   r21
                    567: mp_x           .equr   r22
                    568: mp_light       .equr   r23
                    569: mp_xfrac       .equr   r24
                    570: mp_yfrac       .equr   r25
                    571: mp_xstep       .equr   r26
                    572: mp_blitcommand .equr   r27
                    573: 
                    574: ;RETURNPOINT   .equr r28
                    575: 
                    576: ;
                    577: ; set up for multiple R_MapPlanes
                    578: ;
                    579:        movei   #$f02200,mp_blitter
                    580:        movei   #$ffff,mp_ffff
                    581:        movei   #$ffff0000,mp_ffff0000
                    582:        movei   #$3fffff,mp_3fffff
                    583:        movei   #1+(1<<11)+(1<<13)+(1<<30)+(12<<21),mp_blitcommand
                    584:        
                    585: 
                    586: ;      x2 = parm>>16;
                    587: ;      y = (parm>>8)&0xff;
                    588: ;      x1 = parm&0xff;
                    589: ;      x = x1;
                    590: ;      count = x2 - x+1;
                    591: mp_entry:
                    592:        load    (FP),mp_x2
                    593:        move    mp_x2,mp_y
                    594:        move    mp_y,mp_x
                    595:        shlq    #24,mp_x
                    596:        shrq    #24,mp_x
                    597:        shrq    #16,mp_x2
                    598:        shlq    #16,mp_y
                    599:        shrq    #24,mp_y
                    600:        move    mp_x2,mp_remaining
                    601:        sub             mp_x,mp_remaining
                    602:        addq    #1,mp_remaining
                    603: 
                    604:        or              mp_remaining,mp_remaining
                    605:        movei   #mp_linedone,scratch
                    606:        jump    EQ,(scratch)                    ; nothing to draw (sholdn't happen)
                    607:        nop
                    608: 
                    609:                        
                    610: ;      distance = (planeheight*yslope[y])>>12;
                    611: 
                    612:        movei   #_yslope,scratch
                    613:        add             mp_y,scratch
                    614:        add             mp_y,scratch
                    615:        loadw   (scratch),scratch               ; yslope[y]
                    616:        movefa  alt_planeheight,mp_distance
                    617:        mult    scratch,mp_distance
                    618:        shrq    #12,mp_distance
                    619:        
                    620: ;      length = (distance*distscale[x1])>>14;
                    621:        move    mp_x,scratch2
                    622:        shlq    #1,scratch2
                    623:        movei   #_distscale,mp_length
                    624:        add             scratch2,mp_length
                    625:        loadw   (mp_length),mp_length
                    626:        mult    mp_distance,mp_length
                    627:        shrq    #14,mp_length
                    628:        
                    629: ;      angle = (planeangle + xtoviewangle[x1])>>ANGLETOFINESHIFT;
                    630: 
                    631:        movefa  alt_planeangle,scratch
                    632:        shlq    #1,scratch2
                    633:        movei   #_xtoviewangle,mp_angle
                    634:        add             scratch2,mp_angle               ; + x1*4
                    635:        load    (mp_angle),mp_angle
                    636:        add             scratch,mp_angle
                    637:        shrq    #19,mp_angle
                    638:        
                    639:        shlq    #2,mp_angle                     ; used to index int tables
                    640:        movei   #_finesine,scratch
                    641:        add             scratch,mp_angle
                    642:        movei   #8192,scratch
                    643:        load    (mp_angle),scratch2     ; finesine[angle]
                    644:        add             scratch,mp_angle
                    645:        load    (mp_angle),mp_xfrac     ; finecosine[angle]
                    646:  
                    647: ;      xfrac = planex + (((finecosine[angle]>>1)*length)>>4);
                    648: 
                    649:        movefa  alt_planex,scratch
                    650:        sharq   #1,mp_xfrac
                    651:        imult   mp_length,mp_xfrac
                    652:        sharq   #4,mp_xfrac
                    653:        add             scratch,mp_xfrac
                    654: 
                    655: ;      yfrac = planey - (((finesine[angle]>>1)*length)>>4);
                    656: 
                    657:        movefa  alt_planey,mp_yfrac
                    658:        sharq   #1,scratch2
                    659:        imult   mp_length,scratch2
                    660:        sharq   #4,scratch2
                    661:        sub             scratch2,mp_yfrac
                    662:                
                    663: 
                    664:  
                    665: ;      xstep = (distance*basexscale)>>4;
                    666: ;      if (!xstep)
                    667: ;              axstep = 1;
                    668: ;      else if (xstep < 0)
                    669: ;              axstep = -xstep;
                    670: ;      else
                    671: ;              axstep = xstep;
                    672:        movefa  alt_basexscale,mp_xstep
                    673:        imult   mp_distance,mp_xstep
                    674:        sharq   #4,mp_xstep
                    675:        jr              NE,mp_xnotzero
                    676:        move    mp_xstep,mp_axstep              ; delay slot
                    677:        moveq   #1,mp_axstep            
                    678:        moveq   #1,mp_xstep             
                    679: mp_xnotzero:
                    680:        abs             mp_axstep
                    681: 
                    682: ;      light = planelight; // - ((planelightscale*distance)>>16);
                    683: ;      if (light < 0)
                    684: ;              light = 0;
                    685: ;      light = -((255-light)<<14); // should be from 0 to -0x800000
                    686: ;      light &= 0xffffff;
                    687:        
                    688:        movefa  alt_plane_lightcoef,mp_light
                    689:        div             mp_distance,mp_light
                    690: ; do something else while dividing
                    691: 
                    692: 
                    693: ;      ystep = (distance*baseyscale)>>4;       
                    694: ;      if (!ystep)
                    695: ;              aystep = 1;
                    696: ;      else if (ystep < 0)
                    697: ;              aystep = -ystep;
                    698: ;      else
                    699: ;              aystep = ystep;
                    700:        movefa  alt_baseyscale,mp_ystep
                    701:        imult   mp_distance,mp_ystep
                    702:        sharq   #4,mp_ystep
                    703:        jr              NE,mp_ynotzero
                    704:        move    mp_ystep,mp_aystep              ; delay slot
                    705:        moveq   #1,mp_aystep            
                    706:        moveq   #1,mp_ystep             
                    707: mp_ynotzero:
                    708:        abs             mp_aystep
                    709: 
                    710: ; finish light calculations
                    711:        
                    712:        movefa  alt_plane_lightsub,scratch
                    713:        sub             scratch,mp_light
                    714:        
                    715:        movefa  alt_plane_lightmax,scratch
                    716:        cmp             scratch,mp_light
                    717:        jr              S_GT,mp_lightless
                    718:        nop
                    719:        move    scratch,mp_light        
                    720: mp_lightless:
                    721:        movefa  alt_plane_lightmin,scratch
                    722:        cmp             scratch,mp_light
                    723:        jr              S_LT,mp_lightmore
                    724:        nop
                    725:        move    scratch,mp_light        
                    726: mp_lightmore:
                    727: 
                    728:        movei   #255,scratch
                    729:        sub             mp_light,scratch
                    730:        shlq    #14,scratch
                    731:        neg             scratch
                    732:        movei   #$ffffff,mp_light
                    733:        and             scratch,mp_light
                    734:        
                    735: 
                    736: 
                    737: ;-----------------
                    738: ;
                    739: ; setup blitter
                    740: ;
                    741: ;-----------------
                    742: 
                    743: mp_wait1:
                    744:        load    (mp_blitter+14),scratch
                    745:        btst    #0,scratch
                    746:        jr              EQ,mp_wait1
                    747:        nop
                    748:        
                    749: ;      *(int *)0xf0221c = (ystep&0xffff0000)+((xstep>>16)&0xffff);     // a1 increment 
                    750:        move    mp_ystep,scratch
                    751:        and             mp_ffff0000,scratch
                    752:        move    mp_xstep,scratch2
                    753:        shrq    #16,scratch2
                    754:        or              scratch2,scratch
                    755:        store   scratch,(mp_blitter+7)
                    756:                
                    757: ;      *(int *)0xf02220 = (xstep&0xffff) + (ystep<<16);        // a1 increment frac    
                    758:        move    mp_xstep,scratch
                    759:        and             mp_ffff,scratch
                    760:        move    mp_ystep,scratch2
                    761:        shlq    #16,scratch2
                    762:        or              scratch2,scratch
                    763:        store   scratch,(mp_blitter+8)
                    764: 
                    765: ;              *(int *)0xf02218 = (yfrac<<16)+(xfrac&0xffff);  // a1 pixel frac 
                    766:        move    mp_yfrac,scratch
                    767:        shlq    #16,scratch
                    768:        move    mp_xfrac,scratch2
                    769:        and             mp_ffff,scratch2
                    770:        or              scratch2,scratch
                    771:        store   scratch,(mp_blitter+6)
                    772: 
                    773: ;      *(int *)0xf02230 = (y<<16) + x;         // a2 pixel pointers
                    774:        shlq    #16,mp_y
                    775:        add             mp_x,mp_y
                    776:        store   mp_y,(mp_blitter+12)
                    777:        
                    778: ;      *(int *)0xf02270 = light;       // iinc
                    779:        movei   #$f02270,scratch
                    780:        store   mp_light,(scratch)
                    781:                        
                    782: ;      count = 0;
                    783:        moveq   #0,mp_count
                    784: 
                    785: 
                    786: mp_stillremaining:
                    787: 
                    788: ;===============
                    789: ;
                    790: ; x axis
                    791: ;
                    792: ;===============
                    793: 
                    794: ;              xfrac = (xfrac + count*xstep)&0x3fffff;
                    795: ;              xpos = xfrac;
                    796: ;              if (xstep >= 0)
                    797: ;                      xpos = 0x400000 - xpos;
                    798: ;              xremain = (xpos / axstep);
                    799:        move    mp_axstep,scratch
                    800:        move    mp_axstep,scratch2
                    801:        shrq    #16,scratch2
                    802:        mult    mp_count,scratch
                    803:        mult    mp_count,scratch2
                    804:        shlq    #16,scratch2
                    805:        add             scratch2,scratch
                    806:        or              mp_xstep,mp_xstep
                    807:        jr              PL,mp_addxpos
                    808:        nop
                    809:        sub             scratch,mp_xfrac
                    810:        and             mp_3fffff,mp_xfrac
                    811:        jr              T,mp_xadded
                    812:        move    mp_xfrac,mp_xremain                     ; delay slot
                    813: 
                    814: mp_addxpos:
                    815:        add             scratch,mp_xfrac
                    816:        and             mp_3fffff,mp_xfrac
                    817:        movefa  alt_400000,mp_xremain
                    818:        sub             mp_xfrac,mp_xremain
                    819: mp_xadded:
                    820:        div             mp_axstep,mp_xremain
                    821:        
                    822: 
                    823: ;===============
                    824: ;
                    825: ; y axis
                    826: ;
                    827: ;===============
                    828: 
                    829: ;              yfrac = (yfrac + count*ystep)&0x3fffff;
                    830: ;                      yremain = (ypos / aystep) + 1;
                    831:        move    mp_aystep,scratch
                    832:        move    mp_aystep,scratch2
                    833:        shrq    #16,scratch2
                    834:        mult    mp_count,scratch
                    835:        mult    mp_count,scratch2
                    836:        shlq    #16,scratch2
                    837:        add             scratch2,scratch
                    838:        or              mp_ystep,mp_ystep
                    839:        jr              PL,mp_addypos
                    840:        nop
                    841:        sub             scratch,mp_yfrac
                    842:        and             mp_3fffff,mp_yfrac
                    843:        jr              T,mp_yadded
                    844:        move    mp_yfrac,mp_yremain                     ; delay slot
                    845: 
                    846: mp_addypos:
                    847:        add             scratch,mp_yfrac
                    848:        and             mp_3fffff,mp_yfrac
                    849:        movefa  alt_400000,mp_yremain
                    850:        sub             mp_yfrac,mp_yremain
                    851:        
                    852: mp_yadded:
                    853:        div             mp_aystep,mp_yremain
                    854: 
                    855: ;====================
                    856: ; prepare blitter registers
                    857: ;====================
                    858:        
                    859: ;              *(int *)0xf0220c = (yfrac&0xffff0000)+(xfrac>>16);      // a1 pixel 
                    860:        move    mp_yfrac,mp_a1pixel
                    861:        and             mp_ffff0000,mp_a1pixel
                    862:        move    mp_xfrac,scratch2
                    863:        shrq    #16,scratch2
                    864:        or              scratch2,mp_a1pixel
                    865: 
                    866: ;=====================
                    867: ;              count = remaining;
                    868: ;              if (xremain < count)
                    869: ;                      count = xremain;
                    870: ;              if (yremain < count)
                    871: ;                      count = yremain;
                    872: ; ramaining will allways be at least 1
                    873: ; xremain and yremain will allways be 0 or greater
                    874: ;=====================
                    875: 
                    876:        move    mp_remaining,mp_count
                    877:        subq    #1,mp_count
                    878:        cmp             mp_xremain,mp_count
                    879:        jr              U_GT,mp_notxremain
                    880:        nop
                    881:        move    mp_xremain,mp_count     
                    882: mp_notxremain:
                    883:        cmp             mp_yremain,mp_count
                    884:        jr              U_GT,mp_notyremain
                    885:        nop
                    886:        move    mp_yremain,mp_count     
                    887: mp_notyremain:
                    888:        
                    889:        addq    #1,mp_count
                    890:        
                    891:        
                    892: ;=====================
                    893: ; program blitter
                    894: ;=====================
                    895: 
                    896: ;      while ( ! (*(int *)0xf02238 & 1) )                      // wait for blitter to finish
                    897: ;      ;
                    898: mp_wait2:
                    899:        load    (mp_blitter+14),scratch
                    900:        btst    #0,scratch
                    901:        jr              EQ,mp_wait2
                    902:        move    mp_count,scratch                                ; harmless delay slot
                    903:        
                    904:        store   mp_a1pixel,(mp_blitter+3)               ; source location
                    905:        bset    #16,scratch                                             ; one outer loop
                    906:        store   scratch,(mp_blitter+15)                 ; count register
                    907:        store   mp_blitcommand,(mp_blitter+14)  ; command register
                    908: ;===========================
                    909: 
                    910: ;              remaining -= count;
                    911:        movei   #mp_stillremaining,scratch
                    912:        sub             mp_count,mp_remaining           ; delay slot
                    913:        jump    NE,(scratch)
                    914:        nop
                    915: 
                    916: ;
                    917: ; all done with this line, see if there are more to do
                    918: ;
                    919: mp_linedone:
                    920:        addq    #4,FP
                    921:        cmp             FP,pl_stopfp
                    922:        movei   #mp_entry,scratch
                    923:        jump    NE,(scratch)
                    924:        load    (FP),RETURNPOINT                ; harmless delay slot
                    925:        jump    T,(RETURNPOINT)                 ; go back to R_DrawPlanes
                    926:        addq    #4,FP                                   ; delay slot
                    927: 
                    928:        
                    929: 
                    930: ;======================
                    931: ;
                    932: ; scratch data tables
                    933: ;
                    934: ;======================
                    935:  .long
                    936: _spanstart::   .dc.l 0                 ; int spanstart[SCREENHEIGHT]
                    937:        
                    938:        
                    939:        .phrase
                    940:        .68000
                    941: codeend:
                    942: 

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.