home *** CD-ROM | disk | FTP | other *** search
/ Amiga ACS 1997 #2 / amigaacscoverdisc / games / alienbreed3d2 / source_4000 / newhireswall.s < prev    next >
Text File  |  1997-01-31  |  32KB  |  2,235 lines

  1. leftclip: dc.w 0
  2. rightclip: dc.w 0
  3. deftopclip: dc.w 0
  4. defbotclip: dc.w 0
  5. leftclipandlast: dc.w 0
  6.  
  7. SCALE MACRO
  8.  dc.w 64*0
  9.  dc.w 64*1
  10.  dc.w 64*1
  11.  dc.w 64*2
  12.  dc.w 64*2
  13.  dc.w 64*3
  14.  dc.w 64*3
  15.  dc.w 64*4
  16.  dc.w 64*4
  17.  dc.w 64*5
  18.  dc.w 64*5
  19.  dc.w 64*6
  20.  dc.w 64*6
  21.  dc.w 64*7
  22.  dc.w 64*7
  23.  dc.w 64*8
  24.  dc.w 64*8
  25.  dc.w 64*9
  26.  dc.w 64*9
  27.  dc.w 64*10
  28.  dc.w 64*10
  29.  dc.w 64*11
  30.  dc.w 64*11
  31.  dc.w 64*12
  32.  dc.w 64*12
  33.  dc.w 64*13
  34.  dc.w 64*13
  35.  dc.w 64*14
  36.  dc.w 64*14
  37.  dc.w 64*15
  38.  dc.w 64*15
  39.  dc.w 64*16
  40.  dc.w 64*16
  41.  dc.w 64*17
  42.  dc.w 64*17
  43.  dc.w 64*18
  44.  dc.w 64*18
  45.  dc.w 64*19
  46.  dc.w 64*19
  47.  dc.w 64*20
  48.  dc.w 64*20
  49.  dc.w 64*21
  50.  dc.w 64*21
  51.  dc.w 64*22
  52.  dc.w 64*22
  53.  dc.w 64*23
  54.  dc.w 64*23
  55.  dc.w 64*24
  56.  dc.w 64*24
  57.  dc.w 64*25
  58.  dc.w 64*25
  59.  dc.w 64*26
  60.  dc.w 64*26
  61.  dc.w 64*27
  62.  dc.w 64*27
  63.  dc.w 64*28
  64.  dc.w 64*28
  65.  dc.w 64*29
  66.  dc.w 64*29
  67.  dc.w 64*30
  68.  dc.w 64*30
  69.  dc.w 64*31
  70.  dc.w 64*31
  71.  dc.w 64*31
  72.  dc.w 64*31
  73.  dc.w 64*31
  74.  dc.w 64*31
  75.  dc.w 64*31
  76.  dc.w 64*31
  77.  dc.w 64*31
  78.  dc.w 64*31
  79.  dc.w 64*31
  80.  dc.w 64*31
  81.  dc.w 64*31
  82.  dc.w 64*31
  83.  dc.w 64*31
  84.  dc.w 64*31
  85.  dc.w 64*31
  86.  dc.w 64*31
  87.  dc.w 64*31
  88.  dc.w 64*31
  89.  ENDM
  90.  
  91. *********************************** 
  92.  
  93. * The screendivide routine is simpler
  94. * using a0=left pixel
  95. * a2= right pixel
  96. * d0= left dist
  97. * d2= right dist
  98. * d4 = left strip
  99. * d5 = right strip
  100.  
  101. * (a0)=leftx
  102. * 2(a0)=rightx
  103.  
  104. * 4(a0)=leftbm
  105. * 6(a0)=rightbm
  106.  
  107. * 8(a0)=leftdist
  108. * 10(a0)=rightdist
  109.  
  110. * 12(a0)=lefttop
  111. * 14(a0)=righttop
  112.  
  113. * 16(a0)=leftbot
  114. * 18(a0)=rightbot
  115.  
  116.  
  117. Doleftend:
  118.  
  119.  move.w leftclip,d0
  120.  sub.w #1,d0
  121.  move.w d0,leftclipandlast
  122.  
  123.  
  124.  move.w (a0),d0
  125.  move.w 2(a0),d1
  126.  sub.w d0,d1
  127.  bge.s sometodraw
  128.  rts
  129. sometodraw:
  130.  move.w itertab(pc,d1.w*4),d7
  131.  swap d0
  132.  move.w itertab+2(pc,d1.w*4),d6
  133.  clr.w d0
  134.  swap d1
  135.  clr.w d1
  136.  asr.l d6,d1
  137.  move.l d1,(a0)
  138.  
  139.  bra pstit
  140.  
  141. itertab:
  142.  incbin "iterfile"
  143.  
  144. pstit:
  145.  
  146.  moveq #0,d1
  147.  move.w 4(a0),d1
  148.  moveq #0,d2
  149.  move.w 6(a0),d2
  150.  sub.w d1,d2
  151.  swap d1
  152.  swap d2
  153.  asr.l d6,d2
  154.  move.l d2,4(a0)
  155.  
  156.  moveq #0,d2
  157.  move.w 8(a0),d2
  158.  moveq #0,d3
  159.  move.w 10(a0),d3
  160.  sub.w d2,d3
  161.  swap d2
  162.  swap d3
  163.  asr.l d6,d3
  164.  move.l d3,8(a0)
  165.  
  166.  moveq #0,d3
  167.  move.w 12(a0),d3
  168.  moveq #0,d4
  169.  move.w 14(a0),d4
  170.  sub.w d3,d4
  171.  swap d3
  172.  swap d4
  173.  asr.l d6,d4
  174.  move.l d4,12(a0)
  175.  
  176.  moveq #0,d4
  177.  move.w 16(a0),d4
  178.  moveq #0,d5
  179.  move.w 18(a0),d5
  180.  sub.w d4,d5
  181.  swap d4
  182.  swap d5
  183.  asr.l d6,d5
  184.  move.l d5,16(a0)
  185.  
  186.  
  187. *** Gouraud shading ***
  188.  moveq #0,d5
  189.  move.w 26(a0),d5
  190.  sub.w 24(a0),d5
  191.  add.w d5,d5
  192.  swap d5
  193.  asr.l d6,d5
  194.  move.l d5,28(a0)
  195.  moveq #0,d5
  196.  move.w 24(a0),d5
  197.  add.w d5,d5
  198.  swap d5
  199.  
  200.  bra screendivide
  201.  
  202. itercount: dc.w 0
  203.  
  204. screendividethru:
  205.  
  206. .scrdrawlop:
  207.  
  208.  move.w (a0)+,d0
  209.  move.l FASTBUFFER,a3
  210.  move.l (a0)+,d1
  211.  
  212.  bra .pastscrinto
  213.  
  214. .scrintocop:
  215.  incbin "XTOCOPX"
  216.  
  217. .pastscrinto 
  218.  
  219.  swap d1
  220.  
  221.  move.w d1,d6
  222.  and.w HORAND,d6
  223.  move.l (a0)+,d2
  224.  swap d2
  225.  add.w fromtile(pc),d6
  226.  add.w d6,d6
  227.  move.w d6,a5
  228.  move.l (a0)+,d3
  229.  swap d3
  230.  add.l #divthreetab,a5
  231.  move.w (a5),StripData
  232.  
  233.  move.l ChunkAddr,a5
  234.  moveq #0,d6
  235.  move.b StripData,d6
  236.  add.w d6,d6
  237.  move.w VALSHIFT,d4
  238.  asl.w d4,d6
  239.  add.w d6,a5
  240.  move.l (a0)+,d4
  241.  swap d4
  242.  move.w d2,d6
  243. ***************************
  244. * old version
  245.  asr.w #7,d6
  246. ***************************
  247. ; asr.w #3,d6
  248. ; sub.w #4,d6
  249. ; cmp.w #6,d6
  250. ; blt.s tstbrbr
  251. ; move.w #6,d6
  252. ;tstbrbr:
  253. ***************************
  254.  add.w angbright(pc),d6
  255.  bge.s .brnotneg
  256.  moveq #0,d6
  257. .brnotneg
  258.  cmp.w #32,d6
  259.  blt.s .brnotpos
  260.  move.w #32,d6
  261. .brnotpos
  262.  move.l PaletteAddr,a2
  263.  move.l a2,a4
  264.  add.w .ffscrpickhowbright(pc,d6*2),a2
  265. ; and.b #$fe,d6
  266. ; add.w .ffscrpickhowbright(pc,d6*2),a4
  267.  
  268. ; btst #0,d0
  269. ; beq .nobrightswap
  270. ; exg a2,a4
  271. ;.nobrightswap:
  272.  
  273.  move.w d7,-(a7)
  274.  bsr ScreenWallstripdrawthru
  275.  move.w (a7)+,d7
  276.  
  277.  dbra d7,.scrdrawlop
  278.  rts
  279.  
  280. .ffscrpickhowbright:
  281.  SCALE
  282.  
  283.  
  284. ***************************
  285.  
  286. screendivide:
  287.  
  288.  or.l #$ffff0000,d7
  289.  move.w leftclipandlast(pc),d6
  290.  move.l #WorkSpace,a2
  291.  
  292.  move.l (a0),a3
  293.  move.l 4(a0),a4
  294.  move.l 8(a0),a5
  295.  move.l 12(a0),a6
  296.  move.l 16(a0),a1
  297.  move.l 28(a0),a0
  298.  
  299. scrdivlop:
  300.  
  301.  swap d0
  302.  cmp.w d6,d0
  303.  bgt scrnotoffleft
  304.  swap d0
  305.  add.l a4,d1
  306.  add.l a5,d2
  307.  add.l a6,d3
  308.  add.l a1,d4
  309.  add.l a3,d0
  310.  add.l a0,d5
  311.  dbra d7,scrdivlop
  312.  rts
  313.  
  314. scrnotoffleft:
  315.  
  316.  move.w d0,d6
  317.  
  318.  cmp.w rightclip(pc),d0
  319.  bge.s outofcalc
  320.  
  321. scrnotoffright:
  322.  
  323.  
  324.  move.w d0,(a2)+
  325.  move.l d1,(a2)+
  326.  move.l d2,(a2)+
  327.  move.l d3,(a2)+
  328.  move.l d4,(a2)+
  329.  move.l d5,(a2)+
  330.  swap d0
  331.  add.l a3,d0
  332.  add.l a4,d1
  333.  add.l a5,d2
  334.  add.l a6,d3
  335.  add.l a1,d4
  336.  add.l a0,d5
  337.  add.l #$10000,d7
  338.  dbra d7,scrdivlop
  339.  
  340. outofcalc:
  341.  swap d7
  342.  tst.w d7
  343.  bge.s .somethingtodraw
  344.  rts
  345. .somethingtodraw:
  346.  
  347.  move.l #consttab,a1
  348.  move.l #WorkSpace,a0
  349.  
  350.  tst.b FULLSCR
  351.  bne screendivideFULL
  352.  
  353. ; tst.b seethru
  354. ; bne screendividethru
  355.  
  356. scrdrawlop:
  357.  
  358.  move.w (a0)+,d0
  359.  move.l FASTBUFFER,a3
  360.  lea (a3,d0.w),a3
  361.  move.l (a0)+,d1
  362.  
  363. ; bra pastscrinto
  364. ;
  365. ;pastscrinto 
  366.  
  367.  swap d1
  368.  
  369.  move.w d1,d6
  370.  and.w HORAND,d6
  371.  move.l (a0)+,d2
  372.  swap d2
  373.  add.w fromtile(pc),d6
  374.  add.w d6,d6
  375.  move.w d6,a5
  376.  move.l (a0)+,d3
  377.  swap d3
  378.  add.l #divthreetab,a5
  379.  move.w (a5),StripData
  380.  
  381.  move.l ChunkAddr,a5
  382.  moveq #0,d6
  383.  move.b StripData,d6
  384.  add.w d6,d6
  385.  move.w VALSHIFT,d4
  386.  asl.w d4,d6
  387.  add.w d6,a5
  388.  move.l (a0)+,d4
  389.  swap d4
  390.  move.w d2,d6
  391. ***************************
  392. * old version
  393.  asr.w #7,d6
  394. ***************************
  395. ; asr.w #3,d6
  396. ; sub.w #4,d6
  397. ; cmp.w #6,d6
  398. ; blt.s tstbrbr
  399. ; move.w #6,d6
  400. ;tstbrbr:
  401. ***************************
  402.  move.l (a0)+,d5
  403.  swap d5
  404.  ext.w d5
  405.  add.w d5,d6
  406.  bge.s .brnotneg
  407.  moveq #0,d6
  408. .brnotneg
  409.  cmp.w #64,d6
  410.  blt.s .brnotpos
  411.  move.w #64,d6
  412. .brnotpos
  413.  move.l PaletteAddr,a2
  414.  move.l a2,a4
  415.  add.w ffscrpickhowbright(pc,d6*2),a2
  416.  and.b #$fe,d6
  417.  add.w ffscrpickhowbright(pc,d6*2),a4
  418.  
  419.  btst #0,d0
  420.  beq .nobrightswap
  421.  exg a2,a4
  422. .nobrightswap:
  423.  
  424.  move.w d7,-(a7)
  425.  bsr ScreenWallstripdraw
  426.  move.w (a7)+,d7
  427.  
  428. toosmall:
  429.  
  430.  dbra d7,scrdrawlop
  431.  
  432.  rts
  433.  
  434. middleline:
  435.  dc.w 0
  436.  
  437. ;scrintocop:
  438. ; incbin "XTOCOPX"
  439. prot4: dc.w 0
  440.  
  441. fromtile: dc.l 0
  442. fromquartertile: dc.l 0
  443. swapbrights: dc.w 0
  444. angbright: dc.w 0
  445.  
  446. leftside: dc.b 0
  447. rightside: dc.b 0
  448. firstleft: dc.w 0
  449.  
  450. ffscrpickhowbright:
  451.  SCALE
  452.  
  453. screendivideFULL:
  454.  
  455. scrdrawlopFULL:
  456.  
  457.  move.w (a0)+,d0
  458.  move.l FASTBUFFER,a3
  459.  lea (a3,d0.w),a3
  460.  move.l (a0)+,d1
  461.  
  462. ; bra pastscrinto
  463. ;
  464. ;pastscrinto 
  465.  
  466.  swap d1
  467.  
  468.  move.w d1,d6
  469.  and.w HORAND,d6
  470.  move.l (a0)+,d2
  471.  swap d2
  472.  add.w fromtile(pc),d6
  473.  add.w d6,d6
  474.  move.w d6,a5
  475.  move.l (a0)+,d3
  476.  swap d3
  477.  add.l #divthreetab,a5
  478.  move.w (a5),StripData
  479.  
  480.  move.l ChunkAddr,a5
  481.  moveq #0,d6
  482.  move.b StripData,d6
  483.  add.w d6,d6
  484.  move.w VALSHIFT,d4
  485.  asl.w d4,d6
  486.  add.w d6,a5
  487.  move.l (a0)+,d4
  488.  swap d4
  489.  move.w d2,d6
  490. ***************************
  491. * old version
  492.  asr.w #7,d6
  493. ***************************
  494. ; asr.w #3,d6
  495. ; sub.w #4,d6
  496. ; cmp.w #6,d6
  497. ; blt.s tstbrbr
  498. ; move.w #6,d6
  499. ;tstbrbr:
  500. ***************************
  501.  move.l (a0)+,d5
  502.  swap d5
  503.  ext.w d5
  504.  add.w d5,d6
  505.  bge.s .brnotneg
  506.  moveq #0,d6
  507. .brnotneg
  508.  cmp.w #64,d6
  509.  blt.s .brnotpos
  510.  move.w #64,d6
  511. .brnotpos
  512.  move.l PaletteAddr,a2
  513.  move.l a2,a4
  514.  add.w ffscrpickhowbrightFULL(pc,d6*2),a2
  515.  and.b #$fe,d6
  516.  add.w ffscrpickhowbrightFULL(pc,d6*2),a4
  517.  
  518.  btst #0,d0
  519.  beq .nobrightswap
  520.  exg a2,a4
  521. .nobrightswap:
  522.  
  523.  move.w d7,-(a7)
  524.  bsr ScreenWallstripdrawBIG
  525.  move.w (a7)+,d7
  526.  
  527.  dbra d7,scrdrawlopFULL
  528.  
  529.  rts
  530.  
  531. ffscrpickhowbrightFULL:
  532.  SCALE
  533.  
  534. divthreetab:
  535. val SET 0
  536.  REPT 130
  537.  dc.b val,0
  538.  dc.b val,1
  539.  dc.b val,2
  540. val SET val+1
  541.  ENDR
  542.  
  543. StripData: dc.w 0
  544.  
  545. * using a0=left pixel
  546. * a2= right pixel
  547. * d0= left height
  548. * d2= right height
  549. * d4 = left strip
  550. * d5 = right strip
  551.  
  552.  
  553. * Routine to draw a wall;
  554. * pass it X and Z coords of the endpoints
  555. * and the start and end length, and a number
  556. * representing the number of the wall.
  557.  
  558. * a0=x1 d1=z1 a2=x2 d3=z2
  559. * d4=sl d5=el
  560. * a1 = strip buffer
  561.  
  562. store: ds.l 500
  563.  
  564. ******************************************************************
  565.  
  566. * Curve drawing routine. We have to know:
  567. * The top and bottom of the wall
  568. * The point defining the centre of the arc
  569. * the point defining the starting point of the arc
  570. * the start and end angles of the arc
  571. * The start and end positions along the bitmap of the arc
  572. * Which bitmap to use for the arc
  573.  
  574. xmiddle: dc.w 0
  575. zmiddle SET 2
  576.  dc.w 0
  577. xradius SET 4
  578.  dc.w 0
  579. zradius SET 6
  580.  dc.w 0
  581. startbitmap SET 8
  582.  dc.w 0
  583. bitmapcounter SET 10
  584.  dc.w 0
  585. brightmult SET 12
  586.  dc.w 0
  587. angadd SET 14
  588.  dc.l 0
  589. xmiddlebig SET 18
  590.  dc.l 0
  591. basebright SET 22
  592.  dc.w 0
  593. shift SET 24
  594.  dc.w 0
  595. count SET 26
  596.  dc.w 0
  597.  
  598. subdividevals:
  599.  dc.w 2,4
  600.  dc.w 3,8
  601.  dc.w 4,16
  602.  dc.w 5,32
  603.  dc.w 6,64
  604.  
  605. CurveDraw:
  606.  
  607.  move.w (a0)+,d0    ; centre of rotation
  608.  move.w (a0)+,d1    ; point on arc
  609.  move.l #Rotated,a1
  610.  move.l #xmiddle,a2
  611.  move.l (a1,d0.w*8),d2
  612.  move.l d2,18(a2)
  613.  asr.l #7,d2
  614.  move.l (a1,d1.w*8),d4
  615.  asr.l #7,d4
  616.  sub.w d2,d4
  617.  move.w d2,(a2)
  618.  move.w d4,4(a2)
  619.  move.w 6(a1,d0.w*8),d2
  620.  move.w 6(a1,d1.w*8),d4
  621.  sub.w d2,d4
  622.  move.w d2,2(a2)
  623.  asr.w #1,d4
  624.  move.w d4,6(a2)
  625.  move.w (a0)+,d4    ; start of bitmap
  626.  move.w (a0)+,d5    ; end of bitmap
  627.  move.w d4,8(a2)
  628.  sub.w d4,d5
  629.  move.w d5,10(a2)
  630.  move.w (a0)+,d4
  631.  ext.l d4
  632.  move.l d4,14(a2)
  633.  move.w (a0)+,d4
  634.  move.l #subdividevals,a3
  635.  move.l (a3,d4.w*4),shift(a2)
  636.  
  637.  move.l #walltiles,a3
  638.  add.l (a0)+,a3
  639.  adda.w wallyoff,a3
  640.  move.l a3,fromtile
  641.  move.w (a0)+,basebright(a2)
  642.  move.w (a0)+,brightmult(a2)
  643.  move.l (a0)+,topofwall
  644.  move.l (a0)+,botofwall
  645.  move.l yoff,d6
  646.  sub.l d6,topofwall
  647.  sub.l d6,botofwall
  648.  
  649.  move.l #databuffer,a1
  650.  move.l #SineTable,a3
  651.  lea 2048(a3),a4
  652.  moveq #0,d0
  653.  moveq #0,d1
  654.  move.w count(a2),d7
  655. DivideCurve
  656.  move.l d0,d2
  657.  move.w shift(a2),d4
  658.  asr.l d4,d2
  659.  move.w (a3,d2.w*2),d4
  660.  move.w d4,d5
  661.  move.w (a4,d2.w*2),d3
  662.  move.w d3,d6
  663.  muls.w 4(a2),d3
  664.  muls.w 6(a2),d4
  665.  muls.w 4(a2),d5
  666.  muls.w 6(a2),d6
  667.  sub.l d4,d3
  668.  add.l d6,d5
  669.  asl.l #2,d5
  670.  asr.l #8,d3
  671.  add.l 18(a2),d3
  672.  swap d5
  673.  move.w basebright(a2),d6
  674.  move.w brightmult(a2),d4
  675.  muls d5,d4
  676.  swap d4
  677.  add.w d4,d6
  678.  
  679.  add.w 2(a2),d5
  680.  move.l d3,(a1)+
  681.  move.w d5,(a1)+
  682.  move.w d1,d2
  683.  move.w shift(a2),d4
  684.  asr.w d4,d2
  685.  add.w 8(a2),d2
  686.  move.w d2,(a1)+
  687.  move.w d6,(a1)+
  688.  
  689.  add.l 14(a2),d0  
  690.  add.w 10(a2),d1
  691.  dbra d7,DivideCurve
  692.  
  693.  move.l a0,-(a7)
  694.  
  695. ; move.w #31,d6
  696. ; move.l #0,d3
  697. ; move.l #stripbuffer,a4
  698. ;.emptylop:
  699. ; move.l d3,(a4)+
  700. ; dbra d6,.emptylop
  701.  
  702.  bsr curvecalc
  703.  
  704.  move.l (a7)+,a0
  705.  
  706.  rts
  707.  
  708. prot3: dc.w 0
  709.  
  710. curvecalc:
  711.  move.l #databuffer,a1
  712.  move.w count(a2),d7
  713.  subq #1,d7
  714. .findfirstinfront:
  715.  move.l (a1)+,d1
  716.  move.w (a1)+,d0
  717.  bgt.s .foundinfront
  718.  move.w (a1)+,d4
  719.  move.w (a1)+,d6
  720.  dbra d7,.findfirstinfront
  721. ; CACHE_ON d2
  722.  rts    ; no two points were in front
  723.  
  724. .foundinfront:
  725.  move.w (a1)+,d4
  726.  move.w (a1)+,d6
  727.  ; d1=left x, d4=left end, d0=left dist
  728.  ; d6=left angbright 
  729.  
  730.  divs d0,d1
  731.  add.w MIDDLEX,d1
  732.  
  733.  move.l topofwall(pc),d5
  734.  divs d0,d5
  735.  add.w MIDDLEY,d5
  736.  move.w d5,strtop
  737.  move.l botofwall(pc),d5
  738.  divs d0,d5
  739.  add.w MIDDLEY,d5
  740.  move.w d5,strbot
  741.  
  742. ; CACHE_OFF d2
  743.  
  744. .computeloop:
  745.  move.w 4(a1),d2
  746.  bgt.s .infront
  747.  
  748. ; addq #8,a1
  749. ; dbra d7,.findfirstinfront
  750.  
  751. ; CACHE_ON d2
  752.  rts
  753.  
  754. .infront:
  755.  move.l #store,a0
  756.  move.l (a1),d3
  757.  move.w 6(a1),d5
  758.  add.w 8(a1),d6
  759.  asr.w #1,d6
  760.  move.w d6,angbright
  761.  divs d2,d3
  762.  add.w MIDDLEX,d3
  763.  move.w strtop(pc),12(a0)
  764.  move.w strbot(pc),16(a0)
  765.  move.l topofwall(pc),d6
  766.  divs d2,d6
  767.  add.w MIDDLEY,d6
  768.  move.w d6,strtop
  769.  move.w d6,14(a0)
  770.  move.l botofwall(pc),d6
  771.  divs d2,d6
  772.  add.w MIDDLEY,d6
  773.  move.w d6,strbot
  774.  move.w d6,18(a0)
  775.  move.w d3,2(a1)
  776.  blt.s .alloffleft
  777.  cmp.w RIGHTX,d1
  778.  bgt.s .alloffleft
  779.  
  780.  cmp.w d1,d3
  781.  blt.s .alloffleft
  782.  
  783.  move.w d1,(a0)
  784.  move.w d3,2(a0)
  785.  move.w d4,4(a0)
  786.  move.w d5,6(a0)
  787.  move.w d0,8(a0)
  788.  move.w d2,10(a0)
  789.  move.w d7,-(a7)
  790.  move.w #maxscrdiv,d7
  791.  bsr Doleftend
  792.  move.w (a7)+,d7
  793.  
  794. .alloffleft:
  795.  
  796.  move.l (a1)+,d1
  797.  move.w (a1)+,d0
  798.  move.w (a1)+,d4
  799.  move.w (a1)+,d6
  800.  
  801.  dbra d7,.computeloop
  802.  
  803. .alloffright:
  804. ; CACHE_ON d2
  805.  rts
  806.  
  807. ;protcheck:
  808. ; sub.l #53624,a3
  809. ; add.l #2345215,a2
  810. ; lea passspace-$30000(pc),a1
  811. ; add.l #$30000,a1
  812. ; lea startpass(pc),a5
  813. ; move.w #endpass-startpass-1,d1
  814. ;copypass:
  815. ; move.b (a5)+,(a1)+
  816. ; dbra d1,copypass
  817. ; sub.l a5,a5
  818. ; lea passspace-$30000(pc),a1
  819. ; add.l #$30000,a1
  820. ; jsr (a1)
  821. ; lea passspace-$30000(pc),a1
  822. ; add.l #$30000,a1
  823. ; lea startpass(pc),a5
  824. ; move.w #(endpass-startpass)/2-1,d1
  825. ;erasepass:
  826. ; move.w -(a5),(a1)+
  827. ; dbra d1,erasepass
  828. ; sub.l a5,a5
  829. ; sub.l a1,a1
  830. ; eor.l #$af594c72,d0
  831. ; sub.l #123453986,a4
  832. ; move.l d0,(a4)
  833. ; add.l #123453986,a4
  834. ; move.l #0,d0
  835. ; sub.l #2345215,a2
  836. ; jsr (a2)
  837. ; sub.l a2,a2
  838. ; eor.l #$af594c72,d0
  839. ; sub.l #123453986,a4
  840. ; move.l (a4),d1
  841. ; add.l #123453986,a4
  842. ; cmp.l d1,d0
  843. ; bne.s notrightt
  844. ; add.l #53624,a3
  845. ; move.w #9,d7
  846. ;sayitsok:
  847. ; move.l (a3)+,a2
  848. ; add.l #78935450,a2
  849. ; st (a2)
  850. ; dbra d7,sayitsok
  851. ;notrightt:
  852. ; sub.l a3,a3
  853. ;nullit:
  854. ; rts
  855. ; incbin "ab3:includes/protroutencoded"
  856.  
  857. endprot:
  858.  
  859. ******************************************************************
  860.  
  861. iters: dc.w 0
  862. multcount: dc.w 0
  863.  
  864. walldraw:
  865.  
  866.  tst.w d1
  867.  bgt.s oneinfront1
  868.  tst.w d3
  869.  bgt.s oneinfront
  870.  rts
  871.  
  872. oneinfront1
  873.  tst.w d3
  874.  ble.s oneinfront
  875. ; Bothinfront!
  876.  
  877.  nop
  878.  
  879. oneinfront
  880.  
  881.  move.w #32,d7
  882.  move.w #3,d6
  883.  
  884.  move.w d3,d0
  885.  sub.w d1,d0
  886.  bge.s notnegzdiff
  887.  neg.w d0
  888. notnegzdiff
  889. ; cmp.w #1024,d0
  890. ; blt.s nd01
  891. ; add.w d7,d7
  892. ; add.w #1,d6
  893. ;nd01:
  894.  cmp.w #512,d0
  895.  blt.s nd0 
  896.  add.w d7,d7
  897.  add.w #1,d6
  898.  bra nha
  899. nd0:
  900.  
  901.  cmp.w #256,d0
  902.  bgt.s nh1
  903.  asr.w #1,d7
  904.  subq #1,d6
  905. nh1:
  906.  cmp.w #128,d0
  907.  bgt.s nh2
  908.  asr.w #1,d7
  909.  subq #1,d6
  910. nh2:
  911.  
  912. nha:
  913.  
  914.  move.w d3,d0
  915.  cmp.w d1,d3
  916.  blt.s rightnearest
  917.  move.w d1,d0
  918. rightnearest:
  919.  cmp.w #64,d0
  920.  bgt.s nd1
  921.  addq #1,d6
  922.  add.w d7,d7
  923. nd1:
  924.  
  925.  cmp.w #128,d0
  926.  blt.s nh3
  927.  asr.w #1,d7
  928.  subq #1,d6
  929.  blt.s nh3
  930.  cmp.w #256,d0
  931.  blt.s nh3
  932.  asr.w #1,d7
  933.  subq #1,d6
  934. nh3:
  935.  move.w d6,iters
  936.  subq #1,d7
  937.  move.w d7,multcount
  938.  
  939.  move.l #databuffer,a3
  940.  move.l a0,d0
  941.  move.l a2,d2
  942.  
  943.  swap d1
  944.  clr.w d1
  945.  swap d4
  946.  clr.w d4
  947.  swap d5
  948.  clr.w d5
  949.  swap d3
  950.  clr.w d3
  951.  
  952.  move.l d0,(a3)+
  953.  add.l d2,d0
  954.  move.l d1,(a3)+
  955.  asr.l #1,d0
  956.  move.l d4,(a3)+
  957.  
  958.  move.w leftwallbright,d6
  959.  move.w d6,(a3)+
  960.  
  961.  add.l d5,d4
  962.  move.l d0,(a3)+
  963.  add.l d3,d1
  964.  asr.l #1,d1
  965.  move.l d1,(a3)+
  966.  asr.l #1,d4
  967.  move.l d4,(a3)+
  968.  
  969.  add.w rightwallbright,d6
  970.  asr.w #1,d6
  971.  move.w d6,(a3)+
  972.  
  973.  move.l d2,(a3)+
  974.  move.l d3,(a3)+
  975.  move.l d5,(a3)+
  976.  move.w rightwallbright,(a3)+
  977.  
  978.  ; We now have the two endpoints and the midpoint
  979.  ; so we need to perform 1 iteration of the inner
  980.  ; loop, the first time.
  981.  
  982. * Decide how often to subdivide by how far away the wall is, and
  983. * how perp. it is to the player.
  984.  
  985.  move.l #databuffer,a0
  986.  move.l #databuffer2,a1
  987.  
  988.  move.w iters,d6
  989.  blt noiters
  990.  move.l #1,a2
  991.  
  992. iterloop:
  993.  move.l a0,a3
  994.  move.l a1,a4
  995.  move.w a2,d7
  996.  exg a0,a1
  997.  
  998.  move.l (a3)+,d0
  999.  move.l (a3)+,d1
  1000.  move.l (a3)+,d2
  1001.  move.w (a3)+,d3
  1002. middleloop:
  1003.  
  1004.  move.l d0,(a4)+
  1005.  move.l d1,(a4)+
  1006.  move.l d2,(a4)+
  1007.  move.w d3,(a4)+
  1008.  
  1009.  add.l (a3),d0
  1010.  add.l 4(a3),d1
  1011.  add.l 8(a3),d2
  1012.  add.w 12(a3),d3
  1013.  
  1014.  asr.l #1,d0
  1015.  asr.l #1,d1
  1016.  asr.l #1,d2
  1017.  asr.w #1,d3
  1018.  
  1019.  move.l d0,(a4)+
  1020.  move.l d1,(a4)+
  1021.  move.l d2,(a4)+
  1022.  move.w d3,(a4)+
  1023.  
  1024.  move.l (a3)+,d0
  1025.  move.l d0,(a4)+
  1026.  move.l (a3)+,d1
  1027.  move.l d1,(a4)+
  1028.  move.l (a3)+,d2
  1029.  move.l d2,(a4)+
  1030.  move.w (a3)+,d3
  1031.  move.w d3,(a4)+
  1032.  
  1033.  move.l d0,d4
  1034.  move.l (a3)+,d0
  1035.  add.l d0,d4
  1036.  asr.l #1,d4
  1037.  move.l d4,(a4)+
  1038.  move.l d1,d4
  1039.  move.l (a3)+,d1
  1040.  add.l d1,d4
  1041.  asr.l #1,d4
  1042.  move.l d4,(a4)+
  1043.  move.l d2,d4
  1044.  move.l (a3)+,d2
  1045.  add.l d2,d4
  1046.  asr.l #1,d4
  1047.  move.l d4,(a4)+
  1048.  move.w d3,d4
  1049.  move.w (a3)+,d3
  1050.  add.w d3,d4
  1051.  asr.w #1,d4
  1052.  move.w d4,(a4)+
  1053.  
  1054.  
  1055.  subq #1,d7
  1056.  bgt.s middleloop
  1057.  move.l d0,(a4)+
  1058.  move.l d1,(a4)+
  1059.  move.l d2,(a4)+
  1060.  move.w d3,(a4)+
  1061.  
  1062.  add.w a2,a2
  1063.  
  1064.  dbra d6,iterloop
  1065.  
  1066. noiters:
  1067.  
  1068. CalcAndDraw:
  1069.  
  1070. ; CACHE_ON d2
  1071.  
  1072.  move.l a0,a1
  1073.  move.w multcount,d7
  1074. .findfirstinfront:
  1075.  move.l (a1)+,d1
  1076.  move.w (a1)+,d0
  1077.  bgt.s .foundinfront
  1078.  move.l (a1)+,d4
  1079.  dbra d7,.findfirstinfront
  1080.  rts    ; no two points were in front
  1081.  
  1082. .foundinfront:
  1083.  move.w (a1)+,d4
  1084.  move.w (a1)+,lbr
  1085.  ; d1=left x, d4=left end, d0=left dist 
  1086.  
  1087.  divs d0,d1
  1088.  add.w MIDDLEX,d1
  1089.  
  1090.  move.l topofwall(pc),d5
  1091.  divs d0,d5
  1092.  add.w MIDDLEY,d5
  1093.  move.w d5,strtop
  1094.  move.l botofwall(pc),d5
  1095.  divs d0,d5
  1096.  add.w MIDDLEY,d5
  1097.  move.w d5,strbot
  1098.  
  1099. .computeloop:
  1100.  move.w 4(a1),d2
  1101.  bgt.s .infront
  1102.  rts
  1103.  
  1104. .infront:
  1105.  move.l #store,a0
  1106.  move.l (a1),d3
  1107.  divs d2,d3
  1108.  move.w 6(a1),d5
  1109.  add.w MIDDLEX,d3
  1110.  move.w strtop(pc),12(a0)
  1111.  move.l topofwall(pc),d6
  1112.  divs d2,d6
  1113.  move.w strbot(pc),16(a0)
  1114.  add.w MIDDLEY,d6
  1115.  move.w d6,strtop
  1116.  move.w d6,14(a0)
  1117.  move.l botofwall(pc),d6
  1118.  divs d2,d6
  1119.  add.w MIDDLEY,d6
  1120.  move.w d6,strbot
  1121.  move.w d6,18(a0)
  1122.  move.w d3,2(a1)
  1123.  cmp.w leftclip(pc),d3
  1124.  blt .alloffleft
  1125.  cmp.w rightclip(pc),d1
  1126. ; cmp.w #95,d1
  1127.  bge .alloffright
  1128.  
  1129.  movem.l d0/d1/d2/d3/a0,-(a7)
  1130.  
  1131.  moveq #0,d0
  1132.  move.b WALLIDENT,d0
  1133.  blt.s .noputinmap
  1134.  
  1135.  move.b d0,d3
  1136.  and.b #15,d0
  1137.  move.l COMPACTPTR,a0
  1138.  moveq #0,d1
  1139.  move.w d0,d2
  1140.  add.w d0,d0
  1141.  add.w d2,d0
  1142.  bset d0,d1
  1143.  btst #4,d3
  1144.  beq.s .nodoor
  1145.  addq #2,d0
  1146.  bset d0,d1
  1147. .nodoor:
  1148.  
  1149.  or.l d1,(a0)
  1150.  move.l BIGPTR,a0
  1151.  
  1152.  move.w wallleftpt,(a0,d2.w*4) 
  1153.  move.w wallrightpt,2(a0,d2.w*4) 
  1154.  
  1155. .noputinmap
  1156.  
  1157.  movem.l (a7)+,d0/d1/d2/d3/a0
  1158.  
  1159.  bra OTHERHALF
  1160.  
  1161.  
  1162. .alloffleft:
  1163.  
  1164.  move.l (a1)+,d1
  1165.  move.w (a1)+,d0
  1166.  move.w (a1)+,d4
  1167.  move.w (a1)+,lbr
  1168.  
  1169.  dbra d7,.computeloop
  1170.  rts
  1171.  
  1172. .alloffright:
  1173.  rts
  1174.  
  1175. computeloop2:
  1176.  move.w 4(a1),d2
  1177.  bgt.s .infront
  1178.  rts
  1179.  
  1180. .infront:
  1181.  move.l #store,a0
  1182.  move.l (a1),d3
  1183.  divs d2,d3
  1184.  move.w 6(a1),d5
  1185.  add.w MIDDLEX,d3
  1186.  move.w strtop(pc),12(a0)
  1187.  move.l topofwall(pc),d6
  1188.  divs d2,d6
  1189.  move.w strbot(pc),16(a0)
  1190.  add.w MIDDLEY,d6
  1191.  move.w d6,strtop
  1192.  move.w d6,14(a0)
  1193.  move.l botofwall(pc),d6
  1194.  divs d2,d6
  1195.  add.w MIDDLEY,d6
  1196.  move.w d6,strbot
  1197.  move.w d6,18(a0)
  1198.  move.w d3,2(a1)
  1199.  cmp.w leftclip(pc),d3
  1200.  blt.s alloffleft2
  1201.  cmp.w rightclip(pc),d1
  1202. ; cmp.w #95,d1
  1203.  bge.s alloffright2
  1204.  
  1205. OTHERHALF:
  1206.  
  1207.  move.w d1,(a0)
  1208.  move.w d3,2(a0)
  1209.  move.w d4,4(a0)
  1210.  move.w d5,6(a0)
  1211.  move.w d0,8(a0)
  1212.  move.w d2,10(a0)
  1213.  
  1214.  move.w lbr,d5
  1215.  sub.w #300,d5
  1216.  ext.w d5
  1217.  move.w d5,24(a0)
  1218.  move.w 8(a1),d5
  1219.  sub.w #300,d5
  1220.  ext.w d5
  1221.  move.w d5,26(a0)
  1222.  
  1223.  movem.l d7/a1,-(a7)
  1224.  move.w #maxscrdiv,d7
  1225.  bsr Doleftend
  1226.  movem.l (a7)+,d7/a1
  1227.  
  1228. alloffleft2:
  1229.  
  1230.  move.l (a1)+,d1
  1231.  move.w (a1)+,d0
  1232.  move.w (a1)+,d4
  1233.  move.w (a1)+,lbr
  1234.  
  1235.  dbra d7,computeloop2
  1236.  
  1237.  rts
  1238.  
  1239. alloffright2:
  1240.  rts
  1241.  
  1242. lbr: dc.w 0
  1243. tlbr: dc.w 0
  1244. leftwallbright: dc.w 0
  1245. rightwallbright: dc.w 0
  1246. leftwallTOPbright: dc.w 0
  1247. rightwallTOPbright: dc.w 0
  1248. strtop: dc.w 0
  1249. strbot: dc.w 0
  1250.  
  1251. databuffer:
  1252.  ds.l 1600
  1253. databuffer2:
  1254.  ds.l 1600
  1255.  
  1256. ***********************************
  1257.  
  1258. * Need a routine which takes...?
  1259. * Top Y (3d)
  1260. * Bottom Y (3d)
  1261. * distance
  1262. * height of each tile (number and routine addr)
  1263. * And produces the appropriate strip on the
  1264. * screen.
  1265.  
  1266. topofwall: dc.l 0
  1267. botofwall: dc.l 0
  1268.  
  1269. nostripq:
  1270.  rts
  1271.  
  1272. ScreenWallstripdraw:
  1273.  
  1274.  move.w d4,d6
  1275.  cmp.w topclip(pc),d6
  1276.  blt.s nostripq
  1277.  cmp.w botclip(pc),d3
  1278.  bgt.s nostripq
  1279.  
  1280.  cmp.w botclip(pc),d6
  1281.  ble.s noclipbot
  1282.  move.w botclip(pc),d6
  1283. noclipbot:
  1284.  
  1285.  move.w d3,d5
  1286.  cmp.w topclip(pc),d5
  1287.  bge.s nocliptop
  1288.  move.w topclip(pc),d5
  1289.  btst #0,d5
  1290.  beq.s .nsbd
  1291.  exg a2,a4
  1292. .nsbd:
  1293.  
  1294.  sub.w d5,d6    ; height to draw.
  1295.  ble.s nostripq
  1296.  
  1297.  bra gotoend
  1298.  
  1299. nocliptop:
  1300.  
  1301.  btst #0,d5
  1302.  beq.s .nsbd
  1303.  exg a2,a4
  1304. .nsbd:
  1305.  
  1306.  sub.w d5,d6    ; height to draw.
  1307.  ble.s nostripq
  1308.  
  1309.  bra gotoend
  1310.  
  1311. wlcnt: dc.w 0
  1312.  
  1313.  CNOP 0,4
  1314. drawwalldimPACK0:
  1315.  and.w d7,d4
  1316.  move.b 1(a5,d4.w*2),d1
  1317.  and.b #31,d1
  1318.  add.l d3,d4
  1319.  move.b (a4,d1.w*2),(a3)
  1320.  adda.w d0,a3
  1321.  addx.w d2,d4
  1322.  dbra d6,drawwallPACK0
  1323.  rts
  1324.  
  1325.  CNOP 0,128 
  1326. drawwallPACK0:
  1327.  and.w d7,d4
  1328.  move.b 1(a5,d4.w*2),d1
  1329.  and.b #31,d1
  1330.  add.l d3,d4
  1331.  move.b (a2,d1.w*2),(a3)
  1332.  adda.w d0,a3
  1333.  addx.w d2,d4
  1334.  dbra d6,drawwalldimPACK0
  1335.  
  1336. nostrip:
  1337.  rts
  1338.  
  1339.  CNOP 0,4
  1340. drawwalldimPACK1:
  1341.  and.w d7,d4
  1342.  move.w (a5,d4.w*2),d1
  1343.  lsr.w #5,d1
  1344.  and.w #31,d1
  1345.  add.l d3,d4
  1346.  move.b (a4,d1.w*2),(a3)
  1347.  adda.w d0,a3
  1348.  addx.w d2,d4
  1349.  dbra d6,drawwallPACK1
  1350.  rts
  1351.  
  1352.  CNOP 0,4 
  1353. drawwallPACK1:
  1354.  and.w d7,d4
  1355.  move.w (a5,d4.w*2),d1
  1356.  lsr.w #5,d1
  1357.  and.w #31,d1
  1358.  add.l d3,d4
  1359.  move.b (a2,d1.w*2),(a3)
  1360.  adda.w d0,a3
  1361.  addx.w d2,d4
  1362.  dbra d6,drawwalldimPACK1
  1363.  
  1364.  rts
  1365.  
  1366.  CNOP 0,4
  1367. drawwalldimPACK2:
  1368.  and.w d7,d4
  1369.  move.b (a5,d4.w*2),d1
  1370.  lsr.b #2,d1
  1371.  add.l d3,d4
  1372.  move.b (a4,d1.w*2),(a3)
  1373.  adda.w d0,a3
  1374.  addx.w d2,d4
  1375.  dbra d6,drawwallPACK2
  1376.  rts
  1377.  
  1378.  CNOP 0,4 
  1379. drawwallPACK2:
  1380.  and.w d7,d4
  1381.  move.b (a5,d4.w*2),d1
  1382.  lsr.b #2,d1
  1383.  add.l d3,d4
  1384.  move.b (a2,d1.w*2),(a3)
  1385.  adda.w d0,a3
  1386.  addx.w d2,d4
  1387.  dbra d6,drawwalldimPACK2
  1388.  rts
  1389.  
  1390.  
  1391. usesimple:
  1392.  mulu d3,d4
  1393.  
  1394.  add.l d0,d4
  1395.  swap d4
  1396.  add.w totalyoff(pc),d4
  1397.  
  1398. cliptopusesimple
  1399.  move.w VALAND,d7
  1400.  move.w #320,d0
  1401.  moveq #0,d1
  1402.  cmp.l a4,a2
  1403.  blt.s usea2
  1404.  move.l a4,a2
  1405. usea2:
  1406.  
  1407.  and.w d7,d4
  1408.  
  1409.  move.l d2,d5
  1410.  clr.w d5
  1411.  cmp.b #1,StripData+1
  1412.  dbge d6,simplewalliPACK0
  1413.  dbne d6,simplewalliPACK1
  1414.  dble d6,simplewalliPACK2
  1415.  rts
  1416.  
  1417.  CNOP 0,4
  1418. simplewalliPACK0:
  1419.  move.b 1(a5,d4.w*2),d1
  1420.  and.b #31,d1
  1421.  move.b (a2,d1.w*2),d3
  1422. simplewallPACK0:
  1423.  move.b d3,(a3)
  1424.  adda.w d0,a3
  1425.  add.l d2,d4
  1426.  bcc.s .noread
  1427.  addq #1,d4
  1428.  and.w d7,d4
  1429.  move.b 1(a5,d4.w*2),d1
  1430.  and.b #31,d1
  1431.  move.b (a2,d1.w*2),d3
  1432. .noread:
  1433.  dbra d6,simplewallPACK0
  1434.  rts
  1435.  
  1436.  CNOP 0,4
  1437. simplewalliPACK1:
  1438.  move.w (a5,d4.w*2),d1
  1439.  lsr.w #5,d1
  1440.  and.w #31,d1
  1441.  move.b (a2,d1.w*2),d3
  1442. simplewallPACK1:
  1443.  move.b d3,(a3)
  1444.  adda.w d0,a3
  1445.  add.l d5,d4
  1446.  bcc.s .noread
  1447.  addq #1,d4
  1448.  and.w d7,d4
  1449.  move.w (a5,d4.w*2),d1
  1450.  lsr.w #5,d1
  1451.  and.w #31,d1
  1452.  move.b (a2,d1.w*2),d3
  1453. .noread:
  1454.  dbra d6,simplewallPACK1
  1455.  rts
  1456.  
  1457.  CNOP 0,4
  1458. simplewalliPACK2:
  1459.  move.b (a5,d4.w*2),d1
  1460.  lsr.b #2,d1
  1461.  and.b #31,d1
  1462.  move.b (a2,d1.w*2),d3
  1463. simplewallPACK2:
  1464.  move.b d3,(a3)
  1465.  adda.w d0,a3
  1466.  add.l d5,d4
  1467.  bcc.s .noread
  1468.  addq #1,d4
  1469.  and.w d7,d4
  1470.  move.b (a5,d4.w*2),d1
  1471.  lsr.b #2,d1
  1472.  move.b (a2,d1.w*2),d3
  1473. .noread:
  1474.  dbra d6,simplewallPACK2
  1475.  rts
  1476.  
  1477. ;gotoendnomult:
  1478. ; movem.l d0/d1/d2/d3/d4/d7,-(a7)
  1479. ; add.l timeslarge(pc,d5.w*4),a3 
  1480. ; move.w d5,d4
  1481. ; move.l 4(a1,d2.w*8),d0
  1482. ; move.l (a1,d2.w*8),d2
  1483. ; moveq #0,d3
  1484. ; move.w d2,d3
  1485. ; swap d2
  1486. ; tst.w d2
  1487. ; move.w wallyoff(pc),d4
  1488. ; add.w #44,d4
  1489. ; bne.s .notsimple
  1490. ; cmp.l #$b000,d3
  1491. ; ble cliptopusesimple
  1492. ;.notsimple:
  1493. ; bra cliptop
  1494.  
  1495. MIDDLEY: dc.w 120
  1496. BIGMIDDLEY: dc.l 320*120
  1497. TOPOFFSET: dc.w 0
  1498. SMIDDLEY: dc.w 120
  1499. SBIGMIDDLEY: dc.l 320*120
  1500. STOPOFFSET: dc.w 0
  1501.  
  1502. gotoend:
  1503.  
  1504.  add.l timeslarge(pc,d5.w*4),a3 
  1505.  
  1506.  add.w d2,d2
  1507.  
  1508.  move.l 4(a1,d2.w*8),d0
  1509.  add.w TOPOFFSET(pc),d5
  1510.  move.w d5,d4
  1511.  
  1512.  move.l (a1,d2.w*4),d2
  1513. ; moveq #0,d3
  1514. ; move.w d2,d3
  1515. ; swap d2
  1516. ; tst.w d2
  1517. ; bne.s .notsimple
  1518. ; cmp.l #$b000,d3
  1519. ; ble usesimple
  1520. ;.notsimple:
  1521.  
  1522.  ext.l d5
  1523.  move.l d2,d4
  1524.  muls.l d5,d4
  1525.  
  1526.  add.l d0,d4
  1527.  swap d4
  1528.  
  1529. ; mulu d3,d4
  1530. ; muls d2,d5
  1531. ; add.l d0,d4
  1532. ; swap d4
  1533. ; add.w d5,d4
  1534.  add.w totalyoff(pc),d4
  1535.  move.w VALAND,d7
  1536.  and.w d7,d4
  1537.  move.w #320,d0
  1538.  moveq #0,d1
  1539.  
  1540.  swap d2
  1541.  move.l d2,d3
  1542.  clr.w d3
  1543.  
  1544.  cmp.b #1,StripData+1
  1545.  dbge d6,drawwallPACK0
  1546.  dbne d6,drawwallPACK1
  1547.  dble d6,drawwallPACK2
  1548.  rts
  1549.  
  1550. timeslarge:
  1551.  
  1552. val SET 0
  1553.  REPT 256
  1554.  dc.l val
  1555. val SET val+320
  1556.  ENDR
  1557.  
  1558.  ds.l 100
  1559.  
  1560.  
  1561.  
  1562. ScreenWallstripdrawBIG:
  1563.  
  1564.  move.w d4,d6
  1565.  cmp.w topclip(pc),d6
  1566.  blt nostripq
  1567.  cmp.w botclip(pc),d3
  1568.  bgt nostripq
  1569.  
  1570.  cmp.w botclip(pc),d6
  1571.  ble.s .noclipbot
  1572.  move.w botclip(pc),d6
  1573. .noclipbot:
  1574.  
  1575.  move.w d3,d5
  1576.  cmp.w topclip(pc),d5
  1577.  bge.s .nocliptop
  1578.  move.w topclip(pc),d5
  1579.  btst #0,d5
  1580.  beq.s .nsbd
  1581.  exg a2,a4
  1582. .nsbd:
  1583.  
  1584.  sub.w d5,d6    ; height to draw.
  1585.  ble nostripq
  1586.  
  1587.  bra gotoendBIG
  1588.  
  1589. .nocliptop:
  1590.  
  1591.  btst #0,d5
  1592.  beq.s .nsbd2
  1593.  exg a2,a4
  1594. .nsbd2:
  1595.  
  1596.  sub.w d5,d6    ; height to draw.
  1597.  ble nostripq
  1598.  
  1599. gotoendBIG
  1600.  
  1601.  add.l timeslargeBIG(pc,d5.w*4),a3 
  1602.  
  1603.  move.w d2,d4
  1604.  add.w d2,d2
  1605.  add.w d2,d4
  1606.  
  1607.  move.l 4(a1,d4.w*8),d0
  1608.  add.w TOPOFFSET(pc),d5
  1609.  move.w d5,d4
  1610.  
  1611.  move.l (a1,d2.w*4),d2
  1612. ; moveq #0,d3
  1613. ; move.w d2,d3
  1614. ; swap d2
  1615. ; tst.w d2
  1616. ; bne.s .notsimple
  1617. ; cmp.l #$b000,d3
  1618. ; ble usesimple
  1619. ;.notsimple:
  1620.  
  1621.  ext.l d5
  1622.  move.l d2,d4
  1623.  muls.l d5,d4
  1624.  
  1625.  add.l d0,d4
  1626.  swap d4
  1627.  
  1628. ; mulu d3,d4
  1629. ; muls d2,d5
  1630. ; add.l d0,d4
  1631. ; swap d4
  1632. ; add.w d5,d4
  1633.  add.w totalyoff(pc),d4
  1634.  move.w VALAND,d7
  1635.  and.w d7,d4
  1636.  move.w #320,d0
  1637.  moveq #0,d1
  1638.  
  1639.  swap d2
  1640.  move.l d2,d3
  1641.  clr.w d3
  1642.  
  1643.  cmp.b #1,StripData+1
  1644.  dbge d6,drawwallPACK0
  1645.  dbne d6,drawwallPACK1
  1646.  dble d6,drawwallPACK2
  1647.  rts
  1648.  
  1649. timeslargeBIG:
  1650.  
  1651. val SET 0
  1652.  REPT 256
  1653.  dc.l val
  1654. val SET val+320
  1655.  ENDR
  1656.  
  1657. nostripqthru:
  1658.  rts
  1659.  
  1660.  
  1661.  
  1662. ScreenWallstripdrawthru:
  1663.  
  1664.  move.w d4,d6
  1665.  cmp.w topclip(pc),d6
  1666.  blt.s nostripqthru
  1667.  cmp.w botclip(pc),d3
  1668.  bgt.s nostripqthru
  1669.  
  1670.  cmp.w botclip(pc),d6
  1671.  ble.s .noclipbot
  1672.  move.w botclip(pc),d6
  1673. .noclipbot:
  1674.  
  1675.  move.w d3,d5
  1676.  cmp.w topclip(pc),d5
  1677.  bge.s .nocliptop
  1678.  move.w topclip(pc),d5
  1679.  btst #0,d5
  1680.  beq.s .nsbd
  1681.  exg a2,a4
  1682. .nsbd:
  1683.  
  1684.  sub.w d5,d6    ; height to draw.
  1685.  ble.s nostripqthru
  1686.  
  1687.  bra gotoendthru
  1688.  
  1689. .nocliptop:
  1690.  
  1691.  btst #0,d5
  1692.  beq.s .nsbdthru
  1693.  exg a2,a4
  1694. .nsbdthru:
  1695.  
  1696.  sub.w d5,d6    ; height to draw.
  1697.  ble.s nostripqthru
  1698.  
  1699.  bra gotoendthru
  1700.  
  1701.  CNOP 0,4
  1702. drawwalldimthruPACK0:
  1703.  and.w d7,d4
  1704.  move.b 1(a5,d4.w*2),d1
  1705.  and.b #31,d1
  1706.  beq.s .holey
  1707.  move.w (a4,d1.w*2),(a3)
  1708. .holey:
  1709.  adda.w d0,a3
  1710.  add.l d3,d4
  1711.  addx.w d2,d4
  1712.  dbra d6,drawwallthruPACK0
  1713.  rts
  1714.  CNOP 0,4
  1715. drawwallthruPACK0:
  1716.  and.w d7,d4
  1717.  move.b 1(a5,d4.w*2),d1
  1718.  and.b #31,d1
  1719.  beq.s .holey
  1720.  move.w (a2,d1.w*2),(a3)
  1721. .holey:
  1722.  adda.w d0,a3
  1723.  add.l d3,d4
  1724.  addx.w d2,d4
  1725.  dbra d6,drawwalldimthruPACK0
  1726. nostripthru:
  1727.  rts
  1728.  
  1729.  CNOP 0,4
  1730. drawwalldimthruPACK1:
  1731.  and.w d7,d4
  1732.  move.w (a5,d4.w*2),d1
  1733.  lsr.w #5,d1
  1734.  and.w #31,d1
  1735.  beq.s .holey
  1736.  move.w (a4,d1.w*2),(a3)
  1737. .holey:
  1738.  adda.w d0,a3
  1739.  add.l d3,d4
  1740.  addx.w d2,d4
  1741.  dbra d6,drawwallthruPACK1
  1742.  rts
  1743.  CNOP 0,4
  1744. drawwallthruPACK1:
  1745.  and.w d7,d4
  1746.  move.w (a5,d4.w*2),d1
  1747.  lsr.w #5,d1
  1748.  and.w #31,d1
  1749.  beq.s .holey
  1750.  move.w (a2,d1.w*2),(a3)
  1751. .holey:
  1752.  adda.w d0,a3
  1753.  add.l d3,d4
  1754.  addx.w d2,d4
  1755.  dbra d6,drawwalldimthruPACK1
  1756.  rts
  1757.  
  1758.  CNOP 0,4
  1759. drawwalldimthruPACK2:
  1760.  and.w d7,d4
  1761.  move.b (a5,d4.w*2),d1
  1762.  lsr.b #2,d1
  1763.  and.b #31,d1
  1764.  beq.s .holey
  1765.  move.w (a4,d1.w*2),(a3)
  1766. .holey:
  1767.  adda.w d0,a3
  1768.  add.l d3,d4
  1769.  addx.w d2,d4
  1770.  dbra d6,drawwallthruPACK2
  1771.  rts
  1772.  CNOP 0,4
  1773. drawwallthruPACK2:
  1774.  and.w d7,d4
  1775.  move.b (a5,d4.w*2),d1
  1776.  lsr.b #2,d1
  1777.  and.b #31,d1
  1778.  beq.s .holey
  1779.  move.w (a2,d1.w*2),(a3)
  1780. .holey:
  1781.  adda.w d0,a3
  1782.  add.l d3,d4
  1783.  addx.w d2,d4
  1784.  dbra d6,drawwalldimthruPACK2
  1785.  rts
  1786.  
  1787.  
  1788. usesimplethru:
  1789.  mulu d3,d4
  1790.  
  1791.  add.l d0,d4
  1792.  swap d4
  1793.  add.w totalyoff(pc),d4
  1794.  
  1795. cliptopusesimplethru
  1796.  moveq #63,d7
  1797.  move.w #104*4,d0
  1798.  moveq #0,d1
  1799.  cmp.l a4,a2
  1800.  blt.s usea2thru
  1801.  move.l a4,a2
  1802. usea2thru:
  1803.  and.w d7,d4
  1804.  
  1805.  move.l d2,d5
  1806.  clr.w d5
  1807.  
  1808.  cmp.b #1,StripData+1
  1809.  dbge d6,simplewallthruiPACK0
  1810.  dbne d6,simplewallthruiPACK1
  1811.  dble d6,simplewallthruiPACK2
  1812.  rts
  1813.  
  1814.  CNOP 0,4
  1815. simplewallthruiPACK0:
  1816.  move.b 1(a5,d4.w*2),d1
  1817.  and.b #31,d1
  1818.  move.w (a2,d1.w*2),d3
  1819. simplewallthruPACK0:
  1820.  move.w d3,(a3)
  1821.  adda.w d0,a3
  1822.  add.l d5,d4
  1823.  bcc.s noreadthruPACK0
  1824. maybeholePACK0
  1825.  addx.w d2,d4
  1826.  and.w d7,d4
  1827.  move.b 1(a5,d4.w*2),d1
  1828.  and.b #31,d1
  1829.  beq.s holeysimplePACK0
  1830.  move.w (a2,d1.w*2),d3
  1831.  dbra d6,simplewallthruPACK0
  1832.  rts
  1833. noreadthruPACK0:
  1834.  addx.w d2,d4
  1835.  dbra d6,simplewallthruPACK0
  1836.  rts
  1837.  
  1838.  CNOP 0,4
  1839. simplewallholePACK0:
  1840.  adda.w d0,a3
  1841.  add.l d5,d4
  1842.  bcs.s maybeholePACK0
  1843.  addx.w d2,d4
  1844. holeysimplePACK0
  1845.  and.w d7,d4
  1846.  dbra d6,simplewallholePACK0
  1847.  rts
  1848.  
  1849.  CNOP 0,4
  1850. simplewallthruiPACK1:
  1851.  move.w (a5,d4.w*2),d1
  1852.  lsr.w #5,d1
  1853.  and.w #31,d1
  1854.  move.w (a2,d1.w*2),d3
  1855.  simplewallthruPACK1:
  1856.  move.w d3,(a3)
  1857.  adda.w d0,a3
  1858.  add.l d5,d4
  1859.  bcc.s noreadthruPACK1
  1860. maybeholePACK1
  1861.  addx.w d2,d4
  1862.  and.w d7,d4
  1863.  move.w (a5,d4.w*2),d1
  1864.  lsr.w #5,d1
  1865.  and.w #31,d1
  1866.  beq.s holeysimplePACK1
  1867.  move.w (a2,d1.w*2),d3
  1868.  dbra d6,simplewallthruPACK1
  1869.  rts
  1870. noreadthruPACK1:
  1871.  addx.w d2,d4
  1872.  dbra d6,simplewallthruPACK1
  1873.  rts
  1874.  
  1875.  CNOP 0,4
  1876. simplewallholePACK1:
  1877.  adda.w d0,a3
  1878.  add.l d5,d4
  1879.  bcs.s maybeholePACK1
  1880.  addx.w d5,d4
  1881. holeysimplePACK1
  1882.  and.w d7,d4
  1883.  dbra d6,simplewallholePACK1
  1884.  rts
  1885.  
  1886.  
  1887.  CNOP 0,4
  1888. simplewallthruiPACK2:
  1889.  move.b (a5,d4.w*2),d1
  1890.  lsr.b #2,d1
  1891.  and.b #31,d1
  1892.  move.w (a2,d1.w*2),d3
  1893. simplewallthruPACK2:
  1894.  move.w d3,(a3)
  1895.  adda.w d0,a3
  1896.  add.l d5,d4
  1897.  bcc.s noreadthruPACK2
  1898. maybeholePACK2
  1899.  addx.w d2,d4
  1900.  and.w d7,d4
  1901.  move.b (a5,d4.w*2),d1
  1902.  lsr.b #2,d1
  1903.  and.b #31,d1
  1904.  beq.s holeysimplePACK2
  1905.  move.w (a2,d1.w*2),d3
  1906.  dbra d6,simplewallthruPACK2
  1907.  rts
  1908. noreadthruPACK2:
  1909.  addx.w d2,d4
  1910.  dbra d6,simplewallthruPACK2
  1911.  rts
  1912.  
  1913.  CNOP 0,4
  1914. simplewallholePACK2
  1915.  adda.w d0,a3
  1916.  add.l d5,d4
  1917.  bcs.s maybeholePACK2
  1918.  addx.w d2,d4
  1919. holeysimplePACK2
  1920.  and.w d7,d4
  1921.  dbra d6,simplewallholePACK2
  1922.  rts
  1923.  
  1924.  
  1925. gotoendthru:
  1926.  add.l timeslargethru(pc,d5.w*4),a3 
  1927.  move.w d5,d4
  1928.  move.l 4(a1,d2.w*8),d0
  1929.  move.l (a1,d2.w*8),d2
  1930.  moveq #0,d3
  1931.  move.w d2,d3
  1932.  swap d2
  1933.  tst.w d2
  1934.  bne.s .notsimple
  1935.  cmp.l #$b000,d3
  1936.  ble usesimplethru
  1937. .notsimple:
  1938.  
  1939.  mulu d3,d4
  1940.  muls d2,d5
  1941.  add.l d0,d4
  1942.  swap d4
  1943.  add.w d5,d4
  1944.  add.w wallyoff(pc),d4
  1945. cliptopthru
  1946.  moveq #63,d7
  1947.  move.w #104*4,d0
  1948.  moveq #0,d1
  1949.  
  1950.  move.l d2,d3
  1951.  clr.w d3
  1952.  
  1953.  cmp.b #1,StripData+1
  1954.  dbge d6,drawwallthruPACK0
  1955.  dbne d6,drawwallthruPACK1
  1956.  dble d6,drawwallthruPACK2
  1957.  
  1958.  rts
  1959.  
  1960. timeslargethru:
  1961.  
  1962. val SET 104*4
  1963.  REPT 80
  1964.  dc.l val
  1965. val SET val+104*4
  1966.  ENDR
  1967.  
  1968. totalyoff: dc.w 0
  1969. wallyoff: dc.w 0
  1970.  
  1971. ******************************************
  1972. * Wall polygon
  1973. leftend: dc.w 0
  1974. wallbrightoff: dc.w 0
  1975. wallleftpt: dc.w 0
  1976. wallrightpt: dc.w 0
  1977. WHICHPBR: dc.w 0
  1978. WHICHLEFTPT: dc.w 0
  1979. WHICHRIGHTPT: dc.w 0
  1980. OTHERZONE: dc.w 0
  1981.  
  1982. itsawalldraw:
  1983.  
  1984.  move.l #Rotated,a5
  1985.  move.l #OnScreen,a6
  1986.  
  1987.  move.w (a0)+,d0
  1988.  move.w (a0)+,d2
  1989.  
  1990.  move.w d0,wallleftpt
  1991.  move.w d2,wallrightpt
  1992.  
  1993.  move.b (a0)+,WHICHLEFTPT+1
  1994.  move.b (a0)+,WHICHRIGHTPT+1
  1995.  move.w #0,leftend
  1996.  moveq #0,d5
  1997.  move.w (a0)+,d5
  1998.  move.w (a0)+,d1
  1999.  asl.w #4,d1
  2000.  move.w d1,fromtile
  2001.  
  2002.  move.w (a0)+,d1
  2003.  move.w d1,totalyoff
  2004.  
  2005.  move.w (a0)+,d1
  2006.  move.l #walltiles,a3
  2007.  move.l (a3,d1.w*4),a3
  2008.  move.l a3,PaletteAddr
  2009.  add.l #64*32,a3
  2010.  move.l a3,ChunkAddr
  2011.  
  2012.  ;move.w (a0)+,d1
  2013.  ;add.w ZoneBright,d1
  2014.  move.w ZoneBright,angbright
  2015.  ;move.w (a0)+,d1
  2016.  ;move.w (a0)+,d4
  2017.  move.l yoff,d6
  2018.  
  2019.  move.b (a0)+,VALAND+1
  2020.  move.b (a0)+,VALSHIFT+1
  2021.  moveq #0,d1
  2022.  move.b (a0)+,d1
  2023.  move.w d1,HORAND
  2024.  move.b (a0)+,WHICHPBR
  2025.  
  2026.  move.w totalyoff,d1
  2027.  add.w wallyoff,d1
  2028.  and.w VALAND,d1
  2029.  move.w d1,totalyoff
  2030.  
  2031.  move.l (a0)+,topofwall
  2032.  sub.l d6,topofwall
  2033.  move.l (a0)+,botofwall
  2034.  sub.l d6,botofwall
  2035.  
  2036.  
  2037.  move.b (a0)+,wallbrightoff
  2038.  move.b (a0)+,OTHERZONE+1
  2039.  
  2040.  move.l topofwall,d3
  2041.  cmp.l botofwall,d3
  2042.  bge wallfacingaway
  2043.  
  2044.  
  2045.  tst.w 6(a5,d0*8)
  2046.  bgt.s cantell
  2047.  tst.w 6(a5,d2*8)
  2048.  ble wallfacingaway
  2049.  bra cliptotestfirstbehind
  2050. cantell:
  2051.  tst.w 6(a5,d2*8)
  2052.  ble.s cliptotestsecbehind
  2053.  bra pastclip
  2054. cliptotestfirstbehind:
  2055.  
  2056.  move.l (a5,d0*8),d3
  2057.  sub.l (a5,d2*8),d3
  2058.  move.w 6(a5,d0*8),d6
  2059.  sub.w 6(a5,d2*8),d6
  2060.  divs d6,d3
  2061.  muls 6(a5,d2*8),d3
  2062.  neg.l d3
  2063.  add.l (a5,d2*8),d3
  2064.  move.w (a6,d2*2),d6
  2065.  sub.w MIDDLEX,d6
  2066.  ext.l d6
  2067.  cmp.l d6,d3
  2068.  bge wallfacingaway
  2069.  bra cant_tell
  2070.  bra pastclip
  2071.  
  2072. cliptotestsecbehind:
  2073.  
  2074.  move.l (a5,d2*8),d3
  2075.  sub.l (a5,d0*8),d3
  2076.  move.w 6(a5,d2*8),d6
  2077.  sub.w 6(a5,d0*8),d6
  2078.  divs d6,d3
  2079.  muls 6(a5,d0*8),d3
  2080.  neg.l d3
  2081.  add.l (a5,d0*8),d3
  2082.  move.w (a6,d0*2),d6
  2083.  sub.w MIDDLEX,d6
  2084.  ext.l d6
  2085.  cmp.l d6,d3
  2086.  ble wallfacingaway
  2087.  bra cant_tell
  2088.  
  2089. pastclip:
  2090.  
  2091.  move.w (a6,d0*2),d3
  2092.  cmp.w RIGHTX,d3
  2093.  bge wallfacingaway
  2094.  cmp.w (a6,d2*2),d3
  2095.  bge wallfacingaway
  2096.  tst.w (a6,d2*2)
  2097.  blt wallfacingaway
  2098.  
  2099. cant_tell:
  2100.  
  2101. ; move.l a1,a4
  2102. ; move.w #31,d6
  2103. ; move.l #0,d3
  2104. ;.emptylop:
  2105. ; move.l d3,(a4)+
  2106. ; dbra d6,.emptylop
  2107.  
  2108. ; move.w rightclip(pc),d6
  2109. ; st (a1,d6)
  2110. ; move.w leftclip(pc),d6
  2111. ; st -1(a1,d6)
  2112.  
  2113. ; muls sinval(pc),d1
  2114. ; muls cosval(pc),d4
  2115. ; add.l d1,d4
  2116. ; add.l d4,d4
  2117. ; swap d4
  2118. ; neg.w d4
  2119. ; move.w d4,d6
  2120. ; asr.w #1,d4
  2121. ; sub.w d4,angbright
  2122. ; and.b #$fe,d4
  2123. ; asl.w #2,d4
  2124. ; asl.w #2,d6
  2125.  
  2126.  movem.l d7/a0/a5/a6,-(a7)
  2127.  move.l (a5,d0*8),a0
  2128. ; add.l a0,a0
  2129.  move.w 6(a5,d0*8),d1
  2130.  move.l (a5,d2*8),a2
  2131. ; add.l a2,a2
  2132.  move.w 6(a5,d2*8),d3
  2133.  
  2134.  move.l #CurrentPointBrights,a5
  2135.  
  2136.  move.w currzone,d0
  2137.  move.b WHICHPBR,d4
  2138.  btst #3,d4
  2139.  beq.s .nototherzone 
  2140.  move.w OTHERZONE,d0
  2141. .nototherzone
  2142.  
  2143.  and.w #7,d4
  2144.  muls #40,d0
  2145.  add.w d0,d4
  2146.  
  2147.  move.w WHICHLEFTPT,d0
  2148.  asl.w #2,d0
  2149.  add.w d4,d0
  2150.  
  2151.  move.w (a5,d0.w*2),d0
  2152.  add.w #300,d0
  2153.  add.w wallbrightoff,d0
  2154.  move.w d0,leftwallbright
  2155.  
  2156.  move.w WHICHRIGHTPT,d0
  2157.  asl.w #2,d0
  2158.  add.w d4,d0
  2159.  move.w (a5,d0.w*2),d0
  2160.  add.w #300,d0
  2161.  add.w wallbrightoff,d0
  2162.  move.w d0,rightwallbright
  2163.  
  2164.  move.w currzone,d0
  2165.  move.b WHICHPBR,d4
  2166.  lsr.w #4,d4
  2167.  btst #3,d4
  2168.  beq.s .nototherzone2 
  2169.  move.w OTHERZONE,d0
  2170. .nototherzone2
  2171.  
  2172.  and.w #7,d4
  2173.  muls #40,d0
  2174.  add.w d0,d4
  2175.  
  2176.  move.w WHICHLEFTPT,d0
  2177.  asl.w #2,d0
  2178.  add.w d4,d0
  2179.  
  2180.  move.w (a5,d0.w*2),d0
  2181.  add.w #300,d0
  2182.  add.w wallbrightoff,d0
  2183.  move.w d0,leftwallTOPbright
  2184.  
  2185.  move.w WHICHRIGHTPT,d0
  2186.  asl.w #2,d0
  2187.  add.w d4,d0
  2188.  move.w (a5,d0.w*2),d0
  2189.  add.w #300,d0
  2190.  add.w wallbrightoff,d0
  2191.  move.w d0,rightwallTOPbright
  2192.  
  2193.  move.w leftend(pc),d4
  2194.  move.l #max3ddiv,d7
  2195.  
  2196.  move.w rightwallTOPbright,d0
  2197.  cmp.w rightwallbright,d0
  2198.  bne.s gottagour
  2199.  move.w leftwallTOPbright,d0
  2200.  cmp.w leftwallbright,d0
  2201.  bne.s gottagour
  2202.  
  2203.  bsr walldraw
  2204.  bra.s nottagour
  2205.  
  2206. gottagour:
  2207.  bsr walldrawGOUR
  2208. nottagour:
  2209.  movem.l (a7)+,d7/a0/a5/a6
  2210.  
  2211. wallfacingaway:
  2212.  
  2213.  rts
  2214.  
  2215. PointBrightsPtr: dc.l 0
  2216. midpt: dc.l 0
  2217. dist1: dc.l 0
  2218. dist2: dc.l 0
  2219. VALAND: dc.w 0
  2220. VALSHIFT: dc.w 0
  2221. HORAND: dc.w 0
  2222.  
  2223. sinval: dc.w 0
  2224. cosval: dc.w 0
  2225.  
  2226. oldxoff: dc.w 0
  2227. oldzoff: dc.w 0
  2228.  
  2229. topclip: dc.w 0
  2230. botclip: dc.w 0
  2231. seethru: dc.w 0
  2232.