home *** CD-ROM | disk | FTP | other *** search
/ Amiga ISO Collection / AmigaUtilCD1.iso / Emulatoren / FRODO24.LZX / Frodo / Src / 6569SC.asm < prev    next >
Encoding:
Assembly Source File  |  1996-12-17  |  40.4 KB  |  2,178 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-Kollisionen
  29. *
  30.  
  31. DEBUG_DETAIL    SET 0
  32.  
  33. DE00_COMPATIBLE    SET 1
  34.  
  35.         MACHINE    68020
  36.  
  37.         INCLUDE    "exec/types.i"
  38.         INCLUDE    "exec/macros.i"
  39.         INCLUDE    "debug.i"
  40.  
  41.         XREF    _SysBase    ;Main.asm
  42.         XREF    _GfxBase
  43.  
  44.         NREF    TheChar        ;6510SC.asm
  45.         NREF    TheColor
  46.         NREF    IntIsIRQ
  47.         NREF    IntIsVICIRQ
  48.         NREF    FirstIRQCycle
  49.         NREF    BALow
  50.     IFNE    DEBUG_DETAIL
  51.         NREF    DEBUGON
  52.     ENDC
  53.  
  54.         XREF    CountTODs    ;6526SC.asm
  55.         XREF    Periodic6526
  56.  
  57.         XREF    _OpenDisplay    ;Display.c
  58.         XREF    _RedrawDisplay
  59.         XREF    _the_rast_port
  60.         XREF    _temp_rp
  61.  
  62.         XDEF    Init6569
  63.         XDEF    _GetVICDump
  64.         XDEF    OpenGraphics
  65.         XDEF    ChangedVA
  66.         XDEF    TriggerLightpen
  67.         XDEF    Main6569
  68.         XDEF    ReadFrom6569
  69.         XDEF    WriteTo6569
  70.     IFNE    DE00_COMPATIBLE
  71.         XDEF    LastVICByte
  72.     ENDC
  73.         XDEF    CycleCounter
  74.  
  75.         XDEF    DisplayID    ;Prefs
  76.         XDEF    ScreenType
  77.         XDEF    NormalCycles
  78.         XDEF    BadLineCycles
  79.         XDEF    SpritesOn
  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. STYP_GRAF    = 3    ;Graffiti
  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.         move.w    IRQRASTERY,d1
  546.         lsr.b    #7,d0
  547.         move.b    d0,IRQRASTERY
  548.         cmp.w    IRQRASTERY,d1    ;Neue IRQ-Rasterzeile angegeben?
  549.         beq    4$
  550.         move.w    IRQRASTERY,d1    ;IRQ-Rasterzeile auf aktuelle Zeile gesetzt?
  551.         cmp.w    RASTERY,d1
  552.         bne    4$
  553.         bsr    DoRasterIRQ    ;Ja, Raster-IRQ auslösen
  554. 4$        move.b    CTRL1,d1
  555.  
  556.         btst    #3,d1        ;24/25 Zeilen
  557.         beq    2$
  558.         move.w    #Row25YStart,DYSTART
  559.         move.w    #Row25YStop,DYSTOP
  560.         bra    3$
  561. 2$        move.w    #Row24YStart,DYSTART
  562.         move.w    #Row24YStop,DYSTOP
  563. 3$
  564.         move.w    RASTERY,d0    ;d0: RASTERY
  565.         cmp.w    #$30,d0        ;In Rasterzeile $30 entscheidet das DEN-Bit,
  566.         bne    5$        ; ob Bad Lines erlaubt sind
  567.         btst    #4,d1
  568.         beq    5$
  569.         st.b    BADLINEENABLE
  570. 5$
  571.         tst.b    BADLINEENABLE    ;Bad Lines erlaubt?
  572.         beq    1$
  573.         cmp.w    #FirstDMALine,d0 ;Ja, dann Bad Line Condition prüfen
  574.         blo    1$
  575.         cmp.w    #LastDMALine,d0
  576.         bhi    1$
  577.         and.w    #$07,d0
  578.         cmp.w    YSCROLL,d0
  579.         seq    BADLINE
  580.         bra    SetDispProc    ;Anzeigemodus in Index konvertieren
  581. 1$        clr.b    BADLINE
  582.         bra    SetDispProc    ;Anzeigemodus in Index konvertieren
  583.  
  584. WrRASTER    move.w    IRQRASTERY,d0
  585.         move.b    d1,IRQRASTERY+1
  586.         move.w    IRQRASTERY,d1
  587.         cmp.w    d1,d0        ;Neue IRQ-Rasterzeile angegeben?
  588.         beq    1$
  589.         cmp.w    RASTERY,d1    ;IRQ-Rasterzeile auf aktuelle Zeile gesetzt?
  590.         bne    1$
  591.         bra    DoRasterIRQ    ;Ja, Raster-IRQ auslösen
  592. 1$        rts
  593.  
  594. WrCTRL2        move.b    d1,CTRL2
  595.  
  596.         move.b    d1,d0        ;X-Scroll
  597.         and.w    #7,d0
  598.         move.w    d0,XSCROLL
  599.  
  600.         btst    #3,d1        ;38/40 Zeilen
  601.         seq.b    IS38COL
  602.         ;fällt durch
  603.  
  604. SetDispProc    moveq    #0,d0        ;ECM, BMM und MCM holen
  605.         move.b    CTRL1,d0
  606.         and.b    #$60,d0
  607.         move.b    CTRL2,d1
  608.         and.b    #$10,d1
  609.         or.b    d1,d0
  610.         lsr.b    #4,d0
  611.         move.w    d0,DISPROCIDX    ;Anzeigemodus als Index
  612.         rts
  613.  
  614. WrMYE        move.b    d1,MYE
  615.         not.b    d1
  616.         or.b    d1,SPREXPY
  617.         rts
  618.  
  619. WrVBASE        move.b    d1,VBASE
  620.  
  621.         move.b    d1,d0        ;Videomatrixbasis berechnen
  622.         and.w    #$00f0,d0
  623.         lsl.w    #6,d0
  624.         move.w    d0,MATRIXBASE
  625.  
  626.         move.b    d1,d0        ;Zeichengeneratorbasis berechnen
  627.         and.w    #$000e,d0
  628.         ror.w    #6,d0
  629.         move.w    d0,CHARBASE
  630.  
  631.         move.b    d1,d0        ;Bitmapbasis berechnen
  632.         and.w    #$0008,d0
  633.         ror.w    #6,d0
  634.         move.w    d0,BITMAPBASE
  635.         rts
  636.  
  637. WrIRQFLAG    not.b    d1        ;Gesetztes Bit: Flag löschen
  638.         and.b    IRQFLAG,d1
  639.         and.b    #$0f,d1
  640.  
  641.         move.b    d1,d0        ;Erlaubter IRQ noch gesetzt?
  642.         and.b    IRQMASK,d0
  643.         beq    1$
  644.         or.b    #$80,d1        ;Ja, Master-Bit setzen
  645.         move.b    d1,IRQFLAG
  646.         rts
  647. 1$        clr.b    IntIsVICIRQ    ;Nein, Interrupt zurücknehmen
  648.         move.b    d1,IRQFLAG
  649.         rts
  650.  
  651. WrIRQMASK    and.b    #$0f,d1
  652.         move.b    d1,IRQMASK
  653.  
  654.         and.b    IRQFLAG,d1    ;Gesetzter IRQ jetzt erlaubt?
  655.         beq    1$
  656.         or.b    #$80,IRQFLAG    ;Ja, Master-Bit setzen
  657.         tst.w    IntIsIRQ    ;IRQ schon ausgelöst?
  658.         bne    2$
  659.         move.l    CycleCounter,FirstIRQCycle ;Nein, Zyklus merken
  660. 2$        st.b    IntIsVICIRQ    ; und Interrupt auslösen
  661.         rts
  662. 1$        clr.b    IntIsVICIRQ    ;Nein, Interrupt zurücknehmen
  663.         and.b    #$7f,IRQFLAG    ;Master-Bit löschen
  664.         rts
  665.  
  666. WrMDP        move.b    d1,MDP
  667.         bra    SetSpriteProcs
  668.  
  669. WrMMC        move.b    d1,MMC
  670.         bra    SetSpriteProcs
  671.  
  672. WrMXE        move.b    d1,MXE
  673.  
  674. SetSpriteProcs    moveq    #7,d1
  675.         lea    Sprite7Proc,a1
  676. 1$        moveq    #0,d0
  677.         btst    d1,MXE
  678.         beq    2$
  679.         or.b    #1,d0
  680. 2$        btst    d1,MMC
  681.         beq    3$
  682.         or.b    #2,d0
  683. 3$        btst    d1,MDP
  684.         beq    4$
  685.         or.b    #4,d0
  686. 4$        move.l    (SpriteProcTab,pc,d0.l*4),(a1)
  687.         subq.w    #4,a1
  688.         dbra    d1,1$
  689.         rts
  690.  
  691.         CNOP    0,4
  692. SpriteProcTab    dc.l    DrawSprStd    ;Tabelle der Sprite-Display-Routinen
  693.         dc.l    DrawSprStdExp
  694.         dc.l    DrawSprMulti
  695.         dc.l    DrawSprMultiExp
  696.         dc.l    DrawBackStd
  697.         dc.l    DrawBackStdExp
  698.         dc.l    DrawBackMulti
  699.         dc.l    DrawBackMultiExp
  700.  
  701. WrBorder    move.b    d1,EC
  702.         move.b    d1,d0        ;In ein Langwort konvertieren
  703.         lsl.w    #8,d0
  704.         move.b    d1,d0
  705.         move.w    d0,d1
  706.         swap    d0
  707.         move.w    d1,d0
  708.         move.l    d0,BORDERLONG
  709.         rts
  710.  
  711.  
  712. **
  713. ** Byte vom VIC aus lesen
  714. **
  715.  
  716. ; Normaler Zugriff
  717. ; -> d0.w: Adresse ($0000..$3fff)
  718. ; <- d0.b: Byte
  719. VICRead        MACRO
  720.         bsr    VICReadIt
  721.         ENDM
  722.  
  723. VICReadIt    or.w    CIAVABASE,d0
  724.         move.w    d0,d1
  725.         lsr.w    #8,d1
  726.         move.l    (MemReadTab,d1.w*4),a0
  727.         jmp    (a0)
  728.  
  729. ReadByteRAM    move.b    (RAMPTR,d0.w),d0
  730.     IFNE    DE00_COMPATIBLE
  731.         move.b    d0,LastVICByte
  732.     ENDC
  733.         rts
  734.  
  735. ReadByteChar    and.w    #$0fff,d0
  736.         move.l    TheChar,a0
  737.         move.b    (a0,d0.w),d0
  738.     IFNE    DE00_COMPATIBLE
  739.         move.b    d0,LastVICByte
  740.     ENDC
  741.         rts
  742.  
  743.  
  744. **
  745. ** Hauptschleife für VIC
  746. **
  747.  
  748. *
  749. * Makros
  750. *
  751.  
  752. ; BA low setzen
  753. SetBALow    MACRO
  754.         tst.b    BALow        ;War BA schon low?
  755.         bne    \@1$
  756.         move.l    CycleCounter,FirstBACycle ;Nein, Zyklus merken
  757.         st.b    BALow        ;Und BA low setzen
  758. \@1$
  759.         ENDM
  760.  
  761. ; Bei Bad Line die Anzeige anschalten
  762. ; Muß synchron mit der positiven Flanke von Phi0 aufgerufen werden
  763. DisplayIfBadLine MACRO
  764.         tst.b    BADLINE        ;Bad Line?
  765.         beq    \@1$
  766.         st.b    DISPLAYSTATE    ;Ja, Anzeige ein
  767. \@1$
  768.         ENDM
  769.  
  770. ; Bei Bad Line den Matrixzugriff und die Anzeige anschalten
  771. ; Muß synchron mit der positiven Flanke von Phi0 aufgerufen werden
  772. FetchIfBadLine    MACRO
  773.         tst.b    BADLINE        ;Bad Line?
  774.         beq    \@1$
  775.         st.b    DISPLAYSTATE    ;Ja, Anzeige ein
  776.         SetBALow
  777. \@1$
  778.         ENDM
  779.  
  780. ; Bei Bad Line den Matrixzugriff und die Anzeige anschalten und den RC zurücksetzen
  781. ; Muß synchron mit der positiven Flanke von Phi0 aufgerufen werden
  782. RCIfBadLine    MACRO
  783.         tst.b    BADLINE        ;Bad Line?
  784.         beq    \@1$
  785.         st.b    DISPLAYSTATE    ;Ja, Anzeige ein
  786.         clr.w    RC        ; und RC zurücksetzen
  787.         SetBALow
  788. \@1$
  789.         ENDM
  790.  
  791. ; "Leerer" Zugriff
  792. IdleAccess    MACRO
  793.     IFNE    DE00_COMPATIBLE
  794.         move.w    #$3fff,d0
  795.         VICRead
  796.     ENDC
  797.         ENDM
  798.  
  799. ; Refreshzugriff
  800. RefreshAccess    MACRO
  801.     IFNE    DE00_COMPATIBLE
  802.         move.w    #$3f00,d0
  803.         move.b    REFCNT,d0
  804.         VICRead
  805.         subq.b    #1,REFCNT
  806.     ENDC
  807.         ENDM
  808.  
  809. ; Videomatrixzugriff
  810. ;  INDEX: Index in Matrixzeile
  811. MatrixAccess    MACRO
  812.         tst.b    BALow
  813.         beq    \@1$
  814.  
  815.         move.l    CycleCounter,d1    ;Wenn BA noch keine 3 Takte low ist, $ff lesen
  816.         sub.l    FirstBACycle,d1
  817.         moveq    #3,d2
  818.         cmp.l    d2,d1
  819.         blo    \@2$
  820.  
  821.         move.w    VCCOUNT,d0    ;BA war 3 Takte low, zugreifen
  822.         and.w    #$03ff,d0
  823.         or.w    MATRIXBASE,d0
  824.         or.w    CIAVABASE,d0
  825.         move.w    d0,d1
  826.         move.w    d0,d2
  827.         lsr.w    #8,d1
  828.         move.l    (MemReadTab,d1.w*4),a0
  829.         jsr    (a0)
  830.         move.b    d0,(MatrixLine,INDEX.l*2)
  831.  
  832.         and.w    #$03ff,d2    ;Farb-RAM lesen
  833.         move.l    TheColor,a0
  834.         move.b    (a0,d2.w),(MatrixLine+1,INDEX.l*2)
  835.         bra    \@1$
  836.  
  837. \@2$        move.w    #-1,(MatrixLine,INDEX.l*2) ;BA low, AEC high (Farbnibble stimmt nicht)
  838. \@1$
  839.         ENDM
  840.  
  841. ; Grafikzugriff
  842. ;  INDEX: Index in Matrixzeile
  843. GraphicsAccess    MACRO
  844.         tst.b    DISPLAYSTATE    ;Anzeige ein?
  845.         beq    Fetch3FFF\@
  846.  
  847.         btst    #5,CTRL1    ;Ja, Bitmap-Modus?
  848.         bne    FetchBitmap\@
  849.  
  850.         moveq    #0,d0        ;Nein, Textmodus
  851.         move.b    (MatrixLine,INDEX.l*2),d0
  852.         lsl.w    #3,d0
  853.         or.w    CHARBASE,d0
  854.         bra    FetchDoIt\@
  855.  
  856. FetchBitmap\@    move.w    VCCOUNT,d0    ;Bitmap-Modus
  857.         and.w    #$03ff,d0
  858.         lsl.w    #3,d0
  859.         or.w    BITMAPBASE,d0
  860.         bra    FetchDoIt\@
  861.  
  862. Fetch3FFF\@    move.w    #$3fff,d0    ;Anzeige aus, $3fff darstellen
  863.         or.w    CIAVABASE,d0
  864.  
  865.         btst    #6,CTRL1    ;ECM
  866.         beq    \@1$
  867.         and.w    #$f9ff,d0
  868. \@1$
  869.         move.w    d0,d1
  870.         lsr.w    #8,d1
  871.         move.l    (MemReadTab,d1.w*4),a0
  872.         jsr    (a0)
  873.         clr.w    CHARDATA    ;Zeichen/Farbe löschen
  874.         bra    FetchStore\@
  875.  
  876. FetchDoIt\@    or.w    RC,d0
  877.         or.w    CIAVABASE,d0
  878.  
  879.         btst    #6,CTRL1
  880.         beq    \@1$
  881.         and.w    #$f9ff,d0
  882. \@1$
  883.         move.w    d0,d1
  884.         lsr.w    #8,d1
  885.         move.l    (MemReadTab,d1.w*4),a0
  886.         jsr    (a0)
  887.         addq.w    #1,VCCOUNT
  888.         move.w    (MatrixLine,INDEX.l*2),CHARDATA ;Zeichen/Farbe für Anzeigestufe
  889.         addq.b    #1,INDEX
  890. FetchStore\@    move.b    d0,GFXDATA    ;Grafikbyte für Anzeigestufe merken
  891.         ENDM
  892.  
  893. ; Darstellung des Rahmens (8 Pixel)
  894. ; BUFFER: Zeiger in ChunkyBuf, wird um 8 erhöht
  895. DrawBorder    MACRO
  896.         tst.b    BORDERON
  897.         beq    \@1$
  898.         move.l    BORDERLONG,d0    ;Rahmen an, malen
  899.         move.l    d0,(BUFFER)+
  900.         move.l    d0,(BUFFER)+
  901.         bra    \@2$
  902. \@1$        addq.l    #8,BUFFER
  903. \@2$
  904.         ENDM
  905.  
  906. ; Sprite-DMA einschalten, wenn nötig
  907. CheckSpriteDMA    MACRO
  908.         lea    M7Y,a0        ;a0: Zeiger auf Y-Koordinate
  909.         lea    MC7BASE,a1    ;a1: Zeiger auf Spritedatenzähler-Zwischenspeicher
  910.         moveq    #7,d0        ;d0: Schleifenzähler
  911.         move.w    RASTERY,d1    ;d1: Aktuelle Rasterzeile
  912.         move.b    SPRDMAON,d2    ;d2: Puffer für SPRDMAON
  913.         move.b    SPREN,d3    ;d3: SPREN (VIC-Register)
  914. \@2$        btst    d0,d3        ;SPREN-Bit gesetzt?
  915.         beq    \@1$
  916.         cmp.b    (a0),d1        ;Ja, Y-Koordinate = RASTERY?
  917.         bne    \@1$
  918.         bset    d0,d2        ;Ja, DMA ein
  919.         clr.w    (a1)        ; und Datenzähler löschen
  920.         btst    d0,MYE
  921.         beq    \@1$
  922.         bclr    d0,SPREXPY
  923. \@1$        subq.l    #2,a0
  924.         subq.l    #2,a1
  925.         dbra    d0,\@2$
  926.         move.b    d2,SPRDMAON
  927.         ENDM
  928.  
  929. ; Sprite-Darstellung einschalten, wenn nötig
  930. CheckSpriteDisp    MACRO
  931.         lea    M7Y,a0        ;a0: Zeiger auf Y-Koordinate
  932.         moveq    #7,d0        ;d0: Schleifenzähler
  933.         move.w    RASTERY,d1    ;d1: Aktuelle Rasterzeile
  934.         move.b    SPRDISPON,d2    ;d2: Puffer für SPRDISPON
  935.         move.b    SPRDMAON,d3    ;d3: SPRDMAON
  936. \@2$        btst    d0,d3        ;Sprite-DMA eingeschaltet?
  937.         beq    \@1$
  938.         cmp.b    (a0),d1        ;Ja, Y-Koordinate = RASTERY?
  939.         bne    \@1$
  940.         bset    d0,d2        ;Ja, Darstellung ein
  941. \@1$        subq.l    #2,a0
  942.         subq.l    #2,a1
  943.         dbra    d0,\@2$
  944.         move.b    d2,SPRDISPON
  945.         ENDM
  946.  
  947. ; Zugriff auf Sprite-Datenzeiger
  948. SprPtrAccess    MACRO    ;Spritenummer
  949.         move.w    MATRIXBASE,d0
  950.         or.w    #$03f8+\1,d0
  951.         VICRead
  952.         moveq    #0,d1
  953.         move.b    d0,d1
  954.         lsl.w    #6,d1
  955.         move.w    d1,SPRPTR+(\1*2)
  956.         ENDM
  957.  
  958. ; Zugriff auf Sprite-Daten, Spritezähler erhöhen
  959. SprDataAccess    MACRO    ;Spritenummer, Byte-Nummer (0..2)
  960.         btst    #\1,SPRDMAON
  961.         beq    \@1$
  962.         move.w    MC\1,d0
  963.         and.w    #63,d0
  964.         or.w    SPRPTR+(\1*2),d0
  965.         VICRead
  966.         move.b    d0,SPR\1DATA+\2
  967.         addq.w    #1,MC\1
  968.     IFEQ    \2-1
  969.         bra    \@2$
  970.     ENDC
  971. \@1$
  972.     IFEQ    \2-1            ;Im zweiten Zyklus Idle-Zugriff machen, wenn Sprite-DMA ausgeschaltet
  973.         IdleAccess
  974. \@2$
  975.     ENDC
  976.         ENDM
  977.  
  978. ; Y-Expansions-Flipflop invertieren, wenn Bit in MYE gesetzt
  979. CheckMYE    MACRO    ;Spritenummer
  980.         btst    #\1,MYE
  981.         beq    \@4$
  982.         bchg    #\1,SPREXPY
  983. \@4$
  984.         ENDM
  985.  
  986. ; MCBASE um 2 erhöhen, falls Expansions-Flipflop gesetzt
  987. McbaseInc2    MACRO    ;Spritenummer
  988.         btst    #\1,SPREXPY
  989.         beq    \@1$
  990.         addq.w    #2,MC\1BASE
  991. \@1$
  992.         ENDM
  993.  
  994. ; MCBASE um 1 erhöhen, falls Expansions-Flipflop gesetzt und testen, ob
  995. ;  Sprite-DMA und -Darstellung abgeschaltet werden kann
  996. CheckSprOff    MACRO
  997.         btst    #\1,SPREXPY
  998.         beq    \@2$
  999.         addq.w    #1,MC\1BASE
  1000. \@2$        move.w    MC\1BASE,d0
  1001.         and.w    #63,d0
  1002.         cmp.w    #63,d0
  1003.         bne    \@1$
  1004.         bclr    #\1,SPRDMAON
  1005. \@1$
  1006.         ENDM
  1007.  
  1008. ; Sprite darstellen
  1009. DrawSprite    MACRO    ;Nummer
  1010.         btst    #\1,SPRDISPON    ;Wird das Sprite dargestellt?
  1011.         beq    \@1$
  1012.  
  1013.         move.l    SPR\1DATA,d0    ;d0: Spritedaten
  1014.         move.w    SPRX\1,d1    ;d1: X-Koordinate
  1015.         move.b    M\1C,d2        ;d2: Spritefarbe
  1016.         move.l    Sprite\1Proc,a0
  1017.         jsr    (a0)
  1018.         btst    #\1,SPRDMAON    ;DMA aus?
  1019.         bne    \@1$
  1020.         bclr    #\1,SPRDISPON    ;Ja, dann Sprite abschalten
  1021. \@1$
  1022.         ENDM
  1023.  
  1024.  
  1025. *
  1026. * Hauptschleife
  1027. *
  1028.  
  1029. Main6569    
  1030.  
  1031. ; Zyklus 1: Spritezeiger 3 holen, Rasterzähler erhöhen,
  1032. ;  Raster-IRQ auslösen, auf Bad Line prüfen.
  1033. ;  BA rücksetzen, falls Sprite 3 und 4 aus. Daten von Sprite 3 lesen
  1034. VIC.1        SprPtrAccess 3
  1035.         SprDataAccess 3,0
  1036.  
  1037.         cmp.w    #STYP_8BIT,ScreenType ;Bei 8 Bit wird nur ein Zeilenpuffer verwendet
  1038.         bne    4$
  1039.         lea    ChunkyBuf,BUFFER
  1040.         move.l    a6,-(sp)
  1041.         move.l    _GfxBase,a6
  1042.         move.l    _the_rast_port,a0
  1043.         moveq    #0,d0
  1044.         move.w    RASTERY,d1
  1045.         move.l    #DisplayX,d2
  1046.         move.l    BUFFER,a2
  1047.         lea    _temp_rp,a1
  1048.         JSRLIB    WritePixelLine8
  1049.         move.l    (sp)+,a6
  1050. 4$
  1051.         cmp.w    #TotalLines-1,RASTERY ;War das die letzte Rasterzeile?
  1052.         seq    VBLANKING
  1053.         beq    3$
  1054.  
  1055.         addq.w    #1,RASTERY    ;Nein, Rasterzähler erhöhen
  1056.         move.w    RASTERY,d6
  1057.         cmp.w    IRQRASTERY,d6    ;IRQ-Zeile erreicht?
  1058.         bne    1$
  1059.  
  1060.         bsr    DoRasterIRQ    ;Ja, auslösen
  1061. 1$
  1062.         cmp.w    #$30,d6        ;In Rasterzeile $30 entscheidet das DEN-Bit,
  1063.         bne    2$        ; ob Bad Lines erlaubt sind
  1064.         btst    #4,CTRL1
  1065.         sne    BADLINEENABLE
  1066. 2$
  1067.         clr.b    BADLINE
  1068.         tst.b    BADLINEENABLE    ;DMA erlaubt?
  1069.         beq    3$
  1070.         cmp.w    #FirstDMALine,d6 ;Ja, dann Bad Line Condition prüfen
  1071.         blo    3$
  1072.         cmp.w    #LastDMALine,d6
  1073.         bhi    3$
  1074.         move.w    d6,d0
  1075.         and.w    #$07,d0
  1076.         cmp.w    YSCROLL,d0
  1077.         bne    3$
  1078.         st.b    BADLINE
  1079. 3$
  1080.         DisplayIfBadLine
  1081.         addq.w    #8,RASTERX
  1082.  
  1083.         move.b    SPRDMAON,d0
  1084.         and.b    #$18,d0
  1085.         bne    6$
  1086.         clr.b    BALow
  1087.  
  1088. 6$        bsr    Periodic6526    ;CIA und 6510 ausführen
  1089.  
  1090. ; Zyklus 2: BA für Sprite 5 setzen. Daten von Sprite 3 lesen
  1091. VIC.2        tst.b    VBLANKING    ;VBlank im letzten Zyklus?
  1092.         beq    2$
  1093.         bsr    TheVBlank    ;Ja
  1094.  
  1095. 2$        SprDataAccess 3,1
  1096.         SprDataAccess 3,2
  1097.         DisplayIfBadLine
  1098.         addq.w    #8,RASTERX
  1099.  
  1100.         btst    #5,SPRDMAON
  1101.         beq    1$
  1102.         SetBALow
  1103.  
  1104. 1$        bsr    Periodic6526
  1105.  
  1106. ; Zyklus 3: Spritezeiger 4 holen. BA rücksetzen, falls Sprite 4 und 5 aus.
  1107. ;  Daten von Sprite 4 lesen
  1108. VIC.3        SprPtrAccess 4
  1109.         SprDataAccess 4,0
  1110.         DisplayIfBadLine
  1111.         addq.w    #8,RASTERX
  1112.  
  1113.         move.b    SPRDMAON,d0
  1114.         and.b    #$30,d0
  1115.         bne    1$
  1116.         clr.b    BALow
  1117.  
  1118. 1$        bsr    Periodic6526
  1119.  
  1120. ; Zyklus 4: BA für Sprite 6 setzen. Daten von Sprite 4 lesen
  1121. VIC.4        SprDataAccess 4,1
  1122.         SprDataAccess 4,2
  1123.         DisplayIfBadLine
  1124.         addq.w    #8,RASTERX
  1125.  
  1126.         btst    #6,SPRDMAON
  1127.         beq    1$
  1128.         SetBALow
  1129.  
  1130. 1$        bsr    Periodic6526
  1131.  
  1132. ; Zyklus 5: Spritezeiger 5 holen. BA rücksetzen, falls Sprite 5 und 6 aus.
  1133. ;  Daten von Sprite 5 lesen
  1134. VIC.5        SprPtrAccess 5
  1135.         SprDataAccess 5,0
  1136.         DisplayIfBadLine
  1137.         addq.w    #8,RASTERX
  1138.  
  1139.         move.b    SPRDMAON,d0
  1140.         and.b    #$60,d0
  1141.         bne    1$
  1142.         clr.b    BALow
  1143.  
  1144. 1$        bsr    Periodic6526
  1145.  
  1146. ; Zyklus 6: BA für Sprite 7 setzen. Daten von Sprite 5 lesen
  1147. VIC.6        SprDataAccess 5,1
  1148.         SprDataAccess 5,2
  1149.         DisplayIfBadLine
  1150.         addq.w    #8,RASTERX
  1151.  
  1152.         btst    #7,SPRDMAON
  1153.         beq    1$
  1154.         SetBALow
  1155.  
  1156. 1$        bsr    Periodic6526
  1157.  
  1158. ; Zyklus 7: Spritezeiger 6 holen. BA rücksetzen, falls Sprite 6 und 7 aus.
  1159. ;  Daten von Sprite 6 lesen
  1160. VIC.7        SprPtrAccess 6
  1161.         SprDataAccess 6,0
  1162.         DisplayIfBadLine
  1163.         addq.w    #8,RASTERX
  1164.  
  1165.         move.b    SPRDMAON,d0
  1166.         and.b    #$c0,d0
  1167.         bne    1$
  1168.         clr.b    BALow
  1169.  
  1170. 1$        bsr    Periodic6526
  1171.  
  1172. ; Zyklus 8: Daten von Sprite 6 lesen
  1173. VIC.8        SprDataAccess 6,1
  1174.         SprDataAccess 6,2
  1175.         DisplayIfBadLine
  1176.         addq.w    #8,RASTERX
  1177.  
  1178.         bsr    Periodic6526
  1179.  
  1180. ; Zyklus 9: Spritezeiger 7 holen. BA rücksetzen, falls Sprite 7 aus.
  1181. ;  Daten von Sprite 7 lesen
  1182. VIC.9        SprPtrAccess 7
  1183.         SprDataAccess 7,0
  1184.         DisplayIfBadLine
  1185.         addq.w    #8,RASTERX
  1186.  
  1187.         btst    #7,SPRDMAON
  1188.         bne    1$
  1189.         clr.b    BALow
  1190.  
  1191. 1$        bsr    Periodic6526
  1192.  
  1193. ; Zyklus 10: Daten von Sprite 7 lesen
  1194. VIC.10        SprDataAccess 7,1
  1195.         SprDataAccess 7,2
  1196.         DisplayIfBadLine
  1197.         addq.w    #8,RASTERX
  1198.  
  1199.         bsr    Periodic6526
  1200.  
  1201. ; Zyklus 11: Refresh, BA rücksetzen
  1202. VIC.11        RefreshAccess
  1203.         DisplayIfBadLine
  1204.         addq.w    #8,RASTERX
  1205.  
  1206.         clr.b    BALow
  1207.  
  1208.         bsr    Periodic6526
  1209.  
  1210. ; Zyklus 12: Refresh. Bei Bad Line den Matrixzugriff anschalten.
  1211. ;  Ab hier beginnt die Grafikdarstellung
  1212. VIC.12        bsr    DrawBackground
  1213.         DrawBorder
  1214.         RefreshAccess
  1215.         FetchIfBadLine
  1216.         addq.w    #8,RASTERX
  1217.  
  1218.         bsr    Periodic6526
  1219.  
  1220. ; Zyklus 13: Refresh. Bei Bad Line den Matrixzugriff anschalten.
  1221. ;  RASTERX zurücksetzen
  1222. VIC.13        bsr    DrawBackground
  1223.         DrawBorder
  1224.         RefreshAccess
  1225.         FetchIfBadLine
  1226.         move.w    #4,RASTERX
  1227.  
  1228.         bsr    Periodic6526
  1229.  
  1230. ; Zyklus 14: Refresh. VCBASE->VCCOUNT. Bei Bad Line den Matrixzugriff
  1231. ;  anschalten und den RC zurücksetzen
  1232. VIC.14        bsr    DrawBackground
  1233.         DrawBorder
  1234.         RefreshAccess
  1235.         RCIfBadLine
  1236.         addq.w    #8,RASTERX
  1237.  
  1238.         move.w    VCBASE,VCCOUNT
  1239.  
  1240.         bsr    Periodic6526
  1241.  
  1242. ; Zyklus 15: Refresh und Matrixzugriff. MCBASE um 2 erhöhen
  1243. VIC.15        bsr    DrawBackground
  1244.         DrawBorder
  1245.         RefreshAccess
  1246.         FetchIfBadLine
  1247.         addq.w    #8,RASTERX
  1248.  
  1249.         McbaseInc2 0
  1250.         McbaseInc2 1
  1251.         McbaseInc2 2
  1252.         McbaseInc2 3
  1253.         McbaseInc2 4
  1254.         McbaseInc2 5
  1255.         McbaseInc2 6
  1256.         McbaseInc2 7
  1257.  
  1258.         moveq    #0,INDEX    ;Index in Matrixzeile
  1259.         MatrixAccess
  1260.  
  1261.         bsr    Periodic6526
  1262.  
  1263. ; Zyklus 16: Grafikzugriff und Matrixzugriff. MCBASE um 1 erhöhen und testen,
  1264. ;  ob Sprite-DMA abgeschaltet werden kann
  1265. VIC.16        bsr    DrawBackground
  1266.         DrawBorder
  1267.         GraphicsAccess
  1268.         FetchIfBadLine        ;Muß nach GraphicsAccess stehen,
  1269.                     ; damit bei einem STA $D011 im
  1270.                     ; Zyklus zuvor noch kein Grafikzugriff
  1271.                     ; gemacht wird
  1272.         addq.w    #8,RASTERX
  1273.  
  1274.         CheckSprOff 0
  1275.         CheckSprOff 1
  1276.         CheckSprOff 2
  1277.         CheckSprOff 3
  1278.         CheckSprOff 4
  1279.         CheckSprOff 5
  1280.         CheckSprOff 6
  1281.         CheckSprOff 7
  1282.  
  1283.         MatrixAccess
  1284.  
  1285.         bsr    Periodic6526
  1286.  
  1287. ; Zyklus 17: Grafikzugriff und Matrixzugriff, im 40-Spalten-Modus
  1288. ;  Rahmen abschalten. Ab hier beginnt die Darstellung des Textfensters
  1289. VIC.17        tst.b    IS38COL
  1290.         bne    1$
  1291.  
  1292.         move.w    RASTERY,d6
  1293.         cmp.w    DYSTOP,d6
  1294.         bne    2$
  1295.         st.b    UDBORDERON
  1296.         bra    1$
  1297.  
  1298. 2$        btst    #4,CTRL1
  1299.         beq    3$
  1300.         cmp.w    DYSTART,d6
  1301.         bne    3$
  1302.         clr.b    UDBORDERON
  1303.         bra    4$
  1304.  
  1305. 3$        tst.b    UDBORDERON
  1306.         bne    1$
  1307. 4$        clr.b    BORDERON
  1308. 1$
  1309.         bsr    DrawBackground    ;Verhindert Grafikmüll, falls XSCROLL>0
  1310.         bsr    DrawGraphics
  1311.         DrawBorder
  1312.         GraphicsAccess
  1313.         FetchIfBadLine
  1314.         addq.w    #8,RASTERX
  1315.         MatrixAccess
  1316.  
  1317.         bsr    Periodic6526
  1318.  
  1319. ; Zyklus 18..54: Grafikzugriff und Matrixzugriff, im 38-Spalten-Modus
  1320. ;  Rahmen abschalten
  1321. VIC.18        tst.b    IS38COL
  1322.         beq    1$
  1323.  
  1324.         move.w    RASTERY,d6
  1325.         cmp.w    DYSTOP,d6
  1326.         bne    2$
  1327.         st.b    UDBORDERON
  1328.         bra    1$
  1329.  
  1330. 2$        btst    #4,CTRL1
  1331.         beq    3$
  1332.         cmp.w    DYSTART,d6
  1333.         bne    3$
  1334.         clr.b    UDBORDERON
  1335.         bra    4$
  1336.  
  1337. 3$        tst.b    UDBORDERON
  1338.         bne    1$
  1339. 4$        clr.b    BORDERON
  1340. 1$
  1341.         moveq    #54-18,d6
  1342. VIC.Loop    bsr    DrawGraphics
  1343.         DrawBorder
  1344.         GraphicsAccess
  1345.         FetchIfBadLine
  1346.         addq.w    #8,RASTERX
  1347.         MatrixAccess
  1348.         move.b    CHARDATA,LASTCHARDATA    ;Letztes Zeichen merken
  1349.  
  1350.         bsr    Periodic6526
  1351.         dbra    d6,VIC.Loop
  1352.  
  1353. ; Zyklus 55: Letzter Grafikzugriff, Matrixzugriff abschalten.
  1354. ;   Sprite-DMA anschalten, wenn Y-Koordinate richtig und SPEN-Bit gesetzt
  1355. ;   (für alle Sprites). Sprite-Y-Expansion handhaben. BA für Sprite 0 setzen
  1356. VIC.55        bsr    DrawGraphics
  1357.         DrawBorder
  1358.         GraphicsAccess
  1359.         DisplayIfBadLine
  1360.         addq.w    #8,RASTERX
  1361.  
  1362.         CheckMYE 0
  1363.         CheckMYE 1
  1364.         CheckMYE 2
  1365.         CheckMYE 3
  1366.         CheckMYE 4
  1367.         CheckMYE 5
  1368.         CheckMYE 6
  1369.         CheckMYE 7
  1370.  
  1371.         CheckSpriteDMA
  1372.  
  1373.         btst    #0,SPRDMAON    ;Sprite 0 an?
  1374.         bne    3$
  1375.         clr.b    BALow        ;Nein, BA high
  1376.         bra    4$
  1377. 3$        SetBALow        ;Sonst BA low
  1378.  
  1379. 4$        bsr    Periodic6526
  1380.  
  1381. ; Zyklus 56: Im 38-Spalten-Modus Rahmen anschalten. Sprite-DMA anschalten,
  1382. ;   wenn Y-Koordinate richtig und SPEN-Bit gesetzt (für alle Sprites).
  1383. ;   BA für Sprite 0 setzen. Nach diesem Zyklus endet die Darstellung des
  1384. ;   Textfensters
  1385. VIC.56        tst.b    IS38COL
  1386.         beq    1$
  1387.         st.b    BORDERON
  1388. 1$
  1389.         bsr    DrawGraphics
  1390.         DrawBorder
  1391.         IdleAccess
  1392.         DisplayIfBadLine
  1393.         addq.w    #8,RASTERX
  1394.         CheckSpriteDMA
  1395.  
  1396.         bsr    Periodic6526
  1397.  
  1398. ; Zyklus 57: Im 40-Spalten-Modus Rahmen anschalten, BA für Sprite 1 setzen,
  1399. ;  Sprites malen
  1400. VIC.57        tst.b    IS38COL
  1401.         bne    1$
  1402.         st.b    BORDERON
  1403. 1$
  1404.         tst.b    SPRDISPON    ;Ist überhaupt ein Sprite z.Z. sichtbar?
  1405.         beq    3$
  1406.         tst.w    SpritesOn
  1407.         beq    3$
  1408.         DrawSprite 7
  1409.         DrawSprite 6
  1410.         DrawSprite 5
  1411.         DrawSprite 4
  1412.         DrawSprite 3
  1413.         DrawSprite 2
  1414.         DrawSprite 1
  1415.         DrawSprite 0
  1416. 3$
  1417.         bsr    DrawBackground
  1418.         DrawBorder
  1419.         IdleAccess
  1420.         DisplayIfBadLine
  1421.         addq.w    #8,RASTERX
  1422.  
  1423.         btst    #1,SPRDMAON
  1424.         beq    2$
  1425.         SetBALow
  1426.  
  1427. 2$        bsr    Periodic6526
  1428.  
  1429. ; Zyklus 58: Spritezeiger 0 holen. Prüfen, ob RC=7. Wenn ja, Display
  1430. ;  ausschalten und VCCOUNT->VCBASE machen. Wenn das Display an ist, den
  1431. ;  RC erhöhen (bei einer Bad Line ist das Display immer an). Daten von
  1432. ;  Sprite 0 lesen. MCBASE->MC machen
  1433. VIC.58        bsr    DrawBackground
  1434.         DrawBorder
  1435.  
  1436.         move.w    MC0BASE,MC0
  1437.         move.w    MC1BASE,MC1
  1438.         move.w    MC2BASE,MC2
  1439.         move.w    MC3BASE,MC3
  1440.         move.w    MC4BASE,MC4
  1441.         move.w    MC5BASE,MC5
  1442.         move.w    MC6BASE,MC6
  1443.         move.w    MC7BASE,MC7
  1444.  
  1445.         CheckSpriteDisp
  1446.  
  1447.         SprPtrAccess 0
  1448.         SprDataAccess 0,0
  1449.  
  1450.         cmp.w    #7,RC
  1451.         bne    1$
  1452.         move.w    VCCOUNT,VCBASE
  1453.         clr.b    DISPLAYSTATE
  1454.  
  1455. 1$        tst.b    BADLINE
  1456.         bne    2$
  1457.         tst.b    DISPLAYSTATE
  1458.         beq    3$
  1459.  
  1460. 2$        st.b    DISPLAYSTATE    ;Dies erübrigt DisplayIfBadLine
  1461.         addq.w    #1,RC
  1462.         and.w    #7,RC
  1463.  
  1464. 3$        addq.w    #8,RASTERX
  1465.  
  1466.         bsr    Periodic6526
  1467.  
  1468. ; Zyklus 59: BA für Sprite 2 setzen. Daten von Sprite 0 lesen
  1469. VIC.59        bsr    DrawBackground
  1470.         DrawBorder
  1471.         SprDataAccess 0,1
  1472.         SprDataAccess 0,2
  1473.         DisplayIfBadLine
  1474.         addq.w    #8,RASTERX
  1475.  
  1476.         btst    #2,SPRDMAON
  1477.         beq    1$
  1478.         SetBALow
  1479.  
  1480. 1$        bsr    Periodic6526
  1481.  
  1482. ; Zyklus 60: Spritezeiger 1 holen. Nach diesem Zyklus endet
  1483. ;  die Grafikdarstellung. BA rücksetzen, falls Sprite 1 und 2 aus.
  1484. ;  Daten von Sprite 1 lesen
  1485. VIC.60        bsr    DrawBackground
  1486.         DrawBorder
  1487.         SprPtrAccess 1
  1488.         SprDataAccess 1,0
  1489.         DisplayIfBadLine
  1490.         addq.w    #8,RASTERX
  1491.  
  1492.         move.b    SPRDMAON,d0
  1493.         and.b    #$06,d0
  1494.         bne    1$
  1495.         clr.b    BALow
  1496.  
  1497. 1$        bsr    Periodic6526
  1498.  
  1499. ; Zyklus 61: BA für Sprite 3 setzen. Daten von Sprite 1 lesen
  1500. VIC.61        SprDataAccess 1,1
  1501.         SprDataAccess 1,2
  1502.         DisplayIfBadLine
  1503.         addq.w    #8,RASTERX
  1504.  
  1505.         btst    #3,SPRDMAON
  1506.         beq    1$
  1507.         SetBALow
  1508.  
  1509. 1$        bsr    Periodic6526
  1510.  
  1511. ; Zyklus 62: Spritezeiger 2 holen. BA rücksetzen, falls Sprite 2 und 3 aus.
  1512. ;  Daten von Sprite 2 lesen
  1513. VIC.62        SprPtrAccess 2
  1514.         SprDataAccess 2,0
  1515.         DisplayIfBadLine
  1516.         addq.w    #8,RASTERX
  1517.  
  1518.         move.b    SPRDMAON,d0
  1519.         and.b    #$0c,d0
  1520.         bne    1$
  1521.         clr.b    BALow
  1522.  
  1523. 1$        bsr    Periodic6526
  1524.  
  1525. ; Zyklus 63: BA für Sprite 4 setzen. Daten von Sprite 2 lesen
  1526. VIC.63        SprDataAccess 2,1
  1527.         SprDataAccess 2,2
  1528.         DisplayIfBadLine
  1529.         addq.w    #8,RASTERX
  1530.  
  1531.         move.w    RASTERY,d6
  1532.         cmp.w    DYSTOP,d6
  1533.         bne    2$
  1534.         st.b    UDBORDERON
  1535.         bra    3$
  1536. 2$        btst    #4,CTRL1
  1537.         beq    3$
  1538.         cmp.w    DYSTART,d6
  1539.         bne    3$
  1540.         clr.b    UDBORDERON
  1541. 3$
  1542.         btst    #4,SPRDMAON
  1543.         beq    1$
  1544.         SetBALow
  1545.  
  1546. 1$        bsr    Periodic6526
  1547.         bra    Main6569
  1548.  
  1549.  
  1550. *
  1551. * Darstellung der Grafik (8 Pixel)
  1552. * BUFFER: Zeiger in ChunkyBuf, darf nicht verändert werden
  1553. *
  1554.  
  1555. DrawGraphics    move.l    BUFFER,a0
  1556.         move.b    GFXDATA,d0
  1557.         add.w    XSCROLL,a0
  1558.  
  1559.         tst.b    UDBORDERON
  1560.         bne    DrNothing
  1561.  
  1562.         move.w    DISPROCIDX,d1
  1563.         move.l    (GfxJmpTab,d1.w*4),a1
  1564.         jmp    (a1)
  1565.  
  1566.         CNOP    0,4
  1567. GfxJmpTab    dc.l    DrText
  1568.         dc.l    DrTextMulti
  1569.         dc.l    DrBitMap
  1570.         dc.l    DrBitMapMulti
  1571.         dc.l    DrTextECM
  1572.         dc.l    DrInvalid
  1573.         dc.l    DrInvalid
  1574.         dc.l    DrInvalid
  1575.  
  1576. DrTextECM    moveq    #0,d2
  1577.         move.b    CHARDATA,d2
  1578.         lsr.b    #6,d2
  1579.         move.b    (B0C,d2.l),d2    ;Hintergrund
  1580.         move.b    COLDATA,d3    ;Vordergrund
  1581.         bra    DrawStd
  1582.  
  1583. DrBitMap    move.b    CHARDATA,d2    ;Hintergrund
  1584.         move.b    d2,d3
  1585.         lsr.b    #4,d3        ;Vordergrund
  1586.         bra    DrawStd
  1587.  
  1588. DrText        move.b    B0C,d2        ;Hintergrund
  1589.         move.b    COLDATA,d3    ;Vordergrund
  1590.  
  1591. DrawStd        add.b    d0,d0        ;Standard-Daten anzeigen
  1592.         bcc    11$
  1593.         move.b    d3,(a0)+
  1594.         bra    12$
  1595. 11$        move.b    d2,(a0)+
  1596. 12$
  1597.         add.b    d0,d0
  1598.         bcc    21$
  1599.         move.b    d3,(a0)+
  1600.         bra    22$
  1601. 21$        move.b    d2,(a0)+
  1602. 22$
  1603.         add.b    d0,d0
  1604.         bcc    31$
  1605.         move.b    d3,(a0)+
  1606.         bra    32$
  1607. 31$        move.b    d2,(a0)+
  1608. 32$
  1609.         add.b    d0,d0
  1610.         bcc    41$
  1611.         move.b    d3,(a0)+
  1612.         bra    42$
  1613. 41$        move.b    d2,(a0)+
  1614. 42$
  1615.         add.b    d0,d0
  1616.         bcc    51$
  1617.         move.b    d3,(a0)+
  1618.         bra    52$
  1619. 51$        move.b    d2,(a0)+
  1620. 52$
  1621.         add.b    d0,d0
  1622.         bcc    61$
  1623.         move.b    d3,(a0)+
  1624.         bra    62$
  1625. 61$        move.b    d2,(a0)+
  1626. 62$
  1627.         add.b    d0,d0
  1628.         bcc    71$
  1629.         move.b    d3,(a0)+
  1630.         bra    72$
  1631. 71$        move.b    d2,(a0)+
  1632. 72$
  1633.         add.b    d0,d0
  1634.         bcc    81$
  1635.         move.b    d3,(a0)+
  1636.         bra    82$
  1637. 81$        move.b    d2,(a0)+
  1638. 82$        rts
  1639.  
  1640. DrBitMapMulti    move.b    CHARDATA,d2
  1641.         move.b    d2,d3        ;10
  1642.         lsr.b    #4,d2        ;01
  1643.         move.b    COLDATA,d4    ;11
  1644.         bra    DrawMulti
  1645.  
  1646. DrTextMulti    move.b    COLDATA,d4    ;11
  1647.         bclr    #3,d4        ;Bit 3 gelöscht -> Standard-Text
  1648.         beq    DrText
  1649.         move.b    B1C,d2        ;01
  1650.         move.b    B2C,d3        ;10
  1651.  
  1652. DrawMulti    move.b    B0C,d1
  1653.         add.b    d0,d0        ;Multicolor-Daten anzeigen
  1654.         bcc    11$
  1655.         add.b    d0,d0
  1656.         bcc    12$
  1657.         move.b    d4,(a0)+    ;11
  1658.         move.b    d4,(a0)+
  1659.         bra    14$
  1660. 12$        move.b    d3,(a0)+    ;10
  1661.         move.b    d3,(a0)+
  1662.         bra    14$
  1663. 11$        add.b    d0,d0
  1664.         bcc    13$
  1665.         move.b    d2,(a0)+    ;01
  1666.         move.b    d2,(a0)+
  1667.         bra    14$
  1668. 13$        move.b    d1,(a0)+    ;00
  1669.         move.b    d1,(a0)+
  1670. 14$
  1671.         add.b    d0,d0
  1672.         bcc    21$
  1673.         add.b    d0,d0
  1674.         bcc    22$
  1675.         move.b    d4,(a0)+    ;11
  1676.         move.b    d4,(a0)+
  1677.         bra    24$
  1678. 22$        move.b    d3,(a0)+    ;10
  1679.         move.b    d3,(a0)+
  1680.         bra    24$
  1681. 21$        add.b    d0,d0
  1682.         bcc    23$
  1683.         move.b    d2,(a0)+    ;01
  1684.         move.b    d2,(a0)+
  1685.         bra    24$
  1686. 23$        move.b    d1,(a0)+    ;00
  1687.         move.b    d1,(a0)+
  1688. 24$
  1689.         add.b    d0,d0
  1690.         bcc    31$
  1691.         add.b    d0,d0
  1692.         bcc    32$
  1693.         move.b    d4,(a0)+    ;11
  1694.         move.b    d4,(a0)+
  1695.         bra    34$
  1696. 32$        move.b    d3,(a0)+    ;10
  1697.         move.b    d3,(a0)+
  1698.         bra    34$
  1699. 31$        add.b    d0,d0
  1700.         bcc    33$
  1701.         move.b    d2,(a0)+    ;01
  1702.         move.b    d2,(a0)+
  1703.         bra    34$
  1704. 33$        move.b    d1,(a0)+    ;00
  1705.         move.b    d1,(a0)+
  1706. 34$
  1707.         add.b    d0,d0
  1708.         bcc    41$
  1709.         add.b    d0,d0
  1710.         bcc    42$
  1711.         move.b    d4,(a0)+    ;11
  1712.         move.b    d4,(a0)+
  1713.         bra    44$
  1714. 42$        move.b    d3,(a0)+    ;10
  1715.         move.b    d3,(a0)+
  1716.         bra    44$
  1717. 41$        add.b    d0,d0
  1718.         bcc    43$
  1719.         move.b    d2,(a0)+    ;01
  1720.         move.b    d2,(a0)+
  1721.         bra    44$
  1722. 43$        move.b    d1,(a0)+    ;00
  1723.         move.b    d1,(a0)+
  1724. 44$        rts
  1725.  
  1726. DrInvalid    clr.l    (a0)+
  1727.         clr.l    (a0)
  1728.         rts
  1729.  
  1730.  
  1731. *
  1732. * Darstellung der Hintergrundfarbe (8 Pixel)
  1733. * BUFFER: Zeiger in ChunkyBuf, darf nicht verändert werden
  1734. *
  1735.  
  1736. DrawBackground    move.l    BUFFER,a0
  1737. DrNothing    move.b    B0C,d0
  1738.  
  1739.         move.w    DISPROCIDX,d1
  1740.         move.l    (BackJmpTab,d1.w*4),a1
  1741.         jmp    (a1)
  1742.  
  1743. BackJmpTab    dc.l    BackDoIt
  1744.         dc.l    BackDoIt
  1745.         dc.l    BackBitMap
  1746.         dc.l    BackDoIt
  1747.         dc.l    BackECM
  1748.         dc.l    BackBlack
  1749.         dc.l    BackBlack
  1750.         dc.l    BackBlack
  1751.  
  1752. BackECM        moveq    #0,d0
  1753.         move.b    LASTCHARDATA,d0    ;Letztes Zeichen
  1754.         lsr.b    #6,d0
  1755.         move.b    (B0C,d0.l),d0
  1756.         bra    BackDoIt
  1757.  
  1758. BackBlack    moveq    #0,d0
  1759.         bra    BackDoIt
  1760.  
  1761. BackBitMap    move.b    LASTCHARDATA,d0    ;Letztes Zeichen
  1762.  
  1763. BackDoIt    move.b    d0,(a0)+
  1764.         move.b    d0,(a0)+
  1765.         move.b    d0,(a0)+
  1766.         move.b    d0,(a0)+
  1767.         move.b    d0,(a0)+
  1768.         move.b    d0,(a0)+
  1769.         move.b    d0,(a0)+
  1770.         move.b    d0,(a0)
  1771.         rts
  1772.  
  1773.  
  1774. *
  1775. * VBlank
  1776. *
  1777.  
  1778. ; Zähler zurücksetzen
  1779. TheVBlank    moveq    #0,d6        ;Rasterzähler auf Null
  1780.         clr.w    RASTERY
  1781.         clr.w    VCBASE
  1782.         lea    ChunkyBuf,BUFFER
  1783.         st.b    REFCNT        ;Refreshzähler zurücksetzen
  1784.         clr.b    LPTRIGGERED    ;Lightpen wieder freigeben
  1785.  
  1786.         bsr    CountTODs    ;TODs zählen
  1787.  
  1788.         subq.w    #1,SkipCounter    ;Bild überspringen?
  1789.         bne    1$
  1790.         move.w    SkipLatch,SkipCounter
  1791.  
  1792. ; Grafik darstellen
  1793.         jsr    _RedrawDisplay
  1794.  
  1795. 1$        tst.w    IRQRASTERY    ;IRQ in Zeile 0?
  1796.         bne    10$
  1797.         bra    DoRasterIRQ    ;Ja, IRQ auslösen
  1798. 10$        rts
  1799.  
  1800.  
  1801. *
  1802. * Raster-IRQ auslösen
  1803. *
  1804.  
  1805. DoRasterIRQ    or.b    #$01,IRQFLAG    ;Ja, IRST-Bit setzen
  1806.         btst    #0,IRQMASK    ;Raster-IRQ erlaubt?
  1807.         beq    2$
  1808.         or.b    #$80,IRQFLAG    ;Ja, IRQ-Bit setzen
  1809.         tst.w    IntIsIRQ    ;IRQ schon ausgelöst?
  1810.         bne    1$
  1811.         move.l    CycleCounter,FirstIRQCycle ;Nein, Zyklus merken
  1812. 1$        st.b    IntIsVICIRQ    ; und Interrupt auslösen
  1813. 2$        rts
  1814.  
  1815.  
  1816. *
  1817. * Ein Sprite zeichnen
  1818. * d0.l: Spritedaten
  1819. * d1.w: X-Koordinate
  1820. * d2.b: Spritefarbe
  1821. *
  1822.  
  1823.         CNOP    0,4
  1824. ; Standard-Sprite: 3 Byte mit je 8 Pixeln konvertieren
  1825. DrawSprStd
  1826. DrawBackStd    cmp.w    #DisplayX-24,d1    ;Sprite horizontal sichtbar?
  1827.         bhs    DSSRts
  1828.  
  1829.         lea    ChunkyBuf+16,a0
  1830.         add.w    d1,a0
  1831.  
  1832.         moveq    #0,d1        ;Pixelzähler
  1833. DSSLoop        add.l    d0,d0        ;Pixel gesetzt?
  1834.         bcc    DSSNext
  1835.         move.b    d2,(a0)
  1836.  
  1837. DSSNext        addq.l    #1,a0
  1838.         addq.w    #1,d1
  1839.         cmp.w    #24,d1
  1840.         bne    DSSLoop
  1841. DSSRts        rts
  1842.  
  1843.         CNOP    0,4
  1844. ; X-expandiertes Standard-Sprite: 3 Byte mit je 8 Pixeln konvertieren
  1845. DrawSprStdExp
  1846. DrawBackStdExp    cmp.w    #DisplayX-48,d1
  1847.         bhs    DSSERts
  1848.  
  1849.         lea    ChunkyBuf+16,a0
  1850.         add.w    d1,a0
  1851.  
  1852.         moveq    #0,d1        ;Pixelzähler
  1853. DSSELoop    add.l    d0,d0        ;Pixel gesetzt?
  1854.         bcc    DSSENext
  1855.         move.b    d2,(a0)
  1856.         move.b    d2,1(a0)
  1857.  
  1858. DSSENext    addq.l    #2,a0
  1859.         addq.w    #2,d1
  1860.         cmp.w    #48,d1
  1861.         bne    DSSELoop
  1862. DSSERts        rts
  1863.  
  1864.         CNOP    0,4
  1865. ; Multicolor-Sprite: 3 Byte mit je 4 Pixeln konvertieren
  1866. DrawSprMulti
  1867. DrawBackMulti    cmp.w    #DisplayX-24,d1
  1868.         bhs    DSMRts
  1869.  
  1870.         lea    ChunkyBuf+16,a0
  1871.         add.w    d1,a0
  1872.  
  1873.         moveq    #0,d1        ;Pixelzähler
  1874. DSMLoop        add.l    d0,d0
  1875.         bcc    DSMFirstIs0
  1876.         add.l    d0,d0
  1877.         bcc    DSMDraw10
  1878.         move.b    MM1,(a0)    ;11
  1879.         move.b    MM1,1(a0)
  1880.         bra    DSMNext
  1881. DSMDraw10    move.b    d2,(a0)        ;10
  1882.         move.b    d2,1(a0)
  1883.         bra    DSMNext
  1884. DSMFirstIs0    add.l    d0,d0
  1885.         bcc    DSMNext
  1886.         move.b    MM0,(a0)    ;01
  1887.         move.b    MM0,1(a0)
  1888.  
  1889. DSMNext        addq.l    #2,a0
  1890.         addq.w    #2,d1
  1891.         cmp.w    #24,d1
  1892.         bne    DSMLoop
  1893. DSMRts        rts
  1894.  
  1895.         CNOP    0,4
  1896. ; X-expandiertes Multicolor-Sprite: 3 Byte mit je 4 Pixeln konvertieren
  1897. DrawSprMultiExp
  1898. DrawBackMultiExp cmp.w    #DisplayX-48,d1
  1899.         bhs    DSMERts
  1900.  
  1901.         lea    ChunkyBuf+16,a0
  1902.         add.w    d1,a0
  1903.  
  1904.         moveq    #0,d1        ;Pixelzähler
  1905. DSMELoop    add.l    d0,d0
  1906.         bcc    DSMEFirstIs0
  1907.         add.l    d0,d0
  1908.         bcc    DSMEDraw10
  1909.         move.b    MM1,(a0)    ;11
  1910.         move.b    MM1,1(a0)
  1911.         move.b    MM1,2(a0)
  1912.         move.b    MM1,3(a0)
  1913.         bra    DSMENext
  1914. DSMEDraw10    move.b    d2,(a0)        ;10
  1915.         move.b    d2,1(a0)
  1916.         move.b    d2,2(a0)
  1917.         move.b    d2,3(a0)
  1918.         bra    DSMENext
  1919. DSMEFirstIs0    add.l    d0,d0
  1920.         bcc    DSMENext
  1921.         move.b    MM0,(a0)    ;01
  1922.         move.b    MM0,1(a0)
  1923.         move.b    MM0,2(a0)
  1924.         move.b    MM0,3(a0)
  1925.  
  1926. DSMENext    addq.l    #4,a0
  1927.         addq.w    #4,d1
  1928.         cmp.w    #48,d1
  1929.         bne    DSMELoop
  1930. DSMERts        rts
  1931.  
  1932.  
  1933. **
  1934. ** Chunky->ModeX-Konvertiertung für Graffiti
  1935. **
  1936.  
  1937.         XDEF    _graffiti_conv
  1938. _graffiti_conv    link    a5,#0
  1939.         movem.l    d2-d4/d6-d7/a2-a4,-(sp)
  1940.         move.l    8(a5),a0    ;a0..a3: Zeiger auf Bitplanes
  1941.         move.l    12(a5),a1
  1942.         move.l    16(a5),a2
  1943.         move.l    20(a5),a3
  1944.         lea    ChunkyBuf+(DisplayY-255)/2*DisplayX+40,a4 ;a4: Zeiger auf ChunkyBuf
  1945.  
  1946.         move.w    #255-1,d7    ;Y-Schleife
  1947. 2$        move.w    #320/16-1,d6    ;X-Schleife
  1948. 1$        movem.l    (a4)+,d0-d3
  1949.         ror.l    #8,d1
  1950.         swap    d2
  1951.         move.l    d0,d4
  1952.         swap    d3
  1953.         move.w    d1,d4
  1954.         move.b    d2,d4
  1955.         rol.l    #8,d4
  1956.         move.b    d3,d4
  1957.         move.l    d4,(a1)+
  1958.         ror.l    #8,d3
  1959.         move.b    d3,d2
  1960.         swap    d0
  1961.         swap    d1
  1962.         move.b    d1,d0
  1963.         swap    d0
  1964.         move.l    d0,d4
  1965.         move.w    d2,d4
  1966.         move.l    d4,(a0)+
  1967.         move.w    d3,d2
  1968.         swap    d1
  1969.         move.w    d0,d3
  1970.         move.b    d1,d3
  1971.         swap    d2
  1972.         swap    d1
  1973.         swap    d3
  1974.         move.b    d2,d1
  1975.         move.b    d3,d2
  1976.         move.w    d2,d3
  1977.         move.l    d3,(a2)+
  1978.         move.w    d1,d2
  1979.         swap    d2
  1980.         move.b    d0,d2
  1981.         ror.l    #8,d2
  1982.         move.l    d2,(a3)+
  1983.         dbra    d6,1$
  1984.         lea    DisplayX-320(a4),a4
  1985.         dbra    d7,2$
  1986.  
  1987.         movem.l    (sp)+,d2-d4/d6-d7/a2-a4
  1988.         unlk    a5
  1989.         rts
  1990.  
  1991.  
  1992. **
  1993. ** Datenbereich
  1994. **
  1995.  
  1996. ; Grafikpuffer
  1997.         SECTION    "BSS",BSS
  1998.         XDEF    _ChunkyBuf
  1999. _ChunkyBuf
  2000. ChunkyBuf    ds.b    DisplayX*DisplayY
  2001.  
  2002.  
  2003.         SECTION    "__MERGED",BSS
  2004.  
  2005. DisplayID    ds.l    1    ;Prefs: DisplayID des Screens
  2006. ScreenType    ds.w    1    ;Prefs: Typ der Screen-Ansteuerung
  2007. NormalCycles    ds.w    1    ;Unbenutzt
  2008. BadLineCycles    ds.w    1    ;Unbenutzt
  2009. SpritesOn    ds.w    1    ;Prefs: Sprite-Darstelung angeschaltet
  2010. Collisions    ds.w    1    ;Prefs: Sprite-Kollisionen angeschaltet
  2011. Overscan    ds.w    1    ;Prefs: Overscan-Typ für Amiga-Modi
  2012. DirectVideo    ds.w    1    ;Unbenutzt
  2013.  
  2014. SkipCounter    ds.w    1
  2015.         XDEF    _SkipLatch
  2016. _SkipLatch
  2017. SkipLatch    ds.w    1    ;Prefs: Nur jedes nte Bild darstellen
  2018.         XDEF    _LimitSpeed
  2019. _LimitSpeed
  2020. LimitSpeed    ds.w    1    ;Prefs: Speed Limiter
  2021.  
  2022. ; VIC-Register
  2023. VICREGS
  2024.         ds.b    1    ;Sprite-Positionen, X-Werte unbenutzt,
  2025. M0Y        ds.b    1    ; stattdessen SPRX*
  2026.         ds.b    1
  2027. M1Y        ds.b    1
  2028.         ds.b    1
  2029. M2Y        ds.b    1
  2030.         ds.b    1
  2031. M3Y        ds.b    1
  2032.         ds.b    1
  2033. M4Y        ds.b    1
  2034.         ds.b    1
  2035. M5Y        ds.b    1
  2036.         ds.b    1
  2037. M6Y        ds.b    1
  2038.         ds.b    1
  2039. M7Y        ds.b    1
  2040. MX8        ds.b    1    ;MSBs der X-Positionen
  2041. CTRL1        ds.b    1    ;Steuerreg. 1
  2042.         ds.b    1    ;Rasterzeile, ersetzt durch 16-Bit RASTERY
  2043. LPX        ds.b    1    ;Lightpen X
  2044. LPY        ds.b    1    ;Lightpen Y
  2045. SPREN        ds.b    1    ;Sprite eingeschaltet?
  2046. CTRL2        ds.b    1    ;Steuerreg. 2
  2047. MYE        ds.b    1    ;Sprite-Y-Expansion
  2048. VBASE        ds.b    1    ;Basisadressen
  2049. IRQFLAG        ds.b    1    ;Interruptreg.
  2050. IRQMASK        ds.b    1
  2051. MDP        ds.b    1    ;Sprite-Priorität
  2052. MMC        ds.b    1    ;Sprite-Multicolor
  2053. MXE        ds.b    1    ;Sprite-X-Expansion
  2054. CLXSPR        ds.b    1    ;Kollisionsreg.
  2055. CLXBGR        ds.b    1
  2056. EC        ds.b    1    ;Rahmenfarbe
  2057. B0C        ds.b    1    ;Hintergrundfarbe 0
  2058. B1C        ds.b    1    ;Hintergrundfarbe 1
  2059. B2C        ds.b    1    ;Hintergrundfarbe 2
  2060. B3C        ds.b    1    ;Hintergrundfarbe 3
  2061. MM0        ds.b    1    ;Sprite-Multicolorfarbe 0
  2062. MM1        ds.b    1    ;Sprite-Multicolorfarbe 1
  2063. M0C        ds.b    1    ;Farbe Sprite 0
  2064. M1C        ds.b    1    ;Farbe Sprite 1
  2065. M2C        ds.b    1    ;Farbe Sprite 2
  2066. M3C        ds.b    1    ;Farbe Sprite 3
  2067. M4C        ds.b    1    ;Farbe Sprite 4
  2068. M5C        ds.b    1    ;Farbe Sprite 5
  2069. M6C        ds.b    1    ;Farbe Sprite 6
  2070. M7C        ds.b    1    ;Farbe Sprite 7
  2071.  
  2072.         CNOP    0,4
  2073. RASTERX        ds.w    1    ;Aktuelle X-Position des Rasterstrahls (für Lightpen)
  2074. RASTERY        ds.w    1    ;Aktuelle Rasterzeile
  2075. IRQRASTERY    ds.w    1    ;Rasterzeile, bei der ein IRQ ausgelöst wird
  2076. RC        ds.w    1    ;Rasterzähler RC
  2077. VCBASE        ds.w    1    ;VC-Zwischenspeicher
  2078. VCCOUNT        ds.w    1    ;VC-Zähler
  2079. MC0        ds.w    1    ;Spritedatenzähler 0
  2080. MC1        ds.w    1    ;Spritedatenzähler 1
  2081. MC2        ds.w    1    ;Spritedatenzähler 2
  2082. MC3        ds.w    1    ;Spritedatenzähler 3
  2083. MC4        ds.w    1    ;Spritedatenzähler 4
  2084. MC5        ds.w    1    ;Spritedatenzähler 5
  2085. MC6        ds.w    1    ;Spritedatenzähler 6
  2086. MC7        ds.w    1    ;Spritedatenzähler 7
  2087. MC0BASE        ds.w    1    ;MC-Zwischenspeicher
  2088. MC1BASE        ds.w    1
  2089. MC2BASE        ds.w    1
  2090. MC3BASE        ds.w    1
  2091. MC4BASE        ds.w    1
  2092. MC5BASE        ds.w    1
  2093. MC6BASE        ds.w    1
  2094. MC7BASE        ds.w    1
  2095. SPRX0        ds.w    1    ;16-Bit Sprite-X-Koordinaten
  2096. SPRX1        ds.w    1
  2097. SPRX2        ds.w    1
  2098. SPRX3        ds.w    1
  2099. SPRX4        ds.w    1
  2100. SPRX5        ds.w    1
  2101. SPRX6        ds.w    1
  2102. SPRX7        ds.w    1
  2103. DYSTART        ds.w    1    ;Aktuelle Werte des Randbereichs
  2104. DYSTOP        ds.w    1    ; (für Rahmenstufe)
  2105. XSCROLL        ds.w    1    ;X-Scroll-Wert
  2106. YSCROLL        ds.w    1    ;Y-Scroll-Wert
  2107.  
  2108. CIAVABASE    ds.w    1    ;16-Bit Basisadresse durch CIA-VA14/15
  2109.                 ;xx00000000000000
  2110. MATRIXBASE    ds.w    1    ;16-Bit Videomatrixbasis
  2111.                 ;00xxxx0000000000
  2112. CHARBASE    ds.w    1    ;16-Bit Zeichengeneratorbasis
  2113.                 ;00xxx00000000000
  2114. BITMAPBASE    ds.w    1    ;16-Bit Bitmapbasis
  2115.                 ;00x0000000000000
  2116. SPRPTR        ds.w    8    ;Sprite-Datenzeiger
  2117.                 ;00xxxxxxxx000000
  2118.  
  2119. BADLINE        ds.b    1    ;Flag: Bad-Line-Zustand
  2120. DISPLAYSTATE    ds.b    1    ;Flag: Display-Zustand
  2121. BADLINEENABLE    ds.b    1    ;Flag: Bad Line erlaubt (DEN)
  2122. BORDERON    ds.b    1    ;Flag: Rahmen an (Haupt-Rahmenflipflop)
  2123. UDBORDERON    ds.b    1    ;Flag: Oberer/unterer Rahmen an (vertikales Rahmenflipflop)
  2124. IS38COL        ds.b    1    ;Flag: 38 Spalten
  2125. VBLANKING    ds.b    1    ;Flag: In Zyklus 2 VBlank
  2126. LPTRIGGERED    ds.b    1    ;Flag: Lightpen wurde in diesem Frame schon getriggert
  2127. SPRDMAON    ds.b    1    ;8 Flags: Sprite-DMA angeschaltet
  2128. SPRDISPON    ds.b    1    ;8 Flags: Sprite-Anzeige angeschaltet
  2129. SPREXPY        ds.b    1    ;8 Flags: MC->MCBASE machen
  2130. REFCNT        ds.b    1    ;Refreshzähler
  2131.  
  2132.     IFNE    DE00_COMPATIBLE
  2133. LastVICByte    ds.b    1    ;Zuletzt vom VIC gelesenes Byte
  2134.                 ; (für $DE00-Kompatibilität)
  2135.     ENDC
  2136.  
  2137.         CNOP    0,4
  2138. DISPROCIDX    ds.w    1    ;Anzeigestufe: Index des Darstellungsmodus
  2139. CHARDATA    ds.b    1    ;Character-Byte im "Schieberegister"
  2140. COLDATA        ds.b    1    ;Farbnybble im "Schieberegister"
  2141. GFXDATA        ds.b    1    ;Grafikdaten im "Schieberegister"
  2142. LASTCHARDATA    ds.b    1    ;Letztes Character-Byte einer Zeile
  2143.  
  2144.         CNOP    0,4
  2145. SPR0DATA    ds.b    4    ;Spritedaten 0
  2146. SPR1DATA    ds.b    4    ;Spritedaten 1
  2147. SPR2DATA    ds.b    4    ;Spritedaten 2
  2148. SPR3DATA    ds.b    4    ;Spritedaten 3
  2149. SPR4DATA    ds.b    4    ;Spritedaten 4
  2150. SPR5DATA    ds.b    4    ;Spritedaten 5
  2151. SPR6DATA    ds.b    4    ;Spritedaten 6
  2152. SPR7DATA    ds.b    4    ;Spritedaten 7
  2153.  
  2154.         CNOP    0,4
  2155. BORDERLONG    ds.l    1    ;Rahmenfarbe als Langwort
  2156. CycleCounter    ds.l    1    ;Zyklenzähler
  2157. FirstBACycle    ds.l    1    ;Zyklus, an dem BA zuletzt auf low ging
  2158.  
  2159. Sprite0Proc    ds.l    1    ;Zeiger auf Display-Routinen für die einzelnen Sprites
  2160. Sprite1Proc    ds.l    1
  2161. Sprite2Proc    ds.l    1
  2162. Sprite3Proc    ds.l    1
  2163. Sprite4Proc    ds.l    1
  2164. Sprite5Proc    ds.l    1
  2165. Sprite6Proc    ds.l    1
  2166. Sprite7Proc    ds.l    1
  2167.  
  2168. ; Sprungtabelle für Speicherzugriff: Ein Eintrag pro Seite
  2169. MemReadTab    ds.l    256
  2170.  
  2171. ; Interner Videomatrix-Puffer
  2172. MatrixLine    ds.b    80    ;Jeweils 1 Byte Zeichen, 1 Byte Farbe
  2173.  
  2174.         XDEF    _CURRENTA5
  2175. _CURRENTA5    ds.l    1    ;Unbenutzt
  2176.  
  2177.         END
  2178.