home *** CD-ROM | disk | FTP | other *** search
/ Amiga ISO Collection / AmigaUtilCD1.iso / Emulatoren / FS_FRO23.LZX / Frodo / src / 6569SC.asm < prev    next >
Encoding:
Assembly Source File  |  1996-01-30  |  39.0 KB  |  2,109 lines

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