home *** CD-ROM | disk | FTP | other *** search
/ Amiga MA Magazine 1998 #6 / amigamamagazinepolishissue1998.iso / coders / assembler-kurs / listings2 / listing5m.s < prev    next >
Text File  |  1977-12-31  |  6KB  |  189 lines

  1.  
  2. ; Listing5m.s    VERSCHIEBEN DES VIDEOFENSTERS MIT DEM DIWSTART ($dff08e)
  3.  
  4.     SECTION    CIPundCOP,CODE
  5.  
  6. Anfang:
  7.     move.l    4.w,a6        ; Execbase in a6
  8.     jsr    -$78(a6)    ; Disable - stoppt das Multitasking
  9.     lea    GfxName(PC),a1    ; Adresse des Namen der zu öffnenden Lib in a1
  10.     jsr    -$198(a6)    ; OpenLibrary
  11.     move.l    d0,GfxBase    ; speichere diese Adresse in GfxBase
  12.     move.l    d0,a6
  13.     move.l    $26(a6),OldCop    ; hier speichern wir die Adresse der Copperlist
  14.                 ; des Betriebssystemes
  15.  
  16. ;    POINTEN AUF UNSERE BITPLANES
  17.  
  18.     MOVE.L    #PIC,d0        ; in d0 kommt die Adresse unserer PIC
  19.     LEA    BPLPOINTERS,A1    ; in a1 kommt die Adresse der Bitplane-
  20.                 ; Pointer der Copperlist
  21.     MOVEQ    #2,D1        ; Anzahl der Bitplanes -1 (hier sind es 3)
  22.                 ; für den DBRA - Zyklus
  23. POINTBP:
  24.     move.w    d0,6(a1)    ; kopiert das niederwertige Word der Plane-
  25.                 ; Adresse ins richtige Word der Copperlist
  26.     swap    d0        ; vertauscht die 2 Word in d0 (1234 > 3412)
  27.  
  28.     move.w    d0,2(a1)    ; kopiert das hochwertige Word der Adresse des
  29.                 ; Plane in das richtige Word in der Copperlist
  30.     swap    d0        ; vertauscht erneut die 2 Word von d0
  31.     ADD.L    #40*256,d0    ; Zählen 10240 zu D0 dazu, -> nächstes Plane
  32.  
  33.     addq.w    #8,a1        ; zu den nächsten Bplpointers in der Cop
  34.     dbra    d1,POINTBP    ; Wiederhole D1 mal POINTBP (D1=n. bitplanes)
  35.  
  36.     move.l    #COPPERLIST,$dff080    ; COP1LC - "Zeiger" auf unsere COP
  37.     move.w    d0,$dff088        ; COPJMP1 - Starten unsere COP
  38.     move.w    #0,$dff1fc        ; FMODE - Deaktiviert das AGA
  39.     move.w    #$c00,$dff106        ; BPLCON3 - Deaktiviert das AGA
  40.  
  41. mouse:
  42.     cmpi.b    #$ff,$dff006    ; Sind wir auf Zeile 255?
  43.     bne.s    mouse        ; Wenn nicht, geh nicht weiter
  44.  
  45.     btst    #2,$dff016    ; wenn die rechte Maustaste gedrückt ist,
  46.     beq.s    Warte        ; überspringe die Routine
  47.  
  48.     bsr.s    DIWRaufRunter    ; Läßt Bild rauf und runter gehen durch
  49.                 ; verändern des DIWStart/Stop
  50.  
  51. Warte:
  52.     cmpi.b    #$ff,$dff006    ; Sind wir auf Zeile 255?
  53.     beq.s    Warte        ; Wenn nicht, geh nicht weiter
  54.  
  55.     btst    #6,$bfe001    ; linke Maustaste gedrückt?
  56.     bne.s    mouse        ; wenn nicht, zurück zu mouse:
  57.  
  58.     move.l    OldCop(PC),$dff080    ; COP1LC - "Zeiger" auf die Orginal-COP
  59.     move.w    d0,$dff088        ; COPJMP1 - und starten sie
  60.  
  61.     move.l    4.w,a6
  62.     jsr    -$7e(a6)    ; Enable - stellt Multitasking wieder her
  63.     move.l    GfxBase(PC),a1    ; Basis der Library, die es zu schließen gilt
  64.                 ; (Libraries werden geöffnet UND geschlossen!)
  65.     jsr    -$19e(a6)    ; Closelibrary - schließt die Graphics lib
  66.     rts
  67.  
  68. ; DATEN
  69.  
  70.  
  71. GfxName:
  72.     dc.b    "graphics.library",0,0    
  73.  
  74. GfxBase:        ; Hier hinein kommt die Basisadresse der graphics.lib,
  75.     dc.l    0    ; ab hier werden die Offsets gemacht
  76.  
  77. OldCop:         ; Hier hinein kommt die Adresse der Orginal-Copperlist des
  78.     dc.l    0    ; Betriebssystemes
  79.  
  80.  
  81. ; Diese Routine agiert ganz einfach auf das Byte YY des $dff08e in
  82. ; der Copperlist, dem DIWSTART; dieses Register definiert den Anfang
  83. ; des Videofensters, das "zentriert" werden kann, wie man es aus dem
  84. ; Preferences der Workbench kennt. In unserem Fall lassen wir dieses
  85. ; Videofenster einfach etwas weiter unten beginnen, deswegen verschiebt
  86. ; sich dessen Inhalt. Hier wird, im Unterschied zum Scroll, nichts
  87. ; angezeigt, was sich "oberhalb" des Bildes befindet, weil wir hier
  88. ; ja das ganze Fenster verstellen, und nicht nur den Inhalt.
  89. ; Interessant in der Routine ist ein Word, COUNTER, das dazu verwendet
  90. ; wird, 35 Frames abzuwarten, wenn das Logo oben angekommen ist.
  91. ; Ich habe auch zwei "neue" Anweisungen verwendet, mit denen ihr noch
  92. ; nicht Bekanntschaft geschlossen habt, aber in dieser Routine
  93. ; äußerst nützlich sind; es handelt sich zum Einen um das BHI, einem Befehl
  94. ; aus der Familie der BEQ/BNE. Er springt zu einer Routine, wenn das
  95. ; CMP, also "VERGLEICHE", als Resultat liefert, daß der Wert größer ist.
  96. ; In unserem Fall springt das BHI.s LOGOD nur zu LOGOD, wenn Counter
  97. ; den Wert 35 erreicht hat, bzw. jedes darauf folgende Mal, bei 36, 37...
  98. ; Der andere Befehl ist das BCHG, das BIT CHANGE bedeutet, oder auf
  99. ; Deutsch "Vertausche das Bit". Es stammt aus der noblen Familie der
  100. ; BTST, und es vertauscht das angegebene Bit: BCHG #1,Label stürzt
  101. ; sich auf das Bit 1 von Label, wenn es 0 war wird es 1, und wenn es
  102. ; 1 war wird es ... was wohl? ... 0! Genau!
  103.  
  104.  
  105. DIWRaufRunter:
  106.     ADDQ.W    #1,COUNTER    ; wir vermerken die Durchführung
  107.     CMPI.W    #35,COUNTER    ; sind mindestens 35 Frames vergangen?
  108.     BHI.S    LOGOD        ; wenn ja, dann geh zur Routine LOGOD
  109.     RTS            ; ansonsten zurück ohne sie auszuführen
  110.  
  111. LOGOD:
  112.     BTST    #1,FLAGDIW   ; Müßen wir nach oben gehen?
  113.     BEQ.S    UP         ; Wenn ja, führe die Routine "UP" aus
  114.     SUBQ.B    #2,DIWSCX    ; Geh in 2er-Schritten nach oben, etwas schneller
  115.     CMPI.B    #$2c,DIWSCX   ; Sind wir oben? (Normaler Wert: $2c81)
  116.     BEQ.S    CHANGEUPDOWN2 ; wenn ja, ändere Richtung
  117.     RTS
  118.  
  119. UP:
  120.     ADDQ.B    #1,DIWSCX    ; Geh alngsam nach unten, un 1er-Schritten
  121.     CMPI.B    #$70,DIWSCX    ; Sind wir unten? (Position $70)
  122.     BEQ.S    CHANGEUPDOWN    ; wenn ja, ändern wir Richtung
  123.     RTS
  124.  
  125. CHANGEUPDOWN
  126.     BCHG    #1,FLAGDIW    ; vertausche das Richtungsbit
  127.     RTS
  128.  
  129. CHANGEUPDOWN2
  130.     BCHG    #1,FLAGDIW    ; vertausche das Richtungsbit und
  131.     CLR.W    COUNTER     ; setze COUNTER auf NULL, wir sind am Ende!
  132.     RTS
  133.  
  134. FLAGDIW:
  135.     dc.w    0
  136.  
  137. COUNTER:
  138.     dc.w    0
  139.  
  140.  
  141.     SECTION GRAPHIC,DATA_C
  142.  
  143. COPPERLIST:
  144.     dc.w    $120,$0000,$122,$0000,$124,$0000,$126,$0000,$128,$0000 ; SPRITE
  145.     dc.w    $12a,$0000,$12c,$0000,$12e,$0000,$130,$0000,$132,$0000
  146.     dc.w    $134,$0000,$136,$0000,$138,$0000,$13a,$0000,$13c,$0000
  147.     dc.w    $13e,$0000
  148.  
  149.     dc.w    $8E
  150. DIWSCX:
  151.     dc.w    $2c81    ; DIWSTRT = $YYXX Beginn des Videofenster
  152.  
  153.     dc.w    $90,$2cc1    ; DiwStop
  154.     dc.w    $92,$0038    ; DdfStart
  155.     dc.w    $94,$00d0    ; DdfStop
  156.     dc.w    $102,0        ; BplCon1
  157.     dc.w    $104,0        ; BplCon2
  158.     dc.w    $108,0        ; Bpl1Mod
  159.     dc.w    $10a,0        ; Bpl2Mod
  160.  
  161.             ; 5432109876543210  ; BPLCON0:
  162.     dc.w    $100,%0011001000000000  ; Bits 13 und 12 an!! (3 = %011)
  163.                     ; 3 Bitplanes Lowres, nicht Lace
  164. BPLPOINTERS:
  165.     dc.w $e0,$0000,$e2,$0000    ;erstes  Bitplane - BPL0PT
  166.     dc.w $e4,$0000,$e6,$0000    ;zweites Bitplane - BPL1PT
  167.     dc.w $e8,$0000,$ea,$0000    ;drittes Bitplane - BPL2PT
  168.  
  169.     dc.w    $0180,$000    ; Color0
  170.     dc.w    $0182,$475    ; Color1
  171.     dc.w    $0184,$fff    ; Color2
  172.     dc.w    $0186,$ccc    ; Color3
  173.     dc.w    $0188,$999    ; Color4
  174.     dc.w    $018a,$232    ; Color5
  175.     dc.w    $018c,$777    ; Color6
  176.     dc.w    $018e,$444    ; Color7
  177.  
  178.     dc.w    $FFFF,$FFFE    ; Ende der Copperlist
  179.  
  180. ;    BILD
  181.  
  182. PIC:
  183.     incbin    "amiga.320*256*3"    ; hier laden wir das Bild im RAW-
  184.                     ; Format
  185.  
  186.     end
  187.  
  188.  
  189.