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