Advertisement
Guest User

Untitled

a guest
Sep 29th, 2016
72
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. #define ITEXTURE_BC1    %00000001
  2. #define ITEXTURE_RBG    %00000010
  3.  
  4. ; max ;
  5.  
  6. #define  ITEXTURE_MAX_SIZE       32385
  7. #define  ITEXTURE_MAX_HEIGHT     127
  8. #define  ITEXTURE_MAX_WIDTH      127
  9.  
  10. #define   push_in push hl \ push de \ push ix \ push iy
  11. #define   pop_in  pop iy \ pop ix \ pop de \ pop hl
  12.  
  13. ITEXTUREDRAW:
  14. IRasterTexturedTriangle:
  15.  
  16.     ld  a, (de)
  17.     sub a, (hl)
  18.     jr  c, IRasterSwap0
  19.     ex  de, hl
  20. IRasterSwap0:
  21.     ld  a, (bc)
  22.     sub a, (hl)
  23.     jr  nc, IRasterSwap1
  24.     push    hl
  25.     or  a, a
  26.     sbc hl, hl
  27.     add hl, bc
  28.     pop bc
  29. IRasterSwap1:
  30.     ld  a, (de)
  31.     sub a, (hl)
  32.     jr  nc, IRasterSwap2
  33.     ex  de, hl
  34. IRasterSwap2:
  35.  
  36.     ld  a, (bc)
  37.     sub (hl)
  38.     ret z
  39.  
  40.     call    ITextureSetup
  41.  
  42.     ld  ix, $FF0000
  43.     ld  iy, $FF0000
  44.     ld  ixl, a
  45.     neg
  46.     ld  (IDeltaY0), a
  47. ; x1-x0
  48.     ld  a, (de)
  49.     ld  (IValueY1), a
  50.     sub (hl)
  51.     push    af
  52.     ld  iyl, a
  53.     neg
  54.     ld  (IDeltaY1), a
  55.     ld  a, (hl)
  56.     push    af
  57.  
  58.     push    bc
  59.     inc hl
  60.     ld  bc, (hl)
  61.     ex  de, hl
  62.     inc hl
  63.     ld  hl, (hl)
  64.     ld  (IValueX1), hl
  65.  
  66.     jr  z, IRasterNoEdgeWrite
  67.     ld  a, $13
  68.     or  a, a
  69.     sbc hl, bc
  70.     jr  nc, IRasterEdge1
  71.     or  a, $08
  72.     ex  de, hl
  73.     sbc hl, hl
  74.     sbc hl, de
  75. IRasterEdge1:
  76.     ld  (IDeltaX1), hl
  77.     ld  (ISMC_Code1), a
  78.  
  79.     lea de, iy+0
  80.     add hl, de
  81.     ex  de, hl
  82.     sbc hl, hl
  83.     ccf
  84.     sbc hl, de
  85.     sra h
  86.     rr  l
  87.     ex  de, hl
  88.     ld  iyh, d
  89.     ld  iyl, e
  90.  
  91. IRasterNoEdgeWrite:
  92.     pop hl
  93.  
  94. ; x2-x0
  95.     inc hl
  96.     ld  hl, (hl)
  97.     ld  (IValueX2), hl
  98.     ld  a, $23          ; inc hl
  99.     or  a, a
  100.     sbc hl, bc
  101. ; if x0>x1, edge goes to left
  102.     jr  nc, IRasterEdge0
  103.     or  a, $08          ; dec hl
  104. ; edge goes to left
  105.     ex  de, hl
  106.     sbc hl, hl
  107.     sbc hl, de
  108. IRasterEdge0:
  109.     ld  (IDeltaX0), hl
  110.     ld  (ISMC_Code0), a
  111.  
  112.     lea de, ix+0
  113.     add hl, de
  114.     ex  de, hl
  115.     sbc hl, hl
  116.     ccf
  117.     sbc hl, de
  118.     sra h
  119.     rr  l
  120.     ex  de, hl
  121.     ld  ixh, d
  122.     ld  ixl, e
  123.  
  124.     pop hl
  125.     ld  l, 160
  126.     mlt hl
  127.     add hl, hl
  128.     add hl, bc
  129.     ld  de, (IFramebuffer)
  130.     add hl, de
  131.     ex  de, hl
  132.     sbc hl, hl
  133.     add hl, de
  134.  
  135.     pop af
  136.     call    nz, IRasterTriangleInner
  137.  
  138.     ld  a, (IDeltaY0) ; y2-y0
  139.     ld  c, a
  140.     ld  a, (IDeltaY1)
  141.     sub c
  142.     ret z
  143.     push    af
  144.     ld  iyl, a
  145.     neg
  146.     ld  (IDeltaY1), a
  147.  
  148.     push    hl
  149.  
  150. IValueX2=$+1
  151.     ld  hl, $000000
  152. IValueX1=$+1
  153.     ld  bc, $000000
  154.     or  a, a
  155.     sbc hl, bc
  156.     ld  a, $13
  157. ; if x0>x1, edge goes to left
  158.     jr  nc, IRasterEdge2
  159.     or  a, $08
  160.     ex  de, hl
  161.     sbc hl, hl
  162.     sbc hl, de
  163. IRasterEdge2:
  164.     ld  (IDeltaX1), hl
  165.     ld  (ISMC_Code1), a
  166.  
  167.     lea de, iy+0
  168.     ld  d, $00 ;compensate due to previous looping
  169.     add hl, de
  170.     ex  de, hl
  171.     sbc hl, hl 
  172.     ccf
  173.     sbc hl, de
  174.     sra h
  175.     rr  l
  176.     ex  de, hl
  177.     ld  iyh, d
  178.     ld  iyl, e
  179.  
  180. IValueY1=$+1
  181.     ld  l, $00
  182.     ld  h, 160
  183.     mlt hl
  184.     add hl, hl
  185.     add hl, bc
  186.     ld  de, (IFramebuffer)
  187.     add hl, de
  188.     ex  de, hl
  189.     pop hl
  190.  
  191.     pop af
  192. IRasterTriangleInner:
  193.     push    af
  194. IDeltaX0=$+1
  195.     ld  bc, $000000
  196.     add ix, bc
  197.     jr  nc, $+11
  198. IDeltaY0=$+1
  199.     ld  bc, $FFFF00
  200. ISMC_Code0=$
  201.     nop
  202.     add ix, bc
  203.     jr  c, $-3
  204.  
  205. IDeltaX1=$+1
  206.     ld  bc, $000000
  207.     add iy, bc
  208.     jr  nc, $+11
  209. IDeltaY1=$+1
  210.     ld  bc, $FFFF00
  211. ISMC_Code1=$
  212.     nop
  213.     add iy, bc
  214.     jr  c, $-3
  215. ; hl = adress1, de = adress2
  216.     push_in
  217.     sbc hl, de
  218.     jp  c, IRasterInverted
  219.     ld  b, h
  220.     ld  c, l
  221.     add hl, de
  222.     jp  z, ITextureNext
  223. ; draw from left to right
  224.     ld  a, c
  225.     dec bc
  226.     inc b
  227.     dec hl
  228. ; start at (hl), decrement
  229. ; ix texture adress
  230. ; de = int(dvx)*text_size+int(dux)
  231. ; bc = frac(dux)*65536+frac(dvx)
  232. ; iy fractionnal offset
  233. ; hl framebuffer adress
  234. ; a size
  235. ;   ld  ix, (ITextureAdress)
  236. ;   push    af
  237. ;   ld  a, (ITextureFrac)
  238. ;   cpl
  239. ;   ld  (TMP), a
  240. ;   ld  a, (ITextureFrac+2)
  241. ;   cpl
  242. ;   ld  (TMP+2), a
  243. ;   ld  iy, (TMP)
  244. ;   pop af
  245.  
  246.     push    hl
  247.     ld  de, (ITextureFrac)
  248.     scf
  249.     sbc hl, hl
  250.     or  a, a
  251.     sbc hl, de
  252.     ld  h, 0
  253.     ex  de, hl
  254.     ld  iy, 0
  255.     add iy, de
  256.     ld  ix, (ITextureAdress)
  257.     pop hl
  258.  
  259. ITextureICplInt0=$+1
  260.     ld  de, $000000
  261. ITextureLong0:
  262.     push    bc
  263. ITextureICplFrac0=$+1
  264.     ld  bc, 19*65536+28
  265. ;ITextureInner0:
  266. ;   add ix, de
  267. ;   add iy, bc
  268. ;   jr  nc, $+4
  269. ;   .db $DD
  270. ;ITextureUXV0=$
  271. ;   .db $2B
  272. ;   ld  b, iyh
  273. ;   rr  b
  274. ;   jr  nc, $+5
  275. ;ITextureVXV0=$+2
  276. ;   lea ix, ix+16
  277. ;   ld  b, (ix)
  278. ;   ld  (hl), b
  279. ;   ld  b, 0
  280. ;   ld  iyh, b
  281. ;   dec hl
  282. ;   dec a
  283. ;   jr  nz, ITextureInner0
  284.  
  285. ITextureInner0:
  286.     add iy, bc
  287.     ld  b, (ix)
  288.     ld  (hl), b
  289.     jr  nc, $+4
  290.     .db $DD
  291. ITextureUXV0=$
  292.     .db $00
  293.     add ix, de
  294.     ld  b, iyh
  295.     rr  b
  296.     ld  iyh, b
  297.     jr  nc, $+5
  298. ITextureVXV0=$+2
  299.     lea ix, ix+0
  300.     dec hl
  301.     dec a
  302.     jr  nz, ITextureInner0
  303.  
  304.     pop bc
  305.     djnz    ITextureLong0
  306. ; this loop have inversed direction interpolators
  307.     jp  ITextureNext
  308. IRasterInverted:
  309. ; draw from right to left
  310.     add hl, de
  311.     ex  de, hl
  312.     or  a, a
  313.     sbc hl, de
  314.     ld  b, h
  315.     ld  c, l
  316.     add hl, de
  317.     ex  de, hl
  318. ; start at (hl), inc
  319. ; reconvert bc size to dual loop size
  320.     ld  a, c
  321.     dec bc
  322.     inc b
  323. ; right to left texture filling
  324. ; ix texture adress
  325. ; de = int(dvx)*text_size+int(dux)
  326. ; bc = frac(dux)*65536+frac(dvx)
  327. ; iy fractionnal offset
  328. ; hl framebuffer adress
  329. ; a size
  330. ;   ld  ix, (ITextureAdress)
  331. ;   push    af
  332. ;   ld  a, (ITextureFrac)
  333. ;   cpl
  334. ;   ld  (TMP), a
  335. ;   ld  a, (ITextureFrac+2)
  336. ;   cpl
  337. ;   ld  (TMP+2), a
  338. ;;  ld  iy, (TMP)
  339. ;   pop af
  340.  
  341.     push    hl
  342.     ld  de, (ITextureFrac)
  343.     scf
  344.     sbc hl, hl
  345.     or  a, a
  346.     sbc hl, de
  347.     ld  h, 0
  348.     ex  de, hl
  349.     ld  iy, 0
  350.     add iy, de
  351.     ld  ix, (ITextureAdress)
  352.     pop hl
  353.  
  354. ITextureICplInt1=$+1
  355.     ld  de, $000000
  356. ITextureLong1:
  357.     push    bc
  358. ITextureICplFrac1=$+1
  359.     ld  bc, $000000
  360.  
  361. ;ITextureInner1:
  362. ;   add ix, de
  363. ;   add iy, bc
  364. ;   jr  nc, $+4
  365. ;   .db $DD
  366. ;ITextureUXV1=$
  367. ;   nop
  368. ;   ld  b, iyh
  369. ;   rr  b
  370. ;   jr  nc, $+5
  371. ;ITextureVXV1=$+2
  372. ;   lea ix, ix+0
  373. ;   ld  b, (ix)
  374. ;   ld  (hl), b
  375. ;   ld  b, 0
  376. ;   ld  iyh, b
  377. ;   inc hl
  378. ;   dec a
  379. ;   jr  nz, ITextureInner1
  380.  
  381. ITextureInner1:
  382.     add iy, bc
  383.     ld  b, (ix)
  384.     ld  (hl), b
  385.     jr  nc, $+4
  386.     .db $DD
  387. ITextureUXV1=$
  388.     .db $00
  389.     add ix, de
  390.     ld  b, iyh
  391.     rr  b
  392.     ld  iyh, b
  393.     jr  nc, $+5
  394. ITextureVXV1=$+2
  395.     lea ix, ix+0
  396.     inc hl
  397.     dec a
  398.     jr  nz, ITextureInner1
  399.  
  400.     pop bc
  401.     djnz    ITextureLong1
  402.  
  403. ; ix texture adress
  404. ; de = int(dvy)*text_size+int(duy)
  405. ; bc = frac(duy)*65536+frac(dvy)
  406. ; hl fractionnal offset
  407. ITextureNext:
  408.  
  409.     ld  hl, (ITextureFrac)
  410.     ld  ix, (ITextureAdress)
  411.  
  412. ITextureOCplInt=$+1
  413.     ld  bc, $000000
  414.     add ix, bc
  415. ITextureOCplFrac=$+1
  416.     ld  bc, $000000
  417.     add hl, bc
  418.     jr  nc, $+4
  419.     .db $DD
  420. ITextureUYV=$
  421.     nop
  422.     or  a, a
  423.     rr  h
  424.     jr  nc, $+5
  425. ITextureVYV=$+2
  426.     lea ix, ix+0
  427.  
  428.     ld  (ITextureFrac), hl
  429.     ld  (ITextureAdress), ix
  430.     pop_in
  431.  
  432.     ld  bc, 320
  433.     add hl, bc
  434.     ex  de, hl
  435.     add hl, bc
  436.     ex  de, hl
  437.     pop af
  438.     dec a
  439.     jp  nz, IRasterTriangleInner
  440.     ret
  441.  
  442. ITextureSetup:
  443. ; duy=(u2-u0)/(y2-y0)
  444. ; dvy=(v2-v0)/(y2-y0)
  445. ;          (At-Ct)*(By-Cy) - (Bt-Ct)*(Ay-Cy)
  446. ;  dt/dx = ---------------------------------
  447. ;          (Ax-Cx)*(By-Cy) - (Bx-Cx)*(Ay-Cy)
  448. ;
  449. ; du = ((u0-u2)*(y1-y2) - (u1-u2)*(y0-y2))/dx
  450. ; dv = ((v0-v2)*(y1-y2) - (v1-v2)*(y0-y2))/dx
  451. ; dx = (x0-x2)*(y1-y2) - (x1-x2)*(y0-y2)
  452. ; u:-640, r=20 : -5080, r=162
  453. ; v:960, r=-30 : 7620, r=-243
  454. ; x:-8000
  455.  
  456. ;ITextureOCplInt:int(dvy)*text_size+int(duy)
  457. ;ITextureOCplFrac:bc = abs(frac(duy)*65536)+abs(frac(dvy))
  458. ;ITextureUYV:if duy is neg
  459. ;ITextureVYV:if dvy is neg
  460.  
  461.     push_in
  462.     push    bc
  463.     push    af
  464.  
  465.     ld  ix, tmpWR
  466.     ld  (ix+0), hl
  467.     ld  (ix+3), de
  468.     ld  (ix+6), bc
  469.  
  470. ; (u2-u0)/(y2-y0)
  471.     ld  a, (bc)
  472.     sub (hl)
  473.     push    af
  474. ; a = delta y
  475.     ld  bc, 4
  476.     add hl, bc
  477.     ld  c, a
  478.     ld  iy, (ix+6)
  479.     ld  a, (iy+4)
  480.     sub (hl)
  481. ; a = delta u, c = delta y
  482.     or  a, a
  483.     sbc hl, hl
  484.     ex  de, hl 
  485. ; extend a to de
  486.     ld  de, $FFFFFF
  487.     bit 7, a
  488.     jr  nz, $+3
  489.     inc de
  490.     ld  e, a
  491.     call    DEDivBC
  492.     ld  bc, 5
  493.     ld  hl, (ix+0)
  494.     add hl, bc 
  495.     pop af
  496.     ld  c, a
  497.     ld  iy, (ix+6)
  498.     ld  a, (iy+5)
  499.     sub (hl)
  500.     push    de
  501.     or  a, a
  502.     sbc hl, hl
  503.     ex  de, hl
  504. ;   ld  e, a
  505. ; extend e into de
  506.     ld  de, $FFFFFF
  507.     bit 7, a
  508.     jr  nz, $+3
  509.     inc de
  510.     ld  e, a
  511.     call    DEDivBC
  512.     ex  de, hl
  513.     pop de
  514.  
  515.     ld  a, h
  516.     and %10000000
  517.     rrca
  518.     ld  c, a
  519.     ld  a, d
  520.     and %10000000
  521.     or  c
  522.     ld  c, a
  523. ; c :: 7 : u, 6:v
  524.     bit 7, h
  525.     jr  z, INNegHL0
  526.     push    de
  527.     or  a, a
  528.     ex  de, hl
  529.     sbc hl, hl
  530.     sbc hl, de
  531.     pop de
  532. INNegHL0:
  533.     bit 7, d
  534.     jr  z, INNegDE0
  535.     push    hl
  536.     or  a, a
  537.     sbc hl, hl
  538.     sbc hl, de
  539.     ex  de, hl
  540.     pop hl
  541. INNegDE0:
  542. ; ITextureFracPack:
  543. ; abs(frac(dux)*65536)+abs(frac(dvx))
  544.     ld  a, l
  545.     ld  (ITextureOCplFrac), a
  546.     ld  a, e
  547.     ld  (ITextureOCplFrac+2), a
  548. ; Variance:
  549.     ld  a, $23
  550.     bit 7, c
  551.     jr  z, $+4
  552.     or  $08
  553.     ld  (ITextureUYV), a
  554. ITextureMlt1=$+1
  555.     ld  a, 0
  556.     bit 6, c
  557.     jr  z, $+4
  558.     neg
  559.     ld  (ITextureVYV), a
  560. ; now integer pack
  561.     call    ITextureIntegerPack
  562.     ld  (ITextureOCplInt), hl
  563.  
  564. ; v0*size+u0+base=textureadress
  565.     ld  hl, (ix+0)
  566.     ld  bc, 4
  567.     add hl, bc
  568.     ld  c, (hl)
  569.     inc hl
  570.     ld  h, (hl)
  571. ITextureMlt2=$+1
  572.     ld  l, 0
  573.     mlt hl
  574.     add hl, bc 
  575.     ld  de, (ITexture)
  576.     add hl, de
  577.     ld  (ITextureAdress), hl   
  578.  
  579. ; du = ((u0-u2)*(y1-y2) - (u1-u2)*(y0-y2))/dx
  580. ; dv = ((v0-v2)*(y1-y2) - (v1-v2)*(y0-y2))/dx
  581. ; dx = (x0-x2)*(y1-y2) - (x1-x2)*(y0-y2)
  582.  
  583. ; du = ((u2-u0)*(y2-y1)-(u2-u1)*(y2-y0))/dx     ; -5080
  584. ; dv = ((v2-v0)*(y2-y1)-(v2-v1)*(y2-y0))/dx     ; 20320
  585. ; dx = (x2-x0)*(y2-y1) - (x2-x1)*(y2-y0)        ; -20000
  586.  
  587. ; rv = -260
  588. ; ru= 65
  589.  
  590.     ld  hl, (ix+0)
  591.     ld  de, (ix+3)
  592.     ld  bc, (ix+6)
  593.  
  594.     ld  a, (bc)
  595.     sub (hl)
  596.     ld  (ITmp20), a
  597.     ex  de, hl
  598.     ld  a, (bc)
  599.     sub (hl)
  600.     ld  (ITmp21), a
  601.  
  602.     inc hl \ inc bc \ inc de
  603.     ld  bc, (hl)    ; x1
  604.     ld  hl, (ix+6)
  605.     inc hl
  606.     ld  hl, (hl)
  607.     or  a, a
  608.     sbc hl, bc
  609. ; now do s16bits*8bits
  610.     ld  a, (ITmp20)
  611.     call    ITextureMlt16
  612.     push    hl
  613.  
  614.     ld  hl, (ix+0)
  615.     inc hl
  616.     ld  bc, (hl)
  617.     ld  hl, (ix+6)
  618.     inc hl
  619.     ld  hl, (hl)
  620.     or  a, a
  621.     sbc hl, bc  ; (x2-x0)
  622.     ld  a, (ITmp21)
  623.     call    ITextureMlt16
  624.     pop de
  625.     or  a, a
  626.     sbc hl, de
  627. ; dx is computed
  628.     ld  (ITextureDX), hl
  629. ; du = ((u2-u0)*(y2-y1)-(u2-u1)*(y2-y0))/dx
  630.     ld  iy, (ix+3)
  631.     ld  c, (iy+4)
  632.     ld  iy, (ix+6)
  633.     ld  a, (iy+4)
  634.     sub a, c    ; (u2-u1)
  635.     ld  c, a
  636.     ld  a, (ITmp20)
  637.     call    ITextureMlt8
  638.     push    hl
  639.     ld  iy, (ix+0)
  640.     ld  c, (iy+4)
  641.     ld  iy, (ix+6)
  642.     ld  a, (iy+4)
  643.     sub a, c
  644.     ld  c, a
  645.     ld  a, (ITmp21)
  646.     call    ITextureMlt8
  647.     pop de
  648.     or  a, a
  649.     sbc hl, de
  650.     ex  de, hl
  651.     ld  bc, (ITextureDX)
  652.     call    DEDivBC
  653.     push    de  ; du
  654. ; dv = ((v2-v0)*(y2-y1)-(v2-v1)*(y2-y0))/dx
  655.     ld  iy, (ix+3)
  656.     ld  c, (iy+5)
  657.     ld  iy, (ix+6)
  658.     ld  a, (iy+5)
  659.     sub a, c    ; (u2-u1)
  660.     ld  c, a
  661.     ld  a, (ITmp20)
  662.     call    ITextureMlt8
  663.     push    hl
  664.     ld  iy, (ix+0)
  665.     ld  c, (iy+5)
  666.     ld  iy, (ix+6)
  667.     ld  a, (iy+5)
  668.     sub a, c
  669.     ld  c, a
  670.     ld  a, (ITmp21)
  671.     call    ITextureMlt8
  672.     pop de
  673.     or  a, a
  674.     sbc hl, de
  675.     ex  de, hl
  676.     ld  bc, (ITextureDX)
  677.     call    DEDivBC
  678.     ex  de, hl
  679.     pop de
  680.  
  681. ; dux, dvx ratio
  682. ;   ld  hl, -260        ;v
  683. ;   ld  de, 65      ;u
  684.  
  685. ; hl = dv
  686. ; de = du
  687.     ld  a, h
  688.     and %10000000
  689.     rrca
  690.     ld  c, a
  691.     ld  a, d
  692.     and %10000000
  693.     or  c
  694.     ld  c, a
  695. ; c :: 7 : u, 6:v
  696.     bit 7, h
  697.     jr  z, INNegHL
  698.     push    de
  699.     or  a, a
  700.     ex  de, hl
  701.     sbc hl, hl
  702.     sbc hl, de
  703.     pop de
  704. INNegHL:
  705.     bit 7, d
  706.     jr  z, INNegDE
  707.     push    hl
  708.     or  a, a
  709.     sbc hl, hl
  710.     sbc hl, de
  711.     ex  de, hl
  712.     pop hl
  713. INNegDE:
  714. ; ITextureFracPack:
  715. ; abs(frac(dux)*65536)+abs(frac(dvx))
  716.     ld  a, l
  717.     ld  (ITextureICplFrac0), a
  718.     ld  (ITextureICplFrac1), a
  719.     ld  a, e
  720.     ld  (ITextureICplFrac0+2), a
  721.     ld  (ITextureICplFrac1+2), a
  722. ; Variance:
  723.     ld  a, $23
  724.     bit 7, c
  725.     jr  z, $+4
  726.     or  $08
  727.     ld  (ITextureUXV1), a
  728.     xor $08
  729.     ld  (ITextureUXV0), a
  730. ITextureMlt3=$+1
  731.     ld  a, 0
  732.     bit 6, c
  733.     jr  z, $+4
  734.     neg
  735.     ld  (ITextureVXV1), a
  736.     neg
  737.     ld  (ITextureVXV0), a
  738. ; now integer pack
  739.     call    ITextureIntegerPack
  740.     ld  (ITextureICplInt1), hl
  741.     or  a, a
  742.     ex  de, hl
  743.     sbc hl, hl
  744.     sbc hl, de
  745.     ld  (ITextureICplInt0), hl
  746. ; warning the int should be negated in Int0. Error in compute
  747.  
  748.     ld  hl, 0
  749.     ld  (ITextureFrac), hl
  750.  
  751.     pop af
  752.     pop bc
  753.     pop_in
  754.     ret
  755.  
  756.  
  757. ITextureSwitchRes:
  758. ; hl is new resolution
  759. ; y, x
  760.     ld  (ITextureMlt0), a
  761.     ld  (ITextureMlt1), a
  762.     ld  (ITextureMlt2), a
  763.     ld  (ITextureMlt3), a
  764.     ret
  765.  
  766. ITexture:
  767.     .dl 0
  768. ITextureAdress:
  769.     .dl 0
  770. ITextureFrac:
  771.     .dl 0
  772. tmpWR:
  773.     .dl 0,0,0
  774. ITextureDX:
  775.     .dl 0
  776. ITmp20:
  777.     .dl 0
  778. ITmp21:
  779.     .dl 0
  780.  
  781. ; DEDivBC {
  782. ; Output in DE
  783. DEDivBC: ; Mostly copied from Xeda
  784.     ld a,$B7
  785.     call AbsDE
  786.     jp m,+_
  787.     xor a,%10000000
  788. _:  call AbsBC
  789.     jp m,+_
  790.     xor a,%10000000
  791. _:  ld (DivSMC),a
  792.     or a,a \ sbc hl,hl
  793.     ld l,d ; DEh
  794.     ld a,e
  795.     rla \ adc hl,hl \ sbc hl,bc \ jr nc,$+3 \ add hl,bc
  796.     rla \ adc hl,hl \ sbc hl,bc \ jr nc,$+3 \ add hl,bc
  797.     rla \ adc hl,hl \ sbc hl,bc \ jr nc,$+3 \ add hl,bc
  798.     rla \ adc hl,hl \ sbc hl,bc \ jr nc,$+3 \ add hl,bc
  799.     rla \ adc hl,hl \ sbc hl,bc \ jr nc,$+3 \ add hl,bc
  800.     rla \ adc hl,hl \ sbc hl,bc \ jr nc,$+3 \ add hl,bc
  801.     rla \ adc hl,hl \ sbc hl,bc \ jr nc,$+3 \ add hl,bc
  802.     rla \ adc hl,hl \ sbc hl,bc \ jr nc,$+3 \ add hl,bc
  803.     rla \ cpl \ ld d,a
  804.     ld a,e
  805.     rla \ adc hl,hl \ sbc hl,bc \ jr nc,$+3 \ add hl,bc
  806.     rla \ adc hl,hl \ sbc hl,bc \ jr nc,$+3 \ add hl,bc
  807.     rla \ adc hl,hl \ sbc hl,bc \ jr nc,$+3 \ add hl,bc
  808.     rla \ adc hl,hl \ sbc hl,bc \ jr nc,$+3 \ add hl,bc
  809.     rla \ adc hl,hl \ sbc hl,bc \ jr nc,$+3 \ add hl,bc
  810.     rla \ adc hl,hl \ sbc hl,bc \ jr nc,$+3 \ add hl,bc
  811.     rla \ adc hl,hl \ sbc hl,bc \ jr nc,$+3 \ add hl,bc
  812.     rla \ adc hl,hl \ sbc hl,bc \ jr nc,$+3 \ add hl,bc
  813.     rla \ cpl \ ld e,a
  814. DivSMC:     or a,a
  815.     ret nc
  816.     or a,a \ sbc hl,hl
  817.     sbc hl,de
  818.     ex de,hl
  819.     ret
  820.  
  821. ; }
  822.  
  823. ; AbsDE/AbsBC - Untested {
  824.  
  825. ; Result in DE
  826. ; HL is returned zero
  827. ; S flag is set to opposite of input sign
  828. AbsDE:
  829.     or a,a
  830.     sbc hl,hl
  831.     sbc hl,de
  832.     ret m ; If ( 0 - DE ) is negative, then DE is positive (so return)
  833.     ex de,hl
  834.     ret
  835.  
  836. AbsBC:
  837.     or a,a
  838.     sbc hl,hl
  839.     sbc hl,bc
  840.     ret m ; If ( 0 - BC ) is negative, then BC is positive (so return)
  841.     push hl \ pop bc
  842.     ret
  843.  
  844. ITextureMlt8:
  845. ; do c times a, c is signed, a is unsigned
  846.     ld  h, c
  847.     ld  l, a
  848.     mlt hl
  849.     bit 7, c
  850.     ret z
  851. ; substract A*256 from HL
  852.     ld  bc, 0
  853.     ld  b, a
  854.     sbc hl, bc
  855.     ret
  856. ITextureMlt16:
  857. ; do hl times a, hl is signed, a unsigned
  858.     ex  de, hl
  859.     ld  h, a
  860.     ld  l, d
  861.     mlt hl
  862.     bit 7, d
  863.     ld  d, a
  864.     jr  z, $+5
  865.     ld  a, h
  866.     sub d
  867.     ld  h, a
  868.     slhl
  869.     mlt de
  870.     add hl, de
  871.     ret
  872. ITextureIntegerPack:
  873. ITextureMlt0=$+1
  874.     ld  l, 0
  875.     mlt hl
  876.     ld  e, d
  877.     ld  d, 0
  878.     bit 6, c        ; dv
  879.     jr  z, ITextureIntegerCorrect
  880.     push    de
  881.     or  a, a
  882.     ex  de, hl
  883.     sbc hl, hl
  884.     sbc hl, de
  885.     pop de
  886. ITextureIntegerCorrect:
  887.     bit 7, c
  888.     jr  z, ITextureAddUV
  889.     or  a, a
  890.     sbc hl, de
  891.     ret
  892. ITextureAddUV:
  893.     add hl, de
  894.     ret
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement