Guest User

Untitled

a guest
Sep 11th, 2015
139
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. ; id2=hl, stack-1=id1
  2.     ld  e, (hl)
  3.     inc hl
  4.     ld  d, (hl)
  5. ; D=id2, E=id1
  6.     ld  hl, (gVertexID)
  7.     ld  l, d
  8.     ld  b, (hl)
  9.     ld  l, e
  10.     ld  a, (hl)
  11. ; B code of point1, C code of point2
  12.     or  b
  13.     and %00111111
  14.     jr  nz, _gStartPrimitiveClip
  15.     ld  a, (hl)
  16.     xor $80
  17.     jp  p, _gCacheMiss0
  18. ; fetch p0
  19.     ld  a, b
  20.     dec h
  21.     ld  b, (hl)
  22.     dec h
  23.     ld  c, (hl)
  24.     ld  (gLineX0), bc
  25.     ld  l, d
  26.     xor $80
  27.     jp  p, _gCacheMiss1
  28. _gCacheHit1:
  29. ; fetch p1
  30.     ld  e, (hl)
  31.     inc h
  32.     ld  d, (hl)
  33.     ld  (gLineX1), de
  34.     ld  hl, gPRIMITIVE_CLIPPED
  35.     ret
  36. _gCacheMiss0:
  37.     ld  e, b
  38.     push    de
  39.     push    hl
  40.     ld  (hl), a
  41.     inc h
  42.     ld  e, (hl)
  43.     inc h
  44.     ld  d, (hl)
  45.     inc h
  46.     ld  c, (hl)
  47.     inc h
  48.     ld  b, (hl)
  49.     inc h
  50.     ld  a, (hl)
  51.     inc h
  52.     ld  l, (hl)
  53.     ld  h, a
  54.     or  a
  55. .db $40 \ .db gProjectEntry \ .org $-2
  56.     call    gProject
  57.     ex  de, hl
  58.     pop hl
  59.     dec h
  60.     ld  (hl), d
  61.     dec h
  62.     ld  (hl), e
  63.     ld  (gLineX0), de
  64.     pop de
  65.     ld  l, d
  66.     ld  a, e
  67.     xor $80
  68.     jp  m, _gCacheHit1
  69. _gCacheMiss1:
  70.     push    hl
  71.     inc h \ inc h
  72.     ld  (hl), a
  73.     inc h
  74.     ld  e, (hl)
  75.     inc h
  76.     ld  d, (hl)
  77.     inc h
  78.     ld  c, (hl)
  79.     inc h
  80.     ld  b, (hl)
  81.     inc h
  82.     ld  a, (hl)
  83.     inc h
  84.     ld  l, (hl)
  85.     ld  h, a
  86.     or  a
  87. .db $40 \ .db gProjectEntry \ .org $-2
  88.     call    gProject
  89.     ex  de, hl
  90.     pop hl
  91.     ld  (hl), e
  92.     inc h
  93.     ld  (hl), d
  94.     ld  (gLineX1), de
  95.     ld  hl, gPRIMITIVE_CLIPPED
  96.     ret
  97. #comment
  98. ; load L1 cache
  99.     dec h
  100.     ld  b, (hl)
  101.     dec h
  102.     ld  c, (hl)
  103.     ld  (gLineX0), bc
  104.     ld  l, d
  105.     ld  e, (hl)
  106.     inc h
  107.     ld  d, (hl)
  108.     ld  (gLineX1), de
  109.     ld  hl, gPRIMITIVE_CLIPPED
  110.     ret
  111. #endcomment
  112. _gDiscardPrimitive:
  113. ; set primitive as CULLED
  114.     ld  hl, gPRIMITIVE_CULLED
  115. ; ret point to call of 'gClipVector'
  116.     ret
  117. _gStartPrimitiveClip:
  118.     ld  a, (hl)
  119.     and b
  120.     and %00111111
  121.     jr  nz, _gDiscardPrimitive
  122.     ld  (gClipVertexID), de
  123. ; load cache
  124.     inc h
  125. ; load first vertex
  126.     ld  c, (hl)
  127.     inc h
  128.     ld  b, (hl)
  129.     ld  (gClipCoordX1), bc
  130.     inc h
  131.     ld  c, (hl)
  132.     inc h
  133.     ld  b, (hl)
  134.     ld  (gClipCoordY1), bc
  135.     inc h
  136.     ld  b, (hl)
  137.     inc h
  138.     ld  c, (hl)
  139.     ld  (gClipCoordZ1), bc
  140. ; load second vertex
  141.     ld  l, d
  142. ; load bc to de
  143.     ld  c, (hl)
  144.     dec h
  145.     ld  b, (hl)
  146.     ld  (gClipCoordZ2), bc
  147.     dec h
  148.     ld  b, (hl)
  149.     dec h
  150.     ld  c, (hl)
  151.     ld  (gClipCoordY2), bc
  152.     dec h
  153.     ld  b, (hl)
  154.     dec h
  155.     ld  c, (hl)
  156.     ld  (gClipCoordX2), bc
  157. ; initialise linear interpolation factor
  158.     ld  hl, 255
  159.     ld  (gLRPFactor1), hl
  160. ; clip against Z = 1
  161.     ld  de, (gClipCoordZ1)
  162.     dec de
  163.     ld  hl, (gClipCoordZ2)
  164.     dec hl
  165.     ld  a, h
  166.     or  d
  167.     call    m, _gClipPlane
  168. ; clip against Y down plane
  169.     ld  de, (gClipCoordY1)
  170.     ld  h, d
  171.     ld  l, e
  172.     add hl, hl
  173.     add hl, de
  174.     sra h \ rr l
  175.     ex  de, hl
  176.     ld  hl, (gClipCoordZ1)
  177.     or  a
  178.     sbc hl, de
  179.     ex  de, hl
  180.     ld  bc, (gClipCoordY2)
  181.     ld  h, b
  182.     ld  l, c
  183.     add hl, hl
  184.     add hl, bc
  185.     sra h \ rr l
  186.     ld  b, h
  187.     ld  c, l
  188.     ld  hl, (gClipCoordZ2)
  189.     or  a
  190.     sbc hl, bc
  191.     ld  a, h
  192.     or  d
  193.     call    m, _gClipPlane
  194. ; clip against Y up plane
  195.     ld  de, (gClipCoordY1)
  196.     ld  h, d
  197.     ld  l, e
  198.     add hl, hl
  199.     add hl, de
  200.     sra h \ rr l
  201.     ex  de, hl
  202.     ld  hl, (gClipCoordZ1)
  203.     add hl, de
  204.     ex  de, hl
  205. ;   ld  bc, (gClipCoordY2)
  206. ;   ld  h, b
  207. ;   ld  l, c
  208. ;   add hl, hl
  209. ;   add hl, bc
  210. ;   sra h \ rr l
  211. ;   ld  b, h
  212. ;   ld  c, l
  213.     ld  hl, (gClipCoordZ2)
  214.     add hl, bc
  215.     ld  a, h
  216.     or  d
  217.     call    m, _gClipPlane
  218. ; clip against right X plane
  219.     ld  hl, (gClipCoordZ1)
  220.     ld  de, (gClipCoordX1)
  221.     or  a
  222.     sbc hl, de
  223.     ex  de, hl
  224.     ld  hl, (gClipCoordZ2)
  225.     ld  bc, (gClipCoordX2)
  226.     or  a
  227.     sbc hl, bc
  228.     ld  a, h
  229.     or  d
  230.     call    m, _gClipPlane
  231. ; clip against left X plane
  232.     ld  hl, (gClipCoordZ1)
  233.     ld  de, (gClipCoordX1)
  234.     add hl, de
  235.     ex  de, hl
  236.     ld  hl, (gClipCoordZ2)
  237. ;   ld  bc, (gClipCoordX2)
  238.     add hl, bc
  239.     ld  a, h
  240.     or  d
  241.     call    m, _gClipPlane
  242. ; line primitive as been clipped
  243. ; calculate intersection point & screen coordinate
  244. ; brutal approch - optimization is possible by applying LRP only on neccesary value & so as projection
  245. _gOddCheck:
  246. ; factor1>factor2
  247.     ld  hl, (gLRPFactor1)
  248.     ld  a, l
  249.     cp  h
  250.     jp  c, _gDiscardPrimitiveS0
  251. ; factor 1
  252. _gApplyLRP1:
  253.     inc a
  254.     jp  z, _gNoLRP1
  255.     dec a
  256.     call    _gCalculate2DCoord
  257.     ld  (gLineX0), hl
  258. _gApplyLRP2:
  259.     ld  a, (gLRPFactor2)
  260.     or  a
  261.     jp  z, _gNoLRP2
  262.     call    _gCalculate2DCoord
  263.     ld  (gLineX1), hl
  264.     ex  de, hl
  265.     ld  hl, gPRIMITIVE_CLIPPED
  266.     ret
  267. _gNoLRP1:
  268. ; fetch raster coordinate
  269.     ld  hl, (gVertexID)
  270.     ld  a, (gClipVertexID1)
  271.     ld  l, a
  272.     ld  a, (hl)
  273.     xor $80
  274.     jp  m, _gCacheHitLRP1
  275.     ld  (hl), a
  276.     push    hl
  277.     inc h
  278.     ld  e, (hl)
  279.     inc h
  280.     ld  d, (hl)
  281.     inc h
  282.     ld  c, (hl)
  283.     inc h
  284.     ld  b, (hl)
  285.     inc h
  286.     ld  a, (hl)
  287.     inc h
  288.     ld  l, (hl)
  289.     ld  h, a
  290.     or  a
  291. .db $40 \ .db gProjectEntry \ .org $-2
  292.     call    gProject
  293.     ex  de, hl
  294.     pop hl 
  295.     dec h
  296.     ld  (hl), d
  297.     dec h
  298.     ld  (hl), e
  299.     ld  (gLineX0), de
  300.     jp  _gApplyLRP2
  301. _gCacheHitLRP1:
  302.     dec h
  303.     ld  d, (hl)
  304.     dec h
  305.     ld  e, (hl)
  306.     ld  (gLineX0), de
  307.     jp  _gApplyLRP2
  308. _gNoLRP2:
  309. ; fecth raster coordinate
  310.     ld  hl, (gVertexID)
  311.     ld  a, (gClipVertexID2)
  312.     ld  l, a
  313.     ld  a, (hl)
  314.     xor $80
  315.     jp  m, _gCacheHitLRP2
  316.     ld  (hl), a
  317.     push    hl
  318.     inc h
  319.     ld  e, (hl)
  320.     inc h
  321.     ld  d, (hl)
  322.     inc h
  323.     ld  c, (hl)
  324.     inc h
  325.     ld  b, (hl)
  326.     inc h
  327.     ld  a, (hl)
  328.     inc h
  329.     ld  l, (hl)
  330.     ld  h, a
  331.     or  a
  332. .db $40 \ .db gProjectEntry \ .org $-2
  333.     call    gProject
  334.     ex  de, hl
  335.     pop hl 
  336.     dec h
  337.     ld  (hl), d
  338.     dec h
  339.     ld  (hl), e
  340.     ld  (gLineX1), de  
  341.     ld  hl, gPRIMITIVE_CLIPPED
  342.     ret
  343. _gCacheHitLRP2:
  344.     dec h
  345.     ld  d, (hl)
  346.     dec h
  347.     ld  e, (hl)
  348.     ld  (gLineX1), de
  349.     ld  hl, gPRIMITIVE_CLIPPED
  350.     ret
  351. _gCalculate2DCoord:
  352. ; xi=(x1-x2)*C+x2
  353. ; yi=(y1-y2)*C+y2
  354. ; zi=(z1-z2)*C+z2
  355. ; project
  356.     ld  hl, (gClipCoordX1)
  357.     ld  de, (gClipCoordX2)
  358.     call    _gLRPMul
  359.     push    hl
  360.     ld  hl, (gClipCoordY1)
  361.     ld  de, (gClipCoordY2)
  362.     call    _gLRPMul
  363.     push    hl
  364.     ld  hl, (gClipCoordZ1)
  365.     ld  de, (gClipCoordZ2)
  366.     call    _gLRPMul
  367.     pop bc
  368.     pop de
  369.     ld  a, h
  370.     or  a
  371. #ifdef  gCOMPILE_AXM
  372. .db $40 \ .db gProjectEntry \ .org $-2
  373.     jp  gProject
  374. #else
  375.     jp  gProjectEntry
  376. #endif
  377. _gDiscardPrimitiveS2:
  378. ; quit one stack level
  379.     pop af
  380. _gDiscardPrimitiveS1:
  381. ; quit the 'call' stack level
  382.     pop af
  383. _gDiscardPrimitiveS0:
  384. ; set primitive as CULLED
  385.     ld  hl, gPRIMITIVE_CULLED
  386. ; ret point to call of 'gClipVector'
  387.     ret
  388. _gClipPlane:
  389. ; clip a line against a plane
  390. ; advance either LRP1 or LRP2 based on 'out' point.
  391. ; xx T-States & discard if totally 'out'
  392. ; xx T-States if both point are in the plane
  393. ; ~600 T-States if line is clipped
  394. ; factor=hl/(hl-de) [D2/(D2-D1)]
  395. ; 'out' check (to remove)
  396.     ld  a, h
  397.     and d
  398.     jp  m, _gDiscardPrimitiveS1
  399. ; point classification
  400.     push    hl
  401.     sbc hl, de
  402.     jr  z, _gDiscardPrimitiveS2
  403.     ex  de, hl
  404.     pop hl
  405.     jp  m, _gFindLRPFactor2
  406. _gFindLRPFactor1:
  407. ; check outbound intersection
  408.     or  a
  409.     sbc hl, de
  410.     add hl, de
  411.     jr  nc, _gDiscardPrimitiveS1
  412.     call    _gLRPDivide
  413. ; minimize the factor
  414.     ld  hl, gLRPFactor1
  415.     cp  (hl)
  416.     ret nc
  417.     ld  (hl), a
  418.     ret
  419. _gFindLRPFactor2:
  420. ; check outbound intersection
  421.     or  a
  422.     sbc hl, de
  423.     add hl, de
  424.     jr  c, _gDiscardPrimitiveS1
  425. ; negate HL and DE
  426.     xor a
  427.     sub l
  428.     ld  l, a
  429.     sbc a, a
  430.     sub h
  431.     ld  h, a
  432.     xor a
  433.     sub e
  434.     ld  e, a
  435.     sbc a, a
  436.     sub d
  437.     ld  d, a
  438.     call    _gLRPDivide
  439. ; maximize the factor
  440.     ld  hl, gLRPFactor2
  441.     cp  (hl)
  442.     ret c
  443.     ld  (hl), a
  444.     ret
  445. _gLRPDivide:
  446. ; H.L/D.E->0.A
  447. ; From 339 to 381 T-States
  448. _gDivLoop:
  449.     add hl,hl \ sbc hl,de \ jr nc,$+3 \ add hl,de \ adc a,a
  450.     add hl,hl \ sbc hl,de \ jr nc,$+3 \ add hl,de \ adc a,a
  451.     add hl,hl \ sbc hl,de \ jr nc,$+3 \ add hl,de \ adc a,a
  452.     add hl,hl \ sbc hl,de \ jr nc,$+3 \ add hl,de \ adc a,a
  453.     add hl,hl \ sbc hl,de \ jr nc,$+3 \ add hl,de \ adc a,a
  454.     add hl,hl \ sbc hl,de \ jr nc,$+3 \ add hl,de \ adc a,a
  455.     add hl,hl \ sbc hl,de \ jr nc,$+3 \ add hl,de \ adc a,a
  456.     add hl,hl \ sbc hl,de \ adc a,a
  457.     cpl
  458.     ret
  459. _gLRPMul:
  460. ; (HL-DE)xA/256+DE
  461. ; keep DE,A intact
  462. ; destroy BC
  463. ; result is HL
  464.     or  a
  465.     sbc hl, de
  466.     ld  b, h
  467.     ld  c, l
  468.     ld  hl, 0
  469.     rrca \ jr nc, $+8
  470.     ld  h, b
  471.     ld  l, c
  472.     sra     h
  473.     rr  l
  474.     rrca \ jr nc, $+3 \ add hl, bc \ sra h \ rr l
  475.     rrca \ jr nc, $+3 \ add hl, bc \ sra h \ rr l
  476.     rrca \ jr nc, $+3 \ add hl, bc \ sra h \ rr l
  477.     rrca \ jr nc, $+3 \ add hl, bc \ sra h \ rr l
  478.     rrca \ jr nc, $+3 \ add hl, bc \ sra h \ rr l
  479.     rrca \ jr nc, $+3 \ add hl, bc \ sra h \ rr l
  480.     rrca \ jr nc, $+3 \ add hl, bc \ sra h \ rr l
  481.     adc hl, de
  482.     ret
Advertisement
Add Comment
Please, Sign In to add comment