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

  1.  
  2. ; Listing5d.s    SCROLLEN EINES BILDES NACH OBEN UND UNTEN DURCH ÄNDERN
  3. ;        DER BITPLANEPOINTERS, KOMBINIERT MIT EINEM LINKS-RECHTS-
  4. ;        SCROLL, ERZEUGT MIT DEM $dff102 (BPLCON0)
  5.  
  6.     SECTION    CIPundCOP,CODE
  7.  
  8. Anfang:
  9.     move.l    4.w,a6        ; Execbase in a6
  10.     jsr    -$78(a6)    ; Disable - stoppt das Multitasking
  11.     lea    GfxName(PC),a1    ; Adresse des Namen der zu öffnenden Lib in a1
  12.     jsr    -$198(a6)    ; OpenLibrary
  13.     move.l    d0,GfxBase    ; speichere diese Adresse in GfxBase
  14.     move.l    d0,a6
  15.     move.l    $26(a6),OldCop    ; hier speichern wir die Adresse der Copperlist
  16.                 ; des Betriebssystemes.
  17. ;    POINTEN AUF UNSERE BITPLANES
  18.  
  19.     MOVE.L    #PIC,d0        ; in d0 kommt die Adresse unserer PIC
  20.     LEA    BPLPOINTERS,A1    ; in a1 kommt die Adresse der Bitplane-
  21.                 ; Pointer der Copperlist
  22.     MOVEQ    #2,D1        ; Anzahl der Bitplanes -1 (hier sind es 3)
  23.                 ; für den DBRA - Zyklus
  24. POINTBP:
  25.     move.w    d0,6(a1)    ; kopiert das niederwertige Word der Plane-
  26.                 ; Adresse ins richtige Word der Copperlist
  27.     swap    d0        ; vertauscht die 2 Word in d0 (1234 > 3412)
  28.  
  29.     move.w    d0,2(a1)    ; kopiert das hochwertige Word der Adresse des 
  30.                 ; Plane in das richtige Word in der Copperlist
  31.     swap    d0        ; vertauscht erneut die 2 Word von d0
  32.     ADD.L    #40*256,d0    ; Zählen 10240 zu D0 dazu, -> nächstes Plane
  33.  
  34.     addq.w    #8,a1        ; zu den nächsten Bplpointers in der Cop
  35.     dbra    d1,POINTBP    ; Wiederhole D1 mal POINTBP (D1=n. bitplanes)
  36.  
  37.     move.l    #COPPERLIST,$dff080    ; COP1LC - "Zeiger" auf unsere COP
  38.     move.w    d0,$dff088        ; COPJMP1 - Starten unsere COP
  39.  
  40.     move.w    #0,$dff1fc        ; FMODE - Deaktiviert das AGA
  41.     move.w    #$c00,$dff106        ; BPLCON3 - Deaktiviert das AGA
  42.  
  43. mouse:
  44.     cmpi.b    #$ff,$dff006    ; Sind wir auf Zeile 255?
  45.     bne.s    mouse        ; Wenn nicht, geh nicht weiter
  46.  
  47.     bsr.w    BewegeCopper    ; bewegt das Bild nach oben und unten,
  48.                 ; eine Zeile pro Durchgang. Verändert
  49.                 ; Bitplanepointers
  50.  
  51.     btst    #2,$dff016    ; wenn die rechte Maustaste gedrückt ist,
  52.     beq.s    Warte        ; überspringe die Scrollroutine
  53.  
  54.     bsr.w    BewegeCopper2    ; Scrollt Bild links und rechts mit dem $dff102
  55.  
  56. Warte:
  57.     cmpi.b    #$ff,$dff006    ; Sind wir noch auf Zeile 255?
  58.     beq.s    Warte        ; Wenn ja, geh nicht weiter
  59.  
  60.     btst    #6,$bfe001    ; linke Maustaste gedrückt?
  61.     bne.s    mouse        ; wenn nicht, zurück zu mouse:
  62.  
  63.     move.l    OldCop(PC),$dff080    ; COP1LC - "Zeiger" auf die Orginal-COP
  64.     move.w    d0,$dff088        ; COPJMP1 - und starten sie
  65.  
  66.     move.l    4.w,a6
  67.     jsr    -$7e(a6)    ; Enable - stellt Multitasking wieder her
  68.     move.l    GfxBase(PC),a1    ; Basis der Library, die es zu schließen gilt
  69.                 ; (Libraries werden geöffnet UND geschlossen!)
  70.     jsr    -$19e(a6)    ; Closelibrary - schließt die Graphics lib
  71.     rts
  72.  
  73. ; DATEN
  74.  
  75. GfxName:
  76.     dc.b    "graphics.library",0,0    
  77.  
  78. GfxBase:        ; Hier hinein kommt die Basisadresse der graphics.lib,
  79.     dc.l    0    ; ab hier werden die Offsets gemacht
  80.  
  81. OldCop:         ; Hier hinein kommt die Adresse der Orginal-Copperlist des
  82.     dc.l    0    ; Betriebssystemes
  83.  
  84. ;    Diese Routine bewegt das Bild nach oben und unten, imdem sie auf
  85. ;    die Bitplanepointer in der Copperlist zugreift (Mit dem Label
  86. ;    BPLPOINTERS).
  87. ;    Die Struktur ist ähnlich mit der in Listing3d.s
  88. ;    Als erstes geben wir die Adresse, die dir BPLPOINTERS gerade anpointen
  89. ;    in d0, dann addieren oder subtrahieren wir 40 Bytes von d0, und
  90. ;    setzen dann diesen neuen Wert in die Copperlist ein. Dafür verwenden
  91. ;    wir wieder die gleiche Routine POINTBP.
  92.  
  93. BewegeCopper:
  94.     LEA    BPLPOINTERS,A1    ; Mit diesen 4 Anweisungen holen wir aus der
  95.     move.w    2(a1),d0    ; Copperlist die Adresse, wohin das $dff0e0
  96.     swap    d0        ; gerade pointet und geben diesen Wert
  97.     move.w    6(a1),d0    ; in d0
  98.  
  99.     TST.B    RaufRunter    ; Müßen wir nach oben oder unten?
  100.  
  101.     beq.w    GehRunter
  102.     cmp.l    #PIC-(40*30),d0 ; sind wir weit genug OBEN?
  103.     beq.s    SetzRunter    ; wenn ja, sind wir am Ende und müßen runter
  104.     sub.l    #40,d0        ; subtrahieren 40, also 1 Zeile, dadurch
  105.                 ; wandert das Bild nach UNTEN
  106.     bra.s    Ende
  107.  
  108. SetzRunter:
  109.     clr.b    RaufRunter    ; Durch Löschen von RaufRunter wird das TST
  110.     bra.s    Ende        ; danach wieder BEQ ermöglichen ->
  111.                 ; BEQ wird zur Routine GehRunter springen
  112.  
  113. GehRunter:
  114.     cmpi.l    #PIC+(40*30),d0 ; sind wir weit genug UNTEN?
  115.     beq.s    SetzRauf    ; wenn ja, sind wir am unteren Ende und
  116.                 ; müßen wieder rauf
  117.     add.l    #40,d0        ; Addieren 40, also 1 Zeile, somit scrollt
  118.                 ; das Bild nach OBEN
  119.     bra.s    Ende
  120.  
  121. SetzRauf:
  122.     move.b    #$ff,RaufRunter ; Wenn das Label nicht auf NULL steht,
  123.     rts            ; bedeutet das, daß wir rauf müßen
  124.  
  125. Ende:                ; POINTEN DIE BITPLANEPOINTER AN
  126.     LEA    BPLPOINTERS,A1    ; POINTER in der COPPERLIST
  127.     MOVEQ    #2,D1        ; Anzahl der Bitplanes -1 (hier: 3)
  128. POINTBP2:
  129.     move.w    d0,6(a1)    ; kopiert das niederw. Word der Adress des Pl.
  130.     swap    d0        ; vertauscht die 2 Word von d0 (1234 > 3412)
  131.     move.w    d0,2(a1)    ; kopiert das höherw. Word der Adresse des Pl.
  132.     swap    d0        ; vertauscht die 2 Word von d0 (3412 > 1234)
  133.     ADD.L    #40*256,d0    ; + Länge Bitplane -> nächstes Bitplane
  134.     addq.w    #8,a1        ; zu den nächsten bplpointers in der Cop
  135.     dbra    d1,POINTBP2    ; Wiederhole D1 Mal POINTBP (D1=n. bitplanes)
  136.     rts
  137.  
  138.  
  139. ;    Dieses Byte, vom Label RaufRunter markiert, ist ein FLAG.
  140.  
  141. RaufRunter:
  142.     dc.b    0,0
  143.  
  144. ;***************************************************************************
  145.  
  146. BewegeCopper2:
  147.     TST.B    FLAG        ; Müßen wir vor oder zurück?
  148.     beq.w    Vorne
  149.     cmpi.b    #$00,MeinCon1    ; sind wir auf der Standartposition angekommen,
  150.                 ; also ganz hinten?
  151.     beq.s    GehNachVorne    ; wenn ja, dann müßen wir nach vorne!
  152.     sub.b    #$11,MeinCon1    ; wir ziehen 1 vom Scroll der geraden/ungeraden
  153.     rts            ; Bitplanes ab ($ff,$ee,$dd,$cc,$bb,$aa,$99..)
  154.                 ; gehen somit nach LINKS
  155. GehNachVorne:
  156.     clr.b    FLAG    ; Durch Nullsetzen des FLAG wird bei TST.B FLAG
  157.     rts        ; das BEQ die Routine nach Vorne springen lassen, und
  158.             ; das Bild wird vorschreiten (nach rechts)
  159.  
  160. Vorne:
  161.     cmpi.b    #$ff,MeinCon1    ; Sind wir beim Maximalscroll nach vorne ($ff)
  162.                 ; angekommen?? ($f gerade und $f ungerade)
  163.     beq.s    GehNachHinten    ; wenn ja müßen wir zurückgehen
  164.     add.b    #$11,MeinCon1    ; zähle 1 zum Bitplanescroll dazu, gerade und
  165.                 ; ungerade ($11,$22,$33,$44 etc..)
  166.     rts            ; GEH NACH RECHTS
  167.  
  168. GehNachHinten:
  169.     move.b    #$ff,FLAG    ; Wenn das Label FLAG nicht auf NULL ist,
  170.     rts            ; dann bedeutet das, daß wir nach links
  171.                 ; zurückgehen müßen
  172.  
  173. ;    Dieses Byte ist ein FLAG, es zeigt uns an, ob wir vor oder
  174. ;    zurück gehen müßen.
  175.  
  176. FLAG:
  177.     dc.b    0,0
  178.  
  179.     Section    COpp,data_C
  180.  
  181. COPPERLIST:
  182.     dc.w    $120,$0000,$122,$0000,$124,$0000,$126,$0000,$128,$0000 ; SPRITE
  183.     dc.w    $12a,$0000,$12c,$0000,$12e,$0000,$130,$0000,$132,$0000
  184.     dc.w    $134,$0000,$136,$0000,$138,$0000,$13a,$0000,$13c,$0000
  185.     dc.w    $13e,$0000
  186.  
  187.     dc.w    $8e,$2c81    ; DiwStrt    (Register mit Standartwerten)
  188.     dc.w    $90,$2cc1    ; DiwStop
  189.     dc.w    $92,$0038    ; DdfStart
  190.     dc.w    $94,$00d0    ; DdfStop
  191.  
  192.     dc.w    $102        ; BplCon1 - DAS REGISTER
  193.     dc.b    $00        ; BplCon1 - DAS NICHT VERWENDETE BYTE!!!
  194. MeinCon1:
  195.     dc.b    $00        ; BplCon1 - DAS VERWENDETE BYTE!!!
  196.  
  197.     dc.w    $104,0        ; BplCon2
  198.     dc.w    $108,0        ; Bpl1Mod
  199.     dc.w    $10a,0        ; Bpl2Mod
  200.  
  201.             ; 5432109876543210 ; BPLCON0:
  202.     dc.w    $100,%0011001000000000  ; Bits 13 und 12 an!! (3 = %011)
  203.                     ; 3 Bitplanes Lowres, nicht Lace
  204. BPLPOINTERS:
  205.     dc.w $e0,$0000,$e2,$0000    ;erstes  Bitplane - BPL0PT
  206.     dc.w $e4,$0000,$e6,$0000    ;zweites Bitplane - BPL1PT
  207.     dc.w $e8,$0000,$ea,$0000    ;drittes Bitplane - BPL2PT
  208.  
  209.     dc.w    $0180,$000    ; Color0
  210.     dc.w    $0182,$475    ; Color1
  211.     dc.w    $0184,$fff    ; Color2
  212.     dc.w    $0186,$ccc    ; Color3
  213.     dc.w    $0188,$999    ; Color4
  214.     dc.w    $018a,$232    ; Color5
  215.     dc.w    $018c,$777    ; Color6
  216.     dc.w    $018e,$444    ; Color7
  217.     dc.w    $FFFF,$FFFE    ; Ende der Copperlist
  218.  
  219. ;    BILD
  220.  
  221.     dcb.b    40*30,0 ; dieses Stück voller Nullen ist notwendig, da wir
  222.             ; beim Anzeigen weiter über und unter das Pic selbst
  223.             ; gehen und diesen Teil anzeigen. Wären hier keine
  224.             ; Nullen, würden die Byte angezeigt, die sich gerade
  225.             ; in diesem Teil des Speichers befinden. Das Resultat
  226.             ; wäre Chaos am Bildschirm. Aber durch $0000 wird immer
  227.             ; Farbe0 angezeigt, also der Hintergrund.
  228.  
  229. PIC:
  230.     incbin  "amiga.320*256*3"    ; hier laden wir das Bild im RAW-
  231.                     ; Format
  232.  
  233.     dcb.b    40*30,0 ; siehe oben
  234.  
  235.  
  236.  
  237.     end
  238.  
  239.  
  240. Nichts neues, nur eine Kombination der vorherigen Listings.
  241.  
  242.