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

  1. *
  2. * 6569SC.asm - Einzelzyklus-VIC-Emulation
  3. *
  4. * Copyright (C) 1995 by Christian Bauer
  5. *
  6.  
  7. *
  8. * Anmerkungen:
  9. * ------------
  10. *
  11. * Registerbelegung:
  12. * d5: Index in MatrixLine
  13. * d6: Schleifenzähler
  14. * d7: Von 6510-Emulation benutzt
  15. * a3: Zeiger in ChunkyBuf zum Schreiben der Grafikdaten
  16. * a4: Zeiger für Near-Adressierung
  17. * a5: Zeiger in C64-RAM, Offset 32K (für Adressierung mit Vorzeichen)
  18. * a6: Von 6510-Emulation benutzt
  19. *
  20. * Es wird ein 6569R5 emuliert.
  21. *
  22. * Inkompatibilitäten:
  23. *  - Farbe der $ff-Bytes, die gelesen werden, wenn BA low und AEC high ist,
  24. *    stimmt nicht
  25. *  - Änderungen in der Rahmen-/Hintergrundfarbe werden 7 Pixel zu
  26. *    spät sichtbar
  27. *  - Der Zugriff auf die Sprite-Daten beachtet BA nicht
  28. *  - Keine Sprite-Darstellung
  29. *  - Keine Sprite-Kollisionen
  30. *
  31.  
  32. DEBUG_DETAIL    SET 0
  33.  
  34. DE00_COMPATIBLE    SET 1
  35.  
  36.         MACHINE    68020
  37.  
  38.         INCLUDE    "exec/types.i"
  39.         INCLUDE    "exec/macros.i"
  40.         INCLUDE    "debug.i"
  41.  
  42.         XREF    _SysBase    ;Main.asm
  43.         XREF    _GfxBase
  44.  
  45.         NREF    TheChar        ;6510SC.asm
  46.         NREF    TheColor
  47.         NREF    IntIsIRQ
  48.         NREF    IntIsVICIRQ
  49.         NREF    FirstIRQCycle
  50.         NREF    BALow
  51.     IFNE    DEBUG_DETAIL
  52.         NREF    DEBUGON
  53.     ENDC
  54.  
  55.         XREF    CountTODs    ;6526SC.asm
  56.         XREF    Periodic6526
  57.  
  58.         XREF    _OpenDisplay    ;Display.c
  59.         XREF    _RedrawDisplay
  60.         XREF    _the_rast_port
  61.         XREF    _temp_rp
  62.  
  63.         XDEF    Init6569
  64.         XDEF    _GetVICDump
  65.         XDEF    OpenGraphics
  66.         XDEF    ChangedVA
  67.         XDEF    TriggerLightpen
  68.         XDEF    Main6569
  69.         XDEF    ReadFrom6569
  70.         XDEF    WriteTo6569
  71.     IFNE    DE00_COMPATIBLE
  72.         XDEF    LastVICByte
  73.     ENDC
  74.         XDEF    CycleCounter
  75.  
  76.         XDEF    DisplayID    ;Prefs
  77.         XDEF    ScreenType
  78.         XDEF    NormalCycles
  79.         XDEF    BadLineCycles
  80.         XDEF    Collisions
  81.         XDEF    Overscan
  82.         XDEF    SkipLatch
  83.         XDEF    LimitSpeed
  84.         XDEF    DirectVideo
  85.  
  86.         NEAR    a4,-2
  87.  
  88.         SECTION    "text",CODE
  89.  
  90.         FAR
  91.  
  92.  
  93. **
  94. ** Definitionen
  95. **
  96.  
  97. ; Registerbelegung
  98. INDEX        EQUR    d5    ;Index in Matrixzeile
  99. BUFFER        EQUR    a3    ;Zeiger in ChunkyBuf zum Schreiben der Grafikdaten
  100. RAMPTR        EQUR    a5    ;Zeiger in C64-RAM
  101.  
  102. ; Gesamtzahl Rasterzeilen
  103. TotalLines    = 312
  104.  
  105. ; Anfang und Ende des DMA-Bereiches
  106. FirstDMALine    = $30
  107. LastDMALine    = $f7
  108.  
  109. ; Textfenster-Koordinaten (Stop-Werte sind immer eins mehr)
  110. Row25YStart    = $33
  111. Row25YStop    = $fb
  112. Row24YStart    = $37
  113. Row24YStop    = $f7
  114.  
  115. ; Größe der Anzeige
  116. DisplayX    = (5+40+4)*8    ;40 Zeichen, 9*8 Pixel Rahmen
  117. DisplayY    = TotalLines
  118. ;DisplayY    = 272
  119.  
  120. ; ScreenTypes
  121. STYP_8BIT    = 0    ;8-Bit-Screen, WritePixelLine8
  122. STYP_4BIT    = 1    ;4-Bit-Screen, c2p4
  123. STYP_1BIT    = 2    :1-Bit-Screen, Amiga Mono
  124.  
  125.  
  126. **
  127. ** Emulation vorbereiten
  128. **
  129.  
  130. *
  131. * Register/Tabellen vorbereiten
  132. *
  133.  
  134. Init6569    lea    MemReadTab,a0        ;Alle mit RAM vorbelegen
  135.         move.w    #256-1,d0
  136. 11$        move.l    #ReadByteRAM,(a0)+
  137.         dbra    d0,11$
  138.  
  139.         lea    MemReadTab+16*4,a0    ;Char-ROM bei $1000..$1fff
  140.         moveq    #15,d0
  141. 12$        move.l    #ReadByteChar,(a0)+
  142.         dbra    d0,12$
  143.  
  144.         lea    MemReadTab+144*4,a0    ;Char-ROM bei $9000..$9fff
  145.         moveq    #15,d0
  146. 13$        move.l    #ReadByteChar,(a0)+
  147.         dbra    d0,13$
  148.  
  149.         move.w    #7,RC
  150.         clr.w    VCBASE
  151.         clr.w    VCCOUNT
  152.         move.w    #63,MC0
  153.         move.w    #63,MC1
  154.         move.w    #63,MC2
  155.         move.w    #63,MC3
  156.         move.w    #63,MC4
  157.         move.w    #63,MC5
  158.         move.w    #63,MC6
  159.         move.w    #63,MC7
  160.         clr.w    CIAVABASE
  161.         move.w    #TotalLines-1,RASTERY
  162.         move.w    #1,SkipCounter
  163.         move.w    #Row24YStart,DYSTART
  164.         move.w    #Row24YStop,DYSTOP
  165.         clr.w    DISPROCIDX
  166.         rts
  167.  
  168.  
  169. *
  170. * Screen und Fenster öffnen
  171. * d0=0: Alles OK
  172. * d0=1: Fehler beim Screen-Öffnen
  173. * d0=2: Kein Speicher
  174. *
  175.  
  176. OpenGraphics    pea    DisplayY
  177.         pea    DisplayX
  178.         moveq    #0,d0
  179.         move.w    Overscan,d0
  180.         move.l    d0,-(sp)
  181.         move.l    DisplayID,-(sp)
  182.         move.w    ScreenType,d0
  183.         move.l    d0,-(sp)
  184.         jsr    _OpenDisplay
  185.         lea    20(sp),sp
  186.         rts
  187.  
  188.  
  189. **
  190. ** VIC-Status in Datenstruktur schreiben
  191. **
  192.  
  193. _GetVICDump    move.l    4(sp),a1
  194.         rts
  195.  
  196.  
  197. **
  198. ** CIA-VA14/15 hat sich geändert, Video-Bank wechseln
  199. ** d0.b: Neue VA ($00-$03)
  200. **
  201.  
  202. ChangedVA    clr.w    d1        ;VABase speichern
  203.         move.b    d0,d1
  204.         ror.w    #2,d1
  205.         move.w    d1,CIAVABASE
  206.         rts
  207.  
  208.  
  209. **
  210. ** CIA-A PB4 hat einen Übergang 1->0 gemacht, evtl. Lightpen triggern
  211. **
  212.  
  213. TriggerLightpen    tst.b    LPTRIGGERED    ;Lightpen in diesem Frame schon getriggert?
  214.         bne    1$
  215.  
  216.         st.b    LPTRIGGERED    ;Nein, Flag setzen
  217.  
  218.         move.w    RASTERX,d0    ;Und Lightpen-Register mit den aktuellen Koordinaten füllen
  219.         lsr.w    #1,d0
  220.         move.b    d0,LPX
  221.         move.b    RASTERY,LPY
  222.  
  223.         or.b    #$08,IRQFLAG    ;ILP-Bit setzen
  224.         btst    #3,IRQMASK    ;LP-IRQ erlaubt?
  225.         beq    1$
  226.         or.b    #$80,IRQFLAG    ;Ja, IRQ-Bit setzen
  227.         tst.w    IntIsIRQ    ;IRQ schon ausgelöst?
  228.         bne    2$
  229.         move.l    CycleCounter,FirstIRQCycle ;Nein, Zyklus merken
  230. 2$        st.b    IntIsVICIRQ    ; und Interrupt auslösen
  231. 1$        rts
  232.  
  233.  
  234. **
  235. ** Aus einem VIC-Register lesen
  236. ** d0.w: Registernummer ($00-$3f)
  237. ** Rückgabe: d0.b: Byte
  238. **
  239.  
  240.         NEAR
  241.  
  242. ReadFrom6569    move.l    (ReadTab,pc,d0.w*4),a0
  243.         jmp    (a0)
  244.  
  245.         CNOP    0,4
  246. ReadTab        dc.l    RdSprX
  247.         dc.l    RdNormal
  248.         dc.l    RdSprX
  249.         dc.l    RdNormal
  250.         dc.l    RdSprX
  251.         dc.l    RdNormal
  252.         dc.l    RdSprX
  253.         dc.l    RdNormal
  254.         dc.l    RdSprX
  255.         dc.l    RdNormal
  256.         dc.l    RdSprX
  257.         dc.l    RdNormal
  258.         dc.l    RdSprX
  259.         dc.l    RdNormal
  260.         dc.l    RdSprX
  261.         dc.l    RdNormal
  262.  
  263.         dc.l    RdNormal
  264.         dc.l    RdCTRL1
  265.         dc.l    RdRASTER
  266.         dc.l    RdNormal
  267.         dc.l    RdNormal
  268.         dc.l    RdNormal
  269.         dc.l    RdCTRL2
  270.         dc.l    RdNormal
  271.         dc.l    RdVBASE
  272.         dc.l    RdIRQFLAG
  273.         dc.l    RdIRQMASK
  274.         dc.l    RdNormal
  275.         dc.l    RdNormal
  276.         dc.l    RdNormal
  277.         dc.l    RdCLXSPR
  278.         dc.l    RdCLXBGR
  279.  
  280.         dc.l    RdColor
  281.         dc.l    RdColor
  282.         dc.l    RdColor
  283.         dc.l    RdColor
  284.         dc.l    RdColor
  285.         dc.l    RdColor
  286.         dc.l    RdColor
  287.         dc.l    RdColor
  288.         dc.l    RdColor
  289.         dc.l    RdColor
  290.         dc.l    RdColor
  291.         dc.l    RdColor
  292.         dc.l    RdColor
  293.         dc.l    RdColor
  294.         dc.l    RdColor
  295.         dc.l    RdUndef
  296.  
  297.         dc.l    RdUndef
  298.         dc.l    RdUndef
  299.         dc.l    RdUndef
  300.         dc.l    RdUndef
  301.         dc.l    RdUndef
  302.         dc.l    RdUndef
  303.         dc.l    RdUndef
  304.         dc.l    RdUndef
  305.         dc.l    RdUndef
  306.         dc.l    RdUndef
  307.         dc.l    RdUndef
  308.         dc.l    RdUndef
  309.         dc.l    RdUndef
  310.         dc.l    RdUndef
  311.         dc.l    RdUndef
  312.         dc.l    RdUndef
  313.  
  314. RdNormal    move.b    (VICREGS,d0.w),d0
  315.         rts
  316.  
  317. RdSprX        move.b    (SPRX0+1,d0.w),d0    ;LSB lesen
  318.         rts
  319.  
  320. RdCTRL1        move.b    CTRL1,d0
  321.         and.b    #$7f,d0
  322.         move.b    RASTERY,d1        ;MSB des Rasterzählers lesen
  323.         lsl.b    #7,d1
  324.         or.b    d1,d0            ; und dazunehmen
  325.         rts
  326.  
  327. RdRASTER    move.w    RASTERY,d0        ;Rasterzähler lesen (nur die unteren 8 Bit sind wichtig)
  328.         rts
  329.  
  330. RdCTRL2        move.b    CTRL2,d0
  331.         or.b    #$c0,d0            ;Unbenutzte Bits auf 1
  332.         rts
  333.  
  334. RdVBASE        move.b    VBASE,d0
  335.         or.b    #$01,d0            ;Unbenutzte Bits auf 1
  336.         rts
  337.  
  338. RdIRQFLAG    move.b    IRQFLAG,d0
  339.         or.b    #$70,d0            ;Unbenutzte Bits auf 1
  340.         rts
  341.  
  342. RdIRQMASK    move.b    IRQMASK,d0
  343.         or.b    #$f0,d0            ;Unbenutzte Bits auf 1
  344.         rts
  345.  
  346. RdCLXSPR    move.b    CLXSPR,d0        ;Lesen und löschen
  347.         clr.b    CLXSPR
  348.         rts
  349.  
  350. RdCLXBGR    move.b    CLXBGR,d0        ;Lesen und löschen
  351.         clr.b    CLXBGR
  352.         rts
  353.  
  354. RdColor        move.b    (VICREGS,d0.w),d0    ;Bei Farbregistern
  355.         or.b    #$f0,d0            ; das obere Nibble setzen
  356.         rts
  357.  
  358. RdUndef        moveq.b    #-1,d0            ;Nicht existierendes Register
  359.         rts
  360.  
  361.  
  362. **
  363. ** In ein VIC-Register schreiben
  364. ** d0.w: Registernummer ($00-$3f)
  365. ** d1.b: Byte
  366. **
  367.  
  368. WriteTo6569    move.l    (WriteTab,pc,d0.w*4),a0
  369.         jmp    (a0)
  370.  
  371.         CNOP    0,4
  372. WriteTab    dc.l    WrSprX
  373.         dc.l    WrNormal
  374.         dc.l    WrSprX
  375.         dc.l    WrNormal
  376.         dc.l    WrSprX
  377.         dc.l    WrNormal
  378.         dc.l    WrSprX
  379.         dc.l    WrNormal
  380.         dc.l    WrSprX
  381.         dc.l    WrNormal
  382.         dc.l    WrSprX
  383.         dc.l    WrNormal
  384.         dc.l    WrSprX
  385.         dc.l    WrNormal
  386.         dc.l    WrSprX
  387.         dc.l    WrNormal
  388.  
  389.         dc.l    WrSprXMSB
  390.         dc.l    WrCTRL1
  391.         dc.l    WrRASTER
  392.         dc.l    WrNormal
  393.         dc.l    WrNormal
  394.         dc.l    WrNormal
  395.         dc.l    WrCTRL2
  396.         dc.l    WrMYE
  397.         dc.l    WrVBASE
  398.         dc.l    WrIRQFLAG
  399.         dc.l    WrIRQMASK
  400.         dc.l    WrNormal
  401.         dc.l    WrNormal
  402.         dc.l    WrNormal
  403.         dc.l    WrUndef
  404.         dc.l    WrUndef
  405.  
  406.         dc.l    WrBorder
  407.         dc.l    WrNormal
  408.         dc.l    WrNormal
  409.         dc.l    WrNormal
  410.         dc.l    WrNormal
  411.         dc.l    WrNormal
  412.         dc.l    WrNormal
  413.         dc.l    WrNormal
  414.         dc.l    WrNormal
  415.         dc.l    WrNormal
  416.         dc.l    WrNormal
  417.         dc.l    WrNormal
  418.         dc.l    WrNormal
  419.         dc.l    WrNormal
  420.         dc.l    WrNormal
  421.         dc.l    WrUndef
  422.  
  423.         dc.l    WrUndef
  424.         dc.l    WrUndef
  425.         dc.l    WrUndef
  426.         dc.l    WrUndef
  427.         dc.l    WrUndef
  428.         dc.l    WrUndef
  429.         dc.l    WrUndef
  430.         dc.l    WrUndef
  431.         dc.l    WrUndef
  432.         dc.l    WrUndef
  433.         dc.l    WrUndef
  434.         dc.l    WrUndef
  435.         dc.l    WrUndef
  436.         dc.l    WrUndef
  437.         dc.l    WrUndef
  438.         dc.l    WrUndef
  439.  
  440. WrNormal    move.b    d1,(VICREGS,d0.w)
  441. WrUndef        rts
  442.  
  443. WrSprX        move.b    d1,(SPRX0+1,d0.w)
  444.         rts
  445.  
  446. WrSprXMSB    move.b    d1,MX8
  447.         lea    SPRX7,a0    ;MSBs in 16-Bit-Werte umrechnen
  448.         moveq    #7,d0
  449. 1$        add.b    d1,d1
  450.         bcs    2$
  451.         clr.b    (a0)
  452.         bra    3$
  453. 2$        move.b    #1,(a0)
  454. 3$        subq.w    #2,a0
  455.         dbra    d0,1$
  456.         rts
  457.  
  458. WrCTRL1        move.b    d1,CTRL1
  459.  
  460.         move.b    d1,d0        ;Y-Scroll
  461.         and.w    #7,d0
  462.         move.w    d0,YSCROLL
  463.  
  464.         move.b    d1,d0        ;MSB der IRQ-Rasterzeile
  465.         lsr.b    #7,d0
  466.         move.b    d0,IRQRASTERY
  467.  
  468.         btst    #3,d1        ;24/25 Zeilen
  469.         beq    2$
  470.         move.w    #Row25YStart,DYSTART
  471.         move.w    #Row25YStop,DYSTOP
  472.         bra    3$
  473. 2$        move.w    #Row24YStart,DYSTART
  474.         move.w    #Row24YStop,DYSTOP
  475. 3$
  476.         move.w    RASTERY,d0    ;d0: RASTERY
  477.  
  478.         cmp.w    #$30,d0        ;In Rasterzeile $30 entscheidet das DEN-Bit,
  479.         bne    5$        ; ob Bad Lines erlaubt sind
  480.         btst    #4,d1
  481.         beq    5$
  482.         st.b    BADLINEENABLE
  483. 5$
  484.         tst.b    BADLINEENABLE    ;Bad Lines erlaubt?
  485.         beq    1$
  486.         cmp.w    #FirstDMALine,d0 ;Ja, dann Bad Line Condition prüfen
  487.         blo    1$
  488.         cmp.w    #LastDMALine,d0
  489.         bhi    1$
  490.         and.w    #$07,d0
  491.         cmp.w    YSCROLL,d0
  492.         seq    BADLINE
  493.         bra    SetDispProc    ;Anzeigemodus in Index konvertieren
  494. 1$        clr.b    BADLINE
  495.         bra    SetDispProc    ;Anzeigemodus in Index konvertieren
  496.  
  497. WrRASTER    move.b    d1,IRQRASTERY+1
  498.         rts
  499.  
  500. WrCTRL2        move.b    d1,CTRL2
  501.  
  502.         move.b    d1,d0        ;X-Scroll
  503.         and.w    #7,d0
  504.         move.w    d0,XSCROLL
  505.  
  506.         btst    #3,d1        ;38/40 Zeilen
  507.         seq.b    IS38COL
  508.         ;fällt durch!
  509.  
  510. SetDispProc    moveq    #0,d0        ;ECM, BMM und MCM holen
  511.         move.b    CTRL1,d0
  512.         and.b    #$60,d0
  513.         move.b    CTRL2,d1
  514.         and.b    #$10,d1
  515.         or.b    d1,d0
  516.         lsr.b    #4,d0
  517.         move.w    d0,DISPROCIDX    ;Anzeigemodus als Index
  518.         rts
  519.  
  520. WrMYE        move.b    d1,MYE
  521.         not.b    d1
  522.         or.b    d1,SPREXPY
  523.         rts
  524.  
  525. WrVBASE        move.b    d1,VBASE
  526.  
  527.         move.b    d1,d0        ;Videomatrixbasis berechnen
  528.         and.w    #$00f0,d0
  529.         lsl.w    #6,d0
  530.         move.w    d0,MATRIXBASE
  531.  
  532.         move.b    d1,d0        ;Zeichengeneratorbasis berechnen
  533.         and.w    #$000e,d0
  534.         ror.w    #6,d0
  535.         move.w    d0,CHARBASE
  536.  
  537.         move.b    d1,d0        ;Bitmapbasis berechnen
  538.         and.w    #$0008,d0
  539.         ror.w    #6,d0
  540.         move.w    d0,BITMAPBASE
  541.         rts
  542.  
  543. WrIRQFLAG    not.b    d1        ;Gesetztes Bit: Flag löschen
  544.         and.b    IRQFLAG,d1
  545.         and.b    #$0f,d1
  546.  
  547.         move.b    d1,d0        ;Erlaubter IRQ noch gesetzt?
  548.         and.b    IRQMASK,d0
  549.         beq    1$
  550.         or.b    #$80,d1        ;Ja, Master-Bit setzen
  551.         move.b    d1,IRQFLAG
  552.         rts
  553. 1$        clr.b    IntIsVICIRQ    ;Nein, Interrupt zurücknehmen
  554.         move.b    d1,IRQFLAG
  555.         rts
  556.  
  557. WrIRQMASK    and.b    #$0f,d1
  558.         move.b    d1,IRQMASK
  559.         ;!! Evtl. IRQ auslösen
  560.         rts
  561.  
  562. WrBorder    move.b    d1,EC
  563.         move.b    d1,d0        ;In ein Langwort konvertieren
  564.         lsl.w    #8,d0
  565.         move.b    d1,d0
  566.         move.w    d0,d1
  567.         swap    d0
  568.         move.w    d1,d0
  569.         move.l    d0,BORDERLONG
  570.         rts
  571.  
  572.  
  573. **
  574. ** Byte vom VIC aus lesen
  575. **
  576.  
  577. ; Normaler Zugriff
  578. ; -> d0.w: Adresse ($0000..$3fff)
  579. ; <- d0.b: Byte
  580. VICRead        MACRO
  581.         bsr    VICReadIt
  582.         ENDM
  583.  
  584. VICReadIt    or.w    CIAVABASE,d0
  585.         move.w    d0,d1
  586.         lsr.w    #8,d1
  587.         move.l    (MemReadTab,d1.w*4),a0
  588.         jmp    (a0)
  589.  
  590. ReadByteRAM    move.b    (RAMPTR,d0.w),d0
  591.     IFNE    DE00_COMPATIBLE
  592.         move.b    d0,LastVICByte
  593.     ENDC
  594.         rts
  595.  
  596. ReadByteChar    and.w    #$0fff,d0
  597.         move.l    TheChar,a0
  598.         move.b    (a0,d0.w),d0
  599.     IFNE    DE00_COMPATIBLE
  600.         move.b    d0,LastVICByte
  601.     ENDC
  602.         rts
  603.  
  604.  
  605. **
  606. ** Hauptschleife für VIC
  607. **
  608.  
  609. *
  610. * Makros
  611. *
  612.  
  613. ; BA low setzen
  614. SetBALow    MACRO
  615.         tst.b    BALow        ;War BA schon low?
  616.         bne    \@1$
  617.         move.l    CycleCounter,FirstBACycle ;Nein, Zyklus merken
  618.         st.b    BALow        ;Und BA low setzen
  619. \@1$
  620.         ENDM
  621.  
  622. ; Bei Bad Line die Anzeige anschalten
  623. ; Muß synchron mit der positiven Flanke von Phi0 aufgerufen werden
  624. DisplayIfBadLine MACRO
  625.         tst.b    BADLINE        ;Bad Line?
  626.         beq    \@1$
  627.         st.b    DISPLAYSTATE    ;Ja, Anzeige ein
  628. \@1$
  629.         ENDM
  630.  
  631. ; Bei Bad Line den Matrixzugriff und die Anzeige anschalten
  632. ; Muß synchron mit der positiven Flanke von Phi0 aufgerufen werden
  633. FetchIfBadLine    MACRO
  634.         tst.b    BADLINE        ;Bad Line?
  635.         beq    \@1$
  636.         st.b    DISPLAYSTATE    ;Ja, Anzeige ein
  637.         SetBALow
  638. \@1$
  639.         ENDM
  640.  
  641. ; Bei Bad Line den Matrixzugriff und die Anzeige anschalten und den RC zurücksetzen
  642. ; Muß synchron mit der positiven Flanke von Phi0 aufgerufen werden
  643. RCIfBadLine    MACRO
  644.         tst.b    BADLINE        ;Bad Line?
  645.         beq    \@1$
  646.         st.b    DISPLAYSTATE    ;Ja, Anzeige ein
  647.         clr.w    RC        ; und RC zurücksetzen
  648.         SetBALow
  649. \@1$
  650.         ENDM
  651.  
  652. ; "Leerer" Zugriff
  653. IdleAccess    MACRO
  654.     IFNE    DE00_COMPATIBLE
  655.         move.w    #$3fff,d0
  656.         VICRead
  657.     ENDC
  658.         ENDM
  659.  
  660. ; Refreshzugriff
  661. RefreshAccess    MACRO
  662.     IFNE    DE00_COMPATIBLE
  663.         move.w    #$3f00,d0
  664.         move.b    REFCNT,d0
  665.         VICRead
  666.         subq.b    #1,REFCNT
  667.     ENDC
  668.         ENDM
  669.  
  670. ; Videomatrixzugriff
  671. ;  INDEX: Index in Matrixzeile
  672. MatrixAccess    MACRO
  673.         tst.b    BALow
  674.         beq    \@1$
  675.  
  676.         move.l    CycleCounter,d1    ;Wenn BA noch keine 3 Takte low ist, $ff lesen
  677.         sub.l    FirstBACycle,d1
  678.         moveq    #3,d2
  679.         cmp.l    d2,d1
  680.         blo    \@2$
  681.  
  682.         move.w    VCCOUNT,d0    ;BA war 3 Takte low, zugreifen
  683.         and.w    #$03ff,d0
  684.         or.w    MATRIXBASE,d0
  685.         or.w    CIAVABASE,d0
  686.         move.w    d0,d1
  687.         move.w    d0,d2
  688.         lsr.w    #8,d1
  689.         move.l    (MemReadTab,d1.w*4),a0
  690.         jsr    (a0)
  691.         move.b    d0,(MatrixLine,INDEX.l*2)
  692.  
  693.         and.w    #$03ff,d2    ;Farb-RAM lesen
  694.         move.l    TheColor,a0
  695.         move.b    (a0,d2.w),(MatrixLine+1,INDEX.l*2)
  696.         bra    \@1$
  697.  
  698. \@2$        move.w    #-1,(MatrixLine,INDEX.l*2) ;BA low, AEC high (Farbnibble stimmt nicht)
  699. \@1$
  700.         ENDM
  701.  
  702. ; Grafikzugriff
  703. ;  INDEX: Index in Matrixzeile
  704. GraphicsAccess    MACRO
  705.         tst.b    DISPLAYSTATE    ;Anzeige ein?
  706.         beq    Fetch3FFF\@
  707.  
  708.         btst    #5,CTRL1    ;Ja, Bitmap-Modus?
  709.         bne    FetchBitmap\@
  710.  
  711.         moveq    #0,d0        ;Nein, Textmodus
  712.         move.b    (MatrixLine,INDEX.l*2),d0
  713.         lsl.w    #3,d0
  714.         or.w    CHARBASE,d0
  715.         bra    FetchDoIt\@
  716.  
  717. FetchBitmap\@    move.w    VCCOUNT,d0    ;Bitmap-Modus
  718.         and.w    #$03ff,d0
  719.         lsl.w    #3,d0
  720.         or.w    BITMAPBASE,d0
  721.         bra    FetchDoIt\@
  722.  
  723. Fetch3FFF\@    move.w    #$3fff,d0    ;Anzeige aus, $3fff darstellen
  724.         or.w    CIAVABASE,d0
  725.  
  726.         btst    #6,CTRL1
  727.         beq    \@1$
  728.         and.w    #$f9ff,d0
  729. \@1$
  730.         move.w    d0,d1
  731.         lsr.w    #8,d1
  732.         move.l    (MemReadTab,d1.w*4),a0
  733.         jsr    (a0)
  734.         bra    FetchStore\@
  735.  
  736. FetchDoIt\@    or.w    RC,d0
  737.         or.w    CIAVABASE,d0
  738.  
  739.         btst    #6,CTRL1
  740.         beq    \@1$
  741.         and.w    #$f9ff,d0
  742. \@1$
  743.         move.w    d0,d1
  744.         lsr.w    #8,d1
  745.         move.l    (MemReadTab,d1.w*4),a0
  746.         jsr    (a0)
  747.         addq.w    #1,VCCOUNT
  748.         move.w    (MatrixLine,INDEX.l*2),CHARDATA ;Zeichen/Farbe für Anzeigestufe
  749.         addq.b    #1,INDEX
  750. FetchStore\@    move.b    d0,GFXDATA    ;Grafikbyte für Anzeigestufe merken
  751.         ENDM
  752.  
  753. ; Darstellung der Hintergrundfarbe (8 Pixel)
  754. ; BUFFER: Zeiger in ChunkyBuf, darf nicht verändert werden
  755. DrawBackground    MACRO
  756.         move.l    BUFFER,a0
  757.         move.b    LASTBACK,d0
  758.         move.b    d0,(a0)+
  759.         move.b    d0,(a0)+
  760.         move.b    d0,(a0)+
  761.         move.b    d0,(a0)+
  762.         move.b    d0,(a0)+
  763.         move.b    d0,(a0)+
  764.         move.b    d0,(a0)+
  765.         move.b    d0,(a0)
  766.         ENDM
  767.  
  768. ; Darstellung des Rahmens (8 Pixel)
  769. ; BUFFER: Zeiger in ChunkyBuf, wird um 8 erhöht
  770. DrawBorder    MACRO
  771.         tst.b    BORDERON
  772.         beq    \@1$
  773.         move.l    BORDERLONG,d0    ;Rahmen an, malen
  774.         move.l    d0,(BUFFER)+
  775.         move.l    d0,(BUFFER)+
  776.         bra    \@2$
  777. \@1$        addq.l    #8,BUFFER
  778. \@2$
  779.         ENDM
  780.  
  781. ; Sprite-DMA einschalten, wenn nötig
  782. CheckSpriteDMA    MACRO
  783.         lea    M7Y,a0        ;a0: Zeiger auf Y-Koordinate
  784.         lea    MC7BASE,a1    ;a1: Zeiger auf Spritedatenzähler-Zwischenspeicher
  785.         moveq    #7,d0        ;d0: Schleifenzähler
  786.         move.w    RASTERY,d1    ;d1: Aktuelle Rasterzeile
  787.         move.b    SPRDMAON,d2    ;d2: Puffer für SPRDMAON
  788.         move.b    SPREN,d3    ;d3: SPREN (VIC-Register)
  789. \@2$        btst    d0,d3        ;SPREN-Bit gesetzt?
  790.         beq    \@1$
  791.         cmp.b    (a0),d1        ;Ja, Y-Koordinate = RASTERY?
  792.         bne    \@1$
  793.         bset    d0,d2        ;Ja, DMA ein
  794.         clr.w    (a1)        ; und Datenzähler löschen
  795.         btst    d0,MYE
  796.         beq    \@1$
  797.         bclr    d0,SPREXPY
  798. \@1$        subq.l    #2,a0
  799.         subq.l    #2,a1
  800.         dbra    d0,\@2$
  801.         move.b    d2,SPRDMAON
  802.         ENDM
  803.  
  804. ; Zugriff auf Sprite-Datenzeiger
  805. SprPtrAccess    MACRO    ;Spritenummer
  806.         move.w    MATRIXBASE,d0
  807.         or.w    #$03f8+\1,d0
  808.         VICRead
  809.         moveq    #0,d1
  810.         move.b    d0,d1
  811.         lsl.w    #6,d1
  812.         move.w    d1,SPRPTR+(\1*2)
  813.         ENDM
  814.  
  815. ; Zugriff auf Sprite-Daten, Spritezähler erhöhen
  816. SprDataAccess    MACRO    ;Spritenummer, Byte-Nummer (0..2)
  817.         btst    #\1,SPRDMAON
  818.         beq    \@1$
  819.         move.w    MC\1,d0
  820.         and.w    #63,d0
  821.         or.w    SPRPTR+(\1*2),d0
  822.         VICRead
  823.         move.b    d0,SPR\1DATA+\2
  824.         addq.w    #1,MC\1
  825.     IFEQ    \2-1
  826.         bra    \@2$
  827.     ENDC
  828. \@1$
  829.     IFEQ    \2-1            ;Im zweiten Zyklus Idle-Zugriff machen, wenn Sprite-DMA ausgeschaltet
  830.         IdleAccess
  831. \@2$
  832.     ENDC
  833.         ENDM
  834.  
  835. ; Y-Expansions-Flipflop invertieren, wenn Bit in MYE gesetzt
  836. CheckMYE    MACRO    ;Spritenummer
  837.         btst    #\1,MYE
  838.         beq    \@4$
  839.         bchg    #\1,SPREXPY
  840. \@4$
  841.         ENDM
  842.  
  843. ; MCBASE um 2 erhöhen, falls Expansions-Flipflop gesetzt
  844. McbaseInc2    MACRO    ;Spritenummer
  845.         btst    #\1,SPREXPY
  846.         beq    \@1$
  847.         addq.w    #2,MC\1BASE
  848. \@1$
  849.         ENDM
  850.  
  851. ; MCBASE um 1 erhöhen, falls Expansions-Flipflop gesetzt und testen, ob
  852. ;  Sprite-DMA abgeschaltet werden kann
  853. CheckSprOff    MACRO
  854.         btst    #\1,SPREXPY
  855.         beq    \@2$
  856.         addq.w    #1,MC\1BASE
  857. \@2$        move.w    MC\1BASE,d0
  858.         and.w    #63,d0
  859.         cmp.w    #63,d0
  860.         bne    \@1$
  861.         bclr    #\1,SPRDMAON
  862. \@1$
  863.         ENDM
  864.  
  865.  
  866. *
  867. * Hauptschleife
  868. *
  869.  
  870. Main6569    
  871.  
  872. ; Zyklus 1: Spritezeiger 3 holen, Rasterzähler erhöhen,
  873. ;  Raster-IRQ auslösen, auf Bad Line prüfen.
  874. ;  BA rücksetzen, falls Sprite 3 und 4 aus. Daten von Sprite 3 lesen
  875. VIC.1        SprPtrAccess 3
  876.         SprDataAccess 3,0
  877.  
  878.         cmp.w    #STYP_8BIT,ScreenType ;Bei 8 Bit wird nur ein Zeilenpuffer verwendet
  879.         bne    4$
  880.         lea    ChunkyBuf,BUFFER
  881.         move.l    a6,-(sp)
  882.         move.l    _GfxBase,a6
  883.         move.l    _the_rast_port,a0
  884.         moveq    #0,d0
  885.         move.w    RASTERY,d1
  886.         move.l    #DisplayX,d2
  887.         move.l    BUFFER,a2
  888.         lea    _temp_rp,a1
  889.         JSRLIB    WritePixelLine8
  890.         move.l    (sp)+,a6
  891. 4$
  892.         cmp.w    #TotalLines-1,RASTERY ;War das die letzte Rasterzeile?
  893.         seq    VBLANKING
  894.         beq    3$
  895.  
  896.         addq.w    #1,RASTERY    ;Nein, Rasterzähler erhöhen
  897.         move.w    RASTERY,d6
  898.         cmp.w    IRQRASTERY,d6    ;IRQ-Zeile erreicht?
  899.         bne    1$
  900.  
  901.         bsr    DoRasterIRQ    ;Ja, auslösen
  902. 1$
  903.         cmp.w    #$30,d6        ;In Rasterzeile $30 entscheidet das DEN-Bit,
  904.         bne    2$        ; ob Bad Lines erlaubt sind
  905.         btst    #4,CTRL1
  906.         sne    BADLINEENABLE
  907. 2$
  908.         clr.b    BADLINE
  909.         tst.b    BADLINEENABLE    ;DMA erlaubt?
  910.         beq    3$
  911.         cmp.w    #FirstDMALine,d6 ;Ja, dann Bad Line Condition prüfen
  912.         blo    3$
  913.         cmp.w    #LastDMALine,d6
  914.         bhi    3$
  915.         move.w    d6,d0
  916.         and.w    #$07,d0
  917.         cmp.w    YSCROLL,d0
  918.         bne    3$
  919.         st.b    BADLINE
  920. 3$
  921.         DisplayIfBadLine
  922.         addq.w    #8,RASTERX
  923.  
  924.         move.b    SPRDMAON,d0
  925.         and.b    #$18,d0
  926.         bne    6$
  927.         clr.b    BALow
  928.  
  929. 6$        bsr    Periodic6526    ;CIA und 6510 ausführen
  930.  
  931. ; Zyklus 2: BA für Sprite 5 setzen. Daten von Sprite 3 lesen
  932. VIC.2        tst.b    VBLANKING    ;VBlank im letzten Zyklus?
  933.         beq    2$
  934.         bsr    TheVBlank    ;Ja
  935.  
  936. 2$        SprDataAccess 3,1
  937.         SprDataAccess 3,2
  938.         DisplayIfBadLine
  939.         addq.w    #8,RASTERX
  940.  
  941.         btst    #5,SPRDMAON
  942.         beq    1$
  943.         SetBALow
  944.  
  945. 1$        bsr    Periodic6526
  946.  
  947. ; Zyklus 3: Spritezeiger 4 holen. BA rücksetzen, falls Sprite 4 und 5 aus.
  948. ;  Daten von Sprite 4 lesen
  949. VIC.3        SprPtrAccess 4
  950.         SprDataAccess 4,0
  951.         DisplayIfBadLine
  952.         addq.w    #8,RASTERX
  953.  
  954.         move.b    SPRDMAON,d0
  955.         and.b    #$30,d0
  956.         bne    1$
  957.         clr.b    BALow
  958.  
  959. 1$        bsr    Periodic6526
  960.  
  961. ; Zyklus 4: BA für Sprite 6 setzen. Daten von Sprite 4 lesen
  962. VIC.4        SprDataAccess 4,1
  963.         SprDataAccess 4,2
  964.         DisplayIfBadLine
  965.         addq.w    #8,RASTERX
  966.  
  967.         btst    #6,SPRDMAON
  968.         beq    1$
  969.         SetBALow
  970.  
  971. 1$        bsr    Periodic6526
  972.  
  973. ; Zyklus 5: Spritezeiger 5 holen. BA rücksetzen, falls Sprite 5 und 6 aus.
  974. ;  Daten von Sprite 5 lesen
  975. VIC.5        SprPtrAccess 5
  976.         SprDataAccess 5,0
  977.         DisplayIfBadLine
  978.         addq.w    #8,RASTERX
  979.  
  980.         move.b    SPRDMAON,d0
  981.         and.b    #$60,d0
  982.         bne    1$
  983.         clr.b    BALow
  984.  
  985. 1$        bsr    Periodic6526
  986.  
  987. ; Zyklus 6: BA für Sprite 7 setzen. Daten von Sprite 5 lesen
  988. VIC.6        SprDataAccess 5,1
  989.         SprDataAccess 5,2
  990.         DisplayIfBadLine
  991.         addq.w    #8,RASTERX
  992.  
  993.         btst    #7,SPRDMAON
  994.         beq    1$
  995.         SetBALow
  996.  
  997. 1$        bsr    Periodic6526
  998.  
  999. ; Zyklus 7: Spritezeiger 6 holen. BA rücksetzen, falls Sprite 6 und 7 aus.
  1000. ;  Daten von Sprite 6 lesen
  1001. VIC.7        SprPtrAccess 6
  1002.         SprDataAccess 6,0
  1003.         DisplayIfBadLine
  1004.         addq.w    #8,RASTERX
  1005.  
  1006.         move.b    SPRDMAON,d0
  1007.         and.b    #$c0,d0
  1008.         bne    1$
  1009.         clr.b    BALow
  1010.  
  1011. 1$        bsr    Periodic6526
  1012.  
  1013. ; Zyklus 8: Daten von Sprite 6 lesen
  1014. VIC.8        SprDataAccess 6,1
  1015.         SprDataAccess 6,2
  1016.         DisplayIfBadLine
  1017.         addq.w    #8,RASTERX
  1018.  
  1019.         bsr    Periodic6526
  1020.  
  1021. ; Zyklus 9: Spritezeiger 7 holen. BA rücksetzen, falls Sprite 7 aus.
  1022. ;  Daten von Sprite 7 lesen
  1023. VIC.9        SprPtrAccess 7
  1024.         SprDataAccess 7,0
  1025.         DisplayIfBadLine
  1026.         addq.w    #8,RASTERX
  1027.  
  1028.         btst    #7,SPRDMAON
  1029.         bne    1$
  1030.         clr.b    BALow
  1031.  
  1032. 1$        bsr    Periodic6526
  1033.  
  1034. ; Zyklus 10: Daten von Sprite 7 lesen
  1035. VIC.10        SprDataAccess 7,1
  1036.         SprDataAccess 7,2
  1037.         DisplayIfBadLine
  1038.         addq.w    #8,RASTERX
  1039.  
  1040.         bsr    Periodic6526
  1041.  
  1042. ; Zyklus 11: Refresh, BA rücksetzen
  1043. VIC.11        RefreshAccess
  1044.         DisplayIfBadLine
  1045.         addq.w    #8,RASTERX
  1046.  
  1047.         clr.b    BALow
  1048.  
  1049.         bsr    Periodic6526
  1050.  
  1051. ; Zyklus 12: Refresh. Bei Bad Line den Matrixzugriff anschalten.
  1052. ;  Ab hier beginnt die Grafikdarstellung
  1053. VIC.12        DrawBackground
  1054.         DrawBorder
  1055.         RefreshAccess
  1056.         FetchIfBadLine
  1057.         addq.w    #8,RASTERX
  1058.  
  1059.         bsr    Periodic6526
  1060.  
  1061. ; Zyklus 13: Refresh. Bei Bad Line den Matrixzugriff anschalten.
  1062. ;  RASTERX zurücksetzen
  1063. VIC.13        DrawBackground
  1064.         DrawBorder
  1065.         RefreshAccess
  1066.         FetchIfBadLine
  1067.         move.w    #4,RASTERX
  1068.  
  1069.         bsr    Periodic6526
  1070.  
  1071. ; Zyklus 14: Refresh. VCBASE->VCCOUNT. Bei Bad Line den Matrixzugriff
  1072. ;  anschalten und den RC zurücksetzen
  1073. VIC.14        DrawBackground
  1074.         DrawBorder
  1075.         RefreshAccess
  1076.         RCIfBadLine
  1077.         addq.w    #8,RASTERX
  1078.  
  1079.         move.w    VCBASE,VCCOUNT
  1080.         clr.w    CHARDATA    ;"Schieberegister" löschen
  1081.  
  1082.         bsr    Periodic6526
  1083.  
  1084. ; Zyklus 15: Refresh und Matrixzugriff. MCBASE um 2 erhöhen
  1085. VIC.15        DrawBackground
  1086.         DrawBorder
  1087.         RefreshAccess
  1088.         FetchIfBadLine
  1089.         addq.w    #8,RASTERX
  1090.  
  1091.         McbaseInc2 0
  1092.         McbaseInc2 1
  1093.         McbaseInc2 2
  1094.         McbaseInc2 3
  1095.         McbaseInc2 4
  1096.         McbaseInc2 5
  1097.         McbaseInc2 6
  1098.         McbaseInc2 7
  1099.  
  1100.         moveq    #0,INDEX    ;Index in Matrixzeile
  1101.         MatrixAccess
  1102.  
  1103.         bsr    Periodic6526
  1104.  
  1105. ; Zyklus 16: Grafikzugriff und Matrixzugriff. MCBASE um 1 erhöhen und testen,
  1106. ;  ob Sprite-DMA abgeschaltet werden kann
  1107. VIC.16        DrawBackground
  1108.         DrawBorder
  1109.         GraphicsAccess
  1110.         FetchIfBadLine        ;Muß nach GraphicsAccess stehen,
  1111.                     ; damit bei einem STA $D011 im
  1112.                     ; Zyklus zuvor noch kein Grafikzugriff
  1113.                     ; gemacht wird
  1114.         addq.w    #8,RASTERX
  1115.  
  1116.         CheckSprOff 0
  1117.         CheckSprOff 1
  1118.         CheckSprOff 2
  1119.         CheckSprOff 3
  1120.         CheckSprOff 4
  1121.         CheckSprOff 5
  1122.         CheckSprOff 6
  1123.         CheckSprOff 7
  1124.  
  1125.         MatrixAccess
  1126.  
  1127.         bsr    Periodic6526
  1128.  
  1129. ; Zyklus 17: Grafikzugriff und Matrixzugriff, im 40-Spalten-Modus
  1130. ;  Rahmen abschalten. Ab hier beginnt die Darstellung des Textfensters
  1131. VIC.17        tst.b    IS38COL
  1132.         bne    1$
  1133.  
  1134.         move.w    RASTERY,d6
  1135.         cmp.w    DYSTOP,d6
  1136.         bne    2$
  1137.         st.b    UDBORDERON
  1138.         bra    1$
  1139.  
  1140. 2$        btst    #4,CTRL1
  1141.         beq    3$
  1142.         cmp.w    DYSTART,d6
  1143.         bne    3$
  1144.         clr.b    UDBORDERON
  1145.         bra    4$
  1146.  
  1147. 3$        tst.b    UDBORDERON
  1148.         bne    1$
  1149. 4$        clr.b    BORDERON
  1150. 1$
  1151.         DrawBackground        ;Verhindert Grafikmüll, falls XSCROLL>0
  1152.         bsr    DrawGraphics
  1153.         DrawBorder
  1154.         GraphicsAccess
  1155.         FetchIfBadLine
  1156.         addq.w    #8,RASTERX
  1157.         MatrixAccess
  1158.  
  1159.         bsr    Periodic6526
  1160.  
  1161. ; Zyklus 18..54: Grafikzugriff und Matrixzugriff, im 38-Spalten-Modus
  1162. ;  Rahmen abschalten
  1163. VIC.18        tst.b    IS38COL
  1164.         beq    1$
  1165.  
  1166.         move.w    RASTERY,d6
  1167.         cmp.w    DYSTOP,d6
  1168.         bne    2$
  1169.         st.b    UDBORDERON
  1170.         bra    1$
  1171.  
  1172. 2$        btst    #4,CTRL1
  1173.         beq    3$
  1174.         cmp.w    DYSTART,d6
  1175.         bne    3$
  1176.         clr.b    UDBORDERON
  1177.         bra    4$
  1178.  
  1179. 3$        tst.b    UDBORDERON
  1180.         bne    1$
  1181. 4$        clr.b    BORDERON
  1182. 1$
  1183.         moveq    #54-18,d6
  1184. VIC.Loop    bsr    DrawGraphics
  1185.         DrawBorder
  1186.         GraphicsAccess
  1187.         FetchIfBadLine
  1188.         addq.w    #8,RASTERX
  1189.         MatrixAccess
  1190.  
  1191.         bsr    Periodic6526
  1192.         dbra    d6,VIC.Loop
  1193.  
  1194. ; Zyklus 55: Letzter Grafikzugriff, Matrixzugriff abschalten.
  1195. ;   Sprite-DMA anschalten, wenn Y-Koordinate richtig und SPEN-Bit gesetzt
  1196. ;   (für alle Sprites). Sprite-Y-Expansion handhaben. BA für Sprite 0 setzen
  1197. VIC.55        bsr    DrawGraphics
  1198.         DrawBorder
  1199.         GraphicsAccess
  1200.         DisplayIfBadLine
  1201.         addq.w    #8,RASTERX
  1202.  
  1203.         CheckMYE 0
  1204.         CheckMYE 1
  1205.         CheckMYE 2
  1206.         CheckMYE 3
  1207.         CheckMYE 4
  1208.         CheckMYE 5
  1209.         CheckMYE 6
  1210.         CheckMYE 7
  1211.  
  1212.         CheckSpriteDMA
  1213.  
  1214.         btst    #0,SPRDMAON    ;Sprite 0 an?
  1215.         bne    3$
  1216.         clr.b    BALow        ;Nein, BA high
  1217.         bra    4$
  1218. 3$        SetBALow        ;Sonst BA low
  1219.  
  1220. 4$        bsr    Periodic6526
  1221.  
  1222. ; Zyklus 56: Im 38-Spalten-Modus Rahmen anschalten. Sprite-DMA anschalten,
  1223. ;   wenn Y-Koordinate richtig und SPEN-Bit gesetzt (für alle Sprites).
  1224. ;   BA für Sprite 0 setzen. Nach diesem Zyklus endet die Darstellung des
  1225. ;   Textfensters
  1226. VIC.56        tst.b    IS38COL
  1227.         beq    1$
  1228.         st.b    BORDERON
  1229. 1$
  1230.  
  1231.         bsr    DrawGraphics
  1232.         DrawBorder
  1233.         IdleAccess
  1234.         DisplayIfBadLine
  1235.         addq.w    #8,RASTERX
  1236.         CheckSpriteDMA
  1237.  
  1238.         bsr    Periodic6526
  1239.  
  1240. ; Zyklus 57: Im 40-Spalten-Modus Rahmen anschalten, BA für Sprite 1 setzen
  1241. VIC.57        tst.b    IS38COL
  1242.         bne    1$
  1243.         st.b    BORDERON
  1244. 1$
  1245.         DrawBackground
  1246.         DrawBorder
  1247.         IdleAccess
  1248.         DisplayIfBadLine
  1249.         addq.w    #8,RASTERX
  1250.  
  1251.         btst    #1,SPRDMAON
  1252.         beq    2$
  1253.         SetBALow
  1254.  
  1255. 2$        bsr    Periodic6526
  1256.  
  1257. ; Zyklus 58: Spritezeiger 0 holen. Prüfen, ob RC=7. Wenn ja, Display
  1258. ;  ausschalten und VCCOUNT->VCBASE machen. Wenn das Display an ist, den
  1259. ;  RC erhöhen (bei einer Bad Line ist das Display immer an). Daten von
  1260. ;  Sprite 0 lesen. MCBASE->MC machen
  1261. VIC.58        DrawBackground
  1262.         DrawBorder
  1263.  
  1264.         move.w    MC0BASE,MC0
  1265.         move.w    MC1BASE,MC1
  1266.         move.w    MC2BASE,MC2
  1267.         move.w    MC3BASE,MC3
  1268.         move.w    MC4BASE,MC4
  1269.         move.w    MC5BASE,MC5
  1270.         move.w    MC6BASE,MC6
  1271.         move.w    MC7BASE,MC7
  1272.  
  1273.         SprPtrAccess 0
  1274.         SprDataAccess 0,0
  1275.  
  1276.         cmp.w    #7,RC
  1277.         bne    1$
  1278.         move.w    VCCOUNT,VCBASE
  1279.         clr.b    DISPLAYSTATE
  1280.  
  1281. 1$        tst.b    BADLINE
  1282.         bne    2$
  1283.         tst.b    DISPLAYSTATE
  1284.         beq    3$
  1285.  
  1286. 2$        st.b    DISPLAYSTATE    ;Dies erübrigt DisplayIfBadLine
  1287.         addq.w    #1,RC
  1288.         and.w    #7,RC
  1289.  
  1290. 3$        addq.w    #8,RASTERX
  1291.  
  1292.         bsr    Periodic6526
  1293.  
  1294. ; Zyklus 59: BA für Sprite 2 setzen. Daten von Sprite 0 lesen
  1295. VIC.59        DrawBackground
  1296.         DrawBorder
  1297.         SprDataAccess 0,1
  1298.         SprDataAccess 0,2
  1299.         DisplayIfBadLine
  1300.         addq.w    #8,RASTERX
  1301.  
  1302.         btst    #2,SPRDMAON
  1303.         beq    1$
  1304.         SetBALow
  1305.  
  1306. 1$        bsr    Periodic6526
  1307.  
  1308. ; Zyklus 60: Spritezeiger 1 holen. Nach diesem Zyklus endet
  1309. ;  die Grafikdarstellung. BA rücksetzen, falls Sprite 1 und 2 aus.
  1310. ;  Daten von Sprite 1 lesen
  1311. VIC.60        DrawBackground
  1312.         DrawBorder
  1313.         SprPtrAccess 1
  1314.         SprDataAccess 1,0
  1315.         DisplayIfBadLine
  1316.         addq.w    #8,RASTERX
  1317.  
  1318.         move.b    SPRDMAON,d0
  1319.         and.b    #$06,d0
  1320.         bne    1$
  1321.         clr.b    BALow
  1322.  
  1323. 1$        bsr    Periodic6526
  1324.  
  1325. ; Zyklus 61: BA für Sprite 3 setzen. Daten von Sprite 1 lesen
  1326. VIC.61        SprDataAccess 1,1
  1327.         SprDataAccess 1,2
  1328.         DisplayIfBadLine
  1329.         addq.w    #8,RASTERX
  1330.  
  1331.         btst    #3,SPRDMAON
  1332.         beq    1$
  1333.         SetBALow
  1334.  
  1335. 1$        bsr    Periodic6526
  1336.  
  1337. ; Zyklus 62: Spritezeiger 2 holen. BA rücksetzen, falls Sprite 2 und 3 aus.
  1338. ;  Daten von Sprite 2 lesen
  1339. VIC.62        SprPtrAccess 2
  1340.         SprDataAccess 2,0
  1341.         DisplayIfBadLine
  1342.         addq.w    #8,RASTERX
  1343.  
  1344.         move.b    SPRDMAON,d0
  1345.         and.b    #$0c,d0
  1346.         bne    1$
  1347.         clr.b    BALow
  1348.  
  1349. 1$        bsr    Periodic6526
  1350.  
  1351. ; Zyklus 63: BA für Sprite 4 setzen. Daten von Sprite 2 lesen
  1352. VIC.63        SprDataAccess 2,1
  1353.         SprDataAccess 2,2
  1354.         DisplayIfBadLine
  1355.         addq.w    #8,RASTERX
  1356.  
  1357.         move.w    RASTERY,d6
  1358.         cmp.w    DYSTOP,d6
  1359.         bne    2$
  1360.         st.b    UDBORDERON
  1361.         bra    3$
  1362. 2$        btst    #4,CTRL1
  1363.         beq    3$
  1364.         cmp.w    DYSTART,d6
  1365.         bne    3$
  1366.         clr.b    UDBORDERON
  1367. 3$
  1368.         btst    #4,SPRDMAON
  1369.         beq    1$
  1370.         SetBALow
  1371.  
  1372. 1$        bsr    Periodic6526
  1373.         bra    Main6569
  1374.  
  1375.  
  1376. *
  1377. * Darstellung der Grafik (8 Pixel)
  1378. * BUFFER: Zeiger in ChunkyBuf, darf nicht verändert werden
  1379. *
  1380.  
  1381. DrawGraphics    move.l    BUFFER,a0
  1382.         move.b    GFXDATA,d0
  1383.         add.w    XSCROLL,a0
  1384.  
  1385.         tst.b    UDBORDERON
  1386.         bne    DrNothing
  1387.  
  1388.         tst.b    DISPLAYSTATE
  1389.         beq    Dr3FFF
  1390.  
  1391.         move.w    DISPROCIDX,d1
  1392.         move.l    (GfxJmpTab,d1.w*4),a1
  1393.         jmp    (a1)
  1394.  
  1395.         CNOP    0,4
  1396. GfxJmpTab    dc.l    DrText
  1397.         dc.l    DrTextMulti
  1398.         dc.l    DrBitMap
  1399.         dc.l    DrBitMapMulti
  1400.         dc.l    DrTextECM
  1401.         dc.l    DrInvalid
  1402.         dc.l    DrInvalid
  1403.         dc.l    DrInvalid
  1404.  
  1405. Dr3FFF        move.b    B0C,d2        ;Hintergrund
  1406.         moveq    #0,d3        ;Vordergrund schwarz
  1407.         bra    DrawStd
  1408.  
  1409. DrTextECM    moveq    #0,d2
  1410.         move.b    CHARDATA,d2
  1411.         lsr.b    #6,d2
  1412.         move.b    (B0C,d2.l),d2    ;Hintergrund
  1413.         move.b    COLDATA,d3    ;Vordergrund
  1414.         bra    DrawStd
  1415.  
  1416. DrBitMap    move.b    CHARDATA,d2    ;Hintergrund
  1417.         move.b    d2,d3
  1418.         lsr.b    #4,d3        ;Vordergrund
  1419.         bra    DrawStd
  1420.  
  1421. DrText        move.b    B0C,d2        ;Hintergrund
  1422.         move.b    COLDATA,d3    ;Vordergrund
  1423.  
  1424. DrawStd        move.b    d2,LASTBACK    ;Hintergrundfarbe merken
  1425.         add.b    d0,d0        ;Standard-Daten anzeigen
  1426.         bcc    11$
  1427.         move.b    d3,(a0)+
  1428.         bra    12$
  1429. 11$        move.b    d2,(a0)+
  1430. 12$
  1431.         add.b    d0,d0
  1432.         bcc    21$
  1433.         move.b    d3,(a0)+
  1434.         bra    22$
  1435. 21$        move.b    d2,(a0)+
  1436. 22$
  1437.         add.b    d0,d0
  1438.         bcc    31$
  1439.         move.b    d3,(a0)+
  1440.         bra    32$
  1441. 31$        move.b    d2,(a0)+
  1442. 32$
  1443.         add.b    d0,d0
  1444.         bcc    41$
  1445.         move.b    d3,(a0)+
  1446.         bra    42$
  1447. 41$        move.b    d2,(a0)+
  1448. 42$
  1449.         add.b    d0,d0
  1450.         bcc    51$
  1451.         move.b    d3,(a0)+
  1452.         bra    52$
  1453. 51$        move.b    d2,(a0)+
  1454. 52$
  1455.         add.b    d0,d0
  1456.         bcc    61$
  1457.         move.b    d3,(a0)+
  1458.         bra    62$
  1459. 61$        move.b    d2,(a0)+
  1460. 62$
  1461.         add.b    d0,d0
  1462.         bcc    71$
  1463.         move.b    d3,(a0)+
  1464.         bra    72$
  1465. 71$        move.b    d2,(a0)+
  1466. 72$
  1467.         add.b    d0,d0
  1468.         bcc    81$
  1469.         move.b    d3,(a0)+
  1470.         bra    82$
  1471. 81$        move.b    d2,(a0)+
  1472. 82$        rts
  1473.  
  1474. DrBitMapMulti    move.b    CHARDATA,d2
  1475.         move.b    d2,d3        ;10
  1476.         lsr.b    #4,d2        ;01
  1477.         move.b    COLDATA,d4    ;11
  1478.         bra    DrawMulti
  1479.  
  1480. DrTextMulti    move.b    COLDATA,d4    ;11
  1481.         bclr    #3,d4        ;Bit 3 gelöscht -> Standard-Text
  1482.         beq    DrText
  1483.         move.b    B1C,d2        ;01
  1484.         move.b    B2C,d3        ;10
  1485.  
  1486. DrawMulti    move.b    B0C,d1
  1487.         move.b    d1,LASTBACK    ;Hintergrundfarbe merken
  1488.  
  1489.         add.b    d0,d0        ;Multicolor-Daten anzeigen
  1490.         bcc    11$
  1491.         add.b    d0,d0
  1492.         bcc    12$
  1493.         move.b    d4,(a0)+    ;11
  1494.         move.b    d4,(a0)+
  1495.         bra    14$
  1496. 12$        move.b    d3,(a0)+    ;10
  1497.         move.b    d3,(a0)+
  1498.         bra    14$
  1499. 11$        add.b    d0,d0
  1500.         bcc    13$
  1501.         move.b    d2,(a0)+    ;01
  1502.         move.b    d2,(a0)+
  1503.         bra    14$
  1504. 13$        move.b    d1,(a0)+    ;00
  1505.         move.b    d1,(a0)+
  1506. 14$
  1507.         add.b    d0,d0
  1508.         bcc    21$
  1509.         add.b    d0,d0
  1510.         bcc    22$
  1511.         move.b    d4,(a0)+    ;11
  1512.         move.b    d4,(a0)+
  1513.         bra    24$
  1514. 22$        move.b    d3,(a0)+    ;10
  1515.         move.b    d3,(a0)+
  1516.         bra    24$
  1517. 21$        add.b    d0,d0
  1518.         bcc    23$
  1519.         move.b    d2,(a0)+    ;01
  1520.         move.b    d2,(a0)+
  1521.         bra    24$
  1522. 23$        move.b    d1,(a0)+    ;00
  1523.         move.b    d1,(a0)+
  1524. 24$
  1525.         add.b    d0,d0
  1526.         bcc    31$
  1527.         add.b    d0,d0
  1528.         bcc    32$
  1529.         move.b    d4,(a0)+    ;11
  1530.         move.b    d4,(a0)+
  1531.         bra    34$
  1532. 32$        move.b    d3,(a0)+    ;10
  1533.         move.b    d3,(a0)+
  1534.         bra    34$
  1535. 31$        add.b    d0,d0
  1536.         bcc    33$
  1537.         move.b    d2,(a0)+    ;01
  1538.         move.b    d2,(a0)+
  1539.         bra    34$
  1540. 33$        move.b    d1,(a0)+    ;00
  1541.         move.b    d1,(a0)+
  1542. 34$
  1543.         add.b    d0,d0
  1544.         bcc    41$
  1545.         add.b    d0,d0
  1546.         bcc    42$
  1547.         move.b    d4,(a0)+    ;11
  1548.         move.b    d4,(a0)+
  1549.         bra    44$
  1550. 42$        move.b    d3,(a0)+    ;10
  1551.         move.b    d3,(a0)+
  1552.         bra    44$
  1553. 41$        add.b    d0,d0
  1554.         bcc    43$
  1555.         move.b    d2,(a0)+    ;01
  1556.         move.b    d2,(a0)+
  1557.         bra    44$
  1558. 43$        move.b    d1,(a0)+    ;00
  1559.         move.b    d1,(a0)+
  1560. 44$        rts
  1561.  
  1562. DrInvalid    clr.b    LASTBACK    ;Ungültiger Darstellungsmodus
  1563.         clr.l    (a0)+
  1564.         clr.l    (a0)
  1565.         rts
  1566.  
  1567. DrNothing    move.b    LASTBACK,d0
  1568.         move.b    d0,(a0)+
  1569.         move.b    d0,(a0)+
  1570.         move.b    d0,(a0)+
  1571.         move.b    d0,(a0)+
  1572.         move.b    d0,(a0)+
  1573.         move.b    d0,(a0)+
  1574.         move.b    d0,(a0)+
  1575.         move.b    d0,(a0)
  1576.         rts
  1577.  
  1578.  
  1579. *
  1580. * VBlank
  1581. *
  1582.  
  1583. ; Zähler zurücksetzen
  1584. TheVBlank    moveq    #0,d6        ;Rasterzähler auf Null
  1585.         clr.w    RASTERY
  1586.         clr.w    VCBASE
  1587.         lea    ChunkyBuf,BUFFER
  1588.         st.b    REFCNT        ;Refreshzähler zurücksetzen
  1589.         clr.b    LPTRIGGERED    ;Lightpen wieder freigeben
  1590.  
  1591.         bsr    CountTODs    ;TODs zählen
  1592.  
  1593.         subq.w    #1,SkipCounter    ;Bild überspringen?
  1594.         bne    1$
  1595.         move.w    SkipLatch,SkipCounter
  1596.  
  1597. ; Grafik darstellen
  1598.         jsr    _RedrawDisplay
  1599.  
  1600. 1$        tst.w    IRQRASTERY    ;IRQ in Zeile 0?
  1601.         bne    10$
  1602.         bra    DoRasterIRQ    ;Ja, IRQ auslösen
  1603. 10$        rts
  1604.  
  1605.  
  1606. *
  1607. * Raster-IRQ auslösen
  1608. *
  1609.  
  1610. DoRasterIRQ    or.b    #$01,IRQFLAG    ;Ja, IRST-Bit setzen
  1611.         btst    #0,IRQMASK    ;Raster-IRQ erlaubt?
  1612.         beq    2$
  1613.         or.b    #$80,IRQFLAG    ;Ja, IRQ-Bit setzen
  1614.         tst.w    IntIsIRQ    ;IRQ schon ausgelöst?
  1615.         bne    1$
  1616.         move.l    CycleCounter,FirstIRQCycle ;Nein, Zyklus merken
  1617. 1$        st.b    IntIsVICIRQ    ; und Interrupt auslösen
  1618. 2$        rts
  1619.  
  1620.  
  1621. **
  1622. ** Datenbereich
  1623. **
  1624.  
  1625. ; Grafikpuffer
  1626.         SECTION    "BSS",BSS
  1627.         XDEF    _ChunkyBuf
  1628. _ChunkyBuf
  1629. ChunkyBuf    ds.b    DisplayX*DisplayY
  1630.  
  1631.  
  1632.         SECTION    "__MERGED",BSS
  1633.  
  1634. DisplayID    ds.l    1    ;Prefs: DisplayID des Screens
  1635. ScreenType    ds.w    1    ;Prefs: Typ der Screen-Ansteuerung
  1636. NormalCycles    ds.w    1    ;Unbenutzt
  1637. BadLineCycles    ds.w    1    ;Unbenutzt
  1638. Collisions    ds.w    1    ;Prefs: Sprite-Kollisionen angeschaltet
  1639. Overscan    ds.w    1    ;Prefs: Overscan-Typ für Amiga-Modi
  1640. DirectVideo    ds.w    1    ;Unbenutzt
  1641.  
  1642. SkipCounter    ds.w    1
  1643.         XDEF    _SkipLatch
  1644. _SkipLatch
  1645. SkipLatch    ds.w    1    ;Prefs: Nur jedes nte Bild darstellen
  1646.         XDEF    _LimitSpeed
  1647. _LimitSpeed
  1648. LimitSpeed    ds.w    1    ;Prefs: Speed Limiter
  1649.  
  1650. ; VIC-Register
  1651. VICREGS
  1652.         ds.b    1    ;Sprite-Positionen, X-Werte unbenutzt,
  1653. M0Y        ds.b    1    ; stattdessen SPRX*
  1654.         ds.b    1
  1655. M1Y        ds.b    1
  1656.         ds.b    1
  1657. M2Y        ds.b    1
  1658.         ds.b    1
  1659. M3Y        ds.b    1
  1660.         ds.b    1
  1661. M4Y        ds.b    1
  1662.         ds.b    1
  1663. M5Y        ds.b    1
  1664.         ds.b    1
  1665. M6Y        ds.b    1
  1666.         ds.b    1
  1667. M7Y        ds.b    1
  1668. MX8        ds.b    1    ;MSBs der X-Positionen
  1669. CTRL1        ds.b    1    ;Steuerreg. 1
  1670.         ds.b    1    ;Rasterzeile, ersetzt durch 16-Bit RASTERY
  1671. LPX        ds.b    1    ;Lightpen X
  1672. LPY        ds.b    1    ;Lightpen Y
  1673. SPREN        ds.b    1    ;Sprite eingeschaltet?
  1674. CTRL2        ds.b    1    ;Steuerreg. 2
  1675. MYE        ds.b    1    ;Sprite-Y-Expansion
  1676. VBASE        ds.b    1    ;Basisadressen
  1677. IRQFLAG        ds.b    1    ;Interruptreg.
  1678. IRQMASK        ds.b    1
  1679. MDP        ds.b    1    ;Sprite-Priorität
  1680. MMC        ds.b    1    ;Sprite-Multicolor
  1681. MXE        ds.b    1    ;Sprite-X-Expansion
  1682. CLXSPR        ds.b    1    ;Kollisionsreg.
  1683. CLXBGR        ds.b    1
  1684. EC        ds.b    1    ;Rahmenfarbe
  1685. B0C        ds.b    1    ;Hintergrundfarbe 0
  1686. B1C        ds.b    1    ;Hintergrundfarbe 1
  1687. B2C        ds.b    1    ;Hintergrundfarbe 2
  1688. B3C        ds.b    1    ;Hintergrundfarbe 3
  1689. MM0        ds.b    1    ;Sprite-Multicolorfarbe 0
  1690. MM1        ds.b    1    ;Sprite-Multicolorfarbe 1
  1691. M0C        ds.b    1    ;Farbe Sprite 0
  1692. M1C        ds.b    1    ;Farbe Sprite 1
  1693. M2C        ds.b    1    ;Farbe Sprite 2
  1694. M3C        ds.b    1    ;Farbe Sprite 3
  1695. M4C        ds.b    1    ;Farbe Sprite 4
  1696. M5C        ds.b    1    ;Farbe Sprite 5
  1697. M6C        ds.b    1    ;Farbe Sprite 6
  1698. M7C        ds.b    1    ;Farbe Sprite 7
  1699.  
  1700.         CNOP    0,4
  1701. RASTERX        ds.w    1    ;Aktuelle X-Position des Rasterstrahls (für Lightpen)
  1702. RASTERY        ds.w    1    ;Aktuelle Rasterzeile
  1703. IRQRASTERY    ds.w    1    ;Rasterzeile, bei der ein IRQ ausgelöst wird
  1704. RC        ds.w    1    ;Rasterzähler RC
  1705. VCBASE        ds.w    1    ;VC-Zwischenspeicher
  1706. VCCOUNT        ds.w    1    ;VC-Zähler
  1707. MC0        ds.w    1    ;Spritedatenzähler 0
  1708. MC1        ds.w    1    ;Spritedatenzähler 1
  1709. MC2        ds.w    1    ;Spritedatenzähler 2
  1710. MC3        ds.w    1    ;Spritedatenzähler 3
  1711. MC4        ds.w    1    ;Spritedatenzähler 4
  1712. MC5        ds.w    1    ;Spritedatenzähler 5
  1713. MC6        ds.w    1    ;Spritedatenzähler 6
  1714. MC7        ds.w    1    ;Spritedatenzähler 7
  1715. MC0BASE        ds.w    1    ;MC-Zwischenspeicher
  1716. MC1BASE        ds.w    1
  1717. MC2BASE        ds.w    1
  1718. MC3BASE        ds.w    1
  1719. MC4BASE        ds.w    1
  1720. MC5BASE        ds.w    1
  1721. MC6BASE        ds.w    1
  1722. MC7BASE        ds.w    1
  1723. SPRX0        ds.w    1    ;16-Bit Sprite-X-Koordinaten
  1724. SPRX1        ds.w    1
  1725. SPRX2        ds.w    1
  1726. SPRX3        ds.w    1
  1727. SPRX4        ds.w    1
  1728. SPRX5        ds.w    1
  1729. SPRX6        ds.w    1
  1730. SPRX7        ds.w    1
  1731. DYSTART        ds.w    1    ;Aktuelle Werte des Randbereichs
  1732. DYSTOP        ds.w    1    ; (für Rahmenstufe)
  1733. XSCROLL        ds.w    1    ;X-Scroll-Wert
  1734. YSCROLL        ds.w    1    ;Y-Scroll-Wert
  1735.  
  1736. CIAVABASE    ds.w    1    ;16-Bit Basisadresse durch CIA-VA14/15
  1737.                 ;xx00000000000000
  1738. MATRIXBASE    ds.w    1    ;16-Bit Videomatrixbasis
  1739.                 ;00xxxx0000000000
  1740. CHARBASE    ds.w    1    ;16-Bit Zeichengeneratorbasis
  1741.                 ;00xxx00000000000
  1742. BITMAPBASE    ds.w    1    ;16-Bit Bitmapbasis
  1743.                 ;00x0000000000000
  1744. SPRPTR        ds.w    8    ;Sprite-Datenzeiger
  1745.                 ;00xxxxxxxx000000
  1746.  
  1747. BADLINE        ds.b    1    ;Flag: Bad-Line-Zustand
  1748. DISPLAYSTATE    ds.b    1    ;Flag: Display-Zustand
  1749. BADLINEENABLE    ds.b    1    ;Flag: Bad Line erlaubt (DEN)
  1750. BORDERON    ds.b    1    ;Flag: Rahmen an (Haupt-Rahmenflipflop)
  1751. UDBORDERON    ds.b    1    ;Flag: Oberer/unterer Rahmen an (vertikales Rahmenflipflop)
  1752. IS38COL        ds.b    1    ;Flag: 38 Spalten
  1753. VBLANKING    ds.b    1    ;Flag: In Zyklus 2 VBlank
  1754. LPTRIGGERED    ds.b    1    ;Flag: Lightpen wurde in diesem Frame schon getriggert
  1755. SPRDMAON    ds.b    1    ;8 Flags: Sprite-DMA angeschaltet
  1756. SPREXPY        ds.b    1    ;8 Flags: MC->MCBASE machen
  1757. REFCNT        ds.b    1    ;Refreshzähler
  1758.  
  1759.     IFNE    DE00_COMPATIBLE
  1760. LastVICByte    ds.b    1    ;Zuletzt vom VIC gelesenes Byte
  1761.                 ; (für $DE00-Kompatibilität)
  1762.     ENDC
  1763.  
  1764.         CNOP    0,4
  1765. DISPROCIDX    ds.w    1    ;Anzeigestufe: Index des Darstellungsmodus
  1766. CHARDATA    ds.b    1    ;Character-Byte im "Schieberegister"
  1767. COLDATA        ds.b    1    ;Farbnybble im "Schieberegister"
  1768. GFXDATA        ds.b    1    ;Grafikdaten im "Schieberegister"
  1769. LASTBACK    ds.b    1    ;Letzte Hintergrundfarbe
  1770.  
  1771. SPR0DATA    ds.b    3    ;Spritedaten 0
  1772. SPR1DATA    ds.b    3    ;Spritedaten 1
  1773. SPR2DATA    ds.b    3    ;Spritedaten 2
  1774. SPR3DATA    ds.b    3    ;Spritedaten 3
  1775. SPR4DATA    ds.b    3    ;Spritedaten 4
  1776. SPR5DATA    ds.b    3    ;Spritedaten 5
  1777. SPR6DATA    ds.b    3    ;Spritedaten 6
  1778. SPR7DATA    ds.b    3    ;Spritedaten 7
  1779.  
  1780.         CNOP    0,4
  1781. BORDERLONG    ds.l    1    ;Rahmenfarbe als Langwort
  1782. CycleCounter    ds.l    1    ;Zyklenzähler
  1783. FirstBACycle    ds.l    1    ;Zyklus, an dem BA zuletzt auf low ging
  1784.  
  1785. ; Sprungtabelle für Speicherzugriff: Ein Eintrag pro Seite
  1786. MemReadTab    ds.l    256
  1787.  
  1788. ; Interner Videomatrix-Puffer
  1789. MatrixLine    ds.b    80    ;Jeweils 1 Byte Zeichen, 1 Byte Farbe
  1790.  
  1791.         XDEF    _CURRENTA5
  1792. _CURRENTA5    ds.l    1    ;Unbenutzt
  1793.  
  1794.         END
  1795.