@@ -1587,3 +1587,204 @@ modify memory. Use with care!
1587
1587
the memory location at _ address_ .
1588
1588
1589
1589
1590
+ Display List Interrupts
1591
+ -----------------------
1592
+
1593
+ * Note: This is an advanced topic.*
1594
+
1595
+ Display list interrupts (normally called
1596
+ ` DLI ` ) are a way to modify display
1597
+ registers at certain vertical positions
1598
+ on the screen.
1599
+
1600
+ You can use them to:
1601
+
1602
+ - Display more colors in the image, by
1603
+ changing color registers - registers
1604
+ from $D012 to $D01A.
1605
+
1606
+ - Split one Player/Missile graphics to
1607
+ different horizontal positions -
1608
+ registers from $D000 to D007.
1609
+
1610
+ - Change scrolling position, screen
1611
+ width, P/M width, etc.
1612
+
1613
+ FastBasic allows you to specify one or
1614
+ more DLI routines, activate one or
1615
+ deactivate all DLI by using the ` DLI `
1616
+ statement:
1617
+
1618
+
1619
+ ** Define a new DLI**
1620
+ ** DLI SET _ name_ = _ op1_ , _ op2_ , ... / DLIS.**
1621
+
1622
+ Setups a new DLI with the given name
1623
+ and performing the _ op_ operations.
1624
+
1625
+ Each operation is of the form:
1626
+ _ data_ ` INTO ` _ address_ . ` INTO ` can be
1627
+ abbreviated to ` I. ` .
1628
+
1629
+ _ data_ is one constant byte or the
1630
+ name of a ` DATA BYTE ` array, and
1631
+ _ address_ is a memory location to
1632
+ modify.
1633
+
1634
+ If _ data_ is a DATA array, the first
1635
+ element (at index 0) will be used at
1636
+ the first line with DLI active in the
1637
+ screen, the second element at the
1638
+ second active line, etc.
1639
+
1640
+ You can specify any number of
1641
+ operations, but as each one takes some
1642
+ time you could see display artifacts
1643
+ if you use too many.
1644
+
1645
+ Note that by defining a DLI you are
1646
+ simply giving it a name, you need to
1647
+ activate the DLI afterwards.
1648
+
1649
+ You can split a DLI definition over
1650
+ multiple lines, just like DATA by
1651
+ ending a line with a comma and
1652
+ starting the next line with ` DLI = `
1653
+
1654
+
1655
+ ** Enable a DLI**
1656
+ ** DLI _ name_ / DL.**
1657
+
1658
+ This statement enables the DLI with
1659
+ the given name, the DLI must be
1660
+ defined before in the program.
1661
+
1662
+ This setups the OS DLI pointer to the
1663
+ named DLI and activates the interrupt
1664
+ bit in the display processor (the
1665
+ ANTIC chip), but does not activates on
1666
+ which lines the DLI must be called.
1667
+
1668
+ To define on which lines the DLI is
1669
+ active you must modify the _ Display
1670
+ List_ , see the example at the end of
1671
+ the section.
1672
+
1673
+ You can also pass the name of a DATA
1674
+ BYTE array with a custom machine
1675
+ language routine to the ` DLI `
1676
+ statement, the routine must begin with
1677
+ a _ PHA_ and end with _ PLA_ and _ RTI_ .
1678
+
1679
+
1680
+ ** Disable a DLI**
1681
+ ** DLI / DL.**
1682
+
1683
+ This statement simply disables the
1684
+ DLI, returning the display to the
1685
+ original
1686
+
1687
+
1688
+ ** DLI Examples**
1689
+
1690
+ This is the most basic example of a
1691
+ DLI that simply changes the background
1692
+ color at the middle of the screen:
1693
+
1694
+ ' Define the DLI: set background
1695
+ ' color to $24 = dark red.
1696
+ DLI SET d1 = $24 INTO $D01A
1697
+ ' Setups screen
1698
+ GRAPHICS 0
1699
+ ' Alter the Display List, adds
1700
+ ' a DLI at line 11 on the screen
1701
+ POKE DPEEK(560) + 16, 130
1702
+ ' Activate DLI
1703
+ DLI d1
1704
+ ' Wait for any keyu
1705
+ ? "Press a Key" : GET K
1706
+ ' Disable the DLI
1707
+ DLI
1708
+
1709
+ The next example shows how you can use
1710
+ a DLI to change multiple values in the
1711
+ screen:
1712
+
1713
+ ' An array with color values
1714
+ DATA Colors() BYTE = $24,$46,$68
1715
+ ' Define the DLI: set background
1716
+ ' color from the Color() array
1717
+ ' and text color with value $80
1718
+ DLI SET d2 = Colors INTO $D01A, $80 INTO $D018
1719
+ ' Setups screen
1720
+ GRAPHICS 0
1721
+ ' Adds DLI at three lines:
1722
+ POKE DPEEK(560) + 13, 130
1723
+ POKE DPEEK(560) + 16, 130
1724
+ POKE DPEEK(560) + 19, 130
1725
+ ' Activate DLI
1726
+ DLI d2
1727
+ ' Wait for any keyu
1728
+ ? "Press a Key" : GET K
1729
+ ' Disable the DLI
1730
+ DLI
1731
+
1732
+ The final example shows how you can
1733
+ move multiple P/M using one DLI
1734
+
1735
+ ' Player shapes, positions and colors
1736
+ DATA p1() BYTE = $E7,$81,$81,$E7
1737
+ DATA p2() BYTE = $18,$3C,$3C,$18
1738
+ DATA pos() BYTE = $40,$60,$80,$A0
1739
+ DATA c1() BYTE = $28,$88,$C8,$08
1740
+ DATA c2() BYTE = $2E,$80,$CE,$06
1741
+ ' Our DLI writes the position and
1742
+ ' colors to Player 1 and Player 2
1743
+ DLI SET d3 = pos INTO $D000, pos INTO $D001,
1744
+ DLI = c1 INTO $D012, c2 INTO $D013
1745
+ GRAPHICS 0 : PMGRAPHICS 2
1746
+ ' Setup our 4 DLI and Players
1747
+ FOR I = 8 TO 20 STEP 4
1748
+ POKE DPEEK(560) + I, 130
1749
+ MOVE ADR(p1), PMADR(0)+I*4+5,4
1750
+ MOVE ADR(p2), PMADR(1)+I*4+5,4
1751
+ NEXT
1752
+ ' Activate DLI
1753
+ DLI d3
1754
+ ? "Press a Key"
1755
+ REPEAT
1756
+ PAUSE 0
1757
+ pos(0) = pos(0) + 2
1758
+ pos(1) = pos(1) + 1
1759
+ pos(2) = pos(2) - 1
1760
+ pos(3) = pos(3) - 2
1761
+ UNTIL KEY()
1762
+ DLI
1763
+
1764
+
1765
+ ** Some usefull registers**
1766
+
1767
+ This is a table of some useful
1768
+ registers to change during a DLI:
1769
+
1770
+ | Address| Register |
1771
+ | ----- | ------------------------- |
1772
+ | $D000 | Player 0 horizontal pos. |
1773
+ | $D001 | Player 1 horizontal pos. |
1774
+ | $D002 | Player 2 horizontal pos. |
1775
+ | $D003 | Player 3 horizontal pos. |
1776
+ | $D004 | Missile 0 horizontal pos. |
1777
+ | $D005 | Missile 0 horizontal pos. |
1778
+ | $D006 | Missile 0 horizontal pos. |
1779
+ | $D007 | Missile 0 horizontal pos. |
1780
+ | $D012 | Color of Player 0 |
1781
+ | $D013 | Color of Player 0 |
1782
+ | $D014 | Color of Player 0 |
1783
+ | $D015 | Color of Player 0 |
1784
+ | $D016 | Color register 0 |
1785
+ | $D017 | Color register 1 |
1786
+ | $D018 | Color register 2 |
1787
+ | $D019 | Color register 3 |
1788
+ | $D01A | Color of Background |
1789
+
1790
+
0 commit comments