MMBC

IRasterTriangle + RAM Clear

Sep 9th, 2017
187
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. .nolist
  2. #include "ti84pce.inc"
  3. .list
  4.  
  5.     .org UserMem-2
  6.     .db tExtTok,tAsm84CeCmp
  7.    
  8.     call _RunIndicOff
  9.     call CopyHL1555Palette
  10.    
  11.     ld hl, vRam
  12.     ld de, vRam+1
  13.     ld bc, 320*240-1
  14.     ld (hl), 0
  15.     ldir
  16.    
  17.     ld a, $27
  18.     ld ($E30018), a
  19.    
  20.     ld hl, tc1
  21.     ld (hl), 0
  22.     inc hl
  23.     ld bc, 20
  24.     ld (hl), bc
  25.    
  26.     ld hl, tc2
  27.     ld (hl), 15
  28.     inc hl
  29.     ld bc, 0
  30.     ld (hl), bc
  31.    
  32.     ld hl, tc3
  33.     ld (hl), 25
  34.     inc hl
  35.     ld bc, 35
  36.     ld (hl), bc
  37.    
  38.     ld hl, tc1
  39.     ld bc, tc2
  40.     ld de, tc3
  41.     ld a, $34
  42.     call IRasterTriangle
  43.    
  44.     call _GetKey
  45.    
  46.     ld a, $2D
  47.     ld ($E30018), a
  48.    
  49.     call _RunIndicOn
  50.     call _DrawStatusBar
  51.     call _ClrScrnFull
  52.    
  53.     ret
  54.  
  55. CopyHL1555Palette:
  56.     ld hl,$E30200               ; palette mem
  57.     ld b,0
  58. _cp1555loop:
  59.     ld d,b
  60.     ld a,b
  61.     and %11000000
  62.     srl d
  63.     rra
  64.     ld e,a
  65.     ld a,%00011111
  66.     and b
  67.     or e
  68.     ld (hl),a
  69.     inc hl
  70.     ld (hl),d
  71.     inc hl
  72.     inc b
  73.     jr nz,_cp1555loop
  74.     ret
  75.  
  76. tc1:
  77.     .db 0
  78.     .dl 0
  79. tc2:
  80.     .db 0
  81.     .dl 0
  82. tc3:
  83.     .db 0
  84.     .dl 0
  85.  
  86. #define IRIS_fine_pxlcoverage
  87. #define IFramebuffer        $E30014
  88.    
  89. IRasterTriangle:
  90. ;.org   IVRAM
  91.     ld  (IRasterRBG8), a
  92.  
  93.     ld  a, (de)
  94.     sub a, (hl)
  95.     jr  c, IRasterSwap0
  96.     ex  de, hl
  97. IRasterSwap0:
  98.     ld  a, (bc)
  99.     sub a, (hl)
  100.     jr  nc, IRasterSwap1
  101.     push    hl
  102.     or  a, a
  103.     sbc hl, hl
  104.     add hl, bc
  105.     pop bc
  106. IRasterSwap1:
  107.     ld  a, (de)
  108.     sub a, (hl)
  109.     jr  nc, IRasterSwap2
  110.     ex  de, hl
  111. IRasterSwap2:
  112.  
  113.     ld  a, (bc)
  114.     sub (hl)
  115.     ret z
  116. #ifdef  IRIS_fine_pxlcoverage
  117.     ld  ix, $FF0000
  118.     ld  iy, $FF0000
  119.     ld  ixl, a
  120.     neg
  121.     ld  (IDeltaY0), a
  122. ; x1-x0
  123.     ld  a, (de)
  124.     ld  (IValueY1), a
  125.     sub (hl)
  126.     push    af
  127.     ld  iyl, a
  128.     neg
  129.     ld  (IDeltaY1), a
  130. #else
  131.     ld  ix, $FFFFFF
  132.     ld  iy, $FFFFFF
  133.     neg
  134.     ld  (IDeltaY0), a
  135.     ld  ixl, a
  136. ; x1-x0
  137.     ld  a, (de)
  138.     ld  (IValueY1), a
  139.     sub (hl)
  140.     push    af
  141.     neg
  142.     ld  (IDeltaY1), a
  143.     ld  iyl, a
  144. #endif
  145.     ld  a, (hl)
  146.     push    af
  147.  
  148.     push    bc
  149.     inc hl
  150.     ld  bc, (hl)
  151.     ex  de, hl
  152.     inc hl
  153.     ld  hl, (hl)
  154.     ld  (IValueX1), hl
  155.     jr  z, IRasterNoEdgeWrite
  156.     ld  a, $13
  157.     or  a, a
  158.     sbc hl, bc
  159.     jr  nc, IRasterEdge1
  160. #ifndef IRIS_fine_pxlcoverage
  161.     ld  iyl, $FF
  162. #endif
  163.     or  a, $08
  164.     ex  de, hl
  165.     sbc hl, hl
  166.     sbc hl, de
  167. IRasterEdge1:
  168.     ld  (IDeltaX1), hl
  169.     ld  (ISMC_Code1), a
  170.  
  171. #ifdef  IRIS_fine_pxlcoverage
  172.     lea de, iy+0
  173.     add hl, de
  174.     ex  de, hl
  175.     sbc hl, hl
  176.     ccf
  177.     sbc hl, de
  178.     sra h
  179.     rr  l
  180.     ex  de, hl
  181.     ld  iyh, d
  182.     ld  iyl, e
  183. #endif
  184.  
  185. IRasterNoEdgeWrite:
  186.     pop hl
  187.  
  188. ; x2-x0
  189.     inc hl
  190.     ld  hl, (hl)
  191.     ld  (IValueX2), hl
  192.     ld  a, $23          ; inc hl
  193.     or  a, a
  194.     sbc hl, bc
  195. ; if x0>x1, edge goes to left
  196.     jr  nc, IRasterEdge0
  197. #ifndef IRIS_fine_pxlcoverage
  198.     ld  ixl, $FF
  199. #endif
  200.     or  a, $08          ; dec hl
  201. ; edge goes to left
  202.     ex  de, hl
  203.     sbc hl, hl
  204.     sbc hl, de
  205. IRasterEdge0:
  206.     ld  (IDeltaX0), hl
  207.     ld  (ISMC_Code0), a
  208.  
  209. #ifdef  IRIS_fine_pxlcoverage
  210.     lea de, ix+0
  211.     add hl, de
  212.     ex  de, hl
  213.     sbc hl, hl
  214.     ccf
  215.     sbc hl, de
  216.     sra h
  217.     rr  l
  218.     ex  de, hl
  219.     ld  ixh, d
  220.     ld  ixl, e
  221.  
  222. #endif
  223.  
  224.     pop hl
  225.     ld  l, 160
  226.     mlt hl
  227.     add hl, hl
  228.     add hl, bc
  229.     ld  de, (IFramebuffer)
  230.     add hl, de
  231.     ex  de, hl
  232.     sbc hl, hl
  233.     add hl, de
  234.  
  235.     pop af
  236.     call    nz, IRasterTriangleInner
  237.  
  238.     ld  a, (IDeltaY0) ; y2-y0
  239.     ld  c, a
  240.     ld  a, (IDeltaY1)
  241.     sub c
  242.     ret z
  243.     push    af
  244. #ifdef IRIS_fine_pxlcoverage
  245.     ld  iyl, a
  246.     neg
  247. #else
  248.     neg
  249.     ld  iyl, a
  250. #endif
  251.     ld  (IDeltaY1), a
  252.  
  253.     push    hl
  254.  
  255. IValueX2=$+1
  256.     ld  hl, $000000
  257. IValueX1=$+1
  258.     ld  bc, $000000
  259.     or  a, a
  260.     sbc hl, bc
  261.     ld  a, $13
  262. ; if x0>x1, edge goes to left
  263.     jr  nc, IRasterEdge2
  264. #ifndef IRIS_fine_pxlcoverage
  265.     ld  iyl, $FF
  266. #endif
  267.     or  a, $08
  268.     ex  de, hl
  269.     sbc hl, hl
  270.     sbc hl, de
  271. IRasterEdge2:
  272.     ld  (IDeltaX1), hl
  273.     ld  (ISMC_Code1), a
  274.  
  275. #ifdef  IRIS_fine_pxlcoverage
  276.     lea de, iy+0
  277.     ld  d, $00 ;compensate due to previous looping
  278.     add hl, de
  279.     ex  de, hl
  280.     sbc hl, hl 
  281.     sbc hl, de
  282.     dec hl
  283.     sra h
  284.     rr  l
  285.     ex  de, hl
  286.     ld  iyh, d
  287.     ld  iyl, e
  288. #endif
  289.  
  290. IValueY1=$+1
  291.     ld  l, $00
  292.     ld  h, 160
  293.     mlt hl
  294.     add hl, hl
  295.     add hl, bc
  296.     ld  de, (IFramebuffer)
  297.     add hl, de
  298.     ex  de, hl
  299.     pop hl
  300.  
  301. ;   ld  a, (IDeltaY1)
  302. ;   neg
  303.     pop af
  304. IRasterTriangleInner:
  305. IDeltaX0=$+1
  306.     ld  bc, $000000
  307.     add ix, bc
  308.     jr  nc, $+11
  309. IDeltaY0=$+1
  310.     ld  bc, $FFFF00
  311. ISMC_Code0=$
  312.     nop
  313.     add ix, bc
  314.     jr  c, $-3
  315.  
  316. IDeltaX1=$+1
  317.     ld  bc, $000000
  318.     add iy, bc
  319.     jr  nc, $+13
  320. IDeltaY1=$+1
  321.     ld  bc, $FFFF00
  322. ISMC_Code1=$
  323.     nop
  324.     add iy, bc
  325.     jr  c, $-3
  326.     inc.s   bc ;reset bcu set by restoring ld bc,$FFxxxx
  327.  
  328. ; hl = adress1, de = adress2
  329.     sbc hl, de
  330.     jr  c, IRasterInverted
  331.     jr  z, IRasterNoPixel
  332.     ld  b, h
  333.     ld  c, l
  334.  
  335.     ld  hl, IRasterRBG8
  336.     ldi
  337.     jp  po, IRasterContinue
  338.     scf
  339.     sbc hl, hl
  340.     add hl, de
  341.     push    hl
  342.     ldir
  343.     pop hl
  344.  
  345.     ld  c, 64
  346.     inc b
  347.     add hl, bc
  348.     ex  de, hl
  349.     add hl, bc
  350.     dec a
  351.     jr  nz,IRasterTriangleInner
  352.     ret
  353. IRasterContinue:
  354.     scf
  355.     sbc hl, hl
  356. IRasterNoPixel:
  357.     add hl, de
  358.     ld  bc, 320
  359.     add hl, bc
  360.     ex  de, hl
  361.     add hl, bc
  362.     dec a
  363.     jr  nz,IRasterTriangleInner
  364.     ret
  365. IRasterInverted:
  366.     add hl, de
  367. ; hl --- de
  368. IRasterRBG8=$+1
  369.     ld  (hl), $00
  370.     ex  de, hl
  371. ; carry is set
  372.     sbc hl, de
  373.     ld  b, h
  374.     ld  c, l
  375.     add hl, de
  376.     jr  z, IRasterSize1
  377.     push    de
  378.     sbc hl, hl
  379.     add hl, de
  380.     inc de
  381.     ldir
  382.     pop de
  383. IRasterSize1:
  384.     inc hl
  385.  
  386.     ld  c, 64
  387.     inc b
  388.     add hl, bc
  389.     ex  de, hl
  390.     add hl, bc
  391.     dec a
  392.     jr  nz, IRasterTriangleInner
  393.     ret
Advertisement
Add Comment
Please, Sign In to add comment