home *** CD-ROM | disk | FTP | other *** search
/ The AGA Experience 2 / agavol2.iso / software / utilities / emulation / frodo / src / 6569mono.i < prev    next >
Text File  |  1996-02-03  |  9KB  |  423 lines

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