home *** CD-ROM | disk | FTP | other *** search
/ Brotikasten / BROTCD01.iso / amiga / frodov13.lha / src / 6569mono.i < prev    next >
Text File  |  1995-02-07  |  9KB  |  439 lines

  1. *
  2. * 6569mono.i - Schnellere VIC-Emulation (Amiga monochrom)
  3. *
  4. * Copyright (C) 1994-1995 by Christian Bauer
  5. *
  6.  
  7. *
  8. * Anmerkungen:
  9. * ------------
  10. *
  11. * Funktionsweise:
  12. *  - Die monochrome Emulation arbeitet nicht mit einer Chunky-Bitmap,
  13. *    sondern schreibt die rohen Grafikdaten direkt in eine Amiga-Bitplane
  14. *  - Farbwerte werden ignoriert, der Hintergrund ist immer schwarz, die
  15. *    Grafik immer wei▀, ebenso bei den Sprites. Eine Ausnahme bildet die
  16. *    Rahmenfarbe: Sie ist immer wei▀, au▀er wenn der Rahmen schwarz ist
  17. *
  18.  
  19.  
  20. *
  21. * Definitionen
  22. *
  23.  
  24. BytesPerLine    = $180/8    ;Anzahl Bytes pro Zeile in einer Bitplane
  25.  
  26. *
  27. * Makros
  28. *
  29.  
  30. ; Sprite darstellen
  31. FDoSprite    MACRO    ;Nummer
  32.         moveq    #\1,d6        ;d6: Spritenummer
  33.         btst    d6,SPRITEON(a4)    ;Wird das Sprite dargestellt?
  34.         beq    \@1$
  35.  
  36.         move.w    MC\1(a4),d5    ;d5: DatenzΣhler
  37.         move.l    MATRIXBASE(a4),a0
  38.         move.b    $03f8+\1(a0),d7    ;d7: Datenzeiger
  39.         lea    M\1X(a4),a2    ;a2: Zeiger auf X-Koordinate
  40.         bsr    FDrawSprite
  41. \@1$
  42.         ENDM
  43.  
  44.  
  45. **
  46. ** Eine Rasterzeile ausfⁿhren (monochrom)
  47. **
  48. ** d7: RasterzeilenzΣhler
  49. ** a4: Zeiger auf VIC-Register
  50. ** a5: Zeiger auf das Ziel im Bildschirmspeicher
  51. **
  52.  
  53. AmigaMono6569
  54.  
  55. *
  56. * Bei abgeschaltetem Bildschirm nur Rahmen zeichnen
  57. *
  58.  
  59.         tst.b    SCREENOFF(a4)
  60.         bne    FTBBorderDraw
  61.  
  62. *
  63. * VC-ZΣhler setzen
  64. *
  65.  
  66.         move.w    VCBASE(a4),VCCOUNT(a4)
  67.  
  68. *
  69. * "Bad Lines"-Videomatrixzugriff:
  70. * 40 Bytes aus Videomatrix und Farb-RAM lesen und zwischenspeichern
  71. *
  72.  
  73.         cmp.w    #FirstDMALine,d7 ;Innerhalb des DMA-Bereiches?
  74.         blo    FNoBadLine
  75.         cmp.w    #LastDMALine,d7
  76.         bhi    FNoBadLine
  77.  
  78.         move.b    d7,d0        ;Ja, stimmen die unteren Bits
  79.         and.b    #7,d0        ;der Rasterzeile mit dem Y-Scroll
  80.         cmp.b    YSCROLL+1(a4),d0 ;ⁿberein?
  81.         bne    FNoBadLine
  82.  
  83. FIsBadLine    move.w    VCCOUNT(a4),d2    ;d2: VC Videomatrix-ZΣhler
  84.  
  85.         move.l    MATRIXBASE(a4),a0 ;Videomatrixbasis holen
  86.         add.w    d2,a0        ;VideomatrixzΣhler dazunehmen
  87.  
  88.         lea    MatrixLine,a1    ;Nur Videomatrix-Zeile lesen
  89.         movem.l    (a0)+,d0-d6    ;40 Bytes kopieren
  90.         movem.l    d0-d6,(a1)
  91.         movem.l    (a0)+,d0-d2
  92.         movem.l    d0-d2,28(a1)
  93.  
  94.         clr.w    RC(a4)        ;RC zurⁿcksetzen
  95.         clr.b    DISPLAYOFF(a4)    ;Darstellung anschalten
  96.  
  97.         move.w    BadLineCycles,CyclesLeft ;Andere Anzahl Zyklen
  98. FNoBadLine
  99.  
  100. *
  101. * Oberen und unteren Rahmen handhaben
  102. *
  103.  
  104.         cmp.w    DYSTOP(a4),d7    ;Unteres Ende des Fensters erreicht
  105.         bne    1$        ; -> Rahmen einschalten
  106.         st.b    BORDERON(a4)
  107.         bra    FTBBorderDraw
  108.  
  109. 1$        cmp.w    DYSTART(a4),d7    ;Oberes Ende des Fensters erreicht
  110.         bne    FTBBorderDone    ; -> Rahmen abschalten
  111.         clr.b    BORDERON(a4)
  112.         bra    FTBNoBorder
  113.  
  114. FTBBorderDone    tst.b    BORDERON(a4)    ;Rahmen an?
  115.         beq    FTBNoBorder
  116.  
  117. FTBBorderDraw    move.l    CURRENTA5(a4),a0 ;Ja, Rahmen malen
  118.  
  119.         tst.b    $20(a4)        ;Jede Farbe au▀er schwarz wird als wei▀ dargestellt
  120.         beq    FTBBorderBlack
  121.  
  122.         moveq    #-1,d0        ;Rahmen wei▀
  123.         move.w    #BytesPerLine/4-1,d1
  124. FTBBorderLoop    move.l    d0,(a0)+
  125.         dbra    d1,FTBBorderLoop
  126.         bra    FVICIncA5    ;Sonst nix
  127.  
  128. FTBBorderBlack    move.w    #BytesPerLine/4-1,d1 ;Rahmen schwarz
  129. FTBBlackLoop    clr.l    (a0)+
  130.         dbra    d1,FTBBlackLoop
  131.         bra    FVICIncA5    ;Sonst nix
  132. FTBNoBorder
  133.  
  134. *
  135. * Inhalt des Fensters: Darstellung eingeschaltet?
  136. *
  137.  
  138.         lea    4(a5),a1    ;a1: Ziel in Bildschirmspeicher
  139.         lea    MatrixLine,a2    ;a2: Zeichencodes
  140.  
  141.         tst.b    DISPLAYOFF(a4)    ;$3FFF darstellen?
  142.         bne    FShow3FFF
  143.  
  144.         move.l    DisplayProc,a0    ;Nein, Routine entsprechend
  145.         jmp    (a0)        ;dem Darstellungsmodus anspringen
  146.  
  147. *
  148. * Standard-Text: Zeichendaten holen und darstellen
  149. *
  150.  
  151. FTextStd    add.w    #40,VCCOUNT(a4)    ;VC erh÷hen (wird nicht verwendet)
  152.  
  153.         move.l    CHARBASE(a4),a0    ;a0: Zeichengeneratorbasis
  154.         add.w    RC(a4),a0    ;RC dazunehmen
  155.  
  156.         clr.b    4(a5)        ;Hintergrund, wenn XScroll>0
  157.  
  158.         moveq    #0,d3        ;XScroll holen
  159.         move.w    XSCROLL(a4),d3
  160.         beq    FTextNoScroll
  161.  
  162. ; Schleife fⁿr 40 Zeichen
  163.         moveq    #9,d1        ;d1: 4-Zeichen-ZΣhler
  164.         moveq    #0,d0
  165. FCharLoop    move.b    (a2)+,d0    ;Grafikdaten von 4 Zeichen lesen
  166.         move.w    (a0,d0.w*8),d2
  167.         move.b    (a2)+,d0
  168.         move.b    (a0,d0.w*8),d2
  169.         swap    d2
  170.         move.b    (a2)+,d0
  171.         move.w    (a0,d0.w*8),d2
  172.         move.b    (a2)+,d0
  173.         move.b    (a0,d0.w*8),d2
  174.         bfins    d2,(a1){d3:32}    ;und in den Bildschirm schreiben
  175.         addq.w    #4,a1        ;Zielzeiger erh÷hen
  176.         dbra    d1,FCharLoop
  177.         bra    FDoSprites
  178.  
  179. ; Schleife fⁿr 40 Zeichen, kein XScroll
  180. FTextNoScroll    moveq    #9,d1        ;d1: 4-Zeichen-ZΣhler
  181.         moveq    #0,d0
  182. FNCharLoop    move.b    (a2)+,d0    ;Grafikdaten von 4 Zeichen lesen
  183.         move.w    (a0,d0.w*8),d2
  184.         move.b    (a2)+,d0
  185.         move.b    (a0,d0.w*8),d2
  186.         swap    d2
  187.         move.b    (a2)+,d0
  188.         move.w    (a0,d0.w*8),d2
  189.         move.b    (a2)+,d0
  190.         move.b    (a0,d0.w*8),d2
  191.         move.l    d2,(a1)+    ;und in den Bildschirm schreiben
  192.         dbra    d1,FNCharLoop
  193.         bra    FDoSprites
  194.  
  195. *
  196. * Standard-BitMap: Grafikdaten holen und darstellen
  197. *
  198.  
  199. FBitMapStd    move.l    BITMAPBASE(a4),a0 ;a0: Bitmap-Basis
  200.         move.w    VCCOUNT(a4),d0    ;VC holen
  201.         lsl.w    #3,d0        ;*8
  202.         add.w    RC(a4),d0    ;RC dazunehmen
  203.         add.w    d0,a0        ;und zur Bitmap-Basis dazunehmen
  204.  
  205.         add.w    #40,VCCOUNT(a4)    ;VC erh÷hen
  206.  
  207.         clr.b    4(a5)        ;Hintergrund, wenn XScroll>0
  208.  
  209.         moveq    #0,d3        ;XScroll holen
  210.         move.w    XSCROLL(a4),d3
  211.         beq    FBitMapNoScroll
  212.  
  213. ; Schleife fⁿr 40 Bytes
  214.         moveq    #9,d1        ;d1: 4-Zeichen-ZΣhler
  215. FBitMapLoop    move.w    (a0),d2        ;4 Bytes Grafikdaten lesen
  216.         move.b    8(a0),d2
  217.         swap    d2
  218.         move.w    16(a0),d2
  219.         move.b    24(a0),d2
  220.         bfins    d2,(a1){d3:32}    ;und in den Bildschirm schreiben
  221.         addq.w    #4,a1        ;Zielzeiger erh÷hen
  222.         lea    32(a0),a0    ;Quellzeiger erh÷hen
  223.         dbra    d1,FBitMapLoop
  224.         bra    FDoSprites
  225.  
  226. ; Schleife fⁿr 40 Bytes, kein XScroll
  227. FBitMapNoScroll    moveq    #9,d1        ;d1: 4-Zeichen-ZΣhler
  228. FNBitMapLoop    move.w    (a0),d2        ;4 Bytes Grafikdaten lesen
  229.         move.b    8(a0),d2
  230.         swap    d2
  231.         move.w    16(a0),d2
  232.         move.b    24(a0),d2
  233.         move.l    d2,(a1)+    ;und in den Bildschirm schreiben
  234.         lea    32(a0),a0    ;Quellzeiger erh÷hen
  235.         dbra    d1,FNBitMapLoop
  236.         bra    FDoSprites
  237.  
  238. *
  239. * Ungⁿltiger Darstellungsmodus: Schwarzen Bildschirm anzeigen
  240. *
  241.  
  242. FBlackScreen    add.w    #40,VCCOUNT(a4)    ;VC erh÷hen
  243.  
  244.         moveq    #9,d0        ;40 Zeichen schwarz
  245. 1$        clr.l    (a1)+
  246.         dbra    d0,1$
  247.         bra    FDoSprites
  248.  
  249. *
  250. * $3FFF darstellen
  251. *
  252.  
  253. FShow3FFF    tst.b    $21(a4)        ;Wenn der Hintergrund schwarz ist, sieht man nichts
  254.         beq    FInvis3FFF
  255.  
  256.         moveq    #0,d3        ;XScroll holen
  257.         move.w    XSCROLL(a4),d3
  258.  
  259.         clr.b    4(a5)        ;Hintergrund, wenn X-Scroll>0
  260.  
  261.         btst    #6,CTRL1(a4)
  262.         bne    11$
  263.         move.w    #$3fff,d0    ;Byte bei $3FFF lesen
  264.         bra    12$
  265. 11$        move.w    #$39ff,d0    ;ECM: Byte bei $39FF lesen
  266. 12$        GetPhysical
  267.  
  268.         move.w    (a0),d0        ;Byte als Langwort lesen
  269.         move.b    (a0),d0
  270.         swap    d0
  271.         move.w    (a0),d0
  272.         move.b    (a0),d0
  273.         not.l    d0        ;und invertieren
  274.  
  275. ; Zeile schreiben
  276.         moveq    #9,d1        ;d0: 4-Zeichen-ZΣhler
  277. FLoop3FFF    bfins    d0,(a1){d3:32}    ;In den Bildschirm schreiben
  278.         addq.w    #4,a1        ;Zielzeiger erh÷hen
  279.         dbra    d1,FLoop3FFF
  280.         bra    FDoSprites
  281.  
  282. ; Hintergrund schwarz: 3FFF unsichtbar
  283. FInvis3FFF    moveq    #9,d1        ;d0: 4-Zeichen-ZΣhler
  284. FLoop3FFFInvis    clr.l    (a1)+        ;In den Bildschirm schreiben
  285.         dbra    d1,FLoop3FFFInvis
  286.  
  287. *
  288. * Sprites
  289. *
  290.  
  291. FDoSprites    tst.b    SPRITEON(a4)    ;Ist ⁿberhaupt ein Sprite z.Z. sichtbar?
  292.         bne    FDrawTheSprites    ;Ja, dann Sprites malen
  293.  
  294. *
  295. * Linken und rechten Rahmen zeichnen
  296. *
  297.  
  298. ; 40-Spalten-Rahmen
  299. FDrawLRBorder    move.l    CURRENTA5(a4),a0
  300.  
  301.         tst.b    $20(a4)
  302.         beq    FLRBorderBlack
  303.  
  304.         moveq    #-1,d0
  305.         move.l    d0,(a0)        ;Links: $00..$17
  306.         move.l    d0,44(a0)    ;Rechts: $158..$16f
  307.  
  308. ; 38-Spalten-Rahmen
  309.         tst.b    IS38COL(a4)
  310.         beq    1$
  311.         move.b    d0,4(a0)    ;Links: $18..$1e
  312.         move.b    d0,43(a0)    ;Rechts: $14f..$157
  313. 1$        bra    FVICNext
  314.  
  315. ; Schwarzer Rahmen
  316. FLRBorderBlack    clr.l    (a0)        ;40-Spalten
  317.         clr.l    44(a0)
  318.         tst.b    IS38COL(a4)    ;38-Spalten
  319.         beq    1$
  320.         clr.b    4(a0)
  321.         clr.b    43(a0)
  322. 1$
  323.  
  324. *
  325. * Ende einer sichtbaren Zeile: Zeiger in Bitmap erh÷hen
  326. *
  327.  
  328. FVICNext
  329. FVICIncA5    lea    BytesPerLine(a5),a5
  330.         move.l    a5,CURRENTA5(a4)
  331.  
  332. *
  333. * Zurⁿck zur Haupt-Routine
  334. *
  335.  
  336.         bra    VICIncRC
  337.  
  338. *
  339. * Mindestens ein Sprite ist sichtbar, Sprites malen
  340. *
  341.  
  342. ; Sprites malen
  343. FDrawTheSprites    move.l    d7,-(sp)
  344.         FDoSprite 7
  345.         FDoSprite 6
  346.         FDoSprite 5
  347.         FDoSprite 4
  348.         FDoSprite 3
  349.         FDoSprite 2
  350.         FDoSprite 1
  351.         FDoSprite 0
  352.         move.l    (sp)+,d7
  353.         bra    FDrawLRBorder
  354.  
  355.  
  356. **
  357. ** Ein Sprite zeichnen (monochrom)
  358. ** d5.w: MC
  359. ** d6.l: Spritenummer (0..7)
  360. ** d7.b: Spritedatenzeiger
  361. ** a2  : Zeiger auf X-Koordinate
  362. **
  363.  
  364.         CNOP    0,4
  365. FDrawSprite    moveq    #0,d0        ;Ja, Basisadresse berechnen
  366.         move.b    d7,d0        ;Spritedatenzeiger
  367.         lsl.w    #6,d0
  368.         add.w    d5,d0        ;MC dazunehmen
  369.         GetPhysical        ;a0: Spritedaten
  370.  
  371.         moveq    #0,d5        ;X-Position zusammenbauen
  372.         move.b    (a2),d5
  373.         btst    d6,MX8(a4)
  374.         beq    1$
  375.         or.w    #$0100,d5    ;d5: Sprite-X-Position
  376. 1$
  377.         move.w    d5,d0
  378.         lsr.w    #3,d0        ;Pixel in Bytes umrechnen
  379.         lea    1(a5,d0.w),a1    ;a1: Ziel im Bildschirmspei