home *** CD-ROM | disk | FTP | other *** search
/ Aminet 10 / aminetcdnumber101996.iso / Aminet / misc / emu / Frodo.lha / Frodo / src / 6569.asm < prev    next >
Assembly Source File  |  1995-12-10  |  56KB  |  2,877 lines

  1. *
  2. * 6569.asm - VIC-Emulation
  3. *
  4. * Copyright (C) 1994-1995 by Christian Bauer
  5. *
  6.  
  7. *
  8. * Anmerkungen:
  9. * ------------
  10. *
  11. * Funktionsweise/Periodic:
  12. *  - Die VIC-Emulation arbeitet zeilenweise. Pro (simulierter)
  13. *    C64-Rasterzeile wird vom 6510-Task die Routine Periodic6569
  14. *    aufgerufen, die eine Pixelzeile der Grafik anhand der aktuellen
  15. *    Einstellungen in den VIC-Registern aufbaut. Dadurch können
  16. *    Rastereffekte sehr gut emuliert werden.
  17. *  - Die Emulation schreibt die Grafikdaten für eine Rasterzeile in einen
  18. *    8-Bit-Chunky-Puffer, der in jeder Rasterzeile in die Anzeige kopiert
  19. *    wird. Bei 4 Bit werden die Daten für ein ganzes Bild in den Puffer
  20. *    kopiert, der dann im VIC-VBlank konvertiert wird.
  21. *  - Die Auswahl der 5 verschiedenen Darstellungsmodi (plus 3 ungültige,
  22. *    die einen schwarzen Bildschirm erzeugen) geschieht über den
  23. *    Zeiger DisplayProc, der auf die entsprechende Routine (z.B. TextStd,
  24. *    BitMapMulti etc.) zeigt und der bei einem Schreibzugriff auf eines
  25. *    der beiden Kontrollregister CTRL1/CTRL2 neu gesetzt wird
  26. *
  27. * 6510-Zyklenzähler
  28. *  - In jeder Rasterzeile wird der Zyklenzähler für die CPU neu gesetzt,
  29. *    und zwar unterschiedlich je nachdem, ob eine Bad Line stattfand
  30. *    oder nicht
  31. *  - Für jedes dargestellte Sprite werden nochmal je 2 Zyklen abgezogen
  32. *
  33. * Bad Lines:
  34. *  - Eine Bad Line ist dann, wenn $30 <= RASTER <= $f7 und
  35. *    die unteren drei Bits von RASTER mit den unteren drei Bits von
  36. *    Reg. $11 (Y-Scroll) übereinstimmen
  37. *  - In einer Bad Line werden 40 Bytes aus Videomatrix und Farb-RAM geholt
  38. *
  39. * Rasterzähler RC/Grafikdarstellung:
  40. *  - Der RC wird in jeder Bad Line auf Null gesetzt, gleichzeitig wird
  41. *    die Darstellung der Grafik angeschaltet (DISPLAYOFF wird gelöscht)
  42. *  - Am Ende einer Rasterzeile wird der RC um 1 erhöht, es sei denn,
  43. *    er steht auf 7. In diesem Fall wird die Darstellung ausgeschaltet.
  44. *  - Ist DISPLAYOFF gesetzt, wird in der Textspalte $3fff dargestellt,
  45. *    ansonsten Text oder Bitmapgrafik
  46. *  - Deshalb wird im oberen/unteren Rahmen immer $3fff dargestellt, weil
  47. *    es dort keine Bad Lines gibt und der RC nie zurückgesetzt wird
  48. *
  49. * Videomatrixzähler VC:
  50. *  - Es gibt zwei Register, VCBASE und VCCOUNT. Zum Zugriff auf die
  51. *    Grafikdaten wird VCCOUNT benutzt.
  52. *  - Beim VBlank wird VCBASE auf Null gesetzt
  53. *  - Zu Beginn jeder Zeile wird VCCOUNT mit dem Wert aus VCBASE geladen
  54. *  - Wenn DISPLAYOFF gelöscht ist und Grafik dargestellt wird, wird
  55. *    VCCOUNT um 40 erhöht (symbolisch für die 40 Zugriffe des VIC)
  56. *  - Wenn die Darstellung abgeschaltet wird, weil RC=7 ist (am Ende
  57. *    einer Zeile) wird VCBASE mit dem Wert aus VCCOUNT geladen
  58. *
  59. * Spritedatenzähler MCx/Spritedarstellung:
  60. *  - Da die Spritedaten beim VIC am Ende einer Rasterzeile geholt werden
  61. *    und daher die Y-Positionen der Sprites eins niedriger als die
  62. *    Rasterzeilennummern sind, werden die Spritedatenzähler in der
  63. *    Emulation am Ende einer Rasterzeile gehandhabt (nachdem die Sprites
  64. *    gezeichnet wurden)
  65. *  - Wenn ein Sprite eingeschaltet ist und die Y-Koordinate gleich den
  66. *    unteren 8 Bit von RASTER ist, wird der Datenzähler auf Null gesetzt
  67. *    und die Darstellung des Sprite eingeschaltet (Bit in SPRITEON).
  68. *    Jede folgende Rasterzeile wird der Zähler um 3 erhöht, solange er
  69. *    kleiner als 60 ist. Erreicht er 60, wird die Darstellung des Sprite
  70. *    ausgeschaltet. Wenn das Sprite Y-expandiert ist, wird der Zähler nur
  71. *    in den Zeilen erhöht, in denen die unteren Bits von Y-Koordinate und
  72. *    Zeilennummer gleich sind.
  73. *  - Der Puffer GfxCollBuf wird beim Malen der Grafikdaten mit Flags
  74. *    gefüllt, ob das zugehörige Pixel ein Vorder- oder Hintergrundpixel
  75. *    ist. Dieser Puffer wird für die Sprite-Grafik-Kollisionserkennung
  76. *    und für das Zeichnen von Hintergrundsprites benutzt.
  77. *
  78. * X-Scroll>0 und 40 Spalten:
  79. *  - Wenn der X-Scroll>0 und die 40-Spalten-Darstellung eingeschaltet
  80. *    ist, hängt das, was am linken Bildrand dargestellt wird, vom
  81. *    aktuellen Grafikmodus ab
  82. *  - Im Standard-Text-, Multicolor-Text- und Multicolor-Bitmap-Modus wird
  83. *    dort die Hintergrundfarbe aus Reg.$21 dargestellt
  84. *  - Im Standard-Bitmap- und ECM-Text-Modus wird die Hintergrundfarbe
  85. *    der letzten 8 Pixel der vorherigen Zeile dargestellt
  86. *
  87. * Inkompatibilitäten:
  88. *  - Effekte, die durch die Änderung von VIC-Registern innerhalb einer
  89. *    Rasterzeile erreicht werden, können nicht emuliert werden
  90. *  - Sprite-Kollisionen werden nur innerhalb des sichtbaren Bereiches
  91. *    erkannt, Kollisionen mit $3fff werden gar nicht erkannt
  92. *  - X-expandierte Sprites mit X-Koordinaten >=$140 werden nicht angezeigt.
  93. *    Genaugenommen sollte ein Sprite nur dann unsichtbar sein, wenn die
  94. *    X-Koordinate zwischen $1f8 und $1ff liegt.
  95. *  - In den Bitmap-Darstellungen ab den Adressen $0000 und $8000 sollte
  96. *    eigentlich ab $1000/$9000 das Char-ROM sichtbar sein. Aus
  97. *    Geschwindigkeitsgründen wird in der Emulation das RAM darunter
  98. *    dargestellt. Dies sollte keine Rolle spielen, da diese Bitmap-Seiten
  99. *    aus dem genannten Grund von keinem Programm komplett verwendet werden.
  100. *  - Der IRQ wird bei jedem Schreibzugriff in das Flag-Register gelöscht.
  101. *    Das ist ein Hack für die RMW-Befehle des 6510, die zuerst den
  102. *    Originalwert schreiben.
  103. *  - Kein Lightpen-Interrupt
  104. *
  105.  
  106. SPR_DATA_COLL    SET 1    ;0 - Keine Sprite-Hintergrund-Prioritäten/-Kollisionen
  107.  
  108.         MACHINE    68020
  109.  
  110.         INCLUDE    "exec/types.i"
  111.         INCLUDE    "exec/macros.i"
  112.         INCLUDE    "exec/nodes.i"
  113.         INCLUDE    "graphics/rastport.i"
  114.         INCLUDE    "libraries/cybergraphics.i"
  115.  
  116.         XREF    _SysBase    ;Main.asm
  117.         XREF    _GfxBase
  118.         XREF    _CyberGfxBase
  119.  
  120.         XREF    TheRAM        ;6510.asm
  121.         XREF    TheChar
  122.         XREF    TheColor
  123.         XREF    IntIsVICIRQ
  124.         XREF    CyclesLeft
  125.  
  126.         XREF    CountTODs    ;6526.asm
  127.         XREF    Periodic6526
  128.  
  129.         XREF    _OpenDisplay    ;Display.c
  130.         XREF    _RedrawDisplay
  131.         XREF    _the_rast_port
  132.         XREF    _temp_rp
  133.  
  134.         XDEF    Init6569
  135.         XDEF    _GetVICDump
  136.         XDEF    OpenGraphics
  137.         XDEF    ChangedVA
  138.         XDEF    ReadFrom6569
  139.         XDEF    WriteTo6569
  140.         XDEF    Periodic6569
  141.  
  142.         XDEF    DisplayID    ;Prefs
  143.         XDEF    ScreenType
  144.         XDEF    NormalCycles
  145.         XDEF    BadLineCycles
  146.         XDEF    Collisions
  147.         XDEF    Overscan
  148.         XDEF    SkipLatch
  149.         XDEF    LimitSpeed
  150.         XDEF    DirectVideo
  151.  
  152.         SECTION    "text",CODE
  153.  
  154.  
  155. **
  156. ** Definitionen
  157. **
  158.  
  159. ; VIC-Register
  160. M0Y        = $01    ;Y-Position von Sprite 0
  161. M1Y        = $03    ;Y-Position von Sprite 1
  162. M2Y        = $05    ;Y-Position von Sprite 2
  163. M3Y        = $07    ;Y-Position von Sprite 3
  164. M4Y        = $09    ;Y-Position von Sprite 4
  165. M5Y        = $0b    ;Y-Position von Sprite 5
  166. M6Y        = $0d    ;Y-Position von Sprite 6
  167. M7Y        = $0f    ;Y-Position von Sprite 7
  168. MX8        = $10    ;Höchste Bits der Sprite X-Positionen
  169. CTRL1        = $11    ;Steuerreg. 1
  170. RASTER        = $12    ;Rasterzähler
  171. LPX        = $13    ;Lightpen X
  172. LPY        = $14    ;Lightpen Y
  173. SPREN        = $15    ;Sprite eingeschaltet
  174. CTRL2        = $16    ;Steuerreg. 2
  175. MYE        = $17    ;Sprite Y-Expansion
  176. VBASE        = $18    ;Basisadressen
  177. IRQFLAG        = $19    ;Interruptreg.
  178. IRQMASK        = $1a
  179. MDP        = $1b    ;Sprite Priorität
  180. MMC        = $1c    ;Sprite Multicolor
  181. MXE        = $1d    ;Sprite X-Expansion
  182. CLXSPR        = $1e    ;Kollisionsreg.
  183. CLXBGR        = $1f
  184. EC        = $20    ;Rahmenfarbe
  185. B0C        = $21    ;Hintergrundfarbe
  186.  
  187. ; Zusätzliche Register
  188. DISPLAYOFF    = $2f    ;Flag: $3fff wird dargestellt
  189. IRQRASTER    = $30    ;Rasterzeile, bei der ein IRQ ausgelöst wird (Wort)
  190. XSCROLL        = $32    ;X-Scroll-Wert (Wort)
  191. YSCROLL        = $34    ;Y-Scroll-Wert (Wort)
  192. DXSTART        = $36    ;Aktuelle Werte des Randbereichs
  193. DXSTOP        = $38
  194. DYSTART        = $3a
  195. DYSTOP        = $3c
  196. RC        = $3e    ;Rasterzähler RC
  197. MATRIXBASE    = $40    ;Videomatrix-Basis (Amiga-Adresse)
  198. CHARBASE    = $44    ;Zeichengenerator-Basis (Amiga-Adresse)
  199. BITMAPBASE    = $48    ;Bitmap-Basis (Amiga-Adresse)
  200. CURRENTA5    = $4c    ;Augenblicklicher Zeiger im ChunkyBuf
  201.             ;Speicher für a5 zwischen Aufrufen von Periodic6569
  202. CURRENTRASTER    = $50    ;Augenblickliche Rasterzeile
  203.             ;Speicher für d7 zwischen Aufrufen von Periodic6569
  204. LASTBKGD    = $52    ;Letzte dargestellte Hintergrundfarbe
  205. SPRITEON    = $53    ;Sprite wird dargestellt, pro Sprite ein Bit
  206. BORDERON    = $54    ;Flag: Oberer/unterer Rahmen wird dargestellt
  207. IS38COL        = $55    ;Flag: 38 Spalten
  208. BADLINEENABLE    = $56    ;Flag: Bad Lines sind zugelassen
  209.             ;In Zeile $30 wird Bit 4 in $D011 getestet und
  210.             ; dieses Flag entsprechend gesetzt
  211. SKIPFRAME    = $57    ;Flag: Dieses Frame überspringen, nichts zeichnen
  212. BADLINE        = $58    ;Flag: Bad-Line-Zustand
  213. MC0        = $5a    ;Spritedatenzähler 0
  214. MC1        = $5c
  215. MC2        = $5e
  216. MC3        = $60
  217. MC4        = $62
  218. MC5        = $64
  219. MC6        = $66
  220. MC7        = $68    ;Spritedatenzähler 7
  221. VCBASE        = $6a    ;VC-Zwischenspeicher
  222. VCCOUNT        = $6c    ;VC-Zähler
  223. CIAVABASE    = $6e    ;16-Bit Basisadresse durch Cia-VA14/15
  224. BORDERLONG    = $70    ;Vorberechnete Farbwerte
  225. BACK0LONG    = $74
  226. SPRX0        = $78    ;16-Bit Sprite-X-Koordinaten
  227. SPRX1        = $7a
  228. SPRX2        = $7c
  229. SPRX3        = $7e
  230. SPRX4        = $80
  231. SPRX5        = $82
  232. SPRX6        = $84
  233. SPRX7        = $86
  234. SPR0BASE    = $88
  235. SPR1BASE    = $8a
  236. SPR2BASE    = $8c
  237. SPR3BASE    = $8e
  238. SPR4BASE    = $90
  239. SPR5BASE    = $92
  240. SPR6BASE    = $94
  241. SPR7BASE    = $96
  242. VICRegLength    = $98
  243.  
  244. ; Anzahl Rasterzeilen
  245. TotalRasters    = $138
  246.  
  247. ; Textfenster-Koordinaten (Stop-Werte sind immer eins mehr)
  248. Row25YStart    = $33
  249. Row25YStop    = $fb
  250. Row24YStart    = $37
  251. Row24YStop    = $f7
  252.  
  253. Col40XStart    = $20
  254. Col40XStop    = $160
  255. Col38XStart    = $27
  256. Col38XStop    = $157
  257.  
  258. ; Erste und letzte mögliche Zeile für Bad Lines
  259. FirstDMALine    = $30
  260. LastDMALine    = $f7
  261.  
  262. ; Erste und letzte dargestellte Zeile
  263. FirstDispLine    = $10
  264. LastDispLine    = $11f    ;eigentlich $12b
  265.  
  266. ; Größe der Anzeige
  267. DisplayX    = $180    ;Muß ein Vielfaches von 32 sein (wg. c2p4)!
  268. DisplayY    = LastDispLine-FirstDispLine+1
  269.  
  270. ; ScreenTypes
  271. STYP_8BIT    = 0    ;8-Bit-Screen, WritePixelLine8/
  272. STYP_4BIT    = 1    ;4-Bit-Screen, c2p4
  273. STYP_1BIT    = 2    :1-Bit-Screen, Amiga Mono
  274.  
  275. ; cybergraphics.library
  276. CYBRMATTR_ISLINEARMEM = $80000009
  277. GetCyberMapAttr    = -96
  278. DoCDrawMethod    = -156
  279.  
  280.  
  281. *
  282. * Makros
  283. *
  284.  
  285. ; Sprite darstellen
  286. DoSprite    MACRO    ;Nummer
  287.         btst    #\1,SPRITEON(a4) ;Wird das Sprite dargestellt?
  288.         beq    \@1$
  289.  
  290.         move.l    MATRIXBASE(a4),a0
  291.         moveq    #0,d0
  292.         move.b    $03f8+\1(a0),d0    ;Datenzeiger
  293.         lsl.w    #6,d0        ;*64
  294.         add.w    MC\1(a4),d0    ;MC dazunehmen
  295.         bsr    GetPhysical
  296.         move.l    (a0),d0        ;d0: Spritedaten
  297.  
  298.         move.w    SPRX\1(a4),d1    ;d1: X-Koordinate
  299.         move.l    a5,a1
  300.         add.w    d1,a1
  301.         addq.l    #8,a1        ;a1: Ziel im Bildschirmspeicher
  302.         lea    SprCollBuf+8,a2
  303.         add.w    d1,a2        ;a2: Ziel im Kollisionspuffer
  304.     IFNE    SPR_DATA_COLL
  305.         lea    GfxCollBuf+8,a3
  306.         add.w    d1,a3        ;a3: Zeiger auf Grafik-Kollisionspuffer
  307.     ENDC
  308.  
  309.         move.b    $27+\1(a4),d2    ;d2: Spritefarbe
  310.  
  311.         move.b    #1<<\1,d7    ;d7: Sprite-Bit
  312.         jsr    ([Sprite\1Proc])
  313. \@1$
  314.         ENDM
  315.  
  316.  
  317. **
  318. ** Emulation vorbereiten
  319. **
  320.  
  321. *
  322. * Register vorbereiten
  323. *
  324.  
  325. Init6569    lea    Registers,a0
  326.         move.w    #7,RC(a0)
  327.         move.w    #-1,CURRENTRASTER(a0)
  328.         move.l    TheRAM,MATRIXBASE(a0)
  329.         move.l    TheRAM,CHARBASE(a0)
  330.         move.l    TheRAM,BITMAPBASE(a0)
  331.         clr.w    CIAVABASE(a0)
  332.         move.w    #63,MC0(a0)
  333.         move.w    #63,MC1(a0)
  334.         move.w    #63,MC2(a0)
  335.         move.w    #63,MC3(a0)
  336.         move.w    #63,MC4(a0)
  337.         move.w    #63,MC5(a0)
  338.         move.w    #63,MC6(a0)
  339.         move.w    #63,MC7(a0)
  340.  
  341.         bsr    SetDispProc
  342.         bsr    SetSpriteProcs
  343.         rts
  344.  
  345. *
  346. * Screen und Fenster öffnen
  347. * d0=0: Alles OK
  348. * d0=1: Konnte Screen nicht öffnen
  349. * d0=2: Kein Speicher
  350. *
  351.  
  352. OpenGraphics    pea    DisplayY
  353.         pea    DisplayX
  354.         moveq    #0,d0
  355.         move.w    Overscan,d0
  356.         move.l    d0,-(sp)
  357.         move.l    DisplayID,-(sp)
  358.         move.w    ScreenType,d0
  359.         move.l    d0,-(sp)
  360.         jsr    _OpenDisplay
  361.         lea    20(sp),sp
  362.         tst.l    d0
  363.         bne    1$
  364.  
  365.         move.l    _CURRENTA5,Registers+CURRENTA5
  366.  
  367.         move.l    _CyberGfxBase,d0
  368.         beq    2$
  369.         move.l    a6,-(sp)
  370.         move.l    d0,a6
  371.  
  372.         move.l    _the_rast_port,a0    ;Ist es eine CyberGfx-Bitmap?
  373.         move.l    rp_BitMap(a0),a0
  374.         move.l    #CYBRMATTR_ISCYBERGFX,d0
  375.         jsr    GetCyberMapAttr(a6)
  376.         tst.l    d0
  377.         beq    3$
  378.  
  379.         move.l    _the_rast_port,a0    ;Ja, Direkter Zugriff erlaubt?
  380.         move.l    rp_BitMap(a0),a0
  381.         move.l    #CYBRMATTR_ISLINEARMEM,d0
  382.         jsr    GetCyberMapAttr(a6)
  383.         tst.l    d0
  384.         beq    3$
  385.         sne    IsCyber            ;Ja, DoCDrawMethod kann benutzt werden
  386.  
  387.         tst.w    DirectVideo        ;Zugriff ohne DoCDrawMethod gewünscht?
  388.         beq    3$
  389.  
  390.         move.l    _the_rast_port,a0    ;Ja, XMod und Basisadresse bestimmen
  391.         move.l    rp_BitMap(a0),a0
  392.         move.l    #CYBRMATTR_XMOD,d0
  393.         jsr    GetCyberMapAttr(a6)
  394.         move.l    d0,CyberXMod
  395.  
  396.         move.l    _the_rast_port,a0
  397.         move.l    rp_BitMap(a0),a0
  398.         move.l    #CYBRMATTR_DISPADR,d0
  399.         jsr    GetCyberMapAttr(a6)
  400.         move.l    d0,CyberBase
  401.         spl    IsCyberDirect
  402. 3$
  403.         move.l    (sp)+,a6
  404. 2$
  405.         moveq    #0,d0
  406. 1$        rts
  407.  
  408.  
  409. **
  410. ** VIC-Status in Datenstruktur schreiben
  411. **
  412.  
  413. _GetVICDump    lea    Registers,a0
  414.         move.l    4(sp),a1
  415.  
  416.         move.b    SPRX0+1(a0),(a1)+
  417.         move.b    M0Y(a0),(a1)+
  418.         move.b    SPRX1+1(a0),(a1)+
  419.         move.b    M1Y(a0),(a1)+
  420.         move.b    SPRX2+1(a0),(a1)+
  421.         move.b    M2Y(a0),(a1)+
  422.         move.b    SPRX3+1(a0),(a1)+
  423.         move.b    M3Y(a0),(a1)+
  424.         move.b    SPRX4+1(a0),(a1)+
  425.         move.b    M4Y(a0),(a1)+
  426.         move.b    SPRX5+1(a0),(a1)+
  427.         move.b    M5Y(a0),(a1)+
  428.         move.b    SPRX6+1(a0),(a1)+
  429.         move.b    M6Y(a0),(a1)+
  430.         move.b    SPRX7+1(a0),(a1)+
  431.         move.b    M7Y(a0),(a1)+
  432.         move.b    MX8(a0),(a1)+
  433.  
  434.         move.b    CTRL1(a0),d0
  435.         and.b    #$7f,d0
  436.         move.b    CURRENTRASTER(a0),d1
  437.         lsl.b    #7,d1
  438.         or.b    d1,d0
  439.         move.b    d0,(a1)+
  440.         move.b    CURRENTRASTER+1(a0),(a1)+
  441.  
  442.         lea    LPX(a0),a0
  443.         moveq    #27,d0        ;LPX..M7C
  444. 1$        move.b    (a0)+,(a1)+
  445.         dbra    d0,1$
  446.  
  447.         lea    Registers,a0
  448.         addq.l    #1,a1
  449.         move.w    IRQRASTER(a0),(a1)+
  450.         move.w    VCCOUNT(a0),(a1)+
  451.         move.w    VCBASE(a0),(a1)+
  452.         move.b    RC+1(a0),(a1)+
  453.         move.b    SPRITEON(a0),(a1)+
  454.  
  455.         move.b    MC0+1(a0),(a1)+
  456.         move.b    MC1+1(a0),(a1)+
  457.         move.b    MC2+1(a0),(a1)+
  458.         move.b    MC3+1(a0),(a1)+
  459.         move.b    MC4+1(a0),(a1)+
  460.         move.b    MC5+1(a0),(a1)+
  461.         move.b    MC6+1(a0),(a1)+
  462.         move.b    MC7+1(a0),(a1)+
  463.  
  464.         tst.b    DISPLAYOFF(a0)
  465.         sne.b    (a1)+
  466.         sne.b    (a1)+
  467.         tst.b    BADLINE(a0)
  468.         sne.b    (a1)+
  469.         sne.b    (a1)+
  470.         tst.b    BADLINEENABLE(a0)
  471.         sne.b    (a1)+
  472.         sne.b    (a1)+
  473.         move.w    CIAVABASE(a0),(a1)+
  474.         move.w    MATRIXBASE+2(a0),(a1)+
  475.         move.w    CHARBASE+2(a0),(a1)+
  476.         move.w    BITMAPBASE+2(a0),(a1)+
  477.  
  478.         move.l    d2,-(sp)
  479.         move.w    CIAVABASE(a0),d2
  480.         move.l    MATRIXBASE(a0),a0
  481.         moveq    #7,d1
  482.         lea    $03f8(a0),a0
  483. 2$        moveq    #0,d0
  484.         move.b    (a0)+,d0
  485.         lsl.w    #6,d0
  486.         or.w    d2,d0
  487.         move.w    d0,(a1)+
  488.         dbra    d1,2$
  489.         move.l    (sp)+,d2
  490.         rts
  491.  
  492.  
  493. **
  494. ** CIA-VA14/15 hat sich geändert, Video-Bank wechseln
  495. ** d0.b: Neue VA ($00-$03)
  496. **
  497.  
  498. ChangedVA    lea    Registers,a0    ;Wichtig für WrVBASE
  499.         clr.w    d1        ;VABase speichern
  500.         move.b    d0,d1
  501.         ror.w    #2,d1
  502.         move.w    d1,CIAVABASE(a0)
  503.  
  504.         move.b    VBASE(a0),d1 ;Zeiger neu berechnen
  505.         bra    WrVBASE
  506.  
  507.  
  508. **
  509. ** Aus einer VIC-16-Bit-Adresse die entsprechende Amiga-Adresse berechnen
  510. ** -> d0.w: 16-Bit-Adresse
  511. ** <- a0.l: 32-Bit-Adresse
  512. **
  513.  
  514. GetPhysical    or.w    CIAVABASE(a4),d0 ;VA14/15 dazunehmen
  515.         move.w    d0,d1
  516.         and.w    #$7000,d1
  517.         cmp.w    #$1000,d1
  518.         beq    1$
  519.         move.l    TheRAM,a0
  520.         moveq    #0,d1
  521.         move.w    d0,d1
  522.         add.l    d1,a0
  523.         rts
  524. 1$        and.w    #$0fff,d0    ;$1000-$1fff, $9000-$9fff: Char-ROM
  525.         move.l    TheChar,a0
  526.         add.w    d0,a0
  527.         rts
  528.  
  529.  
  530. **
  531. ** Aus einem VIC-Register lesen
  532. ** d0.l: Registernummer ($00-$3f)
  533. ** Rückgabe: d0.b: Byte
  534. **
  535. ** Darf das obere Wort von d0 und d1 nicht verändern!
  536. **
  537.  
  538. ReadFrom6569    lea    Registers,a0
  539.         move.l    ReadTab(pc,d0.l*4),a1
  540.         jmp    (a1)
  541.  
  542.         CNOP    0,4
  543. ReadTab        dc.l    RdSprX
  544.         dc.l    RdNormal
  545.         dc.l    RdSprX
  546.         dc.l    RdNormal
  547.         dc.l    RdSprX
  548.         dc.l    RdNormal
  549.         dc.l    RdSprX
  550.         dc.l    RdNormal
  551.         dc.l    RdSprX
  552.         dc.l    RdNormal
  553.         dc.l    RdSprX
  554.         dc.l    RdNormal
  555.         dc.l    RdSprX
  556.         dc.l    RdNormal
  557.         dc.l    RdSprX
  558.         dc.l    RdNormal
  559.  
  560.         dc.l    RdNormal
  561.         dc.l    RdCTRL1
  562.         dc.l    RdRASTER
  563.         dc.l    RdNormal
  564.         dc.l    RdNormal
  565.         dc.l    RdNormal
  566.         dc.l    RdCTRL2
  567.         dc.l    RdNormal
  568.         dc.l    RdVBASE
  569.         dc.l    RdIRQFLAG
  570.         dc.l    RdIRQMASK
  571.         dc.l    RdNormal
  572.         dc.l    RdNormal
  573.         dc.l    RdNormal
  574.         dc.l    RdCLXSPR
  575.         dc.l    RdCLXBGR
  576.  
  577.         dc.l    RdColor
  578.         dc.l    RdColor
  579.         dc.l    RdColor
  580.         dc.l    RdColor
  581.         dc.l    RdColor
  582.         dc.l    RdColor
  583.         dc.l    RdColor
  584.         dc.l    RdColor
  585.         dc.l    RdColor
  586.         dc.l    RdColor
  587.         dc.l    RdColor
  588.         dc.l    RdColor
  589.         dc.l    RdColor
  590.         dc.l    RdColor
  591.         dc.l    RdColor
  592.         dc.l    RdUndef
  593.  
  594.         dc.l    RdUndef
  595.         dc.l    RdUndef
  596.         dc.l    RdUndef
  597.         dc.l    RdUndef
  598.         dc.l    RdUndef
  599.         dc.l    RdUndef
  600.         dc.l    RdUndef
  601.         dc.l    RdUndef
  602.         dc.l    RdUndef
  603.         dc.l    RdUndef
  604.         dc.l    RdUndef
  605.         dc.l    RdUndef
  606.         dc.l    RdUndef
  607.         dc.l    RdUndef
  608.         dc.l    RdUndef
  609.         dc.l    RdUndef
  610.  
  611. RdNormal    move.b    (a0,d0.l),d0
  612.         rts
  613.  
  614. RdSprX        move.b    SPRX0+1(a0,d0.l),d0    ;LSB lesen
  615.         rts
  616.  
  617. RdCTRL1        move.b    CTRL1(a0),d0
  618.         and.b    #$7f,d0
  619.         move.b    CURRENTRASTER(a0),d1    ;MSB des Rasterzählers lesen
  620.         lsl.b    #7,d1
  621.         or.b    d1,d0            ;und dazunehmen
  622.         rts
  623.  
  624. RdRASTER    move.b    CURRENTRASTER+1(a0),d0    ;Rasterzähler lesen
  625.         rts
  626.  
  627. RdCTRL2        move.b    CTRL2(a0),d0
  628.         or.b    #$c0,d0            ;Unbenutzte Bits auf 1
  629.         rts
  630.  
  631. RdVBASE        move.b    VBASE(a0),d0
  632.         or.b    #$01,d0            ;Unbenutzte Bits auf 1
  633.         rts
  634.  
  635. RdIRQFLAG    move.b    IRQFLAG(a0),d0
  636.         or.b    #$70,d0            ;Unbenutzte Bits auf 1
  637.         rts
  638.  
  639. RdIRQMASK    move.b    IRQMASK(a0),d0
  640.         or.b    #$f0,d0            ;Unbenutzte Bits auf 1
  641.         rts
  642.  
  643. RdCLXSPR    lea    CLXSPR(a0),a0
  644.         move.b    (a0),d0            ;Lesen und löschen
  645.         clr.b    (a0)
  646.         rts
  647.  
  648. RdCLXBGR    lea    CLXBGR(a0),a0
  649.         move.b    (a0),d0            ;Lesen und löschen
  650.         clr.b    (a0)
  651.         rts
  652.  
  653. RdColor        move.b    (a0,d0.l),d0        ;Bei den Farbregistern
  654.         or.b    #$f0,d0            ;das obere Nibble setzen
  655.         rts
  656.  
  657. RdUndef        st.b    d0            ;Nicht existierendes Register
  658.         rts
  659.  
  660.  
  661. **
  662. ** In ein VIC-Register schreiben
  663. ** d0.l: Registernummer ($00-$3f)
  664. ** d1.b: Byte
  665. **
  666. ** Darf das obere Wort von d0 und d1 nicht verändern!
  667. **
  668.  
  669. WriteTo6569    lea    Registers,a0
  670.         move.l    WriteTab(pc,d0.l*4),a1
  671.         jmp    (a1)
  672.  
  673.         CNOP    0,4
  674. WriteTab    dc.l    WrSprX
  675.         dc.l    WrNormal
  676.         dc.l    WrSprX
  677.         dc.l    WrNormal
  678.         dc.l    WrSprX
  679.         dc.l    WrNormal
  680.         dc.l    WrSprX
  681.         dc.l    WrNormal
  682.         dc.l    WrSprX
  683.         dc.l    WrNormal
  684.         dc.l    WrSprX
  685.         dc.l    WrNormal
  686.         dc.l    WrSprX
  687.         dc.l    WrNormal
  688.         dc.l    WrSprX
  689.         dc.l    WrNormal
  690.  
  691.         dc.l    WrSprXMSB
  692.         dc.l    WrCTRL1
  693.         dc.l    WrRASTER
  694.         dc.l    WrNormal
  695.         dc.l    WrNormal
  696.         dc.l    WrNormal
  697.         dc.l    WrCTRL2
  698.         dc.l    WrNormal
  699.         dc.l    WrVBASE
  700.         dc.l    WrIRQFLAG
  701.         dc.l    WrIRQMASK
  702.         dc.l    WrMDP
  703.         dc.l    WrMMC
  704.         dc.l    WrMXE
  705.         dc.l    WrUndef
  706.         dc.l    WrUndef
  707.  
  708.         dc.l    WrBorder
  709.         dc.l    WrBack0
  710.         dc.l    WrNormal
  711.         dc.l    WrNormal
  712.         dc.l    WrNormal
  713.         dc.l    WrNormal
  714.         dc.l    WrNormal
  715.         dc.l    WrNormal
  716.         dc.l    WrNormal
  717.         dc.l    WrNormal
  718.         dc.l    WrNormal
  719.         dc.l    WrNormal
  720.         dc.l    WrNormal
  721.         dc.l    WrNormal
  722.         dc.l    WrNormal
  723.         dc.l    WrUndef
  724.  
  725.         dc.l    WrUndef
  726.         dc.l    WrUndef
  727.         dc.l    WrUndef
  728.         dc.l    WrUndef
  729.         dc.l    WrUndef
  730.         dc.l    WrUndef
  731.         dc.l    WrUndef
  732.         dc.l    WrUndef
  733.         dc.l    WrUndef
  734.         dc.l    WrUndef
  735.         dc.l    WrUndef
  736.         dc.l    WrUndef
  737.         dc.l    WrUndef
  738.         dc.l    WrUndef
  739.         dc.l    WrUndef
  740.         dc.l    WrUndef
  741.  
  742. WrNormal    move.b    d1,(a0,d0.l)
  743. WrUndef        rts
  744.  
  745. WrSprX        move.b    d1,SPRX0+1(a0,d0.l)
  746.         rts
  747.  
  748. WrSprXMSB    move.b    d1,MX8(a0)
  749.         lea    SPRX7(a0),a0    ;MSBs in 16-Bit-Werte umrechnen
  750.         moveq    #7,d0
  751. 1$        add.b    d1,d1
  752.         bcs    2$
  753.         clr.b    (a0)
  754.         bra    3$
  755. 2$        move.b    #1,(a0)
  756. 3$        subq.w    #2,a0
  757.         dbra    d0,1$
  758.         rts
  759.  
  760. WrCTRL1        move.b    d1,CTRL1(a0)
  761.  
  762.         move.b    d1,d0        ;Y-Scroll
  763.         and.w    #7,d0
  764.         move.w    d0,YSCROLL(a0)
  765.  
  766.         move.b    d1,d0        ;MSB der IRQ-Rasterzeile
  767.         lsr.b    #7,d0
  768.         move.b    d0,IRQRASTER(a0)
  769.  
  770.         btst    #3,d1        ;24/25 Zeilen
  771.         beq    1$
  772.         move.w    #Row25YStart,DYSTART(a0)
  773.         move.w    #Row25YStop,DYSTOP(a0)
  774.         bra    SetDispProc
  775. 1$        move.w    #Row24YStart,DYSTART(a0)
  776.         move.w    #Row24YStop,DYSTOP(a0)
  777.         bra    SetDispProc
  778.  
  779. SetDispProc    moveq    #0,d0        ;ECM, BMM und MCM holen
  780.         move.b    CTRL1(a0),d0
  781.         and.b    #$60,d0
  782.         move.b    CTRL2(a0),d1
  783.         and.b    #$10,d1
  784.         or.b    d1,d0
  785.         lsr.b    #2,d0        ;Als Index in DispProcTab benutzen
  786.         cmp.w    #STYP_1BIT,ScreenType
  787.         beq    1$
  788.         move.l    (DispProcTab,pc,d0.l),DisplayProc
  789.         rts
  790. 1$        move.l    (MonoDispProcTab,pc,d0.l),DisplayProc
  791.         rts
  792.  
  793. WrRASTER    move.b    d1,IRQRASTER+1(a0)
  794.         rts
  795.  
  796. WrCTRL2        move.b    d1,CTRL2(a0)
  797.  
  798.         move.b    d1,d0        ;X-Scroll
  799.         and.w    #7,d0
  800.         move.w    d0,XSCROLL(a0)
  801.  
  802.         btst    #3,d1        ;38/40 Zeilen
  803.         seq.b    IS38COL(a0)
  804.         beq    1$
  805.         move.w    #Col40XStart,DXSTART(a0)
  806.         move.w    #Col40XStop,DXSTOP(a0)
  807.         bra    SetDispProc
  808. 1$        move.w    #Col38XStart,DXSTART(a0)
  809.         move.w    #Col38XStop,DXSTOP(a0)
  810.         bra    SetDispProc
  811.  
  812. WrVBASE        move.l    a0,a1        ;a1: Zeiger auf Register
  813.         move.b    d1,VBASE(a1)
  814.  
  815.         move.l    a4,-(sp)
  816.         move.l    a1,a4        ;Für GetPhysical
  817.  
  818.         move.w    d1,-(sp)
  819.         move.b    d1,d0        ;Videomatrixbasis berechnen
  820.         and.w    #$f0,d0
  821.         lsl.w    #6,d0
  822.         bsr    GetPhysical
  823.         move.l    a0,MATRIXBASE(a1)
  824.         move.w    (sp),d1        ;Nur lesen, nicht entfernen
  825.  
  826.         move.b    d1,d0        ;Zeichengeneratorbasis berechnen
  827.         and.w    #$0e,d0
  828.         ror.w    #6,d0
  829.         bsr    GetPhysical
  830.         move.l    a0,CHARBASE(a1)
  831.         move.w    (sp)+,d1
  832.  
  833.         move.b    d1,d0
  834.         and.w    #$08,d0
  835.         ror.w    #6,d0
  836.         bsr    GetPhysical
  837.         move.l    a0,BITMAPBASE(a1)
  838.  
  839.         move.l    (sp)+,a4
  840.         rts
  841.  
  842. WrIRQFLAG    not.b    d1        ;Gesetztes Bit: Flag löschen
  843.         and.b    #$0f,d1
  844.         move.b    IRQFLAG(a0),d0
  845.         and.b    d1,d0
  846.  
  847.         clr.b    IntIsVICIRQ    ;IRQ zurücknehmen (Hack!)
  848.  
  849.         move.b    d0,d1        ;Erlaubter IRQ noch gesetzt?
  850.         and.b    IRQMASK(a0),d1
  851.         beq    1$
  852.         or.b    #$80,d0        ;Ja, Master-Bit setzen
  853. 1$        move.b    d0,IRQFLAG(a0)
  854.         rts
  855.  
  856. WrIRQMASK    and.b    #$0f,d1
  857.         move.b    d1,IRQMASK(a0)
  858.         ;!! Evtl. IRQ auslösen
  859.         rts
  860.  
  861. WrMDP        move.b    d1,MDP(a0)
  862.         bra    SetSpriteProcs
  863.  
  864. WrMMC        move.b    d1,MMC(a0)
  865.         bra    SetSpriteProcs
  866.  
  867. WrMXE        move.b    d1,MXE(a0)        ;Fällt durch!
  868.  
  869. SetSpriteProcs    moveq    #7,d1
  870.         lea    Sprite7Proc,a1
  871. 1$        moveq    #0,d0
  872.         btst    d1,MXE(a0)
  873.         beq    2$
  874.         or.b    #1,d0
  875. 2$        btst    d1,MMC(a0)
  876.         beq    3$
  877.         or.b    #2,d0
  878. 3$        btst    d1,MDP(a0)
  879.         beq    4$
  880.         or.b    #4,d0
  881. 4$        move.l    (SpriteProcTab,pc,d0.l*4),(a1)
  882.         subq.w    #4,a1
  883.         dbra    d1,1$
  884.         rts
  885.  
  886. WrBorder    move.b    d1,EC(a0)
  887.         move.b    d1,d0        ;In ein Langwort konvertieren
  888.         lsl.w    #8,d0
  889.         move.b    d1,d0
  890.         move.w    d0,d1
  891.         swap    d0
  892.         move.w    d1,d0
  893.         move.l    d0,BORDERLONG(a0)
  894.         moveq    #0,d0
  895.         rts
  896.  
  897. WrBack0        move.b    d1,B0C(a0)
  898.         move.b    d1,d0        ;In ein Langwort konvertieren
  899.         lsl.w    #8,d0
  900.         move.b    d1,d0
  901.         move.w    d0,d1
  902.         swap    d0
  903.         move.w    d1,d0
  904.         move.l    d0,BACK0LONG(a0)
  905.         moveq    #0,d0
  906.         rts
  907.  
  908.  
  909. **
  910. ** Eine Rasterzeile des VIC ausführen
  911. **
  912. ** d7: Rasterzeilenzähler
  913. ** a4: Zeiger auf VIC-Register
  914. ** a5: Zeiger auf das Ziel im Bildschirmspeicher
  915. **
  916.  
  917. ; VBlank: Zähler zurücksetzen
  918. VICVBlank    move.w    #-1,CURRENTRASTER(a4)
  919.         clr.w    VCBASE(a4)
  920.  
  921.         bsr    CountTODs    ;TODs zählen
  922.  
  923.         subq.w    #1,SkipCounter
  924.         sne    SKIPFRAME(a4)
  925.         bne    Periodic6569
  926.         move.w    SkipLatch,SkipCounter
  927.  
  928. ; Grafik darstellen
  929.         jsr    _RedrawDisplay
  930.         move.l    _CURRENTA5,CURRENTA5(a4)
  931.  
  932. ; CyberDirect: Basisadresse des Bildschirmspeichers holen
  933.         tst.b    IsCyberDirect
  934.         beq    1$
  935.         move.l    _CyberGfxBase,a6
  936.         move.l    _the_rast_port,a0
  937.         move.l    rp_BitMap(a0),a0
  938.         move.l    #CYBRMATTR_DISPADR,d0
  939.         jsr    GetCyberMapAttr(a6)
  940.         move.l    d0,CyberBase
  941. 1$
  942.         ;fällt durch!
  943.  
  944. *
  945. * Aktuelle Rasterzeile holen
  946. *
  947.  
  948. Periodic6569    lea    Registers,a4
  949.         move.w    CURRENTRASTER(a4),d7
  950.  
  951. *
  952. * Rasterzähler erhöhen (muß hier geschehen, damit bei einem Raster-IRQ
  953. *  der Wert des Rasterzählers mit der IRQ-Zeile übereinstimmt)
  954. *
  955.  
  956.         addq.w    #1,d7
  957.         move.w    d7,CURRENTRASTER(a4)
  958.         cmp.w    #TotalRasters,d7    ;Bildende erreicht?
  959.         beq    VICVBlank
  960.  
  961. *
  962. * Raster-IRQ auslösen, wenn Vergeichswert erreicht
  963. *
  964.  
  965.         cmp.w    IRQRASTER(a4),d7    ;IRQ-Zeile erreicht?
  966.         bne    NoRasterIRQ
  967.         or.b    #$01,IRQFLAG(a4)    ;Ja, IRST-Bit setzen
  968.         btst    #0,IRQMASK(a4)        ;Raster-IRQ erlaubt?
  969.         beq    NoRasterIRQ
  970.         or.b    #$80,IRQFLAG(a4)    ;Ja, IRQ-Bit setzen
  971.         st.b    IntIsVICIRQ        ;Und Interrupt auslösen
  972. NoRasterIRQ
  973.  
  974. *
  975. * In Zeile $30 entscheidet das DEN-Bit, ob Bad Lines auftreten dürfen
  976. *
  977.  
  978.         cmp.w    #$30,d7
  979.         bne    1$
  980.         btst    #4,CTRL1(a4)
  981.         sne    BADLINEENABLE(a4)
  982. 1$
  983.  
  984. *
  985. * Neue Anzahl CPU-Zyklen setzen
  986. *
  987.  
  988.         move.w    NormalCycles,CyclesLeft
  989.  
  990.         tst.b    SKIPFRAME(a4)
  991.         bne    VICSkip
  992.  
  993. *
  994. * Innerhalb des sichtbaren Bereichs?
  995. *
  996.  
  997.         cmp.w    #FirstDispLine,d7
  998.         blo    VICNop
  999.         cmp.w    #LastDispLine,d7
  1000.         bhi    VICNop
  1001.  
  1002. *
  1003. * Zeiger in Bildschirmspeicher nach a5 holen
  1004. *
  1005.  
  1006.         move.l    CURRENTA5(a4),a5
  1007.  
  1008. *
  1009. * VC-Zähler setzen
  1010. *
  1011.  
  1012.         move.w    VCBASE(a4),VCCOUNT(a4)
  1013.         clr.b    BADLINE(a4)
  1014.  
  1015. *
  1016. * Bei Amiga-Mono in Mono-VIC-Routine verzweigen
  1017. *
  1018.  
  1019.         cmp.w    #STYP_1BIT,ScreenType
  1020.         beq    AmigaMono6569
  1021.  
  1022. *
  1023. * "Bad Lines"-Videomatrixzugriff:
  1024. * 40 Bytes aus Videomatrix und Farb-RAM lesen und zwischenspeichern
  1025. *
  1026.  
  1027.         tst.b    BADLINEENABLE(a4) ;War das DEN-Bit in Rasterzeile $30 gesetzt?
  1028.         beq    NoBadLine
  1029.  
  1030.         cmp.w    #FirstDMALine,d7 ;Innerhalb des DMA-Bereiches?
  1031.         blo    NoBadLine
  1032.         cmp.w    #LastDMALine,d7
  1033.         bhi    NoBadLine
  1034.  
  1035.         move.b    d7,d0        ;Ja, stimmen die unteren Bits
  1036.         and.b    #7,d0        ;der Rasterzeile mit dem Y-Scroll
  1037.         cmp.b    YSCROLL+1(a4),d0 ;überein?
  1038.         bne    NoBadLine
  1039.  
  1040. IsBadLine    st.b    BADLINE(a4)    ;Ja, Bad Line
  1041.         move.w    VCCOUNT(a4),d2    ;d2: VC Videomatrix-Zähler
  1042.  
  1043.         move.l    MATRIXBASE(a4),a0 ;Videomatrixbasis holen
  1044.         add.w    d2,a0        ;Videomatrixzähler dazunehmen
  1045.  
  1046.         move.l    TheColor,a2    ;Zeiger auf Farb-RAM holen
  1047.         add.w    d2,a2        ;Videomatrixzähler dazunehmen
  1048.  
  1049.         lea    MatrixLine,a1    ;Videomatrix- und Farb-RAM-Zeile lesen
  1050.         lea    ColorLine,a3
  1051.         movem.l    (a0)+,d0-d6    ;Je 40 Bytes kopieren
  1052.         movem.l    d0-d6,(a1)
  1053.         movem.l    (a2)+,d0-d6
  1054.         movem.l    d0-d6,(a3)
  1055.         movem.l    (a0)+,d0-d2
  1056.         movem.l    d0-d2,28(a1)
  1057.         movem.l    (a2)+,d0-d2
  1058.         movem.l    d0-d2,28(a3)
  1059.  
  1060.         clr.w    RC(a4)        ;RC zurücksetzen
  1061.         clr.b    DISPLAYOFF(a4)    ;Darstellung anschalten
  1062.  
  1063.         move.w    BadLineCycles,CyclesLeft ;Andere Anzahl Zyklen
  1064. NoBadLine
  1065.  
  1066. *
  1067. * Oberen und unteren Rahmen handhaben
  1068. *
  1069.  
  1070.         cmp.w    DYSTOP(a4),d7    ;Unteres Ende des Fensters erreicht?
  1071.         bne    1$        ; -> Rahmen einschalten
  1072.         st.b    BORDERON(a4)
  1073.         bra    TBBorderDraw
  1074.  
  1075. 1$        btst    #4,CTRL1(a4)    ;Rahmen nur abschalten, wenn DEN-Bit gesetzt
  1076.         beq    TBBorderDone
  1077.         cmp.w    DYSTART(a4),d7    ;Oberes Ende des Fensters erreicht?
  1078.         bne    TBBorderDone    ; -> Rahmen abschalten
  1079.         clr.b    BORDERON(a4)
  1080.         bra    TBNoBorder
  1081.  
  1082. TBBorderDone    tst.b    BORDERON(a4)    ;Rahmen an?
  1083.         beq    TBNoBorder
  1084.  
  1085. TBBorderDraw    move.l    a5,a0        ;Ja, Rahmen malen.
  1086.         move.l    BORDERLONG(a4),d0 ;d0.l: Rahmenfarbe
  1087.         moveq    #DisplayX/4-1,d1
  1088. 1$        move.l    d0,(a0)+
  1089.         dbra    d1,1$
  1090.         bra    VICIncA5    ;Sonst nix
  1091. TBNoBorder
  1092.  
  1093. *
  1094. * Inhalt des Fensters: Darstellung eingeschaltet?
  1095. *
  1096.  
  1097.         lea    Col40XStart(a5),a1
  1098.         add.w    XSCROLL(a4),a1    ;a1: Ziel in Bildschirmspeicher
  1099.         lea    MatrixLine,a2    ;a2: Zeichencodes
  1100.         lea    ColorLine,a3    ;a3: Farbcodes
  1101.     IFNE    SPR_DATA_COLL
  1102.         lea    GfxCollBuf+Col40XStart,a6
  1103.         add.w    XSCROLL(a4),a6    ;a6: Grafik-Kollisionspuffer
  1104.     ENDC
  1105.  
  1106.         tst.b    DISPLAYOFF(a4)    ;$3FFF darstellen?
  1107.         bne    Show3FFF
  1108.  
  1109.         jmp    ([DisplayProc])    ;Nein, Routine für entsp. Modus anspringen
  1110.  
  1111. *
  1112. * Standard-Text: Zeichendaten holen und darstellen
  1113. *
  1114.  
  1115. TextStd        add.w    #40,VCCOUNT(a4)    ;VC erhöhen (wird nicht verwendet)
  1116.  
  1117.         move.l    CHARBASE(a4),a0    ;a0: Zeichengeneratorbasis
  1118.         add.w    RC(a4),a0    ;RC dazunehmen
  1119.  
  1120.         move.l    BACK0LONG(a4),d3 ;d3.l: Hintergrundfarbe
  1121.  
  1122.         move.l    d3,Col40XStart(a5) ;Hintergrund, wenn X-Scroll>0
  1123.         move.l    d3,Col40XStart+4(a5)
  1124.  
  1125. ; Schleife für 40 Zeichen
  1126.         moveq    #39,d1        ;d1: Zeichenzähler
  1127.         moveq    #0,d0
  1128. CharLoop    move.b    (a2)+,d0    ;Zeichencode lesen
  1129.         move.b    (a0,d0.l*8),d0    ;Zeichendaten lesen
  1130.         beq    OnlyBack
  1131.         move.b    (a3)+,d2    ;d2: Zeichenfarbe
  1132.  
  1133. ; 8 Pixel konvertieren
  1134.         add.b    d0,d0
  1135.         bcc    11$
  1136.         move.b    d2,(a1)+
  1137.     IFNE    SPR_DATA_COLL
  1138.         st.b    (a6)+
  1139.     ENDC
  1140.         bra    12$
  1141. 11$        move.b    d3,(a1)+
  1142.     IFNE    SPR_DATA_COLL
  1143.         clr.b    (a6)+
  1144.     ENDC
  1145. 12$        add.b    d0,d0
  1146.         bcc    21$
  1147.         move.b    d2,(a1)+
  1148.     IFNE    SPR_DATA_COLL
  1149.         st.b    (a6)+
  1150.     ENDC
  1151.         bra    22$
  1152. 21$        move.b    d3,(a1)+
  1153.     IFNE    SPR_DATA_COLL
  1154.         clr.b    (a6)+
  1155.     ENDC
  1156. 22$        add.b    d0,d0
  1157.         bcc    31$
  1158.         move.b    d2,(a1)+
  1159.     IFNE    SPR_DATA_COLL
  1160.         st.b    (a6)+
  1161.     ENDC
  1162.         bra    32$
  1163. 31$        move.b    d3,(a1)+
  1164.     IFNE    SPR_DATA_COLL
  1165.         clr.b    (a6)+
  1166.     ENDC
  1167. 32$        add.b    d0,d0
  1168.         bcc    41$
  1169.         move.b    d2,(a1)+
  1170.     IFNE    SPR_DATA_COLL
  1171.         st.b    (a6)+
  1172.     ENDC
  1173.         bra    42$
  1174. 41$        move.b    d3,(a1)+
  1175.     IFNE    SPR_DATA_COLL
  1176.         clr.b    (a6)+
  1177.     ENDC
  1178. 42$        add.b    d0,d0
  1179.         bcc    51$
  1180.         move.b    d2,(a1)+
  1181.     IFNE    SPR_DATA_COLL
  1182.         st.b    (a6)+
  1183.     ENDC
  1184.         bra    52$
  1185. 51$        move.b    d3,(a1)+
  1186.     IFNE    SPR_DATA_COLL
  1187.         clr.b    (a6)+
  1188.     ENDC
  1189. 52$        add.b    d0,d0
  1190.         bcc    61$
  1191.         move.b    d2,(a1)+
  1192.     IFNE    SPR_DATA_COLL
  1193.         st.b    (a6)+
  1194.     ENDC
  1195.         bra    62$
  1196. 61$        move.b    d3,(a1)+
  1197.     IFNE    SPR_DATA_COLL
  1198.         clr.b    (a6)+
  1199.     ENDC
  1200. 62$        add.b    d0,d0
  1201.         bcc    71$
  1202.         move.b    d2,(a1)+
  1203.     IFNE    SPR_DATA_COLL
  1204.         st.b    (a6)+
  1205.     ENDC
  1206.         bra    72$
  1207. 71$        move.b    d3,(a1)+
  1208.     IFNE    SPR_DATA_COLL
  1209.         clr.b    (a6)+
  1210.     ENDC
  1211. 72$        add.b    d0,d0
  1212.         bcc    81$
  1213.         move.b    d2,(a1)+
  1214.     IFNE    SPR_DATA_COLL
  1215.         st.b    (a6)+
  1216.     ENDC
  1217.         bra    82$
  1218. 81$        move.b    d3,(a1)+
  1219.     IFNE    SPR_DATA_COLL
  1220.         clr.b    (a6)+
  1221.     ENDC
  1222. 82$        dbra    d1,CharLoop
  1223.         bra    DoSprites
  1224.  
  1225. ; Nur Hintergrund
  1226.         CNOP    0,4
  1227. OnlyBack    move.l    d3,(a1)+
  1228.         move.l    d3,(a1)+
  1229.     IFNE    SPR_DATA_COLL
  1230.         clr.l    (a6)+
  1231.         clr.l    (a6)+
  1232.     ENDC
  1233.         addq.w    #1,a3        ;Farb-RAM-Byte überspringen
  1234.         dbra    d1,CharLoop
  1235.         bra    DoSprites
  1236.  
  1237. *
  1238. * Multicolor-Text: Zeichendaten holen und darstellen
  1239. *
  1240.  
  1241. TextMulti    add.w    #40,VCCOUNT(a4)    ;VC erhöhen (wird nicht verwendet)
  1242.  
  1243.         move.l    CHARBASE(a4),a0    ;a0: Zeichengeneratorbasis
  1244.         add.w    RC(a4),a0    ;RC dazunehmen
  1245.  
  1246.         move.l    BACK0LONG(a4),d3 ;d3.l: Farbe 0
  1247.  
  1248.         move.w    $22(a4),d4    ;d4.w: Farbe 1
  1249.         move.b    $22(a4),d4
  1250.  
  1251.         move.w    $23(a4),d5    ;d5.w: Farbe 2
  1252.         move.b    $23(a4),d5
  1253.  
  1254.         move.l    d3,Col40XStart(a5) ;Hintergrund, wenn X-Scroll>0
  1255.         move.l    d3,Col40XStart+4(a5)
  1256.  
  1257. ; Schleife für 40 Zeichen
  1258.         moveq    #39,d1        ;d1: Zeichenzähler
  1259.         moveq    #0,d0
  1260. CharMLoop    move.b    (a2)+,d0    ;Zeichencode lesen
  1261.         move.b    (a0,d0.l*8),d0    ;Zeichendaten lesen
  1262.         beq    MOnlyBack
  1263.         move.b    (a3)+,d2    ;d2: Farbnibble
  1264.         bclr    #3,d2        ;Standard oder Multi?
  1265.         beq    StdInMulti
  1266.  
  1267. ; Multicolor: 4 Pixel konvertieren
  1268.         add.b    d0,d0
  1269.         bcc    11$
  1270.         add.b    d0,d0
  1271.         bcc    12$
  1272.         move.b    d2,(a1)+    ;11
  1273.         move.b    d2,(a1)+
  1274.     IFNE    SPR_DATA_COLL
  1275.         st.b    (a6)+
  1276.         st.b    (a6)+
  1277.     ENDC
  1278.         bra    14$
  1279. 12$        move.w    d5,(a1)+    ;10
  1280.     IFNE    SPR_DATA_COLL
  1281.         st.b    (a6)+
  1282.         st.b    (a6)+
  1283.     ENDC
  1284.         bra    14$
  1285. 11$
  1286.     IFNE    SPR_DATA_COLL
  1287.         clr.w    (a6)+
  1288.     ENDC
  1289.         add.b    d0,d0
  1290.         bcc    13$
  1291.         move.w    d4,(a1)+    ;01
  1292.         bra    14$
  1293. 13$        move.w    d3,(a1)+    ;00
  1294. 14$
  1295.  
  1296.         add.b    d0,d0
  1297.         bcc    21$
  1298.         add.b    d0,d0
  1299.         bcc    22$
  1300.         move.b    d2,(a1)+    ;11
  1301.         move.b    d2,(a1)+
  1302.     IFNE    SPR_DATA_COLL
  1303.         st.b    (a6)+
  1304.         st.b    (a6)+
  1305.     ENDC
  1306.         bra    24$
  1307. 22$        move.w    d5,(a1)+    ;10
  1308.     IFNE    SPR_DATA_COLL
  1309.         st.b    (a6)+
  1310.         st.b    (a6)+
  1311.     ENDC
  1312.         bra    24$
  1313. 21$
  1314.     IFNE    SPR_DATA_COLL
  1315.         clr.w    (a6)+
  1316.     ENDC
  1317.         add.b    d0,d0
  1318.         bcc    23$
  1319.         move.w    d4,(a1)+    ;01
  1320.         bra    24$
  1321. 23$        move.w    d3,(a1)+    ;00
  1322. 24$
  1323.  
  1324.         add.b    d0,d0
  1325.         bcc    31$
  1326.         add.b    d0,d0
  1327.         bcc    32$
  1328.         move.b    d2,(a1)+    ;11
  1329.         move.b    d2,(a1)+
  1330.     IFNE    SPR_DATA_COLL
  1331.         st.b    (a6)+
  1332.         st.b    (a6)+
  1333.     ENDC
  1334.         bra    34$
  1335. 32$        move.w    d5,(a1)+    ;10
  1336.     IFNE    SPR_DATA_COLL
  1337.         st.b    (a6)+
  1338.         st.b    (a6)+
  1339.     ENDC
  1340.         bra    34$
  1341. 31$
  1342.     IFNE    SPR_DATA_COLL
  1343.         clr.w    (a6)+
  1344.     ENDC
  1345.         add.b    d0,d0
  1346.         bcc    33$
  1347.         move.w    d4,(a1)+    ;01
  1348.         bra    34$
  1349. 33$        move.w    d3,(a1)+    ;00
  1350. 34$
  1351.  
  1352.         add.b    d0,d0
  1353.         bcc    41$
  1354.         add.b    d0,d0
  1355.         bcc    42$
  1356.         move.b    d2,(a1)+    ;11
  1357.         move.b    d2,(a1)+
  1358.     IFNE    SPR_DATA_COLL
  1359.         st.b    (a6)+
  1360.         st.b    (a6)+
  1361.     ENDC
  1362.         bra    44$
  1363. 42$        move.w    d5,(a1)+    ;10
  1364.     IFNE    SPR_DATA_COLL
  1365.         st.b    (a6)+
  1366.         st.b    (a6)+
  1367.     ENDC
  1368.         bra    44$
  1369. 41$
  1370.     IFNE    SPR_DATA_COLL
  1371.         clr.w    (a6)+
  1372.     ENDC
  1373.         add.b    d0,d0
  1374.         bcc    43$
  1375.         move.w    d4,(a1)+    ;01
  1376.         bra    44$
  1377. 43$        move.w    d3,(a1)+    ;00
  1378. 44$
  1379.         dbra    d1,CharMLoop
  1380.         bra    DoSprites
  1381.  
  1382. ; Standard: 8 Pixel konvertieren
  1383.         CNOP    0,4
  1384. StdInMulti    add.b    d0,d0
  1385.         bcc    11$
  1386.         move.b    d2,(a1)+
  1387.     IFNE    SPR_DATA_COLL
  1388.         st.b    (a6)+
  1389.     ENDC
  1390.         bra    12$
  1391. 11$        move.b    d3,(a1)+
  1392.     IFNE    SPR_DATA_COLL
  1393.         clr.b    (a6)+
  1394.     ENDC
  1395. 12$        add.b    d0,d0
  1396.         bcc    21$
  1397.         move.b    d2,(a1)+
  1398.     IFNE    SPR_DATA_COLL
  1399.         st.b    (a6)+
  1400.     ENDC
  1401.         bra    22$
  1402. 21$        move.b    d3,(a1)+
  1403.     IFNE    SPR_DATA_COLL
  1404.         clr.b    (a6)+
  1405.     ENDC
  1406. 22$        add.b    d0,d0
  1407.         bcc    31$
  1408.         move.b    d2,(a1)+
  1409.     IFNE    SPR_DATA_COLL
  1410.         st.b    (a6)+
  1411.     ENDC
  1412.         bra    32$
  1413. 31$        move.b    d3,(a1)+
  1414.     IFNE    SPR_DATA_COLL
  1415.         clr.b    (a6)+
  1416.     ENDC
  1417. 32$        add.b    d0,d0
  1418.         bcc    41$
  1419.         move.b    d2,(a1)+
  1420.     IFNE    SPR_DATA_COLL
  1421.         st.b    (a6)+
  1422.     ENDC
  1423.         bra    42$
  1424. 41$        move.b    d3,(a1)+
  1425.     IFNE    SPR_DATA_COLL
  1426.         clr.b    (a6)+
  1427.     ENDC
  1428. 42$        add.b    d0,d0
  1429.         bcc    51$
  1430.         move.b    d2,(a1)+
  1431.     IFNE    SPR_DATA_COLL
  1432.         st.b    (a6)+
  1433.     ENDC
  1434.         bra    52$
  1435. 51$        move.b    d3,(a1)+
  1436.     IFNE    SPR_DATA_COLL
  1437.         clr.b    (a6)+
  1438.     ENDC
  1439. 52$        add.b    d0,d0
  1440.         bcc    61$
  1441.         move.b    d2,(a1)+
  1442.     IFNE    SPR_DATA_COLL
  1443.         st.b    (a6)+
  1444.     ENDC
  1445.         bra    62$
  1446. 61$        move.b    d3,(a1)+
  1447.     IFNE    SPR_DATA_COLL
  1448.         clr.b    (a6)+
  1449.     ENDC
  1450. 62$        add.b    d0,d0
  1451.         bcc    71$
  1452.         move.b    d2,(a1)+
  1453.     IFNE    SPR_DATA_COLL
  1454.         st.b    (a6)+
  1455.     ENDC
  1456.         bra    72$
  1457. 71$        move.b    d3,(a1)+
  1458.     IFNE    SPR_DATA_COLL
  1459.         clr.b    (a6)+
  1460.     ENDC
  1461. 72$        add.b    d0,d0
  1462.         bcc    81$
  1463.         move.b    d2,(a1)+
  1464.     IFNE    SPR_DATA_COLL
  1465.         st.b    (a6)+
  1466.     ENDC
  1467.         bra    82$
  1468. 81$        move.b    d3,(a1)+
  1469.     IFNE    SPR_DATA_COLL
  1470.         clr.b    (a6)+
  1471.     ENDC
  1472. 82$        dbra    d1,CharMLoop
  1473.         bra    DoSprites
  1474.  
  1475. ; Nur Hintergrund
  1476.         CNOP    0,4
  1477. MOnlyBack    move.l    d3,(a1)+
  1478.         move.l    d3,(a1)+
  1479.     IFNE    SPR_DATA_COLL
  1480.         clr.l    (a6)+
  1481.         clr.l    (a6)+
  1482.     ENDC
  1483.         addq.w    #1,a3        ;Farb-RAM-Byte überspringen
  1484.         dbra    d1,CharMLoop
  1485.         bra    DoSprites
  1486.  
  1487. *
  1488. * Extended Color Mode: Grafikdaten holen und darstellen
  1489. *
  1490.  
  1491. TextECM        add.w    #40,VCCOUNT(a4)    ;VC erhöhen (wird nicht verwendet)
  1492.  
  1493.         move.l    CHARBASE(a4),a0    ;a0: Zeichengeneratorbasis
  1494.         add.w    RC(a4),a0    ;RC dazunehmen
  1495.  
  1496.         move.b    $21(a4),d3    ;d3: Hintergrund 0
  1497.         move.b    $22(a4),d4    ;d4: Hintergrund 1
  1498.         move.b    $23(a4),d5    ;d5: Hintergrund 2
  1499.  
  1500.         move.w    LASTBKGD(a4),d0    ;Letzter Hintergrund, wenn X-Scroll>0
  1501.         move.b    LASTBKGD(a4),d0
  1502.  
  1503.         move.w    d0,Col40XStart(a5)
  1504.         move.w    d0,Col40XStart+2(a5)
  1505.         move.w    d0,Col40XStart+4(a5)
  1506.         move.w    d0,Col40XStart+6(a5)
  1507.  
  1508. ; Schleife für 40 Zeichen
  1509. ; d7: Aktuelle Hintergrundfarbe
  1510.         moveq    #39,d1        ;d1: Zeichenzähler
  1511.         moveq    #0,d0
  1512. CharELoop    move.b    (a2)+,d0    ;Zeichencode lesen
  1513.         move.b    (a3)+,d2    ;d2: Farbnibble
  1514.         bclr    #7,d0
  1515.         bne    1$
  1516.         bclr    #6,d0
  1517.         bne    2$
  1518.         move.b    d3,d7        ;00: Hintergrund 0
  1519.         bra    4$
  1520. 2$        move.b    d4,d7        ;01: Hintergrund 1
  1521.         bra    4$
  1522. 1$        bclr    #6,d0
  1523.         bne    3$
  1524.         move.b    d5,d7        ;10: Hintergrund 2
  1525.         bra    4$
  1526. 3$        move.b    $24(a4),d7    ;11: Hintergrund 3
  1527. 4$        move.b    (a0,d0.l*8),d0    ;Zeichendaten lesen
  1528.         beq    EOnlyBack
  1529.  
  1530. ; 8 Pixel konvertieren
  1531.         add.b    d0,d0
  1532.         bcc    11$
  1533.         move.b    d2,(a1)+
  1534.     IFNE    SPR_DATA_COLL
  1535.         st.b    (a6)+
  1536.     ENDC
  1537.         bra    12$
  1538. 11$        move.b    d7,(a1)+
  1539.     IFNE    SPR_DATA_COLL
  1540.         clr.b    (a6)+
  1541.     ENDC
  1542. 12$        add.b    d0,d0
  1543.         bcc    21$
  1544.         move.b    d2,(a1)+
  1545.     IFNE    SPR_DATA_COLL
  1546.         st.b    (a6)+
  1547.     ENDC
  1548.         bra    22$
  1549. 21$        move.b    d7,(a1)+
  1550.     IFNE    SPR_DATA_COLL
  1551.         clr.b    (a6)+
  1552.     ENDC
  1553. 22$        add.b    d0,d0
  1554.         bcc    31$
  1555.         move.b    d2,(a1)+
  1556.     IFNE    SPR_DATA_COLL
  1557.         st.b    (a6)+
  1558.     ENDC
  1559.         bra    32$
  1560. 31$        move.b    d7,(a1)+
  1561.     IFNE    SPR_DATA_COLL
  1562.         clr.b    (a6)+
  1563.     ENDC
  1564. 32$        add.b    d0,d0
  1565.         bcc    41$
  1566.         move.b    d2,(a1)+
  1567.     IFNE    SPR_DATA_COLL
  1568.         st.b    (a6)+
  1569.     ENDC
  1570.         bra    42$
  1571. 41$        move.b    d7,(a1)+
  1572.     IFNE    SPR_DATA_COLL
  1573.         clr.b    (a6)+
  1574.     ENDC
  1575. 42$        add.b    d0,d0
  1576.         bcc    51$
  1577.         move.b    d2,(a1)+
  1578.     IFNE    SPR_DATA_COLL
  1579.         st.b    (a6)+
  1580.     ENDC
  1581.         bra    52$
  1582. 51$        move.b    d7,(a1)+
  1583.     IFNE    SPR_DATA_COLL
  1584.         clr.b    (a6)+
  1585.     ENDC
  1586. 52$        add.b    d0,d0
  1587.         bcc    61$
  1588.         move.b    d2,(a1)+
  1589.     IFNE    SPR_DATA_COLL
  1590.         st.b    (a6)+
  1591.     ENDC
  1592.         bra    62$
  1593. 61$        move.b    d7,(a1)+
  1594.     IFNE    SPR_DATA_COLL
  1595.         clr.b    (a6)+
  1596.     ENDC
  1597. 62$        add.b    d0,d0
  1598.         bcc    71$
  1599.         move.b    d2,(a1)+
  1600.     IFNE    SPR_DATA_COLL
  1601.         st.b    (a6)+
  1602.     ENDC
  1603.         bra    72$
  1604. 71$        move.b    d7,(a1)+
  1605.     IFNE    SPR_DATA_COLL
  1606.         clr.b    (a6)+
  1607.     ENDC
  1608. 72$        add.b    d0,d0
  1609.         bcc    81$
  1610.         move.b    d2,(a1)+
  1611.     IFNE    SPR_DATA_COLL
  1612.         st.b    (a6)+
  1613.     ENDC
  1614.         bra    82$
  1615. 81$        move.b    d7,(a1)+
  1616.     IFNE    SPR_DATA_COLL
  1617.         clr.b    (a6)+
  1618.     ENDC
  1619. 82$        dbra    d1,CharELoop
  1620.  
  1621.         move.b    d7,LASTBKGD(a4)    ;Letzte Hintergrundfarbe merken
  1622.         move.w    CURRENTRASTER(a4),d7    ;d7 wurde zerstört
  1623.         bra    DoSprites
  1624.  
  1625. ; Nur Hintergrund
  1626.         CNOP    0,4
  1627. EOnlyBack    move.b    d7,(a1)+
  1628.         move.b    d7,(a1)+
  1629.         move.b    d7,(a1)+
  1630.         move.b    d7,(a1)+
  1631.         move.b    d7,(a1)+
  1632.         move.b    d7,(a1)+
  1633.         move.b    d7,(a1)+
  1634.         move.b    d7,(a1)+
  1635.     IFNE    SPR_DATA_COLL
  1636.         clr.l    (a6)+
  1637.         clr.l    (a6)+
  1638.     ENDC
  1639.         dbra    d1,CharELoop
  1640.         move.b    d7,LASTBKGD(a4)    ;Letzte Hintergrundfarbe merken
  1641.         move.w    CURRENTRASTER(a4),d7    ;d7 wurde zerstört
  1642.         bra    DoSprites
  1643.  
  1644. *
  1645. * Standard-BitMap: Grafikdaten holen und darstellen
  1646. *
  1647.  
  1648. BitMapStd    move.l    BITMAPBASE(a4),a0 ;a0: Bitmap-Basis
  1649.         move.w    VCCOUNT(a4),d0    ;VC holen
  1650.         lsl.w    #3,d0        ;*8
  1651.         add.w    RC(a4),d0    ;RC dazunehmen
  1652.         add.w    d0,a0        ;und zur Bitmap-Basis dazunehmen
  1653.  
  1654.         add.w    #40,VCCOUNT(a4)    ;VC erhöhen
  1655.  
  1656.         move.w    LASTBKGD(a4),d0    ;Letzter Hintergrund, wenn X-Scroll>0
  1657.         move.b    LASTBKGD(a4),d0
  1658.  
  1659.         move.w    d0,Col40XStart(a5)
  1660.         move.w    d0,Col40XStart+2(a5)
  1661.         move.w    d0,Col40XStart+4(a5)
  1662.         move.w    d0,Col40XStart+6(a5)
  1663.  
  1664. ; Schleife für 40 Bytes
  1665.         moveq    #39,d1        ;d1: Zeichenzähler
  1666. BitMapLoop    move.b    (a2)+,d2    ;Farbe holen
  1667.         move.b    d2,d3        ;d3: Hintergrundfarbe
  1668.         move.b    (a0),d0        ;Byte holen
  1669.         beq    BOnlyBack
  1670.         lsr.b    #4,d2        ;d2: Vordergrundfarbe
  1671.  
  1672. ; 8 Pixel konvertieren
  1673.         add.b    d0,d0
  1674.         bcc    11$
  1675.         move.b    d2,(a1)+
  1676.     IFNE    SPR_DATA_COLL
  1677.         st.b    (a6)+
  1678.     ENDC
  1679.         bra    12$
  1680. 11$        move.b    d3,(a1)+
  1681.     IFNE    SPR_DATA_COLL
  1682.         clr.b    (a6)+
  1683.     ENDC
  1684. 12$        add.b    d0,d0
  1685.         bcc    21$
  1686.         move.b    d2,(a1)+
  1687.     IFNE    SPR_DATA_COLL
  1688.         st.b    (a6)+
  1689.     ENDC
  1690.         bra    22$
  1691. 21$        move.b    d3,(a1)+
  1692.     IFNE    SPR_DATA_COLL
  1693.         clr.b    (a6)+
  1694.     ENDC
  1695. 22$        add.b    d0,d0
  1696.         bcc    31$
  1697.         move.b    d2,(a1)+
  1698.     IFNE    SPR_DATA_COLL
  1699.         st.b    (a6)+
  1700.     ENDC
  1701.         bra    32$
  1702. 31$        move.b    d3,(a1)+
  1703.     IFNE    SPR_DATA_COLL
  1704.         clr.b    (a6)+
  1705.     ENDC
  1706. 32$        add.b    d0,d0
  1707.         bcc    41$
  1708.         move.b    d2,(a1)+
  1709.     IFNE    SPR_DATA_COLL
  1710.         st.b    (a6)+
  1711.     ENDC
  1712.         bra    42$
  1713. 41$        move.b    d3,(a1)+
  1714.     IFNE    SPR_DATA_COLL
  1715.         clr.b    (a6)+
  1716.     ENDC
  1717. 42$        add.b    d0,d0
  1718.         bcc    51$
  1719.         move.b    d2,(a1)+
  1720.     IFNE    SPR_DATA_COLL
  1721.         st.b    (a6)+
  1722.     ENDC
  1723.         bra    52$
  1724. 51$        move.b    d3,(a1)+
  1725.     IFNE    SPR_DATA_COLL
  1726.         clr.b    (a6)+
  1727.     ENDC
  1728. 52$        add.b    d0,d0
  1729.         bcc    61$
  1730.         move.b    d2,(a1)+
  1731.     IFNE    SPR_DATA_COLL
  1732.         st.b    (a6)+
  1733.     ENDC
  1734.         bra    62$
  1735. 61$        move.b    d3,(a1)+
  1736.     IFNE    SPR_DATA_COLL
  1737.         clr.b    (a6)+
  1738.     ENDC
  1739. 62$        add.b    d0,d0
  1740.         bcc    71$
  1741.         move.b    d2,(a1)+
  1742.     IFNE    SPR_DATA_COLL
  1743.         st.b    (a6)+
  1744.     ENDC
  1745.         bra    72$
  1746. 71$        move.b    d3,(a1)+
  1747.     IFNE    SPR_DATA_COLL
  1748.         clr.b    (a6)+
  1749.     ENDC
  1750. 72$        add.b    d0,d0
  1751.         bcc    81$
  1752.         move.b    d2,(a1)+
  1753.     IFNE    SPR_DATA_COLL
  1754.         st.b    (a6)+
  1755.     ENDC
  1756.         bra    82$
  1757. 81$        move.b    d3,(a1)+
  1758.     IFNE    SPR_DATA_COLL
  1759.         clr.b    (a6)+
  1760.     ENDC
  1761. 82$        addq.l    #8,a0        ;Quellzeiger erhöhen
  1762.         dbra    d1,BitMapLoop
  1763.  
  1764.         move.b    d3,LASTBKGD(a4)    ;Letzte Hintergrundfarbe merken
  1765.         bra    DoSprites
  1766.  
  1767. ; Nur Hintergrund
  1768.         CNOP    0,4
  1769. BOnlyBack    move.b    d3,(a1)+
  1770.         move.b    d3,(a1)+
  1771.         move.b    d3,(a1)+
  1772.         move.b    d3,(a1)+
  1773.         move.b    d3,(a1)+
  1774.         move.b    d3,(a1)+
  1775.         move.b    d3,(a1)+
  1776.         move.b    d3,(a1)+
  1777.     IFNE    SPR_DATA_COLL
  1778.         clr.l    (a6)+
  1779.         clr.l    (a6)+
  1780.     ENDC
  1781.         addq.l    #8,a0        ;Quellzeiger erhöhen
  1782.         dbra    d1,BitMapLoop
  1783.         move.b    d3,LASTBKGD(a4)    ;Letzte Hintergrundfarbe merken
  1784.         bra    DoSprites
  1785.  
  1786. *
  1787. * Multicolor-Bitmap: Grafikdaten holen und darstellen
  1788. *
  1789.  
  1790. BitMapMulti    move.l    BITMAPBASE(a4),a0 ;a0: Bitmap-Basis
  1791.         move.w    VCCOUNT(a4),d0    ;VC holen
  1792.         lsl.w    #3,d0        ;*8
  1793.         add.w    RC(a4),d0    ;RC dazunehmen
  1794.         add.w    d0,a0        ;und zur Bitmap-Basis dazunehmen
  1795.  
  1796.         add.w    #40,VCCOUNT(a4)    ;VC erhöhen
  1797.  
  1798.         move.l    BACK0LONG(a4),d5 ;d5.w: Farbe 0
  1799.  
  1800.         move.l    d5,Col40XStart(a5) ;Hintergrund, wenn X-Scroll>0
  1801.         move.l    d5,Col40XStart+4(a5)
  1802.  
  1803. ; Schleife für 40 Bytes
  1804.         moveq    #39,d1
  1805. BitMapMLoop    move.b    (a2)+,d2    ;Farbe 1/2 holen
  1806.         move.b    (a0),d0        ;Byte holen
  1807.         beq    BMOnlyBack
  1808.         move.b    d2,d3        ;d3.b: Farbe 2
  1809.         lsl.w    #8,d3
  1810.         move.b    d2,d3
  1811.         lsr.b    #4,d2        ;d2.b: Farbe 1
  1812.         move.b    (a3),d4        ;d4.b: Farbe 3
  1813.         lsl.w    #8,d4
  1814.         move.b    (a3)+,d4
  1815.  
  1816. ; 4 Pixel konvertieren
  1817.         add.b    d0,d0
  1818.         bcc    11$
  1819.         add.b    d0,d0
  1820.         bcc    12$
  1821.         move.w    d4,(a1)+    ;11
  1822.     IFNE    SPR_DATA_COLL
  1823.         st.b    (a6)+
  1824.         st.b    (a6)+
  1825.     ENDC
  1826.         bra    14$
  1827. 12$        move.w    d3,(a1)+    ;10
  1828.     IFNE    SPR_DATA_COLL
  1829.         st.b    (a6)+
  1830.         st.b    (a6)+
  1831.     ENDC
  1832.         bra    14$
  1833. 11$    
  1834.     IFNE    SPR_DATA_COLL
  1835.         clr.w    (a6)+
  1836.     ENDC
  1837.         add.b    d0,d0
  1838.         bcc    13$
  1839.         move.b    d2,(a1)+    ;01
  1840.         move.b    d2,(a1)+
  1841.         bra    14$
  1842. 13$        move.w    d5,(a1)+    ;00
  1843. 14$
  1844.  
  1845.         add.b    d0,d0
  1846.         bcc    21$
  1847.         add.b    d0,d0
  1848.         bcc    22$
  1849.         move.w    d4,(a1)+    ;11
  1850.     IFNE    SPR_DATA_COLL
  1851.         st.b    (a6)+
  1852.         st.b    (a6)+
  1853.     ENDC
  1854.         bra    24$
  1855. 22$        move.w    d3,(a1)+    ;10
  1856.     IFNE    SPR_DATA_COLL
  1857.         st.b    (a6)+
  1858.         st.b    (a6)+
  1859.     ENDC
  1860.         bra    24$
  1861. 21$    
  1862.     IFNE    SPR_DATA_COLL
  1863.         clr.w    (a6)+
  1864.     ENDC
  1865.         add.b    d0,d0
  1866.         bcc    23$
  1867.         move.b    d2,(a1)+    ;01
  1868.         move.b    d2,(a1)+
  1869.         bra    24$
  1870. 23$        move.w    d5,(a1)+    ;00
  1871. 24$
  1872.  
  1873.         add.b    d0,d0
  1874.         bcc    31$
  1875.         add.b    d0,d0
  1876.         bcc    32$
  1877.         move.w    d4,(a1)+    ;11
  1878.     IFNE    SPR_DATA_COLL
  1879.         st.b    (a6)+
  1880.         st.b    (a6)+
  1881.     ENDC
  1882.         bra    34$
  1883. 32$        move.w    d3,(a1)+    ;10
  1884.     IFNE    SPR_DATA_COLL
  1885.         st.b    (a6)+
  1886.         st.b    (a6)+
  1887.     ENDC
  1888.         bra    34$
  1889. 31$    
  1890.     IFNE    SPR_DATA_COLL
  1891.         clr.w    (a6)+
  1892.     ENDC
  1893.         add.b    d0,d0
  1894.         bcc    33$
  1895.         move.b    d2,(a1)+    ;01
  1896.         move.b    d2,(a1)+
  1897.         bra    34$
  1898. 33$        move.w    d5,(a1)+    ;00
  1899. 34$
  1900.  
  1901.         add.b    d0,d0
  1902.         bcc    41$
  1903.         add.b    d0,d0
  1904.         bcc    42$
  1905.         move.w    d4,(a1)+    ;11
  1906.     IFNE    SPR_DATA_COLL
  1907.         st.b    (a6)+
  1908.         st.b    (a6)+
  1909.     ENDC
  1910.         bra    44$
  1911. 42$        move.w    d3,(a1)+    ;10
  1912.     IFNE    SPR_DATA_COLL
  1913.         st.b    (a6)+
  1914.         st.b    (a6)+
  1915.     ENDC
  1916.         bra    44$
  1917. 41$    
  1918.     IFNE    SPR_DATA_COLL
  1919.         clr.w    (a6)+
  1920.     ENDC
  1921.         add.b    d0,d0
  1922.         bcc    43$
  1923.         move.b    d2,(a1)+    ;01
  1924.         move.b    d2,(a1)+
  1925.         bra    44$
  1926. 43$        move.w    d5,(a1)+    ;00
  1927. 44$
  1928.         addq.l    #8,a0        ;Quellzeiger erhöhen
  1929.         dbra    d1,BitMapMLoop
  1930.         bra    DoSprites
  1931.  
  1932. ; Nur Hintergrund
  1933.         CNOP    0,4
  1934. BMOnlyBack    move.l    d5,(a1)+
  1935.         move.l    d5,(a1)+
  1936.     IFNE    SPR_DATA_COLL
  1937.         clr.l    (a6)+
  1938.         clr.l    (a6)+
  1939.     ENDC
  1940.         addq.w    #1,a3        ;Farb-RAM-Byte überspringen
  1941.         addq.l    #8,a0        ;Quellzeiger erhöhen
  1942.         dbra    d1,BitMapMLoop
  1943.         bra    DoSprites
  1944.  
  1945. *
  1946. * Ungültiger Darstellungsmodus: Schwarzen Bildschirm anzeigen
  1947. *
  1948.  
  1949. BlackScreen    add.w    #40,VCCOUNT(a4)    ;VC erhöhen
  1950.  
  1951.         moveq    #39,d0        ;40 Zeichen schwarz
  1952. 1$        clr.l    (a1)+
  1953.         clr.l    (a1)+
  1954.     IFNE    SPR_DATA_COLL
  1955.         clr.l    (a6)+
  1956.         clr.l    (a6)+
  1957.     ENDC
  1958.         dbra    d0,1$
  1959.         bra    DoSprites
  1960.  
  1961. *
  1962. * $3FFF darstellen
  1963. *
  1964.  
  1965. Show3FFF    move.l    BACK0LONG(a4),d3 ;d3.w: Hintergrundfarbe
  1966.  
  1967.         move.l    d3,Col40XStart(a5) ;Hintergrund, wenn X-Scroll>0
  1968.         move.l    d3,Col40XStart+4(a5)
  1969.  
  1970.         btst    #6,CTRL1(a4)
  1971.         bne    11$
  1972.         move.w    #$3fff,d0    ;Byte bei $3FFF lesen
  1973.         bra    12$
  1974. 11$        move.w    #$39ff,d0    ;ECM: Byte bei $39FF lesen
  1975. 12$        bsr    GetPhysical
  1976.         move.b    (a0),d0        ;Byte lesen
  1977.  
  1978. ; 4 Pixel nach d1 konvertieren, 0: Hintergrund, 1: schwarz
  1979.         moveq    #0,d1
  1980.         add.b    d0,d0
  1981.         bcs    1$
  1982.         move.b    d3,d1
  1983. 1$        lsl.w    #8,d1
  1984.         add.b    d0,d0
  1985.         bcs    2$
  1986.         move.b    d3,d1
  1987. 2$        lsl.l    #8,d1
  1988.         add.b    d0,d0
  1989.         bcs    3$
  1990.         move.b    d3,d1
  1991. 3$        lsl.l    #8,d1
  1992.         add.b    d0,d0
  1993.         bcs    4$
  1994.         move.b    d3,d1
  1995. 4$
  1996.  
  1997. ; 4 Pixel nach d2 konvertieren
  1998.         moveq    #0,d2
  1999.         add.b    d0,d0
  2000.         bcs    5$
  2001.         move.b    d3,d2
  2002. 5$        lsl.w    #8,d2
  2003.         add.b    d0,d0
  2004.         bcs    6$
  2005.         move.b    d3,d2
  2006. 6$        lsl.l    #8,d2
  2007.         add.b    d0,d0
  2008.         bcs    7$
  2009.         move.b    d3,d2
  2010. 7$        lsl.l    #8,d2
  2011.         add.b    d0,d0
  2012.         bcs    8$
  2013.         move.b    d3,d2
  2014. 8$
  2015.  
  2016. ; Zeile schreiben
  2017.         moveq    #39,d0        ;d0: Bytezähler
  2018. Loop3FFF    move.l    d1,(a1)+
  2019.         move.l    d2,(a1)+
  2020.     IFNE    SPR_DATA_COLL
  2021.         clr.l    (a6)+        ;Falsch!!
  2022.         clr.l    (a6)+
  2023.     ENDC
  2024.         dbra    d0,Loop3FFF
  2025.  
  2026. *
  2027. * Sprites malen?
  2028. *
  2029.  
  2030. DoSprites    tst.b    SPRITEON(a4)    ;Ist überhaupt ein Sprite z.Z. sichtbar?
  2031.         beq    DrawLRBorder    ;Nein, dann Rahmen
  2032.  
  2033. *
  2034. * Mindestens ein Sprite ist sichtbar, Sprites malen
  2035. *
  2036.  
  2037. ; Kollisions-Puffer löschen
  2038.         lea    SprCollBuf,a0
  2039.         moveq    #DisplayX/4-1,d0
  2040. 1$        clr.l    (a0)+
  2041.         dbra    d0,1$
  2042.  
  2043. ; Sprites malen
  2044.         moveq    #0,d4        ;Sprite-Grafik Kollisionsflag
  2045.         moveq    #0,d5        ;Sprite-Sprite Kollisionsflag
  2046.         DoSprite 0
  2047.         DoSprite 1
  2048.         DoSprite 2
  2049.         DoSprite 3
  2050.         DoSprite 4
  2051.         DoSprite 5
  2052.         DoSprite 6
  2053.         DoSprite 7
  2054.         move.w    CURRENTRASTER(a4),d7    ;d7 wurde zerstört
  2055.  
  2056. ; Kollisions-Flags auswerten
  2057.         tst.w    Collisions
  2058.         beq    DrawLRBorder
  2059.  
  2060.         move.b    CLXSPR(a4),d0
  2061.         or.b    d5,CLXSPR(a4)    ;Bits im Kollisionsregister setzen
  2062.         tst.b    d0        ;Haben bereits Kollisionen stattgefunden?
  2063.         bne    2$
  2064.         or.b    #$04,IRQFLAG(a4) ;Nein, IMMC-Bit setzen
  2065.         btst    #2,IRQMASK(a4)    ;IRQ erlaubt?
  2066.         beq    2$
  2067.         or.b    #$80,IRQFLAG(a4) ;Ja, IRQ-Bit setzen
  2068.         st.b    IntIsVICIRQ    ;Und Interrupt auslösen
  2069.  
  2070. 2$        move.b    CLXBGR(a4),d0
  2071.         or.b    d4,CLXBGR(a4)
  2072.         tst.b    d0
  2073.         bne    DrawLRBorder
  2074.         or.b    #$02,IRQFLAG(a4)
  2075.         btst    #1,IRQMASK(a4)
  2076.         beq    DrawLRBorder
  2077.         or.b    #$80,IRQFLAG(a4)
  2078.         st.b    IntIsVICIRQ
  2079.  
  2080. *
  2081. * Linken und rechten Rahmen zeichnen
  2082. *
  2083.  
  2084. ; 40-Spalten-Rahmen
  2085. DrawLRBorder    move.l    a5,a0
  2086.         move.l    BORDERLONG(a4),d0 ;d0.l: Rahmenfarbe
  2087.  
  2088.         move.l    d0,(a0)+    ;Links: $00..$1f
  2089.         move.l    d0,(a0)+
  2090.         move.l    d0,(a0)+
  2091.         move.l    d0,(a0)+
  2092.         move.l    d0,(a0)+
  2093.         move.l    d0,(a0)+
  2094.         move.l    d0,(a0)+
  2095.         move.l    d0,(a0)+
  2096.  
  2097.         lea    Col40XStop-Col40XStart(a0),a0
  2098.         move.l    d0,(a0)+    ;Rechts: $160..$17f
  2099.         move.l    d0,(a0)+
  2100.         move.l    d0,(a0)+
  2101.         move.l    d0,(a0)+
  2102.         move.l    d0,(a0)+
  2103.         move.l    d0,(a0)+
  2104.         move.l    d0,(a0)+
  2105.         move.l    d0,(a0)
  2106.  
  2107. ; 38-Spalten-Rahmen
  2108.         tst.b    IS38COL(a4)
  2109.         beq    1$
  2110.  
  2111.         lea    Col40XStart(a5),a0
  2112.         move.l    d0,(a0)+    ;Links: $20..$26
  2113.         move.w    d0,(a0)+
  2114.         move.b    d0,(a0)
  2115.  
  2116.         lea    Col38XStop(a5),a0
  2117.         move.b    d0,(a0)+    ;Rechts: $157..$15e
  2118.         move.l    d0,(a0)+
  2119.         move.l    d0,(a0)+
  2120. 1$        bra    VICIncA5
  2121.  
  2122. *
  2123. * Bild wird übersprungen, nur Bad-Line-Zyklen berechnen
  2124. *
  2125.  
  2126. VICSkip        cmp.w    #FirstDMALine,d7 ;Innerhalb des DMA-Bereiches?
  2127.         blo    VICNop
  2128.         cmp.w    #LastDMALine,d7
  2129.         bhi    VICNop
  2130.  
  2131.         move.b    d7,d0        ;Ja, stimmen die unteren Bits
  2132.         and.b    #7,d0        ;der Rasterzeile mit dem Y-Scroll
  2133.         cmp.b    YSCROLL+1(a4),d0 ;überein?
  2134.         bne    VICNop
  2135.  
  2136.         move.w    BadLineCycles,CyclesLeft
  2137.         bra    VICNop
  2138.  
  2139. *
  2140. * Bei 8 Bit eine Pixelzeile darstellen
  2141. * Zeiger in ChunkyBuf erhöhen
  2142. *
  2143.  
  2144. VICIncA5    cmp.w    #STYP_8BIT,ScreenType
  2145.         bne    VICIncA5Really
  2146.  
  2147.         tst.b    IsCyber
  2148.         beq    1$
  2149.         tst.b    IsCyberDirect
  2150.         beq    2$
  2151.  
  2152.         moveq    #DisplayX/4-1,d0    ;CyberDirect
  2153.         lea    ChunkyBuf,a0
  2154.         move.l    CyberBase,a1
  2155.         move.l    a1,d1
  2156. 3$        move.l    (a0)+,(a1)+
  2157.         dbra    d0,3$
  2158.         add.l    CyberXMod,d1
  2159.         move.l    d1,CyberBase
  2160.         bra    VICIncRC        
  2161.  
  2162. 2$        move.l    _CyberGfxBase,a6    ;Cyber
  2163.         lea    CyberHook,a0
  2164.         move.l    _the_rast_port,a1
  2165.         sub.l    a2,a2
  2166.         jsr    DoCDrawMethod(a6)
  2167.         bra    VICIncRC
  2168.  
  2169. 1$        move.l    _GfxBase,a6        ;Normal
  2170.         move.l    _the_rast_port,a0
  2171.         moveq    #0,d0
  2172.         move.w    CURRENTRASTER(a4),d1
  2173.         sub.w    #FirstDispLine,d1
  2174.         move.l    #DisplayX,d2
  2175.         lea    ChunkyBuf,a2
  2176.         lea    _temp_rp,a1
  2177.         JSRLIB    WritePixelLine8
  2178.         bra    VICIncRC
  2179.  
  2180. CyberHookProc    move.l    (a1),a0        ;a0: Adresse des Bildschirmspeichers
  2181.         moveq    #0,d0
  2182.         move.w    20(a1),d0
  2183.         move.w    Registers+CURRENTRASTER,d1
  2184.         sub.w    #FirstDispLine,d1
  2185.         mulu.w    d1,d0
  2186.         add.l    d0,a0
  2187.         lea    ChunkyBuf,a1
  2188.         moveq    #DisplayX/4-1,d0
  2189. 1$        move.l    (a1)+,(a0)+
  2190.         dbra    d0,1$
  2191.         rts
  2192.  
  2193. VICIncA5Really    add.l    #DisplayX,CURRENTA5(a4)
  2194.  
  2195. *
  2196. * RC erhöhen, Darstellung abschalten, wenn gleich 7
  2197. * (braucht nur im sichtbaren Bereich zu geschehen)
  2198. *
  2199.  
  2200. VICIncRC    cmp.w    #7,RC(a4)
  2201.         beq    1$
  2202.         addq.w    #1,RC(a4)
  2203.         bra    2$
  2204. 1$        st.b    DISPLAYOFF(a4)
  2205.         move.w    VCCOUNT(a4),VCBASE(a4)
  2206. 2$
  2207.  
  2208. *
  2209. * MCs erhöhen (muß in jeder Rasterzeile geschehen, damit die Sprites
  2210. *  auch im Overscan-Bereich korrekt dargestellt werden)
  2211. *
  2212.  
  2213. ; Wenn alle Sprites aus sind, direkt zu CIA-Periodic springen
  2214. VICNop        lea    SPRITEON(a4),a3
  2215.         move.b    SPREN(a4),d0
  2216.         or.b    (a3),d0
  2217.         beq    Periodic6526
  2218.  
  2219. ; MC für jedes Sprite zählen (7..0)
  2220.         moveq    #7,d6        ;d6: Spritenummer
  2221.         lea    M7Y(a4),a1    ;a1: Zeiger auf erste Y-Koordinate
  2222.         lea    MC7(a4),a2    ;a2: Zeiger auf MC
  2223.  
  2224. MCLoop        move.b    (a1),d0        ;Y-Koordinate
  2225.         btst    d6,SPREN(a4)    ;Sprite angeschaltet?
  2226.         bne    1$
  2227. 3$        cmp.w    #60,(a2)    ;Nein, MC kleiner als 60?
  2228.         blo    2$
  2229.         bclr    d6,(a3)        ;Nein, Sprite nicht mehr darstellen
  2230.         bra    5$
  2231.  
  2232. 1$        cmp.b    d0,d7        ;Sprite angeschaltet, Y-Koord. vergleichen
  2233.         bne    3$
  2234.         clr.w    (a2)        ;Gleich, MC zurücksetzen
  2235.         bset    d6,(a3)        ;Und Sprite ab jetzt darstellen
  2236.         bra    5$
  2237.  
  2238. 2$        btst    d6,MYE(a4)    ;MC kleiner als 60, Sprite Y-expandiert?
  2239.         beq    4$
  2240.         eor.b    d7,d0        ;Ja, nur erhöhen, wenn Bit 0
  2241.         and.b    #$01,d0        ; der Y-Koordinate gleich Bit 0
  2242.         bne    5$        ; des Rasterzählers ist
  2243. 4$        addq.w    #3,(a2)        ;MC erhöhen
  2244.         subq.w    #2,CyclesLeft    ;2 Zyklen vom 6510 abziehen
  2245.  
  2246. 5$        subq.w    #2,a1        ;Zeiger auf Y-Koordinate erhöhen
  2247.         subq.w    #2,a2        ;Zeiger auf MC erhöhen
  2248.         dbra    d6,MCLoop
  2249.  
  2250. ; Zu CIA-Periodic springen
  2251.         bra    Periodic6526
  2252.  
  2253.  
  2254. **
  2255. ** Ein Sprite zeichnen
  2256. ** d0.l: Spritedaten
  2257. ** d1.w: X-Koordinate
  2258. ** d2.b: Spritefarbe
  2259. ** d3  : (Temp.)
  2260. ** d4.b: Kollisionsergebnis Sprite-Hintergrund
  2261. ** d5.b: Kollisionsergebnis Sprite-Sprite
  2262. ** d6  : (Pixelzähler)
  2263. ** d7.b: Sprite-Bit (1,2,4, ...)
  2264. ** a1  : Ziel im Bildschirmspeicher
  2265. ** a2  : Ziel im Kollisionspuffer
  2266. ** a3  : Zeiger auf Grafik-Kollisionspuffer
  2267. **
  2268.  
  2269.         CNOP    0,4
  2270. ; Standard-Sprite: 3 Byte mit je 8 Pixeln konvertieren
  2271. DrawSprStd    cmp.w    #DisplayX-24,d1    ;Sprite horizontal sichtbar?
  2272.         bhs    DSSRts
  2273.  
  2274.         moveq    #0,d6        ;Pixelzähler
  2275. DSSLoop        add.l    d0,d0        ;Pixel gesetzt?
  2276.         bcc    DSSNext
  2277.  
  2278.     IFNE    SPR_DATA_COLL
  2279.         tst.b    (a3,d6.l)    ;Ist hier schon Grafik?
  2280.         beq    1$
  2281.         or.b    d7,d4        ;Ja, Kollision erkannt
  2282. 1$
  2283.     ENDC
  2284.         move.b    (a2,d6.l),d1    ;Ist schon ein Sprite da?
  2285.         bne    DSSDont
  2286.  
  2287.         move.b    d2,(a1,d6.l)    ;Nein, Punkt setzen
  2288.         move.b    d7,(a2,d6.l)
  2289.         bra    DSSNext
  2290.  
  2291. DSSDont        or.b    d1,d5        ;Ja, Kollision erkannt zwischen bestehendem
  2292.         or.b    d7,d5        ; und aktuellem Sprite
  2293.  
  2294. DSSNext        addq.w    #1,d6
  2295.         cmp.w    #24,d6
  2296.         bne    DSSLoop
  2297. DSSRts        rts
  2298.  
  2299.         CNOP    0,4
  2300. ; X-expandiertes Standard-Sprite: 3 Byte mit je 8 Pixeln konvertieren
  2301. DrawSprStdExp    cmp.w    #DisplayX-48,d1
  2302.         bhs    DSSERts
  2303.  
  2304.         moveq    #0,d6
  2305. DSSELoop    add.l    d0,d0
  2306.         bcc    DSSENext
  2307.  
  2308.     IFNE    SPR_DATA_COLL
  2309.         tst.b    (a3,d6.l)
  2310.         beq    1$
  2311.         or.b    d7,d4
  2312. 1$
  2313.     ENDC
  2314.         move.b    (a2,d6.l),d1
  2315.         bne    DSSEDont1st
  2316.  
  2317.         move.b    d2,(a1,d6.l)
  2318.         move.b    d7,(a2,d6.l)
  2319.         bra    DSSETest2nd
  2320.  
  2321. DSSEDont1st    or.b    d1,d5
  2322.         or.b    d7,d5
  2323.  
  2324. DSSETest2nd
  2325.     IFNE    SPR_DATA_COLL
  2326.         tst.b    1(a3,d6.l)
  2327.         beq    1$
  2328.         or.b    d7,d4
  2329. 1$
  2330.     ENDC
  2331.         move.b    1(a2,d6.l),d1
  2332.         bne    DSSEDont2nd
  2333.  
  2334.         move.b    d2,1(a1,d6.l)
  2335.         move.b    d7,1(a2,d6.l)
  2336.         bra    DSSENext
  2337.  
  2338. DSSEDont2nd    or.b    d1,d5
  2339.         or.b    d7,d5
  2340.  
  2341. DSSENext    addq.w    #2,d6
  2342.         cmp.w    #48,d6
  2343.         bne    DSSELoop
  2344. DSSERts        rts
  2345.  
  2346.         CNOP    0,4
  2347. ; Multicolor-Sprite: 3 Byte mit je 4 Pixeln konvertieren
  2348. DrawSprMulti    cmp.w    #DisplayX-24,d1
  2349.         bhs    DSMRts
  2350.  
  2351.         moveq    #0,d6
  2352. DSMLoop        add.l    d0,d0        ;Farbe des Pixels bestimmen
  2353.         bcc    DSMFirstIs0
  2354.         add.l    d0,d0
  2355.         bcc    DSMDraw10
  2356.         move.b    $26(a4),d3    ;11
  2357.         bra    DSMDraw
  2358. DSMDraw10    move.b    d2,d3        ;10
  2359.         bra    DSMDraw
  2360. DSMFirstIs0    add.l    d0,d0
  2361.         bcc    DSMNext
  2362.         move.b    $25(a4),d3    ;01
  2363.  
  2364. DSMDraw
  2365.     IFNE    SPR_DATA_COLL
  2366.         tst.b    (a3,d6.l)
  2367.         beq    1$
  2368.         or.b    d7,d4
  2369. 1$
  2370.     ENDC
  2371.         move.b    (a2,d6.l),d1
  2372.         bne    DSMDont1st
  2373.  
  2374.         move.b    d3,(a1,d6.l)
  2375.         move.b    d7,(a2,d6.l)
  2376.         bra    DSMTest2nd
  2377.  
  2378. DSMDont1st    or.b    d1,d5
  2379.         or.b    d7,d5
  2380.  
  2381. DSMTest2nd
  2382.     IFNE    SPR_DATA_COLL
  2383.         tst.b    1(a3,d6.l)
  2384.         beq    1$
  2385.         or.b    d7,d4
  2386. 1$
  2387.     ENDC
  2388.         move.b    1(a2,d6.l),d1
  2389.         bne    DSMDont2nd
  2390.  
  2391.         move.b    d3,1(a1,d6.l)
  2392.         move.b    d7,1(a2,d6.l)
  2393.         bra    DSMNext
  2394.  
  2395. DSMDont2nd    or.b    d1,d5
  2396.         or.b    d7,d5
  2397.  
  2398. DSMNext        addq.w    #2,d6
  2399.         cmp.w    #24,d6
  2400.         bne    DSMLoop
  2401. DSMRts        rts
  2402.  
  2403.         CNOP    0,4
  2404. ; X-expandiertes Multicolor-Sprite: 3 Byte mit je 4 Pixeln konvertieren
  2405. DrawSprMultiExp    cmp.w    #DisplayX-48,d1
  2406.         bhs    DSMERts
  2407.  
  2408.         moveq    #0,d6
  2409. DSMELoop    add.l    d0,d0
  2410.         bcc    DSMEFirstIs0
  2411.         add.l    d0,d0
  2412.         bcc    DSMEDraw10
  2413.         move.b    $26(a4),d3    ;11
  2414.         bra    DSMEDraw
  2415. DSMEDraw10    move.b    d2,d3        ;10
  2416.         bra    DSMEDraw
  2417. DSMEFirstIs0    add.l    d0,d0
  2418.         bcc    DSMENext
  2419.         move.b    $25(a4),d3    ;01
  2420.  
  2421. DSMEDraw
  2422.     IFNE    SPR_DATA_COLL
  2423.         tst.b    (a3,d6.l)
  2424.         beq    1$
  2425.         or.b    d7,d4
  2426. 1$
  2427.     ENDC
  2428.         move.b    (a2,d6.l),d1
  2429.         bne    DSMEDont1st
  2430.  
  2431.         move.b    d3,(a1,d6.l)
  2432.         move.b    d7,(a2,d6.l)
  2433.         bra    DSMETest2nd
  2434.  
  2435. DSMEDont1st    or.b    d1,d5
  2436.         or.b    d7,d5
  2437.  
  2438. DSMETest2nd
  2439.     IFNE    SPR_DATA_COLL
  2440.         tst.b    1(a3,d6.l)
  2441.         beq    1$
  2442.         or.b    d7,d4
  2443. 1$
  2444.     ENDC
  2445.         move.b    1(a2,d6.l),d1
  2446.         bne    DSMEDont2nd
  2447.  
  2448.         move.b    d3,1(a1,d6.l)
  2449.         move.b    d7,1(a2,d6.l)
  2450.         bra    DSMETest3rd
  2451.  
  2452. DSMEDont2nd    or.b    d1,d5
  2453.         or.b    d7,d5
  2454.  
  2455. DSMETest3rd
  2456.     IFNE    SPR_DATA_COLL
  2457.         tst.b    2(a3,d6.l)
  2458.         beq    1$
  2459.         or.b    d7,d4
  2460. 1$
  2461.     ENDC
  2462.         move.b    2(a2,d6.l),d1
  2463.         bne    DSMEDont3rd
  2464.  
  2465.         move.b    d3,2(a1,d6.l)
  2466.         move.b    d7,2(a2,d6.l)
  2467.         bra    DSMETest4th
  2468.  
  2469. DSMEDont3rd    or.b    d1,d5
  2470.         or.b    d7,d5
  2471.  
  2472. DSMETest4th
  2473.     IFNE    SPR_DATA_COLL
  2474.         tst.b    3(a3,d6.l)
  2475.         beq    1$
  2476.         or.b    d7,d4
  2477. 1$
  2478.     ENDC
  2479.         move.b    3(a2,d6.l),d1
  2480.         bne    DSMEDont4th
  2481.  
  2482.         move.b    d3,3(a1,d6.l)
  2483.         move.b    d7,3(a2,d6.l)
  2484.         bra    DSMENext
  2485.  
  2486. DSMEDont4th    or.b    d1,d5
  2487.         or.b    d7,d5
  2488.  
  2489. DSMENext    addq.w    #4,d6
  2490.         cmp.w    #48,d6
  2491.         bne    DSMELoop
  2492. DSMERts        rts
  2493.  
  2494.         CNOP    0,4
  2495. ; Standard-Sprite im Hintergrund: 3 Byte mit je 8 Pixeln konvertieren
  2496. DrawBackStd    cmp.w    #DisplayX-24,d1    ;Sprite horizontal sichtbar?
  2497.         bhs    DBSRts
  2498.  
  2499.         moveq    #0,d6        ;Pixelzähler
  2500. DBSLoop        add.l    d0,d0        ;Pixel gesetzt?
  2501.         bcc    DBSNext
  2502.  
  2503.     IFNE    SPR_DATA_COLL
  2504.         tst.b    (a3,d6.l)    ;Ist hier schon Grafik?
  2505.         beq    1$
  2506.         or.b    d7,d4        ;Ja, Kollision erkannt
  2507.         move.b    (a2,d6.l),d1    ;Ist schon ein Sprite da?
  2508.         beq    DBSNext
  2509.         or.b    d1,d5        ;Ja, Kollision erkannt
  2510.         or.b    d7,d5
  2511.         bra    DBSNext        ;Sprite nicht zeichnen
  2512. 1$
  2513.     ENDC
  2514.         move.b    (a2,d6.l),d1    ;Ja, ist schon ein Sprite da?
  2515.         bne    DBSDont
  2516.  
  2517.         move.b    d2,(a1,d6.l)    ;Nein, Punkt setzen
  2518.         move.b    d7,(a2,d6.l)
  2519.         bra    DBSNext
  2520.  
  2521. DBSDont        or.b    d1,d5        ;Ja, Kollision erkannt zwischen bestehendem
  2522.         or.b    d7,d5        ; und aktuellem Sprite
  2523.  
  2524. DBSNext        addq.w    #1,d6
  2525.         cmp.w    #24,d6
  2526.         bne    DBSLoop
  2527. DBSRts        rts
  2528.  
  2529.         CNOP    0,4
  2530. ; X-expandiertes Standard-Sprite im Hintergrund: 3 Byte mit je 8 Pixeln konvertieren
  2531. DrawBackStdExp    cmp.w    #DisplayX-48,d1
  2532.         bhs    DBSERts
  2533.  
  2534.         moveq    #0,d6
  2535. DBSELoop    add.l    d0,d0
  2536.         bcc    DBSENext
  2537.  
  2538.     IFNE    SPR_DATA_COLL
  2539.         tst.b    (a3,d6.l)
  2540.         beq    1$
  2541.         or.b    d7,d4
  2542.         move.b    (a2,d6.l),d1
  2543.         beq    DBSETest2nd
  2544.         or.b    d1,d5
  2545.         or.b    d7,d5
  2546.         bra    DBSETest2nd
  2547. 1$
  2548.     ENDC
  2549.         move.b    (a2,d6.l),d1
  2550.         bne    DBSEDont1st
  2551.  
  2552.         move.b    d2,(a1,d6.l)
  2553.         move.b    d7,(a2,d6.l)
  2554.         bra    DBSETest2nd
  2555.  
  2556. DBSEDont1st    or.b    d1,d5
  2557.         or.b    d7,d5
  2558.  
  2559. DBSETest2nd
  2560.     IFNE    SPR_DATA_COLL
  2561.         tst.b    1(a3,d6.l)
  2562.         beq    1$
  2563.         or.b    d7,d4
  2564.         move.b    1(a2,d6.l),d1
  2565.         beq    DBSENext
  2566.         or.b    d1,d5
  2567.         or.b    d7,d5
  2568.         bra    DBSENext
  2569. 1$
  2570.     ENDC
  2571.         move.b    1(a2,d6.l),d1
  2572.         bne    DBSEDont2nd
  2573.  
  2574.         move.b    d2,1(a1,d6.l)
  2575.         move.b    d7,1(a2,d6.l)
  2576.         bra    DBSENext
  2577.  
  2578. DBSEDont2nd    or.b    d1,d5
  2579.         or.b    d7,d5
  2580.  
  2581. DBSENext    addq.w    #2,d6
  2582.         cmp.w    #48,d6
  2583.         bne    DBSELoop
  2584. DBSERts        rts
  2585.  
  2586.         CNOP    0,4
  2587. ; Multicolor-Sprite im Hintergrund: 3 Byte mit je 4 Pixeln konvertieren
  2588. DrawBackMulti    cmp.w    #DisplayX-24,d1
  2589.         bhs    DBMRts
  2590.  
  2591.         moveq    #0,d6
  2592. DBMLoop        add.l    d0,d0        ;Farbe des Pixels bestimmen
  2593.         bcc    DBMFirstIs0
  2594.         add.l    d0,d0
  2595.         bcc    DBMDraw10
  2596.         move.b    $26(a4),d3    ;11
  2597.         bra    DBMDraw
  2598. DBMDraw10    move.b    d2,d3        ;10
  2599.         bra    DBMDraw
  2600. DBMFirstIs0    add.l    d0,d0
  2601.         bcc    DBMNext
  2602.         move.b    $25(a4),d3    ;01
  2603.  
  2604. DBMDraw
  2605.     IFNE    SPR_DATA_COLL
  2606.         tst.b    (a3,d6.l)
  2607.         beq    1$
  2608.         or.b    d7,d4
  2609.         move.b    (a2,d6.l),d1
  2610.         beq    DBMTest2nd
  2611.         or.b    d1,d5
  2612.         or.b    d7,d5
  2613.         bra    DBMTest2nd
  2614. 1$
  2615.     ENDC
  2616.         move.b    (a2,d6.l),d1
  2617.         bne    DBMDont1st
  2618.  
  2619.         move.b    d3,(a1,d6.l)
  2620.         move.b    d7,(a2,d6.l)
  2621.         bra    DBMTest2nd
  2622.  
  2623. DBMDont1st    or.b    d1,d5
  2624.         or.b    d7,d5
  2625.  
  2626. DBMTest2nd
  2627.     IFNE    SPR_DATA_COLL
  2628.         tst.b    1(a3,d6.l)
  2629.         beq    1$
  2630.         or.b    d7,d4
  2631.         move.b    1(a2,d6.l),d1
  2632.         beq    DBMNext
  2633.         or.b    d1,d5
  2634.         or.b    d7,d5
  2635.         bra    DBMNext
  2636. 1$
  2637.     ENDC
  2638.         move.b    1(a2,d6.l),d1
  2639.         bne    DBMDont2nd
  2640.  
  2641.         move.b    d3,1(a1,d6.l)
  2642.         move.b    d7,1(a2,d6.l)
  2643.         bra    DBMNext
  2644.  
  2645. DBMDont2nd    or.b    d1,d5
  2646.         or.b    d7,d5
  2647.  
  2648. DBMNext        addq.w    #2,d6
  2649.         cmp.w    #24,d6
  2650.         bne    DBMLoop
  2651. DBMRts        rts
  2652.  
  2653.         CNOP    0,4
  2654. ; X-expandiertes Multicolor-Sprite im Hintergrund: 3 Byte mit je 4 Pixeln konvertieren
  2655. DrawBackMultiExp cmp.w    #DisplayX-48,d1
  2656.         bhs    DBMERts
  2657.  
  2658.         moveq    #0,d6
  2659. DBMELoop    add.l    d0,d0
  2660.         bcc    DBMEFirstIs0
  2661.         add.l    d0,d0
  2662.         bcc    DBMEDraw10
  2663.         move.b    $26(a4),d3    ;11
  2664.         bra    DBMEDraw
  2665. DBMEDraw10    move.b    d2,d3        ;10
  2666.         bra    DBMEDraw
  2667. DBMEFirstIs0    add.l    d0,d0
  2668.         bcc    DBMENext
  2669.         move.b    $25(a4),d3    ;01
  2670.  
  2671. DBMEDraw
  2672.     IFNE    SPR_DATA_COLL
  2673.         tst.b    (a3,d6.l)
  2674.         beq    1$
  2675.         or.b    d7,d4
  2676.         move.b    (a2,d6.l),d1
  2677.         beq    DBMETest2nd
  2678.         or.b    d1,d5
  2679.         or.b    d7,d5
  2680.         bra    DBMETest2nd
  2681. 1$
  2682.     ENDC
  2683.         move.b    (a2,d6.l),d1
  2684.         bne    DBMEDont1st
  2685.  
  2686.         move.b    d3,(a1,d6.l)
  2687.         move.b    d7,(a2,d6.l)
  2688.         bra    DBMETest2nd
  2689.  
  2690. DBMEDont1st    or.b    d1,d5
  2691.         or.b    d7,d5
  2692.  
  2693. DBMETest2nd
  2694.     IFNE    SPR_DATA_COLL
  2695.         tst.b    1(a3,d6.l)
  2696.         beq    1$
  2697.         or.b    d7,d4
  2698.         move.b    1(a2,d6.l),d1
  2699.         beq    DBMETest3rd
  2700.         or.b    d1,d5
  2701.         or.b    d7,d5
  2702.         bra    DBMETest3rd
  2703. 1$
  2704.     ENDC
  2705.         move.b    1(a2,d6.l),d1
  2706.         bne    DBMEDont2nd
  2707.  
  2708.         move.b    d3,1(a1,d6.l)
  2709.         move.b    d7,1(a2,d6.l)
  2710.         bra    DBMETest3rd
  2711.  
  2712. DBMEDont2nd    or.b    d1,d5
  2713.         or.b    d7,d5
  2714.  
  2715. DBMETest3rd
  2716.     IFNE    SPR_DATA_COLL
  2717.         tst.b    2(a3,d6.l)
  2718.         beq    1$
  2719.         or.b    d7,d4
  2720.         move.b    2(a2,d6.l),d1
  2721.         beq    DBMETest4th
  2722.         or.b    d1,d5
  2723.         or.b    d7,d5
  2724.         bra    DBMETest4th
  2725. 1$
  2726.     ENDC
  2727.         move.b    2(a2,d6.l),d1
  2728.         bne    DBMEDont3rd
  2729.  
  2730.         move.b    d3,2(a1,d6.l)
  2731.         move.b    d7,2(a2,d6.l)
  2732.         bra    DBMETest4th
  2733.  
  2734. DBMEDont3rd    or.b    d1,d5
  2735.         or.b    d7,d5
  2736.  
  2737. DBMETest4th
  2738.     IFNE    SPR_DATA_COLL
  2739.         tst.b    3(a3,d6.l)
  2740.         beq    1$
  2741.         or.b    d7,d4
  2742.         move.b    3(a2,d6.l),d1
  2743.         beq    DBMENext
  2744.         or.b    d1,d5
  2745.         or.b    d7,d5
  2746.         bra    DBMENext
  2747. 1$
  2748.     ENDC
  2749.         move.b    3(a2,d6.l),d1
  2750.         bne    DBMEDont4th
  2751.  
  2752.         move.b    d3,3(a1,d6.l)
  2753.         move.b    d7,3(a2,d6.l)
  2754.         bra    DBMENext
  2755.  
  2756. DBMEDont4th    or.b    d1,d5
  2757.         or.b    d7,d5
  2758.  
  2759. DBMENext    addq.w    #4,d6
  2760.         cmp.w    #48,d6
  2761.         bne    DBMELoop
  2762. DBMERts        rts
  2763.  
  2764.  
  2765. **
  2766. ** Amiga-Mono-Routinen einbinden
  2767. **
  2768.  
  2769.         INCLUDE    "6569mono.i"
  2770.  
  2771.  
  2772. **
  2773. ** Konstanten
  2774. **
  2775.  
  2776. ; Tabelle der Display-Routinen (jeweils für Farbe und Monochrom)
  2777.         CNOP    0,4
  2778. DispProcTab    dc.l    TextStd
  2779.         dc.l    TextMulti
  2780.         dc.l    BitMapStd
  2781.         dc.l    BitMapMulti
  2782.         dc.l    TextECM
  2783.         dc.l    BlackScreen
  2784.         dc.l    BlackScreen
  2785.         dc.l    BlackScreen
  2786.  
  2787. MonoDispProcTab    dc.l    FTextStd
  2788.         dc.l    FTextStd
  2789.         dc.l    FBitMapStd
  2790.         dc.l    FBitMapStd
  2791.         dc.l    FTextStd
  2792.         dc.l    FBlackScreen
  2793.         dc.l    FBlackScreen
  2794.         dc.l    FBlackScreen
  2795.  
  2796. ; Tabelle der Sprite-Display-Routinen
  2797. SpriteProcTab    dc.l    DrawSprStd
  2798.         dc.l    DrawSprStdExp
  2799.         dc.l    DrawSprMulti
  2800.         dc.l    DrawSprMultiExp
  2801.         dc.l    DrawBackStd
  2802.         dc.l    DrawBackStdExp
  2803.         dc.l    DrawBackMulti
  2804.         dc.l    DrawBackMultiExp
  2805.  
  2806. ; Hook für DoCDrawMethod
  2807. CyberHook    dc.l    0,0
  2808.         dc.l    CyberHookProc
  2809.         dc.l    0
  2810.         dc.l    0
  2811.  
  2812.  
  2813. **
  2814. ** Datenbereich
  2815. **
  2816.  
  2817. ; Variablen
  2818.         CNOP    0,4
  2819. DisplayProc    dc.l    0    ;Zeiger auf die Display-Routine (Text/Bitmap etc.)
  2820.  
  2821. Sprite0Proc    dc.l    0    ;Zeiger auf Display-Routinen für die einzelnen Sprites
  2822. Sprite1Proc    dc.l    0
  2823. Sprite2Proc    dc.l    0
  2824. Sprite3Proc    dc.l    0
  2825. Sprite4Proc    dc.l    0
  2826. Sprite5Proc    dc.l    0
  2827. Sprite6Proc    dc.l    0
  2828. Sprite7Proc    dc.l    0
  2829.  
  2830. DisplayID    dc.l    0    ;Prefs: DisplayID des Screens
  2831. ScreenType    dc.w    0    ;Prefs: Typ der Screen-Ansteuerung
  2832. NormalCycles    dc.w    0    ;Prefs: Anzahl 6510-Zyklen pro Rasterzeile
  2833. BadLineCycles    dc.w    0    ;Prefs: Anzahl 6510-Zyklen in einer Bad Line
  2834. Collisions    dc.w    0    ;Prefs: Sprite-Kollisionen angeschaltet
  2835. Overscan    dc.w    0    ;Prefs: Overscan-Typ für Amiga-Modi
  2836. DirectVideo    dc.w    0    ;Prefs: Direkter Grafikspeicherzugriff bei 8 Bit erlaubt
  2837.  
  2838. SkipCounter    dc.w    1
  2839.         XDEF    _SkipLatch
  2840. _SkipLatch
  2841. SkipLatch    dc.w    0    ;Prefs: Nur jedes nte Bild darstellen
  2842.  
  2843.         XDEF    _LimitSpeed
  2844. _LimitSpeed
  2845. LimitSpeed    dc.w    0    ;Prefs: Geschwindigkeit auf 100% beschränken
  2846.  
  2847. IsCyber        dc.b    0    ;#0: DoCDrawMethod kann statt WritePixelLine8 benutzt werden
  2848. IsCyberDirect    dc.b    0    ;#0: Direkter Bildschirmspeicherzugriff erlaubt
  2849.         CNOP    0,4
  2850. CyberBase    dc.l    0    ;Basisadresse des Bildschirmspeichers
  2851. CyberXMod    dc.l    0    ;Modulo des Bildschirmspeichers
  2852.  
  2853.         CNOP    0,4
  2854. Registers    ds.b    VICRegLength    ;VIC-Register
  2855. MatrixLine    ds.b    40    ;Eine Bildschirmzeile
  2856. ColorLine    ds.b    40    ;Eine Farb-RAM-Zeile
  2857.  
  2858.  
  2859. **
  2860. ** Nicht initialisierte Daten
  2861. **
  2862.  
  2863.         SECTION    "BSS",BSS
  2864.         XDEF    _ChunkyBuf
  2865. _ChunkyBuf
  2866. ChunkyBuf    ds.b    DisplayX*DisplayY ;Puffer für die Chunky-Bitmap
  2867.  
  2868. SprCollBuf    ds.b    DisplayX    ;Puffer für Sprite-Sprite-Kollisionen
  2869.     IFNE    SPR_DATA_COLL
  2870. GfxCollBuf    ds.b    DisplayX    ;Puffer für Sprite-Grafik-Kollisionen und Priorität
  2871.     ENDC
  2872.  
  2873.         XDEF    _CURRENTA5
  2874. _CURRENTA5    ds.l    1        ;Kommunikation mit _RedrawDisplay
  2875.  
  2876.         END
  2877.