Advertisement
matrefeytontias

ThreeDee z80 ASM 3D engine

Nov 13th, 2016
410
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. ;#SECTION "EQUS", HEADER
  2.  
  3. OBJECT_DOT equ  0
  4. OBJECT_LINK equ 1
  5. OBJECT_TRI equ  2
  6. OBJECT_MODEL equ    3
  7. ;#SECTION "MAIN", CODE
  8.  
  9. ; Inputs: b = X angle
  10. ; c= Y angle
  11. BuildMatrix:
  12. ; AX = cos(c)
  13.     ld  a, c
  14.     call    getCos
  15.     ld  (AX), a
  16. ; AY = 0
  17.     xor a
  18.     ld  (AY), a
  19. ; AZ = sin(c)
  20.     ld  a, c
  21.     call    getSin
  22.     ld  (AZ), a
  23. ; BX =
  24. ; (cos(b-c)-cos(b+c))/2
  25.     ld  a, b
  26.     add a, c
  27.     call    getCos
  28.     ld  d, a
  29.     ld  a, b
  30.     sub c
  31.     call    getCos
  32.     sub d
  33.     sra a
  34.     ld  (BX), a
  35. ; BY = cos(b)
  36.     ld  a, b
  37.     call    getCos
  38.     ld  (BY), a
  39. ; BZ =
  40. ; (-sin(b-c)-sin(b+c))/2
  41.     ld  a, b
  42.     add a, c
  43.     call    getSin
  44.     ld  d, a
  45.     ld  a, b
  46.     sub c
  47.     call    getSin
  48.     neg
  49.     sub d
  50.     sra a
  51.     ld  (BZ), a
  52. ; CX = (sin(b-c)-sin(b+c))/2
  53.     ld  a, b
  54.     add a, c
  55.     call    getSin
  56.     ld  d, a
  57.     ld  a, b
  58.     sub c
  59.     call    getSin
  60.     sub d
  61.     sra a
  62.     ld  (CX), a
  63. ; CY = sin(b)
  64.     ld  a, b
  65.     call    getSin
  66.     ld  (CY), a
  67. ; CZ =
  68. ; (cos(b-c)+cos(b+c))/2
  69.     ld  a, b
  70.     add a, c
  71.     call    getCos
  72.     ld  d, a
  73.     ld  a, b
  74.     sub c
  75.     call    getCos
  76.     add a, d
  77.     sra a
  78.     ld  (CZ), a
  79.     ret
  80.  
  81. ; Inputs: inX,Y,Z
  82. ; Output: outX,Y,Z
  83. ApplyMatrix:
  84. ; X = X[0,0]+Y[0,1]+Z[0,2]
  85.     ld  hl, (inX)
  86.     ld  a, (AX)
  87.     call    multHL_A
  88.     push    hl
  89.     ld  hl, (inY)
  90.     ld  a, (AY)
  91.     call    multHL_A
  92.     push    hl
  93.     ld  hl, (inZ)
  94.     ld  a, (AZ)
  95.     call    multHL_A
  96.     pop de
  97.     add hl, de
  98.     pop de
  99.     add hl, de
  100.     call    divHL64
  101.     ld  (outX), hl
  102. ; Y = X[1,0]+Y[1,1]+Z[1,2]
  103.     ld  hl, (inX)
  104.     ld  a, (BX)
  105.     call    multHL_A
  106.     push    hl
  107.     ld  hl, (inY)
  108.     ld  a, (BY)
  109.     call    multHL_A
  110.     push    hl
  111.     ld  hl, (inZ)
  112.     ld  a, (BZ)
  113.     call    multHL_A
  114.     pop de
  115.     add hl, de
  116.     pop de
  117.     add hl, de
  118.     call    divHL64
  119.     ld  (outY), hl
  120. ; Z = X[2,0]+Y[2,1]+Z[2,2]
  121.     ld  hl, (inX)
  122.     ld  a, (CX)
  123.     call    multHL_A
  124.     push    hl
  125.     ld  hl, (inY)
  126.     ld  a, (CY)
  127.     call    multHL_A
  128.     push    hl
  129.     ld  hl, (inZ)
  130.     ld  a, (CZ)
  131.     call    multHL_A
  132.     pop de
  133.     add hl, de
  134.     pop de
  135.     add hl, de
  136.     call    divHL64
  137.     ld  (outZ), hl
  138.     ret
  139.  
  140. ; Inputs: outX,Y,Z
  141. ; Outputs: outX,Y
  142. ProjectVertex:
  143. ; outX=outX*64/outZ+48
  144.     ld  hl, (outX)
  145.     call    mulHL64
  146.     ld  de, (outZ)
  147.     call    HLsignedDivDE
  148.     ld  de, 48
  149.     add hl, de
  150.     ld  (outX), hl
  151. ; outY=outY*64/outZ+32
  152.     ld  hl, (outY)
  153.     call    mulHL64
  154.     ld  de, (outZ)
  155.     call    HLsignedDivDE
  156.     ld  de, 32
  157.     ex  de, hl
  158.     or  a
  159.     sbc hl, de
  160.     ld  (outY), hl
  161.     ret
  162.  
  163. ; Inputs:
  164. ;   a = object type
  165. ;   b = render mode if needed
  166. ;      doesn't matter else
  167. ;   hl = offset or pointer to offsets
  168. pushObject:
  169.     ex  de, hl
  170.     ld  hl, (stackPtr)
  171.     ld  (hl), a
  172.     inc hl
  173.     ld  (hl), b
  174.     inc hl
  175.     ld  (hl), e
  176.     inc hl
  177.     ld  (hl), d
  178.     inc hl
  179.     ld  (stackPtr), hl
  180.     ret
  181.  
  182. renderObjects:
  183.     ld  hl, (stackBottom)
  184. renderObjects_loop:
  185.     push    hl
  186.     ld  a, (hl)
  187.     cp  OBJECT_LINK
  188.     jp  z, renderObjects_link
  189.     cp  OBJECT_TRI
  190.     jp  z, renderObjects_tri
  191.     cp  OBJECT_MODEL
  192.     jp  z, renderObjects_model
  193. renderObjects_dot:
  194.     inc hl
  195.     inc hl
  196.     ld  e, (hl)
  197.     inc hl
  198.     ld  d, (hl)
  199.     ld  l, e
  200.     ld  h, d
  201.     add hl, hl
  202.     add hl, hl
  203.     add hl, de
  204.     ld  (temp1), hl
  205.     ld  (temp2), de
  206.     ld  de, (saveVertices)
  207.     add hl, de
  208.     xor a
  209.     cp  (hl)
  210.     jr  nz, vertexDone
  211. ;
  212.     ld  hl, (temp1)
  213.     ld  de, (temp2)
  214.     add hl, de
  215.     ld  de, (currentVertices)
  216.     add hl, de
  217.     ld  de, inX
  218.     ld  bc, 6
  219.     ldir
  220.     call    ApplyMatrix
  221.     ld  hl, (outZ)
  222.     ld  de, 180
  223.     add hl, de
  224.     bit 7, h
  225.     jr  nz, skipDisplay
  226.     ld  (outZ), hl
  227.     call    ProjectVertex
  228.     ld  hl, (temp1)
  229.     ld  de, (saveVertices)
  230.     add hl, de
  231.     ld  (hl), 1
  232.     inc hl
  233.     ld  de, outX
  234.     ex  de, hl
  235.     ld  bc, 4
  236.     ldir
  237.     ld  hl, -5
  238.     add hl, de
  239. vertexDone:
  240.     inc hl
  241.     ld  a, (hl)
  242.     inc hl
  243.     inc hl
  244.     ld  l, (hl)
  245.     ld  h, a
  246.     call    pxlonhl
  247.     inc h
  248.     call    pxlonhl
  249.     inc l
  250.     call    pxlonhl
  251.     dec h
  252.     call    pxlonhl
  253. skipDisplay:
  254. renderObjects_link:
  255. renderObjects_tri:
  256. renderObjects_model:
  257.     pop hl
  258.     ld  de, 4
  259.     add hl, de
  260.     ld  de, (stackPtr)
  261.     or  a
  262.     sbc hl, de
  263.     add hl, de
  264.     ret z
  265.     jp  renderObjects_loop
  266.  
  267. clearStack:
  268.     ld  hl, (stackBottom)
  269.     ld  (stackPtr), hl
  270.     ret
  271.  
  272. multHL_DE:
  273.     ld  c, h
  274.     ld  a, l
  275.     ld  hl, 0
  276.     ld  b, 16
  277. multHL_DE_loop:
  278.     add hl, hl
  279.     rla
  280.     rl  c
  281.     jr  nc, multHL_DE_skip
  282.     add hl, de
  283.     adc a, 0
  284.     jr  nc, multHL_DE_skip
  285.     inc c
  286. multHL_DE_skip:
  287.     djnz    multHL_DE_loop
  288.     ret
  289.  
  290. divHL64:
  291.     sra h
  292.     rr  l
  293.     sra h
  294.     rr  l
  295.     sra h
  296.     rr  l
  297.     sra h
  298.     rr  l
  299.     sra h
  300.     rr  l
  301.     sra h
  302.     rr  l
  303.     ret
  304.  
  305. mulHL64:
  306.     add hl, hl
  307.     add hl, hl
  308.     add hl, hl
  309.     add hl, hl
  310.     add hl, hl
  311.     add hl, hl
  312.     ret
  313.  
  314. AextendSignDE:
  315.     ld  e, a
  316.     rlca
  317.     sbc a, a
  318.     ld  d, a
  319.     ret
  320.  
  321. getSin:
  322.     sub 64
  323. getCos:
  324.     push    hl
  325.     push    de
  326.     ld  hl, cosLUT
  327.     ld  e, a
  328.     ld  d, 0
  329.     add hl, de
  330.     ld  a, (hl)
  331.     pop de
  332.     pop hl
  333.     ret
  334.  
  335. ; scale = 64
  336. cosLUT:
  337.     db  64, 63, 63, 63, 63, 63, 63, 63, 62, 62, 62, 61, 61, 60, 60, 59
  338.     db  59, 58, 57, 57, 56, 55, 54, 54, 53, 52, 51, 50, 49, 48, 47, 46
  339.     db  45, 44, 42, 41, 40, 39, 38, 36, 35, 34, 32, 31, 30, 28, 27, 25
  340.     db  24, 23, 21, 20, 18, 17, 15, 14, 12, 10, 9, 7, 6, 4, 3, 1
  341.     db  0, -1, -3, -4, -6, -7, -9, -10, -12, -14, -15, -17, -18, -20, -21, -23
  342.     db  -24, -25, -27, -28, -30, -31, -32, -34, -35, -36, -38, -39, -40, -41, -42, -44
  343.     db  -45, -46, -47, -48, -49, -50, -51, -52, -53, -54, -54, -55, -56, -57, -57, -58
  344.     db  -59, -59, -60, -60, -61, -61, -62, -62, -62, -63, -63, -63, -63, -63, -63, -63
  345.     db  -64, -63, -63, -63, -63, -63, -63, -63, -62, -62, -62, -61, -61, -60, -60, -59
  346.     db  -59, -58, -57, -57, -56, -55, -54, -54, -53, -52, -51, -50, -49, -48, -47, -46
  347.     db  -45, -44, -42, -41, -40, -39, -38, -36, -35, -34, -32, -31, -30, -28, -27, -25
  348.     db  -24, -23, -21, -20, -18, -17, -15, -14, -12, -10, -9, -7, -6, -4, -3, -1
  349.     db  0, 1, 3, 4, 6, 7, 9, 10, 12, 14, 15, 17, 18, 20, 21, 23
  350.     db  24, 25, 27, 28, 30, 31, 32, 34, 35, 36, 38, 39, 40, 41, 42, 44
  351.     db  45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 54, 55, 56, 57, 57, 58
  352.     db  59, 59, 60, 60, 61, 61, 62, 62, 62, 63, 63, 63, 63, 63, 63, 63
  353. AX:
  354.     db  0
  355. AY:
  356.     db  0
  357. AZ:
  358.     db  0
  359. BX:
  360.     db  0
  361. BY:
  362.     db  0
  363. BZ:
  364.     db  0
  365. CX:
  366.     db  0
  367. CY:
  368.     db  0
  369. CZ:
  370.     db  0
  371. inX:
  372.     dw  0
  373. inY:
  374.     dw  0
  375. inZ:
  376.     dw  0
  377. outX:
  378.     dw  0
  379. outY:
  380.     dw  0
  381. outZ:
  382.     dw  0
  383. ;#SECTION "MATHS", CODE
  384.  
  385. HLsignedDivDE:
  386.     ld  c, e
  387.     ld  b, d
  388.     ld  a, h
  389.     xor b
  390.     push    af
  391.     xor b
  392.     jp  p, $ + 9
  393.     xor a
  394.     sub l
  395.     ld  l, a
  396.     sbc a, a
  397.     sub h
  398.     ld  h, a
  399.     bit 7, b
  400.     jr  z, $ + 8
  401.     xor a
  402.     sub c
  403.     ld  c, a
  404.     sbc a, a
  405.     sub b
  406.     ld  b, a
  407. ;
  408.     ld  de, 0
  409.     adc hl, hl
  410.     jr  z, divDone
  411.     ld  a, 16
  412.     add hl, hl
  413.     dec a
  414.     jr  nc, $ - 2
  415.     ex  de, hl
  416.     jp  jumpin
  417.  
  418. l1:
  419.     add hl, bc
  420. l2:
  421.     dec a
  422.     jr  z, divDone
  423.     sla e
  424.     rl  d
  425. jumpin:
  426.     adc hl, hl
  427.     sbc hl, bc
  428.     jr  c, l1
  429.     inc e
  430.     jp  l2
  431.  
  432. divDone:
  433. ;
  434.     pop af
  435.     ex  de, hl
  436.     ret p
  437.     xor a
  438.     sub l
  439.     ld  l, a
  440.     sbc a, a
  441.     sub h
  442.     ld  h, a
  443.     ret
  444.  
  445. ;
  446. multHL_A:
  447.     ex  de, hl
  448.     ld  hl, 0
  449.     or  a
  450.     jp  p, $ + 5
  451.     sbc hl, de
  452.     ld  b, 8
  453. multHL_A_loop:
  454.     add hl, hl
  455.     rla
  456.     jr  nc, $ + 5
  457.     add hl, de
  458.     adc a, 0
  459.     djnz    multHL_A_loop
  460.     ret
  461.  
  462. ;#SECTION "LABELS", FOOTER
  463.  
  464. stackBottom:
  465.     dw  0
  466. stackPtr:
  467.     dw  0
  468. currentVertices:
  469.     dw  0
  470. saveVertices:
  471.     dw  0
  472. temp1:
  473.     dw  0
  474. temp2:
  475.     dw  0
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement